feat(i18n): add Russian to the Monitor, the menus and the docs

Russian joins the interface languages of ProxMenux Monitor and its
notifications, the language choice of the installers and of
Settings → Change language, and the documentation site. The
translation bots include it so new texts are translated as well.
This commit is contained in:
MacRimi
2026-11-06 17:43:08 +01:00
parent 5bfc524359
commit 868c67f4de
173 changed files with 43896 additions and 29 deletions
+1 -1
View File
@@ -65,7 +65,7 @@ from build_translation_cache import ( # noqa: E402
# users on sk see a decent auto-translation for new keys instead of raw # users on sk see a decent auto-translation for new keys instead of raw
# English while the human maintainer catches up, and Vaso73 keeps full # English while the human maintainer catches up, and Vaso73 keeps full
# ownership of the wording via follow-up PRs. # ownership of the wording via follow-up PRs.
DEFAULT_LANGUAGES = ("es", "de", "fr", "it", "pt", "sk", "sv") DEFAULT_LANGUAGES = ("es", "de", "fr", "it", "pt", "sk", "sv", "ru")
DEFAULT_CONTEXT = "Context: Technical UI text for a Proxmox management dashboard. Translate:" DEFAULT_CONTEXT = "Context: Technical UI text for a Proxmox management dashboard. Translate:"
# next-intl / ICU-style placeholders: {name}, {vmid}, {count}, {app_name}. # next-intl / ICU-style placeholders: {name}, {vmid}, {count}, {app_name}.
+1 -1
View File
@@ -30,7 +30,7 @@ from urllib.parse import quote
from urllib.request import Request, urlopen from urllib.request import Request, urlopen
DEFAULT_LANGUAGES = ("es", "fr", "de", "it", "pt", "sk", "sv") DEFAULT_LANGUAGES = ("es", "fr", "de", "it", "pt", "sk", "sv", "ru")
DEFAULT_CONTEXT = "Context: Technical message for Proxmox and IT. Translate:" DEFAULT_CONTEXT = "Context: Technical message for Proxmox and IT. Translate:"
# googletrans and the public Google endpoint used by this workflow do not # googletrans and the public Google endpoint used by this workflow do not
# support Cloud Translation glossaries. Protect product names, package names # support Cloud Translation glossaries. Protect product names, package names
+1 -1
View File
@@ -24,7 +24,7 @@ from build_translation_cache import ( # noqa: E402
) )
DEFAULT_LANGUAGES = ("es", "de", "fr", "it", "pt", "sk", "sv") DEFAULT_LANGUAGES = ("es", "de", "fr", "it", "pt", "sk", "sv", "ru")
DEFAULT_CONTEXT = ( DEFAULT_CONTEXT = (
"Context: ProxMenux technical documentation for Proxmox VE users. " "Context: ProxMenux technical documentation for Proxmox VE users. "
"Preserve product names, commands, paths, variables and placeholders. Translate:" "Preserve product names, commands, paths, variables and placeholders. Translate:"
@@ -136,6 +136,7 @@ class FencingWordingTests(unittest.TestCase):
'pt': ('{hostname}: evento do cluster comunicado', 'Foi comunicado um evento do cluster:\n{reason}', 'Evento do cluster', 'Eventos do cluster'), 'pt': ('{hostname}: evento do cluster comunicado', 'Foi comunicado um evento do cluster:\n{reason}', 'Evento do cluster', 'Eventos do cluster'),
'sk': ('{hostname}: hlásená udalosť klastra', 'Bola hlásená udalosť klastra:\n{reason}', 'Udalosť klastra', 'Udalosti klastra'), 'sk': ('{hostname}: hlásená udalosť klastra', 'Bola hlásená udalosť klastra:\n{reason}', 'Udalosť klastra', 'Udalosti klastra'),
'sv': ('{hostname}: klusterhändelse rapporterad', 'En klusterhändelse har rapporterats:\n{reason}', 'Klusterhändelse', 'Klusterhändelser'), 'sv': ('{hostname}: klusterhändelse rapporterad', 'En klusterhändelse har rapporterats:\n{reason}', 'Klusterhändelse', 'Klusterhändelser'),
'ru': ('{hostname}: получено сообщение о событии в кластере', 'Получено сообщение о событии в кластере:\n{reason}', 'Событие в кластере', 'События кластера'),
} }
self.assertEqual(set(self.catalogs), {'en', *expected}) self.assertEqual(set(self.catalogs), {'en', *expected})
for lang, (title, body, label, settings) in expected.items(): for lang, (title, body, label, settings) in expected.items():
@@ -202,7 +202,7 @@ class RecoveryMessages(unittest.TestCase):
module = importlib.util.module_from_spec(spec) module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module) spec.loader.exec_module(module)
paths = sorted((ROOT / 'lang').glob('*.json')) paths = sorted((ROOT / 'lang').glob('*.json'))
self.assertEqual(len(paths), 7) self.assertEqual(len(paths), 8)
for path in paths: for path in paths:
cache = json.loads(path.read_text()) cache = json.loads(path.read_text())
setattr(module, '_language', path.stem) setattr(module, '_language', path.stem)
@@ -103,7 +103,7 @@ class SecurityMountWording(unittest.TestCase):
module = importlib.util.module_from_spec(spec) module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module) spec.loader.exec_module(module)
paths = sorted((ROOT / 'lang').glob('*.json')) paths = sorted((ROOT / 'lang').glob('*.json'))
self.assertEqual(len(paths), 7) self.assertEqual(len(paths), 8)
for path in paths: for path in paths:
cache = json.loads(path.read_text()) cache = json.loads(path.read_text())
setattr(module, '_language', path.stem) setattr(module, '_language', path.stem)
+1 -1
View File
@@ -63,7 +63,7 @@ class OciWordingTests(TestCase):
module = importlib.util.module_from_spec(spec) module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module) spec.loader.exec_module(module)
paths = sorted((ROOT / 'lang').glob('*.json')) paths = sorted((ROOT / 'lang').glob('*.json'))
self.assertEqual(len(paths), 7) self.assertEqual(len(paths), 8)
for path in paths: for path in paths:
cache = json.loads(path.read_text()) cache = json.loads(path.read_text())
setattr(module, '_language', path.stem) setattr(module, '_language', path.stem)
+3 -3
View File
@@ -42,8 +42,8 @@ on:
type: boolean type: boolean
default: false default: false
languages: languages:
description: 'Comma-separated locales. Default: es,de,fr,it,pt,sk,sv (guardrail protects Vaso73 sk).' description: 'Comma-separated locales. Default: es,de,fr,it,pt,sk,sv,ru (guardrail protects Vaso73 sk).'
default: 'es,de,fr,it,pt,sk,sv' default: 'es,de,fr,it,pt,sk,sv,ru'
# Prevent two runs from racing on the same branch and fighting over the # Prevent two runs from racing on the same branch and fighting over the
# auto-commit. cancel-in-progress:false because a full first-run may take # auto-commit. cancel-in-progress:false because a full first-run may take
@@ -94,7 +94,7 @@ jobs:
# Keep this fallback in sync with the workflow_dispatch input # Keep this fallback in sync with the workflow_dispatch input
# default above AND with DEFAULT_LANGUAGES in the Python script — # default above AND with DEFAULT_LANGUAGES in the Python script —
# `push` triggers hit this branch (inputs are empty on push). # `push` triggers hit this branch (inputs are empty on push).
LANGS="${LANGS:-es,de,fr,it,pt,sk,sv}" LANGS="${LANGS:-es,de,fr,it,pt,sk,sv,ru}"
python .github/scripts/build_i18n_messages.py \ python .github/scripts/build_i18n_messages.py \
--source AppImage/messages/en/common.json \ --source AppImage/messages/en/common.json \
--messages-dir AppImage/messages \ --messages-dir AppImage/messages \
+3 -3
View File
@@ -8,7 +8,7 @@ on:
inputs: inputs:
languages: languages:
description: 'Comma-separated locales' description: 'Comma-separated locales'
default: 'es,de,fr,it,pt,sk,sv' default: 'es,de,fr,it,pt,sk,sv,ru'
section: section:
description: 'File or directory below web/messages/en' description: 'File or directory below web/messages/en'
default: '.' default: '.'
@@ -57,7 +57,7 @@ jobs:
shell: bash shell: bash
run: | run: |
LANGUAGES="${{ github.event.inputs.languages }}" LANGUAGES="${{ github.event.inputs.languages }}"
LANGUAGES="${LANGUAGES:-es,de,fr,it,pt,sk,sv}" LANGUAGES="${LANGUAGES:-es,de,fr,it,pt,sk,sv,ru}"
SECTION="${{ github.event.inputs.section }}" SECTION="${{ github.event.inputs.section }}"
SECTION="${SECTION:-.}" SECTION="${SECTION:-.}"
MAX_FILES="${{ github.event.inputs.max_files }}" MAX_FILES="${{ github.event.inputs.max_files }}"
@@ -86,7 +86,7 @@ jobs:
python .github/scripts/build_web_docs_i18n.py \ python .github/scripts/build_web_docs_i18n.py \
--source-dir web/messages/en \ --source-dir web/messages/en \
--messages-dir web/messages \ --messages-dir web/messages \
--languages "${{ github.event.inputs.languages || 'es,de,fr,it,pt,sk,sv' }}" \ --languages "${{ github.event.inputs.languages || 'es,de,fr,it,pt,sk,sv,ru' }}" \
--check --check
- name: Commit and push changes - name: Commit and push changes
@@ -214,6 +214,7 @@ const NOTIFICATION_LANGUAGES = [
{ value: "pt", label: "Português" }, { value: "pt", label: "Português" },
{ value: "sk", label: "Slovenčina" }, { value: "sk", label: "Slovenčina" },
{ value: "sv", label: "Svenska" }, { value: "sv", label: "Svenska" },
{ value: "ru", label: "Русский" },
] ]
function normalizeNotificationLanguage(notificationLanguage?: string, legacyAiLanguage?: string): string { function normalizeNotificationLanguage(notificationLanguage?: string, legacyAiLanguage?: string): string {
+2
View File
@@ -6,6 +6,7 @@ import itMessages from "../../messages/it/common.json"
import ptMessages from "../../messages/pt/common.json" import ptMessages from "../../messages/pt/common.json"
import skMessages from "../../messages/sk/common.json" import skMessages from "../../messages/sk/common.json"
import svMessages from "../../messages/sv/common.json" import svMessages from "../../messages/sv/common.json"
import ruMessages from "../../messages/ru/common.json"
import type { LanguageCode } from "./languages" import type { LanguageCode } from "./languages"
type MessageTree = Record<string, unknown> type MessageTree = Record<string, unknown>
@@ -20,4 +21,5 @@ export const MESSAGE_CATALOG: Record<LanguageCode, MessageTree> = {
pt: ptMessages as MessageTree, pt: ptMessages as MessageTree,
sk: skMessages as MessageTree, sk: skMessages as MessageTree,
sv: svMessages as MessageTree, sv: svMessages as MessageTree,
ru: ruMessages as MessageTree,
} }
+2 -1
View File
@@ -1,7 +1,7 @@
export const LANGUAGE_STORAGE_KEY = "proxmenux-ui-language" export const LANGUAGE_STORAGE_KEY = "proxmenux-ui-language"
export const DEFAULT_LANGUAGE = "en" export const DEFAULT_LANGUAGE = "en"
export type LanguageCode = "en" | "es" | "fr" | "de" | "it" | "pt" | "sk" | "sv" export type LanguageCode = "en" | "es" | "fr" | "de" | "it" | "pt" | "sk" | "sv" | "ru"
export type LanguageStatus = "complete" | "partial" | "needs-translation" export type LanguageStatus = "complete" | "partial" | "needs-translation"
@@ -21,6 +21,7 @@ export const SUPPORTED_LANGUAGES: SupportedLanguage[] = [
{ code: "pt", englishName: "Portuguese", nativeName: "Português", status: "complete" }, { code: "pt", englishName: "Portuguese", nativeName: "Português", status: "complete" },
{ code: "sk", englishName: "Slovak", nativeName: "Slovenčina", status: "complete" }, { code: "sk", englishName: "Slovak", nativeName: "Slovenčina", status: "complete" },
{ code: "sv", englishName: "Swedish", nativeName: "Svenska", status: "complete" }, { code: "sv", englishName: "Swedish", nativeName: "Svenska", status: "complete" },
{ code: "ru", englishName: "Russian", nativeName: "Русский", status: "complete" },
] ]
export function isSupportedLanguage(value: string | null | undefined): value is LanguageCode { export function isSupportedLanguage(value: string | null | undefined): value is LanguageCode {
+1 -1
View File
@@ -3,7 +3,7 @@
The ProxMenux Monitor dashboard uses a small client-side i18n layer. The ProxMenux Monitor dashboard uses a small client-side i18n layer.
- English (`en`) is the source language and the runtime fallback. - English (`en`) is the source language and the runtime fallback.
- Eight locales are shipped and fully populated end-to-end: `en`, `de`, `es`, `fr`, `it`, `pt`, `sk`, `sv`. Non-English catalogs started from an automated bootstrap and are being polished as native speakers pass through them. - Nine locales are shipped and fully populated end-to-end: `en`, `de`, `es`, `fr`, `it`, `pt`, `sk`, `sv`, `ru`. Non-English catalogs started from an automated bootstrap and are being polished as native speakers pass through them.
To improve a translation, edit the values in your locale's `common.json` — keep placeholders such as `{uptime}`, `{vmid}` or `{count}` unchanged, and don't translate brand or product names (`ProxMenux Monitor`, `Proxmox Backup Server`, `Secure Gateway`, `Tailscale`, etc.). Missing keys fall back to English at runtime, so a partial refresh is always safe to merge. To improve a translation, edit the values in your locale's `common.json` — keep placeholders such as `{uptime}`, `{vmid}` or `{count}` unchanged, and don't translate brand or product names (`ProxMenux Monitor`, `Proxmox Backup Server`, `Secure Gateway`, `Tailscale`, etc.). Missing keys fall back to English at runtime, so a partial refresh is always safe to merge.
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -62,7 +62,7 @@ except ImportError:
DB_PATH = Path('/usr/local/share/proxmenux/health_monitor.db') DB_PATH = Path('/usr/local/share/proxmenux/health_monitor.db')
SETTINGS_PREFIX = 'notification.' SETTINGS_PREFIX = 'notification.'
ENCRYPTION_KEY_FILE = Path('/usr/local/share/proxmenux/.notification_key') ENCRYPTION_KEY_FILE = Path('/usr/local/share/proxmenux/.notification_key')
RUNTIME_NOTIFICATION_LANGUAGES = ('en', 'de', 'es', 'fr', 'it', 'pt', 'sk', 'sv') RUNTIME_NOTIFICATION_LANGUAGES = ('en', 'de', 'es', 'fr', 'it', 'pt', 'sk', 'sv', 'ru')
ALLOWED_AI_LANGUAGES = ( ALLOWED_AI_LANGUAGES = (
'en', 'sk', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'sv', 'no', 'en', 'sk', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'sv', 'no',
'ja', 'zh', 'ko', 'pl', 'nl', 'tr', 'ar', 'ja', 'zh', 'ko', 'pl', 'nl', 'tr', 'ar',
+2 -1
View File
@@ -397,7 +397,8 @@ select_language() {
"it" "Italian" \ "it" "Italian" \
"pt" "Portuguese" \ "pt" "Portuguese" \
"sk" "Slovenčina" \ "sk" "Slovenčina" \
"sv" "Svenska" 3>&1 1>&2 2>&3) "sv" "Svenska" \
"ru" "Русский" 3>&1 1>&2 2>&3)
if [ -z "$LANGUAGE" ]; then if [ -z "$LANGUAGE" ]; then
msg_error "No language selected. Exiting." msg_error "No language selected. Exiting."
+2 -1
View File
@@ -595,7 +595,8 @@ select_language() {
"it" "Italian" \ "it" "Italian" \
"pt" "Portuguese" \ "pt" "Portuguese" \
"sk" "Slovenčina" \ "sk" "Slovenčina" \
"sv" "Svenska" 3>&1 1>&2 2>&3) "sv" "Svenska" \
"ru" "Русский" 3>&1 1>&2 2>&3)
if [ -z "$LANGUAGE" ]; then if [ -z "$LANGUAGE" ]; then
msg_error "No language selected. Exiting." msg_error "No language selected. Exiting."
+9033
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -49,7 +49,7 @@ def cli_error(error, product):
return str(error) return str(error)
try: try:
language = json.loads((BASE / 'config.json').read_text()).get('language', 'en') language = json.loads((BASE / 'config.json').read_text()).get('language', 'en')
if language not in ('sk', 'de', 'es', 'fr', 'it', 'pt', 'sv'): if language not in ('sk', 'de', 'es', 'fr', 'it', 'pt', 'sv', 'ru'):
return str(error) return str(error)
catalog = json.loads((BASE / 'lang' / f'{language}.json').read_text()) catalog = json.loads((BASE / 'lang' / f'{language}.json').read_text())
message = catalog.get(error.template) message = catalog.get(error.template)
+3 -2
View File
@@ -708,7 +708,7 @@ change_language() {
local new_language local new_language
new_language=$(dialog --clear --backtitle "$BACKTITLE" \ new_language=$(dialog --clear --backtitle "$BACKTITLE" \
--title "$(translate "Change Language")" \ --title "$(translate "Change Language")" \
--menu "$(translate "Select a new language for the menu:")" 22 60 8 \ --menu "$(translate "Select a new language for the menu:")" 22 60 9 \
"en" "$(translate "English")" \ "en" "$(translate "English")" \
"de" "$(translate "German")" \ "de" "$(translate "German")" \
"es" "$(translate "Spanish")" \ "es" "$(translate "Spanish")" \
@@ -716,7 +716,8 @@ change_language() {
"it" "$(translate "Italian")" \ "it" "$(translate "Italian")" \
"pt" "$(translate "Portuguese")" \ "pt" "$(translate "Portuguese")" \
"sk" "Slovenčina" \ "sk" "Slovenčina" \
"sv" "Svenska" 3>&1 1>&2 2>&3) "sv" "Svenska" \
"ru" "Русский" 3>&1 1>&2 2>&3)
if [ -z "$new_language" ]; then if [ -z "$new_language" ]; then
dialog --clear --backtitle "$BACKTITLE" \ dialog --clear --backtitle "$BACKTITLE" \
+1
View File
@@ -11,6 +11,7 @@ serves every published page under locale-prefixed URLs:
- `/pt/<path>` — Portuguese - `/pt/<path>` — Portuguese
- `/sk/<path>` — Slovak, with English fallback where needed - `/sk/<path>` — Slovak, with English fallback where needed
- `/sv/<path>` — Swedish - `/sv/<path>` — Swedish
- `/ru/<path>` — Russian
We use [`next-intl`](https://next-intl.dev) for the i18n plumbing. Anyone We use [`next-intl`](https://next-intl.dev) for the i18n plumbing. Anyone
can translate the docs without writing TypeScript: most of the work is can translate the docs without writing TypeScript: most of the work is
+1
View File
@@ -35,6 +35,7 @@ export function LanguageSwitcher() {
pt: t("pt"), pt: t("pt"),
sk: t("sk"), sk: t("sk"),
sv: t("sv"), sv: t("sv"),
ru: t("ru"),
} }
return ( return (
+1 -1
View File
@@ -19,7 +19,7 @@ import { defineRouting } from "next-intl/routing"
* `CONTRIBUTING-TRANSLATIONS.md`. * `CONTRIBUTING-TRANSLATIONS.md`.
*/ */
export const routing = defineRouting({ export const routing = defineRouting({
locales: ["en", "es", "de", "fr", "it", "pt", "sk", "sv"], locales: ["en", "es", "de", "fr", "it", "pt", "sk", "sv", "ru"],
defaultLocale: "en", defaultLocale: "en",
localePrefix: "always", localePrefix: "always",
}) })
+2 -1
View File
@@ -33,7 +33,8 @@
"fr": "Français", "fr": "Français",
"it": "Italiano", "it": "Italiano",
"pt": "Português", "pt": "Português",
"sv": "Svenska" "sv": "Svenska",
"ru": "Русский"
}, },
"resources": { "resources": {
"documentation": { "documentation": {
+2 -1
View File
@@ -33,7 +33,8 @@
"fr": "Français", "fr": "Français",
"it": "Italiano", "it": "Italiano",
"pt": "Português", "pt": "Português",
"sv": "Svenska" "sv": "Svenska",
"ru": "Русский"
}, },
"resources": { "resources": {
"documentation": { "documentation": {
+2 -1
View File
@@ -33,7 +33,8 @@
"fr": "Français", "fr": "Français",
"it": "Italiano", "it": "Italiano",
"pt": "Português", "pt": "Português",
"sv": "Svenska" "sv": "Svenska",
"ru": "Русский"
}, },
"resources": { "resources": {
"documentation": { "documentation": {
+2 -1
View File
@@ -33,7 +33,8 @@
"fr": "Français", "fr": "Français",
"it": "Italiano", "it": "Italiano",
"pt": "Português", "pt": "Português",
"sv": "Svenska" "sv": "Svenska",
"ru": "Русский"
}, },
"resources": { "resources": {
"documentation": { "documentation": {
+2 -1
View File
@@ -33,7 +33,8 @@
"fr": "Français", "fr": "Français",
"it": "Italiano", "it": "Italiano",
"pt": "Português", "pt": "Português",
"sv": "Svenska" "sv": "Svenska",
"ru": "Русский"
}, },
"resources": { "resources": {
"documentation": { "documentation": {
+2 -1
View File
@@ -33,7 +33,8 @@
"fr": "Français", "fr": "Français",
"it": "Italiano", "it": "Italiano",
"pt": "Português", "pt": "Português",
"sv": "Svenska" "sv": "Svenska",
"ru": "Русский"
}, },
"resources": { "resources": {
"documentation": { "documentation": {
+257
View File
@@ -0,0 +1,257 @@
{
"site": {
"name": "ProxMenux",
"tagline": "Интерактивное меню и веб-панель управления для Proxmox VE"
},
"nav": {
"home": "Главная",
"docs": "Документация",
"documentation": "Документация",
"guides": "Руководства",
"changelog": "Журнал изменений",
"github": "GitHub",
"rss": "RSS",
"rssTitle": "RSS-лента",
"menuOpen": "Открыть меню"
},
"footer": {
"sponsorHeading": "Поддержка проекта",
"sponsorBody": "Если вы хотите поддержать проект.",
"sponsorAlt": "Поддержите меня на Ko-fi",
"connectHeading": "Сообщество",
"connectBody": "Присоединяйтесь к обсуждениям сообщества на GitHub, чтобы получить помощь, поделиться идеями и внести свой вклад в проект. Мы рады любым идеям!",
"joinDiscussion": "Присоединиться к обсуждению",
"copyrightPrefix": "ProxMenux — совместный проект с открытым исходным кодом, созданный",
"copyrightSuffix": "."
},
"language": {
"switcher": "Язык",
"en": "English",
"es": "Español",
"sk": "Slovenčina",
"de": "Deutsch",
"fr": "Français",
"it": "Italiano",
"pt": "Português",
"sv": "Svenska",
"ru": "Русский"
},
"resources": {
"documentation": {
"title": "Документация",
"description": "Описание системы и руководства пользователя"
},
"changelog": {
"title": "Журнал изменений",
"description": "Информация о последних обновлениях"
},
"guides": {
"title": "Руководства",
"description": "Пошаговые инструкции и руководства по типовым задачам"
},
"github": {
"title": "Репозиторий GitHub",
"description": "Изучите исходный код."
}
},
"docSidebar": {
"documentation": "Документация",
"items": {
"introduction": "Введение",
"installation": "Установка",
"proxmenuxMonitor": "ProxMenux Monitor",
"monitorOverview": "Обзор",
"architecture": "Архитектура",
"accessAuth": "Доступ и аутентификация",
"dashboard": "Панель мониторинга",
"dashboardSystemOverview": "Вкладка «Обзор системы»",
"dashboardApps": "Вкладка «Приложения»",
"dashboardStorage": "Вкладка «Хранилище»",
"dashboardNetwork": "Вкладка «Сеть»",
"dashboardVmsLxcs": "Вкладка «Виртуальные машины и контейнеры LXC»",
"dashboardVmsLxcsApp": "Приложение",
"dashboardVmsLxcsUpdates": "Обновления",
"dashboardHardware": "Вкладка «Оборудование»",
"dashboardSystemLogs": "Вкладка «Системные журналы»",
"dashboardTerminal": "Вкладка «Терминал»",
"dashboardSecurity": "Вкладка «Безопасность»",
"dashboardSettings": "Вкладка «Настройки»",
"healthMonitor": "Мониторинг состояния",
"auditReport": "Audit и отчёт",
"auditReportOverview": "Обзор",
"auditReportAssessment": "Оценка и инвентаризация",
"auditReportPolicy": "Политика",
"auditReportChanges": "Изменения",
"auditReportReports": "Отчёты и сравнения",
"auditReportScope": "Область действия и гарантии",
"notifications": "Уведомления",
"aiAssistant": "ИИ-ассистент",
"apiReference": "Справочник API",
"integrations": "Интеграции",
"ociManager": "Приложения менеджера OCI",
"ociOverview": "Обзор",
"ociArchitecture": "Как преобразуется образ OCI",
"ociCustomImage": "Образ не из каталога",
"ociStorageNetwork": "Данные, пути и сеть",
"ociHardware": "Устройства и ускорение",
"ociStacks": "Многоконтейнерные приложения",
"ociContributeApp": "Установка приложения и добавление его в проект",
"ociLifecycle": "Установка, обновление и изменение",
"ociMonitor": "В ProxMenux Monitor",
"proxmenuxScripts": "ProxMenux Scripts",
"postInstallScript": "Скрипт послеустановочной настройки",
"postInstallOverview": "Обзор",
"postInstallAutomated": "Автоматическая настройка",
"postInstallCustomizable": "Настройка с выбором параметров",
"postInstallBasicSettings": "Основные настройки",
"postInstallSystem": "Система",
"postInstallVirtualization": "Виртуализация",
"postInstallNetwork": "Сеть",
"postInstallStorage": "Хранилище",
"postInstallSecurity": "Безопасность",
"postInstallCustomization": "Персонализация",
"postInstallMonitoring": "Мониторинг",
"postInstallPerformance": "Производительность",
"postInstallOptional": "Дополнительные настройки",
"postInstallUpdates": "Применить доступные обновления",
"postInstallUninstall": "Удалить оптимизации",
"gpusCoralTpu": "GPU и Coral-TPU",
"nvidiaHost": "Установить драйверы NVIDIA на хосте",
"coralHost": "Установить Coral TPU на хосте",
"addGpuLxc": "Добавить GPU в LXC",
"addCoralLxc": "Добавить Coral TPU в LXC",
"addGpuVm": "Добавить GPU в ВМ (прямой проброс)",
"switchGpuMode": "Переключить режим GPU (ВМ ↔ LXC)",
"createVm": "Создать ВМ",
"createVmOverview": "Обзор",
"createVmSystemNas": "Системы NAS",
"createVmSynology": "ВМ Synology",
"createVmNasOthers": "Другие системы NAS",
"createVmSystemWindows": "Системы Windows",
"createVmSystemLinux": "Системы Linux",
"diskManager": "Диспетчер дисков",
"diskManagerOverview": "Обзор",
"diskImportVm": "Импортировать диск в ВМ",
"diskImportImageVm": "Импортировать образ диска в ВМ",
"diskAddController": "Добавить контроллер или NVMe в ВМ",
"diskImportLxc": "Импортировать диск в LXC",
"diskFormat": "Форматировать / стереть физический диск",
"diskSmart": "Состояние и проверка диска по SMART",
"storageShareManager": "Управление хранилищами и общими ресурсами",
"storageShareOverview": "Обзор",
"hostStorage": "Интеграция хранилищ хоста",
"hostNfs": "Добавление общего ресурса NFS в качестве хранилища Proxmox",
"hostSamba": "Добавление общего ресурса Samba в качестве хранилища Proxmox",
"hostIscsi": "Добавление целевого устройства iSCSI в качестве хранилища Proxmox",
"hostLocalDisk": "Добавление локального диска в качестве хранилища Proxmox",
"hostLocalShared": "Добавление общего каталога на хосте",
"lxcMountPoints": "Точки монтирования LXC (хост ↔ CT)",
"lxcNetworkSharing": "Общий доступ по сети в LXC",
"lxcNfsClient": "Клиент NFS в LXC",
"lxcSambaClient": "Клиент Samba в LXC",
"lxcNfsServer": "Сервер NFS в LXC",
"lxcSambaServer": "Сервер Samba в LXC",
"network": "Сеть",
"networkOverview": "Обзор",
"networkDiagnostics": "Диагностика",
"networkMonitoring": "Инструменты мониторинга в реальном времени",
"networkBridge": "Анализ и исправление сетевых мостов",
"networkConfig": "Анализ и очистка конфигурации",
"networkPersistent": "Постоянные имена интерфейсов",
"networkBackup": "Резервное копирование конфигурации и перезапуск интерфейсов",
"security": "Безопасность",
"securityOverview": "Обзор",
"securityFail2ban": "Fail2Ban",
"securityLynis": "Lynis",
"utilities": "Утилиты",
"utilsOverview": "Обзор",
"utilsUupDump": "Создание ISO с помощью UUP Dump",
"utilsSystemUtils": "Установка системных утилит",
"utilsSystemUpdate": "Обновление системы Proxmox",
"utilsUpgradePve": "Обновление PVE 8 до PVE 9",
"utilsExportVm": "Экспорт ВМ в OVA / OVF",
"utilsImportVm": "Импорт ВМ из OVA / OVF",
"settingsProxmenux": "Настройки ProxMenux",
"settingsOverview": "Обзор",
"settingsMonitor": "ProxMenux Monitor",
"settingsBeta": "Изменение канала обновлений",
"settingsLanguage": "Изменение языка",
"settingsVersion": "Просмотр информации о версии",
"settingsUninstall": "Удаление ProxMenux",
"commandsReference": "Справочник команд",
"commandsOverview": "Обзор",
"commandsSystem": "Полезные системные команды",
"commandsVmCt": "Управление ВМ и контейнерами",
"commandsStorage": "Хранилища и диски",
"commandsNetwork": "Сетевые команды",
"commandsUpdates": "Обновления и пакеты",
"commandsGpu": "Проброс GPU",
"commandsZfs": "Управление ZFS",
"commandsBackup": "Резервное копирование и восстановление",
"commandsTools": "Системные инструменты командной строки",
"glossary": "Глоссарий",
"about": "О проекте",
"aboutOverview": "Обзор",
"aboutFaq": "FAQ",
"aboutContributors": "Участники проекта",
"aboutContributing": "Участие в проекте",
"aboutCodeOfConduct": "Кодекс поведения",
"externalRepositories": "Внешние репозитории",
"backupRestore": "Резервное копирование и восстановление",
"backupRestoreOverview": "Обзор",
"backupRestoreHowItWorks": "Как это работает",
"backupRestoreDestinations": "Места хранения",
"backupRestoreDestOverview": "Обзор",
"backupRestoreDestLocal": "Локальный архив",
"backupRestoreDestPbs": "Proxmox Backup Server",
"backupRestoreDestBorg": "Borg",
"backupRestoreCreating": "Создание резервных копий",
"backupRestoreJobs": "Задания по расписанию",
"backupRestoreRestoring": "Восстановление",
"backupRestoreCrossKernel": "Восстановление с другой версией ядра",
"backupRestoreGlossary": "Глоссарий"
}
},
"hero": {
"title": "ProxMenux",
"tagline": "Интерактивное меню и веб-панель для Proxmox VE",
"description": "ProxMenux — это интерактивное меню и веб-панель для Proxmox VE: запускайте команды, скрипты и пошаговые мастера из меню в терминале или отслеживайте состояние хоста, метрики и уведомления в браузере.",
"installButton": "Установить сейчас",
"whatIsButton": "Что такое ProxMenux?",
"logoAlt": "Логотип ProxMenux"
},
"docNav": {
"previous": "Назад",
"next": "Далее"
},
"tocPanel": {
"onThisPage": "На этой странице"
},
"supportProject": {
"heading": "Поддержите проект!",
"body": "Если <strong>ProxMenux</strong> полезен для вас, поставьте ему ⭐ на GitHub, чтобы помочь другим узнать о нём!",
"button": "Поставить звезду на GitHub"
},
"rssLink": {
"heading": "Будьте в курсе!",
"body": "Подпишитесь на нашу RSS-ленту, чтобы получать уведомления об изменениях.",
"copy": "Копировать",
"copied": "Скопировано!",
"copyTitle": "Скопировать URL RSS-ленты",
"openFeed": "Открыть RSS-ленту",
"openTitle": "Открыть RSS-ленту"
},
"changelog": {
"pageTitle": "Журнал изменений",
"meta": {
"title": "ProxMenux — журнал изменений",
"titleSuffix": "Примечания к выпускам",
"latest": "Последний",
"mostRecent": "Самый новый выпуск",
"description": "Примечания к выпускам и история обновлений ProxMenux — скрипта с управлением через меню для администрирования Proxmox VE.",
"descriptionTail": "Новые функции, исправления ошибок, обновления безопасности, улучшения ProxMenux Monitor, совместимость с поставщиками ИИ, усиление безопасности проброса GPU и многое другое.",
"ogDescription": "Примечания к выпускам ProxMenux.",
"ogTail": "Подпишитесь на RSS-ленту или заходите на страницу, чтобы узнать о новых версиях."
}
}
}
@@ -0,0 +1,13 @@
{
"meta": {
"title": "Кодекс поведения | Документация ProxMenux",
"description": "Кодекс поведения ProxMenux и рекомендации для участников разработки, тестировщиков и пользователей.",
"ogTitle": "Кодекс поведения | Документация ProxMenux",
"ogDescription": "Требования к ответственности за код, раскрытию информации об уязвимостях и объёму изменений в запросах на слияние для проекта ProxMenux."
},
"errors": {
"notFound": "Ошибка: файл CODE_OF_CONDUCT.md не найден.",
"loadFailed": "Ошибка: не удалось загрузить содержимое кодекса поведения."
},
"contentMarkdown": "# 📝 Кодекс поведения и рекомендации\n\nЭтот документ определяет **принципы и правила** использования **ProxMenux**, направленные на поддержание **уважения, сотрудничества и безопасности** при разработке.\n\n## 📌 1. Указание авторства кода и признание вклада\n\n- При использовании **скриптов, фрагментов кода или идей** из других репозиториев или от других разработчиков всегда указывается первоначальный автор. \n- В код или документацию добавляется комментарий с указанием источника и, по возможности, ссылкой на исходный репозиторий. \n- При использовании кода с определённой **лицензией** необходимо соблюдать её условия. \n\n### ✅ Пример корректного указания авторства в коде:\n\n```bash\n# Script based on the work of [Author] at [Repository Link]\n```\n\n## 🔒 2. Безопасность и ответственность за код\n\n- Весь код в этом репозитории соответствует рекомендациям по безопасной разработке.\n- Не допускаются изменения, намеренно добавляющие уязвимости или небезопасные практики.\n- Скрипты ни при каких обстоятельствах не должны ставить под угрозу безопасность системы или пользовательских данных.\n- Перед внедрением предлагаемые изменения следует проверять на безопасность и стабильность.\n\n### ⚠️ Ответственное раскрытие информации об уязвимостях\n\nЕсли вы обнаружили уязвимость безопасности, НЕ сообщайте о ней в публичных Issues или на форумах.\n\nВместо этого сообщите о ней конфиденциально по электронной почте:\n\n📧 proxmenux@macrimi.pro\n\nПодробную информацию об уязвимостях безопасности и порядке сообщения о них см. в нашей [Политике безопасности](./SECURITY.md).\n\n## 🤝 3. Правила сообщества\n\nЧтобы поддерживать уважительную и профессиональную атмосферу, все пользователи должны соблюдать следующие правила:\n\n- ✅ Будьте уважительны и конструктивны в обсуждениях.\n- ❌ Преследование, высказывания, разжигающие ненависть, и оскорбительное поведение недопустимы.\n- ✅ Оставляйте отзывы профессионально, избегая перехода на личности.\n- ❌ Нарушение этих правил может привести к предупреждению или блокировке в зависимости от тяжести нарушения.\n\n\n##\n\nЭтим документом мы поддерживаем этичное использование кода, осведомлённость о безопасности и уважительные отношения в сообществе.\n\n📢 Давайте вместе создадим нечто замечательное!\n\n"
}
@@ -0,0 +1,293 @@
{
"meta": {
"title": "Участие в разработке ProxMenux | Документация ProxMenux",
"description": "Как участвовать в разработке ProxMenux — модель ветвления (main / develop / feature/*), порядок работы с запросами на слияние, шаблон заголовка скрипта с указанием авторства и необязательной ссылкой для спонсорской поддержки, двухэтапная политика проектирования интерфейса, функции вывода сообщений и путь от ветки разработки функции до стабильного выпуска.",
"ogTitle": "Участие в разработке ProxMenux",
"ogDescription": "Модель ветвления, рабочий процесс, указание авторства в заголовках скриптов и двухэтапная политика проектирования интерфейса, которую должны соблюдать участники разработки."
},
"header": {
"title": "Участие в разработке ProxMenux",
"description": "ProxMenux открыт для вклада сообщества: новых скриптов, исправлений существующих, улучшений диалоговых окон, переводов и интеграций. Эта страница — официальное руководство для участников: структура репозитория, модель ветвления и порядок работы с запросами на слияние, заголовок скрипта с указанием авторства и необязательной ссылкой для спонсорской поддержки, а также правила проектирования, которым должны соответствовать все предлагаемые изменения.",
"section": "О проекте"
},
"twoPagesCallout": {
"title": "Две связанные страницы, один проект",
"body": "Не путайте эту страницу со страницей <contributorsLink>Участники проекта</contributorsLink>: та посвящена людям, которые уже вносят свой вклад в проект (тестировщикам, рецензентам, разработчикам). Эта страница предназначена для <em>вас</em> — будущего участника проекта — и объясняет, как отправить PR, который будет принят."
},
"branching": {
"heading": "Модель ветвления",
"intro": "В ProxMenux используется трёхуровневая модель ветвления:",
"headerBranch": "Ветка",
"headerPurpose": "Назначение",
"rows": [
{
"branch": "main",
"purposeRich": "Стабильный код, готовый к эксплуатации. Сюда попадают только изменения, готовые к выпуску. Именно этот код получают конечные пользователи при обычной установке ProxMenux."
},
{
"branch": "develop",
"purposeRich": "Ветка активной разработки. Все новые изменения сначала попадают сюда; это «бета»-канал. Когда выпуск готов, стабильную версию из этой ветки сливают в <code>main</code>."
},
{
"branch": "feature/*",
"purposeRich": "Краткоживущие ветки для отдельных функций, исправлений или улучшений. Создаются на основе <code>develop</code> и после проверки сливаются обратно в <code>develop</code> через Pull Request."
}
],
"calloutTitle": "Что это означает для пользователей",
"calloutBody": "Конечные пользователи, использующие ветку <code>main</code>, получают проверенные выпуски. Те, кто хочет раньше получать новые функции и готов мириться с отдельными недоработками, могут использовать <code>develop</code>. Новые функции всегда сначала проходят через <code>develop</code>; ничто не попадает в <code>main</code>, минуя этот цикл."
},
"workflow": {
"heading": "Порядок работы с Pull Request",
"intro": "От идеи до включения изменений в выпуск за пять шагов:",
"step1Lead": "<strong>Создайте ветку для новой функции на основе <code>develop</code></strong>:",
"step1Code": "git clone https://github.com/MacRimi/ProxMenux.git\ncd ProxMenux\ngit checkout develop\ngit pull origin develop\ngit checkout -b feature/your-feature-name",
"step1Trail": "Используйте содержательное имя ветки: <code>feature/zfs-arc-tuning</code>, <code>feature/fix-iommu-detection</code>, <code>feature/add-tailscale-script</code>.",
"step2Lead": "<strong>Внесите изменения и отправьте ветку в удалённый репозиторий:</strong>",
"step2Code": "# Make your changes, then:\ngit add scripts/...\ngit commit -m \"Add ZFS ARC tuning script\"\ngit push -u origin feature/your-feature-name",
"step3": "<strong>Создайте Pull Request в ветку <code>develop</code></strong> (не в <code>main</code>). На странице создания PR в GitHub ещё раз проверьте, что в качестве базовой ветки выбрана <code>develop</code>. Укажите в описании, что делает скрипт, какие изменения он вносит и на каких версиях Proxmox VE вы его проверили.",
"step4": "<strong>После проверки изменения сливаются в <code>develop</code>.</strong> Сопровождающий проверяет качество кода, соблюдение правил оформления заголовка и политики двухфазного пользовательского интерфейса. Он может запросить доработки — отправьте дополнительные коммиты в ту же ветку, и PR обновится автоматически.",
"step5": "<strong>Стабильные выпуски сливаются из <code>develop</code> в <code>main</code>.</strong> При подготовке выпуска сопровождающие выполняют слияние <code>develop</code> в <code>main</code> методом fast-forward и создают тег. Ваш вклад становится частью следующей стабильной версии."
},
"scriptHeader": {
"heading": "Заголовок скрипта — метаданные и описание",
"intro": "Каждый скрипт в ProxMenux начинается с двух соседних блоков комментариев, которые вместе образуют заголовок. <strong>Оба блока обязательны</strong>: вместе они позволяют любому читателю узнать, кто написал скрипт и что он делает, не заглядывая в сам код.",
"bullets": [
"<strong>Верхний блок — метаданные.</strong> Автор, необязательные ссылки GitHub / Sponsor, сопровождающий, сведения об авторских правах, лицензия, версия, дата последнего обновления. Здесь также <em>отмечается вклад участников</em>: когда вы пишете новый скрипт, сюда вносится ваше имя, а при желании можно добавить ссылку на личную страницу (GitHub) и профиль для финансовой поддержки (Ko-fi, GitHub Sponsors, Buy Me a Coffee и т. д.).",
"<strong>Нижний блок — описание.</strong> Краткий абзац на понятном английском языке, объясняющий, что делает скрипт. Пользователи читают его <em>до</em> просмотра кода: описание должно быть достаточно самостоятельным, чтобы даже тот, кто видит только заголовок, понял назначение скрипта. Перечислите основные действия, затрагиваемые ресурсы и предварительные требования."
],
"licenseCalloutTitle": "Строка лицензии фиксирована — GPL-3.0",
"licenseCalloutBody": "ProxMenux распространяется на условиях <strong>GNU General Public License v3.0</strong>. Каждый скрипт проекта распространяется на условиях той же лицензии; строка <code>License</code> в заголовке всегда содержит ссылку на GPL-3.0, показанную в примере ниже, — выбирать лицензию отдельно для каждого скрипта нельзя. Добавляя скрипт в проект, вы соглашаетесь выпустить его под GPL-3.0. Это означает, что любой может читать, изменять и распространять его (в том числе с изменениями), сохраняя ту же лицензию. Полный текст находится в <licenseLink>MacRimi/ProxMenux/LICENSE</licenseLink>.",
"templateCode": "#!/bin/bash\n\n# ==========================================================\n# ProxMenux - A menu-driven script for Proxmox VE management\n# ==========================================================\n# Author : Your Name\n# GitHub : github.com/yourhandle\n# Sponsor : ko-fi.com/yourhandle\n# Maintainer : MacRimi\n# Copyright : (c) 2026 MacRimi & contributors\n# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)\n# Version : 1.0\n# Last Updated: DD/MM/YYYY\n# ==========================================================\n# Description:\n# Short paragraph explaining what the script does.\n# Mention the main actions (e.g. \"creates a ZFS pool\",\n# \"configures IOMMU and reboots\", \"imports an ISO into a VM\"),\n# the resources it touches, and any prerequisites the user\n# should be aware of before running it.\n# ==========================================================",
"optionalNote": "Строки <code>GitHub</code> и <code>Sponsor</code> необязательны — не добавляйте их, если не хотите публиковать эти сведения. Всё остальное обязательно.",
"whyCalloutTitle": "Почему это важно",
"whyCalloutBody": "Участие в разработке открытого ПО — добровольная работа. Имя участника и ссылка для спонсорской поддержки (если она предоставлена), указанные непосредственно в исходном коде, делают вклад создателей скриптов заметным для каждого, кто читает код: ваше авторство сохраняется, а не скрывается за «проектом». Блок описания важен по другой причине: это первое, что читает будущий сопровождающий или заинтересованный пользователь, и от ясности описания часто зависит, будут ли люди доверять скрипту или избегать его."
},
"structure": {
"heading": "Структура проекта",
"intro": "Где в репозитории находятся скрипты каждого типа:",
"treeCode": "scripts/\n├── menus/ # Top-level menu scripts (entry points)\n├── storage/ # Disk, storage and passthrough scripts\n├── share/ # NFS, Samba, local share scripts\n├── vm/ # VM creation and configuration scripts\n├── gpu_tpu/ # GPU / TPU passthrough scripts\n├── post_install/ # Post-install automation scripts\n├── backup_restore/ # Backup and restore scripts\n├── utilities/ # System utility scripts\n├── global/ # Shared helper libraries (sourced by other scripts)\n├── utils.sh # Shared utility functions and message helpers\n└── help_info_menu.sh # Interactive help and command reference",
"outro": "При запуске каждый скрипт подключает <code>utils.sh</code>, чтобы получить функции вывода сообщений, индикатор ожидания, переменные цветов и систему перевода. Общие вспомогательные библиотеки (в <code>scripts/global/</code>) явно подключаются теми скриптами, которым они нужны."
},
"twoPhase": {
"heading": "Правило двухэтапного построения интерфейса",
"intro": "Это важнейшее соглашение в ProxMenux, и именно из-за его нарушения чаще всего просят исправить PR. Каждый скрипт делится <strong>ровно на два этапа</strong>:",
"headerPhase": "Этап",
"headerPurpose": "Назначение",
"headerScreen": "Состояние экрана",
"rows": [
{
"phaseRich": "<strong>Этап 1 — Выбор</strong>",
"purposeRich": "Собрать все решения пользователя. Выполнить всю необходимую подготовительную работу (опросы системы, сканирование, проверки).",
"screenRich": "Наложенные окна <code>dialog</code>. Если опрос системы между двумя меню занимает больше одной-двух секунд, покажите индикатор ожидания <code>msg_info</code>, чтобы пользователь понимал, что скрипт не завис, а непосредственно перед следующим диалоговым окном вызовите <code>stop_spinner</code>."
},
{
"phaseRich": "<strong>Этап 2 — Выполнение</strong>",
"purposeRich": "Выполнить все операции. Отображать на экране всю историю выполнения, дополняя её по мере работы.",
"screenRich": "Видимые сообщения <code>msg_info</code> / <code>msg_ok</code>; никогда не используйте <code>dialog</code>."
}
],
"principle": "Принцип: <strong>сначала собрать все решения, затем выполнить все операции</strong>. Пользователь сначала видит меню с диалоговыми окнами без лишнего вывода (этап 1), а затем — ход выполнения в виде журнала (этап 2). Не смешивайте эти этапы: никаких диалоговых окон во время выполнения и никаких сообщений о ходе выполнения во время выбора.",
"phase1Heading": "Этап 1 — типовая схема",
"phase1Code": "# Silent preparatory work between dialogs\nmsg_info \"$(translate \"Checking disk assignments...\")\"\nASSIGNED_TO=$(check_assignments \"$DISK\")\nstop_spinner # ← clears line silently, result saved in variable\n\n# Next dialog can now use ASSIGNED_TO\nif [ -n \"$ASSIGNED_TO\" ]; then\n dialog --yesno \"$(translate \"Disk already assigned. Continue?\")\" $UI_YESNO_H $UI_YESNO_W\nfi\n\n# Collect multiple decisions per item with parallel arrays\ndeclare -a DISK_LIST=()\ndeclare -a DISK_FORMAT_TYPES=()\ndeclare -a DISK_MOUNT_POINTS=()\nfor DISK in $SELECTED; do\n msg_info \"$(translate \"Analyzing disk...\")\"\n CURRENT_FS=$(lsblk -no FSTYPE \"$DISK\" | xargs)\n stop_spinner\n\n FORMAT=$(dialog --backtitle \"$BACKTITLE\" \\\n --title \"$(translate \"Select Filesystem\")\" \\\n --menu \"...\" $UI_SHORT_MENU_H $UI_SHORT_MENU_W $UI_SHORT_MENU_LIST_H \\\n \"ext4\" \"...\" \"xfs\" \"...\" \"btrfs\" \"...\" \\\n 2>&1 >/dev/tty)\n [ -z \"$FORMAT\" ] && continue\n\n DISK_LIST+=(\"$DISK\")\n DISK_FORMAT_TYPES+=(\"$FORMAT\")\ndone",
"phase1RulesIntro": "<strong>Правила для этапа 1:</strong>",
"phase1Rules": [
"Если индикатор ожидания <code>msg_info</code> сейчас активен и вам нужно открыть меню <code>dialog</code> или <code>whiptail</code>, сначала вызовите <code>stop_spinner</code> — индикатор ожидания не может работать одновременно с наложенным окном, которое выводит любой из этих инструментов. Если индикатор ожидания не активен, этот вызов не нужен.",
"Используйте <code>show_proxmenux_logo</code> + <code>msg_title</code> + <code>msg_info</code>, когда на этапе 1 нужно визуально пояснить пользователю длительную операцию (например, опрос системы, занимающий 5 и более секунд). Функция сама очищает экран, поэтому не вызывайте перед ней <code>clear</code>.",
"Не вызывайте <code>show_proxmenux_logo</code> между диалоговыми меню, если выводить нечего: очистка экрана ради пустого терминала лишь создаёт визуальный шум.",
"Сохраняйте все решения и результаты опросов системы в переменных или параллельных массивах. Итоговая сводка выводится в начале этапа 2, а не на этапе 1."
],
"phase2Heading": "Этап 2 — типовая схема",
"phase2Code": "# ── PHASE 2 — EXECUTION ─────────────────────────────\nshow_proxmenux_logo\nmsg_title \"$(translate \"My Script Title\")\"\n\n# Recap Phase 1 preparatory results — show what was already done\nmsg_ok \"$(translate \"CT $CTID selected.\")\"\nmsg_ok \"$(translate \"Repositories verified.\")\"\nmsg_ok \"$(translate \"Disks to process: ${#DISK_LIST[@]}\")\"\n\n# Now execute operations\nfor i in \"${!DISK_LIST[@]}\"; do\n DISK=\"${DISK_LIST[$i]}\"\n FORMAT=\"${DISK_FORMAT_TYPES[$i]}\"\n\n msg_info \"$(translate \"Formatting\") $DISK $(translate \"as\") $FORMAT...\"\n mkfs.\"$FORMAT\" \"$DISK\" >/dev/null 2>&1\n msg_ok \"$(translate \"Formatted.\")\"\ndone\n\nmsg_ok \"$(translate \"Completed. ${#DISK_LIST[@]} disk(s) processed.\")\"\nmsg_success \"$(translate \"Press Enter to return to menu...\")\"\nread -r",
"phase2Rules": "<strong>Правила для этапа 2:</strong> всегда начинайте с <code>show_proxmenux_logo + msg_title</code>; сразу после этого кратко изложите результаты этапа 1 в строках <code>msg_ok</code>; никогда не вызывайте <code>show_proxmenux_logo</code> повторно (это удалит накопленную информацию о ходе выполнения); никогда не вызывайте <code>dialog</code> на этапе 2 — если решение во время выполнения действительно неизбежно, используйте <code>whiptail</code> (см. следующий раздел)."
},
"dialogVsWhiptail": {
"headingRich": "Когда использовать <code>dialog</code>, а когда — <code>whiptail</code>",
"intro": "Оба инструмента создают текстовые пользовательские интерфейсы, но ведут себя на экране совершенно по-разному — и ProxMenux не случайно использует их на двух разных этапах.",
"headerTool": "Инструмент",
"headerWhen": "Когда использовать",
"headerEffect": "Поведение на экране",
"rows": [
{
"toolRich": "<strong><code>dialog</code></strong>",
"whenRich": "<strong>Всегда на этапе 1.</strong> Для любого интерактивного выбора — виртуальной машины, диска, файловой системы, подтверждения действия — используется <code>dialog</code>. Это стандартный инструмент пользовательского интерфейса в ProxMenux.",
"effectRich": "Полностью занимает терминал: очищает экран, отображает свой интерфейс поверх него, а при закрытии возвращает терминал в прежнее состояние. Это допустимо на этапе 1, поскольку полезная информация ещё не отображается."
},
{
"toolRich": "<strong><code>whiptail</code></strong>",
"whenRich": "<strong>Только на этапе 2 и только при крайней необходимости.</strong> Типичный случай — запрос на перезагрузку в конце выполнения. Не используйте <code>whiptail</code>, чтобы спросить «Продолжить?» в ходе выполнения — это решение должно было быть принято на этапе 1.",
"effectRich": "Более лёгкий интерфейс, который отображается поверх содержимого терминала и <em>не очищает</em> его. Накопленная на этапе 2 история <code>msg_ok</code> / <code>msg_info</code> остаётся видимой за диалоговым окном. Поэтому этот инструмент подходит для случаев, когда информация о ходе выполнения уже отображается на экране."
}
],
"calloutTitle": "Почему важно это разделение",
"calloutBody": "Если вызвать <code>dialog</code> посреди этапа 2, все строки <code>msg_ok</code>, за которыми наблюдал пользователь, исчезнут. Вы сотрёте историю действий. <code>whiptail</code> позволяет этого избежать. Таким образом, это правило не произвольно — оно позволяет сохранить на экране информацию о том, что скрипт уже сделал.",
"rebootHeading": "Запрос на перезагрузку — типичный пример использования whiptail на этапе 2",
"rebootIntro": "Когда скрипт завершается и может потребоваться перезагрузка (например, после включения IOMMU или изменения параметров ядра), для запроса в конце этапа 2 используется <code>whiptail</code>. Всегда предусматривайте ветку «Нет», которая предупреждает пользователя, что затронутый ресурс нельзя использовать до перезагрузки:",
"rebootCode": "if [[ \"$HOST_REBOOT_REQUIRED\" == \"yes\" ]]; then\n echo \"\"\n if whiptail --title \"$(translate \"Reboot Required\")\" --yesno \\\n \"\\n$(translate \"A host reboot is required before starting the VM. Reboot now?\")\" \\\n 13 78; then\n msg_warn \"$(translate \"Rebooting the system...\")\"\n reboot\n else\n echo \"\"\n msg_info2 \"$(translate \"Do not start the VM until the system has been rebooted.\")\"\n fi\nfi\n\nmsg_success \"$(translate \"Press Enter to return to menu...\")\"\nread -r"
},
"messageFunctions": {
"heading": "Справочник функций вывода сообщений",
"intro": "Все функции определены в <code>utils.sh</code>. Используйте их по умолчанию для любого вывода, видимого пользователю: их основная цель — единообразное оформление во всех скриптах. Если вашему скрипту нужна новая функция, которая не вписывается в существующий набор (новый уровень важности сообщений, новая вспомогательная функция компоновки и т. п.), предложите её в своём Pull Request — её рассмотрят и добавят в <code>utils.sh</code>, если она будет полезна и в других случаях.",
"headerFunction": "Функция",
"headerWhen": "Когда использовать",
"headerSpinner": "Индикатор выполнения",
"rows": [
{
"function": "msg_info \"text\"",
"whenRich": "Операция выполняется.",
"spinner": "Запускает"
},
{
"function": "stop_spinner",
"whenRich": "Завершение подготовительных действий без вывода сообщений на этапе 1 — останавливает индикатор выполнения и очищает строку.",
"spinner": "Останавливает"
},
{
"function": "msg_ok \"text\"",
"whenRich": "Операция выполнена успешно. Также используйте для сообщения «функция включена», даже если требуется перезагрузка.",
"spinner": "Останавливает"
},
{
"function": "msg_warn \"text\"",
"whenRich": "Предупреждение о реальной проблеме или ухудшении состояния.",
"spinner": "Останавливает"
},
{
"function": "msg_error \"text\"",
"whenRich": "Критическая ошибка.",
"spinner": "Останавливает"
},
{
"function": "msg_info2 \"text\"",
"whenRich": "Рекомендация, не блокирующая выполнение (информационная строка голубого цвета).",
"spinner": "Останавливает"
},
{
"function": "msg_success \"text\"",
"whenRich": "Заключительное приглашение «Нажмите Enter, чтобы вернуться» в конце этапа 2.",
"spinner": "Останавливает"
},
{
"function": "msg_title \"text\"",
"whenRich": "Заголовок полужирным шрифтом со встроенными отступами. Используется в начале этапа 2.",
"spinner": "—"
},
{
"function": "show_proxmenux_logo",
"whenRich": "Очищает экран и показывает логотип. Вызывается <em>один раз</em> только в начале этапа 2.",
"spinner": "—"
}
]
},
"dialogConventions": {
"heading": "Правила использования dialog",
"bullets": [
"Всегда передавайте <code>--backtitle \"$BACKTITLE\"</code> при каждом вызове <code>dialog</code> и <code>whiptail</code>. Значение <code>$BACKTITLE</code> всегда равно <code>\"ProxMenux\"</code> — оно задаётся один раз в заголовке скрипта и никогда не переопределяется. Пользователь всегда должен видеть название проекта в качестве общего контекста, а не собственный заголовок скрипта.",
"Всегда оборачивайте заголовки и сообщения в <code>$(translate \"...\")</code>.",
"Всегда перенаправляйте вывод <code>dialog</code> с помощью <code>2&gt;&amp;1 &gt;/dev/tty</code> — захваченный стандартный вывод содержит выбор пользователя, а само диалоговое окно отображается в терминале.",
"Используйте стандартные переменные размеров интерфейса (<code>$UI_MENU_H</code>, <code>$UI_MSG_W</code> и т. д.), чтобы обеспечить одинаковые размеры во всех скриптах.",
"Всегда проверяйте, не пуст ли выбор и не отменён ли он, и корректно обрабатывайте такие случаи."
],
"exampleIntro": "Полный пример — создание меню выбора виртуальной машины и обработка отмены:",
"exampleCode": "# 1) Build the list of VMs as alternating \"ID NAME\" pairs.\n# dialog --menu expects this exact shape: tag1 description1 tag2 description2 ...\nVM_LIST=\"\"\nfor vmid in $(qm list | awk 'NR>1 {print $1}'); do\n vm_name=$(qm config \"$vmid\" | awk -F': ' '/^name:/ {print $2}')\n VM_LIST=\"$VM_LIST $vmid \\\"$vm_name\\\"\"\ndone\n\n# 2) Show the dialog. Captured stdout is the user's selection (the VMID).\nVMID=$(eval \"dialog --backtitle \\\"\\$BACKTITLE\\\" \\\n --title \\\"\\$(translate \\\"Select VM\\\")\\\" \\\n --menu \\\"\\$(translate \\\"Choose a VM from the list:\\\")\\\" \\\n \\$UI_MENU_H \\$UI_MENU_W \\$UI_MENU_LIST_H \\\n $VM_LIST \\\n 2>&1 >/dev/tty\")\n\n# 3) Empty result means the user pressed Cancel or Esc — exit silently.\nif [ -z \"$VMID\" ]; then\n exit 0\nfi\n\n# 4) Continue with the rest of Phase 1, knowing VMID is now set.\necho \"User selected VMID=$VMID\""
},
"translation": {
"heading": "Правила перевода",
"intro": "Все строки, видимые пользователю, должны быть обёрнуты в вызов функции <code>translate</code>. ProxMenux автоматически переводит их на все поддерживаемые языки — вы пишете по-английски, а пользователь читает на своём родном языке.",
"code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...",
"bullets": [
"Пишите строки на английском языке — перевод выполняется автоматически при сборке.",
"Пишите кратко. По возможности избегайте вставки переменных в длинные предложения.",
"<strong>Не</strong> переводите имена переменных, пути или технические идентификаторы."
]
},
"variableStyle": {
"heading": "Соглашения об именовании переменных и стиле",
"bullets": [
"Используйте <code>UPPER_CASE</code> для переменных уровня скрипта.",
"Используйте <code>lower_case</code> для локальных переменных функций (объявляйте их с помощью <code>local</code>).",
"Заключайте все подстановки переменных в кавычки: <code>\"$VAR\"</code>, а не <code>$VAR</code>.",
"Используйте <code>[[ ]]</code> для условных выражений, а не <code>[ ]</code> (кроме случаев, когда требуется совместимость с POSIX).",
"<code>show_proxmenux_logo</code> — подходящий способ очистки экрана: он очищает экран и показывает логотип проекта, чтобы пользователь всегда видел, с каким проектом работает. Вызывайте его один раз в начале этапа 2 (и при необходимости перед длительным блоком с индикатором ожидания на этапе 1)."
],
"standardNamesIntro": "Стандартные имена переменных во всём проекте:",
"standardNamesCode": "CTID # container ID\nVMID # virtual machine ID\nDISK # device path (e.g. /dev/sdb)\nPARTITION # partition path (e.g. /dev/sdb1)\nSTORAGE # Proxmox storage name\nMOUNT_POINT # filesystem mount path",
"redirectHeading": "Перенаправление вывода инструментов на этапе 2",
"redirectIntro": "На этапе 2 на экране последовательно появляются строки <code>msg_info → msg_ok</code>, образуя аккуратный журнал. Если вызываемый инструмент (apt, mkfs, qm, pct, dd и т. д.) записывает собственный вывод в stdout/stderr, этот вывод вытесняет ваши сообщения и нарушает последовательность отображения. В результате терминал заполняется хаотичным выводом, и пользователь не может отличить сообщения скрипта о ходе выполнения от постороннего вывода инструмента.",
"withoutRedirectIntro": "<strong>Без перенаправления</strong> — что видит пользователь, если не убирать посторонний вывод:",
"withoutRedirectCode": "ℹ Installing kernel package...\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\nThe following NEW packages will be installed:\n proxmox-kernel-6.5\n0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.\nNeed to get 12.5 MB of archives.\nAfter this operation, 47.2 MB of additional disk space will be used.\nGet:1 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 ...\n... [200+ more lines of dpkg output] ...\n✓ Kernel installed.",
"withRedirectIntro": "<strong>С перенаправлением</strong> — как выглядит та же операция, когда посторонний вывод направляется в другое место:",
"withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.",
"twoPatternsIntro": "Два варианта на выбор:",
"discardLead": "<strong>Отбрасывайте вывод</strong>, если он вам не нужен, — это самый быстрый и простой вариант:",
"discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1",
"logLead": "<strong>Направляйте вывод в файл журнала</strong>, если он может понадобиться для последующего анализа (например, для выяснения причин неудачной установки или проверки того, что именно сделал dpkg). Это предпочтительный вариант для любых операций apt:",
"logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1",
"referenceOutro": "Скрипт <code>scripts/global/update-pve9_2.sh</code> — эталонная реализация: каждый вызов <code>apt-get</code> направляет вывод в файл журнала, поэтому пользователь видит только аккуратную последовательность сообщений <code>msg_info → msg_ok</code>, а журнал на диске позволяет точно восстановить действия apt, если что-то пойдёт не так."
},
"dosAndDonts": {
"heading": "Что следует и чего не следует делать",
"doHeading": "✅ Следует",
"doBullets": [
"Вызывайте <code>stop_spinner</code> перед <code>dialog</code> на этапе 1 только в том случае, если в данный момент работает индикатор ожидания <code>msg_info</code>.",
"Начинайте этап 2 с краткого обзора результатов этапа 1 с помощью <code>show_proxmenux_logo + msg_title + msg_ok</code>.",
"Используйте <code>msg_ok</code> для успешно включённых функций, даже если требуется перезагрузка.",
"Используйте <code>whiptail</code> (а не <code>dialog</code>) для любого запроса к пользователю после выполнения операции, который должен появиться на этапе 2.",
"Всегда добавляйте в диалоги перезагрузки ветку «Нет» с предупреждением о том, что затронутый ресурс нельзя запускать до перезагрузки.",
"Выполняйте логику, предназначенную только для виртуальных машин, лишь после проверки <code>[[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]]</code>: контроллеры и устройства NVMe PCIe нельзя добавлять в контейнеры LXC.",
"Используйте <code>ensure_repositories</code> из <code>utils-install-functions.sh</code> вместо безусловного вызова <code>apt-get update</code>.",
"Используйте параллельные массивы на этапе 1, если для каждого элемента требуется несколько диалоговых окон."
],
"dontHeading": "❌ Не следует",
"dontBullets": [
"Вызывать <code>dialog</code>, пока активен индикатор выполнения.",
"Пропускать сводку этапа 1 в начале этапа 2.",
"Вызывать <code>show_proxmenux_logo</code> во второй раз — это стирает всё, что было выведено на этапе 2.",
"Использовать <code>dialog</code> на этапе 2 (в редких случаях, когда без этого не обойтись, используйте <code>whiptail</code>).",
"Вызывать <code>clear</code> напрямую.",
"Добавлять пустые строки с помощью <code>echo \"\"</code> до и после <code>msg_title</code> — необходимые отступы уже включены.",
"Использовать <code>msg_warn</code> для сообщения об успешном включении функции — для этого предназначен <code>msg_ok</code>.",
"Выполнять <code>apt-get update</code> безусловно — используйте <code>ensure_repositories</code>."
]
},
"submitting": {
"heading": "Отправка ваших изменений",
"steps": [
"Создайте форк <code>MacRimi/ProxMenux</code> на GitHub и клонируйте его.",
"Создайте ветку <code>feature/*</code> на основе <code>develop</code> (см. раздел <em>Модель ветвления</em> выше).",
"Следуйте этому руководству при создании и изменении скриптов. Укажите своё имя в заголовке; при желании добавьте необязательную строку со сведениями о спонсоре.",
"Протестируйте скрипт на реальном экземпляре Proxmox VE — как этап 1 (все ветви диалогов), так и этап 2 (каждая операция должна завершаться успешно, а при ошибке должен выполняться корректный откат).",
"Откройте запрос на слияние <strong>в <code>develop</code></strong> с понятным описанием: что делает скрипт, что изменилось и на какой версии Proxmox VE он был протестирован.",
"Убедитесь, что ваши изменения соответствуют <cocLink>Кодексу поведения</cocLink>."
],
"securityOutro": "При обнаружении проблем, связанных с безопасностью, следуйте процедуре раскрытия информации, описанной в <securityLink>SECURITY.md</securityLink>, вместо создания публичного сообщения о проблеме."
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"kind": "external",
"url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md",
"label": "CONTRIBUTING.md (полное руководство)",
"tail": " — основной источник всех правил и соглашений, включая продвинутые шаблоны работы с оборудованием."
},
{
"kind": "internal",
"href": "/docs/about/contributors",
"label": "Участники проекта",
"tail": " — люди, чья работа внесла вклад в выпуски ProxMenux. (Это отдельная страница.)"
},
{
"kind": "internal",
"href": "/docs/about/code-of-conduct",
"label": "Кодекс поведения",
"tail": " — нормы, которые обязуется соблюдать каждый участник проекта."
},
{
"kind": "external",
"url": "https://github.com/MacRimi/ProxMenux/discussions",
"label": "Обсуждения GitHub",
"tail": " — прежде чем приступать к разработке, задайте вопрос, если не уверены, подходит ли ваша идея проекту, или хотите найти соавторов для работы над крупной функцией."
}
]
}
}
@@ -0,0 +1,67 @@
{
"meta": {
"title": "Участники проекта | Документация ProxMenux",
"description": "За каждым выпуском стоят люди, которые разрабатывают, проверяют, переводят и тестируют ProxMenux. На этой странице мы благодарим тех, кто участвует в проекте сегодня, и тех, кто помог ему сделать первые шаги.",
"ogTitle": "Участники проекта | Документация ProxMenux",
"ogDescription": "За каждым выпуском стоят люди, которые разрабатывают, проверяют, переводят и тестируют ProxMenux. На этой странице мы благодарим тех, кто участвует в проекте сегодня, и тех, кто помог ему сделать первые шаги."
},
"header": {
"title": "Участники проекта",
"description": "За каждым выпуском стоят люди, которые разрабатывают, проверяют, переводят и тестируют ProxMenux. На этой странице мы благодарим тех, кто участвует в проекте сегодня, и тех, кто помог ему сделать первые шаги.",
"section": "О проекте"
},
"active": {
"heading": "Разработка, проверка и постоянное сотрудничество",
"intro": "Vaso73, f3rs3n и jcastro регулярно вносят улучшения и исправления, а также проверяют изменения. Их работа не ограничивается тестированием очередного выпуска: она также помогает разрабатывать и отлаживать следующие.",
"people": {
"Vaso73": "Улучшения и исправления в менеджере OCI и ProxMenux Monitor, а также перевод на словацкий язык и проверка переводов.",
"f3rs3n": "Исправления и проверка работы скриптов и Monitor, а также постоянное совершенствование перевода на итальянский язык.",
"jcastro": "Разработка и отладка функций OCI, резервного копирования и Monitor, а также проверка документации и тестирование с первых дней существования проекта."
}
},
"code": {
"heading": "Другие участники, внесшие вклад в код",
"intro": "Следующие участники также вносили изменения в код. Перейдите по их ссылкам, чтобы ознакомиться с их работой; в истории GitHub фиксируются принятые изменения и запросы на слияние.",
"viewWork": "Посмотреть вклад",
"history": "История участия в проекте",
"merged": "Посмотреть все принятые PR"
},
"community": {
"heading": "Сообщество, которое также тестирует, переводит и пишет документацию",
"body": "Не вся работа выражается в коде. Воспроизведение ошибки, предоставление полезных журналов, тестирование на разном оборудовании, уточнение пояснений и предложения по улучшению также помогают сделать ProxMenux лучше.",
"languages": "Особая благодарность всем, кто проверяет тексты на своём родном языке. Переводы меню, Monitor и документации делают проект доступным большему числу людей и более удобным в использовании."
},
"testers": {
"heading": "Спасибо за тестирование первых выпусков",
"intro": "Мы по-прежнему ценим этот вклад. Эти люди помогали проверять первые выпуски, тестировали проект на собственном оборудовании, сообщали о проблемах и делились предложениями, когда ProxMenux только начинал развиваться.",
"youtube": "YouTube"
},
"contribute": {
"heading": "Для вашего вклада тоже найдётся место",
"intro": "Вы можете помочь небольшим исправлением, отдельной проверкой или вычиткой текста. Чтобы принести пользу, не обязательно разрабатывать целую функцию.",
"ways": {
"code": {
"title": "Код и проверка изменений",
"body": "Разрабатывайте функции, исправляйте ошибки или проверяйте PR. В руководстве для участников объясняется, как подготовить и предложить изменения."
},
"testing": {
"title": "Тестирование и диагностика",
"body": "Тестируйте бета-версии и делитесь шагами для воспроизведения проблем и журналами, которые помогут другим разобраться в проблеме."
},
"translations": {
"title": "Переводы",
"body": "Проверяйте сообщения на своём языке и помогайте поддерживать их актуальность по мере добавления новых функций."
},
"docs": {
"title": "Документация и дизайн",
"body": "Сделайте руководство понятнее, добавьте снимок экрана или улучшите интерфейс, чтобы другим было проще выполнять инструкции."
}
},
"guide": "Руководство для участников",
"discuss": "Общение с сообществом"
},
"thanks": {
"title": "Спасибо, что делаете это возможным",
"body": "Всем, кто указан здесь, и всем, кто помогает в обсуждениях задач, беседах или тестировании: спасибо за время, которое вы уделяете улучшению ProxMenux."
}
}
+94
View File
@@ -0,0 +1,94 @@
{
"meta": {
"title": "Часто задаваемые вопросы | Документация ProxMenux",
"description": "Часто задаваемые вопросы о ProxMenux: назначение, установка, совместимость (только PVE 8 и новее), настройка, обновления, безопасность, использование в рабочей среде, сохранность системных файлов, участие в проекте, удаление.",
"ogTitle": "Часто задаваемые вопросы | Документация ProxMenux",
"ogDescription": "Часто задаваемые вопросы об установке ProxMenux, совместимости, безопасности и участии в проекте."
},
"header": {
"title": "Часто задаваемые вопросы",
"description": "Распространённые вопросы о ProxMenux: что это такое, для кого он предназначен, как его установить, обновить и удалить, совместимость, настройка, безопасность и участие в проекте. Если вашего вопроса здесь нет, загляните в раздел Discussions на GitHub или создайте issue.",
"section": "О проекте"
},
"quickLinks": {
"title": "Быстрые ссылки",
"installationLabel": "Установка",
"installationSuffix": " — однострочная команда установки и зависимости.",
"introductionLabel": "Введение",
"introductionSuffix": " — о возможностях ProxMenux за 5 минут.",
"uninstallLabel": "Удаление",
"uninstallSuffix": " — полное удаление.",
"issuesLabel": "Задачи GitHub",
"discussionsLabel": "Обсуждения"
},
"q1": {
"question": "Что такое ProxMenux и для чего он используется?",
"p1Rich": "<strong>ProxMenux</strong> — это интерактивный инструмент с управлением через меню, разработанный для того, чтобы сделать <strong>Proxmox VE</strong> доступным для всех пользователей независимо от их технического опыта. Он упрощает выполнение команд, позволяя пользователям выполнять действия в системе без глубоких знаний Linux.",
"p2": "Для менее опытных пользователей ProxMenux предлагает интуитивно понятный способ запуска команд через структурированное меню, сокращая необходимость ручного ввода в терминале. Опытным администраторам он позволяет сократить число нажатий клавиш при выполнении повторяющихся задач (усиление защиты после установки, проброс GPU, импорт виртуальных машин OVF, ротация снимков ZFS).",
"p3": "Proxmox VE широко используется для следующих задач:",
"items": [
"Виртуализация корпоративного уровня",
"HomeLab и персональные облачные решения",
"Мультимедийные серверы, автоматизация и многое другое"
]
},
"q2": {
"question": "Как установить ProxMenux?",
"p1Rich": "Следуйте <installlink>руководству по установке</installlink>. Кратко:",
"stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"",
"p2": "После установки просто запустите его командой:",
"menuCmd": "menu"
},
"q3": {
"question": "Совместим ли ProxMenux со всеми версиями Proxmox?",
"bodyRich": "<strong>Нет — для ProxMenux требуется Proxmox VE 8 или более поздняя версия.</strong> PVE 7 и более ранние версии не поддерживаются. Если вы всё ещё используете PVE 7, сначала выполните обновление до версии 8.x по официальной инструкции Proxmox; затем ProxMenux поможет вам перейти с версии 8 на 9 через пункт меню <upgradelink>Utilities → Upgrade PVE 8 to PVE 9</upgradelink>."
},
"q4": {
"question": "Можно ли настроить ProxMenux под свои нужды?",
"p1Rich": "Локальные изменения основных скриптов могут быть перезаписаны при обновлении, поэтому не редактируйте эти файлы напрямую. Вот что <em>можно</em> настроить:",
"items": [
"Баннер консоли — с помощью инструмента <strong>FastFetch</strong> в разделе настроек после установки.",
"Набор устанавливаемых дополнительных компонентов (Monitor, Fail2Ban, Lynis…) — выберите их при установке или позже в соответствующем меню."
]
},
"q5": {
"question": "Как обновить ProxMenux?",
"p1Rich": "Когда появляется новая версия, ProxMenux обнаруживает её при следующем запуске <code>menu</code> и предлагает обновление. Если вы согласитесь, файлы и конфигурации утилиты будут заменены на месте. Скачивать обновление вручную не нужно.",
"p2Rich": "Пользователи стабильной версии получают стабильные выпуски, а пользователи бета-версии — бета-выпуски. Когда выходит стабильная версия, ProxMenux уведомляет пользователей бета-версии при следующем запуске и предлагает автоматически перейти на неё — см. страницу <betalink>Программа бета-тестирования</betalink>."
},
"q6": {
"question": "Где можно сообщить о проблемах?",
"p1Rich": "Сообщения об ошибках размещайте в разделе <issueslink>GitHub Issues</issueslink>. Укажите шаги для воспроизведения, сообщения об ошибках и, если проблема связана с Monitor, вывод <code>journalctl -u proxmenux-monitor -n 50</code>.",
"p2Rich": "Пожалуйста, <strong>не публикуйте</strong> сведения о проблемах <strong>безопасности</strong>. Порядок ответственного раскрытия информации описан в документе <coclink>Кодекс поведения и рекомендуемые практики</coclink>."
},
"q7": {
"question": "Могу ли я внести вклад в ProxMenux?",
"p1Rich": "<strong>Конечно.</strong> ProxMenux — проект с открытым исходным кодом, который развивается совместными усилиями. Вы можете помочь с кодом (Bash, Next.js/TypeScript и инструменты перевода на Python), тестированием, документацией, дизайном или просто предложить идеи.",
"item1Rich": "Прежде чем создавать запрос на добавление функции, обсудите свои идеи в разделе <discusslink>GitHub Discussions</discusslink>.",
"item2Rich": "Перед отправкой PR прочитайте документ <coclink>Кодекс поведения и рекомендуемые практики</coclink>.",
"item3Rich": "Актуальный список тестировщиков и рецензентов см. на <contriblink>странице участников проекта</contriblink>."
},
"q8": {
"question": "Изменяет ли ProxMenux критически важные системные файлы?",
"p1Rich": "<strong>При установке ProxMenux добавляются следующие компоненты.</strong>",
"item1Rich": "Зависимости через apt: <code>dialog</code>, <code>curl</code>, <code>jq</code> и <code>git</code>. Для переводов используются готовые каталоги JSON; установщик не добавляет на хост виртуальное окружение для перевода.",
"item2Rich": "Дерево скриптов в <code>/usr/local/share/proxmenux/</code>.",
"item3Rich": "Средство запуска в <code>/usr/local/bin/menu</code>.",
"item4Rich": "Необязательно: служба systemd для Monitor в <code>proxmenux-monitor.service</code>.",
"p2Rich": "ProxMenux <em>не</em> изменяет основную конфигурацию Proxmox, если вы явно не запросите это через специальное меню (например, процедура восстановления сети изменяет <code>/etc/network/interfaces</code> — но только после вашего подтверждения и создания резервной копии)."
},
"q9": {
"question": "Безопасно ли использовать ProxMenux в рабочей среде?",
"bodyRich": "<strong>Да.</strong> Поскольку ProxMenux не изменяет основные файлы Proxmox без явного запроса, его можно использовать в рабочих средах. Как и при любой автоматизации, сначала протестируйте его в контролируемой среде и создайте резервные копии перед выполнением операций, которые могут привести к потере данных (обновление PVE с 8 до 9, форматирование диска, уничтожение ВМ…)."
},
"q10": {
"question": "Как удалить ProxMenux?",
"p1Rich": "Из ProxMenux: <strong>Settings → Uninstall ProxMenux</strong>. Программа удаления удаляет дерево скриптов, средство запуска и службу Monitor, по желанию пользователя удаляет выбранные зависимости и восстанавливает <code>/root/.bashrc</code> и <code>/etc/motd</code> из резервных копий, созданных Post-Install, если эти копии существуют (в противном случае удаляет строку ProxMenux из MOTD).",
"p2Rich": "Полная пошаговая инструкция: <uninstalllink>Удаление ProxMenux</uninstalllink>."
},
"q11": {
"question": "VirusTotal помечает URL установки как подозрительный — безопасен ли он?",
"p1Rich": "Результат 1/95 от <em>Chong Lua Dao</em>, приведённый в Issue #162, был признан сопровождающим проекта ложным срабатыванием. Установщик запускается командой, которая скачивает и выполняет скрипт (<code>bash -c \"$(wget -qLO - …)\"</code>), и может скачать <code>jq</code> из официального выпуска GitHub. Такое <em>поведение</em> может вызывать срабатывание эвристических сканеров; этот отчёт о прошлой проверке не является заключением о безопасности всех будущих загрузок.",
"p2Rich": "Исходный код ProxMenux открыт на 100%, а скрипт установки можно проверить построчно: <scriptlink>install_proxmenux.sh</scriptlink>. Дополнительные сведения — в <issuelink>Issue #162</issuelink>."
}
}
+67
View File
@@ -0,0 +1,67 @@
{
"meta": {
"title": "О проекте | Документация ProxMenux",
"description": "О ProxMenux: цели проекта, участники, ответы на частые вопросы и кодекс поведения. Инструмент управления Proxmox VE 8+ с открытым исходным кодом и интерфейсом на основе меню. Создан и поддерживается MacRimi при участии небольшой команды тестировщиков и других участников проекта.",
"ogTitle": "О проекте | Документация ProxMenux",
"ogDescription": "О ProxMenux — инструменте управления Proxmox VE 8+ с открытым исходным кодом и интерфейсом на основе меню."
},
"header": {
"title": "О проекте",
"description": "Сведения о проекте, ответы на частые вопросы, участники и кодекс поведения. ProxMenux — инструмент управления Proxmox VE 8+ с открытым исходным кодом и интерфейсом на основе меню. Создан и поддерживается MacRimi при помощи небольшой команды тестировщиков и других участников проекта.",
"section": "О проекте"
},
"callout": {
"title": "Открытый исходный код, развитие силами сообщества",
"body": "ProxMenux распространяется по лицензии GPL-3.0 и открыто разрабатывается на GitHub. Каждый скрипт доступен для проверки, каждое изменение можно отследить. Приветствуется любой вклад: сообщения об ошибках, идеи, код и тестирование."
},
"section": {
"heading": "В этом разделе",
"options": [
{
"icon": "HelpCircle",
"href": "/docs/about/faq",
"title": "FAQ",
"description": "Ответы на частые вопросы: что такое ProxMenux, установка, совместимость, настройка, обновления, безопасность, использование в рабочей среде и удаление."
},
{
"icon": "Users",
"href": "/docs/about/contributors",
"title": "Участники проекта",
"description": "Благодарность людям, благодаря которым существует ProxMenux, — тестировщикам, рецензентам и разработчикам, которые вносят вклад в каждый выпуск."
},
{
"icon": "ScrollText",
"href": "/docs/about/code-of-conduct",
"title": "Кодекс поведения",
"description": "Ценности проекта, требования к ответственному отношению к коду и рекомендации по участию в разработке. Обязательно прочитайте перед созданием PR или отправкой сообщения о проблеме."
}
]
},
"involved": {
"heading": "Присоединяйтесь",
"intro": "Три способа принять участие в проекте:",
"cards": [
{
"href": "https://github.com/MacRimi/ProxMenux/issues/new",
"title": "🐛 Сообщить об ошибке",
"description": "GitHub Issues — приложите журналы и шаги для воспроизведения ошибки."
},
{
"href": "https://github.com/MacRimi/ProxMenux/discussions",
"title": "💡 Предложить новую функцию",
"description": "GitHub Discussions — обсудите идеи перед созданием PR."
},
{
"href": "https://github.com/MacRimi/ProxMenux/pulls",
"title": "🔀 Отправить PR",
"description": "GitHub Pull Requests — сначала прочитайте кодекс поведения."
}
]
},
"support": {
"heading": "Поддержать проект",
"introRich": "Если ProxMenux экономит ваше время, самый простой способ помочь другим узнать о нём — <starlink>поставить репозиторию ⭐ на GitHub</starlink>. Если хотите сделать больше:",
"kofiLabel": "Поддержать на Ko-fi",
"kofiOutro": " — угостите сопровождающего проекта кофе и поддержите дальнейшую разработку."
}
}
@@ -0,0 +1,213 @@
{
"meta": {
"title": "Создание резервных копий — интерактивный процесс | ProxMenux",
"description": "Интерактивный процесс создания резервных копий в ProxMenux. Две точки входа (текстовое меню Scripts и веб-интерфейс Monitor), три места назначения, два режима профиля, один этап промежуточной подготовки и одно диалоговое окно подтверждения. Описаны шесть сочетаний параметров, стандартный и пользовательские профили, а также то, что видит пользователь от выбора резервной копии до сохранения архива в месте назначения.",
"ogTitle": "ProxMenux Backup — создание резервных копий",
"ogDescription": "Интерактивный процесс создания резервных копий с тремя местами назначения, двумя профилями и общим этапом промежуточной подготовки.",
"twitterTitle": "Создание резервных копий | ProxMenux",
"twitterDescription": "Интерактивный процесс создания резервных копий с тремя местами назначения и двумя режимами профиля."
},
"header": {
"title": "Создание резервных копий",
"description": "Интерактивный процесс создания резервных копий: выберите место назначения и профиль, проверьте сводку перед подтверждением и следите за сохранением архива. Обе точки входа используют одну и ту же серверную часть и создают идентичные архивы.",
"section": "Резервное копирование и восстановление"
},
"intro": {
"title": "Две точки входа, одинаковые возможности",
"body": "Текстовый интерфейс Scripts и веб-интерфейс Monitor предоставляют <strong>совершенно одинаковые возможности</strong>. При каждом резервном копировании — ручном или по расписанию — используется одна и та же матрица выбора (три места назначения × два профиля), а для каждой её ячейки вызывается одна и та же функция серверной части (<code>_bk_pbs</code>, <code>_bk_borg</code> или <code>_bk_local</code>). Архивы, созданные через любую из двух точек входа, не отличаются друг от друга. Выбор зависит от ваших предпочтений: текстовый интерфейс удобен для работы через SSH и поддерживает автоматизацию с помощью скриптов; Monitor позволяет работать мышью и расположен рядом с представлениями уведомлений и последних записей журнала."
},
"entryPoints": {
"heading": "Две точки входа",
"rows": [
{
"entry": "ProxMenux Scripts (текстовый интерфейс)",
"path": "меню → Host Backup & Restore → Backup конфигурации хоста",
"detail": "Последовательность диалогов, удобная для работы с SSH. Пункт главного меню открывает раздел «Резервное копирование и восстановление конфигурации хоста»; пункт «Резервное копирование конфигурации хоста» открывает шесть вариантов. Используется <code>backup_menu</code> в <code>backup_host.sh</code>."
},
{
"entry": "ProxMenux Monitor (веб-интерфейс)",
"path": "вкладка «Резервные копии» → «Создать резервную копию»",
"detail": "Пошаговый мастер. Те же шесть вариантов представлены в виде формы из двух шагов (место назначения → профиль). Те же функции серверной части вызываются через Flask API."
}
]
},
"modes": {
"heading": "Резервное копирование вручную и по расписанию",
"body": "Резервные копии можно создавать в двух режимах: <strong>вручную</strong> (интерактивная последовательность действий, описанная на этой странице: пользователь выбирает место назначения и профиль в меню и наблюдает за созданием архива) или <strong>по расписанию</strong> (автоматическое задание, которое запускается по таймеру с расписанием в формате cron и применяет настроенные для задания правила хранения). Оба режима поддерживают одни и те же три места назначения и два профиля и доступны через обе точки входа — текстовое меню Scripts и вкладку «Резервные копии» в Monitor. Задания по расписанию используют те же функции серверной части, что и ручной режим, через <code>run_scheduled_backup.sh</code>; создаваемые архивы ничем не отличаются.",
"seeAlso": "На странице заданий по расписанию описан весь процесс, включая создание задания, его привязку к существующему таймеру vzdump в PVE и настройку параметров хранения.",
"monitorAlt": "Вкладка «Резервные копии» в ProxMenux Monitor с диалогом «Новая резервная копия по расписанию», содержащим поля места назначения, профиля, расписания и параметров хранения.",
"monitorCaption": "Резервное копирование по расписанию — ProxMenux Monitor. В том же пошаговом диалоге, который используется для создания резервной копии вручную, внизу находятся поля расписания и параметров хранения для автоматического режима."
},
"matrix": {
"heading": "Матрица из шести вариантов",
"intro": "Выбор определяет как используемый механизм резервного копирования, так и стратегию выбора путей. Подробности настройки для каждой ячейки приведены на страницах соответствующих мест назначения.",
"rows": [
{
"combo": "1",
"destination": "PBS",
"profile": "По умолчанию",
"action": "Загружает данные профиля по умолчанию и постоянно включаемые дополнительные пути в настроенный репозиторий PBS."
},
{
"combo": "2",
"destination": "Borg",
"profile": "По умолчанию",
"action": "Создаёт архив с данными профиля по умолчанию и постоянно включаемыми дополнительными путями в выбранном репозитории Borg."
},
{
"combo": "3",
"destination": "Локально",
"profile": "По умолчанию",
"action": "Записывает архив <code>.tar.zst</code> с данными профиля по умолчанию и постоянно включаемыми дополнительными путями в настроенное локальное место назначения."
},
{
"combo": "4",
"destination": "PBS",
"profile": "Пользовательский",
"action": "Открывает окно выбора путей перед загрузкой в PBS; пользователь отмечает пути и может добавлять новые."
},
{
"combo": "5",
"destination": "Borg",
"profile": "Пользовательский",
"action": "Открывает окно выбора путей перед созданием архива Borg."
},
{
"combo": "6",
"destination": "Локально",
"profile": "Пользовательский",
"action": "Открывает окно выбора путей перед записью локального архива <code>.tar.zst</code>."
}
]
},
"profiles": {
"heading": "Профиль по умолчанию и пользовательский профиль",
"defaultTitle": "Профиль по умолчанию",
"defaultBody": "Профиль по умолчанию включает отобранный список из <code>hb_default_profile_paths</code> (описанный в разделе <em>Как это работает</em>, в подразделе <em>Категории путей</em>), а также все записи из файла постоянных дополнительных путей <code>/usr/local/share/proxmenux/backup-extra-paths.txt</code>. Пользователь выбирает место назначения и параметры шифрования, после чего резервное копирование выполняется без дополнительного выбора путей.",
"customTitle": "Пользовательский профиль",
"customBody": "Пользовательский профиль открывает список с флажками, в котором показаны все пути из профиля по умолчанию (не отмечены) и все постоянные дополнительные пути (уже отмечены и имеют префикс <code>[+]</code>). Пользователь отмечает нужные пути для текущего запуска и может нажать <em>Добавить пользовательский путь</em>, чтобы добавить новый абсолютный путь. Любой путь, добавленный прямо в этом списке, сохраняется в <code>backup-extra-paths.txt</code>, поэтому при последующих резервных копированиях он будет включаться автоматически, без повторного добавления. Снятие отметки с постоянного дополнительного пути исключает его из текущего запуска, но не удаляет из файла — для удаления предусмотрено отдельное действие <em>Управление пользовательскими путями</em> вне процесса резервного копирования.",
"customPickerAlt": "Список выбора путей пользовательского профиля: пути из профиля по умолчанию не отмечены, постоянные дополнительные пути уже отмечены и имеют префикс [+]; также доступны кнопки добавления нового пути и подтверждения выбора.",
"customPickerCaption": "Пользовательский профиль — выбор путей. Пути из профиля по умолчанию не отмечены; постоянные дополнительные пути уже отмечены и имеют префикс [+]. Пользователь отмечает нужные пути для текущего запуска.",
"manageCustomAlt": "Меню управления пользовательскими путями со списком постоянных дополнительных путей и возможностями их добавления, удаления и редактирования.",
"manageCustomCaption": "Управление пользовательскими путями — раздел для добавления и удаления постоянных дополнительных путей. Все перечисленные здесь пути автоматически включаются в резервные копии в режиме «По умолчанию», без необходимости открывать список выбора путей пользовательского профиля."
},
"commonPipeline": {
"heading": "Что выполняется независимо от места назначения",
"intro": "После определения состава профиля каждый модуль назначения выполняет одну и ту же последовательность подготовки данных, а затем переходит к собственному способу их отправки. <code>hb_prepare_staging</code> формирует дерево архива в <code>/tmp/proxmenux-DESTINATION-stage.XXXXXX</code> и наполняет каждый из трёх наборов данных.",
"steps": [
{
"step": "1",
"name": "Формирование rootfs",
"detail": "Для каждого выбранного пути выполняется <code>rsync -a</code> с сохранением в <code>staging_root/rootfs/</code>. База данных pmxcfs в <code>/var/lib/pve-cluster/config.db</code> копируется отдельно с помощью <code>sqlite3 .backup</code> для получения согласованного снимка без остановки кластера, а сопутствующие файлы <code>.db-wal</code> / <code>.db-shm</code> исключаются из копирования rsync; если <code>sqlite3</code> недоступен, вместо этого сохраняется <code>config.db.raw-fallback</code>, который при восстановлении становится основной базой данных во время импорта. Часто изменяющиеся вложенные пути (история bash, кэши, корзина) исключаются из <code>/root/</code>. Пути, отсутствующие в источнике, записываются в <code>metadata/missing_paths.txt</code> без остановки резервного копирования."
},
{
"step": "2",
"name": "Создание манифеста",
"detail": "<code>build_manifest.sh</code> координирует работу шести сборщиков данных и записывает <code>manifest.json</code> в корневой каталог подготовки данных. При сбое сборщика соответствующий раздел получает документированное пустое значение по умолчанию; манифест при этом остаётся корректным."
},
{
"step": "3",
"name": "Список установленных пакетов",
"detail": "Вывод <code>apt-mark showmanual</code> сохраняется без изменений в <code>metadata/packages.manual.list</code>. Состояние компонентов уже содержится в восстановленной корневой файловой системе (<code>components_status.json</code>), поскольку <code>/usr/local/share/proxmenux/</code> входит в профиль по умолчанию."
},
{
"step": "4",
"name": "Сведения о запуске",
"detail": "<code>metadata/run_info.env</code> записывает сведения, идентифицирующие запуск резервного копирования: имя хоста, метку времени и версию ядра. Проверка совместимости при восстановлении использует их, чтобы определить направление перехода между версиями ядра."
},
{
"step": "5",
"name": "Уведомление о начале",
"detail": "Срабатывает <code>hb_notify_lifecycle \"start\"</code>. Если в Monitor настроены уведомления, создаётся пользовательское событие <em>Резервное копирование хоста начато</em>. Если каналы не настроены, уведомления не отправляются."
}
]
},
"included": {
"heading": "Что включается и что исключается",
"intro": "Каждый путь из итогового профиля (профиль по умолчанию + постоянные дополнительные пути + выбор в пользовательском режиме) копируется с помощью <code>rsync -aAXH --numeric-ids</code>. Глобального списка исключений нет; для некоторых каталогов действуют собственные исключения.",
"rootTitle": "Исключения для <code>/root/</code>",
"rootBody": "<code>/root/</code> входит в профиль по умолчанию, поэтому пользовательские скрипты и настройки попадают в архив. Часто изменяющиеся вложенные пути исключаются:",
"rootItems": [
"<code>.bash_history</code>",
"<code>.cache/</code>",
"<code>tmp/</code>",
"<code>.local/share/Trash/</code>"
],
"proxmenuxTitle": "Исключения для <code>/usr/local/share/proxmenux/</code>",
"proxmenuxBody": "Из этого каталога переносятся только пользовательские данные — <code>components_status.json</code>, настройки и кеш после установки. Код, который уже будет на целевой системе благодаря её собственной установке ProxMenux, исключается, чтобы при восстановлении текущие исполняемые файлы целевой системы не заменялись более старыми:",
"proxmenuxItems": [
"<code>restore-pending/</code>, <code>scripts/</code>, <code>web/</code>",
"<code>monitor-app/</code>, <code>monitor-app.*/</code>, <code>AppImage/</code>",
"<code>images/</code>, <code>json/</code>",
"<code>utils.sh</code>, <code>helpers_cache.json</code>",
"<code>ProxMenux-Monitor.AppImage*</code>, <code>install_proxmenux*.sh</code>"
],
"notInProfileTitle": "Пути вне профиля",
"notInProfileBody": "Всё, что не перечислено в <code>hb_default_profile_paths</code> и не добавлено как пользовательский или постоянный дополнительный путь, не включается в резервную копию. Основные примеры:",
"notInProfileItems": [
"<strong>Диски виртуальных машин и LXC</strong> — обрабатываются средствами <code>vzdump</code>, а не этой функцией. Файлы конфигурации гостевых систем в <code>/etc/pve/nodes/*/qemu-server/*.conf</code> и <code>lxc/*.conf</code> включаются в резервную копию (они находятся в <code>/etc/pve</code>), чтобы при восстановлении воссоздавался список гостевых систем; сами диски повторно подключаются из существующей резервной копии vzdump/PBS.",
"<strong><code>/boot</code> и <code>/boot/efi</code></strong> — исполняемые файлы ядра, initramfs и раздел UEFI ESP заново создаются собственными средствами целевой системы <code>update-initramfs</code>, <code>update-grub</code> или <code>proxmox-boot-tool refresh</code> после восстановления. Загрузчик никогда не копируется в исходном виде.",
"<strong>Файловые системы среды выполнения ядра и системы</strong> — <code>/proc</code>, <code>/sys</code>, <code>/dev</code> и <code>/run</code> представляют собой псевдофайловые системы, создаваемые ядром и udev; они нигде не хранятся постоянно.",
"<strong>Исполняемые файлы пакетов в <code>/usr/bin</code>, <code>/usr/lib</code>, <code>/lib</code>, <code>/sbin</code></strong> — повторно устанавливаются средствами APT целевой системы на основе <code>packages.manual.list</code>.",
"<strong><code>/var/log/</code>, <code>/var/tmp/</code>, <code>/var/cache/</code></strong> — текущее состояние конкретного узла; не восстанавливается.",
"<strong><code>/home/USER</code></strong> — не входит в профиль по умолчанию. Добавьте этот путь как пользовательский, если в системе есть домашние каталоги пользователей, которые необходимо сохранить при восстановлении."
],
"customPathsTitle": "Как обрабатываются пользовательские пути",
"customPathsBody": "Пользовательский путь, добавленный непосредственно в пользовательском режиме или сохранённый в <code>backup-extra-paths.txt</code>, проходит тот же конвейер обработки <code>rsync</code>, что и пути профиля по умолчанию. Если пользовательский путь находится внутри <code>/root/</code> или <code>/usr/local/share/proxmenux/</code>, к нему по-прежнему применяются указанные выше исключения для соответствующих путей. Каждый архивируемый путь — из профиля по умолчанию или пользовательский — записывается в <code>metadata/selected_paths.txt</code>. Пути, отсутствующие в исходной системе, записываются в <code>metadata/missing_paths.txt</code> без остановки резервного копирования, а пути, которые не удалось скопировать, — в <code>metadata/failed_paths.txt</code>."
},
"archiveStructure": {
"heading": "Структура архива",
"intro": "Промежуточный каталог, создаваемый каждым модулем, имеет одинаковую структуру независимо от места назначения. Архив tar, PBS <code>.pxar</code> или архив Borg сохраняет это дерево без изменений.",
"tree": "backup-[timestamp]/\n├── manifest.json # structured host state (kernel_params, hardware, storage, guests, components, source_host)\n├── metadata/\n│ ├── packages.manual.list # output of apt-mark showmanual\n│ ├── run_info.env # hostname, timestamp, kernel version, pmxcfs method\n│ ├── selected_paths.txt # exact list of paths that reached rootfs/\n│ └── missing_paths.txt # paths from the profile absent on source\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, /etc/apt, ...\n ├── root/ # /root without volatile subpaths\n ├── usr/local/ # /usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux (state only)\n └── var/ # /var/lib/pve-cluster (config.db via sqlite3 .backup), /var/spool/cron/crontabs"
},
"confirmation": {
"heading": "Сводка подтверждения",
"body": "Прежде чем модуль запишет что-либо в место назначения, ProxMenux выводит в терминал сводку с местом назначения, идентификатором резервной копии или именем архива, состоянием шифрования и списком копируемых путей. На этом этапе нет шага подтверждения или отмены; копирование начинается сразу после вывода сводки. Если резервное копирование завершается с ошибкой или прерывается, промежуточный каталог удаляется обработчиком <code>trap</code>, установленным для функции модуля, и частичные данные не попадают в место назначения."
},
"writing": {
"heading": "Запись в место назначения",
"intro": "После подтверждения пользователем каждый модуль выполняет собственный этап записи. Механизмы описаны на страницах соответствующих мест назначения; общими являются журнал, сопроводительный файл и уведомление о завершении.",
"rows": [
{
"topic": "Файл журнала",
"detail": "Каждый модуль записывает весь свой вывод в <code>/tmp/proxmenux-DESTINATION-backup-YYYYMMDD_HHMMSS.log</code> и при ошибке предлагает открыть журнал в диалоговом окне с прокруткой. Путь к журналу выводится в итоговой сводке только в том случае, если файл не пуст."
},
{
"topic": "Сопроводительный файл (только для локального архива)",
"detail": "<code>hb_write_archive_sidecar</code> создаёт <code>*.proxmenux.json</code> рядом с локальным архивом, чтобы Monitor распознавал его как резервную копию узла ProxMenux даже после перемещения или переименования."
},
{
"topic": "Уведомление (завершение/ошибка)",
"detail": "Отправляется <code>hb_notify_lifecycle \"complete\"</code> или <code>\"fail\"</code> с указанием длительности, размера архива и — при ошибке — последней строки журнала, похожей на сообщение об ошибке."
}
]
},
"finishedScreens": {
"heading": "Как выглядит готовая резервная копия",
"intro": "О завершении одной и той же операции сообщают оба интерфейса. TUI выводит в терминал блок с итогами, а на вкладке резервных копий Monitor выполненная операция отображается в списке архивов с размером, длительностью и значками состояния.",
"scriptsAlt": "TUI ProxMenux Scripts с результатами завершённого резервного копирования хоста: место назначения, идентификатор резервной копии, путь к снимку, объём данных, длительность и состояние шифрования.",
"scriptsCaption": "Резервное копирование завершено — ProxMenux Scripts (TUI). Итоговый блок содержит место назначения, идентификатор резервной копии, имя полученного снимка или архива, объём данных, длительность и состояние шифрования.",
"monitorAlt": "Вкладка резервных копий ProxMenux Monitor с записью о завершённом резервном копировании хоста: размер, длительность, значок метода и индикатор шифрования.",
"monitorCaption": "Резервное копирование завершено — вкладка резервных копий ProxMenux Monitor. Новая резервная копия появляется в списке архивов со значком метода сохранения, размером, длительностью и, если применимо, индикатором шифрования в виде замка."
},
"whereNext": {
"heading": "Куда перейти дальше",
"items": [
{
"label": "Места хранения",
"href": "/docs/backup-restore/destinations",
"tail": " — подробности настройки Local, PBS и Borg."
},
{
"label": "Задания по расписанию",
"href": "/docs/backup-restore/scheduled-jobs",
"tail": " — автоматический запуск того же резервного копирования по расписанию вместо интерактивного запуска."
},
{
"label": "Восстановление",
"href": "/docs/backup-restore/restoring",
"tail": " — процедура, использующая результат действий, описанных на этой странице."
}
]
}
}
@@ -0,0 +1,170 @@
{
"meta": {
"title": "Восстановление между версиями ядра — определение направления перехода, фильтр безопасного подмножества, адаптация конфигурации | ProxMenux",
"description": "Как ProxMenux восстанавливает резервную копию хоста на целевом хосте с другой основной версией ядра. Описаны определение направления расхождения версий, фильтр безопасного подмножества, исключающий критически важные для загрузки пути, когда ядро целевого хоста новее ядра резервной копии, и четырёхэтапная адаптация конфигурации, не зависящая от версии ядра. Она повторно применяет пользовательские настройки, такие как IOMMU, идентификаторы VFIO и пользовательские параметры командной строки ядра, без дословного копирования файлов, привязанных к конкретному ядру.",
"ogTitle": "Резервное копирование ProxMenux — восстановление между версиями ядра и адаптация конфигурации",
"ogDescription": "Восстановление между версиями ядра с учётом направления перехода, фильтром безопасного подмножества и адаптацией конфигурации, не зависящей от версии ядра.",
"twitterTitle": "Восстановление между версиями ядра | ProxMenux",
"twitterDescription": "Как ProxMenux выполняет восстановление, когда ядро целевого хоста отличается от ядра, указанного в резервной копии."
},
"header": {
"title": "Восстановление с другой версией ядра",
"description": "Как ProxMenux выполняет восстановление, когда на целевом хосте используется ядро, отличающееся от указанного в резервной копии, особенно если ядро целевого хоста новее. Описано, как выявляется различие, как отфильтровываются критически важные для загрузки пути, способные нарушить работу целевого хоста, и как повторно применяются пользовательские настройки без дословного копирования файлов, привязанных к конкретному ядру.",
"section": "Резервное копирование и восстановление"
},
"intro": {
"title": "Каждый переход между версиями ядра обрабатывается по-разному",
"body": "Ядро хоста Proxmox определяется строкой версии, например <code>6.17.13-2-pve</code>. Первые два числа (<strong>6.17</strong> в этом примере) определяют основную версию: при их изменении некоторые файлы конфигурации, созданные для предыдущего ядра, могут оказаться непригодными для нового. Если при восстановлении обнаруживается, что основные версии ядра в резервной копии и в целевой системе различаются, дальнейшие действия зависят от направления перехода — от того, содержит ли резервная копия более старую или более новую версию ядра, чем целевая система, — поскольку в этих двух случаях причины возможных сбоев противоположны. Резервные копии с более новым ядром, чем в целевой системе, восстанавливаются без изменений и без ошибок (проверено на стенде для нескольких переходов между версиями ядра). Для резервных копий с более старым ядром, чем в целевой системе, необходима фильтрация, чтобы конфигурация, созданная для изменившегося с тех пор ядра, не нарушила загрузку целевой системы."
},
"directionCheck": {
"heading": "Проверка направления перехода",
"intro": "Во время проверки совместимости <code>hb_compat_check</code> сравнивает ядро, указанное в манифесте резервной копии, с текущим ядром целевого хоста (<code>uname -r</code>) и относит восстановление к одному из трёх вариантов. Результат сохраняется во внутренней переменной <code>HB_COMPAT_KERNEL_DIRECTION</code>:",
"rows": [
{
"direction": "совпадает",
"condition": "Основная версия ядра резервной копии совпадает с основной версией ядра целевого хоста.",
"behavior": "Полная процедура восстановления выполняется без изменений. Дополнительный фильтр и адаптация конфигурации не применяются, специальное уведомление в интерфейсе не отображается."
},
{
"direction": "bk_newer",
"condition": "Ядро резервной копии НОВЕЕ ядра целевого хоста (например, резервная копия создана на ядре 7.0, а целевой хост работает на ядре 6.17).",
"behavior": "Полный процесс восстановления выполняется без изменений, точно так же, как <code>same</code>. Фильтрация не применяется. Проверено на практике: драйверы автоматически переустанавливаются под ядро целевой системы, конфигурация IOMMU применяется без ошибок, виртуальные машины с пробросом GPU запускаются без проблем."
},
{
"direction": "bk_older",
"condition": "Ядро в резервной копии СТАРЕЕ ядра целевой системы (например, резервная копия была создана при использовании ядра 6.17, а целевая система работает на ядре 7.0).",
"behavior": "Активируются фильтр безопасного подмножества и описанное ниже четырёхэтапное применение настроек. Восстановление продолжается — целевая система воспроизводит исходную, но файлы, критически важные для загрузки, не копируются буквально."
}
]
},
"whyBkNewerIsSafe": {
"heading": "Почему резервная копия с более новым ядром, чем в целевой системе, восстанавливается без изменений",
"body": "Когда восстановление выполняется на целевой системе с <em>более старым</em> ядром, чем указанное в резервной копии, все механизмы, от которых зависит восстановление, работают независимо от версии ядра. Установщики драйверов GPU и других PCI-устройств определяют работающее ядро с помощью <code>uname -r</code> и компилируют DKMS под ядро целевой системы. При установке пакетов APT загружаются двоичные файлы, собранные для дистрибутива целевой системы. Параметры командной строки IOMMU, такие как <code>intel_iommu=on</code>, остаются неизменными при переходе между основными версиями ядра. Резервная копия содержит файлы, записанные при работе с более новым ядром, но синтаксис этих файлов (списков блокировки модулей, настроек GRUB по умолчанию, конфигурации initramfs) допустим и для более старого ядра — ядра игнорируют неизвестные параметры, а не завершают работу с ошибкой. На практике этот случай эквивалентен восстановлению с той же версией ядра, и ProxMenux обрабатывает его соответствующим образом."
},
"safeSubsetFilter": {
"heading": "Фильтр безопасного подмножества (только если ядро целевой системы новее)",
"intro": "Если ядро целевой системы новее ядра из резервной копии, проверка совместимости добавляет 16 путей, критически важных для загрузки, из <code>hb_unsafe_paths_cross_version</code> в <code>RS_SKIP_PATHS</code>. Эти пути исключаются из восстановления, поскольку в стендовых испытаниях перезапись их содержимого версиями из системы с более старым ядром приводила к панике ядра в целевой системе с более новым ядром. Эти пути относятся к пяти категориям:",
"categoryRows": [
{
"category": "Загрузчик",
"paths": "<code>/etc/default/grub</code>, <code>/etc/kernel</code>",
"reason": "Настройки GRUB по умолчанию, привязанные к прежнему порядку ядер, и состояние proxmox-boot-tool (командная строка, UUID разделов ESP, хуки), содержащее ссылки на пути и идентификаторы прежней установки."
},
{
"category": "Модули ядра и загрузочные артефакты",
"paths": "<code>/etc/modules-load.d</code>, <code>/etc/modprobe.d</code>, <code>/etc/initramfs-tools</code>",
"reason": "Списки автозагрузки, которые могут ссылаться на модули, переименованные между основными версиями ядра; параметры модулей, которые могут оказаться неприменимыми; хуки initramfs, написанные для более старого ядра."
},
{
"category": "Стек хранения данных и идентификаторы файловых систем",
"paths": "<code>/etc/fstab</code>, <code>/etc/multipath</code>, <code>/etc/iscsi</code>, <code>/etc/udev/rules.d</code>, <code>/etc/zfs</code>",
"reason": "UUID, которые могут отсутствовать в этой установке; драйверы multipath, меняющиеся между версиями ядра; параметры iSCSI, которые со временем меняются; правила udev, которые могут ссылаться на несуществующие подсистемы; состояние ZFS (<code>zpool.cache</code> + <code>hostid</code>), из-за которого пул может быть заблокирован как чужой."
},
{
"category": "Источники APT",
"paths": "<code>/etc/apt</code>",
"reason": "Выпуски дистрибутива, указанные в источниках APT, могут привести к понижению версий критически важных пакетов при следующем обновлении."
},
{
"category": "systemd",
"paths": "<code>/etc/systemd/system</code>, <code>/etc/systemd/journald.conf</code>, <code>/etc/systemd/logind.conf</code>, <code>/etc/systemd/system.conf</code>, <code>/etc/systemd/user.conf</code>",
"reason": "Переопределения юнитов и .wants, привязанные к более старой основной версии systemd; ключи конфигурации, которые могут не распознаваться более новой версией systemd."
}
],
"outroBody": "Фильтр срабатывает ДО появления диалога подтверждения, поэтому пользователь видит точный список путей, которые будут пропущены, с группировкой по причинам. Восстановление всё равно продолжается — всё остальное (конфигурация виртуальных машин/LXC, сеть, /etc/pve, пользователи, cron, состояние ProxMenux, пакеты, драйверы, /root) восстанавливается в обычном порядке."
},
"hydration": {
"heading": "Применение настроек независимо от версии ядра",
"intro": "Фильтр пропускает файлы, критически важные для загрузки, поэтому затем повторно применяются отдельные пользовательские настройки: параметры командной строки IOMMU, идентификаторы VFIO, пользовательские <code>GRUB_TIMEOUT</code> и списки блокировки nvidia. Это выполняется, когда ядро целевой системы новее. При объединении параметров командной строки сохраняются существующие ключи целевой системы, а при объединении списков модулей добавляются недостающие записи. Разрешённые значения GRUB и пользовательские файлы могут заменять отличающееся содержимое целевой системы. Повторное применение тех же входных данных идемпотентно.",
"phaseRows": [
{
"phase": "1a — вариант с GRUB",
"detail": "Для узлов с GRUB (установки на ext4/lvm). <code>_rs_hyd_grub</code> объединяет все параметры из <code>manifest.kernel_params.cmdline_extra</code> резервной копии с действующим <code>GRUB_CMDLINE_LINUX_DEFAULT</code> целевой системы, пропуская параметры, ключи которых уже присутствуют в целевой системе. Затем переносит разрешённые ключи <code>GRUB_*</code> (<code>GRUB_TIMEOUT</code>, <code>GRUB_TIMEOUT_STYLE</code>, <code>GRUB_DEFAULT</code>, <code>GRUB_TERMINAL</code>, <code>GRUB_DISABLE_OS_PROBER</code>, <code>GRUB_SERIAL_COMMAND</code>, <code>GRUB_GFXMODE</code>, <code>GRUB_GFXPAYLOAD_LINUX</code>) из <code>/etc/default/grub</code> резервной копии, если их значения отличаются от значений в целевой системе."
},
{
"phase": "1b — вариант с systemd-boot / ZFS",
"detail": "Для узлов с systemd-boot (обычно с корневой файловой системой на ZFS). <code>_rs_hyd_kernel_cmdline</code> добавляет пользовательские параметры из <code>cmdline_extra</code> в <code>/etc/kernel/cmdline</code> целевой системы, сохраняя без изменений её собственные стандартные параметры <code>root=</code>, <code>boot=</code> и <code>rootflags=</code>."
},
{
"phase": "2 — Объединение /etc/modules",
"detail": "<code>_rs_hyd_modules</code> добавляет модули из <code>manifest.kernel_params.modules_loaded_at_boot</code>, которые входят в список разрешённых (<code>vfio</code>, <code>vfio_pci</code>, <code>vfio_iommu_type1</code>, <code>vfio_virqfd</code>, <code>kvm</code>, <code>kvm_intel</code>, <code>kvm_amd</code>, <code>nvidia</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia_uvm</code>, <code>i915</code>, <code>xe</code>) И ещё отсутствуют в <code>/etc/modules</code> целевой системы."
},
{
"phase": "3 — Копирование файлов из списка разрешённых",
"detail": "<code>_rs_hyd_files</code> копирует созданные пользователем файлы из промежуточной корневой файловой системы в работающую целевую систему, если их содержимое отличается. Список разрешённых охватывает файлы VFIO/nvidia/blacklist в <code>/etc/modprobe.d</code>, <code>/etc/modules-load.d</code>, а также правило привязки VFIO ProxMenux и правила udev для nvidia в <code>/etc/udev/rules.d</code>. Файлы, поставляемые дистрибутивом (<code>pve-blacklist.conf</code>, <code>mdadm.conf</code>, <code>nvme.conf</code>), намеренно исключены: их содержимое меняется от выпуска к выпуску."
},
{
"phase": "4 — Принудительное повторное применение после загрузки",
"detail": "Все четыре этапа записывают данные непосредственно в целевую систему ВНЕ стандартного процесса восстановления. Чтобы объединённые токены, модули и файлы вступили в силу при следующей загрузке, <code>HB_HYDRATION_APPLIED=1</code> передаётся через <code>plan.env</code> в <code>apply_pending_restore.sh</code>, что принудительно устанавливает <code>NEEDS_INITRAMFS=1</code> и <code>NEEDS_GRUB=1</code> независимо от содержимого списка применения. Затем диспетчер, запускаемый после загрузки системы, заново создаёт initramfs и обновляет загрузчик."
}
]
},
"planCommit": {
"heading": "Планирование и применение — пользователь сначала видит предварительный результат",
"body": "Дополнение конфигурации выполняется в двух режимах. Перед открытием диалога подтверждения ProxMenux запускает <code>_rs_apply_bk_older_hydration</code> в режиме <code>plan</code>: точно определяет, какие данные будут объединены, заполняет <code>RS_HYDRATION_SUMMARY</code> зелёным блоком с перечнем всех действий и завершает работу без записи изменений. В диалоге подтверждения этот зелёный блок отображается рядом с жёлто-оранжевым списком элементов, пропускаемых при применении безопасного подмножества, поэтому пользователь ЗАРАНЕЕ видит, что будет повторно применено автоматически. После подтверждения пользователем ProxMenux повторно запускает ту же вспомогательную программу в режиме <code>commit</code> — с теми же этапами и логикой, но на этот раз каждый этап записывает изменения в работающую целевую систему. Отмена в диалоге подтверждения оставляет целевую систему без изменений."
},
"flowDiagram": {
"heading": "Порядок действий, когда ядро целевой системы новее ядра в резервной копии",
"intro": "Дополнительные шаги, выполняемые при более новом ядре целевой системы, встроены в обычный процесс восстановления. Всё остальное — применение без перезагрузки, подготовка отложенных изменений, установка пакетов и диспетчер действий после загрузки — выполняется так же, как при восстановлении с одинаковыми версиями ядра.",
"diagram": " ┌────────────────────────────────────────────────────────────┐\n │ hb_compat_check │\n │ HB_COMPAT_KERNEL_DIRECTION = bk_older │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Add 16 boot-critical paths to RS_SKIP_PATHS │\n │ /etc/default/grub, /etc/kernel, /etc/modules-load.d, ... │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ _rs_apply_bk_older_hydration \"plan\" │\n │ Compute what would be merged │\n │ Populate RS_HYDRATION_SUMMARY (green block) │\n │ No writes │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Confirmation dialog │\n │ Amber: paths skipped by safe-subset filter │\n │ Green: tokens/files reapplied by hydration │\n │ User accepts or cancels │\n └───────────────────────────┬────────────────────────────────┘\n │ (accepted)\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ _rs_apply_bk_older_hydration \"commit\" │\n │ Phase 1a/1b: merge cmdline tokens + GRUB keys │\n │ Phase 2: append modules to /etc/modules │\n │ Phase 3: copy whitelisted vfio/nvidia files │\n │ Set HB_HYDRATION_APPLIED=1 │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Rest of the restore runs normally │\n │ _rs_apply hot (skips RS_SKIP_PATHS) │\n │ _rs_prepare_pending_restore (writes plan.env with │\n │ HB_HYDRATION_APPLIED=1) │\n │ packages.manual.list install │\n │ Reboot │\n │ apply_pending_restore.sh (forces NEEDS_INITRAMFS=1, │\n │ NEEDS_GRUB=1 because of the hydration flag) │\n │ apply_cluster_postboot.sh │\n │ update-initramfs -u -k all │\n │ update-grub / proxmox-boot-tool refresh │\n │ component --auto-reinstall │\n └────────────────────────────────────────────────────────────┘"
},
"concreteExamples": {
"heading": "Конкретные примеры",
"intro": "Этап дополнения конфигурации — не абстракция: в типичных сценариях он даёт наблюдаемые и корректные результаты. Два примера, которые обрабатываются автоматически:",
"rows": [
{
"scenario": "Проброс GPU (VFIO)",
"detail": "В исходной системе были <code>intel_iommu=on iommu=pt</code> в командной строке ядра, <code>vfio</code>/<code>vfio_pci</code>/<code>vfio_iommu_type1</code> в <code>/etc/modules</code>, файл <code>/etc/modprobe.d/vfio.conf</code> с <code>options vfio-pci ids=10de:2216</code> и файл <code>/etc/modprobe.d/blacklist-nvidia.conf</code>. При дополнении конфигурации параметры командной строки объединяются с параметрами GRUB или командной строки ядра целевой системы, модули vfio добавляются в <code>/etc/modules</code>, а два созданных пользователем файла modprobe копируются. При следующей загрузке IOMMU активен, модули VFIO загружаются, GPU привязывается к vfio-pci, а виртуальная машина запускается с работающим пробросом."
},
{
"scenario": "Пользовательские настройки GRUB по умолчанию",
"detail": "В исходной системе были заданы <code>GRUB_TIMEOUT=1</code> и <code>GRUB_DISABLE_OS_PROBER=true</code>. На этапе переноса настроек считываются оба ключа из <code>/etc/default/grub</code> резервной копии, обнаруживается, что они отличаются от значений по умолчанию новой установки, и эти две строки перезаписываются в файле целевой системы (всё остальное, включая <code>GRUB_DISTRIBUTOR</code>, остаётся без изменений)."
}
]
},
"callout": {
"warningTitle": "Что не применяется повторно при дополнении конфигурации, если ядро целевой системы новее",
"warningBody": "При восстановлении конфигурации повторно применяются только те настройки, которые ProxMenux считает безопасными при переходе между версиями ядра: параметры IOMMU, идентификаторы VFIO, ключи GRUB из разрешённого списка и модули из фиксированного списка (<code>vfio*</code>, <code>nvidia*</code>, <code>i915</code>, <code>xe</code>, <code>kvm*</code>). Всё, что не входит в этот набор, — пользовательские хуки initramfs в <code>/etc/initramfs-tools/hooks/</code>, файлы вне разрешённого списка в <code>/etc/modprobe.d/</code>, созданные пользователем переопределения юнитов systemd — по-прежнему исключается. Причина конкретна: эти файлы могут обращаться к внутренним интерфейсам ядра (API модулей, структуре <code>/sys</code>, хукам <code>udev</code>), которые меняются между основными версиями, и их применение без изменений к более новому ядру может сделать целевую систему незагружаемой. Если требуется точное воспроизведение цепочки загрузки, восстановление необходимо выполнять на узле с той же основной версией ядра, что и в резервной копии."
},
"codeReference": {
"heading": "Где реализованы механизмы",
"intro": "Для разработчиков, которые хотят проследить или расширить логику работы при переходе между версиями ядра:",
"rows": [
{
"component": "Определение направления перехода",
"location": "<code>hb_compat_check</code> в <code>lib_host_backup_common.sh</code>. Задаёт <code>HB_COMPAT_KERNEL_DIRECTION</code>."
},
{
"component": "Список путей безопасного подмножества",
"location": "<code>hb_unsafe_paths_cross_version</code> в <code>lib_host_backup_common.sh</code>. Выводит строки <code>path\\treason</code>, используемые как фильтром CLI, так и веб-эндпоинтом <code>/api/host-backups/restore/prepare</code>."
},
{
"component": "Этапы восстановления конфигурации",
"location": "<code>_rs_hyd_grub</code>, <code>_rs_hyd_kernel_cmdline</code>, <code>_rs_hyd_modules</code>, <code>_rs_hyd_files</code> в <code>backup_host.sh</code>. Выполнением управляет <code>_rs_apply_bk_older_hydration</code>."
},
{
"component": "Принудительное повторное применение настроек после загрузки",
"location": "<code>apply_pending_restore.sh</code> считывает <code>HB_HYDRATION_APPLIED</code> из <code>plan.env</code> и принудительно устанавливает флаги <code>NEEDS_INITRAMFS=1</code>/<code>NEEDS_GRUB=1</code>."
},
{
"component": "Предварительный просмотр в веб-интерфейсе",
"location": "<code>/api/host-backups/restore/prepare</code> в <code>flask_server.py</code>. Подключает вспомогательную библиотеку, запускает <code>_rs_apply_bk_older_hydration</code> в режиме планирования и возвращает список действий в модальное окно веб-интерфейса."
}
]
},
"whereNext": {
"heading": "Куда перейти дальше",
"items": [
{
"label": "Восстановление",
"href": "/docs/backup-restore/restoring",
"tail": " — полный процесс восстановления, в который встроены механизмы, описанные на этой странице."
},
{
"label": "Как это работает",
"href": "/docs/backup-restore/how-it-works",
"tail": " — манифест и сборщики, формирующие блок <code>kernel_params</code>, из которого считываются данные для восстановления конфигурации."
}
]
}
}
@@ -0,0 +1,234 @@
{
"meta": {
"title": "Место назначения Borg — типы репозиториев, аутентификация SSH, шифрование | ProxMenux",
"description": "При выборе Borg в качестве места назначения резервные копии узла ProxMenux записываются в репозиторий Borg — локальный, на подключённом внешнем диске или на удалённом сервере с доступом через SSH. Описаны порядок поиска исполняемого файла borg, четыре стратегии использования ключей SSH, шифрование repokey, сохранённая конфигурация места назначения и политика хранения для каждого задания по расписанию.",
"ogTitle": "Резервное копирование ProxMenux — место назначения Borg",
"ogDescription": "Как ProxMenux записывает резервные копии узла в репозитории Borg: стратегии аутентификации SSH и шифрование repokey.",
"twitterTitle": "Место назначения резервных копий Borg | ProxMenux",
"twitterDescription": "Репозитории Borg для резервных копий узла: локальные, на USB-носителях и с доступом через SSH."
},
"header": {
"title": "Borg",
"description": "При выборе Borg в качестве места назначения резервные копии узла записываются в репозиторий Borg. Поддерживаются три типа репозиториев: путь в локальной файловой системе, подключённый внешний диск или удалённый сервер с доступом через SSH. Предусмотрены дедупликация на уровне блоков данных между всеми архивами в репозитории и необязательное шифрование repokey.",
"section": "Резервное копирование и восстановление"
},
"aboutBorg": {
"heading": "Что такое Borg",
"body": "Borg (также пишется BorgBackup) — инструмент с открытым исходным кодом для резервного копирования с дедупликацией, поддерживаемый сообществом Borg Backup. Он хранит каждый архив в виде набора блоков переменной длины в репозитории; блоки используются совместно разными архивами, поэтому повторное резервное копирование неизменённых данных почти не требует дополнительного места. Borg не привязан к Proxmox — это универсальный инструмент резервного копирования, используемый в самых разных средах. ProxMenux использует его как одно из трёх мест назначения для резервных копий хоста; все описанные на этой странице механизмы Borg (типы репозиториев, borg-serve через SSH, шифрование repokey, prune) относятся к стандартным возможностям Borg."
},
"intro": {
"title": "Дедупликация на уровне блоков с локальными репозиториями или репозиториями, обслуживаемыми через SSH",
"body": "Репозиторий Borg хранит блоки данных, общие для всех содержащихся в нём архивов, поэтому при повторном резервном копировании неизменённого файла новые данные не передаются и не сохраняются. ProxMenux вызывает <code>borg create</code> для работы с репозиторием при резервном копировании и <code>borg extract</code> при восстановлении. Репозиторий может находиться в той же файловой системе, что и исходные данные, на подключённом внешнем диске или на удалённом узле, доступном через SSH."
},
"binarySourcing": {
"heading": "Исполняемый файл borg",
"intro": "Borg не входит в число базовых зависимостей установщика ProxMenux. При запуске резервного копирования <code>hb_ensure_borg</code> последовательно проверяет четыре источника исполняемого файла и использует первый работоспособный вариант:",
"rows": [
{
"priority": "1",
"source": "Системный <code>borg</code>",
"detail": "Если на узле уже установлен <code>borg</code> через APT (<code>which borg</code> находит исполняемый файл), используется этот файл."
},
{
"priority": "2",
"source": "Кэш в каталоге состояния",
"detail": "<code>/usr/local/share/proxmenux/borg</code> — файл, сохранённый после предыдущей загрузки через GitHub на этом узле."
},
{
"priority": "3",
"source": "Комплект AppImage монитора",
"detail": "<code>/usr/local/share/proxmenux/monitor-app/usr/bin/borg</code> — в комплект AppImage входит подписанный borg-linux64. Этот вариант работает без доступа к интернету: даже на узле без подключения к интернету доступен работоспособный <code>borg</code>."
},
{
"priority": "4",
"source": "Загрузка через GitHub",
"detail": "<code>wget</code> с использованием закреплённого URL <code>borg-linux64</code> в <code>github.com/borgbackup/borg/releases/</code> и проверкой по фиксированной контрольной сумме SHA-256, заданной в <code>lib_host_backup_common.sh</code> (<code>HB_BORG_LINUX64_SHA256</code>). При несовпадении контрольной суммы исполняемый файл удаляется, а резервное копирование прерывается. Загруженный файл кэшируется в каталоге состояния, поэтому при последующих запусках резервного копирования используется второй вариант."
}
]
},
"repoTypes": {
"heading": "Типы репозиториев",
"intro": "Тип репозитория выбирается при добавлении места назначения. Каждому типу соответствует свой URL репозитория, распознаваемый Borg.",
"rows": [
{
"type": "remote",
"url": "ssh://USER@HOST/RPATH",
"detail": "Репозиторий находится на удалённом сервере, на котором запущен <code>borg serve</code>. Требуется подключение к этому серверу по SSH."
},
{
"type": "usb",
"url": "/mnt/MOUNTPOINT/borgbackup",
"detail": "Репозиторий находится на подключённом внешнем диске (обычно USB). Точка монтирования определяется с помощью <code>hb_prompt_mounted_path</code>, который при необходимости обнаруживает, монтирует или форматирует разделы USB-накопителя."
},
{
"type": "local",
"url": "/backup/borgbackup (любой абсолютный путь)",
"detail": "Репозиторий находится в локальном каталоге. Этот вариант имеет смысл только тогда, когда целевой каталог расположен на отдельном физическом диске: репозиторий на том же диске, что и исходные данные, защищает от ошибок пользователя, но не от отказа диска."
}
]
},
"serverSetup": {
"heading": "Подготовка сервера Borg (на стороне сервера)",
"intro": "Для репозитория типа <code>remote</code> требуется работающий сервер Borg, доступный по SSH. ProxMenux не выполняет первоначальную настройку самого сервера — он лишь разрешает доступ по ключу к существующей учётной записи на нём. В этом разделе описаны требования к серверу, которые необходимо выполнить, прежде чем ProxMenux сможет подключиться.",
"hostChoicesTitle": "Где можно разместить сервер",
"hostChoicesBody": "Подойдёт любой хост Linux с доступом по SSH. Типичные варианты:",
"hostChoicesItems": [
"Выделенный NAS или сервер резервного копирования (Debian, Ubuntu, TrueNAS SCALE с доступом к командной оболочке).",
"Контейнер LXC на узле Proxmox. Потребляет мало ресурсов и изолирован от хоста, выполняющего резервное копирование.",
"Другой хост Proxmox в той же локальной сети или виртуальная машина в любом месте, доступная по SSH."
],
"lxcWarningTitle": "LXC в качестве сервера Borg",
"lxcWarningBody": "Если сервер Borg работает внутри LXC, для generate-auto нужна учётная запись, допускающая аутентификацию по паролю через SSH во время установки ключа. Если вход по паролю недоступен, установите ключ вручную или используйте альтернативный вариант generate-pct через хост PVE.",
"requirementsTitle": "Требования к серверу",
"requirementsRows": [
{
"requirement": "Исполняемый файл borg по пути <code>/usr/bin/borg</code>",
"detail": "В строке <code>command=\"/usr/bin/borg serve ...\"</code>, которую ProxMenux записывает в <code>authorized_keys</code>, этот путь задан явно. При установке через APT (<code>apt install borgbackup</code>) исполняемый файл размещается именно там. Для отдельно установленного исполняемого файла необходимо создать символическую ссылку <code>/usr/bin/borg</code>."
},
{
"requirement": "Отдельная учётная запись пользователя (обычно <code>borg</code>)",
"detail": "Владеет каталогом репозитория и принимает входящие подключения по SSH. Права sudo и доступ к командной оболочке не требуются — строка authorized_keys в любом случае запрещает интерактивные сеансы оболочки."
},
{
"requirement": "Каталог репозитория с доступом на запись",
"detail": "Путь, который пользователь указывает для ProxMenux (например, <code>/backup/borgbackup</code>), должен существовать на сервере, а его владельцем должен быть пользователь borg."
},
{
"requirement": "Демон SSH, разрешающий подключения пользователя borg",
"detail": "<code>PubkeyAuthentication yes</code> (по умолчанию). Аутентификация по паролю нужна только для однократной процедуры <em>generate-auto</em> — после установки ключа аутентификацию по паролю на сервере можно полностью отключить."
}
],
"minimalSetupTitle": "Минимальная настройка сервера",
"minimalSetupBody": "На сервере Borg под управлением Debian или Ubuntu для базовой рабочей настройки достаточно выполнить четыре команды от имени root:",
"minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup",
"minimalSetupNote": "Когда сервер подготовлен и доступна аутентификация по паролю через SSH, режим <code>generate-auto</code> в ProxMenux позволяет установить ключ SSH с помощью учётной записи, имеющей право записи в файл authorized_keys пользователя borg. При последующем резервном копировании используется этот ключ, действие которого ограничено <code>borg serve</code> по настроенному пути. Если вход по паролю недоступен, установите ключ вручную или используйте альтернативный вариант через хост PVE."
},
"sshAuth": {
"heading": "Аутентификация SSH (на стороне клиента)",
"intro": "Доступ к удалённым репозиториям Borg осуществляется по SSH. Подключение устанавливается с хоста ProxMenux к учётной записи пользователя на сервере Borg, от имени которого запускается <code>borg serve</code>. Обычно этот пользователь называется <code>borg</code>, и это НЕ учётная запись администратора или root на сервере — командная строка borg-serve ограничивает подключение конкретным путём к репозиторию (см. варианты работы с ключами ниже).",
"strategiesTitle": "Варианты работы с ключами SSH",
"strategiesIntro": "При добавлении удалённого целевого расположения ProxMenux запрашивает имя пользователя SSH, хост, порт и удалённый путь, а затем предлагает четыре варианта аутентификации. Дополнительный вариант generate-pct предлагается, если аутентификация по паролю отклонена. Режимы описаны ниже:",
"strategyRows": [
{
"mode": "generate-auto",
"label": "Рекомендуется",
"detail": "ProxMenux создаёт или повторно использует пару ключей ed25519 в <code>~/.ssh/borg_proxmenux_HOST_ed25519</code>, затем использует <code>sshpass</code> для проверки входа и установки открытого ключа в <code>~borg/.ssh/authorized_keys</code>. Пароль принадлежит учётной записи с правом записи в этот файл — обычно root или пользователю borg. Он используется при настройке и не сохраняется."
},
{
"mode": "generate-manual",
"label": "Без пароля администратора на этом хосте",
"detail": "ProxMenux создаёт пару ключей, как описано выше, но выводит полную строку <code>authorized_keys</code>, чтобы пользователь вручную вставил её на сервере. Пароль администратора никогда не покидает хост ProxMenux, поскольку он вообще не запрашивается."
},
{
"mode": "generate-pct",
"label": "Сервер Borg — PVE LXC",
"detail": "Сервер Borg работает внутри LXC на узле PVE. ProxMenux разрешает использование ключа через <code>pct exec</code> с хоста PVE — root на хосте PVE выполняет запись в <code>~borg/.ssh/authorized_keys</code> внутри LXC без необходимости подключения по SSH непосредственно к LXC."
},
{
"mode": "existing",
"label": "Использовать существующий ключ",
"detail": "ProxMenux ищет в <code>/root/.ssh/</code> и <code>$HOME/.ssh/</code> распознаваемые закрытые ключи ed25519/RSA и выводит их список. Пользователь выбирает один из них или вручную указывает нестандартный путь."
},
{
"mode": "none",
"label": "Конфигурация SSH по умолчанию",
"detail": "Без отдельного ключа — Borg использует конфигурацию SSH хоста по умолчанию (обычно <code>~/.ssh/id_rsa</code> или агент SSH)."
}
],
"restrictTitle": "Строка authorized_keys",
"restrictBody": "Для каждого созданного ключа строка <code>authorized_keys</code>, которую ProxMenux записывает на сервере, ограничивает использование ключа единственным вызовом borg-serve для настроенного пути к репозиторию:",
"restrictLine": "command=\"/usr/bin/borg serve --restrict-to-path RPATH\",restrict PUBKEY",
"restrictNote": "<code>command=</code> принудительно ограничивает каждый сеанс SSH с этим ключом выполнением только указанной команды borg-serve; <code>restrict</code> отключает перенаправление портов, перенаправление агента, перенаправление X11 и выделение PTY. Ключ нельзя использовать для открытия интерактивной оболочки на сервере или доступа к любому другому пути репозитория, даже если учётная запись имеет более широкие права."
},
"savedTargets": {
"heading": "Сохранённые назначения",
"intro": "Сохранённое назначение хранит конфигурацию репозитория под понятным именем, чтобы не приходилось повторно вводить данные. Структура хранения в каталоге состояния ProxMenux:",
"rows": [
{
"file": "borg-targets.txt",
"content": "Одна строка на назначение: <code>NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE</code>. Считывается <code>hb_collect_borg_configs</code> для заполнения меню выбора назначения."
},
{
"file": "borg-pass-NAME.txt",
"content": "Парольная фраза для назначения с указанным выше именем NAME (<code>chmod 600</code>). Присутствует только в том случае, если пользователь выбрал шифрование repokey."
}
],
"outro": "Сохранять назначение необязательно. При отказе от сохранения конфигурация именованного назначения не сохраняется, но созданный ключ SSH не удаляется. Если шифрование repokey включено без сохранённого назначения, ProxMenux всё равно сохраняет парольную фразу в устаревшем файле borg-pass.txt."
},
"encryption": {
"heading": "Шифрование",
"body": "При инициализации репозиториев через <code>hb_borg_init_if_needed</code> задаётся режим шифрования: современный <code>borg repo-create -e MODE</code>, если он доступен, или устаревший <code>borg init --encryption=MODE</code>. ProxMenux предлагает два режима: <code>repokey</code> (по умолчанию) и <code>none</code>. В режиме <code>repokey</code> Borg хранит ключ шифрования в самом репозитории; для доступа требуется парольная фраза, которую ProxMenux запрашивает дважды, проверяя совпадение, и сохраняет в <code>borg-pass-NAME.txt</code> для сохранённых целей (или в устаревшем файле, описанном выше). После сохранения парольной фразы отображается диалоговое окно с обязательным подтверждением: парольная фраза — единственный способ получить доступ к зашифрованным архивам, и её утрата делает восстановление любого архива в репозитории невозможным."
},
"runtimeEnv": {
"heading": "Среда выполнения",
"intro": "ProxMenux экспортирует следующие переменные окружения перед вызовом <code>borg</code>. Они настраивают подключение и разблокируют репозиторий без передачи секретных данных в командной строке.",
"rows": [
{
"var": "BORG_RSH",
"value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]",
"purpose": "Команда удалённой оболочки, которую Borg использует для репозиториев SSH. При выборе ключа добавляются параметры идентификации. При первом добавлении цели с нестандартным портом ProxMenux также добавляет -p PORT; для сохранённых целей, запланированных заданий и Monitor вместо этого используется порт из URL вида ssh://. Если пользовательский ключ не задан и новая цель добавляется со стандартным портом, переменная не устанавливается, поэтому Borg использует конфигурацию SSH хоста по умолчанию."
},
{
"var": "BORG_PASSPHRASE",
"value": "(парольная фраза из borg-pass-NAME.txt)",
"purpose": "Разблокирует ключ repokey. Устанавливается только в том случае, если цель использует шифрование <code>repokey</code>. Никогда не появляется в списке аргументов процесса."
},
{
"var": "BORG_ENCRYPT_MODE",
"value": "repokey | none",
"purpose": "Используется <code>hb_borg_init_if_needed</code> при инициализации ещё не существующего репозитория. Игнорируется <code>borg create</code> для существующих репозиториев."
},
{
"var": "BORG_RELOCATED_REPO_ACCESS_IS_OK",
"value": "yes",
"purpose": "Подавляет интерактивный запрос подтверждения, который Borg выводит, если URL репозитория отличается от URL, по которому к нему обращались изначально (часто после переименования точки монтирования или при доступе к хосту SSH по новому адресу)."
},
{
"var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK",
"value": "yes",
"purpose": "Подавляет интерактивный запрос подтверждения, который Borg выводит при первом обращении к незашифрованному репозиторию с нового клиента."
}
]
},
"archiveFormat": {
"heading": "Именование и хранение архивов",
"intro": "При каждом резервном копировании в репозитории создаётся новый архив.",
"namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS",
"retentionBody": "Для запланированных заданий <code>run_scheduled_backup.sh</code> после каждого успешного резервного копирования выполняет <code>borg prune</code> для репозитория с параметрами хранения, настроенными в задании (<code>--keep-last</code>, <code>--keep-daily</code>, <code>--keep-weekly</code>). При интерактивном резервном копировании удаление архивов по политике хранения не выполняется."
},
"restoreAccess": {
"heading": "Получение архивов для восстановления",
"body": "В процессе восстановления список архивов получается с помощью <code>borg list REPO</code>, а выбранный архив извлекается с помощью <code>borg extract REPO::ARCHIVE-NAME</code> в промежуточный каталог, который <code>_rs_check_layout</code> передаёт стандартному конвейеру восстановления. Для получения архивов вручную вне ProxMenux используются те же команды; извлечённое дерево каталогов имеет стандартную структуру из трёх наборов данных, описанную в разделе <em>Как это работает</em>."
},
"references": {
"heading": "Справочные материалы",
"intro": "Официальная документация Borg по компонентам, которые использует ProxMenux.",
"items": [
{
"label": "Документация Borg",
"href": "https://borgbackup.readthedocs.io/",
"tail": " — основной раздел документации, охватывающий концепции, развёртывание, быстрый старт и все команды."
},
{
"label": "borg create",
"href": "https://borgbackup.readthedocs.io/en/stable/usage/create.html",
"tail": " — команда, которую ProxMenux вызывает при каждом резервном копировании, со всеми поддерживаемыми флагами."
},
{
"label": "Шифрование репозитория",
"href": "https://borgbackup.readthedocs.io/en/stable/usage/init.html#encryption-mode",
"tail": " — режимы шифрования, поддерживаемые Borg, включая repokey, который ProxMenux использует по умолчанию."
},
{
"label": "Развёртывание borg serve и SSH",
"href": "https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html",
"tail": " — настройка центрального сервера Borg с доступом через SSH, включая команду borg-serve и флаг restrict-to-path, который ProxMenux записывает в authorized_keys."
},
{
"label": "borg prune",
"href": "https://borgbackup.readthedocs.io/en/stable/usage/prune.html",
"tail": " — модель хранения резервных копий, лежащая в основе --keep-last / --keep-daily / --keep-weekly, которую ProxMenux применяет к каждому заданию по расписанию."
}
]
}
}
@@ -0,0 +1,110 @@
{
"meta": {
"title": "Места назначения резервных копий — локальное хранение, Proxmox Backup Server, Borg | ProxMenux",
"description": "Три механизма хранения получают одни и те же данные резервной копии ProxMenux: локальный архив .tar.zst в любой файловой системе, доступной для записи, резервную копию PBS в хранилище данных Proxmox Backup Server или архив Borg в локальном либо удалённом репозитории Borg. Каждый механизм имеет свои особенности сжатия, дедупликации, шифрования и работы с сетью.",
"ogTitle": "Места назначения резервных копий ProxMenux",
"ogDescription": "Локальное хранение, Proxmox Backup Server и Borg — три механизма хранения одних и тех же данных резервной копии хоста.",
"twitterTitle": "Места назначения резервных копий ProxMenux | ProxMenux",
"twitterDescription": "Локальный архив, Proxmox Backup Server и Borg для хранения резервных копий хоста."
},
"header": {
"title": "Места хранения",
"description": "Три механизма хранения, поддерживаемые ProxMenux Backup: локальный архив, Proxmox Backup Server (рекомендуется) и Borg. Каждый получает один и тот же архив из трёх компонентов; они различаются форматом хранения, дедупликацией, моделью шифрования и требованиями к сети.",
"section": "Резервное копирование и восстановление"
},
"intro": {
"title": "Одни и те же данные, три механизма хранения",
"body": "При каждом резервном копировании создаются одни и те же три компонента (rootfs, манифест, приложения). Места назначения различаются способом хранения этих компонентов и тем, как оператор получает их для восстановления. Каждый механизм хранения реализован отдельной функцией в <code>backup_host.sh</code> — <code>_bk_local</code>, <code>_bk_pbs</code>, <code>_bk_borg</code>, — но все три используют один и тот же этап подготовки (<code>hb_prepare_staging</code>) и один и тот же код восстановления. Выбор места назначения влияет только на запись и получение данных; он не меняет ни действия при восстановлении, ни способ использования архива."
},
"comparison": {
"heading": "Сравнение возможностей",
"intro": "В следующей таблице перечислены конкретные различия между тремя механизмами хранения в их текущей реализации в ProxMenux. Все значения описывают наблюдаемое поведение самого механизма хранения, а не рекомендации авторов документации.",
"rows": [
{
"feature": "Формат хранения",
"local": "Один файл <code>.tar.zst</code> (или <code>.tar.gz</code>, если <code>zstd</code> отсутствует).",
"pbs": "Резервная копия PBS (блоки <code>.pxar</code> в хранилище данных).",
"borg": "Архив Borg в репозитории Borg (файлы сегментов)."
},
{
"feature": "Сжатие",
"local": "zstd (уровень по умолчанию) через <code>tar --zstd</code>. Резервный вариант — gzip.",
"pbs": "Управляется proxmox-backup-client. ProxMenux не переопределяет настройки сжатия.",
"borg": "Встроенное сжатие Borg. ProxMenux вызывает borg create, не переопределяя настройки сжатия."
},
{
"feature": "Дедупликация",
"local": "Отсутствует. Каждая резервная копия представляет собой полный независимый архив.",
"pbs": "Полная дедупликация на уровне блоков данных между всеми резервными копиями в хранилище данных.",
"borg": "Полная дедупликация на уровне блоков данных между всеми архивами в репозитории."
},
{
"feature": "Шифрование хранимых данных",
"local": "Отсутствует (защита обеспечивается на уровне файловой системы).",
"pbs": "Необязательное шифрование на стороне клиента с использованием файла ключа. При включении данные для восстановления загружаются как отдельная группа резервных копий.",
"borg": "Необязательное шифрование repokey (ключ хранится в репозитории и разблокируется парольной фразой)."
},
{
"feature": "Политика хранения / удаление устаревших копий",
"local": "Применяется отдельно для каждого задания по расписанию через <code>KEEP_LAST</code>. Старые архивы удаляются вместе с соответствующими сопутствующими файлами и журналами выполнения. При интерактивном создании резервных копий устаревшие копии не удаляются.",
"pbs": "Применяется отдельно для каждого задания по расписанию через <code>proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly</code>. При интерактивном создании резервных копий устаревшие копии не удаляются.",
"borg": "Применяется отдельно для каждого задания по расписанию через <code>borg prune --keep-last / --keep-daily / --keep-weekly</code>. При интерактивном создании резервных копий устаревшие копии не удаляются."
},
{
"feature": "Сеть",
"local": "Не требуется. Запись выполняется в локальную точку монтирования (обычно на внутренний диск или USB-накопитель).",
"pbs": "Подключение по TCP к серверу PBS (порт по умолчанию — 8007). Требуются учётные данные PBS и отпечаток сертификата.",
"borg": "Путь в локальной файловой системе или туннель SSH к удалённому узлу Borg."
},
{
"feature": "Зависимости",
"local": "<code>tar</code>, <code>zstd</code> (установлены в Proxmox по умолчанию).",
"pbs": "Пакет <code>proxmox-backup-client</code> (входит в состав Proxmox VE версии 8 и выше).",
"borg": "Исполняемый файл <code>borg</code>. При отсутствии автоматически устанавливается с помощью ProxMenux из комплекта AppImage Monitor."
},
{
"feature": "Доступ для восстановления",
"local": "Архив можно распаковать на любом узле с tar+zstd. PBS/Borg не требуются.",
"pbs": "Требуются <code>proxmox-backup-client</code>, учётные данные PBS и файл ключа (если используется шифрование).",
"borg": "Требуются <code>borg</code>, путь к репозиторию и парольная фраза (если используется шифрование)."
}
],
"captionCode": "возможность",
"captionLocal": "Локально",
"captionPbs": "Proxmox Backup Server (рекомендуется)",
"captionBorg": "Borg"
},
"sameArchive": {
"heading": "Структура архива не зависит от места назначения",
"body": "Независимо от места хранения резервная копия всегда содержит три блока, описанные в разделе <em>Как это работает</em>: файловую систему (<code>rootfs/</code>), метаданные (<code>metadata/</code>) и манифест (<code>manifest.json</code>). Распаковка локального архива <code>.tar.zst</code>, восстановление <code>.pxar</code> из PBS и распаковка архива Borg дают одинаковое дерево каталогов. Поэтому при восстановлении всегда читаются одни и те же файлы независимо от того, откуда получена резервная копия."
},
"extractStandalone": {
"heading": "Распаковка резервной копии без ProxMenux",
"intro": "Любой из трёх форматов архивов можно прочитать стандартными средствами, не устанавливая ProxMenux на хост, где выполняется чтение. Приведённые ниже команды создают то же дерево каталогов, которое используется внутри процесса восстановления.",
"localCmd": "# From a local .tar.zst archive:\ntar --zstd -xf hostcfg-HOST-TIMESTAMP.tar.zst\n\n# From a .tar.gz fallback:\ntar -xzf hostcfg-HOST-TIMESTAMP.tar.gz",
"pbsCmd": "# From a PBS backup (requires proxmox-backup-client):\nproxmox-backup-client restore \\\n --repository USER@REALM@HOST:DATASTORE \\\n host/hostcfg-HOST/BACKUP-TIME \\\n hostcfg.pxar /tmp/hostcfg\n\n# Add --keyfile KEY-PATH when the backup is encrypted.",
"borgCmd": "# From a Borg archive (requires borg binary + passphrase for encrypted repos):\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# On a remote SSH-served repo:\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME",
"note": "Полученное дерево каталогов можно затем изучить вручную или использовать для ручного восстановления. Точная последовательность получения данных, которую ProxMenux использует внутри процесса восстановления, описана на страницах отдельных мест назначения."
},
"whereNext": {
"heading": "Подробности для каждого места назначения",
"intro": "Для каждого места назначения есть отдельная страница с описанием настройки, формата хранения на диске и команды получения данных, используемой при восстановлении.",
"items": [
{
"label": "Локальный архив",
"href": "/docs/backup-restore/destinations/local",
"tail": " — предварительная настройка локального места назначения, монтирование USB-накопителя, защита от записи архива внутрь самого себя и сопутствующий JSON-файл, позволяющий Monitor распознать файл."
},
{
"label": "Proxmox Backup Server (рекомендуется)",
"href": "/docs/backup-restore/destinations/pbs",
"tail": " — выбор хранилища данных, учётные данные и отпечаток, жизненный цикл файла ключа шифрования, парольная фраза восстановления и загрузка блока данных восстановления в PBS для восстановления после чистой установки."
},
{
"label": "Borg",
"href": "/docs/backup-restore/destinations/borg",
"tail": " — локальные репозитории и репозитории, обслуживаемые через SSH, источники исполняемого файла Borg (система / кэш / комплект AppImage Monitor / загрузка GitHub), инициализация репозитория, работа с парольной фразой и настройка ключа SSH для удалённых репозиториев."
}
]
}
}
@@ -0,0 +1,75 @@
{
"meta": {
"title": "Локальное место назначения для архивов — tar.zst в файловой системе или на USB-накопителе | ProxMenux",
"description": "Локальное место назначения резервных копий позволяет записать один архив .tar.zst в любой каталог, доступный для записи: на внутреннем диске, в точке монтирования Proxmox, на общем ресурсе NFS или на USB-накопителе. Описаны процесс настройки, логика обнаружения и монтирования USB-накопителей, защита от записи архива в каталог, включённый в резервную копию, и сопутствующий JSON-файл для идентификации архива.",
"ogTitle": "Резервное копирование ProxMenux — локальное место назначения для архивов",
"ogDescription": "Как ProxMenux записывает локальные резервные копии в виде архивов .tar.zst и как настроить целевой каталог или USB-накопитель.",
"twitterTitle": "Локальное место назначения резервных копий | ProxMenux",
"twitterDescription": "Как ProxMenux записывает локальные резервные копии в виде архивов .tar.zst в файловой системе или на USB-накопителе."
},
"header": {
"title": "Локальный архив",
"description": "При выборе локального места назначения один сжатый tar-архив записывается в любой доступный для записи каталог на хосте: на внутреннем диске, в точке монтирования NFS или SMB либо на USB-накопителе.",
"section": "Резервное копирование и восстановление"
},
"intro": {
"title": "Один самодостаточный файл",
"body": "Локальное резервное копирование создаёт один файл <code>hostcfg-HOST-TIMESTAMP.tar.zst</code> (или <code>.tar.gz</code>, если <code>zstd</code> отсутствует). Файл содержит всё дерево архива — <code>manifest.json</code>, <code>metadata/</code> и <code>rootfs/</code>. Его можно восстановить на любом хосте Proxmox с помощью процедуры восстановления ProxMenux или распаковать вручную с помощью <code>tar --zstd -xf</code> в любой системе Linux. Не нужны ни сервер, ни инициализация репозитория, ни внешние зависимости. Это место назначения обеспечивает самый короткий путь к восстановлению, когда недоступны ни PBS, ни Borg."
},
"targetConfig": {
"heading": "Настройка целевого каталога",
"intro": "Локальное место назначения — это <strong>один целевой каталог, сохраняемый в настройках</strong>, а не список. ProxMenux сохраняет выбор пользователя в <code>/usr/local/share/proxmenux/local-target.conf</code> и считывает его при каждом резервном копировании. Если место назначения не настроено, используется значение по умолчанию <code>HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump</code> (тот же каталог, в который Proxmox сохраняет результаты собственных операций <code>vzdump</code>). Место назначения настраивается через <em>Настройка мест назначения резервных копий → Локальные места назначения для архивов → Управление локальным местом назначения резервных копий</em>:",
"options": [
"<strong>Использовать значение по умолчанию (<code>/var/lib/vz/dump</code>).</strong> Локальное хранилище Proxmox. Присутствует в каждой установке Proxmox; архив размещается рядом с результатами vzdump и автоматически отображается на вкладке резервных копий Monitor.",
"<strong>Использовать свой путь.</strong> Можно указать любой абсолютный путь в файловой системе: точку монтирования NFS, общий ресурс SMB, смонтированный через <code>fstab</code>, отдельный набор данных ZFS или второй внутренний диск. Перед сохранением ProxMenux проверяет, что путь существует и является каталогом.",
"<strong>Использовать USB-диск.</strong> Открывает подменю USB (см. ниже), которое обнаруживает съёмные устройства и предлагает смонтировать или отформатировать одно из них."
]
},
"usbFlow": {
"heading": "Обнаружение и монтирование USB-накопителей",
"intro": "В подменю USB перечислены разделы на съёмных устройствах, о которых сообщает <code>lsblk</code>. Для каждого раздела указаны размер, метка файловой системы и текущее состояние. От состояния зависит, какое действие предлагает ProxMenux.",
"statesTitle": "Три состояния устройства",
"stateRows": [
{
"state": "смонтирован",
"shown": "Размер · метка · [fstype] · → /mount/point",
"action": "Раздел уже смонтирован. При его выборе текущая точка монтирования сохраняется как локальное место назначения. Монтирование не выполняется."
},
{
"state": "не смонтирован",
"shown": "Размер · метка · [fstype] · (не смонтирован — будет смонтирован)",
"action": "Файловая система есть, но она не смонтирована. После подтверждения ProxMenux запускает <code>hb_mount_usb_partition</code>: создаёт <code>/mnt/proxmenux-backup-LABEL</code> (если метки нет, используется UUID или имя устройства), монтирует раздел и сохраняет точку монтирования как локальное место назначения."
},
{
"state": "пустой",
"shown": "Размер · USB-диск без файловой системы (будет ОТФОРМАТИРОВАН)",
"action": "На устройстве нет файловой системы. Этот вариант приводит к удалению данных и требует двух подтверждений. Сначала диалог «Да/Нет» предупреждает, что операция сотрёт данные на диске. Затем в окне ввода пользователь должен <strong>ввести точный путь к устройству</strong> (например, <code>/dev/sdb</code>), и только после этого ProxMenux создаёт новую таблицу разделов GPT с разделом ext4 и монтирует его."
}
],
"notMountedFallback": "Если USB-устройства не обнаружены, вместо подменю открывается обычное окно ввода. Пользователь может ввести произвольный путь к точке монтирования; если этот путь не является зарегистрированной точкой монтирования, перед продолжением появляется диалог подтверждения с предупреждением."
},
"safetyCheck": {
"heading": "Проверка безопасности — место назначения внутри пути, включённого в резервную копию",
"body": "Перед записью архива <code>_bk_local</code> проверяет, что каталог назначения <strong>не</strong> находится внутри какого-либо каталога, включённого в резервную копию. Типичная ошибка — добавить <code>/root</code> в профиль и выбрать <code>/root/backups</code> в качестве места назначения: тогда архив будет включать сам себя, что приведёт либо к повреждению архива, либо к его неограниченному росту до заполнения диска. Проверка разрешает оба пути с помощью <code>readlink -m</code>, сравнивает их и при обнаружении конфликта прерывает создание резервной копии. В диалоговом окне указывается конфликтующий путь и перечисляются три способа устранения проблемы: выбрать место назначения вне конфликтующего пути, удалить пользовательскую запись, содержащую место назначения, или в режиме Custom снять отметку с конфликтующего пути для текущего запуска."
},
"archiveFormat": {
"heading": "Формат архива и сжатие",
"intro": "Имя выходного файла содержит имя исходного узла и временную метку резервной копии, что позволяет упорядочивать несколько архивов в каталоге по времени и определять содержимое каждого файла по его имени.",
"namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS.tar.zst",
"compressionTitle": "Сжатие",
"compressionBody": "Основной вариант использует <code>tar --zstd -cf</code> — конвейер, запускаемый одной командой и выполняющий сжатие с уровнем zstd по умолчанию. Если <code>zstd</code> отсутствует на исходном узле (что редко встречается в Proxmox, но возможно при минимальной установке), ProxMenux использует резервный вариант <code>gzip</code>. В этом варианте, если доступен <code>pv</code>, в конвейер добавляется индикатор выполнения, позволяющий пользователю наблюдать за ростом размера архива в реальном времени; без <code>pv</code> используется обычный <code>tar -czf</code> без отображения хода выполнения.",
"sourceTitle": "Что входит в архив",
"sourceBody": "Команда tar вызывается с <code>-C \"$staging_root\" .</code>, что позволяет архивировать <strong>весь корневой каталог промежуточной сборки</strong>: <code>rootfs/</code>, <code>metadata/</code> и <code>manifest.json</code>. Все три компонента размещаются рядом на верхнем уровне tar-архива. При распаковке архива получается точно такая же структура каталогов, которую использует код восстановления."
},
"sidecar": {
"heading": "Сопроводительный файл JSON",
"intro": "При каждом успешном создании локальной резервной копии создаётся сопроводительный файл <code>hostcfg-HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json</code>, который <code>hb_write_archive_sidecar</code> записывает рядом с архивом. Этот небольшой файл JSON позволяет ProxMenux Monitor распознать архив как резервную копию узла ProxMenux, даже если впоследствии архив будет перемещён, переименован или сохранён в другом месте.",
"contentTitle": "Содержимое сопроводительного файла",
"contentBody": "Сопроводительный файл содержит версию схемы, сведения о том, была ли резервная копия создана в интерактивном режиме или заданием по расписанию (<code>kind</code>), идентификатор задания для запусков по расписанию, использованный режим профиля (<code>default</code> или <code>custom</code>), имя исходного узла, исходное имя файла архива без пути, временную метку создания в формате ISO-8601 и размер архива в байтах.",
"whyBody": "Вкладка резервных копий в Monitor сканирует настроенные локальные каталоги в поисках сопроводительных файлов <code>*.proxmenux.json</code>, а не файлов <code>*.tar.zst</code>, поскольку <code>.tar.zst</code> без сопроводительного файла может вообще не быть резервной копией ProxMenux. Сканирование выполняется быстро (JSON-файлы очень малы), а связь между файлами сохраняется при переименовании архива, если сопроводительный файл переименован соответственно."
},
"restoreAccess": {
"heading": "Восстановление из локального архива",
"body": "При восстановлении ProxMenux обнаруживает локальные архивы, сканируя настроенное локальное место назначения в поисках сопроводительных файлов, и показывает их в списке архивов. При выборе архива запускается <code>_rs_check_layout</code>: архив tar распаковывается в промежуточный каталог, а перед продолжением проверяется наличие трёх блоков данных. Для ручной распаковки вне ProxMenux команда <code>tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg</code> создаёт ту же структуру каталогов, которую использует код восстановления."
}
}
@@ -0,0 +1,113 @@
{
"meta": {
"title": "Место назначения Proxmox Backup Server — репозиторий, шифрование, восстановление | ProxMenux",
"description": "В место назначения PBS резервные копии хоста ProxMenux записываются как резервные копии PBS. Описаны автоматическое обнаружение репозиториев из /etc/pve/storage.cfg, ручная настройка PBS, команда загрузки .pxar, модель шифрования на стороне клиента с файлом ключа и необязательным сохранением его резервной копии, зашифрованной парольной фразой, а также восстановление файла ключа из нескольких источников на новом хосте.",
"ogTitle": "Резервное копирование ProxMenux — место назначения Proxmox Backup Server",
"ogDescription": "Как ProxMenux записывает резервные копии хоста в Proxmox Backup Server с шифрованием на стороне клиента с помощью файла ключа и сохранением резервной копии ключа для восстановления.",
"twitterTitle": "Место назначения резервных копий PBS | ProxMenux",
"twitterDescription": "Место назначения Proxmox Backup Server с шифрованием с помощью файла ключа и сохранением резервной копии ключа, защищённой парольной фразой для восстановления."
},
"header": {
"title": "Proxmox Backup Server",
"description": "В место назначения PBS корневой промежуточный каталог загружается как одна резервная копия .pxar в хранилище данных Proxmox Backup Server. При необходимости можно включить шифрование на стороне клиента с помощью файла ключа и загрузку рядом с каждой резервной копией резервного файла ключа, зашифрованного парольной фразой.",
"section": "Резервное копирование и восстановление"
},
"recommendedBadge": "Рекомендуемое место назначения",
"aboutPbs": {
"heading": "Что такое Proxmox Backup Server",
"body": "Proxmox Backup Server (PBS) — собственный сервер резервного копирования Proxmox, который разрабатывает и поддерживает та же команда, что и Proxmox VE. Это специализированный сервер для приёма резервных копий с хостов Proxmox VE (виртуальных машин, контейнеров LXC и, через <code>proxmox-backup-client</code>, произвольных каталогов хоста) с дедупликацией на уровне блоков, шифрованием на стороне клиента и политиками хранения, применяемыми на стороне сервера. ProxMenux использует PBS как одно из трёх мест назначения для резервных копий хоста; все описанные на этой странице механизмы, специфичные для PBS (группы резервных копий, архивы <code>.pxar</code>, <code>--backup-id</code>, шифрование с помощью файла ключа), являются стандартными возможностями PBS."
},
"intro": {
"title": "Одна резервная копия за запуск, дедупликация на уровне блоков",
"body": "При резервном копировании PBS в хранилище данных создаётся одна запись резервной копии в группе с идентификатором резервного копирования <code>host/hostcfg-HOSTNAME/BACKUP-TIME</code>. Данные представляют собой архив <code>.pxar</code> с той же структурой из трёх блоков, которая описана в разделе <em>Как это работает</em>. PBS выполняет дедупликацию на уровне блоков для всех резервных копий в хранилище данных, поэтому при последующем резервном копировании того же хоста передаются и сохраняются только изменившиеся блоки. Для заданий по расписанию правила хранения применяет сам ProxMenux: после каждого успешного выполнения <code>run_scheduled_backup.sh</code> запускает <code>proxmox-backup-client prune</code> с <code>--keep-last</code> / <code>--keep-daily</code> / <code>--keep-weekly</code>, используя значения, настроенные в задании."
},
"repoSelection": {
"heading": "Выбор репозитория",
"intro": "При каждом резервном копировании ProxMenux обнаруживает репозитории PBS из двух источников. Пользователь выбирает один из них в общем меню; для текущего запуска этот выбор определяет сервер и хранилище данных, в которые отправляется резервная копия, пароль для аутентификации и <em>отпечаток</em> для проверки сертификата.",
"sourceRows": [
{
"source": "Proxmox storage.cfg (автоматическое обнаружение)",
"path": "/etc/pve/storage.cfg + /etc/pve/priv/storage/NAME.pw",
"content": "Любая секция <code>pbs:</code> в собственной конфигурации хранилищ Proxmox обнаруживается автоматически. Сервер, хранилище данных, имя пользователя и отпечаток берутся из этой секции. Пароль считывается из собственного каталога учётных данных Proxmox. На стороне ProxMenux повторный ввод не требуется: репозиторий становится доступен сразу после его настройки в Proxmox."
},
{
"source": "Ручная настройка ProxMenux",
"path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt",
"content": "Добавляется через <em>Настроить места назначения резервных копий → Места назначения Proxmox Backup Server (PBS) → + Добавить новый PBS вручную</em>. Запрашиваются название, имя пользователя (<code>root@pam</code> или <code>user@pbs!token</code>), хост или IP-адрес, хранилище данных и пароль. Если пароль не введён, запрос повторяется: иначе пустой пароль сохранился бы без предупреждения и каждое последующее резервное копирование завершалось бы с непонятной ошибкой аутентификации. Этот способ используется, если целевой PBS не зарегистрирован в Proxmox как хранилище."
}
],
"menuTitle": "Меню выбора",
"menuBody": "Оба источника отображаются в одном меню, а каждая строка помечена в соответствии с её источником (<code>[proxmox]</code> или <code>[manual]</code>). Записи, для которых не удалось определить пароль, отмечены предупреждением <code>⚠ no password</code> — при выборе такой записи перед началом резервного копирования потребуется повторно ввести пароль. Отпечаток передаётся в <code>proxmox-backup-client</code> через переменную окружения <code>PBS_FINGERPRINT</code>; если он отсутствует, при первом резервном копировании клиент интерактивно запрашивает у пользователя подтверждение принятия сертификата сервера."
},
"backupCommand": {
"heading": "Команда резервного копирования",
"intro": "Загрузка выполняется одним вызовом <code>proxmox-backup-client backup</code>. ProxMenux использует <code>env</code> для передачи клиенту пароля, пароля шифрования и отпечатка через переменные окружения.",
"cmd": "env \\\n PBS_PASSWORD=\"$HB_PBS_SECRET\" \\\n PBS_ENCRYPTION_PASSWORD=\"$HB_PBS_ENC_PASS\" \\\n PBS_FINGERPRINT=\"$HB_PBS_FINGERPRINT\" \\\n proxmox-backup-client backup \\\n hostcfg.pxar:$staging_root \\\n --repository USER@REALM@HOST:DATASTORE \\\n --backup-type host \\\n --backup-id hostcfg-HOSTNAME \\\n --backup-time BACKUP-EPOCH \\\n [--keyfile /usr/local/share/proxmenux/pbs-key.conf]",
"backupIdTitle": "Именование идентификаторов резервных копий",
"backupIdBody": "Идентификатор резервной копии по умолчанию — <code>hostcfg-HOSTNAME</code>. Перед загрузкой пользователю предлагается подтвердить или изменить его; все символы, не входящие в <code>[A-Za-z0-9_-]</code>, удаляются, как и дефисы в конце. Повторное использование одного и того же идентификатора при разных запусках предусмотрено намеренно — PBS рассматривает идентификатор как <em>группу</em>, и каждая последующая резервная копия появляется как новая копия внутри этой группы с дедупликацией данных относительно предыдущих запусков.",
"pxarTitle": "Почему источником служит весь корневой каталог подготовки",
"pxarBody": "Архив <code>.pxar</code> содержит весь рабочий каталог: файловую систему хоста (<code>rootfs/</code>), метаданные (<code>metadata/</code>) и манифест (<code>manifest.json</code>). При восстановлении ProxMenux сравнивает манифест с целевым хостом, чтобы определить, соответствует ли хост исходному состоянию, изменилось ли оборудование или это другая машина, и соответствующим образом корректирует процесс. Старые резервные копии, созданные более ранними версиями ProxMenux и содержащие только файловую систему, также восстанавливаются корректно: при восстановлении устаревший формат распознаётся, а его структура автоматически преобразуется."
},
"encryption": {
"heading": "Шифрование на стороне клиента",
"glossaryHint": "В этом разделе используются термины <em>файл ключа</em>, <em>парольная фраза</em> и <em>конверт восстановления</em>. В <glosarioLink>глоссарии</glosarioLink> различия между ними кратко описаны одним предложением для каждого термина.",
"intro": "Шифрование на стороне клиента с использованием файла ключа в PBS шифрует блоки данных на исходном хосте до загрузки. В ProxMenux шифрование необязательно; если оно включено, пользователь при настройке явно выбирает «да» или «нет»: следует ли также загрузить в PBS копию файла ключа, защищённую парольной фразой, для резервного хранения на случай восстановления (позже этот выбор можно изменить в Monitor). Сам файл ключа всегда хранится на хосте по одному каноническому пути — <code>/usr/local/share/proxmenux/pbs-key.conf</code> — и автоматически используется при каждом последующем резервном копировании с шифрованием без дополнительных запросов.",
"keyfileTitle": "Настройка файла ключа",
"keyfileBody": "Диалог настройки шифрования появляется при первом резервном копировании с шифрованием на хосте. На первом шаге задаётся вопрос, нужно ли шифровать резервную копию: <em>Нет</em> — продолжить без шифрования; <em>Да</em> — перейти ко второму шагу. Второй шаг зависит от того, установлен ли уже файл ключа по пути <code>/usr/local/share/proxmenux/pbs-key.conf</code>. Если установлен, он используется без дополнительных запросов, и резервное копирование продолжается — при последующих резервных копированиях этот вопрос больше не задаётся. Если нет, меню с двумя вариантами предлагает выбрать способ настройки. <em>Создать новый файл ключа</em> запускает <code>proxmox-backup-client key create --kdf none</code>. <em>Использовать существующий файл ключа</em> автоматически обнаруживает файл ключа, управляемый PVE: если выбранный репозиторий PBS зарегистрирован в Proxmox с ключом шифрования по пути <code>/etc/pve/priv/storage/&lt;NAME&gt;.enc</code>, этот файл без дополнительных запросов копируется в каноническое расположение ProxMenux, после чего процесс продолжается. Если для репозитория не найден подходящий файл ключа, управляемый PVE, пользователю предлагается ввести абсолютный путь, по которому он уже разместил файл ключа на этом хосте. В обоих случаях файл помещается в каноническое расположение с <code>chmod 600</code>.",
"modesTitle": "Отдельный файл ключа для каждого хоста или общий файл ключа",
"modesIntro": "Поддерживаются обе модели работы, ни одна из них не является обязательной — пользователь выбирает подходящую в зависимости от организации своего парка хостов.",
"modesPerHostTitle": "Отдельный файл ключа для каждого хоста (по умолчанию)",
"modesPerHostBody": "Каждый хост создаёт собственный файл ключа при первом включении шифрования PBS. Это обеспечивает максимальную изоляцию: компрометация файла ключа одного хоста не раскрывает резервные копии других хостов. Рекомендуется для парков хостов в производственной среде, а также для сред, где у хостов разные владельцы или к ним применяются разные нормативные требования.",
"modesSharedTitle": "Общий файл ключа (импорт на каждом хосте)",
"modesSharedBody": "Один главный файл ключа создаётся один раз и устанавливается на каждый хост с помощью параметра <em>Использовать существующий файл ключа</em>. Управление проще: нужно защищать только один секрет, а любой хост может расшифровать архивы любого другого хоста (это полезно для консолидации, учебного восстановления на другом хосте или централизованной проверки резервных копий). Обратная сторона — утечка общего файла ключа ставит под угрозу сразу все хосты. Рекомендуется для домашних лабораторий и инфраструктур, в которых у всех хостов один владелец и общая граница доверия.",
"recoveryTitle": "Загрузка ключа в PBS — решение принимает пользователь",
"recoveryBody": "Сразу после выбора файла ключа ProxMenux задаёт один явный вопрос — <em>Загрузить ключ в PBS?</em> — с двумя вариантами ответа. <strong>Никакие данные для восстановления не загружаются в PBS, пока оператор не ответит «Да».</strong> По умолчанию выбран вариант <em>Нет, хранить только локально</em>: файл ключа остаётся по каноническому локальному пути, ProxMenux не загружает никаких данных для восстановления в PBS, а оператор самостоятельно обеспечивает хранение копии за пределами площадки (кнопка <em>Скачать файл ключа</em> в строке назначения PBS в Monitor позволяет скачать его по запросу). При выборе <em>Да, загрузить</em> появляется запрос парольной фразы для восстановления — её нужно ввести дважды, с проверкой совпадения. Затем ProxMenux шифрует файл ключа с использованием этой парольной фразы, AES-256-CBC и PBKDF2 (600 000 итераций, случайная соль), создавая <code>pbs-key.recovery.enc</code>. При каждом последующем создании зашифрованной резервной копии этот зашифрованный файл загружается в PBS как парная группа резервных копий. Ни парольная фраза, ни незашифрованная копия файла ключа не отправляются в PBS при этих загрузках. Этот выбор можно изменить позднее в Monitor в любое время: переключатель депонирования ключа непосредственно в строке назначения PBS меняет значение «Да»/«Нет», и изменение применяется немедленно («Начать загрузку», «Прекратить загрузку» или «Обновить парольную фразу» — в зависимости от текущего состояния).",
"blobUploadTitle": "Парная группа резервных копий в PBS",
"blobUploadBody1": "Если выбран ответ <em>Да, загрузить</em>, ProxMenux после каждого создания зашифрованной резервной копии загружает зашифрованный контейнер для восстановления в PBS как вторую, парную группу резервных копий с тем же именем, что и у группы хоста, но с окончанием <code>-keyrecovery</code>. В списке хранилища данных эти две группы расположены рядом: одна содержит резервные копии хоста, другая — зашифрованные контейнеры для восстановления. <strong>Контейнер никогда не покидает хост в незашифрованном виде</strong>: шифрование с помощью AES-256-CBC и PBKDF2 выполняется на самом хосте до передачи любых данных по сети (<code>openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt</code>). PBS получает только уже зашифрованный контейнер.",
"envelopeSecurityTitle": "Представляет ли загрузка файла keyrecovery в PBS угрозу безопасности?",
"envelopeSecurityBody": "Файл keyrecovery зашифрован как при передаче, так и при хранении. Парольная фраза для восстановления никогда не покидает хост: шифрование выполняется локально до загрузки, и PBS получает только уже зашифрованный результат. Администратор PBS или любой другой пользователь с доступом к хранилищу данных может скачать файл keyrecovery, но без парольной фразы для восстановления не сможет прочитать содержащийся в нём файл ключа: это недоступный для чтения шифротекст. Для восстановления файла ключа нужны одновременно обе составляющие — файл keyrecovery и парольная фраза, и только пользователь располагает ими обеими.",
"blobUploadConstraintTitle": "Почему используются две группы вместо одной зашифрованной",
"blobUploadConstraintBody": "Один вызов <code>proxmox-backup-client backup</code> либо шифрует все свои архивы одним и тем же файлом ключа, либо не шифрует ни одного — промежуточного варианта нет. Резервная копия хоста должна быть зашифрована с помощью файла ключа хоста, но зашифрованный контейнер для восстановления нельзя включить в ту же загрузку: тогда он оказался бы зашифрован тем самым файлом ключа, который в нём содержится. На хосте с только что переустановленной системой открыть его было бы невозможно (для расшифровки файла ключа потребовался бы сам файл ключа). Поэтому эти два объекта загружаются независимо и отображаются как две отдельные группы: резервная копия хоста шифруется клиентом PBS с помощью файла ключа, а контейнер для восстановления шифруется ProxMenux с помощью парольной фразы перед загрузкой. Два разных уровня шифрования защищают два разных объекта.",
"blobUploadImageAlt": "Интерфейс PBS, в котором группы резервных копий hostcfg-HOSTNAME и hostcfg-HOSTNAME-keyrecovery расположены рядом в списке хранилища данных.",
"blobUploadImageCaption": "Интерфейс PBS — парные группы резервных копий. Основная группа содержит резервные копии хоста, а группа -keyrecovery — файл ключа, зашифрованный с помощью парольной фразы.",
"recoverTitle": "Восстановление на новом хосте",
"recoverBody": "Если локальный файл ключа отсутствует по каноническому пути — на только что переустановленном хосте или после явного удаления, — процедура восстановления поочерёдно проверяет три источника и останавливается на первом, из которого удаётся получить пригодный файл ключа. Сначала, если для выбранного репозитория PBS по пути <code>/etc/pve/priv/storage/&lt;NAME&gt;.enc</code> имеется соответствующий файл ключа под управлением PVE, этот файл копируется по каноническому пути без дополнительных запросов. Затем, если на PBS доступна группа <code>-keyrecovery</code>, загружается самый новый снимок, а у пользователя запрашивается парольная фраза восстановления для его расшифровки. Наконец, если ни один из этих вариантов не сработал или пользователь от них отказался, предлагается ввести абсолютный путь к файлу ключа на этом хосте, после чего файл копируется по каноническому пути. В Monitor та же процедура импорта доступна непосредственно в модальном окне сведений о резервной копии: в верхней части окна появляется панель янтарного цвета, если для действий «Восстановить», «Скачать» или «Просмотреть содержимое» требуется файл ключа, который не установлен. Если файл ключа установлен, но не соответствует ключу, которым зашифрована резервная копия, PBS возвращает ошибку <code>wrong key — manifest's key XX does not match provided key YY</code>; при выполнении тех же трёх действий отображается структурированная панель янтарного цвета с отчётливо выделенным отпечатком требуемого ключа из манифеста, чтобы пользователь мог определить, какой файл ключа нужно импортировать для открытия именно этой резервной копии.",
"monitorManagementTitle": "Управление файлом ключа в Monitor",
"monitorManagementBody": "На странице настройки резервного копирования Monitor отображает элементы управления файлом ключа в каждой строке назначения PBS. В строке доступны три действия: <em>Скачать</em> сохраняет текущий файл ключа через браузер пользователя, <em>Загрузить</em> заменяет установленный файл ключа файлом, предоставленным пользователем (предыдущий файл перезаписывается только после того, как новый файл успешно размещён по нужному пути), а <em>Удалить</em> удаляет файл ключа с хоста. Рядом расположен переключатель для защищённого пакета восстановления: выбор «Да/Нет» для параметра <em>Загружать ключ в PBS?</em>, поле парольной фразы, которое появляется при выборе «Да», и кнопка, зависящая от текущего состояния: <em>Начать загрузку</em>, <em>Остановить загрузку</em> или <em>Обновить парольную фразу</em>. Элементы управления Monitor и диалог в командной оболочке выполняют одни и те же операции, поэтому результат на диске и в PBS одинаков независимо от выбранного способа."
},
"restoreAccess": {
"heading": "Получение архивов для восстановления",
"body": "Процедура восстановления обнаруживает резервные копии хоста ProxMenux на PBS, получая список групп резервного копирования в настроенном репозитории и фильтруя его по шаблону идентификатора резервной копии. На вкладке «Резервные копии» в Monitor отображается тот же список. При выборе резервной копии запускается <code>proxmox-backup-client restore</code> с теми же репозиторием, паролем и отпечатком (а также <code>--keyfile</code>, если резервная копия зашифрована). При этом <code>.pxar</code> извлекается в промежуточный каталог, содержимое которого <code>_rs_check_layout</code> затем передаёт в стандартный процесс восстановления. Для ручного извлечения вне ProxMenux та же команда извлекает архив по любому пути — полученное дерево каталогов можно просмотреть или использовать для восстановления вручную."
},
"references": {
"heading": "Справочные материалы",
"intro": "Официальная документация Proxmox Backup Server по компонентам, на которые опирается ProxMenux.",
"items": [
{
"label": "Документация Proxmox Backup Server",
"href": "https://pbs.proxmox.com/docs/",
"tail": " — основной раздел документации по установке, администрированию, хранению данных, пользователям и ролям."
},
{
"label": "proxmox-backup-client",
"href": "https://pbs.proxmox.com/docs/backup-client.html",
"tail": " — инструмент командной строки, который ProxMenux вызывает при каждом резервном копировании и восстановлении. Описывает идентификаторы и типы резервных копий, архивы, синтаксис репозиториев и переменные окружения."
},
{
"label": "Шифрование на стороне клиента",
"href": "https://pbs.proxmox.com/docs/backup-client.html#encryption",
"tail": " — создание файла ключа, режимы --kdf и модель шифрования, которую ProxMenux дополняет механизмом защищённого хранения ключа с помощью парольной фразы."
},
{
"label": "Управление хранилищами данных",
"href": "https://pbs.proxmox.com/docs/storage.html",
"tail": " — создание хранилищ данных для резервных копий хостов и управление ими, включая структуру хранилища блоков данных и права доступа."
},
{
"label": "Удаление устаревших резервных копий и сборка мусора",
"href": "https://pbs.proxmox.com/docs/maintenance.html#pruning",
"tail": " — модель хранения резервных копий, лежащая в основе --keep-last / --keep-daily / --keep-weekly и применяемая ProxMenux к каждому заданию по расписанию, а также описание того, как PBS освобождает блоки данных после удаления устаревших резервных копий."
}
]
}
}
@@ -0,0 +1,230 @@
{
"meta": {
"title": "Глоссарий — резервное копирование и восстановление | ProxMenux",
"description": "Глоссарий терминов и определений для системы резервного копирования и восстановления ProxMenux: шифрование, файл ключа, парольная фраза, защищённый пакет восстановления, PBS, блоки данных, rootfs, манифест, исполнитель заданий и подготовка системы к запуску с другим ядром.",
"ogTitle": "Глоссарий резервного копирования и восстановления | ProxMenux",
"ogDescription": "Понятные определения терминов, используемых в документации ProxMenux по резервному копированию и восстановлению.",
"twitterTitle": "Глоссарий резервного копирования и восстановления | ProxMenux",
"twitterDescription": "Парольная фраза, файл ключа, защищённый пакет восстановления, rootfs, манифест, PBS, блоки данных — все определения в одном месте."
},
"header": {
"title": "Глоссарий",
"description": "Термины, используемые в документации по резервному копированию и восстановлению, и их определения.",
"section": "Резервное копирование и восстановление"
},
"intro": {
"body": "Термины сгруппированы по темам. Каждая запись содержит термин и краткое определение."
},
"groups": [
{
"title": "Шифрование и восстановление ключа",
"intro": "Термины, относящиеся к шифрованию в PBS. Здесь используются два отдельных секрета: двоичный файл ключа и текстовая парольная фраза.",
"entries": [
{
"id": "passphrase-recuperacion",
"term": "Парольная фраза восстановления",
"def": "Текстовый пароль, который пользователь выбирает для защиты <a href=\"#sobre-recuperacion\">конверта восстановления</a>. Он запрашивается дважды с проверкой совпадения и используется только для шифрования конверта и его расшифровки, если потребуется восстановить файл ключа. <strong>Это не парольная фраза для разблокировки самого файла ключа</strong>, и он никогда не передаётся в PBS. При обычном резервном копировании он не покидает хост."
},
{
"id": "clave-cifrado",
"term": "Файл ключа (ключ шифрования)",
"def": "Файл ключа, который proxmox-backup-client использует для шифрования <a href=\"#chunk\">блоков данных</a> перед их загрузкой в PBS. Без соответствующего ключа прочитать зашифрованные данные резервной копии невозможно. ProxMenux сохраняет файл по пути <code>/usr/local/share/proxmenux/pbs-key.conf</code> с правами доступа <code>600</code>. Берегите его: <a href=\"#sobre-recuperacion\">конверт восстановления</a> предназначен для восстановления этого файла в случае его утраты."
},
{
"id": "contrasena-keyfile",
"term": "Парольная фраза файла ключа (парольная фраза KDF)",
"def": "Необязательная парольная фраза, которой может быть защищён сам файл ключа; она отличается от <a href=\"#passphrase-recuperacion\">парольной фразы восстановления</a>. Она существует только в том случае, если файл ключа был создан с <code>--kdf scrypt</code> (обычно это импортированный файл ключа). Без неё невозможно разблокировать файл ключа для использования. ProxMenux сохраняет её на хосте в зашифрованном виде, чтобы резервное копирование по расписанию могло выполняться без интерактивного запроса."
},
{
"id": "sobre-recuperacion",
"term": "Конверт восстановления",
"def": "<a href=\"#clave-cifrado\">Файл ключа</a> с дополнительным уровнем защиты: ещё до отправки с хоста он шифруется <a href=\"#passphrase-recuperacion\">парольной фразой восстановления</a> с использованием <a href=\"#aes-256-cbc\">AES-256-CBC</a> и <a href=\"#pbkdf2\">PBKDF2</a>. Именно этот конверт загружается в PBS как группа <code>-keyrecovery</code>. Без парольной фразы содержимое конверта недоступно: его скачивание из PBS не раскрывает файл ключа."
},
{
"id": "cifrado-cliente",
"term": "Шифрование на стороне клиента",
"def": "Модель шифрования, при которой данные шифруются на исходном хосте до загрузки. PBS получает и хранит исключительно зашифрованные данные; даже администратор PBS с доступом к хранилищу данных не может прочитать их без файла ключа. ProxMenux использует эту модель и дополняет её <a href=\"#sobre-recuperacion\">конвертом восстановления</a>."
},
{
"id": "kdf-none",
"term": "--kdf none",
"def": "Параметр команды <code>proxmox-backup-client key create</code>, позволяющий создать файл ключа без парольной фразы. Такой файл ключа можно использовать напрямую, без запроса ввода, что необходимо для автоматического выполнения заданий по расписанию. Именно этот вариант ProxMenux использует по умолчанию при создании нового файла ключа."
},
{
"id": "kdf-scrypt",
"term": "--kdf scrypt",
"def": "Параметр команды <code>proxmox-backup-client key create</code>, позволяющий создать файл ключа, защищённый <a href=\"#contrasena-keyfile\">парольной фразой файла ключа</a>. При каждом использовании файла ключа его необходимо разблокировать этой парольной фразой. ProxMenux поддерживает импорт таких файлов ключа и сохраняет парольную фразу в зашифрованном виде, чтобы резервное копирование по расписанию по-прежнему могло выполняться без участия пользователя."
},
{
"id": "aes-256-cbc",
"term": "AES-256-CBC",
"def": "Стандартный симметричный шифр. ProxMenux использует его (через <code>openssl enc -aes-256-cbc</code>) для шифрования <a href=\"#clave-cifrado\">файла ключа</a> с помощью <a href=\"#passphrase-recuperacion\">парольной фразы восстановления</a> и создания <a href=\"#sobre-recuperacion\">конверта</a>."
},
{
"id": "pbkdf2",
"term": "PBKDF2",
"def": "Криптографическая функция, преобразующая введённую пользователем парольную фразу в двоичный ключ, пригодный для шифрования. Она замедляет попытки перебора за счёт многократного выполнения вычислений. При шифровании конверта восстановления ProxMenux использует эту функцию с 600 000 итераций и случайной солью."
}
]
},
{
"title": "Структура резервной копии",
"intro": "Термины, описывающие содержимое резервной копии независимо от места её хранения.",
"entries": [
{
"id": "rootfs",
"term": "rootfs / корневая файловая система",
"def": "Прямая копия файловой системы исходного хоста, которую <code>rsync</code> создаёт на основе <a href=\"#perfil-defecto\">профиля по умолчанию</a> с добавлением всех <a href=\"#rutas-personalizadas\">пользовательских путей</a>. Это не образ всего диска: копируются только пути, содержащие конфигурацию или данные о состоянии, которые Proxmox не может воссоздать самостоятельно."
},
{
"id": "manifiesto",
"term": "Манифест (manifest.json)",
"def": "Структурированный документ JSON, описывающий исходный хост на момент создания резервной копии: оборудование, хранилища, ядро, компоненты, установленные средствами ProxMenux, и перечень виртуальных машин и контейнеров LXC. Он формируется шестью независимыми сборщиками данных. Процесс восстановления использует его для сравнения исходного и целевого хостов."
},
{
"id": "staging",
"term": "Промежуточный каталог",
"def": "Временный каталог, в котором ProxMenux собирает три блока (rootfs, метаданные и манифест) перед их упаковкой и загрузкой в место назначения. Он удаляется автоматически по окончании резервного копирования, в том числе при прерывании."
},
{
"id": "perfil-defecto",
"term": "Профиль по умолчанию",
"def": "Подобранный набор путей, которые ProxMenux по умолчанию копирует при каждом резервном копировании. Включает конфигурацию PVE, настройки сети, SSH, ядро, apt, инструменты ProxMenux и многое другое. Он определён в коде и описан на странице <em>Как это работает</em>."
},
{
"id": "rutas-personalizadas",
"term": "Пользовательские пути",
"def": "Дополнительные пути, которые пользователь добавляет к <a href=\"#perfil-defecto\">профилю по умолчанию</a>. Они могут быть постоянными (сохраняются в <code>backup-extra-paths.txt</code>) или задаваться для отдельного запуска (выбираются в пользовательском режиме)."
}
]
},
{
"title": "Места назначения и хранение",
"intro": "Термины, связанные с местом сохранения резервной копии — сервером PBS, локальным архивом или репозиторием Borg — и с тем, как PBS организует данные.",
"entries": [
{
"id": "repositorio-pbs",
"term": "Репозиторий PBS",
"def": "Сочетание Proxmox Backup Server, <a href=\"#datastore\">хранилища данных</a> и пользователя, от имени которого принимается резервная копия. Идентифицируется строкой <code>user@realm@host:datastore</code>. Один сервер PBS может размещать несколько репозиториев."
},
{
"id": "datastore",
"term": "Хранилище данных",
"def": "Конкретное хранилище на сервере PBS, в котором находятся резервные копии и их блоки данных. Каждое хранилище данных размещается в файловой системе сервера PBS и имеет собственные права доступа и политики."
},
{
"id": "chunk",
"term": "Блок данных / дедупликация блоков данных",
"def": "PBS разбивает каждую резервную копию на блоки переменного размера, идентифицирует каждый блок по его хешу и сохраняет его только один раз, даже если он встречается во множестве разных резервных копий. Поэтому последующие резервные копии одного узла, а также копии похожих узлов занимают очень мало дополнительного места."
},
{
"id": "fingerprint",
"term": "Отпечаток",
"def": "Криптографический отпечаток TLS-сертификата сервера PBS. Он позволяет клиенту проверить, что соединение установлено именно с нужным сервером, не полагаясь на общедоступный центр сертификации. ProxMenux передаёт его в <code>proxmox-backup-client</code> через переменную окружения <code>PBS_FINGERPRINT</code>."
},
{
"id": "grupo-copia",
"term": "Группа резервных копий",
"def": "Логический контейнер в PBS, в котором накапливаются последовательные резервные копии одного и того же объекта. Каждая новая резервная копия использует дедупликацию совместно с предыдущими копиями той же группы. При включённом шифровании ProxMenux использует две группы для каждого узла: одну для резервной копии узла и другую с суффиксом <code>-keyrecovery</code> для <a href=\"#sobre-recuperacion\">пакета восстановления</a>."
},
{
"id": "backup-id",
"term": "Идентификатор резервной копии",
"def": "Имя <a href=\"#grupo-copia\">группы резервных копий</a>. ProxMenux по умолчанию использует <code>hostcfg-HOSTNAME</code> и позволяет пользователю изменить это имя перед отправкой; неподдерживаемые символы удаляются автоматически."
},
{
"id": "pxar",
"term": ".pxar",
"def": "Собственный формат архивов каталогов PBS. Он работает подобно tar, оптимизированному для дедупликации блоков данных: вместо хранения файла как единого непрозрачного объекта PBS разбивает его содержимое на блоки, которые можно использовать повторно."
}
]
},
{
"title": "Выполнение и планирование",
"intro": "Термины, используемые в системе заданий по расписанию ProxMenux.",
"entries": [
{
"id": "runner",
"term": "Исполнитель заданий",
"def": "Скрипт <code>run_scheduled_backup.sh</code>, выполняющий резервное копирование по расписанию. Он читает конфигурацию задания, запускает соответствующий механизм резервного копирования (локальный, PBS или Borg), после успешного выполнения применяет правила хранения и отправляет настроенные уведомления."
},
{
"id": "trabajo-programado",
"term": "Задание по расписанию",
"def": "Сохранённая конфигурация периодического резервного копирования. Содержит место назначения, учётные данные, параметры шифрования, расписание и правила хранения. Находится в <code>/var/lib/proxmenux/backup-jobs/&lt;id&gt;.env</code>."
},
{
"id": "modo-adjunto",
"term": "Режим подключения",
"def": "Задание без собственного таймера. Хук job-end PVE <code>vzdump</code> запускает его после резервного копирования гостевых систем, если целевое хранилище совпадает. Выбранное родительское задание задаёт хранилище и политику хранения, которая заново считывается из родительского задания при каждом запуске. Однако хук сопоставляет хранилище, а не идентификатор родительского задания, поэтому другая задача, использующая это хранилище, также может вызвать запуск. Поддерживается только для локального хранилища и PBS."
},
{
"id": "timer-systemd",
"term": "Таймер systemd",
"def": "Стандартный механизм systemd, запускающий команду по календарному расписанию. ProxMenux создаёт отдельный таймер для каждого <em>независимого</em> задания с расписанием; задания <a href=\"#modo-adjunto\">в режиме привязки</a> не используют таймер и запускаются через скрипт-хук PVE."
},
{
"id": "retencion",
"term": "Политика хранения (keep-last, keep-daily…)",
"def": "Политика, определяющая, какие старые резервные копии сохранять, а какие удалять. Задаётся для каждого задания с помощью таких параметров, как <code>keep-last</code>, <code>keep-daily</code>, <code>keep-weekly</code>, <code>keep-monthly</code>. Применяется исполнителем задания после каждого успешного резервного копирования."
}
]
},
{
"title": "Восстановление",
"intro": "Термины, используемые в процессе восстановления.",
"entries": [
{
"id": "restauracion-universal",
"term": "Универсальное восстановление",
"def": "В процессе восстановления ProxMenux не просто извлекает файловую систему: он читает манифест, чтобы выявить различия между исходной и целевой системами, воссоздаёт конфигурацию системы и повторно запускает установщики компонентов, управляемых ProxMenux. Цель — воссоздать исходный узел, а не просто извлечь архив."
},
{
"id": "hidratacion",
"term": "Гидратация (при смене ядра)",
"def": "Этап восстановления, на котором пользовательские настройки исходной системы (параметры IOMMU, идентификаторы устройств VFIO, пользовательские обходные решения, ключи GRUB) объединяются со свежей загрузочной конфигурацией целевой системы без дословного копирования файлов исходной системы, привязанных к ядру. Выполняется, если ядро целевой системы новее ядра системы из резервной копии."
},
{
"id": "cross-kernel",
"term": "Восстановление с другой версией ядра",
"def": "Восстановление, при котором ядро целевой системы отличается от ядра исходной системы (обычно оно новее). Требует этапа <a href=\"#hidratacion\">гидратации</a>, чтобы не переносить файлы, несовместимые с ядром целевой системы."
},
{
"id": "instalador-postboot",
"term": "Установщик после загрузки",
"def": "Компоненты, повторно устанавливаемые после первой загрузки восстановленного узла (драйверы NVIDIA, драйверы TPU Coral, инструменты для GPU AMD и Intel). Каждый установщик работает с ядром целевой системы, поэтому восстановленный узел не зависит от наличия ядра исходной системы."
},
{
"id": "compatibility-check",
"term": "Проверка совместимости",
"def": "Сравнение манифеста исходной системы с состоянием целевой системы, которое ProxMenux выполняет в начале восстановления. По его результатам определяется, какие части копируются без изменений, какие требуют гидратации, а какие воссоздаются установщиком."
},
{
"id": "equipo-recien-instalado",
"term": "Чистая установка",
"def": "Узел, только что переустановленный с нуля, без локального <a href=\"#clave-cifrado\">файла ключа</a>. Для восстановления зашифрованной резервной копии сначала необходимо восстановить файл ключа из <a href=\"#sobre-recuperacion\">конверта</a>, хранящегося на PBS, с помощью <a href=\"#passphrase-recuperacion\">парольной фразы восстановления</a>."
}
]
}
],
"whereNext": {
"heading": "Что читать дальше",
"items": [
{
"label": "Как это работает",
"href": "/docs/backup-restore/how-it-works",
"tail": " — место rootfs, манифеста и перечня приложений в структуре резервной копии."
},
{
"label": "Целевое хранилище Proxmox Backup Server",
"href": "/docs/backup-restore/destinations/pbs",
"tail": " — подробная документация по шифрованию на стороне клиента, файлу ключа, парольной фразе восстановления и конверту."
},
{
"label": "Восстановление",
"href": "/docs/backup-restore/restoring",
"tail": " — процесс восстановления и использование манифеста."
}
]
}
}
@@ -0,0 +1,205 @@
{
"meta": {
"title": "Как устроен ProxMenux Backup — rootfs, манифест, приложения",
"description": "Подробный разбор содержимого резервной копии ProxMenux: rootfs, полученная с помощью rsync по профилю путей по умолчанию, структурированный манифест, сформированный шестью независимыми сборщиками, и перечень приложений, на основе которого выполняется автоматическая переустановка пакетов и компонентов после восстановления.",
"ogTitle": "Как устроено резервное копирование ProxMenux",
"ogDescription": "Три составляющие резервной копии ProxMenux: rootfs, манифест и приложения.",
"twitterTitle": "Как работает резервное копирование ProxMenux | ProxMenux",
"twitterDescription": "Три составляющие резервной копии ProxMenux и то, как при восстановлении на их основе воссоздаётся исходный хост."
},
"header": {
"title": "Как это работает",
"description": "Внутренняя структура резервной копии ProxMenux — файловая система, манифест и перечень приложений — и то, как все три составляющие используются при восстановлении для воссоздания исходного хоста на целевом хосте, ядро которого может отличаться.",
"section": "Резервное копирование и восстановление"
},
"intro": {
"title": "Один архив, три составляющие",
"body": "При каждом резервном копировании создаётся структура каталогов с тремя чётко определёнными составляющими в едином промежуточном корневом каталоге. Архив, загружаемый в место назначения (локальный <code>.tar.zst</code>, резервная копия PBS или архив Borg), содержит именно эту структуру. При восстановлении используются все три составляющие: <strong>манифест</strong> проверяется до применения изменений, чтобы выявить расхождения и решить, что пропустить; <strong>rootfs</strong> содержит файлы конфигурации, которые применяются к работающей системе или откладываются до перезагрузки; а <strong>перечень приложений</strong> определяет установку пакетов и переустановку компонентов после загрузки. Каждую составляющую можно просмотреть или извлечь отдельно."
},
"layout": {
"heading": "Структура архива",
"intro": "Все архивы имеют одинаковую структуру дерева независимо от места назначения. Подкаталог <code>metadata/</code> содержит структурированные данные, а подкаталог <code>rootfs/</code> — копию файловой системы.",
"treeCaption": "Структура промежуточного каталога, создаваемая при резервном копировании. В каждое место назначения передаётся одно и то же дерево, адаптированное к соответствующему формату: tar для локального хранения, блоки PBS для PBS, сегменты borg для Borg.",
"tree": "backup-[timestamp]/\n├── manifest.json # structured host state\n├── metadata/\n│ ├── packages.manual.list # apt-mark showmanual\n│ ├── run_info.env # backup run identity + kernel version + pmxcfs method\n│ ├── selected_paths.txt # exact list of paths that reached rootfs/\n│ └── missing_paths.txt # paths from the profile absent on source\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, …\n ├── root/ # /root (with volatile subdirs excluded)\n ├── usr/local/ # /usr/local/bin, /usr/local/share/proxmenux, …\n └── var/ # /var/lib/pve-cluster (config.db via sqlite3 .backup), /var/spool/cron/…"
},
"rootfs": {
"heading": "Составляющая rootfs",
"intro": "Дерево <code>rootfs/</code> представляет собой <strong>обычную копию файловой системы</strong>, созданную с помощью <code>rsync</code> на исходном хосте. Оно содержит тщательно подобранный <strong>профиль путей по умолчанию</strong>, важных для восстановления Proxmox, а также любые <strong>пользовательские пути</strong>, добавленные пользователем в задание резервного копирования или в интерактивном сеансе. Набор намеренно ограничен: включены только пути, которые либо <em>содержат конфигурацию</em>, либо <em>содержат данные состояния, которые Proxmox не может воссоздать самостоятельно</em>.",
"defaultProfileTitle": "Профиль по умолчанию",
"defaultProfileBody": "Профиль по умолчанию задаётся <code>hb_default_profile_paths</code> в <code>lib_host_backup_common.sh</code>. Он охватывает восемь фиксированных категорий, а также данные состояния ZFS, включаемые при определённых условиях. Вместе они описывают работоспособный хост Proxmox:",
"categoriesTitle": "Категории путей",
"categoryRows": [
{
"category": "Основные компоненты PVE",
"paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf",
"why": "Содержимое кластерной файловой системы и настройки vzdump по умолчанию. База данных pmxcfs (<code>config.db</code>) сохраняется в виде согласованного снимка с помощью <code>sqlite3 .backup</code> без остановки кластера, а сопутствующие файлы <code>.db-wal</code> / <code>.db-shm</code> исключаются из копирования rsync. Если <code>sqlite3</code> недоступен, вместо этого сохраняется <code>config.db.raw-fallback</code>, который при восстановлении автоматически используется для воссоздания базы данных."
},
{
"category": "Идентификационные данные хоста и сеть",
"paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network",
"why": "Всё, что необходимо хосту для подключения к сети с прежними идентификационными данными. Файлы <code>.link</code> в <code>/etc/systemd/network</code> привязывают имена сетевых адаптеров к их MAC-адресам, поэтому переустановка и изменения оборудования не приводят к переименованию интерфейсов."
},
{
"category": "Доступ и аутентификация",
"paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security",
"why": "Ключи SSH, правила sudo и конфигурация PAM. Их потеря лишает пользователя доступа к восстановленному хосту."
},
{
"category": "Ядро и загрузка",
"paths": "/etc/default/grub, /etc/kernel, /etc/modules, /etc/modules-load.d, /etc/modprobe.d, /etc/sysctl.conf, /etc/sysctl.d, /etc/udev/rules.d, /etc/fstab, /etc/iscsi, /etc/multipath",
"why": "Параметры IOMMU, списки запрещённых модулей, идентификаторы устройств VFIO, таблица монтирования, конфигурация стека хранения."
},
{
"category": "Оболочка и локаль",
"paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf",
"why": "Общесистемная настройка оболочки, переменные окружения, конфигурация генерации локалей."
},
{
"category": "Пакеты и cron",
"paths": "/etc/apt, /etc/cron.d, /etc/cron.{daily,hourly,weekly,monthly}, /etc/cron.allow, /etc/cron.deny, /var/spool/cron/crontabs",
"why": "Источники APT для согласованного разрешения зависимостей пакетов, запланированные задачи, заданные пользователем."
},
{
"category": "Состояние и инструменты ProxMenux",
"paths": "/etc/proxmenux, /etc/systemd/system, /etc/log2ram.conf, /etc/logrotate.conf, /etc/logrotate.d, /etc/lm-sensors, /etc/sensors3.conf, /etc/fail2ban, /etc/snmp, /etc/postfix, /etc/wireguard, /etc/openvpn, /etc/grafana, /etc/influxdb, /etc/prometheus, /etc/telegraf, /etc/zabbix",
"why": "Необязательные, но часто используемые инструменты Proxmox. Отсутствующие пути отмечаются в <code>metadata/missing_paths.txt</code> без остановки резервного копирования."
},
{
"category": "Исполняемые файлы ProxMenux и root",
"paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (подкаталоги с временными данными исключены)",
"why": "Исполняемые файлы, установленные через ProxMenux, и пользовательская конфигурация в <code>/root</code>. Пути с временными данными (<code>.bash_history</code>, <code>.cache/</code>, <code>tmp/</code>, <code>.local/share/Trash/</code>) исключаются из копии. <code>/var/lib/proxmenux</code> содержит запланированные задания резервного копирования и состояние хоста, сохраняемое ProxMenux; промежуточные данные восстановления, копии для отката и маркеры после восстановления исключаются, поскольку они относятся к хосту, на котором выполняется восстановление."
},
{
"category": "Состояние ZFS (при выполнении условия)",
"paths": "/etc/zfs",
"why": "Включается только в том случае, если на исходном хосте работает ZFS. Содержит <code>zpool.cache</code> и <code>hostid</code>."
}
],
"customTitle": "Расширение профиля пользовательскими путями",
"customBody": "Помимо профиля по умолчанию, ProxMenux предлагает два способа включить дополнительные пути в резервную копию. Они сочетаются без конфликтов и применяются как к интерактивному резервному копированию, так и к запланированным заданиям.",
"customExtrasTitle": "1. Постоянные дополнения (файл для каждого хоста)",
"customExtrasBody": "Текстовый файл <code>/usr/local/share/proxmenux/backup-extra-paths.txt</code> содержит список абсолютных путей, для которых пользователь на этом хосте выбрал «включать всегда». При запуске резервного копирования в режиме <strong>По умолчанию</strong> ProxMenux автоматически добавляет эти пути к профилю по умолчанию без запроса подтверждения. Файл редактируется через интерфейс — ручное редактирование не требуется — и сохраняется после перезагрузок и обновлений. Каждый абсолютный путь указывается в отдельной строке; допускаются комментарии <code>#</code>.",
"customModeTitle": "2. Пользовательский режим (для отдельного запуска)",
"customModeBody": "При запуске резервного копирования в режиме <strong>Пользовательский</strong> вместо автоматического применения профиля по умолчанию отображается список выбора всех путей: записей профиля по умолчанию и постоянных дополнений (с префиксом <code>[+]</code> и уже установленными флажками). Пользователь устанавливает или снимает флажки для конкретного запуска, а также может нажать <em>Добавить пользовательский путь</em>, чтобы ввести новый путь, который затем сохраняется в файле дополнений для будущих резервных копий.",
"customMissingTitle": "Пути, отсутствующие на исходном хосте",
"customMissingBody": "Любой путь из профиля (по умолчанию или добавленный), который отсутствует на исходном хосте, записывается в <code>metadata/missing_paths.txt</code> внутри архива. Резервное копирование не завершается ошибкой и не останавливается — в конце пользователь видит сводку заархивированных и отсутствующих путей. На практике это происходит с путями необязательных инструментов, например <code>/etc/wireguard</code> или <code>/etc/prometheus</code>, если эти инструменты не установлены."
},
"manifest": {
"heading": "Содержимое манифеста",
"intro": "<code>manifest.json</code> — это структурированный документ JSON, описывающий исходный хост на момент создания резервной копии. Его формируют <strong>шесть независимых сборщиков</strong>, работой которых управляет <code>build_manifest.sh</code>. Каждый сборщик работает в режиме «только для чтения», создаёт фрагмент JSON с чётко определённой структурой и в случае сбоя возвращает безопасное пустое значение по умолчанию — манифест остаётся пригодным для использования, даже если один из разделов неполон.",
"orchestratorCaption": "Шесть сборщиков формируют манифест. Каждый сборщик работает в отдельном подпроцессе; при сбое одного из них используется документированное безопасное значение по умолчанию и выдаётся предупреждение, но резервное копирование не прерывается.",
"collectorRows": [
{
"collector": "collect_source_host.sh",
"produces": "source_host",
"content": "Имя хоста, версия PVE (<code>pveversion</code>), версия PBS, если хост выполняет роль сервера резервного копирования, ядро (<code>uname -r</code>), режим загрузки (efi/bios), тип корневой файловой системы, модель и архитектура процессора, объём памяти в КБ."
},
{
"collector": "collect_hardware.sh",
"produces": "hardware_inventory",
"content": "Графические процессоры (с указанием производителя и соответствующего установщика ProxMenux), TPU (Coral USB и M.2 с обнаружением <code>lsusb</code>/<code>lspci</code>), сетевые адаптеры (с MAC-адресом, слотом PCI и принадлежностью к сетевому мосту), беспроводные устройства. Записи графических процессоров содержат эвристический признак <code>passthrough_eligible</code>."
},
{
"collector": "collect_storage.sh",
"produces": "storage_inventory",
"content": "Пулы ZFS (с указанием типа пула и дисков в его составе, для которых определяются пути <code>/dev/disk/by-id/*</code>, <code>/dev/disk/by-partuuid/*</code> или исходные пути <code>/dev/sdX</code> в зависимости от способа создания каждого пула), группы томов LVM и тонкие пулы, физические диски с поддержкой SMART, записи PVE <code>storage.cfg</code>, внешние точки монтирования."
},
{
"collector": "collect_kernel.sh",
"produces": "kernel_params",
"content": "Параметры, добавленные пользователем в <code>/proc/cmdline</code> (без стандартных параметров, таких как <code>BOOT_IMAGE=</code>, <code>root=</code>, <code>ro/rw</code>, <code>quiet</code>, <code>splash</code>), модули, загружаемые при запуске, из <code>/etc/modules</code>, и пути к файлам <code>/etc/modprobe.d/*.conf</code>, содержащим реальные директивы (<code>options</code>, <code>blacklist</code>, <code>install</code>, <code>alias</code>, <code>softdep</code>)."
},
{
"collector": "collect_proxmenux_state.sh",
"produces": "proxmenux_installed_components",
"content": "Считывает <code>/usr/local/share/proxmenux/managed_installs.json</code> (реестр всего, что установлено с помощью ProxMenux) и <code>installed_tools.json</code>. В каждой записи сохраняется путь к установщику (<code>menu_script</code>), чтобы при восстановлении можно было запустить ту же процедуру установки."
},
{
"collector": "collect_guests.sh",
"produces": "vms_lxcs_at_backup",
"content": "Перечисляет виртуальные машины (<code>qm list</code>) и контейнеры LXC (<code>pct list</code>), существовавшие на момент создания резервной копии: VMID, имя, текущее состояние. Это только перечень: за сами данные гостевых систем отвечают <code>vzdump</code> / PBS."
}
],
"schemaTitle": "Проверка соответствия схеме",
"schemaBody": "В состав ProxMenux входит шаблон, описывающий обязательные поля манифеста и структуру каждого из них. При создании резервной копии манифест можно автоматически проверить на соответствие этому шаблону, чтобы сразу обнаружить сборщик, сформировавший некорректный JSON или поле с ошибкой в имени. Эта проверка предназначена для разработки самого ProxMenux: в системе, где он не установлен, резервное копирование работает как обычно, а манифест по-прежнему создаётся."
},
"applications": {
"heading": "Перечень приложений",
"intro": "Два перечня учитывают программное обеспечение, установленное на исходной системе сверх базового набора пакетов Proxmox VE: список пакетов в <code>metadata/</code> и реестр компонентов внутри rootfs, подробно описанные ниже. При восстановлении они используются для повторной установки пользовательского программного обеспечения через APT или собственные установщики ProxMenux — в зависимости от первоначального способа установки.",
"packagesTitle": "packages.manual.list",
"packagesBody": "Текстовый список, создаваемый с помощью <code>apt-mark showmanual</code>: все пакеты APT, которые были <em>явно установлены</em> на исходном хосте, в алфавитном порядке. Пакеты, установленные как зависимости базового ISO-образа Proxmox VE, в него не входят (APT целевой системы автоматически загрузит их заново). При восстановлении список считывается с помощью <code>_rs_run_complete_extras</code> и проходит трёхэтапную <em>фильтрацию с защитой от каскадного удаления</em> (<code>dpkg -s</code> для уже установленных пакетов, обнаружение пакетов библиотек того же семейства с другой основной версией, <code>apt-get install --simulate</code> для оценки риска каскадного удаления), после чего пакеты устанавливаются с помощью <code>apt-get install -y</code>.",
"componentsTitle": "components_status.json (часть rootfs)",
"componentsBody": "Реестр JSON в <code>/usr/local/share/proxmenux/</code>, в котором для каждого компонента, установленного с помощью ProxMenux, записывается точное состояние: версия, флаги, специфичные для ProxMenux (для NVIDIA — логическое значение <code>patched</code>; для Coral — версия DKMS). Этот файл находится внутри rootfs, а не в <code>metadata/</code>, поскольку он <em>считывается после того, как</em> rootfs скопирована в целевую систему. Диспетчер, запускаемый после загрузки (<code>apply_cluster_postboot.sh</code>), перебирает записи реестра и запускает обработчик <code>--auto-reinstall</code> каждого компонента, который считывает сохранённое состояние и повторяет установку для текущего ядра целевой системы.",
"componentInstallersTitle": "Установщики компонентов",
"componentInstallersBody": "В настоящее время четыре установщика ProxMenux предоставляют точку входа <code>--auto-reinstall</code>:",
"installerRows": [
{
"component": "nvidia_driver",
"installer": "gpu_tpu/nvidia_installer.sh",
"action": "Считывает <code>version</code> и <code>patched</code>. Загружает точно такой же установочный файл NVIDIA, собирает модули DKMS для ядра целевой системы и повторно применяет исправление ProxMenux, если оно было применено в исходной системе."
},
{
"component": "coral_driver",
"installer": "gpu_tpu/install_coral.sh",
"action": "Считывает версию драйвера Coral. Компилирует модуль DKMS для ядра целевой системы."
},
{
"component": "amdgpu_top",
"installer": "gpu_tpu/amd_gpu_tools.sh",
"action": "Считывает сохранённую версию. Повторно загружает тот же самый <code>.deb</code> из выпуска GitHub."
},
{
"component": "intel_gpu_tools",
"installer": "gpu_tpu/intel_gpu_tools.sh",
"action": "Устанавливает пакет через APT. Если пакет уже установлен из <code>packages.manual.list</code>, повторная установка не выполняется."
}
]
},
"restoreFlow": {
"heading": "Как при восстановлении используются три набора данных",
"intro": "Восстановление выполняется в шесть этапов. Каждый этап считывает определённую часть архива и обновляет целевой узел. Ни на одном этапе не требуется доступ к исходному узлу — архив полностью самодостаточен.",
"stagesCaption": "На этапе 1 манифест определяет, какие элементы следует затронуть. На этапе 2 копируются пути rootfs, которые безопасно применять в работающей системе. На этапе 3 потенциально опасные пути подготавливаются к применению при следующей загрузке. На этапе 3b импортируются некорневые пулы данных ZFS, все диски которых доступны. На этапе 4 обрабатываются пакеты. Этап 5 выполняется после перезагрузки и переустанавливает компоненты с учётом ядра целевого узла.",
"stageRows": [
{
"stage": "1",
"name": "Проверка совместимости",
"reads": "manifest.json",
"action": "Запускает <code>hb_compat_check</code>. Сравнивает оборудование исходного и целевого узлов (сетевые интерфейсы, идентификаторы хранилищ), версию PVE и основную версию ядра. Устанавливает <code>HB_COMPAT_KERNEL_DIRECTION</code> (<code>same</code>, <code>bk_newer</code> или <code>bk_older</code>) и заполняет <code>RS_SKIP_PATHS</code> исключениями, связанными с различиями в оборудовании и версиях ядра."
},
{
"stage": "2",
"name": "Применение в работающей системе",
"reads": "rootfs/ (только безопасные пути)",
"action": "<code>_rs_apply … hot</code> копирует записи <code>hb_classify_path</code>=<code>hot</code> непосредственно на работающий целевой узел. Всё, что находится в <code>/etc/pve</code>, <code>/etc/network</code>, а также пути с классификацией <em>reboot</em>/<em>dangerous</em> откладываются до следующей загрузки."
},
{
"stage": "3",
"name": "Подготовка отложенного применения",
"reads": "rootfs/ (пути, требующие перезагрузки, и опасные пути)",
"action": "<code>_rs_prepare_pending_restore</code> размещает потенциально опасные пути в <code>/var/lib/proxmenux/restore-pending/&lt;restore_id&gt;/</code> (с доступом по ссылке <code>current</code>), записывает <code>plan.env</code>, <code>apply-on-boot.list</code> и <code>rs-skip-paths.txt</code> и включает <code>proxmenux-restore-onboot.service</code> для запуска при следующей загрузке."
},
{
"stage": "3b",
"name": "Импорт пулов данных",
"reads": "manifest.storage_inventory + состояние ZFS на целевом узле",
"action": "<code>_rs_import_data_pools</code> импортирует каждый некорневой пул ZFS, все диски которого присутствуют на целевом узле. Для пулов с чужим hostid выполняется повторная попытка с <code>zpool import -f</code>. Пулы, у которых отсутствует хотя бы один диск, пропускаются с предупреждением. Результат для каждого пула записывается в <code>/var/log/proxmenux/restore-datapools-&lt;timestamp&gt;.log</code>."
},
{
"stage": "4",
"name": "Установка пакетов",
"reads": "metadata/packages.manual.list",
"action": "<code>_rs_run_complete_extras</code> запускает фильтр защиты от каскадных изменений и вызывает <code>apt-get install -y</code> со списком пакетов, прошедших фильтрацию. Полный вывод записывается в <code>/var/log/proxmenux/restore-apt-*.log</code>."
},
{
"stage": "5",
"name": "После загрузки",
"reads": "rootfs (уже применён) + components_status.json",
"action": "После перезагрузки <code>apply_pending_restore.sh</code> применяет отложенные пути, а <code>apply_cluster_postboot.sh</code> запускает <code>update-initramfs</code>, <code>update-grub</code> (или <code>proxmox-boot-tool refresh</code>), затем перебирает <code>components_status.json</code>, вызывая обработчик <code>--auto-reinstall</code> каждого компонента."
}
]
},
"whyItWorks": {
"heading": "Почему используется разделение на три набора данных",
"body": "Это разделение определяется не файловой системой, а <strong>жизненным циклом</strong>. Содержимое файловой системы переносится с помощью <code>rsync</code>: быстро, прозрачно и атомарно для каждого файла. Состояние конфигурации, которое при восстановлении необходимо интерпретировать до внесения изменений на целевом узле, переносится в виде <strong>структурированного JSON</strong>: его можно читать независимо от остальных данных, версионировать с помощью схемы и программно сравнивать с собственным состоянием целевого узла. Программное обеспечение, которое необходимо переустановить с учётом окружения целевого узла, представлено в виде <strong>перечня</strong>: только названия и версии, а выбор конкретных двоичных файлов остаётся за менеджером пакетов целевого узла и собственными установщиками ProxMenux. Каждый набор данных оптимизирован для своей задачи, а вместе они обеспечивают восстановление, задуманное как единая атомарная операция, но устойчивое к сбоям на практике: даже при повреждённом манифесте rootfs можно восстановить; даже при отсутствии пакета компоненты можно установить; сбой установщика на одном компоненте не останавливает установку следующего."
}
}
@@ -0,0 +1,93 @@
{
"meta": {
"title": "ProxMenux Backup & Restore — обзор | Полное резервное копирование и восстановление узла для Proxmox VE",
"description": "ProxMenux Backup & Restore сохраняет полное состояние узла Proxmox — файловую систему, структурированный манифест конфигурации и установленные пакеты и компоненты — и воспроизводит его на том же или другом узле. Резервное копирование и восстановление полностью самодостаточны: внешние зависимости отсутствуют, а восстановление с переходом между версиями ядра поддерживается благодаря фильтру безопасного подмножества данных, учитывающему направление перехода, и развёртыванию компонентов, не зависящему от версии ядра.",
"ogTitle": "ProxMenux: резервное копирование и восстановление — обзор",
"ogDescription": "Полное резервное копирование и восстановление хоста Proxmox VE со структурированным манифестом, списком пакетов и средствами переустановки компонентов.",
"twitterTitle": "ProxMenux: резервное копирование и восстановление | ProxMenux",
"twitterDescription": "Полное резервное копирование и восстановление хоста Proxmox VE со структурированным манифестом, списком пакетов и средствами переустановки компонентов."
},
"header": {
"title": "Резервное копирование и восстановление",
"description": "Полное резервное копирование и восстановление хоста Proxmox VE. Сохраняет файловую систему, конфигурацию и установленные компоненты в едином архиве и позволяет воссоздать хост в той же или другой установленной системе Proxmox без внешних зависимостей.",
"section": "Резервное копирование и восстановление"
},
"intro": {
"title": "Что это такое — в одном абзаце",
"body": "Резервная копия ProxMenux сохраняет полное состояние хоста Proxmox: <strong>файловую систему</strong> (соответствующие каталоги в <code>/etc</code>, <code>/root</code>, <code>/var/lib/pve-cluster</code>, а также дополнительные пользовательские пути), <strong>структурированный манифест</strong> (JSON с обнаруженным оборудованием, параметрами ядра, сетевой конфигурацией, состоянием ZFS, пользователями и заданиями cron) и <strong>перечень приложений</strong> (все пакеты, отмеченные в APT как установленные вручную, а также список компонентов, установленных с помощью ProxMenux, с указанием их точных версий). В любое из трёх поддерживаемых мест назначения — локальный архив, Proxmox Backup Server (рекомендуется) или Borg — сохраняется один и тот же самодостаточный набор данных. Любой из этих вариантов позволяет восстановить целевой хост, даже если исходный хост недоступен во время восстановления."
},
"video": {
"heading": "Видеоинструкция",
"intro": "Хотите увидеть резервное копирование и восстановление в действии перед настройкой? В этой видеоинструкции показан полный цикл работы с этой функцией в ProxMenux.",
"title": "ProxMenux — видеоинструкция по резервному копированию и восстановлению",
"caption": "Внешнее видео на YouTube. Воспроизводится в режиме повышенной конфиденциальности (файлы cookie не используются, пока вы не запустите воспроизведение)."
},
"whatItIsNot": {
"heading": "Для чего эта функция не предназначена",
"intro": "В этом разделе рассматриваются резервное копирование и восстановление <strong>на уровне хоста</strong>: самой установки Proxmox, а не работающих в ней виртуальных машин и контейнеров.",
"items": [
"<strong>Это не инструмент резервного копирования ВМ и контейнеров.</strong> Эта функция не сохраняет диски и состояние оперативной памяти гостевых систем; для этого предназначен <code>vzdump</code>. При этом <strong>файлы конфигурации</strong> гостевых систем (<code>/etc/pve/nodes/&lt;node&gt;/qemu-server/*.conf</code> и <code>lxc/*.conf</code>) <strong>сохраняются</strong>, поэтому после восстановления список гостевых систем появится снова, а диски можно будет повторно подключить из существующей резервной копии в PBS или локальной резервной копии.",
"<strong>Это не операция для всего кластера.</strong> Каждый узел создаёт собственную резервную копию. Сведения о принадлежности к кластеру сохраняются в составе <code>/etc/pve</code>, чтобы восстановленный узел можно было повторно добавить в его кластер, однако для восстановления всего кластера требуется согласовывать действия на каждом узле.",
"<strong>Это не полный образ диска.</strong> Двоичные файлы ядра, initramfs и загрузочный раздел не сохраняются. При восстановлении ProxMenux использует собственные загрузочные файлы целевого хоста (автоматически создаваемые заново с помощью <code>update-initramfs</code> и средства настройки загрузчика) и устанавливает подходящие драйверы для работающего ядра целевого хоста."
]
},
"threePillars": {
"heading": "Три основы резервной копии",
"intro": "Архив ProxMenux состоит из трёх самодостаточных наборов данных. При восстановлении все три используются вместе, чтобы воссоздать исходный хост на целевом хосте, где может быть установлено даже другое ядро.",
"diagramCaption": "Каждая резервная копия содержит одни и те же три набора данных независимо от места назначения. При восстановлении используются все три: rootfs — для размещения файлов, манифест — для выявления расхождений конфигурации и различий между ядрами, а перечень приложений — для повторной установки пакетов и компонентов с учётом собственного ядра целевого хоста.",
"pillar1Label": "Файловая система",
"pillar1Detail": "rootfs/\n(копия /etc,\n/etc/systemd/network,\n/root, созданная rsync,\nи снимок sqlite3\nдля /var/lib/pve-cluster,\n+ дополнительные пути)",
"pillar2Label": "Манифест",
"pillar2Detail": "manifest.json\n(оборудование, параметры\nядра, сеть,\nZFS, пользователи, cron,\nпулы ZFS, хранилища)",
"pillar3Label": "Приложения",
"pillar3Detail": "packages.manual.list\n+ components_status.json\n(пакеты APT, установленные вручную,\n+ установщики ProxMenux с версиями)"
},
"restoreIsUniversal": {
"heading": "Восстановление воссоздаёт исходный хост, а не архив",
"body": "Восстановление резервной копии ProxMenux не сводится к извлечению файловой системы. В ходе восстановления считывается манифест для выявления различий между исходным и целевым хостами (различия оборудования, переименования сетевых интерфейсов, версия ядра, идентификатор пула ZFS), восстанавливается файловая система, а затем запускается соответствующий установщик компонентов для каждой службы, установленной на исходном хосте (драйвер NVIDIA, TPU Coral, инструменты для GPU AMD и Intel). Каждый установщик работает с <strong>текущим ядром целевого хоста</strong>, поэтому восстановленный хост не зависит от наличия ядра исходного хоста. Если ядро целевого хоста новее ядра, использовавшегося при создании резервной копии, независимый от версии ядра этап <strong>адаптации конфигурации</strong> переносит пользовательские настройки (параметры IOMMU, идентификаторы устройств VFIO, пользовательские обходные настройки, ключи GRUB) в новую загрузочную конфигурацию целевого хоста, не копируя дословно файлы, привязанные к ядру."
},
"twoInterfaces": {
"heading": "Два интерфейса, одна серверная часть",
"intro": "Каждый этап резервного копирования и восстановления доступен через два интерфейса. Оба вызывают одну и ту же библиотеку оболочки, создают идентичные архивы и читают один и тот же реестр заданий.",
"cliLabel": "ProxMenux Scripts (текстовый интерфейс)",
"cliDetail": "меню →\nРезервное копирование и восстановление хоста\n\nПошаговый процесс с диалоговыми окнами,\nудобный для SSH, с поддержкой сценариев\nдля работы без участия пользователя.",
"webLabel": "ProxMenux Monitor (веб-интерфейс)",
"webDetail": "Вкладка «Резервные копии»\nв веб-интерфейсе Monitor.\n\nВосстановление одним нажатием,\nпросмотр последних строк журнала в реальном времени,\nинтеграция с уведомлениями\nи средством просмотра изменений\nдля отката."
},
"whereNext": {
"heading": "Что читать дальше",
"intro": "Каждый из следующих подразделов подробно описывает один из аспектов рабочего процесса. Начните с раздела <em>Как это работает</em>, если хотите понять, что содержит архив и почему. Перейдите к разделу <em>Места назначения</em>, чтобы настроить место сохранения копии. О восстановлении читайте в разделах <em>Восстановление</em> и <em>Восстановление при различающихся версиях ядра</em>.",
"items": [
{
"label": "Как это работает",
"href": "/docs/backup-restore/how-it-works",
"tail": " — подробное описание трёх наборов данных (rootfs, манифест, приложения), средств их сбора и формата каждого файла."
},
{
"label": "Места хранения",
"href": "/docs/backup-restore/destinations",
"tail": " — сравнение локального хранения, Proxmox Backup Server (рекомендуется) и Borg, а также настройка каждого варианта."
},
{
"label": "Создание резервных копий",
"href": "/docs/backup-restore/creating-backups",
"tail": " — разовое резервное копирование, профиль путей по умолчанию, добавление собственных путей, шифрование для PBS."
},
{
"label": "Задания по расписанию",
"href": "/docs/backup-restore/scheduled-jobs",
"tail": " — создание новых заданий или привязка к существующему заданию vzdump в PVE, форматы расписаний, модальное окно сведений о задании."
},
{
"label": "Восстановление",
"href": "/docs/backup-restore/restoring",
"tail": " — три действия с архивом (просмотр, скачивание, восстановление), полное и выборочное восстановление, диспетчер задач после загрузки и важность последних десяти минут."
},
{
"label": "Восстановление с другой версией ядра",
"href": "/docs/backup-restore/cross-kernel",
"tail": " — поведение с учётом того, новее или старее ядро целевого хоста по сравнению с ядром резервной копии, фильтр безопасного подмножества и четыре этапа адаптации конфигурации."
}
]
}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,152 @@
{
"meta": {
"title": "Задания по расписанию — таймеры, режим привязки, правила хранения | ProxMenux",
"description": "Задания резервного копирования хоста ProxMenux по расписанию. Два режима создания (собственный таймер systemd или привязка к существующему заданию PVE vzdump), параметры хранения, применяемые отдельно для каждого задания через proxmox-backup-client/borg/локальную очистку, структура хранения в /var/lib/proxmenux/backup-jobs и скрипт запуска, создающий архивы, идентичные архивам интерактивного процесса.",
"ogTitle": "Резервное копирование ProxMenux — задания по расписанию",
"ogDescription": "Автоматическое резервное копирование хоста по расписанию с режимом привязки, правилами хранения и теми же тремя вариантами назначения, что и в интерактивном процессе.",
"twitterTitle": "Задания по расписанию | ProxMenux",
"twitterDescription": "Автоматическое резервное копирование хоста по расписанию с режимом привязки и правилами хранения."
},
"header": {
"title": "Задания по расписанию",
"description": "Автоматическое резервное копирование хоста. Две модели создания заданий: новое независимое задание с собственным расписанием или задание, привязанное к существующему заданию vzdump в PVE и наследующее его расписание и правила хранения. В обоих случаях создаются такие же архивы, как и при интерактивном запуске.",
"section": "Резервное копирование и восстановление"
},
"intro": {
"title": "Две модели заданий по расписанию",
"body": "Задание по расписанию можно создать по одной из двух моделей:",
"modelsList": [
"<strong>Новое независимое задание</strong> — ProxMenux самостоятельно задаёт расписание задания с помощью отдельного таймера systemd, независимо от других заданий на хосте. Поддерживаются все три типа назначения: локальное хранилище, PBS и Borg.",
"<strong>Привязка к существующему заданию vzdump в PVE</strong> — задание не имеет собственного расписания; оно запускается автоматически при каждом выполнении родительского задания vzdump в PVE, которое уже создаёт резервные копии виртуальных машин и контейнеров LXC на этом хосте. Расписание и правила хранения наследуются от родительского задания. Поддерживаются локальное хранилище и PBS (Borg не поддерживается, поскольку в PVE нет встроенного планировщика для Borg)."
]
},
"attachBadge": {
"title": "Режим привязки — рекомендуется, если задание vzdump в PVE уже существует",
"body": "Если для виртуальных машин и контейнеров LXC на этом узле уже настроено задание резервного копирования vzdump в PVE, привязка резервного копирования хоста позволяет запускать его после задания резервного копирования гостевых систем, в рамках <strong>одного цикла резервного копирования</strong>. При восстановлении конфигурации гостевых систем берутся из резервной копии хоста (из <code>/etc/pve</code>), а их диски — из резервных копий vzdump, созданных в этом цикле. Это помогает согласовать восстановление всего узла, но не обеспечивает атомарный снимок: изменения, внесённые во время цикла резервного копирования, могут привести к расхождениям между конфигурацией хоста и состоянием дисков гостевых систем."
},
"frequencyBadge": {
"title": "Рекомендуемая частота",
"body": "Чтобы обеспечить максимальную совместимость резервной копии хоста с его будущим восстановлением, создавайте резервные копии хоста часто. Чем ближе резервная копия к текущему состоянию хоста, тем меньше расхождений в конфигурации, пакетах и компонентах придётся устранять при восстановлении."
},
"modes": {
"heading": "Два режима",
"rows": [
{
"mode": "Новое задание по расписанию",
"backends": "Локальное хранилище, PBS, Borg",
"schedule": "Собственное выражение <code>OnCalendar</code> (синтаксис календаря systemd — например, <code>daily</code>, <code>Mon..Fri 03:00</code>).",
"retention": "Запрашиваются отдельно: <code>keep-last</code>, <code>keep-hourly</code>, <code>keep-daily</code>, <code>keep-weekly</code>, <code>keep-monthly</code>, <code>keep-yearly</code>. Применяются скриптом запуска после каждого успешного резервного копирования."
},
{
"mode": "Привязка к заданию vzdump в PVE",
"backends": "Локальное хранилище, PBS (на стороне PVE нет планировщика для Borg)",
"schedule": "Наследуется от родительского задания PVE. На стороне ProxMenux таймер systemd не устанавливается.",
"retention": "Наследуются из конфигурации <code>prune-backups</code> родительского задания (через <code>hb_pve_prune_to_keep_env</code> устанавливается взаимно однозначное соответствие с переменными <code>KEEP_*</code> скрипта запуска)."
}
]
},
"attachDetail": {
"heading": "Как работает режим привязки",
"intro": "PVE записывает задания <code>vzdump</code> в <code>/etc/pve/jobs.cfg</code> — по одному блоку на задание, каждый из которых указывает на хранилище, куда поступают дампы виртуальных машин и LXC. Для режима привязки требуется тип хранилища, поддерживаемый ProxMenux (локальное хранилище или PBS). Резервное копирование хоста запускается обработчиком job-end после завершения задания резервного копирования гостевых систем.",
"steps": [
{
"step": "1",
"detail": "При создании задания ProxMenux выводит список совместимых родительских заданий PVE через <code>hb_pve_list_vzdump_jobs_for_backend</code>. Пользователь выбирает одно из них."
},
{
"step": "2",
"detail": "В <code>.env</code> задания записываются <code>PVE_PARENT_JOB</code>, <code>PVE_STORAGE</code> и унаследованные значения <code>KEEP_*</code>; таймер systemd не создаётся."
},
{
"step": "3",
"detail": "<code>hb_install_vzdump_hook</code> регистрирует скрипт-обработчик в <code>/etc/vzdump.conf</code>. На этапе job-end любого задания vzdump он сравнивает переданное значение <code>$STOREID</code> со значением <code>PVE_STORAGE</code> каждого включённого привязанного задания и вызывает скрипт запуска для совпавших заданий. Сопоставление выполняется по хранилищу, а не по идентификатору выбранного родительского задания."
},
{
"step": "4",
"detail": "Архив сохраняется в том же хранилище, куда vzdump только что записал резервные копии: <code>path/dump/</code> для локального хранения или в репозитории PBS, настроенном в записи хранилища PVE."
}
],
"outroBody": "В режиме привязки собственного таймера нет. Отключение или удаление выбранного родительского задания PVE прекращает запуск по этому заданию, но другое задание vzdump, использующее то же хранилище, по-прежнему может запустить привязанное резервное копирование хоста. Чтобы предотвратить это, отключите или удалите само задание ProxMenux. При отключении запись задания остаётся на диске; позднее его можно снова включить или привязать."
},
"storageLayout": {
"heading": "Файлы, из которых состоит задание",
"intro": "Каждое задание, выполняемое по расписанию, полностью описывается тремя или четырьмя файлами на диске. Из них можно получить полную конфигурацию задания, не обращаясь к интерфейсу.",
"rows": [
{
"path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env",
"content": "Система хранения, идентификатор резервной копии или место назначения, расписание (режим создания) или родительское задание PVE (режим привязки), флаг включения, значения <code>KEEP_*</code> для политики хранения, ссылки на учётные данные."
},
{
"path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths",
"content": "По одному абсолютному пути на строку — фиксированный набор путей, полученный из профиля при создании задания. После изменения файла при следующем срабатывании таймера задание выполнится с новым набором путей."
},
{
"path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service",
"content": "Только в режиме создания. Служба вызывает <code>run_scheduled_backup.sh JOB_ID</code>. Таймер задаёт расписание с помощью <code>Persistent=true</code> (пропущенные запуски выполняются при следующей загрузке) и небольшого значения <code>RandomizedDelaySec=120</code> для распределения нагрузки, когда несколько заданий используют одно и то же выражение OnCalendar."
},
{
"path": "Скрипт-обработчик /etc/vzdump.conf",
"content": "Только в режиме привязки. Устанавливается однократно с помощью <code>hb_install_vzdump_hook</code>; сопоставляет значение <code>PVE_STORAGE</code> каждого привязанного задания со значением <code>$STOREID</code>, которое PVE передаёт скрипту-обработчику."
}
]
},
"runner": {
"heading": "Что происходит при запуске задания",
"intro": "Каждое задание — как созданное с собственным расписанием, так и привязанное — выполняет одну и ту же последовательность из трёх шагов:",
"steps": [
"<strong>Подготовка резервной копии.</strong> Считывается конфигурация задания (место назначения, профиль, пути), и формируется дерево файлов архива точно так же, как в интерактивном режиме. В результате получается тот же архив, что и при ручном резервном копировании с этими настройками.",
"<strong>Запись в место назначения.</strong> Архив загружается или записывается в настроенное место назначения — локальный файл <code>.tar.zst</code>, резервную копию PBS или архив Borg — с использованием тех же инструментов и учётных данных, что и при ручном резервном копировании в то же место назначения.",
"<strong>Применение политики хранения.</strong> Удаляет старые резервные копии из места назначения, сохраняя количество копий, заданное в параметрах <code>keep-last</code> / <code>keep-daily</code> / <code>keep-weekly</code> задания. Очистку выполняет само место назначения: PBS применяет собственную политику хранения, Borg запускает <code>borg prune</code>, а для Local ProxMenux удаляет файлы, не входящие в число последних резервных копий, заданное параметром <code>keep-last</code>."
]
},
"management": {
"heading": "Управление заданиями",
"intro": "Меню планировщика в текстовом интерфейсе скриптов («Планировщик резервного копирования и политика хранения») предлагает действия «Запустить сейчас», «Включить / отключить» и «Удалить», а также список заданий со статусом последнего запуска. Действия «Изменить» и «Просмотреть журнал» доступны только на вкладке резервных копий в Monitor.",
"rows": [
{
"action": "Запустить сейчас",
"detail": "Немедленно запускает обработчик задания, минуя таймер или обработчик vzdump. Это позволяет проверить конфигурацию задания, не дожидаясь следующего запуска по расписанию."
},
{
"action": "Включить / отключить",
"detail": "Режим создания: к таймеру применяется <code>systemctl enable/disable --now</code>. Режим привязки: переключается флаг <code>ENABLED</code> в файле окружения задания — скрипт-обработчик учитывает его при следующем запуске PVE."
},
{
"action": "Изменить (только в Monitor)",
"detail": "Повторно открывает диалоги настройки места назначения, расписания, профиля и политики хранения, затем перезаписывает файлы задания. Идентификатор задания сохраняется."
},
{
"action": "Удалить",
"detail": "Удаляет файл переменных окружения задания, файл путей, таймер и службу systemd (режим New), а также отключает привязку хука (режим Attach). Не затрагивает архивы, уже находящиеся в месте назначения."
},
{
"action": "Просмотр журнала (только в Monitor)",
"detail": "Выводит <code>/var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log</code> в реальном времени — для каждого запуска создаётся отдельный файл журнала. При запуске через службу systemd исполнитель также выводит краткую строку состояния в journald."
}
]
},
"notifications": {
"heading": "Уведомления",
"body": "Каждый запуск по расписанию вызывает те же события <code>hb_notify_lifecycle</code>, что и интерактивный процесс (<code>start</code>, <code>complete</code>, <code>fail</code>). Если в Monitor настроены каналы уведомлений, результаты автоматических заданий сообщаются так же, как и результаты резервного копирования вручную: пользователю не нужно проверять журнал, чтобы узнать, успешно ли выполнено задание."
},
"whereNext": {
"heading": "Куда перейти дальше",
"items": [
{
"label": "Создание резервных копий",
"href": "/docs/backup-restore/creating-backups",
"tail": " — интерактивный процесс, использующий общий с планировщиком бэкенд."
},
{
"label": "Места хранения",
"href": "/docs/backup-restore/destinations",
"tail": " — настройки для каждого бэкенда, используемые как интерактивным процессом, так и планировщиком."
},
{
"label": "Восстановление",
"href": "/docs/backup-restore/restoring",
"tail": " — процесс, использующий результаты выполнения заданий."
}
]
}
}
+175
View File
@@ -0,0 +1,175 @@
{
"meta": {
"title": "Создание ВМ на Proxmox VE — мастера для Synology, Windows, Linux и NAS | ProxMenux",
"description": "Создавайте и настраивайте виртуальные машины на Proxmox VE с помощью ProxMenux. Специализированные мастера для NAS-систем (Synology DSM, TrueNAS, OpenMediaVault, XigmaNAS и др.), Windows, дистрибутивов Linux, а также внешний установщик macOS. Продуманные настройки оборудования ВМ, хранилища и сети по умолчанию.",
"ogTitle": "Создание ВМ на Proxmox VE — мастера для Synology, Windows, Linux и NAS",
"ogDescription": "Мастера ProxMenux для создания ВМ с Synology DSM, TrueNAS, OMV, XigmaNAS, Windows и Linux на Proxmox VE.",
"ogImageAlt": "Меню создания ВМ в ProxMenux",
"twitterTitle": "Создание ВМ на Proxmox VE | ProxMenux",
"twitterDescription": "Мастера для создания ВМ с Synology, TrueNAS, OMV, XigmaNAS, Windows и Linux на Proxmox VE."
},
"header": {
"title": "Создать ВМ",
"description": "В ProxMenux создание ВМ организовано через интерактивное меню выбора. Выберите семейство операционной системы, и соответствующий мастер поможет выбрать ISO-образ, настроить CPU, RAM, BIOS, сеть и хранилище, а при необходимости — проброс GPU.",
"section": "Виртуальные машины"
},
"intro": {
"title": "Для чего предназначено это меню",
"body": "Меню создания ВМ направляет к нужному мастеру, а не является единым мастером. Оно спрашивает, какое семейство операционной системы вы хотите установить, и загружает соответствующие средства выбора ISO-образа и настройки. Стандартные сценарии используют продуманные предустановки ProxMenux; расширенные сценарии предоставляют доступ ко всем настраиваемым параметрам до создания ВМ."
},
"opening": {
"heading": "Открытие меню",
"body": "В главном меню ProxMenux выберите <strong>Создать ВМ</strong>. Вы увидите следующее:",
"imageAlt": "Меню выбора мастера создания ВМ с тремя пунктами ProxMenux (NAS / Windows / Linux), за которыми следует раздел Community Scripts (macOS / Другие)"
},
"families": {
"heading": "Три семейства ОС",
"intro": "Три пункта ProxMenux в верхней части меню используют один и тот же базовый механизм и одинаковую последовательность действий после выбора ISO-образа. Они лишь направляют к разным средствам выбора ISO-образов и применяют настройки по умолчанию, адаптированные для каждого семейства. Выберите пункт, соответствующий гостевой ОС, которую хотите установить.",
"routes": [
{
"key": "nas",
"title": "Системы NAS",
"icon": "HardDrive",
"href": "/docs/create-vm/system-nas",
"accent": "border-emerald-300 bg-emerald-50",
"iconBg": "bg-emerald-100 text-emerald-700",
"description": "Восемь операционных систем для NAS, каждая в отдельной ВМ. Для большинства используется сценарий автоматического выбора ISO-образа; для Synology DSM запускается специализированный мастер загрузчика.",
"bullets": [
"Synology DSM (загрузчики Arc / RR / Alpine RedPill M-shell)",
"TrueNAS SCALE и CORE (ZFS)",
"OpenMediaVault (на базе Debian)",
"XigmaNAS (FreeBSD ZFS)",
"Rockstor (openSUSE / Btrfs), ZimaOS, FygoOS"
]
},
{
"key": "windows",
"title": "Системы Windows",
"icon": "MonitorCog",
"href": "/docs/create-vm/system-windows",
"accent": "border-blue-300 bg-blue-50",
"iconBg": "bg-blue-100 text-blue-700",
"description": "Windows 10, 11 и редакции Windows Server с подходящими для Windows настройками по умолчанию (q35 + OVMF + TPM 2.0) и заранее подключённым носителем с драйверами VirtIO.",
"bullets": [
"UUP Dump для получения актуальных ISO-образов",
"Или локальный ISO-образ из /var/lib/vz/template/iso",
"TPM 2.0 добавляется автоматически",
"ISO-образ с драйверами VirtIO подключается к ide3",
"Канал гостевого агента включён"
]
},
{
"key": "linux",
"title": "Системы Linux",
"icon": "Laptop",
"href": "/docs/create-vm/system-linux",
"accent": "border-amber-300 bg-amber-50",
"iconBg": "bg-amber-100 text-amber-700",
"description": "Подборка официальных ISO-образов Linux с автоматической загрузкой из первоисточников, а также возможность выбрать локальный ISO-образ для любых других систем.",
"bullets": [
"Ubuntu (Desktop / Server, 20.04–25.10)",
"Debian (Desktop / Netinst, 11–13)",
"Fedora, Arch, Rocky, Mint, openSUSE",
"Alpine, Kali, Manjaro",
"Путь к локальному ISO-файлу для собственных образов"
]
}
]
},
"community": {
"title": "Скрипты сообщества (здесь не документируются)",
"intro": "Два пункта под разделителем <em>Скрипты сообщества</em> запускают код, который <strong>не входит в состав ProxMenux</strong>, поэтому они намеренно не рассматриваются в этой документации:",
"macosRich": "<strong>Система macOS</strong> — запускает внешний установщик <osxLink>OSX-PROXMOX</osxLink>. Он клонирует исходный репозиторий, подготавливает хост и <strong>автоматически перезагружает его по завершении</strong>. Обратитесь к документации самого проекта.",
"othersRich": "<strong>Другие системы (на базе Linux)</strong> — загружает подборку установщиков систем на базе Linux от сообщества (ОС для домашних серверов, специализированные системы для маршрутизаторов и межсетевых экранов и т. п.). Каждый скрипт сообщества сопровождается вне проекта ProxMenux."
},
"afterPick": {
"heading": "Что происходит после выбора ОС",
"intro": "После выбора ISO-образа диспетчер выполняет одну и ту же последовательность действий независимо от семейства ОС:",
"items": [
"<strong>Настройки по умолчанию или расширенные настройки.</strong> В диалоговом окне подтверждения можно принять предустановленные настройки ProxMenux или открыть полный конфигуратор (модель и число ядер процессора, оперативная память, BIOS/UEFI, модель сетевого адаптера, тип машины).",
"<strong>План хранения данных.</strong> В одной ВМ можно сочетать один или несколько виртуальных дисков, импортированные диски и устройства с прямым пробросом PCI (контроллер целиком / NVMe).",
"<strong>Необязательный проброс GPU.</strong> Если на хосте обнаружен совместимый GPU, ProxMenux предлагает запустить помощник настройки GPU после создания ВМ — может потребоваться перезагрузка.",
"<strong>Создание ВМ.</strong> Создаётся ВМ, ей назначаются теги и добавляется оформленное HTML-описание для быстрого доступа к справочной информации в интерфейсе Proxmox."
],
"tipTitle": "Для ВМ, которые планируется использовать длительное время, выбирайте расширенную настройку",
"tipBody": "Настройки по умолчанию хорошо подходят для быстрых тестов. Для ВМ, которую планируется использовать длительное время, расширенная настройка позволяет сразу выбрать подходящие BIOS (SeaBIOS или OVMF/UEFI), тип машины (<code>i440fx</code> или <code>q35</code>) и дисковый контроллер (VirtIO SCSI single или SATA) — впоследствии изменить их будет непросто."
},
"scripts": {
"heading": "Используемые скрипты",
"intro": "Диспетчер подключает несколько общих скриптов компонентов, для которых нет отдельных страниц документации. Они перечислены здесь для справки. На каждой дочерней странице есть ссылка на основной скрипт соответствующего сценария.",
"headerScript": "Скрипт",
"headerRole": "Назначение",
"rows": [
{
"path": "menus/create_vm_menu.sh",
"role": "Диспетчер, служащий точкой входа."
},
{
"path": "vm/select_nas_iso.sh",
"role": "Выбор ISO-образа или готового образа системы для NAS (Synology, TrueNAS, OMV, Rockstor, XigmaNAS, ZimaOS, FygoOS)."
},
{
"path": "vm/select_windows_iso.sh",
"role": "Выбор ISO-образа Windows. При необходимости передаёт задачу сборщику UUP Dump."
},
{
"path": "vm/select_linux_iso.sh",
"role": "Выбор ISO-образа Linux для сценария установки Linux (основные дистрибутивы)."
},
{
"path": "vm/synology.sh",
"role": "Сценарий установки Synology DSM: загружает загрузчик и образ DSM и подготавливает профиль ВМ."
},
{
"path": "vm/zimaos.sh",
"role": "Сценарий установки ZimaOS: загружает образ и подключает его в конфигурации ВМ."
},
{
"path": "vm/vm_configurator.sh",
"role": "Мастер настройки с выбором параметров по умолчанию или расширенных параметров: модель и количество ядер CPU, RAM, BIOS, сетевой адаптер, тип машины."
},
{
"path": "vm/disk_selector.sh",
"role": "План хранения данных: виртуальный диск, импорт диска или проброс контроллера/NVMe."
},
{
"path": "vm/vm_creator.sh",
"role": "Завершающий этап создания ВМ: применяет конфигурацию, подключает устройства хранения данных, записывает HTML-описание."
},
{
"path": "vm/guest_agent_config.sh",
"role": "Необязательный обработчик настройки гостевого агента QEMU, используемый в нескольких сценариях."
}
]
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/disk-manager",
"label": "Диспетчер дисков",
"tail": " — подключение существующих физических дисков или импорт образов дисков в ВМ."
},
{
"href": "/docs/utils/UUp-Dump-ISO-Creator",
"label": "Создание ISO с помощью UUP Dump",
"tail": " — создание установочных ISO-образов Windows, готовых к использованию в качестве загрузочных носителей."
},
{
"href": "/docs/utils/import-vm",
"label": "Импорт ВМ из OVA / OVF",
"tail": " — импорт готовых ВМ из экспортов VMware / VirtualBox / ProxMenux."
},
{
"href": "/docs/hardware/gpu-vm-passthrough",
"label": "Добавить GPU в ВМ (прямой проброс)",
"tail": " — проброс GPU в только что созданную ВМ."
},
{
"href": "/docs/help-info/vm-ct-commands",
"label": "Команды управления ВМ и контейнерами",
"tail": " — справочник по qm для работы в командной строке."
}
]
}
}
@@ -0,0 +1,453 @@
{
"title": "Скрипт создания ВМ для Synology",
"stepLabel": "Шаг",
"intro": {
"heading": "Введение",
"intro": "ProxMenux предоставляет скрипт, который автоматически создаёт и настраивает виртуальную машину (ВМ) для установки Synology DSM (DiskStation Manager) на Proxmox VE. Скрипт упрощает этот процесс: скачивает один из доступных загрузчиков и настраивает загрузку ВМ с его помощью. На выбор предлагаются четыре варианта:",
"loaders": [
{
"name": "AuxXxilium Arc",
"url": "https://github.com/AuxXxilium/arc",
"extra": ""
},
{
"name": "RedPill RR",
"url": "https://github.com/RROrg/rr",
"extra": ""
},
{
"name": "Alpine RedPill M-shell (проект TinyCore)",
"url": "https://github.com/PeterSuh-Q3/tinycore-redpill",
"extra": ""
}
],
"customLoader": "Пользовательский загрузчик — возможность использовать собственный загрузчик, если вы предпочитаете изменить конфигурацию или создать свою",
"simplifiesIntro": "Скрипт упрощает создание ВМ, предлагая следующие возможности:",
"simplifies": [
"Выбор стандартной или расширенной настройки",
"Настройка процессора, оперативной памяти, BIOS и типа машины",
"Выбор между виртуальным диском и прямым подключением физического диска к ВМ"
]
},
"config": {
"heading": "Стандартная и расширенная настройка",
"intro": "Скрипт предлагает два режима настройки:",
"defaultHeading": "Стандартная настройка",
"defaultIntro": "При выборе стандартной настройки скрипт автоматически применит следующие значения:",
"headerParam": "Параметр",
"headerValue": "Значение по умолчанию",
"defaultRows": [
{
"param": "Тип машины",
"value": "q35"
},
{
"param": "Тип BIOS",
"value": "OVMF (UEFI)"
},
{
"param": "Тип процессора",
"value": "Host"
},
{
"param": "Количество ядер",
"value": "2"
},
{
"param": "Объём оперативной памяти",
"value": "4096 МБ"
},
{
"param": "Сетевой мост",
"value": "vmbr0"
},
{
"param": "MAC-адрес",
"value": "Генерируется автоматически"
},
{
"param": "Запустить ВМ по завершении",
"value": "Нет"
}
],
"defaultOutro": "Если вы хотите настроить конфигурацию, выберите в меню пункт «Расширенные настройки».",
"advancedHeading": "Расширенная настройка",
"advancedIntro": "Если вы выберете расширенную настройку, скрипт позволит настроить каждый параметр:",
"headerOptions": "Варианты",
"advancedRows": [
{
"param": "Тип машины",
"options": "q35 или i440fx"
},
{
"param": "Тип BIOS",
"options": "OVMF (UEFI) или SeaBIOS (Legacy)"
},
{
"param": "Тип процессора",
"options": "Host или KVM64"
},
{
"param": "Количество ядер",
"options": "Количество ядер процессора"
},
{
"param": "Объём оперативной памяти",
"options": "Объём памяти, выделенной ВМ"
},
{
"param": "Сетевой мост",
"options": "Сетевой мост для подключения"
},
{
"param": "MAC-адрес",
"options": "Пользовательский MAC-адрес"
},
{
"param": "VLAN",
"options": "Тег VLAN (если используется)"
},
{
"param": "MTU",
"options": "Максимальный размер передаваемого блока данных"
}
]
},
"diskSelection": {
"heading": "Выбор диска",
"intro": "План настройки хранилища позволяет добавлять виртуальные диски, физические диски, а также контроллеры PCI или устройства NVMe. Варианты подключения дисков описаны ниже.",
"virtualHeading": "Виртуальный диск",
"virtualItems": [
"Скрипт выводит список доступных в Proxmox вариантов хранения данных",
"Пользователь выбирает диск и его размер в ГБ",
"Виртуальные диски подключаются как устройства <strong>SATA</strong> (sata0, sata1 и т. д.). Виртуальные и физические диски данных совместно используют шесть слотов SATA с номерами 0–5; загрузчик использует отдельный слот IDE."
],
"physicalHeading": "Прямое подключение физических дисков",
"physicalItems": [
"Скрипт обнаруживает все доступные физические диски",
"Пользователь выбирает физический диск или несколько дисков, которые хочет использовать.",
"Физические диски подключаются как устройства <strong>SATA</strong>. Они совместно с виртуальными дисками данных используют шесть слотов SATA с номерами 0–5; это не означает, что можно дополнительно подключить ещё шесть физических дисков."
]
},
"loaderInstall": {
"heading": "Установка загрузчика",
"intro1": "Скрипт автоматически скачивает и распаковывает загрузчик из репозитория разработчика. Если скачать загрузчик не удастся, скрипт выведет сообщение об ошибке.",
"intro2Rich": "<strong>AuxXxilium Arc</strong>, <strong>RedPill RR</strong> и <strong>Alpine RedPill M-shell</strong> скачиваются и распаковываются автоматически.",
"customRich": "Для <strong>пользовательского загрузчика</strong> скрипт ищет файлы в <code>/var/lib/vz/template/iso</code>. Если найдено несколько файлов, вам будет предложено выбрать нужный файл.",
"uploadIntro": "Вы можете загрузить пользовательские загрузчики через меню локального хранилища:",
"imageAlt": "Добавление пользовательского загрузчика",
"imageCaption": "Добавление пользовательского загрузчика"
},
"vmCreation": {
"heading": "Создание виртуальной машины",
"intro": "После скачивания загрузчика скрипт создаёт виртуальную машину с помощью следующих команд:",
"items": [
"<code>qm create</code> — создаёт виртуальную машину с заданными параметрами",
"<code>qm importdisk</code> импортирует образ загрузчика в хранилище Proxmox. Затем скрипт подключает этот образ к виртуальной машине как ide0 для обеспечения совместимости.",
"<code>qm set</code> — задаёт параметры конфигурации, такие как процессор, оперативная память и хранилище",
"<code>qm set VMID --boot order=ide0</code> назначает загрузчик загрузочным устройством. Замените VMID идентификатором виртуальной машины."
]
},
"stepGuide": {
"heading": "Пошаговое руководство по настройке загрузчика",
"intro": "У каждого загрузчика свои меню и способы настройки. Шесть приведённых ниже шагов описывают общий процесс; если подсказки используемого загрузчика отличаются, следуйте им. На снимках экрана M-shell показан более ранний интерфейс TinyCore, тогда как текущий скрипт скачивает Alpine RedPill M-shell.",
"selectorHeading": "Выберите тип загрузчика:",
"loaderButtons": {
"arc": "Загрузчик Arc",
"rr": "Загрузчик RR",
"tinycore": "Загрузчик TinyCore"
}
},
"steps": [
{
"id": "step1",
"title": "Запустите ВМ и откройте главное меню",
"intro": "После создания ВМ запустите её. При первом запуске ВМ откроется главное меню загрузчика, где можно выбрать и настроить модель DSM, для которой вы хотите собрать загрузчик. После создания загрузчика этот шаг будет пропускаться, если вы вручную не запустите повторную настройку через монитор загрузки. Все загрузчики также поддерживают настройку через веб-интерфейс.",
"loaders": {
"arc": [
{
"htmlBefore": "<strong>Веб-интерфейс</strong>. Чтобы открыть веб-интерфейс, откройте браузер и введите IP-адрес, указанный в консоли ВМ. Например, в нашем случае: http://192.169.0.32.",
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_0_1.png",
"alt": "Веб-интерфейс загрузчика Arc",
"caption": "Веб-интерфейс загрузчика Arc"
},
{
"htmlBefore": "<strong>Терминальный интерфейс</strong>. Откройте его непосредственно в консоли ВМ.",
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_1_1.png",
"alt": "Терминальный интерфейс загрузчика Arc",
"caption": "Терминальный интерфейс загрузчика Arc"
}
],
"rr": [
{
"htmlBefore": "<strong>Веб-интерфейс</strong>. Чтобы открыть веб-интерфейс, запустите браузер и введите IP-адрес, указанный в выводе консоли ВМ, добавив после него порт <strong>7681</strong>. Например, в нашем случае: <code>http://192.169.0.33:7681</code>.",
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_0_2.png",
"alt": "Пример команды RR",
"caption": "Веб-интерфейс загрузчика RR"
},
{
"htmlBefore": "<strong>Терминальный интерфейс</strong>. Откройте его непосредственно в консоли ВМ, введя <strong>menu.sh</strong>",
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_1_1.png",
"alt": "Интерфейс загрузчика RR",
"caption": "Терминальный интерфейс загрузчика RR"
}
],
"tinycore": [
{
"htmlBefore": "<strong>Веб-интерфейс</strong>. Чтобы открыть веб-интерфейс, запустите браузер и введите IP-адрес, указанный в выводе консоли ВМ, добавив после него порт <strong>7681</strong>. Например, в нашем случае: <code>http://192.169.0.35:7681</code>.",
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_0_1.png",
"alt": "Интерфейс загрузчика TinyCore",
"caption": "Веб-интерфейс загрузчика TinyCore"
},
{
"htmlBefore": "<strong>Терминальный интерфейс</strong>. Откройте его непосредственно в консоли ВМ. Следите за сообщениями на экране: в какой-то момент может появиться запрос на нажатие клавиши для продолжения или вопрос о том, хотите ли вы изменить язык.",
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_1_1.png",
"alt": "Интерфейс загрузчика TinyCore",
"caption": "Терминальный интерфейс загрузчика TinyCore"
}
]
}
},
{
"id": "step2",
"title": "Выберите модель",
"intro": "После загрузки меню выберите модель Synology DSM, которую хотите установить. В зависимости от загрузчика иногда требуется развернуть список вариантов, чтобы увидеть дополнительные модели.",
"outro": "В нашем примере мы выберем модель SA6400.",
"loaders": {
"arc": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_2_1.png",
"alt": "Выбор модели в Arc",
"caption": "Выбор модели в Arc"
}
],
"rr": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_2_1.png",
"alt": "Выбор модели в RR",
"caption": "Выбор модели в RR"
}
],
"tinycore": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_2_1.png",
"alt": "Выбор модели в TinyCore",
"caption": "Выбор модели в TinyCore"
}
]
}
},
{
"id": "step3",
"title": "Выбор версии DSM",
"intro": "После выбора модели необходимо выбрать версию DSM, которую вы хотите установить.",
"loaders": {
"arc": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_3_1.png",
"alt": "Выбор версии в Arc — шаг 1",
"caption": "Выбор версии в Arc — шаг 1"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_3_2.png",
"alt": "Выбор версии в Arc — шаг 2",
"caption": "Выбор версии в Arc — шаг 2"
}
],
"rr": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_3_1.png",
"alt": "Выбор версии в RR — шаг 1",
"caption": "Выбор версии в RR — шаг 1"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_3_2.png",
"alt": "Выбор версии в RR — шаг 2",
"caption": "Выбор версии в RR — шаг 2"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_3_3.png",
"alt": "Выбор версии в RR — шаг 3",
"caption": "Выбор версии в RR — шаг 3"
}
],
"tinycore": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_3_1.png",
"alt": "Выбор версии в TinyCore — шаг 1",
"caption": "Выбор версии в TinyCore — шаг 1"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_3_2.png",
"alt": "Выбор версии в TinyCore — шаг 2",
"caption": "Выбор версии в TinyCore — шаг 2"
}
]
}
},
{
"id": "step4",
"title": "Выбор дополнений",
"intro": "На этом шаге можно добавить в загрузчик дополнительные функции или пользовательские настройки.",
"loaders": {
"arc": [
{
"htmlBefore": "<strong>Arc</strong> позволяет выполнить настройку автоматически или вручную. Если выбрана автоматическая настройка, загрузчик начнёт применять необходимые настройки и автоматически перезагрузится после завершения процесса.",
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_1.png",
"alt": "Автоматическая настройка Arc",
"caption": "Автоматическая настройка Arc"
},
{
"htmlBefore": "Если вы решите не использовать автоматический режим, откроется меню для настройки различных параметров, необходимых для работы загрузчика:",
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_2.png",
"alt": "Ручная настройка Arc",
"caption": "Ручная настройка Arc"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_3.png",
"alt": "Настройка SN/MAC в Arc",
"caption": "Настройка SN/MAC в Arc"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_4.png",
"alt": "Сопоставление портов SATA в Arc",
"caption": "Сопоставление портов SATA в Arc (используйте рекомендуемый вариант)"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_4_5.png",
"alt": "Выбор дополнений в Arc",
"caption": "Выбор дополнений в Arc"
}
],
"rr": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_4_1.png",
"alt": "Дополнения в RR — шаг 1",
"caption": "Дополнения в RR — шаг 1"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_4_2.png",
"alt": "Дополнения в RR — шаг 2",
"caption": "Дополнения в RR — шаг 2: нажмите, чтобы добавить дополнения"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_4_3.png",
"alt": "Дополнение RR: шаг 3",
"caption": "Дополнение RR: шаг 3 — выберите нужное дополнение, нажав на него. Чтобы добавить другие дополнения, повторите действия, показанные на изображениях 2.4.2 и 2.4.3."
}
],
"tinycore": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_4_1.png",
"alt": "TinyCore Настройка серийного номера",
"caption": "TinyCore Настройка серийного номера"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_4_2.png",
"alt": "TinyCore Вариант со случайным значением",
"caption": "TinyCore Вариант со случайным значением — рекомендуется выбрать случайное значение"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_4_3.png",
"alt": "TinyCore Настройка MAC-адреса",
"caption": "TinyCore Настройка MAC-адреса"
},
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_4_4.png",
"alt": "TinyCore MAC-адрес виртуальной машины",
"caption": "TinyCore MAC-адрес виртуальной машины — выберите, использовать ли MAC-адрес вашей виртуальной машины или случайный MAC-адрес"
}
]
}
},
{
"id": "step5",
"title": "Сборка загрузчика",
"intro": "После выбора модели, версии DSM и дополнений перейдите к сборке загрузчика. Этот процесс может занять несколько минут в зависимости от загрузчика и выбранной конфигурации. Для начала выберите пункт «Сборка загрузчика».",
"loaders": {
"arc": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_5_1.png",
"alt": "Arc: сборка загрузчика",
"caption": "Arc: сборка загрузчика"
}
],
"rr": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_5_1.png",
"alt": "RR: сборка загрузчика",
"caption": "RR: сборка загрузчика"
}
],
"tinycore": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_5_1.png",
"alt": "TinyCore Сборка загрузчика",
"caption": "TinyCore Сборка загрузчика"
}
]
}
},
{
"id": "step6",
"title": "Запуск загрузчика",
"intro": "После завершения сборки загрузчика вам будет предложено запустить его. Виртуальная машина перезапустится с созданной вами конфигурацией и начнёт установку DSM.",
"loaders": {
"arc": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/arc/arc_1_6_1.png",
"alt": "Arc: запуск загрузчика",
"caption": "Arc: запуск загрузчика"
}
],
"rr": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/rr/rr_2_6_1.png",
"alt": "RR: запуск загрузчика",
"caption": "RR: запуск загрузчика"
}
],
"tinycore": [
{
"src": "https://macrimi.github.io/ProxMenux/vm/synology/tinycore/tinycore_3_6_1.png",
"alt": "TinyCore Запуск загрузчика",
"caption": "TinyCore Запуск загрузчика"
}
]
}
}
],
"dsmInstall": {
"heading": "Начало установки DSM",
"intro": "После запуска загрузчика вы можете найти своё устройство Synology с помощью:",
"afterCode": "Следуйте инструкциям на экране, чтобы завершить установку DSM.",
"setupAlt": "Установка DSM",
"setupCaption": "Экран установки DSM",
"patience": "Пожалуйста, подождите — процесс может занять несколько минут. Процент выполнения будет обновляться автоматически по мере установки. Когда установка будет близка к завершению, начнётся обратный отсчёт.",
"finishAlt": "Установка завершена",
"finishCaption": "Установка завершена"
},
"tips": {
"heading": "Советы",
"introItem": "Учтите, что доступные параметры могут меняться в зависимости от версии загрузчика и обновлений разработчиков. Если при создании загрузчика возникнут проблемы, обратитесь к его документации:",
"docLinks": [
{
"label": "Документация Arc",
"url": "https://github.com/AuxXxilium/arc"
},
{
"label": "Документация RR",
"url": "https://github.com/RROrg/rr"
},
{
"label": "Документация TinyCore",
"url": "https://github.com/PeterSuh-Q3/tinycore-redpill"
}
],
"olderModels": "У некоторых старых моделей DSM могут возникать проблемы с распознаванием дисков или сетевой карты. Рекомендуется использовать более новые модели.",
"updateLabel": "Обновление:",
"updateBody": "Некоторые загрузчики позволяют обновлять загрузчик непосредственно из меню.",
"importantLabel": "Важно:",
"importantBody": "ProxMenux не предоставляет поддержку по вопросам работы различных загрузчиков."
}
}
@@ -0,0 +1,292 @@
{
"meta": {
"title": "Создание ВМ: система Linux | Документация ProxMenux",
"description": "Создавайте виртуальные машины Linux на Proxmox VE с помощью ProxMenux. Здесь описаны каталог отобранных официальных ISO-образов (Ubuntu, Debian, Fedora, Arch, Rocky, Mint, openSUSE, Alpine, Kali, Manjaro), единый план настройки хранилища, проброс GPU по желанию и советы после установки.",
"ogTitle": "Создание ВМ: система Linux | Документация ProxMenux",
"ogDescription": "Создавайте ВМ Linux на Proxmox VE с помощью ProxMenux. Каталог отобранных ISO-образов, единый план настройки хранилища, проброс GPU по желанию и советы после установки.",
"ogImageAlt": "Меню ВМ Linux в ProxMenux"
},
"header": {
"title": "Создание ВМ: система Linux",
"description": "Создайте ВМ Linux на Proxmox VE. ProxMenux включает каталог отобранных официальных ISO-образов Linux, готовых к скачиванию, и средство выбора локального ISO-образа. В обоих случаях используются общий мастер создания ВМ, единый план настройки хранилища и, при необходимости, помощник по пробросу GPU.",
"section": "Виртуальные машины"
},
"intro": {
"title": "Что делает этот скрипт",
"body": "Меню выбора Linux предлагает два управляемых ProxMenux источника установочных носителей: официальный ISO-образ из отобранного списка (скачивается автоматически) или локальный ISO-образ, который вы загрузили самостоятельно. Независимо от выбора дальнейшая настройка выполняется в общем мастере: CPU / RAM / BIOS → план настройки хранилища → проброс GPU по желанию → создание ВМ."
},
"image": {
"alt": "Варианты установки Linux в ProxMenux",
"caption": "Варианты установки Linux"
},
"config": {
"heading": "Стандартная и расширенная настройка",
"intro": "После выбора ISO-образа ProxMenux предлагает использовать стандартный профиль ВМ или открыть мастер расширенной настройки.",
"defaultHeading": "Стандартная настройка",
"headerParam": "Параметр",
"headerValue": "Значение по умолчанию",
"defaultRows": [
{
"param": "Тип машины",
"valueRich": "<code>q35</code>"
},
{
"param": "BIOS",
"value": "OVMF (UEFI)"
},
{
"param": "Тип процессора",
"value": "Host"
},
{
"param": "Ядра",
"value": "2"
},
{
"param": "RAM",
"value": "4096 МБ"
},
{
"param": "Сетевой мост",
"valueRich": "<code>vmbr0</code>"
},
{
"param": "MAC-адрес",
"value": "Генерируется автоматически"
},
{
"param": "Запустить по завершении",
"value": "Нет"
}
],
"advancedHeading": "Расширенная настройка",
"advancedIntro": "Мастер расширенной настройки позволяет задать каждый параметр отдельно:",
"headerOptions": "Варианты",
"advancedRows": [
{
"param": "Тип машины",
"optionsRich": "<code>q35</code> или <code>i440fx</code>"
},
{
"param": "BIOS",
"options": "OVMF (UEFI) или SeaBIOS (Legacy)"
},
{
"param": "Тип процессора",
"options": "Host, KVM64 и другие модели процессоров из списка"
},
{
"param": "Ядра",
"options": "Количество ядер процессора"
},
{
"param": "RAM",
"options": "Память, выделенная виртуальной машине"
},
{
"param": "Сетевой мост",
"options": "Сетевой мост"
},
{
"param": "MAC-адрес",
"options": "Пользовательский MAC-адрес"
},
{
"param": "VLAN",
"options": "Тег VLAN (необязательно)"
},
{
"param": "MTU",
"options": "Размер MTU"
}
]
},
"storagePlan": {
"heading": "План хранения",
"body": "После настройки процессора и оперативной памяти ProxMenux открывает меню <strong>План хранения</strong>, в котором можно объединить виртуальные диски, импортированные диски и устройства с пробросом PCI в одной виртуальной машине, добавляя их по одному и завершая настройку, когда всё готово.",
"virtualDiskTitle": "a. Добавить виртуальный диск",
"virtualDiskItems": [
"Выводит список томов хранилищ Proxmox, доступных на хосте.",
"Вы выбираете целевое хранилище и размер в ГБ.",
"Диск использует выбранную шину: SCSI (по умолчанию), SATA, VirtIO или IDE. Слоты SATA обозначаются <code>sata0</code>, <code>sata1</code>, …; всего доступно шесть слотов с номерами 0–5."
],
"importDiskTitle": "b. Добавить диск для импорта",
"importDiskItems": [
"Обнаруживает физические диски, которые можно безопасно импортировать (системные и защищённые диски скрыты).",
"Вы выбираете один или несколько дисков в списке с флажками.",
"Импортированные диски используют выбранную шину и подключаются через <code>qm set</code>."
],
"pciTitle": "c. Добавить контроллер или NVMe (проброс PCI)",
"pciItems": [
"Обнаруживает контроллеры HBA SATA/SAS и устройства NVMe на хосте и позволяет пробросить в ВМ <em>контроллер целиком</em>. IOMMU должен быть включён; скрипт предлагает включить его и при необходимости перезагружает хост.",
"На этапе подтверждения выводится предупреждение о риске, затрагивающем весь контроллер: вся плата, включая все подключённые к ней диски, становится недоступна хосту.",
"Выбранные устройства PCI подключаются с помощью команд вида <code>qm set VMID --hostpci0 PCI_ADDRESS,pcie=1</code>. Замените VMID и PCI_ADDRESS на идентификатор ВМ и адрес PCI соответственно и используйте свободный индекс hostpci для каждого устройства."
],
"resetTitle": "Сброс и завершение",
"resetBody": "В меню также доступны <strong>r</strong> (сбросить текущий выбор и начать заново) и <strong>d</strong> (завершить и продолжить). Завершить работу с пустым планом нельзя."
},
"gpu": {
"heading": "Необязательный проброс GPU",
"body": "После составления плана хранения, если на хосте обнаружен совместимый GPU, ProxMenux предлагает запустить помощник проброса GPU. Описание работы помощника см. в разделе <gpuLink>Добавление GPU в ВМ (проброс)</gpuLink> — может потребоваться перезагрузка хоста."
},
"autoFeatures": {
"heading": "Автоматически настраиваемые функции ВМ",
"efiTitle": "Диск EFI",
"efiBody": "При выборе OVMF (UEFI) ProxMenux создаёт системный диск EFI размером 4 МБ в выбранном хранилище, чтобы прошивка могла сохранять свои переменные.",
"isoTitle": "Подключение ISO",
"isoBody": "Установочный ISO-образ подключается к <code>ide2</code> как CD-ROM и готов к первой загрузке.",
"guestTitle": "Гостевой агент QEMU",
"guestBody": "Канал гостевого агента включён в конфигурации ВМ. Сам агент необходимо установить внутри гостевой системы — см. рекомендации ниже."
},
"installOptions": {
"heading": "Варианты установки Linux",
"officialHeading": "Официальный ISO-образ (традиционная установка)",
"officialBody": "ProxMenux поставляется с подобранным списком официальных ISO-образов Linux. Выберите один из них, и скрипт загрузит его непосредственно с зеркала проекта в <code>/var/lib/vz/template/iso</code>, а затем подключит к ВМ.",
"officialImageAlt": "Выбор дистрибутива Linux",
"officialImageCaption": "Выбор дистрибутива Linux",
"localHeading": "Локальный ISO-образ",
"localBody": "Используется любой ISO-образ Linux, уже имеющийся в <code>/var/lib/vz/template/iso</code>. Скрипт выводит список всех найденных <code>*.iso</code> и позволяет выбрать один из них.",
"localImageAlt": "Меню выбора локального ISO-образа",
"localImageCaption": "Меню выбора локального ISO-образа",
"distros": [
{
"name": "Ubuntu",
"variants": [
"25.10 — настольная версия",
"24.04 — настольная версия",
"22.04 — настольная версия",
"20.04 — настольная версия",
"25.10 — серверная версия",
"24.04 — серверная версия",
"22.04 — серверная версия",
"20.04 — серверная версия"
]
},
{
"name": "Debian",
"variants": [
"13 — настольная версия",
"12 — настольная версия",
"11 — настольная версия",
"13 Netinst",
"12 Netinst",
"11 Netinst"
]
},
{
"name": "Fedora",
"variants": [
"Workstation 42"
]
},
{
"name": "Arch Linux",
"variants": [
"последняя версия"
]
},
{
"name": "Rocky Linux",
"variants": [
"9"
]
},
{
"name": "Linux Mint",
"variants": [
"22.1 Cinnamon"
]
},
{
"name": "openSUSE",
"variants": [
"Leap 15.6"
]
},
{
"name": "Alpine Linux",
"variants": [
"3.21"
]
},
{
"name": "Kali Linux",
"variants": [
"2026.1"
]
},
{
"name": "Manjaro",
"variants": [
"25.0 GNOME"
]
}
]
},
"endToEnd": {
"heading": "Что делает скрипт от начала до конца",
"items": [
"Получает ISO-образ Linux (загружает из официального источника или использует локальный файл).",
"Применяет стандартные или расширенные настройки CPU / RAM / BIOS / типа машины.",
"Открывает план настройки хранилища и подключает выбранные виртуальные диски, импортированные диски и устройства PCI.",
"Создаёт диск EFI, если выбран UEFI.",
"Монтирует ISO-образ Linux на <code>ide2</code>.",
"Задаёт порядок загрузки (сначала диск, затем ISO-образ).",
"Включает канал связи с QEMU Guest Agent.",
"При необходимости запускает помощник по пробросу GPU.",
"Создаёт оформленное HTML-описание и добавляет его к виртуальной машине.",
"Запускает виртуальную машину, если вы выбрали её запуск."
]
},
"postInstall": {
"heading": "Рекомендации после установки",
"guestAgentHeading": "Установите QEMU Guest Agent внутри виртуальной машины",
"guestAgentBody": "ProxMenux включает канал связи с гостевым агентом в конфигурации виртуальной машины, но сам агент необходимо установить внутри гостевой системы. Он поддерживает корректное завершение работы и замораживание файловой системы во время создания резервных копий для повышения согласованности данных.",
"debian": "Debian / Ubuntu",
"fedora": "Fedora / Rocky / RHEL",
"arch": "Arch Linux",
"opensuse": "openSUSE",
"virtioHeading": "Поддержка VirtIO в Linux",
"virtioBody": "Современные дистрибутивы Linux обычно включают драйверы VirtIO для дисков и сетевых адаптеров. Выберите <code>virtio</code> для блочных дисков VirtIO или <code>scsi</code> с настроенным контроллером SCSI VirtIO; сетевой адаптер также использует <code>virtio</code>. При использовании старых установщиков проверьте поддержку драйверов.",
"virtioWarnTitle": "Очень старые дистрибутивы",
"virtioWarnBody": "В очень старых установщиках могут отсутствовать необходимые драйверы VirtIO. В этом случае используйте эмулируемый контроллер SATA / SCSI или предоставьте подходящие драйверы.",
"trimHeading": "Включение TRIM / discard для хранилища на SSD",
"trimBody": "Если ВМ размещена в хранилище Proxmox на SSD, а диск подключён с флагом <code>discard</code>, можно передавать команды TRIM из гостевой системы. Есть два варианта:",
"trimItems": [
"Периодически запускайте <code>fstrim -av</code> (или включите юнит <code>fstrim.timer</code> в дистрибутивах с systemd).",
"Либо монтируйте файловые системы с параметром <code>discard</code> в <code>/etc/fstab</code>."
],
"balloonHeading": "Динамическое управление памятью (ballooning)",
"balloonBody": "Современные ядра Linux обычно включают драйвер <code>virtio_balloon</code>. При включённом устройстве balloon Proxmox может собирать статистику использования памяти. Для динамического высвобождения памяти также необходимо задать минимальный объём памяти ниже настроенного максимума; при равных значениях выделенный объём памяти остаётся фиксированным."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/disk-manager/import-disk-image-vm",
"label": "Импортировать образ диска в ВМ",
"tail": " — подключение существующего образа Linux .qcow2 / .img / .raw к новой ВМ."
},
{
"href": "/docs/utils/import-vm",
"label": "Импорт ВМ из OVA / OVF",
"tail": " — импорт ВМ Linux, экспортированной из VMware / VirtualBox / Proxmox."
},
{
"href": "/docs/hardware/gpu-vm-passthrough",
"label": "Добавить GPU в ВМ (прямой проброс)",
"tail": " — для ВМ Linux, которым требуется ускорение на GPU."
},
{
"href": "/docs/help-info/vm-ct-commands",
"label": "Команды управления ВМ и контейнерами",
"tail": " — справочник по интерфейсу командной строки qm."
},
{
"href": "/docs/create-vm",
"label": "Обзор создания ВМ",
"tail": "."
}
]
}
}
@@ -0,0 +1,147 @@
{
"meta": {
"title": "Создание ВМ: системы NAS | Документация ProxMenux",
"description": "Создавайте виртуальные машины NAS на Proxmox VE с помощью ProxMenux. Поддерживаются Synology DSM (через загрузчик), TrueNAS SCALE / CORE, OpenMediaVault, XigmaNAS, Rockstor, ZimaOS и FygoOS. Umbrel OS доступна через скрипт сообщества.",
"ogTitle": "Создание ВМ: системы NAS | Документация ProxMenux",
"ogDescription": "Создавайте виртуальные машины NAS на Proxmox VE с помощью ProxMenux. Поддерживаются Synology DSM (через загрузчик), TrueNAS SCALE / CORE, OpenMediaVault, XigmaNAS, Rockstor, ZimaOS и FygoOS.",
"ogImageAlt": "Меню систем NAS в ProxMenux"
},
"header": {
"title": "Создание ВМ: системы NAS",
"description": "ProxMenux поддерживает восемь операционных систем NAS в виде отдельных ВМ, а также дополнительный вариант установки Umbrel OS через скрипт сообщества. Для большинства систем используется один и тот же процесс с автоматической загрузкой ISO; для Synology DSM предусмотрен специализированный мастер настройки загрузчика.",
"section": "Виртуальные машины"
},
"intro": {
"title": "Как работает выбор системы NAS",
"body": "При стандартной установке из ISO инструмент выбора системы NAS пытается определить последнюю стабильную версию на зеркале проекта, при необходимости использует резервную версию, загружает ISO и открывает общий инструмент настройки ВМ, где задаются параметры процессора, оперативной памяти, дисков и сети. Для Synology DSM и ZimaOS предусмотрены отдельные процедуры установки."
},
"image": {
"alt": "Выбор системы NAS в ProxMenux",
"caption": "Выбор системы NAS"
},
"flowBadges": {
"loader": "Установка через загрузчик",
"auto-iso": "Автоматическая загрузка ISO",
"dedicated": "Специализированный скрипт"
},
"labels": {
"base": "Основа",
"fileSystem": "Файловая система",
"viewDetails": "Подробнее"
},
"supported": {
"heading": "Поддерживаемые NAS-системы",
"cards": [
{
"name": "Synology DSM",
"tagline": "DiskStation Manager с загрузчиком ARC / RR. Перед первой загрузкой необходимо настроить загрузчик.",
"icon": "HardDrive",
"base": "Linux (модифицированный)",
"fileSystem": "Btrfs, ext4",
"href": "/docs/create-vm/system-nas/synology",
"flow": "loader"
},
{
"name": "TrueNAS SCALE",
"tagline": "TrueNAS на базе Debian: в текущих версиях используются приложения Docker, а основная файловая система — ZFS. В более ранних версиях SCALE использовался Kubernetes.",
"icon": "Database",
"base": "Debian Linux",
"fileSystem": "ZFS",
"href": "/docs/create-vm/system-nas/system-nas-others#truenas-scale",
"flow": "auto-iso"
},
{
"name": "TrueNAS CORE",
"tagline": "TrueNAS на базе FreeBSD с акцентом на хранение данных с использованием ZFS. Окружения jail и плагины в CORE 13.3 устарели и не поддерживаются.",
"icon": "Database",
"base": "FreeBSD",
"fileSystem": "ZFS",
"href": "/docs/create-vm/system-nas/system-nas-others#truenas-core",
"flow": "auto-iso"
},
{
"name": "OpenMediaVault",
"tagline": "Легковесная NAS-система на базе Debian с модульной архитектурой плагинов. Отлично подходит для старого оборудования.",
"icon": "Server",
"base": "Debian Linux",
"fileSystem": "ext4, XFS, Btrfs",
"href": "/docs/create-vm/system-nas/system-nas-others#openmediavault",
"flow": "auto-iso"
},
{
"name": "XigmaNAS",
"tagline": "NAS-система на базе FreeBSD — первоначальный преемник FreeNAS с акцентом на ZFS и простоту.",
"icon": "Database",
"base": "FreeBSD",
"fileSystem": "ZFS, UFS",
"href": "/docs/create-vm/system-nas/system-nas-others#xigmanas",
"flow": "auto-iso"
},
{
"name": "Rockstor",
"tagline": "NAS-система на базе openSUSE, построенная вокруг Btrfs. Rock-ons (приложения Docker) расширяют функциональность.",
"icon": "HardDrive",
"base": "openSUSE Leap",
"fileSystem": "Btrfs",
"href": "/docs/create-vm/system-nas/system-nas-others#rockstor",
"flow": "auto-iso"
},
{
"name": "ZimaOS",
"tagline": "Легковесная ОС для NAS, ориентированная на мультимедиа, приложения Docker и домашнюю автоматизацию. Использует собственный установщик.",
"icon": "MonitorIcon",
"base": "Buildroot (развился из CasaOS)",
"fileSystem": "ext4",
"href": "/docs/create-vm/system-nas/system-nas-others#zimaos",
"flow": "dedicated"
},
{
"name": "FygoOS",
"tagline": "Международная версия fnOS: NAS на базе Debian с томами хранения, приложениями и потоковой передачей мультимедиа, управляемый через веб-интерфейс и приложения Fygo.",
"icon": "Server",
"base": "Debian Linux",
"fileSystem": "Btrfs, ext4",
"href": "/docs/create-vm/system-nas/system-nas-others#fygoos",
"flow": "auto-iso"
}
]
},
"umbrel": {
"title": "Вариант от сообщества: Umbrel OS",
"bodyRich": "Девятый пункт меню NAS — <strong>Umbrel OS</strong>. Он запускает <umbrelLink>установщик community-scripts</umbrelLink>, который поддерживается вне проекта ProxMenux, поэтому здесь он не описан. Установщик управляет всем жизненным циклом и в конце выводит учётные данные по умолчанию."
},
"zfsMem": {
"title": "Практические рекомендации по объёму памяти для ZFS",
"bodyRich": "Для TrueNAS выделите не менее <strong>8 ГБ оперативной памяти</strong> для базовой работы и больше для ресурсоёмких задач. ZFS использует оперативную память для кеша ARC, но 8 ГБ — не универсальный порог, ниже которого производительность любого NAS на базе ZFS резко падает. Проверьте требования выбранного дистрибутива и подберите объём памяти с учётом дисков, служб и приложений; менее ресурсоёмким конфигурациям OMV или Rockstor может требоваться меньше памяти."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/create-vm/system-nas/synology",
"label": "ВМ Synology",
"tail": " — специализированный установщик Synology DSM (Xpenology) на Proxmox."
},
{
"href": "/docs/create-vm/system-nas/system-nas-others",
"label": "Другие ОС для NAS",
"tail": " — TrueNAS, OpenMediaVault, Rockstor, XigmaNAS, FygoOS и аналогичные системы."
},
{
"href": "/docs/disk-manager/import-disk-vm",
"label": "Импортировать диск в ВМ",
"tail": " — проброс физических дисков в виртуальную машину NAS (для производственной среды рекомендуется вместо виртуальных дисков)."
},
{
"href": "/docs/help-info/zfs-commands",
"label": "Команды управления ZFS",
"tail": " — полезны, если ваш дистрибутив NAS использует ZFS в своей основе."
},
{
"href": "/docs/create-vm",
"label": "Обзор создания ВМ",
"tail": "."
}
]
}
}
@@ -0,0 +1,400 @@
{
"meta": {
"title": "Создание ВМ: Synology DSM | Документация ProxMenux",
"description": "Создайте виртуальную машину Synology DSM на Proxmox VE. ProxMenux скачивает выбранный загрузчик (Arc, RR, Alpine RedPill M-shell или пользовательский образ), импортирует его как загрузочный диск ВМ и настраивает процессор, оперативную память и хранилище с помощью стандартного или расширенного мастера.",
"ogTitle": "Создание ВМ: Synology DSM | Документация ProxMenux",
"ogDescription": "Создайте виртуальную машину Synology DSM на Proxmox VE с помощью ProxMenux."
},
"header": {
"title": "Создание ВМ: Synology DSM",
"description": "Создайте виртуальную машину Synology DSM на Proxmox VE. ProxMenux скачивает выбранный загрузчик (Arc, RR, Alpine RedPill M-shell или пользовательский образ), импортирует его как загрузочный диск ВМ и настраивает процессор, оперативную память и хранилище с помощью стандартного или расширенного мастера.",
"section": "Виртуальные машины · NAS"
},
"loaderLabels": {
"arc": "Загрузчик Arc",
"rr": "Загрузчик RR",
"tinycore": "Загрузчик TinyCore"
},
"whatThisDoes": {
"title": "Что делает этот инструмент",
"bodyRich": "ProxMenux автоматизирует подготовку виртуальной машины для установки Synology DSM: скачивает один из поддерживаемых загрузчиков, импортирует его в новую ВМ как загрузочный IDE-диск и применяет выбранные параметры процессора, оперативной памяти, сети и хранилища. Остальные действия — сборка загрузчика, выбор модели DSM и установка DSM — выполняются <strong>внутри ВМ</strong> через веб-интерфейс или терминальный интерфейс самого загрузчика. Инструкции по этим шагам поддерживаются сообществом и часто меняются, поэтому эта страница описывает базовую рабочую конфигурацию."
},
"supportedLoaders": {
"heading": "Поддерживаемые загрузчики",
"intro": "Скрипт позволяет выбрать один из четырёх источников загрузчика:",
"loaders": [
{
"name": "AuxXxilium Arc",
"url": "https://github.com/AuxXxilium/arc"
},
{
"name": "RedPill RR",
"url": "https://github.com/RROrg/rr"
},
{
"name": "Alpine RedPill M-shell (проект TinyCore)",
"url": "https://github.com/PeterSuh-Q3/tinycore-redpill"
}
],
"customRich": "<strong>Собственный загрузчик</strong> — поместите свой образ загрузчика в <code>/var/lib/vz/template/iso</code>, и скрипт обнаружит его."
},
"config": {
"heading": "Стандартная и расширенная настройка",
"intro": "При запуске скрипт спрашивает, использовать ли стандартный профиль виртуальной машины ProxMenux или открыть мастер расширенной настройки. Значения по умолчанию подобраны для DSM и подходят для большинства установок.",
"defaultHeading": "Стандартная настройка",
"headerParam": "Параметр",
"headerValue": "Значение по умолчанию",
"defaultRowsRich": [
{
"param": "Тип машины",
"valueRich": "<code>q35</code>"
},
{
"param": "BIOS",
"valueRich": "OVMF (UEFI)"
},
{
"param": "Тип процессора",
"valueRich": "Host"
},
{
"param": "Ядра",
"valueRich": "2"
},
{
"param": "RAM",
"valueRich": "4096 МБ"
},
{
"param": "Сетевой мост",
"valueRich": "<code>vmbr0</code>"
},
{
"param": "MAC-адрес",
"valueRich": "Генерируется автоматически"
},
{
"param": "Запустить по завершении",
"valueRich": "Нет"
}
],
"advancedHeading": "Расширенная настройка",
"advancedIntro": "Мастер расширенной настройки предоставляет доступ ко всем параметрам. Вы можете свободно изменять любой из следующих параметров:",
"headerOptions": "Варианты",
"advancedRowsRich": [
{
"param": "Тип машины",
"optionsRich": "<code>q35</code> или <code>i440fx</code>"
},
{
"param": "BIOS",
"optionsRich": "OVMF (UEFI) или SeaBIOS (Legacy)"
},
{
"param": "Тип процессора",
"optionsRich": "Host или KVM64"
},
{
"param": "Ядра",
"optionsRich": "Количество ядер процессора"
},
{
"param": "RAM",
"optionsRich": "Память, выделенная виртуальной машине"
},
{
"param": "Сетевой мост",
"optionsRich": "Сетевой мост"
},
{
"param": "MAC-адрес",
"optionsRich": "Пользовательский MAC-адрес"
},
{
"param": "VLAN",
"optionsRich": "Тег VLAN (необязательно)"
},
{
"param": "MTU",
"optionsRich": "Размер MTU"
}
]
},
"storagePlan": {
"heading": "План хранения",
"introRich": "После настройки процессора и оперативной памяти ProxMenux открывает меню <strong>План подключения накопителей</strong>, в котором можно <strong>сочетать</strong> виртуальные диски, импортированные диски и устройства с прямым пробросом PCI в одной виртуальной машине, добавляя их по одному и завершая составление плана, когда всё готово.",
"virtualHeading": "a. Добавить виртуальный диск",
"virtualItemsRich": [
"Выводит список томов хранилищ Proxmox, доступных на хосте.",
"Вы выбираете целевое хранилище и размер в ГБ.",
"Диск подключается как SATA (<code>sata0</code>, <code>sata1</code>, …). Виртуальные и физические диски данных используют общие шесть слотов SATA с номерами 0–5."
],
"importHeading": "b. Добавить диск для импорта",
"importItemsRich": [
"Обнаруживает физические диски, которые можно безопасно импортировать (системные и защищённые диски скрыты).",
"Вы выбираете один или несколько дисков в списке с флажками.",
"Импортированные диски подключаются как SATA с помощью <code>qm set</code>."
],
"pciHeading": "c. Добавить контроллер или NVMe (проброс PCI)",
"pciItemsRich": [
"Обнаруживает контроллеры HBA SATA/SAS и устройства NVMe на хосте и позволяет пробросить в ВМ <em>контроллер целиком</em>. IOMMU должен быть включён; скрипт предлагает включить его и при необходимости перезагружает хост.",
"На этапе подтверждения выводится предупреждение о риске, затрагивающем весь контроллер: вся плата, включая все подключённые к ней диски, становится недоступна хосту.",
"Выбранные устройства PCI подключаются с помощью команд вида <code>qm set VMID --hostpci0 PCI_ADDRESS,pcie=1</code>. Замените VMID и PCI_ADDRESS на идентификатор ВМ и адрес PCI соответственно и используйте свободный индекс hostpci для каждого устройства."
],
"resetCalloutTitle": "Сброс и завершение",
"resetCalloutBodyRich": "В меню также доступны <strong>r</strong> (сбросить текущий выбор и начать заново) и <strong>d</strong> (завершить и продолжить). Завершить составление пустого плана нельзя — Synology нужен хотя бы один диск для установки DSM."
},
"gpu": {
"heading": "Необязательный проброс GPU",
"bodyRich": "После составления плана подключения накопителей, если скрипт обнаружит на хосте совместимый графический процессор, он спросит, хотите ли вы пробросить его в эту виртуальную машину. О работе мастера см. <link>Добавление GPU в виртуальную машину (проброс)</link> — может потребоваться перезагрузка хоста."
},
"loaderInstall": {
"heading": "Установка загрузчика",
"intro1Rich": "<strong>Arc</strong>, <strong>RR</strong> и <strong>Alpine RedPill M-shell</strong> автоматически скачиваются и распаковываются из репозиториев GitHub их разработчиков. Если скачать загрузчик не удаётся, скрипт прекращает работу с понятным сообщением.",
"intro2Rich": "При выборе варианта <strong>Собственный загрузчик</strong> скрипт сканирует <code>/var/lib/vz/template/iso</code>. Если найдено несколько подходящих образов, вам будет предложено выбрать нужный.",
"uploadIntro": "Вы можете загрузить собственные загрузчики из локального хранилища Proxmox:",
"imageAlt": "Добавление собственного загрузчика",
"imageCaption": "Добавление собственного загрузчика"
},
"vmCreation": {
"heading": "Создание виртуальной машины — что выполняет скрипт",
"introRich": "После подтверждения загрузчика ProxMenux выполняет действия, эквивалентные следующим командам <code>qm</code>:",
"itemsRich": [
"<code>qm create</code> — создаёт виртуальную машину с выбранными параметрами процессора, объёмом оперативной памяти, BIOS и типом машины.",
"<code>qm importdisk</code> импортирует образ загрузчика в хранилище Proxmox. Затем для совместимости скрипт подключает его к виртуальной машине как диск <strong>IDE</strong> на ide0.",
"<code>qm set VMID --sata0 DISK_REFERENCE</code> подключает диск данных из плана. Замените VMID и DISK_REFERENCE на идентификатор виртуальной машины и ссылку на диск; используйте свободный индекс SATA от 0 до 5. Сетевой адаптер настраивается командой qm create.",
"<code>qm set VMID --hostpci0 PCI_ADDRESS,pcie=1</code> подключает выбранный контроллер PCI или устройство NVMe. Замените VMID и PCI_ADDRESS на идентификатор виртуальной машины и адрес PCI, а для каждого устройства используйте свободный индекс hostpci.",
"<code>qm set VMID --boot order=ide0</code> назначает загрузчик загрузочным устройством. Замените VMID идентификатором виртуальной машины."
]
},
"stepByStep": {
"heading": "Пошаговая настройка загрузчика",
"intro": "Обычно настройка состоит из шести шагов: запуск виртуальной машины, выбор модели, выбор версии DSM, выбор дополнений, сборка и загрузка. Меню и параметры зависят от версии. На приведённых ниже снимках экрана M-shell показан более ранний интерфейс TinyCore; текущий скрипт скачивает Alpine RedPill M-shell, поэтому следуйте его актуальным подсказкам.",
"warnCalloutTitle": "ProxMenux не занимается сопровождением загрузчиков",
"warnCalloutBody": "Arc, RR и Alpine RedPill M-shell — проекты сообщества с собственными графиками выпуска версий. Если какой-либо шаг отличается от приведённых ниже снимков экрана, вероятно, загрузчик обновился — обратитесь к документации самого загрузчика (ссылки внизу этой страницы)."
},
"stepBadge": "Шаг",
"step1": {
"title": "Запустите виртуальную машину и откройте главное меню",
"intro": "После создания виртуальной машины запустите её. При первом запуске откроется интерфейс настройки загрузчика, в котором нужно выбрать нужную модель DSM и выполнить сборку загрузчика для неё. После сборки при последующих запусках этот этап будет пропускаться, если только вы принудительно не запустите повторную настройку из собственного загрузочного меню загрузчика. Все три загрузчика поддерживают как терминальный, так и веб-интерфейс.",
"arc": {
"webRich": "<strong>Веб-интерфейс.</strong> Откройте браузер и перейдите по IP-адресу, указанному в консоли виртуальной машины (в нашем примере: <code>http://192.168.0.32</code>).",
"webAlt": "Веб-интерфейс загрузчика Arc",
"webCaption": "Веб-интерфейс загрузчика Arc",
"termRich": "<strong>Терминальный интерфейс.</strong> Работайте с ним непосредственно в консоли виртуальной машины.",
"termAlt": "Терминальный интерфейс загрузчика Arc",
"termCaption": "Терминальный интерфейс загрузчика Arc"
},
"rr": {
"webRich": "<strong>Веб-интерфейс.</strong> Откройте браузер и перейдите по IP-адресу, указанному в консоли ВМ, добавив после него порт <strong>7681</strong> (пример: <code>http://192.168.0.33:7681</code>).",
"webAlt": "Веб-интерфейс загрузчика RR",
"webCaption": "Веб-интерфейс загрузчика RR",
"termRich": "<strong>Терминальный интерфейс.</strong> Чтобы открыть его, введите <code>menu.sh</code> в консоли виртуальной машины.",
"termAlt": "Терминальный интерфейс загрузчика RR",
"termCaption": "Терминальный интерфейс загрузчика RR"
},
"tinycore": {
"webRich": "<strong>Веб-интерфейс.</strong> Откройте браузер и перейдите по IP-адресу, указанному в консоли ВМ, добавив после него порт <strong>7681</strong> (пример: <code>http://192.168.0.35:7681</code>).",
"webAlt": "Веб-интерфейс загрузчика TinyCore",
"webCaption": "Веб-интерфейс загрузчика TinyCore",
"termRich": "<strong>Терминальный интерфейс.</strong> Работайте с ним в консоли виртуальной машины. Следите за сообщениями: в какой-то момент может появиться запрос на нажатие клавиши для продолжения или смены языка.",
"termAlt": "Терминальный интерфейс загрузчика TinyCore",
"termCaption": "Терминальный интерфейс загрузчика TinyCore"
}
},
"step2": {
"title": "Выбор модели",
"introRich": "Выберите модель Synology DSM, которую хотите установить. В зависимости от загрузчика может потребоваться развернуть список вариантов, чтобы увидеть все доступные модели. На снимках экрана ниже в качестве примера используется модель <strong>SA6400</strong>.",
"arc": {
"alt": "Выбор модели в Arc",
"caption": "Выбор модели в Arc"
},
"rr": {
"alt": "Выбор модели в RR",
"caption": "Выбор модели в RR"
},
"tinycore": {
"alt": "Выбор модели в TinyCore",
"caption": "Выбор модели в TinyCore"
}
},
"step3": {
"title": "Выбор версии DSM",
"intro": "После выбора модели выберите версию DSM для установки.",
"arc": [
{
"alt": "Версия в Arc — шаг 1",
"caption": "Выбор версии в Arc — шаг 1"
},
{
"alt": "Версия в Arc — шаг 2",
"caption": "Выбор версии в Arc — шаг 2"
}
],
"rr": [
{
"alt": "Версия RR — шаг 1",
"caption": "Выбор версии RR — шаг 1"
},
{
"alt": "Версия RR — шаг 2",
"caption": "Выбор версии RR — шаг 2"
},
{
"alt": "Версия RR — шаг 3",
"caption": "Выбор версии RR — шаг 3"
}
],
"tinycore": [
{
"alt": "Версия TinyCore — шаг 1",
"caption": "Выбор версии TinyCore — шаг 1"
},
{
"alt": "Версия TinyCore — шаг 2",
"caption": "Выбор версии TinyCore — шаг 2"
}
]
},
"step4": {
"title": "Выбор дополнений",
"intro": "На этом шаге можно добавить в загрузчик дополнительные функции или настроить его под свои нужды.",
"arc": {
"autoRich": "<strong>Arc</strong> предлагает автоматический режим (рекомендуется) и ручной режим. В автоматическом режиме загрузчик применяет подходящие настройки по умолчанию и самостоятельно перезагружается после завершения настройки.",
"autoAlt": "Автоматическая настройка Arc",
"autoCaption": "Автоматическая настройка Arc",
"manualRich": "При выборе ручного режима вы последовательно настраиваете параметры:",
"manualAlt": "Ручная настройка Arc",
"manualCaption": "Ручная настройка Arc",
"snMacAlt": "SN/MAC в Arc",
"snMacCaption": "Настройка SN / MAC в Arc",
"portmapAlt": "Сопоставление портов SATA в Arc",
"portmapCaption": "Сопоставление портов SATA в Arc (используйте рекомендуемый вариант)",
"addonsAlt": "Дополнения Arc",
"addonsCaption": "Выбор дополнений Arc"
},
"rr": [
{
"alt": "Дополнение RR — шаг 1",
"caption": "Дополнение RR — шаг 1"
},
{
"alt": "Дополнение RR — шаг 2",
"caption": "Дополнение RR — шаг 2: нажмите, чтобы добавить дополнение"
},
{
"alt": "Дополнение RR — шаг 3",
"caption": "Дополнение RR — шаг 3: нажмите на нужное дополнение. Чтобы добавить другие дополнения, повторите действия, показанные на двух предыдущих снимках экрана."
}
],
"tinycore": [
{
"alt": "TinyCore — настройка серийного номера (SN)",
"caption": "TinyCore — настройка серийного номера (SN)"
},
{
"alt": "TinyCore — случайный выбор",
"caption": "TinyCore — случайный выбор (рекомендуется)"
},
{
"alt": "TinyCore — настройка MAC-адреса",
"caption": "TinyCore — настройка MAC-адреса"
},
{
"alt": "TinyCore MAC-адрес виртуальной машины",
"caption": "TinyCore — выберите MAC-адрес виртуальной машины или случайный MAC-адрес"
}
]
},
"step5": {
"title": "Сборка загрузчика",
"introRich": "После выбора модели, версии DSM и дополнений выберите <strong>Собрать загрузчик</strong>. Это может занять несколько минут в зависимости от загрузчика и выбранных параметров.",
"arc": {
"alt": "Arc — сборка загрузчика",
"caption": "Arc — сборка загрузчика"
},
"rr": {
"alt": "RR — сборка загрузчика",
"caption": "RR — сборка загрузчика"
},
"tinycore": {
"alt": "TinyCore — сборка загрузчика",
"caption": "TinyCore — сборка загрузчика"
}
},
"step6": {
"title": "Запуск загрузчика",
"intro": "После сборки загрузчика виртуальная машина перезагружается с созданной вами конфигурацией, и начинается установка DSM.",
"arc": {
"alt": "Arc — запуск загрузчика",
"caption": "Arc — запуск загрузчика"
},
"rr": {
"alt": "RR — запуск загрузчика",
"caption": "RR — запуск загрузчика"
},
"tinycore": {
"alt": "TinyCore — запуск загрузчика",
"caption": "TinyCore — запуск загрузчика"
}
},
"dsmInstall": {
"heading": "Начало установки DSM",
"intro": "После запуска загрузчика вы сможете обнаружить свою виртуальную машину DSM, открыв:",
"afterCode": "Следуйте инструкциям на экране, чтобы завершить установку DSM.",
"setupAlt": "Настройка DSM",
"setupCaption": "Экран настройки DSM",
"patience": "Наберитесь терпения — процесс может занять несколько минут. Сведения о ходе установки обновляются автоматически, а ближе к её завершению появляется обратный отсчёт.",
"finishAlt": "Установка завершена",
"finishCaption": "Установка завершена"
},
"tips": {
"heading": "Советы",
"recentTitle": "Используйте современные модели DSM",
"recentBody": "У некоторых старых моделей DSM возникают проблемы с распознаванием дисков или сетевой карты. Выбирайте современные модели (например, SA6400), чтобы избежать проблем при первом запуске.",
"updateTitle": "Обновление загрузчика",
"updateBody": "Некоторые загрузчики можно обновить прямо из меню настройки — удалять и заново создавать виртуальную машину не требуется.",
"warnTitle": "ProxMenux не предоставляет поддержку загрузчиков",
"warnBody": "ProxMenux автоматизирует работу с виртуальной машиной. Проблемы с загрузчиками (модель не найдена, не удаётся установить дополнение, DSM не запускается) здесь не рассматриваются — обращайтесь к системе отслеживания проблем и документации соответствующего загрузчика.",
"docsHeading": "Документация загрузчиков",
"docLinks": [
{
"label": "Документация Arc",
"url": "https://github.com/AuxXxilium/arc"
},
{
"label": "Документация RR",
"url": "https://github.com/RROrg/rr"
},
{
"label": "Документация TinyCore",
"url": "https://github.com/PeterSuh-Q3/tinycore-redpill"
}
]
},
"related": {
"heading": "Связанные материалы",
"itemsRich": [
{
"href": "/docs/create-vm/system-nas",
"label": "Обзор систем NAS",
"tail": " — сравнение Synology с TrueNAS / OMV / Rockstor / XigmaNAS."
},
{
"href": "/docs/create-vm/system-nas/system-nas-others",
"label": "Другие ОС для NAS",
"tail": " — дистрибутивы NAS, не относящиеся к Synology."
},
{
"href": "/docs/disk-manager/import-disk-vm",
"label": "Импортировать диск в ВМ",
"tail": " — проброс физических дисков в виртуальную машину Synology (рекомендуется для повышения производительности хранилища)."
},
{
"href": "/docs/create-vm",
"label": "Обзор создания ВМ",
"tail": "."
}
]
}
}
@@ -0,0 +1,312 @@
{
"meta": {
"title": "Создание ВМ: другие системы NAS | Документация ProxMenux",
"description": "Создавайте виртуальные машины TrueNAS SCALE, TrueNAS CORE, OpenMediaVault, XigmaNAS, Rockstor, ZimaOS и FygoOS на Proxmox VE с помощью ProxMenux. Рассматриваются стандартная и расширенная настройка, новая схема хранения, необязательный проброс GPU и рекомендуемые характеристики для каждой системы.",
"ogTitle": "Создание ВМ: другие системы NAS | Документация ProxMenux",
"ogDescription": "Создавайте виртуальные машины TrueNAS SCALE / CORE, OpenMediaVault, XigmaNAS, Rockstor, ZimaOS и FygoOS на Proxmox VE с помощью ProxMenux.",
"ogImageAlt": "Выбор системы NAS в ProxMenux"
},
"header": {
"title": "Создание ВМ: другие NAS-системы",
"description": "ProxMenux позволяет создать ВМ, готовую к установке TrueNAS SCALE, TrueNAS CORE, OpenMediaVault, XigmaNAS, Rockstor, ZimaOS и FygoOS. На этой странице описан общий процесс создания (настройка по умолчанию или расширенная настройка, новый план хранения, необязательный проброс GPU), а также приведены примечания для каждой системы и рекомендуемые характеристики.",
"section": "Виртуальные машины · NAS"
},
"intro": {
"title": "Как создаются эти системы",
"bodyRich": "Все семь систем используют один и тот же мастер ProxMenux. При выборе NAS подбирается соответствующий установщик (для TrueNAS, OMV, XigmaNAS, Rockstor и FygoOS автоматически определяется последняя стабильная версия), после чего выполняется переход к универсальному конфигуратору ВМ и плану хранения. ZimaOS использует собственный сценарий установки (<code>vm/zimaos.sh</code>), но следует той же последовательности настройки: CPU / RAM / хранение / необязательный GPU."
},
"config": {
"heading": "Стандартная и расширенная настройка",
"intro": "После выбора NAS ProxMenux предлагает использовать профиль ВМ по умолчанию или открыть мастер расширенной настройки. Параметры по умолчанию подобраны для задач NAS: выделяется больше оперативной памяти, чем для обычной ВМ с Linux, поскольку системам на базе ZFS она нужна для кэша ARC.",
"defaultHeading": "Стандартная настройка",
"headerParam": "Параметр",
"headerValue": "Значение по умолчанию",
"defaultRowsRich": [
{
"param": "Тип машины",
"valueRich": "<code>q35</code>"
},
{
"param": "BIOS",
"valueRich": "OVMF (UEFI)<note> — SeaBIOS для OpenMediaVault</note>"
},
{
"param": "Тип процессора",
"valueRich": "Host"
},
{
"param": "Ядра",
"valueRich": "2"
},
{
"param": "RAM",
"valueRich": "8192 МБ<note> — 4096 МБ для ZimaOS</note>"
},
{
"param": "Сетевой мост",
"valueRich": "<code>vmbr0</code>"
},
{
"param": "MAC-адрес",
"valueRich": "Генерируется автоматически"
},
{
"param": "Запустить по завершении",
"valueRich": "Нет"
}
],
"advancedHeading": "Расширенная настройка",
"advancedIntro": "Мастер расширенной настройки позволяет задать каждый параметр отдельно:",
"headerOptions": "Варианты",
"advancedRowsRich": [
{
"param": "Тип машины",
"optionsRich": "<code>q35</code> или <code>i440fx</code>"
},
{
"param": "BIOS",
"optionsRich": "OVMF (UEFI) или SeaBIOS (Legacy)"
},
{
"param": "Тип процессора",
"optionsRich": "Host, KVM64 и другие перечисленные модели CPU (ZimaOS: Host или KVM64)"
},
{
"param": "Ядра",
"optionsRich": "Количество ядер процессора"
},
{
"param": "RAM",
"optionsRich": "Память, выделенная виртуальной машине"
},
{
"param": "Сетевой мост",
"optionsRich": "Сетевой мост"
},
{
"param": "MAC-адрес",
"optionsRich": "Пользовательский MAC-адрес"
},
{
"param": "VLAN",
"optionsRich": "Тег VLAN (необязательно)"
},
{
"param": "MTU",
"optionsRich": "Размер MTU"
}
],
"zfsCalloutTitle": "ZFS и оперативная память",
"zfsCalloutBody": "TrueNAS SCALE / CORE и XigmaNAS используют ZFS: увеличение объёма оперативной памяти полезно для его кэша ARC. Для базового использования TrueNAS требуется не менее 8 ГБ; 16 ГБ и более могут быть полезны для более ресурсоёмких служб и приложений. Подбирайте ресурсы ВМ под выбранный дистрибутив и нагрузку, а не считайте 8 ГБ универсальным минимумом для ZFS. Менее ресурсоёмкие конфигурации OMV, Rockstor или ZimaOS могут требовать меньше памяти."
},
"storagePlan": {
"heading": "План хранения",
"intro": "После настройки CPU / RAM ProxMenux открывает меню плана хранения, где можно объединить виртуальные диски, импортированные диски и устройства с пробросом PCI в одной ВМ, добавляя их по одному и завершая настройку, когда всё необходимое добавлено.",
"virtualHeading": "a. Добавить виртуальный диск",
"virtualItemsRich": [
"Выводит список томов хранилищ Proxmox, доступных на хосте.",
"Вы выбираете целевое хранилище и размер в ГБ.",
"Диск использует выбранную шину: SCSI (по умолчанию), SATA, VirtIO или IDE (ZimaOS: SCSI или SATA). Слоты SATA обозначаются <code>sata0</code>, <code>sata1</code>, …; всего доступно шесть слотов с номерами 0–5."
],
"importHeading": "b. Добавить диск для импорта",
"importItemsRich": [
"Обнаруживает физические диски, которые можно безопасно импортировать (системные и защищённые диски скрыты).",
"Вы выбираете один или несколько дисков в списке с флажками.",
"Импортированные диски используют выбранную шину и подключаются через <code>qm set</code>."
],
"pciHeading": "c. Добавить контроллер или NVMe (проброс PCI)",
"pciItemsRich": [
"Обнаруживает контроллеры HBA SATA/SAS и устройства NVMe на хосте и позволяет пробросить в ВМ <em>контроллер целиком</em>. IOMMU должен быть включён; скрипт предлагает включить его и при необходимости перезагружает хост.",
"На этапе подтверждения выводится предупреждение о риске, затрагивающем весь контроллер: вся плата, включая все подключённые к ней диски, становится недоступна хосту.",
"Выбранные устройства PCI подключаются с помощью команд вида <code>qm set VMID --hostpci0 PCI_ADDRESS,pcie=1</code>. Замените VMID и PCI_ADDRESS на идентификатор ВМ и адрес PCI соответственно и используйте свободный индекс hostpci для каждого устройства."
],
"resetCalloutTitle": "Сброс и завершение",
"resetCalloutBodyRich": "В меню также доступны <strong>r</strong> (сбросить текущий выбор и начать заново) и <strong>d</strong> (завершить и продолжить). Завершить работу с пустым планом нельзя."
},
"gpu": {
"heading": "Необязательный проброс GPU",
"bodyRich": "После настройки плана хранения, если на хосте обнаружен совместимый GPU, ProxMenux предлагает запустить помощник по пробросу GPU. Описание работы помощника см. в разделе <link>Добавление GPU в ВМ (проброс)</link> — может потребоваться перезагрузка хоста."
},
"autoFeatures": {
"heading": "Автоматически настраиваемые функции ВМ",
"efiTitle": "Диск EFI",
"efiBody": "При выборе OVMF (UEFI) ProxMenux автоматически создаёт EFI-диск размером 4 МБ в выбранном хранилище, используя формат, соответствующий типу хранилища (raw для хранилища на основе каталога).",
"isoTitle": "Подключение ISO",
"isoBodyRich": "Установочный ISO-образ загружается (при необходимости) и подключается к <code>ide2</code> как CD-ROM для первой загрузки.",
"guestTitle": "Гостевой агент QEMU",
"guestBody": "Канал гостевого агента включён в конфигурации ВМ. После запуска ОС NAS вам всё равно потребуется установить агент внутри гостевой системы."
},
"endToEnd": {
"heading": "Что делает скрипт от начала до конца",
"itemsRich": [
"Определяет и загружает последний стабильный ISO-образ (или использует запасную версию, если исходный сервер недоступен).",
"Применяет параметры CPU / RAM / BIOS / типа машины по умолчанию или заданные при расширенной настройке.",
"Открывает план настройки хранилища и подключает выбранные виртуальные диски, импортированные диски и устройства PCI.",
"Создаёт EFI-диск, если выбран UEFI.",
"Подключает установочный ISO-образ к <code>ide2</code>.",
"Задаёт порядок загрузки (сначала диск, затем ISO-образ).",
"Включает канал связи с QEMU Guest Agent.",
"При необходимости запускает помощник по пробросу GPU.",
"Создаёт оформленное HTML-описание и добавляет его к виртуальной машине.",
"Запускает виртуальную машину, если вы выбрали её запуск."
]
},
"perSystem": {
"heading": "Примечания для отдельных систем",
"shellLabel": "Интерфейс командной оболочки",
"webLabel": "Веб-интерфейс"
},
"systems": {
"truenasScale": {
"id": "truenas-scale",
"title": "TrueNAS SCALE",
"icon": "Database",
"officialName": "TrueNAS SCALE",
"officialUrl": "https://www.truenas.com/truenas-scale/",
"description": "TrueNAS на базе Debian с приложениями Docker в актуальных выпусках, Linux KVM и ZFS в качестве основной файловой системы. В более ранних выпусках SCALE использовался Kubernetes. Система сочетает хранилище на базе ZFS с экосистемой контейнеров.",
"specs": [
"Рекомендуемый интерфейс: SATA или SCSI (оба поддерживают discard/trim)",
"Минимальный объём оперативной памяти: 8 ГБ (для реальных рабочих нагрузок рекомендуется 16 ГБ и более)",
"Минимальное количество ядер процессора: 2 (рекомендуется 4 и более)",
"Рекомендуется загрузка через UEFI (OVMF)",
"Сетевой адаптер VirtIO для максимальной пропускной способности"
],
"shellImg": "/vm/truenas/truenas-scale-shell.png",
"webImg": "/vm/truenas/truenas-scale-web.png",
"shellAlt": "Интерфейс командной оболочки TrueNAS SCALE",
"webAlt": "Веб-интерфейс TrueNAS SCALE"
},
"truenasCore": {
"id": "truenas-core",
"title": "TrueNAS CORE",
"icon": "Database",
"officialName": "TrueNAS CORE",
"officialUrl": "https://www.truenas.com/truenas-core/",
"description": "TrueNAS на базе FreeBSD, ранее известная как FreeNAS, ориентирована на хранение данных с использованием ZFS. Окружения jail, плагины и функции виртуализации CORE 13.3 устарели и не поддерживаются; текущая разработка сосредоточена на редакциях на базе Linux.",
"specs": [
"Рекомендуемый интерфейс: SATA",
"Минимальный объём оперативной памяти: 8 ГБ (рекомендуется 16 ГБ и более)",
"Минимальное количество ядер процессора: 2 (рекомендуется 4 и более)",
"Рекомендуется загрузка через UEFI (OVMF)",
"Сетевой адаптер VirtIO для максимальной пропускной способности"
],
"shellImg": "/vm/truenas/truenas-core-shell.png",
"webImg": "/vm/truenas/truenas-core-web.png",
"shellAlt": "Интерфейс командной оболочки TrueNAS CORE",
"webAlt": "Веб-интерфейс TrueNAS CORE"
},
"openmediavault": {
"id": "openmediavault",
"title": "OpenMediaVault",
"icon": "Server",
"officialName": "openmediavault.org",
"officialUrl": "https://www.openmediavault.org",
"description": "NAS на базе Debian с модульной системой плагинов. Нетребовательна к ресурсам и легко работает на скромном оборудовании — подходящий выбор, если вам не нужен ZFS.",
"specs": [
"Рекомендуемый интерфейс: SATA или VirtIO",
"Минимальный объём оперативной памяти: 2 ГБ (рекомендуется 4 ГБ и более)",
"Минимальное количество ядер процессора: 1 (рекомендуется 2 и более)",
"BIOS: ProxMenux по умолчанию использует SeaBIOS для OMV (при необходимости измените в дополнительных настройках)",
"Сетевой адаптер VirtIO для максимальной пропускной способности"
],
"shellImg": "/vm/openmediavault/openmediavault-shell.png",
"webImg": "/vm/openmediavault/openmediavault-web.png",
"shellAlt": "Интерфейс командной оболочки OpenMediaVault",
"webAlt": "Веб-интерфейс OpenMediaVault"
},
"xigmanas": {
"id": "xigmanas",
"title": "XigmaNAS",
"icon": "Database",
"officialName": "xigmanas.com",
"officialUrl": "https://www.xigmanas.com",
"description": "NAS на базе FreeBSD — прямое продолжение исходной кодовой базы FreeNAS (0.7). Ориентирована на ZFS и простоту, потребляет меньше ресурсов, чем TrueNAS.",
"specs": [
"Рекомендуемый интерфейс: SATA или SCSI",
"Минимальный объём оперативной памяти: 4 ГБ (для ZFS рекомендуется 8 ГБ и более)",
"Минимальное количество ядер процессора: 2",
"Рекомендуется загрузка через UEFI (OVMF)",
"Сетевой адаптер VirtIO для максимальной пропускной способности"
]
},
"rockstor": {
"id": "rockstor",
"title": "Rockstor",
"icon": "HardDrive",
"officialName": "rockstor.com",
"officialUrl": "https://rockstor.com",
"description": "NAS на базе openSUSE Leap с файловой системой Btrfs. Снимки, подтома и платформа приложений Rock-ons (Docker) для работы с мультимедиа, общего доступа к файлам и резервного копирования.",
"specs": [
"Рекомендуемый интерфейс: SATA или VirtIO",
"Минимальный объём оперативной памяти: 2 ГБ (рекомендуется 4 ГБ и более)",
"Минимальное количество ядер процессора: 2",
"Рекомендуется загрузка через UEFI (OVMF)",
"Сетевой адаптер VirtIO для максимальной пропускной способности"
],
"shellImg": "/vm/rockstor/rockstor-shell.png",
"webImg": "/vm/rockstor/rockstor-web.png",
"shellAlt": "Интерфейс командной оболочки Rockstor",
"webAlt": "Веб-интерфейс Rockstor"
},
"zimaos": {
"id": "zimaos",
"title": "ZimaOS",
"icon": "MonitorIcon",
"officialName": "zimaspace.com",
"officialUrl": "https://www.zimaspace.com/zimaos",
"description": "Легковесная ОС для NAS и домашнего сервера, собранная с помощью Buildroot на основе CasaOS, с упором на мультимедиа, приложения Docker и домашнюю автоматизацию. ZimaOS использует специальный установщик ProxMenux (vm/zimaos.sh), который загружает готовый образ и позволяет настроить процессор, оперативную память и хранилище.",
"specs": [
"Рекомендуемый интерфейс: SATA или VirtIO",
"Оперативная память по умолчанию: 4 ГБ (достаточно для мультимедиа и приложений на собственном сервере)",
"Минимальное количество ядер процессора: 2",
"Загрузка UEFI (OVMF)",
"Сетевой адаптер VirtIO для максимальной пропускной способности"
]
},
"fygoos": {
"id": "fygoos",
"title": "FygoOS",
"icon": "Server",
"officialName": "fygonas.com",
"officialUrl": "https://fygonas.com",
"description": "Международная версия fnOS — NAS на базе Debian. ProxMenux загружает последний установочный ISO-образ, опубликованный на fygonas.com, и подключает его к виртуальной машине. Установщик размещает систему на одном диске; оставшееся место на этом диске можно использовать для томов с приложениями и файлами. После установки в консоли отображается адрес веб-интерфейса на порту 5666 (с порта 80 выполняется перенаправление на него): откройте этот адрес в браузере, чтобы задать имя устройства и создать учётную запись администратора.",
"specs": [
"Системный диск: FygoOS предлагает системный раздел размером 64 ГБ, который в виртуальной машине может быть меньше",
"Установка: Graphical Install или Rescuing Install, если графическая установка не удаётся",
"Загрузка UEFI (OVMF) без ключей Secure Boot, как того требует установщик",
"Сеть: Ethernet с DHCP по умолчанию",
"Сетевой адаптер VirtIO для максимальной пропускной способности"
]
}
},
"related": {
"heading": "Связанные материалы",
"itemsRich": [
{
"href": "/docs/create-vm/system-nas",
"label": "Обзор систем NAS",
"tail": " — краткое сравнение всех вариантов NAS."
},
{
"href": "/docs/create-vm/system-nas/synology",
"label": "ВМ Synology",
"tail": " — для сценария установки Synology DSM (Xpenology)."
},
{
"href": "/docs/disk-manager/import-disk-vm",
"label": "Импортировать диск в ВМ",
"tail": " — рекомендуется для NAS (физические диски предпочтительнее виртуальных)."
},
{
"href": "/docs/help-info/zfs-commands",
"label": "Команды управления ZFS",
"tail": " — если вы выберете TrueNAS или другой дистрибутив на базе ZFS."
},
{
"href": "/docs/create-vm",
"label": "Обзор создания ВМ",
"tail": "."
}
]
}
}
@@ -0,0 +1,259 @@
{
"meta": {
"title": "Создание ВМ: система Windows | Документация ProxMenux",
"description": "Создание и настройка виртуальных машин Windows на Proxmox VE с помощью ProxMenux. Описаны варианты с ISO-образом из UUP Dump и локальным ISO-образом, стандартная и расширенная настройка, единый план размещения данных, необязательный проброс GPU, настройка TPM 2.0 и установка драйверов VirtIO.",
"ogTitle": "Создание ВМ: система Windows | Документация ProxMenux",
"ogDescription": "Создание ВМ Windows на Proxmox VE с помощью ProxMenux. UUP Dump или локальный ISO-образ, единый план размещения данных, необязательный проброс GPU, TPM 2.0 и драйверы VirtIO.",
"ogImageAlt": "Меню виртуальных машин Windows в ProxMenux"
},
"header": {
"title": "Создание ВМ: система Windows",
"description": "Создайте виртуальную машину с Windows на Proxmox VE. ProxMenux обеспечивает выбор ISO-образа (UUP Dump или локальный образ), настройку процессора, оперативной памяти и типа машины, единый план хранения, необязательный проброс GPU, настройку TPM 2.0 и установку драйверов VirtIO.",
"section": "Виртуальные машины"
},
"intro": {
"title": "Что делает этот скрипт",
"body": "При создании виртуальной машины с Windows сначала запрашивается источник ISO-образа (UUP Dump или локальная копия, уже находящаяся в <code>/var/lib/vz/template/iso</code>), а затем запускается общий мастер создания виртуальных машин. Он применяет подходящие для Windows настройки по умолчанию — <code>q35</code> + OVMF + TPM 2.0, подключает ISO-образ с драйверами VirtIO ко второму приводу CD-ROM и создаёт виртуальную машину, готовую к запуску установщика Windows."
},
"image": {
"alt": "ProxMenux: варианты установки Windows",
"caption": "Варианты установки Windows"
},
"config": {
"heading": "Стандартная и расширенная настройка",
"intro": "После выбора ISO-образа ProxMenux предлагает использовать профиль виртуальной машины по умолчанию или открыть расширенный мастер. Профиль по умолчанию настроен для современных настольных и серверных редакций Windows.",
"defaultHeading": "Стандартная настройка",
"headerParam": "Параметр",
"headerValue": "Значение по умолчанию",
"defaultRows": [
{
"param": "Тип машины",
"valueRich": "<code>q35</code>"
},
{
"param": "BIOS",
"value": "OVMF (UEFI)"
},
{
"param": "Тип процессора",
"value": "Host"
},
{
"param": "Ядра",
"value": "4"
},
{
"param": "RAM",
"value": "8192 МБ"
},
{
"param": "Сетевой мост",
"valueRich": "<code>vmbr0</code>"
},
{
"param": "MAC-адрес",
"value": "Генерируется автоматически"
},
{
"param": "TPM",
"value": "Включено (v2.0)"
},
{
"param": "Запустить по завершении",
"value": "Нет"
}
],
"advancedHeading": "Расширенная настройка",
"advancedIntro": "Расширенный мастер позволяет настроить каждый параметр отдельно:",
"headerOptions": "Варианты",
"advancedRows": [
{
"param": "Тип машины",
"optionsRich": "<code>q35</code> или <code>i440fx</code>"
},
{
"param": "BIOS",
"options": "OVMF (UEFI) или SeaBIOS (Legacy)"
},
{
"param": "Тип процессора",
"options": "Host, KVM64 и другие модели процессоров из списка"
},
{
"param": "Ядра",
"options": "Количество ядер процессора"
},
{
"param": "RAM",
"options": "Память, выделенная виртуальной машине"
},
{
"param": "Сетевой мост",
"options": "Сетевой мост"
},
{
"param": "MAC-адрес",
"options": "Пользовательский MAC-адрес"
},
{
"param": "VLAN",
"options": "Тег VLAN (необязательно)"
},
{
"param": "MTU",
"options": "Размер MTU"
},
{
"param": "TPM",
"options": "TPM 2.0 добавляется автоматически для Windows; в этом мастере нет переключателя TPM."
}
],
"tpmWarnTitle": "Требования к TPM зависят от редакции Windows",
"tpmWarnBody": "Windows 11 обычно требует TPM 2.0. В Windows Server 2022 он необходим для определённых функций безопасности, но не для каждой установки. ProxMenux добавляет виртуальный TPM для Windows; в расширенном мастере нет переключателя TPM."
},
"storagePlan": {
"heading": "План хранения",
"body": "После настройки процессора и оперативной памяти ProxMenux открывает меню <strong>План хранения</strong>, в котором можно объединить виртуальные диски, импортированные диски и устройства с пробросом PCI в одной виртуальной машине, добавляя их по одному и завершая настройку, когда всё готово.",
"virtualDiskTitle": "a. Добавить виртуальный диск",
"virtualDiskItems": [
"Выводит список томов хранилищ Proxmox, доступных на хосте.",
"Вы выбираете целевое хранилище и размер в ГБ.",
"Диск использует выбранную шину: SCSI (по умолчанию), SATA, VirtIO или IDE. Слоты SATA обозначаются <code>sata0</code>, <code>sata1</code>, …; всего доступно шесть слотов с номерами 0–5."
],
"importDiskTitle": "b. Добавить диск для импорта",
"importDiskItems": [
"Обнаруживает физические диски, которые можно безопасно импортировать (системные и защищённые диски скрыты).",
"Вы выбираете один или несколько дисков в списке с флажками.",
"Импортированные диски используют выбранную шину и подключаются через <code>qm set</code>."
],
"pciTitle": "c. Добавить контроллер или NVMe (проброс PCI)",
"pciItems": [
"Обнаруживает контроллеры HBA SATA/SAS и устройства NVMe на хосте и позволяет пробросить в ВМ <em>контроллер целиком</em>. IOMMU должен быть включён; скрипт предлагает включить его и при необходимости перезагружает хост.",
"На этапе подтверждения выводится предупреждение о риске, затрагивающем весь контроллер: вся плата, включая все подключённые к ней диски, становится недоступна хосту.",
"Выбранные устройства PCI подключаются с помощью команд вида <code>qm set VMID --hostpci0 PCI_ADDRESS,pcie=1</code>. Замените VMID и PCI_ADDRESS на идентификатор ВМ и адрес PCI соответственно и используйте свободный индекс hostpci для каждого устройства."
],
"resetTitle": "Сброс и завершение",
"resetBody": "В меню также доступны <strong>r</strong> (сбросить текущий выбор и начать заново) и <strong>d</strong> (завершить и продолжить). Завершить работу с пустым планом нельзя."
},
"gpu": {
"heading": "Необязательный проброс GPU",
"body": "После составления плана хранения, если на хосте обнаружен совместимый GPU, ProxMenux предлагает запустить помощник проброса GPU. Описание работы помощника см. в разделе <gpuLink>Добавление GPU в ВМ (проброс)</gpuLink> — может потребоваться перезагрузка хоста."
},
"autoFeatures": {
"heading": "Автоматически настраиваемые функции ВМ",
"efiTitle": "Диск EFI",
"efiBody": "При выборе OVMF (UEFI) ProxMenux создаёт системный диск EFI размером 4 МБ в выбранном хранилище и подключает его к виртуальной машине, чтобы у прошивки UEFI было место для хранения переменных.",
"tpmTitle": "TPM 2.0",
"tpmBody": "ProxMenux добавляет виртуальное устройство TPM 2.0 для виртуальных машин с Windows. Это обеспечивает выполнение требования Windows 11 к TPM и поддержку функций Windows Server, зависящих от TPM.",
"isoTitle": "Подключение ISO",
"isoBody": "Установочный ISO-образ подключается к <code>ide2</code>. ISO-образ с драйверами VirtIO загружается (при необходимости) и подключается к <code>ide3</code> для использования на этапе <em>Загрузить драйвер</em>.",
"guestTitle": "Гостевой агент QEMU",
"guestBody": "Канал гостевого агента включён в конфигурации виртуальной машины. Сам агент устанавливается внутри Windows запуском <code>virtio-win-guest-tools.exe</code> после завершения установки системы."
},
"installOptions": {
"heading": "Варианты установки Windows",
"intro": "ProxMenux предлагает два способа получения установочного носителя Windows:",
"uupTitle": "Создание ISO с помощью UUP Dump",
"uupLogoAlt": "Логотип UUP Dump",
"uupBody": "Скрипт <strong>UUP Dump ISO Creator</strong> — это утилита ProxMenux, которая создаёт ISO-образ Windows на лету из файлов с серверов Центра обновления Windows Microsoft. Она загружает чистые официальные установочные файлы (включая сборки Insider Preview).",
"uupItems": [
"Доступ к новейшим сборкам Windows.",
"Поддержка версий Insider Preview.",
"Чистые официальные установочные файлы Microsoft.",
"Автоматическое создание ISO-образа и его подключение к виртуальной машине.",
"Поддержка редакций Home, Pro и Enterprise."
],
"uupLearnMore": "Подробнее об UUP Dump ISO Creator",
"localTitle": "Установка с локального ISO-образа",
"localBody": "Используется ISO-образ Windows, который вы уже загрузили в локальное хранилище узла (<code>/var/lib/vz/template/iso</code>). Скрипт выводит список всех найденных ISO-образов, кроме VirtIO, и позволяет выбрать один из них.",
"localImageAlt": "Меню выбора локального ISO-образа",
"localImageCaption": "Меню выбора локального ISO-образа"
},
"endToEnd": {
"heading": "Что делает скрипт от начала до конца",
"items": [
"Получает ISO-образ Windows (сборку UUP Dump или локальную копию).",
"Применяет стандартные или расширенные настройки CPU / RAM / BIOS / типа машины.",
"Открывает план настройки хранилища и подключает выбранные виртуальные диски, импортированные диски и устройства PCI.",
"Создаёт диск EFI (для установки в режиме UEFI) и подключает устройство TPM 2.0.",
"Подключает ISO-образ Windows к <code>ide2</code>.",
"Скачивает ISO-образ с драйверами VirtIO и подключает его к <code>ide3</code>.",
"Задаёт порядок загрузки (сначала диск, затем ISO-образ).",
"Включает канал связи с QEMU Guest Agent.",
"При необходимости запускает помощник по пробросу GPU.",
"Создаёт оформленное HTML-описание и добавляет его к виртуальной машине.",
"Запускает виртуальную машину, если вы выбрали её запуск."
]
},
"virtio": {
"heading": "Драйверы VirtIO во время установки",
"body": "По умолчанию средство создания ВМ использует диски SCSI с контроллером SCSI VirtIO и сетевой адаптер VirtIO. При установке со стандартного ISO-образа Windows могут потребоваться драйверы для этих устройств с ISO-образа VirtIO, подключённого к <code>ide3</code>. Диски SATA обычно работают со встроенными драйверами Windows; выбор SATA не меняет сетевой адаптер VirtIO.",
"warnTitle": "Загрузите сетевой драйвер VirtIO, если в Windows нет доступа к сети",
"warnBody": "ВМ использует сетевой адаптер VirtIO (<code>virtio</code>). Если в Windows нет его драйвера, загрузите его во время установки, чтобы получить доступ к сети. Иначе при первом запуске активация и Центр обновления Windows могут быть недоступны.",
"stepLabel": "Шаг",
"steps": [
{
"title": "Перейдите к экрану «Где вы хотите установить Windows?»",
"body": "Если во время установки Windows диски не отображаются, значит, драйвер накопителя для выбранного интерфейса (SCSI или VirtIO) ещё не загружен. Загрузите его вручную с подключённого ISO-образа VirtIO.",
"img": "/vm/windows/virtio-step-1.png",
"caption": "Установка Windows: диски не отображаются"
},
{
"title": "Нажмите «Загрузить драйвер»",
"bodyRich": "Нажмите <strong>Загрузить драйвер</strong>, чтобы просмотреть содержимое подключённого ISO-образа VirtIO и выбрать драйвер накопителя, соответствующий выбранному интерфейсу.",
"img": "/vm/windows/virtio-step-2.png",
"caption": "Нажмите «Загрузить драйвер», чтобы просмотреть содержимое ISO-образа VirtIO"
},
{
"title": "Перейдите в нужную папку с драйверами",
"bodyRich": "На ISO-образе VirtIO выберите <code>vioscsi</code> для контроллера SCSI VirtIO или <code>viostor</code> для блочных дисков VirtIO. Затем выберите вложенную папку для вашей версии и архитектуры Windows.",
"img": "/vm/windows/virtio-step-3.png",
"caption": "Перейдите в соответствующую папку с драйверами"
},
{
"title": "Выберите драйвер",
"bodyRich": "Windows отобразит список доступных драйверов. Выберите тот, который соответствует вашей конфигурации (обычно <strong>контроллер SCSI Red Hat VirtIO</strong>), и нажмите <strong>Далее</strong>.",
"img": "/vm/windows/virtio-step-4.png",
"caption": "Выберите драйвер VirtIO, соответствующий интерфейсу вашего диска"
},
{
"title": "(Необязательно) Установите сетевой драйвер",
"bodyRich": "Если в качестве сетевого интерфейса вы также выбрали VirtIO, загрузите сетевой драйвер из папки <code>NetKVM</code> на том же ISO-образе, выбрав подпапку для вашей версии Windows. Без этого шага Windows установится без доступа к интернету.",
"img": "/vm/windows/virtio-step-5.png",
"caption": "Загрузите сетевой драйвер VirtIO, чтобы обеспечить доступ к интернету во время установки"
}
],
"tipTitle": "После установки: запустите virtio-win-guest-tools.exe",
"tipBody": "После установки Windows откройте ISO-образ VirtIO в Проводнике и запустите <code>virtio-win-guest-tools.exe</code>. Эта программа за один раз установит оставшиеся драйверы (сети, дисплея, устройств ввода, динамического управления памятью), а также QEMU Guest Agent."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/utils/UUp-Dump-ISO-Creator",
"label": "Создание ISO с помощью UUP Dump",
"tail": " — создавайте актуальные установочные ISO-образы Windows на узле Proxmox."
},
{
"href": "/docs/disk-manager/import-disk-image-vm",
"label": "Импортировать образ диска в ВМ",
"tail": " — импортируйте существующий образ диска Windows (.vmdk, .qcow2, .img или .raw) в существующую ВМ; образы .vhdx сначала преобразуйте в поддерживаемый формат."
},
{
"href": "/docs/hardware/gpu-vm-passthrough",
"label": "Добавить GPU в ВМ (прямой проброс)",
"tail": " — для ВМ с Windows и аппаратным ускорением GPU."
},
{
"href": "/docs/help-info/vm-ct-commands",
"label": "Команды управления ВМ и контейнерами",
"tail": " — справочник по интерфейсу командной строки qm."
},
{
"href": "/docs/create-vm",
"label": "Обзор создания ВМ",
"tail": "."
}
]
}
}
@@ -0,0 +1,128 @@
{
"meta": {
"title": "Добавление контроллера или NVMe в ВМ | Документация ProxMenux",
"description": "Проброс контроллера хранения (SATA / SAS HBA) или устройства NVMe по PCI в ВМ Proxmox с помощью ProxMenux. Включение IOMMU, обнаружение конфликтов и настройка подключения через qm set --hostpci.",
"ogTitle": "Добавление контроллера или NVMe в ВМ | Документация ProxMenux",
"ogDescription": "Пробросьте целиком адаптер SATA / SAS HBA или устройство NVMe в ВМ Proxmox. ProxMenux выполняет настройку IOMMU, обнаружение конфликтов и подключение через hostpci."
},
"header": {
"title": "Добавить контроллер или NVMe в ВМ",
"description": "Передайте целиком адаптер шины SATA / SAS (HBA) или устройство NVMe в ВМ Proxmox с помощью проброса PCI. ProxMenux проверяет IOMMU и — с вашего согласия — включает его, перечисляет устройства, доступные для проброса, исключает конфликтующие устройства и настраивает назначение с помощью qm set --hostpci.",
"section": "Диспетчер дисков · ВМ"
},
"intro": {
"title": "Что делает эта функция (и чего она не делает)",
"body": "Это <strong>проброс на уровне устройства</strong>: карта PCIe становится недоступна ядру хоста и привязывается к <code>vfio-pci</code>. ВМ видит сам контроллер, а не отдельные подключённые к нему диски, и загружает собственный драйвер именно для этой модели. Все диски, подключённые к этому контроллеру, автоматически передаются вместе с ним — с прямым доступом к данным SMART, всеми возможностями прошивки и без промежуточного слоя Proxmox."
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Процесс состоит из двух чётко разделённых этапов: «сбор информации, проверка IOMMU и составление списка подходящих устройств» и «непосредственное подключение устройства PCI». До окончательного подтверждения в конфигурацию ВМ ничего не записывается."
},
"iommu": {
"heading": "Группы IOMMU — почему карта передаётся целиком",
"body": "Границей изоляции при пробросе PCI служит <strong>группа IOMMU</strong> — наименьшая единица, которую IOMMU процессора может изолировать. Устройства в одной группе не могут быть изолированы друг от друга. Если контроллер SATA находится в одной группе с контроллером USB, для проброса SATA может также потребоваться освободить контроллер USB от использования хостом, либо проброс может оказаться невозможным. Проброс одного устройства не означает автоматического назначения ВМ всех устройств этой группы.",
"outro": "ProxMenux показывает группу IOMMU рядом с каждым устройством и предупреждает, если в группе есть другие устройства помимо нужного контроллера. Вы можете продолжить, если наличие дополнительных устройств в группе допустимо (например, если все они — дисковые контроллеры), или отказаться, если это не так."
},
"prereqs": {
"heading": "Предварительные требования",
"items": [
"<strong>Процессор и материнская плата поддерживают</strong> VT-d (Intel) или AMD-Vi, и эта функция включена в прошивке (BIOS/UEFI). ProxMenux может включить поддержку на уровне ядра, но не может включить эту функцию в прошивке.",
"Целевая ВМ должна быть <strong>выключена</strong> перед подключением устройств PCI.",
"Контроллер или устройство NVMe <strong>не содержит корневую файловую систему Proxmox</strong>. Скрипт скрывает все устройства, используемые хостом.",
"В гостевой ОС должны быть драйверы для этой модели контроллера. Linux поддерживает практически любые HBA без установки дополнительных драйверов; в Windows необходимо установить драйвер производителя <em>до</em> загрузки с подключённым контроллером."
],
"warnTitle": "Миграция без остановки невозможна",
"warnBody": "ВМ с пробросом PCI привязана к узлу, в котором физически установлена плата. Миграция без остановки между узлами завершится ошибкой. Учитывайте это при планировании резервного копирования и репликации."
},
"steps": {
"heading": "Пошаговая инструкция",
"stepLabel": "Шаг",
"list": [
{
"title": "Выберите целевую ВМ",
"bodyRich": "ProxMenux читает <code>qm list</code> и показывает все ВМ. Выберите ту, которой будет передан контроллер.",
"img": "/disk/nvme-passthrough/vm-selection.png",
"alt": "Диалог выбора ВМ",
"caption": "Диалог выбора ВМ"
},
{
"title": "Проверка IOMMU",
"bodyRich": "Если IOMMU не включён в командной строке ядра, ProxMenux предлагает включить его. Скрипт изменяет <code>/etc/kernel/cmdline</code> (для systemd-boot) или <code>/etc/default/grub</code> (для GRUB) и добавляет параметр, соответствующий вашему процессору:",
"items": [
"<code>intel_iommu=on</code> для процессоров Intel.",
"<code>amd_iommu=on</code> для процессоров AMD."
],
"outro": "После этого изменения требуется перезагрузка. Скрипт предлагает перезагрузить систему сейчас или позже; продолжить настройку проброса невозможно, пока не вступит в силу новая командная строка ядра.",
"img": "/disk/nvme-passthrough/iommu-warning.png",
"alt": "Диалог «Требуется IOMMU»",
"caption": "Требуется IOMMU — предложение включить его и перезагрузить систему"
},
{
"title": "Обнаружение устройств",
"body": "ProxMenux выводит список всех контроллеров хранения данных (SATA / SAS HBA) и всех устройств NVMe на шине PCI. Для каждого устройства отображаются:",
"items": [
"Адрес PCI (<code>00:17.0</code>, <code>01:00.0</code>, …).",
"Производитель / описание устройства.",
"Группа IOMMU и предупреждение ⚠, если в эту группу входят другие, не связанные с ним устройства.",
"Диски, подключённые к контроллеру в данный момент (чтобы вы знали, какие диски будут переданы в ВМ вместе с ним)."
],
"img": "/disk/nvme-passthrough/device-list.png",
"alt": "Список контроллеров и устройств NVMe",
"caption": "Список контроллеров и устройств NVMe со сведениями о группах IOMMU"
},
{
"title": "Обнаружение конфликтов",
"bodyRich": "Скрипт блокирует устройства, проброс которых явно небезопасен: уже назначенные другой ВМ (через <code>hostpci</code> в её конфигурации), используемые хостом (контроллер корневого диска) или входящие в группу IOMMU, остальные устройства которой скрипт не может надёжно идентифицировать. Устройства, прошедшие проверку, доступны для выбора.",
"img": "/disk/nvme-passthrough/conflict-warning.png",
"alt": "Предупреждение об обнаружении конфликта",
"caption": "Обнаружение конфликтов — устройство заблокировано с указанием причины"
},
{
"title": "Подключение и завершение",
"bodyRich": "Для каждого выбранного устройства ProxMenux выполняет <code>qm set &lt;VMID&gt; --hostpciN &lt;pci-addr&gt;,pcie=1</code>, выбирая следующий свободный слот <code>hostpci</code>. Если IOMMU был включён в ходе этого сеанса, появится напоминание о необходимости перезагрузки перед запуском ВМ.",
"img": "/disk/nvme-passthrough/assignment.png",
"alt": "Сводка назначений",
"caption": "Сводка назначений — слоты hostpciN и PCI-адреса подключённых устройств"
}
]
},
"manual": {
"heading": "Эквивалентные действия вручную"
},
"troubleshoot": {
"heading": "Устранение неполадок",
"noGroupsTitle": "IOMMU включён, но в /sys/kernel/iommu_groups/ нет групп",
"noGroupsBody": "Для применения параметров командной строки ядра необходима перезагрузка. Если после перезагрузки группы по-прежнему отсутствуют, вероятно, VT-d / AMD-Vi отключён в прошивке — проверьте настройки BIOS/UEFI.",
"busyTitle": "ВМ не запускается с сообщением «hostpciN: device busy»",
"busyBody": "PCI-устройство всё ещё занято другим процессом. Наиболее частые причины: ранее работавшая ВМ аварийно завершилась, не освободив устройство, или ядро хоста снова взяло его под управление при последней загрузке. Выполните <code>lspci -nnk -s &lt;addr&gt;</code>, чтобы узнать, какой драйвер привязан к устройству; это должен быть <code>vfio-pci</code>. Полная перезагрузка хоста обычно устраняет проблему.",
"noDisksTitle": "Гостевая ОС видит контроллер, но не диски",
"noDisksBody": "В гостевой ОС отсутствует драйвер для этой модели контроллера. В Linux такое встречается крайне редко, а в Windows — встречается. Установите драйвер производителя (например, LSI / Broadcom для старых SAS HBA), пока карта отключена от ВМ, затем подключите карту и перезагрузите гостевую ОС.",
"sharedTitle": "В группу IOMMU входит постороннее устройство",
"sharedBody": "Варианты: (a) переставьте карту в другой слот PCIe, чтобы изменить её группу; (b) включите <em>ACS override</em> в ядре для разделения групп (это снижает безопасность — изучите последствия перед применением); (c) выберите другую карту в группе без посторонних устройств."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/disk-manager/import-disk-vm",
"label": "Импортировать диск в ВМ",
"tail": " — альтернативный подход: подключение физического диска через Proxmox без полного проброса PCIe."
},
{
"href": "/docs/hardware/gpu-vm-passthrough",
"label": "Добавить GPU в ВМ (прямой проброс)",
"tail": " — те же принципы IOMMU / VFIO применительно к GPU."
},
{
"href": "/docs/help-info/gpu-commands",
"label": "Команды для проброса GPU",
"tail": " — команды проверки IOMMU также применимы к пробросу контроллеров / NVMe."
},
{
"href": "/docs/disk-manager",
"label": "Обзор диспетчера дисков",
"tail": "."
}
]
}
}
@@ -0,0 +1,142 @@
{
"meta": {
"title": "Форматирование / очистка физического диска | Документация ProxMenux",
"description": "Безопасная очистка и форматирование физических дисков в Proxmox VE с помощью ProxMenux. Четыре режима работы, строгие защитные фильтры (системные, смонтированные и используемые диски заблокированы) и двойное подтверждение, включая ввод полного пути.",
"ogTitle": "Форматирование / очистка физического диска | Документация ProxMenux",
"ogDescription": "Безопасная очистка или форматирование физического диска в Proxmox. Отображение только безопасных для обработки дисков, 4 режима работы, двойное подтверждение."
},
"header": {
"title": "Форматировать / стереть физический диск",
"description": "Безопасная очистка или форматирование физического диска на хосте Proxmox. ProxMenux показывает только полностью свободные диски (не используемые системой, не указанные в конфигурациях гостевых систем и не смонтированные) и требует двойного подтверждения — ответа «да/нет» и ввода полного пути к диску — перед уничтожением любых данных.",
"section": "Диспетчер дисков · Утилиты"
},
"danger": {
"title": "Инструмент, уничтожающий данные",
"body": "Каждая операция здесь выполняет запись на диск. Отменить её невозможно. ProxMenux применяет строгие фильтры безопасности и требует подтверждений, но ответственность за выбор правильного диска лежит на вас. Дважды прочитайте путь к диску вслух, прежде чем вводить его."
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Процесс состоит из двух этапов, между которыми действует трёхступенчатый фильтр безопасности. Список дисков, режим операции и сведения о файловой системе собираются на этапе 1; запись начинается только после того, как на этапе 2 будет пройдена заключительная повторная проверка непосредственно перед выполнением."
},
"visibility": {
"heading": "Правила отображения",
"intro": "Ещё до появления меню ProxMenux фильтрует список дисков. Отображаются только диски, безопасность выбора которых подтверждена:",
"items": [
"<strong>Отображаются</strong> — диски, которые <em>не</em> используются хостом (корневой пул, swap, смонтированные диски, активные ZFS/LVM/RAID) и <em>не</em> указаны ни в одной конфигурации VM/LXC (независимо от того, запущена или остановлена соответствующая виртуальная машина или контейнер).",
"<strong>Скрыты</strong> — диски хоста / системные диски.",
"<strong>Скрыты</strong> — диски, на которые ссылается конфигурация VM/LXC."
],
"safetyTitle": "Безопасность при подтверждении и выполнении",
"safetyItems": [
"Для дисков с устаревшими или активными метаданными отображаются подробные предупреждения <em>до</em> подтверждения.",
"Операции с дисками, используемыми <strong>запущенной</strong> VM, <strong>безусловно блокируются</strong> на этапе подтверждения.",
"Операции с дисками, на которых есть смонтированные разделы, <strong>безусловно блокируются</strong> на этапе выполнения (непосредственно перед любой записью проводится новая проверка).",
"Всегда требуются два подтверждения: диалог <em>да/нет</em> и точный ввод полного пути к диску."
]
},
"modes": {
"heading": "Режимы работы",
"intro": "После выбора диска вы выбираете один из четырёх режимов. Они различаются тем, что уничтожают и что сохраняют:",
"headerMode": "Режим",
"headerPart": "Таблица разделов",
"headerData": "Данные",
"headerUseCase": "Сценарий использования",
"rows": [
{
"mode": "1. Очистить всё",
"part": "Уничтожается",
"data": "Сигнатуры стираются",
"useCase": "Удаляет таблицу разделов и метаданные файловой системы и RAID, обнуляет первые и последние 16 MiB, а на накопителях с поддержкой discard выполняет TRIM для всего диска. Остальные данные не перезаписываются, и на HDD их восстановление может оставаться возможным; это не безопасное стирание данных."
},
{
"mode": "2. Удаление меток ФС",
"part": "Сохранена",
"data": "Сохранена",
"useCase": "Удаляет устаревшие сигнатуры ZFS / LVM / RAID, чтобы диск больше не задействовался автоматически. Основной объём пользовательских данных не перезаписывается, но удаление сигнатур может сделать эти данные недоступными."
},
{
"mode": "3. Обнуление всех данных",
"part": "Сохранена",
"data": "Уничтожены (обнулены)",
"useCase": "Перезаписывает существующие разделы нулями, сохраняя таблицу разделов. Нераспределённое пространство и резервные области SSD не затрагиваются; полная очистка устройства от данных не гарантируется."
},
{
"mode": "4. Полное форматирование",
"part": "Новая GPT",
"data": "Уничтожается",
"useCase": "Готовый к использованию диск с одним новым разделом и новой файловой системой."
}
],
"fullFormatOutro": "При выборе режима <strong>Полное форматирование</strong> появляются два дополнительных диалоговых окна:",
"fullFormatItems": [
"<strong>Файловая система</strong> — <code>ext4</code>, <code>xfs</code>, <code>exfat</code> (для использования на разных платформах) или <code>btrfs</code>. Если необходимые инструменты (например, <code>mkfs.btrfs</code>) отсутствуют, операция прерывается с понятным сообщением.",
"<strong>Метка</strong> — необязательная метка файловой системы для её идентификации."
]
},
"steps": {
"heading": "Пошаговая инструкция",
"stepLabel": "Шаг",
"list": [
{
"title": "Выберите свободный диск",
"body": "ProxMenux выводит список всех дисков, прошедших указанные выше фильтры видимости. Диски с отметкой ⚠ содержат устаревшие метаданные и отображаются с подробной информацией, чтобы вы знали, что именно собираетесь перезаписать."
},
{
"title": "Выберите режим работы",
"bodyRich": "Выберите <strong>Полная очистка</strong>, <strong>Удаление меток ФС</strong>, <strong>Обнуление всех данных</strong> или <strong>Полное форматирование</strong> в соответствии с таблицей выше."
},
{
"title": "Выберите файловую систему и метку (только при полном форматировании)",
"body": "ext4 / xfs / exfat / btrfs и необязательная метка."
},
{
"title": "Подтвердите дважды",
"bodyRich": "ProxMenux показывает сводку предстоящих действий. Подтвердите операцию в диалоговом окне «да/нет» и <strong>введите полный путь к диску</strong> точно так, как он показан (например, <code>/dev/sdc</code>). Любой другой ввод прерывает операцию."
},
{
"title": "Повторная проверка и выполнение",
"body": "Непосредственно перед записью скрипт повторно проверяет состояние диска. Если за это время был смонтирован раздел или запущена виртуальная машина, выполнение прерывается. В противном случае выполняется выбранная операция, а в конце выводится сводка."
}
]
},
"manual": {
"heading": "Эквивалентные команды для ручного выполнения",
"body": "Если вы предпочитаете выполнить эквивалентные команды вручную:"
},
"troubleshoot": {
"notListedTitle": "Диск не отображается в меню",
"notListedBody": "Он исключён из списка в целях безопасности. Частые причины: диск смонтирован (даже в <code>/mnt/tmp</code>), является активным участником ZFS / LVM / RAID, указан в конфигурации ВМ или LXC либо является корневым диском Proxmox. Выполните <code>lsblk -f</code> и <code>cat /proc/mdstat</code> на хосте, чтобы выяснить причину.",
"busyTitle": "«Диск может быть занят» / не удалось размонтировать",
"busyBody": "Какой-то процесс всё ещё держит открытым файл на разделе этого диска — чаще всего это контейнер или оболочка, текущий рабочий каталог которой находится внутри точки монтирования. Найдите этот процесс с помощью <code>lsof | grep /dev/sdX</code> или <code>fuser -vm /dev/sdX1</code>, остановите его и запустите инструмент повторно."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/disk-manager/smart-disk-test",
"label": "Состояние и проверка диска по SMART",
"tail": " — проверьте диск до и после очистки, чтобы убедиться в его исправности."
},
{
"href": "/docs/disk-manager/import-disk-vm",
"label": "Импортировать диск в ВМ",
"tail": " — передайте только что отформатированный диск в ВМ."
},
{
"href": "/docs/storage-share/host-local-disk",
"label": "Добавление локального диска в качестве хранилища Proxmox",
"tail": " — зарегистрируйте очищенный диск как пул хранения Proxmox."
},
{
"href": "/docs/help-info/storage-commands",
"label": "Команды для работы с хранилищами и дисками",
"tail": " — справочник по lsblk, blkid, parted."
},
{
"href": "/docs/disk-manager",
"label": "Обзор диспетчера дисков",
"tail": "."
}
]
}
}
@@ -0,0 +1,110 @@
{
"meta": {
"title": "Импорт образа диска в ВМ | Документация ProxMenux",
"description": "Импорт файла образа диска (.img / .qcow2 / .vmdk / .raw) в существующую ВМ Proxmox с помощью ProxMenux. Для каждого образа можно выбрать интерфейс, эмуляцию SSD и флаг загрузочного диска; для импорта используется qm importdisk.",
"ogTitle": "Импорт образа диска в ВМ | Документация ProxMenux",
"ogDescription": "Импорт образов дисков .img / .qcow2 / .vmdk / .raw в существующую ВМ с помощью ProxMenux. Для импорта используется qm importdisk."
},
"header": {
"title": "Импортировать образ диска в ВМ",
"description": "Импорт файла образа диска (.img, .qcow2, .vmdk или .raw) в существующую ВМ Proxmox. ProxMenux заранее запрашивает все параметры — целевую ВМ, хранилище Proxmox, исходный каталог, интерфейс, эмуляцию SSD и порядок загрузки — а затем выполняет qm importdisk для каждого выбранного образа.",
"section": "Диспетчер дисков · ВМ"
},
"intro": {
"title": "Что делает этот инструмент",
"body": "В отличие от <em>импорта диска в ВМ</em> (при котором подключается физический диск напрямую), эта процедура использует находящийся на хосте <strong>файл</strong> — экспортированный из другого гипервизора, скачанный как облачный образ или извлечённый из резервной копии — и преобразует его в полноценный диск ВМ Proxmox на выбранном вами томе хранилища. Исходный файл сохраняется: ProxMenux копирует его, а не перемещает."
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Процедура состоит из двух этапов. На первом этапе через диалоговые окна заранее задаются все параметры (ВМ, хранилище, исходный каталог, образы и параметры каждого образа). На втором этапе выполняется <code>qm importdisk</code> для каждого выбранного образа. Пока второй этап не начался, ничего не копируется и конфигурация ВМ не изменяется."
},
"prereqs": {
"heading": "Предварительные требования",
"items": [
"На хосте должна быть настроена хотя бы одна ВМ. Целевая ВМ должна быть <strong>выключена</strong>.",
"В исходном каталоге должен быть хотя бы один файл образа поддерживаемого формата. Поддерживаются: <code>.img</code>, <code>.qcow2</code>, <code>.vmdk</code>, <code>.raw</code>.",
"В целевом хранилище Proxmox должно быть достаточно свободного места для размещения всех импортируемых дисков.",
"По умолчанию ProxMenux ищет образы в <code>/var/lib/vz/template/iso</code>. При появлении запроса можно указать любой другой каталог на хосте."
]
},
"steps": {
"heading": "Пошаговая инструкция",
"stepLabel": "Шаг",
"list": [
{
"title": "Выберите целевую ВМ",
"bodyRich": "ProxMenux считывает <code>qm list</code> и отображает все ВМ. Выберите ВМ, в которую будут импортированы диски."
},
{
"title": "Выберите хранилище Proxmox",
"bodyRich": "В списке отображаются все хранилища, для которых включён тип содержимого <code>images</code>. Если подходящее хранилище только одно, оно выбирается автоматически, а диалоговое окно не отображается."
},
{
"title": "Выберите исходный каталог",
"bodyRich": "Выберите каталог по умолчанию (<code>/var/lib/vz/template/iso</code>) или введите свой путь — обычно это каталог, в который вы скачали или загрузили образ. Скрипт отклоняет несуществующие пути."
},
{
"title": "Выберите один или несколько образов",
"bodyRich": "В каталоге выполняется поиск файлов <code>.img</code> / <code>.qcow2</code> / <code>.vmdk</code> / <code>.raw</code>. Можно выбрать сразу несколько образов; на следующем шаге параметры будут заданы отдельно для каждого из них."
},
{
"title": "Параметры каждого образа",
"intro": "Для каждого выбранного образа ProxMenux запрашивает:",
"items": [
"<strong>Интерфейс</strong> — <code>scsi</code> (по умолчанию), <code>virtio</code>, <code>sata</code> или <code>ide</code>. Определяет, через какой интерфейс диск будет доступен гостевой системе.",
"<strong>Эмуляция SSD</strong> — доступна только для интерфейсов, отличных от VirtIO. Добавляет <code>ssd=1</code>, чтобы гостевая система распознавала диск как твердотельный. Поддержку Discard/TRIM необходимо настроить отдельно.",
"<strong>Загрузочный диск</strong> — если выбран ответ «да», ProxMenux добавляет диск в порядок загрузки, делая его основным загрузочным устройством виртуальной машины."
]
},
{
"title": "Импорт и подключение",
"bodyRich": "ProxMenux выполняет <code>qm importdisk</code> для каждого образа (при необходимости преобразуя формат на лету), подключает полученный диск к следующему свободному слоту (<code>scsiN</code>, <code>sataN</code>, …) с выбранными вами параметрами и, если вы отметили какой-либо диск как загрузочный, обновляет порядок загрузки. Ход выполнения отображается в терминале."
}
]
},
"manual": {
"heading": "Эквивалентные действия вручную",
"body": "Импорту одного образа соответствуют три команды <code>qm</code>:",
"warnTitle": "Преобразование формата образа",
"warnBody": "Если целевое хранилище не поддерживает хранение образов в исходном формате (например, хранилище LVM не поддерживает <code>.qcow2</code>), <code>qm importdisk</code> автоматически преобразует образ. Для образов размером в несколько гигабайт это может занять несколько минут; учитывайте это при планировании и не прерывайте работу скрипта."
},
"troubleshoot": {
"heading": "Устранение неполадок",
"noImagesTitle": "«Совместимые образы дисков не найдены»",
"noImagesBody": "Скрипт проверил каталог, но не нашёл файлов <code>.img</code> / <code>.qcow2</code> / <code>.vmdk</code> / <code>.raw</code>. Проверьте расширение (регистр имеет значение), убедитесь, что файл находится непосредственно в выбранном каталоге (поиск во вложенных каталогах не выполняется) и что права доступа позволяют пользователю root читать его.",
"slowTitle": "Импорт выполняется медленно",
"slowBody": "Скорость преобразования между VMDK, QCOW2 и raw может быть ограничена производительностью процессора и операций ввода-вывода. Скорость импорта зависит от скорости чтения исходных данных, записи в целевое хранилище и необходимой распаковки. По возможности используйте исходные образы в формате raw или qcow2.",
"uefiTitle": "При загрузке с импортированного диска открывается оболочка UEFI",
"uefiBody": "Образ был создан для устаревшего режима загрузки (SeaBIOS), но виртуальная машина использует OVMF (или наоборот). Либо измените BIOS виртуальной машины в Proxmox в соответствии с образом, либо пересоздайте образ в нужном режиме перед импортом."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/disk-manager/import-disk-vm",
"label": "Импортировать диск в ВМ",
"tail": " — аналогичная процедура, но для прямого проброса физических дисков."
},
{
"href": "/docs/utils/import-vm",
"label": "Импорт ВМ из OVA / OVF",
"tail": " — если у вас есть полный пакет виртуальной машины, а не только образ диска."
},
{
"href": "/docs/utils/UUp-Dump-ISO-Creator",
"label": "Создание ISO с помощью UUP Dump",
"tail": " — создайте ISO-образ Windows, если он нужен для установки с нуля."
},
{
"href": "/docs/help-info/storage-commands",
"label": "Команды для работы с хранилищами и дисками",
"tail": " — справочная информация по qm importdisk и qemu-img convert."
},
{
"href": "/docs/disk-manager",
"label": "Обзор диспетчера дисков",
"tail": "."
}
]
}
}
@@ -0,0 +1,115 @@
{
"meta": {
"title": "Импорт диска в LXC | Документация ProxMenux",
"description": "Подключите физический диск к существующему контейнеру LXC на Proxmox VE с помощью ProxMenux. Поддерживаются определение файловой системы и форматирование, настройка точки монтирования, преобразование непривилегированного контейнера в привилегированный и постоянные пути к устройствам.",
"ogTitle": "Импорт диска в LXC | Документация ProxMenux",
"ogDescription": "Подключение физического диска к существующему контейнеру LXC. Настройка файловой системы и точки монтирования, а также преобразование непривилегированного контейнера в привилегированный."
},
"header": {
"title": "Импортировать диск в LXC",
"description": "Подключение физического диска к существующему контейнеру LXC на хосте Proxmox. ProxMenux обнаруживает свободные диски, при необходимости форматирует их с использованием поддерживаемой файловой системы и подключает раздел к точке монтирования внутри контейнера, используя постоянные пути к устройствам.",
"section": "Управление дисками · LXC"
},
"intro": {
"title": "Проброс диска в виртуальную машину и в LXC: различия",
"body": "При пробросе диска в LXC контейнер <strong>не получает прямой доступ к блочному устройству</strong>. Контейнер получает <em>точку монтирования</em> — то есть каталог, связанный с выбранным вами разделом на хосте. В отличие от виртуальной машины, контейнер использует ядро хоста, поэтому чтение файловой системы (ext4 / xfs / btrfs) и управление ею выполняет сам Proxmox, который затем предоставляет к ней доступ контейнеру."
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Процесс состоит из двух чётко разделённых этапов: «сбор информации и принятие решений» и «фактическое изменение конфигурации контейнера». До окончательного подтверждения в CT ничего не монтируется.",
"summary": "ProxMenux исключает из списка корневой диск, смонтированные диски и диски, уже указанные в конфигурации любой виртуальной машины или контейнера LXC. Диски, активно используемые в ZFS/LVM/RAID, скрыты; диски с устаревшими сигнатурами отмечены значком ⚠, чтобы вы могли удалить эти сигнатуры перед форматированием."
},
"prereqs": {
"heading": "Предварительные требования",
"items": [
"На хосте должен быть настроен хотя бы один контейнер LXC.",
"Контейнер должен быть <strong>привилегированным</strong>, либо вы должны согласиться на предложенное скриптом преобразование.",
"Хотя бы один физический диск, не используемый хостом или другими гостевыми системами."
],
"warnTitle": "Требуется привилегированный контейнер",
"warnBody": "Для прямого подключения диска этому скрипту требуется <strong>привилегированный</strong> контейнер. Если скрипт обнаруживает <code>unprivileged: 1</code>, он предлагает изменить <code>/etc/pve/lxc/&lt;CTID&gt;.conf</code> на месте. Это меняет модель безопасности и не выполняет переназначение владельцев существующих файлов. Прежде чем соглашаться, создайте резервную копию контейнера и проверьте владельцев файлов либо создайте контейнер заново как привилегированный."
},
"steps": {
"heading": "Пошаговая инструкция",
"stepLabel": "Шаг",
"list": [
{
"title": "Выберите целевой контейнер",
"img": "/disk/select-container.png",
"caption": "Меню выбора контейнера",
"bodyRich": "ProxMenux выводит список всех контейнеров LXC на хосте (<code>pct list</code>). Выберите контейнер, к которому нужно подключить диск. Если контейнер непривилегированный, вам будет предложено сразу преобразовать его в привилегированный."
},
{
"title": "Выберите физический диск",
"img": "/disk/disk-selection-ct.png",
"caption": "Свободные диски, обнаруженные на хосте (устаревшие метаданные отмечены значком ⚠)",
"bodyRich": "Отображаются только диски, которые можно безопасно использовать. В отличие от процедуры для виртуальных машин, этот скрипт подключает <strong>один диск за запуск</strong> — запускайте его повторно для каждого дополнительного диска."
},
{
"title": "Форматирование или повторное использование",
"intro": "Скрипт проверяет диск:",
"items": [
"Если на диске уже есть поддерживаемая файловая система (ext4 / xfs / btrfs), его можно использовать без изменений (существующие файлы сохраняются).",
"Если поддерживаемой файловой системы нет, вам будет предложено отформатировать диск. Выберите ext4 / xfs / btrfs."
]
},
{
"title": "Выберите точку монтирования",
"bodyRich": "Введите путь, по которому диск должен быть доступен в контейнере, например <code>/mnt/data</code> или <code>/mnt/disk_passthrough</code>. Это путь <em>внутри</em> контейнера; на хосте раздел уже доступен по пути <code>/dev/disk/by-id/…</code>."
},
{
"title": "Подключение и проверка",
"img": "/disk/assignment-ct.png",
"caption": "Назначение контейнеру",
"bodyRich": "ProxMenux добавляет новую запись <code>mpN:</code> в конфигурацию контейнера, пропуская уже занятые индексы, и повторно считывает конфигурацию для проверки. Если контейнер запущен, монтирование выполняется сразу; в противном случае оно вступает в силу при следующем запуске.",
"extraImg": "/disk/result-point.png",
"extraAlt": "Точка монтирования успешно создана",
"extraCaption": "Точка монтирования создана и проверена"
}
]
},
"manual": {
"heading": "Эквивалентные действия вручную",
"body": "Скрипт служит оболочкой для <code>pct set</code>. Прямой вызов для одного диска выглядит так:"
},
"important": {
"heading": "Важные замечания",
"items": [
"<strong>Один диск за запуск</strong>. Для каждого дополнительного диска запускайте скрипт повторно.",
"<strong>Не</strong> подключайте один и тот же раздел к нескольким контейнерам, которые могут смонтировать его одновременно: одновременная запись приводит к повреждению файловой системы.",
"<strong>Старые метаданные</strong> (сигнатуры RAID / ZFS / LVM) необходимо удалить вручную, прежде чем скрипт разрешит форматирование, иначе <code>mkfs</code> откажется выполнять перезапись. Для этого используйте инструмент <wipeLink>Форматирование / очистка физического диска</wipeLink>."
]
},
"troubleshoot": {
"heading": "Устранение неполадок",
"unprivTitle": "«Невозможно продолжить работу с непривилегированным контейнером»",
"unprivBody": "Вы отказались от преобразования, поэтому скрипт завершил работу, ничего не изменив. Чтобы продолжить, запустите его снова и согласитесь: скрипт остановит контейнер, сохранит резервную копию его конфигурации в <code>/etc/pve/lxc/&lt;CTID&gt;.conf.bak</code> и заменит <code>unprivileged: 1</code> на <code>unprivileged: 0</code>. Само по себе изменение этого флага не меняет UID/GID владельцев существующих файлов, поэтому сначала создайте резервную копию контейнера и исправьте права владения; другой вариант — восстановить или заново создать контейнер как привилегированный.",
"permsTitle": "Неверные права доступа внутри контейнера",
"permsBody": "При монтировании раздела в привилегированный контейнер существующие владельцы файлов сохраняются; владельцем только что отформатированной файловой системы часто является <code>root:root</code>. Если служба работает от имени другого пользователя (например, <code>www-data</code> для Nextcloud), проверьте его UID/GID и измените владельца и права доступа для нужных файлов с помощью <code>chown</code>/<code>chmod</code>. Изменения также затрагивают исходный диск."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/disk-manager/import-disk-vm",
"label": "Импортировать диск в ВМ",
"tail": " — аналогичная процедура для виртуальных машин."
},
{
"href": "/docs/storage-share/lxc-mount-points",
"label": "Точки монтирования LXC (хост ↔ CT)",
"tail": " — предоставление контейнеру доступа к каталогам хоста вместо подключения целого диска."
},
{
"href": "/docs/help-info/vm-ct-commands",
"label": "Команды управления ВМ и контейнерами",
"tail": " — справочник по pct config / push / pull."
},
{
"href": "/docs/disk-manager",
"label": "Обзор диспетчера дисков",
"tail": "."
}
]
}
}
@@ -0,0 +1,113 @@
{
"meta": {
"title": "Импорт диска в виртуальную машину | Документация ProxMenux",
"description": "Подключите физический диск к существующей виртуальной машине Proxmox с помощью ProxMenux. Безопасное обнаружение дисков (исключаются системные, смонтированные, используемые диски и диски ZFS/RAID/LVM), постоянные пути /dev/disk/by-id и интерфейсы SATA / SCSI / VirtIO / IDE.",
"ogTitle": "Импорт диска в виртуальную машину | Документация ProxMenux",
"ogDescription": "Подключите физический диск к существующей виртуальной машине Proxmox. Используются постоянные пути /dev/disk/by-id и поддерживаются SATA / SCSI / VirtIO / IDE."
},
"header": {
"title": "Импортировать диск в ВМ",
"description": "Подключите физический диск, уже имеющийся на хосте Proxmox, к существующей виртуальной машине. ProxMenux обнаруживает свободные диски, позволяет выбрать целевую виртуальную машину и тип шины (SATA / SCSI / VirtIO / IDE), а затем подключает диски с использованием постоянных путей /dev/disk/by-id, чтобы привязка сохранялась после перезагрузок и изменений порядка устройств.",
"section": "Диспетчер дисков · ВМ"
},
"intro": {
"title": "Что делает этот инструмент",
"body": "Физический диск подключается напрямую как базовое устройство для интерфейса виртуального диска. Гостевая система не получает автоматически собственные данные SMART диска или доступ к функциям физического контроллера; если они необходимы, используйте проброс PCI-контроллера. При наличии пути <code>/dev/disk/by-id/…</code> диск подключается через него, поэтому изменение порядка обнаружения устройств при загрузке не нарушает привязку; в противном случае используется <code>/dev/sdX</code>."
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Процесс состоит из двух чётко разделённых этапов: «сбор информации и принятие решений» и «непосредственное подключение дисков к виртуальной машине». До окончательного подтверждения конфигурация виртуальной машины не изменяется.",
"summary": "ProxMenux исключает всё, что нельзя безопасно передать: корневой диск, диски, смонтированные на хосте, диски в составе активного пула ZFS/LVM/RAID и диски, уже указанные в конфигурации любой виртуальной машины или LXC. Диски с <em>устаревшими</em> метаданными (старыми сигнатурами ZFS / RAID / LVM, которые больше не используются) отображаются с меткой ⚠, но не блокируются."
},
"prereqs": {
"heading": "Предварительные требования",
"items": [
"На хосте должна быть настроена хотя бы одна ВМ (скрипт сразу переходит к <code>qm list</code>).",
"<strong>Целевая ВМ должна быть выключена</strong>. Если она запущена, скрипт прекращает работу и выводит сообщение — горячее подключение дисков к работающей ВМ не входит в рамки этой процедуры.",
"На хосте должен быть хотя бы один физический диск, который не используется ни самим хостом, ни другими гостевыми системами."
]
},
"steps": {
"heading": "Пошаговая инструкция",
"stepLabel": "Шаг",
"list": [
{
"title": "Выберите целевую ВМ",
"bodyRich": "ProxMenux выводит список всех ВМ на хосте (через <code>qm list</code>). Выберите ВМ, к которой нужно подключить диск. Если ВМ запущена, скрипт прекращает работу и просит сначала выключить её."
},
{
"title": "Выберите физические диски для подключения",
"img": "/disk/disk-selection.png",
"caption": "Свободные диски, обнаруженные на хосте (устаревшие метаданные отмечены значком ⚠)",
"body": "Скрипт сканирует все диски хоста и показывает только те, которые можно безопасно подключить. В списке можно отметить один или несколько дисков одновременно. Диски со старыми сигнатурами ZFS / LVM / RAID также отображаются, но помечены значком ⚠: перед форматированием в гостевой системе их необходимо очистить."
},
{
"title": "Выберите интерфейс шины",
"img": "/disk/disk-assigment.png",
"caption": "Выбор интерфейса шины",
"intro": "Выберите, через какой интерфейс диск будет доступен гостевой системе:",
"items": [
"<strong>SCSI</strong> — современный вариант по умолчанию для Linux и Windows с установленными драйверами VirtIO-SCSI.",
"<strong>SATA</strong> — широкая совместимость, работает без дополнительной настройки практически в любой гостевой системе.",
"<strong>VirtIO</strong> — эффективное паравиртуализированное блочное устройство; требуются драйверы в гостевой системе.",
"<strong>IDE</strong> — для устаревших гостевых систем, в которых нет ни одного из перечисленных выше драйверов."
]
},
{
"title": "Подключение и проверка",
"bodyRich": "ProxMenux подключает каждый выбранный диск, используя наиболее подходящий путь <code>/dev/disk/by-id/</code>, пропускает индексы слотов, уже занятые в конфигурации ВМ (<code>scsi0</code>, <code>sata0</code>, …), и повторно считывает конфигурацию, чтобы подтвердить подключение. В конце выводится сводка."
}
]
},
"manual": {
"heading": "Эквивалентные действия вручную",
"body": "Скрипт представляет собой оболочку для <code>qm set</code>. Точная команда для одного диска выглядит так:",
"migrationTitle": "Миграция без остановки невозможна",
"migrationBody": "ВМ с напрямую подключённым физическим диском <strong>привязана к хосту, который предоставляет доступ к этому диску</strong>. На другом узле обычно нет ни такого же пути <code>/dev/disk/by-id/…</code>, ни данных диска. Создайте резервную копию этих данных и перенесите их отдельно либо используйте управляемые виртуальные диски в общем хранилище или в хранилище с поддерживаемой репликацией, чтобы обеспечить возможность переноса ВМ; не считайте, что репликация хранилища Proxmox охватывает это устройство.",
"shareTitle": "Не используйте один физический диск совместно в нескольких ВМ",
"shareBody": "Одновременное подключение одного и того же физического диска к двум ВМ приведёт к повреждению данных при следующей записи. ProxMenux обнаруживает такую ситуацию и блокирует подключение, но если вы обходите скрипт (напрямую через <code>qm set</code>), убедитесь, что диск в любой момент времени смонтирован только в одной гостевой системе."
},
"troubleshoot": {
"heading": "Устранение неполадок",
"noDisksTitle": "\"Нет доступных дисков для этой ВМ\"",
"noDisksIntro": "Скрипт обнаружил диски, но все подходящие кандидаты были исключены фильтрами. Распространённые причины:",
"noDisksItems": [
"Все оставшиеся диски уже указаны в конфигурации целевой ВМ.",
"Каждый из оставшихся дисков смонтирован на хосте или входит в состав активного пула ZFS, группы томов LVM или RAID-массива.",
"На хосте установлен только диск с корневой файловой системой."
],
"noDisksOutro": "Выполните <code>lsblk -f</code> на хосте, чтобы проверить состояние каждого диска.",
"noVisibleTitle": "ВМ не видит диск после загрузки",
"noVisibleBody": "Если вы выбрали <strong>SCSI</strong> или <strong>VirtIO</strong>, гостевой системе нужен соответствующий драйвер. В Linux он встроен в ядро; в Windows потребуется ISO-образ VirtIO и установка драйвера (см. страницу <winLink>Создание ВМ: система Windows</winLink>). Чтобы быстро проверить, подключён ли физический диск, переключите интерфейс диска на SATA на вкладке оборудования ВМ."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/disk-manager/import-disk-image-vm",
"label": "Импортировать образ диска в ВМ",
"tail": " — аналогичная процедура для файлов образов (qcow2 / vmdk / raw / img)."
},
{
"href": "/docs/disk-manager/import-disk-lxc",
"label": "Импортировать диск в LXC",
"tail": " — аналогичная процедура для контейнеров LXC."
},
{
"href": "/docs/disk-manager/add-controller-nvme-vm",
"label": "Добавить контроллер или NVMe в ВМ",
"tail": " — если нужен проброс PCIe / NVMe целиком, а не подключение диска."
},
{
"href": "/docs/help-info/storage-commands",
"label": "Команды для работы с хранилищами и дисками",
"tail": " — справочник по qm importdisk и связанным командам оболочки."
},
{
"href": "/docs/disk-manager",
"label": "Обзор диспетчера дисков",
"tail": "."
}
]
}
}
@@ -0,0 +1,135 @@
{
"meta": {
"title": "Proxmox Disk Manager — подключение дисков к ВМ / LXC, тесты SMART, очистка | ProxMenux",
"description": "Управляйте физическими дисками на хосте Proxmox VE с помощью ProxMenux: подключайте диски к ВМ или контейнерам LXC (qm set scsi/sata/virtio, pct mp), импортируйте образы дисков img / qcow2 / vmdk / raw, пробрасывайте HBA или контроллеры NVMe целиком, очищайте диски с проверками безопасности и запускайте самотестирование SMART.",
"ogTitle": "Proxmox Disk Manager — подключение дисков к ВМ / LXC, тесты SMART, очистка",
"ogDescription": "Подключение дисков к ВМ / LXC, импорт образов дисков, проброс PCI-контроллеров, безопасная очистка и тесты SMART на Proxmox VE.",
"twitterTitle": "Proxmox Disk Manager | ProxMenux",
"twitterDescription": "Подключение дисков к ВМ / LXC, импорт образов, проброс PCI, безопасная очистка и тесты SMART."
},
"header": {
"title": "Диспетчер дисков",
"description": "Меню диспетчера дисков объединяет инструменты ProxMenux для работы с физическими дисками на хосте Proxmox: подключение дисков к ВМ и контейнерам LXC, импорт образов дисков, проброс контроллера целиком или устройства NVMe, безопасная очистка дисков и проверка их состояния с помощью тестов SMART.",
"section": "Диспетчер дисков"
},
"intro": {
"title": "Для чего предназначено это меню",
"body": "Эти инструменты работают с <strong>физическими дисками, видимыми хосту Proxmox, и файлами образов, хранящимися на нём</strong>. В меню три группы: <strong>ВМ</strong> (подключение дисков или импорт образов), <strong>LXC</strong> (подключение дисков к контейнеру) и <strong>Утилиты</strong> (форматирование и проверка состояния с помощью SMART). При подключении и очистке системные и уже используемые диски скрываются или блокируются; проверки SMART позволяют проверять эти диски без их очистки."
},
"opening": {
"heading": "Открытие меню",
"body": "В главном меню ProxMenux выберите <strong>Диспетчер дисков</strong>. Вы увидите следующее:",
"imageAlt": "Меню диспетчера дисков с разделами «ВМ», LXC и «Утилиты»"
},
"groups": {
"heading": "Три группы инструментов",
"intro": "Меню диспетчера дисков разделено на три группы: <strong>ВМ</strong>, <strong>LXC</strong> и <strong>Утилиты</strong>. Нажмите на карточку, чтобы перейти прямо к инструментам этой группы.",
"vmTitle": "VM",
"vmBody": "Инструменты для работы с существующими виртуальными машинами. ВМ должна быть выключена; ProxMenux проверяет это перед изменением конфигурации.",
"vmItems": [
"Импортировать диск в ВМ",
"Импортировать образ диска в ВМ",
"Добавить контроллер или NVMe в ВМ"
],
"lxcTitle": "LXC",
"lxcBody": "Инструменты для существующих контейнеров LXC. Этот скрипт требует привилегированного контейнера и при необходимости предлагает изменить соответствующий флаг. Сначала прочитайте на странице инструмента предупреждения о преобразовании контейнера и правах владения файлами.",
"lxcItems": [
"Импортировать диск в LXC"
],
"utilitiesTitle": "Утилиты",
"utilitiesBody": "Инструменты хоста для работы непосредственно с дисками, независимо от ВМ и контейнеров.",
"utilitiesItems": [
"Форматировать / стереть физический диск",
"Состояние и проверка диска по SMART"
]
},
"vm": {
"heading": "VM",
"intro": "Инструменты для работы с существующими виртуальными машинами. ВМ должна быть выключена; ProxMenux проверяет это перед изменением конфигурации.",
"options": [
{
"icon": "HardDrive",
"href": "/docs/disk-manager/import-disk-vm",
"title": "Импортировать диск в ВМ",
"description": "Подключение неназначенного физического диска к существующей ВМ. Поддерживает SATA / SCSI / VirtIO / IDE, использует постоянные пути /dev/disk/by-id."
},
{
"icon": "FileDown",
"href": "/docs/disk-manager/import-disk-image-vm",
"title": "Импортировать образ диска в ВМ",
"description": "Импорт файлов образов дисков (.img / .qcow2 / .vmdk / .raw) в существующую ВМ. Двухэтапная процедура с использованием qm importdisk."
},
{
"icon": "Cpu",
"href": "/docs/disk-manager/add-controller-nvme-vm",
"title": "Добавить контроллер или NVMe в ВМ",
"description": "Проброс PCI в ВМ: HBA SATA / SAS целиком или устройства NVMe. Включает активацию IOMMU и обнаружение конфликтов."
}
]
},
"lxc": {
"heading": "LXC",
"intro": "Инструменты для существующих контейнеров LXC. Этот скрипт требует привилегированного контейнера и при необходимости предлагает изменить соответствующий флаг. Сначала прочитайте на странице инструмента предупреждения о преобразовании контейнера и правах владения файлами.",
"options": [
{
"icon": "Boxes",
"href": "/docs/disk-manager/import-disk-lxc",
"title": "Импортировать диск в LXC",
"description": "Подключение незадействованного физического диска к существующему контейнеру LXC в качестве точки монтирования. Поддерживает определение файловой системы, форматирование и преобразование контейнера в привилегированный."
}
]
},
"utilities": {
"heading": "Утилиты",
"intro": "Инструменты хоста для работы непосредственно с дисками, независимо от ВМ и контейнеров.",
"options": [
{
"icon": "Eraser",
"href": "/docs/disk-manager/format-disk",
"title": "Форматирование / очистка физического диска (с мерами безопасности)",
"description": "Безопасная очистка диска со строгими мерами защиты: отображаются только полностью свободные диски, и всегда требуется двойное подтверждение."
},
{
"icon": "Activity",
"href": "/docs/disk-manager/smart-disk-test",
"title": "Состояние и проверка диска по SMART",
"description": "Проверка состояния SMART и запуск коротких / длительных самотестирований дисков SATA, SAS и NVMe. Экспорт результатов в JSON для Monitor."
}
]
},
"safety": {
"title": "Правила безопасности при подключении и очистке дисков",
"intro": "При подключении и очистке дисков исключаются устройства, операции с которыми могут навредить хосту:",
"items": [
"<strong>Системный диск</strong> (корневой пул, раздел подкачки, активные участники ZFS / LVM / RAID) всегда скрыт.",
"Диски, <strong>смонтированные</strong> в любой точке на хосте, скрываются либо блокируются при выполнении операции.",
"Диски, <strong>используемые работающей виртуальной машиной или LXC</strong>, нельзя переназначить или очистить.",
"Операции, способные изменить состояние хоста (включение IOMMU, очистка диска), требуют явного подтверждения."
]
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/storage-share",
"label": "Управление хранилищами и общими ресурсами",
"tail": " — регистрация хранилищ в самом Proxmox (NFS / Samba / iSCSI / локальное хранилище) и предоставление общего доступа к папкам хосту и контейнерам."
},
{
"href": "/docs/help-info/storage-commands",
"label": "Команды для работы с хранилищами и дисками",
"tail": " — справочная информация о блочных устройствах, LVM, pvesm и SMART."
},
{
"href": "/docs/help-info/zfs-commands",
"label": "Команды управления ZFS",
"tail": " — для пулов и наборов данных ZFS."
},
{
"href": "/docs/hardware/gpu-vm-passthrough",
"label": "Добавить GPU в ВМ (прямой проброс)",
"tail": " — те же принципы IOMMU / VFIO применительно к GPU."
}
]
}
}
@@ -0,0 +1,146 @@
{
"meta": {
"title": "Проверка состояния дисков по SMART и их тестирование | Документация ProxMenux",
"description": "Проверка состояния SMART и тестирование дисков в Proxmox VE с помощью ProxMenux. Поддерживаются SATA / SAS (smartmontools) и NVMe (nvme-cli). Короткие и длительные самотестирования, экспорт в JSON для интеграции с ProxMenux Monitor.",
"ogTitle": "Проверка состояния дисков по SMART и их тестирование | Документация ProxMenux",
"ogDescription": "Проверка состояния SMART и самотестирование дисков SATA / SAS и NVMe на Proxmox. Экспорт в JSON для Monitor."
},
"header": {
"title": "Состояние и проверка диска по SMART",
"description": "Чтение данных SMART и запуск самотестирований физических дисков, подключённых к хосту Proxmox. ProxMenux автоматически устанавливает smartmontools для SATA / SAS и nvme-cli для NVMe, выполняет выбранное действие средствами микропрограммы диска (длительные тесты продолжаются после закрытия терминала) и экспортирует результаты в JSON для ProxMenux Monitor.",
"section": "Диспетчер дисков · Утилиты"
},
"intro": {
"title": "Для чего это нужно",
"body": "SMART (технология самоконтроля, анализа и отчётности) позволяет самому диску сообщать о своём состоянии и выполнять самотестирование. Этот инструмент предоставляет доступ к таким данным без необходимости запоминать правильный вызов <code>smartctl</code> / <code>nvme</code> и сохраняет результаты в JSON, чтобы Monitor мог отображать графики изменения показателей со временем."
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Все действия здесь неразрушающие: SMART считывает счётчики микропрограммы диска, а самотестирования ставятся в очередь на самом диске. Разделение на этапы не требуется. Порядок работы: проверка зависимостей → выбор диска → выбор действия → вызов инструмента (smartctl или nvme-cli в зависимости от шины диска) → вывод результатов и экспорт в JSON для Monitor."
},
"deps": {
"heading": "Зависимости",
"body": "При первом запуске инструмент автоматически устанавливает необходимые зависимости. Для дисков SATA / SAS используется <code>smartmontools</code>, для дисков NVMe — <code>nvme-cli</code>. Оба инструмента:"
},
"actions": {
"heading": "Доступные действия",
"headerAction": "Действие",
"headerWhat": "Что считывается / запускается",
"headerDur": "Длительность",
"rows": [
{
"action": "Быстрая проверка состояния",
"whatRich": "Общий результат PASSED/FAILED и основные атрибуты.<br /><code>smartctl -H</code> + <code>-A</code> (SATA/SAS) или <code>nvme smart-log</code> (NVMe).",
"dur": "Мгновенно"
},
{
"action": "Полный отчёт",
"whatRich": "Полные данные SMART с возможностью прокрутки. <code>smartctl -x</code> для SATA/SAS или <code>nvme smart-log</code> + <code>id-ctrl</code> для NVMe.",
"dur": "Мгновенно"
},
{
"action": "Короткий тест",
"what": "Базовая проверка поверхности и электрических компонентов, поставленная в очередь во встроенном ПО накопителя.",
"dur": "~2 минуты"
},
{
"action": "Длительный тест",
"what": "Полное сканирование всей поверхности. Выполняется аппаратными средствами накопителя и продолжается даже после закрытия терминала.",
"dur": "Несколько часов (зависит от объёма диска)"
},
{
"action": "Проверить ход выполнения теста",
"what": "Состояние текущего или последнего самотестирования.",
"dur": "Мгновенно"
}
],
"tipTitle": "Длительные тесты продолжаются после закрытия терминала",
"tipBody": "Длительный тест выполняется <em>внутри накопителя</em> и не зависит от того, продолжает ли работать процесс ProxMenux. Можно закрыть терминал и вернуться позже, чтобы выбрать <strong>Проверить ход выполнения теста</strong>. Перезагрузка хоста, сброс контроллера или отключение питания могут прервать тест и работу сборщика его результатов; не следует рассчитывать на автоматическое возобновление."
},
"json": {
"heading": "Экспорт JSON для Monitor",
"intro": "Действия проверки состояния, запуска короткого теста и проверки хода выполнения записывают JSON-файл с отметкой времени в <code>/usr/local/share/proxmenux/smart/&lt;disk&gt;/</code>; результаты длительного теста собираются в фоновом режиме. Действие формирования полного отчёта только отображает отчёт. Структура:",
"outro": "ProxMenux Monitor использует эти данные для отображения динамики состояния каждого диска; старые файлы автоматически удаляются при достижении лимита хранения."
},
"steps": {
"heading": "Пошаговая инструкция",
"stepLabel": "Шаг",
"list": [
{
"title": "Выберите диск",
"body": "ProxMenux выводит список всех физических дисков хоста с указанием модели и объёма. В отличие от инструмента форматирования, этот список не фильтруется по соображениям безопасности: чтение SMART не изменяет данные.",
"img": "/disk/smart/disk-selection.png",
"alt": "Меню выбора диска для SMART",
"caption": "Меню выбора диска для SMART"
},
{
"title": "Выберите действие",
"body": "Выберите быструю проверку состояния, полный отчёт, короткий тест, длительный тест или проверку хода выполнения. После каждого действия меню остаётся открытым, поэтому можно последовательно выполнить несколько запросов для одного и того же диска.",
"img": "/disk/smart/action-menu.png",
"alt": "Меню действий SMART",
"caption": "Меню действий SMART (5 действий + отмена)"
},
{
"title": "Подтвердите выполнение в фоновом режиме (только для длительного теста)",
"body": "ProxMenux предупреждает, что тест продолжится после закрытия терминала, и показывает, куда будет сохранён результат в формате JSON. Подтвердите, чтобы поставить тест в очередь.",
"img": "/disk/smart/long-test-warning.png",
"alt": "Диалог подтверждения длительного теста",
"caption": "Подтверждение длительного теста — выполнение в фоновом режиме, сохранение результата в JSON"
},
{
"title": "Просмотрите результаты",
"bodyRich": "Состояние, результаты тестов и ход выполнения отображаются в терминале; <strong>Полный отчёт</strong> открывается в диалоговом окне с прокруткой. Экспорт в JSON выполняется для описанных выше действий, но не для полного отчёта. Для длительных тестов вернитесь позже и выберите <strong>Проверить ход выполнения теста</strong> для того же диска, чтобы узнать результат.",
"img": "/disk/smart/quick-status.png",
"alt": "Вывод быстрой проверки состояния",
"caption": "Вывод быстрой проверки состояния (SATA — smartctl -H + -A)"
}
]
},
"manual": {
"heading": "Эквивалентные команды для ручного выполнения",
"nvmeWarnTitle": "Поддержка самотестирования NVMe зависит от прошивки накопителя",
"nvmeWarnBody": "Не каждый накопитель NVMe поддерживает команду короткого или длительного самотестирования. Если накопитель отказывается выполнять тест, журнал SMART и идентификационные данные контроллера (<code>nvme smart-log</code> + <code>id-ctrl</code>) по-прежнему служат наиболее надёжными источниками сведений о его состоянии."
},
"troubleshoot": {
"heading": "Устранение неполадок",
"noSmartTitle": "\"Не удалось прочитать данные SMART с /dev/sdX\"",
"noSmartBody": "Вероятно, диск подключён через контроллер RAID / SAS, который не обеспечивает передачу данных SMART. Для плат на базе megaraid попробуйте <code>smartctl -d megaraid,N /dev/sdX</code>. Для HBA в режиме IT работает прямой вызов.",
"longTitle": "Длительный тест никак не завершается",
"longBody": "Тест выполняется прошивкой накопителя, и интенсивный ввод-вывод может задержать его завершение. Попробуйте запустить тест в период низкой нагрузки, например на ночь. Для SATA оставшийся процент показывает <code>smartctl -c</code>, а для SAS — <code>smartctl -l selftest</code>; проверьте журнал самотестирования, чтобы узнать статус завершения и адреса LBA, на которых обнаружены ошибки. Сообщение об ошибке чтения требует разбирательства; само по себе медленное выполнение не доказывает наличие повреждённого сектора."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/disk-manager/format-disk",
"label": "Форматировать / стереть физический диск",
"tail": " — повторное использование диска после подтверждения его исправности."
},
{
"href": "/docs/help-info/storage-commands",
"label": "Команды для хранилищ и дисков → Проверка состояния диска с помощью SMART",
"tail": " — справочник по smartctl / nvme с командами для копирования и вставки."
},
{
"href": "/docs/help-info/zfs-commands",
"label": "Команды управления ZFS",
"tail": " — zpool scrub проверяет контрольные суммы данных ZFS и дополняет аппаратные тесты SMART."
},
{
"href": "/docs/monitor/dashboard/storage",
"label": "ProxMenux Monitor — вкладка «Хранилище»",
"tail": " — подробные сведения о диске на основе экспортируемых здесь данных JSON (полная таблица SMART, история, отчёт PDF)."
},
{
"href": "/docs/monitor/dashboard/hardware",
"label": "ProxMenux Monitor — вкладка «Оборудование»",
"tail": " — Сводка по накопителям с указанием модели, ёмкости и согласованной скорости соединения (для NVMe — текущей и максимальной)."
},
{
"href": "/docs/disk-manager",
"label": "Обзор диспетчера дисков",
"tail": "."
}
]
}
}
@@ -0,0 +1,58 @@
{
"meta": {
"title": "Внешние репозитории | Документация ProxMenux",
"description": "ProxMenux интегрируется с некоторыми внешними репозиториями скриптов (community-scripts, ZimaOS), предлагая их как альтернативы в отдельных разделах меню. Для каждого внешнего скрипта явно указан источник; сообщения об ошибках следует направлять автору, сопровождающему исходный скрипт.",
"ogTitle": "Внешние репозитории | Документация ProxMenux",
"ogDescription": "Внешние репозитории скриптов, интегрированные в ProxMenux в качестве альтернативных вариантов в меню."
},
"header": {
"title": "Внешние репозитории",
"description": "ProxMenux интегрируется с некоторыми внешними репозиториями скриптов, предлагая их как альтернативные варианты в отдельных разделах меню. Эти скрипты поступают из доверенных сторонних источников, и при их отображении в меню источник явно указан.",
"section": "Внешние репозитории"
},
"practice": {
"title": "Что это означает на практике",
"body": "Если пункт меню использует внешний скрипт, а не собственный код ProxMenux, в меню явно указаны его источник и репозиторий, из которого он загружается. ProxMenux служит средством запуска и не изменяет внешние скрипты. Проблемы с работой внешнего скрипта относятся к компетенции сопровождающего соответствующий репозиторий, а не ProxMenux."
},
"integrated": {
"heading": "Уже интегрированы",
"usedInLabel": "Используется в:",
"items": [
{
"name": "community-scripts / ProxmoxVE",
"url": "https://community-scripts.github.io/ProxmoxVE/",
"description": "Идейный преемник вспомогательных скриптов tteck. Обширный каталог скриптов для разового выполнения: развёртывание контейнеров LXC (Home Assistant, Plex, Frigate, …), виртуальных машин и дополнений, а также настройка PVE.",
"usedIn": "Средство запуска Helper Scripts, раздел «Сеть» (исправление аппаратной разгрузки сетевого адаптера Intel e1000e)"
}
]
},
"attribution": {
"heading": "Указание авторства и признание вклада",
"items": [
"Авторы исходных скриптов всегда указаны в меню и на странице документации, посвящённой соответствующему скрипту.",
"Ссылка на исходный репозиторий отображается как перед запуском скрипта, так и на соответствующей странице документации.",
"Пользователям рекомендуется поддерживать разработчиков этих внешних проектов: поставить ⭐, оказать финансовую поддержку или отправить качественное сообщение об ошибке."
]
},
"report": {
"title": "Куда сообщать о проблемах с внешними скриптами",
"body": "Если скрипт из одного из этих внешних репозиториев работает не так, как ожидается, <strong>сообщите об этом непосредственно в соответствующем репозитории</strong>, а не в ProxMenux. ProxMenux лишь загружает и запускает скрипт без изменений, не изменяя исходный код. Разбором и исправлением проблемы должен заниматься сопровождающий исходного скрипта. В ProxMenux следует сообщать о проблемах с самим средством запуска или с тем, как ProxMenux интегрирует внешний скрипт."
},
"suggest": {
"heading": "Предложить новые внешние репозитории",
"intro": "Нашли скрипт или репозиторий, который хорошо вписался бы в меню ProxMenux? Предложите его одним из следующих способов:",
"discussionTitle": "💬 Создать обсуждение",
"discussionBody": "Лучший вариант для идей: позволяет получить мнение сообщества, прежде чем оформлять запрос на новую функцию.",
"issueTitle": "🐛 Создать обращение",
"issueBody": "Для конкретных запросов на новые функции с чётко определённым объёмом работ."
},
"candidate": {
"title": "Что делает проект хорошим кандидатом для интеграции",
"items": [
"Открытый исходный код и активное сопровождение.",
"Идемпотентность: повторный запуск безопасен.",
"Не изменяет основную конфигурацию Proxmox без уведомления.",
"Решает задачу, которую ProxMenux ещё не решает (без дублирования функций)."
]
}
}
+677
View File
@@ -0,0 +1,677 @@
{
"meta": {
"title": "Глоссарий | Документация ProxMenux",
"description": "Определения технических терминов, используемых в документации ProxMenux: понятия Proxmox (VM, LXC, qm, pct, pmxcfs), основы виртуализации (KVM, IOMMU, VFIO, OVMF), хранение данных (ZFS, ARC, LVM, vzdump, PBS), сети (сетевой мост, VLAN, nftables) и терминология, специфичная для ProxMenux.",
"ogTitle": "Глоссарий | Документация ProxMenux",
"ogDescription": "Краткий справочник технических терминов, используемых в документации ProxMenux."
},
"header": {
"title": "Глоссарий",
"description": "Определения технических терминов, используемых в документации ProxMenux. Охватывает понятия Proxmox, основы виртуализации, хранение данных, сети, внутреннее устройство Linux и терминологию, специфичную для ProxMenux.",
"section": "Глоссарий"
},
"callout": {
"title": "Как пользоваться этой страницей",
"bodyRich": "У каждой статьи есть метка категории и краткое определение. Ссылки <em>См. также</em> ведут на страницу документации, наиболее тесно связанную с термином. Используйте расположенную ниже навигацию A–Z, чтобы перейти непосредственно к нужной букве."
},
"jumpHeading": "Перейти к букве",
"seeAlsoLabel": "См. также:",
"aliasesLabel": "Также:",
"missingCallout": {
"title": "Не нашли термин?",
"leadRich": "Если в глоссарии нет термина из документации, создайте issue или PR на <ext>GitHub</ext>. Содержимое глоссария хранится в <code>web/messages/en/docs/glossary.json</code> вместе с соответствующими каталогами переводов."
},
"entries": [
{
"term": "ACS",
"aliases": [
"Службы контроля доступа",
"Переопределение ACS"
],
"category": "Виртуализация",
"definitionRich": "Функции контроля доступа PCIe, помогающие изолировать трафик устройств. Группировка IOMMU зависит от оборудования и топологии. Патч ядра <em>ACS override</em> позволяет разделять группы, определяемые Linux, но не обеспечивает дополнительной аппаратной изоляции; назначение таких устройств разным виртуальным машинам создаёт риск для безопасности.",
"seeAlso": [
{
"label": "Добавить контроллер или NVMe в ВМ",
"href": "/docs/disk-manager/add-controller-nvme-vm"
}
]
},
{
"term": "ARC",
"aliases": [
"Адаптивный кэш замещения"
],
"category": "Хранилище",
"definitionRich": "Кэш чтения ZFS в оперативной памяти хоста, содержащий недавно и часто используемые блоки данных. Его лимит по умолчанию зависит от версии Proxmox и параметров установки. В разделе Post-Install ProxMenux доступна настройка для ограничения его размера.",
"seeAlso": [
{
"label": "После установки: хранение данных",
"href": "/docs/post-install/storage"
},
{
"label": "Команды ZFS",
"href": "/docs/help-info/zfs-commands"
}
]
},
{
"term": "Привязочное монтирование",
"category": "Linux",
"definitionRich": "Возможность Linux, позволяющая сделать часть файловой системы доступной по другому пути. ProxMenux использует bind-монтирование для предоставления контейнерам LXC доступа к каталогам хоста через <code>pct set -mpN</code>.",
"seeAlso": [
{
"label": "Точки монтирования LXC",
"href": "/docs/storage-share/lxc-mount-points"
}
]
},
{
"term": "Объединение сетевых интерфейсов",
"aliases": [
"Объединённый сетевой интерфейс",
"Агрегация каналов"
],
"category": "Сеть",
"definitionRich": "Объединяет несколько физических сетевых интерфейсов в один логический интерфейс — для обеспечения отказоустойчивости (active-backup), увеличения пропускной способности (LACP / 802.3ad) или обеих целей. Настраивается в <code>/etc/network/interfaces</code>."
},
{
"term": "Сетевой мост",
"aliases": [
"vmbrX",
"vmbr0",
"Сетевой мост Linux"
],
"category": "Сеть",
"definitionRich": "Виртуальный коммутатор второго уровня на хосте. <code>vmbr0</code> обычно подключает гостевые системы к физической сети. Дополнительные мосты (<code>vmbr1</code>, <code>vmbr2</code>...) позволяют разделять сети гостевых систем в зависимости от физических подключений и конфигурации этих мостов.",
"seeAlso": [
{
"label": "Анализ сетевого моста и пошаговое устранение неполадок",
"href": "/docs/network/bridge-analysis"
}
]
},
{
"term": "Ceph",
"category": "Хранилище",
"definitionRich": "Распределённое хранилище, интегрированное с Proxmox для гиперконвергентных кластеров. Демоны объектного хранения OSD (Object Storage Daemons) лежат в основе его объектного, блочного и файлового хранения. Требуемые версии Ceph зависят от выпуска Proxmox и пути обновления; обратитесь к соответствующему руководству по обновлению.",
"seeAlso": [
{
"label": "Обновление PVE 8 до PVE 9",
"href": "/docs/utils/upgrade-pve8-pve9"
}
]
},
{
"term": "CT",
"aliases": [
"Контейнер",
"Контейнер LXC"
],
"category": "Proxmox",
"definitionRich": "Сокращение от «container» (контейнер) — термин Proxmox для экземпляра LXC. Имеет числовой идентификатор CTID, которому соответствует <code>/etc/pve/lxc/&lt;CTID&gt;.conf</code>. См. также <strong>LXC</strong>.",
"seeAlso": [
{
"label": "Управление ВМ и контейнерами",
"href": "/docs/help-info/vm-ct-commands"
}
]
},
{
"term": "deb822",
"category": "Linux",
"definitionRich": "Современный формат описания источников репозиториев APT, использующий файлы <code>.sources</code> со структурированными блоками пар «ключ — значение» (Types, URIs, Suites, Components, Signed-By). Заменяет устаревший однострочный формат <code>.list</code>. Стандартный формат начиная с PVE 9 / Debian Trixie.",
"seeAlso": [
{
"label": "Обновление PVE 8 до PVE 9",
"href": "/docs/utils/upgrade-pve8-pve9"
}
]
},
{
"term": "dGPU",
"aliases": [
"Дискретный графический процессор"
],
"category": "Виртуализация",
"definitionRich": "Отдельная видеокарта, обычно подключаемая через PCIe, в отличие от <strong>iGPU</strong>. Её можно передать виртуальной машине с помощью VFIO или предоставить нескольким контейнерам LXC доступ к ней через узлы устройств и драйвер хоста, если это поддерживается оборудованием и приложениями.",
"seeAlso": [
{
"label": "Добавить GPU в ВМ (прямой проброс)",
"href": "/docs/hardware/gpu-vm-passthrough"
}
]
},
{
"term": "Dialog",
"category": "Linux",
"definitionRich": "Инструмент на базе ncurses для отображения меню, запросов и индикаторов выполнения в терминале. ProxMenux построен на основе меню dialog."
},
{
"term": "DKMS",
"aliases": [
"Поддержка динамических модулей ядра"
],
"category": "Linux",
"definitionRich": "Система для пересборки зарегистрированных модулей, не входящих в дерево исходного кода ядра, таких как NVIDIA или ZFS, при изменении ядра. Для успешной сборки по-прежнему необходимы совместимые исходные коды модулей и соответствующие заголовочные файлы ядра.",
"seeAlso": [
{
"label": "Установить Coral TPU на хосте",
"href": "/docs/hardware/install-coral-tpu-host"
}
]
},
{
"term": "Fail2Ban",
"category": "Linux",
"definitionRich": "Служба предотвращения вторжений, которая отслеживает повторяющиеся ошибки аутентификации в файлах журналов и блокирует IP-адреса нарушителей на уровне межсетевого экрана. ProxMenux поставляется с предварительно настроенными наборами правил блокировки (jails) для SSH, интерфейса Proxmox и Monitor.",
"seeAlso": [
{
"label": "Fail2Ban",
"href": "/docs/security/fail2ban"
}
]
},
{
"term": "Fastfetch",
"category": "Linux",
"definitionRich": "Утилита для вывода информации о системе с ASCII-графикой, запускаемая при входе в командную оболочку («баннер со сводкой о системе»). Заменяет более старую утилиту <code>neofetch</code>; доступна как опция, включаемая по желанию, в разделе настройки после установки ProxMenux.",
"seeAlso": [
{
"label": "После установки: необязательные настройки",
"href": "/docs/post-install/optional"
}
]
},
{
"term": "GRUB",
"aliases": [
"GRand Unified Bootloader"
],
"category": "Linux",
"definitionRich": "Загрузчик, используемый в системах Linux на базе GRUB. Конфигурация находится в <code>/etc/default/grub</code> и <code>/boot/grub/</code>; после внесения изменений выполните <code>update-grub</code>. В других конфигурациях загрузки Proxmox может использоваться systemd-boot, поэтому перед изменением параметров ядра проверьте, какой загрузчик используется.",
"seeAlso": [
{
"label": "Команды для проброса GPU",
"href": "/docs/help-info/gpu-commands"
}
]
},
{
"term": "iGPU",
"aliases": [
"Встроенный графический процессор"
],
"category": "Виртуализация",
"definitionRich": "Графический процессор, встроенный в корпус центрального процессора (Intel UHD / Iris, AMD Radeon Vega в APU Ryzen). Обычно совместно используется несколькими контейнерами LXC через <code>/dev/dri</code>, а не пробрасывается в одну виртуальную машину.",
"seeAlso": [
{
"label": "Добавить GPU в LXC",
"href": "/docs/hardware/igpu-acceleration-lxc"
}
]
},
{
"term": "ifupdown / ifupdown2",
"category": "Сеть",
"definitionRich": "Классическая система настройки сети Debian, которая считывает <code>/etc/network/interfaces</code>. <code>ifupdown2</code> — переписанная версия, которую Proxmox использует по умолчанию; она поддерживает применение настроек без остановки сети с помощью <code>ifreload -a</code>."
},
{
"term": "initramfs",
"category": "Linux",
"definitionRich": "Начальная файловая система в оперативной памяти, которую ядро использует при загрузке до монтирования основной корневой файловой системы. Содержит драйверы, необходимые на раннем этапе загрузки (для устройств хранения, шифрования, RAID). Пересобирается с помощью <code>update-initramfs -u -k all</code> после изменений в настройках VFIO, IOMMU или драйверах устройств хранения."
},
{
"term": "IOMMU",
"aliases": [
"Блок управления памятью ввода-вывода",
"VT-d",
"AMD-Vi"
],
"category": "Виртуализация",
"definitionRich": "Аппаратная функция (Intel VT-d / AMD-Vi), необходимая для проброса устройств PCIe в виртуальные машины. Включите её в настройках прошивки и убедитесь, что поддержка в ядре активна. В зависимости от платформы и настроек ядра по умолчанию могут потребоваться параметры ядра, такие как <code>intel_iommu=on</code> или <code>amd_iommu=on</code>.",
"seeAlso": [
{
"label": "После установки: виртуализация",
"href": "/docs/post-install/virtualization"
},
{
"label": "Добавить GPU в ВМ (прямой проброс)",
"href": "/docs/hardware/gpu-vm-passthrough"
}
]
},
{
"term": "Группа IOMMU",
"category": "Виртуализация",
"definitionRich": "Набор устройств, образующий минимальную границу изоляции IOMMU. Устройства внутри группы не обязательно изолированы друг от друга; проверьте каждое устройство группы перед назначением устройств для VFIO. Список можно получить с помощью <code>find /sys/kernel/iommu_groups/ -type l | sort -V</code>."
},
{
"term": "iSCSI",
"aliases": [
"Internet SCSI"
],
"category": "Хранилище",
"definitionRich": "Сетевой протокол, предоставляющий доступ к блочному хранилищу по IP: удалённый диск отображается как локальное устройство SCSI. Регистрируется как хранилище Proxmox через <code>pvesm add iscsi</code>.",
"seeAlso": [
{
"label": "Добавление целевого устройства iSCSI в качестве хранилища Proxmox",
"href": "/docs/storage-share/host-iscsi"
}
]
},
{
"term": "KVM",
"aliases": [
"Виртуальная машина на базе ядра"
],
"category": "Виртуализация",
"definitionRich": "Модуль ядра Linux, превращающий хост в гипервизор. В сочетании с <strong>QEMU</strong> для эмуляции устройств служит основой, которую Proxmox использует для запуска виртуальных машин."
},
{
"term": "LVM",
"aliases": [
"Менеджер логических томов"
],
"category": "Хранилище",
"definitionRich": "Уровень управления томами Linux, объединяющий физические устройства хранения в группы томов (VG), содержащие логические тома (LV). В установках Proxmox на базе LVM для дисков гостевых систем обычно используется LVM-thin; доступны и другие подсистемы хранения. Среди инструментов — <code>pvs</code>, <code>vgs</code> и <code>lvs</code>.",
"seeAlso": [
{
"label": "Команды для работы с хранилищами и дисками",
"href": "/docs/help-info/storage-commands"
}
]
},
{
"term": "LXC",
"aliases": [
"Контейнеры Linux"
],
"category": "Linux",
"definitionRich": "Виртуализация на уровне ОС, при которой изолированные экземпляры пользовательского пространства используют общее ядро хоста. Обычно требует меньше накладных расходов, чем виртуальные машины, но имеет иную границу изоляции. Proxmox управляет контейнерами LXC через интерфейс командной строки <code>pct</code>.",
"seeAlso": [
{
"label": "Управление ВМ и контейнерами",
"href": "/docs/help-info/vm-ct-commands"
}
]
},
{
"term": "Lynis",
"category": "Linux",
"definitionRich": "Инструмент аудита безопасности с открытым исходным кодом от CISOfy, который сканирует хост и выводит оценку защищённости вместе с конкретными рекомендациями по устранению проблем. ProxMenux устанавливает последнюю версию из исходного проекта GitHub, а не более старый пакет Debian.",
"seeAlso": [
{
"label": "Lynis",
"href": "/docs/security/lynis"
}
]
},
{
"term": "MAC-адрес",
"aliases": [
"Аппаратный адрес"
],
"category": "Сеть",
"definitionRich": "Обычно 48-битный идентификатор интерфейса Ethernet, назначаемый аппаратно или программно. Функция ProxMenux <em>Постоянные имена сетевых интерфейсов</em> сопоставляет MAC-адреса со стабильными именами интерфейсов (<code>eno1</code>, <code>enp3s0</code>), чтобы имена оставались неизменными после повторного перечисления устройств PCI.",
"seeAlso": [
{
"label": "Постоянные имена интерфейсов",
"href": "/docs/network/persistent-names"
}
]
},
{
"term": "MOTD",
"aliases": [
"Сообщение дня"
],
"category": "Linux",
"definitionRich": "Текст, отображаемый после входа через SSH и хранящийся в <code>/etc/motd</code>. Раздел настройки после установки ProxMenux позволяет добавить баннер; программа удаления восстанавливает предыдущий файл, если существует резервная копия."
},
{
"term": "NFS",
"aliases": [
"Сетевая файловая система"
],
"category": "Хранилище",
"definitionRich": "Протокол сетевого доступа к файлам, изначально разработанный для Unix. Регистрируется как хранилище Proxmox через <code>pvesm add nfs</code>; также может использоваться в режиме клиента или сервера LXC с помощью специальных сценариев ProxMenux.",
"seeAlso": [
{
"label": "Управление хранилищами и общими ресурсами",
"href": "/docs/storage-share"
}
]
},
{
"term": "nftables / iptables",
"category": "Сеть",
"definitionRich": "Инструменты межсетевого экрана Linux. <code>nftables</code> — современная платформа; <code>iptables</code> может использовать устаревшую подсистему или подсистему, совместимую с nft. Классический <code>pve-firewall</code> использует iptables, а альтернативная подсистема proxmox-firewall — nftables.",
"seeAlso": [
{
"label": "Сетевые команды",
"href": "/docs/help-info/network-commands"
}
]
},
{
"term": "nouveau",
"category": "Linux",
"definitionRich": "Графический драйвер NVIDIA с открытым исходным кодом, входящий в состав ядра Linux. При установке проприетарного драйвера NVIDIA необходимо предотвратить привязку nouveau к тому же графическому процессору; обычно для этого nouveau добавляют в чёрный список и пересобирают initramfs.",
"seeAlso": [
{
"label": "Руководство по установке NVIDIA",
"href": "/guides/nvidia"
}
]
},
{
"term": "Репозиторий no-subscription",
"category": "Proxmox",
"definitionRich": "Репозиторий пакетов Proxmox, доступный без корпоративной подписки. Пакеты проходят менее тщательную проверку, чем в репозитории enterprise, который Proxmox рекомендует для производственных сред. Раздел настройки после установки ProxMenux позволяет настроить репозитории.",
"seeAlso": [
{
"label": "После установки: основные настройки",
"href": "/docs/post-install/basic-settings"
}
]
},
{
"term": "OVA / OVF",
"aliases": [
"Открытый формат виртуализации"
],
"category": "Виртуализация",
"definitionRich": "Форматы DMTF для упаковки переносимых виртуальных машин. <strong>OVA</strong> объединяет файлы в один TAR-архив; <strong>OVF</strong> описывает виртуальную машину в XML и сопровождается файлами дисков, обычно в формате VMDK. Поддержка импорта зависит от целевого гипервизора и конфигурации.",
"seeAlso": [
{
"label": "Экспорт ВМ в OVA / OVF",
"href": "/docs/utils/export-vm"
},
{
"label": "Импорт ВМ из OVA / OVF",
"href": "/docs/utils/import-vm"
}
]
},
{
"term": "OVMF",
"aliases": [
"Прошивка UEFI",
"Open Virtual Machine Firmware"
],
"category": "Виртуализация",
"definitionRich": "Прошивка UEFI для виртуальных машин, выбираемая с помощью <code>qm set &lt;vmid&gt; -bios ovmf</code>. Используется для гостевых систем с UEFI, включая Windows 11 и конфигурации с Secure Boot. <code>efidisk0</code> хранит постоянные переменные EFI; многие другие гостевые системы по-прежнему могут использовать устаревший BIOS.",
"seeAlso": [
{
"label": "Добавить GPU в ВМ (прямой проброс)",
"href": "/docs/hardware/gpu-vm-passthrough"
}
]
},
{
"term": "PBS",
"aliases": [
"Proxmox Backup Server"
],
"category": "Proxmox",
"definitionRich": "Отдельный продукт Proxmox для резервного копирования, обеспечивающий инкрементальную передачу данных, дедупликацию и необязательное шифрование на стороне клиента для резервных копий виртуальных машин и контейнеров. Может использоваться как целевое хранилище для vzdump; отдельный сервер резервного копирования предпочтительнее хранения резервных копий на защищаемом узле."
},
{
"term": "pct",
"category": "Proxmox",
"definitionRich": "Инструмент командной строки для управления контейнерами LXC в Proxmox: <code>pct list / start / stop / shutdown / config / enter / exec / push / pull / destroy</code>.",
"seeAlso": [
{
"label": "Управление ВМ и контейнерами",
"href": "/docs/help-info/vm-ct-commands"
}
]
},
{
"term": "pmxcfs",
"aliases": [
"Кластерная файловая система Proxmox"
],
"category": "Proxmox",
"definitionRich": "Виртуальная файловая система на основе FUSE, смонтированная в <code>/etc/pve/</code>. Реплицирует изменения конфигурации на все узлы кластера в реальном времени. Изменения файлов в <code>/etc/pve/</code> распространяются автоматически."
},
{
"term": "pveam",
"aliases": [
"Менеджер виртуальных устройств Proxmox VE"
],
"category": "Proxmox",
"definitionRich": "Инструмент командной строки для управления локальным каталогом шаблонов контейнеров. <code>pveam update</code> обновляет индекс; <code>pveam available</code> выводит список шаблонов; <code>pveam download &lt;storage&gt; &lt;template&gt;</code> загружает выбранный шаблон."
},
{
"term": "pveproxy",
"category": "Proxmox",
"definitionRich": "Служба HTTPS, обеспечивающая работу веб-интерфейса Proxmox на порту 8006 и веб-терминала. Автоматически перезапускается при крупных обновлениях — поэтому ProxMenux отказывается запускать обновление PVE с версии 8 до 9 из веб-терминала."
},
{
"term": "pvesm",
"aliases": [
"Менеджер хранилищ Proxmox"
],
"category": "Proxmox",
"definitionRich": "Инструмент командной строки для управления хранилищами Proxmox. <code>pvesm status</code> показывает все настроенные хранилища; <code>pvesm add &lt;type&gt;</code> регистрирует новые (NFS, Samba, iSCSI, dir, ZFS, LVM, …).",
"seeAlso": [
{
"label": "Команды для работы с хранилищами и дисками",
"href": "/docs/help-info/storage-commands"
}
]
},
{
"term": "Привилегированный контейнер",
"category": "Linux",
"definitionRich": "Контейнер LXC, пользователь root которого <em>сопоставляется с UID 0 на узле</em>, при этом пространства имён и другие ограничения продолжают действовать. Изолирован слабее, чем непривилегированный контейнер. Доступ к GPU, USB и Samba не всегда требует этого режима; важны права доступа и сопоставления UID."
},
{
"term": "ProxMenux Monitor",
"category": "ProxMenux",
"definitionRich": "Необязательная веб-панель, устанавливаемая вместе с ProxMenux. Предоставляет статистику узла в реальном времени (ЦП / ОЗУ / диск / сеть), обзор виртуальных машин и LXC, вход в систему и двухфакторную аутентификацию на TCP-порту <code>8008</code>.",
"seeAlso": [
{
"label": "ProxMenux Monitor",
"href": "/docs/settings/proxmenux-monitor"
}
]
},
{
"term": "qcow2",
"aliases": [
"QEMU: копирование при записи, версия 2"
],
"category": "Хранилище",
"definitionRich": "Формат образов дисков виртуальных машин, обычно используемый в хранилищах на основе каталогов. Поддерживает выделение места по мере необходимости, снимки и копирование при записи. Для преобразования образа используйте <code>qemu-img convert -O qcow2 ...</code>."
},
{
"term": "qm",
"aliases": [
"Менеджер QEMU"
],
"category": "Proxmox",
"definitionRich": "Инструмент командной строки для управления виртуальными машинами в Proxmox: <code>qm list / start / stop / shutdown / config / set / destroy / importdisk / migrate</code>. Аналог команды <code>pct</code>, используемой для контейнеров.",
"seeAlso": [
{
"label": "Управление ВМ и контейнерами",
"href": "/docs/help-info/vm-ct-commands"
}
]
},
{
"term": "Q35",
"category": "Виртуализация",
"definitionRich": "Современный тип машины QEMU, эмулирующий чипсет Intel Q35 с поддержкой PCIe. Рекомендуется вместо устаревшего i440FX для виртуальных машин, которым требуется проброс устройств PCIe или поддержка современных гостевых ОС. Задаётся с помощью <code>qm set &lt;vmid&gt; -machine q35</code>."
},
{
"term": "QEMU",
"category": "Виртуализация",
"definitionRich": "Универсальный эмулятор машин и средство виртуализации с открытым исходным кодом. В Proxmox используется совместно с KVM для запуска виртуальных машин со скоростью, близкой к скорости работы на физическом оборудовании."
},
{
"term": "rclone",
"category": "Linux",
"definitionRich": "Инструмент командной строки с поддержкой множества облачных хранилищ, включая Google Drive, Dropbox, OneDrive, Mega и S3. В руководстве по резервному копированию в облако он используется для монтирования удалённого хранилища в виде каталога для архивов vzdump.",
"seeAlso": [
{
"label": "Резервное копирование в личное облако",
"href": "/guides/backup_cloud"
}
]
},
{
"term": "Samba / SMB / CIFS",
"category": "Хранилище",
"definitionRich": "Семейство протоколов Microsoft для общего доступа к файлам. <strong>SMB</strong> — это протокол; <strong>Samba</strong> — его реализация для Linux с открытым исходным кодом; <strong>CIFS</strong> — устаревший диалект SMB. Регистрируется как хранилище Proxmox с помощью <code>pvesm add cifs</code>.",
"seeAlso": [
{
"label": "Управление хранилищами и общими ресурсами",
"href": "/docs/storage-share"
}
]
},
{
"term": "SeaBIOS",
"category": "Виртуализация",
"definitionRich": "Реализация традиционного BIOS с открытым исходным кодом, используемая в QEMU. Прошивка по умолчанию для новых виртуальных машин, если не переключиться на OVMF. Подходит для старых ОС и простых установок Linux, которым не требуется UEFI."
},
{
"term": "smartctl / SMART",
"aliases": [
"Технология самоконтроля, анализа и отчётности"
],
"category": "Хранилище",
"definitionRich": "Встроенные средства диагностики дисков, предоставляющие сведения о состоянии накопителя, количестве ошибок и результатах самотестирования. <code>smartctl</code> (из пакета <code>smartmontools</code>) — инструмент командной строки; для накопителей NVMe пакет <code>nvme-cli</code> добавляет специализированные команды.",
"seeAlso": [
{
"label": "Состояние и проверка диска по SMART",
"href": "/docs/disk-manager/smart-disk-test"
},
{
"label": "Команды для работы с хранилищами → раздел SMART",
"href": "/docs/help-info/storage-commands"
}
]
},
{
"term": "systemd / systemctl / journalctl",
"category": "Linux",
"definitionRich": "Современная система инициализации, используемая в Debian / Proxmox. <code>systemctl</code> управляет службами (запуск, остановка, включение автозапуска, просмотр состояния). <code>journalctl</code> читает двоичный журнал, записываемый <code>systemd-journald</code>."
},
{
"term": "sysctl",
"category": "Linux",
"definitionRich": "Инструмент для чтения и изменения параметров ядра. Постоянные настройки обычно размещаются в <code>/etc/sysctl.d/*.conf</code>; поддержка <code>/etc/sysctl.conf</code> зависит от загрузчика настроек. Раздел настройки после установки ProxMenux предлагает профиль настройки sysctl.",
"seeAlso": [
{
"label": "Настройка после установки: сеть",
"href": "/docs/post-install/network"
}
]
},
{
"term": "trixie",
"category": "Linux",
"definitionRich": "Кодовое имя Debian 13 — ОС, на которой основан Proxmox VE 9. Предыдущая версия: <em>bookworm</em> (Debian 12 / PVE 8).",
"seeAlso": [
{
"label": "Обновление PVE 8 до PVE 9",
"href": "/docs/utils/upgrade-pve8-pve9"
}
]
},
{
"term": "udev",
"category": "Linux",
"definitionRich": "Диспетчер устройств Linux. Реагирует на события оборудования и создаёт или удаляет записи в <code>/dev</code>. Пользовательские правила в <code>/etc/udev/rules.d/</code> обеспечивают постоянное сопоставление MAC-адресов с именами интерфейсов, создают файлы устройств NVIDIA при загрузке драйвера и т. д."
},
{
"term": "Сопоставление UID / GID (idmap)",
"aliases": [
"Смещение UID"
],
"category": "Linux",
"definitionRich": "При стандартном сопоставлении в <strong>непривилегированных</strong> контейнерах LXC идентификаторы UID и GID на хосте смещены на <code>+100000</code>: UID 0 в контейнере соответствует UID 100000 на хосте, а UID 1000 — UID 101000. Пользовательские сопоставления могут отличаться; владельцы файлов в каталогах, подключённых через bind-монтирование, должны соответствовать выбранному сопоставлению.",
"seeAlso": [
{
"label": "Точки монтирования LXC",
"href": "/docs/storage-share/lxc-mount-points"
}
]
},
{
"term": "Непривилегированный контейнер",
"category": "Linux",
"definitionRich": "Контейнер LXC, в котором root сопоставляется с непривилегированным UID на хосте, обычно 100000. Это снижает привилегии на хосте, при этом контейнер использует общее с хостом ядро. Доступ к оборудованию по-прежнему можно настроить с помощью подходящих прав доступа к устройствам и сопоставлений; привилегированный режим требуется не во всех случаях."
},
{
"term": "VFIO",
"aliases": [
"Ввод-вывод виртуальных функций"
],
"category": "Виртуализация",
"definitionRich": "Подсистема ядра Linux для безопасных драйверов устройств в пользовательском пространстве — используется для прямого проброса устройств PCIe в виртуальные машины. Включается загрузкой модулей ядра <code>vfio</code>, <code>vfio_iommu_type1</code> и <code>vfio_pci</code>, настраивается через <code>/etc/modprobe.d/vfio.conf</code>.",
"seeAlso": [
{
"label": "После установки: виртуализация",
"href": "/docs/post-install/virtualization"
}
]
},
{
"term": "VirtIO",
"category": "Виртуализация",
"definitionRich": "Семейство паравиртуализированных драйверов устройств (сеть, хранилище, balloon, GPU), которые работают быстрее эмулируемого устаревшего оборудования (например, сетевых карт e1000 и дисков IDE). Гостевой системе нужен соответствующий драйвер VirtIO — в Linux он входит в состав ядра, а в Windows устанавливается отдельно с ISO-образа."
},
{
"term": "VLAN",
"aliases": [
"Виртуальная локальная сеть"
],
"category": "Сеть",
"definitionRich": "Метки 802.1Q, которые разделяют одну физическую сеть на несколько логических. Настраиваются для каждого моста или сетевого интерфейса в <code>/etc/network/interfaces</code>."
},
{
"term": "VM",
"aliases": [
"Виртуальная машина"
],
"category": "Proxmox",
"definitionRich": "Виртуальная машина под управлением Proxmox на базе QEMU/KVM, работающая с собственным гостевым ядром. Её числовой идентификатор VMID соответствует <code>/etc/pve/qemu-server/&lt;VMID&gt;.conf</code>. Обычно требует больше ресурсов, чем LXC, и обеспечивает отдельную границу изоляции на уровне ядра.",
"seeAlso": [
{
"label": "Управление ВМ и контейнерами",
"href": "/docs/help-info/vm-ct-commands"
}
]
},
{
"term": "vzdump",
"category": "Proxmox",
"definitionRich": "Инструмент Proxmox для резервного копирования виртуальных машин и контейнеров. Файловые архивы <strong>не являются инкрементальными</strong>; целевые хранилища PBS поддерживают инкрементальную передачу данных. В заданиях можно настроить режим резервного копирования (snapshot / suspend / stop), сжатие (например, zstd, gzip или lzo), правила хранения и уведомления.",
"seeAlso": [
{
"label": "Команды резервного копирования и восстановления",
"href": "/docs/help-info/backup-commands"
}
]
},
{
"term": "ZFS",
"aliases": [
"Зеттабайтная файловая система"
],
"category": "Хранилище",
"definitionRich": "Файловая система и менеджер томов в одном решении с поддержкой снимков, репликации через send/receive, контрольных сумм и сжатия. Может исправлять повреждённые данные при наличии исправной избыточной копии. Для кэширования чтения используется оперативная память через <strong>ARC</strong>, размер которого можно ограничить.",
"seeAlso": [
{
"label": "Команды управления ZFS",
"href": "/docs/help-info/zfs-commands"
}
]
}
]
}
@@ -0,0 +1,120 @@
{
"meta": {
"title": "Добавление TPU Coral в LXC | Документация ProxMenux",
"description": "Проброс TPU Google Coral (USB или M.2 / PCIe) в контейнер Proxmox LXC. ProxMenux записывает подходящие записи dev / cgroup / mount для каждого варианта, запускает контейнер и устанавливает в нём среду выполнения Edge TPU, чтобы приложения, такие как Frigate, могли использовать ускоритель."
},
"header": {
"title": "Добавить Coral TPU в LXC",
"description": "Предоставьте контейнеру Proxmox LXC совместный доступ к TPU Google Coral (USB Accelerator или M.2 / Mini-PCIe). ProxMenux настраивает LXC и устанавливает среду выполнения Edge TPU внутри контейнера. Coral предназначен только для TPU: для совместного доступа к GPU / iGPU (Quick Sync, VA-API, NVENC) в том же контейнере отдельно запустите «Добавление GPU в LXC».",
"section": "Оборудование: GPU и Coral-TPU"
},
"intro": {
"title": "Что делает этот инструмент",
"body": "Записывает настройки проброса в <code>/etc/pve/lxc/&lt;ctid&gt;.conf</code> — записи различаются в зависимости от того, подключён ли к хосту <strong>USB Accelerator</strong>, <strong>M.2 / PCIe Coral</strong> или оба устройства. Затем запускает контейнер и устанавливает в нём последнюю версию среды выполнения <code>libedgetpu</code> от Google. Проброс iGPU / GPU выполняется отдельным скриптом (<lxcGpuLink>Добавление GPU в LXC</lxcGpuLink>) — этот скрипт предназначен для TPU."
},
"whenUse": {
"heading": "Когда это использовать",
"body": "Используйте для <frigateLink>Frigate</frigateLink> или другого совместимого приложения обнаружения для Linux в LXC. Coral выполняет поддерживаемые операции вывода моделей машинного обучения вместо CPU. Производительность зависит от модели и оборудования; декодирование видео и другие задачи приложения по-прежнему потребляют ресурсы."
},
"prereqs": {
"title": "Перед началом",
"drivers": "<strong>Подготовьте устройство Coral на хосте</strong>. Для M.2 / PCIe на хосте должен быть загружен драйвер; для USB необходимы доступ к устройству и соответствующие права. См. <hostLink>Установка TPU Coral на хост</hostLink>. Скрипт устанавливает среду выполнения приложения в контейнерах Debian/Ubuntu; для других дистрибутивов её необходимо установить отдельно.",
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
"container": "<strong>Существующий контейнер LXC</strong>, желательно с дистрибутивом на базе <strong>Debian / Ubuntu</strong> — для установки среды выполнения внутри контейнера используется <code>apt-get</code>. <strong>Контейнеры не на базе Debian</strong> (Alpine, Arch, RHEL, SUSE…) также поддерживаются в <strong>режиме только проброса устройств</strong>: скрипт определяет дистрибутив и предлагает пропустить установку <code>libedgetpu</code> через APT, при этом всё равно записывая настройки проброса устройств. Это полезно для контейнеров приложений, в состав которых уже входит среда выполнения (например, образ Frigate Docker).",
"downtime": "<strong>Будьте готовы к кратковременному простою</strong> контейнера. Скрипт останавливает его для применения изменений конфигурации, затем снова запускает, чтобы установить драйверы внутри контейнера. Перезагрузка хоста не требуется."
},
"hostPrep": {
"title": "Сначала необходимо подготовить хост",
"body": "Для M.2 / PCIe на хосте необходимы драйвер <code>gasket</code>/<code>apex</code> и рабочий узел устройства. Для USB нужны подключённое устройство и права доступа; запускать приложение на хосте не требуется. Среда выполнения <code>libedgetpu</code> должна быть доступна там, где работает приложение. Следуйте порядку: <strong>подготовка хоста → доступ к устройству LXC → настройка приложения</strong>."
},
"running": {
"heading": "Запуск скрипта",
"body": "Откройте ProxMenux на хосте, перейдите в <strong>Оборудование: графические процессоры и Coral-TPU → Add Coral TPU to LXC</strong>.",
"imageAlt": "Пункт меню «Добавить TPU Coral в LXC» в разделе «Оборудование: GPU и Coral-TPU»"
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Выберите целевой контейнер. Скрипт настраивает доступ к USB, даже если USB-устройство Coral сейчас не подключено, а затем добавляет доступ к M.2 / PCIe при обнаружении соответствующего оборудования."
},
"walkthrough": {
"heading": "Пошаговый разбор",
"pick": {
"title": "Выберите контейнер LXC",
"body": "В списке выбора отображаются подходящие контейнеры из <code>pct list</code>; контейнеры на основе образов OCI скрыты и управляются через OCI manager Apps. Выберите целевой контейнер — работающий или остановленный. При необходимости скрипт останавливает его, записывает конфигурацию и запускает для установки среды выполнения."
},
"gpuHint": {
"title": "Рекомендация по пробросу GPU (необязательно)",
"body": "Если GPU обнаружен, но не настроен для этого контейнера, диалоговое окно рекомендует <lxcGpuLink>Добавить GPU в LXC</lxcGpuLink> для аппаратного декодирования видео, например с помощью Quick Sync, VA-API или NVENC. Затем предлагается продолжить только с Coral: «Да» — продолжить настройку TPU; «Нет» — выйти, чтобы сначала настроить GPU."
},
"usb": {
"title": "Запись конфигурации LXC — вариант USB",
"body": "Скрипт создаёт на хосте правило udev для символической ссылки <code>/dev/coral</code> и подключает в контейнер через bind-монтирование <strong>всё</strong> дерево <code>/dev/bus/usb</code>. Эта конфигурация USB записывается, даже если USB-устройство Coral сейчас не подключено; она предоставляет доступ не только к этому устройству.",
"whyTitle": "Почему монтируется /dev/bus/usb, а не /dev/coral?",
"whyBody": "Пути к узлам USB-устройств, например <code>/dev/bus/usb/001/005</code>, меняются при повторном подключении. В старых версиях символическая ссылка <code>/dev/coral</code> подключалась через bind-монтирование, из-за чего мог сохраняться устаревший путь. Монтирование всего дерева USB делает текущий узел устройства видимым; при этом приложению может потребоваться повторно открыть его."
},
"pcie": {
"title": "Запись конфигурации LXC — вариант M.2 / PCIe",
"body1": "Если на хосте присутствует устройство Coral с интерфейсом M.2 / PCIe и существует <code>/dev/apex_0</code> (модуль ядра apex загружен), скрипт использует современный механизм Proxmox <code>dev</code> API, который автоматически настраивает права cgroup2 как для привилегированных, так и для непривилегированных контейнеров:",
"body2": "Если <code>/dev/apex_0</code> отсутствует после выполнения <hostLink>Установить Coral на хост</hostLink>, скрипт записывает bind-монтирование с <code>create=file</code> и, только если старший номер устройства apex указан в <code>/proc/devices</code>, классическое правило cgroup2. Ни то ни другое не создаёт работающее устройство:",
"rebootTitle": "Если вы только что установили драйверы Coral, сначала перезагрузите хост",
"rebootBody": "Резервный вариант монтирования не загружает драйвер <code>apex</code> на хосте. Загрузите драйвер или перезагрузите хост после установки и убедитесь, что устройство на хосте существует. Когда устройство будет готово, повторно запустите скрипт, чтобы применить современную запись устройства, а затем перезапустите контейнер."
},
"drivers": {
"title": "Запуск контейнера и установка среды выполнения Coral внутри него",
"body": "Скрипт запускает контейнер и ждёт до 15 секунд, пока тот перейдёт в состояние «работает», затем с помощью <code>pct exec</code> запускает внутри установщик среды выполнения. Установщик:",
"items": [
"Выполняет <code>apt-get update</code>.",
"Устанавливает компоненты, необходимые для работы с репозиторием Coral: <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
"Импортирует GPG-ключ Google Coral в <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (современный путь, который также использует установщик на хосте) и добавляет APT-репозиторий <code>coral-edgetpu-stable</code> с помощью <code>signed-by=</code>.",
"По умолчанию устанавливает <code>libedgetpu1-std</code>. При обнаружении M.2 Coral скрипт предлагает выбрать <code>libedgetpu1-std</code> или <code>libedgetpu1-max</code>. Сам по себе выбор пакета среды выполнения не настраивает параметры обнаружения в приложении."
],
"noIgpuTitle": "Почему здесь нет драйверов iGPU?",
"noIgpuBody": "Ранние версии этого скрипта также устанавливали Intel <code>va-driver-all</code>, <code>intel-opencl-icd</code> и другие компоненты, чтобы один контейнер мог декодировать видео с помощью Quick Sync и одновременно выполнять инференс с помощью Coral. Такое совмещение задач приводило к непонятным сбоям, когда пользователю требовался только Coral. Теперь за iGPU отвечает исключительно <lxcGpuLink>Добавить GPU в LXC</lxcGpuLink> — сначала запустите этот скрипт, если вам также нужно аппаратное декодирование видео в контейнере.",
"debianTitle": "Контейнеры не на базе Debian — режим только проброса устройств",
"debianBody": "Для установки среды выполнения внутри контейнера используется <code>apt-get</code>, который поставляется только в дистрибутивах семейства Debian/Ubuntu. В контейнерах <strong>Alpine, Arch, RHEL или SUSE</strong> скрипт определяет дистрибутив с помощью <code>/etc/os-release</code> и запрашивает подтверждение: <em>продолжить в режиме только проброса устройств</em> (записывает конфигурацию устройств в <code>/etc/pve/lxc/&lt;ctid&gt;.conf</code> и пропускает установку <code>libedgetpu</code> через APT) или <em>прервать выполнение</em>. Режим только проброса устройств подходит, если контейнер приложения, которое будет использовать Coral, уже содержит среду выполнения. Типичный пример — образ Frigate Docker. В противном случае следуйте <coralLink>официальному руководству</coralLink> Google, чтобы установить <code>libedgetpu</code> вручную после того, как скрипт запишет конфигурацию LXC."
},
"summary": {
"title": "Итоги",
"body": "В конце скрипт выводит список включённых устройств (Coral USB, Coral M.2) с отметками ✓ или ⚠ в зависимости от того, было ли оборудование действительно обнаружено. Контейнер продолжает работать — можно сразу перейти к настройке Frigate / CodeProject.AI / вашего приложения."
}
},
"manual": {
"heading": "Эквивалентные действия вручную",
"body": "Если вы хотите узнать, что именно добавляется в конфигурацию LXC, или внести эти настройки вручную:",
"usbHeading": "USB Coral",
"pcieHeading": "M.2 / PCIe Coral",
"runtimeHeading": "Внутри контейнера — среда выполнения Coral"
},
"verification": {
"heading": "Проверка",
"body": "Войдите в контейнер и проверьте, что Coral виден:"
},
"troubleshoot": {
"heading": "Устранение неполадок",
"apexTitle": "Контейнер запущен, но внутри отсутствует /dev/apex_0",
"apexBody": "Сначала проверьте драйвер на хосте: <code>lsmod | grep apex</code>. Если он отсутствует, попробуйте <code>modprobe apex</code> или перезагрузите хост после установки драйвера. Когда на хосте появится <code>/dev/apex_0</code>, проверьте запись устройства LXC (повторно запустите скрипт, если были записаны только резервные записи) и перезапустите контейнер с помощью <code>pct stop &lt;ctid&gt; &amp;&amp; pct start &lt;ctid&gt;</code>.",
"replugTitle": "USB Coral исчезает после переподключения к другому порту",
"replugBody": "Именно поэтому скрипт монтирует <code>/dev/bus/usb</code>, а не символическую ссылку <code>/dev/coral</code>. Если вы столкнулись с этой проблемой, проверьте, что в конфигурации LXC указано <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code>, а не прямая ссылка на <code>/dev/coral</code>. Старые конфигурации, созданные предыдущими версиями скрипта, могут требовать обновления — повторно запустите скрипт для того же контейнера, и конфигурация обновится.",
"alpineTitle": "Контейнер Alpine / Arch / RHEL / SUSE — среда выполнения не установлена",
"alpineBody": "В <em>режиме только проброса устройств</em> конфигурация устройств записывается, но <code>libedgetpu</code> не устанавливается. Используйте совместимый пакет сообщества или сборку из исходного кода; прежде чем выполнять команду установки пакета, например Alpine <code>apk add</code>, проверьте его доступность. Образ приложения, например Frigate, может уже содержать среду выполнения. При использовании вложенного Docker также пробросьте устройство M.2 с помощью <code>--device /dev/apex_0:/dev/apex_0</code> или смонтируйте дерево USB в этот контейнер Docker; одного монтирования LXC недостаточно для проброса устройства в Docker.",
"frigateTitle": "Frigate сообщает: «Coral EdgeTPU обнаружен, но недоступен»",
"frigateBody": "Проверьте доступность среды выполнения, видимость устройства и права на чтение и запись для процесса, под которым фактически работает приложение. Для USB проверьте права доступа и членство в группе <code>plugdev</code>, если оно используется. Для M.2 проверьте <code>/dev/apex_0</code> с помощью <code>ls -l /dev/apex_0</code>. Одного имени группы, например <code>apex</code> в <code>/etc/group</code>, недостаточно: числовые GID и сопоставления LXC должны совпадать. Также проверьте, не занят ли TPU другим процессом; не переходите в привилегированный режим в качестве первой меры устранения проблемы.",
"logsTitle": "Проверьте журналы и хоста, и контейнера",
"logsBody": "На хосте проверьте сообщения ядра об устройствах с помощью <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. В контейнере проверьте журналы приложения; для вложенного Docker используйте <code>docker logs &lt;container&gt;</code>. Причиной сбоев могут быть права доступа, отсутствие среды выполнения, проблемы с подключением по USB или использование TPU другим процессом."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"label": "Установить Coral TPU на хосте",
"href": "/docs/hardware/install-coral-tpu-host",
"tail": " — обязательное предварительное условие для карт Coral формата M.2 / PCIe перед их пробросом в CT."
},
{
"label": "Добавить GPU в LXC",
"href": "/docs/hardware/igpu-acceleration-lxc",
"tail": " — аналогичный подход для GPU (часто используются вместе с TPU Coral в конфигурациях Frigate)."
}
]
}
}
@@ -0,0 +1,178 @@
{
"meta": {
"title": "Добавление GPU в ВМ (проброс) | Документация ProxMenux",
"description": "Проброс GPU Intel, AMD или NVIDIA в ВМ Proxmox с производительностью, близкой к нативной. ProxMenux выполняет подготовку хоста (модули VFIO, чёрный список драйверов, параметры командной строки ядра), настройку ВМ (hostpci, аудиофункция, остальные устройства группы IOMMU), применяет обходные решения для конкретных производителей (NVIDIA Code 43, ошибка сброса AMD, дамп ROM) и устраняет конфликты с LXC при переключении режимов."
},
"header": {
"title": "Добавить GPU в ВМ (прямой проброс)",
"description": "Передайте один из GPU виртуальной машине с производительностью, близкой к нативной. ProxMenux обнаруживает Intel / AMD / NVIDIA, проверяет IOMMU, анализирует группу IOMMU выбранного GPU, чтобы пробросить все устройства этой группы вместе, настраивает VFIO на хосте, записывает нужные строки hostpci в конфигурацию ВМ и при необходимости применяет исправления для конкретного производителя.",
"section": "Оборудование: GPU и Coral-TPU"
},
"intro": {
"title": "Что делает этот инструмент",
"body": "Автоматизирует соответствующие этапы настройки хоста и <code>hostpci</code>, описанные в <pveLink>документации Proxmox по пробросу PCI-устройств</pveLink>. Проверяет назначения устройств в <em>других</em> гостевых системах и предлагает варианты разрешения конфликтов. Эти проверки не гарантируют поддержку всех GPU, методов сброса или гостевых драйверов."
},
"who": {
"heading": "Для кого это предназначено?",
"body": "На вашем хосте Proxmox установлен физический GPU, и вы хотите, чтобы <strong>виртуальная машина</strong> (для игр под Windows, macOS, вычислений на GPU без монитора или медиасервера на базе ВМ) использовала его напрямую. Проброс GPU в ВМ отличается от проброса в LXC: для ВМ ядро должно обрабатывать GPU как устройство VFIO (по сути, «хост его не использует»), поэтому во время работы ВМ хост не может использовать этот GPU для других задач. Для транскодирования и вычислений в <em>LXC</em> используйте вместо этого <lxcLink>Добавление GPU в LXC</lxcLink> — этот вариант обеспечивает совместное использование GPU и не требует VFIO."
},
"prereqs": {
"title": "Перед началом",
"gpu": "Физически установленный <strong>поддерживаемый GPU</strong>. Скрипт обнаруживает Intel, AMD и NVIDIA с помощью <code>lspci</code>.",
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
"iommu": "<strong>Поддержка IOMMU</strong> должна быть доступна на аппаратном уровне и, если требуется, включена в прошивке (Intel VT-d или AMD-Vi). Скрипт проверяет работающую систему и может настроить параметры загрузки Linux; он не может изменять настройки BIOS/UEFI или подтвердить, что каждый неактивный IOMMU отключён в прошивке.",
"q35": "Для работы этого помощника требуется тип машины <strong>q35</strong>; тип <code>i440fx</code> не поддерживается. Тип машины — отдельная настройка, не связанная с выбором прошивки BIOS/UEFI; изменение чипсета существующей виртуальной машины требует планирования и не выполняется автоматически.",
"q35Check": "qm config VMID | grep machine",
"moreGpus": "Желательно иметь на хосте <strong>более одного GPU</strong> или доступ к консоли через другой канал (IPMI, KVM-over-IP, последовательный порт). После проброса единственного GPU в ВМ изображение консоли хоста пропадёт. Если у вас два GPU NVIDIA, один можно пробросить в ВМ, а другой оставить хосту — скрипт настраивает это отдельно для каждого BDF (см. <em>NVIDIA</em> в примечаниях по производителям ниже).",
"nvidiaInstalled": "Если вы установили <nvidiaLink>драйверы NVIDIA на хост</nvidiaLink>, выбранные функции резервируются для <code>vfio-pci</code>, а не для <code>nvidia</code>. Модуль <code>nvidia</code> может оставаться доступным для <strong>других</strong> карт вне затронутой группы IOMMU; проверьте их с помощью <code>nvidia-smi</code>."
},
"pickOne": {
"title": "Проброс в ВМ или совместное использование с LXC — выберите один вариант для каждого GPU",
"body": "GPU, привязанный к <code>vfio-pci</code> для проброса в ВМ, не может одновременно использоваться хостом или LXC. Если у вас два GPU, можно выделить по одному для каждого варианта. Если GPU только один, выберите:",
"vmItem": "<strong>Вариант с ВМ (эта страница):</strong> полный доступ к оборудованию, но исключительно для ВМ, которой назначен GPU, пока она работает.",
"lxcItem": "<strong>Вариант с LXC (<lxcLink>Добавление GPU в LXC</lxcLink>):</strong> совместное использование с хостом и другими контейнерами, хорошо подходит для транскодирования, настройка VFIO не требуется."
},
"running": {
"heading": "Запуск установщика",
"body": "Откройте ProxMenux на хосте и перейдите в <strong>Оборудование: GPU и Coral-TPU → Add GPU в ВМ</strong>.",
"imageAlt": "Пункт меню «Добавить GPU в ВМ» в разделе «Оборудование: GPU и Coral-TPU»"
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Обнаружение и выбор устройств выполняются до основных изменений хоста и ВМ, а итоговая сводка позволяет подтвердить этот план. Включение IOMMU требует отдельного подтверждения на более раннем этапе и уже на этом этапе может изменить конфигурацию загрузки. Позднее при удалении связанных настроек аудиоустройства также может потребоваться выбор."
},
"walkthrough": {
"heading": "Пошаговый разбор",
"detect": {
"title": "Обнаружение GPU и проверка IOMMU",
"body": "Считает IOMMU активным только в том случае, если в параметрах работающего ядра есть <code>intel_iommu=on</code> или <code>amd_iommu=on</code> и существуют группы IOMMU. Если параметр уже сохранён для следующей загрузки, работа продолжается в режиме ожидания перезагрузки; в противном случае его можно добавить с помощью <code>iommu=pt</code> на отдельном шаге, требующем подтверждения. При эвристическом выборе загрузочного файла используется <code>/etc/kernel/cmdline</code>, если в нём есть маркер корневой файловой системы ZFS, например <code>root=ZFS=</code>; иначе используется <code>/etc/default/grub</code>. Эта эвристика не доказывает, какой загрузчик используется на самом деле. Новая настройка IOMMU вступает в силу после перезагрузки; после неё проверьте фактические группы.",
"tipTitle": "Уже выполнили настройку после установки?",
"tipBody": "Если <postLink>поддержка VFIO IOMMU</postLink> была настроена ранее и активна в работающем ядре, проверка проходит успешно. Одной лишь сохранённой настройки для следующей загрузки недостаточно, чтобы подтвердить её активность.",
"imageAlt": "Список обнаруженных GPU с указанием производителя и адреса PCI"
},
"preflight": {
"title": "Выберите GPU и выполните предварительные проверки",
"intro": "После выбора GPU скрипт выполняет ряд проверок, каждая из которых может заблокировать дальнейшие действия:",
"items": [
"<strong>Защитная проверка SR-IOV.</strong> Этот помощник отказывается работать с VF и с PF, у которых есть активные VF, поскольку его сценарий проброса устройства целиком не предназначен для настройки SR-IOV. Проброс SR-IOV необходимо настраивать отдельно на поддерживаемом оборудовании.",
"<strong>Предупреждение о единственном GPU.</strong> Если это единственный GPU на хосте, появится предупреждающее диалоговое окно с напоминанием, что после перезагрузки изображение на консоли исчезнет. Убедитесь, что у вас есть доступ через SSH или веб-интерфейс с другого компьютера.",
"<strong>Политика сброса AMD.</strong> Считывает <code>/sys/bus/pci/devices/&lt;pci&gt;/reset_method</code>. Работа с APU или дискретной видеокартой без FLR <em>блокируется политикой этого помощника</em>; для неизвестного подтипа без FLR требуется явное разрешение на обход ограничения. Это не означает, что работа с таким оборудованием невозможна во всех случаях.",
"<strong>GPU не должен находиться в D3cold.</strong> Некоторые карты AMD в состоянии простоя сообщают о состоянии питания <code>D3cold</code>, из-за чего они не видны при запуске ВМ. Дальнейшие действия заблокированы, пока вы не выведете GPU из этого состояния.",
"<strong>Анализ группы IOMMU.</strong> Считывает <code>/sys/kernel/iommu_groups/</code> и включает в план ВМ <em>все устройства группы, кроме мостов</em>, в том числе, возможно, сетевые контроллеры или контроллеры хранения данных. Если в группе есть устройства из другого слота, скрипт перечисляет их перед сводкой; убедитесь, что ни одно из них не требуется хосту. Если IOMMU ожидает перезагрузки, фактические группы недоступны и изначально план содержит только выбранную функцию GPU; после перезагрузки проверьте изоляцию."
],
"audioIntro": "<strong>Сопутствующее аудиоустройство.</strong> Возможны два варианта в зависимости от того, где находится аудиоустройство:",
"audioDgpu": "<strong>Дискретный GPU:</strong> аудиоустройство HDMI часто занимает функцию <code>.1</code> того же слота PCI и автоматически включается в план при обнаружении. Если хост использовал это аудиоустройство, он потеряет к нему доступ после его резервирования для ВМ.",
"audioIgpu": "<strong>Intel iGPU (или любой GPU без соседней функции <code>.1</code>):</strong> аудиоустройство HDMI / аналогового звука находится в чипсете и использует другой слот (обычно <code>00:1f.3</code>). Скрипт сканирует хост, перечисляет все аудиоконтроллеры PCI с их текущими драйверами (<code>snd_hda_intel</code> и т. д.) и предлагает выбрать, какие из них пробросить. По умолчанию <strong>ничего не выбрано</strong> — проброс нужно выбрать явно."
},
"pickVm": {
"title": "Выберите целевую ВМ",
"body": "Выберите ВМ из списка. Помощнику требуется q35; по возможности он повторно использует существующие записи GPU. Прошивка BIOS/UEFI — это отдельная настройка, а не тип машины; эта проверка не меняет автоматически чипсет или режим загрузки уже установленной гостевой системы.",
"imageAlt": "Список выбора ВМ с указанием имени, идентификатора и состояния"
},
"switchMode": {
"title": "Режим переключения — если GPU уже используется в другом месте",
"intro": "Скрипт проверяет конфигурации всех ВМ и все конфигурации LXC на хосте в поисках выбранного GPU. Возможны три результата:",
"items": [
"<strong>GPU свободен.</strong> Ничего делать не нужно, можно продолжать.",
"<strong>GPU назначен другой ВМ.</strong> Если исходная ВМ сейчас работает, скрипт прерывает выполнение: две ВМ не могут совместно использовать GPU, выделенный исключительно одной ВМ через VFIO, поэтому сначала необходимо остановить исходную ВМ. Если исходная ВМ остановлена, предлагаются два варианта: <em>оставить GPU в конфигурации исходной ВМ, но отключить запуск при загрузке хоста</em> или <em>удалить строки GPU из конфигурации исходной ВМ и оставить запуск при загрузке хоста включённым</em>. Также предусмотрен упрощённый сценарий: если GPU уже привязан к <code>vfio-pci</code> и выполняется обычная передача GPU из одной ВМ в другую, конфигурация хоста не изменяется и перезагрузка не требуется.",
"<strong>GPU используется LXC.</strong> Для обычных контейнеров выберите <em>сохранить конфигурацию GPU и отключить запуск при загрузке</em> или <em>удалить конфигурацию устройств GPU и сохранить запуск при загрузке</em>. При удалении удаляются записи <code>devN</code>, а для AMD/Intel — также устаревшие правила <code>/dev/dri</code> <code>lxc.mount.entry</code> и <code>lxc.cgroup2.devices.allow</code>. Контейнеры OCI сохраняют свою конфигурацию и останавливаются с отключением запуска при загрузке; удаляйте их GPU через раздел Apps менеджера OCI. Конфликты определяются по семейству устройств GPU, поэтому проверка может затрагивать и другие карты того же семейства."
],
"imageAlt": "Диалог с предложением удалить GPU из LXC перед назначением виртуальной машине",
"smartTitle": "Связанные аудиоустройства тоже удаляются с учётом их использования",
"smartBody": "После удаления назначений GPU из исходной виртуальной машины скрипт может предложить список <strong>аудиоустройств, которые могли остаться без привязки</strong>. Проверьте его и снимите отметки со всех устройств, которые ещё нужны исходной виртуальной машине. Например, аудиоустройство дискретной видеокарты по адресу <code>02:00.1</code> может остаться, а аудиоустройство чипсета по адресу <code>00:1f.3</code> — быть предложено для удаления. Дополнительные удаления определяются этим списком, а не какой-либо универсальной гарантией соответствия видеоустройств и аудиоустройств."
},
"audioPick": {
"title": "(Если нет связанной функции .1) Выберите аудиоконтроллеры для включения",
"body": "Этот шаг появляется только для Intel iGPU и аналогичных конфигураций с отдельными аудиоустройствами. В списке показаны все аудиоконтроллеры PCI хоста, кроме уже входящих в группу IOMMU выбранного GPU; для каждого указан текущий драйвер. Выберите нужные контроллеры или не выбирайте ничего, если виртуальной машине не нужен звук через оборудование хоста.",
"imageAlt": "Диалог со списком всех аудиоконтроллеров PCI хоста (BDF + драйвер), когда у GPU нет связанной аудиофункции .1",
"warnTitle": "Не отмечайте аудиоустройства, необходимые хосту",
"warnBody": "Назначение аудиоконтроллера виртуальной машине может лишить хост доступа к нему; контроллер не может одновременно принадлежать другой работающей виртуальной машине. Не выбирайте дополнительные аудиоустройства без необходимости и перед переносом проверяйте, кому они назначены. Аудиоустройство PCI не обязательно является источником звукового сигнала консоли хоста."
},
"summary": {
"title": "Проверьте сводку перед подтверждением",
"body": "Проверьте итоговый план изменений хоста и виртуальной машины и отмените операцию, если он неверен. В сводке указаны группа IOMMU и количество входящих в неё устройств; устройства из другого слота перечислены на предыдущем шаге. Отмена останавливает внесение основных изменений, но не отменяет ранее отдельно подтверждённое изменение конфигурации загрузки для IOMMU.",
"imageAlt": "Диалог со сводкой изменений хоста (файлы VFIO и чёрного списка) и конфигурации виртуальной машины (строки hostpci) перед их применением"
},
"hostApply": {
"title": "Применение изменений хоста",
"intro": "На этапе применения вносятся изменения в хост и виртуальную машину. При удалении связанных аудиоустройств может потребоваться дополнительный выбор. Изменения хоста могут включать:",
"items": [
"<code>/etc/modules</code> — добавляет <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (а также <code>vfio_virqfd</code> для ядер &lt; 6.2).",
"<code>/etc/modprobe.d/vfio.conf</code> — для AMD / Intel задаёт <code>options vfio-pci ids=&lt;vendor:device,...&gt; disable_vga=1</code>, чтобы VFIO получал управление GPU на раннем этапе загрузки. Для NVIDIA файл добавляет только <code>softdep nvidia pre: vfio-pci</code> (а также <code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>); фактическая привязка выполняется отдельно для каждого BDF через приведённое ниже правило udev. Для AMD также добавляет строки <code>softdep</code>, принудительно задающие загрузку <code>vfio-pci</code> перед <code>radeon</code> / <code>amdgpu</code>.",
"Записывает <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> и <code>kvm.conf</code> с параметрами <code>allow_unsafe_interrupts=1</code> и <code>ignore_msrs=1</code>. Это настройки совместимости, применяемые скриптом, а не универсальные требования Windows/macOS; небезопасные прерывания ослабляют защиту переназначения прерываний.",
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Эти записи действуют на уровне производителя и могут затронуть другие карты, использующие тот же драйвер. Проприетарный модуль <code>nvidia</code> блокируется <strong>только</strong> через <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code>, когда <em>все</em> карты NVIDIA на хосте учтены для использования с VFIO.",
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>только для NVIDIA.</strong> Правило udev задаёт <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> при событии PCI ADD для отслеживаемых BDF, включая затронутые функции группы IOMMU. Карты вне этих групп могут сохранить драйвер <code>nvidia</code>. Политика для отдельных BDF не разделяет аппаратную группу IOMMU.",
"<strong>Только для AMD.</strong> Выполняется попытка получить дамп ROM из <code>/sys/bus/pci/.../rom</code> или ACPI VFCT и сохранить его в <code>/usr/share/kvm/vbios_&lt;vendor&gt;_&lt;device&gt;.bin</code>. В случае успеха ВМ использует <code>romfile=</code>. Корректный дамп не гарантирует успешной инициализации GPU.",
"<strong>Только для NVIDIA.</strong> Службы NVIDIA на хосте (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>) останавливаются и отключаются только тогда, когда все GPU NVIDIA назначены VFIO. Если часть GPU остаётся в распоряжении хоста, эти службы и модуль <code>nvidia</code> остаются активными для GPU, использующих штатный драйвер.",
"<code>update-initramfs -u -k all</code> — выполняется только в том случае, если что-либо из перечисленного выше действительно изменилось."
]
},
"vmApply": {
"title": "Конфигурация ВМ применяется через qm set",
"body": "Конфигурация ВМ в <code>/etc/pve/qemu-server/&lt;vmid&gt;.conf</code> обновляется через <code>qm set</code> (никогда не путём прямого применения <code>sed</code>):",
"after1": "Скрипт добавляет <code>x-vga=1</code> для AMD и NVIDIA, но <strong>не</strong> для Intel. Это описывает принятый в скрипте подход к настройке, но не доказывает, что у каждого Intel iGPU отсутствует прошивка или что этот флаг всегда вызывает зависания.",
"after2": "Дополнительные строки <code>hostpciN</code> добавляются, если группа IOMMU этого GPU содержит другие устройства, которые необходимо пробросить вместе с ним."
},
"reboot": {
"title": "Перезагрузите хост, если его конфигурация была изменена",
"body": "Следуйте предложению о перезагрузке при изменении параметров загрузки или драйверов хоста и перед запуском ВМ проверьте, к какому драйверу фактически привязан GPU. Сохранённая конфигурация не доказывает, что она уже действует. При переназначении GPU с одной ВМ на другую можно обойтись без перезагрузки хоста, если состояние VFIO корректно.",
"imageAlt": "Итоговый экран с перечнем изменений, за которым следует предложение перезагрузки"
}
},
"vendors": {
"heading": "Примечания по производителям",
"nvidiaHeading": "NVIDIA",
"nvidiaBody": "В скрипте сохранён устаревший способ обхода ошибки <em>Code 43</em>: <code>hidden=1</code>, идентификатор производителя <code>NV43FIX</code> в <code>args</code> и <code>kvm=off</code>. Он не является обязательным для всех современных драйверов GeForce: NVIDIA добавила поддержку проброса GPU в ВМ с Windows в версии R465. У ошибки Code 43 могут быть и другие причины; проверьте конкретное сочетание GPU и драйвера.",
"nvidiaMultiHeading": "Поддержка нескольких GPU NVIDIA",
"nvidiaMultiBody": "Смешанное использование GPU NVIDIA поддерживается <strong>на уровне отдельных BDF</strong>. Функции, назначенные <code>vfio-pci</code>, отслеживаются по PCI-адресу, а не только по общему идентификатору <code>vendor:device</code>. Видеокарты вне затронутых групп IOMMU могут продолжать использовать <code>nvidia</code>, и их можно проверить с помощью <code>nvidia-smi</code>. Этот подход не обеспечивает независимую изоляцию двух видеокарт в одной группе.",
"amdHeading": "AMD",
"amdBody": "Некоторые GPU AMD не удаётся сбросить после остановки ВМ. Мастер проверяет заявленные возможности, а не каждый реальный цикл перезапуска. <vendorResetLink>vendor-reset</vendorResetLink> поддерживает ограниченный список устройств и требует совместимой поддержки в ядре и ранней загрузки; скрипт его не устанавливает. Проект <em>RadeonResetBugFix</em> для Windows — ещё один обходной путь, зависящий от оборудования, а не гарантированное решение для всех GPU AMD.",
"intelHeading": "Intel iGPU",
"intelBody": "Полный проброс Intel iGPU и SR-IOV — разные процедуры. Этот мастер выделяет устройство целиком одной ВМ и не добавляет <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> применим только к поддерживаемым сочетаниям оборудования и ядра для SR-IOV; обозначение «UHD 630+» не является критерием совместимости. Заранее предусмотрите альтернативный доступ к консоли хоста."
},
"verification": {
"heading": "Проверка"
},
"troubleshoot": {
"heading": "Устранение неполадок",
"code43Title": "Ошибка Code 43 в Windows (NVIDIA)",
"code43Body": "Ошибка Code 43 не доказывает, что скрыть KVM не удалось. Проверьте <code>qm config VMID | grep -E \"cpu|args\"</code> (замените VMID), чтобы увидеть заданные скриптом параметры <code>hidden=1</code> и <code>hv_vendor_id=NV43FIX</code>, но также проверьте драйвер в гостевой ОС, прошивку GPU и назначение устройства. Повторный запуск может завершиться досрочно, если GPU уже назначен.",
"amdResetTitle": "GPU AMD работает при первом запуске, но не после перезапуска ВМ",
"amdResetBody": "Одна из возможных причин — сбой сброса устройства. Перезагрузка хоста или полное выключение с последующим включением питания могут временно восстановить работу устройства. Проверьте, поддерживает ли <code>vendor-reset</code> именно этот GPU и это ядро, и обеспечьте его раннюю загрузку согласно документации; одного <code>softdep amdgpu pre: vendor-reset</code> недостаточно, чтобы гарантировать загрузку до VFIO. Обходной путь <em>RadeonResetBugFix</em> для Windows также требует совместимого GPU.",
"stuckBootTitle": "ВМ зависает при загрузке / GPU не обнаружен",
"stuckBootBody": "Проверьте выбранный PCI-адрес с помощью <code>lspci -nnk -s PCI_ADDRESS</code>; ожидаемый результат — <code>Kernel driver in use: vfio-pci</code>. Замените PCI_ADDRESS фактическим BDF. Если устройство по-прежнему использует штатный драйвер, проверьте соответствующие правила привязки, а не только <code>/etc/modprobe.d/blacklist.conf</code>; для NVIDIA также используется состояние для отдельных BDF. Прочитайте <code>dmesg | grep vfio</code>. После исправления постоянной конфигурации выполните пересборку с помощью <code>update-initramfs -u -k all</code> и следуйте плану перезагрузки.",
"darkTitle": "После перезагрузки экран консоли хоста гаснет, и не удаётся войти через SSH",
"darkBody": "Отсутствие изображения на экране не доказывает, что хост не работает. Если SSH также не работает, проверьте сетевое подключение и не попал ли сетевой контроллер или контроллер хранения данных в группу IOMMU. Восстановите доступ через IPMI, последовательный порт или среду восстановления; проверьте конфигурацию ВМ <code>/etc/pve/qemu-server/&lt;vmid&gt;.conf</code> и отмените только соответствующие назначения устройств и правила их привязки на хосте. Не удаляйте не относящиеся к ним настройки чёрного списка или VFIO.",
"logTitle": "Проверьте журнал установки",
"logBody": "При каждом запуске журнал записывается в <code>/tmp/add_gpu_vm.log</code>. Приложите его при обращении за помощью на GitHub."
},
"revert": {
"heading": "Отмена изменений вручную",
"intro": "Остановите ВМ и удалите только соответствующие назначения PCI-устройств в разделе оборудования Proxmox либо явно укажите индекс, как показано ниже. Отключение устройства от ВМ не возвращает его под управление штатного драйвера хоста. Для этого отдельного перехода используйте Switch GPU Mode и проверьте затрагиваемые гостевые системы перед подтверждением."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"label": "Установить драйверы NVIDIA на хосте",
"href": "/docs/hardware/nvidia-host",
"tail": " — подготовьте доступ через драйвер хоста для видеокарт, оставленных под его управлением; видеокарта, привязанная к VFIO, не может одновременно использоваться драйвером хоста."
},
{
"label": "Добавить GPU в LXC",
"href": "/docs/hardware/igpu-acceleration-lxc",
"tail": " — альтернативный подход: предоставьте нескольким контейнерам совместный доступ к GPU вместо его выделения одной ВМ."
},
{
"label": "Переключить режим GPU (ВМ ↔ LXC)",
"href": "/docs/hardware/switch-gpu-mode",
"tail": " — переключайте один и тот же GPU между режимами без повторной настройки всех подключений."
},
{
"label": "Команды для проброса GPU",
"href": "/docs/help-info/gpu-commands",
"tail": " — lspci, проверка IOMMU, справка по qm set hostpci."
}
]
}
}
@@ -0,0 +1,185 @@
{
"meta": {
"title": "Добавление GPU в LXC | Документация ProxMenux",
"description": "Предоставьте контейнеру LXC совместный доступ к GPU Intel, AMD или NVIDIA для транскодирования с аппаратным ускорением (Plex / Jellyfin / Frigate), выполнения задач OpenCL / CUDA и ускорения обработки видео с помощью Mesa. ProxMenux настраивает узлы устройств, согласует GID и устанавливает драйверы внутри контейнера с учётом его дистрибутива."
},
"header": {
"title": "Добавить GPU в LXC",
"description": "Предоставьте контейнеру LXC в Proxmox совместный доступ к одному или нескольким GPU. Хост продолжает использовать GPU как обычно — контейнер лишь получает доступ через узлы устройств. Поддерживаются Intel iGPUs (Quick Sync / VA-API), видеокарты AMD (Mesa / ROCm) и NVIDIA (CUDA / NVENC).",
"section": "Оборудование: GPU и Coral-TPU"
},
"intro": {
"title": "Что делает этот инструмент",
"body": "Добавляет записи <code>dev&lt;N&gt;</code> в <code>/etc/pve/lxc/&lt;ctid&gt;.conf</code> для соответствующих узлов <code>/dev/dri/*</code>, <code>/dev/kfd</code> или <code>/dev/nvidia*</code>. Запускает контейнер, устанавливает пакеты пользовательского пространства для его дистрибутива и, в случае Intel/AMD, согласует группы <code>video</code> и <code>render</code>. Для ускорения приложений по-прежнему необходимы совместимое оборудование, библиотеки и настройка самих приложений."
},
"compare": {
"heading": "Совместный доступ в LXC и проброс в ВМ",
"intro": "Контейнеры LXC используют общее с хостом ядро, поэтому могут <em>совместно использовать</em> GPU хоста, не забирая его под своё исключительное управление. В этом состоит важное отличие от ВМ: при <vmLink>пробросе в ВМ</vmLink> GPU выделяется исключительно одной ВМ, и хост не может его использовать. При использовании LXC несколько контейнеров и хост могут одновременно обращаться к одному и тому же GPU.",
"headerFeature": "Возможность",
"headerLxc": "LXC (эта страница)",
"headerVm": "VM",
"rows": [
{
"feature": "Хост продолжает использовать GPU?",
"lxc": "Да",
"vm": "Нет — GPU выделен исключительно ВМ"
},
{
"feature": "Несколько контейнеров могут совместно использовать один GPU?",
"lxc": "Да",
"vm": "Нет"
},
{
"feature": "Требуется IOMMU / VFIO на хосте?",
"lxc": "Нет",
"vm": "Да"
},
{
"feature": "Требуется перезагрузка?",
"lxc": "Обычно нет (достаточно перезапустить CT)",
"vm": "При изменении драйвера хоста или настроек IOMMU; не при каждом назначении GPU виртуальной машине"
},
{
"feature": "Гостевые операционные системы",
"lxc": "Только Linux (LXC работает только в Linux)",
"vm": "Поддерживаемая гостевая ОС с совместимым драйвером GPU"
}
]
},
"prereqs": {
"title": "Перед началом",
"gpu": "<strong>GPU на хосте</strong> — Intel iGPU, AMD dGPU или APU либо видеокарта NVIDIA. Скрипт автоматически обнаруживает все три варианта с помощью <code>lspci</code>.",
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
"vfio": "<strong>GPU НЕ привязан к vfio-pci.</strong> Если GPU сейчас передан виртуальной машине посредством проброса, он недоступен драйверу ядра хоста и LXC не может его использовать. Скрипт обнаруживает это и предлагает запустить <switchLink>Переключить режим GPU</switchLink>.",
"nvidia": "<strong>Только для NVIDIA:</strong> драйвер NVIDIA уже должен быть установлен на хосте — ProxMenux должен подобрать библиотеки пользовательского пространства контейнера в соответствии с версией драйвера на хосте. Если вы ещё этого не сделали, сначала запустите <nvidiaLink>Установить драйверы NVIDIA на хосте</nvidiaLink>.",
"nvidiaCheck": "nvidia-smi",
"container": "<strong>Существующий контейнер LXC.</strong> Скрипт не создаёт контейнер. Поддерживаются оба режима привилегий; <strong>привилегированный</strong> контейнер требуется не во всех случаях. При этом записи устройств и права доступа приложения, определяемые числовыми идентификаторами групп, всё равно должны соответствовать друг другу."
},
"unpriv": {
"title": "Работает как с привилегированными, так и с непривилегированными контейнерами",
"body": "Скрипт записывает параметры <code>dev&lt;N&gt;</code> в конфигурацию LXC, а для непривилегированных контейнеров согласует GID групп <code>video</code> и <code>render</code> на хосте и в контейнере, чтобы узлы устройств GPU были доступны из контейнера без ручного редактирования <code>lxc.idmap</code>."
},
"running": {
"heading": "Запуск установщика",
"body": "Откройте ProxMenux на хосте, перейдите в <strong>Оборудование: графические процессоры и Coral-TPU → Add GPU to LXC</strong>.",
"imageAlt": "Пункт меню «Добавить GPU в LXC» в разделе «Оборудование: GPU и Coral-TPU»"
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Выберите контейнер и семейства GPU, затем пройдите проверки. После этого скрипт останавливает контейнер и изменяет его конфигурацию; дополнительного окончательного подтверждения не будет. Необязательная очистка настроек VFIO требует отдельного подтверждения и может внести изменения на хосте раньше."
},
"walkthrough": {
"heading": "Пошаговый разбор",
"detect": {
"title": "Обнаружение GPU на хосте",
"body": "Скрипт ищет в <code>lspci</code> контроллеры VGA / 3D / Display производства Intel, AMD или NVIDIA. Для NVIDIA он также проверяет, что модуль ядра <code>nvidia</code> загружен и <code>nvidia-smi</code> работает. Указанная в его выводе версия драйвера хоста используется для выбора подходящего установщика <code>.run</code> для контейнера.",
"tipTitle": "NVIDIA не готова к работе?",
"tipBody": "Если NVIDIA обнаружена, но модуль не загружен, скрипт не предложит вариант для NVIDIA. Сначала запустите <nvidiaLink>Установить драйверы NVIDIA на хосте</nvidiaLink> и перезагрузите хост, затем вернитесь к этому шагу."
},
"pickCt": {
"title": "Выберите контейнер LXC",
"body": "Выводится список подходящих контейнеров LXC с идентификаторами и именами; контейнеры OCI исключены — для настройки устройств в них используется раздел Apps в OCI manager. Если контейнер работает, он останавливается, затем запускается для установки драйвера и обычно возвращается в исходное состояние: запущен или остановлен.",
"imageAlt": "Диалог со списком существующих контейнеров LXC для выбора"
},
"selectGpu": {
"title": "Выберите GPU для добавления",
"body": "В списке выбираются обнаруженные семейства GPU по производителю, а не отдельное устройство PCI. Для Intel/AMD добавляются видимые узлы DRI, используемые скриптом; для NVIDIA — доступные узлы её устройств, которые могут относиться к нескольким видеокартам. Если обнаружено только одно семейство, оно выбирается автоматически. Проверьте итоговый список устройств, особенно на хостах с несколькими GPU.",
"imageAlt": "Список обнаруженных GPU (Intel / AMD / NVIDIA) с флажками выбора, указанием производителя и адреса PCI"
},
"preflight": {
"title": "Предварительные проверки",
"imageAlt": "Диалог с предложением запустить Switch GPU Mode, если выбранный GPU всё ещё привязан к vfio-pci для проброса в виртуальную машину",
"intro": "Три проверки, каждая из которых может заблокировать операцию или изменить дальнейшие действия:",
"items": [
"<strong>Проверка SR-IOV.</strong> Этот помощник блокирует выбор VF или PF с активными VF. Это ограничение механизма выбора устройств в помощнике, а не общий запрет на использование SR-IOV с LXC; настраивайте такие устройства отдельно.",
"<strong>Привязка к vfio-pci.</strong> Если GPU сейчас используется VFIO для проброса в виртуальную машину, ядро хоста не может создать для него узлы <code>/dev/dri/*</code> или <code>/dev/nvidia*</code>. Скрипт предлагает запустить <switchLink>Switch GPU Mode</switchLink>, чтобы отменить привязку к VFIO; перед повторным запуском Add GPU to LXC, скорее всего, потребуется перезагрузка.",
"<strong>Уже настроено.</strong> Если в контейнере уже есть все узлы устройств для выбранного GPU, скрипт сообщает об этом и завершается без ошибки. Если настройка выполнена частично, скрипт продолжает работу, добавляя только недостающие элементы."
]
},
"applyConfig": {
"title": "Применение изменений конфигурации LXC",
"body1": "Останавливает контейнер, если он запущен, и редактирует <code>/etc/pve/lxc/&lt;ctid&gt;.conf</code>. Пронумерованные записи <code>dev&lt;N&gt;</code> содержат GID группы <code>video</code> или <code>render</code> на хосте. Существующие строки bind-монтирования <code>lxc.mount.entry</code> для <code>/dev/dri</code> заменяются записями <code>dev:</code>; проверьте итоговую конфигурацию и права доступа.",
"body2": "Пример после добавления Intel + NVIDIA в один контейнер:"
},
"installDrivers": {
"title": "Запуск контейнера и установка драйверов внутри него",
"body": "После записи конфигурации скрипт запускает контейнер, ждёт ответа от <code>pct exec</code> примерно до 30 секунд, а затем определяет дистрибутив контейнера по <code>/etc/os-release</code>. На основе этих данных он устанавливает соответствующие пакеты пользовательского пространства.",
"headerDistro": "Дистрибутив",
"headerInt": "Intel / AMD",
"headerNvidia": "NVIDIA",
"rows": [
{
"distro": "Alpine",
"intel": "apk add mesa-va-gallium intel-media-driver libva-utils",
"nvidia": "apk add nvidia-utils"
},
{
"distro": "Arch / Manjaro",
"intel": "pacman -Sy intel-media-driver mesa libva-utils",
"nvidia": "pacman -Sy nvidia-utils"
}
],
"debianDistro": "Debian / Ubuntu / другие",
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
"debianNvidia": "извлечь <code>.run</code> с хоста → <code>pct push</code> → запустить с <code>--no-kernel-modules --no-dkms</code>",
"whyTitle": "Зачем в Debian нужны дополнительные действия с установщиком NVIDIA .run",
"whyBody": "Версии пакетов из репозиториев могут не соответствовать версии драйвера на хосте. Для работы инструментов NVML, таких как <code>nvidia-smi</code>, библиотеки контейнера <strong>должны соответствовать загруженному модулю хоста</strong>. В варианте для Debian/glibc используется кешированный установщик <code>.run</code> версии, соответствующей драйверу хоста: скрипт извлекает и упаковывает его на хосте, передаёт с помощью <code>pct push</code> и устанавливает с помощью <code>--no-kernel-modules --no-dkms</code>. В Alpine и Arch используются пакеты из репозиториев, версии которых всё равно необходимо проверять."
},
"alignGids": {
"title": "Согласование GID и восстановление состояния",
"body1": "Для Intel/AMD считывает GID групп <code>video</code> и <code>render</code> на хосте, используя 44/104 только как запасные значения, затем редактирует <code>/etc/group</code> внутри контейнера, чтобы значения совпадали; при работе только с NVIDIA этот шаг пропускается. Такие записи, как <code>video:44</code> и <code>render:104</code>, приведены в качестве примеров и не являются универсальными идентификаторами. Проверьте членство пользователя приложения в группах и фактические права доступа к устройствам.",
"body2": "При штатном завершении контейнер, который изначально был остановлен, снова останавливается, а работавший контейнер продолжает работать. Если запуск или установка завершаются ошибкой, проверьте итоговое состояние контейнера и журнал."
}
},
"vendors": {
"heading": "Примечания по производителям",
"intelHeading": "Intel iGPU",
"intelBody": "Аппаратное ускорение обработки мультимедиа Intel, включая <em>Quick Sync</em>, зависит от поколения GPU, кодеков и настроек приложения. Скрипт предоставляет доступ к тем из узлов <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> и <code>renderD129</code>, которые существуют; узлы с другими номерами не добавляются. Эти узлы уже должны быть доступны на хосте благодаря его штатному драйверу, например <code>i915</code>.",
"amdHeading": "AMD",
"amdBody": "AMD использует узлы DRI для Mesa/VA-API. Если на хосте доступен <code>/dev/kfd</code>, скрипт также предоставляет к нему доступ. Для рабочих нагрузок ROCm/OpenCL по-прежнему требуются поддерживаемое оборудование и совместимые пакеты пользовательского пространства; предоставление доступа к устройству не устанавливает полный стек ROCm.",
"nvidiaHeading": "NVIDIA",
"nvidiaBody": "Предоставляет доступ к доступным узлам <code>/dev/nvidia*</code>. <strong>Совпадение версий драйверов</strong> по-прежнему необходимо для <code>nvidia-smi</code>. Для Debian/glibc используется кэшированный <code>.run</code> той же версии, что и на хосте; для Alpine/Arch используются пакеты из репозиториев. Если при установке для Debian обнаруживается, что выделено менее 2048 MiB оперативной памяти, скрипт предлагает временно увеличить её объём, а затем возвращает исходное значение; также требуется не менее 1500 MiB свободного места на диске.",
"updateTitle": "После обновления NVIDIA на хосте проверьте версии библиотек в контейнере",
"updateBody": "Из-за устаревших библиотек в контейнере <code>nvidia-smi</code> может сообщать о несовпадении версий. <nvidiaLink>Установщик NVIDIA для хоста</nvidiaLink> предлагает обновить контейнеры. Повторный запуск функции добавления GPU в LXC может завершиться, если записи устройств уже существуют, поэтому эта команда не гарантирует обновление библиотек. Проверьте установленные версии и обновите соответствующие пакеты контейнера либо используйте установщик компонентов пользовательского пространства."
},
"verification": {
"heading": "Проверка",
"body": "После завершения работы скрипта войдите в контейнер и убедитесь, что GPU виден:"
},
"troubleshoot": {
"heading": "Устранение неполадок",
"mismatchTitle": "nvidia-smi: не удалось инициализировать NVML: несовпадение версий драйвера и библиотеки",
"mismatchBody": "Библиотеки в контейнере не соответствуют загруженному модулю хоста. Проверьте версии и соответствующим образом обновите компоненты пользовательского пространства в контейнере. Кэшированный <code>.run</code> поддерживает установку для Debian/glibc, но функция добавления GPU в LXC может завершиться досрочно, если все записи устройств уже существуют.",
"denyTitle": "Отказано в доступе к /dev/dri/renderD128 внутри контейнера",
"denyBody": "Проверьте запись устройства и числовые права доступа группы <code>render</code>, затем проверьте, входит ли пользователь, от имени которого работает приложение, в группу <code>render</code>. Если команда usermod доступна, добавьте этого пользователя в группу <code>render</code> с помощью <code>usermod -aG render &lt;user&gt;</code>, заменив заполнитель именем фактической учётной записи. Перезапустите сеанс приложения, чтобы членство в группе вступило в силу; изменение режима привилегий не является универсальным решением проблем с правами доступа.",
"vainfoTitle": "vainfo сообщает: версия VA-API 1.xx; не удалось выполнить инициализацию",
"vainfoBody": "Проверьте доступ к устройству и выбранный драйвер VA-API. Названия пакетов зависят от дистрибутива: например, <code>intel-media-driver</code> для поддерживаемых новых GPU Intel, <code>i965-va-driver</code> для поддерживаемых старых моделей и <code>mesa-va-drivers</code> для AMD. Само по себе это сообщение не доказывает, что пакет отсутствует.",
"logTitle": "Журнал установки",
"logBody": "При каждом запуске журнал записывается в <code>/tmp/add_gpu_lxc.log</code> на хосте. Прикладывайте его при обращении за помощью на GitHub."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"label": "Установить драйверы NVIDIA на хосте",
"href": "/docs/hardware/nvidia-host",
"tail": " — обязательный предварительный шаг для GPU NVIDIA перед их передачей в контейнер."
},
{
"label": "Добавить GPU в ВМ (прямой проброс)",
"href": "/docs/hardware/gpu-vm-passthrough",
"tail": " — альтернативный вариант, если GPU требуется выделить исключительно одной виртуальной машине."
},
{
"label": "Переключить режим GPU (ВМ ↔ LXC)",
"href": "/docs/hardware/switch-gpu-mode",
"tail": " — переключение одного и того же GPU между совместным использованием в LXC и прямой передачей в виртуальную машину."
},
{
"label": "Команды для проброса GPU",
"href": "/docs/help-info/gpu-commands",
"tail": " — краткий справочник по связанным командам оболочки."
}
]
}
}
@@ -0,0 +1,203 @@
{
"meta": {
"title": "Установка TPU Coral на хосте | Документация ProxMenux",
"description": "Установка драйверов TPU Google Coral на хосте Proxmox VE. ProxMenux автоматически определяет наличие M.2 / Mini-PCIe или USB Accelerator (либо обоих устройств) и выполняет только подходящие варианты установки: модули ядра gasket/apex через DKMS для PCIe, среду выполнения libedgetpu1-std для USB."
},
"header": {
"title": "Установка TPU Coral на хосте",
"description": "Подготовьте хост Proxmox, чтобы впоследствии передать TPU Coral в контейнер LXC. ProxMenux автоматически определяет наличие карты M.2 / Mini-PCIe, USB Accelerator или обоих устройств и выполняет только подходящие варианты установки: сборку модулей ядра через DKMS для PCIe, установку среды выполнения Edge TPU от Google для USB.",
"section": "Оборудование: GPU и Coral-TPU"
},
"intro": {
"title": "Что делает этот инструмент",
"body": "<strong>Единый установщик, учитывающий оборудование,</strong> выбирает способы установки в соответствии с обнаруженными устройствами. Для PCIe используются модули <code>gasket</code> и <code>apex</code> с DKMS; для последующих пересборок по-прежнему потребуются совместимые исходные коды драйверов и заголовочные файлы ядра. Для USB используется среда выполнения <code>libedgetpu1-std</code> в пользовательском пространстве. Если обнаружены устройства обоих типов, выполняются оба варианта установки. Среда выполнения USB должна быть доступна там, где работает приложение; если приложение работает только внутри LXC, наличие этой среды на хосте само по себе не обязательно."
},
"which": {
"heading": "Какой у меня Coral?",
"body": "Два типа устройств Coral, которые можно подключить к хосту Proxmox, сильно различаются внешне, и установка на хосте для них тоже существенно отличается. Скрипт поддерживает оба типа, но перед запуском полезно выяснить, какой именно у вас:",
"headerForm": "Форм-фактор",
"headerDetect": "Обнаружение",
"headerInstall": "Тип установки",
"headerReboot": "Нужна перезагрузка?",
"pcieForm": "M.2 / Mini-PCIe",
"pcieFormSub": "(карты M.2 бывают с одним или двумя Edge TPU)",
"pcieDetect": "Идентификатор производителя PCI: <code>1ac1</code>",
"pcieInstall": "Модуль ядра (gasket + apex) через DKMS",
"pcieReboot": "Да",
"usbForm": "USB Accelerator",
"usbFormSub": "(небольшой USB-модуль в пластиковом корпусе)",
"usbDetect": "USB <code>1a6e:089a</code> (не запрограммирован) / <code>18d1:9302</code> (запрограммирован)",
"usbInstall": "Среда выполнения в пользовательском пространстве (<code>libedgetpu1-std</code>) из репозитория APT Google",
"usbReboot": "Нет"
},
"prereqs": {
"title": "Перед началом",
"coral": "<strong>Для установки требуется подключённый Coral TPU</strong> (M.2, Mini-PCIe или USB). Если оборудование не обнаружено, скрипт всё же может предложить очистку или удаление существующей установки; установка компонентов для нового оборудования выполняться не будет.",
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
"internet": "<strong>Доступ к интернету</strong> на хосте — при установке для PCIe через DKMS клонируется репозиторий GitHub, а для USB добавляется репозиторий APT Google и загружается пакет <code>libedgetpu1-std</code>.",
"headers": "<strong>Заголовочные файлы ядра, доступные через APT</strong>. В Proxmox это означает, что пакет <code>proxmox-headers-$(uname -r)</code> должен быть доступен для установки. Он нужен только для варианта установки PCIe/M.2, но скрипт загружает его автоматически, поэтому вам не нужно делать это вручную.",
"reboot": "<strong>Запланируйте перезагрузку</strong> при использовании оборудования PCIe. Скрипт пытается загрузить собранные модули; запланированная перезагрузка также позволяет проверить, что они загружаются автоматически."
},
"hostPrepTip": {
"title": "Это только подготовка хоста",
"body": "Эта процедура подготавливает хост для <em>доступа к устройству</em>; она не настраивает и не проверяет приложение. Чтобы <em>использовать</em> Coral в совместимом приложении, работающем в контейнере, например Frigate, перейдите к разделу <lxcLink>Добавление Coral TPU в LXC</lxcLink>."
},
"running": {
"heading": "Запуск установщика",
"body": "Откройте ProxMenux на хосте и перейдите в раздел <strong>Оборудование: GPU и Coral-TPU → Install/Update Coral TPU на хосте</strong>.",
"imageAlt": "Пункт меню «Установить/обновить Coral TPU на хосте» в разделе «Оборудование: GPU и Coral-TPU»"
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Сначала определяется оборудование, поэтому план установки составляется с учётом вашей фактической конфигурации. До вашего подтверждения ничего не устанавливается."
},
"walkthrough": {
"heading": "Пошаговый разбор",
"detect": {
"title": "Обнаружение оборудования",
"body": "Скрипт читает <code>/sys/bus/pci/devices/*/vendor</code> в поисках <code>0x1ac1</code> (Global Unichip Corp., производителя полупроводниковых чипов TPU Coral) и запускает <code>lsusb</code> для поиска идентификаторов USB Accelerator. У USB-устройства <strong>два</strong> идентификатора в зависимости от того, загружена ли уже его прошивка:",
"items": [
"<code>1a6e:089a</code> — Global Unichip, <em>незапрограммированное</em> состояние (до первого обращения среды выполнения Edge TPU к устройству).",
"<code>18d1:9302</code> — Google, <em>запрограммированное</em> состояние (после загрузки прошивки на устройство средой выполнения)."
],
"outro": "Если Coral не обнаружен и установка отсутствует, скрипт завершает работу, показывая диалоговое окно с пояснением. При наличии уже установленных компонентов по-прежнему может открыться меню очистки или удаления."
},
"prompt": {
"title": "Подтверждение перед установкой",
"body": "Перед началом установки в диалоговом окне отображаются обнаруженные устройства и компоненты, которые планируется установить. Отмените действие, чтобы пропустить установку. Необязательная очистка устаревших компонентов требует отдельного подтверждения на более раннем этапе.",
"imageAlt": "Диалоговое окно перед установкой с обнаруженным оборудованием Coral (количество устройств M.2/PCIe и USB) и списком шагов, которые выполнит установщик"
},
"pcie": {
"title": "Вариант для PCIe — модули ядра gasket + apex через DKMS",
"body": "Выполняется только в том случае, если скрипт обнаружил Coral с интерфейсом PCIe / M.2. Этот вариант более ресурсоёмкий из двух, поскольку модуль ядра компилируется именно для текущего работающего ядра.",
"items": [
"<strong>Очистка.</strong> Перед повторной сборкой удаляется любой установленный пакет <code>gasket-dkms</code>; если пакет находится в повреждённом состоянии, скрипт принудительно удаляет его вместе с файлами конфигурации.",
"<strong>Установка зависимостей для сборки:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
],
"cloneIntro": "<strong>Клонирование исходного кода драйвера.</strong> Предпочтительно используется <feranickLink>feranick/gasket-driver</feranickLink>; если он недоступен, используется <googleLink>google/gasket-driver</googleLink>. Успешная сборка в любом случае зависит от совместимости с ядром. К резервному варианту от Google применяются следующие исправления в зависимости от версии:",
"kernelPatches": [
"Для ядра версии 6.5 и новее исправление резервного варианта заменяет <code>no_llseek</code> на <code>noop_llseek</code>.",
"Ядро версии 6.13 и новее: <code>MODULE_IMPORT_NS(DMA_BUF)</code> требует строкового литерала"
],
"afterItems": [
"<strong>Разместите исходные файлы в <code>/usr/src/gasket-1.0/</code>,</strong> создайте <code>dkms.conf</code> и зарегистрируйте с помощью <code>dkms add</code>.",
"<strong>Сборка и установка:</strong> <code>dkms build</code>, затем <code>dkms install</code>. При сбое скрипт показывает последние 50 строк <code>make.log</code>, если этот файл доступен.",
"<strong>Создание группы <code>apex</code> и правил udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>), чтобы при следующей загрузке узлам устройств <code>/dev/apex_*</code> была назначена нужная группа.",
"<strong>Загрузка модулей:</strong> <code>modprobe gasket</code> + <code>modprobe apex</code>."
],
"imageAlt": "Ход сборки DKMS и вывод загрузки модулей ядра gasket/apex"
},
"usb": {
"title": "Вариант для USB — среда выполнения Edge TPU от Google",
"body": "Выполняется только при обнаружении USB Accelerator. Этот вариант гораздо проще:",
"items": [
"<strong>Добавление GPG-ключа Google</strong> в <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
"<strong>Добавление репозитория APT</strong> в <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, причём <code>signed-by=</code> ограничивает проверку связкой ключей этого репозитория. Здесь используется однострочный синтаксис .list, а не синтаксис deb822 .sources.",
"<strong>Установите <code>libedgetpu1-std</code></strong> — среду выполнения Edge TPU со стандартной производительностью.",
"<strong>Перезагрузите правила udev</strong>, чтобы правила из пакета применились к USB-устройству без его отключения и повторного подключения."
],
"stdTitle": "Почему libedgetpu1-std, а не libedgetpu1-max?",
"stdBody": "Пакет <code>max</code> включает максимальную поддерживаемую тактовую частоту, повышая производительность, энергопотребление и тепловыделение по сравнению со стандартной средой выполнения. Перед переключением проверьте охлаждение и условия эксплуатации ускорителя. Пакеты взаимоисключающие; для установки альтернативного пакета используйте <code>apt install libedgetpu1-max</code>."
},
"reboot": {
"title": "Предложение перезагрузки (только если выполнялась установка для PCIe)",
"body": "После установки для PCIe скрипт предлагает перезагрузку. Он уже попытался выполнить <code>modprobe</code>, но проверьте, что модули загружаются, а <code>/dev/apex_0</code> появляется с группой <code>apex</code>. Плановая перезагрузка также позволяет проверить автоматическую загрузку. При установке только для USB перезагрузка хоста не предлагается.",
"imageAlt": "Итоговая сводка и предложение перезагрузки после установки для PCIe"
}
},
"legacyCleanup": {
"heading": "Удаление устаревшего gasket-dkms на хостах, использующих только USB",
"intro": "Если на хосте <strong>не обнаружен PCIe / M.2 Coral</strong>, но сохранилась предыдущая установка <code>gasket-dkms</code>, ProxMenux отдельно определяет это состояние и предлагает необязательную очистку. Без подтверждения ничего не удаляется.",
"items": [
"Если присутствует PCIe / M.2 Coral, такая очистка никогда не предлагается; вместо неё используется обычная процедура пересборки DKMS.",
"Очистка полностью удаляет <code>gasket-dkms</code>, включая его конфигурацию, удаляет устаревшие регистрации gasket DKMS и деревья исходного кода, а также устраняет незавершённые операции <code>dpkg</code> / APT.",
"Пакеты среды выполнения для USB <code>libedgetpu1-std</code> и <code>libedgetpu1-max</code> остаются нетронутыми, поэтому USB Coral сохраняет свою среду выполнения.",
"Прежде чем сообщить об успехе, скрипт проверяет, что устаревший пакет удалён, а система управления пакетами работает исправно."
],
"warningTitle": "Сначала проверьте оборудование",
"warningBody": "Если PCIe / M.2 Coral может быть установлен, но не обнаруживается, отмените очистку и проверьте плату, слот и настройки прошивки, прежде чем продолжать."
},
"reinstallUninstall": {
"heading": "Переустановка или удаление",
"intro": "Запуск установщика на хосте, где Coral уже установлен (PCIe через <code>gasket-dkms</code>, USB через <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> или оба варианта), больше не приводит сразу к новой установке с нуля. Вместо этого ProxMenux обнаруживает существующую установку и показывает меню действий, позволяя выбрать дальнейшие шаги.",
"imageAlt": "Меню действий Coral с двумя вариантами — переустановить / обновить драйверы Coral или удалить драйверы и конфигурацию Coral — отображается, когда установщик обнаруживает предыдущую установку Coral на хосте",
"imageCaption": "Меню действий появляется только в том случае, если уже установлен хотя бы один компонент Coral (запись DKMS gasket, пакет <code>libedgetpu1-*</code> или действующие узлы устройств <code>/dev/apex_*</code>).",
"reinstallHeading": "Переустановка / обновление",
"reinstallBody": "Продолжает обычную процедуру установки — это полезно после обновления ядра, если пересборка DKMS не произошла автоматически, или для обновления среды выполнения до более новой версии <code>libedgetpu1-*</code> из репозитория APT Google Coral. Сначала очищается предыдущее состояние DKMS, чтобы частично установленный пакет после неудачной предыдущей попытки не блокировал новую сборку.",
"uninstallHeading": "Удаление — что будет удалено",
"uninstallIntro": "Перед удалением требуется подтверждение. Приложения LXC, использующие <code>/dev/apex_*</code>, могут потерять доступ во время удаления или после следующей перезагрузки. Последовательность удаления:",
"uninstallItems": [
"Пытается выгрузить <code>apex</code> и <code>gasket</code>; активные пользователи модулей могут помешать их выгрузке.",
"Удаляет все записи <code>gasket/&lt;version&gt;</code>, зарегистрированные в DKMS, чтобы модули не появились снова при следующей установке ядра.",
"Полностью удаляет пакеты apt <code>gasket-dkms</code>, <code>libedgetpu1-std</code> и <code>libedgetpu1-max</code> вместе с их конфигурацией, затем выполняет <code>apt-get autoremove --purge</code>.",
"Удаляет правило udev <code>/etc/udev/rules.d/99-coral-apex.rules</code>, созданное ProxMenux; восстанавливает значение группы по умолчанию в исходном файле <code>60-gasket-dkms.rules</code>, если этот файл ещё существует.",
"Проверяет список пользователей, для которых <code>apex</code> является дополнительной группой. <strong>Если этот список пуст</strong>, предпринимает попытку удалить группу; в противном случае сохраняет <code>apex</code> и выводит список её участников. Это не полная проверка пользователей, для которых эта группа является основной.",
"Удаляет список репозиториев <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, устаревший <code>coral-cloud.list</code> и старые связки ключей с именами <code>coral-edgetpu-archive-keyring.gpg</code>. Текущая связка ключей по пути <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> при выполнении этой последовательности не удаляется.",
"В конце предлагает перезагрузку <strong>только в том случае, если был установлен вариант PCIe</strong> — это наиболее надёжный способ выгрузить модули ядра. Если удаляется только вариант USB, перезагрузка не нужна."
],
"lxcWarnTitle": "Контейнеры LXC с пробросом apex",
"lxcWarnBody": "Удаление компонентов на хосте может нарушить доступ контейнеров LXC к устройству. Запланируйте техническое обслуживание, если совместимые приложения, такие как Frigate, зависят от этого устройства Coral."
},
"updates": {
"heading": "Уведомления об обновлениях",
"intro": "Теперь ProxMenux отслеживает установленные компоненты Coral в своём реестре управляемых установок. Оба варианта отслеживаются независимо: хост с устройствами Coral как M.2, так и USB получает два потока обновлений, каждый из своего исходного источника:",
"headerVariant": "Вариант",
"headerTracked": "Отслеживаемая версия",
"headerUpstream": "Исходный источник",
"pcieVariant": "PCIe / M.2",
"pcieTracked": "В первую очередь используется тег выпуска, записанный при успешной установке, затем — версия исправного пакета <code>gasket-dkms</code>, а в качестве запасного варианта — версия модуля DKMS. Сама по себе версия DKMS не определяет уровень исправлений форка.",
"pcieUpstream": "Последний тег <code>feranick/gasket-driver</code> на GitHub (кеш на 7 дней, сравнение номеров сборок)",
"usbVariant": "USB",
"usbTracked": "Версия пакета apt <code>libedgetpu1-std</code> или <code>libedgetpu1-max</code>",
"usbUpstream": "Локальная версия-кандидат <code>apt-cache policy</code> (репозиторий apt Google Coral)",
"outro": "При обнаружении более новой версии Monitor отправляет уведомление <code>coral_driver_update_available</code> по каждому включённому каналу (Telegram, Discord, Gotify, ntfy, электронная почта, вебхук). Уведомление ссылается на тот же пункт установщика: чтобы применить обновление, выберите <strong>Переустановка / обновление</strong> в меню действий выше.",
"antiTitle": "Защита от повторных уведомлений по замыслу",
"antiBody": "Одно уведомление на вариант и только при фактическом изменении версии в исходном источнике, а не при каждой проверке раз в 24 часа. Если вы проигнорируете обновление, повторного уведомления не будет до выхода более нового выпуска.",
"rebootTitle": "Обновления PCIe: запланируйте перезагрузку",
"rebootBody": "Чтобы изменения вступили в силу, пересобранный модуль PCIe необходимо загрузить; плановая перезагрузка также позволяет проверить его автоматическую загрузку. Обновление библиотеки USB в пользовательском пространстве не требует перезагрузки хоста, но приложения, использующие старую библиотеку, может потребоваться перезапустить."
},
"manual": {
"heading": "Эквивалентные действия вручную",
"intro": "Если вы хотите узнать, что происходит внутри, или повторить отдельный шаг вручную, ниже приведены команды для каждого варианта.",
"pcieHeading": "PCIe / M.2 (gasket + apex через DKMS)",
"usbHeading": "USB (среда выполнения libedgetpu)"
},
"verification": {
"heading": "Проверка",
"pcieHeading": "PCIe / M.2",
"usbHeading": "USB"
},
"troubleshoot": {
"heading": "Устранение неполадок",
"dkmsFailTitle": "Сбой сборки DKMS после обновления ядра",
"dkmsFailBody": "Одна из возможных причин — отсутствие заголовочных файлов. Проверьте <code>proxmox-headers-$(uname -r)</code> с помощью <code>dpkg -l proxmox-headers-$(uname -r)</code>. Если заголовочные файлы отсутствуют, установите их, затем проверьте журнал сборки на наличие несовместимости исходного кода с ядром. Повторный запуск вызывает <code>cleanup_broken_gasket_dkms</code>, но очистка не гарантирует совместимость со всеми ядрами.",
"apexMissTitle": "/dev/apex_0 отсутствует после перезагрузки",
"apexMissBody": "Проверьте, обнаруживается ли устройство PCIe и соответствует ли модуль работающему ядру. Попробуйте <code>modprobe apex</code> и изучите <code>dmesg | grep -iE \"apex|gasket\"</code>. Сбои сборки, проблемы с загрузкой модуля или настройки слота и прошивки могут препятствовать созданию устройства.",
"lxcMissTitle": "/dev/apex_0 виден, но LXC его не видит",
"lxcMissBody": "Само по себе наличие узла устройства на хосте не доказывает, что устройство работает. Проверьте доступ на хосте, затем монтирование LXC, правила cgroup и права доступа по числовым идентификаторам пользователя и группы. См. <lxcLink>Добавление TPU Coral в LXC</lxcLink>.",
"usbUnreachTitle": "USB Accelerator обнаружен, но Frigate / TFLite не может получить к нему доступ",
"usbUnreachBody": "Проверьте правила, предоставляемые <code>libedgetpu1-std</code>, и права доступа с помощью <code>ls -l /dev/bus/usb/*/*</code>. Сопоставленным пользователю и группе приложения необходимы права на чтение и запись; принадлежность устройства пользователю root сама по себе не является ошибкой. После изменения правил выполните <code>udevadm control --reload-rules &amp;&amp; udevadm trigger</code> и при необходимости переподключите устройство.",
"logTitle": "Журнал установки",
"logBody": "При каждом запуске выполняется запись в <code>/tmp/coral_install.log</code> на хосте. Если сборка DKMS завершается с ошибкой, скрипт также добавляет в этот журнал последние 50 строк из <code>/var/lib/dkms/gasket/1.0/build/make.log</code> — приложите журнал при обращении за помощью на GitHub."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"label": "Добавить Coral TPU в LXC",
"href": "/docs/hardware/coral-tpu-lxc",
"tail": " — передача устройства Coral с хоста в контейнер (Frigate, CodeProject.AI…)."
},
{
"label": "Установить драйверы NVIDIA на хосте",
"href": "/docs/hardware/nvidia-host",
"tail": " — аналогичный подход для графических процессоров NVIDIA."
},
{
"label": "ProxMenux Monitor — вкладка «Оборудование»",
"href": "/docs/monitor/dashboard/hardware",
"tail": " — панель Coral показывает драйвер, модули, узлы устройств и состояние среды выполнения, а также температуру, если её предоставляет поддерживаемый датчик."
}
]
}
}
@@ -0,0 +1,175 @@
{
"meta": {
"title": "Установка драйверов NVIDIA на хосте | Документация ProxMenux",
"description": "Установка и настройка проприетарных драйверов NVIDIA на хосте Proxmox VE с помощью ProxMenux. Рассматриваются фильтрация по поддержке GPU, проверка DKMS, служба сохранения состояния драйвера, необязательный патч NVENC и автоматическое распространение драйвера в контейнеры LXC."
},
"header": {
"title": "Установка драйверов NVIDIA на хосте",
"description": "Установите проприетарный драйвер NVIDIA на хосте Proxmox VE с помощью ProxMenux. Установщик отбирает поддерживаемые ветки по PCI ID графического процессора, проверяет выбранный выпуск через DKMS, управляет nouveau, устанавливает службу поддержания состояния и может распространять драйвер в контейнеры LXC с пробросом NVIDIA.",
"section": "Оборудование: GPU и Coral-TPU"
},
"intro": {
"title": "Что делает этот инструмент",
"body": "ProxMenux обнаруживает графический процессор и предлагает поддерживаемые ветки NVIDIA, в которых указан его PCI ID. Он добавляет <code>nouveau</code> в чёрный список, загружает официальный установщик <code>.run</code>, использует DKMS, устанавливает <code>nvidia-persistenced</code>, правила udev и NVIDIA Container Toolkit, а также предлагает необязательный патч NVENC. Проверки сборки оценивают совместимость с работающим ядром; успешная компиляция не гарантирует работу каждого приложения. Для существующих контейнеров LXC с NVIDIA предлагается обновление библиотек пользовательского пространства с согласованием версий, кроме Arch."
},
"who": {
"heading": "Для кого это предназначено?",
"body": "Для приложений обработки видео или вычислений с ускорением на GPU, таких как Plex, Jellyfin, Frigate, Immich или Stable Diffusion, работающих <strong>внутри LXC</strong>, сначала установите поддерживаемый драйвер NVIDIA на <em>хост Proxmox</em>. Для прямой передачи GPU в <strong>ВМ</strong> используется отдельная процедура VFIO."
},
"prereqs": {
"title": "Перед началом",
"gpu": "<strong>Графический процессор NVIDIA</strong>, физически установленный на хосте. Скрипт обнаруживает его автоматически; графические процессоры AMD и Intel здесь не поддерживаются.",
"gpuCheck": "lspci | grep -i nvidia",
"notVm": "Графический процессор <strong>в данный момент не передан в ВМ через проброс VFIO</strong>. Если он передан в ВМ, скрипт откажется устанавливать драйвер на хосте, чтобы не нарушить конфигурацию проброса.",
"internet": "Доступ к интернету на хосте. Установщик загружает драйвер с <code>download.nvidia.com</code> и при необходимости клонирует <code>nvidia-persistenced</code> и <code>nvidia-patch</code> с GitHub.",
"space": "Предусмотрите место на диске в <code>/opt/nvidia</code> для установщика <code>.run</code> и оперативную память для компиляции. При обновлении LXC в системах, отличных от Arch, проверяется наличие 1500 MiB свободного места; если объём оперативной памяти меньше 2048 MiB, может быть запрошено временное увеличение лимита до этого значения с последующим восстановлением прежнего лимита. Учитывайте, что появится запрос на перезагрузку хоста."
},
"vmWarn": {
"title": "Графический процессор назначен виртуальной машине? Остановитесь здесь",
"body": "Если какое-либо устройство NVIDIA привязано к <code>vfio-pci</code>, этот установщик прекращает работу, даже если виртуальная машина остановлена. Зарезервированное устройство не обязательно активно используется виртуальной машиной. Спланируйте возврат к использованию драйвера хоста и удалите устаревшие назначения устройств виртуальным машинам и VFIO перед перезагрузкой и установкой."
},
"running": {
"heading": "Запуск установщика",
"body": "Откройте ProxMenux на хосте и перейдите в <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong>. Содержимое экрана зависит от того, установлен ли уже драйвер.",
"imageAlt": "Меню графического оборудования с выделенным пунктом установки драйвера NVIDIA GPU"
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "В ходе выполнения обнаруживаются устройства, выбирается версия и выполняется установка. До отображения сводки может быть выполнена отдельно подтверждённая очистка устаревших настроек VFIO. Подготовка репозиториев и заголовочных файлов, а также загрузка установщика тоже выполняются до замены существующего драйвера, поэтому единого окончательного подтверждения, после которого начинаются все изменения, нет."
},
"walkthrough": {
"detect": {
"title": "Обнаружение GPU и сводка",
"body1": "Скрипт сканирует шину PCI и показывает все обнаруженные видеоконтроллеры NVIDIA, текущее состояние драйвера (или <em>\"Драйвер NVIDIA не установлен\"</em>), а также все контейнеры LXC, в которых уже настроен проброс NVIDIA, с указанием версии драйвера внутри каждого из них.",
"body2": "Перед продолжением проверьте обнаруженный GPU и версии драйверов на хосте и в контейнерах. Если выбор оказался неожиданным, отмените операцию на экране сводки; любая ранее отдельно подтверждённая очистка VFIO к этому моменту уже выполнена.",
"imageAlt": "Сводка перед установкой с обнаруженными GPU, текущим состоянием драйвера и контейнерами LXC с пробросом NVIDIA"
},
"version": {
"title": "Выбор версии драйвера",
"body1": "ProxMenux получает список доступных драйверов NVIDIA и оставляет для выбора только версии, которые <strong>содержат PCI Device ID вашего графического процессора в таблице поддерживаемых чипов</strong> соответствующей ветки на <code>nvidia.com</code>. Дополнительные эвристические проверки исключают сборки для разработчиков и бета-версии из CDN, которые иначе оказались бы в начале списка. Первый пункт помечен как <em>&lt;version&gt; — Рекомендуется</em>: предпочтение отдаётся последней версии из ветки драйвера, уже установленного на хосте (обновление с исправлениями ошибок в рамках той же ветки); если это невозможно — последней версии из текущей ветки Production Branch, а иначе — поддерживаемой версии с наибольшим номером.",
"body2": "Если установленный драйвер отмечен как пропатченный для NVENC с помощью keylase, список выбора ограничивается версиями из таблицы патчей. Процедура <em>Переустановка / обновление</em> по-прежнему включает подтверждение и запросы на применение патча; проверьте итоговый результат его применения.",
"whyTitle": "Как проверяется совместимость с ядром",
"whyBody": "Список формируется на основе поддерживаемых веток и поддержки идентификаторов GPU на шине PCI, а не фиксированной матрицы совместимости ядер и драйверов. Перед сборкой выбранная версия проверяется на совместимость с работающим ядром. При подтверждённом сбое сборки происходит возврат к выбору версии; если предварительная проверка недоступна, может появиться предупреждение, после которого выполнение продолжится. Проверки при окончательной установке и во время работы по-прежнему важны.",
"imageAlt": "Выбор версии драйвера с ветками NVIDIA, поддерживающими GPU, и рекомендуемым вариантом в начале списка"
},
"uninstall": {
"title": "Полное удаление (только при переустановке)",
"body": "После загрузки и проверки выбранного установщика существующий драйвер удаляется перед заменой. ProxMenux останавливает службы NVIDIA, выгружает модули, удаляет записи DKMS и полностью удаляет пакеты <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code> вместе с их конфигурацией. Это также выполняется при подтверждённой переустановке той же версии."
},
"prepare": {
"title": "Подготовка системы",
"body": "Во время подготовки скрипт:",
"items": [
"Проверяет репозитории хоста до удаления или установки каких-либо компонентов: если на хосте нет активной подписки и используется только репозиторий Enterprise, запрашивает подтверждение перехода на репозиторий no-subscription; при отказе установка прекращается.",
"Устанавливает <code>pve-headers-$(uname -r)</code> (или <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> и <code>dkms</code>.",
"Создаёт <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, принадлежащий ProxMenux, с <code>blacklist nouveau</code> и <code>options nouveau modeset=0</code>, фиксирует, была ли добавлена сопутствующая строка в <code>blacklist.conf</code>, и пытается немедленно выгрузить модуль.",
"Записывает <code>/etc/modules-load.d/nvidia-vfio.conf</code> с <code>nvidia</code> и <code>nvidia_uvm</code>, чтобы модули загружались на раннем этапе загрузки системы."
]
},
"download": {
"title": "Загрузка и запуск установщика NVIDIA",
"body": "Загружает <code>NVIDIA-Linux-x86_64-&lt;version&gt;.run</code> в <code>/opt/nvidia</code>, проверяя размер файла и тип исполняемого файла. Это проверки формата файла, а не криптографическая проверка подписи. Установщик регистрирует DKMS для пересборки при изменениях ядра; при этом совместимость исходного кода и ядра по-прежнему необходима.",
"imageAlt": "Ход загрузки, после которой установщик NVIDIA выполняет сборку DKMS"
},
"persist": {
"title": "Служба сохранения состояния и правила udev",
"body": "Затем ProxMenux устанавливает <persistLink>nvidia-persistenced</persistLink> и записывает правила udev в <code>/etc/udev/rules.d/70-nvidia.rules</code>, чтобы узлы устройств <code>/dev/nvidia*</code> надёжно создавались при загрузке. Без них при запуске контейнера возможна гонка при пробросе LXC, из-за которой контейнер не сможет обнаружить GPU."
},
"nvenc": {
"title": "Необязательно: применить патч NVENC",
"body": "Ограничения количества сеансов NVENC зависят от GPU и драйвера. Разработанный сообществом патч <patchLink>keylase/nvidia-patch</patchLink> позволяет снять ограничение драйвера на количество сеансов для поддерживаемых версий. Выбирайте <strong>Да</strong>, только если вам нужно это изменение параметров кодирования и ваша версия поддерживается. Это не ускоряет декодирование и не устраняет ограничения аппаратных возможностей.",
"supportTitle": "Проверьте поддержку патча для вашего драйвера",
"supportBody": "Проверьте наличие именно вашей версии в <patchTableLink>таблице поддержки патча</patchTableLink>. Если её нет, оставьте драйвер без патча или выберите другую сопровождаемую версию, которая поддерживает ваш GPU и ядро, а также совместима с патчем; не выбирайте более старую версию только потому, что она находится рядом в списке."
},
"propagate": {
"title": "Необязательно: установить драйвер в контейнеры LXC",
"body1": "Если на обзорном экране были перечислены контейнеры с пробросом NVIDIA, теперь ProxMenux предлагает обновить библиотеки пользовательского пространства в каждом из них до версии на хосте. Версии модуля ядра на хосте и компонентов пользовательского пространства в контейнере <strong>должны в точности совпадать</strong> — иначе <code>nvidia-smi</code> внутри контейнера завершится с ошибкой «несоответствие версий».",
"body2": "Контейнеры Debian / Ubuntu и другие контейнеры на базе glibc получают извлечённый установщик <code>.run</code> с <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; объём выделенной оперативной памяти может временно увеличиться до 2 GiB, после чего возвращается к исходному значению. <strong>Arch, Manjaro и EndeavourOS</strong> используют <code>pacman -Syu nvidia-utils</code> из настроенных репозиториев без привязки к версии на хосте: проверьте результат. <strong>Alpine</strong> получает извлечённое содержимое <code>.run</code> через <code>pct push</code>, устанавливает <code>gcompat</code> и <code>binutils</code> с помощью <code>apk</code> и создаёт ссылки SONAME с помощью <code>readelf</code>. Проверьте работу во время выполнения; слои совместимости не гарантируют, что все библиотеки драйвера будут работать с musl.",
"imageAlt": "Диалог со списком контейнеров LXC с пробросом NVIDIA и текущей версией драйвера, с вариантами «Да/Нет» для обновления всех перечисленных контейнеров"
},
"reboot": {
"title": "Перезагрузка",
"body": "После установки драйвера скрипт пересобирает <code>initramfs</code> для всех ядер; на последнем шаге он предлагает перезагрузку. <strong>Запланируйте эту перезагрузку</strong>, чтобы после нового запуска системы проверить сохранённые настройки модуля и nouveau, даже если новый драйвер уже отвечает до перезагрузки."
}
},
"reinstallUninstall": {
"heading": "Переустановка или удаление",
"intro": "Если <code>nvidia</code> загружен и <code>nvidia-smi</code> возвращает версию, появляется меню действий. Так определяется наличие активного драйвера для отображения меню; файлы драйвера могут быть установлены, даже если модуль не загружен.",
"imageAlt": "Меню действий NVIDIA, предлагаемое при уже установленном драйвере, с двумя вариантами: переустановить / обновить драйвер или полностью удалить драйвер NVIDIA",
"imageCaption": "Меню действий появляется, только если на хосте в данный момент активен драйвер NVIDIA.",
"reinstallHeading": "Переустановка / обновление",
"reinstallBody": "Продолжает процесс: выбор версии, подготовка репозиториев и заголовочных файлов, загрузка и проверка перед сборкой, после чего удаляет старый драйвер и устанавливает новый. Можно обновить драйвер в пределах сопровождаемой ветки или выбрать другую поддерживаемую ветку. После этого снова появляются запросы, связанные с библиотеками LXC и патчем NVENC.",
"uninstallHeading": "Удаление — что будет удалено",
"uninstallIntro": "После подтверждения в диалоге «Да/Нет» удаляются следующие компоненты драйвера:",
"uninstallItems": [
"Останавливает и отключает <code>nvidia-persistenced</code> и <code>nvidia-powerd</code>, пытается выгрузить <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> и <code>nvidia</code>, затем запускает <code>nvidia-uninstall --silent</code> для удаления драйвера, установленного с помощью <code>.run</code>. Это затрагивает рабочие нагрузки LXC, зависящие от NVIDIA; активные клиенты могут препятствовать выгрузке.",
"Выполняет <code>apt purge</code> для <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> и <code>libcudnn*</code>, удаляет дерево исходного кода DKMS и папки <code>nvidia-persistenced</code> и <code>nvidia-patch</code> внутри <code>/opt/nvidia</code>.",
"Удаляет конфигурацию modules-load (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) и записи чёрного списка nouveau, принадлежащие ProxMenux. Устаревшие двухстрочные файлы чёрного списка ProxMenux также переносятся в новый формат и удаляются; изменённые или не относящиеся к ним файлы администратора сохраняются.",
"Удаляет правила udev (<code>/etc/udev/rules.d/70-nvidia.rules</code>) и сбрасывает состояние патча NVENC (поле в реестре управляемых установок ProxMenux получает значение <em>removed</em> — отдельного файла для удаления нет).",
"Пересобирает <code>initramfs</code> для всех ядер, запускает <code>proxmox-boot-tool refresh</code> на хостах с systemd-boot и предлагает выполнить перезагрузку для завершения."
],
"lxcWarnTitle": "Контейнеры LXC с пробросом NVIDIA",
"lxcWarnBody": "Удаление драйвера на хосте прерывает работу нагрузок LXC, зависящих от NVIDIA, даже если их библиотеки пользовательского пространства остаются установленными. Запланируйте техническое обслуживание для Frigate, Plex, Jellyfin, Ollama и других приложений, использующих GPU."
},
"updates": {
"heading": "Уведомления об обновлениях",
"body": "Установленный драйвер NVIDIA учитывается в реестре управляемых установок ProxMenux. При запуске и каждые 24 часа Monitor сравнивает список выпусков разработчика по адресу <code>download.nvidia.com/XFree86/Linux-x86_64/</code> с версией, которую сообщает <code>nvidia-smi</code>, и уведомляет только о наличии более нового корректирующего выпуска в установленной ветке.",
"kindsHeading": "Сообщение об обновлении",
"kindsItems": [
"<strong>Корректирующий выпуск в той же ветке.</strong> Более новый выпуск в текущей ветке драйвера (например, установлена версия 580.65.06 → доступна 580.105.08). Monitor не делает выводов о совместимости с ядром для других веток."
],
"antiTitle": "Защита от повторных уведомлений по замыслу",
"antiBody": "Для каждой новой версии, выпущенной разработчиком, отправляется одно уведомление, а не при каждой проверке раз в 24 часа. Если в установленной ветке нет более нового выпуска, уведомления не отправляются.",
"applyTitle": "Установка обновления",
"applyBody": "Monitor сообщает об обновлениях, но не устанавливает их автоматически. Откройте установщик и выберите <strong>Переустановка / обновление</strong>, укажите поддерживаемую версию и выполните этапы сборки и установки. В конце будет предложено выполнить перезагрузку; запланируйте её и после перезапуска проверьте хост и библиотеки LXC."
},
"verify": {
"heading": "Проверка установки",
"intro": "После перезапуска хоста войдите через SSH или оболочку Proxmox и выполните:",
"after": "Убедитесь, что отображаются ваш GPU и ожидаемая версия драйвера. В списке уже могут присутствовать процессы, если службы хоста или автоматически запускаемые контейнеры используют GPU. Затем проверьте службу сохранения состояния драйвера:",
"imageAlt": "Вывод nvidia-smi на хосте с обнаруженным GPU и установленной версией драйвера"
},
"troubleshoot": {
"heading": "Устранение неполадок",
"smiFailTitle": "`nvidia-smi` сообщает «NVIDIA-SMI has failed»",
"smiFailBody": "Возможные причины: GPU занят драйвером <strong>nouveau</strong>, <strong>заголовочные файлы ядра отсутствуют или не соответствуют его версии</strong>, исходный код драйвера несовместим или возникли другие ошибки загрузки модуля. Проверьте <code>lsmod | grep nouveau</code> и <code>dmesg | grep -i nvidia</code>, а также журналы установщика и DKMS. Если нужно исправить настройки nouveau, проверьте <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, прежде чем пересобирать с помощью <code>update-initramfs -u -k all</code> и перезагружать систему. Не считайте, что любая ошибка сборки вызвана несоответствием заголовочных файлов ядра.",
"lxcMissTitle": "Контейнер LXC не видит GPU после обновления хоста",
"lxcMissBody": "Перед переустановкой проверьте узлы устройств на хосте, права доступа LXC и версию библиотек драйвера. При несовпадении версий может потребоваться установить соответствующий драйвер пользовательского пространства внутри LXC способом, поддерживаемым дистрибутивом; в системах с glibc установщик использует <code>--no-kernel-modules</code>. Переустановка библиотек не исправит отсутствие подключённых устройств или проблемы с правами доступа.",
"logTitle": "Проверьте журнал установки",
"logBody": "При каждой установке журнал записывается в <code>/tmp/nvidia_install.log</code>. Если сбой произошёл без явного сообщения об ошибке, в этом файле можно найти полный вывод (загрузки, сборку DKMS, установку служб). Прикладывайте его к сообщениям о проблемах на GitHub."
},
"manualSteps": {
"heading": "Ищете инструкции по ручной установке?",
"body": "Справочные сведения о ручной установке, в том числе о <code>wget</code> и <code>./NVIDIA-Linux-...run</code>, приведены в <guideLink>Guides → NVIDIA</guideLink>. Этот материал объясняет назначение компонентов, но не воспроизводит в точности действия автоматического установщика. Используйте поддерживаемый процесс ProxMenux, который включает фильтрацию GPU, проверки сборки, обновления LXC и проверки VFIO."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"label": "Добавить GPU в ВМ (прямой проброс)",
"href": "/docs/hardware/gpu-vm-passthrough",
"tail": " — передать GPU NVIDIA в виртуальную машину (модель привязки отличается от LXC)."
},
{
"label": "Добавить GPU в LXC",
"href": "/docs/hardware/igpu-acceleration-lxc",
"tail": " — предоставить одному или нескольким контейнерам совместный доступ к GPU NVIDIA."
},
{
"label": "Переключить режим GPU (ВМ ↔ LXC)",
"href": "/docs/hardware/switch-gpu-mode",
"tail": " — переключение одного и того же GPU между режимами проброса в VM и совместного использования (LXC)."
},
{
"label": "ProxMenux Monitor — вкладка «Оборудование»",
"href": "/docs/monitor/dashboard/hardware",
"tail": " — модальное окно GPU, позволяющее запустить этот установщик одним щелчком, а после установки — отслеживать состояние в реальном времени."
},
{
"label": "Команды для проброса GPU",
"href": "/docs/help-info/gpu-commands",
"tail": " — справочник по lspci / dmesg / IOMMU / nvidia-smi."
}
]
}
}
@@ -0,0 +1,172 @@
{
"meta": {
"title": "Переключение режима GPU (VM ↔ LXC) | Документация ProxMenux",
"description": "Переключение уже назначенного GPU между режимом VM (vfio-pci) и режимом LXC (родной драйвер) на хосте Proxmox. ProxMenux определяет текущую привязку, предлагает выбрать политику разрешения конфликтов для каждой затронутой рабочей нагрузки, удаляет оставшиеся привязки аудиоустройств и пересобирает initramfs только при необходимости."
},
"header": {
"title": "Переключить режим GPU (ВМ ↔ LXC)",
"description": "Переключение назначенного GPU между пробросом в VM и совместным использованием в LXC. ProxMenux управляет привязкой к драйверу хоста, конфигурацией VFIO, настройками модулей и initramfs и спрашивает, как поступить с затронутыми гостевыми системами. Внимательно проверьте выбранные действия, а после перезагрузки — итоговую конфигурацию.",
"section": "Оборудование: GPU и Coral-TPU"
},
"intro": {
"title": "Что делает этот инструмент",
"body": "GPU на хосте Proxmox работает в одном из двух режимов: он привязан к <code>vfio-pci</code> (зарезервирован для VM) или к своему родному драйверу <em>(i915 / amdgpu / nvidia)</em>, чтобы хост и контейнеры LXC могли использовать его совместно. <strong>Переключение режима GPU</strong> позволяет переключаться между этими режимами без ручного редактирования <code>vfio.conf</code>, управления чёрными списками или необходимости помнить, какие строки VM / LXC ссылаются на эту карту. Функция также явно предупреждает, если какая-либо рабочая нагрузка всё ещё ссылается на GPU, чтобы VM не оказалась неработоспособной при загрузке."
},
"graphics": {
"lxcTitle": "Готов к использованию в контейнерах LXC",
"lxcDesc": "Родной драйвер активен",
"vmTitle": "Готов к пробросу в VM",
"vmDesc": "Драйвер VFIO-PCI активен"
},
"when": {
"heading": "Когда следует использовать эту функцию?",
"intro": "Используйте этот скрипт, если GPU <strong>уже назначен</strong> и вы хотите изменить его назначение:",
"headerSituation": "Ситуация",
"headerUse": "Использовать эту страницу?",
"rows": [
{
"situation": "GPU свободен — ещё ни разу не назначался. Нужно назначить его VM.",
"useRich": "Нет — используйте <vmLink>Добавление GPU в VM</vmLink>"
},
{
"situation": "GPU свободен — ещё ни разу не назначался. Нужно назначить его LXC.",
"useRich": "Нет — используйте <lxcLink>Добавление GPU в LXC</lxcLink>"
},
{
"situationRich": "GPU используется в VM через <code>vfio-pci</code>, а нужно использовать его в LXC.",
"useRich": "<strong>Да — эту страницу.</strong>"
},
{
"situation": "GPU совместно используется в LXC, а нужно выделить его исключительно для VM.",
"useRich": "<strong>Да — эту страницу.</strong>"
},
{
"situation": "Нужно просто полностью отвязать GPU от всего.",
"use": "Режим LXC возвращает GPU под управление драйвера хоста; политика разрешения конфликтов с VM может удалить записи hostpci, но записи устройств LXC необходимо удалить отдельно. При этом GPU не остаётся отвязанным от всех драйверов."
}
]
},
"prereqs": {
"title": "Перед началом",
"assigned": "<strong>GPU уже должен быть назначен</strong> — либо виртуальной машине через VFIO, либо подключён как минимум к одному LXC. Если вы ещё не назначили его, начните с пункта Add GPU to VM / LXC.",
"iommu": "<strong>IOMMU должен быть включён на хосте</strong> при переключении <em>в</em> режим VM. Важны как настройки прошивки, так и поддержка со стороны ядра. Если в параметрах запущенного ядра отсутствует <code>intel_iommu=on</code> или <code>amd_iommu=on</code>, скрипт добавляет недостающий параметр вместе с <code>iommu=pt</code> в <code>/etc/kernel/cmdline</code> (маркер корневой системы ZFS) или <code>/etc/default/grub</code>, затем выполняет <code>proxmox-boot-tool refresh</code> или <code>update-grub</code>. Обратите внимание на все предупреждения и перезагрузите систему, когда появится соответствующий запрос.",
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
"reboot": "<strong>Запланируйте перезагрузку.</strong> Постоянные изменения драйверов и параметров загрузки могут потребовать пересборки initramfs и перезагрузки. В конце скрипт предложит перезагрузить систему.",
"knowList": "<strong>Выясните, какие VM / LXC используют GPU.</strong> Скрипт найдёт их и спросит, что делать с каждым из них, но работа пойдёт быстрее, если вы заранее знаете этот список."
},
"blocklist": {
"title": "Не все GPU можно безопасно пробрасывать в виртуальную машину",
"body": "В соответствии со своей политикой совместимости скрипт блокирует режим VM для устройств с идентификаторами <code>8086:5a84</code> и <code>8086:5a85</code>. Если выбранный GPU соответствует одному из них, скрипт прекращает переключение в режим VM и возвращается к выбору GPU, а если GPU только один — завершает работу. Этот список блокировки не препятствует переключению <em>в</em> режим LXC; при этом могут действовать другие проверки."
},
"running": {
"heading": "Запуск скрипта",
"body": "Откройте ProxMenux на хосте и перейдите в раздел <strong>Оборудование: GPU и Coral-TPU → Switch GPU Mode (VM ↔ LXC)</strong>.",
"imageAlt": "Пункт меню «Переключить режим GPU (VM ↔ LXC)» в разделе «Оборудование: GPU и Coral-TPU»"
},
"howRuns": {
"heading": "Как работает скрипт",
"body": "Выбранные GPU и направление переключения проверяются перед основным переключением. Отдельная очистка устаревших привязок VFIO может запросить подтверждение раньше, а для затронутых гостевых систем предусмотрены отдельные запросы по устранению конфликтов. Читайте каждый запрос подтверждения: единого итогового подтверждения, охватывающего все возможные изменения, нет."
},
"walkthrough": {
"heading": "Пошаговый разбор",
"detect": {
"title": "Обнаружение GPU и их текущих привязок",
"body": "Скрипт сканирует все контроллеры VGA / 3D / Display на хосте и проверяет <code>/sys/bus/pci/devices/*/driver</code>, чтобы определить текущий драйвер ядра. Для каждого GPU отображаются название, слот PCI и текущая привязка к драйверу — так вы сразу увидите, в каком режиме он работает.",
"imageAlt": "Список выбора GPU: для каждого обнаруженного GPU указаны текущий драйвер (vfio-pci / nvidia / amdgpu / i915) и слот PCI"
},
"pickGpu": {
"title": "Выберите GPU для переключения",
"body": "Один GPU → выбирается автоматически. Несколько GPU → список с флажками. Можно отметить несколько, но все они должны находиться в <em>одном и том же</em> текущем режиме — иначе скрипт не сможет выбрать целевой режим для всей группы и покажет предупреждение о смешанных режимах с просьбой сократить выбор.",
"tipTitle": "Групповое переключение",
"tipBody": "Это удобно при перенастройке хоста: «Все три GPU NVIDIA переводим в режим VM, затем возвращаем iGPU в режим LXC». Два запуска, каждый с единым целевым режимом, — гораздо проще, чем переключать по одному."
},
"direction": {
"title": "Проверьте предложенное направление",
"intro": "В зависимости от текущего режима скрипт предлагает переключиться в противоположный:",
"items": [
"<strong>VM → LXC:</strong> отвязать GPU от <code>vfio-pci</code> и вернуть управление штатному драйверу (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>), чтобы контейнеры LXC могли совместно использовать карту. Для NVIDIA запись, относящаяся к конкретному BDF, удаляется из <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>, чтобы после перезагрузки модуль nvidia снова получил управление GPU.",
"<strong>LXC → VM:</strong> подготовить передачу управления <code>vfio-pci</code>. Для AMD / Intel используются блокировка штатного драйвера и <code>options vfio-pci ids=…</code>. Для NVIDIA <code>nvidia</code> блокируется глобально только в том случае, если все GPU NVIDIA на хосте находятся под управлением VFIO; в противном случае правила для отдельных BDF задают <code>driver_override=vfio-pci</code> для затронутых устройств группы IOMMU, а GPU NVIDIA вне этих групп сохраняют <code>nvidia</code>. Перед переключением проверьте каждое устройство в группе."
],
"outro": "Подтвердите направление или отмените переключение."
},
"conflict": {
"title": "Правила разрешения конфликтов для каждой затронутой гостевой системы",
"body": "Скрипт проверяет <code>/etc/pve/lxc/*.conf</code> на наличие ссылок на устройства GPU по семейству драйверов, а <code>/etc/pve/qemu-server/*.conf</code> — на наличие назначений PCI. Обнаружение LXC не обеспечивает точного сопоставления BDF для каждой карты. Проверьте обнаруженные гостевые системы и выберите, как поступить с каждой из них:",
"headerPolicy": "Политика",
"headerEffect": "Результат",
"headerWhen": "Когда выбирать",
"keepPolicy": "Сохранить конфигурацию, отключить автозапуск",
"keepEffect": "<code>pct set CTID -onboot 0</code> (или <code>qm set VMID -onboot 0</code>). Записи GPU остаются в конфигурации.",
"keepWhen": "Вы планируете вернуться к этой ВМ/LXC, когда GPU снова будет работать в исходном режиме. Безопасный вариант по умолчанию.",
"removePolicy": "Удалить GPU из конфигурации",
"removeEffect": "Удаляет обнаруженные записи <code>hostpci</code> / <code>dev</code> и поддерживаемые ссылки на устройства в устаревшем формате.",
"removeWhen": "Выберите этот вариант, если гостевая система должна работать без GPU. Сначала проверьте настройки приложения: возможность перехода на CPU зависит от приложения, а удаление устройства не приводит к автоматической перенастройке приложения.",
"imageAlt": "Диалог выбора политики разрешения конфликтов для каждой ВМ / каждого LXC при переключении GPU, который уже назначен гостевой системе"
},
"audio": {
"title": "Удаление оставшихся аудиоустройств (только при выходе из режима ВМ)",
"body1": "Многие дискретные GPU NVIDIA / AMD предоставляют аудиоустройство HDMI через функцию <code>.1</code> того же слота; также могли быть назначены дополнительные аудиоустройства. После удаления GPU в ВМ могут остаться устаревшие записи аудиоустройств <code>hostpci</code>. Проверьте, какие устройства должны остаться назначенными.",
"body2": "Скрипт обнаруживает их по точному совпадению BDF, без ложных совпадений по подстроке, и показывает список с флажками для корректного удаления. Он также удаляет их идентификаторы vendor:device из <code>/etc/modprobe.d/vfio.conf</code>, но только если ни одна другая ВМ больше не использует эти идентификаторы аудиоустройств."
},
"apply": {
"title": "Применение изменений на хосте и в гостевых системах",
"body": "После подтверждения скрипт записывает изменения на стороне хоста: <code>vfio.conf</code>, чёрный список, модули, а для NVIDIA — правило udev для конкретного BDF в <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> и состояние BDF в <code>/etc/proxmenux/vfio-bind.bdfs</code>. Он также применяет выбранную политику разрешения конфликтов к каждой затронутой ВМ/LXC. Если конфигурация хоста действительно изменилась, он выполняет <code>update-initramfs -u -k all</code>, а затем <code>proxmox-boot-tool refresh</code>; в противном случае оба действия пропускаются."
},
"reboot": {
"title": "Перезагрузка",
"body": "Новая привязка GPU вступает в силу только после перезагрузки. Скрипт предложит перезагрузить хост; вы можете сделать это сейчас или позже, но не запускайте целевую ВМ/LXC до перезагрузки хоста — иначе GPU по-прежнему будет занят прежним драйвером.",
"imageAlt": "Итоговый диалог со списком изменений, за которым следует предложение перезагрузки"
}
},
"manual": {
"heading": "Проверка вручную",
"intro": "Перед переключением <strong>VM → LXC</strong> проверьте драйвер и существующую политику для конкретного BDF. В этом примере для NVIDIA используется идентификатор vendor:device <code>10de:2204</code>; замените его на идентификатор своей карты. Эти команды проверяют состояние; скрипт также управляет затронутыми гостевыми системами и устройствами в группе IOMMU.",
"lxcToVm": "Перед переключением <strong>LXC → VM</strong> проверьте выбранный PCI-адрес и его группу IOMMU. Замените адрес из примера своим и проверьте все устройства в группе, прежде чем назначать устройства.",
"oneVmTitle": "Один и тот же GPU с драйвером vfio-pci может использоваться только одной ВМ одновременно",
"oneVmBody": "Несколько записей <code>hostpci</code> с одним и тем же PCI-слотом в двух ВМ допустимы с точки зрения конфигурации, но запуститься с этим GPU сможет только одна из ВМ — запуск второй завершится ошибкой. Шаг выбора политики разрешения конфликтов ProxMenux предназначен именно для предотвращения такой ситуации."
},
"verification": {
"heading": "Проверка после перезагрузки"
},
"troubleshoot": {
"heading": "Устранение неполадок",
"stillVfioTitle": "После переключения в режим LXC для GPU по-прежнему указан драйвер vfio-pci",
"stillVfioBody": "Загруженный модуль VFIO не доказывает, какой драйвер управляет этим GPU. Проверьте привязку карты, а также то, что <code>update-initramfs</code> и перезагрузка завершены. <code>lsmod | grep vfio</code> лишь выводит список модулей. Для AMD / Intel проверьте <code>vfio.conf</code>; для NVIDIA — <code>/etc/proxmenux/vfio-bind.bdfs</code> и <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Исправьте устаревшую политику перед выполнением <code>update-initramfs -u -k all</code> и перезагрузкой.",
"vmFailTitle": "ВМ не запускается после переключения GPU в режим LXC",
"vmFailBody": "Проверьте, остались ли в конфигурации ВМ устаревшие ссылки на <code>hostpci</code>. Политика <em>Удалить GPU из конфигурации</em> может удалить их при запланированном переключении; перед повторным запуском скрипта проверьте предлагаемое направление переключения, чтобы случайно не переключить режим обратно. Другой вариант — удалить устаревшее назначение в Proxmox при остановленной ВМ.",
"smiFailTitle": "nvidia-smi завершается с ошибкой 'Driver/library version mismatch' после возврата в режим LXC",
"smiFailBody": "Сравните версию загруженного модуля NVIDIA на хосте с версиями установленных библиотек пользовательского пространства, в том числе в контейнерах LXC. Сначала согласуйте версии; перезагрузка загрузит установленный модуль, но не устранит несоответствие версий пакетов библиотек. Для перезагрузки модуля с помощью <code>modprobe -r nvidia</code> и <code>modprobe nvidia</code> необходимо остановить все процессы, использующие GPU; перезагрузка модуля может завершиться ошибкой, если зависимые модули используются.",
"logTitle": "Журнал установки",
"logBody": "При каждом запуске журнал записывается в <code>/tmp/proxmenux_gpu_switch_mode.log</code> на хосте. Приложите его при обращении за помощью на GitHub."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"label": "Добавить GPU в ВМ (прямой проброс)",
"href": "/docs/hardware/gpu-vm-passthrough",
"tail": " — первоначальная настройка режима ВМ."
},
{
"label": "Добавить GPU в LXC",
"href": "/docs/hardware/igpu-acceleration-lxc",
"tail": " — первоначальная настройка режима LXC."
},
{
"label": "Установить драйверы NVIDIA на хосте",
"href": "/docs/hardware/nvidia-host",
"tail": " — требуется для режима LXC на GPU NVIDIA."
},
{
"label": "ProxMenux Monitor — вкладка «Оборудование»",
"href": "/docs/monitor/dashboard/hardware",
"tail": " — раздел «Видеокарты», где для каждого GPU отображается текущий режим и доступен встроенный элемент управления переключением."
},
{
"label": "Команды для проброса GPU",
"href": "/docs/help-info/gpu-commands",
"tail": " — краткий справочник команд."
}
]
}
}
@@ -0,0 +1,235 @@
{
"meta": {
"title": "Команды резервного копирования Proxmox — vzdump, qmrestore, pct restore | ProxMenux",
"description": "Справочник команд резервного копирования и восстановления Proxmox VE: vzdump для ВМ и контейнеров LXC, qmrestore для ВМ, pct restore для контейнеров, резервное копирование по расписанию в /etc/pve/jobs.cfg, скрипты-хуки и исключаемые пути.",
"ogTitle": "Команды резервного копирования Proxmox — vzdump, qmrestore, pct restore",
"ogDescription": "Справочник команд vzdump, qmrestore и pct restore для резервного копирования и восстановления ВМ Proxmox и контейнеров LXC.",
"twitterTitle": "Команды резервного копирования Proxmox | ProxMenux",
"twitterDescription": "Команды vzdump, qmrestore и pct restore для резервного копирования и восстановления ВМ и контейнеров Proxmox."
},
"header": {
"title": "Резервное копирование и восстановление",
"description": "Подборка команд vzdump, qmrestore и pct restore для резервного копирования в Proxmox. Включает настройку расписания, расширенные параметры, такие как скрипты-хуки, исключаемые пути и приоритет ввода-вывода, а также управление файлами резервных копий.",
"section": "Справка и информация"
},
"intro": {
"title": "Три режима резервного копирования",
"body": "Для ВМ режим <strong>snapshot</strong> выполняет резервное копирование без остановки и не требует поддержки снимков на уровне хранилища. Режим <strong>suspend</strong> приостанавливает ВМ перед резервным копированием без остановки и не обязательно повышает согласованность данных. Режим <strong>stop</strong> сначала завершает работу ВМ; если ВМ до этого работала, её работа может возобновиться после начала резервного копирования. Для LXC поведение отличается: режим snapshot требует хранилища с поддержкой снимков, suspend использует два прохода rsync, а stop оставляет контейнер остановленным на всё время резервного копирования."
},
"commandGroups": [
{
"title": "Резервное копирование ВМ",
"commands": [
{
"command": "vzdump <vmid>",
"description": "Создать резервную копию определённой ВМ или контейнера"
},
{
"command": "vzdump <vmid> --storage <storage>",
"description": "Создать резервную копию ВМ в указанном хранилище"
},
{
"command": "vzdump <vmid> --mode snapshot",
"description": "Создать резервную копию в режиме snapshot (для ВМ)"
},
{
"command": "vzdump <vmid> --mode suspend",
"description": "Приостановить ВМ перед резервным копированием без остановки (устаревший режим suspend)"
},
{
"command": "vzdump <vmid> --mode stop",
"description": "Выключить ВМ перед началом резервного копирования"
},
{
"command": "vzdump --all",
"description": "Создать резервные копии всех ВМ и контейнеров"
},
{
"command": "vzdump --all --exclude <vmid1>,<vmid2>",
"description": "Создать резервные копии всех ВМ, кроме указанных"
}
]
},
{
"title": "Параметры резервного копирования",
"commands": [
{
"command": "vzdump <vmid> --compress zstd",
"description": "Использовать сжатие zstd для резервной копии"
},
{
"command": "vzdump <vmid> --compress gzip --pigz <threads>",
"description": "Использовать pigz в многопоточном режиме"
},
{
"command": "vzdump <vmid> --storage <storage> --notes-template <text>",
"description": "Добавить примечания к резервной копии"
},
{
"command": "vzdump <vmid> --mailto <email>",
"description": "Отправить уведомление по электронной почте"
},
{
"command": "vzdump <vmid> --prune-backups keep-last=<n>",
"description": "Хранить только n резервных копий для каждой ВМ"
},
{
"command": "vzdump <vmid> --stdexcludes 0",
"description": "Не исключать временные файлы"
},
{
"command": "vzdump <vmid> --quiet 1",
"description": "Подавить вывод сообщений"
}
]
},
{
"title": "Восстановление из резервных копий",
"commands": [
{
"command": "qmrestore <backup-file> <vmid>",
"description": "Восстановить ВМ из резервной копии"
},
{
"command": "qmrestore <backup-file> <vmid> --storage <storage>",
"description": "Восстановить в указанное хранилище"
},
{
"command": "qmrestore <backup-file> <vmid> --unique",
"description": "Восстановить ВМ с новыми случайно сгенерированными MAC-адресами"
},
{
"command": "pct restore <vmid> <backup-file>",
"description": "Восстановить контейнер из резервной копии"
},
{
"command": "pct restore <vmid> <backup-file> --storage <storage>",
"description": "Восстановить контейнер в указанное хранилище"
},
{
"command": "pct restore <vmid> <backup-file> --rootfs <storage>:<size-GiB>",
"description": "Восстановить с выделением корневого диска заданного размера в выбранном хранилище"
},
{
"command": "pct restore <vmid> <backup-file> --unprivileged 1",
"description": "Восстановить как непривилегированный контейнер"
}
]
},
{
"title": "Управление резервными копиями",
"commands": [
{
"command": "ls -la /var/lib/vz/dump/",
"description": "Показать список резервных копий в расположении по умолчанию"
},
{
"command": "find /var/lib/vz/dump/ -name \"*.vma*\"",
"description": "Найти резервные копии ВМ"
},
{
"command": "find /var/lib/vz/dump/ -name \"*.tar*\"",
"description": "Найти резервные копии контейнеров"
},
{
"command": "pvesm list <storage> --content backup",
"description": "Показать список резервных копий в указанном хранилище"
},
{
"command": "rm /var/lib/vz/dump/<backup-file>",
"description": "Удалить файл резервной копии"
},
{
"command": "cat /etc/vzdump.conf",
"description": "Показать конфигурацию резервного копирования"
}
]
},
{
"title": "Резервное копирование по расписанию",
"commands": [
{
"command": "cat /etc/pve/jobs.cfg",
"description": "Показать расписание резервного копирования"
},
{
"command": "nano /etc/vzdump.conf",
"description": "Изменить конфигурацию резервного копирования"
},
{
"command": "systemctl list-timers",
"description": "Вывести список таймеров systemd"
},
{
"command": "systemctl status cron",
"description": "Проверить состояние службы cron"
},
{
"command": "pvenode task list --typefilter vzdump",
"description": "Вывести список завершённых задач резервного копирования"
},
{
"command": "pvenode task log <upid>",
"description": "Показать журнал задачи резервного копирования по UPID"
}
]
},
{
"title": "Расширенные операции",
"commands": [
{
"command": "qmrestore <backup> <vmid> --force",
"description": "Принудительно выполнить восстановление с перезаписью существующей ВМ"
},
{
"command": "vzdump <vmid> --dumpdir <directory>",
"description": "Указать другой каталог для резервного копирования"
},
{
"command": "vzdump <vmid> --script <script>",
"description": "Запустить скрипт-хук во время резервного копирования"
},
{
"command": "vzdump <vmid> --exclude-path <path>",
"description": "Исключить указанные пути из резервного копирования"
},
{
"command": "vzdump <vmid> --ionice <priority>",
"description": "Задать приоритет ввода-вывода для процесса резервного копирования"
},
{
"command": "vzdump <vmid> --lockwait <minutes>",
"description": "Ожидать снятия блокировки"
},
{
"command": "qm importdisk <vmid> <disk-image> <storage>",
"description": "Импортировать файл образа диска (например, raw, qcow2 или vmdk) как неиспользуемый диск, а не архив резервной копии vzdump"
}
]
}
],
"testRestores": {
"title": "Проверяйте восстановление из резервных копий",
"bodyRich": "Периодически восстанавливайте резервную копию с помощью <code>qmrestore --unique</code>, используя неиспользуемый тестовый VMID, запускайте ВМ в изолированной тестовой сети и проверяйте её содержимое. Параметр unique создаёт новые MAC-адреса; он не изменяет статические IP-адреса или настройки приложений. Таким же образом проверяйте восстановление контейнеров с помощью <code>pct restore</code>."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/help-info/vm-ct-commands",
"label": "Управление ВМ и контейнерами",
"tail": " — команды управления жизненным циклом qm и pct."
},
{
"href": "/docs/help-info/storage-commands",
"label": "Хранилища и диски",
"tail": " — управление хранилищами с помощью pvesm."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
@@ -0,0 +1,162 @@
{
"meta": {
"title": "Команды проброса GPU в Proxmox — lspci, VFIO, IOMMU, qm set hostpci | ProxMenux",
"description": "Справочник по пробросу GPU в Proxmox VE: идентификация устройств с помощью lspci, модули VFIO, группы IOMMU (intel_iommu / amd_iommu), обновление GRUB и initramfs, qm set hostpci0, настройка проброса NVIDIA / AMD / Intel.",
"ogTitle": "Команды проброса GPU в Proxmox — lspci, VFIO, IOMMU, qm set hostpci",
"ogDescription": "Справочник по проверке и настройке проброса GPU в Proxmox VE — устройства PCI, модули VFIO, группы IOMMU, параметры загрузки ядра, qm set hostpci.",
"twitterTitle": "Команды проброса GPU в Proxmox | ProxMenux",
"twitterDescription": "Проверяйте устройства PCI, настраивайте VFIO и IOMMU и подключайте GPU к виртуальным машинам в Proxmox VE."
},
"header": {
"title": "Проброс GPU",
"description": "Справочник по проверке и настройке проброса GPU / TPU в Proxmox: идентификация устройств (lspci), настройка модулей VFIO, проверка IOMMU, обновление initramfs / GRUB и настройка проброса для отдельных виртуальных машин (qm set hostpci, machine q35, bios ovmf).",
"section": "Справка и информация"
},
"intro": {
"title": "IOMMU должен быть включён в BIOS / UEFI",
"body": "Сначала включите IOMMU в настройках прошивки: найдите <em>VT-d</em>, <em>AMD-Vi</em> или <em>IOMMU</em> в BIOS/UEFI. В системах AMD IOMMU включён по умолчанию на стороне Linux, как и в системах Intel с ядрами Proxmox версии 6.8 и новее. Для более старых ядер в системах Intel может потребоваться <code>intel_iommu=on</code>. Необязательный параметр <code>iommu=pt</code> управляет режимом сквозного доступа IOMMU; это не повод без разбора отключать кадровый буфер хоста."
},
"commandGroups": [
{
"title": "Идентификация устройств",
"commands": [
{
"command": "lspci -nn | grep -i nvidia",
"description": "Вывести список устройств PCI NVIDIA"
},
{
"command": "lspci -nn | grep -i vga",
"description": "Вывести список всех VGA-совместимых устройств"
},
{
"command": "lspci -nn | grep -i amd",
"description": "Вывести список устройств PCI AMD"
},
{
"command": "lspci -nnk | grep -A3 VGA",
"description": "Вывести список устройств VGA с драйверами ядра"
},
{
"command": "lspci -v -s <PCI_ID>",
"description": "Показать подробную информацию об указанном устройстве PCI"
}
]
},
{
"title": "Настройка VFIO",
"commands": [
{
"command": "dmesg | grep -i vfio",
"description": "Проверить сообщения модулей VFIO"
},
{
"command": "cat /etc/modprobe.d/vfio.conf",
"description": "Просмотреть настройки проброса VFIO"
},
{
"command": "ls -la /etc/modprobe.d/",
"description": "Вывести список всех файлов конфигурации modprobe"
},
{
"command": "cat /etc/modules",
"description": "Показать модули, загружаемые при запуске системы"
},
{
"command": "lsmod | grep vfio",
"description": "Проверить, загружены ли модули VFIO"
}
]
},
{
"title": "Настройка IOMMU",
"commands": [
{
"command": "cat /etc/default/grub",
"description": "Просмотреть параметры GRUB для IOMMU"
},
{
"command": "update-grub",
"description": "Применить изменения GRUB"
},
{
"command": "dmesg | grep -i iommu",
"description": "Проверить сообщения IOMMU в журнале ядра"
},
{
"command": "dmesg | grep -e DMAR -e IOMMU",
"description": "Проверить сообщения DMAR и IOMMU"
},
{
"command": "find /sys/kernel/iommu_groups/ -type l | sort -V",
"description": "Показать список групп IOMMU"
}
]
},
{
"title": "Обновления системы",
"commands": [
{
"command": "update-initramfs -u",
"description": "Применить изменения initramfs (VFIO)"
},
{
"command": "update-initramfs -u -k all",
"description": "Обновить initramfs для всех ядер"
},
{
"command": "cat /proc/cmdline",
"description": "Показать текущие параметры загрузки ядра"
}
]
},
{
"title": "Настройка виртуальных машин",
"commands": [
{
"command": "qm config <vmid> | grep hostpci",
"description": "Показать настройки проброса PCI для виртуальной машины"
},
{
"command": "qm set <vmid> -hostpci0 <PCI_ID>,pcie=1,x-vga=1",
"description": "Добавить проброс GPU в виртуальную машину"
},
{
"command": "cat /etc/pve/qemu-server/<vmid>.conf",
"description": "Просмотреть файл конфигурации виртуальной машины"
},
{
"command": "qm set <vmid> -machine q35",
"description": "Настроить виртуальную машину на использование чипсета Q35 (рекомендуется для проброса устройств)"
},
{
"command": "qm set <vmid> -bios ovmf",
"description": "Настроить виртуальную машину на использование UEFI/OVMF (рекомендуется, если ROM видеокарты поддерживает UEFI)"
}
]
}
],
"afterChangesTip": {
"title": "После изменения настроек GRUB или modprobe",
"bodyRich": "На хостах с GRUB примените изменения параметров загрузки с помощью <code>update-grub</code>. Примените изменения настроек модулей с помощью <code>update-initramfs -u -k all</code>, затем перезагрузите систему. Для других загрузчиков требуется собственная процедура настройки. Проверьте результат с помощью <code>cat /proc/cmdline</code> (параметры ядра), <code>dmesg | grep -i iommu</code> (инициализация IOMMU) и <code>find /sys/kernel/iommu_groups/ -type l | sort -V</code> (наличие групп)."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/hardware/gpu-vm-passthrough",
"label": "Добавить GPU в ВМ (прямой проброс)",
"tail": " — интерактивная процедура ProxMenux."
},
{
"href": "/docs/hardware/igpu-acceleration-lxc",
"label": "Добавить GPU в LXC",
"tail": " — предоставление контейнеру LXC совместного доступа к GPU хоста."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
+87
View File
@@ -0,0 +1,87 @@
{
"meta": {
"title": "Справочник команд Proxmox — qm, pct, vzdump, zpool, pveversion | ProxMenux",
"description": "Подборка основных команд Proxmox VE и Linux по темам: проверка системы, управление виртуальными машинами и LXC (qm / pct), хранилища и диски, сеть, обновления, проброс GPU, ZFS, резервное копирование и восстановление, а также повседневные инструменты командной строки.",
"ogTitle": "Справочник команд Proxmox — qm, pct, vzdump, zpool",
"ogDescription": "Подборка наиболее полезных команд Proxmox VE и Linux по темам: система, виртуальные машины и контейнеры, хранилища, сеть, обновления, проброс GPU, ZFS, резервное копирование и инструменты командной строки.",
"twitterTitle": "Справочник команд Proxmox | ProxMenux",
"twitterDescription": "Подборка наиболее полезных команд Proxmox VE и Linux, сгруппированных по темам."
},
"header": {
"title": "Справка и информация",
"description": "Тематическая подборка полезных команд Linux и Proxmox VE. Девять категорий охватывают всё — от быстрой проверки с помощью pveversion до многострочных команд zfs send/receive. Подборка дополняет разделы ProxMenux, посвящённые GPU, дискам и общим ресурсам, и служит единым справочником.",
"section": "Справка и информация"
},
"intro": {
"title": "Что это такое",
"body": "Справочник команд, которые действительно используются на хосте Proxmox, сгруппированных по темам. В ProxMenux можно выбрать номер, чтобы сразу выполнить команду, или вставить собственную команду в строку ввода; на этом сайте каждая категория представлена таблицей, из которой можно копировать команды."
},
"opening": {
"heading": "Открытие меню",
"body": "В главном меню ProxMenux нажмите <kbd>h</kbd>. Вы увидите следующее:",
"imageAlt": "Меню справки и информации с 9 категориями команд"
},
"categories": {
"heading": "Девять категорий",
"options": [
{
"icon": "Terminal",
"href": "/docs/help-info/system-commands",
"title": "Полезные системные команды",
"description": "pveversion, uptime, free, journalctl, hostnamectl, информация о текущем пользователе, аудит lynis, fastfetch."
},
{
"icon": "Cpu",
"href": "/docs/help-info/vm-ct-commands",
"title": "Управление ВМ и контейнерами",
"description": "qm list / config / start / stop / migrate, pct list / config / enter, снимки, клонирование."
},
{
"icon": "HardDrive",
"href": "/docs/help-info/storage-commands",
"title": "Хранилища и диски",
"description": "lsblk, blkid, smartctl, информация о монтировании, pvesm status, команды LVM."
},
{
"icon": "Network",
"href": "/docs/help-info/network-commands",
"title": "Сетевые команды",
"description": "ip / ss / nmcli, проверка сетевых мостов, ping / traceroute, запросы DNS, fail2ban-client."
},
{
"icon": "Package",
"href": "/docs/help-info/update-commands",
"title": "Обновления и пакеты",
"description": "apt update / dist-upgrade, apt-cache policy, запросы dpkg, проверка файлов репозиториев."
},
{
"icon": "Cpu",
"href": "/docs/help-info/gpu-commands",
"title": "Проброс GPU",
"description": "Проверки с помощью lspci / dmesg, проверка включения IOMMU, привязка к vfio-pci, использование GPU на хосте."
},
{
"icon": "Database",
"href": "/docs/help-info/zfs-commands",
"title": "Управление ZFS",
"description": "Команды zpool / zfs для просмотра состояния, работы с наборами данных и снимками, отправки и приёма данных, настройки ARC и выполнения TRIM."
},
{
"icon": "Archive",
"href": "/docs/help-info/backup-commands",
"title": "Резервное копирование и восстановление",
"description": "vzdump, qmrestore / pct restore, вспомогательные средства Proxmox Backup Server, операции со снимками."
},
{
"icon": "Wrench",
"href": "/docs/help-info/tools-commands",
"title": "Системные инструменты командной строки",
"description": "tmux, screen, htop / btop, ncdu, jq, dig, lsof, watch — инструменты для повседневного администрирования."
}
]
},
"tip": {
"title": "Доступно через глобальный поиск",
"body": "Все команды на этих страницах проиндексированы для поиска по документации. Если вы помните флаг или фрагмент команды, но не помните, на какой он странице, воспользуйтесь строкой поиска вверху — вы перейдёте прямо к нужной записи."
}
}
@@ -0,0 +1,174 @@
{
"meta": {
"title": "Сетевые команды Proxmox — ip, ping, ss, pve-firewall, iptables | ProxMenux",
"description": "Справочник сетевых команд хоста Proxmox VE: ip / ip link / ip addr, ping, traceroute, mtr, ss, ethtool, dig, nslookup, а также pve-firewall, iptables и nftables для фильтрации. Проверка сетевых мостов, агрегированных интерфейсов и VLAN.",
"ogTitle": "Сетевые команды Proxmox — ip, ping, ss, pve-firewall, iptables",
"ogDescription": "Справочник сетевых команд для Proxmox VE — проверка интерфейсов и соединения, мониторинг, межсетевой экран (pve-firewall, iptables, nftables) и запросы DNS.",
"twitterTitle": "Сетевые команды Proxmox | ProxMenux",
"twitterDescription": "Команды для проверки, тестирования и настройки сети, а также управления межсетевым экраном в Proxmox VE."
},
"header": {
"title": "Сетевые команды",
"description": "Подборка справочных команд для сети хоста Proxmox: информация об интерфейсах, проверка соединения, настройка, мониторинг трафика и управление межсетевым экраном. Включает ip / ss / nmcli / ethtool / tcpdump / pve-firewall.",
"section": "Справка и информация"
},
"intro": {
"title": "Быстрый обзор интерфейсов",
"body": "<code>ip a</code> показывает все интерфейсы с их IP-адресами и MAC-адресами. <code>ip r</code> показывает таблицу маршрутизации. Вместе они позволяют за считанные секунды ответить на большинство вопросов о том, правильно ли настроен интерфейс."
},
"commandGroups": [
{
"title": "Информация о сети",
"commands": [
{
"command": "ip a",
"description": "Показать сетевые интерфейсы и IP-адреса"
},
{
"command": "ip r",
"description": "Показать таблицу маршрутизации"
},
{
"command": "ip -s link",
"description": "Показать статистику трафика по интерфейсам"
},
{
"command": "brctl show",
"description": "Показать настроенные сетевые мосты"
},
{
"command": "cat /etc/network/interfaces",
"description": "Показать сетевую конфигурацию в исходном виде"
}
]
},
{
"title": "Тестирование сети",
"commands": [
{
"command": "ping <host>",
"description": "Проверить связь с другим узлом"
},
{
"command": "traceroute <host>",
"description": "Выполнить трассировку маршрута до узла"
},
{
"command": "mtr <host>",
"description": "Совместить ping и traceroute в реальном времени"
},
{
"command": "dig <domain>",
"description": "Выполнить DNS-запрос для домена"
},
{
"command": "nslookup <domain>",
"description": "Альтернативный способ выполнения DNS-запроса"
}
]
},
{
"title": "Настройка сети",
"commands": [
{
"command": "ifreload -a",
"description": "Перезагрузить сетевую конфигурацию (ifupdown2)"
},
{
"command": "ethtool <iface>",
"description": "Показать сведения об устройстве Ethernet"
},
{
"command": "resolvectl status",
"description": "Показать состояние разрешения имён DNS"
},
{
"command": "nmcli device show",
"description": "Показать подробные сведения о сетевом устройстве (если используется NetworkManager)"
},
{
"command": "ip link set <iface> up",
"description": "Включить сетевой интерфейс"
},
{
"command": "ip link set <iface> down",
"description": "Отключить сетевой интерфейс"
}
]
},
{
"title": "Мониторинг сети",
"commands": [
{
"command": "ss -tuln",
"description": "Показать прослушиваемые порты (TCP/UDP)"
},
{
"command": "netstat -tuln",
"description": "Альтернативный способ просмотра прослушиваемых портов"
},
{
"command": "lsof -i",
"description": "Вывести список открытых сетевых файлов и соединений"
},
{
"command": "tcpdump -i <iface>",
"description": "Захватывать пакеты на интерфейсе"
},
{
"command": "iftop -i <iface>",
"description": "Отслеживать использование пропускной способности интерфейса"
}
]
},
{
"title": "Управление межсетевым экраном",
"commands": [
{
"command": "iptables -L -n -v",
"description": "Показать активные правила межсетевого экрана (iptables)"
},
{
"command": "nft list ruleset",
"description": "Показать правила nftables"
},
{
"command": "pve-firewall status",
"description": "Проверить состояние межсетевого экрана Proxmox"
},
{
"command": "pve-firewall compile",
"description": "Скомпилировать правила межсетевого экрана для всех узлов"
},
{
"command": "pve-firewall reload",
"description": "Перезагрузить правила межсетевого экрана Proxmox"
}
]
}
],
"iptablesTip": {
"title": "iptables и nftables",
"bodyRich": "Классическая служба <code>pve-firewall</code> генерирует правила iptables. Альтернативная служба proxmox-firewall использует <strong>nftables</strong>. Для просмотра правил подсистемы на основе iptables используйте <code>iptables -L -n -v</code>, а для подсистемы nftables — <code>nft list ruleset</code>. Используйте инструменты для включённой подсистемы; не считайте эти списки правил взаимозаменяемыми."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/network",
"label": "Управление сетью",
"tail": " — интерактивные сетевые инструменты ProxMenux (анализ мостов, постоянные имена, мониторинг)."
},
{
"href": "/docs/help-info/tools-commands",
"label": "Системные инструменты командной строки",
"tail": " — дополнительные инструменты мониторинга сети."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
@@ -0,0 +1,232 @@
{
"meta": {
"title": "Команды Proxmox для работы с хранилищами и дисками — lsblk, LVM, pvesm, qm importdisk | ProxMenux",
"description": "Справочник команд для работы с хранилищами и дисками в Proxmox VE: lsblk, blkid, parted, lvdisplay, vgdisplay, pvs, mount, df, du, ncdu, pvesm status, qm importdisk и qemu-img convert для операций с дисками виртуальных машин.",
"ogTitle": "Команды Proxmox для работы с хранилищами и дисками — lsblk, LVM, pvesm, qm importdisk",
"ogDescription": "Справочник команд для работы с хранилищами и дисками в Proxmox VE — просмотр сведений о дисках, LVM, точки монтирования, управление хранилищами Proxmox, импорт дисков виртуальных машин и преобразование образов.",
"twitterTitle": "Команды Proxmox для работы с хранилищами | ProxMenux",
"twitterDescription": "Команды для просмотра сведений о дисках и точках монтирования, управления LVM и хранилищами Proxmox, импорта и преобразования дисков виртуальных машин."
},
"header": {
"title": "Хранилища и диски",
"description": "Подборка справочных команд для просмотра сведений о хранилищах на узлах Proxmox: блочные устройства, разделы, точки монтирования, тома LVM, конфигурация хранилищ Proxmox и несколько операций с дисками виртуальных машин (importdisk, qemu-img convert).",
"section": "Справка и информация"
},
"intro": {
"title": "Быстрый обзор дисков",
"body": "<code>lsblk</code> показывает блочные устройства и разделы в виде дерева. Просмотрите постоянные идентификаторы с помощью <code>ls -lh /dev/disk/by-id/</code>: для одного и того же диска они обычно остаются неизменными после перезагрузок и изменения порядка устройств. Замена диска или изменение способа, которым контроллер предоставляет его идентификационные данные, может изменить путь by-id этого диска."
},
"commandGroups": [
{
"title": "Сведения о дисках",
"commands": [
{
"command": "lsblk",
"description": "Показать список блочных устройств и разделов"
},
{
"command": "fdisk -l",
"description": "Показать список дисков с подробными сведениями"
},
{
"command": "blkid",
"description": "Показать UUID и тип файловой системы блочных устройств"
},
{
"command": "ls -lh /dev/disk/by-id/",
"description": "Показать постоянные идентификаторы дисков"
},
{
"command": "parted -l",
"description": "Подробная схема разделов с информацией GPT"
}
]
},
{
"title": "Использование хранилищ",
"commands": [
{
"command": "df -h",
"description": "Показать использование дискового пространства по точкам монтирования"
},
{
"command": "du -sh /path",
"description": "Показать размер каталога"
},
{
"command": "mount | grep ^/dev",
"description": "Показать смонтированные устройства хранения"
},
{
"command": "cat /proc/mounts",
"description": "Показать все активные монтирования по данным ядра"
}
]
},
{
"title": "Управление LVM",
"commands": [
{
"command": "pvdisplay",
"description": "Показать физические тома (LVM)"
},
{
"command": "vgdisplay",
"description": "Показать группы томов (LVM)"
},
{
"command": "lvdisplay",
"description": "Показать логические тома (LVM)"
},
{
"command": "pvs",
"description": "Краткая информация о физических томах"
},
{
"command": "vgs",
"description": "Краткая информация о группах томов"
},
{
"command": "lvs",
"description": "Краткая информация о логических томах"
}
]
},
{
"title": "Хранилища Proxmox",
"commands": [
{
"command": "cat /etc/pve/storage.cfg",
"description": "Показать конфигурацию хранилищ Proxmox"
},
{
"command": "pvesm status",
"description": "Показать состояние всех пулов хранения"
},
{
"command": "pvesm status --enabled 1",
"description": "Показать список настроенных и включённых хранилищ"
},
{
"command": "pvesm list <storage>",
"description": "Показать содержимое указанного хранилища"
},
{
"command": "pvesm scan nfs <server>",
"description": "Обнаружить экспортируемые ресурсы NFS на сервере"
}
]
},
{
"title": "Операции с дисками",
"commands": [
{
"command": "qm importdisk <vmid> <image_path> <storage>",
"description": "Импортировать образ диска как неиспользуемый диск ВМ; подключить его отдельно"
},
{
"command": "qm set <vmid> -<bus><index> <disk_path>",
"description": "Назначить физический диск ВМ (в режиме прямого проброса)"
},
{
"command": "qemu-img convert -O <format> <input> <output>",
"description": "Преобразовать формат образа диска, когда он не используется"
}
]
},
{
"title": "Состояние дисков по SMART",
"commands": [
{
"command": "smartctl --scan",
"description": "Показать список устройств на хосте с поддержкой SMART"
},
{
"command": "smartctl -i /dev/<disk>",
"description": "Основные сведения об устройстве (модель, прошивка, серийный номер)"
},
{
"command": "smartctl -H /dev/<disk>",
"description": "Быстрая проверка состояния — общий результат PASSED / FAILED"
},
{
"command": "smartctl -A /dev/<disk>",
"description": "Только атрибуты SMART (необработанные значения, пороговые значения)"
},
{
"command": "smartctl -a /dev/<disk>",
"description": "Полная информация SMART — сведения + атрибуты + журнал самотестирования"
},
{
"command": "smartctl -t short /dev/<disk>",
"description": "Запустить короткое самотестирование (~2 минуты, выполняется в фоновом режиме)"
},
{
"command": "smartctl -t long /dev/<disk>",
"description": "Запустить длительное самотестирование (занимает несколько часов, выполняется в фоновом режиме)"
},
{
"command": "smartctl -l selftest /dev/<disk>",
"description": "Просмотреть журнал самотестирования (результаты предыдущих тестов)"
},
{
"command": "smartctl -X /dev/<disk>",
"description": "Прервать выполняющееся самотестирование"
}
]
},
{
"title": "Состояние дисков NVMe",
"commands": [
{
"command": "nvme list",
"description": "Показать список устройств NVMe, видимых ядру"
},
{
"command": "nvme smart-log /dev/<nvme>",
"description": "Журнал SMART для NVMe (температура, износ, ошибки)"
},
{
"command": "nvme id-ctrl /dev/<nvme>",
"description": "Сведения о контроллере (модель, прошивка, возможности)"
},
{
"command": "nvme error-log /dev/<nvme>",
"description": "Последние записи журнала ошибок NVMe"
}
]
}
],
"lvmTip": {
"title": "Краткие и полные команды LVM",
"bodyRich": "Доступны обе формы. <code>pvs</code> / <code>vgs</code> / <code>lvs</code> выводят компактные таблицы с одной строкой на каждый физический том, группу томов или логический том соответственно. <code>pvdisplay</code> / <code>vgdisplay</code> / <code>lvdisplay</code> предоставляют более подробный многострочный вывод. Краткие формы удобны для повседневных проверок."
},
"smartInfo": {
"title": "SMART для SATA/SAS и NVMe",
"bodyRich": "<strong>Диски SATA / SAS, включая SSD,</strong> можно проверять с помощью <code>smartctl</code> из пакета <code>smartmontools</code> (установлен по умолчанию в Proxmox). Укажите устройство, например <code>/dev/sda</code> или <code>/dev/sdb</code>. <strong>Диски NVMe</strong> используют другой собственный протокол. <code>smartctl</code> также поддерживает их, а <code>nvme</code> из пакета <code>nvme-cli</code> позволяет выполнять специфичные для NVMe запросы о контроллере, пространствах имён и состоянии. Если пакет отсутствует, установите его с помощью <code>apt install nvme-cli</code>."
},
"selfTestWarn": {
"title": "Самотестирование выполняется в фоновом режиме",
"bodyRich": "На поддерживаемых накопителях <code>smartctl -t short /dev/&lt;disk&gt;</code> и <code>smartctl -t long /dev/&lt;disk&gt;</code> запускают фоновые тесты и сразу возвращают управление. Проверяйте ход выполнения с помощью <code>smartctl -a /dev/&lt;disk&gt;</code> (ищите строку «Self-test routine in progress») или дождитесь завершения и просмотрите <code>smartctl -l selftest /dev/&lt;disk&gt;</code>. Короткие тесты обычно занимают около двух минут; длительные могут занимать несколько часов. Диск остаётся доступным для использования, но тестирование может снизить производительность ввода-вывода."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/help-info/zfs-commands",
"label": "Управление ZFS",
"tail": " — команды zpool / zfs для хранилищ на базе ZFS."
},
{
"href": "/docs/disk-manager",
"label": "Диспетчер дисков",
"tail": " — интерактивные процедуры ProxMenux для прямого проброса дисков, импорта, форматирования и SMART."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
@@ -0,0 +1,158 @@
{
"meta": {
"title": "Системные команды Proxmox VE — pveversion, uptime, journalctl, systemctl | ProxMenux",
"description": "Системные команды Proxmox VE и Linux для просмотра версий, времени работы, памяти, служб, журналов и пользователей, а также инструменты аудита и сводной информации. Включена команда перезапуска службы; не все примеры предназначены только для чтения.",
"ogTitle": "Системные команды Proxmox VE — pveversion, uptime, journalctl, systemctl",
"ogDescription": "Системные команды Proxmox VE и Linux для просмотра версии, времени работы, служб, журналов и сведений о пользователях, включая инструменты управления службами и аудита.",
"twitterTitle": "Системные команды Proxmox VE | ProxMenux",
"twitterDescription": "Основные команды для проверки системы Proxmox VE — версия, состояние, службы, журналы, сведения о пользователях."
},
"header": {
"title": "Полезные системные команды",
"description": "Команды для проверки узла Proxmox: версия, ядро, время работы, память, состояние веб-интерфейса, последние записи журналов и пользователи, вошедшие в систему, а также инструменты аудита и сводной информации. Большинство команд лишь проверяют состояние, но systemctl restart pveproxy перезапускает прокси веб-интерфейса, а инструменты аудита могут записывать отчёты и журналы.",
"section": "Справка и информация"
},
"intro": {
"title": "Что это такое",
"body": "Тот же нумерованный список, который ProxMenux показывает при выборе пункта <em>Полезные системные команды</em>. Используйте кнопку «Копировать», чтобы скопировать любую команду, или найдите её в списке, чтобы вспомнить точный флаг."
},
"commandGroups": [
{
"title": "Сведения о системе",
"commands": [
{
"command": "pveversion",
"description": "Показать версию Proxmox"
},
{
"command": "pveversion -v",
"description": "Подробные сведения о версии Proxmox"
},
{
"command": "hostnamectl",
"description": "Имя узла и сведения о ядре"
},
{
"command": "uname -a",
"description": "Сведения о ядре и архитектуре"
},
{
"command": "cat /etc/os-release",
"description": "Сведения о выпуске ОС"
}
]
},
{
"title": "Состояние системы",
"commands": [
{
"command": "uptime",
"description": "Время непрерывной работы системы"
},
{
"command": "uptime -p",
"description": "Время непрерывной работы в удобном для чтения формате"
},
{
"command": "free -h",
"description": "Использование оперативной памяти и подкачки"
},
{
"command": "who -b",
"description": "Время последней загрузки системы"
},
{
"command": "last -x | grep shutdown",
"description": "Предыдущие выключения системы"
}
]
},
{
"title": "Управление службами",
"commands": [
{
"command": "systemctl status pveproxy",
"description": "Проверить состояние веб-интерфейса Proxmox"
},
{
"command": "systemctl restart pveproxy",
"description": "Перезапустить прокси веб-интерфейса"
},
{
"command": "journalctl -xe",
"description": "Системные ошибки и журналы"
},
{
"command": "dmesg -T | tail -n 50",
"description": "Последние 50 строк журнала ядра"
}
]
},
{
"title": "Информация о пользователях",
"commands": [
{
"command": "whoami",
"description": "Текущий пользователь"
},
{
"command": "id",
"description": "UID, GID и группы текущего пользователя"
},
{
"command": "who",
"description": "Пользователи, вошедшие в систему"
},
{
"command": "w",
"description": "Активность пользователей и время непрерывной работы системы"
},
{
"command": "uptime && w",
"description": "Время непрерывной работы системы и вошедшие в неё пользователи"
},
{
"command": "cut -d: -f1,3,4 /etc/passwd",
"description": "Все пользователи с их UID и GID"
},
{
"command": "getent passwd | column -t -s :",
"description": "Удобочитаемая таблица пользователей (UID, оболочка и т. д.)"
}
]
},
{
"title": "Средства аудита и сводной информации",
"commands": [
{
"command": "lynis audit system",
"description": "Выполнить полный аудит безопасности системы"
},
{
"command": "fastfetch",
"description": "Показать сводную информацию о системе в формате ASCII"
}
]
}
],
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/help-info/update-commands",
"label": "Обновления и пакеты",
"tail": " — команды обновления apt и pve."
},
{
"href": "/docs/help-info/tools-commands",
"label": "Системные инструменты командной строки",
"tail": " — htop, btop, ncdu и другие инструменты."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
@@ -0,0 +1,276 @@
{
"meta": {
"title": "Инструменты командной строки Linux для Proxmox — htop, iftop, journalctl, rsync, tmux | ProxMenux",
"description": "Повседневные инструменты командной строки Linux для администрирования Proxmox VE: мониторинг (htop, atop, glances, iotop), сеть (iftop, nmap, mtr, ss), работа с файлами и текстом (find, grep, journalctl), анализ производительности (iostat, perf, strace), безопасность (fail2ban, lynis, lsof) и удалённое администрирование (ssh, rsync, tmux).",
"ogTitle": "Инструменты командной строки Linux для Proxmox — htop, iftop, journalctl, rsync, tmux",
"ogDescription": "Повседневные инструменты командной строки для администрирования Proxmox VE, сгруппированные по назначению: мониторинг, сеть, работа с файлами и текстом, анализ производительности, безопасность и удалённое администрирование.",
"twitterTitle": "Инструменты командной строки Linux для Proxmox | ProxMenux",
"twitterDescription": "Повседневные инструменты командной строки для администрирования Proxmox VE, сгруппированные по назначению."
},
"header": {
"title": "Системные инструменты командной строки",
"description": "Повседневные инструменты командной строки для администрирования хоста Proxmox, сгруппированные по назначению: мониторинг, сеть, работа с файлами и текстом, анализ производительности, безопасность, удалённое администрирование и настройка системы.",
"section": "Справка и информация"
},
"intro": {
"title": "Большинство инструментов устанавливается скриптом Post-Install",
"body": "Если вы запускали скрипт Post-Install от ProxMenux с параметрами по умолчанию, большинство этих инструментов уже установлено. Недостающие инструменты доступны в <utilsLink>установщике системных утилит</utilsLink> от ProxMenux в виде предопределённых групп (базовые инструменты, разработка, сеть, анализ и т. д.)."
},
"commandGroups": [
{
"title": "Мониторинг системы",
"commands": [
{
"command": "htop",
"description": "Интерактивный просмотр процессов с отображением загрузки процессора и использования памяти"
},
{
"command": "top",
"description": "Отображение процессов Linux в реальном времени"
},
{
"command": "atop",
"description": "Расширенный монитор системы и процессов"
},
{
"command": "glances",
"description": "Инструмент мониторинга системы с веб-интерфейсом"
},
{
"command": "nmon",
"description": "Инструмент мониторинга производительности"
},
{
"command": "iotop",
"description": "Мониторинг дискового ввода-вывода по процессам"
},
{
"command": "vmstat 1",
"description": "Вывод статистики виртуальной памяти каждую секунду"
}
]
},
{
"title": "Сетевые инструменты",
"commands": [
{
"command": "iftop",
"description": "Отображение использования пропускной способности сетевого интерфейса"
},
{
"command": "nmap <host>",
"description": "Исследование сети и сканирование безопасности"
},
{
"command": "tcpdump -i <interface>",
"description": "Захват сетевого трафика"
},
{
"command": "netstat -tuln",
"description": "Отображение сетевых соединений"
},
{
"command": "ss -tuln",
"description": "Ещё одна утилита для исследования сокетов"
},
{
"command": "mtr <host>",
"description": "Инструмент диагностики сети, сочетающий ping и traceroute"
},
{
"command": "iperf3 -s",
"description": "Запуск сервера iperf для проверки пропускной способности"
}
]
},
{
"title": "Инструменты для работы с файлами и текстом",
"commands": [
{
"command": "find / -name <filename>",
"description": "Поиск файлов по имени"
},
{
"command": "grep -r 'pattern' /path",
"description": "Поиск по шаблону в файлах"
},
{
"command": "sed -i 's/old/new/g' file",
"description": "Замена текста в файлах"
},
{
"command": "awk '{print $1}' file",
"description": "Инструмент обработки текста"
},
{
"command": "tail -f /var/log/syslog",
"description": "Отслеживание файла журнала в реальном времени"
},
{
"command": "less /var/log/messages",
"description": "Постраничный просмотр файла"
},
{
"command": "journalctl -f",
"description": "Отслеживание записей журнала systemd"
}
]
},
{
"title": "Анализ производительности",
"commands": [
{
"command": "iostat -x 1",
"description": "Вывод статистики использования процессора и операций ввода-вывода"
},
{
"command": "mpstat -P ALL 1",
"description": "Показать загрузку процессора"
},
{
"command": "perf top",
"description": "Инструмент профилирования системы"
},
{
"command": "strace <command>",
"description": "Отслеживать системные вызовы и сигналы"
},
{
"command": "lsof",
"description": "Показать список открытых файлов"
},
{
"command": "pstree",
"description": "Показать дерево процессов"
},
{
"command": "slabtop",
"description": "Показать информацию о slab-кэше ядра"
}
]
},
{
"title": "Инструменты безопасности",
"commands": [
{
"command": "fail2ban-client status",
"description": "Показать состояние fail2ban"
},
{
"command": "chage -l <username>",
"description": "Показать информацию о сроке действия пароля"
},
{
"command": "lastlog",
"description": "Показать время последнего входа каждого пользователя"
},
{
"command": "last",
"description": "Показать список последних входов пользователей"
},
{
"command": "w",
"description": "Показать, кто вошёл в систему и чем занимается"
},
{
"command": "lynis audit system",
"description": "Инструмент аудита безопасности"
},
{
"command": "openssl s_client -connect host:port",
"description": "Проверить соединения SSL/TLS"
}
]
},
{
"title": "Удалённое администрирование",
"commands": [
{
"command": "ssh <user>@<host>",
"description": "Защищённое подключение к командной оболочке"
},
{
"command": "scp <file> <user>@<host>:<path>",
"description": "Копировать файлы по защищённому соединению"
},
{
"command": "rsync -avz <src> <dest>",
"description": "Синхронизировать файлы и папки"
},
{
"command": "screen",
"description": "Терминальный мультиплексор"
},
{
"command": "tmux",
"description": "Альтернативный терминальный мультиплексор"
},
{
"command": "ssh-keygen -t rsa -b 4096",
"description": "Создать пару ключей SSH"
},
{
"command": "ssh-copy-id <user>@<host>",
"description": "Скопировать ключ SSH на сервер"
}
]
},
{
"title": "Настройка системы",
"commands": [
{
"command": "systemctl status <service>",
"description": "Проверить состояние службы"
},
{
"command": "journalctl -u <service>",
"description": "Просмотр журналов служб"
},
{
"command": "timedatectl",
"description": "Управление системным временем и датой"
},
{
"command": "hostnamectl",
"description": "Управление именем хоста системы"
},
{
"command": "localectl",
"description": "Управление системной локалью и раскладкой клавиатуры"
},
{
"command": "update-alternatives --config <name>",
"description": "Настройка системных альтернатив"
},
{
"command": "dpkg-reconfigure <package>",
"description": "Повторная настройка установленного пакета"
}
]
}
],
"tmuxTip": {
"title": "Используйте tmux / screen для длительных команд",
"bodyRich": "Длительные операции — создание резервной копии, продолжительное обновление или передача большого объёма данных через rsync — следует выполнять в <code>tmux</code> или <code>screen</code>, чтобы разрыв соединения SSH не завершил сеанс терминала. Чтобы вернуться к сеансу tmux, снова подключитесь к тому же хосту под тем же пользователем и выполните <code>tmux attach</code>. Для возврата к сеансам Screen используется отдельная команда."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/utils/system-utils",
"label": "Установка системных утилит",
"tail": " — установите недостающие инструменты из этого списка."
},
{
"href": "/docs/help-info/system-commands",
"label": "Полезные системные команды",
"tail": " — команды проверки состояния, специфичные для Proxmox."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
@@ -0,0 +1,170 @@
{
"meta": {
"title": "Команды обновления и управления пакетами Proxmox — apt, pveupgrade, dpkg | ProxMenux",
"description": "Справочник команд обновления и управления пакетами для Proxmox VE: apt update, apt upgrade, apt dist-upgrade, pveupgrade, dpkg -l, поиск сведений о пакетах, настройка репозиториев в /etc/apt/sources.list.d/.",
"ogTitle": "Команды обновления и управления пакетами Proxmox — apt, pveupgrade, dpkg",
"ogDescription": "Команды apt, pveupgrade и dpkg для поддержания Proxmox VE в актуальном состоянии — обновление системы, управление пакетами, настройка репозиториев.",
"twitterTitle": "Команды обновления Proxmox | ProxMenux",
"twitterDescription": "Команды apt и pveupgrade для управления обновлениями и пакетами на хостах Proxmox VE."
},
"header": {
"title": "Обновления и пакеты",
"description": "Подборка справочных сведений о командах apt и командах обновления, специфичных для Proxmox: обновление системы, установка и удаление пакетов с сохранением или удалением конфигурации, поиск сведений о пакетах (apt-cache policy, dpkg -l) и проверка конфигурации репозиториев.",
"section": "Справка и информация"
},
"intro": {
"title": "Всегда сначала обновляйте индекс пакетов",
"body": "<code>apt update</code> обновляет локальный индекс пакетов из настроенных репозиториев. Без этого <code>apt install</code> может загрузить устаревшие версии или завершиться с ошибкой «Не удалось найти пакет»."
},
"commandGroups": [
{
"title": "Обновления системы",
"commands": [
{
"command": "apt update && apt upgrade -y",
"description": "Обновление списков пакетов и установленных пакетов (apt upgrade)"
},
{
"command": "apt dist-upgrade -y",
"description": "Полное обновление системы, включая зависимости"
},
{
"command": "apt update",
"description": "Обновление только списков пакетов"
},
{
"command": "apt upgrade",
"description": "Обновление только пакетов (интерактивно)"
},
{
"command": "apt full-upgrade",
"description": "Обновление пакетов с обработкой зависимостей (интерактивно)"
}
]
},
{
"title": "Обновления Proxmox",
"commands": [
{
"command": "pveupdate",
"description": "Обновить списки пакетов Proxmox"
},
{
"command": "pveupgrade",
"description": "Запустить интерактивное обновление пакетов Proxmox"
},
{
"command": "pve8to9 --full",
"description": "Проверить готовность к обновлению PVE с версии 8 до 9 (без выполнения обновления)"
},
{
"command": "ceph versions",
"description": "Показать версии служб Ceph перед планированием обновления Ceph"
}
]
},
{
"title": "Управление пакетами",
"commands": [
{
"command": "apt autoremove --purge",
"description": "Удалить неиспользуемые пакеты и их конфигурацию"
},
{
"command": "apt clean",
"description": "Очистить локальное хранилище загруженных файлов пакетов"
},
{
"command": "apt autoclean",
"description": "Удалить только устаревшие файлы пакетов"
},
{
"command": "apt install <package>",
"description": "Установить определённый пакет"
},
{
"command": "apt remove <package>",
"description": "Удалить пакет"
},
{
"command": "apt purge <package>",
"description": "Удалить пакет и его файлы конфигурации"
}
]
},
{
"title": "Информация о пакетах",
"commands": [
{
"command": "apt list --installed",
"description": "Показать список всех установленных пакетов"
},
{
"command": "apt search <keyword>",
"description": "Найти пакеты по ключевому слову"
},
{
"command": "apt show <package>",
"description": "Показать подробную информацию о пакете"
},
{
"command": "dpkg -l",
"description": "Показать список всех установленных пакетов (альтернативный способ)"
},
{
"command": "dpkg -l | grep <keyword>",
"description": "Найти установленные пакеты по ключевому слову"
},
{
"command": "apt-cache policy <package>",
"description": "Показать версии и приоритеты пакетов"
}
]
},
{
"title": "Управление репозиториями",
"commands": [
{
"command": "cat /etc/apt/sources.list",
"description": "Показать основные источники пакетов APT"
},
{
"command": "ls -la /etc/apt/sources.list.d/",
"description": "Показать список дополнительных файлов источников пакетов"
},
{
"command": "cat /etc/apt/sources.list.d/pve-enterprise.list",
"description": "Показать конфигурацию репозитория Proxmox Enterprise в файле .list для PVE 8"
},
{
"command": "apt-key list",
"description": "Показать список устаревших ключей подписи репозиториев, если доступна команда apt-key"
}
]
}
],
"backupWarn": {
"title": "Создайте резервную копию перед обновлением до новой основной версии",
"bodyRich": "Для обычных обновлений Proxmox рекомендует <code>apt update &amp;&amp; apt full-upgrade</code>; перед подтверждением проверьте предлагаемые изменения пакетов. Для <strong>обновлений до новой основной версии</strong> (PVE 8 → 9) используйте специальную процедуру ProxMenux: <upgradeLink>Обновление PVE 8 до PVE 9</upgradeLink>. Она включает проверки готовности, миграцию репозиториев и проверку после обновления. Сначала создайте резервную копию."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/utils/system-update",
"label": "Обновление системы Proxmox (интерактивное)",
"tail": " — скрипт-обёртка, который выполняет все эти действия с диалогом подтверждения, автоматической пересборкой DKMS драйверов, управляемых ProxMenux, при установке нового ядра и предложением перезагрузки. Его также можно запустить кнопкой «Обновить сейчас» на панели мониторинга ProxMenux Monitor."
},
{
"href": "/docs/utils/upgrade-pve8-pve9",
"label": "Обновление PVE 8 до PVE 9",
"tail": " — для обновлений до новой основной версии."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
@@ -0,0 +1,182 @@
{
"meta": {
"title": "Команды Proxmox qm и pct — управление виртуальными машинами и контейнерами LXC | ProxMenux",
"description": "Справочник команд qm и pct в Proxmox VE для виртуальных машин и контейнеров LXC: list, config, start, stop, shutdown, reboot, destroy, clone, migrate, snapshot, resize, а также pct exec / enter / push / pull для контейнеров.",
"ogTitle": "Команды Proxmox qm и pct — управление виртуальными машинами и контейнерами LXC",
"ogDescription": "Справочник команд qm и pct в Proxmox VE — управление виртуальными машинами и контейнерами LXC из командной строки: start, stop, configure, snapshot, migrate, clone, destroy.",
"twitterTitle": "Команды Proxmox qm / pct | ProxMenux",
"twitterDescription": "Подборка команд qm / pct для управления виртуальными машинами и контейнерами LXC в Proxmox VE."
},
"header": {
"title": "Управление ВМ и контейнерами",
"description": "Справочник основных команд qm (виртуальные машины) и pct (контейнеры LXC). Просмотр списков, управление жизненным циклом (start / stop / shutdown / destroy), просмотр конфигурации и специфичные для контейнеров операции, такие как exec, enter, push и pull.",
"section": "Справка и информация"
},
"intro": {
"title": "Сначала найдите VMID или CTID",
"body": "Почти каждой команде нужен числовой идентификатор. Используйте <code>qm list</code> для виртуальных машин и <code>pct list</code> для контейнеров. Перед выполнением замените <code>&lt;vmid&gt;</code> / <code>&lt;ctid&gt;</code> в примерах на фактический идентификатор."
},
"commandGroups": [
{
"title": "Списки и информация",
"commands": [
{
"command": "qm list",
"description": "Вывести список всех виртуальных машин"
},
{
"command": "pct list",
"description": "Вывести список всех контейнеров LXC"
},
{
"command": "qm config <vmid>",
"description": "Показать конфигурацию виртуальной машины (после разбора командой qm)"
},
{
"command": "pct config <ctid>",
"description": "Показать конфигурацию контейнера (после разбора командой pct)"
}
]
},
{
"title": "Файлы конфигурации (исходный вид)",
"commands": [
{
"command": "cat /etc/pve/qemu-server/<vmid>.conf",
"description": "Просмотреть файл конфигурации виртуальной машины в исходном виде"
},
{
"command": "cat /etc/pve/lxc/<ctid>.conf",
"description": "Просмотреть файл конфигурации контейнера в исходном виде"
},
{
"command": "nano /etc/pve/qemu-server/<vmid>.conf",
"description": "Редактировать файл конфигурации виртуальной машины в исходном виде (nano)"
},
{
"command": "nano /etc/pve/lxc/<ctid>.conf",
"description": "Редактировать файл конфигурации контейнера в исходном виде (nano)"
},
{
"command": "vi /etc/pve/qemu-server/<vmid>.conf",
"description": "Редактировать файл конфигурации ВМ напрямую (vi)"
},
{
"command": "vi /etc/pve/lxc/<ctid>.conf",
"description": "Редактировать файл конфигурации контейнера напрямую (vi)"
}
]
},
{
"title": "Управление виртуальными машинами",
"commands": [
{
"command": "qm start <vmid>",
"description": "Запустить виртуальную машину. Укажите правильный <vmid>"
},
{
"command": "qm stop <vmid>",
"description": "Принудительно остановить виртуальную машину. Укажите правильный <vmid>"
},
{
"command": "qm shutdown <vmid>",
"description": "Корректно завершить работу виртуальной машины"
},
{
"command": "qm reset <vmid>",
"description": "Выполнить аппаратную перезагрузку виртуальной машины"
},
{
"command": "qm suspend <vmid>",
"description": "Приостановить виртуальную машину"
},
{
"command": "qm resume <vmid>",
"description": "Возобновить работу приостановленной виртуальной машины"
},
{
"command": "qm destroy <vmid>",
"description": "Удалить ВМ (необратимо). Укажите правильный <vmid>"
}
]
},
{
"title": "Управление контейнерами",
"commands": [
{
"command": "pct start <ctid>",
"description": "Запустить контейнер. Укажите правильный <ctid>"
},
{
"command": "pct stop <ctid>",
"description": "Принудительно остановить контейнер. Укажите правильный <ctid>"
},
{
"command": "pct shutdown <ctid>",
"description": "Корректно завершить работу контейнера"
},
{
"command": "pct reboot <ctid>",
"description": "Перезапустить контейнер"
},
{
"command": "pct destroy <ctid>",
"description": "Удалить контейнер (необратимо). Укажите правильный <ctid>"
}
]
},
{
"title": "Операции с контейнерами",
"commands": [
{
"command": "pct exec <ctid> -- getent passwd | column -t -s :",
"description": "Показать пользователей контейнера в виде таблицы"
},
{
"command": "pct exec <ctid> -- ps aux --sort=-%mem | head",
"description": "Процессы контейнера с наибольшим потреблением памяти"
},
{
"command": "pct enter <ctid>",
"description": "Войти в командную оболочку контейнера"
},
{
"command": "pct push <ctid> <source> <dest>",
"description": "Скопировать файл с хоста в контейнер"
},
{
"command": "pct pull <ctid> <source> <dest>",
"description": "Скопировать файл из контейнера на хост"
}
]
}
],
"destroyWarn": {
"title": "Удаление необратимо",
"bodyRich": "<code>qm destroy</code> и <code>pct destroy</code> удаляют конфигурацию гостевой системы и относящиеся к ней управляемые дисковые тома. Не считайте, что внешние данные или данные, подключённые через bind-монтирование, также удаляются. По умолчанию CLI не запрашивает подтверждение. Перед выполнением команды создайте резервную копию всех данных, которые могут вам понадобиться; см. <backupLink>Резервное копирование и восстановление</backupLink>."
},
"qmConfigTip": {
"title": "qm config и прямое редактирование файла .conf",
"bodyRich": "<code>qm config &lt;vmid&gt;</code> и <code>pct config &lt;ctid&gt;</code> отображают конфигурацию с помощью синтаксических анализаторов Proxmox. Для обычных изменений предпочтительнее использовать <code>qm set</code> или соответствующую команду pct для задания параметров. Прямое редактирование <code>/etc/pve/qemu-server/&lt;vmid&gt;.conf</code> или <code>/etc/pve/lxc/&lt;ctid&gt;.conf</code> обходит проверки и блокировки, предусмотренные командами управления; при этом файл должен оставаться синтаксически корректным. Перед ручным исправлением остановите гостевую систему и сохраните копию файла. <code>pmxcfs</code> синхронизирует конфигурацию между узлами кластера, но не содержимое дисков гостевых систем."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/help-info/backup-commands",
"label": "Резервное копирование и восстановление",
"tail": " — vzdump и qmrestore / pct restore."
},
{
"href": "/docs/help-info/storage-commands",
"label": "Хранилища и диски",
"tail": " — qm importdisk и управление дисками."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
@@ -0,0 +1,227 @@
{
"meta": {
"title": "Команды ZFS в Proxmox — zpool, zfs snapshot, send/receive, scrub | ProxMenux",
"description": "Справочник по командам управления ZFS в Proxmox VE: zpool create / status / history, zfs list / get / set, снимки, clone, zfs send и receive, scrub, clear, replace, zpool iostat, сводка по ARC.",
"ogTitle": "Команды ZFS в Proxmox — zpool, zfs snapshot, send/receive, scrub",
"ogDescription": "Справочник по командам zpool и zfs в Proxmox VE — пулы, наборы данных, снимки, репликация, обслуживание.",
"twitterTitle": "Команды ZFS в Proxmox | ProxMenux",
"twitterDescription": "Команды zpool и zfs для Proxmox VE: пулы, наборы данных, снимки, репликация, обслуживание."
},
"header": {
"title": "Управление ZFS",
"description": "Подборка справочных сведений по командам zpool и zfs: проверка пулов, создание, чтение, изменение и удаление наборов данных, снимки, clone и send/receive (инкрементальные и рекурсивные операции), scrub / clear / replace для обслуживания, а также статистика ввода-вывода и сводка по ARC.",
"section": "Справка и информация"
},
"intro": {
"title": "Две группы команд",
"body": "<code>zpool *</code> управляет пулами хранения (физический уровень — диски, vdev, избыточность). <code>zfs *</code> управляет наборами данных и снимками внутри этих пулов (логический уровень — файловые системы, тома, снимки, свойства)."
},
"commandGroups": [
{
"title": "Информация о пулах",
"commands": [
{
"command": "zpool list",
"description": "Вывести список всех пулов ZFS"
},
{
"command": "zpool status",
"description": "Показать подробные сведения о состоянии и работоспособности пула"
},
{
"command": "zpool status -v",
"description": "Показать расширенные сведения о состоянии пула, включая ошибки"
},
{
"command": "zpool history",
"description": "Показать историю команд для всех пулов"
},
{
"command": "zpool history <pool>",
"description": "Показать историю команд для указанного пула"
},
{
"command": "zpool get all <pool>",
"description": "Показать все свойства пула"
}
]
},
{
"title": "Управление наборами данных",
"commands": [
{
"command": "zfs list",
"description": "Вывести список всех наборов данных ZFS"
},
{
"command": "zfs list -r <pool>",
"description": "Рекурсивно вывести список всех наборов данных в пуле"
},
{
"command": "zfs create <pool>/<dataset>",
"description": "Создать новый набор данных"
},
{
"command": "zfs destroy <pool>/<dataset>",
"description": "Удалить набор данных"
},
{
"command": "zfs rename <pool>/<dataset> <pool>/<new-name>",
"description": "Переименовать набор данных"
},
{
"command": "zfs get all <pool>/<dataset>",
"description": "Показать все свойства набора данных"
},
{
"command": "zfs set compression=on <pool>/<dataset>",
"description": "Включить сжатие для набора данных"
}
]
},
{
"title": "Управление снимками",
"commands": [
{
"command": "zfs list -t snapshot",
"description": "Показать список всех снимков"
},
{
"command": "zfs list -t snapshot -r <pool>",
"description": "Показать список всех снимков в пуле"
},
{
"command": "zfs snapshot <pool>/<dataset>@<snapshot-name>",
"description": "Создать снимок"
},
{
"command": "zfs destroy <pool>/<dataset>@<snapshot-name>",
"description": "Удалить снимок"
},
{
"command": "zfs rollback <pool>/<dataset>@<snapshot-name>",
"description": "Выполнить откат к снимку"
},
{
"command": "zfs hold <tag> <pool>/<dataset>@<snapshot-name>",
"description": "Установить удержание снимка"
},
{
"command": "zfs release <tag> <pool>/<dataset>@<snapshot-name>",
"description": "Снять удержание снимка"
}
]
},
{
"title": "Клонирование, отправка и приём",
"commands": [
{
"command": "zfs clone <pool>/<dataset>@<snapshot> <pool>/<clone-name>",
"description": "Создать клон из снимка"
},
{
"command": "zfs send <pool>/<dataset>@<snapshot> > backup.zfs",
"description": "Отправить снимок в файл"
},
{
"command": "zfs receive <pool>/<dataset> < backup.zfs",
"description": "Принять снимок из файла"
},
{
"command": "zfs send -i <pool>/<dataset>@<snap1> <pool>/<dataset>@<snap2> > incr.zfs",
"description": "Отправить инкрементальный снимок"
},
{
"command": "zfs send -R <pool>/<dataset>@<snapshot> > full-recursive.zfs",
"description": "Отправить рекурсивный снимок"
}
]
},
{
"title": "Обслуживание и исправление ошибок",
"commands": [
{
"command": "zpool scrub <pool>",
"description": "Запустить проверку целостности данных в пуле"
},
{
"command": "zpool scrub -s <pool>",
"description": "Остановить выполняющуюся проверку целостности данных"
},
{
"command": "zpool clear <pool>",
"description": "Сбросить счётчики ошибок в пуле"
},
{
"command": "zpool clear <pool> <device>",
"description": "Сбросить ошибки на определённом устройстве"
},
{
"command": "zpool replace <pool> <old-device> <new-device>",
"description": "Заменить неисправное устройство"
},
{
"command": "zpool offline <pool> <device>",
"description": "Отключить устройство"
},
{
"command": "zpool online <pool> <device>",
"description": "Вернуть устройство в рабочий режим"
}
]
},
{
"title": "Производительность и мониторинг",
"commands": [
{
"command": "zpool iostat",
"description": "Показать статистику ввода-вывода для пулов"
},
{
"command": "zpool iostat -v",
"description": "Показать подробную статистику ввода-вывода"
},
{
"command": "zpool iostat 5",
"description": "Показывать статистику ввода-вывода каждые 5 секунд"
},
{
"command": "arc_summary",
"description": "Показать статистику ARC (если соответствующая утилита установлена)"
},
{
"command": "zfs get compressratio <pool>/<dataset>",
"description": "Показать коэффициент сжатия"
},
{
"command": "zfs get used,available,referenced <pool>/<dataset>",
"description": "Показать использование дискового пространства"
}
]
}
],
"bestPractices": {
"title": "Рекомендации по эксплуатации",
"bodyRich": "Запланируйте регулярный запуск <code>zpool scrub</code> для проверки контрольных сумм и проверяйте результаты. Поддерживайте запас свободного места: влияние почти заполненного пула зависит от рабочей нагрузки и схемы организации. Используйте <code>zpool replace</code> для замены вышедшего из строя устройства и следуйте процедуре для соответствующего типа vdev. Отсоединение с последующим добавлением не является равноценной процедурой замены и может изменить топологию или привести к потере избыточности."
},
"related": {
"heading": "Связанные материалы",
"items": [
{
"href": "/docs/help-info/storage-commands",
"label": "Хранилища и диски",
"tail": " — общие команды для работы с блочными устройствами и LVM."
},
{
"href": "/docs/help-info/backup-commands",
"label": "Резервное копирование и восстановление",
"tail": " — vzdump, qmrestore."
},
{
"href": "/docs/help-info",
"label": "Обзор раздела «Помощь и информация»",
"tail": "."
}
]
}
}
+93
View File
@@ -0,0 +1,93 @@
{
"meta": {
"title": "Установка ProxMenux | Документация ProxMenux",
"description": "Установка ProxMenux одной командой на узлах Proxmox VE версии 8 и выше. Включает предварительно сгенерированные каталоги JSON для восьми языков: английского, испанского, французского, немецкого, итальянского, португальского, словацкого и шведского. Выберите язык во время установки или измените его позже в настройках. Бета-канал предоставляет ранний доступ к новым функциям.",
"ogTitle": "Установка ProxMenux | Документация ProxMenux",
"ogDescription": "Установите ProxMenux на Proxmox VE версии 8 и выше одной командой. Доступны стабильный и бета-каналы."
},
"header": {
"title": "Установка ProxMenux",
"description": "Установщик, запускаемый одной строкой на любом узле Proxmox VE версии 8 и выше. Автоматически устанавливает необходимые зависимости, загружает скрипты, настраивает средство запуска меню и при первом запуске предлагает выбрать язык. Доступны два канала установки: стабильный (по умолчанию) и бета.",
"section": "Установка"
},
"stable": {
"heading": "Установка",
"intro": "Выполните следующую команду в терминале узла Proxmox:",
"code": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\""
},
"during": {
"heading": "Во время установки",
"intro": "ProxMenux автоматически устанавливает и настраивает необходимые зависимости:",
"tablePackage": "Пакет",
"tablePurpose": "Назначение",
"rows": [
{
"package": "dialog",
"purpose": "Интерактивные меню в терминале"
},
{
"package": "curl",
"purpose": "Загрузка файлов и проверка подключения"
},
{
"package": "jq",
"purpose": "Обработка JSON"
},
{
"package": "git",
"purpose": "Клонирование и обновление репозиториев"
}
],
"outro": "Установщик также загружает дерево скриптов в <code>/usr/local/share/proxmenux/</code> и создаёт средство запуска по пути <code>/usr/local/bin/menu</code>. Веб-панель <strong>ProxMenux Monitor</strong> регистрируется как <code>proxmenux-monitor.service</code>.",
"imageAlt": "Выполняется установка ProxMenux"
},
"first": {
"heading": "Первый запуск",
"intro": "После установки выполните:",
"code": "menu",
"outro": "После запуска ProxMenux откроется главное меню. Отсюда можно запустить любой из сценариев, описанных на этом сайте. На новом хосте Proxmox лучше начать с раздела <postlink>Настройка после установки</postlink>."
},
"beta": {
"heading": "Канал бета-версий",
"calloutTitle": "Что такое программа бета-тестирования?",
"calloutBody": "Хотите опробовать новые функции до официального выпуска и помочь улучшить итоговую версию? Программа бета-тестирования ProxMenux предоставляет ранний доступ к новым возможностям, включая новейшие сборки ProxMenux Monitor, непосредственно из ветки <code>develop</code>. Бета-сборки могут содержать ошибки или незавершённые функции. Ваши отзывы помогают устранить эти проблемы до выпуска стабильной версии.",
"intro": "Чтобы установить бета-версию вместо стабильной, выполните:",
"code": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/develop/install_proxmenux_beta.sh)\"",
"outro": "Переход на бета-версии выполняется только по вашему выбору: для этого нужно явно запустить установщик бета-версии. После выхода стабильной версии при следующем запуске <code>menu</code> предложит её установить через обычный запрос на обновление. Чтобы выйти из канала бета-версий, выберите <betalink>Изменить канал выпусков</betalink> в настройках и укажите стабильный канал."
},
"updating": {
"heading": "Обновление",
"body": "ProxMenux поддерживает самообновление. Когда доступна новая версия, при следующем запуске <code>menu</code> предлагает обновиться; при согласии файлы и конфигурации утилиты заменяются на месте. Загружать обновление вручную не нужно. Пользователи стабильного канала получают стабильные выпуски; пользователи бета-канала получают бета-сборки, а также предложения установить новые стабильные выпуски. Вид запроса зависит от того, где запущен <code>menu</code>: при работе через SSH или консоль Proxmox это обычный диалог «да / нет», и при согласии обновление применяется немедленно. В терминале WebSocket в ProxMenux Monitor вместо него отображается информационное окно msgbox: этот терминал не может продолжить работу при самообновлении, поэтому в окне показывается стандартная однострочная команда установки (<code>bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"</code> для стабильной версии или аналогичный URL <code>install_proxmenux_beta.sh</code> для бета-версии), которую нужно выполнить через SSH или консоль."
},
"uninstall": {
"heading": "Удаление",
"body": "В интерфейсе ProxMenux: <strong>Settings → Uninstall ProxMenux</strong>. Удаляет дерево скриптов, средство запуска и службу Monitor, при желании удаляет выбранные зависимости и восстанавливает <code>/root/.bashrc</code> и <code>/etc/motd</code> из резервных копий, созданных при настройке после установки, если эти копии существуют (в противном случае удаляет строку ProxMenux из MOTD). Полная пошаговая инструкция: <uninstalllink>Удаление ProxMenux</uninstalllink>."
},
"troubleshoot": {
"heading": "Устранение неполадок",
"virustotalTitle": "VirusTotal помечает URL установщика как подозрительный",
"virustotalBody": "Результат 1/95 от <em>Chong Lua Dao</em>, о котором сообщалось в Issue #162, был признан сопровождающим проекта ложным срабатыванием. Установщик запускается командой, которая загружает и выполняет скрипт (<code>bash -c \"$(wget -qLO - …)\"</code>), и может загрузить <code>jq</code> из официального выпуска на GitHub. Такое <em>поведение</em> может вызывать срабатывание эвристических сканеров. Этот прежний отчёт не является оценкой всех будущих загрузок. Исходный код установщика открыт и доступен для проверки. Подробнее — в <issuelink>Issue #162</issuelink>.",
"aptTitle": "Установка завершается с ошибками apt",
"aptBody": "Обычно причина в отсутствующем или неправильно настроенном репозитории Proxmox. Установщик загружает зависимости через apt; если конфигурация репозиториев некорректна (это часто бывает на минимальных установках Proxmox 8, которые ещё не обновлялись), apt завершается с ошибкой. Сначала выполните <code>apt-get update</code> вручную и устраните все ошибки, затем снова запустите установщик.",
"menuTitle": "`menu: command not found` после установки",
"menuBody": "Файл запуска находится по пути <code>/usr/local/bin/menu</code>. Проверьте, есть ли он там: <code>ls -lh /usr/local/bin/menu</code>. Если файла нет, установка завершилась преждевременно — запустите установщик повторно. Если файл есть, но не находится при запуске, ваш PATH не содержит <code>/usr/local/bin</code>; исправьте PATH или запустите файл напрямую: <code>/usr/local/bin/menu</code>.",
"stuckTitle": "Установка зависает или не продвигается",
"stuckBody": "Если установка, переустановка или обновление зависает из-за проблем с соединением, прервите процесс сочетанием <strong>Ctrl + C</strong> и снова запустите установщик вручную.",
"otherTitle": "Другие проблемы",
"otherBody": "Проверьте раздел <issueslink>GitHub Issues</issueslink> на наличие известных проблем или создайте новое обращение с соответствующим фрагментом журнала. Пользователям бета-версии: если проблема связана с Monitor, добавьте <code>journalctl -u proxmenux-monitor -n 50</code>."
},
"next": {
"heading": "Что дальше",
"postInstall": "<postlink>Скрипт послеустановочной настройки</postlink> — настройка и усиление защиты только что установленного хоста Proxmox.",
"introduction": "<introlink>Введение</introlink> — полный обзор возможностей.",
"monitor": "<monitorlink>ProxMenux Monitor</monitorlink> — веб-панель хоста (устанавливается автоматически вместе с меню)."
},
"requirements": {
"heading": "Требования и рекомендации",
"reqTitle": "Требования",
"reqBody": "Proxmox VE <strong>8.x или новее</strong>. PVE 7 и более ранние версии не поддерживаются. Хосту необходим доступ в интернет (установщик загружает скрипты, зависимости и ProxMenux Monitor в формате AppImage). Запускайте от имени <strong>root</strong> на хосте Proxmox.",
"inspectTitle": "Всегда проверяйте скрипты из интернета перед запуском",
"inspectReview": "Перед запуском <sourcelink>изучите исходный код установщика</sourcelink>.",
"inspectCoc": "Все ссылки на исполняемые скрипты соответствуют <coclink>кодексу поведения ProxMenux</coclink>."
}
}
+206
View File
@@ -0,0 +1,206 @@
{
"meta": {
"title": "ProxMenux — инструмент с меню для управления Proxmox VE | Открытый исходный код",
"description": "Инструмент с открытым исходным кодом и управлением через меню для администрирования Proxmox VE. ProxMenux объединяет две части в одном проекте: CLI/TUI для послеустановочной настройки, создания виртуальных машин и LXC, проброса GPU и TPU Coral, работы с дисками, хранилищами и сетью; и веб-панель на собственном сервере с проактивным мониторингом состояния, уведомлениями через Telegram / Discord / электронную почту, переформулированием текста с помощью ИИ и REST API.",
"ogTitle": "ProxMenux — инструмент с меню для управления Proxmox VE",
"ogDescription": "CLI/TUI с открытым исходным кодом и веб-панель для Proxmox VE. Послеустановочная настройка, виртуальные машины, GPU, диски, сеть, хранилища, безопасность — и отдельный Monitor с проверками состояния, уведомлениями, переформулированием текста с помощью ИИ и REST API.",
"twitterTitle": "ProxMenux — инструмент с меню для управления Proxmox VE",
"twitterDescription": "CLI/TUI с открытым исходным кодом и веб-панель для Proxmox VE. Мониторинг состояния, уведомления, переформулирование текста с помощью ИИ, REST API."
},
"header": {
"title": "Введение",
"description": "ProxMenux — инструмент с открытым исходным кодом и управлением через меню для Proxmox VE. Один проект объединяет две части: CLI/TUI для наиболее распространённых задач администрирования хоста, виртуальных машин, контейнеров, хранилищ, сети и безопасности; и веб-панель на собственном сервере с проактивным мониторингом состояния, уведомлениями, механизмом подключения ИИ для переформулирования текста и REST API.",
"section": "Введение"
},
"hero": {
"tagline": "<strong>Одно меню для всех задач.</strong> Всё, для чего обычно нужны открытая вкладка с вики, две темы на форуме и скопированная последовательность команд, — теперь доступно как пронумерованный пункт меню, который можно запустить за считаные секунды.",
"audience": "Создан для <em>начинающих</em> пользователей Proxmox (безопасные, заранее подобранные настройки по умолчанию) и <em>опытных</em> администраторов (меньше нажатий клавиш для задач, выполненных уже сотни раз). Бесплатный проект с открытым исходным кодом и активным сообществом на <github>GitHub</github>."
},
"twoProducts": {
"heading": "Два продукта, один проект",
"intro": "ProxMenux состоит из двух компонентов в одном дереве исходного кода. Установщик развёртывает оба на хосте: Scripts предоставляет терминальный интерфейс, а Monitor — веб-панель:",
"scripts": {
"title": "ProxMenux Scripts",
"body": "Исходный интерфейс CLI/TUI, запускаемый командой <code>menu</code>. Функциональные разделы охватывают оптимизацию после установки, создание виртуальных машин и LXC, проброс GPU и TPU Coral, диски, хранилища, приложения OCI, сеть, безопасность, утилиты, резервное копирование и восстановление хоста, Proxmox VE Helper Scripts, а также подборку справочных команд. Работает в любом терминале — локальном, SSH или веб-терминале."
},
"monitor": {
"title": "ProxMenux Monitor",
"body": "Веб-панель, размещаемая на вашем сервере (AppImage). Метрики хоста в реальном времени, проактивный мониторинг состояния, уведомления, необязательный механизм переформулирования текста с помощью ИИ (шесть провайдеров), встроенный веб-терминал и REST API. Установщик настраивает её как службу, запускаемую при загрузке; включить, отключить или проверить её состояние можно в меню Scripts (Settings → ProxMenux Monitor)."
},
"calloutTitle": "С чем работает ProxMenux",
"calloutIntro": "Три уровня, доступные в рамках одного проекта:",
"layers": [
"<strong>Хост Proxmox</strong> — репозитории, пакеты, сеть, ZFS, Ceph, ядро, средства наблюдаемости.",
"<strong>Виртуальные машины (VM)</strong> — создание, проброс GPU, импорт и экспорт OVA / OVF, проброс дисков.",
"<strong>Контейнеры LXC</strong> — создание, точки монтирования, проброс GPU / TPU, клиенты и серверы NFS / Samba."
]
},
"scriptsSection": {
"heading": "ProxMenux Scripts — доступные возможности",
"intro": "Основные функциональные разделы: у каждого есть собственное меню в <code>menu</code> и подробная страница в документации. Нажмите на любую карточку, чтобы сразу перейти к обзору соответствующего раздела.",
"items": [
{
"title": "После установки",
"description": "Оптимизация свежеустановленной системы Proxmox: репозитории, ядро, синхронизация времени, базовая безопасность, производительность — с возможностью отмены изменений.",
"icon": "Server",
"href": "/docs/post-install"
},
{
"title": "GPU и TPU Coral",
"description": "Проброс NVIDIA, Intel iGPU, AMD и TPU Coral в виртуальные машины и контейнеры LXC с переключением режимов между VM и LXC.",
"icon": "Cpu",
"href": "/docs/hardware/nvidia-host"
},
{
"title": "Создать ВМ",
"description": "Мастера создания систем NAS, Windows и Linux с разумными настройками оборудования, хранилищ и сети по умолчанию.",
"icon": "Server",
"href": "/docs/create-vm"
},
{
"title": "Диспетчер дисков",
"description": "Подключение физических дисков к виртуальным машинам и LXC, форматирование и очистка дисков, тесты SMART, импорт образов qcow2 / vmdk / vdi — через меню.",
"icon": "HardDrive",
"href": "/docs/disk-manager"
},
{
"title": "Хранилища и общий доступ",
"description": "Регистрация NFS, Samba (CIFS), iSCSI и локальных хранилищ в Proxmox; общий доступ к папкам между хостом и контейнерами LXC через bind-монтирование или сетевые протоколы.",
"icon": "Boxes",
"href": "/docs/storage-share"
},
{
"title": "Сеть",
"description": "Диагностика в режиме «только для чтения», анализ с последующими рекомендациями и пошаговое устранение неполадок для /etc/network/interfaces. Перед любым изменением обязательно создаётся резервная копия.",
"icon": "Network",
"href": "/docs/network"
},
{
"title": "Безопасность",
"description": "Fail2Ban (предотвращение вторжений для SSH и веб-интерфейсов) и Lynis (аудит защищённости) — установка и управление с разумными настройками по умолчанию.",
"icon": "Shield",
"href": "/docs/security"
},
{
"title": "Утилиты",
"description": "Создание ISO-образов Windows из UUP Dump, установка инструментов CLI, безопасное обновление системы, обновление PVE с версии 8 до 9, экспорт и импорт виртуальных машин в форматах OVA / OVF.",
"icon": "Wrench",
"href": "/docs/utils"
},
{
"title": "Справочник команд",
"description": "Подборка команд Linux и Proxmox, сгруппированных по темам: система, VM/CT (qm, pct), хранилища, сеть, ZFS, проброс GPU, резервное копирование, повседневные инструменты CLI.",
"icon": "BookOpen",
"href": "/docs/help-info"
}
]
},
"monitorSection": {
"heading": "ProxMenux Monitor — доступные возможности",
"intro": "Продукт с веб-панелью, размещаемый на хосте Proxmox и доступный через TCP-порт 8008. Нажмите на любую карточку, чтобы сразу перейти на страницу соответствующего раздела, или сначала прочитайте <link>обзор Monitor</link>.",
"items": [
{
"title": "Мониторинг состояния",
"description": "Сканирование десяти категорий каждые 5 минут (процессор, память, хранилище, диски/SMART, сеть, ВМ, службы, журналы, обновления, безопасность) с уровнями серьёзности и подавлением оповещений по отдельным категориям.",
"icon": "Activity",
"href": "/docs/monitor/health-monitor"
},
{
"title": "Уведомления",
"description": "Telegram, Discord, электронная почта, Gotify, Pushover и Apprise (несколько каналов) — с устранением дубликатов, интервалом между повторными уведомлениями, объединением всплесков уведомлений, тихими часами и полной историей.",
"icon": "Bell",
"href": "/docs/monitor/notifications"
},
{
"title": "ИИ-ассистент",
"description": "Необязательное переформулирование уведомлений простым языком. Шесть провайдеров: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter, локальный Ollama. В списке выбора языка ИИ доступны тринадцать языков.",
"icon": "Sparkles",
"href": "/docs/monitor/ai-assistant"
},
{
"title": "Веб-терминал",
"description": "Интерактивная командная оболочка на хосте Proxmox, доступная в браузере, и отдельный терминал ProxMenux Scripts для запуска меню через веб-интерфейс.",
"icon": "Terminal",
"href": "/docs/monitor/dashboard/terminal"
},
{
"title": "REST API",
"description": "Конечные точки HTTP для системы, состояния, хранилища / SMART, сети, ВМ, уведомлений и безопасности — полезны для Homepage, Home Assistant, Prometheus или собственных скриптов.",
"icon": "Code2",
"href": "/docs/monitor/api"
},
{
"title": "Интеграции",
"description": "Встроенный вебхук Proxmox VE, сбор метрик Prometheus, проверка Uptime Kuma, виджеты Homepage / Home Assistant / Glance, рабочие процессы n8n / Zapier, Tailscale Secure Gateway.",
"icon": "Plug",
"href": "/docs/monitor/integrations"
}
]
},
"installPaths": {
"heading": "Варианты установки",
"intro": "Оба установщика развёртывают Scripts и Monitor. Scripts использует заранее подготовленные каталоги JSON на восьми языках без онлайн-перевода. Выберите стабильный или бета-канал; Monitor поставляется в виде AppImage и запускается из распакованной среды выполнения:",
"headerPath": "Вариант установки",
"headerBundles": "Что входит в комплект",
"headerWhen": "Когда выбрать",
"rows": [
{
"pathRich": "<strong>Scripts: стабильная версия</strong>",
"bundles": "CLI/TUI с заранее подготовленными переводами в формате JSON на восьми языках; без виртуального окружения для перевода и без сервиса онлайн-перевода.",
"when": "Обычное использование со стабильным каналом выпуска."
},
{
"pathRich": "<strong>Scripts: бета-версия</strong>",
"bundles": "Тот же многоязычный интерфейс, установленный из ветки develop для тестирования предстоящих изменений.",
"when": "Раннее тестирование новых функций с повышенным риском ошибок."
},
{
"pathRich": "<strong>Monitor</strong>",
"bundles": "Самодостаточный AppImage с веб-панелью на TCP-порту 8008. Установщик распаковывает среду выполнения и управляет службой; управлять Monitor можно в настройках.",
"when": "Когда нужна веб-панель для хоста — на телефоне, планшете или во вкладке браузера"
}
],
"outro": "Подробные команды установки и предварительные требования приведены на <link>странице установки</link>."
},
"warnSource": {
"title": "Всегда проверяйте скрипты из интернета перед запуском",
"body": "ProxMenux — проект с открытым исходным кодом, и код каждого скрипта можно просмотреть на GitHub. Прежде чем выполнять команду установки, изучите исходный код. Поступайте так же с любым другим инструментом автоматизации.",
"sourceLabel": "Посмотреть исходный код ProxMenux",
"cocLabel": "Кодекс поведения"
},
"next": {
"heading": "Куда перейти дальше",
"items": [
{
"lead": "<strong>Впервые используете ProxMenux?</strong> ",
"linkHref": "/docs/installation",
"linkLabel": "Установите одной командой",
"tailRich": " и запустите <code>menu</code>."
},
{
"lead": "<strong>Только что установили Proxmox?</strong> Начните с ",
"linkHref": "/docs/post-install",
"linkLabel": "Скрипт послеустановочной настройки",
"tail": "."
},
{
"lead": "<strong>Нужна веб-панель?</strong> ",
"linkHref": "/docs/monitor",
"linkLabel": "ProxMenux Monitor",
"tail": " — документация объясняет, что отображает эта панель, как она устроена и как её защитить."
},
{
"lead": "<strong>Ищете конкретную команду?</strong> ",
"linkHref": "/docs/help-info",
"linkLabel": "Справочник команд",
"tail": " — каталог тщательно отобранных команд, сгруппированных по темам, с кнопками копирования."
},
{
"lead": "<strong>Нужны подробные пошаговые руководства?</strong> ",
"linkHref": "/guides",
"linkLabel": "Раздел руководств",
"tail": " охватывает Coral TPU, проброс NVIDIA, Kodi LXC и другие темы."
}
]
}
}
@@ -0,0 +1,396 @@
{
"meta": {
"title": "Аутентификация в панели Proxmox — 2FA, токены API, профиль пользователя, обратный прокси | ProxMenux Monitor",
"description": "Доступ к ProxMenux Monitor и его защита: настройка защиты панели при первом запуске, аутентификация по паролю с отображаемым именем и аватаром, страница профиля, подключение двухфакторной аутентификации TOTP, долгосрочные токены API для скриптов, настройка HTTPS, фрагменты конфигурации обратного прокси для Nginx, Caddy и Traefik, журнал аудита и необязательная конфигурация jail для Fail2Ban.",
"ogTitle": "Аутентификация в панели Proxmox — 2FA, токены API, обратный прокси",
"ogDescription": "Защитите ProxMenux Monitor с помощью пароля и TOTP 2FA, долгоживущих токенов API, HTTPS, фрагментов конфигурации обратного прокси и необязательного jail Fail2Ban.",
"twitterTitle": "Аутентификация в панели Proxmox | ProxMenux Monitor",
"twitterDescription": "Пароль и TOTP 2FA, токены API, HTTPS, фрагменты конфигурации Nginx/Caddy/Traefik и журнал аудита."
},
"header": {
"title": "Доступ и аутентификация",
"description": "Доступ к панели, настройка защиты при первом запуске и все уровни защиты между злоумышленником и хостом: пароль и TOTP, сеансы JWT, долгоживущие токены API, HTTPS, обратные прокси, Secure Gateway и необязательный jail Fail2Ban.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "Аутентификация включается по желанию",
"body": "При первом запуске панель показывает одно диалоговое окно — <em>«Защитить панель?»</em> — с двумя кнопками: <strong>Да, настроить пароль</strong> и <strong>Нет, продолжить без защиты</strong>. При отказе все конечные точки API остаются открытыми на TCP-порту 8008 — это допустимо в изолированной локальной сети лаборатории, но опасно в любых других условиях. Двухфакторная аутентификация (2FA) <strong>не</strong> входит в эту первоначальную настройку; её настраивают позже на <strong>вкладке «Безопасность»</strong> после установки пароля."
},
"reaching": {
"heading": "Доступ к панели",
"intro": "ProxMenux Monitor прослушивает TCP-порт 8008 на всех интерфейсах (<code>::</code>, IPv4 и IPv6). Есть три распространённых способа получить доступ к панели:",
"outro": "Прямой доступ соответствует настройкам службы systemd по умолчанию. Доступ через обратный прокси и Secure Gateway описан ниже. Чтобы доверять IP-адресам клиентов в <code>X-Forwarded-For</code>, необходимы PROXMENUX_TRUST_PROXY=1 и прокси-сервер под вашим контролем. Само по себе наличие <code>X-Forwarded-Proto</code> или <code>X-Forwarded-Host</code> не включает доверие к прокси. На портах 80/443 интерфейс использует относительные URL-адреса <code>/api/*</code>; на любом другом порту он обращается к порту 8008 на том же хосте."
},
"firstLaunch": {
"heading": "Порядок действий при первом запуске",
"intro": "При первом открытии панели интерфейс вызывает <code>GET /api/auth/status</code>. Если конфигурация аутентификации ещё ни разу не сохранялась (<code>configured: false</code>), появляется одно диалоговое окно с заголовком <em>«Защитить панель?»</em> и двумя вариантами:",
"imageAlt": "Диалоговое окно первого запуска «Защитить панель?» с двумя кнопками: «Да, задать пароль» и «Нет, продолжить без защиты»",
"imageCaption": "Выбор режима аутентификации при первом запуске. Две кнопки — включить защиту паролем или пропустить. Диалог появляется снова после новой установки или выбора пункта «Отключить аутентификацию» в настройках.",
"headerButton": "Кнопка",
"headerWhat": "Что происходит",
"headerApi": "Вызов API",
"rows": [
{
"button": "Да, задать пароль",
"what": "Открывает форму с обязательными полями имени пользователя и пароля, а также необязательными полями <em>отображаемого имени</em> и <em>изображения аватара</em>. Включает аутентификацию в <code>auth.json</code> с помощью <code>enabled: true</code> и возвращает JWT для входа в систему. Необязательные поля профиля сохраняются последующими вызовами, как описано ниже.",
"api": "POST /api/auth/setup"
},
{
"button": "Нет, продолжить без защиты",
"what": "Устанавливает <code>declined: true</code> в <code>auth.json</code>. Все конечные точки API остаются общедоступными, пока вы не измените это решение в настройках.",
"api": "POST /api/auth/skip"
}
],
"twofaCalloutTitle": "2FA настраивается позже, не здесь",
"twofaCalloutBody": "Диалоговое окно первого запуска позволяет только решить, нужна ли защита паролем. <strong>Двухфакторная аутентификация (TOTP)</strong> настраивается позже на <strong>вкладке «Безопасность»</strong> после входа с паролем. Полная пошаговая инструкция по настройке TOTP приведена ниже на этой странице.",
"createTitle": "Создание первого пользователя",
"createIntro": "Нажатие <em>«Да, задать пароль»</em> открывает единую форму для создания учётной записи и, при желании, первоначального заполнения профиля пользователя, чтобы аватар появился в шапке сразу после сохранения. Форма содержит следующие поля:",
"headerField": "Поле",
"headerRequired": "Обязательное",
"headerNotes": "Примечания",
"fieldRows": [
{
"field": "Имя пользователя",
"required": "Да",
"notes": "Идентификатор для входа. Впоследствии его нельзя изменить через интерфейс; для изменения нужно напрямую отредактировать <code>auth.json</code>."
},
{
"field": "Пароль",
"required": "Да",
"notes": "Не менее 10 символов как минимум из 3 категорий из 4 (строчные буквы, прописные буквы, цифры, специальные символы). Пароли из короткого списка очевидных вариантов (<code>password</code>, <code>12345678</code>, <code>proxmenux</code>…) отклоняются сразу. Те же правила действуют на стороне сервера, поэтому вызов curl не позволяет обойти проверку интерфейса."
},
{
"field": "Отображаемое имя",
"required": "Нет",
"notes": "Отображаемое имя в раскрывающемся меню в заголовке и на странице профиля. Если поле пустое, используется имя пользователя. Отображаемое имя можно изменить позже через меню <strong>Avatar → View profile</strong>."
},
{
"field": "Изображение аватара",
"required": "Нет",
"notes": "PNG, JPEG, WebP или GIF размером до 2 МБ. Отображается в виде круга в шапке и на странице профиля. Если изображение не задано, в шапке отображается первая буква отображаемого имени (или имени пользователя) на цветном круге. Позже аватар можно загрузить, заменить или удалить на странице профиля."
}
],
"createImageAlt": "Форма создания пользователя с обязательными полями имени пользователя и пароля, а также необязательным разделом для отображаемого имени и загрузки аватара",
"createImageCaption": "Форма создания пользователя при первом запуске. Отображаемое имя и аватар необязательны: если оставить их пустыми, учётная запись будет создана, а в шапке появится круг с одной буквой.",
"saveCalloutTitle": "Одно сохранение — три вызова API за кулисами",
"saveCalloutBody": "Сначала форма отправляет <code>POST /api/auth/setup</code> (имя пользователя и пароль). В случае успеха она использует только что выданный JWT для последующих вызовов <code>PUT /api/auth/profile</code> (отображаемое имя) и <code>POST /api/auth/profile/avatar</code> (байты аватара), если соответствующие поля были заполнены. Ошибки при вызовах для настройки профиля не являются критическими: учётная запись уже создана, и заполнить профиль можно позже на отдельной странице.",
"avatarTitle": "Меню аватара и страница профиля",
"avatarBody1": "После настройки аутентификации в правом верхнем углу каждой страницы панели мониторинга, рядом с переключателем темы, появляется круглый аватар. Нажатие на него открывает небольшое раскрывающееся меню со ссылками на страницу профиля и вкладку «Безопасность», а также действием <strong>Выйти</strong>. Завершить сеанс можно как отсюда, так и со вкладки «Безопасность» — в зависимости от того, что удобнее в данный момент.",
"avatarBody2": "Сама страница профиля представляет собой небольшую карточку с предварительным просмотром аватара, именем пользователя (только для чтения) и отображаемым именем с кнопкой редактирования рядом с ним. Загрузка, замена и удаление аватара выполняются атомарно: после успешного завершения любой из этих операций аватар в шапке обновляется автоматически, поэтому перезагружать страницу не нужно. И форма создания пользователя, и страница профиля используют один и тот же набор конечных точек, описанный в следующем разделе.",
"profileImageAlt": "Страница профиля с круглым предварительным просмотром аватара, кнопками «Загрузить», «Заменить» и «Удалить», именем пользователя только для чтения и редактируемым полем отображаемого имени",
"profileImageCaption": "Отдельная страница профиля. Имя пользователя доступно только для чтения; отображаемое имя и аватар можно изменить здесь, не переходя на вкладку «Безопасность».",
"headerEndpoint": "Конечная точка",
"headerEpWhat": "Назначение",
"endpointRows": [
{
"endpoint": "GET /api/auth/profile",
"what": "Возвращает текущее имя пользователя, отображаемое имя и сведения о том, задан ли аватар (<code>has_avatar</code>, <code>avatar_mtime</code>)."
},
{
"endpoint": "PUT /api/auth/profile",
"what": "Обновляет отображаемое имя. Тело запроса: <code>'{' \"display_name\": \"...\" '}'</code>."
},
{
"endpoint": "GET /api/auth/profile/avatar",
"what": "Возвращает байты аватара (PNG / JPEG / WebP / GIF) с соответствующим типом содержимого. Требуется заголовок Bearer: интерфейс получает изображение как blob и создаёт для него локальный объектный URL для отображения."
},
{
"endpoint": "POST /api/auth/profile/avatar",
"what": "Загружает новый аватар (не более 2 МБ). Тип содержимого должен соответствовать файлу. Старый аватар заменяется атомарно."
},
{
"endpoint": "DELETE /api/auth/profile/avatar",
"what": "Удаляет аватар. Вместо него в заголовке отображается заглушка с начальной буквой на цветном круге."
}
],
"reversibleTitle": "Защиту можно включить позже",
"reversibleBody": "После нажатия <em>Нет, продолжить без защиты</em> приветственное диалоговое окно больше не появляется. Вы можете снова включить аутентификацию на <strong>вкладке «Безопасность»</strong> в панели управления либо отредактировать <code>/root/.config/proxmenux-monitor/auth.json</code>, удалив флаг <code>declined</code>, а затем перезапустить службу."
},
"password": {
"heading": "Аутентификация по паролю",
"intro": "После настройки для защищённых вызовов API требуется JWT в <code>Authorization: Bearer &lt;token&gt;</code>:",
"items": [
"<strong>Токен сеанса (вход):</strong> срок действия — 24 часа. Выдаётся через <code>POST /api/auth/login</code>.",
"<strong>Токен API (интеграции):</strong> срок действия — 365 дней. Выдаётся через <code>POST /api/auth/generate-api-token</code>. Описан отдельно в следующем разделе."
],
"loginImageAlt": "Экран входа после настройки аутентификации — поля имени пользователя и пароля",
"loginImageCaption": "После настройки аутентификации каждое посещение панели управления начинается с этого экрана. Если включена 2FA, после принятия пароля на втором шаге запрашивается шестизначный код.",
"loginFlowTitle": "Процедура входа",
"twofaIntro": "Если включена 2FA, тот же вызов сначала возвращает <code>requires_totp: true</code>. Повторите запрос с шестизначным кодом:",
"publicTitle": "Общедоступные конечные точки (без токена)",
"publicIntro": "Конечные точки для входа, проверки состояния аутентификации и первоначальной настройки, а также облегчённая конечная точка <code>/api/system-info</code> общедоступны:",
"publicItems": [
"<code>/api/auth/login</code> и <code>/api/auth/status</code> общедоступны. <code>/api/auth/setup</code> создаёт первоначальную учётную запись и отклоняет попытки перезаписать существующие учётные данные.",
"<code>/api/system-info</code> — общедоступная облегчённая конечная точка, предоставляющая сведения о системе, включая <code>health.status</code>. К ней не применяется декоратор, требующий токен. /api/auth/status — ещё одна общедоступная конечная точка, подходящая для проверки доступности."
],
"cryptoTitle": "Криптография и хранение",
"cryptoIntro": "ProxMenux Monitor — проект с открытым исходным кодом: здесь нет никаких секретов. Подробное описание используемых технологий в этом разделе — осознанный выбор: пользователи, хранящие учётные данные на своём хосте, вправе знать, как эти данные защищены, прежде чем решить, можно ли доверять такой защите. Приведённые ниже алгоритмы — те же, что используются в коде <code>scripts/auth_manager.py</code>; этот раздел фиксирует обязательства, а не маркетинговые обещания.",
"headerAsset": "Защищаемые данные",
"headerAlgo": "Алгоритм",
"headerWhere": "Место хранения",
"cryptoRows": [
{
"asset": "Пароль",
"algorithm": "PBKDF2-HMAC-SHA256 со случайной солью для каждого пароля и большим числом итераций (базовые требования OWASP 2023+). Хранится в формате <code>pbkdf2_sha256$&lt;iters&gt;$&lt;salt&gt;$&lt;hash&gt;</code>.",
"where": "<code>auth.json</code> → <code>password_hash</code>"
},
{
"asset": "JWT сеанса / API",
"algorithm": "HS256 с подписью на основе уникального для каждой установки секрета, создаваемого при первом запуске (<code>secrets.token_urlsafe</code>, ≥48 байт). Токены содержат утверждения <code>iss=proxmenux-monitor</code> + <code>aud=api</code>; при каждом запросе подпись проверяется с использованием текущего секрета.",
"where": "Секрет: <code>auth.json</code> → <code>jwt_secret</code>. Сам JWT: только на клиенте."
},
{
"asset": "Метаданные токена API",
"algorithm": "Хеш SHA-256 токена JWT, хранящийся вместе с отпечатком <code>signed_with</code> секрета <code>jwt_secret</code>, использованного для его выпуска. Эти данные используются для отображения токена в интерфейсе и выявления токенов, секрет подписи которых был заменён.",
"where": "<code>auth.json</code> → <code>api_tokens[]</code>"
},
{
"asset": "Секрет TOTP для 2FA",
"algorithm": "Стандартный TOTP (RFC 6238) с секретом в кодировке base32. Восемь резервных кодов являются одноразовыми и хранятся в виде хешей SHA-256.",
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
},
{
"asset": "Отзыв токенов и сеансов",
"algorithm": "При отзыве токена или сеанса его хеш SHA-256 добавляется в список блокировки, который проверяется при каждой верификации (список кешируется в памяти примерно на 30 с, чтобы избежать чтения с диска на часто выполняемом пути обработки).",
"where": "<code>auth.json</code> → <code>revoked_tokens[]</code>"
}
],
"authJsonTitle": "auth.json — содержимое и защита",
"authJsonBody": "Все данные, необходимые ProxMenux Monitor для вашей аутентификации, хранятся в одном файле: <code>/root/.config/proxmenux-monitor/auth.json</code>, права доступа <code>0600</code>, владелец <code>root</code>. Файл содержит <em>хеши</em> (PBKDF2) и <em>материал для подписи</em> (<code>jwt_secret</code>, <code>totp_secret</code>), но никогда не содержит пароль в открытом виде. Обращайтесь с ним как с любым другим секретом, доступным только root: при резервном копировании или репликации хоста шифруйте целевое хранилище и никогда не добавляйте этот файл в систему контроля версий.",
"rotateTitle": "Замена jwt_secret делает все существующие JWT недействительными",
"rotateBody": "Если <code>auth.json</code> создаётся заново (после ручного удаления, переустановки или восстановления из резервной копии с другим секретом), <code>jwt_secret</code> изменяется, и все ранее выпущенные JWT — как интерактивные сеансы, так и долгоживущие токены API — не проходят проверку с сообщением «Недействительный токен или срок его действия истёк». В интерфейсе затронутые токены API выделяются красным цветом и снабжаются меткой с указанием отозвать их и создать новые; после этого Home Assistant, скриптам и любым внешним клиентам потребуется новый токен.",
"recoverTitle": "Восстановление доступа при утрате пароля",
"recoverIntro": "Онлайн-процедура «Забыли пароль?» намеренно не предусмотрена: панель работает на собственном хосте пользователя, а для восстановления доступа используется командная оболочка этого хоста. В ProxMenux предусмотрена пошаговая процедура сброса в меню настройки, поэтому редактировать <code>auth.json</code> вручную не нужно:",
"survivesTitle": "Что сохраняется после сброса",
"survivesBody": "Удаляются только данные для интерактивного входа. <code>jwt_secret</code> и зарегистрированные <code>api_tokens</code> сохраняются, поэтому Home Assistant и любые другие скрипты, использующие долгоживущий токен API, продолжают работать без перенастройки. Если вы хотите полностью сбросить данные (в том числе заменить секрет JWT), вручную удалите <code>auth.json</code> и перезапустите службу. При следующем запуске будет создан новый секрет, а все старые токены станут недействительными.",
"physicalTitle": "Требование физического доступа",
"physicalBody": "Для этого способа сброса требуется <strong>доступ к командной оболочке хоста с правами root</strong>. Это основа доверия всей схемы аутентификации: любой, кто может выполнить <code>menu</code> с правами root, уже может делать на этом хосте что угодно, поэтому возможность сброса пароля не расширяет его привилегии. Следствие: если вы предоставите недоверенному пользователю доступ к командной оболочке Proxmox, вход в Monitor не защитит ничего из того, что этот пользователь уже может уничтожить другими способами."
},
"twofa": {
"heading": "Двухфакторная аутентификация (TOTP)",
"intro": "2FA добавляет к паролю второй фактор: шестизначный код, который меняется каждые 30 секунд и генерируется на вашем телефоне или в вашем менеджере паролей. Даже получив пароль, посторонний не сможет войти без кода с вашего устройства. ProxMenux Monitor использует стандартный протокол <strong>TOTP</strong> (RFC 6238), поэтому подойдёт любое приложение-аутентификатор.",
"pickTitle": "Выберите приложение-аутентификатор",
"pickIntro": "Если у вас уже есть приложение для TOTP, его можно использовать и здесь. Ниже перечислены распространённые варианты. Некоторые из них бесплатны, другие требуют подписки; поддерживаемые платформы и способы резервного копирования также различаются.",
"headerApp": "Приложение",
"headerPlatforms": "Платформы",
"headerAppNotes": "Примечания",
"apps": [
{
"name": "Google Authenticator",
"href": "https://safety.google/authentication/",
"platforms": "iOS, Android",
"notes": "Стандартный выбор для многих пользователей. При желании можно сохранять резервную копию в облаке через аккаунт Google."
},
{
"name": "Microsoft Authenticator",
"href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app",
"platforms": "iOS, Android",
"notes": "Резервное копирование через аккаунт Microsoft. Также поддерживает push-уведомления Microsoft, если вы используете их на работе."
},
{
"name": "Authy",
"href": "https://authy.com/",
"platforms": "iOS, Android",
"notes": "Зашифрованная синхронизация между устройствами. Срок поддержки настольного приложения истёк 19 марта 2024 года; оно больше не поддерживается."
},
{
"name": "Apple Passwords",
"href": "https://support.apple.com/guide/passwords/welcome/mac",
"platforms": "iOS, iPadOS, macOS, visionOS, Windows (через iCloud)",
"notes": "Встроено в операционные системы Apple; отдельное приложение Passwords доступно начиная с iOS 18 / macOS Sequoia. Хранит TOTP вместе с паролем и синхронизирует их между устройствами через iCloud Keychain."
},
{
"name": "Bitwarden",
"href": "https://bitwarden.com/",
"platforms": "iOS, Android, настольные компьютеры, браузер",
"notes": "Открытый исходный код. TOTP можно хранить вместе с паролями в хранилище. Хранить и то и другое в одном хранилище удобно, но при этом второй фактор не выносится на отдельное устройство."
},
{
"name": "1Password",
"href": "https://1password.com/",
"platforms": "iOS, Android, настольные компьютеры, браузер",
"notes": "Тот же подход, что и в Bitwarden: TOTP интегрирован в хранилище паролей. Требуется подписка."
},
{
"name": "Aegis Authenticator",
"href": "https://getaegis.app/",
"platforms": "Android",
"notes": "Открытый исходный код. Зашифрованный файл резервной копии хранится на устройстве и находится под вашим контролем. Без облака; аккаунт не требуется."
},
{
"name": "Raivo OTP",
"href": "https://raivo-otp.com/",
"platforms": "iOS, macOS",
"notes": "Открытый исходный код. При желании можно включить синхронизацию через iCloud. Аналог Aegis для экосистемы Apple."
},
{
"name": "Ente Auth",
"href": "https://ente.io/auth/",
"platforms": "iOS, Android, настольные компьютеры, веб-интерфейс",
"notes": "Открытый исходный код. Облачная синхронизация между устройствами со сквозным шифрованием."
},
{
"name": "2FAS",
"href": "https://2fas.com/",
"platforms": "iOS, Android, расширение для браузера",
"notes": "Открытый исходный код. При желании можно сохранять зашифрованную резервную копию в облаке; расширение для браузера может автоматически подставлять коды."
},
{
"name": "FreeOTP+",
"href": "https://github.com/helloworld1/FreeOTPPlus",
"platforms": "Android",
"notes": "Форк FreeOTP с открытым исходным кодом для Android, с функциями импорта и экспорта. Учётная запись не требуется."
}
],
"backupTitle": "Для чего действительно нужна резервная копия",
"backupBody": "Если вы потеряете устройство с приложением-аутентификатором, используйте сохранённый резервный код или восстановите приложение из резервной копии, создание которой вы настроили заранее. Облачная синхронизация и локальный экспорт работают по-разному в разных приложениях; убедитесь, что выбранный способ действительно восстанавливает секретные ключи TOTP. Доступ root к хосту также позволяет восстановить доступ, как описано ниже. Храните отдельную резервную копию в безопасном месте.",
"setupTitle": "Пошаговая настройка через панель управления",
"setupImageAlt": "Экран настройки 2FA с QR-кодом и резервными кодами",
"setupImageCaption": "В диалоговом окне настройки 2FA отображаются QR-код, секретный ключ в формате Base32 для ручного ввода и, после проверки, восемь одноразовых резервных кодов. Скопируйте коды перед закрытием окна: повторно они не отображаются.",
"setupSteps": [
"<strong>Установите приложение-аутентификатор на телефон</strong> (или откройте менеджер паролей). Выберите одно из приложений в таблице выше. Это нужно сделать только один раз — одно и то же приложение будет хранить коды для всех сервисов, которые вы защищаете.",
"<strong>Войдите в панель управления</strong> с помощью имени пользователя и пароля.",
"<strong>Откройте вкладку «Безопасность»</strong> на боковой панели управления, затем нажмите <strong>Включить 2FA</strong> и <strong>Начать настройку</strong>. В диалоговом окне отображаются QR-код и ключ для ручного ввода; восемь резервных кодов появятся после проверки кода.",
"<strong>Добавьте запись в приложение-аутентификатор:</strong>",
"<strong>Для подтверждения введите текущий шестизначный код</strong> из приложения в поле «Код подтверждения» диалогового окна настройки и отправьте его. Коды обновляются каждые 30 секунд, поэтому, если срок действия кода истечёт во время ввода, просто введите следующий.",
"<strong>Сохраните резервные коды.</strong> После проверки сохраните все восемь кодов в безопасном месте: в менеджере паролей, зашифрованной заметке или в виде надёжно хранимой распечатки. Каждый код можно использовать один раз, если приложение-аутентификатор недоступно.",
"<strong>Готово.</strong> Теперь 2FA включена. При следующем входе панель управления сначала запросит пароль, а после его принятия — текущий шестизначный код."
],
"setupStep4Sub": [
"<em>Простой способ:</em> в приложении нажмите <em>Добавить учётную запись</em> → <em>Сканировать QR-код</em> и наведите камеру на QR-код на экране. Приложение автоматически присвоит записи имя (например, <code>ProxMenux Monitor (your-username)</code>) и начнёт показывать шестизначный код, обновляющийся каждые 30 секунд.",
"<em>Ручной ввод как запасной вариант</em> (если сканирование невозможно — например, при настройке на том же телефоне, на котором открыта панель управления): нажмите <em>Добавить учётную запись</em> → <em>Ввести ключ настройки</em>. Введите любое имя (например, <em>Proxmox Monitor</em>), вставьте строку Base32 из диалогового окна, оставьте для параметра <em>Тип</em> значение <em>На основе времени</em> и сохраните."
],
"testTitle": "Проверьте вход, прежде чем выходить",
"testBody": "Не закрывайте текущий сеанс и проверьте новый вход в приватном окне <em>сразу</em> после настройки. Если код отклонён, проверьте часы сервера и телефона, прежде чем выходить из работающего сеанса. Если доступ уже потерян, используйте резервный код или отредактируйте <code>auth.json</code> из командной оболочки хоста.",
"lostTitle": "Утрата доступа к приложению-аутентификатору",
"lostIntro": "Три способа восстановить доступ — от наименее радикального к наиболее радикальному:",
"lostItems": [
"<strong>Используйте резервный код.</strong> Введите один из восьми сохранённых кодов в поле TOTP. Его можно использовать только один раз; неиспользованные коды остаются действительными. После входа откройте раздел «Безопасность», выберите <strong>Отключить 2FA</strong>, а затем <strong>Включить 2FA</strong>, чтобы получить восемь новых кодов.",
"<strong>Восстановите приложение-аутентификатор из облака или резервной копии.</strong> Если ваше приложение поддерживает облачную синхронизацию (Google, Microsoft, Authy, Apple Passwords через iCloud Keychain, Ente, 2FAS), установите его на новое устройство и войдите в учётную запись — записи появятся снова. Если ваше приложение использует зашифрованный файл экспорта (Aegis, Raivo, FreeOTP+), установите приложение на новое устройство и импортируйте файл.",
"<strong>Отключите 2FA из командной оболочки хоста.</strong> Если предыдущие варианты недоступны, отредактируйте <code>/root/.config/proxmenux-monitor/auth.json</code> на хосте Proxmox (требуется доступ root через SSH или доступ к консоли), задайте для <code>totp_enabled</code> значение <code>false</code>, сохраните файл и перезапустите службу:"
],
"lostShellOutro": "Вы сможете войти, используя только имя пользователя и пароль, а затем снова включить 2FA в разделе «Настройки».",
"disableTitle": "Отключить 2FA",
"disableBody": "Откройте <strong>Безопасность</strong> и выберите <strong>Отключить 2FA</strong>. <code>POST /api/auth/totp/disable</code> требует ввода текущего пароля и действительного кода TOTP или резервного кода. При этом удаляются секрет TOTP и резервные коды. Также удалите старую запись из приложения-аутентификатора.",
"rejectedTitle": "Шестизначный код всегда отклоняется",
"rejectedIntro": "TOTP зависит от времени — расхождение между часами сервера и телефона не должно превышать примерно 30 с. Проверьте следующее:",
"rejectedItems": [
"<strong>Телефон:</strong> Settings → Date & Time → автоматическая синхронизация / синхронизация по сети ВКЛЮЧЕНА.",
"<strong>Хост Proxmox:</strong> <code>timedatectl status</code> — должна отображаться строка \"System clock synchronized: yes\". Если её нет, выполните <code>timedatectl set-ntp true</code> и подождите минуту."
],
"rejectedOutro": "Когда часы будут синхронизированы, код будет принят в следующем 30-секундном интервале."
},
"apiTokens": {
"heading": "Токены API (с длительным сроком действия)",
"intro": "Сеансы браузера истекают через 24 часа. Для интеграций, работающих без участия пользователя (виджеты Homepage, датчики Home Assistant, сборщики данных Grafana, проверки Uptime Kuma…), создаётся отдельный <strong>токен API</strong> со сроком действия 365 дней. Токен представляет собой JWT, подписанный тем же секретом, что и токен сеанса, но поле <code>token_name</code> позволяет легко отслеживать и отзывать каждый токен отдельно.",
"imageAlt": "Панель токенов API со списком токенов, их именами, префиксами, датами создания и истечения срока действия",
"imageCaption": "Список токенов API в разделе Admin → Security — имя, префикс (для идентификации отображаются последние 4 символа), даты создания и истечения срока действия, действие отзыва.",
"generateTitle": "Создание токена",
"generateIntro": "На панели управления:",
"generateSteps": [
"Откройте <strong>Admin → Security → API Tokens</strong> и нажмите <strong>Создать новый токен</strong>.",
"Введите понятное имя (<em>например, \"Home Assistant\"</em>).",
"Повторно введите пароль. Если 2FA включена, также введите текущий шестизначный код.",
"Нажмите <strong>Создать токен</strong>. Токен отображается <strong>только один раз</strong>: сразу скопируйте его."
],
"generateCli": "В командной строке:",
"useTitle": "Использование токена",
"revokeTitle": "Отзыв токена",
"revokeBody": "На панели выше в каждой строке есть действие <strong>Отозвать</strong>, которое добавляет хеш токена в <code>revoked_tokens</code> в <code>auth.json</code>. Отозванные токены сразу перестают проходить проверку при следующем запросе.",
"cheatTitle": "Памятка по безопасности токенов",
"cheatItems": [
"Храните токены в штатном хранилище секретов вашей интеграции — <code>secrets.yaml</code> в Homepage, <code>!secret</code> в Home Assistant, переменных окружения и т. д. Никогда не добавляйте их в коммиты git.",
"Используйте отдельный токен для каждой интеграции и называйте его по имени потребителя. При прекращении использования интеграции отзывайте её токен отдельно.",
"Выполняйте ротацию каждые 6–12 месяцев. Срок действия — строгое ограничение, а не рекомендация."
],
"outro": "Подробные рекомендации по работе с хранилищами и примеры интеграции приведены в <apiLink>API Reference → Token Management</apiLink> и <intLink>Интеграции</intLink>."
},
"https": {
"heading": "HTTPS",
"intro": "Два способа использования TLS:",
"items": [
"<strong>Обратный прокси (рекомендуется).</strong> Завершайте TLS-соединения на Nginx / Caddy / Traefik и перенаправляйте HTTP-трафик на порт 8008 процесса Flask. Примеры конфигурации приведены ниже.",
"<strong>Прямое подключение по HTTPS к AppImage.</strong> Настройте сертификат с помощью <code>POST /api/ssl/configure</code> (в интерфейсе: <strong>Admin → Security → SSL / HTTPS</strong>). Для HTTPS используется <code>gevent.pywsgi</code> со стандартным обработчиком; flask-sock обрабатывает переключение протокола WebSocket для WSS. Пути к сертификатам хранятся в конфигурации SSL."
],
"calloutTitle": "Ограничения прямого подключения по HTTPS",
"calloutBody": "Monitor может использовать сертификат, управляемый Proxmox, или пользовательские файлы сертификатов. Сам Monitor не выпускает сертификаты ACME. Для автоматического выпуска и продления используйте Proxmox ACME или обратный прокси, например Caddy, Traefik или Nginx, и убедитесь, что обновлённые сертификаты загружаются."
},
"gateway": {
"heading": "Secure Gateway (Tailscale)",
"intro": "Обратный прокси — один из способов обеспечить удалённый доступ. <strong>Secure Gateway</strong> предоставляет доступ без открытия TCP-порта 8008 для внешних подключений: он развёртывает Alpine LXC с запущенным <a>Tailscale</a> в качестве маршрутизатора подсетей. Доступ к IP-адресу узла в локальной сети зависит от одобренных маршрутов подсетей и правил доступа tailnet.",
"calloutTitle": "Почему это удобно",
"calloutBody": "Используйте URL-адрес в локальной сети <code>http://&lt;proxmox-lan-ip&gt;:8008</code> через утверждённый маршрут подсети. Маршрутизаторы подсети Tailscale по умолчанию используют SNAT, поэтому Monitor обычно видит адрес шлюза в локальной сети, а не адрес клиента <code>100.x.y.z</code>. Таким образом, в журналах и Fail2Ban указывается исходный адрес, который фактически видит хост.",
"deployBody": "Всё развёртывание выполняется на одном экране: выберите хранилище LXC на узле, вставьте ключ аутентификации Tailscale (созданный на <a>login.tailscale.com/admin/settings/keys</a>), выберите подсети для объявления и нажмите «Развернуть». Начальная настройка LXC занимает около 30 секунд, после чего регистрация в tailnet происходит автоматически.",
"outro": "Пошаговое развёртывание, настройка маршрутов подсетей, ACL Tailscale и режим Exit Node описаны отдельно в <link>Dashboard → Security → Secure Gateway</link> — именно там в интерфейсе панели управления находится мастер развёртывания. На этой странице рассматривается только схема доступа."
},
"proxy": {
"heading": "Примеры конфигурации обратного прокси",
"intro": "Используйте <strong>отдельное имя узла</strong>, например <code>monitor.example.com</code>, с перенаправлением на порт 8008 узла Proxmox. Примеры следуют этой схеме. Размещение по подпути, например <code>example.com/proxmenux-monitor/</code>, требует дополнительных изменений во фронтенде и прокси; одного удаления префикса для этого недостаточно.",
"nginxTitle": "Nginx",
"caddyTitle": "Caddy",
"traefikTitle": "Traefik (метки — Docker / Kubernetes)",
"subPathTitle": "Расширенная настройка: размещение по подпутям существующего домена",
"subPathBody": "В текущем фронтенде не настроен базовый подпуть, а вызовы API формируются с использованием URL <code>/api/*</code> относительно корня сайта. Простое удаление префикса, например <code>example.com/proxmenux-monitor/</code>, не обеспечивает корректную обработку этих вызовов API и всех ресурсов фронтенда. Используйте отдельное имя узла. Развёртывание по подпути требует согласованных изменений во фронтенде и прокси, а также отдельного тестирования."
},
"audit": {
"heading": "Журнал Audit",
"intro": "Неудачные попытки входа и предупреждения об ограничении частоты запросов записываются в <code>/var/log/proxmenux-auth.log</code> в однострочном формате. Успешные входы этот механизм журналирования не регистрирует:",
"outro": "Просматривайте новые записи обычным способом: <code>tail -F /var/log/proxmenux-auth.log</code>. Ротацию файла выполняет <code>logrotate</code>, если добавлен дополнительный файл конфигурации; сам Monitor ротацию не выполняет."
},
"fail2ban": {
"heading": "Необязательно: jail для Fail2Ban",
"calloutTitle": "Fail2Ban не входит в комплект Monitor",
"calloutBody": "Fail2Ban <strong>не</strong> устанавливается самим ProxMenux Monitor. Установите его через <link>Security → Fail2Ban</link> в меню ProxMenux (или с помощью стандартного пакета Debian). Без него Monitor по-прежнему ведёт указанный выше журнал аудита, но не блокирует автоматически повторных нарушителей.",
"intro": "Если Fail2Ban установлен, интеграция ProxMenux предоставляет jail <code>[proxmenux]</code>, который:",
"items": [
"Читает <code>/var/log/proxmenux-auth.log</code>.",
"Находит совпадения с шаблоном <code>authentication failure; rhost=&lt;ip&gt;</code> с помощью специального фильтра.",
"По умолчанию блокирует IP-адрес нарушителя на уровне межсетевого экрана ядра.",
"Обработчик Flask <code>before_request</code> проверяет запросы по списку блокировок, который кэшируется на 30 секунд. При работе за обратным прокси для блокировки по IP-адресу клиента также требуются PROXMENUX_TRUST_PROXY=1 и подконтрольный вам прокси, который задаёт достоверные заголовки переадресации."
],
"outro": "Настройка, изменение длительности блокировки и процедуры снятия блокировки описаны в <link>Security → Fail2Ban</link>."
},
"troubleshoot": {
"heading": "Устранение неполадок",
"noScreenTitle": "Экран первого запуска не появляется",
"noScreenBody": "Либо аутентификация уже настроена (<code>configured: true</code>), либо кто-то уже выбрал «Пропустить». Чтобы начать заново:",
"noScreenOutro": "Это удалит состояние аутентификации, включая все секреты TOTP и токены API. Сначала создайте резервную копию <code>auth.json</code>, если у вас есть токены, которые нужно сохранить.",
"tokenTitle": "HTTP 401 при каждом запросе с рабочим токеном API",
"tokenBody": "Срок действия токена истёк (ограничение — 365 дней) или токен попал в список <code>revoked_tokens</code>. Создайте новый токен в настройках и обновите интеграцию. Для проверки:",
"tokenOutro": "При использовании просроченных или отозванных токенов возвращается <code>'{'\"error\":\"Invalid or expired token\"'}'</code>.",
"no2faTitle": "Не удаётся войти после включения 2FA, приложения-аутентификатора нет под рукой",
"no2faBody": "Введите резервный код в поле TOTP. Если резервных кодов больше нет, отредактируйте <code>/root/.config/proxmenux-monitor/auth.json</code> из командной оболочки хоста, задайте для <code>totp_enabled</code> значение <code>false</code> и перезапустите службу.",
"wsTitle": "Обратный прокси работает, но соединение на вкладке терминала обрывается каждую минуту",
"wsBody": "Истекает тайм-аут бездействия WebSocket на прокси. Увеличьте тайм-аут чтения (Nginx: <code>proxy_read_timeout 86400s</code>; Traefik: <code>idleTimeout</code> в точке входа или промежуточном обработчике) и убедитесь, что <code>proxy_set_header Upgrade $http_upgrade</code> и <code>Connection \"upgrade\"</code> присутствуют."
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Справочник API → Управление токенами",
"href": "/docs/monitor/api",
"tail": " — полный жизненный цикл токенов API (создание / просмотр списка / отзыв), рекомендации по безопасности, подходы к хранению секретов."
},
{
"label": "Интеграции",
"href": "/docs/monitor/integrations",
"tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma, универсальный cURL."
},
{
"label": "Панель → Безопасность → Secure Gateway",
"href": "/docs/monitor/dashboard/security",
"tail": " — пошаговое развёртывание шлюза Tailscale LXC (маршруты подсетей, ACL, режим Exit Node)."
},
{
"label": "Безопасность → Fail2Ban",
"href": "/docs/security/fail2ban",
"tail": " — как установить и настроить необязательное изолированное окружение jail."
},
{
"label": "Настройки → ProxMenux Monitor",
"href": "/docs/settings/proxmenux-monitor",
"tail": " — запуск и остановка службы systemd из текстового интерфейса ProxMenux."
}
]
}
}
@@ -0,0 +1,342 @@
{
"meta": {
"title": "ИИ-помощник Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor",
"description": "Необязательный ИИ-помощник переформулирует уведомления Proxmox VE понятным языком. Шесть провайдеров: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter и Ollama. Интерфейс поддерживает тринадцать языков, три уровня детализации для каждого канала, пользовательские промпты с библиотекой сообщества и контекст событий, включая время непрерывной работы, повторяемость и данные SMART.",
"ogTitle": "ИИ-помощник Proxmox — OpenAI, Claude, Gemini, Groq, Ollama",
"ogDescription": "Переформулируйте уведомления Proxmox VE понятным языком с помощью OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter или локального Ollama.",
"twitterTitle": "ИИ-помощник Proxmox | ProxMenux Monitor",
"twitterDescription": "Переформулируйте уведомления Proxmox VE понятным языком с помощью OpenAI, Anthropic, Gemini, Groq, OpenRouter или локального Ollama."
},
"header": {
"title": "ИИ-ассистент",
"description": "Необязательная функция переформулирования с помощью ИИ преобразует подходящие шаблоны уведомлений в сообщения на понятном языке. Доступны уровни детализации для каждого канала, тринадцать языков интерфейса, пользовательские промпты, общедоступная библиотека сообщества и дополнение контекста. Отчёты о резервном копировании backup_complete и backup_fail никогда не переформулируются; если включены рекомендации ИИ, ИИ лишь добавляет пояснение, когда отчёт о резервном копировании содержит ошибки.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "По умолчанию выключено, включается одним переключателем",
"body": "Переформулирование с помощью ИИ по умолчанию выключено. Включите его в <em>Settings → Notifications → Advanced: улучшение с помощью ИИ</em>. Если дополнить контекст или переформулировать сообщение не удаётся, диспетчер отправляет исходное сообщение по шаблону. В очереди отправки событий на переформулирование отводится 25 секунд; по истечении этого времени отправляется сообщение по шаблону без дальнейшего ожидания."
},
"howItWorks": {
"heading": "Как это работает",
"intro": "Каждое событие, отправляемое Monitor, проходит один и тот же конвейер обработки. Переформулирование с помощью ИИ — один из необязательных этапов между формированием текста по шаблону и отправкой в канал. Весь путь одного события состоит из четырёх шагов:",
"steps": [
"<strong>Событие + шаблон.</strong> Событие поступает от одного из шести сборщиков, и <code>notification_templates.py</code> формирует из него структурированный текст без форматирования. Именно этот текст был бы отправлен в канал, если бы переформулирование с помощью ИИ было выключено.",
"<strong>Дополнение контекста.</strong> Диспетчер анализирует событие и при выполнении соответствующих условий добавляет относящиеся к нему дополнительные сведения: время непрерывной работы системы (только для критических сбоев системы), частоту событий, данные SMART (только для событий, связанных с дисками), совпадения в базе известных ошибок и строки системного журнала.",
"<strong>Формирование промпта.</strong> Системный промпт составляется из шаблона и настроек конкретного канала: целевого языка, уровня детализации, правил использования эмодзи из раздела <em>Сообщения с расширенным оформлением</em> и дополнения с рекомендациями ИИ, если оно включено. В режиме пользовательского промпта ваш промпт полностью заменяет системный. Пользовательское сообщение формируется из текста по шаблону и блоков дополнительного контекста.",
"<strong>Вызов провайдера.</strong> Настроенный провайдер (Groq, OpenAI, Anthropic, Gemini, Ollama или OpenRouter) возвращает переформулированные заголовок и текст. Диспетчер разбирает ответ, заменяет исходные заголовок и текст для этого канала и передаёт сообщение адаптеру канала для доставки."
],
"notesIntro": "Прежде чем читать дальше, стоит запомнить три важных момента:",
"notes": [
"<strong>ИИ не создаёт события.</strong> Каждое событие возникает на основе реального сигнала (проверки Health Monitor, строки журнала, вебхука PVE и т. д.), и текст по шаблону формируется ещё до того, как его увидит ИИ. ИИ переводит и меняет формат, а не ведёт наблюдение.",
"<strong>ИИ работает отдельно для каждого канала.</strong> Для Telegram и Discord можно использовать краткую формулировку, а по электронной почте отправлять подробный отчёт: одно событие, разное представление, по одному вызову провайдера на каждый канал.",
"<strong>Сбой не прерывает отправку.</strong> Если провайдер возвращает ошибку 5xx, превышает время ожидания, возвращает ответ неверного формата или отклоняет запрос, диспетчер записывает ошибку в журнал и для этого канала использует исходный текст по шаблону. Вы не потеряете уведомление из-за сбоя LLM."
]
},
"enabling": {
"heading": "Включение панели",
"intro": "Настройки ИИ находятся внизу панели уведомлений на вкладке настроек, в сворачиваемом блоке <em>Дополнительно: улучшение с помощью ИИ</em>. Нажмите на заголовок, чтобы развернуть блок:",
"collapsedAlt": "Заголовок свёрнутого блока «Дополнительно: улучшение с помощью ИИ» с индикатором в виде шеврона",
"collapsedCaption": "По умолчанию панель свёрнута — один щелчок разворачивает её.",
"panelAlt": "Развёрнутая панель улучшения сообщений с помощью ИИ: главный переключатель «Сообщения, улучшенные с помощью ИИ», поставщик Google Gemini, скрытый ключ API, модель gemini-2.5-flash, режим промпта «По умолчанию», язык «Английский», уровень детализации по каналам Telegram Discord Gotify Email, переключатель «Рекомендации ИИ» и кнопка «Проверить соединение»",
"panelCaption": "Полная панель улучшения сообщений с помощью ИИ — каждый элемент управления, описанный на этой странице, соответствует одному из полей выше.",
"outro": "Сверху вниз на панели расположены: главный переключатель <em>Сообщения, улучшенные с помощью ИИ</em>, выбор поставщика с расположенным рядом информационным модальным окном, поле ввода ключа API (или URL Ollama для локального режима), раскрывающийся список моделей (загружается от поставщика после ввода ключа), режим промпта (<em>По умолчанию</em> / <em>Пользовательский</em>), язык ответа, уровень детализации для каждого канала, переключатель включения <em>Рекомендаций ИИ</em> и кнопка <em>Проверить соединение</em>, которая отправляет поставщику пробное сообщение для проверки учётных данных."
},
"context": {
"heading": "Какой контекст получает ИИ",
"intro": "Перед формированием промпта диспетчер выполняет процедуру обогащения контекста, которая определяет, какие дополнительные сведения относятся к текущему событию. Цель — предоставить LLM достаточно информации для создания полезного сообщения, не перегружая её нерелевантными данными и не увеличивая ваши расходы из-за них. В пользовательское сообщение могут быть добавлены пять блоков контекста:",
"headerBlock": "Блок",
"headerWhen": "Когда добавляется",
"headerWhat": "Что содержит",
"rows": [
{
"block": "Время непрерывной работы системы",
"when": "Только при критических сбоях системного уровня: <code>crash</code>, <code>panic</code>, <code>oom</code>, <code>kernel</code>, <code>split_brain</code>, <code>quorum_lost</code>, <code>node_offline</code>, <code>node_fail</code>, <code>system_fail</code>, <code>boot_fail</code>. Не добавляется при ошибках дисков, предупреждениях и штатных операциях, чтобы промпт оставался компактным.",
"what": "Строка вида <code>System uptime: 14 days (stable system)</code>. Позволяет LLM отличать проблемы при запуске от сбоев, возникающих после длительной работы."
},
{
"block": "Частота событий",
"when": "Всегда, если Monitor уже встречал такой же отпечаток события.",
"what": "Количество срабатываний, время первого обнаружения, необязательная метка характера возникновения (повторяющееся / разовое / всплеск). LLM использует эти данные, чтобы выбрать формулировку «повторяющаяся проблема» или «обнаружено впервые»."
},
{
"block": "Данные SMART",
"when": "Только для событий, связанных с дисками (тип события содержит <code>disk</code>, <code>smart</code>, <code>storage</code>, <code>io_error</code> либо в тексте упоминается <code>/dev/sd</code>, <code>ata</code>, <code>i/o error</code>).",
"what": "Вывод <code>smartctl</code> для затронутого устройства — общее состояние (PASSED / FAILED) и атрибуты, относящиеся к данному типу сбоя."
},
{
"block": "База известных ошибок",
"when": "Когда текст сообщения или контекст из журнала соответствует специфичному для Proxmox шаблону ошибки, поставляемому с Monitor.",
"what": "Блок <code>KNOWN PROXMOX ERROR DETECTED</code> с найденной причиной и конкретным решением. Промпт предписывает LLM перевести его дословно, не перефразируя рекомендуемый способ устранения проблемы."
},
{
"block": "Записи системного журнала",
"when": "Каждый раз, когда исходный сборщик захватил строки системного журнала для события (чаще всего это модули отслеживания журнала и задач).",
"what": "Необработанные фрагменты <code>journalctl</code>. Промпт предписывает LLM извлечь идентификаторы, временные метки и сведения, указывающие на первопричину, и игнорировать записи, не относящиеся к событию."
}
],
"afterBlocks": "После объединения этих блоков пользовательское сообщение, отправляемое LLM, имеет следующий вид:",
"calloutTitle": "Никакой телеметрии, кроме данных самого события",
"calloutBody": "Monitor отправляет только те данные, которые у него есть для текущего события: без общесистемной телеметрии, исторических рядов метрик и выгрузок инвентарных данных. Пять блоков выше — это максимум данных, которые покидают хост при одной переработке текста с помощью ИИ."
},
"tokens": {
"heading": "Токены: что это такое и как они расходуются",
"intro1": "Все коммерческие поставщики взимают плату за каждый <em>токен</em>, поэтому перед выбором тарифного плана стоит разобраться, что такое токен. Токен — это примерно четыре символа английского текста или около трёх четвертей слова. Фраза <em>\"Backup completed on storage local-bak\"</em> содержит около восьми токенов. Короткий фрагмент журнала из десяти строк может содержать 200–400 токенов в зависимости от насыщенности техническими терминами.",
"intro2": "При каждом вызове оплачиваются две составляющие:",
"items": [
"<strong>Входные токены</strong> включают системный промпт и сообщение пользователя: уровень серьёзности, заголовок, сформированный текст и расширенный контекст. Их количество зависит от фактического промпта и содержимого события. Переработка текста для каждого канала может отдельно расходовать входные токены; отчёты об успешном завершении и сбое резервного копирования расходуют токены только тогда, когда ИИ объясняет ошибки резервного копирования.",
"<strong>Выходные токены</strong> — это текст, который модель возвращает в ответ. Monitor ограничивает их количество с помощью <code>max_tokens</code> (см. таблицу ниже). Это <em>ограничение</em>, а не объём, за который взимается плата: если модель выдаёт 250 токенов при ограничении в 1500, вы платите за 250."
],
"capsIntro": "Ниже приведены фактические ограничения, которые применяет диспетчер, взятые непосредственно из <code>AI_DETAIL_TOKENS</code> в <code>notification_templates.py</code>:",
"headerLevel": "Уровень детализации",
"headerCap": "Ограничение вывода (токены)",
"headerConsumption": "Типичный фактический расход",
"capRows": [
{
"level": "краткий",
"cap": "500",
"consumption": "50–200 выходных токенов для кратких событий."
},
{
"level": "стандартный",
"cap": "1500",
"consumption": "200–700 выходных токенов для типичных событий с небольшим объёмом контекста."
},
{
"level": "подробный",
"cap": "3000",
"consumption": "500–2000 выходных токенов для полных отчётов по электронной почте с журналами и таблицами SMART."
}
],
"customNote": "В режиме пользовательского промпта действует фиксированное ограничение в 500 выходных токенов независимо от уровня детализации: вы сами задаёте промпт, а ограничение защищает от чрезмерно длинных ответов.",
"sizingTitle": "Практическая оценка расхода",
"sizingBody": "Оценивайте расход по формуле: количество событий с переработкой текста × количество каналов с включённым ИИ × сумма входных и выходных токенов на вызов. Например, 50 событий × один канал × (2000 входных + 300 выходных токенов) — это около 115 000 токенов в день, поскольку один только системный промпт по умолчанию занимает примерно 1500 токенов. Фактический расход и стоимость зависят от модели, контекста, кэширования и ограничений провайдера. В разделе <link>Уровень детализации для каждого канала</link> показано, как использовать <code>brief</code> для чата вместо <code>standard</code>, сохранив при этом подробные отчёты по электронной почте."
},
"providers": {
"heading": "Провайдеры ИИ",
"intro": "В Monitor интегрированы шесть провайдеров. Все они представлены в раскрывающемся списке провайдеров в интерфейсе; расположенная рядом информационная кнопка открывает модальное окно с кратким описанием каждого из них. Ниже приведён полный справочник: URL для получения ключа API, описание из интерфейса и соответствующие примечания из исходного кода.",
"imageAlt": "Модальное окно со сведениями о провайдерах ИИ, в котором перечислены шесть поддерживаемых провайдеров — Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter — со значком и кратким описанием для каждого, а также отдельным примечанием об API, совместимых с OpenAI, для OpenAI",
"imageCaption": "Модальное окно в приложении: шесть карточек, по одной на провайдера, с теми же описаниями, которые приведены ниже.",
"groq": {
"heading": "Groq",
"tagline": "Очень быстрый сервис с щедрыми лимитами бесплатного тарифа. Хороший вариант для начала.",
"items": [
"Ключ API: <a>console.groq.com/keys</a>",
"Примеры из встроенного списка моделей: <code>allam-2-7b</code>, <code>qwen/qwen3.8-27b</code>, <code>openai/gpt-oss-20b</code>, <code>openai/gpt-oss-120b</code>.",
"Рекомендация из встроенного списка: <strong><code>openai/gpt-oss-20b</code></strong>. Используйте выбор провайдера и проверку подключения, чтобы проверить доступность для вашей учётной записи."
]
},
"openai": {
"heading": "OpenAI",
"tagline": "Отраслевой стандарт. Высокая точность и широкое распространение.",
"items": [
"Ключ API: <a>platform.openai.com/api-keys</a>",
"Примеры из встроенного списка моделей: <code>gpt-6-luna</code>, <code>gpt-5.6-luna</code>, <code>gpt-5.4-mini</code>, <code>gpt-6-sol</code>, <code>gpt-5.5</code>.",
"Рекомендация из встроенного списка: <strong><code>gpt-6-luna</code></strong> — самая экономичная из актуальных моделей. Все модели во встроенном списке поддерживают рассуждения; адаптер передаёт каждой из них только те параметры, которые она принимает."
],
"baseUrlTitle": "Базовый URL, совместимый с OpenAI",
"baseUrlBody": "Провайдер OpenAI также позволяет задать собственный <em>базовый URL</em>, чтобы подключить Monitor к любой конечной точке, совместимой с OpenAI. Подтверждена работа с <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong>, <strong>Fireworks AI</strong> и любым другим сервисом, поддерживающим вариант протокола OpenAI <code>/v1/chat/completions</code>. Укажите URL на вкладке OpenAI рядом с полем ключа API."
},
"anthropic": {
"heading": "Anthropic (Claude)",
"tagline": "Отлично подходит для написания текстов и перевода. Быстрый и экономичный сервис.",
"items": [
"Ключ API: <a>console.anthropic.com/settings/keys</a>",
"Примеры из встроенного списка моделей: <code>claude-haiku-5-5</code>, <code>claude-sonnet-5-5</code>, <code>claude-opus-5-5</code>.",
"Рекомендация из встроенного списка: <strong><code>claude-haiku-5-5</code></strong> — самая экономичная из актуальных моделей Claude."
]
},
"gemini": {
"heading": "Google Gemini",
"tagline": "Доступен бесплатный тариф, отличное соотношение цены и качества.",
"items": [
"Ключ API: <a>aistudio.google.com/app/apikey</a>",
"Примеры из встроенного списка моделей: <code>gemini-2.5-flash-lite</code>, <code>gemini-2.5-flash</code>, <code>gemini-3-flash-preview</code>.",
"Рекомендуется: <strong><code>gemini-2.5-flash-lite</code></strong> — flash и flash-lite стабильно проходят проверку. Варианты pro не принимают настройку <code>thinkingBudget=0</code>, которую использует Monitor, и избыточны для этой задачи."
]
},
"openrouter": {
"heading": "OpenRouter",
"tagline": "Агрегатор с доступом к более чем 100 моделям по одному ключу API. Максимальная гибкость.",
"items": [
"Ключ API: <a>openrouter.ai/keys</a>",
"Примеры из встроенного списка моделей: <code>meta-llama/llama-3.3-70b-instruct</code>, <code>meta-llama/llama-3.1-70b-instruct</code>, <code>meta-llama/llama-3.1-8b-instruct</code>, <code>anthropic/claude-haiku-4.5</code>, <code>google/gemini-2.5-flash-lite</code>, <code>openai/gpt-4o-mini</code>, <code>mistralai/mistral-medium-3</code>.",
"Рекомендуется: <strong><code>meta-llama/llama-3.3-70b-instruct</code></strong> — та же модель, что и в разделе Groq, но запросы направляются через OpenRouter, поэтому для всех перечисленных моделей достаточно одного ключа."
]
},
"ollama": {
"heading": "Ollama (локально)",
"tagline": "Использует модели, доступные на настроенном вами сервере Ollama. Локальные модели выполняются на нём; облачные модели Ollama перенаправляют запросы облачному провайдеру. Локальное выполнение позволяет избежать платы за API у внешнего провайдера, но по-прежнему использует ваше оборудование и электроэнергию.",
"items": [
"Ключ API не требуется. В поле <em>URL Ollama</em> укажите адрес своего сервера (по умолчанию <code>http://localhost:11434</code> или адрес узла, на котором работает ваш экземпляр Ollama).",
"Модели: <strong>не фильтруются.</strong> Monitor получает список всех моделей, которые вы загрузили на стороне Ollama с помощью <code>ollama pull &lt;model&gt;</code>. Выпадающий список заполняется данными из <code>GET /api/tags</code> на вашем сервере Ollama.",
"Установка: <a>ollama.com/download</a> — работает на Linux, macOS и Windows. Для наилучших результатов выберите модель, которая помещается в оперативной памяти и имеет достаточно большое контекстное окно для блоков журнала, добавляемых диспетчером."
]
}
},
"models": {
"heading": "Почему выбраны именно эти модели",
"intro": "Список моделей коммерческих провайдеров формируется на основе встроенного каталога совместимости <code>verified_ai_models.json</code> с учётом проверок доступности, выполняемых адаптером провайдера. Адаптеры преобразуют внутренний запрос <code>system_prompt + user_message + max_tokens</code> в формат API каждого провайдера. Каталог содержит как проверенные записи, так и записи, добавленные вручную; он отражает состояние на определённый момент, но не гарантирует текущую доступность для вашей учётной записи или прохождение всеми записями одной и той же процедуры проверки.",
"consequencesIntro": "Из этого следуют два важных момента:",
"consequences": [
"<strong>Встроенная рекомендация</strong> — это отправная точка: модель выбрана для форматирования уведомлений. Оценивайте качество языка, задержку и стоимость с учётом содержимого ваших событий и учётной записи у провайдера, а не воспринимайте эту рекомендацию как универсальный рейтинг моделей.",
"<strong>Вы можете выбрать другую модель из списка</strong> с учётом своей квоты или предпочтений. Проверьте её доступность с помощью проверки подключения; наличие в списке не гарантирует, что модель сейчас доступна для вашей учётной записи."
],
"ollamaTitle": "Ollama — исключение",
"ollamaBody": "Выпадающий список Ollama не фильтруется по каталогу коммерческих провайдеров; в нём отображаются модели, доступные на вашем сервере Ollama. Для локального выполнения выберите локальную модель, которая помещается в оперативной памяти и имеет достаточно большое контекстное окно для блоков журнала. Модели с облачной меткой выполняются удалённо, даже если вы обращаетесь к ним через локальный сервер Ollama."
},
"defaultPrompt": {
"heading": "Промпт по умолчанию",
"intro": "Если для режима промпта выбрано значение <em>По умолчанию</em>, Monitor использует приведённый ниже системный промпт. Он формируется из шаблона во время выполнения: <code>'{'language'}'</code>, <code>'{'detail_level'}'</code>, <code>'{'emoji_instructions'}'</code> и <code>'{'suggestions_addon'}'</code> заменяются перед вызовом. Сразу после него показаны варианты для каналов с форматированием и без него, а также дополнение «Рекомендации ИИ».",
"showFullSummary": "Показать полный системный промпт по умолчанию",
"passagesIntro": "Два фрагмента в приведённом выше промпте — это заполнители, содержимое которых меняется в зависимости от переключателя <em>Форматированные сообщения</em>, настраиваемого отдельно для каждого канала:",
"passages": [
"<strong>Форматирование включено</strong> → добавляется блок эмодзи со списком значков, которые может использовать LLM, а также правило для имени узла (LLM должна сохранять префикс имени узла из заголовка без изменений) и несколько примеров с форматированием (начало резервного копирования, завершение резервного копирования, обновления, запуск ВМ, ухудшение состояния). Именно так формируются сообщения с эмодзи в начале для Telegram и Discord.",
"<strong>Форматирование выключено</strong> → однострочный блок предписывает LLM использовать только обычные символы ASCII — без эмодзи и символов Unicode. Применяется для электронной почты и любых каналов, где лишнее форматирование мешает работе правил обработки входящих сообщений или ухудшает читаемость."
],
"suggestionsPlaceholder": "Заполнитель <code>'{'suggestions_addon'}'</code> остаётся пустым, пока вы не включите «Рекомендации ИИ» (следующий раздел); при включении добавляется следующий блок:",
"showAddonSummary": "Показать дополнение «Рекомендации ИИ»"
},
"customPrompt": {
"heading": "Режим пользовательского промпта",
"intro": "При переключении режима промпта на <em>Пользовательский</em> весь системный промпт по умолчанию заменяется промптом, который вы пишете сами. Пользовательский промпт хранится в настройках SQLite Монитора и передаётся без изменений при каждом вызове ИИ для переработки текста. Этот вариант подходит, если вам нужны совершенно иной стиль, структура или акценты, чем предлагает встроенный промпт.",
"imageAlt": "Режим пользовательского промпта: текстовое поле с правилами перевода, кнопки экспорта и импорта, а также ссылка на промпты сообщества",
"imageCaption": "Пользовательский промпт — большое текстовое поле с промптом пользователя, кнопки <em>Экспорт</em> и <em>Импорт</em>, а также ссылка на галерею сообщества на GitHub.",
"changesTitle": "Что меняется при включении пользовательского режима",
"changes": [
"<strong>Промпт по умолчанию заменяется целиком.</strong> Соответствия Proxmox, правила обработки контекста и инструкции по использованию эмодзи больше не применяются. Если вы хотите сохранить что-либо из этого, вставьте соответствующие части в свой промпт — отправной точкой может послужить встроенный <code>EXAMPLE_CUSTOM_PROMPT</code>, приведённый ниже.",
"<strong>Выбор языка игнорируется.</strong> В промпте по умолчанию есть заполнитель <code>'{'language'}'</code>, а в пользовательском промпте его нет. Если вам нужен результат на определённом языке, укажите это в своём промпте («Переведи на испанский», «Выводи всё на французском»).",
"<strong>В пользовательском режиме ограничение объёма ответа фиксировано и составляет 500 токенов</strong> независимо от сохранённой настройки детализации для канала. В режиме по умолчанию используются ограничения 500 / 1500 / 3000 токенов. Изменение пользовательского промпта не позволяет увеличить этот предел; запросите более короткий ответ или выберите подходящий уровень детализации в режиме по умолчанию.",
"<strong>Маркеры вывода остаются обязательными.</strong> Включите <code>[TITLE]</code> и <code>[BODY]</code> в формат ответа. Парсер извлекает их содержимое; если хотя бы один маркер отсутствует, вместо результата возвращается исходный шаблон.",
"<strong>Правила использования эмодзи для форматированных сообщений не добавляются автоматически.</strong> Если вам нужны эмодзи, укажите в промпте, что их следует использовать. Если нужен обычный текст, укажите, что эмодзи использовать не следует. Переключатель управляет только встроенными блоками промпта по умолчанию, а не текстом вашего пользовательского промпта."
],
"starterTitle": "Начальный промпт",
"starterIntro": "Текстовое поле <em>Пользовательский промпт</em> изначально содержит минимальный пример, который можно адаптировать под свои задачи:",
"showStarterSummary": "Показать начальный пользовательский промпт",
"shareTitle": "Обмен промптами с сообществом",
"shareIntro": "Кнопка <em>Экспорт</em> сохраняет текущий пользовательский промпт в файл (<code>.txt</code> / <code>.md</code>), который можно оставить как резервную копию или передать другому человеку. Кнопка <em>Импорт</em> загружает промпт из файла. Третья кнопка рядом с ними ведёт в общедоступную галерею сообщества на GitHub:",
"shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Делитесь пользовательскими промптами для уведомлений с ИИ",
"shareOutro": "Просмотрите обсуждение, чтобы узнать, что создали другие пользователи: краткие оповещения в стиле сообщений пейджера, подробные технические отчёты, варианты для разных языков. Если вы доработали свой промпт и вам понравился результат, опубликуйте его там: даже описание в один абзац о том, на какие задачи ориентирован ваш промпт, поможет другим выбрать подходящую отправную точку. Отзывы о том, что работает, а что нет, также приветствуются."
},
"suggestions": {
"heading": "Рекомендации ИИ (БЕТА)",
"intro": "Рекомендации ИИ — это дополнение, включаемое по желанию пользователя. Оно позволяет языковой модели добавлять <strong>один</strong> короткий практический совет в конце основного текста сообщения. Оно работает только в режиме промпта <em>По умолчанию</em>, при включённом основном переключателе ИИ и включённом переключателе <em>Рекомендации ИИ</em>. Даже при выполнении этих условий промпт предписывает модели не добавлять совет, если причина или решение неясны.",
"formatIntro": "Если совет добавлен, он строго соответствует следующему формату:",
"rulesIntro": "Правила, заложенные в дополнение (их можно увидеть в раскрывающемся блоке в разделе промпта по умолчанию выше):",
"rules": [
"Совет добавляется <em>только</em> в том случае, если контекст журнала или база известных ошибок явно указывают на конкретный способ устранения проблемы.",
"Промпт запрашивает совет длиной менее 100 символов; сам парсер это ограничение длины не обеспечивает.",
"Промпт требует указать конкретную команду или путь и предписывает модели избегать общих советов.",
"Если для известной ошибки указано решение, языковая модель должна использовать именно его, а не придумывать новое.",
"Промпт предписывает модели не добавлять совет, если входные данные не позволяют предложить конкретный способ устранения проблемы."
],
"betaTitle": "Почему BETA",
"betaBody": "Качество советов зависит от двух факторов, не зависящих от ProxMenux: выбранной модели и полноты контекста события в журнале. При использовании мощной модели (Claude 3.5 Haiku, GPT-4.1 Mini, Llama 3.3 70B) и наличии ошибки диска, сопровождаемой smartctl и строками журнала, советы стабильно полезны. При использовании небольшой локальной модели Ollama и события из одной строки совет может оказаться неудачным или вовсе отсутствовать. Отключите переключатель, если советы создают лишний информационный шум, и включите его снова, когда они вам понадобятся."
},
"detailLevel": {
"heading": "Уровень детализации для каждого канала",
"intro": "У каждого из шести каналов (Telegram, Discord, Gotify, электронная почта, Pushover, Apprise) есть собственный раскрывающийся список уровня детализации. Доступны три значения, каждому из которых соответствуют определённый лимит выходных токенов и определённые инструкции в промпте по умолчанию:",
"headerLevel": "Уровень",
"headerLabel": "Название в интерфейсе",
"headerCap": "Лимит вывода",
"headerProduce": "Что промпт предписывает сформировать LLM",
"rows": [
{
"level": "краткий",
"label": "2–3 строки, только самое важное",
"cap": "500 токенов",
"produce": "«Что произошло и где». Ничего больше."
},
{
"level": "стандартный",
"label": "Кратко, с основным контекстом",
"cap": "1500 токенов",
"produce": "3–6 строк: что произошло, где, причина, затронутые устройства."
},
{
"level": "подробный",
"label": "Полные технические сведения",
"cap": "3000 токенов",
"produce": "Полный отчёт: что произошло, где, причина, что затронуто, журналы, данные SMART, история."
}
],
"defaultsIntro": "Значения по умолчанию, которые Monitor применяет при первой установке:",
"defaults": [
"<strong>Telegram, Discord, Gotify, Pushover, Apprise</strong> — <code>standard</code>.",
"<strong>Электронная почта</strong> — <code>detailed</code>. Электронная почта — канал, в котором обычно нужна полная картина для сохранения в архиве."
],
"emailTitle": "При выбранном уровне детализации для электронной почты добавляется исходный текст",
"emailBody": "Когда ИИ-форматировщик возвращает результат для электронной почты при <code>detailed</code> и исходный текст сообщения длиннее 50 символов, форматировщик добавляет этот исходный текст после разделителя из 40 дефисов и метки <code>Original message:</code>. Это сохраняет исходные сведения для последующего поиска. Если обработка ИИ пропущена или завершилась с ошибкой, вместо этого может быть отправлен только исходный шаблон."
},
"language": {
"heading": "Язык",
"intro": "В интерфейсе можно выбрать один из тринадцати языков. Выбранное значение сохраняется в <code>ai_language</code>, которое системный промпт по умолчанию использует в инструкции <em>\"translate alerts into '{'language'}'\"</em>. Список языков в интерфейсе:",
"list": "Английский (<code>en</code>), словацкий (<code>sk</code>), испанский (<code>es</code>), французский (<code>fr</code>), немецкий (<code>de</code>), португальский (<code>pt</code>), итальянский (<code>it</code>), русский (<code>ru</code>), шведский (<code>sv</code>), норвежский (<code>no</code>), японский (<code>ja</code>), китайский (<code>zh</code>), нидерландский (<code>nl</code>).",
"rulesIntro": "Два важных правила непосредственно из промпта:",
"rules": [
"<strong>Переводить</strong>: подписи, описания, обозначения состояний, единицы измерения (например, GB → Go во французском языке).",
"<strong>Не переводить</strong>: имена хостов, IP-адреса, пути, идентификаторы ВМ и контейнеров, имена устройств, такие как <code>/dev/sdX</code>, технические идентификаторы. Они остаются без изменений независимо от языка."
],
"customNote": "Режим пользовательского промпта <strong>не использует</strong> переключатель языка. Если вы переходите в пользовательский режим и хотите получать ответы на определённом языке, укажите его в своём промпте."
},
"templates": {
"heading": "Примечание о шаблонах",
"body1": "ИИ получает текст, сформированный по шаблону, а не исходные данные события. Для таких типов, как <code>vm_start</code>, <code>auth_fail</code> и <code>health_degraded</code>, шаблоны находятся в <code>notification_templates.py</code>. ИИ перерабатывает сформированный по шаблону текст, для которого это предусмотрено; <code>backup_complete</code> и <code>backup_fail</code> сохраняют свои отчёты, сформированные по фиксированным правилам; если включены рекомендации ИИ, ИИ лишь добавляет пояснение, когда в отчёте о резервном копировании указаны ошибки.",
"body2": "Из этого следуют два практических вывода: ИИ никогда не приходится придумывать имя хоста или VMID — эти поля заполняются шаблоном до переработки текста. А если ИИ отключён, текст, сформированный по шаблону, отправляется напрямую. На странице <link>Уведомления</link> полностью описан процесс отправки; к ней следует обращаться за сведениями обо всём, что происходит с событием до того, как оно достигнет этого уровня обработки."
},
"privacy": {
"heading": "Конфиденциальность и передача данных",
"intro": "Если переработка текста с помощью ИИ включена, Monitor отправляет настроенному провайдеру сформированный текст уведомления вместе с блоками дополнительного контекста. Эти данные могут включать имена хостов, IP-адреса, имена пользователей, пути к устройствам, строки системного журнала и атрибуты SMART затронутого устройства. Покидают ли эти данные хост, зависит от выбранного провайдера:",
"headerProvider": "Провайдер",
"headerDestination": "Куда передаются данные",
"rows": [
{
"provider": "Ollama",
"destination": "Локальные модели работают на настроенном хосте Ollama. Их запросы не покидают этот хост, если им является сам узел Proxmox. Облачные модели Ollama передают запросы за пределы хоста, даже при обращении через локальный сервер Ollama."
},
{
"provider": "OpenAI",
"destination": "По умолчанию — <code>api.openai.com</code>, либо настроенный пользовательский базовый URL. Применяется политика обработки данных фактического оператора конечной точки."
},
{
"provider": "Anthropic",
"destination": "<code>api.anthropic.com</code>."
},
{
"provider": "Google Gemini",
"destination": "<code>generativelanguage.googleapis.com</code>."
},
{
"provider": "Groq",
"destination": "<code>api.groq.com</code>."
},
{
"provider": "OpenRouter",
"destination": "<code>openrouter.ai</code>, откуда запросы перенаправляются провайдеру модели, выбранному в поле <code>model</code>. Два этапа передачи вместо одного."
}
],
"calloutTitle": "Если содержимое событий не должно покидать сеть",
"calloutBody": "Используйте локально размещённую конечную точку с локальной моделью, например локальный Ollama или сервер, совместимый с OpenAI, либо отключите переработку текста с помощью ИИ. При использовании облачных моделей Ollama обработка не остаётся локальной. Диспетчер отправки не скрывает имена хостов и IP-адреса: он формирует промпт из фактического содержимого события."
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Уведомления",
"href": "/docs/monitor/notifications",
"tail": " — процесс отправки, каналы, переключатели для отдельных событий и интеграция через вебхук PVE, в рамках которых работает этот уровень обработки."
},
{
"label": "Мониторинг состояния",
"href": "/docs/monitor/health-monitor",
"tail": " — крупнейший отдельный источник событий, текст которых в итоге перерабатывает ИИ, с собственными периодами подавления уведомлений для каждой категории."
},
{
"label": "Архитектура",
"href": "/docs/monitor/architecture",
"tail": " — место AI Enhancer в общем процессе Monitor (это модуль, а не отдельная служба)."
}
],
"communityLabel": "Промпты сообщества на GitHub",
"communityTail": " — просматривайте, делитесь, задавайте вопросы."
}
}
@@ -0,0 +1,760 @@
{
"meta": {
"title": "Proxmox Monitor API — Справочник по интеграции | ProxMenux",
"description": "HTTP-эндпоинты, предоставляемые ProxMenux Monitor для Home Assistant, Homepage, Grafana, Prometheus, n8n и пользовательских панелей мониторинга. Чтение состояния и выполнение документированных операций записи, таких как управление ВМ, запуск резервного копирования, отправка уведомлений и подтверждение оповещений.",
"ogTitle": "Proxmox Monitor API — Справочник по интеграции",
"ogDescription": "Эндпоинты, предоставляемые ProxMenux Monitor для Home Assistant, Homepage, Grafana, Prometheus, n8n и пользовательских панелей мониторинга.",
"twitterTitle": "Proxmox Monitor API | ProxMenux",
"twitterDescription": "Эндпоинты для Home Assistant, Homepage, Grafana, Prometheus, n8n и пользовательских панелей мониторинга."
},
"header": {
"title": "Справочник API",
"description": "HTTP-эндпоинты для чтения состояния и выполнения документированных действий в ProxMenux Monitor: датчики Home Assistant, карточки Homepage, панели мониторинга Grafana, сбор данных Prometheus, процессы n8n и пользовательские скрипты. Здесь приведены категории эндпоинтов, экспортируемые метрики и примеры curl.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "Для чего нужна эта страница",
"body": "На этой странице перечислены конечные точки, предназначенные для внешних интеграций: экспорт данных из всех разделов Monitor в режиме «только для чтения», а также небольшой набор операций записи, действительно необходимых для автоматизации (запуск создания резервной копии, отправка пользовательского уведомления, подтверждение оповещения). Весь API работает в том же процессе Flask, который обслуживает интерфейс панели на TCP-порту <strong>8008</strong>; адрес привязки и TLS настраиваются в разделе <link>Доступ и аутентификация</link>."
},
"headerEndpoint": "Конечная точка",
"headerMethod": "Метод",
"headerUse": "Назначение",
"auth": {
"heading": "Аутентификация",
"intro": "Когда аутентификация включена, защищённые эндпоинты ожидают токен JWT типа Bearer в заголовке запроса:",
"tokensIntro": "Получить токен можно двумя способами:",
"items": [
"<strong>Токены API (рекомендуются для интеграций).</strong> Токены действуют 365 дней и создаются в разделе <strong>Security → API Tokens</strong>. У каждого токена есть имя, и каждый можно отозвать отдельно. Для сбора данных используйте read_only, а full_admin выбирайте только для интеграций, которым необходимы административные действия.",
"<strong>Вход в систему (JWT на 24 часа).</strong> <code>POST /api/auth/login</code> с именем пользователя, паролем и токеном TOTP, если он требуется для 2FA. Возвращаемый JWT сеанса истекает через 24 часа; после истечения срока действия скрипты должны пройти аутентификацию повторно."
],
"flowLink": "Процедура аутентификации, политика паролей, настройка 2FA, журнал аудита и конфигурация TLS описаны в разделе <link>Доступ и аутентификация</link>.",
"rows": [
{
"endpoint": "/api/auth/login",
"method": "POST",
"use": "Поля тела запроса (схематично): <code>'{'\"username\",\"password\",\"totp_token?\"'}'</code>. Возвращает JWT сеанса со сроком действия 24 часа."
},
{
"endpoint": "/api/auth/api-tokens",
"method": "GET",
"use": "Список токенов API (только метаданные — имена, префиксы, даты; сам секрет никогда не возвращается)."
},
{
"endpoint": "/api/auth/generate-api-token",
"method": "POST",
"use": "Создание токена API со сроком действия 365 дней с использованием аутентифицированного сеанса. Поля тела запроса: <code>password, token_name?, totp_token?, scope?</code>. Пароль и TOTP, если он требуется, проверяются повторно. Область доступа по умолчанию — read_only; full_admin необходимо выбрать явно. Секрет возвращается только один раз."
},
{
"endpoint": "/api/auth/api-tokens/<id>",
"method": "DELETE",
"use": "Отзыв конкретного токена API по его идентификатору."
}
]
},
"conventions": {
"heading": "Общие правила",
"items": [
"Большинство эндпоинтов используют JSON. При скачивании может возвращаться обычный текст, а <code>/api/prometheus</code> возвращает данные в текстовом формате экспорта Prometheus версии 0.0.4, а не OpenMetrics. Проверяйте тип ответа конкретного маршрута.",
"Многие конечные точки для операций записи возвращают <code>'{'\"success\": true, ...'}'</code>. Форматы ошибок различаются; один из распространённых форматов — <code>'{'\"success\": false, \"error\": \"'<'reason'>'\"'}'</code>. Проверяйте и HTTP-статус, и поля ответа: некоторые ответы с требованием аутентификации имеют HTTP-статус 200 при значении success false.",
"Параметры запроса зависят от конечной точки. Используйте <code>limit</code>, <code>offset</code>, <code>since</code> и фильтры для конкретных категорий только там, где маршрут их поддерживает.",
"Форматы времени зависят от конечной точки: встречаются временные метки Unix, строки ISO-8601 и даты в формате systemd. Не предполагайте, что все поля времени используют одну и ту же единицу измерения или явно указывают часовой пояс."
]
},
"system": {
"heading": "Система и оборудование",
"rows": [
{
"endpoint": "/api/system",
"method": "GET",
"use": "Процессор, память, подкачка, время непрерывной работы, нагрузка — текущий снимок состояния."
},
{
"endpoint": "/api/info",
"method": "GET",
"use": "Статические сведения о хосте: имя хоста, ядро, версия PVE, модель процессора, дистрибутив."
},
{
"endpoint": "/api/system-info",
"method": "GET",
"use": "Краткие сведения для заголовка: имя хоста, время непрерывной работы и кэшированное состояние работоспособности. Общедоступны, токен не требуется."
},
{
"endpoint": "/api/hardware",
"method": "GET",
"use": "Подробная инвентаризация оборудования — устройства PCI, графические процессоры, карта датчиков."
},
{
"endpoint": "/api/hardware/live",
"method": "GET",
"use": "Текущие показания датчиков, меняющиеся каждую секунду."
},
{
"endpoint": "/api/temperature/history",
"method": "GET",
"use": "Временные ряды температур процессора и его корпуса."
},
{
"endpoint": "/api/gpu/<slot>/realtime",
"method": "GET",
"use": "Текущие показатели графических процессоров NVIDIA / Intel / AMD по слотам PCI."
}
]
},
"actions": {
"heading": "Системные действия",
"intro": "Перечисленные ниже асинхронные системные действия запускают операции во временных юнитах systemd. При включённой аутентификации их маршруты записи требуют <code>full_admin</code>; токены <code>read_only</code> позволяют опрашивать <code>.../status</code>. При принятии запроса на запуск возвращается HTTP 202 со снимком состояния; для отслеживания хода выполнения опрашивайте соответствующий <code>.../status</code>. Для управления гостевыми системами и резервного копирования действуют другие правила формирования ответов, описанные ниже.",
"shapeTitle": "Общая структура ответа",
"shapeIntro": "Асинхронные системные действия используют общий объект состояния JSON, приведённый ниже. Ответы для управления гостевыми системами и резервного копирования имеют другую структуру:",
"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": "Параллельное выполнение и отмена",
"concurrencyBody": "Попытка повторного запуска того же системного действия возвращает HTTP 409, пока оно выполняется. Отмена доступна только для действий с документированным маршрутом DELETE, например для обновления PVE. Их состояние меняется на <code>cancelled</code>, а временные метки сохраняются. Снимки конечного состояния хранятся в памяти процесса и могут быть потеряны при перезапуске Monitor.",
"rows": [
{
"endpoint": "/api/system/power/reboot",
"method": "POST",
"use": "Перезагрузить хост Proxmox. Запуск без ожидания завершения — HTTP-соединение обрывается, когда systemd начинает последовательность завершения работы."
},
{
"endpoint": "/api/system/power/reboot/status",
"method": "GET",
"use": "Состояние последнего или текущего действия перезагрузки."
},
{
"endpoint": "/api/system/power/shutdown",
"method": "POST",
"use": "Выключить хост Proxmox. Можно использовать как действие в ответ на сигнал завершения работы от ИБП."
},
{
"endpoint": "/api/system/power/shutdown/status",
"method": "GET",
"use": "Состояние последнего или текущего действия выключения."
},
{
"endpoint": "/api/system/pve-update/run",
"method": "POST",
"use": "Запустить безопасную процедуру обновления PVE (ту же, которую запускают кнопка «Обновить сейчас» в Health Monitor и меню оболочки; выполнение передаётся update-pve-safe.sh)."
},
{
"endpoint": "/api/system/pve-update/status",
"method": "GET",
"use": "Состояние последнего или текущего запуска обновления PVE."
},
{
"endpoint": "/api/system/pve-update",
"method": "DELETE",
"use": "Отменить выполняющееся обновление PVE (отправить SIGTERM запущенному скрипту)."
},
{
"endpoint": "/api/proxmenux/self-update/run",
"method": "POST",
"use": "Обновить ProxMenux с помощью установщика для настроенного стабильного или бета-канала. Операция выполняется в отдельном юните systemd, поэтому задание может продолжить работу после перезапуска службы proxmenux-monitor, выполняемого установщиком."
},
{
"endpoint": "/api/proxmenux/self-update/status",
"method": "GET",
"use": "Состояние последнего или текущего запуска самообновления ProxMenux."
},
{
"endpoint": "/api/vms/<vmid>/control",
"method": "POST",
"use": "Отправить команду управления питанием ВМ или LXC. Поле тела запроса <code>action</code> принимает значения <code>start</code>, <code>stop</code>, <code>shutdown</code> или <code>reboot</code>. Успешный ответ возвращает подтверждённую задачу PVE; это не означает, что операция завершена. Для получения результата опрашивайте конечную точку задач управления гостевой системой."
},
{
"endpoint": "/api/vms/<vmid>/backup",
"method": "POST",
"use": "Создать резервную копию ВМ или LXC с помощью vzdump. Поля тела запроса необязательны, если значения по умолчанию соответствуют конфигурации хранилищ: <code>storage</code> (хранилище PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> или <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> или <code>none</code>), <code>protected</code> (<code>true</code> или <code>false</code>), <code>notes</code> и <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> или <code>data</code>). Возвращает UPID задачи PVE."
},
{
"endpoint": "/api/vms/<vmid>/backups",
"method": "GET",
"use": "Вывести список предыдущих резервных копий ВМ или LXC во всех доступных хранилищах."
}
],
"syncVsAsyncTitle": "Два типа действий",
"syncVsAsyncBody": "Управление питанием хоста, обновление PVE и самообновление ProxMenux выполняются во временных юнитах systemd с конечной точкой <code>.../status</code>. Из перечисленных здесь действий только обновление PVE имеет маршрут отмены <code>DELETE</code>. Управление ВМ/LXC возвращает задачу PVE, состояние которой нужно опрашивать; резервное копирование возвращает UPID фоновой задачи. Принятие запроса не означает завершения операции. Требования к аутентификации и области действия прав зависят от маршрута.",
"curlTitle": "Пример curl",
"curlBody": "Запустите обновление PVE и опрашивайте его состояние до завершения — точно такую же последовательность действий выполняет автоматизация Home Assistant или плейбук Ansible:",
"curlCode": "TOKEN=<your full_admin token>\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://<host>:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://<host>:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"",
"haTitle": "Фрагмент конфигурации интеграции с Home Assistant",
"haBody": "Датчик <code>rest</code> опрашивает состояние, а <code>rest_command</code> запускает обновление. Свяжите оба компонента с кнопкой на панели управления и с любой нужной автоматизацией:",
"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": "Мониторинг состояния",
"rows": [
{
"endpoint": "/api/health",
"method": "GET",
"use": "Простая проверка работоспособности, возвращающая JSON с <code>status</code>, <code>timestamp</code> и <code>version</code>. Подходит для проверок Uptime Kuma по ключевым словам; если аутентификация включена, клиент должен отправлять заголовок с bearer-токеном."
},
{
"endpoint": "/api/health/status",
"method": "GET",
"use": "Общая оценка состояния — единый уровень серьёзности и строка сводки."
},
{
"endpoint": "/api/health/details",
"method": "GET",
"use": "Все десять категорий со статусом каждой из них и структурированными данными, на основе которых он определён."
},
{
"endpoint": "/api/health/full",
"method": "GET",
"use": "Полный снимок состояния: категории, активные ошибки, скрытые оповещения и пользовательские настройки подавления. Используются результаты фоновой проверки, если им меньше шести минут; в противном случае, а также при принудительном обновлении выполняется новая проверка."
},
{
"endpoint": "/api/health/active-errors",
"method": "GET",
"use": "Список активных оповещений с возможностью фильтрации по <code>?category=&lt;name&gt;</code>."
},
{
"endpoint": "/api/health/dismissed",
"method": "GET",
"use": "Список скрытых оповещений с оставшимся временем подавления в часах."
},
{
"endpoint": "/api/health/settings",
"method": "GET",
"use": "Текущие настроенные значения длительности подавления для каждой категории."
},
{
"endpoint": "/api/health/remote-storages",
"method": "GET",
"use": "Список удалённых хранилищ, настроенных в Proxmox, с указанием их доступности."
},
{
"endpoint": "/api/health/interfaces",
"method": "GET",
"use": "Список сетевых интерфейсов с указанием типа (мост / агрегированный / физический), IP-адреса и скорости соединения."
},
{
"endpoint": "/api/health/acknowledge",
"method": "POST",
"use": "Тело запроса: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Скрыть оповещение на срок, заданный настройкой длительности подавления для этой категории."
},
{
"endpoint": "/api/health/cleanup-orphans",
"method": "POST",
"use": "Ручное удаление ошибок, связанных с устройством или ВМ, которых больше нет. Операция идемпотентна."
}
],
"outro": "Структуры ответов и значение категорий описаны в разделе <link>Мониторинг состояния</link>."
},
"storage": {
"heading": "Хранилище",
"rows": [
{
"endpoint": "/api/storage",
"method": "GET",
"use": "Все диски, видимые хосту (блочные устройства, пулы ZFS, LVM)."
},
{
"endpoint": "/api/storage/summary",
"method": "GET",
"use": "Краткая сводка, используемая в карточках панели управления."
},
{
"endpoint": "/api/proxmox-storage",
"method": "GET",
"use": "Хранилища, определённые в Proxmox через <code>/etc/pve/storage.cfg</code>, с указанием доступности и свободного места."
},
{
"endpoint": "/api/storage/observations",
"method": "GET",
"use": "Постоянная история наблюдений за дисками — предупреждения SMART, ошибки ввода-вывода, события пулов ZFS; сохраняется и после автоматического устранения ошибок."
},
{
"endpoint": "/api/storage/smart/<disk>",
"method": "GET",
"use": "Текущие атрибуты SMART для одного диска."
},
{
"endpoint": "/api/storage/smart/<disk>/latest",
"method": "GET",
"use": "Последняя самопроверка SMART для диска."
},
{
"endpoint": "/api/storage/smart/<disk>/history",
"method": "GET",
"use": "Список сохранённых отчётов SMART для диска."
},
{
"endpoint": "/api/storage/smart/<disk>/history/<file>",
"method": "GET",
"use": "Чтение конкретного сохранённого отчёта SMART."
},
{
"endpoint": "/api/storage/smart/<disk>/test",
"method": "POST",
"use": "Запуск самопроверки SMART. Схема тела запроса: <code>'{'\"test_type\":\"short\"|\"long\"'}'</code>."
},
{
"endpoint": "/api/storage/smart/schedules",
"method": "GET",
"use": "Список запланированных на данный момент проверок SMART."
},
{
"endpoint": "/api/storage/smart/tools",
"method": "GET",
"use": "Проверка наличия <code>smartctl</code> и связанных утилит."
}
]
},
"network": {
"heading": "Сеть",
"rows": [
{
"endpoint": "/api/network",
"method": "GET",
"use": "Все интерфейсы с указанием состояния соединения и адресов."
},
{
"endpoint": "/api/network/summary",
"method": "GET",
"use": "Компактное представление, используемое на панели мониторинга."
},
{
"endpoint": "/api/network/<iface>/metrics",
"method": "GET",
"use": "Приём и передача данных (RX / TX), счётчики ошибок и временные ряды RRD для каждого интерфейса."
},
{
"endpoint": "/api/network/latency/current",
"method": "GET",
"use": "Результат последнего измерения задержки до шлюза."
},
{
"endpoint": "/api/network/latency/history",
"method": "GET",
"use": "Временной ряд задержки до шлюза."
}
]
},
"vms": {
"heading": "Виртуальные машины и контейнеры",
"rows": [
{
"endpoint": "/api/vms",
"method": "GET",
"use": "Виртуальные машины и контейнеры на локальном узле с указанием состояния, vmid и имени."
},
{
"endpoint": "/api/vms/<vmid>",
"method": "GET",
"use": "Полные сведения об одной гостевой системе (конфигурация, сеть, диски)."
},
{
"endpoint": "/api/vms/<vmid>/metrics",
"method": "GET",
"use": "Временные ряды показателей ЦП, памяти и дискового ввода-вывода для одной гостевой системы (RRD)."
},
{
"endpoint": "/api/vms/<vmid>/logs",
"method": "GET",
"use": "Журналы последних задач, относящихся только к этой гостевой системе."
},
{
"endpoint": "/api/vms/<vmid>/backups",
"method": "GET",
"use": "Список резервных копий этой гостевой системы, хранящихся на данный момент."
},
{
"endpoint": "/api/vms/<vmid>/control",
"method": "POST",
"use": "Выбор одного действия из схемы тела запроса: <code>'{'\"action\":\"start|stop|reboot|shutdown\"'}'</code>. Управление состоянием питания гостевой системы."
},
{
"endpoint": "/api/vms/<vmid>/backup",
"method": "POST",
"use": "Запуск <code>vzdump</code> для этой гостевой системы. В теле запроса задаются хранилище и режим (<code>snapshot</code> / <code>suspend</code> / <code>stop</code>)."
},
{
"endpoint": "/api/vms/<vmid>/config",
"method": "PUT",
"use": "Обновление поля описания (заметок) виртуальной машины или контейнера. Другие ключи конфигурации нельзя изменять через эту конечную точку."
},
{
"endpoint": "/api/node/metrics",
"method": "GET",
"use": "Агрегированные метрики на уровне узла (RRD)."
}
]
},
"backups": {
"heading": "Резервные копии",
"rows": [
{
"endpoint": "/api/backups",
"method": "GET",
"use": "Резервные копии, найденные в хранилищах dir, NFS, CIFS и PBS при запросе через локальный узел. Это не полное сканирование всех узлов кластера."
},
{
"endpoint": "/api/backup-storages",
"method": "GET",
"use": "Хранилища, отмеченные как целевые для резервного копирования, с указанием свободного места."
}
]
},
"logs": {
"heading": "Журналы, задачи, события",
"rows": [
{
"endpoint": "/api/logs",
"method": "GET",
"use": "Отфильтрованные записи системного журнала. Параметры запроса: <code>?priority=&service=&limit=&since_days=</code> (<code>priority</code> — 0–7, <code>since_days</code> — до 90)."
},
{
"endpoint": "/api/logs/download",
"method": "GET",
"use": "Выгрузка отфильтрованного диапазона в виде обычного текста."
},
{
"endpoint": "/api/events",
"method": "GET",
"use": "Последние задачи и события кластера Proxmox из <code>pvesh get /cluster/tasks</code>. Параметр запроса: <code>?limit=</code> (по умолчанию 50)."
},
{
"endpoint": "/api/task-log/<upid>",
"method": "GET",
"use": "Полный журнал одной задачи Proxmox по её UPID в виде обычного текста."
}
]
},
"notifications": {
"heading": "Уведомления и ИИ",
"intro": "Описание процесса отправки, пошаговые инструкции по настройке каналов и настройка переформулирования текста с помощью ИИ находятся в разделах <notifLink>Уведомления</notifLink> и <aiLink>ИИ-помощник</aiLink>.",
"rows": [
{
"endpoint": "/api/notifications",
"method": "GET",
"use": "Последние уведомления, отображаемые на панели мониторинга."
},
{
"endpoint": "/api/notifications/download",
"method": "GET",
"use": "Экспорт уведомлений в текстовом формате."
},
{
"endpoint": "/api/notifications/status",
"method": "GET",
"use": "Состояние диспетчера отправки: работает ли фоновый поток, длина очереди, последняя отправка."
},
{
"endpoint": "/api/notifications/settings",
"method": "GET",
"use": "Чтение полной конфигурации уведомлений (каналы, переключатели для отдельных событий, переформулирование текста с помощью ИИ, отображаемое имя)."
},
{
"endpoint": "/api/notifications/history",
"method": "GET",
"use": "История отправки. Параметр запроса: <code>?limit=&offset=&severity=&channel=</code>."
},
{
"endpoint": "/api/notifications/history",
"method": "DELETE",
"use": "Полная очистка таблицы истории отправки."
},
{
"endpoint": "/api/notifications/test",
"method": "POST",
"use": "Отправка тестового уведомления в один канал. Тело запроса: <code>'{'\"channel\":\"telegram\"'}'</code>."
},
{
"endpoint": "/api/notifications/send",
"method": "POST",
"use": "Создание пользовательского события. Тело запроса: <code>'{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"message\":\"...\",\"data\":'{''}''}'</code>."
},
{
"endpoint": "/api/notifications/test-ai",
"method": "POST",
"use": "Проверка подключения к провайдеру ИИ. Поля тела запроса (схематично): <code>'{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'</code>."
},
{
"endpoint": "/api/notifications/provider-models",
"method": "POST",
"use": "Список доступных моделей выбранного провайдера ИИ."
},
{
"endpoint": "/api/notifications/proxmox/setup-webhook",
"method": "POST",
"use": "Регистрация Monitor в качестве получателя вебхуков в <code>/etc/pve/notifications.cfg</code>."
},
{
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
"method": "POST",
"use": "Удаление получателя Monitor из конфигурации уведомлений PVE."
},
{
"endpoint": "/api/notifications/proxmox/read-cfg",
"method": "GET",
"use": "Чтение текущего файла <code>notifications.cfg</code> PVE в том виде, в котором его видит PVE."
}
]
},
"security": {
"heading": "Безопасность (чтение)",
"rows": [
{
"endpoint": "/api/security/firewall/status",
"method": "GET",
"use": "Состояние межсетевого экрана PVE и активные правила."
},
{
"endpoint": "/api/security/fail2ban/details",
"method": "GET",
"use": "Состояние jail Fail2Ban — полезно только в том случае, если установлен необязательный jail."
},
{
"endpoint": "/api/security/fail2ban/activity",
"method": "GET",
"use": "Последние события Fail2Ban (блокировки, снятие блокировок, запуски jail)."
},
{
"endpoint": "/api/security/lynis/status",
"method": "GET",
"use": "Сведения о последнем запуске Lynis (установлен ли Lynis, дата и время последнего сканирования)."
},
{
"endpoint": "/api/security/lynis/report",
"method": "GET",
"use": "Последний отчёт аудита Lynis (предупреждения, рекомендации, индекс защищённости)."
},
{
"endpoint": "/api/security/tools",
"method": "GET",
"use": "Определение установленных необязательных инструментов безопасности (Fail2Ban, Lynis)."
}
]
},
"proxmenuxIntegration": {
"heading": "Интеграция с ProxMenux",
"rows": [
{
"endpoint": "/api/proxmenux/update-status",
"method": "GET",
"use": "Наличие обновления для ProxMenux Monitor, текущая и последняя версии."
},
{
"endpoint": "/api/proxmenux/installed-tools",
"method": "GET",
"use": "Список всех оптимизаций ProxMenux после установки, зарегистрированных на данный момент на хосте (из <code>/usr/local/share/proxmenux/installed_tools.json</code>)."
},
{
"endpoint": "/api/proxmenux/tool-source/<key>",
"method": "GET",
"use": "Исходный код сопоставленной функции оптимизации после установки, извлечённый из текущих скриптов хоста или сохранённого устаревшего кода. Не гарантируется, что это точная копия кода, который был выполнен изначально."
}
]
},
"prometheus": {
"heading": "Метрики Prometheus",
"intro": "Конечная точка <code>GET /api/prometheus</code>, требующая аутентификации, возвращает данные в текстовом формате экспозиции Prometheus версии 0.0.4. Каждая метрика включает <code>node=\"&lt;hostname&gt;\"</code> и явно указанную временную метку. Собирайте эти данные с помощью Prometheus или другой совместимой базы данных временных рядов.",
"exportedTitle": "Экспортируемые метрики",
"headerGroup": "Группа",
"headerMetric": "Метрика",
"headerDesc": "Описание",
"groups": [
{
"group": "Система",
"metrics": [
{
"metric": "proxmox_cpu_usage",
"desc": "Загрузка процессора в процентах (тип gauge)."
},
{
"metric": "proxmox_memory_total_bytes",
"desc": "Общий объём физической памяти в байтах."
},
{
"metric": "proxmox_memory_used_bytes",
"desc": "Объём используемой памяти в байтах."
},
{
"metric": "proxmox_memory_usage_percent",
"desc": "Использование памяти в процентах."
},
{
"metric": "proxmox_load_average",
"desc": "Средняя нагрузка на систему. Метка <code>period=\"1m\" | \"5m\" | \"15m\"</code>."
}
]
},
{
"group": "Время непрерывной работы",
"metrics": [
{
"metric": "proxmox_uptime_seconds",
"desc": "Количество секунд с момента последней загрузки."
}
]
},
{
"group": "Оборудование",
"metrics": [
{
"metric": "proxmox_cpu_temperature_celsius",
"desc": "Температура корпуса процессора."
},
{
"metric": "proxmox_disk_temperature_celsius",
"desc": "Температура каждого диска. Метка <code>disk</code>."
},
{
"metric": "proxmox_fan_speed_rpm",
"desc": "Скорость вращения вентиляторов. Метка <code>fan</code>."
}
]
},
{
"group": "Дисковое пространство",
"metrics": [
{
"metric": "proxmox_disk_total_bytes",
"desc": "Общая ёмкость для каждой экспортируемой записи о диске. Метка <code>disk</code>."
},
{
"metric": "proxmox_disk_used_bytes",
"desc": "Используемая ёмкость для каждой экспортируемой записи о диске."
},
{
"metric": "proxmox_disk_usage_percent",
"desc": "Процент используемой ёмкости для каждой экспортируемой записи о диске."
}
]
},
{
"group": "Сеть",
"metrics": [
{
"metric": "proxmox_network_bytes_sent_total",
"desc": "Общее количество отправленных байтов (счётчик)."
},
{
"metric": "proxmox_network_bytes_received_total",
"desc": "Общее количество полученных байтов (счётчик)."
},
{
"metric": "proxmox_interface_bytes_sent_total",
"desc": "Количество отправленных байтов по каждому интерфейсу. Метка <code>interface</code>."
},
{
"metric": "proxmox_interface_bytes_received_total",
"desc": "Количество полученных байтов по каждому интерфейсу."
}
]
},
{
"group": "Виртуальные машины / контейнеры",
"metrics": [
{
"metric": "proxmox_vms_total",
"desc": "Общее количество виртуальных машин и контейнеров LXC."
},
{
"metric": "proxmox_vms_running",
"desc": "Количество запущенных гостевых систем."
},
{
"metric": "proxmox_vms_stopped",
"desc": "Количество остановленных гостевых систем."
},
{
"metric": "proxmox_vm_status",
"desc": "Состояние каждой виртуальной машины или контейнера (1 = запущен, 0 = иначе). Метки <code>node</code>, <code>vmid</code>, <code>name</code>."
},
{
"metric": "proxmox_vm_cpu_usage",
"desc": "Использование процессора каждой виртуальной машиной или контейнером. Те же метки."
},
{
"metric": "proxmox_vm_memory_used_bytes / _max_bytes",
"desc": "Используемая память и настроенный максимальный объём памяти для каждой виртуальной машины или контейнера."
}
]
},
{
"group": "GPU",
"metrics": [
{
"metric": "proxmox_gpu_temperature_celsius",
"desc": "Температура GPU. Метки <code>slot</code>, <code>vendor</code>; также включена метка с названием GPU."
},
{
"metric": "proxmox_gpu_utilization_percent",
"desc": "Процент загрузки GPU."
},
{
"metric": "proxmox_gpu_memory_total_bytes",
"desc": "Общий объём памяти GPU."
},
{
"metric": "proxmox_gpu_power_draw_watts",
"desc": "Потребляемая мощность GPU в ваттах."
},
{
"metric": "proxmox_gpu_clock_speed_mhz",
"desc": "Тактовая частота ядра GPU."
},
{
"metric": "proxmox_gpu_memory_clock_mhz",
"desc": "Тактовая частота памяти GPU."
}
]
},
{
"group": "UPS",
"metrics": [
{
"metric": "proxmox_ups_battery_charge_percent",
"desc": "Уровень заряда батареи в процентах."
},
{
"metric": "proxmox_ups_load_percent",
"desc": "Текущая нагрузка на ИБП."
},
{
"metric": "proxmox_ups_runtime_seconds",
"desc": "Расчётное время работы от батареи."
},
{
"metric": "proxmox_ups_input_voltage_volts",
"desc": "Входное напряжение."
}
]
}
],
"scrapeTitle": "Конфигурация сбора метрик Prometheus",
"scrapeIntro": "Если аутентификация включена, передайте токен API в заголовке Bearer в конфигурации сбора метрик Prometheus:",
"perHostTitle": "Сбор метрик с каждого хоста",
"perHostBody": "Каждый экземпляр ProxMenux Monitor экспортирует метрики хоста, на котором работает. В кластере настройте Prometheus на сбор метрик с каждого узла — метка <code>node</code> в каждом временном ряду позволяет различать узлы в запросах Grafana (<code>proxmox_vms_running'{'node=\"pve01\"'}'</code>)."
},
"puttingItTogether": {
"heading": "Объединяем всё вместе",
"body": "Полные примеры подключения этих конечных точек к датчикам Home Assistant, карточкам Homepage, панелям Grafana, рабочим процессам n8n и другим инструментам приведены на отдельной странице <link>Интеграции</link>. На ней разобрана типовая настройка для каждой платформы с готовой конфигурацией для копирования и вставки. Эта страница посвящена только самому каталогу."
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Доступ и аутентификация",
"href": "/docs/monitor/access-auth",
"tail": " — создание токенов, журнал аудита, необязательная настройка jail для Fail2Ban, настройка TLS."
},
{
"label": "Уведомления",
"href": "/docs/monitor/notifications",
"tailRich": " — какие данные содержит каждый тип события в <code>data</code> при вызове <code>/api/notifications/send</code>."
},
{
"label": "ИИ-ассистент",
"href": "/docs/monitor/ai-assistant",
"tailRich": " — как связаны <code>/api/notifications/test-ai</code> и <code>/api/notifications/provider-models</code>."
},
{
"label": "Мониторинг состояния",
"href": "/docs/monitor/health-monitor",
"tailRich": " — структура ответа <code>/api/health/*</code> и значение десяти категорий."
}
]
}
}
@@ -0,0 +1,303 @@
{
"meta": {
"title": "Архитектура ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux",
"description": "Как устроен ProxMenux Monitor: структура AppImage, модули Blueprint Flask, фоновые рабочие процессы, источники данных (psutil, pvesh, smartctl, journalctl), постоянное хранение данных в SQLite, терминал WebSocket, провайдеры ИИ, каналы уведомлений, обратный прокси и необязательная интеграция с Fail2Ban.",
"ogTitle": "Архитектура ProxMenux Monitor",
"ogDescription": "Внутреннее устройство ProxMenux Monitor — структура AppImage, модули Blueprint Flask, фоновые рабочие процессы, SQLite, WebSocket, провайдеры ИИ, каналы уведомлений.",
"twitterTitle": "Архитектура ProxMenux Monitor",
"twitterDescription": "AppImage, Flask, SQLite, WebSocket, провайдеры ИИ и каналы уведомлений — внутреннее устройство Monitor."
},
"header": {
"title": "Архитектура",
"description": "Как упакован ProxMenux Monitor, что работает внутри AppImage и как запросы проходят от браузера через серверную часть Flask к инструментам хоста и хранилищу SQLite.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "Один процесс, много задач",
"body": "Один процесс Python прослушивает TCP-порт 8008. Он обслуживает статическую сборку Next.js, предоставляет REST API, обрабатывает работу терминала WebSocket, периодически запускает Health Monitor и отправляет уведомления. Отдельного веб-сервера, брокера сообщений и внешней базы данных нет."
},
"requestFlow": {
"heading": "Путь запроса",
"intro": "Типичный запрос данных для панели мониторинга проходит следующий путь; настройки, используемые только в браузере, могут обрабатываться локально:",
"diagramCaption": "Защищённые маршруты проверяют JWT, если аутентификация включена. Основные маршруты и модули Blueprint возвращают данные хоста из кэша или собирают новые. Необязательный обработчик Fail2Ban проверяет свой кэшированный список блокировок jail. Заголовкам с перенаправленным IP-адресом клиента доверяют только при PROXMENUX_TRUST_PROXY=1; в противном случае используется адрес узла, установившего соединение. Постоянно хранимое состояние включает базы данных SQLite и файлы JSON, в том числе auth.json.",
"diagramArrowLabel": "HTTP / WS",
"nodes": {
"clientLabel": "Клиент",
"clientDetail": "Браузер или PWA\n+ необязательный\nпрокси Nginx / Caddy /\nTraefik",
"flaskLabel": "Flask :8008",
"flaskDetail": "Модули Blueprint\nПромежуточный обработчик JWT\nОбработчик Fail2Ban\n(если установлен)",
"hostLabel": "Инструменты хоста",
"hostDetail": "psutil\npvesh\nsmartctl\njournalctl",
"stateLabel": "Локальное состояние",
"stateDetail": "БД SQLite\n+ auth.json"
},
"threadsIntro": "Процесс также запускает <strong>фоновые потоки</strong>. Приведённые ниже примеры собирают данные хоста, обновляют кэши и SQLite, а также отправляют уведомления. Существуют и другие рабочие потоки, а доставка уведомлений зависит от того, включена ли она в настройках:",
"headerThread": "Поток",
"headerCadence": "Периодичность",
"headerJob": "Задача",
"rows": [
{
"thread": "_temperature_collector_loop",
"cadence": "60 с",
"job": "Записывает температуру процессора и измеренное значение сетевой задержки в базу данных истории, чтобы графики панели мониторинга содержали данные, даже когда ни один клиент не подключён."
},
{
"thread": "_health_collector_loop",
"cadence": "5 мин",
"job": "Выполняет полный цикл Health Monitor (10 категорий), сохраняет активные ошибки, сведения об их отклонении и результаты наблюдений за дисками, а также передаёт новые события в механизм уведомлений."
},
{
"thread": "_vital_signs_sampler",
"cadence": "Процессор — 5 с; температура — 15 с; память — 30 с",
"job": "Измеряет загрузку процессора, использование памяти и температуру процессора для отображения текущих показателей и выявления длительно сохраняющихся состояний независимо от сборщика данных о состоянии системы, работающего с пятиминутным интервалом."
},
{
"thread": "notification_manager.start()",
"cadence": "по событиям",
"job": "Запускает средства отслеживания журнала, задач и хуков (<code>JournalWatcher</code>, <code>TaskWatcher</code>, <code>ProxmoxHookWatcher</code>) и отправляет уведомления в настроенные каналы с возможностью переформулирования текста с помощью ИИ."
}
]
},
"systemd": {
"heading": "Юнит systemd",
"intro": "Установщик размещает файл юнита по пути <code>/etc/systemd/system/proxmenux-monitor.service</code>. Содержимое по умолчанию:",
"items": [
"<strong><code>User=root</code></strong> — поддерживаемая служба работает с правами root для выполнения операций на хосте, таких как доступ к SMART, использование <code>pvesh</code> и управление ZFS. Процессы её веб-терминала наследуют эти права.",
"<strong><code>Restart=on-failure</code></strong> с задержкой в 10 секунд перед повторным запуском — при завершении с ненулевым кодом выхода служба автоматически перезапускается.",
"<strong><code>After=network.target pve-cluster.service</code></strong>: задаёт запуск после сетевой цели и кластерной файловой системы Proxmox; это не гарантирует наличия назначенного IP-адреса, доступности DNS или подключения к внешней сети."
],
"inspectTitle": "Просмотр действующего юнита"
},
"appimage": {
"heading": "Что содержит AppImage",
"intro": "AppImage представляет собой самомонтируемую файловую систему. <code>AppRun</code> в её корне настраивает окружение и запускает <code>flask_server.py</code> с заменой текущего процесса:",
"consequencesIntro": "У такой структуры есть два следствия:",
"consequences": [
"<strong>Пакеты Python включены в поставку.</strong> Пакеты Python поставляются внутри AppImage и выполняются с помощью установленного на хосте интерпретатора Python 3.11 (PVE 8) или 3.13 (PVE 9), без установки чего-либо в системное окружение Python хоста. При этом приложение по-прежнему использует интерфейсы ядра и внешние инструменты хоста.",
"<strong>Клиенты для работы с оборудованием тоже включены в поставку.</strong> В комплект входят <code>ipmitool</code>, <code>lm-sensors</code> и <code>upsc</code>. Получение показаний по-прежнему зависит от наличия поддерживаемого оборудования, доступа к датчикам, а для данных ИБП — от наличия настроенного сервера NUT."
]
},
"flask": {
"heading": "Структура приложения Flask",
"intro": "<code>flask_server.py</code> создаёт один экземпляр <code>Flask(__name__)</code> с ограниченным набором разрешённых источников CORS, напрямую регистрирует десять Blueprint и инициализирует маршруты терминала. В таблице представлены основные модули; также регистрируются Blueprint для PBS, ссылок Monitor, аудита и резервного копирования ВМ. Процедуры предварительного прогрева, специфичные для PVE, запускаются только на хостах PVE.",
"headerBlueprint": "Blueprint / модуль",
"headerPrefix": "Префикс маршрутов",
"headerOwns": "Зона ответственности",
"rows": [
{
"blueprint": "flask_server.py",
"prefix": [
"/api/system",
"/api/storage",
"/api/network",
"/api/vms",
"/api/hardware",
"/api/logs",
"/api/prometheus"
],
"owns": "Основные конечные точки данных, обслуживание статической панели мониторинга и необязательная проверка Fail2Ban на уровне приложения (активна только при установленном на хосте Fail2Ban с jail <code>proxmenux</code>)."
},
{
"blueprint": "flask_auth_routes.py",
"prefix": [
"/api/auth/*"
],
"owns": "Вход в систему, выдача JWT, настройка и проверка TOTP, смена пароля, создание токенов API."
},
{
"blueprint": "flask_health_routes.py",
"prefix": [
"/api/health/*"
],
"owns": "Проверки работоспособности, подробный статус, активные и скрытые ошибки, а также настройки подавления ошибок. Защищённые маршруты требуют аутентификации, если она включена."
},
{
"blueprint": "flask_terminal_routes.py",
"prefix": [
"/api/terminal/* + WS"
],
"owns": "Выделение PTY для каждого сеанса и передача данных по каналу из WebSocket в <code>xterm.js</code> в браузере."
},
{
"blueprint": "flask_notification_routes.py",
"prefix": [
"/api/notifications/*"
],
"owns": "Создание, чтение, обновление и удаление каналов, тестовая отправка, настройка поставщика ИИ, история и ручная отправка."
},
{
"blueprint": "flask_security_routes.py",
"prefix": [
"/api/security/*"
],
"owns": "Неудачные попытки аутентификации, а при установленном Fail2Ban — состояние jail, события блокировки и ручное снятие блокировки."
},
{
"blueprint": "flask_proxmenux_routes.py",
"prefix": [
"/api/proxmenux/*"
],
"owns": "Чтение сведений о послеустановочных оптимизациях ProxMenux, записанных в реестре хоста."
},
{
"blueprint": "flask_oci_routes.py",
"prefix": [
"/api/oci/*"
],
"owns": "Вспомогательные средства развёртывания приложений OCI / контейнерных приложений (Proxmox VE 9.1+)."
}
],
"endpointsLink": "Конечные точки интеграции и форматы их запросов и ответов описаны в <link>справочнике API</link>."
},
"dataSources": {
"heading": "Источники данных",
"intro": "Данные хоста поступают в основном из стандартных библиотек, файлов и административных команд. Некоторые сведения о гостевых системах также зависят от QEMU Guest Agent или команд, выполняемых внутри CT:",
"headerSource": "Источник",
"headerUsedFor": "Назначение",
"rows": [
{
"source": "psutil",
"usedFor": "Загрузка ЦП, память, пространство подкачки, использование точек монтирования, счётчики сетевых интерфейсов, список процессов."
},
{
"source": "pvesh / qm / pct",
"usedFor": "Сведения об узле Proxmox, перечень и конфигурация VM и CT, пулы хранения, история задач."
},
{
"source": "smartctl",
"usedFor": "Атрибуты SATA / NVMe, состояние SMART, износ / срок службы, модель и серийный номер."
},
{
"source": "zpool / zfs",
"usedFor": "Состояние пула (ONLINE / DEGRADED / FAULTED / UNAVAIL), ход проверки целостности (scrub), использование наборов данных."
},
{
"source": "journalctl",
"usedFor": "Системные журналы, принудительное завершение процессов из-за нехватки памяти (OOM), ошибки ATA / NVMe / dm, события безопасности, пользовательские юниты служб."
},
{
"source": "ip / iproute2",
"usedFor": "Интерфейсы, адреса, мосты, агрегированные интерфейсы, устройства под управлением OVS."
},
{
"source": "nvidia-smi · intel_gpu_top",
"usedFor": "Доступные показатели загрузки GPU, видеопамяти, температуры и работы кодировщика/декодировщика; набор полей зависит от производителя, утилиты и драйвера."
},
{
"source": "lspci · lscpu · dmidecode",
"usedFor": "Топология PCIe, модель и топология процессора, сведения о системной плате и BIOS."
},
{
"source": "ipmitool · sensors",
"usedFor": "Датчики внеполосного управления, скорости вращения вентиляторов, температуры системной платы (при наличии поддержки)."
},
{
"source": "upsc (NUT)",
"usedFor": "Состояние батареи ИБП, нагрузка и оставшееся время автономной работы — если на узле настроен сервер NUT."
}
],
"cacheTitle": "Результаты кэшируются — не каждый запрос обращается к узлу",
"cacheBody": "Результаты обращения к ресурсоёмким источникам (<code>smartctl -a</code>, <code>pvesh get</code>) кэшируются с ограниченным сроком действия внутри процесса Flask, чтобы активная вкладка панели мониторинга не создавала чрезмерную нагрузку на диск или API кластера. Срок действия кэша настраивается отдельно для каждого источника: несколько секунд для текущих метрик, несколько минут для SMART."
},
"persistence": {
"heading": "Постоянное хранение данных",
"intro": "Файлы состояния различаются по содержимому и требованиям к доступу:",
"headerPath": "Путь",
"headerOwner": "Владелец",
"headerContents": "Содержимое",
"rows": [
{
"path": "/usr/local/share/proxmenux/health_monitor.db",
"owner": "root:root",
"contents": "База данных SQLite. Таблицы: <code>errors</code>, <code>events</code>, <code>disk_registry</code>, <code>disk_observations</code>, <code>user_settings</code>, <code>notification_history</code>, <code>excluded_storages</code>, <code>excluded_interfaces</code>. Режим журналирования WAL."
},
{
"path": "/usr/local/share/proxmenux/.notification_key",
"owner": "root <code>0600</code>",
"contents": "32-байтовый мастер-ключ для формата ENC2, используемого для хранения секретов уведомлений. Реализация использует отдельную случайную соль для каждого значения, производные ключи и код аутентификации сообщения (MAC); для миграции поддерживаются старые значения, зашифрованные с помощью XOR с фиксированным ключом."
},
{
"path": "/root/.config/proxmenux-monitor/auth.json",
"owner": "root:root",
"contents": "Настройки аутентификации: флаг включения, имя пользователя, хеш пароля PBKDF2-HMAC-SHA256 с солью, секрет TOTP, резервные коды, уникальный для установки секрет подписи JWT, метаданные токенов API и хеши отозванных токенов. Устаревшие хеши паролей SHA-256 преобразуются при успешном входе."
},
{
"path": "/var/log/proxmenux-auth.log",
"owner": "root:root",
"contents": "Текстовый журнал событий аутентификации, записываемый независимо от Fail2Ban. Если jail <code>[proxmenux]</code> установлен и включён, он читает этот журнал для обнаружения повторных неудачных попыток входа. Без этого jail журнал остаётся доступным для просмотра."
}
],
"backupTitle": "Создайте резервную копию auth.json перед переустановкой",
"backupBody": "При замене AppImage обычно сохраняются <code>/root/.config/proxmenux-monitor/auth.json</code> и <code>/usr/local/share/proxmenux/health_monitor.db</code>. Сохраните <code>auth.json</code> вместе с уникальным для установки jwt_secret, чтобы сохранить действительность токенов и их метаданные. База данных хранит состояние мониторинга работоспособности и уведомлений независимо. Создайте резервную копию <code>.notification_key</code> вместе с базой данных, чтобы восстановить зашифрованные настройки каналов; восстановление только базы данных не восстанавливает аутентификацию API."
},
"health": {
"heading": "Цикл мониторинга работоспособности",
"intro": "Примерно каждые пять минут фоновый сборщик вызывает <code>health_monitor.py</code> для выполнения проверок, на которых основаны десять категорий панели мониторинга:",
"items": [
"Критически важные службы PVE (<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>).",
"Пулы хранилищ Proxmox (<code>pvesh get /storage</code> и доступность каждого хранилища).",
"Диски и файловые системы: SMART, ошибки ввода-вывода в dmesg, состояние пулов ZFS, заполненность точек монтирования.",
"Виртуальные машины и контейнеры: неудачные запуски, аварийное завершение гостевых систем, ошибки QMP, сбои при выключении.",
"Сеть: состояние мостов и агрегированных интерфейсов, состояние соединений, задержка до шлюза.",
"Обновления: ожидающие установки обновления пакетов и исправления безопасности.",
"Журналы: выявление устойчивых, всплесковых и каскадных событий в системном журнале.",
"Память: активность OOM killer, длительная высокая нагрузка на подсистему памяти.",
"Процессор: загрузка и температура проверяются на соответствие настраиваемым пороговым значениям; доступность датчиков зависит от оборудования.",
"Безопасность: ошибки аутентификации, события блокировки, состояние jail в fail2ban."
],
"afterIntro": "Для выявленных проблем используются стабильный <code>error_key</code>, категория и уровень серьёзности. Существующие записи в <code>errors</code> обновляются на месте (<code>last_seen</code>, уровень серьёзности, причина), а не дублируются. Для доставки уведомлений также предусмотрены собственный идентификатор и правила ограничения частоты отправки.",
"cycleEnd": "Очистка может автоматически помечать устаревшие ошибки как устранённые, используя значения <em>Длительность подавления</em> для категорий и правила, учитывающие состояние, удалять записи, относящиеся к уже удалённым ресурсам, а также удалять <code>events</code> старше 30 дней. Категории и панель мониторинга описаны в <link>Dashboard → Health Monitor</link>."
},
"notifications": {
"heading": "Механизм уведомлений",
"intro": "<code>notification_manager.py</code> координирует работу механизма уведомлений. Он загружает настроенные каналы, управляет очередью доставки и предоставляет как API для Python (для маршрутов Flask и цикла Health Monitor), так и точку входа CLI (для скриптов-хуков <code>.sh</code>, поставляемых с ProxMenux).",
"items": [
"<strong>Наблюдатели</strong> отправляют события: <code>JournalWatcher</code> отслеживает новые записи в системном журнале, <code>TaskWatcher</code> опрашивает список задач Proxmox, <code>ProxmoxHookWatcher</code> реагирует на хуки резервного копирования, репликации и создания снимков, а <code>PollingCollector</code> обрабатывает медленные источники данных.",
"<strong>Шаблоны</strong> преобразуют событие в пару «заголовок, текст». Тот же шаблон может обрабатываться настроенным провайдером ИИ (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) для получения формулировки на понятном языке; обе версии сохраняются в <code>notification_history</code>.",
"<strong>Каналы</strong> доставляют сообщения через различные сервисы, включая Telegram, Discord, электронную почту, Gotify, Pushover и Apprise. Реализации в <code>notification_channels.py</code> используют общий интерфейс <code>create_channel()</code> / <code>send()</code>.",
"<strong>Шифрование.</strong> Конфиденциальные настройки (<code>telegram.bot_token</code>, <code>discord.webhook_url</code>, <code>pushover.user_key</code>, <code>pushover.api_token</code>, <code>ai_api_key_*</code>, <code>email.password</code>) шифруются ключом из <code>.notification_key</code> перед записью в базу данных и скрываются в интерфейсе."
],
"linksFooter": "Переключатели для отдельных событий, переопределения каналов и настройки ИИ доступны в <notifLink>Settings → Notifications</notifLink> и <aiLink>Settings → AI Assistant</aiLink>."
},
"websocket": {
"heading": "Терминал WebSocket",
"intro": "Вкладка <em>Терминал</em> на панели мониторинга представляет собой тонкий клиент <code>xterm.js</code>, подключённый к серверному PTY через WebSocket. Доступны два режима передачи данных:",
"items": [
"<strong>Режим HTTP (по умолчанию):</strong> встроенный сервер Flask с <code>flask-sock</code> обрабатывает запросы на переключение протокола на WebSocket.",
"<strong>Режим HTTPS / WSS:</strong> сервер TLS использует <code>gevent.pywsgi.WSGIServer</code> со стандартным обработчиком; <code>flask-sock</code> обрабатывает соединения WebSocket через TLS."
],
"outro": "Дочерние процессы терминала наследуют <code>User=root</code> от службы. Для открытия WebSocket требуется краткосрочный одноразовый билет, полученный через конечную точку terminal-ticket с аутентификацией и административными правами доступа.",
"proxyNote": "Если вы обращаетесь к Monitor через обратный прокси-сервер, убедитесь, что пересылка WebSocket включена (заголовки <code>Upgrade</code> и <code>Connection</code>). Без неё терминал работать не будет."
},
"proxy": {
"heading": "Обратный прокси и Fail2Ban",
"intro": "Выбор IP-адреса клиента и необязательная блокировка на уровне приложения зависят от следующих настроек и компонентов:",
"items": [
"<strong>Выбор IP-адреса клиента.</strong> Проверка блокировки и журналирование аутентификации в <code>before_request</code> доверяют <code>X-Forwarded-For</code>, затем <code>X-Real-IP</code>, только если PROXMENUX_TRUST_PROXY=1. В остальных случаях используется <code>request.remote_addr</code>. Заголовки переадресации не принимаются автоматически.",
"<strong>Необязательная блокировка на уровне приложения с помощью Fail2Ban.</strong> При подключении через прокси TCP-соединение может определять прокси как удалённую сторону. Если доступен доверенный адрес клиента и активна jail <code>proxmenux</code>, Flask отклоняет запросы с IP-адресов из списка блокировки, возвращая HTTP 403. Список блокировки кэшируется на 30 секунд и после истечения этого срока обновляется при обработке запросов, а не опрашивается отдельным таймером."
],
"calloutTitle": "Fail2Ban не входит в комплект поставки",
"calloutBody": "Fail2Ban <strong>не</strong> входит в комплект поставки и не устанавливается автоматически. Его можно установить с помощью необязательной процедуры Monitor Security или <link>Security → Fail2Ban</link> в ProxMenux Scripts. Если отсутствует <code>fail2ban-client</code> или jail <code>proxmenux</code>, этот механизм приложения не блокирует запросы. Настроенная политика аутентификации по-прежнему действует.",
"outro": "Примеры конфигурации обратного прокси (Nginx / Caddy / Traefik) и пошаговое руководство по настройке jail Fail2Ban приведены в разделах <accessLink>Доступ и аутентификация</accessLink> и <fail2banLink>Security → Fail2Ban</fail2banLink>."
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Доступ и аутентификация",
"href": "/docs/monitor/access-auth",
"tail": " — настройка при первом запуске, пароль и двухфакторная аутентификация TOTP, примеры конфигурации обратного прокси, jail Fail2Ban."
},
{
"label": "Справочник API",
"href": "/docs/monitor/api",
"tail": " — конечные точки интеграции, управление токенами и правила аутентификации."
},
{
"label": "Настройки → ProxMenux Monitor",
"href": "/docs/settings/proxmenux-monitor",
"tail": " — включение и отключение службы через меню и процедура проверки её состояния в TUI ProxMenux."
}
]
}
}
@@ -0,0 +1,211 @@
{
"meta": {
"title": "Оценка и инвентаризация | Audit & Report",
"description": "Оценка Audit & Report: профили отчётов, классификация результатов, принятые риски, недоступные для чтения источники, Lynis и инвентаризация узла."
},
"header": {
"title": "Оценка и инвентаризация",
"description": "В ходе оценки проверяется узел и сохраняются результаты проверки. В зависимости от профиля отчёта оценка отвечает на разные вопросы.",
"section": "Audit и отчёт"
},
"sections": [
{
"id": "read-only",
"blocks": [
{
"calloutInfo": {
"title": "Оценка проверяет конфигурацию, но не изменяет её",
"body": "В ходе оценки считываются конфигурация и состояние хоста. Результаты, отчёты и журналы записываются на диск, а проверки загрузки могут кратковременно монтировать системные разделы EFI. Проверяемая конфигурация не изменяется."
}
},
{
"p": "Кнопка <strong>Запустить оценку</strong> запускает оценку с профилем, выбранным в разделе <strong>Отчёт</strong>. На экране отображаются дата последнего запуска и время, прошедшее с него."
}
]
},
{
"id": "profiles",
"title": "Профили отчётов",
"intro": "Каждый профиль отвечает на свой вопрос. Проверки и разделы выбираются до формирования документа.",
"blocks": [
{
"table": {
"headers": [
"Профиль",
"Что включает"
],
"rows": [
[
"Полный аудит",
"Все проверки и вся доступная структура отчёта."
],
[
"Быстрая диагностика",
"Все проверки; в начале результатов приводятся критические проблемы, предупреждения и показатели, которые не удалось проверить."
],
[
"Инвентаризация",
"Описание узла без проверок и классификации."
],
[
"Проверка безопасности",
"Доступность извне, доступ, привилегии, сертификаты, обновления, репозитории и Lynis."
],
[
"Проверка надёжности резервного копирования",
"Охват резервным копированием, давность резервных копий, результаты копирования, проверка, хранение и восстановление."
],
[
"Ресурсы и износ",
"Запас ресурсов для роста, память, использование дискового пространства и срок службы дисков."
]
]
}
},
{
"p": "Содержание каждого документа описано в разделе <reportsLink>Отчёты и сравнения</reportsLink>."
}
]
},
{
"id": "results",
"title": "Как классифицируются результаты",
"blocks": [
{
"table": {
"headers": [
"Классификация",
"Значение"
],
"rows": [
[
"Критическая проблема",
"Невыполненное условие, требующее первоочередного внимания."
],
[
"Предупреждение",
"Условие, требующее дополнительного рассмотрения с учётом имеющихся данных или действующей политики."
],
[
"Наблюдение",
"Информация об узле, которая не классифицируется как проблема."
],
[
"Не проверено",
"Не удалось прочитать источник данных, необходимый для проверки. Это не означает, что проблема отсутствует."
],
[
"Соответствует требованиям",
"Условие соответствует применённому критерию."
],
[
"Неприменимо",
"Ни один элемент в области проверки не применим."
],
[
"Принятый риск",
"Проблема существует, и решение по ней зафиксировано."
],
[
"Исключено политикой",
"Политика предписывает не учитывать этот элемент при подсчёте."
]
]
}
},
{
"p": "Выявленные проблемы можно фильтровать по областям: система, хранилище, сеть, безопасность, резервное копирование, гостевые системы и оборудование. Для каждой проблемы сохраняются подтверждающие данные с указанием источника, из которого они были получены."
}
]
},
{
"id": "unverified",
"title": "Когда не удаётся прочитать источник",
"blocks": [
{
"table": {
"headers": [
"Ситуация",
"Поведение"
],
"rows": [
[
"Не проверено",
"Проверка сохраняет свой идентификатор, указывает в подтверждающих данных, какой источник не удалось прочитать, и не трактует отсутствие данных как соответствие требованиям."
],
[
"Неполные подтверждающие данные",
"В отчёте указаны источник и время сбора данных, чтобы можно было отличить реальную проблему от недостатка полученных данных."
],
[
"Повторный запуск",
"После устранения проблемы с доступом, пакетом или службой тот же профиль запускается повторно, а сравнение показывает, удалось ли проверить результат."
]
]
}
}
]
},
{
"id": "lynis",
"title": "Lynis",
"blocks": [
{
"p": "Для проверки безопасности используется отчёт Lynis по хосту. Если Lynis ещё не запускался или его отчёт старше установленного политикой порога, диалоговое окно предлагает варианты <strong>Запустить с Lynis</strong>, что займёт на несколько минут больше, или <strong>Запустить без Lynis</strong>, при котором используется существующий отчёт."
}
]
},
{
"id": "accept",
"title": "Принятие риска",
"blocks": [
{
"p": "Действие <strong>Принять риск</strong> фиксирует решение по выявленной проблеме. Причину необходимо указать; она сохраняется вместе с автором и датой."
},
{
"table": {
"headers": [
"Поле",
"Варианты"
],
"rows": [
[
"Причина",
"Обязательное поле для произвольного текста."
],
[
"Срок действия",
"90 дней, 180 дней, 1 год или бессрочно. По истечении срока выявленная проблема снова становится активной."
],
[
"Напомнить о пересмотре",
"Напоминание, позволяющее вновь обратить внимание на решение, пока оно остаётся в силе."
]
]
}
},
{
"p": "Проблема с принятым риском остаётся видимой вместе с решением по ней, а действие <strong>Вернуть в активные</strong> отменяет это решение. Принятие риска не означает устранения проблемы: при сравнении риск отмечается как принятый, а не как устранённый."
}
]
},
{
"id": "inventory",
"title": "Инвентаризация",
"blocks": [
{
"list": {
"items": [
"Идентификационные сведения, версия Proxmox VE, ядро, подписка и кластер.",
"Процессор, память, системная плата, BIOS, контроллеры и IOMMU.",
"Диски, SMART, часы работы и зарегистрированные события.",
"Адаптеры, объединения сетевых интерфейсов, мосты, задержка и соединения.",
"Хранилища, гостевые системы с их дисками и интерфейсами, а также резервные копии.",
"Проброс PCI и программное обеспечение, которым управляет ProxMenux."
]
}
}
]
}
]
}
@@ -0,0 +1,201 @@
{
"meta": {
"title": "Изменения | Audit & Report",
"description": "Журнал изменений Audit & Report: что ProxMenux изменил на узле, что было до этого, в чём разница и можно ли отменить изменения."
},
"header": {
"title": "Изменения",
"description": "Журнал операций, которые ProxMenux выполняет на узле, и состояния до и после каждой операции, если оно было зафиксировано.",
"section": "Audit и отчёт"
},
"sections": [
{
"id": "purpose",
"blocks": [
{
"calloutInfo": {
"title": "От запущенного скрипта до внесённого им изменения",
"body": "Длинная функция может изменить всего две строки. Журнал сохраняет каждую конкретную операцию с указанием выполнивших её скрипта, функции и версии, затронутого ресурса, различий и возможности отмены."
}
},
{
"flow": {
"nodes": [
{
"label": "Скрипт",
"detail": "функция + версия"
},
{
"label": "Фиксация",
"detail": "содержимое до изменения"
},
{
"label": "Операция",
"detail": "файл · пакет · служба"
},
{
"label": "Журнал",
"detail": "источник изменения + различия"
}
],
"caption": "Состояние фиксируется при выполнении операции, а зафиксированные данные сводятся воедино, когда Monitor читает журнал."
}
}
]
},
{
"id": "types",
"title": "Типы записей",
"intro": "Фильтр в верхней части позволяет отбирать записи по типу.",
"blocks": [
{
"table": {
"headers": [
"Тип",
"Что фиксируется"
],
"rows": [
[
"Конфигурация",
"ProxMenux записал, отредактировал или удалил файл, изменил настройку или внёс изменения в службу."
],
[
"Установки",
"ProxMenux добавил пакет или компонент; пакеты, которые действительно были добавлены, зафиксированы в журнале."
],
[
"Выполнения",
"ProxMenux выполнил команду; то, какие изменения она внесла, зависит от самой команды."
],
[
"Применено",
"Функция была применена до появления журнала; состояние до её применения не было зафиксировано."
]
]
}
}
]
},
{
"id": "groups",
"title": "Как организовано представление",
"blocks": [
{
"table": {
"headers": [
"Раздел",
"Содержимое"
],
"rows": [
[
"Оптимизация после установки",
"Записи сгруппированы по выбранному пользователем варианту настройки после установки."
],
[
"Скрипты ProxMenux",
"Скрипты для GPU, Coral, сети, хранилища, безопасности, утилит и другие скрипты с поддержкой журналирования, включая установщик ProxMenux и ProxMenux Monitor."
],
[
"Установленные пакеты и утилиты",
"Программное обеспечение, установленное ProxMenux на хосте."
]
]
}
},
{
"p": "В каждом разделе режим <strong>По функциям</strong> группирует записи по функциям, которые их создали."
}
]
},
{
"id": "entry",
"title": "Что отображается в каждой записи",
"blocks": [
{
"list": {
"items": [
"Скрипт, функция и версия, при выполнении которых произошло изменение.",
"Дата и затронутый ресурс.",
"Известное состояние до и после изменения.",
"Добавленные и удалённые строки.",
"Пакеты, которые действительно были добавлены.",
"Переход службы из одного состояния в другое.",
"<strong>Отмена этого изменения</strong>: <em>Восстанавливает в точности то, что было раньше</em>, <em>Удаляет файл (раньше его не было)</em>, <em>Пакет можно удалить</em>, частичная отмена или <em>Невозможно отменить через журнал</em>."
]
}
}
]
},
{
"id": "before",
"title": "Что означает состояние до изменения",
"blocks": [
{
"p": "Состояние до изменения может быть представлено сохранённым содержимым, отметкой о первом создании файла или неизвестным состоянием. Изменения, внесённые до появления журнала, невозможно восстановить; при повторном запуске функции сначала фиксируется состояние, обнаруженное на тот момент."
}
]
},
{
"id": "limits",
"title": "Область охвата журнала",
"blocks": [
{
"list": {
"items": [
"Изменения, внесённые вручную или другим программным обеспечением, не записываются.",
"Учитываются только операции, выполняемые через примитивы аудита ProxMenux.",
"Ведение журнала никогда не блокирует описываемую операцию: если запись не удаётся сохранить, операция продолжается.",
"Последовательные изменения одного ресурса отображаются как сравнение известного исходного состояния с текущим."
]
}
}
]
},
{
"id": "retention",
"title": "Сохранённые данные аудита",
"blocks": [
{
"table": {
"headers": [
"Элемент",
"Поведение"
],
"rows": [
[
"Записи",
"Хранятся на узле; из журнала ничего не удаляется автоматически."
],
[
"Сохранённое содержимое",
"Сохранённый объект хранится, пока на него ссылается хотя бы одна запись."
],
[
"Размер сохраняемого содержимого",
"Содержимое размером более 1 MiB не сохраняется целиком; в записи указывается, что сохранение содержимого пропущено из-за его размера."
],
[
"Чтение",
"Monitor не загружает сохранённые объекты размером более 2 MiB."
],
[
"Различия",
"Отображается не более 400 строк; если различия занимают больше строк, они помечаются как усечённые."
],
[
"Получение списка",
"API по умолчанию возвращает 200 записей на запрос, максимум — 1000."
]
]
}
},
{
"calloutWarning": {
"title": "Сохранение содержимого не означает автоматическую отмену изменений",
"body": "Содержимое до изменения можно просмотреть и восстановить вручную, но представление «Изменения» не отменяет операции. Запись о выполнении фиксирует команду, но не все последствия работы запущенного инструмента."
}
}
]
}
]
}
@@ -0,0 +1,129 @@
{
"meta": {
"title": "Audit и отчёт | ProxMenux Monitor",
"description": "Оцените состояние узла Proxmox VE, зафиксируйте изменения, внесённые ProxMenux, и задайте требования к его гостевым системам и хранилищам с возможностью печати отчётов."
},
"header": {
"title": "Audit и отчёт",
"description": "Оценка состояния узла, журнал изменений, внесённых ProxMenux, и описание требований к узлу с документами, которые можно распечатать или сохранить в формате PDF.",
"section": "ProxMenux Monitor"
},
"sections": [
{
"id": "views",
"blocks": [
{
"calloutInfo": {
"title": "Три представления, три вопроса",
"body": "Audit & Report разграничивает фактические данные об узле, действия ProxMenux и заданные требования к узлу. Если при оценке невозможно сопоставить конфигурацию с заявленным назначением, она описывается, но не отмечается как ошибка."
}
},
{
"cards": {
"items": [
{
"icon": "shield",
"title": "Оценка — в каком состоянии узел?",
"body": "Выполняет проверки выбранного профиля, составляет перечень ресурсов и классифицирует то, что требует внимания, приводя подтверждающие данные для каждого результата."
},
{
"icon": "refresh",
"title": "Изменения — что сделал ProxMenux?",
"body": "Перечисляет файлы, пакеты, службы и команды, изменённые ProxMenux scripts с включённой регистрацией действий, и показывает их предыдущее состояние, если оно было зафиксировано."
},
{
"icon": "fileText",
"title": "Политика — каковы требования?",
"body": "Задаёт, каким гостевым системам нужна резервная копия и какие должны запускаться вместе с хостом, какие хранилища критически важны, а также пороговые значения для проверок."
}
]
}
},
{
"flow": {
"nodes": [
{
"label": "Оценка",
"detail": "факты"
},
{
"label": "Политика",
"detail": "контекст"
},
{
"label": "Изменения",
"detail": "действия"
}
],
"caption": "Оценка предоставляет факты, политика задаёт их контекст, а журнал фиксирует действия ProxMenux."
}
}
]
},
{
"id": "boundaries",
"title": "Три разные функции",
"blocks": [
{
"table": {
"headers": [
"Функция",
"Назначение"
],
"rows": [
[
"<healthLink>Health Monitor</healthLink>",
"Непрерывно отслеживает метрики и события и может отправлять уведомления."
],
[
"Audit и отчёт",
"Выполняет оценку по запросу, документирует состояние узла и сравнивает результаты запусков."
],
[
"Журнал изменений",
"Регистрирует операции, которые ProxMenux выполняет с помощью своих базовых функций аудита."
]
]
}
}
]
},
{
"id": "pages",
"title": "Страницы этого раздела",
"blocks": [
{
"next": {
"items": [
{
"label": "Оценка и инвентаризация",
"href": "/docs/monitor/audit-report/assessment",
"tail": "профили, результаты, принятые риски и перечень ресурсов."
},
{
"label": "Изменения",
"href": "/docs/monitor/audit-report/changes",
"tail": "журнал изменений, внесённых ProxMenux на хосте."
},
{
"label": "Политика",
"href": "/docs/monitor/audit-report/policy",
"tail": "гостевые системы, хранилища и пороговые значения."
},
{
"label": "Отчёты и сравнения",
"href": "/docs/monitor/audit-report/reports",
"tail": "шесть документов и эталонный запуск."
},
{
"label": "Область действия и гарантии",
"href": "/docs/monitor/audit-report/scope",
"tail": "источники, ограничения и сохраняемые данные."
}
]
}
}
]
}
]
}
@@ -0,0 +1,104 @@
{
"meta": {
"title": "Политика | Audit & Report",
"description": "Политика узла в Audit & Report: резервная копия, автозапуск и целевой показатель восстановления каждой гостевой системы, роль каждого хранилища и пороговые значения проверок."
},
"header": {
"title": "Политика",
"description": "Политика задаёт то, что невозможно установить при проверке: назначение каждой гостевой системы и каждого хранилища, а также пороговые значения, применяемые при проверках.",
"section": "Audit и отчёт"
},
"sections": [
{
"id": "principle",
"blocks": [
{
"calloutInfo": {
"title": "Без заданной политики отчёт описывает состояние, а с ней — оценивает его",
"body": "При оценке видно, что делает хост, но не для чего он предназначен. Отсутствие резервной копии у гостевой системы, назначение которой не указано, отмечается как наблюдение. Если резервная копия для неё указана как обязательная, то же отсутствие отмечается как предупреждение. Указывать эти сведения необязательно."
}
}
]
},
{
"id": "guests",
"title": "Гостевые системы",
"intro": "Для каждой виртуальной машины и каждого LXC на узле предусмотрены три поля. Если в поле оставлено значение по умолчанию, используется общее значение, показанное рядом.",
"blocks": [
{
"table": {
"headers": [
"Поле",
"Значения",
"Влияние на оценку"
],
"rows": [
[
"Резервная копия",
"Обязательна, Не требуется, Не указано",
"Отсутствие резервной копии отмечается как предупреждение, если она обязательна, как наблюдение, если требование не указано, и не учитывается в подсчёте, если она не требуется."
],
[
"Автозапуск",
"Обязательна, Не требуется, Не указано",
"Должна ли гостевая система запускаться вместе с хостом."
],
[
"Целевой показатель восстановления",
"Часы",
"Максимально допустимый возраст последней резервной копии."
]
]
}
}
]
},
{
"id": "storage",
"title": "Хранилище",
"blocks": [
{
"p": "Недоступность хранилища отмечается как критическая проблема, если оно указано как необходимое или обслуживает работающую гостевую систему, как предупреждение, если его роль не указана, и как наблюдение, если оно указано как необязательное."
}
],
"intro": "Для каждого хранилища узла задаётся роль: «Необходимое», «Необязательное» или «Не указано»."
},
{
"id": "thresholds",
"title": "Пороговые значения",
"intro": "Если поле порога пустое, используется значение по умолчанию, показанное в качестве подсказки в поле.",
"blocks": [
{
"list": {
"items": [
"Пороги проверки заполненности хранилища (%) и тонкого пула (%).",
"Коэффициент избыточного выделения ёмкости тонкого хранилища и коэффициент избыточного выделения памяти.",
"Интервал проверки целостности ZFS (дни).",
"Резервный порог возраста резервной копии (дни) и коэффициент допустимой задержки относительно расписания.",
"Срок предупреждения об истечении действия сертификата (дни).",
"Срок службы диска (часы) и период учёта недавних ошибок диска (дни).",
"Возраст отчёта Lynis (дни) и индекса пакетов (дни).",
"Объём журнала относительно установленного лимита (%).",
"Пороги проверки заполненности файловой системы (%) и использования её индексных дескрипторов (%)."
]
}
}
]
},
{
"id": "save",
"title": "Как сохраняется политика",
"blocks": [
{
"p": "Декларация проходит проверку и атомарно сохраняется в <code>/usr/local/share/proxmenux/audit_policy.json</code>. При каждом сохранении учитывается версия: если декларация изменилась в другом сеансе, черновик не сохраняется, а интерфейс предлагает заново загрузить сохранённую декларацию."
},
{
"calloutWarning": {
"title": "Политика никогда не определяется по косвенным признакам",
"body": "ProxMenux не добавляет никаких требований самостоятельно. Пустое поле сохраняет значение по умолчанию или остаётся неуказанным, а частичная декларация влияет только на явно указанные в ней элементы."
}
}
]
}
]
}
@@ -0,0 +1,234 @@
{
"meta": {
"title": "Отчёты и сравнения | Audit & Report",
"description": "Шесть документов Audit & Report: как их распечатать или сохранить в формате PDF и как сравнивать запуски с эталонным запуском."
},
"header": {
"title": "Отчёты и сравнения",
"description": "Шесть документов, каждый из которых отвечает на отдельный вопрос, и сравнение каждого запуска с эталонным запуском.",
"section": "Audit и отчёт"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Шесть документов, а не шесть стилей",
"body": "Перед составлением документа движок выбирает проверки и разделы. Быстрая диагностика — это не полный аудит с меньшим числом страниц, а инвентаризация не содержит результатов оценки. В приведённых ниже примерах документов используются вымышленные данные."
}
}
]
},
{
"id": "documents",
"title": "Шесть документов",
"blocks": [
{
"downloads": {
"items": [
{
"title": "Полный аудит",
"body": "Содержит полное техническое описание узла.",
"facts": [
{
"label": "Проверки",
"value": "Все доступные проверки."
},
{
"label": "Содержимое",
"value": "Краткое резюме; идентификационные сведения и кластер; оборудование; сеть и задержки; хранилища; гостевые системы; проброс устройств; приложения; выявленные проблемы с подтверждающими данными; источники и область проверки."
}
]
},
{
"title": "Быстрая диагностика",
"body": "Показывает, что требует внимания, без полного перечня компонентов.",
"facts": [
{
"label": "Проверки",
"value": "Те же проверки, что и при полном аудите."
},
{
"label": "Содержимое",
"value": "Минимальные идентификационные сведения; критические проблемы; предупреждения; значимые наблюдения; непроверенные показания и первоочередные действия. Схемы, перечень компонентов и объёмные приложения не включаются."
}
]
},
{
"title": "Инвентаризация",
"body": "Описывает состав узла без его оценки.",
"facts": [
{
"label": "Проверки",
"value": "Отсутствуют; выявленные проблемы не классифицируются."
},
{
"label": "Содержимое",
"value": "Идентификационные сведения; кластер; процессор и память; системная плата, BIOS и контроллеры; сеть; хранилища; виртуальные машины и контейнеры LXC; проброс устройств; приложения и элементы, управляемые ProxMenux."
}
]
},
{
"title": "Проверка безопасности",
"body": "Охватывает подверженность узла внешним угрозам и средства контроля доступа к нему.",
"facts": [
{
"label": "Проверки",
"value": "Раздел безопасности, а также привилегии контейнеров, обновления, репозитории и цепочка APT."
},
{
"label": "Содержимое",
"value": "Идентификационные сведения и кластер; сеть и задержки; доступ; межсетевой экран; двухфакторная аутентификация; сертификаты; привилегии; обновления; репозитории; состояние и давность версии Lynis."
}
]
},
{
"title": "Проверка надёжности резервного копирования",
"body": "Проверяет наличие заявленной защиты и пригодность резервных копий для использования.",
"facts": [
{
"label": "Проверки",
"value": "Раздел резервного копирования, а также подключение к хранилищам и доставка уведомлений."
},
{
"label": "Содержимое",
"value": "Охват каждой гостевой системы; заявленная цель восстановления; давность и результат; место назначения; политика хранения; проверка; неудачные задания; восстановление и источники с неполными данными."
}
]
},
{
"title": "Ресурсы и износ",
"body": "Оценивает запас ресурсов для роста и признаки их исчерпания или старения оборудования.",
"facts": [
{
"label": "Проверки",
"value": "Разделы хранилищ и оборудования, а также память, область подкачки, журнал и файловая система хоста."
},
{
"label": "Содержимое",
"value": "Использование ресурсов и пороговые значения; тонкие пулы; избыточное выделение ресурсов; память; индексные дескрипторы; ZFS; температуры; часы работы; ошибки SMART и ресурс накопителей NVMe/SSD."
}
]
}
]
}
},
{
"p": "Документ содержит идентификационные сведения об узле и дату оценки, общий результат, сводку по разделам, структуру оборудования, сети и хранилищ, сведения о защите гостевых систем, выявленные проблемы с подтверждающими данными, источники, которые не удалось прочитать, а также область проверки и применённую политику — в том объёме, который предусмотрен соответствующим профилем."
}
]
},
{
"id": "print",
"title": "Печать или сохранение в формате PDF",
"blocks": [
{
"steps": {
"items": [
{
"title": "Запуск",
"body": "Оценка выполняется с профилем, выбранным в разделе <strong>Отчёт</strong>."
},
{
"title": "Проверка результатов",
"body": "После завершения проверки отображаются выявленные проблемы, источники, которые не удалось прочитать, и применённая политика."
},
{
"title": "Сформировать отчёт",
"body": "Кнопка <strong>Сформировать отчёт</strong> открывает представление, оформленное как документ."
},
{
"title": "Печать",
"body": "<strong>Распечатать или сохранить в PDF</strong> открывает диалоговое окно печати браузера, где можно выбрать принтер или <em>Сохранить как PDF</em>."
}
]
}
},
{
"calloutTip": {
"title": "Распечатка — это документ, а не снимок экрана",
"body": "Панель действий скрыта, заголовок таблицы повторяется при её продолжении на следующей странице, блоки не разбиваются без необходимости, а на каждой странице сохраняются идентификационные данные и нумерация."
}
}
]
},
{
"id": "compare",
"title": "Сравнение с эталонным запуском",
"intro": "<strong>Использовать как эталон</strong> помечает завершённый запуск как эталонный. Последующие запуски сравниваются с ним, а выявленные проблемы распределяются по следующим категориям:",
"blocks": [
{
"table": {
"headers": [
"Группа",
"Значение"
],
"rows": [
[
"Новые",
"Выявлены сейчас, но не выявлялись ранее."
],
[
"Ухудшение",
"По-прежнему выявляются, при этом стали серьёзнее или затрагивают больше объектов, чем раньше."
],
[
"Улучшение",
"По-прежнему выявляются, но стали менее серьёзными или затрагивают меньше объектов, чем раньше."
],
[
"Устранённые",
"Больше не выявляются, и никто не принимал связанные с ними риски."
],
[
"Принятые",
"Больше не учитываются, поскольку риск был принят, а не потому, что состояние узла изменилось."
],
[
"Больше не оцениваются",
"Присутствовали ранее, но отсутствуют в текущем запуске; их устранение не подтверждено."
]
]
}
},
{
"table": {
"headers": [
"Эталонный запуск",
"Поведение"
],
"rows": [
[
"Выбор эталона",
"Любой завершённый запуск можно пометить как эталонный; автоматически эталон не назначается."
],
[
"Смена эталона",
"При выборе другого запуска в качестве эталонного эталон меняется, а история сохраняется."
],
[
"Сравнение",
"Если не выбраны два запуска, для сравнения используются эталонный запуск и выбранный или самый последний запуск."
],
[
"Хранение запусков",
"Сохраняются 30 последних запусков, а эталонный запуск никогда не удаляется."
],
[
"Без эталонного запуска",
"В представлении указано, что эталонный запуск ещё не выбран, поэтому сравнивать не с чем."
]
]
}
},
{
"calloutWarning": {
"title": "Отчёт описывает состояние на конкретный момент",
"body": "Оценка не подтверждает состояние за весь период. Старые результаты перестают отражать текущее состояние; в представлении показано, сколько времени прошло с последнего запуска, а для каждого источника сохраняется время сбора данных."
}
}
]
}
]
}
@@ -0,0 +1,115 @@
{
"meta": {
"title": "Охват и гарантии | Audit & Report",
"description": "Откуда Audit & Report получает данные, что остаётся вне его поля зрения, какие гарантии заложены в его архитектуру и где хранятся его данные."
},
"header": {
"title": "Область действия и гарантии",
"description": "Откуда берутся данные для оценки, что остаётся вне её поля зрения и где Audit & Report хранит свои данные.",
"section": "Audit и отчёт"
},
"sections": [
{
"id": "sees",
"title": "Что отслеживается",
"blocks": [
{
"list": {
"items": [
"Конфигурация и состояние локального узла.",
"Заданная конфигурация виртуальных машин и контейнеров LXC.",
"Состояние хранилищ по данным Proxmox VE.",
"Доступная история создания резервных копий и проверок.",
"Данные SMART и события, собранные Monitor.",
"Состояние служб, кластера, HA и локальных источников."
]
}
}
]
},
{
"id": "outside",
"title": "Что остаётся вне поля зрения",
"blocks": [
{
"list": {
"items": [
"Внутреннее состояние гостевых систем, кроме сведений, которые они передают Proxmox VE.",
"Сетевое оборудование за пределами хоста.",
"Удалённые зависимости, которые узел не может отслеживать.",
"Физическое состояние, сведения о котором оборудование не предоставляет.",
"Действия, выполненные вручную или другим программным обеспечением, — в журнале изменений."
]
}
},
{
"calloutWarning": {
"title": "Отсутствие свидетельств не доказывает отсутствие",
"body": "Если источник невозможно прочитать, результат считается непроверенным или неполным, но никогда не подтверждающим соответствие требованиям. В отчёте перечислены недоступные источники."
}
}
]
},
{
"id": "guarantees",
"title": "Гарантии, заложенные в архитектуру",
"blocks": [
{
"list": {
"items": [
"Стабильные идентификаторы проверок.",
"История запусков и выявленных проблем.",
"Проверенная политика, сохранённая атомарно.",
"Принятые риски отображаются с указанием причин их принятия.",
"Привязка изменений к скрипту и функции.",
"Фиксация состояния до и после, где это возможно.",
"Явное указание в результате на то, что что-либо невозможно измерить или зафиксировать."
]
}
}
]
},
{
"id": "storage",
"title": "Где хранятся данные",
"blocks": [
{
"table": {
"headers": [
"Данные",
"Расположение"
],
"rows": [
[
"Политика",
"<code>/usr/local/share/proxmenux/audit_policy.json</code>"
],
[
"Оценки",
"База данных аудита Monitor"
],
[
"Зафиксированные объекты",
"<code>/usr/local/share/proxmenux/changes/objects/</code>"
],
[
"Записи, ожидающие обработки",
"<code>/usr/local/share/proxmenux/changes/spool/</code>"
],
[
"Сводный журнал",
"<code>/usr/local/share/proxmenux/changes.db</code>"
]
]
}
},
{
"calloutInfo": {
"title": "Инструмент проверки, а не сертификация",
"body": "Audit & Report проверяет, сравнивает и документирует состояние узла. Его результаты следует рассматривать с учётом назначения системы, заявленной политики и доступных источников."
}
}
]
}
]
}
@@ -0,0 +1,174 @@
{
"meta": {
"title": "Панель приложений: единое место для открытия всех веб-ссылок | ProxMenux",
"description": "Используйте панель приложений, чтобы открывать зарегистрированные веб-ссылки LXC и пользовательские ссылки, упорядочивать их по категориям и переходить к гостевой системе, в которой работает соответствующий сервис."
},
"header": {
"title": "Панель управления: вкладка «Приложения»",
"description": "Единое место для открытия веб-интерфейсов, используемых на узле, — как для зарегистрированных приложений LXC, так и для пользовательских веб-ссылок.",
"section": "ProxMenux Monitor · Панель управления"
},
"intro": {
"title": "Средство запуска, а не установщик приложений",
"body": "Вкладка <strong>Приложения</strong> сама по себе не устанавливает ПО и не обнаруживает службы. Она объединяет сохранённые веб-ссылки в единую сетку с возможностью поиска. Ссылки, принадлежащие LXC, настраиваются на <appTabLink>вкладке «Приложение»</appTabLink> гостевой системы; пользовательские ссылки позволяют добавлять службы ВМ, обратные прокси и внешние панели управления."
},
"sources": {
"heading": "Что отображается на вкладке «Приложения»",
"intro": "Каждый URL, который можно открыть, отображается отдельной карточкой. Источник определяет, где редактируется карточка, но не влияет на её внешний вид при обычном использовании.",
"colSource": "Источник",
"colAppears": "Что отображается",
"colManagedFrom": "Где настраивается",
"rows": [
{
"source": "Зарегистрированное приложение LXC",
"appears": "Отдельная карточка для каждой веб-ссылки, сохранённой в записи приложения.",
"managedFrom": "VMs & LXCs → LXC (модальное окно) → Приложение"
},
{
"source": "Пользовательская ссылка, привязанная к гостевой системе",
"appears": "URL службы, связанный с определённой ВМ или LXC.",
"managedFrom": "Приложения → Изменить"
},
{
"source": "Пользовательская ссылка без привязки",
"appears": "Любой адрес HTTP(S), в том числе адрес внешней службы или службы, доступной через обратный прокси.",
"managedFrom": "Приложения → Изменить"
}
],
"relationshipTitle": "Вкладка «Приложения» и вкладка «Приложение» LXC выполняют разные задачи",
"relationshipBody": "На <appTabLink>вкладке «Приложение»</appTabLink> LXC хранятся идентификационные данные приложения, веб-ссылки и необязательные настройки отслеживания версий. Вкладка верхнего уровня <strong>Приложения</strong> использует эти ссылки и позволяет легко их открывать. Поэтому при редактировании карточки, принадлежащей LXC, вы возвращаетесь к записи соответствующей гостевой системы, а не создаёте вторую копию конфигурации."
},
"cards": {
"heading": "Как пользоваться карточкой",
"intro": "Нажатие на любую область карточки открывает службу, а небольшие элементы управления на ней позволяют получить дополнительную информацию, не открывая службу.",
"items": [
"Нажмите на карточку, чтобы открыть её URL в новой вкладке браузера.",
"В первую очередь используется логотип веб-ссылки, а при необходимости — логотип приложения.",
"Метка категории имеет тот же цвет и текст, что и соответствующая веб-ссылка на вкладке «Приложение» LXC.",
"Метка гостевой системы указывает на привязанную ВМ или LXC. Нажмите на неё, чтобы открыть модальное окно этой гостевой системы; ссылки LXC ведут непосредственно на вкладку <strong>Приложение</strong>, а ссылки ВМ открывают вкладку <strong>Состояние</strong>.",
"Фиолетовая стрелка вверх означает, что для конкретного приложения или образа Docker доступно обновление. Это не общий счётчик обновлений для всей гостевой системы."
]
},
"toolbar": {
"heading": "Поиск, фильтрация и сортировка",
"intro": "Панель инструментов позволяет сузить отображаемый набор приложений в большой коллекции, не изменяя сохранённые записи.",
"items": [
"Поиск выполняется по названию приложения, имени гостевой системы, VMID и категории.",
"Фильтр категорий позволяет показывать приложения одной категории или все приложения.",
"Сортируйте по <strong>названию</strong>, <strong>ID</strong> или <strong>категории</strong>. При сортировке по категории между группами карточек добавляются заголовки групп.",
"Выбранный порядок сортировки сохраняется в этом браузере. При повторном открытии страницы поисковый запрос и фильтр категорий сбрасываются.",
"Вкладка «Приложения» остаётся доступной, даже если сетка пуста, поэтому первую пользовательскую ссылку можно добавить без предварительной регистрации приложения LXC."
]
},
"customLinks": {
"heading": "Добавление и редактирование пользовательских веб-ссылок",
"intro": "Используйте пользовательскую ссылку, если сервис не представлен зарегистрированным приложением LXC.",
"steps": [
"Нажмите <strong>Добавить ссылку</strong> на панели инструментов или в области пустой сетки.",
"Введите название и полный URL с протоколом <code>http://</code> или <code>https://</code>.",
"При желании добавьте логотип, выберите или создайте категорию и привяжите ссылку к виртуальной машине или LXC.",
"Сохраните ссылку. Новая карточка сразу появится в сетке.",
"Чтобы изменить или удалить пользовательскую ссылку, нажмите <strong>Редактировать</strong>, а затем значок карандаша на её карточке."
],
"colField": "Поле",
"colRequired": "Обязательное",
"colPurpose": "Назначение",
"fields": [
{
"field": "Название",
"required": "Да",
"purpose": "Заголовок карточки, по которому также выполняется поиск."
},
{
"field": "URL",
"required": "Да",
"purpose": "Полный адрес HTTP(S), открываемый при нажатии на карточку."
},
{
"field": "URL логотипа",
"required": "Нет",
"purpose": "Изображение из удалённого источника, отображаемое на карточке."
},
{
"field": "Категория",
"required": "Нет",
"purpose": "Добавляет общую метку категории и позволяет фильтровать по категориям."
},
{
"field": "Привязка к гостевой системе",
"required": "Нет",
"purpose": "Связывает ссылку с виртуальной машиной или LXC и делает доступным быстрый переход к гостевой системе."
}
],
"editTitle": "Редактируйте первоисточник",
"editBody": "В режиме редактирования значки карандаша отображаются только для пользовательских ссылок. Чтобы изменить карточку, созданную на основе зарегистрированного приложения LXC, откройте <appTabLink>вкладку «Приложение»</appTabLink> соответствующей гостевой системы и отредактируйте сохранённую веб-ссылку там."
},
"categories": {
"heading": "Категории и сигналы обновления",
"intro": "Категории упорядочивают ссылки, а индикаторы обновлений показывают состояние программного обеспечения. Эти функции намеренно разделены.",
"items": [
"При регистрации LXC с помощью каталога категория может заполняться автоматически, но её можно изменить.",
"В том же списке выбора можно создавать собственные категории, а затем использовать их в фильтре.",
"Цвета категорий определяются по фиксированному правилу и адаптируются к светлой или тёмной теме. Фиолетовые и красные оттенки зарезервированы для обозначения обновлений и опасных состояний.",
"Для веб-ссылок Docker ProxMenux сопоставляет карточку с соответствующим контейнером или образом и сообщает о состоянии обновления этого образа. Обновление Docker Engine по-прежнему отображается на <updatesLink>вкладке «Обновления»</updatesLink> контейнера LXC."
]
},
"persistence": {
"heading": "Сохранение данных и работа кэша",
"intro": "Панель открывается на основе уже доступных данных Monitor, без повторного сканирования каждой гостевой системы.",
"items": [
"Пользовательские ссылки сохраняются атомарно в <code>/etc/proxmenux/custom_links.json</code> и загружаются в память при запуске Monitor.",
"Зарегистрированные ссылки LXC остаются частью сохранённой в Monitor записи соответствующего приложения; панель приложений не дублирует их в файле пользовательских ссылок.",
"Создание, изменение или удаление пользовательской ссылки немедленно обновляет список в памяти.",
"Настройка сортировки хранится локально в браузере. Она не синхронизируется между устройствами или пользователями.",
"Положение раздела «Приложения» на верхнем уровне задаётся отдельно в <settingsLink>Settings → Navigation</settingsLink> настройкой порядка навигации."
]
},
"troubleshooting": {
"heading": "Типичные ситуации",
"colProblem": "Ситуация",
"colResolution": "Решение",
"rows": [
{
"problem": "Приложение LXC зарегистрировано, но карточка не отображается",
"resolution": "Откройте вкладку приложения и добавьте хотя бы одну веб-ссылку. Само по себе отслеживание версий не создаёт карточку запуска."
},
{
"problem": "Неверный URL или логотип",
"resolution": "Измените пользовательскую ссылку в разделе «Приложения» или веб-ссылку на вкладке соответствующего приложения LXC."
},
{
"problem": "Служба Docker отсутствует",
"resolution": "Измените зарегистрированное приложение Docker и сохраните опубликованный веб-порт службы в виде веб-ссылки."
},
{
"problem": "Фиолетовая стрелка указывает не на то обновление Docker",
"resolution": "Проверьте название и описание веб-ссылки, чтобы её можно было сопоставить с нужным контейнером или образом."
},
{
"problem": "Вместо обзора системы сначала открывается раздел «Приложения»",
"resolution": "Первый элемент в сохранённом порядке Settings → Navigation становится начальной вкладкой. Восстановите порядок по умолчанию или переместите «Обзор» на первое место."
}
]
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Вкладка «Приложения» LXC",
"href": "/docs/monitor/dashboard/vms-lxcs/app",
"tail": " — регистрация приложений и веб-ссылок, а также необязательное отслеживание версий."
},
{
"label": "Вкладка «Обновления» LXC",
"href": "/docs/monitor/dashboard/vms-lxcs/updates",
"tail": " — настройка и запуск обновлений приложений, Docker Engine и образов."
},
{
"label": "Вкладка «Настройки»",
"href": "/docs/monitor/dashboard/settings#navigation-order",
"tail": " — изменение порядка вкладок в навигации и выбор начальной вкладки."
}
]
}
}
@@ -0,0 +1,248 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель управления: вкладка «Оборудование» | Документация ProxMenux",
"description": "Вкладка «Оборудование» содержит сведения о физических компонентах машины: процессоре и материнской плате, модулях памяти, температурных датчиках, графических процессорах (с мониторингом каждого слота в реальном времени и установкой драйверов одним нажатием), ускорителях TPU Coral, а также сводную информацию о накопителях с проверкой скорости соединения. Здесь также представлены полные списки устройств PCI и USB, данные об энергопотреблении, блоках питания, вентиляторах и состоянии ИБП."
},
"header": {
"title": "Панель управления: вкладка «Оборудование»",
"description": "Физическая машина на одном экране — сведения о процессоре и материнской плате, каждый модуль памяти, температурные датчики всех подсистем, графические процессоры с отображением текущей загрузки и встроенным установщиком драйверов, TPU Coral, все устройства PCI и USB с указанием драйвера ядра, полный список дисков с согласованными скоростями соединения, а также питание, охлаждение и ИБП.",
"section": "ProxMenux Monitor · Панель управления"
},
"intro": {
"title": "На основе стандартных инструментов",
"body": "Большая часть данных этой вкладки получена путём разбора вывода <code>lscpu</code>, <code>dmidecode</code>, <code>lspci</code>, <code>lsusb</code>, <code>lsblk</code>, <code>smartctl</code>, <code>nvme</code>, <code>sensors</code>, <code>nvidia-smi</code>, <code>intel_gpu_top</code>, <code>amdgpu_top</code>, <code>ipmitool</code> и <code>upsc</code>. Разделы отображаются только тогда, когда соответствующий инструмент возвращает данные: на узле без ИБП карточка ИБП не появится, а на узле без IPMI не будут показаны показатели питания, получаемые по внеполосному каналу."
},
"thresholds": {
"title": "Используемые здесь цвета состояний и пороговые значения",
"intro": "Все температурные индикаторы и показания на этой вкладке используют одну классификацию: <green/> <strong>зелёный</strong> — ниже порога предупреждения, <amber/> <strong>жёлтый</strong> — от порога предупреждения до критического порога, <red/> <strong>красный</strong> — на уровне критического порога и выше. Рекомендуемые значения по умолчанию, поставляемые с ProxMenux:",
"items": [
"<strong>Температура процессора</strong> — порог предупреждения: 80 °C, критический порог: 90 °C.",
"<strong>Температура диска</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (порог предупреждения / критический порог)."
],
"outro": "Каждое значение можно настроить отдельно для каждого узла. <link>Settings → Health Monitor Thresholds</link> — единый авторитетный источник сведений с пояснениями по их настройке."
},
"sections": {
"heading": "Разделы",
"intro": "Разделы вкладки отображаются сверху вниз в указанном порядке. Некоторые разделы появляются только при наличии на узле соответствующего оборудования или установленного инструмента — ниже они отмечены как <em>(при наличии)</em>.",
"systemInfoTitle": "Сведения о системе",
"systemInfoIntro": "Два блока, расположенные рядом и отображаемые всегда:",
"systemInfoItems": [
"<strong>Процессор</strong> — название модели, микроархитектура, сокеты / ядра / потоки, базовая / максимальная частота в режиме boost, флаги виртуализации (VT-x / AMD-V), топология кэша.",
"<strong>Материнская плата</strong> — производитель, модель, версия BIOS, дата BIOS, UUID SMBIOS. Эти сведения помогают найти нужную страницу загрузок производителя при поиске обновлений прошивки."
],
"memoryTitle": "Модули памяти",
"memoryBody": "Для каждого занятого слота отображается одна строка с данными из <code>dmidecode</code>: обозначение слота, объём модуля, тип (DDR4 / DDR5 / варианты с ECC), скорость (настроенная и номинальная), производитель, артикул и серийный номер. Пустые слоты показаны серым цветом, чтобы можно было сразу оценить возможности расширения.",
"thermalTitle": "Мониторинг температуры",
"thermalIntro": "Семь подразделов, получающих данные из <code>lm-sensors</code>, <code>sysfs</code> и специализированных средств сбора данных. Датчики hwmon накопителей сопоставляются с физическими блочными устройствами, поэтому для каждого обнаруженного накопителя отображаются его модель и путь <code>/dev/...</code>. Подраздел скрывается, если в соответствующей категории нет данных от датчиков.",
"thermalItems": [
"<strong>CPU</strong> — температура процессорного корпуса и отдельных ядер.",
"<strong>GPU</strong> — датчики дискретных GPU через <code>nvidia-smi</code> / <code>amdgpu_top</code> / Intel iGPU. Включает температуру самой горячей точки и кристаллов памяти, если драйвер предоставляет эти данные.",
"<strong>NVME</strong> — сводная температура контроллера, сопоставленная с конкретным пространством имён NVMe.",
"<strong>HDD</strong> — показания <code>drivetemp</code> для блочных устройств с вращающимися дисками.",
"<strong>SSD</strong> — показания <code>drivetemp</code> для блочных устройств SATA/SAS без вращающихся дисков.",
"<strong>PCI</strong> — датчики устройств, подключённых по PCI (адаптеры HBA, сетевые карты со встроенными датчиками).",
"<strong>ПРОЧЕЕ</strong> — датчики чипсета, VRM и температуры окружающей среды, не относящиеся к другим категориям."
]
},
"graphics": {
"heading": "Видеокарты",
"intro": "Каждый обнаруженный видеоконтроллер отображается в отдельной карточке с указанием производителя, модели, типа (<em>Встроенный</em> / <em>PCI</em> / BMC), слота PCI (BDF), драйвера ядра и списка модулей. В карточке также есть элемент управления <strong>Переключить режим</strong>, который переключает GPU между совместным использованием в LXC (штатный драйвер) и прямой передачей в виртуальную машину (<code>vfio-pci</code>). О том, что происходит на хосте при его нажатии, см. <link>Переключение режима GPU (ВМ ↔ LXC)</link>.",
"vfioImageAlt": "Раздел «Видеокарты»: встроенный GPU Matrox G200EH с драйвером mgag200 (готов к использованию в LXC) и NVIDIA Quadro P400 с драйвером vfio-pci (готов к прямой передаче в ВМ)",
"vfioImageCaption": "Обнаружены два GPU: чип Matrox BMC использует штатный драйвер и готов к использованию в LXC; NVIDIA Quadro P400 привязан к <code>vfio-pci</code> и готов к прямой передаче в ВМ.",
"lxcImageAlt": "Раздел «Видеокарты»: Intel UHD Graphics iGPU с драйвером i915 и NVIDIA Quadro P1000 с драйвером nvidia; оба GPU отмечены как готовые к использованию в контейнерах LXC",
"lxcImageCaption": "Тот же узел после переключения видеокарты NVIDIA обратно на штатный драйвер — теперь оба GPU готовы к использованию в контейнерах LXC.",
"realtimeTitle": "Модальное окно мониторинга в реальном времени",
"realtimeBody": "Нажатие на карточку GPU открывает модальное окно мониторинга для соответствующего слота, в котором каждые три секунды опрашивается подходящая утилита производителя. В окне отображаются производитель, тип, слот PCI, драйвер, модули ядра, текущая загрузка движков (Render/3D, Video, Blitter, VideoEnhance), тактовые частоты графического процессора и памяти, температура, энергопотребление (если данные доступны), использование видеопамяти и таблица «Активные процессы» с загрузкой движков по каждому процессу. Данные поступают из <code>/api/gpu/&lt;slot&gt;/realtime</code>.",
"toolsIntro": "Утилиты производителей, используемые для разных GPU:",
"headerVendor": "Производитель",
"headerTool": "Инструмент",
"headerProject": "Проект",
"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": "— (только отображение)",
"projectLabel": "Обнаружено и обозначено как BMC; блок мониторинга в реальном времени отсутствует."
}
],
"nvidiaImageAlt": "Модальное окно мониторинга GPU NVIDIA Quadro P1000: производитель NVIDIA, драйвер nvidia загружен, частота графического ядра 1,26 ГГц, частота памяти 2,50 ГГц, температура 50 °C, все индикаторы загрузки блоков GPU показывают 0 %, активных процессов нет, общий объём памяти 4096 MiB",
"nvidiaImageCaption": "NVIDIA Quadro P1000 с загруженным проприетарным драйвером — отображаются частоты, температура, индикаторы загрузки блоков GPU и активные процессы.",
"intelImageAlt": "Модальное окно мониторинга GPU Intel UHD Graphics iGPU с драйвером i915: энергопотребление 11,31 Вт, загрузка видеоблока 1 % и процесс ffmpeg, использующий 8 МБ памяти",
"intelImageCaption": "Intel iGPU с активным <code>i915</code>. В таблице «Активные процессы» отображается задача ffmpeg, использующая видеоблок.",
"amdImageAlt": "Модальное окно мониторинга встроенного GPU AMD Lucienne с драйвером amdgpu: индикаторы загрузки блоков GPU показывают 0 %, а amdgpu_top указан среди активных процессов",
"amdImageCaption": "Мониторинг AMD iGPU через <code>amdgpu_top</code> — сам инструмент отображается среди активных процессов, поскольку именно он обеспечивает постоянный опрос для мониторинга в реальном времени.",
"installTitle": "Установка драйвера NVIDIA из модального окна",
"installBody": "Когда GPU NVIDIA привязан к <code>nouveau</code>/<code>nvidiafb</code> (проприетарный драйвер не установлен), блок мониторинга в реальном времени не может получать данные о частотах, энергопотреблении и нагрузке отдельных процессов. В этом случае вместо показателей в модальном окне отображается кнопка <strong>Установить драйверы NVIDIA</strong>, которая напрямую запускает тот же скрипт, что описан в разделе <link>Установка драйверов NVIDIA (хост)</link>.",
"noDriverAlt": "Модальное окно мониторинга GPU NVIDIA Quadro P620 с загруженными модулями ядра nvidiafb и nouveau, уведомлением «Расширенный мониторинг недоступен» и синей кнопкой «Установить драйверы NVIDIA»",
"noDriverCaption": "Проприетарный драйвер ещё не установлен — в модальном окне доступна установка одним нажатием.",
"promptAlt": "Диалог подтверждения установки драйвера GPU NVIDIA со списком обнаруженных GPU, контейнеров LXC с пробросом NVIDIA и кнопками «Да» и «Отмена»",
"promptCaption": "Сводка перед установкой: обнаруженные GPU, контейнеры LXC, в которых уже настроен проброс NVIDIA, и действия, которые выполнит скрипт. До вашего подтверждения никакие изменения не вносятся.",
"successAlt": "Вывод терминала, показывающий успешную установку драйвера NVIDIA 580.105.08 и обнаружение Quadro P620 утилитой nvidia-smi",
"successCaption": "Установка завершена успешно — <code>.run</code> NVIDIA собран с помощью DKMS, служба сохранения состояния установлена, а <code>nvidia-smi</code> отображает GPU.",
"warningTitle": "Выберите версию драйвера, которая действительно поддерживает ваш GPU",
"warningBody": "В новых ветках драйверов NVIDIA прекращается поддержка старых семейств GPU (например, Maxwell / Kepler). Если установка завершилась, но <code>nvidia-smi</code> сообщает <em>«Устройства не найдены»</em> или DKMS завершается с ошибкой, скорее всего, выбранная ветка не поддерживает ваш GPU. Запустите установщик повторно и выберите более старую ветку (например, устаревшую ветку 470.x для карт поколения Kepler). NVIDIA публикует сведения о совместимости с конкретными GPU на <a>официальной странице подбора драйверов</a>.",
"whereGoIntro": "Что дальше:",
"whereGoItems": [
"<link1>Установка драйверов NVIDIA (на хосте)</link1> — подробное руководство по установщику, матрица совместимости с ядром, необязательный патч NVENC и распространение драйвера на контейнеры LXC.",
"<link2>Переключение режима GPU (ВМ ↔ LXC)</link2> — что именно делает встроенный элемент управления <em>Переключить режим</em>.",
"<link3>Добавление GPU в ВМ (проброс)</link3> и <link4>Добавление GPU в LXC</link4> — первоначальное назначение непривязанного GPU."
]
},
"coral": {
"heading": "Coral TPU / Ускорители ИИ",
"subHeading": "(при наличии устройств)",
"intro": "Отображается, если к хосту подключены устройства Google Coral или другие ИИ-ускорители. Для каждого устройства открывается модальное окно с типом подключения (M.2 / mini-PCIe / USB), числом линий соединения PCIe, идентификаторами производителя и продукта, сведениями о программной поддержке (драйвер ядра <code>apex</code> для PCIe, библиотека пользовательского пространства <code>libedgetpu</code> для USB), модулями ядра (<code>gasket</code> + <code>apex</code>), узлами устройств (<code>/dev/apex_*</code>), состоянием среды выполнения Edge TPU, текущей температурой и заданными в прошивке порогами аппаратных предупреждений.",
"imageAlt": "Окно подробных сведений о Coral Edge TPU: подключение PCIe / M.2, соединение PCIe 5.0 GT/s x1, идентификатор производителя и устройства 1ac1:089a, драйвер ядра apex, модули gasket и apex загружены, /dev/apex_0 присутствует, среда выполнения Edge TPU не установлена, температура 53.5 °C с аппаратными порогами предупреждения",
"imageCaption": "Coral в форм-факторе M.2: модули ядра на хосте загружены, узел устройства доступен, пороги температурных предупреждений из прошивки отображаются. Строка среды выполнения становится зелёной после установки соответствующей среды выполнения Edge TPU.",
"pathsIntro": "В зависимости от форм-фактора доступны два варианта установки:",
"pathsItems": [
"<strong>M.2 / Mini-PCIe</strong> — на хосте необходимо собрать модули ядра <code>gasket</code> + <code>apex</code> с помощью DKMS, чтобы узел устройства <code>/dev/apex_0</code> появлялся при загрузке.",
"<strong>USB Accelerator</strong> — на хосте требуется только среда выполнения Edge TPU пользовательского пространства (<code>libedgetpu1-std</code>) из APT-репозитория Google."
],
"outro": "Оба варианта доступны через один пункт ProxMenux — <installLink>Установить Coral TPU на хост</installLink>, который автоматически определяет ваше устройство. Справочная информация и официальная среда выполнения доступны на <a>coral.ai/docs</a>. Когда хост будет готов, передайте устройство контейнеру с помощью пункта <lxcLink>Добавить Coral TPU в LXC</lxcLink>."
},
"storage": {
"heading": "Сводка по устройствам хранения",
"intro": "Все блочные устройства, обнаруженные ядром, сгруппированы по типу. Для каждого диска отображаются имя в ядре (<code>sda</code>, <code>nvme0n1</code>, <code>zram0</code> …), метка типа (<em>SSD</em>, <em>HDD</em>, <em>NVMe SSD</em>), строка модели и параметры согласованного соединения. Нажмите на любой диск, чтобы открыть окно сведений об оборудовании с моделью, серийным номером, ёмкостью, интерфейсом, текущей и максимальной скоростью соединения.",
"imageAlt": "Карточка сводки по устройствам хранения с одиннадцатью блочными устройствами (SATA SSD, SATA HDD, NVMe SSD и zram), строками моделей и согласованными скоростями соединения; для двух накопителей NVMe показано 3.0 x4 с выделением текущей скорости",
"imageCaption": "На этом узле одиннадцать устройств. Подключения SATA отображаются в формате <em>SATA &lt;version&gt;, &lt;Gb/s&gt; (текущее: ...)</em>; накопители NVMe — в формате <em>&lt;PCIe gen&gt; x&lt;width&gt;</em>.",
"nvmeBody": "Для накопителей NVMe в строке каждой платы показаны как согласованные параметры соединения, так и максимальные параметры, поддерживаемые устройством. Если они не совпадают (например, SSD Gen3 x4 работает в режиме <strong>3.0 x1</strong>, поскольку установлен в слот чипсета, к которому подведена только одна линия), текущая скорость выделяется янтарным цветом, чтобы снижение было сразу заметно. Это полезно при поиске причин неожиданно медленной работы дисков или после обновления BIOS, изменившего распределение линий.",
"nvmeModalAlt": "Окно подробных сведений о накопителе NVMe nvme0n1: тип NVMe SSD, ёмкость 953.9 ГБ, текущая скорость соединения 3.0 x1 выделена янтарным цветом, максимальная скорость соединения 3.0 x4, модель WDC CL SN720, серийный номер, интерфейс PCIe/NVMe",
"nvmeModalCaption": "Окно сведений о NVMe показывает уменьшение числа используемых линий: накопитель поддерживает x4, но к слоту подведена только одна линия (x1).",
"outro": "Данные SMART, самотестирование, история и отчёт о диске в PDF находятся на соседней вкладке — <storageLink>Панель мониторинга: вкладка «Хранилище»</storageLink>. Те же данные используются скриптом <smartLink>Состояние и тестирование дисков SMART</smartLink>: запуск длительного теста из скрипта записывает JSON, который Monitor отображает в <em>Storage → History</em>."
},
"pci": {
"heading": "Устройства PCI",
"intro": "Все устройства с адресом PCI, обозначенные своим <strong>PCI BDF</strong> (шина:устройство.функция — например, <code>03:00.0</code>) и классом устройства (<em>Контроллер хранения</em>, <em>Контроллер USB</em>, <em>Видеокарта</em>, <em>Сетевой контроллер</em>, <em>Аудиоконтроллер</em> …). В каждой карточке показаны производитель, название устройства и <strong>драйвер ядра, к которому устройство сейчас привязано</strong> — именно это поле важно при устранении проблем с пробросом устройств, группами IOMMU или платой, с которой хост работает некорректно.",
"imageAlt": "Раздел устройств PCI с пятнадцатью устройствами, сгруппированными по классу: контроллеры хранения с драйверами ahci/nvme, контроллеры USB, видеокарты (одна с vfio-pci, другая со штатным драйвером), сетевые контроллеры с igb / tg3, аудиоконтроллер, сопутствующий проброшенному GPU",
"imageCaption": "На этом узле пятнадцать устройств. Обратите внимание: и GPU, и его сопутствующая аудиофункция привязаны к <code>vfio-pci</code> — эта карта подготовлена для проброса в виртуальную машину.",
"bdfTitle": "Как читать BDF",
"bdfBody": "<code>03:00.0</code> означает шину PCI <code>03</code>, устройство <code>00</code>, функцию <code>0</code>. Многофункциональные устройства, например дискретные GPU, обычно используют <code>.0</code> для GPU и <code>.1</code> для аудиофункции HDMI — обе функции необходимо пробрасывать вместе. Поэтому <link>Переключить режим GPU</link> также устраняет оставшуюся отдельную привязку аудиофункции при выходе из режима виртуальной машины."
},
"usb": {
"heading": "Устройства USB",
"intro": "Все USB-устройства, обнаруженные хостом: строки производителя и продукта, версия USB, адрес <code>bus:device</code>, пара идентификаторов <code>vendor:product</code> и драйвер ядра. Интерфейс также выделяет распространённые категории — <em>Устройства связи</em> (адаптеры Z-Wave / Zigbee), <em>ИБП</em>, накопители, HID, — чтобы вы могли сразу различить подключённые адаптеры, не сверяя идентификаторы.",
"imageAlt": "Карточка USB-устройств с тремя устройствами: Aeotec Z-Wave Z-Stick, координатор Zigbee ConBee II и ИБП Ellipse ECO; для каждого указаны версия USB, адрес, идентификатор производителя:продукта и используемый драйвер",
"imageCaption": "Три USB-устройства — два радиомодуля домашней автоматизации на <code>usbfs</code> и ИБП на <code>usbfs</code> (NUT взаимодействует с ним через libusb)."
},
"power": {
"heading": "Энергопотребление",
"subHeading": "(при наличии устройств)",
"intro": "Раздел отображается, только если хост предоставляет данные об энергопотреблении. При наличии данных отображаются два независимых источника:",
"items": [
"<strong>Общее энергопотребление по ACPI / IPMI</strong> — мощность, потребляемая всей системой, по данным датчика на плате или BMC. Обычно доступно на серверных платах.",
"<strong>Энергопотребление процессорного пакета</strong> — считывается со счётчиков Intel RAPL (или аналога AMD). Позволяет отделить энергопотребление процессора от остальной системы на потребительских платах, которые не предоставляют общее значение."
],
"supplyImageAlt": "Раздел энергопотребления с общим потреблением 198 Вт по данным интерфейса ACPI и карточка блоков питания с двумя исправными блоками питания (выходная мощность 185 Вт и 5 Вт)",
"supplyImageCaption": "Серверная плата с одним датчиком мощности ACPI и двумя блоками питания, данные о которых доступны через IPMI; второй блок питания — резервный, в режиме ожидания его мощность составляет 5 Вт.",
"cpuImageAlt": "Раздел энергопотребления на потребительской плате, показывающий только мощность процессора 8,7 Вт по данным Intel RAPL",
"cpuImageCaption": "Потребительская плата без датчика общего энергопотребления системы — в этом случае раздел показывает только энергопотребление процессора по данным RAPL."
},
"psu": {
"heading": "Блоки питания",
"subHeading": "(при наличии устройств)",
"body": "Для систем с серверной платой или двумя блоками питания данные поступают через IPMI: наличие блока (PSU 1 / PSU 2 / …), входное напряжение, выходная мощность, состояние «исправен / неисправен». Это первое, что стоит проверить после кратковременного сбоя питания на узле с резервированием блоков питания."
},
"fans": {
"heading": "Системные вентиляторы",
"subHeading": "(при наличии устройств)",
"body": "Скорость каждого вентилятора в об/мин с небольшим графиком (если поддерживается). На платах, которые не предоставляют данные по отдельным вентиляторам, раздел показывает одно значение скорости корпусного вентилятора."
},
"ups": {
"heading": "Состояние ИБП",
"subHeading": "(при наличии устройств)",
"body": "Отображается, если сервер NUT (Network UPS Tools) настроен и доступен. Показывает состояние (питание от сети / питание от батареи / зарядка / низкий заряд батареи), процент заряда батареи, расчётное время автономной работы, процент нагрузки, входное напряжение, модель и версию прошивки."
},
"dataCollected": {
"heading": "Как собираются данные",
"headerSection": "Раздел вкладки",
"headerEndpoint": "Конечная точка",
"headerSource": "Источник",
"rows": [
{
"section": "Статические сведения об оборудовании (PCI, CPU, BIOS)",
"endpoint": "/api/hardware",
"source": "<code>lspci -vmm</code>, <code>/proc/cpuinfo</code>, <code>dmidecode</code>; кэшируются на всё время работы процесса."
},
{
"section": "Текущие показания датчиков",
"endpoint": "/api/hardware/live",
"source": "<code>sensors</code> (lm-sensors), а также <code>/sys/class/hwmon</code> и <code>/sys/block</code> для идентификации накопителей. Показания температуры остаются актуальными; на 60 секунд кэшируется только соответствие между hwmon и устройствами."
},
{
"section": "История температуры процессора",
"endpoint": "/api/temperature/history",
"source": "Временные ряды, которые сборщик данных о температуре записывает каждые 60 секунд и сохраняет в SQLite."
},
{
"section": "Показатели GPU в реальном времени",
"endpoint": "/api/gpu/<slot>/realtime",
"source": "NVIDIA: <code>nvidia-smi --query-gpu=...</code>. Intel: <code>intel_gpu_top</code>. AMD: sysfs <code>/sys/class/drm/cardN</code>."
}
],
"codeComment1": "# Сверьте сведения об оборудовании с данными ОС",
"codeComment2": "# Проверьте, какую видеокарту видит панель мониторинга"
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Установить драйверы NVIDIA на хосте",
"href": "/docs/hardware/nvidia-host",
"tail": " — что запускает кнопка установки в модальном окне GPU."
},
{
"label": "Переключить режим GPU (ВМ ↔ LXC)",
"href": "/docs/hardware/switch-gpu-mode",
"tail": " — какие изменения вносит на хосте переключатель режима, расположенный на каждой карточке GPU."
},
{
"label": "Установка TPU Coral на хосте",
"href": "/docs/hardware/install-coral-tpu-host",
"tail": " — установка модуля ядра и среды выполнения Coral."
},
{
"label": "Состояние и проверка диска по SMART",
"href": "/docs/disk-manager/smart-disk-test",
"tail": " — скрипт, предоставляющий данные SMART для подробного просмотра диска на вкладке «Хранилище»."
},
{
"label": "Панель мониторинга: вкладка «Хранилище»",
"href": "/docs/monitor/dashboard/storage",
"tail": " — полная таблица атрибутов SMART, история самотестирования и отчёт в формате PDF."
},
{
"label": "Мониторинг состояния",
"href": "/docs/monitor/health-monitor",
"tail": " — категория «Процессор и температура», использующая данные тех же датчиков."
},
{
"label": "Справочник API",
"href": "/docs/monitor/api",
"tail": " — конечные точки API для оборудования и GPU."
},
{
"label": "Обзор панели мониторинга",
"href": "/docs/monitor/dashboard",
"tail": " — остальные вкладки."
}
]
}
}
@@ -0,0 +1,101 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель мониторинга | Документация ProxMenux",
"description": "Панель мониторинга — основной пользовательский интерфейс ProxMenux Monitor: десять вкладок с содержимым, включая панель запуска приложений, а также общая верхняя панель и настраиваемый порядок элементов навигации верхнего уровня."
},
"header": {
"title": "Панель мониторинга",
"description": "Панель мониторинга — интерфейс ProxMenux Monitor для повседневной работы: десять вкладок с содержимым, включая панель запуска приложений, а также общая верхняя панель и настраиваемый порядок элементов навигации верхнего уровня.",
"section": "ProxMenux Monitor"
},
"oneHeader": {
"title": "Одна верхняя панель, десять вкладок",
"body": "Верхняя панель (логотип, имя узла, индикатор состояния, время непрерывной работы, кнопка обновления, переключатель темы) видна везде. Выбор активной вкладки под ней меняет всю область содержимого. Цвет индикатора состояния соответствует категории с наихудшим состоянием в <link>Health Monitor</link> — это тот же показатель, отображаемый на панели мониторинга."
},
"tabs": {
"heading": "Десять вкладок",
"intro": "Для каждой вкладки предусмотрена отдельная страница. Страницы добавляются постепенно по мере наполнения документации; ниже приведён полный список вкладок с описанием назначения каждой из них.",
"headerTab": "Вкладка",
"headerOwns": "Назначение",
"rows": [
{
"name": "Обзор системы",
"linksTo": "/docs/monitor/dashboard/system-overview",
"owns": "Виджеты процессора, памяти и температуры, количество активных ВМ и LXC, графики исторических метрик, сводки по хранилищам и сети. Начальная вкладка по умолчанию, пока не настроен порядок навигации."
},
{
"name": "Приложения",
"linksTo": "/docs/monitor/dashboard/apps",
"owns": "Единая панель запуска зарегистрированных веб-ссылок LXC и пользовательских ссылок с категориями, поиском, быстрым доступом к гостевым системам и индикаторами обновлений для каждого приложения."
},
{
"name": "Хранилище",
"owns": "Пулы Proxmox, физические диски, данные SMART, состояние ZFS, износ и срок службы, история наблюдений."
},
{
"name": "Сеть",
"owns": "Все интерфейсы (физические / bond / bridge / OVS), IP/MAC, графики RX/TX, исторические данные RRD для каждого интерфейса."
},
{
"name": "ВМ и LXC",
"owns": "Список гостевых систем, подробный просмотр конфигурации, метрик и журналов, действия запуска, остановки, перезагрузки и завершения работы."
},
{
"name": "Оборудование",
"owns": "Модель и топология процессора, конфигурация памяти, топология PCIe, графические процессоры с мониторингом в реальном времени для каждого слота."
},
{
"name": "Системные журналы",
"owns": "<code>journalctl</code> в реальном времени с фильтрами, история задач Proxmox, журнал уведомлений, пакеты журналов для скачивания."
},
{
"name": "Терминал",
"owns": "Командная оболочка хоста Proxmox в браузере на базе <code>xterm.js</code> через WebSockets. Консоли LXC открываются на вкладке «ВМ и LXC»."
},
{
"name": "Безопасность",
"owns": "Настройка аутентификации, пароль / 2FA / токены API, журнал аудита, дополнительная панель Fail2Ban, развёртывание Secure Gateway."
},
{
"name": "Настройки",
"owns": "Язык Monitor, порядок навигации, каналы уведомлений, поставщик ИИ, пороговые значения состояния системы, исключения и перечень оптимизаций после установки."
}
]
},
"headerAnatomy": {
"heading": "Элементы шапки",
"items": [
"<strong>Логотип и название продукта</strong> слева. При обнаружении более новой версии Monitor логотип меняется на вариант «Доступно обновление».",
"<strong>Имя узла</strong> — имя узла Proxmox, полученное из <code>pvesh get /nodes</code>; если получить его не удалось, используется <code>hostname</code>.",
"<strong>Индикатор состояния системы</strong> — «В норме» (зелёный), «Предупреждение» (жёлтый), «Критическое состояние» (красный). Нажмите на него, чтобы открыть модальное окно мониторинга состояния системы. Дополнительный синий значок <em>информация</em> появляется, если есть скрытые элементы, для которых ещё не истёк период подавления уведомлений.",
"<strong>Время работы</strong> — время непрерывной работы хоста в удобочитаемом формате.",
"<strong>Кнопка обновления</strong> — повторяет все вызовы API для получения актуальных данных без полной перезагрузки страницы.",
"<strong>Переключатель темы</strong> — светлая / тёмная / системная. Выбор сохраняется в <code>localStorage</code>."
]
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Вкладка «Приложения»",
"href": "/docs/monitor/dashboard/apps",
"tail": " — единая панель запуска веб-ссылок и её связь с зарегистрированными приложениями LXC."
},
{
"label": "Вкладка «Обзор системы»",
"href": "/docs/monitor/dashboard/system-overview",
"tail": " — начальная вкладка с полной документацией."
},
{
"label": "Мониторинг состояния",
"href": "/docs/monitor/health-monitor",
"tail": " — модальное окно, открываемое индикатором состояния в заголовке: подробный разбор десяти категорий."
},
{
"label": "Архитектура",
"href": "/docs/monitor/architecture",
"tail": " — как панель мониторинга взаимодействует с серверной частью Flask."
}
]
}
}
@@ -0,0 +1,251 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель мониторинга: вкладка «Сеть» | Документация ProxMenux",
"description": "На вкладке «Сеть» перечислены все интерфейсы хоста: физические сетевые адаптеры, мосты, агрегированные интерфейсы, VLAN и виртуальные интерфейсы ВМ/LXC. Подробное представление каждого интерфейса показывает IP-адрес, MAC-адрес, состояние, интерфейсы в составе агрегированного интерфейса, трафик с момента загрузки и график исторических данных RRD."
},
"header": {
"title": "Панель мониторинга: вкладка «Сеть»",
"description": "Все интерфейсы, о которых сообщает ядро, — физические сетевые адаптеры, мосты, агрегированные интерфейсы, VLAN и виртуальные порты ВМ/LXC — сгруппированы в три карточки. Нажатие на любую строку открывает подробное представление с адресами, счётчиками трафика и историческими данными RRD.",
"section": "ProxMenux Monitor · Панель управления"
},
"intro": {
"title": "Текущие и исторические данные — доступны и те и другие",
"body": "Текущее состояние поступает из <code>psutil.net_if_stats()</code> и <code>ip</code>, а исторические данные о пропускной способности — из хранилища RRD Proxmox через <code>/api/network/&lt;interface&gt;/metrics</code>. Страница обновляет текущие счётчики примерно каждые 5 секунд и по запросу загружает свежие данные RRD для графика."
},
"topRow": {
"heading": "Верхний ряд: четыре карточки показателей",
"headerCard": "Карточка",
"headerWhat": "Что показывает",
"rows": [
{
"card": "Сетевой трафик",
"what": "Суммарная скорость приёма и передачи (RX / TX) по всем интерфейсам в подходящих единицах измерения (бит/с / Кбит/с / Мбит/с / Гбит/с)."
},
{
"card": "Активные интерфейсы",
"what": "Два счётчика: <em>Физические X / Y</em> и <em>Мосты X / Y</em> (число активных из общего количества). Это первый показатель, который стоит проверить, когда что-то перестаёт работать."
},
{
"card": "Состояние сети",
"what": "Краткая оценка — «В норме» / «Предупреждение» / «Критическое состояние» — на основе состояния соединений, доступности шлюза и целостности мостов. Соответствует категории <em>Сетевые интерфейсы</em> монитора состояния."
},
{
"card": "Сетевая задержка",
"what": "Время прохождения сигнала до шлюза и обратно с мини-графиком. Нажатие на карточку открывает <strong>модальное окно «Сетевая задержка»</strong>, описанное ниже: просмотр исторических данных и проверка ping по запросу до шлюза / Cloudflare / Google с возможностью скачать отчёт в формате PDF."
}
]
},
"flow": {
"heading": "Схема сетевых потоков",
"intro": "Между верхним рядом и тремя карточками групп на вкладке отображается топология в реальном времени под названием <strong>Сетевые потоки</strong>. На схеме показаны все пути, по которым пакет может пройти через хост: физические сетевые адаптеры с одной стороны, мосты посередине, ВМ и контейнеры с другой. Анимированные импульсы показывают трафик приёма и передачи (rx/tx) на каждом соединении в реальном времени.",
"imageAlt": "Схема сетевых потоков: сетевые адаптеры слева, хост и мосты посередине, ВМ и контейнеры LXC справа; на каждом соединении отображаются анимированные импульсы",
"imageCaption": "Сетевые потоки: узлы с цветовым обозначением и анимированные «кометы», направление и толщина которых отражают текущий трафик.",
"elementsTitle": "Что показано на схеме",
"elementsIntro": "Каждый узел представляет один объект из того же списка, который используется в карточках групп ниже. На схеме объекты расположены в соответствии с топологией, поэтому связи между ними видны сразу:",
"elements": [
"<strong>Сетевые карты</strong> (янтарные) — все физические интерфейсы с активным соединением. Интерфейсы, для которых сообщается об отсутствии соединения, отображаются бледными.",
"<strong>Хост</strong> (янтарный) — сам хост Proxmox, расположенный между сетевыми картами и мостами. Отображается как неподвижный опорный узел; нажатие на него недоступно.",
"<strong>Мосты</strong> (голубые) — мосты Linux и OVS. Отображаются только мосты, к которым подключена хотя бы одна работающая гостевая система; неиспользуемые мосты скрыты, чтобы на схеме оставались только объекты, через которые действительно проходит трафик.",
"<strong>Контейнеры LXC</strong> (голубые) — работающие контейнеры, подключённые к мосту.",
"<strong>Виртуальные машины</strong> (фиолетовые) — работающие виртуальные машины, подключённые к мосту.",
"Неработающие гостевые системы (остановленные виртуальные машины и контейнеры) скрыты."
],
"pulsesTitle": "Что обозначает анимация",
"pulsesBody": "Анимированные кометы, движущиеся вдоль каждой линии связи, показывают текущий трафик:",
"pulses": [
"<strong>Направление</strong> — импульс, движущийся к сетевой карте, обозначает <em>tx</em> со стороны гостевой системы; движущийся к гостевой системе — <em>rx</em>.",
"<strong>Толщина линии</strong> зависит от суммарной скорости rx+tx гостевой системы. Даже при отсутствии трафика отображается бледная анимированная линия; при высокой нагрузке линия становится толстой.",
"<strong>Свечение головы кометы</strong> — тёплое при ~1 МБ/с, горячее при ≥30 МБ/с. Позволяет с первого взгляда определить, какая гостевая система создаёт основную нагрузку на сетевую карту.",
"<strong>Нажатие</strong> — любой узел, кроме хоста, доступен для нажатия и открывает то же модальное окно с подробностями об интерфейсе, которое описано ниже. Нажатие на хост намеренно ничего не делает — в этом представлении нет модального окна с подробностями о хосте."
],
"useTitle": "Когда это полезно",
"useBody": "Карточки групп показывают, <em>какие объекты существуют</em>; схема показывает, <em>как они соединены</em> и куда направлен трафик. Можно заметить гостевые системы, подключённые к одному мосту, две гостевые системы с высокой нагрузкой, использующие одну сетевую карту (возможное узкое место), или одну виртуальную машину, полностью загружающую канал, пока остальные почти не передают данные."
},
"groups": {
"heading": "Три группы интерфейсов",
"intro": "Под верхним рядом расположены три карточки, в которых интерфейсы сгруппированы по роли. В заголовке каждой карточки есть свой индикатор количества активных интерфейсов. <strong>Тип</strong> интерфейса легко определить по цветной метке в каждой строке:",
"badges": [
"Синяя метка <strong>Физический</strong> — реальная сетевая карта.",
"Зелёная метка <strong>Мост</strong> — мост Linux или OVS (<code>vmbr*</code>).",
"Фиолетовая метка <strong>Bond</strong> — агрегированный интерфейс bond / LACP / active-backup.",
"Голубая метка <strong>VLAN</strong> — подынтерфейс VLAN (<code>vmbr0.10</code>, <code>eno1.42</code>, …)."
],
"clickable": "<strong>Любая строка доступна для нажатия</strong> — будь то физический или виртуальный интерфейс, мост или bond — и открывает описанное ниже окно с подробностями об интерфейсе (основные сведения, IP-адреса, счётчики трафика, график RX/TX за прошедший период на основе RRD-хранилища Proxmox).",
"physicalTitle": "Физические интерфейсы",
"physicalBody": "Все сетевые адаптеры, которые ядро распознаёт как физические устройства: <code>eno1</code>, <code>enp4s0</code>, <code>eth0</code>, <code>wlp3s0</code> и т. д. Для каждого устройства отображается отдельная строка с синей меткой <strong>Физический</strong> и состоянием соединения. <em>Участники bond</em> (сетевые адаптеры, включённые в bond) также показаны здесь с подсказкой, указывающей на родительский bond.",
"bridgeTitle": "Интерфейсы мостов",
"bridgeBody": "Мосты Linux (<code>vmbr0</code>, <code>vmbr1</code>, …) и мосты OVS, которыми управляет Proxmox. В каждой строке отображаются зелёная метка <strong>Мост</strong>, базовый физический интерфейс (для однопортового моста) и состояние моста. Интерфейсы bond, отображаемые на этом уровне, отмечены фиолетовой меткой <strong>Bond</strong>, а подынтерфейсы VLAN — голубой меткой <strong>VLAN</strong>.",
"vmTitle": "Интерфейсы ВМ / LXC",
"vmBody": "Интерфейсы <code>tap*</code> и <code>veth*</code>, создаваемые при запуске гостевых систем: по одному на каждый виртуальный сетевой адаптер. В заголовке карточки отображается <em>Активно: X / Y</em>; строки содержат ссылки на соответствующие ВМ или контейнеры, позволяющие перейти непосредственно к гостевой системе на вкладке «ВМ и LXC». После остановки гостевой системы неактивные записи сохраняются ненадолго и исчезают в течение одного цикла обновления."
},
"drillIn": {
"heading": "Подробные сведения об интерфейсе",
"intro": "При нажатии на любую строку открывается модальное окно с пятью блоками:",
"headerBlock": "Блок",
"headerContents": "Содержимое",
"rows": [
{
"block": "Основная информация",
"contents": "Имя интерфейса, тип (физический / мост / bond / VLAN / ВМ), MAC-адрес, состояние (активен / неактивен), MTU и базовый физический интерфейс для нефизических типов."
},
{
"block": "Участники bond",
"contents": "Только для bond. Список всех включённых в bond сетевых адаптеров с признаком состояния «активен / сбой», режим bond (active-backup / 802.3ad / balance-alb / …) и основной интерфейс, если он настроен."
},
{
"block": "IP-адреса",
"contents": "Все адреса IPv4 / IPv6 с длиной префикса. Автоматически настроенные локальные адреса канала (link-local) также перечислены, но отображаются серым цветом."
},
{
"block": "График за период",
"contents": "Скорость приёма и передачи (RX / TX) за выбранный период (1 час / 24 часа / 7 дней / 30 дней / 1 год) по данным из <code>/api/network/&lt;interface&gt;/metrics</code> (Proxmox RRD)."
},
{
"block": "Трафик с момента последней загрузки",
"contents": "Общее количество принятых и переданных (RX / TX) байтов и пакетов с момента последней загрузки хоста, а также счётчики ошибок и отброшенных пакетов."
}
],
"inactiveTitle": "Подробные сведения доступны и для неактивных интерфейсов",
"inactiveBody": "Для интерфейса в состоянии <em>неактивен</em> в модальном окне отображается небольшой баннер «Интерфейс неактивен», а текущие счётчики не выводятся. Конфигурация (адреса, участники bond) и исторические данные по-прежнему отображаются — это помогает выяснить причину и время сбоя."
},
"latency": {
"heading": "Модальное окно «Сетевая задержка»",
"intro": "При нажатии на карточку <em>Сетевая задержка</em> в верхнем ряду открывается отдельное модальное окно. В нём доступны два режима (исторические данные и проверка по запросу), три варианта цели проверки и отчёт в формате PDF, который можно скачать.",
"targetsTitle": "Цели проверки",
"targetsIntro": "Раскрывающийся список в верхней части модального окна позволяет выбрать цель проверки ping:",
"targets": [
"<strong>Шлюз</strong> — маршрутизатор вашей локальной сети. Проверяется только участок локальной сети; это полезно, если вы подозреваете проблему с коммутатором или кабелем и хотите исключить влияние WAN.",
"<strong>Cloudflare (1.1.1.1)</strong> — общедоступный DNS-резолвер с сетью anycast. Проверяет участок соединения с внешней сетью (WAN).",
"<strong>Google (8.8.8.8)</strong> — альтернативный общедоступный узел для проверки, полезный для контрольного сравнения или при ухудшении работы Cloudflare в вашем регионе."
],
"mode1Title": "Режим 1 — Просмотр истории",
"mode1Alt": "Модальное окно задержки сети в режиме просмотра истории — выбран шлюз, временной диапазон составляет 1 час, на графике показаны предыдущие измерения",
"mode1Caption": "Просмотр истории — измерения для шлюза за последний час из базы истории задержек, в которую поток сбора данных о температуре и задержке записывает данные каждые 60 секунд.",
"mode1Body1": "Режим по умолчанию при открытии диалогового окна. Во втором раскрывающемся списке выбирается период (<em>1 час / 6 часов / 24 часа / 3 дня / 7 дней</em>). Над графиком отображаются текущее, минимальное, среднее и максимальное значения, а также индикатор состояния «Отлично / Хорошо / Удовлетворительно / Плохо», определяемого по указанным ниже порогам.",
"mode1Body2": "Источник: те же измерения задержки, которые монитор состояния использует для выявления устойчивого замедления сети. Фоновый поток <code>_temperature_collector_loop</code> выполняет измерения для шлюза каждые 60 секунд и записывает их в локальную историю SQLite.",
"mode2Title": "Режим 2 — Проверка в реальном времени",
"mode2Alt": "Модальное окно задержки сети с выполняемой в реальном времени проверкой ping для Cloudflare — индикатор выполнения на отметке 50%, новые измерения добавляются на график",
"mode2Caption": "Проверка Cloudflare в реальном времени — сеанс длится 2 минуты, измерения выполняются каждые 5 секунд и отображаются на графике по мере поступления. Нажмите <em>Остановить</em> для досрочного завершения; <em>Проверить снова</em> добавляет новые измерения в тот же набор данных.",
"mode2Intro": "При выборе Cloudflare или Google в качестве цели запускается проверка ping по запросу. Особенности работы:",
"mode2Items": [
"<strong>Длительность</strong> — 2 минуты на сеанс, с индикатором выполнения и счётчиком оставшихся секунд.",
"<strong>Периодичность</strong> — одно измерение каждые 5 секунд (24 измерения за сеанс).",
"<strong>Метод</strong> — ICMP Echo Request (<code>ping</code>), 3 последовательных запроса ping на каждое измерение с усреднением задержки.",
"<strong>Остановить</strong> — немедленно завершает проверку; уже собранные данные сохраняются.",
"<strong>Проверить снова</strong> — добавляет новые измерения в существующий набор данных, а не начинает сбор с нуля, что позволяет накопить более длительную историю за несколько сеансов.",
"<strong>Индикатор текущего состояния</strong> — обновляется после каждого измерения с использованием тех же пороговых значений для состояний «Отлично / Хорошо / Удовлетворительно / Плохо»."
],
"thresholdsTitle": "Пороговые значения производительности",
"headerStatus": "Состояние",
"headerRange": "Диапазон",
"headerImpact": "Практическое влияние",
"thresholdRows": [
{
"status": "Отлично",
"range": "< 50 мс",
"impact": "Оптимально для приложений реального времени, игр и видеозвонков."
},
{
"status": "Хорошо",
"range": "50 – 100 мс",
"impact": "Приемлемо для большинства приложений с минимальным влиянием на их работу."
},
{
"status": "Удовлетворительно",
"range": "100 – 200 мс",
"impact": "Заметная задержка. Может влиять на работу VoIP и интерактивных приложений."
},
{
"status": "Плохо",
"range": "> 200 мс",
"impact": "Значительная задержка. Рекомендуется выяснить причину."
}
],
"reportTitle": "Отчёт о сетевой задержке (PDF)",
"reportIntro": "В обоих режимах рядом с полем выбора цели есть кнопка <strong>Отчёт</strong>. Она открывает отчёт об измерениях для печати; сохраните его в формате PDF через диалоговое окно печати браузера и приложите к обращению к вашему интернет-провайдеру для устранения неполадок.",
"reportPreviewAlt": "Первая страница PDF-отчёта о сетевой задержке — сводка со стрелочным индикатором, статистикой задержки, графиком задержки и справочником пороговых значений",
"reportPreviewCaption": "Первая страница отчёта о сетевой задержке содержит сводку, стрелочный индикатор, основную статистику, график задержки во времени и справочник пороговых значений. Начиная со второй страницы приводятся таблица отдельных замеров и методика.",
"downloadLabel": "Скачать образец отчёта о сетевой задержке (PDF)",
"sectionsIntro": "Отчёт состоит из шести разделов:",
"sections": [
"<strong>Сводка</strong> — стрелочный индикатор (0–300+ мс с зелёной, жёлтой и красной зонами), оценка состояния (ОТЛИЧНО / ХОРОШО / УДОВЛЕТВОРИТЕЛЬНО / ПЛОХО), цель, режим, количество замеров и однострочная сводка о потере пакетов.",
"<strong>Статистика задержки</strong> — текущее, минимальное, среднее и максимальное значения на четырёх крупных плитках, а также количество замеров, средняя потеря пакетов и период тестирования.",
"<strong>График задержки</strong> — диаграмма с областями, отображающая каждый замер за период тестирования, с линиями сетки по оси Y для минимального, среднего и максимального значений.",
"<strong>Пороговые значения производительности</strong> — та же четырёхуровневая шкала, что описана выше, с цветной точкой для каждого уровня.",
"<strong>Подробные результаты тестирования</strong> — пронумерованная таблица с меткой времени, задержкой, потерей пакетов и состоянием для каждого замера. Помогает обнаружить кратковременные всплески, которые скрываются за общими средними значениями.",
"<strong>Методика</strong> — эхо-запрос ICMP, 3 последовательных ping-запроса на каждый замер, имя и IP-адрес цели, а также итоговая оценка производительности на основе состояния."
],
"useCaseTitle": "Пример использования: обращение в поддержку интернет-провайдера",
"useCaseBody": "Когда соединение кажется медленным, запустите тест Cloudflare в реальном времени на 2 минуты, нажмите <em>Повторить тест</em>, чтобы продолжить запись результатов, затем выберите <em>Отчёт</em>. PDF-файл содержит все замеры и методику. Его можно приложить к обращению в службу поддержки, указав время возникновения проблемы; ваш интернет-провайдер сам определяет, какие подтверждающие данные ему необходимы."
},
"excluding": {
"heading": "Исключение интерфейсов с избыточной активностью",
"body1": "Как и хранилища, отдельные интерфейсы можно исключить из мониторинга состояния — это полезно для намеренно отключённых мостов, тестовых интерфейсов или сетевых адаптеров, которые физически удалены, но всё ещё присутствуют в конфигурации. Флаг хранится в таблице <code>excluded_interfaces</code> и учитывается в цикле мониторинга состояния: предупреждения и уведомления не создаются, а интерфейс не влияет на индикатор состояния в заголовке.",
"body2": "В контекстном меню строки выберите <em>Исключить из мониторинга</em>. Интерфейс останется видимым на панели мониторинга с фиолетовой меткой <strong>исключён</strong>. Снова включить мониторинг можно в том же меню."
},
"dataCollected": {
"heading": "Как собираются данные",
"headerSection": "Раздел вкладки",
"headerEndpoint": "Конечная точка",
"headerSource": "Источник",
"rows": [
{
"section": "Список интерфейсов",
"endpoint": "/api/network",
"source": "<code>ip -j addr</code> + <code>ip -j link</code> + анализ интерфейсов bond / bridge."
},
{
"section": "Сводные карточки",
"endpoint": "/api/network/summary",
"source": "Агрегация данных списка интерфейсов и подсчёт активных и неактивных интерфейсов."
},
{
"section": "Временные ряды RX/TX для каждого интерфейса",
"endpoint": "/api/network/<iface>/metrics",
"source": "Текущие счётчики используют <code>/proc/net/dev</code>; исторические данные для графиков поступают из Proxmox RRD через pvesh. Для интерфейсов ВМ/LXC используются данные RRD гостевых систем; для физических интерфейсов и мостов — данные RRD узла."
},
{
"section": "Задержка: текущее значение",
"endpoint": "/api/network/latency/current",
"source": "Короткая серия запросов <code>ping</code> к настроенному шлюзу / целевому адресу."
},
{
"section": "Задержка: история",
"endpoint": "/api/network/latency/history",
"source": "Измерения сохраняются примерно каждые 60 секунд фоновым сборщиком данных о температуре и задержке."
}
],
"codeComment1": "# Сверьте состояние интерфейса с данными панели мониторинга",
"codeComment2": "# Проверьте текущий замер задержки от начала до конца"
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Мониторинг состояния",
"href": "/docs/monitor/health-monitor",
"tail": " — категория «Сеть» и пороговые значения для истории задержки."
},
{
"label": "Справочник API",
"href": "/docs/monitor/api",
"tail": " — конечные точки для данных о сети и задержке."
},
{
"label": "Интеграции",
"href": "/docs/monitor/integrations",
"tail": " — сбор данных через Prometheus предоставляет те же сетевые метрики."
},
{
"label": "Обзор панели мониторинга",
"href": "/docs/monitor/dashboard",
"tail": " — остальные вкладки."
},
{
"label": "ProxMenux → Сеть",
"href": "/docs/network",
"tail": " — доступные действия: анализ мостов, постоянные имена интерфейсов, резервное копирование и перезапуск, iperf3."
}
]
}
}
@@ -0,0 +1,246 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель мониторинга: вкладка «Безопасность» | Документация ProxMenux",
"description": "На вкладке «Безопасность» все элементы управления защитой сгруппированы в два столбца: ProxMenux Monitor (аутентификация, SSL/HTTPS, токены API, Secure Gateway) и Proxmox VE (межсетевой экран, Fail2Ban, аудит Lynis). Пошаговый мастер настройки Secure Gateway, руководство по аудиту Lynis, установка Fail2Ban и настройка правил."
},
"header": {
"title": "Панель мониторинга: вкладка «Безопасность»",
"description": "Все элементы управления безопасностью на панели мониторинга сгруппированы в два чётко обозначенных блока: настройка самого Monitor (аутентификация, SSL, токены, Secure Gateway) и настройка отслеживаемого им хоста Proxmox (межсетевой экран, Fail2Ban, Lynis).",
"section": "ProxMenux Monitor · Панель управления"
},
"intro": {
"title": "Две области управления, одна вкладка",
"body": "Вкладка «Безопасность» содержит два раздела: <strong>ProxMenux Monitor</strong> (настройки панели) и <strong>Proxmox VE</strong> (настройки хоста). Карточки Fail2Ban и Lynis предлагают установить эти инструменты, если они отсутствуют, а после установки отображают элементы управления ими."
},
"monitor": {
"heading": "ProxMenux Monitor",
"intro": "Четыре карточки управляют доступом к самой панели и аутентификацией."
},
"auth": {
"heading": "Аутентификация",
"imageAlt": "Карточка аутентификации со статусом «Включена», кнопками «Выйти» и «Изменить пароль», сведениями о двухфакторной аутентификации и кнопками «Включить двухфакторную аутентификацию» и «Отключить аутентификацию»",
"imageCaption": "Карточка аутентификации при включённой аутентификации: индикатор статуса, кнопки «Изменить пароль» и «Включить 2FA», а также деструктивное действие «Отключить аутентификацию».",
"intro": "Эта карточка позволяет управлять входом в саму панель. Полная процедура первого запуска, требования к паролю, экраны настройки TOTP и восстановление доступа при утрате аутентификатора описаны в разделе <link>Доступ и аутентификация</link>. Карточка предназначена для повседневного управления этими настройками:",
"items": [
"<strong>Статус аутентификации</strong> — индикатор со значением <em>Включена</em> / <em>Отключена</em> / <em>Отклонена</em>.",
"<strong>Изменить пароль</strong> — текущий пароль + новый пароль + подтверждение.",
"<strong>Включить / отключить двухфакторную аутентификацию</strong> — при включении открывает диалог настройки с QR-кодом, при отключении запрашивает текущий пароль.",
"<strong>Отключить аутентификацию</strong> — деструктивное действие, после которого при следующем посещении снова появляется диалог первого запуска <em>Защитить панель?</em>."
]
},
"ssl": {
"heading": "SSL / HTTPS",
"imageAlt": "Карточка SSL / HTTPS со статусом «HTTP — без SSL», обнаруженным сертификатом хоста Proxmox с полями «Субъект», «Издатель» и «Срок действия», кнопкой «Использовать сертификат Proxmox» и вариантом «Использовать собственный сертификат»",
"imageCaption": "Карточка SSL / HTTPS при отключённом HTTPS. Monitor обнаруживает сертификат, уже установленный на хосте Proxmox, и предлагает использовать его одним нажатием. Если ваши собственные файлы находятся в другом месте, доступен вариант <em>Использовать собственный сертификат</em>.",
"intro": "Обеспечивает доступ к панели по HTTPS без обратного прокси перед ней. Карточка автоматически обнаруживает сертификат, который использует сам Proxmox (в <code>/etc/pve/local/</code>), и показывает субъект, издателя и срок действия, чтобы вы могли проверить сертификат перед активацией. Включить HTTPS можно двумя способами:",
"items": [
"<strong>Использовать сертификат Proxmox</strong> — одним нажатием. Monitor использует сертификат, установленный на хосте. Этот вариант подходит пользователям, у которых PVE уже работает под тем же DNS-именем, что и панель.",
"<strong>Использовать собственный сертификат</strong> — вставьте абсолютные пути к своему сертификату <code>.pem</code> и закрытому ключу <code>.key</code>. Пути проверяются перед перезапуском службы; если загрузка не удаётся, панель автоматически возвращается к HTTP и остаётся работоспособной."
],
"enabledAlt": "Карточка SSL/HTTPS со статусом «HTTPS включён», разделом «Активный сертификат» с путями pve-ssl.pem и pve-ssl.key и кнопкой «Отключить HTTPS»",
"enabledCaption": "HTTPS активен — карточка показывает используемый сертификат, пути к файлам и действие <em>Отключить HTTPS</em>, которое возвращает панель к HTTP на том же порту.",
"acmeTitle": "ACME / Let's Encrypt через Proxmox",
"acmeBody": "Если на вашем узле Proxmox уже настроен Let's Encrypt в <em>Datacenter → Certificates → ACME</em>, хост предоставляет браузерам именно этот сертификат. Его же использует панель при нажатии <em>Использовать сертификат Proxmox</em>. Отдельно настраивать ACME для Monitor не нужно.",
"walkthroughLink": "Пошаговое руководство, в том числе о том, как Monitor автоматически обнаруживает сертификат, загруженный через ACME, что записывается на диск и как перейти к собственной паре <code>.pem</code> / <code>.key</code>, см. в разделе <link>HTTPS для ProxMenux Monitor</link>."
},
"apiTokens": {
"heading": "Токены доступа API",
"emptyAlt": "Пустая карточка токенов доступа API с информационным блоком «О токенах API» и кнопкой «Создать новый токен API»",
"emptyCaption": "Карточка токенов доступа API после новой установки — блок <em>О токенах API</em> кратко описывает срок действия, использование и способ добавления токена в заголовки <code>Authorization: Bearer</code>.",
"intro": "Долгосрочные токены (на 1 год) для автоматических интеграций: виджетов Homepage, REST-сенсоров Home Assistant, сборщиков данных Grafana, сценариев n8n и собственных скриптов. Карточка проводит вас через три состояния: пустая карточка → форма → созданный токен.",
"generateBody": "<strong>Создайте токен.</strong> Нажмите <em>Создать новый API токен</em>. В форме нужно указать понятное <em>имя токена</em> (чтобы впоследствии его было проще найти в списке активных токенов) и ваш <em>пароль</em> для подтверждения вторым фактором. Если включена 2FA, форма дополнительно запрашивает текущий код TOTP.",
"generateAlt": "Форма создания токена доступа API с полями «Имя токена» и «Пароль» и кнопками «Создать токен» и «Отмена»",
"generateCaption": "Форма создания токена API — укажите имя и подтвердите действие паролем (и кодом TOTP, если включена 2FA).",
"saveBody": "<strong>Сразу сохраните токен.</strong> Полная строка токена отображается <strong>только один раз</strong> после создания. В карточке это подчёркивается предупреждением янтарного цвета и кнопкой копирования. Получить её повторно невозможно — в списке активных токенов будет виден только префикс.",
"generatedAlt": "Токен API успешно создан: замаскированный токен, кнопка копирования, инструкции по использованию заголовка Authorization с типом Bearer и список активных токенов с префиксом",
"generatedCaption": "Токен создан — его значение отображается один раз вместе с кнопкой копирования и точным фрагментом <code>Authorization: Bearer</code>. Ниже в списке активных токенов сохраняются имя, префикс и дата создания, чтобы впоследствии можно было отозвать отдельные токены.",
"outro": "В карточке отображаются все активные токены с кнопкой <em>Отозвать</em> в каждой строке. При отзыве токен немедленно становится недействительным; любая использующая его интеграция с этого момента перестаёт работать. Практические инструкции для Homepage, Home Assistant, n8n и Prometheus приведены в разделе <link>Интеграции</link>."
},
"gateway": {
"heading": "Secure Gateway",
"cardAlt": "Карточка Secure Gateway с кнопкой «Развернуть Secure Gateway» до развёртывания первого шлюза",
"cardCaption": "Карточка Secure Gateway в новой установке — одна кнопка запускает мастер настройки.",
"intro": "Получайте доступ к панели мониторинга, веб-интерфейсу Proxmox и любой гостевой системе из любой точки вашей сети tailnet <a>Tailscale</a>, не открывая ни одного порта для доступа из общедоступного интернета. Monitor развёртывает на хосте контейнер Alpine LXC, в котором <code>tailscaled</code> работает как маршрутизатор подсети; после одобрения в консоли администратора Tailscale ваши удалённые устройства смогут обращаться к локальному IP-адресу хоста из любой точки.",
"wizardTitle": "Пошаговый мастер настройки",
"wizardIntro": "Прежде чем нажать <em>Развернуть Secure Gateway</em>, создайте ключ аутентификации в консоли администратора Tailscale — мастер запросит его на шаге 2.",
"step0Title": "0. Создайте ключ аутентификации Tailscale",
"step0Body": "Войдите в <a>login.tailscale.com/admin/settings/keys</a> и нажмите <em>Создать ключ аутентификации…</em>. Выберите <em>предварительно авторизованный</em> ключ (чтобы шлюзу не требовался интерактивный вход в Tailscale) и скопируйте его значение — оно отображается только один раз.",
"step0Alt": "Страница «Настройки → Ключи» консоли администратора Tailscale с выделенной кнопкой «Создать ключ аутентификации»",
"step0Caption": "Консоль администратора Tailscale — <em>Settings → Keys → Generate auth key…</em>. Если у вас ещё нет учётной записи Tailscale, создайте бесплатную учётную запись (ссылка есть в мастере).",
"step1Title": "1. Откройте мастер настройки",
"step1Body": "Вернитесь на вкладку «Безопасность» и нажмите <em>Развернуть Secure Gateway</em>. Первый шаг — вводная информация о возможностях шлюза и о том, что потребуется для настройки.",
"step1Alt": "Вводный шаг мастера настройки Secure Gateway с описанием возможностей шлюза: доступ по VPN, отсутствие необходимости в перенаправлении портов, сквозное шифрование",
"step1Caption": "Шаг 1 — обзор возможностей Secure Gateway и напоминание о том, что вам понадобится бесплатная учётная запись Tailscale.",
"step2Title": "2. Аутентификация Tailscale",
"step2Body": "Вставьте ключ аутентификации из шага 0 и выберите имя хоста (под этим именем шлюз будет отображаться в консоли администратора Tailscale — обычно это <code>proxmox-gateway</code> или имя вашего узла).",
"step2Alt": "Шаг мастера настройки Secure Gateway с полями для ключа аутентификации Tailscale и имени хоста устройства, а также ссылкой для создания ключа",
"step2Caption": "Шаг 2 — вставьте ключ предварительной аутентификации и выберите имя хоста устройства. Ссылка под полем открывает страницу Tailscale из шага 0, если вы его пропустили.",
"step3Title": "3. Область доступа",
"step3Intro": "Выберите, к каким ресурсам ваша сеть tailnet сможет получать доступ через шлюз:",
"step3Items": [
"<strong>Только Proxmox</strong> — только интерфейс Proxmox и Monitor. Минимальная поверхность атаки.",
"<strong>Вся локальная сеть</strong> — вся подсеть LAN (определяется автоматически по основному сетевому интерфейсу хоста). Обеспечивает доступ к NAS, принтерам, виртуальным машинам и любым другим устройствам в локальной сети.",
"<strong>Выбранные подсети</strong> — укажите конкретные подсети в формате CIDR. Для конфигураций с несколькими VLAN, в которых нужно открыть доступ к одним сегментам, но не к другим."
],
"step3Alt": "Шаг «Область доступа» мастера Secure Gateway с тремя вариантами: «Только Proxmox», «Вся локальная сеть», «Выбранные подсети»",
"step3Caption": "Шаг 3 — выберите область доступа. При выборе варианта <em>Вся локальная сеть</em> автоматически подставляется обнаруженная подсеть LAN.",
"step4Title": "4. Дополнительные параметры (необязательно)",
"step4Intro": "Два необязательных переключателя. Оба <strong>по умолчанию выключены</strong>:",
"step4Items": [
"<strong>Выходной узел</strong> — если этот параметр включён и узел выбран на удалённом устройстве, весь интернет-трафик этого устройства выходит в интернет через WAN-интерфейс хоста Proxmox. Полезно в поездках, когда нужно, чтобы трафик телефона выглядел так, будто он идёт из домашней сети.",
"<strong>Принимать маршруты</strong> — разрешить этому шлюзу доступ к сетям, маршруты к которым объявляют <em>другие</em> маршрутизаторы подсетей в tailnet (для конфигураций с несколькими площадками)."
],
"step4Alt": "Шаг «Дополнительные параметры» мастера Secure Gateway с флажками «Выходной узел» и «Принимать маршруты»",
"step4Caption": "Шаг 4 — «Выходной узел» и «Принимать маршруты». Не включайте ни один из этих параметров, если вам нужен только доступ к панели управления с телефона или ноутбука.",
"step5Title": "5. Проверка и развёртывание",
"step5Body": "Итоговая сводка перед началом развёртывания. Мастер напоминает, что после развёртывания в консоли администрирования Tailscale останется выполнить один шаг вручную: <strong>одобрить маршрут к подсети</strong>.",
"step5Alt": "Шаг «Проверка и развёртывание» мастера Secure Gateway со сводкой конфигурации, в которой указаны имя хоста, режим доступа, сети, параметры выходного узла и приёма маршрутов, а также с кнопкой «Развернуть шлюз»",
"step5Caption": "Шаг 5 — проверьте конфигурацию и запустите развёртывание. Синее уведомление внизу указывает, что маршрут ещё нужно одобрить.",
"approvalTitle": "Последний шаг вручную в консоли администрирования Tailscale",
"approvalBody": "После развёртывания вернитесь на страницу <a>login.tailscale.com/admin/machines</a> и одобрите маршрут к подсети, объявляемый шлюзом. Пока вы этого не сделаете, удалённые устройства в вашей сети tailnet не смогут получать доступ к IP-адресам локальной сети через шлюз. Tailscale отмечает маршруты, ожидающие одобрения, жёлтым предупреждением в строке устройства — нажмите <em>Изменить настройки маршрутов</em> и установите флажок нужного маршрута."
},
"pve": {
"heading": "Proxmox VE",
"intro": "Защита хоста: межсетевой экран, предотвращение вторжений и аудит безопасности. Карточки Fail2Ban и Lynis предлагают установить инструменты, если они отсутствуют, а после установки предоставляют элементы управления ими."
},
"firewall": {
"heading": "Межсетевой экран Proxmox",
"imageAlt": "Карточка межсетевого экрана Proxmox, показывающая состояние межсетевых экранов кластера и хоста, правила быстрого доступа для ProxMenux Monitor и веб-интерфейса Proxmox, счётчики в обзоре правил и список правил межсетевого экрана с кнопкой «Добавить правило»",
"imageCaption": "Карточка Proxmox Firewall — переключатели включения и отключения на уровне кластера и хоста, распространённые порты в разделе <em>Правила быстрого доступа</em>, сводные показатели в разделе <em>Обзор правил</em> и полный список правил с кнопкой <em>+ Добавить правило</em>.",
"intro": "Карточка управляет конфигурацией межсетевого экрана Proxmox VE. Классический бэкенд использует <code>iptables</code>, альтернативный — <code>nftables</code>. Карточка не управляет произвольными правилами, созданными вне Proxmox. Три блока:",
"items": [
"<strong>Межсетевой экран кластера + межсетевой экран хоста</strong> — глобальные переключатели. Чтобы любое правило уровня хоста действовало, межсетевой экран кластера должен быть активен; карточка указывает на эту зависимость непосредственно рядом с переключателями.",
"<strong>Правила быстрого доступа</strong> — предопределённые строки для портов, важных для самого ProxMenux: <code>8008/TCP</code> (Monitor), <code>8006/TCP</code> (веб-интерфейс Proxmox). Каждая строка показывает текущее состояние: доступ разрешён, запрещён или защита отсутствует. Доступ к веб-интерфейсу Proxmox разрешён с помощью <em>встроенного</em> макроса межсетевого экрана Proxmox, и это разрешение нельзя случайно удалить.",
"<strong>Обзор правил</strong> — счётчики общего числа правил, разрешающих правил, правил отбрасывания или отклонения трафика и уникальных защищённых портов. Данные считываются из <code>/etc/pve/firewall/cluster.fw</code> и <code>/etc/pve/nodes/&lt;node&gt;/host.fw</code>.",
"<strong>Правила межсетевого экрана</strong> — полный список с указанием действия, протокола, порта, источника и уровня. Кнопка <em>+ Добавить правило</em> открывает встроенный редактор; значок корзины в каждой строке удаляет правило. Изменения записываются в те же файлы, которые использует Proxmox, поэтому они также отображаются в интерфейсе Proxmox (Datacenter / Node → Firewall)."
]
},
"fail2ban": {
"heading": "Fail2Ban",
"subHeading": "(при наличии устройств)",
"whatIs": "<strong>Что это такое.</strong> Fail2Ban — демон предотвращения вторжений с открытым исходным кодом, который отслеживает повторяющиеся неудачные попытки входа в файлах журналов и блокирует IP-адрес нарушителя на уровне межсетевого экрана. Это общепринятое средство защиты от сканеров, которые круглосуточно пытаются подобрать пароли к SSH и веб-формам входа. По умолчанию ProxMenux настраивает три профиля защиты (jail): SSH, вход в веб-интерфейс Proxmox (порт 8006) и вход в ProxMenux Monitor (порт 8008).",
"notBundled": "Fail2Ban <strong>не входит в комплект поставки</strong>. Карточка определяет, установлен ли он, и адаптируется: если он отсутствует, предлагает установку одним нажатием; после установки показывает актуальное состояние профилей защиты (jail), заблокированные IP-адреса и позволяет настраивать число попыток и длительность блокировки для каждого профиля.",
"notInstalledAlt": "Карточка Fail2Ban в состоянии «Не установлен» с описанием будущей настройки: защита SSH, веб-интерфейса Proxmox и ProxMenux Monitor с бэкендом nftables, а также кнопка «Установить и настроить Fail2Ban»",
"notInstalledCaption": "Карточка Fail2Ban до установки — синий блок показывает, что будет настроено при установке.",
"clickBody": "Нажмите <em>Установить и настроить Fail2Ban</em> — откроется диалог подтверждения со списком всех изменений, которые скрипт внесёт на хосте:",
"confirmAlt": "Модальное окно подтверждения установки Fail2Ban со списком настроек: агрессивный режим защиты SSH, защита веб-интерфейса Proxmox на порту 8006, защита ProxMenux Monitor на порту 8008, автоматически обнаруженный бэкенд nftables, настройка уровня журналирования journald и усиление безопасности SSH путём настройки MaxAuthTries",
"confirmCaption": "Подтверждение установки — явный список профилей защиты (jail), изменения уровня журналирования journald (чтобы профиль защиты аутентификации мог считывать события SSH) и побочный эффект в виде усиления безопасности SSH (<code>MaxAuthTries=3</code>).",
"confirmIntro": "После подтверждения открывается панель установки с выводом в реальном времени (apt + настройка профилей защиты + тесты). Используется тот же механизм, что и в установщике CLI ProxMenux.",
"progressAlt": "Панель установки Fail2Ban с журналом установки в реальном времени: установка пакета, настройка journald MaxLevelStore для журналирования аутентификации, настройка правил jail, обнаружение бэкенда nftables, усиление безопасности путём настройки MaxAuthTries, проверка связи с fail2ban-client, сообщение о завершении",
"progressCaption": "Установка выполняется — каждый шаг записывается в журнал на панели. Сообщение о закрытии соединения внизу означает завершение сеанса потокового вывода.",
"afterInstall": "После установки карточка переключается на отображение текущего состояния: настроенные профили защиты, счётчик заблокированных IP-адресов, недавние события блокировки. Крупные вкладки разделяют <em>Профили защиты и заблокированные IP-адреса</em> и <em>Последние события</em> (последние N записей из журнала Fail2Ban).",
"activeAlt": "Карточка Fail2Ban после установки со статусом «Активен», тремя настроенными профилями защиты (proxmenux, proxmox, sshd), счётчиками заблокированных IP-адресов, общего числа блокировок и неудачных попыток, а также строками для каждого профиля с числом попыток, длительностью блокировки, временным окном и значком шестерёнки",
"activeCaption": "Fail2Ban активен — три профиля защиты по умолчанию (<code>proxmenux</code>, <code>proxmox</code>, <code>sshd</code>) с настройками числа попыток, длительности блокировки и временного окна.",
"tuneBody": "<strong>Настройка правил профиля защиты.</strong> Нажмите значок шестерёнки в строке любого профиля, чтобы настроить <em>максимальное число попыток</em>, <em>длительность блокировки</em> (используйте бессрочную блокировку, если хотите блокировать нарушителей до ручной разблокировки) и <em>период учёта попыток</em> (скользящее временное окно для подсчёта попыток). Типичные значения приведены в самой форме.",
"configAlt": "Форма настройки jail sshd с полями «Максимальное число повторных попыток», «Время блокировки» в секундах и параметром «Постоянная блокировка», полем «Интервал обнаружения», напоминанием о типичных значениях и кнопкой «Сохранить конфигурацию»",
"configCaption": "Редактирование jail sshd — задайте более строгое значение <em>максимального числа повторных попыток</em> для SSH, если вы всегда входите только из собственной подсети, или увеличьте <em>время блокировки</em> для панели управления, доступной из интернета.",
"outro": "Полное руководство <em>«Что устанавливается / как настраивается / как удалить»</em>, включая способ ручной установки, побочный эффект SSH MaxAuthTries и связь с журналом <code>proxmenux-auth.log</code>, приведено в <link>ProxMenux → Security → Fail2Ban</link>.",
"calloutTitle": "Без Fail2Ban этот механизм не блокирует IP-адреса",
"calloutBody": "ProxMenux Monitor проверяет IP-адреса, заблокированные в jail <code>proxmenux</code> системы Fail2Ban, на <em>уровне приложения</em> перед обработкой запросов Flask, кэшируя результат на 30 секунд. Без Fail2Ban неудачные попытки входа записываются в <code>proxmenux-auth.log</code>, а для конечной точки входа действует ограничение в 5 попыток с одного IP-адреса за каждые 5 минут, но IP-адреса не блокируются."
},
"lynis": {
"heading": "Аудит безопасности Lynis Audit",
"subHeading": "(при наличии устройств)",
"whatIs": "<strong>Что это.</strong> Lynis — инструмент аудита безопасности с открытым исходным кодом, который выполняет около 280 проверок хоста (права доступа к файлам, усиление защиты ядра, конфигурация SSH, уязвимости пакетов, криптографическая политика, запланированные задачи, сбор баннеров служб и т. д.) и формирует оценку защищённости от 0 до 100, список предупреждений и список рекомендаций. Это фактический стандарт базовой проверки состояния безопасности серверов на базе Debian.",
"whyUseful": "<strong>Чем полезен.</strong> Оценить защищённость сервера, читая конфигурационные файлы один за другим, непросто. Lynis обнаруживает то, что часто упускают из виду: отсутствующие флаги усиления защиты ядра, включённые слабые шифры SSH, отсутствие постоянного хранения журнала, параметр <code>NOPASSWD</code> в sudoers для стандартных учётных записей и многое другое. Повторный запуск после применения настроек ProxMenux, рекомендуемых после установки, позволяет получить объективную числовую оценку улучшений.",
"notInstalledAlt": "Карточка аудита безопасности Lynis Audit со статусом «Не установлен» и кнопкой «Установить Lynis», с перечнем возможностей: оценка защищённости, обнаружение уязвимостей, проверка соответствия требованиям и источник GitHub",
"notInstalledCaption": "Карточка Lynis до установки — в синем блоке кратко описаны функции инструмента.",
"notBundled": "Lynis также <strong>не входит в комплект</strong>. ProxMenux устанавливает его непосредственно из официального источника GitHub, а не из пакета Debian.",
"confirmAlt": "Модальное окно подтверждения установки Lynis с перечнем его возможностей: оценка защищённости, обнаружение уязвимостей, анализ конфигурации, проверка соответствия требованиям; источник — официальный репозиторий GitHub",
"confirmCaption": "Подтверждение установки — источник GitHub указан явно.",
"progressAlt": "Панель установки Lynis с выводом в реальном времени: установка последней версии инструмента сканирования, подтверждение версии 3.1.6, сообщение о завершении установки",
"progressCaption": "Установка выполняется — используется такая же панель вывода в реальном времени, как для Fail2Ban.",
"afterInstall": "После установки в карточке отображаются версия и пустая история аудита. Нажмите <em>«Запустить аудит безопасности Audit»</em>, чтобы начать первое сканирование.",
"installedAlt": "Карточка аудита безопасности Lynis Audit после установки с отметкой «Версия 3.1.6 установлена», временем последнего сканирования, индексом защищённости 0, количеством предупреждений 0 и рекомендаций 0, пустой строкой отчёта об аудите и кнопкой «Запустить аудит безопасности Audit»",
"installedCaption": "Lynis установлен, аудит ещё не выполнялся. В блоках показателей карточки изначально указаны нули.",
"runningAlt": "Карточка аудита безопасности Lynis Audit во время аудита с сообщением «Выполняется аудит безопасности», ожидаемой длительностью 2–5 минут и неактивной кнопкой «Выполняется Audit»",
"runningCaption": "Выполняется Audit — на кнопке действия отображается индикатор загрузки, а в карточке явно указано предупреждение о том, что сканирование может занять 2–5 минут.",
"finishedBody": "По завершении карточка переключается на отображение результатов: индекса защищённости, предупреждений, рекомендаций и списка <em>«Отчёты Audit»</em> со всеми предыдущими сканированиями.",
"resultsAlt": "Карточка аудита безопасности Lynis Audit с результатами: индекс защищённости 71 с детализацией Lynis 66 PVE 71, 3 предупреждения, 40 рекомендаций, шкала оценки защищённости со значением 71 из 100 с поправкой для Proxmox в диапазоне «Хорошо», список отчётов об аудите с возможностью скачивания PDF и кнопка «Запустить аудит безопасности Audit»",
"resultsCaption": "Результаты Audit — индекс защищённости <strong>71/100 (хорошо)</strong> в примере проверки. Карточка показывает исходную оценку Lynis (66) и оценку с поправкой на Proxmox (71). Поправка зависит от исходной оценки и доли выявленных замечаний, признанных ожидаемыми для Proxmox VE; это не фиксированная прибавка в 11 баллов.",
"scoreTitle": "Исходная оценка Lynis и оценка с поправкой для Proxmox",
"scoreIntro": "Lynis поставляется с правилами, рассчитанными на Debian общего назначения. Proxmox обоснованно отступает от некоторых из них (службы, работающие от имени root для нужд кластера, особые настройки <code>journald</code> и т. д.). Карточка показывает обе оценки, чтобы вы могли:",
"scoreItems": [
"Отслеживать <em>исходную оценку Lynis</em> так же, как это делают внешние аудиторы.",
"Отслеживать оценку <em>с поправкой на Proxmox</em> — более объективный ориентир при сравнении узлов внутри одного кластера."
],
"reportBody": "<strong>Полный отчёт.</strong> В каждой строке аудита в списке есть кнопка <em>PDF</em> для скачивания многостраничного отчёта с кратким резюме, сведениями о системе, оценкой состояния безопасности, всеми предупреждениями с пояснениями, всеми рекомендациями, упорядоченными по степени влияния, и перечнем пакетов. Такой документ можно приложить к материалам проверки безопасности.",
"reportAlt": "Пример первой страницы PDF-отчёта Lynis Security Audit: краткое резюме с оценкой защищённости 71 из 100, количество предупреждений и рекомендаций, блок сведений о системе с именем хоста, ядром, версией Lynis и датой отчёта, обзор состояния безопасности",
"reportCaption": "Первая страница скачанного отчёта — краткое резюме, сведения о системе и обзор состояния безопасности. Далее в полном отчёте приведены подробные предупреждения, рекомендации и список установленных пакетов. Для ознакомления приложен <a>пример PDF-отчёта</a>.",
"runPeriodically": "Проводите аудит периодически (после крупных обновлений Proxmox, после внесения настроек по завершении установки, перед открытием удалённого доступа) и сохраняйте отчёты — динамика важнее любого отдельного показателя.",
"outro": "Полное пошаговое руководство <em>«Что устанавливается / как настроено / как удалить»</em> и текстовый разбор примера отчёта доступны в <link>ProxMenux → Security → Lynis</link>."
},
"dataCollected": {
"heading": "Как собираются данные",
"headerCard": "Карточка",
"headerEndpoint": "Конечная точка",
"headerSource": "Источник",
"rows": [
{
"card": "Аутентификация, 2FA, смена пароля",
"endpoint": "/api/auth/*",
"source": "Локальная конфигурация аутентификации в ~/.config/proxmenux-monitor/auth.json; JWT, выдаваемые Monitor."
},
{
"card": "SSL / HTTPS",
"endpoint": "/api/ssl/*",
"source": "<code>openssl x509</code> на <code>/etc/pve/local/pve-ssl.pem</code> + <code>/etc/proxmenux/ssl_config.json</code>."
},
{
"card": "Токены API: просмотр списка / выпуск / отзыв",
"endpoint": "/api/auth/api-tokens",
"source": "Записи токенов хранятся локально; никакие данные не покидают хост."
},
{
"card": "Secure Gateway (развёртывание и состояние)",
"endpoint": "/api/oci/*",
"source": "Развёртывает Alpine LXC + <code>tailscaled</code> через <code>pct create</code> / <code>pct exec</code>."
},
{
"card": "Состояние и правила межсетевого экрана",
"endpoint": "/api/security/firewall/*",
"source": "<code>pve-firewall</code> + <code>/etc/pve/firewall/&lt;cluster|host&gt;.fw</code>."
},
{
"card": "Fail2Ban (только если установлен)",
"endpoint": "/api/security/fail2ban/*",
"source": "<code>fail2ban-client status</code>, <code>/var/log/fail2ban.log</code>, <code>/etc/fail2ban/jail.local</code>."
},
{
"card": "Аудит Lynis (только если установлен)",
"endpoint": "/api/security/lynis/*",
"source": "Запускает <code>lynis audit system</code> в фоновом режиме; отчёт считывается и разбирается из <code>/var/log/lynis-report.dat</code>."
}
]
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Доступ и аутентификация",
"href": "/docs/monitor/access-auth",
"tail": " — полный процесс первого запуска, выбор приложения для 2FA, восстановление доступа при утрате аутентификатора, фрагменты конфигурации обратного прокси."
},
{
"label": "Интеграции",
"href": "/docs/monitor/integrations",
"tail": " — практические руководства по использованию токенов API с Homepage, Home Assistant, Prometheus, n8n и по работе с Secure Gateway от начала до конца."
},
{
"label": "Справочник API",
"href": "/docs/monitor/api",
"tailRich": " — все конечные точки <code>/api/auth</code>, <code>/api/security</code> и <code>/api/oci</code> с указанием метода, тела запроса и примерами curl."
},
{
"label": "ProxMenux → Безопасность → Fail2Ban",
"href": "/docs/security/fail2ban",
"tail": " — пошаговая инструкция по установке, настроенные наборы правил (jails), способ ручной установки."
},
{
"label": "ProxMenux → Безопасность → Lynis",
"href": "/docs/security/lynis",
"tail": " — пример отчёта, интерпретация оценки, когда следует запускать повторно."
}
]
}
}
@@ -0,0 +1,367 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель управления: вкладка «Настройки» | Документация ProxMenux",
"description": "На вкладке «Настройки» можно выбрать язык Monitor, настроить порядок навигации, параметры панели управления, пороговые значения и исключения для мониторинга состояния, уведомления и ИИ, а также просмотреть перечень оптимизаций, выполненных после установки."
},
"header": {
"title": "Панель управления: вкладка «Настройки»",
"description": "Язык Monitor, порядок навигации, параметры панели управления, исключения из мониторинга, уведомления, настройка ИИ и актуальный перечень оптимизаций ProxMenux.",
"section": "ProxMenux Monitor · Панель управления"
},
"intro": {
"title": "Где находятся нужные настройки",
"body": "Вкладка «Настройки» объединяет несколько отдельных направлений: отображение панели управления, объекты наблюдения Health Monitor, отправку оповещений и изменения, которые ProxMenux уже внёс на хосте. Карточки, для которых есть отдельные страницы с подробной документацией, содержат ссылки на них, а не дублируют здесь их содержимое: «Настройки» — это отправная точка, а не руководство."
},
"interfaceLanguage": {
"heading": "Язык интерфейса",
"intro": "Выберите язык <strong>веб-интерфейса Monitor</strong>. Изменение немедленно применяется к текущему интерфейсу; оно не перезапускает службу и не меняет язык меню ProxMenux в командной оболочке.",
"items": [
"Сейчас ProxMenux Monitor поддерживает английский, немецкий, испанский, французский, итальянский, португальский, словацкий и шведский языки.",
"При первом посещении Monitor использует язык браузера, если он поддерживается; в противном случае используется английский.",
"При изменении выбранного языка обновляется язык страницы, а также синхронизируются другие открытые вкладки того же профиля браузера.",
"Если перевод для какого-либо ключа отсутствует, только соответствующий текст отображается на английском, а не в виде некорректного заполнителя."
],
"scopeTitle": "Локальная настройка браузера",
"scopeBody": "Выбранное значение сохраняется в <code>localStorage</code> под ключом <code>proxmenux-ui-language</code>. Поэтому оно относится только к этому профилю браузера и устройству, а не ко всему узлу. Каждый пользователь может выбрать свой язык Monitor."
},
"navigationOrder": {
"heading": "Порядок навигации",
"intro": "На этой карточке можно изменить порядок семи пунктов навигации верхнего уровня: <strong>Обзор, Приложения, ВМ и LXC, Узел, Резервное копирование, Терминал и Администрирование</strong>. Нажмите <strong>Изменить</strong>, перетащите строки и сохраните результат.",
"items": [
"Перетаскивание мышью начинается при нажатии кнопки. На сенсорном экране требуется короткое удержание в течение 250 мс, чтобы обычная прокрутка не воспринималась как изменение порядка.",
"Сгруппированные пункты <strong>Узел</strong> и <strong>Администрирование</strong> перемещаются целиком; их внутренние страницы сохраняют установленный порядок.",
"В мобильном меню используется тот же сохранённый порядок.",
"Кнопка <strong>Восстановить порядок по умолчанию</strong> сбрасывает порядок в редактируемом списке. Сохраните изменения, чтобы применить сброс.",
"Новая вкладка верхнего уровня, появившаяся в будущем выпуске, добавляется в конец существующего пользовательского списка, не сбрасывая настроенный пользователем порядок."
],
"landingTitle": "Первый пункт становится начальной вкладкой",
"landingBody": "После загрузки Monitor открывает первый сохранённый раздел. Если первым идёт <strong>Узел</strong>, начальной страницей будет «Хранилище»; если <strong>Администрирование</strong> — «Системные журналы». Порядок хранится только в этом браузере под ключом <code>proxmenux-nav-order</code>, поэтому на разных устройствах можно использовать разные рабочие процессы."
},
"networkUnits": {
"heading": "Единицы измерения сетевой скорости",
"imageAlt": "Карточка «Единицы измерения сетевой скорости», в раскрывающемся списке «Отображение сетевых единиц» выбрано значение «Байты»",
"imageCaption": "Выберите биты в секунду или байты в секунду для всех показателей сетевой скорости на панели мониторинга.",
"body": "Выберите способ отображения пропускной способности сети на всей панели мониторинга: <strong>биты в секунду</strong> (Mbps / Gbps) или <strong>байты в секунду</strong> (MB/s / GB/s). По умолчанию используются байты, как в большинстве инструментов передачи файлов; биты используются в характеристиках оборудования сетевых адаптеров и тарифов интернет-провайдеров. Выбор сохраняется в браузере, поэтому у каждого браузера своя настройка. Настройка влияет на все графики, индикаторы и всплывающие подсказки, показывающие сетевую скорость, и применяется сразу, без перезагрузки страницы."
},
"health": {
"heading": "Мониторинг состояния",
"intro": "Карточка содержит настройку <strong>«Длительность подавления»</strong> для каждой категории — время после отклонения оповещения, по истечении которого сканеру разрешено вызвать его повторно. Для каждой из десяти категорий Health Monitor (процессор, память, хранилище, диски, сеть, виртуальные машины, службы PVE, журналы, обновления, безопасность) предусмотрен отдельный раскрывающийся список со следующими значениями:",
"items": [
"<strong>24 ч</strong> — значение по умолчанию для большинства категорий временных событий.",
"<strong>72 ч</strong> — для событий, уведомления о которых нужно отключить на несколько дней.",
"<strong>168 ч</strong> (1 неделя) и <strong>720 ч</strong> (1 месяц) — для периодических проверок.",
"<strong>8760 ч</strong> (1 год) — фактически «без уведомлений в обозримом будущем».",
"<strong>-1</strong> — бессрочное подавление, пока вы не включите оповещение вручную.",
"<strong>Другое количество часов</strong> — любое целое число, если нужно промежуточное значение."
],
"imageAlt": "Карточка Settings → Health Monitor с раскрывающимися списками длительности подавления для каждой категории и разделом «Активные подавления»",
"imageCaption": "Карточка Health Monitor — раскрывающиеся списки для категорий задают значения по умолчанию для новых отклонений оповещений; раздел «Активные подавления» ниже содержит все оповещения, которые сейчас подавлены, и позволяет отменить их подавление.",
"editTitle": "Режим редактирования",
"editBody": "По умолчанию карточка доступна только для чтения. Нажмите <strong>«Редактировать»</strong> в правом верхнем углу карточки, чтобы активировать раскрывающиеся списки и кнопки «Включить снова». Кнопка <strong>«Сохранить»</strong> применяет все ожидающие изменения (изменения длительности подавления и запланированные повторные включения) одним пакетом; кнопка <strong>«Отмена»</strong> отменяет их все. Кнопка «Сохранить» становится активной, только если есть хотя бы одно ожидающее изменение.",
"activeTitle": "Активные подавления",
"activeIntro": "Под раскрывающимися списками длительности подавления находится раздел <strong>«Активные подавления»</strong> со всеми оповещениями, которые сейчас подавлены: как на ограниченное время (24 часа, 7 дней или заданный пользователем срок), так и <em>бессрочно</em>. В каждой строке показаны:",
"activeItems": [
"Цветной индикатор — <strong>«Бессрочно»</strong> (янтарный) или обратный отсчёт, например <strong>«Осталось 24 ч»</strong> / <strong>«Осталось 7 дн.»</strong> (синий).",
"Идентификатор оповещения, приведённый к удобочитаемому виду (например, <code>pve_storage_full_PBS-Cloud</code> → <em>PVE Хранилище заполнено: PBS-Cloud</em>).",
"Категория, уровень серьёзности, а также дата и время отклонения оповещения.",
"Кнопка <strong>«Включить снова»</strong> (активна только в режиме редактирования), которая добавляет отмену подтверждения оповещения в очередь для применения при следующем сохранении."
],
"activeReenableTitle": "Порядок повторного включения",
"activeReenableBody": "При нажатии <strong>«Включить снова»</strong> в режиме редактирования строка выделяется зелёным, а её идентификатор зачёркивается — изменение добавлено в очередь, но ещё не применено. Нажмите эту кнопку в той же строке ещё раз, чтобы <strong>отменить</strong> добавление в очередь. При нажатии <strong>«Сохранить»</strong> для всех запланированных повторных включений параллельно вызывается <code>POST /api/health/un-acknowledge</code>, а соответствующие строки исчезают из списка. Если исходная проблема сохраняется и категория поддерживает повторное срабатывание, оповещение снова появится в списке активных оповещений Health Monitor при следующем цикле сканирования.",
"activePermanentNote": "Постоянное скрытие оповещений (выбранное с помощью <em>Permanently</em> в модальном окне Health Monitor либо заданное по умолчанию для их категории значением <code>-1</code>) <strong>можно отменить только здесь</strong>. В модальном окне на панели мониторинга для таких оповещений нет кнопки отмены скрытия — панель активных подавлений служит единственным интерфейсом для просмотра журнала действий и отмены скрытия.",
"activeAutoRefreshTitle": "Автообновление",
"activeAutoRefreshBody": "Список обновляется автоматически, когда вы скрываете оповещение или отменяете его скрытие в модальном окне Health Monitor (через событие в браузере), когда вкладка браузера снова получает фокус и при изменении её видимости. После скрытия оповещения на панели мониторинга перезагружать страницу не нужно.",
"calloutTitle": "Подробное описание поведения — на странице Health Monitor",
"calloutBody": "Правила эскалации (когда повторное срабатывание становится критическим), автоматическое разрешение событий при исчезновении связанного с ними устройства, а также различие между скрытыми и разрешёнными оповещениями — всё это описано в разделе <link>Health Monitor → Dismissing alerts and the Suppression Duration</link> — о скрытии оповещений и длительности подавления. Эта карточка содержит только раскрывающиеся списки для отдельных категорий и панель активных подавлений."
},
"thresholds": {
"heading": "Пороговые значения Health Monitor",
"intro": "Предыдущая карточка задаёт, <em>как долго подавлять оповещения после скрытия</em>; эта — <strong>при каком значении создаётся оповещение</strong>. Для большинства проверок на основе порогов можно настроить значения уровней <strong>«Предупреждение»</strong> и <strong>«Критический»</strong>. В таблице ниже описаны исключения, например комбинированное правило для подкачки.",
"whatForTitle": "Для чего это нужно",
"whatForIntro": "Значения по умолчанию, поставляемые с ProxMenux, подходят для типичного хоста Proxmox, но у каждой среды свои рабочие пределы:",
"whatForItems": [
"В небольшой домашней лаборатории с единственным SSD может потребоваться более раннее оповещение о заполнении диска (75 / 90 %), чтобы оставалось место для снимков.",
"Пороговые значения памяти должны учитывать измеренные показатели памяти хоста и его рабочую нагрузку. Само по себе резервирование Ceph не оправдывает ослабление предупреждений о памяти, а большой объём памяти, занятый ARC ZFS, нельзя путать с рабочим набором, память которого невозможно высвободить.",
"Выбирайте пороговые значения температуры накопителя с учётом его спецификаций и наблюдаемых условий эксплуатации. Одно лишь различие между пассивным охлаждением и принудительным обдувом не определяет универсальный безопасный предел — более низкий или более высокий.",
"На хосте с большим числом виртуальных машин, где сборки полностью загружают процессор, не следует отправлять уведомление при каждом кратковременном скачке загрузки до 80 %, но оповещения о длительной высокой нагрузке всё равно необходимы."
],
"whatForOutro": "Изменения поддерживаемых пороговых значений вступают в силу <strong>при следующем сканировании</strong>. Health Monitor считывает <code>/usr/local/share/proxmenux/health_thresholds.json</code> в каждом цикле без перезапуска. Эти значения используются некоторыми виджетами, в том числе виджетом температуры дисков; для некоторых индикаторов заполнения сохраняются отдельные пороги отображения.",
"coloursTitle": "Цвета состояний: как уровни «Предупреждение» и «Критический» отображаются на панели мониторинга",
"coloursIntro": "Виджеты, использующие настроенную пару порогов «Предупреждение» и «Критический», следуют приведённой ниже классификации из трёх состояний. Некоторые визуальные индикаторы, включая индикаторы заполнения хранилищ PVE, используют собственные пороги; не делайте вывод о наличии оповещения Health Monitor только по их цвету.",
"headerColour": "Цвет",
"headerRange": "Диапазон",
"headerMeaning": "Значение",
"colourRows": [
{
"colour": "Зелёный",
"range": "значение < порог предупреждения",
"meaning": "Нормальный рабочий диапазон. Оповещение не создаётся."
},
{
"colour": "Янтарный",
"range": "порог предупреждения ≤ значение < критический порог",
"meaning": "Состояние предупреждения. Health Monitor создаёт событие с уровнем серьёзности WARNING; при отправке уведомлений учитываются фильтры каналов и часы тишины."
},
{
"colour": "Красный",
"range": "значение ≥ критический порог",
"meaning": "Критическое состояние. Health Monitor создаёт событие CRITICAL, на которое не распространяется режим тихих часов. Настройки категорий и событий канала по-прежнему действуют; доставка также зависит от доступности канала."
}
],
"sectionsTitle": "Разделы и рекомендуемые значения по умолчанию",
"sectionsIntro": "Это значения, с которыми поставляется ProxMenux, — рекомендуемые исходные настройки. Они используются на новом хосте, пока вы их не измените. Разделы расположены сверху вниз в порядке <em>вычислительные ресурсы</em> → <em>температура</em> → <em>ёмкость хранилища</em>, поэтому при чтении сверху вниз вы переходите от текущих показателей (нагрузки) к накопленному состоянию (свободному месту).",
"headerSection": "Раздел",
"headerWarning": "Предупреждение",
"headerCritical": "Критическая проблема",
"headerGates": "Условие срабатывания",
"thresholdRows": [
{
"section": "Загрузка процессора",
"warning": "85 %",
"critical": "95 %",
"gates": "Оповещение о длительной нагрузке, если средняя загрузка процессора за интервал сканирования превышает порог."
},
{
"section": "Память",
"warning": "85 %",
"critical": "95 %",
"gates": "Нагрузка на оперативную память хоста."
},
{
"section": "Подкачка (только критический уровень)",
"warning": "—",
"critical": "80 %",
"gates": "Для события CRITICAL по подкачке необходимо одновременное выполнение двух условий: использование подкачки выше 80 % и доля доступной оперативной памяти ниже 15 %. Оба условия должны сохраняться в серии измерений детектора. Само по себе использование подкачки не приводит к срабатыванию этого правила."
},
{
"section": "Температура процессора",
"warning": "80 °C",
"critical": "90 °C",
"gates": "Показание температуры корпуса процессора / ядра из <code>lm-sensors</code>."
},
{
"section": "Температура диска — HDD",
"warning": "60 °C",
"critical": "65 °C",
"gates": "Температура HDD. По умолчанию порог предупреждения составляет 60 °C, а критический порог — 65 °C. Это стандартные настройки мониторинга, а не универсальное ограничение производителя. Проверьте характеристики конкретной модели диска."
},
{
"section": "Температура диска — SSD",
"warning": "70 °C",
"critical": "75 °C",
"gates": "SSD с интерфейсом SATA в формфакторах 2,5 дюйма или M.2. Для этого класса пороги мониторинга по умолчанию составляют 70/75 °C; фактические температурные ограничения зависят от модели накопителя."
},
{
"section": "Температура диска — NVMe",
"warning": "80 °C",
"critical": "85 °C",
"gates": "Температура NVMe. Для этого класса пороги мониторинга по умолчанию составляют 80/85 °C. Температура, при которой контроллер снижает производительность, зависит от модели и не всегда равна 85 °C."
},
{
"section": "Температура диска — SAS",
"warning": "55 °C",
"critical": "65 °C",
"gates": "Температура SAS. Для этого класса порог предупреждения составляет 55 °C, а критический порог — 65 °C. Это <em>пороги мониторинга по умолчанию</em>, а не доказательство неисправности охлаждения при 55 °C или универсальное предельное значение, установленное производителем."
},
{
"section": "Дисковое пространство — хост",
"warning": "85 %",
"critical": "95 %",
"gates": "Заполненность <code>/</code> и каждой точки монтирования хоста (<code>/var/lib/vz</code>, <code>/mnt/*</code>…)."
},
{
"section": "Дисковое пространство — rootfs LXC",
"warning": "85 %",
"critical": "95 %",
"gates": "Корневой диск каждого контейнера; заполненность оценивается относительно размера rootfs из PVE."
},
{
"section": "Точки монтирования LXC",
"warning": "85 %",
"critical": "95 %",
"gates": "Заполненность точек монтирования внутри запущенных CT (mp0, mp1, NFS, bind-монтирования). Без учёта rootfs."
},
{
"section": "Хранилища PVE",
"warning": "85 %",
"critical": "95 %",
"gates": "Только хранилища PVE типов LVM, LVM-thin, ZFS-pool, RBD, CephFS и PBS. Хранилища типов Directory, NFS и CIFS учитываются в строке дискового пространства хоста."
},
{
"section": "Пул ZFS",
"warning": "85 %",
"critical": "95 %",
"gates": "Пулы ZFS на уровне хоста — независимо от регистрации в PVE."
}
],
"defaultsTitle": "Значения по умолчанию, переопределения и сброс",
"defaultsBody": "Серверная часть предоставляет объединённый набор настроек: каждый раздел изначально использует значения по умолчанию из ProxMenux (значения, отображаемые на новом хосте), а вы переопределяете только нужные параметры. Карточка показывает <em>действующее</em> значение — заданное вами переопределение, если оно есть, иначе значение по умолчанию. Кнопка <strong>Сброс</strong> удаляет все переопределения и восстанавливает значения по умолчанию сразу во всех разделах.",
"validationTitle": "Проверка значений",
"validationBody": "При сохранении значения проверяются на соответствие допустимому диапазону каждого поля; критический порог ниже порога предупреждения не допускается. Интерфейс показывает ошибки проверки, а серверная часть повторно проверяет запросы API перед сохранением изменений."
},
"lxcDetection": {
"heading": "Обнаружение обновлений LXC",
"imageAlt": "Карточка обнаружения обновлений LXC с одним переключателем: когда он включён, Monitor периодически проверяет запущенные контейнеры LXC с Debian/Ubuntu/Alpine на наличие доступных обновлений пакетов.",
"imageCaption": "Переключатель периодической проверки <code>apt list --upgradable</code> / <code>apk list -u</code> во всех запущенных CT. По умолчанию включён. Соответствующий переключатель уведомлений в Notifications → Services отображается только при включённом обнаружении обновлений.",
"intro": "Отдельный переключатель проверки обновлений LXC, расположенный между карточками порогов мониторинга состояния и уведомлений. Когда он включён, ProxMenux обходит все запущенные CT на хосте и запрашивает у менеджера пакетов внутри каждого контейнера сведения о доступных обновлениях; результаты отображаются в счётчиках на вкладке «VMs & LXCs» и используются для уведомления <code>lxc_updates_available</code>. Когда он выключен, проверка полностью прекращается (вызовы <code>pct exec</code> не выполняются), а все существующие записи LXC в <code>managed_installs.json</code> немедленно удаляются, поэтому панель мониторинга и конечная точка <code>/api/managed-installs</code> перестают сообщать о состоянии обновлений LXC, не дожидаясь следующего 24-часового цикла.",
"whatRunsTitle": "Что именно запускается при проверке",
"whatRunsIntro": "Для каждого CT в состоянии <code>running</code> с поддерживаемым менеджером пакетов:",
"whatRunsItems": [
"<strong>Актуальность метаданных.</strong> Если кеш метаданных apt/apk внутри контейнера старше <strong>24 часов</strong>, сначала выполняется попытка обновления (<code>apt-get update -qq</code> в Debian/Ubuntu, <code>apk update</code> в Alpine) с тайм-аутом 60 с. Если обновление не удалось, для формирования списка всё равно используется имеющийся кеш, поэтому результаты могут быть устаревшими.",
"<strong>Получение списка.</strong> Затем ProxMenux выполняет <code>apt list --upgradable</code> / <code>apk list -u</code> и разбирает вывод, формируя структурированные данные с количеством пакетов и выборкой первых названий пакетов.",
"<strong>Устранение повторных уведомлений для каждого CT.</strong> Сохраняется отпечаток, сформированный из общего количества обновлений, количества обновлений безопасности и отсортированных первых названий пакетов. Благодаря этому неизменный набор ожидающих обновлений не вызывает повторных ежедневных уведомлений, а существенно изменившийся — вызывает."
],
"selfUpdateTitle": "Для CT, которые обновляются самостоятельно вне apt, значение 0 может быть корректным",
"selfUpdateBody": "Обнаружение охватывает только менеджер пакетов внутри контейнера. Программное обеспечение, обновляемое вне apt, например настроенным заданием <code>plexupdate</code>, или образы Docker, загружаемые с помощью <code>docker pull</code>, в этот подсчёт не входит. Отсутствие обновлений apt не доказывает, что все приложения обновлены. При этом сканирование по-прежнему может обнаруживать обновления пакетов базовой системы того же CT.",
"refreshTitle": "Зачем нужно автоматическое обновление метаданных через 24 часа",
"refreshBody": "В давно работающих CT метаданные apt могут устареть, если никто не выполняет <code>apt update</code>. Тогда <code>apt list --upgradable</code> может не обнаружить новые обновления. ProxMenux пытается обновить метаданные, если они старше 24 часов, и пропускает этот шаг, если кэш обновлялся недавно.",
"toggleTitle": "Условное отображение переключателя уведомлений",
"toggleBody": "Переключатель уведомлений <code>lxc_updates_available</code> для каждого канала в <strong>Notifications → Services</strong> отображается только при включённом обнаружении. Когда вы отключаете обнаружение, эта строка исчезает из списка категорий каждого канала, но её настройка сохраняется в базе данных. При повторном включении обнаружения переключатель возвращается в прежнее положение.",
"purgeTitle": "Что удаляется при отключении обнаружения",
"purgeBody": "Выключение переключателя немедленно удаляет все записи <code>type=lxc</code> из <code>/usr/local/share/proxmenux/managed_installs.json</code>. Счётчики обновлений LXC на вкладке виртуальных машин и контейнеров LXC сбрасываются при следующем обновлении панели мониторинга. Повторное включение переключателя заново заполняет реестр при следующем цикле обнаружения или раньше, если вручную запустить обновление через API."
},
"storageExclusions": {
"heading": "Исключения для удалённых хранилищ",
"imageAlt": "Карточка исключений для удалённых хранилищ со списком хранилищ PBS-Cloud, PBS и PBS2 и переключателями «Состояние» и «Оповещения» в каждой строке",
"imageCaption": "Переключатели <em>Состояние</em> и <em>Оповещения</em> для каждого хранилища. Хранилища, у которых отключены оба переключателя, перестают учитываться в мониторе состояния и вызывать уведомления, но по-прежнему отображаются на вкладке «Хранилища» с отметкой об исключении.",
"intro": "Отметьте хранилища под управлением Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / и т. д.) как исключённые из мониторинга. Для каждого хранилища доступны два независимых переключателя:",
"items": [
"<strong>Состояние</strong> — если отключён, хранилище больше не учитывается в категории «Хранилища» монитора состояния. Полезно для архивных томов, которые намеренно отключены большую часть времени, или удалённых целевых хранилищ резервных копий, включаемых только по расписанию.",
"<strong>Оповещения</strong> — если отключён, оповещения об этом хранилище больше не отправляются через настроенные каналы, даже если проверки состояния остаются включёнными. Полезно, если вы хотите видеть состояние на панели мониторинга, но не получать уведомления."
],
"outro": "Исключённые хранилища по-прежнему отображаются на <link>вкладке «Хранилища»</link> с фиолетовой меткой <em>исключено</em>, чтобы запись не исчезала незаметно из списка ресурсов. Состояние сохраняется в таблице <code>excluded_storages</code> базы данных SQLite."
},
"interfaceExclusions": {
"heading": "Исключения для сетевых интерфейсов",
"imageAlt": "Карточка исключений для сетевых интерфейсов со списком vmbr0, vmbr1, vmbr2, bond0 и eno1 и переключателями «Состояние» и «Оповещения» для каждого интерфейса",
"imageCaption": "Устроено так же, как исключения для хранилищ: переключатели <em>Состояние</em> и <em>Оповещения</em> для каждого интерфейса. В каждой строке показаны интерфейс, метка типа (мост / агрегированный / физический), IP-адрес и скорость соединения.",
"intro": "Устроено так же, как исключения для хранилищ, но для сетевых интерфейсов. Для каждого интерфейса можно отключить проверки состояния и/или уведомления. Типичные случаи использования:",
"items": [
"Резервный мост, который намеренно отключён.",
"Сетевой адаптер, который был физически удалён, но по-прежнему указан в <code>/etc/network/interfaces</code>.",
"Подынтерфейс VLAN, используемый только в периоды технического обслуживания.",
"Мост управления с известными повторяющимися изменениями состояния соединения во время технического обслуживания."
],
"outro": "Состояние сохраняется в таблице <code>excluded_interfaces</code> базы данных SQLite. На <link>вкладке «Сеть»</link> отображается такая же фиолетовая метка <em>исключено</em>, поэтому исключённые интерфейсы остаются видимыми."
},
"notifications": {
"heading": "Уведомления и ИИ",
"body1": "В этом разделе вкладки «Настройки» включаются уведомления ProxMenux Monitor и переформулирование текста с помощью ИИ. Нажатие <em>«Включить уведомления»</em> запускает фоновый поток отправки, регистрирует на хосте получателя вебхуков Proxmox VE, чтобы события от PVE поступали в тот же конвейер обработки, и раскрывает форму настройки каналов для подключения Telegram, Discord, электронной почты, Gotify и других каналов. Настройки переформулирования текста с помощью ИИ находятся в той же панели, в сворачиваемом разделе дополнительных настроек.",
"body2": "Обе функции включают множество компонентов и настроек: каналы, переключатели для отдельных событий, сообщения с расширенным форматированием, отображаемое имя, конвейер отправки (устранение дубликатов, интервал между отправками, объединение уведомлений, часы тишины), интеграцию вебхуков PVE, провайдеров ИИ и режимы запросов. Они подробно описаны на отдельных страницах, поэтому здесь это описание не повторяется:",
"items": [
"<notifLink>Уведомления</notifLink> — пошаговые инструкции по настройке каналов (Telegram, Discord, Gotify, электронная почта и пароли приложений Gmail / Microsoft, Pushover и Apprise для ntfy, Slack, Teams и других сервисов), категории событий, сообщения с расширенным форматированием, отображаемое имя, конвейер отправки, интеграция вебхуков PVE, история и API.",
"<aiLink>ИИ-помощник</aiLink> — провайдеры (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), выбор модели, режимы запросов (по умолчанию / пользовательский), язык ответов, уровни детализации для каждого канала и рекомендации ИИ."
]
},
"optimizations": {
"heading": "Оптимизации ProxMenux",
"intro": "Перечень оптимизаций после установки, зарегистрированных ProxMenux на хосте. Параметры из разделов <autoLink>«Автоматическая настройка после установки»</autoLink> и <customLink>«Настройка после установки с выбором параметров»</customLink> регистрируют своё применение в <code>/usr/local/share/proxmenux/installed_tools.json</code>. Для этой карточки Monitor считывает данные из этого реестра. Наличие записи не означает, что была выполнена новая проверка неизменности всех соответствующих настроек.",
"imageAlt": "Карточка оптимизаций ProxMenux с сеткой установленных инструментов; в каждой строке показаны зелёная точка, название инструмента и версия. Среди примеров: принудительное использование IPv4 для APT, настройка Bashrc, Fastfetch, защита SSD с помощью Log2ram, оптимизация настроек памяти, настройка постоянных сетевых интерфейсов, увеличение системных лимитов, отключение загрузки языковых файлов APT, генерация энтропии с помощью haveged со значком «Устаревший», настройка паники ядра, оптимизация Logrotate, оптимизация сети, удаление баннера подписки, проброс устройств VFIO IOMMU — всего 14 активных оптимизаций.",
"imageCaption": "В карточке перечислены все активные оптимизации: для каждой указаны название, версия и цветная точка, а в правом верхнем углу расположен оранжевый счётчик <em>14 активных</em>. Для инструментов, источник которых доступен, можно перейти по ссылке.",
"dotsTitle": "Что означают точки",
"dotsItems": [
"<green/> <strong>Зелёная точка</strong> — зарегистрированная оптимизация, не помеченная как устаревшая и без указания на доступное обновление. Нажмите строку, если исходный код доступен.",
"<amber/> <strong>Жёлтая точка и значок <em>«устаревшая»</em></strong> — зарегистрированная оптимизация, скрипт которой был переименован или заменён. Её сохранённый исходный код открывается в режиме просмотра устаревшего кода с жёлтым цветовым акцентом. Это не означает повторной проверки текущей конфигурации хоста."
],
"clickTitle": "Переход к исходному коду",
"clickBody": "При нажатии на инструмент открывается модальное окно с соответствующей ему функцией bash и именем скрипта (<code>auto_post_install.sh</code> или <code>customizable_post_install.sh</code>). Код актуальных инструментов извлекается из файлов на хосте; для устаревших инструментов может использоваться сохранённый исходный код. Подсветка синтаксиса и кнопка «Копировать» помогают изучить код. Не гарантируется, что это точная копия кода, выполненного во время установки.",
"detailAlt": "Модальное окно исходного кода инструмента принудительного использования IPv4 для APT: показана функция bash force_apt_ipv4 из customizable_post_install.sh версии 1.0 с подсветкой синтаксиса. Код настраивает /etc/apt/apt.conf.d/99-force-ipv4, задавая Acquire ForceIPv4 значение true, регистрирует инструмент и выводит через translate сообщение о завершении настройки IPv4 для APT.",
"detailCaption": "Модальное окно исходного кода <em>APT IPv4 Force</em> — точный код функции <code>force_apt_ipv4()</code> из <code>customizable_post_install.sh v1.0</code> с подсветкой синтаксиса и копированием одним нажатием.",
"whyTitle": "Почему это важно",
"whyBody": "ProxMenux может изменять параметры ядра, настройки репозиториев и сети, ротацию журналов и проброс GPU. Прежде чем вносить изменения вручную, просмотрите зарегистрированные оптимизации, особенно если хост настраивал другой администратор. Карточка показывает записи реестра и доступный исходный код; она не проверяет все действующие настройки и не сохраняет точную историю выполнения.",
"updatesTitle": "Баннер «Доступны обновления»",
"updatesBody": "Если версия послеустановочной оптимизации на диске новее версии, зарегистрированной на хосте, в верхней части карточки появляется баннер «Доступны обновления» с их количеством и кнопкой <strong>Применить</strong>. Нажатие <strong>Применить</strong> открывает окно выбора отдельных оптимизаций (то же окно доступно через пункт <em>Применить доступные обновления</em> в меню послеустановочной настройки). Выберите оптимизации для обновления; ProxMenux повторно выполнит соответствующую функцию и обновит версию в реестре. Когда все версии станут актуальными, баннер исчезнет.",
"updatesAlt": "Карточка оптимизаций ProxMenux с баннером «Доступны обновления» в верхней части — количество ожидающих обновлений и кнопка «Применить», открывающая окно выбора отдельных оптимизаций",
"updatesCaption": "Баннер отображается, только если хотя бы для одной оптимизации на диске есть более новая версия. Полный порядок обновления и соответствующий вариант Path-A в меню командной оболочки описаны в разделе <link>Применение доступных обновлений</link>.",
"revertTitle": "Отмена оптимизации",
"revertBody": "Чтобы отменить оптимизацию, воспользуйтесь соответствующим пунктом <link>Удаление оптимизаций</link> в меню ProxMenux Scripts. При удалении запись оптимизации удаляется из <code>installed_tools.json</code>, и после следующего обновления карточки она больше не отображается в списке."
},
"dataCollected": {
"heading": "Как собираются данные",
"headerCard": "Карточка",
"headerEndpoint": "Конечная точка",
"headerSource": "Источник",
"rows": [
{
"card": "Язык интерфейса",
"endpoint": "localStorage",
"source": "Настройка браузера <code>proxmenux-ui-language</code>; если сохранённого выбора нет, начальное значение определяется по языковым настройкам браузера."
},
{
"card": "Порядок навигации",
"endpoint": "localStorage",
"source": "Настройка браузера <code>proxmenux-nav-order</code>; она также определяет вкладку, открываемую при входе."
},
{
"card": "Единицы измерения сетевой скорости",
"endpoint": "localStorage",
"source": "Настройка браузера <code>proxmenux-network-unit</code>."
},
{
"card": "Периоды подавления уведомлений в Health Monitor",
"endpoint": "/api/health/settings",
"source": "Периоды подавления уведомлений по категориям в базе данных Health."
},
{
"card": "Исключения для хранилищ и интерфейсов",
"endpoint": "/api/health/storage-exclusions, /api/health/interface-exclusions",
"source": "Таблицы <code>excluded_storages</code> и <code>excluded_interfaces</code> в SQLite."
},
{
"card": "Уведомления и панель ИИ",
"endpoint": "/api/notifications/*",
"source": "См. отдельные страницы <notifLink>Уведомления</notifLink> / <aiLink>ИИ-помощник</aiLink>."
},
{
"card": "Список оптимизаций ProxMenux",
"endpoint": "/api/proxmenux/installed-tools",
"source": "Читает <code>/usr/local/share/proxmenux/installed_tools.json</code>, куда записываются данные при вызовах <code>register_tool</code> в послеустановочных скриптах."
},
{
"card": "Модальное окно исходного кода оптимизации",
"endpoint": "/api/proxmenux/tool-source",
"source": "Извлекает соответствующую функцию bash из <code>auto_post_install.sh</code> или <code>customizable_post_install.sh</code> на хосте; для устаревших инструментов может использоваться сохранённый исходный код."
}
]
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Вкладка «Приложения»",
"href": "/docs/monitor/dashboard/apps",
"tail": " — средство запуска, положение которого на верхнем уровне можно изменить с помощью настройки «Порядок навигации»."
},
{
"label": "Уведомления",
"href": "/docs/monitor/notifications",
"tail": " — каналы, переключатели для отдельных событий, переопределения настроек каналов, история, тестовая отправка."
},
{
"label": "ИИ-ассистент",
"href": "/docs/monitor/ai-assistant",
"tail": " — провайдеры, модели, режимы промптов, языки, уровни детализации для каждого канала."
},
{
"label": "Оповещения Health Monitor → Скрытие и длительность подавления",
"href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration",
"tail": " — принципы работы раскрывающихся списков для каждой категории, показанных выше."
},
{
"label": "Настройка ProxMenux Scripts → Автоматическая настройка после установки",
"href": "/docs/post-install/automated",
"tailRich": " и <customLink>Настраиваемая конфигурация после установки</customLink> — сами скрипты, которые регистрируют себя в приведённом выше списке оптимизаций."
},
{
"label": "Удалить оптимизации",
"href": "/docs/post-install/uninstall",
"tail": " — как отменить зарегистрированную выше оптимизацию."
},
{
"label": "Обзор панели мониторинга",
"href": "/docs/monitor/dashboard",
"tail": " — вернуться к обзору вкладки."
}
]
}
}
@@ -0,0 +1,268 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель мониторинга: вкладка «Хранилища» | Документация ProxMenux",
"description": "Вкладка «Хранилища» объединяет четыре представления: хранилища под управлением Proxmox и их состояние, пулы ZFS, внутренние физические диски с данными SMART и внешние накопители (USB). Подробное представление каждого диска содержит атрибуты SMART, данные об износе и сроке службы, а также постоянно сохраняемую историю наблюдений."
},
"header": {
"title": "Панель мониторинга: вкладка «Хранилище»",
"description": "Состояние хранилищ узла на одном экране — пулы Proxmox (NFS / CIFS / LVM / ZFS / dir), состояние пулов ZFS, внутренние диски SATA / NVMe с данными SMART и внешние USB-накопители. Нажмите на любой диск, чтобы открыть подробное представление с полной таблицей атрибутов SMART и историей наблюдений за этим диском.",
"section": "ProxMenux Monitor · Панель управления"
},
"intro": {
"title": "Данные из трёх источников",
"body": "Данные о хранилищах Proxmox поступают из <code>pvesm status</code>; состояние ZFS — из <code>zpool status</code>; данные о физических дисках — из <code>lsblk</code> + <code>smartctl</code> (а поля, специфичные для NVMe, — из <code>nvme</code>). Вкладка обновляется примерно каждые 30 секунд; подробное представление диска запускает новое считывание SMART по запросу."
},
"thresholds": {
"title": "Используемые здесь цвета состояний и пороговые значения",
"intro": "Health Monitor обозначает состояние <green/> <strong>зелёным</strong>, если значение ниже порога предупреждения, <amber/> <strong>жёлтым</strong> — от порога предупреждения до критического порога, и <red/> <strong>красным</strong> — при достижении критического порога и выше. Ниже приведены рекомендуемые значения по умолчанию. Отдельные индикаторы на панели мониторинга могут использовать другие пороги смены цвета, описанные ниже.",
"items": [
"<strong>Заполнение</strong> (диски узла, хранилища PVE, пулы ZFS, точки монтирования LXC) — порог предупреждения: 85 %, критический порог: 95 %.",
"<strong>Температура диска</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (порог предупреждения / критический порог)."
],
"outro": "Каждое значение можно настроить отдельно для каждого узла. <link>Settings → Health Monitor Thresholds</link> — единый авторитетный источник сведений с пояснениями по их настройке."
},
"topRow": {
"heading": "Верхний ряд: краткая сводка по хранилищам",
"intro": "При открытии вкладки «Хранилища» отображается сводка состояния хранилищ узла из четырёх карточек: общая ёмкость, занятое место в локальных хранилищах, занятое место в удалённых хранилищах и состав физических дисков. Каждая карточка даёт краткий ответ на типичный вопрос; карточки ниже этого ряда позволяют перейти к подробностям.",
"imageAlt": "Вкладка «Хранилища» — верхний ряд из четырёх карточек показателей: «Общая ёмкость», «Занято локально», «Занято удалённо», «Физические диски»",
"imageCaption": "Верхний ряд вкладки «Хранилища» — общая ёмкость и количество дисков, занятые байты с разделением на локальные и удалённые хранилища, а также распределение физических дисков по типам со сводкой их состояния.",
"headerCard": "Карточка",
"headerWhat": "Что показывает",
"totalLabel": "Общая ёмкость",
"totalWhat": "Суммарная необработанная ёмкость всех физических дисков. Нижняя строка показывает количество обнаруженных физических дисков.",
"localLabel": "Занято локально",
"localWhat": "Объём в байтах, занятый в локальных хранилищах (LVM / LVM-thin / ZFS / dir на собственных дисках узла). Занятый объём показан крупно, а нижняя строка <em>X.XX % от Y ТБ</em> позволяет одновременно видеть процент заполнения.",
"remoteLabel": "Занято удалённо",
"remoteWhat": "Тот же формат, что и у карточки «Занято локально», но для удалённых хранилищ (NFS / CIFS / PBS / Ceph / iSCSI). Учитываются отдельно, поскольку локальные и удалённые сбои затрагивают разные ресурсы, а планирование ёмкости и мониторинг этих ресурсов обычно выполняются по-разному.",
"disksLabel": "Физические диски",
"disksIntro": "Две строки со сводкой по дискам:",
"disksItems": [
"<strong>По типу</strong> — количество обнаруженных NVMe (фиолетовый), SSD (синий) и HDD (синий). Для узлов с дисками разных типов отображаются все три показателя; для узла только с NVMe — лишь количество NVMe.",
"<strong>По состоянию</strong> — количество дисков <em>в норме</em> (зелёный), <em>с предупреждениями</em> (жёлтый) и <em>в критическом состоянии</em> (красный). Если все диски исправны, обычно отображается только «В норме: X»; предупреждения и критические состояния появляются лишь при ухудшении состояния дисков."
]
},
"pveStorage": {
"heading": "Карточка хранилищ Proxmox",
"intro": "Отдельная строка для каждого хранилища, настроенного в <code>/etc/pve/storage.cfg</code>. В каждой строке отображаются метка типа (<code>nfs</code> / <code>cifs</code> / <code>zfspool</code> / <code>lvm</code> / <code>lvmthin</code> / <code>dir</code> / <code>pbs</code>), имя хранилища, метка состояния «активно» / «ошибка» / «не отслеживается», процент занятого пространства и цветная полоса заполнения:",
"items": [
"<strong>До 75 % включительно</strong> — синяя полоса заполнения и синее значение.",
"<strong>Свыше 75 % до 90 % включительно</strong> — жёлтая полоса заполнения и жёлтое значение. Эти пороги определяют только цвет отображения и не связаны с порогами монитора состояния.",
"<strong>> 90 %</strong> — красная полоса заполнения и красное значение; этот порог определяет только цвет отображения и не связан с повышением уровня серьёзности в мониторе состояния.",
"<strong>ошибка</strong> — вся строка обведена красной рамкой; используется, когда хранилище настроено, но недоступно (сервер NFS не работает, срок действия учётных данных CIFS истёк).",
"<strong>исключено</strong> — фиолетовая рамка и метка «не отслеживается». Хранилища, которые пользователь явно исключил из проверок состояния (удобно для томов, подключаемых вручную, или архивных томов, намеренно отключённых)."
],
"calloutTitle": "Исключение хранилища, вызывающего лишние оповещения",
"calloutBody": "В меню строки хранилища можно пометить его как <em>исключённое из мониторинга</em>. Этот флаг сохраняется в таблице <code>excluded_storages</code> и учитывается как на панели мониторинга, так и в цикле проверок монитора состояния: для исключённых хранилищ уведомления не отправляются, и они не увеличивают счётчик в индикаторе заголовка."
},
"zfs": {
"heading": "Карточка пулов ZFS",
"intro": "Отображается только при установленном ZFS и наличии хотя бы одного пула. Для каждого пула предусмотрена отдельная строка с меткой состояния, объёмом / занятым / свободным пространством и значком, отражающим состояние:",
"items": [
"<strong>ONLINE</strong> — зелёный. Всё исправно.",
"<strong>DEGRADED</strong> — жёлтый. Пул продолжает обслуживать запросы к данным, но как минимум одно устройство недоступно; пора планировать замену.",
"<strong>FAULTED</strong> / <strong>UNAVAIL</strong> / <strong>SUSPENDED</strong> — красный. Пул не обслуживает запросы к данным; требуется немедленное вмешательство."
],
"outro": "И состояние ZFS, и состояние SMART каждого диска учитываются в категории <em>«Диски и ввод-вывод»</em> <link>монитора состояния</link>."
},
"physical": {
"heading": "Физические диски и состояние SMART",
"intro": "Внутренние диски (SATA / NVMe). Каждая строка позволяет быстро просмотреть основные сведения:",
"items": [
"<strong>Путь к устройству</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
"<strong>Метка типа</strong> — SATA / NVMe (и соответствующий значок).",
"<strong>Системная метка</strong> — оранжевая метка для дисков, используемых узлом: дисков с системными точками монтирования (<code>/</code>, <code>/boot</code>, <code>/usr</code>, <code>/var</code>…), активным пространством подкачки, участников пулов ZFS, физических томов LVM, активных участников RAID или дисков с метками системных разделов. Отсутствие метки не означает, что диск можно безопасно стереть или использовать для других целей.",
"<strong>Модель</strong> — производитель и строка модели из <code>smartctl -i</code>.",
"<strong>Ёмкость</strong> — в удобном для чтения формате.",
"<strong>Температура</strong> — текущая температура в °C; цвет зависит от порогового значения для типа диска (NVMe нагревается сильнее SATA).",
"<strong>Статус SMART</strong> — проверка пройдена / не пройдена / статус неизвестен.",
"<strong>Индикатор наблюдений</strong> — если в постоянно хранящейся истории <code>disk_observations</code> есть записи для этого диска, появляется синий индикатор с их количеством (например, <em>3 набл.</em>). Нажмите на диск, чтобы открыть подробности и просмотреть эти записи.",
"<strong>Индикатор состояния</strong> — Исправен / Предупреждение / Критическое состояние; определяется по результатам проверки SMART и недавним наблюдениям."
],
"clickHint": "Нажатие в любом месте строки открывает подробные сведения о диске, описанные ниже.",
"warningTitle": "Не выполняйте действия с дисками с меткой «Системный» без веской причины",
"warningBody": "На дисках с оранжевой меткой <strong>Системный</strong> размещена работающая ОС. Панель показывает эту метку в качестве предостережения — разрушающие данные операции, запускаемые из <link>ProxMenux → Disk Manager → Format / Очистка</link>, явно отказываются работать с такими дисками. Если вам действительно нужно использовать загрузочный диск для другой цели, делайте это из среды восстановления, а не из работающей системы Proxmox."
},
"external": {
"heading": "Внешние накопители (USB)",
"body": "Отдельная карточка для накопителей, подключённых по USB, отображается только при наличии хотя бы одного такого накопителя. Содержит те же поля, что и для внутренних дисков, а также оранжевую метку <strong>USB</strong>. USB-накопители часто подключают и отключают (для автономных резервных копий или периодической выгрузки данных), поэтому монитор состояния обрабатывает их осторожно: наблюдения сохраняются, но ошибки ввода-вывода на отключённом USB-накопителе не повышают уровень серьёзности предупреждений."
},
"drillIn": {
"heading": "Модальное окно подробных сведений о диске",
"intro": "Нажатие на строку любого диска открывает модальное окно с четырьмя вкладками: <strong>Обзор</strong> · <strong>SMART</strong> · <strong>История</strong> · <strong>Расписание</strong>. В заголовке всегда отображаются путь к устройству, модель и ёмкость, а для системного диска — ещё и оранжевая метка <em>Системный</em>.",
"overviewTitle": "Вкладка 1 — Обзор",
"overviewImageAlt": "Модальное окно подробных сведений о диске — вкладка «Обзор» с состоянием диска, кольцевым индикатором износа и оставшегося ресурса, а также основными атрибутами SMART",
"overviewImageCaption": "Вкладка «Обзор» — сведения о диске, индикатор состояния, кольцевой индикатор оставшегося ресурса с текущим износом и объёмом записанных данных, а также краткий блок наиболее часто проверяемых атрибутов SMART.",
"overviewIntro": "Вкладка, открываемая по умолчанию: всё необходимое, чтобы ответить на вопрос «Всё ли в порядке с этим диском?» без запуска теста. Три блока:",
"overviewItems": [
"<strong>Сведения о диске</strong> — модель, серийный номер, ёмкость, индикатор состояния (Исправен / Предупреждение / Критическое состояние).",
"<strong>Износ и срок службы</strong> — крупный кольцевой индикатор оставшегося ресурса (97 %, 50 %, …) с полным названием исходного атрибута (<em>Индикатор износа носителя</em>, <em>Процент использованного ресурса</em>, …), шкала износа (текущий процент использованного ресурса), прогноз <em>Оставшийся срок службы</em> в годах и общий объём записанных данных. Для накопителей NVMe также отображается <em>Доступный резерв</em>.",
"<strong>Атрибуты SMART</strong> — основные поля в сетке из двух столбцов: температура, время работы (в удобном для чтения формате, например <em>3 г. 116 дн.</em>), скорость вращения (или <em>SSD</em>), число циклов включения, состояние SMART, переназначенные секторы, секторы, ожидающие переназначения, ошибки CRC. Полная таблица атрибутов находится на вкладке SMART."
],
"smartTitle": "Вкладка 2 — SMART",
"smartImageAlt": "Модальное окно подробных сведений о диске — вкладка SMART с кнопками запуска теста SMART (короткого / расширенного), результатом последнего теста и полной таблицей атрибутов SMART",
"smartImageCaption": "Вкладка SMART — запуск короткого или расширенного теста, просмотр результата последнего теста и полной прокручиваемой таблицы атрибутов SMART, а также создание полного отчёта о состоянии в формате PDF.",
"smartIntro": "Здесь доступны действия с диском. Три раздела:",
"smartItems": [
"<strong>Запуск теста SMART</strong> — две кнопки. <em>Короткий тест (~2 мин)</em> выполняется синхронно и показывает результат прямо в этом разделе. <em>Расширенный тест (в фоновом режиме)</em> на больших накопителях может занимать несколько часов; он выполняется на сервере, а по завершении отправляется уведомление.",
"<strong>Последний тест</strong> — тип, индикатор состояния (<em>пройден</em> / <em>не пройден</em>) и дата и время последнего запуска.",
"<strong>Атрибуты SMART</strong> — полная таблица атрибутов (ID / название / значение / наихудшее значение / состояние со значками «Норма» / «Предупреждение» / «Критическое состояние»). Для SATA / SAS — классический нумерованный список. Для NVMe — структурированные поля из <code>nvme smart-log</code> (температура, доступный резерв, процент износа, количество записанных / прочитанных единиц данных, операции чтения / записи хоста, время занятости контроллера, циклы включения питания, небезопасные выключения, ошибки носителя, записи журнала ошибок, время работы при достижении комплексной температурой предупреждающего / критического порога)."
],
"pdfTitle": "Просмотр полного отчёта SMART (PDF)",
"pdfIntro": "Внизу вкладки SMART кнопка <strong>Просмотр полного отчёта SMART</strong> открывает отчёт для печати. Используйте диалог печати браузера, чтобы сохранить его в формате PDF для архива или передать службе поддержки производителя для оформления RMA.",
"pdfPreviewAlt": "Первая страница сформированного PDF-отчёта о состоянии SMART — сводка с кольцевым индикатором «ПРОЙДЕНО» и блоком информации о диске",
"pdfPreviewCaption": "Первая страница отчёта о состоянии SMART — сводка с кольцевым индикатором «ПРОЙДЕНО» и полным блоком информации о диске. Полный PDF ниже содержит кольцевой индикатор износа SSD, все атрибуты SMART и историю тестов.",
"pdfDownloadLabel": "Скачать пример отчёта SMART (PDF)",
"pdfSectionsIntro": "Отчёт включает следующие основные разделы:",
"pdfSections": [
"<strong>Сводка</strong> — крупный итоговый статус «ПРОЙДЕНО» / «НЕ ПРОЙДЕНО», описание состояния диска простым языком («диск исправен / имеет признаки износа / выходит из строя») и четыре кратких показателя (дата и время отчёта, тип последнего теста, результат теста, количество проверенных атрибутов).",
"<strong>Информация о диске</strong> — модель, серийный номер, ёмкость, тип (HDD / SSD / NVMe), семейство, форм-фактор, интерфейс (SATA 3.3 · 6.0 Гбит/с, …), поддержка TRIM, текущая температура с указанием оптимального порога, время работы под питанием, циклы включения питания, состояние SMART, а также основные счётчики (нестабильные секторы, ошибки CRC, переназначенные секторы).",
"<strong>Износ и срок службы SSD</strong> (только SSD / NVMe) — кольцевой индикатор оставшегося ресурса, атрибут-источник, текущий уровень износа, объём записанных данных, часы работы под питанием.",
"<strong>Атрибуты SMART (полный список)</strong> — все атрибуты, о которых сообщает накопитель: ID, название, значение, наихудшее значение, порог, необработанное значение и индикатор состояния. Для наиболее важных для пользователя атрибутов (количество переназначенных секторов, время работы во включённом состоянии, зарегистрированные неисправимые ошибки, количество ошибок CRC UDMA, индикатор износа носителя, …) под строкой приводится краткое пояснение простым языком.",
"<strong>Результат последней самопроверки и полная история самопроверок</strong> — последний тест (тип, результат, сообщение о завершении, наработка в часах на момент теста) и нумерованная таблица всех сохранённых тестов.",
"<strong>Рекомендации</strong> — действия в зависимости от итоговой оценки: <em>Диск исправен / Запланируйте периодические тесты / Стратегия резервного копирования</em> для исправных накопителей; если значения атрибутов выходят за допустимые пределы, формулировки становятся более настоятельными и включают рекомендации по замене."
],
"pdfOutro": "Браузер формирует отчёт для печати; и «Печать», и «Сохранить как PDF» открывают диалог печати браузера. При сохранении выберите имя файла, например <code>SMART-&lt;short-id&gt;.pdf</code>. Сохраняйте снимки с датами, чтобы сравнивать изменения со временем или передавать их службе поддержки производителя.",
"historyTitle": "Вкладка 3 — История",
"historyImageAlt": "Модальное окно подробной информации о диске — вкладка «История» со списком прошлых тестов SMART и действиями скачивания и удаления",
"historyImageCaption": "Вкладка «История» — все сохранённые тесты SMART для этого диска. В каждой строке: тип, дата и время, метка «X дней назад», отметка последнего теста, действия скачивания (исходный вывод <code>smartctl</code>) и удаления.",
"historyIntro": "Сохранённые тесты SMART для этого диска — завершённые короткие и расширенные проверки. Каждая запись содержит исходный вывод <code>smartctl</code>, полученный во время выполнения теста, и структурированные поля, извлечённые Monitor для панели мониторинга. Действия для каждой строки:",
"historyItems": [
"<strong>Скачать</strong> — сохраняет снимок данных теста в формате JSON (вывод <code>smartctl -a --json</code> или <code>nvme smart-log</code> для NVMe, если smartctl завершается ошибкой). Полезно, когда службе поддержки производителя нужны исходные диагностические поля.",
"<strong>Удалить</strong> — удаляет тест из истории. Ограничение количества сохраняемых тестов, заданное на вкладке «Расписание» (<em>Последние 5 / 10 / 20</em>), автоматически удаляет самые старые тесты; это действие позволяет удалить тест вручную."
],
"scheduleTitle": "Вкладка 4 — Расписание",
"scheduleImageAlt": "Модальное окно подробной информации о диске — вкладка «Расписание» с переключателем «Автоматические тесты SMART», списком настроенных расписаний и кнопкой «Добавить расписание»",
"scheduleImageCaption": "Вкладка «Расписание» — выберите тип теста, периодичность и количество сохраняемых результатов; Monitor настроит запуск через <code>cron</code>, чтобы тесты выполнялись без участия пользователя.",
"scheduleIntro": "Автоматические тесты SMART по расписанию cron без использования командной оболочки. На странице три раздела:",
"scheduleItems": [
"<strong>Переключатель автоматических тестов SMART</strong> — общее включение и отключение всех расписаний для этого диска. Полезен, когда нужно приостановить все тесты на время обслуживания, не удаляя настройки расписаний.",
"<strong>Настроенные расписания</strong> — отдельная строка для каждого существующего расписания со значком типа теста (<em>короткий</em> / <em>длительный</em>), выражением cron в понятном виде (<em>«1-го числа каждого месяца в 03:00»</em>, <em>«Каждое воскресенье в 02:00»</em>), списком охватываемых дисков и настройкой хранения результатов.",
"<strong>Добавить расписание / Изменить расписание</strong> — форма с полями: тип теста (<em>Короткий ~2 мин</em> / <em>Длительный 1–4 ч</em>), периодичность (<em>Ежедневно / Еженедельно / Ежемесячно</em>), день месяца / день недели, время, хранить результаты (<em>Последние 5 / 10 / 20</em>)."
],
"scheduleOutro": "Расписание реализуется в виде записи cron на хосте, которая вызывает Monitor; результаты сохраняются в той же истории SMART, которая отображается на вкладке 3, а настройка хранения обеспечивает автоматическое удаление самого старого результата теста после завершения нового.",
"tempTitle": "Модальное окно истории температуры",
"tempIntro": "Monitor непрерывно считывает показания каждого диска с доступным датчиком температуры и сохраняет их в локальный временной ряд. Текущее значение отображается как один из шести основных атрибутов SMART на вкладке «Обзор»; нажатие на этот блок открывает отдельное модальное окно с полной историей температуры.",
"tempImageAlt": "Модальное окно истории температуры диска — заголовок с путём к диску и его моделью, выбор периода (1 час / 24 часа / 7 дней / 30 дней), ряд из четырёх карточек показателей (Текущая / Минимальная / Средняя / Максимальная) и линейный график температуры за выбранный период, цвет которого определяется порогами для соответствующего типа диска",
"tempImageCaption": "Подробные сведения о температуре — открываются на вкладке «Обзор» для любого диска, датчик которого возвращает ненулевое значение. Цвет графика определяется порогами для соответствующего типа диска (HDD / SSD / NVMe / SAS).",
"tempShowsTitle": "Что отображается в модальном окне",
"tempShowsItems": [
"<strong>Переключатель временного диапазона</strong> с четырьмя вариантами: <em>1 час</em>, <em>24 часа</em> (по умолчанию), <em>7 дней</em>, <em>30 дней</em>. Для каждого варианта запрос отправляется к одной и той же серверной части, но с разной степенью прореживания данных, чтобы график оставался читаемым при любом диапазоне.",
"<strong>Четыре карточки показателей</strong> в верхней части модального окна: <em>Текущая</em>, <em>Минимальная</em>, <em>Средняя</em>, <em>Максимальная</em> температура за выбранный период. Цвет карточки <em>Текущая</em> определяется теми же порогами состояния, что используются на вкладке «Хранилище» и в уведомлениях, поэтому можно сразу понять, находится ли температура диска в нормальном, повышенном или высоком диапазоне.",
"<strong>Линейный график</strong> изменения температуры во времени; цвет линии и закрашенной области определяется типом диска:"
],
"tempDiskTypes": [
"HDD — обычно более низкие температурные пороги.",
"SSD — умеренные температурные пороги.",
"NVMe — более высокие температурные пороги (из-за особенностей конструкции NVMe работают при более высокой температуре).",
"SAS — по умолчанию порог предупреждения составляет 55 °C, критический порог — 65 °C; порог предупреждения отличается от порога для HDD."
],
"tempConfigurable": "Пороги для всех четырёх типов можно настроить в <em>Settings → Health Monitor Thresholds</em>.",
"tempWhyTitle": "Почему здесь важна история",
"tempWhyItems": [
"<strong>Выявление постепенных изменений.</strong> По одному показанию «текущей температуры» нельзя заметить, что диск постепенно нагревается на протяжении нескольких недель (из-за неисправного вентилятора, скопления пыли или выхода из строя соседнего диска, от которого идёт горячий воздух). Просмотр за 7 и 30 дней позволяет выявить эту тенденцию.",
"<strong>Сопоставление всплесков с событиями.</strong> Если во время создания резервной копии или перестроения массива температура диска ненадолго превысила порог, графики за 1 час и 24 часа показывают, был ли это единичный случай или повторяющаяся ситуация.",
"<strong>Настройка порогов.</strong> Прежде чем повышать или понижать порог в <em>Settings → Health Monitor Thresholds</em>, посмотрите график за 30 дней: он показывает фактический рабочий диапазон температур диска, позволяя выбрать новое значение на основе реального поведения оборудования, а не догадок."
],
"obsTitle": "История наблюдений (на разных вкладках)",
"obsIntro": "Неисправности диска могут развиваться постепенно. Диск может показывать результат SMART <strong>PASSED</strong>, при этом в dmesg могут регистрироваться ошибки чтения, соединения SATA — обрываться, а секторы, ожидающие переназначения, — появляться время от времени. ProxMenux сохраняет историю этих <em>признаков</em> и отображает её в диалоговом окне диска рядом с текущим заключением SMART.",
"obsImageAlt": "Вкладка «Обзор» модального окна «Сведения о диске»: исправный диск со статусом SMART «Проверка пройдена», без переназначенных секторов, секторов, ожидающих переназначения, и ошибок CRC; в разделе «Наблюдения» показано одно зарегистрированное событие ошибки ввода-вывода с исходным сообщением ядра, понятной расшифровкой кода ошибки ATA, временем первого и последнего возникновения и числом повторений",
"obsImageCaption": "Даже у диска, который <strong>SMART считает исправным</strong>, может быть история наблюдений. Карточка дополняет заключение SMART сведениями о ранее зарегистрированных событиях.",
"obsWhatTitle": "Что такое наблюдение",
"obsWhatIntro": "Всё, что ProxMenux обнаруживает в журнале ядра, выводе dmesg или SMART и что похоже на событие на уровне диска, но само по себе представляет слишком частную деталь для отдельного уведомления, регистрируется как <strong>наблюдение</strong>. Каждая строка содержит:",
"obsWhatItems": [
"<strong>Метка типа</strong> (ошибка ввода-вывода, ошибка SMART, ошибка файловой системы, ошибка пула ZFS, ошибка соединения).",
"<strong>Исходное сообщение ядра</strong> в том виде, в каком оно появилось в dmesg, — удобно для копирования в поисковую систему или обращение в службу поддержки.",
"<strong>Краткое понятное пояснение</strong> под исходным сообщением для известных кодов ATA (<code>IDNF</code> → «Адрес сектора не найден — возможна проблема с сектором или кабелем», <code>UNC</code> → «Неисправимая ошибка чтения — повреждённый сектор», а также для остальных стандартных кодов).",
"<strong>Время первого и последнего возникновения</strong>, а также <strong>число повторений</strong> с объединением одинаковых событий по сигнатуре ошибки."
],
"obsWhyTitle": "Зачем ProxMenux регистрирует и показывает наблюдения",
"obsWhyItems": [
"<strong>Неисправности могут развиваться со временем.</strong> Периодические ошибки шины ATA, секторы с ошибками UNC или ошибки носителя могут появиться до того, как SMART сообщит <em>FAILED</em>. Сам по себе буфер dmesg не сохраняет их после перезагрузки, а история наблюдений сохраняет.",
"<strong>SMART не исключает все возможные неисправности.</strong> Показатели накопителя могут оставаться зелёными даже при наличии проблем. Наблюдения сохраняют дополнительные признаки, в том числе ошибки ICRC, IDNF, сбросы соединения SATA и снижение его скорости.",
"<strong>Это позволяет различать «происходит сейчас» и «произошло недавно».</strong> Монитор состояния автоматически помечает временные ошибки как устранённые, как только они перестают возникать. Это помогает не засорять список активных оповещений, но даже спустя несколько дней полезно видеть, что в ту ночь на диске произошли три ошибки ввода-вывода. Именно для этого нужна таблица наблюдений.",
"<strong>Это основа многоуровневой модели уведомлений.</strong> Детектор disk_io считывает из этой таблицы частоту наблюдений, чтобы выбрать режим: без уведомления / WARNING / CRITICAL (скользящее окно в 24 часа, введённое в версии 1.2.1.2). Именно история позволяет выполнять такую классификацию."
],
"obsDedupTitle": "Как работают устранение дубликатов и повторные уведомления",
"obsDedupBody1": "Дубликаты наблюдений объединяются по их <strong>сигнатуре</strong> — устойчивому идентификатору, сформированному из типа ошибки, устройства и ключевых полей строки журнала ядра. Повторение того же события увеличивает <code>occurrence_count</code> в существующей строке, а не создаёт новую. <strong>Другая сигнатура</strong> на том же диске создаёт новое наблюдение и для целей уведомления считается новым событием.",
"obsDedupBody2": "Для уведомлений действует правило защиты от каскадной рассылки: первое появление определённой комбинации (диск, сигнатура, уровень серьёзности) вызывает уведомление пользователя, после чего ProxMenux ждёт 24 часа, прежде чем снова уведомить о той же комбинации, даже если число повторений продолжает расти. Повышение уровня серьёзности (WARNING → CRITICAL) отменяет период ожидания, чтобы пользователь узнал об ухудшении ситуации, а не только о возникновении событий.",
"obsDismissTitle": "Постоянная история и активные ошибки",
"obsDismissBody1": "Наблюдение нельзя отклонить, скрыть или удалить. Каждому отдельному наблюдению диска соответствует одна карточка; повторное появление того же события увеличивает число повторений и обновляет дату последнего возникновения, не создавая новую карточку. История привязана к диску по его серийному номеру: диск, подключённый вместо другого, начинает работу без наблюдений, а диск, которому ядро присвоило новое имя, сохраняет свою историю.",
"obsDismissBody2": "Устранение или отклонение активных ошибок в Мониторе состояния не зависит от наблюдений: наблюдение сохраняется после автоматического закрытия активной ошибки. В этом и смысл: история остаётся, поэтому временное предупреждение за прошлую неделю по-прежнему видно в карточке диска сегодня. Об активных ошибках в рамках той же системы см. <link>Монитор состояния</link>."
},
"dataCollected": {
"heading": "Как собираются данные",
"headerSection": "Раздел вкладки",
"headerEndpoint": "Конечная точка",
"headerSource": "Источник",
"rows": [
{
"section": "Верхние сводные карточки",
"endpoint": "/api/storage/summary",
"source": "Сводные данные из <code>lsblk</code>, <code>zpool list</code>, <code>vgs</code> / <code>lvs</code>."
},
{
"section": "Инвентаризация отдельных дисков",
"endpoint": "/api/storage",
"source": "<code>lsblk -O</code> + <code>smartctl -i</code> для каждого устройства, с кэшем постоянных идентификаторов дисков (очищается при событиях горячего подключения и отключения)."
},
{
"section": "Хранилища Proxmox",
"endpoint": "/api/proxmox-storage",
"source": "<code>pvesh get /nodes/&lt;node&gt;/storage</code> с состоянием активности и доступности каждого из них."
},
{
"section": "Текущие значения SMART",
"endpoint": "/api/storage/smart/<disk>",
"source": "<code>smartctl -A &lt;dev&gt;</code> — один из доступных способов проверки; конечная точка подробных сведений также использует полный JSON SMART и данные, специфичные для NVMe."
},
{
"section": "История самотестирования SMART",
"endpoint": "/api/storage/smart/<disk>/history",
"source": "Хранится в <code>/usr/local/share/proxmenux/smart/&lt;disk&gt;/</code> в виде снимков JSON."
},
{
"section": "Постоянно сохраняемые наблюдения",
"endpoint": "/api/storage/observations",
"source": "Таблица SQLite, пополняемая монитором состояния в каждом цикле (данные сохраняются и после автоматического закрытия оповещения)."
}
],
"outro": "Проверка цепочки сбора данных на хосте:",
"codeComment1": "# Получить текущий снимок из скрипта",
"codeComment2": "# Сопоставить данные панели мониторинга с исходными данными ОС"
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Мониторинг состояния",
"href": "/docs/monitor/health-monitor",
"tail": " — категория дисков и ввода-вывода и модель подавления оповещений."
},
{
"label": "Справочник API",
"href": "/docs/monitor/api",
"tail": " — конечные точки хранилища и SMART."
},
{
"label": "Уведомления",
"href": "/docs/monitor/notifications",
"tailRich": " — какие последующие действия запускают <code>disk_io_error</code>, <code>storage_unavailable</code> и <code>smart_test_failed</code>."
},
{
"label": "Обзор панели мониторинга",
"href": "/docs/monitor/dashboard",
"tail": " — остальные вкладки."
},
{
"label": "ProxMenux → Диспетчер дисков",
"href": "/docs/disk-manager",
"tail": " — действия: форматирование, очистка, тесты SMART и импорт дисков в виртуальные машины и контейнеры из TUI."
},
{
"label": "ProxMenux → Состояние и проверка диска по SMART",
"href": "/docs/disk-manager/smart-disk-test",
"tail": " — аналог этой вкладки в CLI: планирование тестов SMART, экспорт JSON, на основе которого панель мониторинга отображает данные, и подробный справочник по типам тестов и интерпретации результатов."
}
]
}
}
@@ -0,0 +1,120 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель мониторинга: вкладка «Системные журналы» | Документация ProxMenux",
"description": "Вкладка «Системные журналы» объединяет на одном экране три источника: journalctl в реальном времени с фильтрами и скачиванием, историю задач Proxmox (UPID) и журнал уведомлений. Для всех источников доступны поиск, фильтрация по уровню серьёзности и временному диапазону, а также скачивание в виде текстовых пакетов."
},
"header": {
"title": "Панель мониторинга: вкладка «Системные журналы»",
"description": "Три подвкладки в одном месте: системный журнал (journalctl с фильтрами), история задач Proxmox и журнал уведомлений. Во всех трёх доступны поиск, фильтрация и скачивание в виде текстовых пакетов.",
"section": "ProxMenux Monitor · Панель управления"
},
"readOnly": {
"title": "Только для чтения по замыслу",
"body": "Ничто на этой вкладке не изменяет файлы журналов. Фильтры хранятся в URL или состоянии интерфейса, а пакеты для скачивания формируются на сервере. Панель мониторинга никогда не удаляет записи журналов — для очистки используйте штатные средства хоста <code>journalctl --vacuum-time=&lt;N&gt;</code> или <code>logrotate</code>."
},
"topRow": {
"heading": "Верхний ряд: четыре счётчика",
"items": [
"<strong>Всего записей</strong> — количество записей журнала в пределах текущего интервала фильтрации.",
"<strong>Ошибки</strong> — количество записей с уровнем важности ≤ 3 (<code>err</code> / <code>crit</code> / <code>alert</code> / <code>emerg</code>).",
"<strong>Предупреждения</strong> — количество записей с уровнем важности 4 (<code>warning</code>).",
"<strong>Резервные копии</strong>: количество архивов резервных копий в настроенных хранилищах резервных копий."
]
},
"subtabs": {
"heading": "Три вложенные вкладки",
"logsTitle": "Журналы",
"logsIntro": "Системный журнал, данные которого на серверной стороне предоставляет <code>journalctl</code>. На панели инструментов доступны следующие фильтры:",
"logsFilters": [
"<strong>Уровень</strong>: все уровни, ошибка, предупреждение или информация.",
"<strong>Временной диапазон</strong>: 1 день / 3 дня / 1 неделя / 2 недели / 1 месяц или заданное пользователем количество дней (до 90).",
"<strong>Поиск по произвольному тексту</strong>: поиск подстроки без учёта регистра по сообщению, службе, PID, имени хоста и юниту, выполняемый в браузере.",
"<strong>Фильтр по службе</strong>: ограничивает выборку одной службой (поле журнала <code>SYSLOG_IDENTIFIER</code>)."
],
"logsRowsAfter": "В каждой строке отображаются метка времени, значок уровня важности, исходный юнит и сообщение. Длинные сообщения сворачиваются; развернуть их можно с помощью переключателя «Показать больше». Действие <strong>Скачать</strong> сохраняет записи, соответствующие текущему фильтру, в один файл <code>.txt</code> с помощью <code>GET /api/logs/download</code> — это удобно, если нужно поделиться с кем-либо частью журнала.",
"logDetailsModalTitle": "Модальное окно «Сведения о записи журнала»",
"logDetailsBody": "Нажатие на любую строку открывает модальное окно <strong>Сведения о записи журнала</strong> со всеми структурированными полями, которые journald сохранил для этой записи. Те же сведения можно получить вручную, выполнив <code>journalctl --output=verbose</code> на хосте.",
"logDetailsImageAlt": "Модальное окно «Сведения о записи журнала» — развёрнутая запись журнала с уровнем важности, службой, меткой времени, источником, юнитом systemd, идентификатором процесса, именем хоста и полным сообщением",
"logDetailsImageCaption": "Модальное окно «Сведения о записи журнала» — все структурированные поля, которые journald содержит для этой записи, и полный, необрезанный текст сообщения внизу. Полезно для журналов cron и служб, когда важна выполненная командная строка.",
"fieldsIntro": "Отображаемые поля:",
"fields": [
"<strong>Уровень</strong> — цветной значок уровня важности (ИНФОРМАЦИЯ / ПРЕДУПРЕЖДЕНИЕ / ОШИБКА / КРИТИЧЕСКАЯ ОШИБКА).",
"<strong>Служба</strong> — краткое имя юнита или процесса, создавшего запись.",
"<strong>Метка времени</strong> — полные дата и время записи журнала.",
"<strong>Источник</strong> — источник записи (журнал, ядро, аудит и т. д.).",
"<strong>Юнит systemd</strong> — конкретный юнит <code>.service</code> / <code>.timer</code> / <code>.socket</code>, если запись была связана с одним из них.",
"<strong>Идентификатор процесса</strong> — PID процесса, создавшего запись.",
"<strong>Имя хоста</strong> — полезно при пересылке журналов между узлами кластера.",
"<strong>Сообщение</strong> — полный текст сообщения без сокращений в блоке с моноширинным шрифтом, готовый к копированию."
],
"maxLevelStoreTitle": "Journald MaxLevelStore",
"maxLevelStoreBody": "В новой установке Proxmox для journald по умолчанию задано значение <code>MaxLevelStore=warning</code>, из-за чего информационные сообщения отбрасываются без предупреждения. При запуске Monitor обнаруживает это и добавляет файл дополнительной конфигурации (<code>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</code>), повышающий порог до <code>info</code>, чтобы сохранялись информационные сообщения и сообщения более высоких уровней важности. Отладочные сообщения при этом не сохраняются.",
"backupsTitle": "Резервные копии",
"backupsBody": "Архивы резервных копий на всех хранилищах, поддерживающих резервное копирование (dir, NFS, CIFS, PBS), считываемые с помощью <code>pvesh get /nodes/localhost/storage/&lt;id&gt;/content</code>. Карточки вверху показывают количество VM и LXC, а также общий размер; ниже каждому архиву соответствует строка с типом, хранилищем, размером и датой. Восстановление выполняется в веб-интерфейсе Proxmox.",
"notificationsTitle": "Уведомления",
"notificationsBody1": "Активность уведомлений Proxmox: строки журнала служб Proxmox, в которых упоминаются уведомления, электронная почта, вебхуки или оповещения, получатели из /etc/pve/notifications.cfg и задачи резервного копирования из списка задач кластера. В строках задач резервного копирования можно скачать полный журнал задачи. История уведомлений, отправленных самим Monitor, находится в разделе Settings → Notifications → Notification history.",
"notificationsBody2": "На этой вкладке можно проверить работу собственной системы уведомлений Proxmox. Настройка каналов Monitor находится на отдельной странице <link>Уведомления</link>."
},
"dataCollected": {
"heading": "Как собираются данные",
"headerSubtab": "Вложенная вкладка",
"headerEndpoint": "Конечная точка",
"headerSource": "Источник",
"rows": [
{
"subtab": "Журналы (фильтрация в реальном времени)",
"endpoint": "/api/logs",
"source": "Вкладка запрашивает <code>/api/logs?since_days=N</code>; фильтрация по уровню, службе и тексту выполняется в браузере. API также принимает <code>priority</code> и <code>service</code>, которые вкладка пока не использует."
},
{
"subtab": "Скачать",
"endpoint": "/api/logs/download",
"source": "Тот же запрос с результатом в виде обычного текста для grep / less."
},
{
"subtab": "Резервные копии",
"endpoint": "/api/backups",
"source": "Список архивов резервных копий из каждого хранилища резервных копий, получаемый с помощью <code>pvesh get /nodes/localhost/storage/&lt;id&gt;/content</code>."
},
{
"subtab": "Журнал задачи резервного копирования (Уведомления)",
"endpoint": "/api/task-log/&lt;upid&gt;",
"source": "Полный журнал задачи в виде обычного текста, считываемый из <code>/var/log/pve/tasks/&lt;index&gt;/&lt;upid&gt;</code>."
},
{
"subtab": "Уведомления",
"endpoint": "/api/notifications",
"source": "<code>journalctl --grep</code> для юнитов Proxmox, <code>/etc/pve/notifications.cfg</code> и задачи резервного копирования из <code>pvesh get /cluster/tasks</code>."
}
],
"apiIntro": "Фильтрация в реальном времени и скачивание также доступны через API:",
"codeComment1": "# Ошибки и сообщения более высоких уровней важности за последний час с фильтрацией по ключевому слову",
"codeComment2": "# Скачать полный журнал за последние 6 часов в виде обычного текста",
"codeComment3": "# Найти полный вывод конкретной задачи по UPID"
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Мониторинг состояния",
"href": "/docs/monitor/health-monitor",
"tail": " — категория «Системные журналы», отслеживающая устойчивые, всплесковые и каскадные последовательности событий."
},
{
"label": "Уведомления",
"href": "/docs/monitor/notifications",
"tail": " — механизм наблюдения за журналом читает тот же источник и преобразует совпадения в уведомления."
},
{
"label": "Справочник API",
"href": "/docs/monitor/api",
"tail": " — конечные точки журналов и журналов задач с параметрами запросов."
},
{
"label": "Обзор панели мониторинга",
"href": "/docs/monitor/dashboard",
"tail": " — остальные вкладки."
}
]
}
}
@@ -0,0 +1,177 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель управления: вкладка «Обзор системы» | Документация ProxMenux",
"description": "Вкладка ProxMenux Monitor, открывающаяся по умолчанию: четыре карточки показателей (ЦП, память, активные VM и LXC, температура) с обновлением в реальном времени и мини-графиками, график истории показателей и компактные панели «Хранилище» и «Сеть» с переходом на соответствующие вкладки."
},
"header": {
"title": "Панель управления: вкладка «Обзор системы»",
"description": "Вкладка, которая открывается по умолчанию при входе в панель мониторинга. Вверху расположены четыре карточки с текущими метриками, посередине — график исторических метрик, а внизу — сводные панели хранилища и сети. Все данные поступают из тех же API, которые используются на соответствующих отдельных вкладках.",
"section": "ProxMenux Monitor · Панель управления"
},
"readOnly": {
"title": "Сводка только для чтения",
"body": "На этой вкладке нет элементов управления — все панели носят информационный характер. Действия доступны на отдельных вкладках, на которые ведут ссылки: перейдите в «Хранилище» для управления дисками, в «ВМ и LXC» для запуска и остановки гостевых систем, на вкладку «Безопасность» для настройки аутентификации и так далее."
},
"captureAlt": "Вкладка «Обзор системы» — четыре карточки метрик (ЦП, память, активные ВМ, температура), график метрик узла и сводные карточки хранилища и сети",
"captureCaption": "Вкладка «Обзор системы» открывается по умолчанию. Четыре карточки показывают текущие данные, график ниже — исторические, а две карточки внизу содержат сводную информацию о хранилище и сети.",
"topRow": {
"heading": "Верхний ряд: карточки с текущими метриками",
"intro": "Четыре карточки расположены в сетке 2×2 на мобильных устройствах и в один ряд на компьютерах. Каждая обновляется данными из <code>/api/system</code> каждые несколько секунд.",
"headerCard": "Карточка",
"headerWhat": "Что показывает",
"headerSource": "Источник",
"rows": [
{
"card": "Загрузка ЦП",
"what": "Текущая загрузка в процентах с индикатором заполнения. Обновляется примерно раз в секунду с помощью сборщика основных показателей.",
"source": "psutil.cpu_percent()"
},
{
"card": "Использование памяти",
"what": "Использованный объём в ГБ, процент использования и общий объём в ГБ. Индикатор заполнения отражает процент использования.",
"source": "psutil.virtual_memory()"
},
{
"card": "Активные ВМ и LXC",
"what": "Количество работающих гостевых систем со значком, показывающим распределение по состояниям «Работает» и «Остановлено», и строкой внизу с общим количеством ВМ и контейнеров LXC.",
"source": "/api/vms (сводные данные)"
},
{
"card": "Температура",
"what": "Температура ЦП в °C со значком состояния (низкая / повышенная / высокая) и мини-графиком за 5 минут на заднем плане. Если датчик не обнаружен, отображается <em>Н/Д</em>. Нажмите, чтобы открыть модальное окно с подробными данными о температуре.",
"source": "sensors / coretemp"
}
],
"thresholdsTitle": "Используемые здесь цвета состояний и пороговые значения",
"thresholdsIntro": "Все кольцевые индикаторы, полосы и мини-графики на четырёх карточках метрик используют одну и ту же классификацию: <green/> <strong>зелёный</strong> — ниже порога предупреждения, <amber/> <strong>янтарный</strong> — от порога предупреждения до критического порога, <red/> <strong>красный</strong> — на критическом пороге и выше. Рекомендуемые значения по умолчанию, поставляемые с ProxMenux:",
"thresholdsItems": [
"<strong>Загрузка ЦП</strong> — предупреждение при 85 %, критический уровень при 95 %.",
"<strong>Память</strong>: предупреждение при 85 %, критический уровень при 95 %. Для подкачки критический уровень срабатывает только тогда, когда использование подкачки превышает 80 %, а доступная оперативная память составляет менее 15 %.",
"<strong>Температура процессора</strong> — порог предупреждения: 80 °C, критический порог: 90 °C."
],
"thresholdsOutro": "Каждое значение можно настроить отдельно для каждого узла. <link>Settings → Health Monitor Thresholds</link> — единый авторитетный источник сведений с пояснениями по их настройке.",
"sparklineTitle": "Мини-график несёт полезную информацию",
"sparklineBody": "На карточке температуры под значением отображается график за 5 минут. Цвет линии и градиента зависит от тех же порогов предупреждения и критического уровня, которые описаны выше. Это самый быстрый способ понять, растёт ли температура хоста, не открывая модальное окно с подробными данными."
},
"processes": {
"heading": "Процессы с наибольшим потреблением ресурсов процессора и памяти",
"intro": "Карточки «Использование процессора» и «Память» на вкладке «Обзор» доступны для нажатия. Нажатие на любую из них открывает сортируемый список из 25 процессов: при открытии из карточки процессора — с наибольшей загрузкой процессора, из карточки памяти — с наибольшим объёмом резидентной памяти.",
"listTitle": "Диалоговое окно со списком",
"listItems": [
"<strong>Автообновление</strong> — список обновляется каждые 3 секунды, пока диалоговое окно открыто. Опрос прекращается сразу после его закрытия.",
"<strong>Фильтр</strong> — поле поиска позволяет отфильтровать список по команде, пользователю или PID.",
"<strong>Полоса в ячейке</strong> — в столбце основного показателя отображается небольшая полоса, масштабируемая относительно наибольшего значения в отфильтрованном списке. Так соотношение значений остаётся наглядным, даже если ни один процесс не приближается к 100 %.",
"<strong>Мобильная компоновка</strong> — при ширине менее 640 пикселей столбцы PID и «Пользователь» скрываются, чтобы столбцы «Команда», «ЦП, %» и «Память» помещались на экране телефона без горизонтальной прокрутки."
],
"captureListAlt": "Модальное окно процессов с наибольшим потреблением памяти — таблица со столбцами PID, «Пользователь», «Команда», «ЦП, %» и «Память», отсортированная по RSS",
"captureListCaption": "Карточка «Память» открывает список, отсортированный по RSS (цветовой акцент — индиго). Карточка процессора открывает тот же список, отсортированный по загрузке процессора (синий цветовой акцент).",
"detailTitle": "Подробные сведения о процессе",
"detailIntro": "Нажатие на любую строку списка открывает второе диалоговое окно с обновляемыми сведениями об этом процессе, сгруппированными в четыре раздела:",
"detailItems": [
"<strong>Обзор</strong> — состояние, родительский процесс, количество потоков, открытые файловые дескрипторы, пользователь и группа.",
"<strong>Ресурсы</strong> — загрузка процессора в процентах, использование памяти в процентах, резидентная память (RSS), объём виртуальной памяти, память в области подкачки, суммарные объёмы чтения и записи.",
"<strong>Команда</strong> — краткое имя, полная командная строка, путь к исполняемому файлу и рабочий каталог.",
"<strong>Время работы</strong> — дата и время запуска и прошедшее время работы."
],
"detailRefresh": "Диалоговое окно подробных сведений обновляется каждые 3 секунды, пока оно открыто. Если процесс завершается при открытом окне, опрос прекращается, появляется янтарное уведомление <em>Этот процесс завершён</em>, а последние полученные данные остаются на экране в приглушённом виде, чтобы вы могли увидеть, что происходило непосредственно перед завершением процесса.",
"captureDetailAlt": "Модальное окно подробных сведений о процессе — разделы «Обзор», «Ресурсы», «Команда» и «Время работы» для одного PID",
"captureDetailCaption": "Диалоговое окно подробных сведений о процессе, открытое из строки списка. Цветовой акцент соответствует карточке, из которой был открыт список: синий для процессора, индиго для памяти."
},
"middle": {
"heading": "Средняя часть: графики показателей узла",
"body1": "Под верхним рядом расположен компонент <code>NodeMetricsCharts</code> — графики истории использования процессора, памяти и дискового ввода-вывода, данные для которых поступают из собственного хранилища RRD Proxmox через <code>/api/node/metrics</code>. Переключатель временного диапазона позволяет выбрать <em>1 час / 24 часа / 7 дней / 30 дней</em>; по мере увеличения диапазона детализация данных снижается, чтобы график оставался плавным.",
"body2": "Это те же графики, которые веб-интерфейс Proxmox отображает для узла, но оформленные в тёмной теме Monitor и согласованные с остальными панелями."
},
"bottom": {
"heading": "Нижний ряд: сводки по хранилищам и сети",
"storageTitle": "Карточка «Обзор хранилищ»",
"storageIntro": "Краткая сводка о состоянии хранилищ хоста, разделённая на три блока:",
"storageItems": [
"<strong>Общая ёмкость узла</strong> — суммарная ёмкость всех хранилищ VM/LXC и локального системного хранилища с градиентной полосой, показывающей соотношение занятого и свободного пространства.",
"<strong>Общая ёмкость / Физические диски</strong> — общая физическая ёмкость без учёта накладных расходов и количество обнаруженных физических дисков.",
"<strong>Хранилище VM/LXC</strong> — занятое и свободное пространство, а также процент использования хранилищ гостевых систем; если настроено несколько хранилищ, также отображается их количество.",
"<strong>Локальное хранилище (система)</strong> — корневая / системная файловая система самого хоста, отдельно от пула гостевых систем."
],
"storageDrillIn": "Подробные сведения доступны на <link>вкладке «Хранилище»</link>: данные SMART для каждого диска, сведения о пулах ZFS, история наблюдений и т. д.",
"networkTitle": "Карточка «Обзор сети»",
"networkBody1": "В верхней строке показано количество активных интерфейсов (физических и мостов вместе). Ниже расположены два ряда цветных значков интерфейсов со статусом <code>up</code>: физические сетевые адаптеры выделены синим, мосты — дополнительным цветом. Переключатель периода в правом верхнем углу (1 час / 24 часа / 7 дней / 30 дней / 1 год) управляет небольшим графиком входящего / исходящего трафика (RX / TX).",
"networkBody2": "Подробные сведения по каждому интерфейсу (IP/MAC, график RRD, участники моста, режим объединения интерфейсов и т. д.) доступны на <link>вкладке «Сеть»</link>."
},
"refresh": {
"heading": "Механизм обновления",
"intro": "Каждая панель самостоятельно управляет состоянием загрузки (<code>loadingStates.cpu</code>, <code>loadingStates.storage</code>, …), поэтому медленный источник не блокирует остальные. Пока панель получает данные, отображается пульсирующий макет-заглушка; сбои получения данных обрабатываются без нарушения работы интерфейса: например, при отсутствии датчика температуры в карточке отображается <em>Н/Д</em> вместо ошибки.",
"items": [
"<strong>Верхние карточки показателей</strong> — обновляются примерно каждые 5 с. Панели процессора и температуры также получают данные от модуля сбора основных показателей каждую секунду.",
"<strong>График показателей узла</strong> — загружается при открытии и при изменении периода или языка. Если требуется повторная попытка, она выполняется через 60 с.",
"<strong>Карточка хранилища</strong> — обновляется каждые 60 с. Данные SMART кешируются дольше (вкладка «Хранилище» запускает повторное считывание по запросу).",
"<strong>Карточка сети</strong> — сводка обновляется каждые 59 с, а график трафика за выбранный период — каждые 60 с.",
"<strong>Обновление вручную</strong> — кнопка «Обновить» в заголовке заставляет все панели немедленно повторно запросить данные."
]
},
"dataCollected": {
"heading": "Как собираются данные",
"headerCard": "Карточка",
"headerEndpoint": "Конечная точка",
"headerSource": "Источник",
"rows": [
{
"card": "Индикатор состояния в заголовке",
"endpoint": "/api/health",
"source": "Кешированное общее состояние, формируемое монитором состояния в каждом цикле."
},
{
"card": "Процессор / ОЗУ / Подкачка / Время работы",
"endpoint": "/api/system",
"source": "<code>/proc/stat</code>, <code>/proc/meminfo</code>, <code>/proc/uptime</code> с измерением загрузки процессора за короткий интервал."
},
{
"card": "Сведения о хосте (ядро, BIOS, дистрибутив)",
"endpoint": "/api/info",
"source": "<code>uname -a</code>, <code>dmidecode</code>, версия PVE. Кешируются отдельно для каждого процесса."
},
{
"card": "Карточки хранилища / сети / виртуальных машин",
"endpoint": "/api/storage/summary, /api/network/summary, /api/vms",
"source": "См. соответствующие вкладки. Карточки в заголовке показывают сводные данные из тех же конечных точек."
},
{
"card": "Периодичность обновления",
"endpoint": "—",
"source": "Системные данные обновляются каждые 5 с; сводка по хранилищам, ВМ и сети — каждые 59 с. Кнопка «Обновить» в заголовке принудительно запускает немедленное повторное получение данных на всех панелях."
}
],
"codeComment1": "# Один вызов для индикатора в заголовке",
"codeComment2": "# общедоступный, токен не требуется",
"codeComment3": "# Снимок данных для карточек, полученный с аутентификацией"
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Мониторинг состояния",
"href": "/docs/monitor/health-monitor",
"tail": " — модальное окно, открываемое индикатором состояния в заголовке (десять категорий, отклонение и подавление уведомлений)."
},
{
"label": "Справочник API",
"href": "/docs/monitor/api",
"tail": " — конечные точки для системных данных, информации и состояния работоспособности."
},
{
"label": "Уведомления",
"href": "/docs/monitor/notifications",
"tail": " — как те же статусы преобразуются в сообщения Telegram / Discord / электронной почты."
},
{
"label": "Обзор панели мониторинга",
"href": "/docs/monitor/dashboard",
"tail": " — краткий обзор остальных вкладок панели управления."
},
{
"label": "Архитектура",
"href": "/docs/monitor/architecture",
"tail": " — фоновые потоки и API, обеспечивающие работу этого представления."
}
]
}
}
@@ -0,0 +1,174 @@
{
"meta": {
"title": "ProxMenux Monitor — Панель управления: вкладка «Терминал» | Документация ProxMenux",
"description": "Командная оболочка хоста Proxmox в браузере: до 4 терминалов одновременно с отображением в виде сетки, вспомогательные клавиши для мобильных устройств (ESC, TAB, стрелки, сочетания с Ctrl), встроенная шпаргалка по командам на базе cheat.sh, защита с помощью JWT."
},
"header": {
"title": "Панель управления: вкладка «Терминал»",
"description": "Полноценный сеанс командной оболочки хоста Proxmox в браузере. До четырёх терминалов одновременно, вспомогательные клавиши для мобильных устройств, встроенная шпаргалка по командам — всё в той же теме оформления, что и остальная панель управления.",
"section": "ProxMenux Monitor · Панель управления"
},
"intro": {
"title": "Полноценный PTY в браузере",
"body": "Терминал выделяет серверный PTY через <code>flask_terminal_routes</code>, передаёт его поток через WebSocket в <code>xterm.js</code> в браузере и работает от имени <code>root</code> (пользователя службы systemd). Всё, что можно делать в <code>ssh root@&lt;host&gt;</code>, работает и здесь — включая <code>vim</code>, <code>tmux</code>, утилиты ncurses и интерфейсы командной строки Proxmox (<code>qm</code>, <code>pct</code>, <code>pvesh</code>, <code>pvecm</code>). Каждый PTY, запущенный из этой вкладки, экспортирует переменную окружения <code>PROXMENUX_TERMINAL=monitor</code>, которую наследует каждый дочерний процесс <code>bash</code>, в том числе при последующем запуске <code>menu</code>. Благодаря этому сценарии ProxMenux могут определить, что они выполняются в браузерном терминале Monitor."
},
"singleAlt": "Вкладка «Терминал» ProxMenux Monitor — один сеанс терминала со сводкой о системе от Fastfetch при входе",
"singleCaption": "Открыт один терминал хоста — на панели инструментов над ним показаны счётчик (<em>1 / 4 терминала</em>) и кнопки <em>+ Новый</em>, <em>Поиск</em>, <em>Очистить</em> и <em>Закрыть</em>. На устройствах с сенсорным экраном под терминалом отображаются вспомогательные клавиши для мобильной клавиатуры.",
"target": {
"heading": "Целевой узел подключения",
"body1": "Вкладка «Терминал» открывает командную оболочку на <strong>самом хосте Proxmox</strong> — такой же сеанс входа, как при подключении через SSH. Каждая вкладка открывает новый терминал хоста.",
"body2": "Чтобы подключиться из браузера к <strong>контейнеру LXC</strong>, используйте отдельную кнопку <em>Консоль</em> на карточке каждого запущенного контейнера во <link>вкладке «ВМ и LXC»</link>. Она открывает модальное окно, в котором выполняется <code>pct enter &lt;vmid&gt;</code> и используется та же панель инструментов для мобильных устройств, которая описана ниже."
},
"menuGuard": {
"heading": "Защита от самообновления при запуске меню в этом терминале",
"body1": "<code>menu</code> в ProxMenux выполняет самообновление на месте: после подтверждения заменяет собственное дерево скриптов и перезагружается. Через SSH или консоль Proxmox это работает без проблем, но браузерный терминал не может пережить такую операцию — обновление уничтожает сам PTY, в котором работает оболочка, и соединение WebSocket обрывается в процессе. Чтобы не оставить сеанс в нерабочем состоянии, внутренние обработчики <code>check_updates_stable</code>, <code>check_updates_beta</code> и <code>apply_release_channel</code> считывают <code>PROXMENUX_TERMINAL</code> и определяют, что работают в среде Monitor.",
"body2": "При обнаружении этой среды обычный диалог «да / нет» заменяется информационным окном с официальной однострочной командой установки: <code>bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"</code> для стабильной версии и эквивалентным URL <code>install_proxmenux_beta.sh</code> для бета-версии. Само обновление откладывается до его выполнения в сеансе SSH или в консоли хоста Proxmox; браузерный терминал используется только для подтверждения ознакомления и чтения команды."
},
"fourTerminals": {
"heading": "До четырёх терминалов одновременно",
"intro": "На этой вкладке можно одновременно открыть до четырёх терминалов хоста. У каждого свой PTY и свой WebSocket — это полностью независимые сеансы. Переключаться между двумя режимами отображения можно с помощью значков рядом с кнопкой «Создать»:",
"items": [
"<strong>Вкладки</strong> — одновременно виден один терминал, остальные представлены именованными вкладками вверху (<em>Терминал 1</em>, <em>Терминал 2</em>…). Удобно для работы над одной задачей, когда остальные остаются в фоне.",
"<strong>Сетка</strong> — все открытые терминалы видны одновременно в сетке 2×2. Удобно, чтобы наблюдать за <code>htop</code> в одной панели, за <code>iftop</code> — в другой и редактировать в третьей, не переключаясь между ними."
],
"outro": "На панели инструментов показано текущее количество терминалов (<em>1/4 терминала</em>, <em>4/4 терминала</em>). Новые вкладки открываются кнопкой <strong>+ Новый</strong>, а отдельную вкладку можно закрыть маленькой кнопкой <code>×</code> в её заголовке. Большая красная кнопка <strong>Закрыть</strong> вверху завершает работу всех терминалов одновременно."
},
"gridAlt": "Вкладка «Терминал» в ProxMenux Monitor — сетка из четырёх терминалов хоста, в которых рядом отображаются результаты выполнения ls, настройки сети, iftop и главное меню ProxMenux",
"gridCaption": "Режим сетки (4 / 4 терминалов) — четыре независимых PTY хоста работают параллельно: список содержимого каталога, <code>/etc/network/interfaces</code> в одной панели, <code>iftop</code> — в другой и главное меню ProxMenux — в четвёртой. Переключайтесь между сеткой и вкладками с помощью переключателя режима отображения на панели инструментов.",
"keyboard": {
"heading": "Вспомогательные клавиши для мобильных устройств",
"intro": "На клавиатурах телефонов и планшетов обычно нет ESC, TAB, клавиш со стрелками и сочетаний с клавишами-модификаторами. Без них невозможно перемещаться по <code>vim</code>, <code>nano</code>, <code>htop</code> или любому меню текстового интерфейса. Вкладка «Терминал» решает эту проблему: под терминалом отображается ряд удобных сенсорных кнопок, если экран устройства достаточно мал или устройство поддерживает сенсорный ввод:",
"headerButton": "Кнопка",
"headerSends": "Отправляет",
"headerUse": "Типичное применение",
"rows": [
{
"button": "ESC",
"sends": "\\x1b",
"use": "Выйти из режима вставки в <code>vim</code>, отменить диалог текстового интерфейса, выйти из поиска."
},
{
"button": "TAB",
"sends": "\\t",
"use": "Автодополнение путей, переход между полями в dialog/whiptail."
},
{
"button": "↑ ↓ ← →",
"sends": "\\x1bO[ABCD]",
"use": "История команд оболочки, перемещение курсора, навигация по меню."
},
{
"button": "↵ Enter",
"sends": "\\r",
"use": "Подтверждение. Некоторые экранные клавиатуры заменяют Enter на «Перейти» или «Готово» — назначение этой кнопки однозначно."
},
{
"button": "Ctrl ▾",
"sends": "Раскрывающееся меню",
"useRich": true
}
],
"ctrlIntro": "Три управляющие последовательности:",
"ctrlItems": [
"<code>Ctrl+C</code> — отменить / прервать выполняющуюся команду (<code>\\x03</code>).",
"<code>Ctrl+X</code> — выйти из <code>nano</code> (<code>\\x18</code>).",
"<code>Ctrl+R</code> — обратный поиск по истории команд bash (<code>\\x12</code>)."
],
"modalTitle": "Та же панель инструментов в модальном окне консоли LXC",
"modalBody": "Консоль контейнера, которую вы открываете через <link>VMs & LXCs → Console</link>, отображает те же вспомогательные клавиши под модальным окном. При подключении модальное окно также автоматически вводит <code>pct enter &lt;vmid&gt;</code>, поэтому вы сразу попадаете внутрь контейнера."
},
"lxcAlt": "Модальное окно консоли LXC в ProxMenux Monitor — терминал: ubuntu (ID: 103) с той же удобной для мобильных устройств панелью инструментов (ESC, TAB, стрелки, Enter, Ctrl) под терминалом",
"lxcCaption": "Модальное окно консоли LXC, открытое через <em>VMs & LXCs → Console</em>. В заголовке указан целевой контейнер (<em>Терминал: ubuntu (ID: 103)</em>), а под терминалом расположена та же панель инструментов, удобная для сенсорного управления.",
"search": {
"heading": "Поиск команд — встроенная шпаргалка",
"intro": "Синяя кнопка <strong>Поиск</strong> на панели инструментов открывает модальное окно с нечётким поиском команд. Введите несколько букв любой команды Linux или Proxmox (<code>ls</code>, <code>tar</code>, <code>qm</code>, <code>pct</code>, <code>zpool</code>, <code>systemctl</code>…), и в окне появятся примеры использования с кнопкой <em>Отправить в активный терминал</em>, доступной одним нажатием. Так вам не придётся переключаться на отдельную вкладку браузера, чтобы вспомнить нужный флаг.",
"modalAlt": "Модальное окно поиска команд в ProxMenux Monitor — нечёткий поиск команд Linux и Proxmox на основе cheat.sh с несколькими примерами использования ls",
"modalCaption": "Модальное окно поиска команд с запросом <code>ls</code> — каждый результат содержит команду, её описание и небольшую стрелку отправки, которая передаёт команду в активный терминал. В правом нижнем углу указан источник данных (<em>На базе cheat.sh</em>).",
"aboutLabel": "О cheat.sh:",
"aboutBody": "— единая шпаргалка с открытым исходным кодом, которую поддерживает сообщество. Она объединяет короткие практические примеры использования сотен команд Linux, инструментов системного администрирования и языков программирования. Изначально она была предназначена для запросов из терминала с помощью <code>curl cheat.sh/&lt;command&gt;</code>, но доступна и из любого браузера. ProxMenux Monitor проксирует запросы на стороне сервера, поэтому модальное окно продолжает работать в рамках того же источника, что и панель мониторинга.",
"headerSource": "Источник",
"headerWhen": "Когда используется",
"headerWhat": "Что вы видите",
"onlineLabel": "(онлайн)",
"onlineWhen": "Когда у узла есть доступ к интернету и прокси cheat.sh отвечает.",
"onlineWhat": "Несколько практических примеров для каждой команды с описанием над каждым примером. Индикатор состояния в заголовке модального окна — <green>зелёный</green>.",
"fallbackLabel": "Локальный резервный вариант",
"fallbackWhen": "Когда cheat.sh недоступен (у узла нет доступа к сети, действуют ограничения межсетевого экрана или произошёл сбой cheat.sh).",
"fallbackWhat": "Встроенный список распространённых команд Linux и Proxmox. Каталог меньше, но доступен всегда. Индикатор состояния — <red>красный</red>.",
"sendingNote": "<strong>Как работает отправка</strong>: нажатие небольшой стрелки отправки рядом с результатом передаёт текст команды в текущий активный терминал (вкладку в фокусе или терминал, по которому вы щёлкнули последним в режиме сетки). Модальное окно закрывается автоматически, и вы можете сразу нажать Enter."
},
"auth": {
"heading": "Аутентификация",
"items": [
"Сначала браузер запрашивает одноразовый билет через <code>POST /api/terminal/ticket</code>, используя JWT в заголовке <code>Authorization</code> для аутентификации. Затем он передаёт этот билет при открытии WebSocket. Срок действия билета — 5 секунд; если аутентификация включена, при отсутствии билета или его недействительности соединение закрывается до выделения PTY.",
"Если Monitor находится за обратным прокси, прокси должен передавать запросы на переключение протокола WebSocket. Примеры конфигурации Nginx / Caddy / Traefik приведены на странице <link>Доступ и аутентификация</link>."
]
},
"clipboard": {
"heading": "Буфер обмена, история вывода и изменение размера",
"items": [
"<strong>Копирование / вставка</strong> — используется встроенный буфер обмена браузера. Выделите текст мышью или трекпадом и используйте сочетание клавиш ОС (<code>Cmd+C</code> в macOS, <code>Ctrl+Shift+C</code> в Linux/Windows). Графические среды Linux также поддерживают вставку средней кнопкой мыши.",
"<strong>Прокрутка истории вывода</strong> — колёсиком мыши или двумя пальцами. xterm.js хранит в памяти последние несколько тысяч строк.",
"<strong>Изменение размера</strong> — при изменении размера панели мониторинга терминал повторно согласовывает размер окна PTY, чтобы <code>htop</code> и <code>vim</code> отображались корректно.",
"<strong>Переподключение при возврате на вкладку</strong> — если вы переключаетесь между приложениями на телефоне или планшете (типичное поведение iPad), соединение WebSocket обычно обрывается. Вкладка «Терминал» отслеживает изменения видимости и автоматически восстанавливает соединение при вашем возвращении. Для медленных VPN-соединений предусмотрен тайм-аут 15 секунд."
]
},
"disconnect": {
"heading": "Причины разрыва соединения",
"intro": "Наиболее частые причины завершения сеанса и способы устранения каждой из них:",
"headerCause": "Причина",
"headerFix": "Решение",
"rows": [
{
"cause": "Срок действия JWT сеанса истёк к моменту открытия терминала или переподключения к нему (срок действия — 24 часа).",
"fix": "Обновите страницу и войдите снова. Терминал не предназначен для сеансов без участия пользователя, поэтому срок действия JWT совпадает со сроком действия обычного сеанса входа в панель мониторинга."
},
{
"cause": "Истёк тайм-аут простоя обратного прокси.",
"fix": "Увеличьте значение <code>proxy_read_timeout</code> в Nginx или аналогичного параметра в Caddy / Traefik (примеры конфигурации приведены в разделе «Доступ и аутентификация»)."
},
{
"cause": "Телефон или планшет перешёл в спящий режим.",
"fix": "После выхода устройства из спящего режима вкладка автоматически восстанавливает соединение (тайм-аут для VPN-соединений — 15 секунд). Если этого не произошло, перезагрузите вкладку."
},
{
"cause": "Перезапуск службы на хосте.",
"fix": "Любой перезапуск <code>proxmenux-monitor.service</code> разрывает все сеансы PTY. Откройте новые терминалы после завершения перезагрузки панели мониторинга."
}
]
},
"warning": {
"title": "Терминал предоставляет командную оболочку с правами root на хосте",
"body": "Терминал работает от имени той же учётной записи, что и юнит systemd (<code>root</code>), и поэтому имеет полные права на хосте Proxmox. Прежде чем предоставлять доступ к панели мониторинга за пределами локальной сети, настройте имя пользователя, пароль и 2FA в разделе <authLink>Доступ и аутентификация</authLink>: любой, кто получит доступ к порту 8008 без аутентификации, попадёт непосредственно в командную оболочку с правами root — без дополнительных запросов и без ввода учётных данных SSH. Для доступа извне локальной сети используйте <gatewayLink>Secure Gateway</gatewayLink> (Tailscale) или обратный прокси с HTTPS, а не открывайте порт для доступа из общедоступного интернета."
},
"whereNext": {
"heading": "Что дальше",
"items": [
{
"label": "Доступ и аутентификация",
"href": "/docs/monitor/access-auth",
"tail": " — примеры конфигурации обратного прокси, включая строки переключения протокола WebSocket, необходимые для работы терминала."
},
{
"label": "Архитектура",
"href": "/docs/monitor/architecture",
"tail": " — транспорт WebSocket (HTTP через flask-sock и HTTPS / WSS через gevent)."
},
{
"label": "Справочник API",
"href": "/docs/monitor/api",
"tail": " — конечные точки /ws/terminal и /ws/script/<sid> WebSocket, а также остальные элементы API."
},
{
"label": "Интеграции → Secure Gateway",
"href": "/docs/monitor/integrations",
"tail": " — если вам нужен доступ к терминалу извне локальной сети без открытия порта 8008."
},
{
"label": "Обзор панели мониторинга",
"href": "/docs/monitor/dashboard",
"tail": " — остальные вкладки."
}
]
}
}

Some files were not shown because too many files have changed in this diff Show More