From 111593bc38d7e25c6a130d0ca4ea30aef7ac1825 Mon Sep 17 00:00:00 2001 From: Jonatan Date: Sat, 17 Oct 2026 12:48:02 +0200 Subject: [PATCH 01/73] Fix OCI management after changing Proxmox tags --- .github/workflows/test-oci-registries.yml | 6 + oci/remote/install_oci.sh | 11 +- oci/remote/oci_instance_transaction.py | 16 +- oci/tests/test_external_tags.py | 189 ++++++++++++++++++++++ 4 files changed, 213 insertions(+), 9 deletions(-) create mode 100644 oci/tests/test_external_tags.py diff --git a/.github/workflows/test-oci-registries.yml b/.github/workflows/test-oci-registries.yml index 9612c0d3..235bb0c1 100644 --- a/.github/workflows/test-oci-registries.yml +++ b/.github/workflows/test-oci-registries.yml @@ -32,3 +32,9 @@ jobs: env: PYTHONDONTWRITEBYTECODE: '1' run: python3 -m unittest discover -s oci/tests -p 'test_registry_*.py' -v + - name: Run external OCI settings regressions + env: + PYTHONDONTWRITEBYTECODE: '1' + run: | + python3 -m unittest discover -s oci/tests -p 'test_external_tags.py' -v + python3 -m unittest discover -s oci/tests -p 'test_instance_reconcile.py' -v diff --git a/oci/remote/install_oci.sh b/oci/remote/install_oci.sh index 7d1d8e85..3b549001 100755 --- a/oci/remote/install_oci.sh +++ b/oci/remote/install_oci.sh @@ -1025,15 +1025,18 @@ apply_extra_hosts() { } # Settings an update gives back to the rebuilt container before it starts: -# the LAN leg of a suite or stack member and its start order. +# the LAN leg of a suite or stack member, its start order and current tags. apply_kept_settings() { local key value while IFS=$'\t' read -r key value; do [[ -n $key ]] || continue - [[ $key == net1 || $key == startup ]] \ + [[ $key == net1 || $key == startup || $key == tags ]] \ || die "$(translate "Unsupported kept setting:") $key" - oci_quiet pct set "$VMID" "--$key" "$value" \ - || die "$(translate "Could not restore the container setting:") $key" + if [[ $key == tags && -z $value ]]; then + oci_quiet pct set "$VMID" --delete tags + else + oci_quiet pct set "$VMID" "--$key" "$value" + fi || die "$(translate "Could not restore the container setting:") $key" done < <(jq -r '.kept_proxmox_settings // {} | to_entries[] | [.key, .value] | @tsv' "$DEPLOYMENT_FILE") } diff --git a/oci/remote/oci_instance_transaction.py b/oci/remote/oci_instance_transaction.py index 59579967..cdde917b 100644 --- a/oci/remote/oci_instance_transaction.py +++ b/oci/remote/oci_instance_transaction.py @@ -415,10 +415,9 @@ def candidate_contract(record, operation, proposal=None): return with_default_healthcheck(result) -# Resource settings edited in Proxmox that the new container keeps. # Proxmox settings the rebuilt container gets back exactly as they are: the -# LAN leg ProxMenux adds to a suite or stack member, and the start order. -KEPT_AS_IS = ('net1', 'startup') +# LAN leg ProxMenux adds to a suite or stack member, the start order and tags. +KEPT_AS_IS = ('net1', 'startup', 'tags') ADOPTABLE = {'memory': ('resources', 'memory_mb'), 'swap': ('resources', 'swap_mb'), 'cores': ('resources', 'cores'), 'cpulimit': ('resources', 'cores'), 'cpuunits': ('resources', 'cpu_units'), 'onboot': (None, 'onboot')} @@ -1051,6 +1050,9 @@ def apply(root, vmid, archive, operation, proposal=None, registry_digest=None, i 'original_gpu_devices': original_gpu, 'desired_gpu_devices': desired_gpu, 'was_running': run('pct', 'status', str(vmid)).strip() == b'status: running'} state['kept_config'] = {key: cfg[key] for key in KEPT_AS_IS if key in cfg} + # The installer adds default tags. Preserve an explicit absence too, so + # deleting all tags in Proxmox does not bring them back on the next update. + state['kept_config']['tags'] = cfg.get('tags', '') if not coordinated and state['kept_config']: # Applied by the installer before the new container starts, so the # application has its LAN leg from the first second. @@ -1058,9 +1060,10 @@ def apply(root, vmid, archive, operation, proposal=None, registry_digest=None, i if coordinated: state['coordinated'] = coordinated state['preserved_stack_config'] = {key: cfg[key] for key in ('net1', 'startup', 'hookscript') if key in cfg} + state['preserved_stack_config']['tags'] = cfg.get('tags', '') if operation == 'update': state['preserved_stack_config'].update({key: cfg[key] for key in - ('net0', 'features', 'cmode', 'console', 'tty', 'cpuunits', 'tags') if key in cfg}) + ('net0', 'features', 'cmode', 'console', 'tty', 'cpuunits') if key in cfg}) checkpoint(journal, state, 'prepared') pending = copy.deepcopy(record) pending.update(status='updating', pending_transaction=str(journal), transaction_id=state['id']) @@ -1141,7 +1144,10 @@ def apply(root, vmid, archive, operation, proposal=None, registry_digest=None, i restore_firewall(vmid, state) if coordinated: for key, value in state['preserved_stack_config'].items(): - run('pct', 'set', str(vmid), '--' + key, value) + if key == 'tags' and not value: + run('pct', 'set', str(vmid), '--delete', 'tags') + else: + run('pct', 'set', str(vmid), '--' + key, value) check_runtime_mounts(run('pct', 'config', str(vmid)), candidate['deployment']) gpu_devices.check(run('pct', 'config', str(vmid)), candidate['deployment']) state['staged_config_sha256'] = sha(owned(vmid, record['installation_id'])) diff --git a/oci/tests/test_external_tags.py b/oci/tests/test_external_tags.py new file mode 100644 index 00000000..a28dd420 --- /dev/null +++ b/oci/tests/test_external_tags.py @@ -0,0 +1,189 @@ +"""Proxmox tags can change without preventing OCI management or being lost.""" +import copy +import io +import json +import os +from pathlib import Path +import re +import shutil +import subprocess +import sys +import tempfile +import unittest +from contextlib import redirect_stdout +from unittest.mock import patch + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / 'remote')) + +import oci_instance_reconcile as reconcile +import oci_instance_transaction as transaction +from oci_installation_state import sha + +MARKER = '11111111-1111-4111-8111-111111111111' +BASE = (f'description: proxmenux-instance={MARKER}\n' + 'rootfs: local-lvm:vm-200-disk-0,size=8G\n' + 'unprivileged: 1\ncores: 2\nmemory: 512\n' + 'net0: name=eth0,bridge=vmbr0,hwaddr=02:00:00:00:00:01,ip=dhcp\n' + 'net1: name=eth1,bridge=vmbr1,ip=dhcp\nstartup: order=20\n').encode() + + +def config(tags): + return BASE + (f'tags: {tags}\n'.encode() if tags is not None else b'') + + +def record(tags='oci;proxmenux'): + before = config(tags) + return { + 'schema_version': 1, 'vmid': 200, 'status': 'installed', + 'installation_id': MARKER, + 'template': {'id': 'test-app', 'container_contract': {'volumes': []}}, + 'deployment': { + 'vmid': 200, 'rootfs': {'storage': 'local-lvm', 'size_gb': 8}, + 'network': {}, 'resources': {'cores': 2, 'memory_mb': 512}, + 'mounts': [], 'devices': [], + }, + 'observed': { + 'config': before.decode(), 'config_sha256': sha(before), + 'image': {'architecture': 'amd64', 'manifest_digest': 'sha256:old', + 'defaults': {'Volumes': {}}}, + }, + } + + +class ExternalTagsTests(unittest.TestCase): + def test_adding_editing_reordering_and_removing_tags_need_no_adoption(self): + for old, new in ((None, 'homelab'), ('oci;proxmenux', 'homelab;oci;proxmenux'), + ('oci;proxmenux', 'proxmenux;oci'), ('oci;proxmenux', None), + ('oci;proxmenux', '')): + with self.subTest(old=old, new=new): + saved, current = record(old), config(new) + self.assertIsNone(reconcile.propose(saved, current)) + self.assertEqual(transaction.external_changes(saved, current), {}) + + def test_tags_can_change_together_with_cpu_and_memory(self): + current = config('homelab').replace(b'cores: 2', b'cores: 4').replace(b'memory: 512', b'memory: 2048') + self.assertIsNone(reconcile.propose(record(), current)) + self.assertEqual(transaction.external_changes(record(), current), {'cores': 4, 'memory': 2048}) + + def test_tag_changes_do_not_bypass_identity_or_network_checks(self): + for current in (config('homelab').replace(MARKER.encode(), b'22222222-2222-4222-8222-222222222222'), + config('homelab').replace(b'bridge=vmbr0', b'bridge=vmbr2')): + with self.subTest(config=current): + with self.assertRaises(ValueError): + reconcile.propose(record(), current) + with self.assertRaises(ValueError): + transaction.external_changes(record(), current) + + def test_new_volume_still_requires_adoption_when_tags_also_change(self): + saved = record() + current = config('homelab') + b'mp0: local-lvm:vm-200-disk-1,mp=/data,size=8G,backup=1\n' + with tempfile.TemporaryDirectory() as folder: + root = Path(folder) + path = root / '200/oci-compose.json' + path.parent.mkdir() + path.write_text(json.dumps(saved)) + with patch.object(reconcile.instances, 'ROOT', root): + proposal = reconcile.propose(saved, current) + self.assertEqual(proposal['candidate']['deployment']['mounts'][0]['container_path'], '/data') + self.assertEqual(len(proposal['details']), 1) + self.assertEqual(json.loads(path.read_text()), saved) + + +class Prepared(Exception): + """Stop a mocked transaction before it can stop or modify any container.""" + + +class TagReplayTests(unittest.TestCase): + def prepare(self, folder, tags, operation, coordinated=None): + current, saved = config(tags), record() + archive = folder / 'image.tar' + archive.write_bytes(b'fixture') + states = [] + + def checkpoint(_path, state, phase): + self.assertEqual(phase, 'prepared') + states.append(copy.deepcopy(state)) + raise Prepared() + + def command(*args): + if args[:2] == ('pct', 'config'): + return current + if args[:3] == ('pvesh', 'get', '/cluster/ha/resources'): + return b'[]' + if args[:2] == ('pct', 'status'): + return b'status: running' + self.fail(f'Unexpected host command: {args}') + + proposal = {'operation': 'recreate', 'candidate': copy.deepcopy(saved)} if operation == 'recreate' else None + image = {'architecture': 'amd64', 'os': 'linux', 'manifest_digest': 'sha256:new', 'defaults': {}} + with (patch.object(transaction.instances, 'read', return_value=saved), + patch.object(transaction, 'run', side_effect=command), + patch.object(transaction, 'check_archive'), + patch.object(transaction, 'image_from_archive', return_value=image), + patch.object(transaction.work_backup, 'locate', side_effect=lambda directory, *_: directory), + patch.object(transaction, 'open_log'), + patch.object(transaction, 'checkpoint', side_effect=checkpoint), + redirect_stdout(io.StringIO()), self.assertRaises(Prepared)): + transaction.apply(folder, 200, archive, operation, proposal=proposal, coordinated=coordinated) + return states[0] + + @unittest.skipUnless(shutil.which('bash') and shutil.which('jq'), 'bash and jq are needed') + def test_update_and_modify_replay_current_tags_including_no_tags(self): + installer = (ROOT / 'remote/install_oci.sh').read_text() + function = re.search(r'^apply_kept_settings\(\) \{\n.*?^\}\n', installer, re.M | re.S) + self.assertIsNotNone(function) + for operation in ('update', 'recreate'): + for tags in ('homelab;oci;proxmenux', 'oci', None, ''): + with self.subTest(operation=operation, tags=tags), tempfile.TemporaryDirectory() as name: + folder = Path(name) + state = self.prepare(folder, tags, operation) + kept = state['runtime_deployment']['kept_proxmox_settings'] + deployment = folder / 'deployment.json' + deployment.write_text(json.dumps({'kept_proxmox_settings': kept})) + calls = folder / 'calls' + script = ''' +pct() { printf '%s\\0' "$@" >> "$CALLS"; printf '\\n' >> "$CALLS"; } +oci_quiet() { "$@"; } +translate() { printf '%s' "$1"; } +die() { printf '%s\\n' "$*" >&2; exit 1; } +''' + done = subprocess.run(['bash', '-euc', script + function.group(0) + '\napply_kept_settings'], + env=dict(os.environ, VMID='200', DEPLOYMENT_FILE=str(deployment), CALLS=str(calls)), + capture_output=True, text=True) + self.assertEqual(done.returncode, 0, done.stderr) + commands = [line.split(b'\0')[:-1] for line in calls.read_bytes().splitlines()] + expected = [b'set', b'200', b'--tags', tags.encode()] if tags else [b'set', b'200', b'--delete', b'tags'] + self.assertIn(expected, commands) + self.assertIn([b'set', b'200', b'--net1', b'name=eth1,bridge=vmbr1,ip=dhcp'], commands) + self.assertIn([b'set', b'200', b'--startup', b'order=20'], commands) + + def test_stack_operations_also_preserve_tags_and_their_absence(self): + for operation in ('update', 'recreate'): + for tags in ('homelab;oci', None, ''): + with self.subTest(operation=operation, tags=tags), tempfile.TemporaryDirectory() as name: + state = self.prepare(Path(name), tags, operation, coordinated={'stack': 'test'}) + self.assertEqual(state['preserved_stack_config']['tags'], tags or '') + + @unittest.skipUnless(shutil.which('bash') and shutil.which('jq'), 'bash and jq are needed') + def test_installer_still_refuses_unsupported_kept_settings(self): + installer = (ROOT / 'remote/install_oci.sh').read_text() + function = re.search(r'^apply_kept_settings\(\) \{\n.*?^\}\n', installer, re.M | re.S).group(0) + with tempfile.TemporaryDirectory() as name: + deployment = Path(name) / 'deployment.json' + deployment.write_text(json.dumps({'kept_proxmox_settings': {'unprivileged': '0'}})) + script = ''' +oci_quiet() { echo 'must not run' >&2; exit 99; } +translate() { printf '%s' "$1"; } +die() { printf '%s\\n' "$*" >&2; exit 1; } +''' + done = subprocess.run(['bash', '-euc', script + function + '\napply_kept_settings'], + env=dict(os.environ, VMID='200', DEPLOYMENT_FILE=str(deployment)), + capture_output=True, text=True) + self.assertEqual(done.returncode, 1) + self.assertIn('Unsupported kept setting: unprivileged', done.stderr) + self.assertNotIn('must not run', done.stderr) + + +if __name__ == '__main__': + unittest.main() From b7b412b45de3ad2032ab88692ba38c0c151303ef Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Sat, 17 Oct 2026 11:23:38 +0000 Subject: [PATCH 02/73] fix(oci): harden runtime HOME resolution --- oci/remote/install_oci.sh | 2 +- oci/remote/oci_runtime.py | 37 +++- oci/tests/test_runtime_home_contract.py | 4 +- oci/tests/test_runtime_home_hardening.py | 260 +++++++++++++++++++++++ 4 files changed, 295 insertions(+), 8 deletions(-) create mode 100644 oci/tests/test_runtime_home_hardening.py diff --git a/oci/remote/install_oci.sh b/oci/remote/install_oci.sh index 7d1d8e85..88d5f0fe 100755 --- a/oci/remote/install_oci.sh +++ b/oci/remote/install_oci.sh @@ -1091,7 +1091,7 @@ ensure_runtime_home() { passwd_file="${rootfs}/etc/passwd" mount_ct_rootfs if ! home=$(python3 "$OCI_RUNTIME_RESOLVER" --home "$passwd_file" "$uid" 2>>"${OCI_LOG:-/dev/stderr}"); then - oci_quiet pct unmount "$VMID" || true + oci_quiet pct unmount "$VMID" || die "$(translate "Could not unmount the container filesystem")" return 0 fi oci_quiet pct unmount "$VMID" || die "$(translate "Could not unmount the container filesystem")" diff --git a/oci/remote/oci_runtime.py b/oci/remote/oci_runtime.py index ee3b9d56..3d842fd3 100644 --- a/oci/remote/oci_runtime.py +++ b/oci/remote/oci_runtime.py @@ -4,7 +4,9 @@ from __future__ import annotations import json +import os import shlex +import stat import sys import tarfile from pathlib import Path @@ -90,14 +92,39 @@ def effective_entrypoint( def home_directory(passwd_path: Path, uid: int) -> str | None: - """Return the safe home directory recorded for a container UID.""" - for line in passwd_path.read_text(encoding="utf-8").splitlines(): + """Read a regular image passwd file; only an absent UID defaults to /.""" + if uid < 0: + return None + # The caller supplies /etc/passwd. Pin etc so an image + # symlink or a rename during lookup cannot redirect the host-side read. + directory = os.open(passwd_path.parent, os.O_RDONLY | os.O_DIRECTORY | os.O_NOFOLLOW) + try: + if not stat.S_ISREG(os.stat(passwd_path.name, dir_fd=directory, follow_symlinks=False).st_mode): + return None + descriptor = os.open( + passwd_path.name, os.O_RDONLY | os.O_NOFOLLOW | os.O_NONBLOCK, dir_fd=directory, + ) + try: + # Recheck the opened object, not its name; a FIFO replacement + # must neither block open() nor reach a read operation. + if not stat.S_ISREG(os.fstat(descriptor).st_mode): + return None + with os.fdopen(descriptor, encoding="utf-8", closefd=False) as stream: + content = stream.read() + finally: + os.close(descriptor) + finally: + os.close(directory) + for line in content.splitlines(): fields = line.split(":") - if len(fields) < 7 or fields[2] != str(uid): + if len(fields) < 3 or fields[2] != str(uid): continue + if len(fields) != 7: + return None home = fields[5] - return home if home.startswith("/") else None - return None + safe = home.startswith("/") and not any(ord(char) < 32 or ord(char) == 127 for char in home) + return home if safe else None + return "/" def main() -> int: diff --git a/oci/tests/test_runtime_home_contract.py b/oci/tests/test_runtime_home_contract.py index c14e8e26..25e9ca9e 100644 --- a/oci/tests/test_runtime_home_contract.py +++ b/oci/tests/test_runtime_home_contract.py @@ -31,14 +31,14 @@ class RuntimeHomeResolutionTests(unittest.TestCase): ) self.assertEqual(oci_runtime.home_directory(passwd, 1001), "/srv/app") - def test_unknown_or_unsafe_home_is_not_invented(self): + def test_unsafe_record_is_rejected_but_unknown_uid_defaults_to_root(self): passwd = self.passwd( "root:x:0:0:root:relative-home:/bin/sh\n" "app:x:1001:1001:App user::/sbin/nologin\n" ) self.assertIsNone(oci_runtime.home_directory(passwd, 0)) self.assertIsNone(oci_runtime.home_directory(passwd, 1001)) - self.assertIsNone(oci_runtime.home_directory(passwd, 1234)) + self.assertEqual(oci_runtime.home_directory(passwd, 1234), "/") class RuntimeHomeInstallerContractTests(unittest.TestCase): diff --git a/oci/tests/test_runtime_home_hardening.py b/oci/tests/test_runtime_home_hardening.py new file mode 100644 index 00000000..6418709d --- /dev/null +++ b/oci/tests/test_runtime_home_hardening.py @@ -0,0 +1,260 @@ +"""Exercise HOME resolution without reading image symlinks or changing guests.""" + +from contextlib import redirect_stderr, redirect_stdout +import io +import os +from pathlib import Path +import re +import subprocess +import sys +import tempfile +import unittest +from unittest.mock import patch + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "remote")) +import oci_runtime + + +class HomeHardeningTests(unittest.TestCase): + def setUp(self): + temporary = tempfile.TemporaryDirectory() + self.addCleanup(temporary.cleanup) + self.root = Path(temporary.name) + (self.root / "etc").mkdir() + self.passwd = self.root / "etc/passwd" + self.passwd.write_text("root:x:0:0:root:/root:/bin/sh\n", encoding="utf-8") + + def cli(self, uid="1234"): + output, error = io.StringIO(), io.StringIO() + with patch.object(sys, "argv", ["oci_runtime.py", "--home", str(self.passwd), uid]), \ + redirect_stdout(output), redirect_stderr(error): + status = oci_runtime.main() + return status, output.getvalue(), error.getvalue() + + def assert_rejected_without_read(self): + with patch.object(os, "fdopen", side_effect=AssertionError("unsafe file read")): + status, output, _ = self.cli() + self.assertEqual(status, 1) + self.assertEqual(output, "") + + def test_unknown_uid_uses_root_only_after_reading_a_regular_database(self): + self.assertEqual(self.cli(), (0, "/\n", "")) + + def test_empty_regular_database_uses_root(self): + self.passwd.write_text("") + self.assertEqual(self.cli(), (0, "/\n", "")) + + def test_final_symlink_is_rejected_without_reading_its_target(self): + target = self.root / "outside" + target.write_text("app:x:1234:1234::/host-secret:/bin/sh\n") + self.passwd.unlink() + self.passwd.symlink_to(target) + self.assert_rejected_without_read() + self.assertEqual(target.read_text(), "app:x:1234:1234::/host-secret:/bin/sh\n") + + def test_symlinked_etc_is_rejected_without_reading_its_target(self): + directory = self.root / "etc" + directory.rename(self.root / "outside-etc") + directory.symlink_to(self.root / "outside-etc", target_is_directory=True) + self.assert_rejected_without_read() + self.assertEqual(self.cli("0")[:2], (1, "")) + + def test_pinned_etc_does_not_follow_a_later_directory_replacement(self): + original_open = os.open + outside = self.root / "outside" + outside.mkdir() + (outside / "passwd").write_text("root:x:0:0::/outside:/bin/sh\n") + replaced = [] + def replace(path, flags, *args, **kwargs): + if str(path) == "passwd": + (self.root / "etc").rename(self.root / "original-etc") + (self.root / "etc").symlink_to(outside, target_is_directory=True) + replaced.append(True) + return original_open(path, flags, *args, **kwargs) + with patch.object(os, "open", side_effect=replace): + self.assertEqual(self.cli("0"), (0, "/root\n", "")) + self.assertEqual(replaced, [True]) + + def test_directory_is_rejected_without_reading(self): + self.passwd.unlink() + self.passwd.mkdir() + self.assert_rejected_without_read() + + def test_fifo_is_rejected_without_reading_or_waiting_for_a_writer(self): + self.passwd.unlink() + os.mkfifo(self.passwd) + done = subprocess.run( + [sys.executable, "-B", str(ROOT / "remote/oci_runtime.py"), "--home", str(self.passwd), "0"], + capture_output=True, text=True, timeout=3, + ) + self.assertEqual(done.returncode, 1) + self.assertEqual(done.stdout, "") + self.assert_rejected_without_read() + + def test_missing_database_does_not_masquerade_as_unknown_uid(self): + self.passwd.unlink() + self.assert_rejected_without_read() + + def test_permission_failure_does_not_masquerade_as_unknown_uid(self): + with patch.object(os, "open", side_effect=PermissionError("denied")): + self.assert_rejected_without_read() + + def test_invalid_encoding_does_not_produce_a_fallback(self): + self.passwd.write_bytes(b"\xff\xfe") + status, output, _ = self.cli() + self.assertEqual((status, output), (1, "")) + + def test_partial_matching_record_does_not_produce_a_fallback(self): + self.passwd.write_text("app:x:1234:1234\n") + self.assertEqual(self.cli()[:2], (1, "")) + + def test_read_error_closes_both_descriptors_without_a_fallback(self): + descriptors = [] + original_open = os.open + def opened(*args, **kwargs): + fd = original_open(*args, **kwargs) + descriptors.append(fd) + return fd + with patch.object(os, "open", side_effect=opened), \ + patch.object(os, "fdopen", side_effect=OSError("read failed")): + self.assertEqual(self.cli()[:2], (1, "")) + self.assertEqual(len(descriptors), 2) + for fd in descriptors: + with self.assertRaises(OSError): + os.fstat(fd) + + def test_matching_unsafe_home_is_not_replaced_with_root(self): + for value in ("", "relative", "/bad\tvalue", "/bad\x00value", "/bad\x7fvalue"): + with self.subTest(value=repr(value)): + self.passwd.write_text(f"app:x:1234:1234::{value}:/bin/sh\n") + self.assertEqual(self.cli()[:2], (1, "")) + + def test_invalid_uid_does_not_open_the_database(self): + for uid in ("-1", "nobody"): + with self.subTest(uid=uid), patch.object(os, "open") as opened: + self.assertEqual(self.cli(uid)[:2], (1, "")) + opened.assert_not_called() + + def test_symlink_replacement_between_check_and_open_is_not_read(self): + original_open = os.open + outside = self.root / "outside" + outside.write_text("app:x:1234:1234::/outside:/bin/sh\n") + def replace(path, flags, *args, **kwargs): + if str(path) == "passwd": + self.passwd.unlink() + self.passwd.symlink_to(outside) + return original_open(path, flags, *args, **kwargs) + with patch.object(os, "open", side_effect=replace): + self.assert_rejected_without_read() + + def test_fifo_replacement_between_check_and_open_is_not_read(self): + original_open = os.open + def replace(path, flags, *args, **kwargs): + if str(path) == "passwd": + self.passwd.unlink() + os.mkfifo(self.passwd) + return original_open(path, flags, *args, **kwargs) + with patch.object(os, "open", side_effect=replace): + self.assert_rejected_without_read() + + +class HomeInstallerExecutionTests(unittest.TestCase): + """Run the real shell HOME function and Python CLI with fake mount boundaries.""" + def setUp(self): + temporary = tempfile.TemporaryDirectory() + self.addCleanup(temporary.cleanup) + self.root = Path(temporary.name) + (self.root / "etc").mkdir() + self.passwd = self.root / "etc/passwd" + self.passwd.write_text("root:x:0:0:root:/root:/bin/sh\napp:x:1001:1001::/srv/app:/bin/sh\n") + self.conf = self.root / "guest.conf" + self.trace = self.root / "trace" + self.source = (ROOT / "remote/install_oci.sh").read_text() + + def run_home(self, config="unrelated: keep\n", unmount_status=0, mount_status=0): + self.conf.write_text(config) + self.trace.write_text("") + functions = [] + for name in ("ensure_runtime_home", "set_runtime_environment"): + found = re.search(rf"^{name}\(\) \{{\n.*?^\}}\n", self.source, re.M | re.S) + self.assertIsNotNone(found, name) + functions.append(found.group(0)) + script = r''' +set -euo pipefail +CONF=$1 +FIXTURE_ROOT=$2 +TRACE=$3 +OCI_RUNTIME_RESOLVER=$4 +PYTHON=$5 +UNMOUNT_STATUS=$6 +MOUNT_STATUS=$7 +OCI_LOG="$FIXTURE_ROOT/resolver.log" +VMID=123456789 +translate() { printf '%s' "$1"; } +die() { printf '%s\n' "$*" >&2; exit 1; } +mount_ct_rootfs() { + printf 'mount\n' >> "$TRACE" + [ "$MOUNT_STATUS" = 0 ] || die 'mount failed' + rootfs=$FIXTURE_ROOT + passwd_file="$rootfs/etc/passwd" +} +oci_quiet() { printf '%s\n' "$*" >> "$TRACE"; return "$UNMOUNT_STATUS"; } +python3() { printf 'resolve\n' >> "$TRACE"; command "$PYTHON" -B "$@"; } +''' + done = subprocess.run( + ["bash", "-c", script + "\n".join(functions) + "\nensure_runtime_home\nprintf 'continued\\n'\n", + "bash", str(self.conf), str(self.root), str(self.trace), str(ROOT / "remote/oci_runtime.py"), + sys.executable, str(unmount_status), str(mount_status)], + capture_output=True, text=True, timeout=5, + ) + return done, self.conf.read_text(), self.trace.read_text().splitlines() + + def test_explicit_home_including_empty_never_mounts_or_resolves(self): + for home in ("/custom", ""): + config = f"unrelated: keep\nlxc.environment.runtime: HOME={home}\n" + done, after, trace = self.run_home(config) + self.assertEqual((done.returncode, after, trace), (0, config, [])) + + def test_default_and_effective_uid_write_the_resolved_home_after_unmount(self): + for uid, expected in ((None, "/root"), (1001, "/srv/app"), (9999, "/")): + config = "unrelated: keep\n" + (f"lxc.init.uid: {uid}\n" if uid is not None else "") + done, after, trace = self.run_home(config) + self.assertEqual(done.returncode, 0, done.stderr) + self.assertEqual(after, config + f"lxc.environment.runtime: HOME={expected}\n") + self.assertEqual(trace, ["mount", "resolve", "pct unmount 123456789"]) + + def test_invalid_uid_leaves_config_unchanged_without_mount(self): + config = "lxc.init.uid: not-a-uid\n" + done, after, trace = self.run_home(config) + self.assertEqual((done.returncode, after, trace), (0, config, [])) + + def test_rejected_input_unmounts_and_preserves_config(self): + self.passwd.unlink() + self.passwd.symlink_to(self.root / "missing") + config = "unrelated: keep\n" + done, after, trace = self.run_home(config) + self.assertEqual((done.returncode, after), (0, config)) + self.assertEqual(trace, ["mount", "resolve", "pct unmount 123456789"]) + + def test_failed_unmount_stops_before_config_write_for_success_and_failure(self): + for valid in (True, False): + if not valid: + self.passwd.unlink() + config = "unrelated: keep\n" + done, after, trace = self.run_home(config, unmount_status=1) + self.assertNotEqual(done.returncode, 0) + self.assertEqual(after, config) + self.assertNotIn("continued", done.stdout) + self.assertEqual(trace, ["mount", "resolve", "pct unmount 123456789"]) + + def test_failed_mount_never_reads_or_writes(self): + config = "unrelated: keep\n" + done, after, trace = self.run_home(config, mount_status=1) + self.assertNotEqual(done.returncode, 0) + self.assertEqual(after, config) + self.assertEqual(trace, ["mount"]) + + +if __name__ == "__main__": + unittest.main() From e89f2596b2f0270a49178c1c3f0c73846d53fdb7 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Wed, 14 Oct 2026 16:09:07 +0000 Subject: [PATCH 03/73] feat: discover native LXC applications on demand with evidence --- .github/scripts/run_offline_qualified.py | 2 + .github/workflows/test-offline-qualified.yml | 8 +- AppImage/components/lxc-app-panel.tsx | 119 ++++- AppImage/messages/en/common.json | 10 + AppImage/messages/sk/common.json | 10 + AppImage/scripts/build_appimage.sh | 1 + AppImage/scripts/flask_server.py | 16 + AppImage/scripts/lxc_apps.py | 7 + AppImage/scripts/native_app_discovery.py | 487 ++++++++++++++++++ .../tests/test_native_app_discovery.py | 441 ++++++++++++++++ CONTRIBUTING.md | 6 +- .../test_native_app_discovery_ui.cjs | 164 ++++++ 12 files changed, 1248 insertions(+), 23 deletions(-) create mode 100644 AppImage/scripts/native_app_discovery.py create mode 100644 AppImage/scripts/tests/test_native_app_discovery.py create mode 100644 tests/lxc_updates/test_native_app_discovery_ui.cjs diff --git a/.github/scripts/run_offline_qualified.py b/.github/scripts/run_offline_qualified.py index 9bd13abc..fe6c26d4 100644 --- a/.github/scripts/run_offline_qualified.py +++ b/.github/scripts/run_offline_qualified.py @@ -13,6 +13,7 @@ import sys import tempfile PYTHON_FILES = ( + "AppImage/scripts/tests/test_native_app_discovery.py", "tests/test_audit_presentation.py", "tests/test_audit_safety_wording.py", "tests/test_audit_policy.py", @@ -24,6 +25,7 @@ PYTHON_FILES = ( "AppImage/scripts/tests/test_health_persistence_recurrence.py", ) NODE_FILES = ( + "tests/lxc_updates/test_native_app_discovery_ui.cjs", "tests/lxc_updates/test_docker_delegated_ui.cjs", "tests/test_audit_diagnostic_document.cjs", "tests/test_audit_policy.cjs", diff --git a/.github/workflows/test-offline-qualified.yml b/.github/workflows/test-offline-qualified.yml index 29af7416..a562c6b3 100644 --- a/.github/workflows/test-offline-qualified.yml +++ b/.github/workflows/test-offline-qualified.yml @@ -12,6 +12,7 @@ on: - 'AppImage/package-lock.json' - 'AppImage/scripts/*.py' - 'AppImage/scripts/tests/test_health_persistence_recurrence.py' + - 'AppImage/scripts/tests/test_native_app_discovery.py' - 'AppImage/app/**' - 'AppImage/components/**' - 'AppImage/hooks/**' @@ -32,6 +33,7 @@ on: - 'AppImage/package-lock.json' - 'AppImage/scripts/*.py' - 'AppImage/scripts/tests/test_health_persistence_recurrence.py' + - 'AppImage/scripts/tests/test_native_app_discovery.py' - 'AppImage/app/**' - 'AppImage/components/**' - 'AppImage/hooks/**' @@ -56,7 +58,9 @@ jobs: - uses: actions/setup-python@v5 with: python-version: '3.11' - - name: Run nine qualified Python files + - name: Install native discovery route fixture dependency + run: python3 -m pip install 'Flask>=3,<4' + - name: Run qualified Python files env: PYTHONDONTWRITEBYTECODE: '1' run: python3 -I -B .github/scripts/run_offline_qualified.py --lane python @@ -82,7 +86,7 @@ jobs: run: | npm ci --prefix .github/ci/offline-node --legacy-peer-deps --ignore-scripts --no-audit --no-fund ln -s ../.github/ci/offline-node/node_modules AppImage/node_modules - - name: Run eleven qualified Node files + - name: Run qualified Node files env: NODE_PATH: ${{ github.workspace }}/AppImage/node_modules PYTHONDONTWRITEBYTECODE: '1' diff --git a/AppImage/components/lxc-app-panel.tsx b/AppImage/components/lxc-app-panel.tsx index 59939f0b..666009cb 100644 --- a/AppImage/components/lxc-app-panel.tsx +++ b/AppImage/components/lxc-app-panel.tsx @@ -19,7 +19,7 @@ * Secure Gateway. */ -import { useCallback, useEffect, useMemo, useState } from "react" +import { useCallback, useEffect, useMemo, useRef, useState } from "react" import { Loader2, Save, RefreshCw, Trash2, Package, ExternalLink, AlertTriangle, Info, PlusCircle, Pencil, ChevronDown, ChevronRight, EyeOff, @@ -93,6 +93,7 @@ interface AppConfig { health_path?: string logo_url?: string helper_slug?: string + discovery_id?: string // Set when the application runs inside Docker: registered for its identity // and installed version, updated by the image it comes from. update_via?: string @@ -121,7 +122,18 @@ interface PortDetail { logo_url: string } +interface NativeDiscovery { + vmid: number + status: "not_scanned" | "complete" | "partial" | "error" | "busy" + stale: boolean + candidates: DetectedApp[] +} + interface DetectedApp { + discovery_id?: string + source?: "native_metadata" + installed_version?: string | null + evidence?: Array<{ kind: string; value: string }> slug: string name: string logo_url?: string | null @@ -462,12 +474,34 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: const [loading, setLoading] = useState(!seed) const [sidecar, setSidecar] = useState(seed?.sidecar ?? null) const [suggestions, setSuggestions] = useState(seed?.suggestions ?? null) + const [nativeDiscovery, setNativeDiscovery] = useState(null) + const targetRef = useRef(vmid) + targetRef.current = vmid + const targetGeneration = useRef(0) + const previousTarget = useRef(vmid) + if (previousTarget.current !== vmid) { + previousTarget.current = vmid + targetGeneration.current += 1 + } + useEffect(() => { + const generation = targetGeneration.current + setNativeDiscovery(null) + setEditing(null) + setDetectionNotice(null) + setSearchingApplications(false) + setSaving(false) + if (managed) return + fetchApi(`/api/vms/${vmid}/apps/native-discovery`).then(result => { + if (targetRef.current === vmid && targetGeneration.current === generation) setNativeDiscovery(result) + }).catch(() => { /* cached metadata is optional; never initiate a scan */ }) + return () => { targetGeneration.current += 1 } + }, [vmid, managed]) const [adguardSetupAvailable, setAdguardSetupAvailable] = useState(false) const [error, setError] = useState(null) const [searchingApplications, setSearchingApplications] = useState(false) const [detectionNotice, setDetectionNotice] = useState<{ found: boolean; text: string } | null>(null) // Editor state - const [editing, setEditing] = useState<{ appId: string | null; draft: AppConfig } | null>(null) + const [editing, setEditing] = useState<{ appId: string | null; draft: AppConfig; targetVmid: number } | null>(null) const [binaryArgsInput, setBinaryArgsInput] = useState("") const [commandArgvInput, setCommandArgvInput] = useState("") const [saving, setSaving] = useState(false) @@ -522,6 +556,8 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: // `initialData` or the shared cache, the sidecar is already // populated and the user shouldn't see a flash of "Loading…" // while we revalidate. + const generation = targetGeneration.current + const isCurrent = () => targetRef.current === vmid && targetGeneration.current === generation if (!sidecar) setLoading(true) setError(null) try { @@ -533,14 +569,14 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: // the "Loading applications…" flash that used to show while a // second, racing fetch caught up. const bundle = await fetchLxcApps(vmid) - if (bundle) { + if (bundle && isCurrent()) { setSidecar(bundle.sidecar) setSuggestions(bundle.suggestions) } } catch (e: any) { - setError(e?.message || t("vmLxc.appEditor.loadFailed")) + if (isCurrent()) setError(e?.message || t("vmLxc.appEditor.loadFailed")) } finally { - setLoading(false) + if (isCurrent()) setLoading(false) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [vmid, managed]) @@ -617,7 +653,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: return msg } - const editorOpen = !!editing + const editorOpen = !!editing && editing.targetVmid === vmid // The picker catalog is only needed after the user opens the editor. useEffect(() => { @@ -653,8 +689,8 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: // (`extras[]` from the backend). Both use the same DetectedApp // shape so the empty state renders them uniformly. const detectedList: DetectedApp[] = useMemo(() => { - if (!suggestions) return [] - const out: DetectedApp[] = [] + const out: DetectedApp[] = [...(nativeDiscovery?.vmid === vmid ? nativeDiscovery.candidates : [])] + if (!suggestions) return out // A ProxMenux OCI install has no helper slug — nothing was installed by a // community script — so its template id identifies it instead. const primarySlug = suggestions.helper_slug || suggestions.oci_instance?.template_id @@ -679,12 +715,12 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: } } return out - }, [suggestions]) + }, [suggestions, nativeDiscovery, vmid]) // Registered slugs — used to filter the detection list down to // what the user hasn't already registered on this CT. const registeredSlugs = useMemo( - () => new Set(apps.map((a) => a.helper_slug).filter(Boolean) as string[]), + () => new Set(apps.flatMap((a) => [a.helper_slug, a.discovery_id]).filter(Boolean) as string[]), [apps], ) // Dismissed slugs — persisted in the sidecar. Chips the user @@ -750,14 +786,30 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: } const searchInstalledApplications = async () => { + const generation = targetGeneration.current + const isCurrent = () => targetRef.current === vmid && targetGeneration.current === generation const before = new Set([...visibleDetected, ...visibleWorkloads].map((item) => item.slug)) setSearchingApplications(true) setDetectionNotice(null) setError(null) try { + let native = await fetchApi(`/api/vms/${vmid}/apps/native-discovery`, { + method: "POST", + }) + if (!isCurrent()) return + setNativeDiscovery(native) + if (native.status === "error" || native.status === "busy") { + setDetectionNotice({ found: false, text: t("vmLxc.appEditor.nativeScanFailed") }) + return + } const result: Suggestions = await fetchApi(`/api/vms/${vmid}/apps/suggestions`, { method: "POST", }) + if (!isCurrent()) return + // Recompose against the refreshed catalog without another native scan. + native = await fetchApi(`/api/vms/${vmid}/apps/native-discovery`) + if (!isCurrent()) return + setNativeDiscovery(native) setSuggestions(result) if (sidecar) setLxcAppsCached(vmid, sidecar, result) @@ -765,11 +817,14 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: if (result.helper_slug) detected.add(result.helper_slug) for (const item of result.extras || []) detected.add(item.slug) for (const item of result.docker_workloads || []) detected.add(item.slug) + for (const item of native.candidates) detected.add(item.slug) const visible = [...detected].filter( (slug) => !registeredSlugs.has(slug) && !dismissedSlugs.has(slug), ) const newCount = visible.filter((slug) => !before.has(slug)).length - if (newCount === 1) { + if (native.status === "partial") { + setDetectionNotice({ found: visible.length > 0, text: t("vmLxc.appEditor.nativeScanPartial") }) + } else if (newCount === 1) { setDetectionNotice({ found: true, text: t("vmLxc.appEditor.oneNewApplicationDetected") }) } else if (newCount > 1) { setDetectionNotice({ @@ -785,9 +840,9 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: }) } } catch (e: any) { - setError(e?.message || t("vmLxc.appEditor.detectionFailed")) + if (isCurrent()) setError(e?.message || t("vmLxc.appEditor.detectionFailed")) } finally { - setSearchingApplications(false) + if (isCurrent()) setSearchingApplications(false) } } @@ -804,6 +859,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: existing?: AppEntry, opts?: { withTracking?: boolean, preset?: DetectedApp }, ) => { + const generation = targetGeneration.current let seed: AppConfig if (existing) { seed = { @@ -832,6 +888,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: health_path: existing.health_path || "", logo_url: existing.logo_url || "", helper_slug: existing.helper_slug || "", + ...(existing.discovery_id ? { discovery_id: existing.discovery_id } : {}), // Preserved explicitly: saving replaces the whole record, so dropping // it here would silently un-delegate the app the first time someone // edits one of its ports. @@ -862,7 +919,11 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: const p = opts.preset seed.name = p.name seed.logo_url = p.logo_url || "" - seed.helper_slug = p.slug + if (p.discovery_id) { + seed.discovery_id = p.discovery_id + seed.update_method = "none" + seed.update_command = "" + } else seed.helper_slug = p.slug // Docker endpoints come from the real published host-port mappings // listed under Web links. Do not pre-save a catalog default such as // 9000; the user explicitly chooses which workload links to add. @@ -943,9 +1004,10 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: setShowAdvanced(false) } } + if (targetRef.current !== vmid || targetGeneration.current !== generation) return setBinaryArgsInput((seed.binary_args || []).join(", ")) setCommandArgvInput((seed.command_argv || []).join(", ")) - setEditing({ appId: existing?.id || null, draft: seed }) + setEditing({ appId: existing?.id || null, draft: seed, targetVmid: vmid }) setDetectorTest(null) setError(null) }, [suggestions, vmid, sidecar, isOciAdguard, adguardSetupAvailable]) @@ -959,7 +1021,9 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: } const save = async () => { - if (!editing) return + if (!editing || editing.targetVmid !== vmid || targetRef.current !== vmid) return + const generation = targetGeneration.current + const isCurrent = () => targetRef.current === vmid && targetGeneration.current === generation setSaving(true) setError(null) try { @@ -973,6 +1037,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: body: JSON.stringify(editing.draft), }) if ((r as any).error) throw new Error((r as any).error) + if (!isCurrent()) return setSidecar(r) setLxcAppsCached(vmid, r, suggestions) setEditing(null) @@ -980,9 +1045,9 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: setCommandArgvInput("") onChange?.() } catch (e: any) { - setError(e?.message || t("vmLxc.appEditor.saveFailed")) + if (isCurrent()) setError(e?.message || t("vmLxc.appEditor.saveFailed")) } finally { - setSaving(false) + if (isCurrent()) setSaving(false) } } @@ -2452,6 +2517,24 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: ? t("vmLxc.appEditor.versionDetected", { version: d.tracking_suggestion.detected_version || "" }) : t("vmLxc.appEditor.detectedInContainer")} + {d.source === "native_metadata" && ( +
+
{d.installed_version + ? t("vmLxc.appEditor.versionDetected", { version: d.installed_version }) + : t("vmLxc.appEditor.nativeVersionUnknown")}
+ {(nativeDiscovery?.stale || nativeDiscovery?.status === "partial") && ( +
{t("vmLxc.appEditor.nativeEvidenceStale")}
+ )} + {d.evidence?.map((e, index) =>
+ {t(e.kind === "tcp_listener" ? "vmLxc.appEditor.nativeEvidencePort" + : e.kind === "installation_file" ? "vmLxc.appEditor.nativeEvidenceFile" + : e.kind === "process_executable" ? "vmLxc.appEditor.nativeEvidenceProcess" + : e.kind === "working_directory" ? "vmLxc.appEditor.nativeEvidenceDirectory" + : "vmLxc.appEditor.nativeEvidenceService")}: {e.value} +
)} +
{t("vmLxc.appEditor.nativeRegisterOnly")}
+
+ )} {d.tracking_suggestion?.detector_source === "legacy_fallback" && (
{t("vmLxc.appEditor.legacyDetectorUsed")} diff --git a/AppImage/messages/en/common.json b/AppImage/messages/en/common.json index fa596302..64129339 100644 --- a/AppImage/messages/en/common.json +++ b/AppImage/messages/en/common.json @@ -1730,6 +1730,16 @@ "searchApplications": "Find applications", "searchingApplications": "Searching applications…", "noApplicationsDetected": "No applications were detected.", + "nativeEvidencePort": "Listening TCP port", + "nativeEvidenceFile": "Installed file", + "nativeEvidenceProcess": "Running executable", + "nativeEvidenceDirectory": "Working directory", + "nativeEvidenceService": "Service definition", + "nativeScanFailed": "Application search could not finish. Previous evidence may be outdated; try again.", + "nativeScanPartial": "Application search is incomplete. Review the available evidence and try again.", + "nativeVersionUnknown": "Installed version unknown", + "nativeEvidenceStale": "Evidence may be outdated or incomplete.", + "nativeRegisterOnly": "Confirm registration in the editor. A known version is a manual value; no updater is configured.", "noNewApplicationsDetected": "No new applications were detected.", "dockerDetectedWithWorkloads": "Docker detected with {count} containerised application(s)", "dockerWorkloadsHeading": "Running inside Docker", diff --git a/AppImage/messages/sk/common.json b/AppImage/messages/sk/common.json index 692fcce6..5d792990 100644 --- a/AppImage/messages/sk/common.json +++ b/AppImage/messages/sk/common.json @@ -1682,6 +1682,16 @@ "searchApplications": "Hľadať aplikácie", "searchingApplications": "Hľadajú sa aplikácie…", "noApplicationsDetected": "Neboli zistené žiadne aplikácie.", + "nativeEvidencePort": "Otvorený TCP port", + "nativeEvidenceFile": "Nainštalovaný súbor", + "nativeEvidenceProcess": "Spustený program", + "nativeEvidenceDirectory": "Pracovný priečinok", + "nativeEvidenceService": "Definícia služby", + "nativeScanFailed": "Vyhľadávanie aplikácií sa nepodarilo dokončiť. Predchádzajúce dôkazy môžu byť zastarané; skús to znova.", + "nativeScanPartial": "Vyhľadávanie aplikácií je neúplné. Skontroluj dostupné dôkazy a skús to znova.", + "nativeVersionUnknown": "Nainštalovaná verzia nie je známa", + "nativeEvidenceStale": "Dôkazy môžu byť zastarané alebo neúplné.", + "nativeRegisterOnly": "Registráciu potvrď v editore. Známa verzia je ručný údaj; aktualizátor nie je nastavený.", "noNewApplicationsDetected": "Neboli zistené žiadne nové aplikácie.", "oneNewApplicationDetected": "Bola zistená jedna nová aplikácia.", "newApplicationsDetected": "Boli zistené {count} nové aplikácie.", diff --git a/AppImage/scripts/build_appimage.sh b/AppImage/scripts/build_appimage.sh index 40560c21..0b02bbb6 100755 --- a/AppImage/scripts/build_appimage.sh +++ b/AppImage/scripts/build_appimage.sh @@ -149,6 +149,7 @@ cp "$SCRIPT_DIR/managed_installs.py" "$APP_DIR/usr/bin/" 2>/dev/null || echo " cp "$SCRIPT_DIR/lxc_update_observation.py" "$APP_DIR/usr/bin/" cp "$SCRIPT_DIR/lxc_update_finalization.py" "$APP_DIR/usr/bin/" cp "$SCRIPT_DIR/lxc_check_job.py" "$APP_DIR/usr/bin/" +cp "$SCRIPT_DIR/native_app_discovery.py" "$APP_DIR/usr/bin/" cp "$SCRIPT_DIR/lxc_apps.py" "$APP_DIR/usr/bin/" 2>/dev/null || echo "⚠️ lxc_apps.py not found" cp "$SCRIPT_DIR/custom_links.py" "$APP_DIR/usr/bin/" 2>/dev/null || echo "⚠️ custom_links.py not found" cp "$SCRIPT_DIR/recreate_docker_container.py" "$APP_DIR/usr/bin/" 2>/dev/null || echo "⚠️ recreate_docker_container.py not found" diff --git a/AppImage/scripts/flask_server.py b/AppImage/scripts/flask_server.py index 3ffa0c4c..f1d6c302 100644 --- a/AppImage/scripts/flask_server.py +++ b/AppImage/scripts/flask_server.py @@ -2276,6 +2276,8 @@ def _handle_guest_lifecycle(vmid: str, vm_type: str, action: str) -> None: # or stops; drop the cached IP so the next /api/vms poll re-reads # it via `lxc-info`. QEMU guests do not touch this cache. if guest_type == 'lxc': + import native_app_discovery + native_app_discovery.mark_stale(guest_id) _invalidate_lxc_ip(guest_id) if action in ('start', 'reboot'): if guest_type == 'lxc': @@ -14090,6 +14092,20 @@ def api_vm_apps_suggestions(vmid): return jsonify({'error': str(e)}), 500 +@app.route('/api/vms//apps/native-discovery', methods=['GET', 'POST']) +@require_auth +def api_vm_apps_native_discovery(vmid): + """Only the Find applications button requests POST. GET never probes.""" + import native_app_discovery + import lxc_apps + result = (native_app_discovery.discover(vmid) if request.method == 'POST' + else native_app_discovery.cached(vmid)) + suggestions = _vm_cache_get(_vm_app_suggestions_cache, vmid, _VM_APP_SUGGESTIONS_TTL) or {} + sidecar = lxc_apps.load_sidecar(vmid) or {} + return jsonify(native_app_discovery.filter_candidates( + result, suggestions, sidecar.get('apps') or [])) + + @app.route('/api/vms//apps/adguard-setup', methods=['GET']) @require_auth def api_vm_apps_adguard_setup(vmid): diff --git a/AppImage/scripts/lxc_apps.py b/AppImage/scripts/lxc_apps.py index 494c9db5..4b6a5a2e 100644 --- a/AppImage/scripts/lxc_apps.py +++ b/AppImage/scripts/lxc_apps.py @@ -1179,6 +1179,13 @@ def validate_config(payload: dict) -> tuple[bool, Any]: return _err("logo_url must be an http(s) URL (max 512 chars)") conf["logo_url"] = logo + # Native discovery identity is separate from a curated helper/updater. + discovery_id = payload.get("discovery_id") + if discovery_id is not None: + if not isinstance(discovery_id, str) or not re.fullmatch(r"native-[0-9a-f]{24}", discovery_id): + return _err("invalid discovery_id") + conf["discovery_id"] = discovery_id + # Optional helper_slug — set by the frontend when the user picks # an auto-detected app (primary or extra). Persisted so we can # filter the "also detected" chip list against apps already diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py new file mode 100644 index 00000000..a87dfc6e --- /dev/null +++ b/AppImage/scripts/native_app_discovery.py @@ -0,0 +1,487 @@ +#!/usr/bin/env python3 +# ========================================================== +# ProxMenux - A menu-driven script for Proxmox VE management +# Author : VAIO73 +# GitHub : github.com/Vaso73 +# Maintainer : MacRimi +# Copyright : (c) 2026 MacRimi & contributors +# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE) +# Version : 1.0 +# Last Updated: 14/10/2026 +# ========================================================== +# Description: +# On-demand native LXC discovery from service and installation metadata. +# Reads bounded data only; never executes discovered programs, starts guests, +# registers applications or infers their update mechanism. +# ========================================================== +"""Separate from catalog detection: callers must explicitly request a scan.""" + +import copy +import fcntl +import hashlib +import json +import os +from pathlib import Path +import re +import selectors +import signal +import subprocess +import threading +import time + +TOTAL_SECONDS = 20 +PROBE_SECONDS = 3 +OUTPUT_BYTES = 64 * 1024 +MAX_RECORDS = 256 +MAX_CANDIDATES = 50 +CACHE_SECONDS = 300 +LOCAL_CONFIG = Path('/etc/pve/local/lxc') +OCI_ROOT = Path('/usr/local/share/proxmenux/oci/instances') +UPDATE_LOCK_ROOT = Path('/run/lock') +_cache = {} +_locks = {} +_mutex = threading.Lock() +_PATH = re.compile(r'/[A-Za-z0-9_.+/@-]{1,510}\Z') +_NAME = re.compile(r'[A-Za-z0-9][A-Za-z0-9_.+@-]{0,63}\Z') +_VERSION = re.compile(r'v?\d+(?:\.\d+){1,4}(?:[-+._][A-Za-z0-9.-]+)?\Z') +_SYSTEM = { + 'ssh', 'sshd', 'cron', 'crond', 'postfix', 'rsyslog', 'syslog', 'syslog-ng', + 'dbus', 'dbus-broker', 'systemd', 'udev', 'networking', 'network', 'networkmanager', + 'dhcpcd', 'dhclient', 'chrony', 'chronyd', 'ntp', 'ntpd', 'openntpd', 'agetty', + 'getty', 'login', 'polkit', 'polkitd', 'accounts-daemon', 'acpid', 'anacron', + 'docker', 'containerd', 'containerd-shim', 'podman', 'qemu-guest-agent', 'rngd', + 'auditd', 'logrotate', 'local', 'bootmisc', 'hostname', 'hwclock', 'modules', 'master', + 'proxmox-boot-sync', 'pve-container', 'pve-firewall', 'pvefw-logger', + 'pvedaemon', 'pvestatd', 'pveproxy', 'pvescheduler', 'spiceproxy', 'lxc', + 'mount-ro', 'mdev', 'sysctl', 'sysfs', 'devfs', 'cgroups', 'rc', 'rcs', 'swap', + 'sleep', 'true', 'false', 'echo', 'cat', 'head', 'tail', 'tee', 'logger', + 'apt', 'apt-get', 'dpkg', 'dpkg-query', 'apk', 'unattended-upgrades', + 'fstrim', 'fsck', 'fsckd', 'e2scrub', 'e2scrub-all', 'e2scrub-reap', + 'irqbalance', 'smartd', 'smartmontools', 'rpcbind', 'nfs-common', 'nfs-server', + 'rpc-statd', 'rpc-statd-notify', 'rpc-gssd', 'rpc-svcgssd', 'nftables', 'iptables', + 'ip6tables', 'firewalld', 'ufw', 'resolvconf', 'wpa-supplicant', 'modemmanager', + 'console-setup', 'keyboard-setup', 'plymouth', 'halt', 'reboot', 'shutdown', + 'rc-local', 'ntpsec', 'networkd-dispatcher', 'busybox', 'atd', 'uuidd', +} +_RUNTIMES = re.compile(r'(?:python[0-9.]*|node(?:js)?|sh|bash|dash|env|java|ruby|perl)\Z') + + +class ProbeError(Exception): + """Safe error code only; guest output must never become an API error.""" + + +def bounded_run(argv, deadline): + """Cap combined stdout/stderr while reading, and kill/reap the process group.""" + remaining = min(PROBE_SECONDS, deadline - time.monotonic()) + if remaining <= 0: + raise ProbeError('deadline') + end = time.monotonic() + remaining + try: + proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + start_new_session=True) + except OSError: + raise ProbeError('unavailable') from None + outputs = [bytearray(), bytearray()] + try: + with selectors.DefaultSelector() as poll: + for index, stream in enumerate((proc.stdout, proc.stderr)): + os.set_blocking(stream.fileno(), False) + poll.register(stream, selectors.EVENT_READ, index) + while poll.get_map(): + wait = end - time.monotonic() + if wait <= 0: + raise ProbeError('timeout') + for key, _ in poll.select(wait): + block = os.read(key.fileobj.fileno(), 4096) + if not block: + poll.unregister(key.fileobj) + continue + if sum(map(len, outputs)) + len(block) > OUTPUT_BYTES: + raise ProbeError('output_limit') + outputs[key.data].extend(block) + try: + proc.wait(timeout=max(0.001, end - time.monotonic())) + except subprocess.TimeoutExpired: + raise ProbeError('timeout') from None + if proc.returncode: + raise ProbeError('read_failed') + return outputs[0].decode('utf-8', errors='strict') + except UnicodeError: + raise ProbeError('invalid_data') from None + finally: + # Also clean up descendants that outlive a successfully exited wrapper. + try: + os.killpg(proc.pid, signal.SIGKILL) + except ProcessLookupError: + pass + proc.wait() + proc.stdout.close() + proc.stderr.close() + + +# These are fixed read-only scripts, not guest-supplied shell or init scripts. +# awk emits only executable/script paths and WorkingDirectory, never arguments +# or environment values. OpenRC files are parsed as data, never sourced. +SERVICE_SCRIPT = r''' +command -v awk >/dev/null && command -v head >/dev/null || exit 1 +n=0 +for dir in /etc/systemd/system /usr/lib/systemd/system /lib/systemd/system /etc/init.d; do + [ ! -d "$dir" ] || [ -r "$dir" ] || exit 1 + for f in "$dir"/*; do + [ -f "$f" ] || continue + case "$dir:$f" in /etc/init.d:*) kind=openrc;; *:*.service) kind=systemd;; *) continue;; esac + n=$((n+1)); [ "$n" -le 256 ] || { printf 'LIMIT\n'; exit 0; } + [ -r "$f" ] || exit 1 + content=$(timeout -s KILL 1 head -c 16385 "$f") || exit 1 + [ "${#content}" -le 16384 ] || { printf 'LIMIT\n'; exit 0; } + printf '%s\n' "$content" | awk -v kind="$kind" -v file="$f" ' + function clean(v) {gsub(/^[ \t]+|[ \t]+$/, "", v); gsub(/^["\047]|["\047]$/, "", v); return v} + /^ExecStart=/ {v=substr($0,11); sub(/^[-+!:@]+/, "", v); split(v,a,/[ \t]+/); exe=clean(a[1]); script=clean(a[2]); if(script !~ /^\//) script=""} + /^WorkingDirectory=/ {dir=clean(substr($0,18))} + /^command=/ {exe=clean(substr($0,9))} + /^directory=/ {dir=clean(substr($0,11))} + /^command_args=/ {v=clean(substr($0,14)); split(v,a,/[ \t]+/); script=clean(a[1]); if(script !~ /^\//) script=""} + END {printf "S\t%s\t%s\t%s\t%s\t%s\n", file, kind, exe, script, dir}' + done +done +printf 'END\n' +''' +PROCESS_SCRIPT = r''' +command -v readlink >/dev/null && command -v head >/dev/null || exit 1 +n=0 +for dir in /proc/[0-9]*; do + [ -d "$dir" ] || continue + n=$((n+1)); [ "$n" -le "$1" ] || { printf 'LIMIT\n'; exit 0; } + # Never inspect Docker/OCI child workloads or read cmdline/environ. + [ -d "$dir" ] || continue + [ -r "$dir/cgroup" ] || exit 1 + group=$(timeout -s KILL 1 head -c 8193 "$dir/cgroup") || exit 1 + [ "${#group}" -le 8192 ] || { printf 'LIMIT\n'; exit 0; } + case "$group" in *docker*|*libpod*|*kubepods*|*containerd*) continue;; esac + # Kernel threads and vanished processes have no application executable. + [ -L "$dir/exe" ] || continue + exe=$(timeout -s KILL 1 readlink "$dir/exe") || continue + cwd=$(timeout -s KILL 1 readlink "$dir/cwd") || continue + printf 'P\t%s\t%s\t%s\n' "${dir##*/}" "$exe" "$cwd" +done +printf 'END\n' +''' +PORT_SCRIPT = r''' +command -v awk >/dev/null || exit 1 +if command -v ss >/dev/null; then + (timeout -s KILL 1 ss -H -lntp || printf 'FAILED\n') | awk -v cap="$1" ' + /^FAILED$/ {failed=1; exit} + NR > cap {limited=1; exit} + {port=$4; sub(/^.*:/,"",port); rest=$0 + # More than one owner is ambiguous; never choose the first arbitrarily. + if (gsub(/pid=/,"pid=",rest)!=1) next + if (match(rest,/pid=[0-9]+/)) {pid=substr(rest,RSTART+4,RLENGTH-4); printf "L\t%s\t%s\n",pid,port}} + END {print failed ? "FAILED" : (limited ? "LIMIT" : "END")}' +elif command -v netstat >/dev/null; then + (timeout -s KILL 1 netstat -lntp || printf 'FAILED\n') | awk -v cap="$1" ' + /^FAILED$/ {failed=1; exit} + /^tcp/ {n++; if(n>cap) {limited=1; exit}; port=$4; sub(/^.*:/,"",port) + pid=$7; sub(/\/.*$/,"",pid); if(pid ~ /^[0-9]+$/) printf "L\t%s\t%s\n",pid,port} + END {print failed ? "FAILED" : (limited ? "LIMIT" : "END")}' +else + exit 1 +fi +''' +FOOTPRINT_SCRIPT = r''' +[ -f "$1" ] && [ -r "$1" ] || exit 1 +printf 'FILE\n' +if [ -f "$2/package.json" ]; then + [ -r "$2/package.json" ] || exit 1 + timeout -s KILL 1 head -c 8192 "$2/package.json" +fi +''' + + +def _path(value): + return bool(isinstance(value, str) and _PATH.fullmatch(value) + and '..' not in value.split('/')) + + +def _system(name): + raw = name.lower().removesuffix('.service') + stem = raw.split('@')[0] + return raw.startswith('user@') or stem in _SYSTEM or stem.startswith(( + 'systemd-', 'dbus-', 'getty', 'containerd-', 'apt-', 'dpkg-', 'e2scrub', + 'unattended-', 'ifup', 'ifdown', 'user@', 'btrfs-', 'lvm2-', 'lxc-')) + + +def _custom(path): + return _path(path) and path.startswith(('/opt/', '/srv/', '/usr/local/')) + + +def parse_records(text, kind): + lines = text.splitlines() + if not lines or lines[-1] not in ('END', 'LIMIT'): + raise ProbeError('incomplete') + if len(lines) - 1 > MAX_RECORDS: + raise ProbeError('metadata_limit') + records = [] + seen_services = set() + for line in lines[:-1]: + parts = line.split('\t') + if kind == 'S' and len(parts) == 6 and parts[0] == 'S': + _, source, manager, exe, script, directory = parts + if not _path(source) or manager not in ('systemd', 'openrc'): + raise ProbeError('invalid_data') + service = Path(source).name.removesuffix('.service') + if service in seen_services: + continue # /etc overrides vendor units; no duplicate installations. + seen_services.add(service) + if not _NAME.fullmatch(service) or _system(service) or not _path(exe): + continue + runtime = bool(_RUNTIMES.fullmatch(Path(exe).name)) + install = script if runtime else exe + if (not _path(install) or _system(Path(install).name) + or install.startswith(('/usr/lib/systemd/', '/lib/systemd/', + '/usr/lib/udev/', '/lib/udev/', '/usr/lib/apt/'))): + continue + root = directory if _custom(directory) else str(Path(install).parent) + # Generic runtime without an absolute application script is ambiguous. + if runtime and not _custom(install): + continue + records.append({'name': service, 'path': install, 'root': root, + 'service': source, 'manager': manager, 'executable': exe}) + elif kind == 'P' and len(parts) == 4 and parts[0] == 'P': + _, pid, exe, directory = parts + if not pid.isdigit() or not _path(exe) or not _path(directory): + continue + records.append({'pid': pid, 'executable': exe, 'root': directory}) + elif kind == 'L' and len(parts) == 3 and parts[0] == 'L': + _, pid, port = parts + if pid.isdigit() and port.isdigit() and 0 < int(port) < 65536: + records.append({'pid': pid, 'port': int(port)}) + else: + raise ProbeError('invalid_data') + else: + raise ProbeError('invalid_data') + return records, lines[-1] == 'LIMIT', len(lines) - 1 + + +def candidate(vmid, record, footprint): + if not footprint.startswith('FILE\n'): + raise ProbeError('invalid_data') + version, metadata_issue = None, None + metadata = footprint[5:].strip() + if metadata: + try: + manifest = json.loads(metadata) + except (ValueError, TypeError): + manifest = None + # Only the whitelisted version field leaves this function. Never retain + # manifest scripts, repository guesses, config or arbitrary extra fields. + if not isinstance(manifest, dict): + metadata_issue = 'invalid_metadata' + manifest = {} + value = manifest.get('version') + if (isinstance(value, str) and len(value) <= 64 and _VERSION.fullmatch(value) + and record['path'].startswith(record['root'].rstrip('/') + '/')): + version = value + identity = 'native-' + hashlib.sha256( + f'{int(vmid)}:{record["path"]}:{record["root"]}'.encode()).hexdigest()[:24] + evidence = [{'kind': 'installation_file', 'value': record['path']}] + if record.get('service'): + evidence.append({'kind': record['manager'], 'value': record['service']}) + else: + evidence.extend([{'kind': 'process_executable', 'value': record['process']}, + {'kind': 'working_directory', 'value': record['root']}]) + ports = sorted(set(record.get('listening_ports') or [])) + evidence.extend({'kind': 'tcp_listener', 'value': str(port)} for port in ports) + return {'slug': identity, 'discovery_id': identity, 'source': 'native_metadata', + 'name': record['name'], 'installed_version': version, 'evidence': evidence, + 'installation_path': record['path'], 'default_ports': [], + 'listening_ports': ports, + 'metadata_issue': metadata_issue, + 'tracking_suggestion': ({'installed_via': 'manual', 'installed_version': version, + 'detected_version': version, 'detector_verified': True} + if version else None)} + + +def _guard(vmid, deadline, run): + # The local node path rejects QEMU, missing and remote CTs before pct exec. + path = LOCAL_CONFIG / f'{vmid}.conf' + if not path.is_file(): + raise ProbeError('not_local_lxc') + # Presence, including a damaged/in-progress record, excludes generic probes. + try: + os.lstat(OCI_ROOT / str(vmid)) + except FileNotFoundError: + pass + except OSError: + raise ProbeError('oci_unknown') from None + else: + raise ProbeError('managed_oci') + try: + with path.open('rb') as handle: + raw = handle.read(OUTPUT_BYTES + 1) + if len(raw) > OUTPUT_BYTES: + raise ProbeError('config_limit') + config = raw.decode('utf-8') + except (OSError, UnicodeError): + raise ProbeError('config_unavailable') from None + if re.search(r'^lock:', config, re.M): + raise ProbeError('guest_busy') + update_lock = UPDATE_LOCK_ROOT / f'proxmenux-lxc-update-{vmid}.lock' + try: + with update_lock.open('rb') as handle: + try: + fcntl.flock(handle, fcntl.LOCK_SH | fcntl.LOCK_NB) + except BlockingIOError: + raise ProbeError('guest_busy') from None + finally: + fcntl.flock(handle, fcntl.LOCK_UN) + except FileNotFoundError: + pass + except OSError: + raise ProbeError('lock_unavailable') from None + if re.search(r'^ostype:\s*unmanaged\s*$', config, re.M): + raise ProbeError('unsupported_guest') + if not re.search(r'^ostype:\s*(?:debian|ubuntu|alpine|archlinux|centos|fedora|opensuse|gentoo)\s*$', config, re.M): + raise ProbeError('unsupported_guest') + status = run(['pct', 'status', str(vmid)], deadline).strip() + if status != 'status: running': + raise ProbeError('guest_stopped' if status == 'status: stopped' else 'status_unknown') + + +def scan(vmid, run=bounded_run): + deadline = time.monotonic() + TOTAL_SECONDS + _guard(vmid, deadline, run) + records, issues, consumed, processes, listeners = [], [], 0, [], [] + for kind, script in (('S', SERVICE_SCRIPT), ('P', PROCESS_SCRIPT), ('L', PORT_SCRIPT)): + try: + if consumed >= MAX_RECORDS: + issues.append('metadata_limit') + break + parsed, limited, count = parse_records(run( + ['pct', 'exec', str(vmid), '--', 'timeout', '-s', 'KILL', '2', + 'sh', '-c', script, 'discovery', str(MAX_RECORDS - consumed)], deadline), kind) + if consumed + count > MAX_RECORDS: + issues.append('metadata_limit') + parsed = parsed[:MAX_RECORDS - consumed] + consumed = min(MAX_RECORDS, consumed + count) + # The entire collector, not each metadata source, has 256 records. + capacity = MAX_RECORDS - len(records) + if kind == 'S': + records.extend(parsed[:capacity]) + elif kind == 'P': + processes = parsed[:capacity] + else: + listeners = parsed[:capacity] + if limited or len(parsed) > capacity: + issues.append('metadata_limit') + except ProbeError as exc: + issues.append(str(exc)) + for process in processes: + exe, directory = process['executable'], process['root'] + related = [record for record in records if record['executable'] == exe and ( + not _RUNTIMES.fullmatch(Path(exe).name) or record['root'] == directory)] + ports = [entry['port'] for entry in listeners if entry['pid'] == process['pid']] + if len(related) == 1: + related[0].setdefault('listening_ports', []).extend(ports) + elif not related and (_custom(exe) and _custom(directory) + and not _system(Path(exe).name) + and not _RUNTIMES.fullmatch(Path(exe).name) + and exe.startswith(directory.rstrip('/') + '/') + and _NAME.fullmatch(Path(exe).name)): + records.append({'name': Path(exe).name, 'path': exe, 'root': directory, + 'process': exe, 'executable': exe, 'listening_ports': ports}) + items, seen = [], set() + for record in records: + key = (record['path'], record['root']) + if key in seen: + continue + seen.add(key) + if len(items) >= MAX_CANDIDATES: + issues.append('candidate_limit') + break + try: + footprint = run(['pct', 'exec', str(vmid), '--', 'timeout', '-s', 'KILL', '2', + 'sh', '-c', FOOTPRINT_SCRIPT, + 'discovery', record['path'], record['root']], deadline) + item = candidate(vmid, record, footprint) + items.append(item) + if item['metadata_issue']: + issues.append(item['metadata_issue']) + except ProbeError as exc: + issues.append(str(exc)) + if str(exc) == 'deadline': + break + return {'vmid': vmid, 'status': 'partial' if issues else 'complete', + 'candidates': items, 'issues': sorted(set(issues)), 'stale': False, + 'scanned_at': time.time()} + + +def cached(vmid): + with _mutex: + value = copy.deepcopy(_cache.get(int(vmid))) + if value is None: + return {'vmid': int(vmid), 'status': 'not_scanned', 'candidates': [], 'stale': False} + if time.time() - value['scanned_at'] >= CACHE_SECONDS: + value['stale'] = True + return value + + +def mark_stale(vmid): + """Lifecycle events retire freshness, never collect new guest metadata.""" + with _mutex: + if int(vmid) in _cache: + _cache[int(vmid)]['stale'] = True + + +def discover(vmid): + vmid = int(vmid) + with _mutex: + lock = _locks.setdefault(vmid, threading.Lock()) + if not lock.acquire(blocking=False): + return {**cached(vmid), 'status': 'busy', 'stale': True} + try: + try: + result = scan(vmid) + except ProbeError as exc: + result = {**cached(vmid), 'status': 'error', 'issues': [str(exc)], 'stale': True} + result.setdefault('scanned_at', time.time()) + with _mutex: + _cache[vmid] = copy.deepcopy(result) + return result + previous = cached(vmid) + if result['status'] != 'complete' and previous['candidates']: + # Partial output cannot prove that previously seen apps disappeared. + ids = {item['discovery_id'] for item in result['candidates']} + result['candidates'].extend(item for item in previous['candidates'] + if item['discovery_id'] not in ids) + result['candidates'] = result['candidates'][:MAX_CANDIDATES] + result['stale'] = True + with _mutex: + _cache[vmid] = copy.deepcopy(result) + return result + finally: + lock.release() + + +def filter_candidates(result, suggestions, apps): + """Pure composition: never run catalog probes, load or write registries.""" + known = [*apps, *(suggestions.get('extras') or []), + *(suggestions.get('docker_workloads') or [])] + if suggestions.get('helper_slug'): + known.append({'name': suggestions.get('name_suggestion'), + 'helper_slug': suggestions['helper_slug'], + 'tracking_suggestion': suggestions.get('tracking_suggestion')}) + identities = {a.get('discovery_id') for a in known if a.get('discovery_id')} + names, paths = set(), set() + for app in known: + for field in ('name', 'slug', 'helper_slug', 'package'): + if app.get(field): + names.add(str(app[field]).casefold()) + detector = app.get('tracking_suggestion') or app + for field in ('binary_path', 'file_path'): + if detector.get(field): + paths.add(detector[field]) + items = [item for item in result['candidates'] + if item['discovery_id'] not in identities + and item['name'].casefold() not in names + and item['installation_path'] not in paths] + return {**result, 'candidates': items} diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py new file mode 100644 index 00000000..cc1539b1 --- /dev/null +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -0,0 +1,441 @@ +"""Host-independent discovery fixtures; no real pct, guest, auth or registry.""" +import ast +import copy +import fcntl +from functools import wraps +import json +from pathlib import Path +import subprocess +import sys +import tempfile +import threading +import time +import unittest +from unittest.mock import Mock, patch + +SCRIPTS = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(SCRIPTS)) +import native_app_discovery as native +import lxc_apps + + +def service(name='handmade', exe='/opt/handmade/server', directory='/opt/handmade', manager='systemd', script=''): + path = ('/etc/systemd/system/' + name + '.service' if manager == 'systemd' + else '/etc/init.d/' + name) + return '\t'.join(['S', path, manager, exe, script, directory]) + '\nEND\n' + + +class DiscoveryFixtures(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) + self.config = self.root / 'lxc' + self.config.mkdir() + (self.config / '101.conf').write_text('ostype: debian\n') + self.oci = self.root / 'oci' + self.oci.mkdir() + for context in (patch.object(native, 'LOCAL_CONFIG', self.config), + patch.object(native, 'OCI_ROOT', self.oci), + patch.object(native, 'UPDATE_LOCK_ROOT', self.root)): + context.start() + self.addCleanup(context.stop) + native._cache.clear() + native._locks.clear() + self.calls = [] + + def runner(self, services=None, processes='END\n', footprint='FILE\n', status='status: running', ports='END\n'): + def run(argv, deadline): + self.calls.append(argv) + self.assertLessEqual(deadline - time.monotonic(), native.TOTAL_SECONDS) + if argv[1] == 'status': + return status + self.assertEqual(argv[:6], ['pct', 'exec', '101', '--', 'timeout', '-s']) + self.assertEqual(argv[6:9], ['KILL', '2', 'sh']) + script = argv[10] + if script == native.SERVICE_SCRIPT: + return services if services is not None else service() + if script == native.PROCESS_SCRIPT: + return processes + if script == native.PORT_SCRIPT: + return ports + if script == native.FOOTPRINT_SCRIPT: + return footprint + self.fail('Unexpected probe') + return run + + def test_unknown_version_is_present_with_evidence_and_no_capabilities(self): + result = native.scan(101, self.runner()) + self.assertEqual(result['status'], 'complete') + item, = result['candidates'] + self.assertIsNone(item['installed_version']) + self.assertIsNone(item['tracking_suggestion']) + self.assertEqual(item['default_ports'], []) + self.assertEqual({e['kind'] for e in item['evidence']}, {'installation_file', 'systemd'}) + for field in ('helper_slug', 'repo', 'update_command', 'binary_path', 'upstream_type'): + self.assertNotIn(field, item) + + def test_openrc_node_script_known_version_is_manual_and_secret_free(self): + result = native.scan(101, self.runner( + service(exe='/usr/bin/node', script='/opt/handmade/server.js', manager='openrc'), + footprint='FILE\n' + json.dumps({'version': '1.2.3', 'scripts': {'start': 'SECRET'}, 'env': 'PASSWORD'}))) + item, = result['candidates'] + self.assertEqual(item['installed_version'], '1.2.3') + self.assertEqual(item['tracking_suggestion']['installed_via'], 'manual') + self.assertNotIn('SECRET', json.dumps(result)) + self.assertNotIn('PASSWORD', json.dumps(result)) + self.assertFalse(any('systemctl' in arg for call in self.calls for arg in call)) + + def test_inactive_service_and_packaged_application_are_not_hidden(self): + result = native.scan(101, self.runner(service(name='legit-app', exe='/usr/bin/legit-app', directory=''))) + self.assertEqual(result['candidates'][0]['name'], 'legit-app') + + def test_system_services_and_ambiguous_runtimes_have_zero_footprint_probes(self): + for name, exe in [('ssh', '/usr/sbin/sshd'), ('cron', '/usr/sbin/cron'), + ('postfix', '/usr/lib/postfix/master'), ('rsyslog', '/usr/sbin/rsyslogd'), + ('systemd-networkd', '/usr/lib/systemd/systemd-networkd'), + ('ambiguous', '/usr/bin/python3')]: + self.calls.clear() + result = native.scan(101, self.runner(service(name=name, exe=exe))) + self.assertEqual(result['candidates'], []) + self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + + def test_missing_remote_qemu_stopped_busy_oci_guards_precede_exec(self): + scenarios = ['missing', 'stopped', 'busy', 'oci', 'invalid-oci', 'unmanaged'] + for scenario in scenarios: + with self.subTest(scenario=scenario): + (self.config / '101.conf').write_text('ostype: debian\n') + if scenario == 'missing': + (self.config / '101.conf').unlink() + if scenario == 'busy': + (self.config / '101.conf').write_text('lock: backup\n') + if scenario == 'unmanaged': + (self.config / '101.conf').write_text('ostype: unmanaged\n') + if 'oci' in scenario: + (self.oci / '101').mkdir(exist_ok=True) + (self.oci / '101' / 'oci-compose.json').write_text('broken') + self.calls.clear() + with self.assertRaises(native.ProbeError): + native.scan(101, self.runner(status='status: stopped' if scenario == 'stopped' else 'status: running')) + self.assertFalse(any(call[1] == 'exec' for call in self.calls)) + if (self.oci / '101').exists(): + (self.oci / '101' / 'oci-compose.json').unlink() + (self.oci / '101').rmdir() + + def test_failure_and_partial_output_are_not_successful_empty_results(self): + for text in ('', 'malformed\nEND\n', 'S\tpartial', 'LIMIT\n'): + result = native.scan(101, self.runner(services=text)) + self.assertEqual(result['status'], 'partial') + run = self.runner() + def failed(argv, deadline): + if argv[1] == 'exec': + raise native.ProbeError('read_failed') + return run(argv, deadline) + self.assertEqual(native.scan(101, failed)['status'], 'partial') + + def test_optional_invalid_version_metadata_keeps_proven_candidate(self): + result = native.scan(101, self.runner(footprint='FILE\n{broken')) + self.assertEqual(result['status'], 'partial') + item, = result['candidates'] + self.assertIsNone(item['installed_version']) + self.assertIsNone(item['tracking_suggestion']) + + def test_working_directory_manifest_does_not_version_an_unrelated_executable(self): + result = native.scan(101, self.runner(service(exe='/opt/other/server'), + footprint='FILE\n{"version":"1.2.3"}')) + self.assertIsNone(result['candidates'][0]['installed_version']) + + def test_path_injection_and_port_only_data_do_not_become_candidates(self): + for text in (service(exe='/opt/app/$(id)'), service(exe='/opt/../server'), + service(name='app;id'), service(exe='/bin/sh')): + self.assertEqual(native.scan(101, self.runner(text))['candidates'], []) + with self.assertRaises(native.ProbeError): + native.parse_records('PORT\t8080\nEND\n', 'P') + + def test_same_process_deduplicates_but_two_apps_using_node_do_not_merge(self): + services = service(exe='/usr/bin/node', script='/opt/handmade/server.js').removesuffix('END\n') + services += service(name='second', exe='/usr/bin/node', script='/opt/second/server.js', directory='/opt/second') + result = native.scan(101, self.runner(services)) + self.assertEqual(len(result['candidates']), 2) + result = native.scan(101, self.runner(processes='P\t123\t/opt/handmade/server\t/opt/handmade\nEND\n')) + self.assertEqual(len(result['candidates']), 1) + other = native.candidate(102, native.parse_records(service(), 'S')[0][0], 'FILE\n') + self.assertNotEqual(other['discovery_id'], result['candidates'][0]['discovery_id']) + + def test_record_and_candidate_caps(self): + too_many = 'P\t123\t/opt/a/app\t/opt/a\n' * 257 + 'END\n' + with self.assertRaises(native.ProbeError): + native.parse_records(too_many, 'P') + services = ''.join(service(name=f'app{i}', exe=f'/opt/app{i}/server', directory=f'/opt/app{i}').removesuffix('END\n') for i in range(51)) + 'END\n' + result = native.scan(101, self.runner(services)) + self.assertEqual(len(result['candidates']), 50) + self.assertIn('candidate_limit', result['issues']) + + def test_cached_ttl_never_runs_scan_and_error_preserves_last_known(self): + complete = native.scan(101, self.runner()) + with patch.object(native, 'scan', return_value=complete) as scan: + native.discover(101) + for age, stale in ((299.9, False), (300, True), (300.1, True)): + with patch.object(native.time, 'time', return_value=complete['scanned_at'] + age): + self.assertEqual(native.cached(101)['stale'], stale) + self.assertEqual(scan.call_count, 1) + with patch.object(native, 'scan', side_effect=native.ProbeError('timeout')): + result = native.discover(101) + self.assertEqual(result['candidates'], complete['candidates']) + self.assertEqual(native.cached(101)['status'], 'error') + self.assertTrue(native.cached(101)['stale']) + partial = {**complete, 'status': 'partial', 'candidates': [], 'issues': ['read_failed']} + with patch.object(native, 'scan', return_value=partial): + self.assertEqual(native.discover(101)['candidates'], complete['candidates']) + with patch.object(native, 'scan', return_value={**complete, 'candidates': []}): + self.assertEqual(native.discover(101)['candidates'], []) + + def test_same_ct_busy_and_different_ct_cache_isolation(self): + lock = threading.Lock() + lock.acquire() + native._locks[101] = lock + with patch.object(native, 'scan') as scanner: + self.assertEqual(native.discover(101)['status'], 'busy') + scanner.assert_not_called() + self.assertEqual(native.cached(102)['status'], 'not_scanned') + + def test_filter_registered_curated_and_docker_children_without_mutation(self): + result = native.scan(101, self.runner()) + original = copy.deepcopy(result) + for suggestions, apps in (({}, [{'discovery_id': result['candidates'][0]['discovery_id']}]), + ({'extras': [{'name': 'Handmade'}]}, []), + ({'docker_workloads': [{'name': 'Handmade'}]}, []), + ({'helper_slug': 'handmade', 'name_suggestion': 'Handmade'}, [])): + self.assertEqual(native.filter_candidates(result, suggestions, apps)['candidates'], []) + self.assertEqual(result, original) + + def test_actual_save_first_check_and_recheck_never_probe_or_configure_updater(self): + with patch.object(lxc_apps, '_APPS_DIR', str(self.root / 'apps')), \ + patch.object(lxc_apps, '_pct_exec', side_effect=AssertionError('forbidden guest execution')) as execute, \ + patch.object(lxc_apps, 'fetch_latest_upstream_details', side_effect=AssertionError('forbidden upstream')) as upstream: + for version in (None, '1.2.3'): + item = native.candidate(101, native.parse_records(service(), 'S')[0][0], + 'FILE\n' + (json.dumps({'version': version}) if version else '')) + payload = {'name': item['name'], 'discovery_id': item['discovery_id'], + 'update_method': 'none', **(item['tracking_suggestion'] or {})} + ok, sidecar = lxc_apps.add_app(101, payload) + self.assertTrue(ok, sidecar) + app = sidecar['apps'][-1] + self.assertEqual(app['state']['installed_version'], version) + self.assertIsNone(app['state']['update_available']) + self.assertEqual(app['update_method'], 'none') + for field in ('helper_slug', 'update_command', 'repo', 'upstream_type'): + self.assertNotIn(field, app) + lxc_apps.check_app(101, app['id'], force=True) + self.assertIsNone(lxc_apps.get_schedule(101)) + self.assertIsNone(lxc_apps.get_bulk_update(101)) + execute.assert_not_called() + upstream.assert_not_called() + + def test_failed_save_has_no_first_check(self): + with patch.object(lxc_apps, '_write_sidecar', return_value=False), \ + patch.object(lxc_apps, '_read_sidecar', return_value=None), \ + patch.object(lxc_apps, 'check_app') as check: + self.assertFalse(lxc_apps.add_app(101, {'name': 'handmade'})[0]) + check.assert_not_called() + + def test_active_update_lock_blocks_all_guest_probes_without_writing(self): + path = self.root / 'proxmenux-lxc-update-101.lock' + path.write_bytes(b'unchanged') + with path.open('rb') as handle: + fcntl.flock(handle, fcntl.LOCK_EX) + with self.assertRaisesRegex(native.ProbeError, 'guest_busy'): + native.scan(101, self.runner()) + self.assertEqual(path.read_bytes(), b'unchanged') + self.assertEqual(self.calls, []) + + def test_actual_service_parser_reads_data_never_executes_or_sources_it(self): + for manager in ('systemd', 'openrc'): + directory = self.root / manager + directory.mkdir() + marker = self.root / ('forbidden-' + manager) + unit = directory / ('handmade.service' if manager == 'systemd' else 'handmade') + content = ('[Service]\nExecStart=/usr/bin/node /opt/handmade/server.js --password SECRET\nWorkingDirectory=/opt/handmade\n' + if manager == 'systemd' else 'command="/usr/bin/node"\ncommand_args="/opt/handmade/server.js --password SECRET"\ndirectory="/opt/handmade"\n') + unit.write_text(content + '\ntouch ' + str(marker) + '\n') + script = native.SERVICE_SCRIPT.replace('/etc/systemd/system /usr/lib/systemd/system /lib/systemd/system /etc/init.d', str(directory)) + # Substitute only fixture paths, not the collector/parser behavior. + if manager == 'openrc': + script = script.replace('/etc/init.d:*)', str(directory) + ':*)') + output = native.bounded_run(['sh', '-c', script], time.monotonic() + 3) + record, = native.parse_records(output, 'S')[0] + self.assertEqual(record['path'], '/opt/handmade/server.js') + self.assertNotIn('SECRET', output) + self.assertFalse(marker.exists()) + + def test_actual_process_parser_skips_docker_and_never_reads_environ_cmdline(self): + proc = self.root / 'proc' + proc.mkdir() + for pid, group in ((1, '0::/\n'), (2, '0::/docker/child\n')): + directory = proc / str(pid) + directory.mkdir() + (directory / 'cgroup').write_text(group) + (directory / 'exe').symlink_to('/opt/handmade/server') + (directory / 'cwd').symlink_to('/opt/handmade') + (directory / 'cmdline').write_text('SECRET') + (directory / 'environ').write_text('PASSWORD') + script = native.PROCESS_SCRIPT.replace('/proc/[0-9]*', str(proc) + '/[0-9]*') + output = native.bounded_run(['sh', '-c', script, 'fixture', '256'], time.monotonic() + 3) + self.assertEqual(output, 'P\t1\t/opt/handmade/server\t/opt/handmade\nEND\n') + self.assertNotIn('"$dir/cmdline"', native.PROCESS_SCRIPT) + self.assertNotIn('"$dir/environ"', native.PROCESS_SCRIPT) + self.assertNotIn('SECRET', output) + + def test_ports_require_exact_process_ownership_and_do_not_infer_http(self): + process = 'P\t123\t/opt/handmade/server\t/opt/handmade\nEND\n' + result = native.scan(101, self.runner(processes=process, ports='L\t123\t8080\nL\t999\t9000\nEND\n')) + item, = result['candidates'] + self.assertEqual(item['listening_ports'], [8080]) + self.assertEqual(item['default_ports'], [], 'TCP listener does not prove HTTP') + result = native.scan(101, self.runner(ports='L\t123\t8080\nEND\n')) + self.assertEqual(result['candidates'][0]['listening_ports'], []) + + def test_shared_runtime_ports_are_assigned_only_by_working_directory(self): + services = service(exe='/usr/bin/node', script='/opt/handmade/server.js').removesuffix('END\n') + services += service(name='second', exe='/usr/bin/node', script='/opt/second/server.js', directory='/opt/second') + process = 'P\t123\t/usr/bin/node\t/opt/second\nEND\n' + result = native.scan(101, self.runner(services, processes=process, ports='L\t123\t8080\nEND\n')) + self.assertEqual(result['candidates'][0]['listening_ports'], []) + self.assertEqual(result['candidates'][1]['listening_ports'], [8080]) + + def test_ss_and_alpine_netstat_parser_are_bounded_and_secret_free(self): + for tool, line in (('ss', 'LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("SECRET",pid=123,fd=7))'), + ('netstat', 'tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 123/SECRET')): + bin_dir = self.root / tool + bin_dir.mkdir() + executable = bin_dir / tool + executable.write_text('#!/bin/sh\nprintf \'%s\\n\' \'' + line + '\'\n') + executable.chmod(0o755) + (bin_dir / 'awk').symlink_to('/usr/bin/awk') + (bin_dir / 'timeout').symlink_to('/usr/bin/timeout') + script = 'PATH=' + str(bin_dir) + '\n' + native.PORT_SCRIPT + output = native.bounded_run(['sh', '-c', script, 'fixture', '256'], time.monotonic() + 3) + self.assertEqual(output, 'L\t123\t8080\nEND\n') + self.assertNotIn('SECRET', output) + executable.write_text('#!/bin/sh\nexit 1\n') + output = native.bounded_run(['sh', '-c', script, 'fixture', '256'], time.monotonic() + 3) + with self.assertRaises(native.ProbeError): + native.parse_records(output, 'L') + + +class BoundedRunner(unittest.TestCase): + def test_output_limit_is_enforced_during_read(self): + with self.assertRaisesRegex(native.ProbeError, 'output_limit'): + native.bounded_run([sys.executable, '-c', 'import os; os.write(2,b"x"*1000000)'], time.monotonic() + 3) + + def test_pipe_holding_child_does_not_bypass_timeout(self): + start = time.monotonic() + with self.assertRaisesRegex(native.ProbeError, 'timeout'): + native.bounded_run([sys.executable, '-c', 'import os,time; os.fork(); time.sleep(10)'], start + .15) + self.assertLess(time.monotonic() - start, .8) + + def test_failures_never_reveal_stderr_and_deadline_blocks_spawn(self): + with self.assertRaisesRegex(native.ProbeError, '^read_failed$'): + native.bounded_run([sys.executable, '-c', 'import sys; sys.stderr.write("SECRET"); sys.exit(1)'], time.monotonic() + 3) + with patch.object(native.subprocess, 'Popen') as launch: + with self.assertRaisesRegex(native.ProbeError, 'deadline'): + native.bounded_run(['forbidden'], time.monotonic() - 1) + launch.assert_not_called() + + +class Routes(unittest.TestCase): + """Execute actual Flask route bodies; fixture auth, no server startup jobs.""" + def setUp(self): + from flask import Flask, request, jsonify, g + self.app = Flask('native-fixture') + self.authorized = True + def require_auth(fn): + @wraps(fn) + def wrapped(*args, **kwargs): + if not self.authorized: + return jsonify({'error': 'auth_required'}), 401 + return fn(*args, **kwargs) + return wrapped + self.globals = {'app': self.app, 'request': request, 'jsonify': jsonify, + 'require_auth': require_auth, '_vm_app_suggestions_cache': {}, + '_VM_APP_SUGGESTIONS_TTL': 300, + '_vm_cache_get': lambda cache, vmid, ttl: cache.get(vmid), + '_vm_cache_put': lambda cache, vmid, value: cache.update({vmid: value}), + '_pvesh_cache': {}, '_vm_disk_cache': {}, '_vm_cache_invalidate': Mock(), + '_invalidate_lxc_ip': Mock(), '_schedule_started_guest_refresh': Mock(), + '_publish_guest_modal_cache_revision': Mock()} + tree = ast.parse((SCRIPTS / 'flask_server.py').read_text()) + routes = [n for n in tree.body if isinstance(n, ast.FunctionDef) and n.name in ( + 'api_vm_apps_suggestions', 'api_vm_apps_native_discovery', 'api_vm_apps_add', + '_handle_guest_lifecycle')] + self.assertEqual(len(routes), 4) + exec(compile(ast.Module(body=routes, type_ignores=[]), str(SCRIPTS / 'flask_server.py'), 'exec'), self.globals) + self.client = self.app.test_client() + + def test_explicit_post_only_get_and_existing_post_never_native_scan(self): + result = {'vmid': 101, 'status': 'complete', 'candidates': [], 'stale': False} + with patch.object(native, 'discover', return_value=result) as scan, \ + patch.object(native, 'cached', return_value=result), \ + patch.object(lxc_apps, 'get_suggestions', return_value={'extras': []}) as suggestions, \ + patch.object(lxc_apps, 'load_sidecar', return_value={'apps': []}), \ + patch.object(lxc_apps, '_write_sidecar') as write: + self.assertEqual(self.client.get('/api/vms/101/apps/native-discovery').status_code, 200) + self.client.get('/api/vms/101/apps/suggestions') + # OCI refresh and Find's existing catalog path retain their purpose. + self.client.post('/api/vms/101/apps/suggestions') + with self.app.test_request_context('/api/vms/101/apps/suggestions'): + from flask import g + g._internal_call = True + self.globals['_vm_app_suggestions_cache'].clear() + self.globals['api_vm_apps_suggestions'](101) + scan.assert_not_called() + self.client.post('/api/vms/101/apps/native-discovery') + scan.assert_called_once_with(101) + self.assertEqual(suggestions.call_count, 2) + write.assert_not_called() + + def test_unauthorized_and_wrong_method_have_zero_scans(self): + with patch.object(native, 'discover') as scan, patch.object(lxc_apps, 'load_sidecar') as read: + self.authorized = False + self.assertEqual(self.client.post('/api/vms/101/apps/native-discovery').status_code, 401) + self.assertEqual(self.client.put('/api/vms/101/apps/native-discovery').status_code, 405) + scan.assert_not_called() + read.assert_not_called() + + def test_actual_lifecycle_marks_last_known_stale_without_scanning(self): + native._cache[101] = {'vmid': 101, 'status': 'complete', 'stale': False, + 'candidates': [], 'scanned_at': time.time()} + with patch.object(native, 'discover') as scan, \ + patch.object(lxc_apps, 'clear_schedule_reboot_required') as clear: + for action in ('start', 'reboot', 'stop'): + self.globals['_handle_guest_lifecycle']('101', 'lxc', action) + self.assertTrue(native.cached(101)['stale']) + scan.assert_not_called() + self.assertEqual(clear.call_count, 2) + + def test_actual_repeated_prewarmer_has_zero_native_scans(self): + tree = ast.parse((SCRIPTS / 'flask_server.py').read_text()) + warmer = next(node for node in tree.body if isinstance(node, ast.FunctionDef) + and node.name == '_vm_modal_prewarmer_pass') + environment = dict(self.globals) + for name in ('_vm_details_cache', '_vm_backups_cache', '_vm_schedule_cache', '_vm_mounts_cache'): + environment[name] = {} + for name in ('_VM_DETAILS_TTL', '_VM_BACKUPS_TTL', '_VM_SCHEDULE_TTL', '_VM_MOUNTS_TTL'): + environment[name] = 300 + for name in ('get_vm_config', 'api_vm_backups', 'api_vm_apps_schedule', 'api_lxc_mount_points'): + environment[name] = lambda vmid: None + environment.update({'get_cached_pvesh_cluster_resources_vm': lambda: [ + {'vmid': 101, 'type': 'lxc', 'status': 'running'}], 'time': Mock(), 'sys': sys}) + exec(compile(ast.Module(body=[warmer], type_ignores=[]), 'flask_server.py', 'exec'), environment) + with patch.object(native, 'discover') as scan, \ + patch.object(lxc_apps, 'ensure_oci_registration'), \ + patch.object(lxc_apps, 'load_sidecar', return_value={'apps': []}), \ + patch.object(lxc_apps, 'get_suggestions', return_value={'extras': []}): + for _ in range(2): + environment['_vm_app_suggestions_cache'].clear() + self.assertEqual(environment['_vm_modal_prewarmer_pass'](), 1) + scan.assert_not_called() + + +if __name__ == '__main__': + unittest.main() diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5e76a028..6e645e4d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -876,8 +876,8 @@ and traceback before changing catalogs or translation-provider settings. #### Qualified offline `tests/` CI lanes `.github/workflows/test-offline-qualified.yml` runs **only** the explicitly listed -nine Python files (including the inert active-notification payload fixture and -the focused health recurrence tests) and eleven +ten Python files (including the native discovery fixtures, the inert active-notification payload fixture and +the focused health recurrence tests) and twelve Node files in `.github/scripts/run_offline_qualified.py`. The Python runner gives each test file a private temporary directory through `TMPDIR`. It removes that directory after the test file finishes. @@ -900,7 +900,7 @@ dangling symlink) rather than overwrite or reuse it. In Bash: ) ``` -Requires Python 3.11, Node 22.14, npm and Bash/coreutils for the bounded shell +Requires Python 3.11, Flask 3.x for the native route fixtures, Node 22.14, npm and Bash/coreutils for the bounded shell fixtures. The separate lockfile installs only TypeScript, React, React DOM, Lucide icons and the locked scheduler dependency; it does not build the Monitor or run npm lifecycle scripts. `--legacy-peer-deps` admits the existing Lucide diff --git a/tests/lxc_updates/test_native_app_discovery_ui.cjs b/tests/lxc_updates/test_native_app_discovery_ui.cjs new file mode 100644 index 00000000..51f759b7 --- /dev/null +++ b/tests/lxc_updates/test_native_app_discovery_ui.cjs @@ -0,0 +1,164 @@ +// Execute the real panel, handlers and editor with inert hook/UI/API fixtures. +// This is component interaction evidence, not browser or Proxmox acceptance. +const assert = require('node:assert/strict') +const fs = require('node:fs') +const path = require('node:path') +const vm = require('node:vm') +const root = path.resolve(__dirname, '../../AppImage') +const ts = require(path.join(root, 'node_modules/typescript')) +const source = fs.readFileSync(path.join(root, 'components/lxc-app-panel.tsx'), 'utf8') +const compiled = ts.transpileModule(source, {compilerOptions: { + module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020, jsx: ts.JsxEmit.ReactJSX, +}, reportDiagnostics: true}) +assert.equal(compiled.diagnostics.length, 0) + +const flatten = node => !node || typeof node !== 'object' ? [] : [node, ...( + [node.props?.children].flat(Infinity).flatMap(flatten) +)] +const text = node => node == null || node === false ? '' : typeof node !== 'object' + ? String(node) : [node.props?.children].flat(Infinity).map(text).join(' ') +const candidate = { + slug: 'native-' + 'a'.repeat(24), discovery_id: 'native-' + 'a'.repeat(24), + name: 'handmade', source: 'native_metadata', installed_version: null, + evidence: [{kind: 'installation_file', value: '/opt/handmade/server'}], default_ports: [], +} + +function fixture() { + let cursor = 0, tree, props, effects = [], states = [], refs = [], effectStates = [] + const calls = [], cachedWrites = [] + let native = {vmid: 101, status: 'not_scanned', candidates: [], stale: false} + let holdScan, scanGate, holdSave, saveGate, scanStatus = 'complete' + const seed = {sidecar: {vmid: 101, apps: []}, suggestions: {extras: [], port_suggestions: []}} + const react = { + useState(initial) { + const index = cursor++ + if (!(index in states)) states[index] = typeof initial === 'function' ? initial() : initial + return [states[index], value => {states[index] = typeof value === 'function' ? value(states[index]) : value}] + }, + useRef(value) {const index = cursor++; return refs[index] ||= {current: value}}, + useMemo(fn) {cursor++; return fn()}, useCallback(fn) {cursor++; return fn}, + useEffect(fn, deps) { + const index = cursor++, prior = effectStates[index] + if (!prior || !deps || deps.some((value, i) => value !== prior.deps?.[i])) { + effects.push(() => {prior?.cleanup?.(); effectStates[index] = {deps, cleanup: fn()}}) + } + }, + } + const api = async (url, options = {}) => { + calls.push({url, ...options}) + if (url.endsWith('/native-discovery')) { + if (options.method === 'POST') { + if (scanGate) await scanGate + native = {...native, status: scanStatus, candidates: [candidate]} + } + return structuredClone(native) + } + if (url.endsWith('/apps/suggestions')) return seed.suggestions + if (url.endsWith('/apps') && options.method === 'POST') { + if (saveGate) await saveGate + return {vmid: Number(url.split('/')[3]), apps: [{id: 'saved', ...JSON.parse(options.body), state: {}}]} + } + if (url.endsWith('/adguard-setup')) return {available: false} + return [] + } + const cache = { + getLxcAppsCached: () => null, fetchLxcApps: async () => seed, + subscribeLxcApps: () => () => {}, setLxcAppsCached: (...args) => cachedWrites.push(args), + } + const exports = {} + vm.runInNewContext(compiled.outputText, {exports, console, setTimeout, clearTimeout, + require: name => { + if (name === 'react') return react + if (name === 'react/jsx-runtime') return {jsx: (type, props) => ({type, props}), jsxs: (type, props) => ({type, props})} + if (name.includes('api-config')) return {fetchApi: api} + if (name.includes('lxc-apps-cache')) return cache + if (name.includes('i18n/provider')) return {useT: () => (key, values) => key + (values ? JSON.stringify(values) : '')} + if (name.includes('category-color')) return {useIsLightTheme: () => false, categoryChipStyle: () => ({})} + if (name.includes('category-label')) return {getCategoryLabel: value => value} + return new Proxy({}, {get: (_, key) => key}) + }, + }) + function render(next = props || {vmid: 101, initialData: seed}) { + props = next; cursor = 0; effects = [] + tree = exports.LxcAppPanel(props) + for (const effect of effects) effect() + return tree + } + const settle = async () => {for (let i = 0; i < 6; i++) await Promise.resolve(); render()} + const button = key => { + const match = flatten(tree).find(n => n.type === 'Button' && text(n).includes('vmLxc.appEditor.' + key)) + assert.ok(match, 'Missing button ' + key) + return match + } + return {render, settle, calls, cachedWrites, button, tree: () => tree, + setNative: value => {native = value}, + setScanStatus: value => {scanStatus = value}, + holdScan: () => {scanGate = new Promise(resolve => {holdScan = resolve})}, resolveScan: () => holdScan(), + holdSave: () => {saveGate = new Promise(resolve => {holdSave = resolve})}, resolveSave: () => holdSave(), + } +} + +async function main() { + const f = fixture() + f.render(); await f.settle() + assert.equal(f.calls.filter(c => c.method === 'POST').length, 0, 'mount and cache reads never scan') + await f.button('searchApplications').props.onClick(); f.render() + assert.equal(f.calls.filter(c => c.url.endsWith('/native-discovery') && c.method === 'POST').length, 1) + assert.ok(text(f.tree()).includes('nativeVersionUnknown'), 'unknown version remains visible') + assert.ok(text(f.tree()).includes('/opt/handmade/server')) + await f.button('registerButton').props.onClick(); f.render() + assert.ok(text(f.tree()).includes('saveButton'), 'candidate opens actual editor') + f.button('cancelButton').props.onClick(); f.render() + assert.equal(f.calls.filter(c => /\/apps$/.test(c.url) && c.method === 'POST').length, 0, 'cancel never registers') + await f.button('registerButton').props.onClick(); f.render() + await f.button('saveButton').props.onClick(); f.render() + const saved = f.calls.find(c => /\/apps$/.test(c.url) && c.method === 'POST') + const payload = JSON.parse(saved.body) + assert.equal(saved.url, '/api/vms/101/apps') + assert.equal(payload.discovery_id, candidate.discovery_id) + assert.ok(!payload.helper_slug, 'native identity never becomes a helper') + assert.equal(payload.installed_via, '') + assert.equal(payload.update_method, 'none') + assert.equal(payload.update_command, '') + assert.equal(payload.repo, '') + assert.equal(payload.upstream_type, '') + + const partial = fixture() + partial.render(); await partial.settle(); partial.setScanStatus('partial') + await partial.button('searchApplications').props.onClick(); partial.render() + assert.ok(text(partial.tree()).includes('nativeScanPartial')) + assert.ok(text(partial.tree()).includes('nativeEvidenceStale')) + const failed = fixture() + failed.render(); await failed.settle(); failed.setScanStatus('error') + await failed.button('searchApplications').props.onClick(); failed.render() + assert.ok(text(failed.tree()).includes('nativeScanFailed')) + assert.equal(failed.calls.filter(c => c.url.endsWith('/apps/suggestions') && c.method === 'POST').length, 0) + + const late = fixture() + late.render(); await late.settle(); late.holdScan() + const scan = late.button('searchApplications').props.onClick() + late.render({vmid: 102}); await late.settle() + late.resolveScan(); await scan; late.render() + assert.ok(!text(late.tree()).includes('/opt/handmade/server'), 'late A scan cannot appear in B') + assert.equal(late.cachedWrites.length, 0) + assert.equal(late.calls.filter(c => c.url.endsWith('/apps/suggestions') && c.method === 'POST').length, 0) + + const saveLate = fixture() + saveLate.render(); await saveLate.settle() + await saveLate.button('searchApplications').props.onClick(); saveLate.render() + await saveLate.button('registerButton').props.onClick(); saveLate.render() + saveLate.holdSave(); const saving = saveLate.button('saveButton').props.onClick() + const priorWrites = saveLate.cachedWrites.length + saveLate.render({vmid: 102}); await saveLate.settle() + saveLate.resolveSave(); await saving; saveLate.render() + assert.equal(saveLate.cachedWrites.length, priorWrites, 'late save response does not update new target') + assert.equal(saveLate.calls.filter(c => /\/vms\/102\/apps$/.test(c.url) && c.method === 'POST').length, 0) + + const oci = fixture() + oci.render({vmid: 101, oci: {instance: true}, initialData: {sidecar: {apps: []}, suggestions: {oci_instance: {template_id: 'image-app'}, extras: []}}}) + await oci.settle() + await oci.button('refreshData').props.onClick() + assert.equal(oci.calls.filter(c => c.url.endsWith('/native-discovery') && c.method === 'POST').length, 0, 'OCI refresh never native-scans') + console.log('PASS native discovery: real panel Find → editor → Cancel/Save, no automatic scan, safe payload, CT switching and OCI refresh (fixtures)') +} +main().catch(error => {console.error(error); process.exitCode = 1}) From bbe811e8736c1578754ed18b12d52bbc7b1eb8da Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Wed, 14 Oct 2026 16:18:17 +0000 Subject: [PATCH 04/73] fix: hide native discovery editor immediately on target change --- AppImage/components/lxc-app-panel.tsx | 2 +- tests/lxc_updates/test_native_app_discovery_ui.cjs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/AppImage/components/lxc-app-panel.tsx b/AppImage/components/lxc-app-panel.tsx index 666009cb..24003d66 100644 --- a/AppImage/components/lxc-app-panel.tsx +++ b/AppImage/components/lxc-app-panel.tsx @@ -1348,7 +1348,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: } // ── Editor ───────────────────────────────────────────────────── - if (editing) { + if (editorOpen && editing) { const draft = editing.draft const method = draft.installed_via || "" const isPackaged = method === "dpkg" || method === "apk" diff --git a/tests/lxc_updates/test_native_app_discovery_ui.cjs b/tests/lxc_updates/test_native_app_discovery_ui.cjs index 51f759b7..3bb55dc4 100644 --- a/tests/lxc_updates/test_native_app_discovery_ui.cjs +++ b/tests/lxc_updates/test_native_app_discovery_ui.cjs @@ -134,6 +134,13 @@ async function main() { assert.ok(text(failed.tree()).includes('nativeScanFailed')) assert.equal(failed.calls.filter(c => c.url.endsWith('/apps/suggestions') && c.method === 'POST').length, 0) + const editorSwitch = fixture() + editorSwitch.render(); await editorSwitch.settle() + await editorSwitch.button('searchApplications').props.onClick(); editorSwitch.render() + await editorSwitch.button('registerButton').props.onClick(); editorSwitch.render() + editorSwitch.render({vmid: 102}) + assert.ok(!text(editorSwitch.tree()).includes('saveButton'), 'old editor must disappear in the very first render of another CT') + const late = fixture() late.render(); await late.settle(); late.holdScan() const scan = late.button('searchApplications').props.onClick() From 6d82cf4f15c5880876b6f5660a0d7806aab34652 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Thu, 15 Oct 2026 11:53:01 +0000 Subject: [PATCH 05/73] fix: exclude native system service candidates --- AppImage/scripts/native_app_discovery.py | 19 ++++++++++++-- .../tests/test_native_app_discovery.py | 25 ++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py index a87dfc6e..169fd4a2 100644 --- a/AppImage/scripts/native_app_discovery.py +++ b/AppImage/scripts/native_app_discovery.py @@ -62,6 +62,12 @@ _SYSTEM = { 'ip6tables', 'firewalld', 'ufw', 'resolvconf', 'wpa-supplicant', 'modemmanager', 'console-setup', 'keyboard-setup', 'plymouth', 'halt', 'reboot', 'shutdown', 'rc-local', 'ntpsec', 'networkd-dispatcher', 'busybox', 'atd', 'uuidd', + # Common packaged daemons are infrastructure, not a user-managed app. + 'nginx', 'apache', 'apache2', 'httpd', 'lighttpd', 'haproxy', 'traefik', + 'redis', 'redis-server', 'memcached', 'mysql', 'mysqld', 'mariadb', 'mariadbd', + 'postgres', 'postgresql', 'mongod', 'mongodb', 'rabbitmq-server', + 'elasticsearch', 'opensearch', 'fail2ban', 'named', 'bind9', 'dnsmasq', + 'avahi-daemon', 'smbd', 'nmbd', 'samba', 'vsftpd', 'proftpd', 'cups', 'tor', } _RUNTIMES = re.compile(r'(?:python[0-9.]*|node(?:js)?|sh|bash|dash|env|java|ruby|perl)\Z') @@ -205,9 +211,11 @@ def _path(value): def _system(name): raw = name.lower().removesuffix('.service') stem = raw.split('@')[0] - return raw.startswith('user@') or stem in _SYSTEM or stem.startswith(( + return (raw.startswith('user@') or stem in _SYSTEM + or (raw.startswith('php') and raw.endswith('-fpm')) + or stem.startswith(( 'systemd-', 'dbus-', 'getty', 'containerd-', 'apt-', 'dpkg-', 'e2scrub', - 'unattended-', 'ifup', 'ifdown', 'user@', 'btrfs-', 'lvm2-', 'lxc-')) + 'unattended-', 'ifup', 'ifdown', 'user@', 'btrfs-', 'lvm2-', 'lxc-'))) def _custom(path): @@ -240,6 +248,13 @@ def parse_records(text, kind): or install.startswith(('/usr/lib/systemd/', '/lib/systemd/', '/usr/lib/udev/', '/lib/udev/', '/usr/lib/apt/'))): continue + # /etc units are operator-owned. Do not infer an application from an + # arbitrary packaged systemd unit: without a package-db probe it is + # impossible to distinguish vendor infrastructure from a user app. + if (manager == 'systemd' + and source.startswith(('/usr/lib/systemd/system/', '/lib/systemd/system/')) + and not _custom(install)): + continue root = directory if _custom(directory) else str(Path(install).parent) # Generic runtime without an absolute application script is ambiguous. if runtime and not _custom(install): diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py index cc1539b1..21962223 100644 --- a/AppImage/scripts/tests/test_native_app_discovery.py +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -19,9 +19,9 @@ import native_app_discovery as native import lxc_apps -def service(name='handmade', exe='/opt/handmade/server', directory='/opt/handmade', manager='systemd', script=''): - path = ('/etc/systemd/system/' + name + '.service' if manager == 'systemd' - else '/etc/init.d/' + name) +def service(name='handmade', exe='/opt/handmade/server', directory='/opt/handmade', manager='systemd', script='', source=None): + path = source or ('/etc/systemd/system/' + name + '.service' if manager == 'systemd' + else '/etc/init.d/' + name) return '\t'.join(['S', path, manager, exe, script, directory]) + '\nEND\n' @@ -100,6 +100,25 @@ class DiscoveryFixtures(unittest.TestCase): self.assertEqual(result['candidates'], []) self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + def test_common_system_daemons_and_vendor_units_have_zero_footprint_probes(self): + cases = [ + ('nginx', '/usr/sbin/nginx', 'openrc', None), + ('apache2', '/usr/sbin/apache2', 'systemd', None), + ('redis-server', '/usr/bin/redis-server', 'systemd', None), + ('mariadb', '/usr/sbin/mariadbd', 'systemd', None), + ('postgresql', '/usr/lib/postgresql/16/bin/postgres', 'systemd', None), + ('php8.3-fpm', '/usr/sbin/php-fpm8.3', 'systemd', None), + ('vendor-daemon', '/usr/bin/vendor-daemon', 'systemd', + '/usr/lib/systemd/system/vendor-daemon.service'), + ] + for name, exe, manager, source in cases: + with self.subTest(name=name): + self.calls.clear() + result = native.scan(101, self.runner( + service(name=name, exe=exe, manager=manager, source=source))) + self.assertEqual(result['candidates'], []) + self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + def test_missing_remote_qemu_stopped_busy_oci_guards_precede_exec(self): scenarios = ['missing', 'stopped', 'busy', 'oci', 'invalid-oci', 'unmanaged'] for scenario in scenarios: From 61fae8f6f75b30840c65f28f660728653e61c701 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:20:40 +0000 Subject: [PATCH 06/73] fix: filter native discovery helper services --- AppImage/scripts/native_app_discovery.py | 43 ++++++++++++++-- .../tests/test_native_app_discovery.py | 49 +++++++++++++++++++ 2 files changed, 87 insertions(+), 5 deletions(-) diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py index 169fd4a2..35bb4f07 100644 --- a/AppImage/scripts/native_app_discovery.py +++ b/AppImage/scripts/native_app_discovery.py @@ -69,7 +69,13 @@ _SYSTEM = { 'elasticsearch', 'opensearch', 'fail2ban', 'named', 'bind9', 'dnsmasq', 'avahi-daemon', 'smbd', 'nmbd', 'samba', 'vsftpd', 'proftpd', 'cups', 'tor', } -_RUNTIMES = re.compile(r'(?:python[0-9.]*|node(?:js)?|sh|bash|dash|env|java|ruby|perl)\Z') +_RUNTIMES = re.compile(r'(?:python[0-9.]*|node(?:js)?|npm|pnpm|yarn|bun|sh|bash|dash|env|java|ruby|perl)\Z') +_PACKAGE_ROOT_RUNTIMES = {'node', 'nodejs', 'npm', 'pnpm', 'yarn', 'bun'} +_HELPER_ROLES = { + 'backup', 'bootstrap', 'bridge', 'cleanup', 'housekeeping', 'maintenance', + 'migrate', 'migration', 'restore', 'rotate', 'update', 'updater', 'upgrade', + 'watchdog', 'worker', +} class ProbeError(Exception): @@ -218,8 +224,23 @@ def _system(name): 'unattended-', 'ifup', 'ifdown', 'user@', 'btrfs-', 'lvm2-', 'lxc-'))) +def _helper(name): + """Reject service roles that support an application but are not one themselves.""" + raw = name.lower().removesuffix('.service') + if raw.endswith('@'): + return True # A systemd template is not a concrete running application. + return any(part in _HELPER_ROLES for part in re.split(r'[._-]+', raw) if part) + + def _custom(path): - return _path(path) and path.startswith(('/opt/', '/srv/', '/usr/local/')) + if not _path(path): + return False + if path.startswith(('/opt/', '/srv/', '/usr/local/')): + return True + # Native apps commonly keep their runtime below /home//. + # Do not accept a home directory itself: a second path component is required. + parts = path.split('/') + return len(parts) >= 4 and parts[1] == 'home' and bool(parts[2]) and bool(parts[3]) def parse_records(text, kind): @@ -240,10 +261,21 @@ def parse_records(text, kind): if service in seen_services: continue # /etc overrides vendor units; no duplicate installations. seen_services.add(service) - if not _NAME.fullmatch(service) or _system(service) or not _path(exe): + if (not _NAME.fullmatch(service) or _system(service) or _helper(service) + or not _path(exe)): continue - runtime = bool(_RUNTIMES.fullmatch(Path(exe).name)) - install = script if runtime else exe + runtime_name = Path(exe).name + runtime = bool(_RUNTIMES.fullmatch(runtime_name)) + if runtime and not _path(script): + # A Node/npm wrapper may keep its entry point relative to an + # operator-owned working directory. `package.json` is a bounded, + # declarative footprint that proves the application root without + # reading command arguments, environment or service secrets. + if runtime_name not in _PACKAGE_ROOT_RUNTIMES or not _custom(directory): + continue + install = str(Path(directory) / 'package.json') + else: + install = script if runtime else exe if (not _path(install) or _system(Path(install).name) or install.startswith(('/usr/lib/systemd/', '/lib/systemd/', '/usr/lib/udev/', '/lib/udev/', '/usr/lib/apt/'))): @@ -399,6 +431,7 @@ def scan(vmid, run=bounded_run): related[0].setdefault('listening_ports', []).extend(ports) elif not related and (_custom(exe) and _custom(directory) and not _system(Path(exe).name) + and not _helper(Path(exe).name) and not _RUNTIMES.fullmatch(Path(exe).name) and exe.startswith(directory.rstrip('/') + '/') and _NAME.fullmatch(Path(exe).name)): diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py index 21962223..661abd95 100644 --- a/AppImage/scripts/tests/test_native_app_discovery.py +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -119,6 +119,55 @@ class DiscoveryFixtures(unittest.TestCase): self.assertEqual(result['candidates'], []) self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + def test_helper_services_and_templates_have_zero_footprint_probes(self): + cases = [ + ('netpulse-stable-update', '/bin/bash', '/opt/netpulse', '/opt/netpulse/stable-apply.sh'), + ('rent-tool-backup', '/bin/bash', '/home/app/rent-tool', '/home/app/rent-tool/scripts/backup-db.sh'), + ('keynest-update', '/bin/bash', '/opt/keynest', '/opt/keynest/keynest-update.sh'), + ('cortendesk-bootstrap-worker', '/bin/bash', '/opt/cortendesk', '/opt/cortendesk/bootstrap-worker.sh'), + ('cortendesk-source-worker', '/bin/bash', '/opt/cortendesk', '/opt/cortendesk/source-worker.sh'), + ('cortendesk-managed-password@', '/bin/bash', '/opt/cortendesk', '/opt/cortendesk/password-bridge.sh'), + ] + for name, exe, directory, script in cases: + with self.subTest(name=name): + self.calls.clear() + result = native.scan(101, self.runner(service( + name=name, exe=exe, directory=directory, script=script))) + self.assertEqual(result['candidates'], []) + self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + + def test_node_and_npm_wrappers_use_only_custom_package_roots(self): + cases = [ + ('keynest', '/usr/bin/node', '/opt/keynest'), + ('rent-tool', '/usr/local/bin/npm', '/home/app/rent-tool'), + ] + for name, exe, directory in cases: + with self.subTest(name=name): + self.calls.clear() + result = native.scan(101, self.runner( + service(name=name, exe=exe, directory=directory), + footprint='FILE\n{"version":"1.2.3"}')) + item, = result['candidates'] + self.assertEqual(item['name'], name) + self.assertEqual(item['installation_path'], directory + '/package.json') + self.assertEqual(item['installed_version'], '1.2.3') + footprint_calls = [call for call in self.calls if native.FOOTPRINT_SCRIPT in call] + self.assertEqual(len(footprint_calls), 1) + self.assertEqual(footprint_calls[0][-2:], [directory + '/package.json', directory]) + + self.calls.clear() + result = native.scan(101, self.runner(service( + name='ambiguous-home-runtime', exe='/usr/bin/node', directory='/home/app'))) + self.assertEqual(result['candidates'], []) + self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + + def test_helper_process_fallback_has_zero_footprint_probes(self): + self.calls.clear() + result = native.scan(101, self.runner( + services='END\n', processes='P\t123\t/opt/cortendesk/run-worker\t/opt/cortendesk\nEND\n')) + self.assertEqual(result['candidates'], []) + self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + def test_missing_remote_qemu_stopped_busy_oci_guards_precede_exec(self): scenarios = ['missing', 'stopped', 'busy', 'oci', 'invalid-oci', 'unmanaged'] for scenario in scenarios: From e978bac91a8b1b6db4b18b6ffdbf3720c9a4c320 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Thu, 15 Oct 2026 19:15:07 +0000 Subject: [PATCH 07/73] fix: detect native node release layouts --- AppImage/scripts/native_app_discovery.py | 97 +++++++++++++++++-- .../tests/test_native_app_discovery.py | 74 +++++++++++++- 2 files changed, 158 insertions(+), 13 deletions(-) diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py index 35bb4f07..11f9acf1 100644 --- a/AppImage/scripts/native_app_discovery.py +++ b/AppImage/scripts/native_app_discovery.py @@ -207,6 +207,27 @@ if [ -f "$2/package.json" ]; then timeout -s KILL 1 head -c 8192 "$2/package.json" fi ''' +MANIFEST_FOOTPRINT_SCRIPT = r''' +command -v head >/dev/null && command -v readlink >/dev/null || exit 1 +# Resolve only the operator-owned working directory and its declared parent. +# A release symlink may change the concrete version directory, but it must not +# escape the bounded custom application root supplied by the host. +workdir=$(timeout -s KILL 1 readlink -f "$1") || exit 1 +anchor=$(timeout -s KILL 1 readlink -f "$2") || exit 1 +parent=$(timeout -s KILL 1 readlink -f "$3") || exit 1 +case "$anchor" in "$parent"/*) ;; *) printf 'OUTSIDE\n'; exit 0;; esac +case "$workdir" in "$anchor"|"$anchor"/*) ;; *) printf 'OUTSIDE\n'; exit 0;; esac +for relative in package.json server/package.json; do + candidate="$workdir/$relative" + [ -f "$candidate" ] && [ -r "$candidate" ] || continue + resolved=$(timeout -s KILL 1 readlink -f "$candidate") || exit 1 + case "$resolved" in "$workdir"/*) ;; *) printf 'OUTSIDE\n'; exit 0;; esac + printf 'MANIFEST\t%s\n' "$relative" + timeout -s KILL 1 head -c 8192 "$resolved" + exit 0 +done +printf 'MISSING\n' +''' def _path(value): @@ -243,6 +264,50 @@ def _custom(path): return len(parts) >= 4 and parts[1] == 'home' and bool(parts[2]) and bool(parts[3]) +def _manifest_bounds(executable, directory): + """Return a narrow, operator-owned boundary for a runtime manifest probe.""" + try: + shared = os.path.commonpath((executable, directory)) + except ValueError: + shared = '' + anchor = shared if _custom(shared) else directory + parts = anchor.split('/') + if anchor.startswith(('/opt/', '/srv/')): + parent = '/' + parts[1] + elif anchor.startswith('/usr/local/'): + parent = '/usr/local' + elif len(parts) >= 4 and parts[1] == 'home' and parts[2]: + parent = f'/home/{parts[2]}' + else: + return None + return anchor, parent + + +def _manifest_footprint(record, run, deadline): + """Read one of two fixed Node manifest locations without following an escape.""" + output = run(['pct', 'exec', str(record['vmid']), '--', 'timeout', '-s', 'KILL', '2', + 'sh', '-c', MANIFEST_FOOTPRINT_SCRIPT, 'discovery', + record['root'], record['manifest_anchor'], record['manifest_parent']], deadline) + header, separator, metadata = output.partition('\n') + if header == 'MISSING': + if metadata: + raise ProbeError('invalid_data') + return None, None + if header == 'OUTSIDE': + if metadata: + raise ProbeError('invalid_data') + raise ProbeError('unsafe_manifest_root') + prefix = 'MANIFEST\t' + relative = header.removeprefix(prefix) + if not header.startswith(prefix) or relative not in ('package.json', 'server/package.json'): + raise ProbeError('invalid_data') + if not separator: + raise ProbeError('invalid_data') + candidate_record = dict(record) + candidate_record['path'] = str(Path(record['root']) / relative) + return candidate_record, 'FILE\n' + metadata + + def parse_records(text, kind): lines = text.splitlines() if not lines or lines[-1] not in ('END', 'LIMIT'): @@ -266,14 +331,18 @@ def parse_records(text, kind): continue runtime_name = Path(exe).name runtime = bool(_RUNTIMES.fullmatch(runtime_name)) + manifest_bounds = None if runtime and not _path(script): # A Node/npm wrapper may keep its entry point relative to an - # operator-owned working directory. `package.json` is a bounded, - # declarative footprint that proves the application root without - # reading command arguments, environment or service secrets. + # operator-owned working directory. Only two fixed manifest + # locations can prove that root; no argv, environment, recursive + # search or guest-provided path is ever used. if runtime_name not in _PACKAGE_ROOT_RUNTIMES or not _custom(directory): continue install = str(Path(directory) / 'package.json') + manifest_bounds = _manifest_bounds(exe, directory) + if manifest_bounds is None: + continue else: install = script if runtime else exe if (not _path(install) or _system(Path(install).name) @@ -291,8 +360,11 @@ def parse_records(text, kind): # Generic runtime without an absolute application script is ambiguous. if runtime and not _custom(install): continue - records.append({'name': service, 'path': install, 'root': root, - 'service': source, 'manager': manager, 'executable': exe}) + record = {'name': service, 'path': install, 'root': root, + 'service': source, 'manager': manager, 'executable': exe} + if manifest_bounds: + record['manifest_anchor'], record['manifest_parent'] = manifest_bounds + records.append(record) elif kind == 'P' and len(parts) == 4 and parts[0] == 'P': _, pid, exe, directory = parts if not pid.isdigit() or not _path(exe) or not _path(directory): @@ -447,10 +519,17 @@ def scan(vmid, run=bounded_run): issues.append('candidate_limit') break try: - footprint = run(['pct', 'exec', str(vmid), '--', 'timeout', '-s', 'KILL', '2', - 'sh', '-c', FOOTPRINT_SCRIPT, - 'discovery', record['path'], record['root']], deadline) - item = candidate(vmid, record, footprint) + probe_record = dict(record) + probe_record['vmid'] = vmid + if 'manifest_anchor' in record: + probe_record, footprint = _manifest_footprint(probe_record, run, deadline) + if probe_record is None: + continue + else: + footprint = run(['pct', 'exec', str(vmid), '--', 'timeout', '-s', 'KILL', '2', + 'sh', '-c', FOOTPRINT_SCRIPT, + 'discovery', record['path'], record['root']], deadline) + item = candidate(vmid, probe_record, footprint) items.append(item) if item['metadata_issue']: issues.append(item['metadata_issue']) diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py index 661abd95..4ff2f875 100644 --- a/AppImage/scripts/tests/test_native_app_discovery.py +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -44,7 +44,8 @@ class DiscoveryFixtures(unittest.TestCase): native._locks.clear() self.calls = [] - def runner(self, services=None, processes='END\n', footprint='FILE\n', status='status: running', ports='END\n'): + def runner(self, services=None, processes='END\n', footprint='FILE\n', manifest=None, + status='status: running', ports='END\n'): def run(argv, deadline): self.calls.append(argv) self.assertLessEqual(deadline - time.monotonic(), native.TOTAL_SECONDS) @@ -59,6 +60,10 @@ class DiscoveryFixtures(unittest.TestCase): return processes if script == native.PORT_SCRIPT: return ports + if script == native.MANIFEST_FOOTPRINT_SCRIPT: + if manifest is not None: + return manifest + return 'MANIFEST\tpackage.json\n' + footprint.removeprefix('FILE\n') if script == native.FOOTPRINT_SCRIPT: return footprint self.fail('Unexpected probe') @@ -136,7 +141,7 @@ class DiscoveryFixtures(unittest.TestCase): self.assertEqual(result['candidates'], []) self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) - def test_node_and_npm_wrappers_use_only_custom_package_roots(self): + def test_node_and_npm_wrappers_use_only_bounded_manifest_roots(self): cases = [ ('keynest', '/usr/bin/node', '/opt/keynest'), ('rent-tool', '/usr/local/bin/npm', '/home/app/rent-tool'), @@ -151,14 +156,75 @@ class DiscoveryFixtures(unittest.TestCase): self.assertEqual(item['name'], name) self.assertEqual(item['installation_path'], directory + '/package.json') self.assertEqual(item['installed_version'], '1.2.3') - footprint_calls = [call for call in self.calls if native.FOOTPRINT_SCRIPT in call] + footprint_calls = [call for call in self.calls if native.MANIFEST_FOOTPRINT_SCRIPT in call] self.assertEqual(len(footprint_calls), 1) - self.assertEqual(footprint_calls[0][-2:], [directory + '/package.json', directory]) + if directory.startswith('/home/'): + parent = '/home/app' + else: + parent = '/opt' + self.assertEqual(footprint_calls[0][-3:], [directory, directory, parent]) self.calls.clear() result = native.scan(101, self.runner(service( name='ambiguous-home-runtime', exe='/usr/bin/node', directory='/home/app'))) self.assertEqual(result['candidates'], []) + self.assertFalse(any(native.MANIFEST_FOOTPRINT_SCRIPT in call for call in self.calls)) + + def test_node_release_layout_uses_only_server_manifest_under_shared_root(self): + self.calls.clear() + result = native.scan(101, self.runner( + service(name='keynest', exe='/opt/keynest/node/bin/node', directory='/opt/keynest/current'), + manifest='MANIFEST\tserver/package.json\n{"version":"1.5.63"}')) + item, = result['candidates'] + self.assertEqual(item['name'], 'keynest') + self.assertEqual(item['installation_path'], '/opt/keynest/current/server/package.json') + self.assertEqual(item['installed_version'], '1.5.63') + manifest_calls = [call for call in self.calls if native.MANIFEST_FOOTPRINT_SCRIPT in call] + self.assertEqual(len(manifest_calls), 1) + self.assertEqual(manifest_calls[0][-3:], + ['/opt/keynest/current', '/opt/keynest', '/opt']) + + def test_node_release_layout_rejects_manifest_outside_operator_root(self): + self.calls.clear() + result = native.scan(101, self.runner( + service(name='outside-root', exe='/opt/outside/node/bin/node', directory='/opt/outside/current'), + manifest='OUTSIDE\n')) + self.assertEqual(result['candidates'], []) + self.assertIn('unsafe_manifest_root', result['issues']) + self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + + def test_actual_manifest_probe_accepts_release_and_rejects_symlink_escape(self): + parent = self.root / 'opt' + anchor = parent / 'keynest' + release = anchor / 'releases' / 'v1.5.63' + manifest = release / 'server' / 'package.json' + manifest.parent.mkdir(parents=True) + manifest.write_text('{"version":"1.5.63"}') + current = anchor / 'current' + current.symlink_to(release) + output = native.bounded_run( + ['sh', '-c', native.MANIFEST_FOOTPRINT_SCRIPT, 'fixture', + str(current), str(anchor), str(parent)], time.monotonic() + 3) + self.assertEqual(output, 'MANIFEST\tserver/package.json\n{"version":"1.5.63"}') + + outside = self.root / 'outside' / 'package.json' + outside.parent.mkdir() + outside.write_text('{"version":"not-readable"}') + manifest.unlink() + manifest.symlink_to(outside) + output = native.bounded_run( + ['sh', '-c', native.MANIFEST_FOOTPRINT_SCRIPT, 'fixture', + str(current), str(anchor), str(parent)], time.monotonic() + 3) + self.assertEqual(output, 'OUTSIDE\n') + self.assertNotIn('not-readable', output) + + def test_node_wrapper_with_no_fixed_manifest_is_not_an_error_or_candidate(self): + self.calls.clear() + result = native.scan(101, self.runner( + service(name='missing-manifest', exe='/opt/missing/node/bin/node', directory='/opt/missing/current'), + manifest='MISSING\n')) + self.assertEqual(result['status'], 'complete') + self.assertEqual(result['candidates'], []) self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) def test_helper_process_fallback_has_zero_footprint_probes(self): From 1f75147d5157eb524e297d25fa75130ba32be30f Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Fri, 16 Oct 2026 04:47:53 +0000 Subject: [PATCH 08/73] fix: recognize Hestia panel and filter watch helpers --- AppImage/scripts/native_app_discovery.py | 28 +++++++++++++++++-- .../tests/test_native_app_discovery.py | 18 ++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py index 11f9acf1..534c9125 100644 --- a/AppImage/scripts/native_app_discovery.py +++ b/AppImage/scripts/native_app_discovery.py @@ -74,8 +74,11 @@ _PACKAGE_ROOT_RUNTIMES = {'node', 'nodejs', 'npm', 'pnpm', 'yarn', 'bun'} _HELPER_ROLES = { 'backup', 'bootstrap', 'bridge', 'cleanup', 'housekeeping', 'maintenance', 'migrate', 'migration', 'restore', 'rotate', 'update', 'updater', 'upgrade', - 'watchdog', 'worker', + 'watch', 'watchdog', 'worker', } +_HESTIA_NGINX = '/usr/local/hestia/nginx/sbin/hestia-nginx' +_HESTIA_ROOT = '/usr/local/hestia' +_HESTIA_PANEL_PORT = 8083 class ProbeError(Exception): @@ -253,6 +256,17 @@ def _helper(name): return any(part in _HELPER_ROLES for part in re.split(r'[._-]+', raw) if part) +def _hestia_panel_process(executable, ports): + """Recognize only Hestia's own bound control-panel process. + + Hestia's generated init unit does not expose an ExecStart that the generic + service parser may treat as an application. Its panel process and port are + stable, local runtime metadata, so this stays narrower than accepting + arbitrary vendor services or a generic web server. + """ + return executable == _HESTIA_NGINX and _HESTIA_PANEL_PORT in ports + + def _custom(path): if not _path(path): return False @@ -367,7 +381,10 @@ def parse_records(text, kind): records.append(record) elif kind == 'P' and len(parts) == 4 and parts[0] == 'P': _, pid, exe, directory = parts - if not pid.isdigit() or not _path(exe) or not _path(directory): + # A process rooted at / is normally too ambiguous for generic + # discovery, but it is valid process metadata for the exact Hestia + # panel signature below. It never becomes a generic candidate. + if not pid.isdigit() or not _path(exe) or (directory != '/' and not _path(directory)): continue records.append({'pid': pid, 'executable': exe, 'root': directory}) elif kind == 'L' and len(parts) == 3 and parts[0] == 'L': @@ -407,7 +424,8 @@ def candidate(vmid, record, footprint): evidence.append({'kind': record['manager'], 'value': record['service']}) else: evidence.extend([{'kind': 'process_executable', 'value': record['process']}, - {'kind': 'working_directory', 'value': record['root']}]) + {'kind': 'working_directory', + 'value': record.get('process_root', record['root'])}]) ports = sorted(set(record.get('listening_ports') or [])) evidence.extend({'kind': 'tcp_listener', 'value': str(port)} for port in ports) return {'slug': identity, 'discovery_id': identity, 'source': 'native_metadata', @@ -501,6 +519,10 @@ def scan(vmid, run=bounded_run): ports = [entry['port'] for entry in listeners if entry['pid'] == process['pid']] if len(related) == 1: related[0].setdefault('listening_ports', []).extend(ports) + elif not related and _hestia_panel_process(exe, ports): + records.append({'name': 'Hestia', 'path': exe, 'root': _HESTIA_ROOT, + 'process': exe, 'process_root': directory, 'executable': exe, + 'listening_ports': ports}) elif not related and (_custom(exe) and _custom(directory) and not _system(Path(exe).name) and not _helper(Path(exe).name) diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py index 4ff2f875..e9073f6e 100644 --- a/AppImage/scripts/tests/test_native_app_discovery.py +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -132,6 +132,7 @@ class DiscoveryFixtures(unittest.TestCase): ('cortendesk-bootstrap-worker', '/bin/bash', '/opt/cortendesk', '/opt/cortendesk/bootstrap-worker.sh'), ('cortendesk-source-worker', '/bin/bash', '/opt/cortendesk', '/opt/cortendesk/source-worker.sh'), ('cortendesk-managed-password@', '/bin/bash', '/opt/cortendesk', '/opt/cortendesk/password-bridge.sh'), + ('miminails-watch', '/usr/local/bin/miminails-watch', '/usr/local/bin', ''), ] for name, exe, directory, script in cases: with self.subTest(name=name): @@ -141,6 +142,23 @@ class DiscoveryFixtures(unittest.TestCase): self.assertEqual(result['candidates'], []) self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + def test_hestia_panel_is_recognized_only_from_its_exact_runtime_and_port(self): + hestia = '/usr/local/hestia/nginx/sbin/hestia-nginx' + process = f'P\t391\t{hestia}\t/\nEND\n' + result = native.scan(101, self.runner( + services='END\n', processes=process, ports='L\t391\t8083\nEND\n')) + item, = result['candidates'] + self.assertEqual(item['name'], 'Hestia') + self.assertEqual(item['installation_path'], hestia) + self.assertEqual(item['listening_ports'], [8083]) + self.assertIn({'kind': 'working_directory', 'value': '/'}, item['evidence']) + + self.calls.clear() + result = native.scan(101, self.runner( + services='END\n', processes=process, ports='L\t391\t8443\nEND\n')) + self.assertEqual(result['candidates'], []) + self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + def test_node_and_npm_wrappers_use_only_bounded_manifest_roots(self): cases = [ ('keynest', '/usr/bin/node', '/opt/keynest'), From 20acf0852a4567ac937e2bdf95291091fd904656 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Fri, 16 Oct 2026 07:15:43 +0000 Subject: [PATCH 09/73] fix: find Hestia behind bounded process metadata --- AppImage/scripts/native_app_discovery.py | 50 ++++++++++++++++++- .../tests/test_native_app_discovery.py | 14 ++++-- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py index 534c9125..a807ead1 100644 --- a/AppImage/scripts/native_app_discovery.py +++ b/AppImage/scripts/native_app_discovery.py @@ -202,6 +202,30 @@ else exit 1 fi ''' +HESTIA_PANEL_SCRIPT = r''' +# The generic process collector intentionally stops after a bounded number of +# records and ignores shared listener ownership. Hestia's master/worker pair +# can therefore be outside that generic result. This narrow fallback never +# accepts a name alone: it requires Hestia's exact executable and its panel +# listener on the fixed local port. +[ -x /usr/local/hestia/nginx/sbin/hestia-nginx ] || { printf 'END\n'; exit 0; } +command -v pgrep >/dev/null && command -v readlink >/dev/null && command -v ss >/dev/null && command -v head >/dev/null || exit 1 +n=0 +for pid in $(pgrep -x hestia-nginx 2>/dev/null | head -n 9); do + case "$pid" in *[!0-9]*|'') continue;; esac + n=$((n+1)); [ "$n" -le 8 ] || { printf 'LIMIT\n'; exit 0; } + exe=$(timeout -s KILL 1 readlink "/proc/$pid/exe") || continue + [ "$exe" = /usr/local/hestia/nginx/sbin/hestia-nginx ] || continue + cwd=$(timeout -s KILL 1 readlink "/proc/$pid/cwd") || continue + if timeout -s KILL 1 ss -H -lntp | awk -v pid="$pid" ' + {port=$4; sub(/^.*:/,"",port) + if (port == 8083 && index($0, "pid=" pid ",")) found=1} + END {exit(found ? 0 : 1)}'; then + printf 'H\t%s\t%s\t%s\t8083\n' "$pid" "$exe" "$cwd" + fi +done +printf 'END\n' +''' FOOTPRINT_SCRIPT = r''' [ -f "$1" ] && [ -r "$1" ] || exit 1 printf 'FILE\n' @@ -393,6 +417,15 @@ def parse_records(text, kind): records.append({'pid': pid, 'port': int(port)}) else: raise ProbeError('invalid_data') + elif kind == 'H' and len(parts) == 5 and parts[0] == 'H': + _, pid, exe, directory, port = parts + if (pid.isdigit() and exe == _HESTIA_NGINX + and (directory == '/' or _path(directory)) + and port == str(_HESTIA_PANEL_PORT)): + records.append({'pid': pid, 'executable': exe, 'root': directory, + 'port': _HESTIA_PANEL_PORT}) + else: + raise ProbeError('invalid_data') else: raise ProbeError('invalid_data') return records, lines[-1] == 'LIMIT', len(lines) - 1 @@ -487,7 +520,7 @@ def _guard(vmid, deadline, run): def scan(vmid, run=bounded_run): deadline = time.monotonic() + TOTAL_SECONDS _guard(vmid, deadline, run) - records, issues, consumed, processes, listeners = [], [], 0, [], [] + records, issues, consumed, processes, listeners, hestia_panels = [], [], 0, [], [], [] for kind, script in (('S', SERVICE_SCRIPT), ('P', PROCESS_SCRIPT), ('L', PORT_SCRIPT)): try: if consumed >= MAX_RECORDS: @@ -512,6 +545,16 @@ def scan(vmid, run=bounded_run): issues.append('metadata_limit') except ProbeError as exc: issues.append(str(exc)) + try: + # This is outside the generic record budget: it returns only an exact, + # fixed Hestia signature, not additional arbitrary process metadata. + hestia_panels, limited, _ = parse_records(run( + ['pct', 'exec', str(vmid), '--', 'timeout', '-s', 'KILL', '2', + 'sh', '-c', HESTIA_PANEL_SCRIPT, 'discovery'], deadline), 'H') + if limited: + issues.append('metadata_limit') + except ProbeError as exc: + issues.append(str(exc)) for process in processes: exe, directory = process['executable'], process['root'] related = [record for record in records if record['executable'] == exe and ( @@ -531,6 +574,11 @@ def scan(vmid, run=bounded_run): and _NAME.fullmatch(Path(exe).name)): records.append({'name': Path(exe).name, 'path': exe, 'root': directory, 'process': exe, 'executable': exe, 'listening_ports': ports}) + for panel in hestia_panels: + records.append({'name': 'Hestia', 'path': panel['executable'], 'root': _HESTIA_ROOT, + 'process': panel['executable'], 'process_root': panel['root'], + 'executable': panel['executable'], + 'listening_ports': [panel['port']]}) items, seen = [], set() for record in records: key = (record['path'], record['root']) diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py index e9073f6e..f47c33c9 100644 --- a/AppImage/scripts/tests/test_native_app_discovery.py +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -45,7 +45,7 @@ class DiscoveryFixtures(unittest.TestCase): self.calls = [] def runner(self, services=None, processes='END\n', footprint='FILE\n', manifest=None, - status='status: running', ports='END\n'): + status='status: running', ports='END\n', hestia_panels='END\n'): def run(argv, deadline): self.calls.append(argv) self.assertLessEqual(deadline - time.monotonic(), native.TOTAL_SECONDS) @@ -60,6 +60,8 @@ class DiscoveryFixtures(unittest.TestCase): return processes if script == native.PORT_SCRIPT: return ports + if script == native.HESTIA_PANEL_SCRIPT: + return hestia_panels if script == native.MANIFEST_FOOTPRINT_SCRIPT: if manifest is not None: return manifest @@ -144,21 +146,25 @@ class DiscoveryFixtures(unittest.TestCase): def test_hestia_panel_is_recognized_only_from_its_exact_runtime_and_port(self): hestia = '/usr/local/hestia/nginx/sbin/hestia-nginx' - process = f'P\t391\t{hestia}\t/\nEND\n' + panel = f'H\t391\t{hestia}\t/\t8083\nEND\n' result = native.scan(101, self.runner( - services='END\n', processes=process, ports='L\t391\t8083\nEND\n')) + services='END\n', processes='LIMIT\n', ports='END\n', hestia_panels=panel)) item, = result['candidates'] self.assertEqual(item['name'], 'Hestia') self.assertEqual(item['installation_path'], hestia) self.assertEqual(item['listening_ports'], [8083]) self.assertIn({'kind': 'working_directory', 'value': '/'}, item['evidence']) + self.assertIn('metadata_limit', result['issues']) self.calls.clear() result = native.scan(101, self.runner( - services='END\n', processes=process, ports='L\t391\t8443\nEND\n')) + services='END\n', processes='LIMIT\n', ports='END\n')) self.assertEqual(result['candidates'], []) self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + with self.assertRaises(native.ProbeError): + native.parse_records(f'H\t391\t{hestia}\t/\t8443\nEND\n', 'H') + def test_node_and_npm_wrappers_use_only_bounded_manifest_roots(self): cases = [ ('keynest', '/usr/bin/node', '/opt/keynest'), From 503302cea35c7b3b8b24fb546e9e36afffa33b81 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Fri, 16 Oct 2026 08:25:17 +0000 Subject: [PATCH 10/73] fix: prefill verified Hestia panel endpoint --- AppImage/scripts/native_app_discovery.py | 12 +++++++++++- .../scripts/tests/test_native_app_discovery.py | 9 +++++++++ tests/lxc_updates/test_native_app_discovery_ui.cjs | 14 ++++++++++++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py index a807ead1..5ade84bd 100644 --- a/AppImage/scripts/native_app_discovery.py +++ b/AppImage/scripts/native_app_discovery.py @@ -460,11 +460,21 @@ def candidate(vmid, record, footprint): {'kind': 'working_directory', 'value': record.get('process_root', record['root'])}]) ports = sorted(set(record.get('listening_ports') or [])) + # Hestia's control panel is a narrow, verified exception to generic port + # inference: its own executable serves the panel on fixed HTTPS port 8083. + # Keep this declaration on the exact runtime signature so an unrelated + # application merely listening on 8083 never receives an HTTPS guess. + hestia_panel = (record['name'] == 'Hestia' + and record['path'] == _HESTIA_NGINX + and record['root'] == _HESTIA_ROOT + and _HESTIA_PANEL_PORT in ports) evidence.extend({'kind': 'tcp_listener', 'value': str(port)} for port in ports) return {'slug': identity, 'discovery_id': identity, 'source': 'native_metadata', 'name': record['name'], 'installed_version': version, 'evidence': evidence, - 'installation_path': record['path'], 'default_ports': [], + 'installation_path': record['path'], + 'default_ports': [_HESTIA_PANEL_PORT] if hestia_panel else [], 'listening_ports': ports, + **({'scheme': 'https'} if hestia_panel else {}), 'metadata_issue': metadata_issue, 'tracking_suggestion': ({'installed_via': 'manual', 'installed_version': version, 'detected_version': version, 'detector_verified': True} diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py index f47c33c9..d1432b65 100644 --- a/AppImage/scripts/tests/test_native_app_discovery.py +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -153,9 +153,18 @@ class DiscoveryFixtures(unittest.TestCase): self.assertEqual(item['name'], 'Hestia') self.assertEqual(item['installation_path'], hestia) self.assertEqual(item['listening_ports'], [8083]) + self.assertEqual(item['default_ports'], [8083]) + self.assertEqual(item['scheme'], 'https') self.assertIn({'kind': 'working_directory', 'value': '/'}, item['evidence']) self.assertIn('metadata_limit', result['issues']) + unrelated = native.candidate(101, { + 'name': 'other-panel', 'path': '/opt/other-panel/server', 'root': '/opt/other-panel', + 'process': '/opt/other-panel/server', 'listening_ports': [8083], + }, 'FILE\n') + self.assertEqual(unrelated['default_ports'], []) + self.assertNotIn('scheme', unrelated) + self.calls.clear() result = native.scan(101, self.runner( services='END\n', processes='LIMIT\n', ports='END\n')) diff --git a/tests/lxc_updates/test_native_app_discovery_ui.cjs b/tests/lxc_updates/test_native_app_discovery_ui.cjs index 3bb55dc4..06a77f2e 100644 --- a/tests/lxc_updates/test_native_app_discovery_ui.cjs +++ b/tests/lxc_updates/test_native_app_discovery_ui.cjs @@ -23,7 +23,7 @@ const candidate = { evidence: [{kind: 'installation_file', value: '/opt/handmade/server'}], default_ports: [], } -function fixture() { +function fixture({nativeCandidate = candidate} = {}) { let cursor = 0, tree, props, effects = [], states = [], refs = [], effectStates = [] const calls = [], cachedWrites = [] let native = {vmid: 101, status: 'not_scanned', candidates: [], stale: false} @@ -49,7 +49,7 @@ function fixture() { if (url.endsWith('/native-discovery')) { if (options.method === 'POST') { if (scanGate) await scanGate - native = {...native, status: scanStatus, candidates: [candidate]} + native = {...native, status: scanStatus, candidates: [nativeCandidate]} } return structuredClone(native) } @@ -123,6 +123,16 @@ async function main() { assert.equal(payload.repo, '') assert.equal(payload.upstream_type, '') + const hestia = fixture({nativeCandidate: { + ...candidate, name: 'Hestia', default_ports: [8083], scheme: 'https', + }}) + hestia.render(); await hestia.settle() + await hestia.button('searchApplications').props.onClick(); hestia.render() + await hestia.button('registerButton').props.onClick(); hestia.render() + await hestia.button('saveButton').props.onClick(); hestia.render() + const hestiaPayload = JSON.parse(hestia.calls.find(c => /\/apps$/.test(c.url) && c.method === 'POST').body) + assert.deepEqual(hestiaPayload.ports, [{port: 8083, scheme: 'https', web_path: ''}], + 'a verified Hestia panel pre-fills only its fixed HTTPS endpoint') const partial = fixture() partial.render(); await partial.settle(); partial.setScanStatus('partial') await partial.button('searchApplications').props.onClick(); partial.render() From c393a56b92d236080d8d9323db0076b2bb3f25e1 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Sat, 17 Oct 2026 11:31:51 +0000 Subject: [PATCH 11/73] fix: preserve native discovery results after delayed cache reads --- AppImage/components/lxc-app-panel.tsx | 7 ++++++- .../test_native_app_discovery_ui.cjs | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/AppImage/components/lxc-app-panel.tsx b/AppImage/components/lxc-app-panel.tsx index 24003d66..22154ef6 100644 --- a/AppImage/components/lxc-app-panel.tsx +++ b/AppImage/components/lxc-app-panel.tsx @@ -475,6 +475,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: const [sidecar, setSidecar] = useState(seed?.sidecar ?? null) const [suggestions, setSuggestions] = useState(seed?.suggestions ?? null) const [nativeDiscovery, setNativeDiscovery] = useState(null) + const nativeRequest = useRef(0) const targetRef = useRef(vmid) targetRef.current = vmid const targetGeneration = useRef(0) @@ -485,6 +486,7 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: } useEffect(() => { const generation = targetGeneration.current + const request = ++nativeRequest.current setNativeDiscovery(null) setEditing(null) setDetectionNotice(null) @@ -492,7 +494,8 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: setSaving(false) if (managed) return fetchApi(`/api/vms/${vmid}/apps/native-discovery`).then(result => { - if (targetRef.current === vmid && targetGeneration.current === generation) setNativeDiscovery(result) + if (targetRef.current === vmid && targetGeneration.current === generation + && nativeRequest.current === request) setNativeDiscovery(result) }).catch(() => { /* cached metadata is optional; never initiate a scan */ }) return () => { targetGeneration.current += 1 } }, [vmid, managed]) @@ -787,7 +790,9 @@ export function LxcAppPanel({ vmid, ctIp, onChange, managed, initialData, oci }: const searchInstalledApplications = async () => { const generation = targetGeneration.current + const request = ++nativeRequest.current const isCurrent = () => targetRef.current === vmid && targetGeneration.current === generation + && nativeRequest.current === request const before = new Set([...visibleDetected, ...visibleWorkloads].map((item) => item.slug)) setSearchingApplications(true) setDetectionNotice(null) diff --git a/tests/lxc_updates/test_native_app_discovery_ui.cjs b/tests/lxc_updates/test_native_app_discovery_ui.cjs index 06a77f2e..2ffa802e 100644 --- a/tests/lxc_updates/test_native_app_discovery_ui.cjs +++ b/tests/lxc_updates/test_native_app_discovery_ui.cjs @@ -28,6 +28,7 @@ function fixture({nativeCandidate = candidate} = {}) { const calls = [], cachedWrites = [] let native = {vmid: 101, status: 'not_scanned', candidates: [], stale: false} let holdScan, scanGate, holdSave, saveGate, scanStatus = 'complete' + let cacheGate, resolveCache, cachePending = false const seed = {sidecar: {vmid: 101, apps: []}, suggestions: {extras: [], port_suggestions: []}} const react = { useState(initial) { @@ -47,6 +48,12 @@ function fixture({nativeCandidate = candidate} = {}) { const api = async (url, options = {}) => { calls.push({url, ...options}) if (url.endsWith('/native-discovery')) { + if (options.method !== 'POST' && cachePending) { + cachePending = false + const oldSnapshot = structuredClone(native) + await cacheGate + return oldSnapshot + } if (options.method === 'POST') { if (scanGate) await scanGate native = {...native, status: scanStatus, candidates: [nativeCandidate]} @@ -92,6 +99,8 @@ function fixture({nativeCandidate = candidate} = {}) { } return {render, settle, calls, cachedWrites, button, tree: () => tree, setNative: value => {native = value}, + holdInitialCache: () => {cachePending = true; cacheGate = new Promise(resolve => {resolveCache = resolve})}, + resolveInitialCache: () => resolveCache(), setScanStatus: value => {scanStatus = value}, holdScan: () => {scanGate = new Promise(resolve => {holdScan = resolve})}, resolveScan: () => holdScan(), holdSave: () => {saveGate = new Promise(resolve => {holdSave = resolve})}, resolveSave: () => holdSave(), @@ -133,6 +142,15 @@ async function main() { const hestiaPayload = JSON.parse(hestia.calls.find(c => /\/apps$/.test(c.url) && c.method === 'POST').body) assert.deepEqual(hestiaPayload.ports, [{port: 8083, scheme: 'https', web_path: ''}], 'a verified Hestia panel pre-fills only its fixed HTTPS endpoint') + const delayedCache = fixture() + delayedCache.holdInitialCache() + delayedCache.render(); await delayedCache.settle() + await delayedCache.button('searchApplications').props.onClick(); delayedCache.render() + assert.ok(text(delayedCache.tree()).includes('/opt/handmade/server')) + delayedCache.resolveInitialCache(); await delayedCache.settle() + assert.ok(text(delayedCache.tree()).includes('/opt/handmade/server'), + 'a delayed initial cache read must not erase a completed explicit search') + const partial = fixture() partial.render(); await partial.settle(); partial.setScanStatus('partial') await partial.button('searchApplications').props.onClick(); partial.render() From 22098042ba637e283f50344292510d4780f3b724 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Sat, 17 Oct 2026 11:53:30 +0000 Subject: [PATCH 12/73] fix: exclude Alpine service supervision from native discovery --- AppImage/scripts/native_app_discovery.py | 2 ++ .../scripts/tests/test_native_app_discovery.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py index 5ade84bd..29a56b7b 100644 --- a/AppImage/scripts/native_app_discovery.py +++ b/AppImage/scripts/native_app_discovery.py @@ -46,6 +46,8 @@ _NAME = re.compile(r'[A-Za-z0-9][A-Za-z0-9_.+@-]{0,63}\Z') _VERSION = re.compile(r'v?\d+(?:\.\d+){1,4}(?:[-+._][A-Za-z0-9.-]+)?\Z') _SYSTEM = { 'ssh', 'sshd', 'cron', 'crond', 'postfix', 'rsyslog', 'syslog', 'syslog-ng', + # Alpine/OpenRC system logging and service supervision are not apps. + 'klogd', 'syslogd', 'openrc-user', 'runit', 'runsvdir', 'runsv', 'supervise-daemon', 'dbus', 'dbus-broker', 'systemd', 'udev', 'networking', 'network', 'networkmanager', 'dhcpcd', 'dhclient', 'chrony', 'chronyd', 'ntp', 'ntpd', 'openntpd', 'agetty', 'getty', 'login', 'polkit', 'polkitd', 'accounts-daemon', 'acpid', 'anacron', diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py index d1432b65..5e90b4cf 100644 --- a/AppImage/scripts/tests/test_native_app_discovery.py +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -126,6 +126,24 @@ class DiscoveryFixtures(unittest.TestCase): self.assertEqual(result['candidates'], []) self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + def test_alpine_openrc_infrastructure_has_zero_footprint_probes(self): + # Actual Alpine 3.24.1 CT217 init metadata: klogd, user and runsvdir. + # The runsvdir definition can exist without /usr/bin/runsvdir installed; + # rejecting it must precede probing, not turn the scan into partial. + for name, executable in ( + ('klogd', '/sbin/klogd'), + ('user', '/usr/libexec/rc/bin/openrc-user'), + ('runsvdir', '/usr/bin/runsvdir'), + ('renamed-system-service', '/usr/libexec/rc/bin/openrc-user'), + ): + with self.subTest(name=name): + self.calls.clear() + result = native.scan(101, self.runner( + service(name=name, exe=executable, directory='', manager='openrc'))) + self.assertEqual(result['status'], 'complete') + self.assertEqual(result['candidates'], []) + self.assertFalse(any(native.FOOTPRINT_SCRIPT in call for call in self.calls)) + def test_helper_services_and_templates_have_zero_footprint_probes(self): cases = [ ('netpulse-stable-update', '/bin/bash', '/opt/netpulse', '/opt/netpulse/stable-apply.sh'), From 7aec721eb5b8c2bc6616a3a136efa763478f6e21 Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Sat, 17 Oct 2026 12:23:12 +0000 Subject: [PATCH 13/73] fix: invalidate native scans across lifecycle changes and serialize updates --- AppImage/scripts/native_app_discovery.py | 75 ++++++++-- .../tests/test_native_app_discovery.py | 139 +++++++++++++++++- 2 files changed, 201 insertions(+), 13 deletions(-) diff --git a/AppImage/scripts/native_app_discovery.py b/AppImage/scripts/native_app_discovery.py index 29a56b7b..ac9daa9e 100644 --- a/AppImage/scripts/native_app_discovery.py +++ b/AppImage/scripts/native_app_discovery.py @@ -17,6 +17,7 @@ """Separate from catalog detection: callers must explicitly request a scan.""" import copy +from contextlib import contextmanager import fcntl import hashlib import json @@ -25,6 +26,7 @@ from pathlib import Path import re import selectors import signal +import stat import subprocess import threading import time @@ -40,6 +42,7 @@ OCI_ROOT = Path('/usr/local/share/proxmenux/oci/instances') UPDATE_LOCK_ROOT = Path('/run/lock') _cache = {} _locks = {} +_generations = {} _mutex = threading.Lock() _PATH = re.compile(r'/[A-Za-z0-9_.+/@-]{1,510}\Z') _NAME = re.compile(r'[A-Za-z0-9][A-Za-z0-9_.+@-]{0,63}\Z') @@ -509,7 +512,13 @@ def _guard(vmid, deadline, run): raise ProbeError('guest_busy') update_lock = UPDATE_LOCK_ROOT / f'proxmenux-lxc-update-{vmid}.lock' try: - with update_lock.open('rb') as handle: + fd = os.open(update_lock, os.O_RDONLY | os.O_NOFOLLOW | os.O_NONBLOCK) + with os.fdopen(fd, 'rb') as handle: + info = os.fstat(handle.fileno()) + if not stat.S_ISREG(info.st_mode): + raise ProbeError('lock_unavailable') + if info.st_size: + raise ProbeError('guest_busy') try: fcntl.flock(handle, fcntl.LOCK_SH | fcntl.LOCK_NB) except BlockingIOError: @@ -529,9 +538,45 @@ def _guard(vmid, deadline, run): raise ProbeError('guest_stopped' if status == 'status: stopped' else 'status_unknown') +@contextmanager +def _scan_reservation(vmid): + """Exclude cooperating updates/control tasks for this bounded scan only. + + Keep an empty lock inode after first use, as the update runner does. + Never truncate a pending control-task reservation or unlink its inode. + """ + path = UPDATE_LOCK_ROOT / f'proxmenux-lxc-update-{vmid}.lock' + fd = None + try: + fd = os.open(path, os.O_RDWR | os.O_CREAT | os.O_NOFOLLOW | os.O_NONBLOCK, 0o600) + if not stat.S_ISREG(os.fstat(fd).st_mode): + raise ProbeError('lock_unavailable') + try: + fcntl.flock(fd, fcntl.LOCK_SH | fcntl.LOCK_NB) + except BlockingIOError: + raise ProbeError('guest_busy') from None + if os.fstat(fd).st_size: + raise ProbeError('guest_busy') + yield + except OSError: + raise ProbeError('lock_unavailable') from None + finally: + if fd is not None: + os.close(fd) + + def scan(vmid, run=bounded_run): deadline = time.monotonic() + TOTAL_SECONDS _guard(vmid, deadline, run) + with _scan_reservation(vmid): + result = _scan_metadata(vmid, deadline, run) + # External PVE lifecycle operations do not share our flock. Fail closed + # if the guest stopped, changed ownership or became locked meanwhile. + _guard(vmid, deadline, run) + return result + + +def _scan_metadata(vmid, deadline, run): records, issues, consumed, processes, listeners, hestia_panels = [], [], 0, [], [], [] for kind, script in (('S', SERVICE_SCRIPT), ('P', PROCESS_SCRIPT), ('L', PORT_SCRIPT)): try: @@ -637,6 +682,7 @@ def cached(vmid): def mark_stale(vmid): """Lifecycle events retire freshness, never collect new guest metadata.""" with _mutex: + _generations[int(vmid)] = _generations.get(int(vmid), 0) + 1 if int(vmid) in _cache: _cache[int(vmid)]['stale'] = True @@ -648,23 +694,28 @@ def discover(vmid): if not lock.acquire(blocking=False): return {**cached(vmid), 'status': 'busy', 'stale': True} try: + with _mutex: + generation = _generations.get(vmid, 0) try: result = scan(vmid) except ProbeError as exc: result = {**cached(vmid), 'status': 'error', 'issues': [str(exc)], 'stale': True} result.setdefault('scanned_at', time.time()) - with _mutex: - _cache[vmid] = copy.deepcopy(result) - return result - previous = cached(vmid) - if result['status'] != 'complete' and previous['candidates']: - # Partial output cannot prove that previously seen apps disappeared. - ids = {item['discovery_id'] for item in result['candidates']} - result['candidates'].extend(item for item in previous['candidates'] - if item['discovery_id'] not in ids) - result['candidates'] = result['candidates'][:MAX_CANDIDATES] - result['stale'] = True + # Comparing the generation and publishing must be atomic with lifecycle + # invalidation, including the first scan when no cache exists yet. with _mutex: + previous = copy.deepcopy(_cache.get(vmid)) + if _generations.get(vmid, 0) != generation: + result = {**(previous or {'vmid': vmid, 'candidates': [], + 'scanned_at': time.time()}), + 'status': 'error', 'issues': ['guest_changed'], 'stale': True} + elif result['status'] != 'complete' and previous and previous['candidates']: + # Partial output cannot prove that previously seen apps disappeared. + ids = {item['discovery_id'] for item in result['candidates']} + result['candidates'].extend(item for item in previous['candidates'] + if item['discovery_id'] not in ids) + result['candidates'] = result['candidates'][:MAX_CANDIDATES] + result['stale'] = True _cache[vmid] = copy.deepcopy(result) return result finally: diff --git a/AppImage/scripts/tests/test_native_app_discovery.py b/AppImage/scripts/tests/test_native_app_discovery.py index 5e90b4cf..397bb3fc 100644 --- a/AppImage/scripts/tests/test_native_app_discovery.py +++ b/AppImage/scripts/tests/test_native_app_discovery.py @@ -42,6 +42,7 @@ class DiscoveryFixtures(unittest.TestCase): self.addCleanup(context.stop) native._cache.clear() native._locks.clear() + native._generations.clear() self.calls = [] def runner(self, services=None, processes='END\n', footprint='FILE\n', manifest=None, @@ -375,6 +376,142 @@ class DiscoveryFixtures(unittest.TestCase): with patch.object(native, 'scan', return_value={**complete, 'candidates': []}): self.assertEqual(native.discover(101)['candidates'], []) + def test_lifecycle_during_first_or_cached_scan_cannot_publish_fresh_result(self): + complete = native.scan(101, self.runner()) + for prior in (None, complete): + with self.subTest(cached=prior is not None): + native._cache.clear() + if prior: + native._cache[101] = copy.deepcopy(prior) + entered, release = threading.Event(), threading.Event() + results = [] + def delayed(vmid): + entered.set() + if not release.wait(3): + raise AssertionError('scan release timed out') + return copy.deepcopy(complete) + with patch.object(native, 'scan', side_effect=delayed): + worker = threading.Thread(target=lambda: results.append(native.discover(101))) + worker.start() + try: + self.assertTrue(entered.wait(3)) + native.mark_stale(101) + finally: + release.set() + worker.join(3) + self.assertFalse(worker.is_alive()) + self.assertEqual(len(results), 1) + self.assertTrue(results[0]['stale']) + self.assertIn('guest_changed', results[0]['issues']) + self.assertEqual(results[0]['candidates'], prior['candidates'] if prior else []) + self.assertTrue(native.cached(101)['stale']) + with patch.object(native, 'scan', return_value=copy.deepcopy(complete)): + self.assertFalse(native.discover(101)['stale']) + with patch.object(native, 'scan', side_effect=lambda vmid: ( + native.mark_stale(102), copy.deepcopy(complete))[1]): + self.assertFalse(native.discover(101)['stale']) + + def test_scan_excludes_later_updater_and_releases_lock_after_success_or_failure(self): + path = self.root / 'proxmenux-lxc-update-101.lock' + for fail in (False, True): + with self.subTest(fail=fail): + runner = self.runner() + probes = [] + def checked(argv, deadline): + if argv[1] == 'exec': + attempt = subprocess.run(['flock', '-n', str(path), 'true']) + self.assertEqual(attempt.returncode, 1) + probes.append(argv) + if fail: + raise native.ProbeError('timeout') + return runner(argv, deadline) + native.scan(101, checked) + self.assertTrue(probes) + self.assertEqual(subprocess.run(['flock', '-n', str(path), 'true']).returncode, 0) + self.assertEqual(path.read_bytes(), b'') + + def test_pending_control_reservation_blocks_scan_without_touching_it(self): + path = self.root / 'proxmenux-lxc-update-101.lock' + original = b'{"task":"pending-control"}' + path.write_bytes(original) + with self.assertRaisesRegex(native.ProbeError, 'guest_busy'): + native.scan(101, self.runner()) + self.assertFalse(any(call[1] == 'exec' for call in self.calls)) + self.assertEqual(path.read_bytes(), original) + + def test_guest_stop_during_scan_never_returns_complete(self): + runner = self.runner() + statuses = iter(['status: running', 'status: stopped']) + def stopped(argv, deadline): + return next(statuses) if argv[1] == 'status' else runner(argv, deadline) + with self.assertRaisesRegex(native.ProbeError, 'guest_stopped'): + native.scan(101, stopped) + self.assertTrue(all(call[1] == 'exec' for call in self.calls)) + + def test_scan_reservation_closes_race_after_guard_and_releases_after_exception(self): + import lxc_check_job + path = self.root / 'proxmenux-lxc-update-101.lock' + runner = self.runner() + handles = [] + def starts_update(argv, deadline): + if argv[1] == 'status': + handles.append(lxc_check_job.acquire(101)) + return runner(argv, deadline) + with patch.object(lxc_check_job, 'LOCK_DIR', self.root): + try: + with self.assertRaisesRegex(native.ProbeError, 'guest_busy'): + native.scan(101, starts_update) + self.assertFalse(any(call[1] == 'exec' for call in self.calls)) + finally: + for handle in handles: + handle.close() + def crash(argv, deadline): + if argv[1] == 'exec': + with self.assertRaises(BlockingIOError): + lxc_check_job.acquire(101) + # Another CT must remain available. + lxc_check_job.acquire(102).close() + raise RuntimeError('unexpected probe failure') + return runner(argv, deadline) + with self.assertRaisesRegex(RuntimeError, 'unexpected'): + native.scan(101, crash) + lxc_check_job.acquire(101).close() + self.assertEqual(path.read_bytes(), b'') + + def test_failed_scan_releases_discovery_lock_and_keeps_prior_evidence(self): + complete = native.scan(101, self.runner()) + native._cache[101] = copy.deepcopy(complete) + with patch.object(native, 'scan', side_effect=RuntimeError('unexpected')): + with self.assertRaises(RuntimeError): + native.discover(101) + self.assertFalse(native._locks[101].locked()) + self.assertEqual(native.cached(101)['candidates'], complete['candidates']) + + def test_invalid_lock_inode_and_unreadable_config_fail_before_any_probe(self): + import os + path = self.root / 'proxmenux-lxc-update-101.lock' + target = self.root / 'unrelated' + target.write_bytes(b'keep') + for kind in ('symlink', 'fifo', 'directory'): + with self.subTest(kind=kind): + if kind == 'symlink': + path.symlink_to(target) + elif kind == 'fifo': + os.mkfifo(path) + else: + path.mkdir() + try: + with self.assertRaisesRegex(native.ProbeError, 'lock_unavailable'): + native.scan(101, self.runner()) + self.assertEqual(self.calls, []) + self.assertEqual(target.read_bytes(), b'keep') + finally: + path.rmdir() if kind == 'directory' else path.unlink() + with patch.object(Path, 'open', side_effect=PermissionError): + with self.assertRaisesRegex(native.ProbeError, 'config_unavailable'): + native.scan(101, self.runner()) + self.assertEqual(self.calls, []) + def test_same_ct_busy_and_different_ct_cache_isolation(self): lock = threading.Lock() lock.acquire() @@ -546,7 +683,7 @@ class Routes(unittest.TestCase): '_VM_APP_SUGGESTIONS_TTL': 300, '_vm_cache_get': lambda cache, vmid, ttl: cache.get(vmid), '_vm_cache_put': lambda cache, vmid, value: cache.update({vmid: value}), - '_pvesh_cache': {}, '_vm_disk_cache': {}, '_vm_cache_invalidate': Mock(), + '_pvesh_cache': {}, '_vm_disk_cache': {}, '_vm_schedule_cache': {}, '_vm_cache_invalidate': Mock(), '_invalidate_lxc_ip': Mock(), '_schedule_started_guest_refresh': Mock(), '_publish_guest_modal_cache_revision': Mock()} tree = ast.parse((SCRIPTS / 'flask_server.py').read_text()) From 427c3dc2b9fa2bcadaf0930a5429cf1c94a8087a Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:08:53 +0200 Subject: [PATCH 14/73] docs: review networking documentation in all seven translations --- .github/workflows/test-i18n.yml | 10 ++ .../de/docs/network/backup-restore.json | 110 ++++++++++++++ .../de/docs/network/bridge-analysis.json | 132 +++++++++++++++++ .../de/docs/network/config-analysis.json | 122 ++++++++++++++++ web/messages/de/docs/network/diagnostics.json | 94 ++++++++++++ web/messages/de/docs/network/index.json | 107 ++++++++++++++ web/messages/de/docs/network/monitoring.json | 136 ++++++++++++++++++ .../de/docs/network/persistent-names.json | 130 +++++++++++++++++ web/messages/en/docs/network/monitoring.json | 2 +- .../es/docs/network/backup-restore.json | 8 +- .../es/docs/network/bridge-analysis.json | 18 +-- .../es/docs/network/config-analysis.json | 14 +- web/messages/es/docs/network/diagnostics.json | 16 +-- web/messages/es/docs/network/index.json | 16 +-- web/messages/es/docs/network/monitoring.json | 28 ++-- .../es/docs/network/persistent-names.json | 18 +-- .../fr/docs/network/backup-restore.json | 110 ++++++++++++++ .../fr/docs/network/bridge-analysis.json | 132 +++++++++++++++++ .../fr/docs/network/config-analysis.json | 122 ++++++++++++++++ web/messages/fr/docs/network/diagnostics.json | 94 ++++++++++++ web/messages/fr/docs/network/index.json | 107 ++++++++++++++ web/messages/fr/docs/network/monitoring.json | 136 ++++++++++++++++++ .../fr/docs/network/persistent-names.json | 130 +++++++++++++++++ .../it/docs/network/backup-restore.json | 110 ++++++++++++++ .../it/docs/network/bridge-analysis.json | 132 +++++++++++++++++ .../it/docs/network/config-analysis.json | 122 ++++++++++++++++ web/messages/it/docs/network/diagnostics.json | 94 ++++++++++++ web/messages/it/docs/network/index.json | 107 ++++++++++++++ web/messages/it/docs/network/monitoring.json | 136 ++++++++++++++++++ .../it/docs/network/persistent-names.json | 130 +++++++++++++++++ .../pt/docs/network/backup-restore.json | 110 ++++++++++++++ .../pt/docs/network/bridge-analysis.json | 132 +++++++++++++++++ .../pt/docs/network/config-analysis.json | 122 ++++++++++++++++ web/messages/pt/docs/network/diagnostics.json | 94 ++++++++++++ web/messages/pt/docs/network/index.json | 107 ++++++++++++++ web/messages/pt/docs/network/monitoring.json | 136 ++++++++++++++++++ .../pt/docs/network/persistent-names.json | 130 +++++++++++++++++ .../sk/docs/network/backup-restore.json | 110 ++++++++++++++ .../sk/docs/network/bridge-analysis.json | 132 +++++++++++++++++ .../sk/docs/network/config-analysis.json | 122 ++++++++++++++++ web/messages/sk/docs/network/diagnostics.json | 94 ++++++++++++ web/messages/sk/docs/network/index.json | 107 ++++++++++++++ web/messages/sk/docs/network/monitoring.json | 136 ++++++++++++++++++ .../sk/docs/network/persistent-names.json | 130 +++++++++++++++++ .../sv/docs/network/backup-restore.json | 110 ++++++++++++++ .../sv/docs/network/bridge-analysis.json | 132 +++++++++++++++++ .../sv/docs/network/config-analysis.json | 122 ++++++++++++++++ web/messages/sv/docs/network/diagnostics.json | 94 ++++++++++++ web/messages/sv/docs/network/index.json | 107 ++++++++++++++ web/messages/sv/docs/network/monitoring.json | 136 ++++++++++++++++++ .../sv/docs/network/persistent-names.json | 130 +++++++++++++++++ 51 files changed, 5056 insertions(+), 60 deletions(-) create mode 100644 web/messages/de/docs/network/backup-restore.json create mode 100644 web/messages/de/docs/network/bridge-analysis.json create mode 100644 web/messages/de/docs/network/config-analysis.json create mode 100644 web/messages/de/docs/network/diagnostics.json create mode 100644 web/messages/de/docs/network/index.json create mode 100644 web/messages/de/docs/network/monitoring.json create mode 100644 web/messages/de/docs/network/persistent-names.json create mode 100644 web/messages/fr/docs/network/backup-restore.json create mode 100644 web/messages/fr/docs/network/bridge-analysis.json create mode 100644 web/messages/fr/docs/network/config-analysis.json create mode 100644 web/messages/fr/docs/network/diagnostics.json create mode 100644 web/messages/fr/docs/network/index.json create mode 100644 web/messages/fr/docs/network/monitoring.json create mode 100644 web/messages/fr/docs/network/persistent-names.json create mode 100644 web/messages/it/docs/network/backup-restore.json create mode 100644 web/messages/it/docs/network/bridge-analysis.json create mode 100644 web/messages/it/docs/network/config-analysis.json create mode 100644 web/messages/it/docs/network/diagnostics.json create mode 100644 web/messages/it/docs/network/index.json create mode 100644 web/messages/it/docs/network/monitoring.json create mode 100644 web/messages/it/docs/network/persistent-names.json create mode 100644 web/messages/pt/docs/network/backup-restore.json create mode 100644 web/messages/pt/docs/network/bridge-analysis.json create mode 100644 web/messages/pt/docs/network/config-analysis.json create mode 100644 web/messages/pt/docs/network/diagnostics.json create mode 100644 web/messages/pt/docs/network/index.json create mode 100644 web/messages/pt/docs/network/monitoring.json create mode 100644 web/messages/pt/docs/network/persistent-names.json create mode 100644 web/messages/sk/docs/network/backup-restore.json create mode 100644 web/messages/sk/docs/network/bridge-analysis.json create mode 100644 web/messages/sk/docs/network/config-analysis.json create mode 100644 web/messages/sk/docs/network/diagnostics.json create mode 100644 web/messages/sk/docs/network/index.json create mode 100644 web/messages/sk/docs/network/monitoring.json create mode 100644 web/messages/sk/docs/network/persistent-names.json create mode 100644 web/messages/sv/docs/network/backup-restore.json create mode 100644 web/messages/sv/docs/network/bridge-analysis.json create mode 100644 web/messages/sv/docs/network/config-analysis.json create mode 100644 web/messages/sv/docs/network/diagnostics.json create mode 100644 web/messages/sv/docs/network/index.json create mode 100644 web/messages/sv/docs/network/monitoring.json create mode 100644 web/messages/sv/docs/network/persistent-names.json diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 2b3e4685..7f4dfb51 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -9,15 +9,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' push: branches: [main, develop] paths: @@ -27,15 +32,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' workflow_dispatch: permissions: diff --git a/web/messages/de/docs/network/backup-restore.json b/web/messages/de/docs/network/backup-restore.json new file mode 100644 index 00000000..fc81f50a --- /dev/null +++ b/web/messages/de/docs/network/backup-restore.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Schnittstellen sichern und neu starten | ProxMenux-Dokumentation", + "description": "Manuelle Schnappschüsse erstellen und unter /var/backups/proxmenux/ gespeicherte Backups von /etc/network/interfaces durchsuchen und wiederherstellen. Mit bestätigtem Neustart des Netzwerkdienstes und Schnellansicht der aktuellen Konfiguration.", + "ogTitle": "Schnittstellen sichern und neu starten | ProxMenux-Dokumentation", + "ogDescription": "Snapshot und Wiederherstellung der Proxmox-Netzwerkkonfiguration; Neustart des Netzwerkdienstes mit Bestätigung." + }, + "header": { + "title": "Schnittstellen sichern und neu starten", + "description": "Vier Werkzeuge für /etc/network/interfaces: einen manuellen Schnappschuss erstellen, die aktuelle Konfiguration anzeigen, ein früheres Backup mit optionaler Vorschau wiederherstellen und den Netzwerkdienst nach ausdrücklicher Zustimmung neu starten. Sie verwenden dasselbe Backup-Verzeichnis wie die geführten Reparaturen.", + "section": "Netzwerk" + }, + "intro": { + "title": "Was das macht", + "body": "Verwaltet das gleiche Backup-Verzeichnis, das von den geführten Reparaturflüssen verwendet wird (/var/backups/proxmenux/). Sie können vor jeder manuellen Änderung eine zusätzliche Momentaufnahme machen, alle vorhandenen Backups durchsuchen und zu einem von ihnen zurückkehren - immer mit einem neuen Pre-Restore-Backup, das automatisch als zweites Sicherheitsnetz übernommen wird." + }, + "shared": { + "heading": "Das gemeinsame Backup-Verzeichnis", + "intro": "Jedes Backup im Netzwerkmenü landet an der gleichen Stelle:", + "outro": "Dateinamen werden mit einem Zeitstempel versehen, nach Datum sortiert und nie überschrieben. Das Verzeichnis wird bei der ersten Verwendung erstellt." + }, + "show": { + "heading": "Netzwerkkonfigurationsdatei anzeigen", + "body": "Gibt /etc/network/interfaces unverändert im Terminal aus. Schreibgeschützt. Nützlich zur Kontrolle vor einem Backup oder nach einer Wiederherstellung. Es gibt kein separates Werkzeug zum Vergleich mit dem vorherigen Backup; die aktuelle Datei direkt zu prüfen ist daher am einfachsten." + }, + "create": { + "heading": "Netzwerk-Backup erstellen", + "body": "Kopiert den aktuellen /etc/network/interfaces mit einem neuen Zeitstempel in das Backup-Verzeichnis. Das ist es — keine Analyse, keine Aufforderungen, nur eine Momentaufnahme.", + "whenTitle": "Wann Sie ein manuelles Backup durchführen sollten", + "whenBody": "Vor der manuellen Bearbeitung von /etc/network/interfaces, vor der Installation eines Pakets, das den Netzwerkstack ändern kann (z. B. NetworkManager, Open vSwitch), oder vor Hardwareänderungen. Geführte Reparaturen erstellen bereits automatisch einen Schnappschuss — diese Option ist für manuelle Eingriffe." + }, + "restore": { + "heading": "Netzwerksicherung wiederherstellen", + "intro": "Listet alle Backups in /var/backups/proxmenux/ vom neuesten zum ältesten auf und führt durch eine abgesicherte Wiederherstellung:", + "steps": [ + { + "title": "1. Wählen Sie ein Backup", + "body": "Ein Menü listet jedes Backup nach seinem Zeitstempel auf. Wenn keine Backups vorhanden sind, wird der Flow mit einer klaren Nachricht beendet.", + "tone": "blue" + }, + { + "title": "2. Optionale Vorschau", + "body": "Bietet an, das ausgewählte Backup in einer scrollbaren Ansicht zu öffnen, bevor Sie es festlegen. Standardmäßig ja – überspringen Sie es nicht auf einem entfernten Host.", + "tone": "blue" + }, + { + "title": "3. Backup vor der Wiederherstellung", + "body": "Erstellt vor dem Überschreiben von /etc/network/interfaces ein weiteres Backup des aktuellen Zustands. Eine Wiederherstellung ist selbst ein destruktiver Vorgang. Mit dem neuen Schnappschuss können Sie zurückkehren, falls das gewählte Backup falsch war.", + "tone": "amber" + }, + { + "title": "4. Anwenden der Wiederherstellung", + "body": "Kopiert das ausgewählte Backup über /etc/network/interfaces. Die Dateiänderung ist auf der Festplatte; der Live-Kernel-Zustand spiegelt immer noch die vorherige Konfiguration wider.", + "tone": "amber" + }, + { + "title": "5. Optionaler Neustart", + "body": "Fragt, ob systemctl restart networking jetzt ausgeführt werden soll. Lehnen Sie ab, um die Änderung auf den nächsten Neustart zu verschieben.", + "tone": "emerald" + } + ], + "autoBackupTitle": "Jede Wiederherstellung erstellt automatisch ein eigenes Backup", + "autoBackupBody": "Die Auswahl von Netzwerksicherung wiederherstellen erstellt immer einen neuen Schnappschuss der aktuellen Konfiguration, bevor sie überschrieben wird. Falls Sie das falsche Backup wiederherstellen, enthält die neueste Datei in /var/backups/proxmenux/ den vorherigen Zustand." + }, + "restart": { + "heading": "Starten Sie den Netzwerkdienst neu", + "body": "Führt nach einer Ja/Nein-Bestätigung systemctl restart networking aus. Meldet das Ergebnis mit msg_ok / msg_error. Die meisten Abläufe in diesem Menü bieten am Ende selbst einen Neustart an. Diese Option dient zum Neustart nach manueller Bearbeitung oder wenn Sie den zuvor angebotenen Neustart abgelehnt haben.", + "warnTitle": "Kurze Trennung garantiert; dauerhafte Trennung möglich", + "warnBody": "Ein Neustart von networking deaktiviert alle in /etc/network/interfaces deklarierten Schnittstellen und wendet ihre Konfiguration erneut an. SSH-Sitzungen über diese Schnittstellen brechen ab. Ist die neue Konfiguration ungültig, kehrt das Netzwerk nicht zurück. Nur ausführen, wenn:", + "warnItems": [ + "Sie Konsolen-/IPMI-/iKVM-Zugriff bereithalten, oder", + "Sie sich direkt neben dem Rechner befinden, oder", + "Sie haben gerade erfolgreich zu einer bekannten guten Konfiguration zurückgerollt und wollen sie anwenden." + ] + }, + "manualRollback": { + "heading": "Manuelles Rollback von einer Konsole", + "intro": "Wenn Sie das Menü nicht erreichen können (kein SSH, Dialogabsturz, ...), aber eine Konsole erreichen können, besteht das Rollback aus zwei Befehlen:", + "outro": "Das ist dieselbe Operation wie im Menü, nur von Hand eingegeben. Startet networking weiterhin nicht, prüfen Sie journalctl -u networking -b auf den zugrunde liegenden Syntax- oder Treiberfehler." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "noneTitle": "„Keine Backups gefunden“ bei der Wiederherstellung", + "noneBody": "Das Verzeichnis /var/backups/proxmenux/ existiert nicht oder enthält keine interfaces_backup_*-Dateien. Führen Sie Netzwerk-Backup erstellen mindestens einmal aus oder starten Sie eine geführte Reparatur, die automatisch ein Backup erstellt. Prüfen Sie mit ls /var/backups/proxmenux/.", + "unreachTitle": "Der Netzwerkneustart gelingt, aber der Host ist weiterhin nicht erreichbar", + "unreachBody": "Entweder ist die neue Konfiguration falsch oder die beim Neustart angewendete Konfiguration weist Ihre Verwaltungs-IP nicht zu. Setzen Sie sie über die Konsole zurück (siehe oben). Nutzen Sie danach Brückenanalyse und Konfigurationsanalyse, um den Fehler vor einem erneuten Anwenden zu verstehen.", + "emptyTitle": "Die Wiederherstellungsvorschau zeigt eine leere Datei", + "emptyBody": "Die Backup-Datei ist leer (0 Bytes). Das passiert, wenn ein Kopiervorgang bei einem früheren Durchlauf unbemerkt fehlgeschlagen ist. Wählen Sie ein älteres Backup oder führen Sie Netzwerk-Backup erstellen jetzt erneut aus, wenn die aktuelle Konfiguration funktioniert." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Brückenanalyse und geführte Reparatur", + "href": "/docs/network/bridge-analysis", + "tail": " — der häufigste Grund, warum hier ein Backup erstellt wird." + }, + { + "label": "Konfigurationsanalyse und geführte Bereinigung", + "href": "/docs/network/config-analysis", + "tailRich": "— schreibt auch automatisch an /var/backups/proxmenux/." + }, + { + "label": "Diagnose", + "href": "/docs/network/diagnostics", + "tail": "- Überprüfen Sie den Live-Zustand nach einer Wiederherstellung." + } + ] + } +} diff --git a/web/messages/de/docs/network/bridge-analysis.json b/web/messages/de/docs/network/bridge-analysis.json new file mode 100644 index 00000000..00d03038 --- /dev/null +++ b/web/messages/de/docs/network/bridge-analysis.json @@ -0,0 +1,132 @@ +{ + "meta": { + "title": "Brückenanalyse & geführte Reparatur | ProxMenux Dokumentation", + "description": "Erkennt vmbrX-Bridges mit fehlenden oder ungültigen physischen Ports (typisch nach PCI-Reenumeration), meldet diese mit vorgeschlagenen Shell-Befehlen und bietet eine 5-schrittgesteuerte Reparatur mit obligatorischem Backup.", + "ogTitle": "Brückenanalyse & geführte Reparatur | ProxMenux Dokumentation", + "ogDescription": "Proxmox-Bridge-Ports nach Hardwareänderungen prüfen und reparieren, mit geführtem Ablauf und sicherer Rückkehr zur vorherigen Konfiguration." + }, + "header": { + "title": "Brückenanalyse und geführte Reparatur", + "description": "Prüft jede in /etc/network/interfaces deklarierte vmbrX-Bridge und ob ihre physischen Ports tatsächlich existieren. Fehlende Ports können schrittweise repariert werden. Die Analyse ist schreibgeschützt; die Reparatur erfordert Zustimmung, zeigt eine Vorschau und erstellt ein Backup.", + "section": "Netzwerk" + }, + "intro": { + "title": "Was das macht", + "body": "Liest jede Bridge in /etc/network/interfaces, prüft ihre Zeile bridge-ports und ob jeder deklarierte Port, etwa enp3s0, auf dem Host existiert. Fehlt ein Port, schlägt das Werkzeug einen Ersatz vor und wendet die Änderung nach ausdrücklicher Zustimmung mit dem Ablauf sichern, Vorschau anzeigen, anwenden, überprüfen an." + }, + "when": { + "heading": "Wenn Sie das brauchen", + "intro": "Linux weist vorhersehbare Schnittstellennamen aus PCI-Topologie und Slot-Reihenfolge zu. Mehrere Ereignisse mischen sie und lassen /etc/network/interfaces auf Namen verweisen, die nicht mehr existieren:", + "items": [ + "Hinzufügen oder Entfernen einer PCIe-Karte (ein NIC, ein GPU, ein HBA, ein NVMe-Träger).", + "Verschieben einer vorhandenen Karte in einen anderen PCIe-Slot.", + "BIOS / UEFI Updates, die PCI-Geräte erneut aufzählen.", + "Migration der Boot-Disk auf andere Hardware." + ], + "outro": "Nach dem nächsten Start versucht die Bridge, einen nicht mehr vorhandenen Port einzubinden. Sie lässt sich nicht aktivieren und der Host verliert seine Netzwerkverbindung. Persistente Schnittstellennamen verhindern eine Wiederholung. Falls Sie bereits ausgesperrt sind, beschreibt diese Seite den Wiederherstellungsweg." + }, + "bigPicture": { + "heading": "Überblick", + "diagram1": { + "arrowLabel": "Stufe 1", + "nodes": { + "sourceLabel": "/etc/network/interfaces", + "sourceDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports enp3s0", + "bridgeLabel": "Analysieren (schreibgeschützt)", + "bridgeDetail": "ip link show enp3s0\n→ nicht vorhanden", + "targetLabel": "Bericht + Vorschlag", + "targetDetail": "❌ enp3s0: NICHT GEFUNDEN\nErsetzen mit: eno1\n(noch keine Änderungen)" + } + }, + "diagram2": { + "arrowLabel": "mit Backup anwenden", + "nodes": { + "sourceLabel": "Geführte Reparatur", + "sourceDetail": "1. Backup\n2. Aktuelle Konfiguration anzeigen\n3. Änderungsvorschau\n4. Anwenden\n5. Überprüfen", + "targetLabel": "/etc/network/interfaces (neu)", + "targetDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports eno1" + } + } + }, + "step1": { + "heading": "Schritt 1: Analyse (schreibgeschützt)", + "intro": "Nach Auswahl von Brückenkonfiguration analysieren bricht das Werkzeug sofort ab, falls der Host nicht den klassischen Debian-/Proxmox-Stack nutzt. Andernfalls prüft es jede Bridge und meldet:", + "items": [ + "Brückenname, aktueller Status (UP / DOWN), zugewiesene IP.", + "Jeder deklarierte Port und ob er derzeit existiert (ip link show <port>).", + "Für jeden ungültigen Port: ein vorgeschlagener Ersatz (die erste verfügbare physische Schnittstelle) sowie der genaue Befehl sed, um ihn manuell anzuwenden.", + "Brücken ohne bridge-ports und verwaiste auto-Einträge (kein passender iface-Block)." + ], + "readonlyTitle": "Garantie einer schreibgeschützten Analyse", + "readonlyBody": "Bis zu diesem Punkt hat das Skript keinen einzigen Änderungsbefehl ausgeführt. Sie können die Analyse offen lassen, die vorgeschlagenen sed-Befehle kopieren und sie manuell anwenden, wenn Sie möchten - oder die nächste Aufforderung akzeptieren, um in die geführte Reparatur einzusteigen." + }, + "step2": { + "heading": "Schritt 2: geführte Reparatur (5 Schritte)", + "intro": "Wird nur gestartet, wenn Sie der Aufforderung am Ende der Analyse zustimmen. Jeder Schritt zeigt die geplante Aktion und bittet vor dem Fortfahren um Bestätigung.", + "steps": [ + { + "title": "1. Sicherheitssicherung", + "body": "Kopiert /etc/network/interfaces in /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Der genaue Sicherungspfad wird vor der Kopie und danach mit dem Rollback-Befehl angezeigt.", + "tone": "blue" + }, + { + "title": "2. Überprüfung der aktuellen Konfiguration", + "body": "Öffnet das Live /etc/network/interfaces in einem scrollbaren Dialog, so dass Sie genau sehen können, was geändert werden soll.", + "tone": "blue" + }, + { + "title": "3. Vorgeschlagene Änderungen anzeigen", + "body": "Listet genau die betroffenen Bridges und geplanten Portersetzungen auf. Falls inzwischen kein Reparaturbedarf mehr besteht, weil der Port zwischenzeitlich wieder aufgetaucht ist, endet der Ablauf mit „Keine Änderungen erforderlich.“", + "tone": "blue" + }, + { + "title": "4. Änderungen anwenden", + "body": "Für jede betroffene Brücke läuft sed -i \"/iface $bridge/,/bridge-ports/ s/bridge-ports.*/bridge-ports $new_ports/\" gegen /etc/network/interfaces. Wenn für eine Brücke kein gültiger Ersatz verfügbar war, wird die Substitution übersprungen und in Schritt 5 gemeldet.", + "tone": "amber" + }, + { + "title": "5. Überprüfung", + "body": "Liest die Datei erneut und bestätigt, dass der neue Port jeder Bridge existiert. Gibt den Befehl zum Zurücksetzen aus (cp <backup> /etc/network/interfaces). Bietet abschließend Netzwerk neu starten an — stimmen Sie nur zu, wenn ein Konsolenzugang als Ersatz bereitsteht.", + "tone": "emerald" + } + ], + "restartTitle": "Netzwerkneustart ≠ risikoloses Rückgängigmachen", + "restartBody": "Die Reparatur wird auf den Datenträger geschrieben, unabhängig davon, ob Sie den Dienst neu starten. systemctl restart networking wendet die Änderung jetzt an und kann Ihre SSH-Sitzung unterbrechen, wenn der neue Port falsch ist. Lehnen Sie ab, wird die Änderung dennoch beim nächsten Systemstart wirksam. Prüfen Sie daher die neue Konfiguration oder setzen Sie sie mit dem angezeigten Befehl zurück." + }, + "edits": { + "heading": "Was wird bearbeitet (genau)", + "body": "Nur die Zeile bridge-ports jeder betroffenen Bridge. Andere Direktiven (address, netmask, gateway, bridge-stp, …) bleiben unverändert. Das Skript erstellt oder entfernt in diesem Ablauf keine iface-Blöcke — dafür ist Konfigurationsanalyse & Bereinigung zuständig." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "unsupportedTitle": "Die Analyse bricht mit „Nicht unterstützter Netzwerkstack“ ab", + "unsupportedBody": "Der Host läuft netplan, systemd-networkd oder NetworkManager. Das Tool unterstützt nur /etc/network/interfaces. Schalten Sie den Host zuerst auf den klassischen Stack oder bearbeiten Sie die Konfiguration mit dem nativen Tooling des Managers (z.B. netplan apply).", + "noSuggestTitle": "Kein Vorschlag wird für einen ungültigen Port gedruckt", + "noSuggestBody": "Der Host hat null freie physische Schnittstellen (alles befindet sich entweder bereits in einer anderen Brücke oder existiert nicht). Die Analyse greift auf bridge-ports none zurück, so dass die Brücke zumindest ohne Port auftauchen kann. Fügen Sie eine NIC hinzu oder migrieren Sie Ports zwischen Brücken manuell, bevor Sie erneut ausführen.", + "stillDownTitle": "Die Reparatur ist abgeschlossen, aber die Brücke ist noch DOWN", + "stillDownBody": "sed hat die Datei aktualisiert, aber systemctl restart networking wurde abgelehnt. Führen Sie den Befehl nach Prüfung der neuen Konfiguration manuell aus oder starten Sie das System neu. Wurde der Neustart angenommen und bleibt die Bridge DOWN, prüfen Sie mit ip link show, ob der neue Port existiert, und suchen Sie mit journalctl -u networking nach der Ursache: nicht eingestecktes Kabel, nicht ausgehandelte Verbindung oder ein Port, der schon zu einer anderen Bridge gehört.", + "lostSshTitle": "Ich habe den SSH-Zugang direkt nach dem Neustart des Netzwerks verloren", + "lostSshIntro": "Verwenden Sie Konsole / IPMI / iKVM, um den Host zu erreichen. Wiederherstellen des Backups:", + "lostSshOutro": "Führen Sie dann die Analyse erneut von der Konsole aus aus, um herauszufinden, warum der Vorschlag nicht funktioniert hat (normalerweise: Der Ersatzanschluss ist nicht wirklich angeschlossen)." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Persistente Schnittstellennamen", + "href": "/docs/network/persistent-names", + "tail": " — bindet Namen an MAC-Adressen, damit dieses Szenario nicht erneut auftritt." + }, + { + "label": "Konfigurationsanalyse und geführte Bereinigung", + "href": "/docs/network/config-analysis", + "tailRich": "— für verwaiste iface-Blöcke (die andere Hälfte des gleichen Problems)." + }, + { + "label": "Schnittstellen sichern und neu starten", + "href": "/docs/network/backup-restore", + "tail": "- manuelle Snapshots und der Wiederherstellungsbrowser." + } + ] + } +} diff --git a/web/messages/de/docs/network/config-analysis.json b/web/messages/de/docs/network/config-analysis.json new file mode 100644 index 00000000..138b6c24 --- /dev/null +++ b/web/messages/de/docs/network/config-analysis.json @@ -0,0 +1,122 @@ +{ + "meta": { + "title": "Konfigurationsanalyse und geführte Bereinigung | ProxMenux-Dokumentation", + "description": "Erkennt iface-Blöcke in /etc/network/interfaces, die auf physische NICs verweisen, die nicht mehr auf dem Host vorhanden sind. Meldet sie und bietet eine 5-schrittgesteuerte Entfernung mit obligatorischem Backup und einer Blockvorschau.", + "ogTitle": "Konfigurationsanalyse und geführte Bereinigung | ProxMenux-Dokumentation", + "ogDescription": "Finden und entfernen Sie verwaiste Schnittstellenblöcke, die durch Hardwareänderungen zurückgelassen wurden, mit vollständiger Vorschau und Rollback." + }, + "header": { + "title": "Konfigurationsanalyse und geführte Bereinigung", + "description": "Untersucht jeden iface-Block in /etc/network/interfaces und prüft, ob die zugehörige physische Netzwerkkarte noch vorhanden ist. Meldet nach Hardwareänderungen verbliebene verwaiste Blöcke und bietet eine geführte Entfernung mit Backup, Vorschau und Bestätigung für jeden Block.", + "section": "Netzwerk" + }, + "intro": { + "title": "Was das macht", + "body": "Identifiziert iface-Deklarationen, deren unterstützende NIC nicht mehr auf dem Host vorhanden ist (typisch nach dem Ersetzen oder Entfernen einer Netzwerkkarte). Anschließend wird eine geführte Bereinigung angeboten, bei der nur die verwaisten Blöcke entfernt werden, mit einer Sicherung, einer Vorschau pro Abschnitt und einer expliziten endgültigen Bestätigung." + }, + "differs": { + "heading": "Wie es sich von der Brückenanalyse unterscheidet", + "headerAspect": "Aspekt", + "headerBridge": "Brückenanalyse", + "headerConfig": "Konfigurationsanalyse", + "rows": [ + { + "aspect": "Untersucht", + "bridge": "Brücken (vmbrX) und ihre bridge-ports-Linie", + "config": "Jeder iface-Block (ausgenommen Loopback, Bridges, Bonds)" + }, + { + "aspect": "Erkennt", + "bridge": "Brücken, die auf einen nicht vorhandenen Port verweisen", + "config": "Standalone-Schnittstellenblöcke für NICs, die nicht existieren" + }, + { + "aspect": "Reparaturmaßnahmen", + "bridge": "Ersetzt den Portnamen in bridge-ports", + "config": "Entfernen Sie den gesamten iface-Block" + }, + { + "aspect": "Ausgenommen sind", + "bridge": "Nichts – jede Brücke wird analysiert", + "config": "Bridges (vmbrX) und Bonds (bondX) bleiben immer erhalten, da sie virtuell sind und beim Start vorübergehend fehlen können" + } + ], + "outro": "In der Praxis führen Sie oft beide Werkzeuge in dieser Reihenfolge aus: zuerst Konfigurationsanalyse, um verwaiste Blöcke zu entfernen, dann Brückenanalyse, um Bridges, die auf die entfernte Schnittstelle verwiesen, neu zuzuordnen." + }, + "step1": { + "heading": "Schritt 1: Analyse (schreibgeschützt)", + "intro": "Bricht sofort ab, wenn der Host nicht den klassischen Netzwerkstack nutzt. Andernfalls werden alle konfigurierten Schnittstellen außer Loopback mit ihrem Status aufgelistet:", + "virtTitle": "Virtuelle Schnittstellen sind geschützt", + "virtBody": "Bridges (vmbrX) und Bonds (bondX) sind virtuelle Konstrukte. Sie können zum Zeitpunkt der Prüfung durchaus fehlen, etwa eine Bridge ohne Ports. Daher schlägt die Analyse nur die Entfernung physischer Netzwerkkarten vor, niemals die dieser virtuellen Schnittstellen." + }, + "step2": { + "heading": "Schritt 2: geführte Bereinigung (5 Schritte)", + "intro": "Wird nur gestartet, wenn Sie der Aufforderung am Ende der Analyse zustimmen. Jeder Schritt muss bestätigt werden; bei Abbruch wird ohne Schreiben beendet.", + "steps": [ + { + "title": "1. Sicherheitssicherung", + "body": "Kopiert /etc/network/interfaces nach /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Der Pfad wird vorher und nachher angezeigt.", + "tone": "blue" + }, + { + "title": "2. Bestätigen Sie die Entfernungsliste", + "body": "Listet genau die zu entfernenden physischen Schnittstellenblöcke auf. Sind die Netzwerkkarten zwischen Analyse und Bereinigung wieder aufgetaucht, etwa nach erneutem Einsetzen einer Karte, endet der Ablauf mit „Keine Bereinigung erforderlich.“", + "tone": "blue" + }, + { + "title": "3. Vorschau der genauen Block(s)", + "body": "Öffnet eine scrollbare Ansicht jedes iface-Blocks, der gelöscht werden würde, exakt wie in der Datei. Hier können Sie etwa einen wichtigen up-Hook erkennen, den Sie behalten möchten.", + "tone": "blue" + }, + { + "title": "4. Entfernung anwenden", + "body": "Für jede verwaiste Schnittstelle läuft sed -i \"/^iface $iface/,/^$/d\" /etc/network/interfaces. Das löscht von der passenden iface-Zeile bis zur nächsten leeren Zeile.", + "tone": "amber" + }, + { + "title": "5. Überprüfung", + "body": "Liest die Datei erneut, listet auf, was entfernt wurde, und überprüft die verbleibenden Schnittstellen erneut. Gibt den Rollback-Befehl aus. Führt nicht einen automatischen Neustart des Netzwerks durch. Das Entfernen eines nicht verwendeten Blocks kann sicher beim nächsten Neustart angewendet werden und vermeidet eine Beeinträchtigung des Live-Status.", + "tone": "emerald" + } + ], + "noRestartTitle": "Startet das Netzwerk nicht automatisch neu", + "noRestartBody": "Im Gegensatz zur Brückenreparatur bietet der Bereinigungsfluss keinen Neustart des Dienstes. Das Entfernen eines unbenutzten Schnittstellenblocks hat keine unmittelbaren Auswirkungen auf die laufende Konfiguration, so dass ein Neustart unnötig ist und ein unnötiges Verbindungsrisiko darstellt. Die Änderung wird beim nächsten manuellen systemctl restart networking oder beim nächsten Neustart wirksam." + }, + "caveats": { + "heading": "Wichtige Vorbehalte", + "boundaryTitle": "Die Blockgrenze ist die erste leere Linie", + "boundaryBody": "Das sed-Muster löscht von iface <name> bis zur nächsten leeren Zeile. Fehlt in /etc/network/interfaces eine Leerzeile zwischen Blöcken, was nach manueller Bearbeitung möglich ist, kann auch der nächste Block gelöscht werden. Deshalb ist Schritt 3 obligatorisch: Prüfen Sie die Vorschau vor der Bestätigung.", + "tandemTitle": "Ein Waisen-Iface, das von einer Brücke verwendet wird, wird hier erkannt, nicht in der Brückenanalyse", + "tandemBody": "Wenn vmbr0 bridge-ports enp3s0 deklariert und enp3s0 einen eigenen Block iface enp3s0 inet manual hat, bleibt nach der Entfernung von enp3s0 eine ungültige Referenz in vmbr0. Führen Sie danach die Brückenanalyse aus, um den Bridge-Port neu zuzuordnen oder zu entfernen. Beide Abläufe sind für die gemeinsame Verwendung ausgelegt." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "notFoundTitle": "Die Analyse zeigt mein neues NIC als \"NICHT GEFUNDEN\"", + "notFoundBody": "Der Kernel sieht das Gerät unter einem anderen Namen als in der Datei. Führen Sie ip link show aus, um den tatsächlichen Namen zu erhalten. Dies ist genau der Fall, wenn Persistente Schnittstellennamen das Problem verhindern würden.", + "tooMuchTitle": "Die Bereinigung hat zu viel entfernt (einen Block, den ich behalten wollte)", + "tooMuchBody": "Wiederherstellen aus dem in Schritt 5 gedruckten Backup:", + "tooMuchOutro": "Bearbeiten Sie die Datei von Hand, um eine klare leere Linie zwischen den Blöcken hinzuzufügen, bevor Sie die Bereinigung erneut ausführen, oder entfernen Sie den problematischen Block manuell.", + "bridgeBreakTitle": "Eine Brücke funktioniert nach dem Aufräumen nicht mehr", + "bridgeBreakBody": "Die Bridge war auf einen Port angewiesen, dessen iface-Block gerade entfernt wurde. Führen Sie die Brückenanalyse aus; der Vorschlag ordnet der Bridge eine vorhandene physische Schnittstelle zu." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Brückenanalyse und geführte Reparatur", + "href": "/docs/network/bridge-analysis", + "tail": " — der natürliche nächste Schritt nach einer Bereinigung." + }, + { + "label": "Persistente Schnittstellennamen", + "href": "/docs/network/persistent-names", + "tail": " — verhindert, dass sich nach jeder Hardwareänderung verwaiste Blöcke ansammeln." + }, + { + "label": "Schnittstellen sichern und neu starten", + "href": "/docs/network/backup-restore", + "tail": "- manuelle Snapshots und der Wiederherstellungsbrowser." + } + ] + } +} diff --git a/web/messages/de/docs/network/diagnostics.json b/web/messages/de/docs/network/diagnostics.json new file mode 100644 index 00000000..3aca50e3 --- /dev/null +++ b/web/messages/de/docs/network/diagnostics.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Diagnose | ProxMenux Dokumentation", + "description": "Drei einmalige, schreibgeschützte Diagnoseprüfungen: Routingtabelle anzeigen, Konnektivität testen und erweiterte Diagnose. Reine Prüfung — schreibt nie in /etc/network/interfaces und führt nie ändernde Befehle aus, mit einer ausdrücklichen Ausnahme: Wird NetworkManager erkannt, kann er nach Ihrer Zustimmung vollständig entfernt werden.", + "ogTitle": "Diagnose | ProxMenux Dokumentation", + "ogDescription": "Schreibgeschützte Netzwerkdiagnose für den Proxmox-Host: Routing, Erreichbarkeit und erweiterte Statistiken." + }, + "header": { + "title": "Diagnose", + "description": "Drei einmalige, schreibgeschützte Prüfungen des aktuellen Netzwerkzustands: Routingtabelle, Konnektivitätstest und erweiterte Statistiken. Keine schreibt in /etc/network/interfaces — jederzeit sicher nutzbar, auch über SSH. Für interaktive Echtzeitüberwachung siehe Überwachungswerkzeuge für Echtzeitdaten.", + "section": "Netzwerk" + }, + "intro": { + "title": "Was das macht", + "body": "Berichtet über Routing, Erreichbarkeit und zusammengefasste Statistiken, ohne etwas zu ändern. Damit können Sie den ordnungsgemäßen Netzwerkbetrieb bestätigen oder doppelte IP-Adressen erkennen. Für die kontinuierliche Verkehrsbeobachtung siehe Überwachungswerkzeuge für Echtzeitdaten; zur Anzeige der unverarbeiteten Konfigurationsdatei siehe Schnittstellen sichern und neu starten." + }, + "routing": { + "heading": "Routing-Tabelle anzeigen", + "body": "Listet alle aktuell vom Kernel verwendeten Routen auf (ip route show) und hebt das Standard-Gateway hervor. Damit lässt sich prüfen, ob Internetverkehr die erwartete Schnittstelle verwendet und keine veralteten Routen Vorrang haben." + }, + "connectivity": { + "heading": "Konnektivität testen", + "intro": "Sendet zwei ICMP-Sonden nacheinander an drei Ziele und meldet jede einzelne. Führt dann eine nslookup google.com aus, um die DNS-Auflösung unabhängig von ICMP zu überprüfen.", + "headerTest": "Test", + "headerTarget": "Ziel", + "headerConfirms": "Was es bestätigt", + "rows": [ + { + "test": "Google DNS", + "target": "8.8.8.8", + "confirms": "Externe Erreichbarkeit über bekannte Anycast IP" + }, + { + "test": "Cloudflare DNS", + "target": "1.1.1.1", + "confirms": "Unabhängige zweite Meinung, wenn Google ICMP blockiert" + }, + { + "test": "Gateway", + "target": "(Standardroute)", + "confirms": "L2/L3-Verbindung zum lokalen Router" + }, + { + "test": "DNS-Auflösung", + "target": "google.com", + "confirms": "Der DNS-Server ist erreichbar und antwortet" + } + ], + "readingTitle": "Lesen des Ergebnisses", + "readingBody": "Wenn der Gateway-Test besteht, aber die öffentlichen DNS-Ziele fehlschlagen, haben Sie lokale Konnektivität, aber kein Internet - überprüfen Sie den Upstream des Gateways. Wenn die DNS-Auflösung fehlschlägt, Pings zu 8.8.8.8 jedoch erfolgreich sind, ist das Problem der Resolver, nicht das Netzwerk: Überprüfen Sie /etc/resolv.conf." + }, + "advanced": { + "heading": "Erweiterte Diagnose", + "intro": "Fasst netzwerkweite Statistiken zusammen und prüft auf häufige Probleme. Meldet die Anzahl aktiver Verbindungen, lauschende Ports und die Gesamtzahl der Schnittstellen und weist ausdrücklich auf zwei problematische Konstellationen hin:", + "items": [ + "NetworkManager läuft auf einem Proxmox-Host. NetworkManager und Proxmox’ ifupdown stehen im Konflikt: Beide versuchen, Schnittstellen zu verwalten, sodass Bridges ständig ihren Zustand wechseln oder nicht aktiviert werden. Wird NetworkManager erkannt, bietet das Werkzeug an, ihn interaktiv zu stoppen, zu deaktivieren und vollständig zu entfernen (dies ist die einzige Diagnose, die das System ändern kann, und nur nach ausdrücklicher Zustimmung).", + "Doppelte IP-Adressen auf verschiedenen Schnittstellen. Zwei Schnittstellen mit derselben IPv4-Adresse verursachen sporadische Verbindungsprobleme, die innerhalb der VM äußerst schwer zu untersuchen sind. Erkannt über ip -4 addr show | sort | uniq -d." + ], + "nmTitle": "Die NetworkManager-Eingabeaufforderung ist hier die einzige Änderungsaktion", + "nmBody": "Alle anderen Prüfungen in der erweiterten Diagnose sind schreibgeschützt. Die Entfernung von NetworkManager erfordert eine Ja/Nein-Bestätigung und führt systemctl stop / disable + apt-get purge -y network-manager aus. Wenn Sie ablehnen, ändert sich nichts." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "gwTitle": "Konnektivität testen meldet einen Gatewayfehler, aber der Host hat Internetzugriff", + "gwBody": "Einige Router reagieren nicht auf ICMP von ihrer internen Schnittstelle aus, selbst wenn sie den Datenverkehr gerne weiterleiten. Testen Sie mit traceroute 8.8.8.8 von einer Konsole aus: Wenn der zweite Hop Ihr ISP ist und der öffentliche DNS-Test bestanden ist, ist das Gateway trotz des fehlgeschlagenen Pings in Ordnung.", + "dupTitle": "Die erweiterte Diagnose meldet weiterhin doppelte IP-Adressen, obwohl ich eine entfernt habe", + "dupBody": "Der Check betrachtet den Live-Kernel-Status, nicht die Config-Datei. Führen Sie ip -4 addr show aus, um zu bestätigen; wenn das Duplikat noch vorhanden ist, hält es immer noch eine Schnittstelle. Verwenden Sie ip addr del <IP>/<mask> dev <iface>, um es aus dem Live-Zustand zu entfernen, und bearbeiten Sie dann /etc/network/interfaces, wenn es auch persistent ist." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Überwachungswerkzeuge für Echtzeitdaten", + "href": "/docs/network/monitoring", + "tail": "— interaktive iftop / iptraf-ng / iperf3 Launcher." + }, + { + "label": "Brückenanalyse und geführte Reparatur", + "href": "/docs/network/bridge-analysis", + "tail": " — wenn einem vmbrX der physische Port fehlt." + }, + { + "label": "Konfigurationsanalyse und geführte Bereinigung", + "href": "/docs/network/config-analysis", + "tail": " — wenn eine alte Netzwerkkarte noch deklariert, aber nicht mehr vorhanden ist." + }, + { + "label": "Schnittstellen sichern und neu starten", + "href": "/docs/network/backup-restore", + "tail": " — um vor jeder Änderung einen Schnappschuss der Konfiguration zu erstellen." + } + ] + } +} diff --git a/web/messages/de/docs/network/index.json b/web/messages/de/docs/network/index.json new file mode 100644 index 00000000..f9900748 --- /dev/null +++ b/web/messages/de/docs/network/index.json @@ -0,0 +1,107 @@ +{ + "meta": { + "title": "Proxmox-Netzwerkverwaltung — Bridges, Bonds, Diagnose, Reparatur | ProxMenux", + "description": "Schreibgeschützte Diagnose, Analysen mit anschließenden Vorschlägen und geführte Reparaturen für den Debian-/Proxmox-Netzwerkstack (/etc/network/interfaces). Prüfen Sie Bridges und Bonds, starten Sie Live-Überwachungswerkzeuge, vergeben Sie dauerhafte Schnittstellennamen, erstellen Sie Backups und starten Sie das Netzwerk sicher neu — mit obligatorischen Backups und schrittweiser Vorschau.", + "ogTitle": "Proxmox-Netzwerkverwaltung — Bridges, Bonds, Diagnose, Reparatur", + "ogDescription": "Diagnose, Analyse und geführte Reparaturen für den Proxmox-Netzwerkstack mit obligatorischen Backups und Schritt-für-Schritt-Vorschau.", + "twitterTitle": "Proxmox-Netzwerkverwaltung | ProxMenux", + "twitterDescription": "Brücken, Bonds, Diagnosen und geführte Reparaturen für den Proxmox-Netzwerkstack mit obligatorischen Backups." + }, + "header": { + "title": "Netzwerkmanagement", + "description": "Schreibgeschützte Diagnose, Analyseberichte mit anschließenden Vorschlägen und geführte Reparaturen für den klassischen Debian-/Proxmox-Netzwerkstack. Jeder destruktive Vorgang erstellt zuerst ein Backup und zeigt die genauen Änderungen vor der Anwendung an.", + "section": "Netzwerk" + }, + "intro": { + "title": "Wozu dieses Menü dient", + "body": "Prüfen, diagnostizieren und reparieren Sie bei Bedarf die Netzwerkkonfiguration des Proxmox-Hosts, ohne den Fernzugriff zu verlieren. Die Werkzeuge folgen einem Prinzip: zuerst lesen, dann Vorschläge machen und Änderungen nur mit ausdrücklicher Zustimmung und einer Sicherheitskopie anwenden. Es gibt keine Schaltfläche „Alles automatisch reparieren“." + }, + "openingMenu": { + "heading": "Öffnen des Menüs", + "intro": "Wählen Sie im Hauptmenü von ProxMenux Netzwerk. Folgendes wird angezeigt:", + "imageAlt": "Menü Netzwerkmanagement mit Diagnose, Überwachung, Analyse, Reparatur, persistenten Namen und Backup-Optionen" + }, + "safety": { + "heading": "Das Sicherheitsmodell", + "body": "Das Bearbeiten der Netzwerkkonfiguration auf einem entfernten Proxmox-Host ist eine der einfachsten Möglichkeiten, sich auszusperren. ProxMenux behandelt jede Aktion entsprechend. Die Werkzeuge fallen in drei Verhaltensstufen - wählen Sie die Karte, die Ihrer Absicht entspricht:" + }, + "tiers": { + "readOnly": { + "title": "Schreibgeschützt", + "body": "Reine Inspektion. Kann das System unter keinen Umständen ändern.", + "items": [ + "Routingtabelle, Konnektivitätstests, fortgeschrittene Statistiken", + "Verkehrsüberwachung in Echtzeit (iftop, iptraf-ng)", + "Bandbreitentest (iperf3)" + ] + }, + "analyze": { + "title": "Analysieren, dann vorschlagen", + "body": "Erkennt Probleme, druckt einen Bericht mit vorgeschlagenen Shell-Befehlen und stoppt. Sie entscheiden, ob Sie anschließend in die geführte Reparatur eintreten möchten.", + "items": [ + "Brückenkonfigurationsanalyse", + "Netzwerkkonfigurationsanalyse" + ] + }, + "apply": { + "title": "Mit Backup anwenden", + "body": "Ändert das System. Erstellt immer zuerst ein Backup der betroffenen Datei mit Zeitstempel und zeigt vor dem Schreiben eine Vorschau an.", + "items": [ + "Persistente Schnittstellennamen (.link-Dateien)", + "Manuelles Backup, Wiederherstellung und Neustart des Dienstes" + ] + } + }, + "classicTitle": "Nur klassischer Stack", + "classicBody": "Jede Analyse- und Reparaturfunktion prüft den aktiven Netzwerkmanager, bevor sie etwas ändert. Wenn der Host netplan, systemd-networkd oder NetworkManager verwendet, bricht das Werkzeug sofort mit einer klaren Meldung ab — das Menü unterstützt nur den klassischen Debian-/Proxmox-Stack unter /etc/network/interfaces. Das ist beabsichtigt: Eine netplan-Datei nach Regeln für ifupdown zu bearbeiten, würde die Konfiguration unbemerkt beschädigen.", + "backups": { + "heading": "Wo Backups gespeichert werden", + "intro": "Jede geführte Reparatur, Wiederherstellung oder manuelle Sicherung schreibt eine zeitgestempelte Kopie von /etc/network/interfaces auf /var/backups/proxmenux/:", + "rollbackIntro": "So rollen Sie manuell von einer Konsole zurück:" + }, + "readOnlySection": { + "heading": "Schreibgeschützte Prüfung", + "body": "Der Ausgangspunkt, wenn etwas nicht stimmt. Reine Prüfung — schreibt nie in /etc/network/interfaces und führt nie einen ändernden Befehl aus (mit einer ausdrücklichen Ausnahme: Wird NetworkManager erkannt, kann er nach Ihrer Zustimmung vollständig entfernt werden). Jederzeit sicher über SSH nutzbar.", + "options": [ + { + "title": "Diagnose", + "description": "Drei einmalige, schreibgeschützte Prüfungen: Routingtabelle anzeigen, Konnektivität testen und erweiterte Diagnose. Reine Prüfung — schreibt nie in das System." + }, + { + "title": "Überwachungswerkzeuge für Echtzeitdaten", + "description": "Drei interaktive Launcher: iftop (Echtzeitbandbreite pro Hostpaar), iptraf-ng (Multi-Mode-Traffic-Monitor) und iperf3 (Bandbreitentest, Server / Client-Modus)." + } + ] + }, + "analyzeSection": { + "heading": "Analysieren, dann vorschlagen", + "body": "Wenn eine Prüfung oder ein tatsächlicher Ausfall auf ein Konfigurationsproblem hinweist, kommen diese Werkzeuge zum Einsatz. Jedes untersucht den relevanten Teil von /etc/network/interfaces, gibt einen detaillierten Bericht mit dem genauen Shell-Befehl zur Behebung jedes Befunds aus und stoppt. Wenn Sie anschließend die optionale geführte Reparatur annehmen, wird vor jeder Änderung eine Sicherung erstellt und die Änderung vor dem Schreiben angezeigt.", + "options": [ + { + "title": "Brückenanalyse und geführte Reparatur", + "description": "Erkennt vmbrX-Bridges mit fehlenden oder ungültigen Ports, etwa nach einer neuen PCI-Gerätenummerierung. Zeigt zuerst einen Bericht an und repariert nur, wenn Sie dem geführten Ablauf mit 5 Schritten zustimmen." + }, + { + "title": "Konfigurationsanalyse und geführte Bereinigung", + "description": "Findet in /etc/network/interfaces deklarierte physische Schnittstellen, die nicht mehr existieren (Waisenkonfigurationen, die durch Hardwareänderungen zurückgelassen wurden). Meldet sie und bietet eine geführte Entfernung an." + } + ] + }, + "applySection": { + "heading": "Mit Backup anwenden", + "body": "Diese Werkzeuge schreiben bestimmungsgemäß auf den Datenträger. Jedes erstellt vorher ein Backup der betroffenen Datei mit Zeitstempel. Destruktive Optionen wie Wiederherstellen und Neustarten erfordern eine ausdrückliche Ja/Nein-Bestätigung. Persistente Schnittstellennamen werden erst beim nächsten Neustart wirksam, sodass die Einrichtung auch auf einem entfernten Host sicher geplant werden kann.", + "options": [ + { + "title": "Persistente Schnittstellennamen", + "description": "Bindet Schnittstellennamen (eno1, enp3s0, …) über systemd-.link-Dateien an MAC-Adressen. Die Namen bleiben bei PCI-Steckplatzwechseln, Kernel-Upgrades und beim Hinzufügen oder Entfernen anderer Netzwerkkarten erhalten." + }, + { + "title": "Schnittstellen sichern und neu starten", + "description": "Manueller Snapshot von /etc/network/interfaces, Durchsuchen und Wiederherstellen früherer Backups, Anzeigen der Live-Konfiguration und Neustart des Netzwerkdienstes bei Bedarf." + } + ] + }, + "consoleTitle": "Konsolenzugriff bereithalten", + "consoleSubTitle": "Vor jeder Reparatur auf einem entfernten Host", + "consoleBody": "Wenn Sie über SSH verbunden sind und nur einen Zugangsweg zum Host haben, halten Sie vor Netzwerkänderungen einen Ersatzweg bereit: eine physische Konsole, IPMI oder iKVM oder einen anderen Rechner im selben LAN. Die geführten Reparaturen sind sicher und bieten immer einen Befehl zum Zurücksetzen. Eine falsch konfigurierte Bridge oder eine unterbrochene Verbindung kann Sie dennoch aussperren, bis Sie die Konsole erreichen." +} diff --git a/web/messages/de/docs/network/monitoring.json b/web/messages/de/docs/network/monitoring.json new file mode 100644 index 00000000..c0be503f --- /dev/null +++ b/web/messages/de/docs/network/monitoring.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Überwachungswerkzeuge für Echtzeitdaten | ProxMenux-Dokumentation", + "description": "Drei interaktive Netzwerküberwachungsstarter: iftop (Echtzeitbandbreite pro Hostpaar), iptraf-ng (Multi-Mode-Traffic-Monitor) und iperf3 (Bandbreitentest, Server / Client-Modus). Jeder wird bei der ersten Verwendung installiert.", + "ogTitle": "Überwachungswerkzeuge für Echtzeitdaten | ProxMenux-Dokumentation", + "ogDescription": "Interaktive Netzwerküberwachung und Bandbreitentests für den Proxmox-Host: iftop, iptraf-ng, iperf3." + }, + "header": { + "title": "Überwachungswerkzeuge für Echtzeitdaten", + "description": "Drei interaktive Starter zur Echtzeit-Netzwerkbeobachtung und Bandbreitenmessung: iftop, iptraf-ng und iperf3. Jedes Werkzeug wird beim ersten Gebrauch automatisch über apt installiert, läuft im Vordergrund und wird mit der angegebenen Taste beendet. Sie ändern die Netzwerkkonfiguration des Hosts nicht; iperf3 erzeugt Testverkehr.", + "section": "Netzwerk" + }, + "intro": { + "title": "Was das macht", + "body": "Drei interaktive Monitoring-Tools, jedes hinter seinem eigenen Menüeintrag. Beim ersten Start eines Pakets wird das Paket lautlos über apt-get installiert. Nachfolgende Starts beginnen sofort. Keines dieser Tools ändert die Host-Netzwerkkonfiguration." + }, + "when": { + "heading": "Welches Werkzeug Sie wann verwenden", + "headerQuestion": "Fragestellung", + "headerUse": "Verwenden", + "rows": [ + { + "question": "Wer lastet die Verbindung gerade jetzt aus?", + "use": "iftop" + }, + { + "question": "Welche Protokollaufschlüsselung / Paketgrößen / TCP-Flows fließen?", + "use": "iptraf-ng" + }, + { + "question": "Wie viel Bandbreite ist tatsächlich zwischen zwei Hosts verfügbar?", + "use": "iperf3" + } + ] + }, + "iftop": { + "heading": "Netzwerknutzung in Echtzeit (iftop)", + "body": "Bandbreite pro Hostpaar (Quelle ↔ Ziel) in Echtzeit — wie top für Netzwerkverkehr. Zeigt die größten Datenströme oben an, mit gleitenden Durchschnitten über 2/10/40 Sekunden. Das beste Werkzeug für die Frage „Warum ist mein Uplink ausgelastet?“.", + "exit": "Beenden: Drücken Sie q. ProxMenux zeigt vor dem Start einen Erinnerungsdialog.", + "keysTitle": "Nützliche Tasten in iftop", + "keysBody": "n DNS-Auflösung umschalten, p Portnummern anzeigen, P Anzeige pausieren, t Zeilenrichtung umschalten (gesendet / empfangen / beides), 1/2/3 nach dem Durchschnitt über 2 s / 10 s / 40 s sortieren. Vollständige Liste unter man iftop." + }, + "iptraf": { + "heading": "Netzwerküberwachungstool (iptraf-ng)", + "intro": "Ein menügesteuerter Verkehrsmonitor mit mehreren Modi. iftop beantwortet „wer“, iptraf-ng beantwortet „was“: Byte-/Paketzähler pro Protokoll, Verfolgung des TCP-Verbindungszustands, Paketgrößenhistogramme und LAN-Aktivität pro Station.", + "menuIntro": "Beim Start erhalten Sie ein Menü mit fünf Optionen:", + "headerMode": "Modus", + "headerUseFor": "Verwenden Sie es für", + "rows": [ + { + "mode": "IP-Verkehrsmonitor", + "useFor": "Live TCP / UDP/ICMP / Other-IP-Flow-Liste mit Byte-Zählern und Verbindungszustand" + }, + { + "mode": "Allgemeine Schnittstellenstatistiken", + "useFor": "Aggregierte IPv4/IPv6/TCP/UDP/ICMP/Nicht-IP-Paketzahl pro NIC" + }, + { + "mode": "Detaillierte Schnittstellenstatistiken", + "useFor": "Gleiche wie oben, aber für eine Schnittstelle, mit Paketgröße und -rate Details" + }, + { + "mode": "Statistische Aufgliederungen", + "useFor": "Histogramm der Paketgrößenverteilung nach TCP / UDP Port" + }, + { + "mode": "LAN-Stationenmonitor", + "useFor": "Per-MAC-Verkehrsstatistiken für die lokale Broadcast-Domain" + } + ], + "exit": "Beenden: Drücken Sie in einer beliebigen Ansicht x oder im Hauptmenü Q. ProxMenux zeigt vor dem Start einen Erinnerungsdialog.", + "logTitle": "Erfasste Daten in einer Datei protokollieren", + "logBody": "Jeder Modus bietet an, erfasste Statistiken unter /var/log/iptraf-ng/ zu protokollieren. Nützlich zur Aufzeichnung einer Verkehrsspitze: Lassen Sie das Werkzeug laufen, protokollieren Sie in eine Datei und prüfen Sie diese später, statt die Live-Anzeige mitlesen zu müssen." + }, + "iperf3": { + "heading": "Bandbreitentest (iperf3)", + "intro1": "Misst den tatsächlichen TCP-Durchsatz zwischen zwei Hosts. Anders als iftop / iptraf-ng, die vorhandenen Verkehr beobachten, erzeugt iperf3 künstlichen Verkehr für einen Belastungstest der Verbindung. Unverzichtbar für Fragen wie „Erreicht mein 10-GbE-Link wirklich 10 GbE?“ oder „Liegt der Engpass an der Netzwerkkarte, am Switch oder am Speicher?“.", + "intro2": "iperf3 ist ein Werkzeug für zwei Hosts: Eine Seite läuft als Server und lauscht auf TCP-Port 5201, die andere als Client, der sich verbindet, Daten sendet und die Rate ausgibt. Der ProxMenux-Starter fragt nach dem gewünschten Modus:", + "headerMode": "Modus", + "headerBehaviour": "Verhalten", + "headerCli": "Entsprechender CLI-Befehl", + "rows": [ + { + "mode": "Server", + "behaviour": "Lauscht auf TCP-Port 5201 und gibt für jeden eingehenden Test Ergebnisse aus. Beenden mit Ctrl+C.", + "cli": "iperf3 -s" + }, + { + "mode": "Client", + "behaviour": "Fragt nach der Server-IP / Hostname, verbindet, führt einen Standard-10-Sekunden-Test aus und druckt den Bericht aus.", + "cli": "iperf3 -c " + } + ], + "workflowIntro": "Typischer Workflow zum Testen einer 10 GbE-Verbindung zwischen zwei Proxmox-Hosts:", + "workflow": [ + "Öffnen Sie auf Host A das Netzwerkmenü → Bandbreitentest (iperf3) → wählen Sie Server.", + "Öffnen Sie auf Host B den gleichen Menüeintrag → Wählen Sie Client → Geben Sie die IP von Host A ein.", + "Warten Sie 10 Sekunden. Vergleichen Sie die gemeldete Rate mit dem theoretischen Maximum des Links." + ], + "sample": "Beispiel für die Client-Ausgabe:", + "flagsTitle": "Nützliche manuelle Flags (aus einer Shell ausgeführt)", + "flagsBody": "-t 60 längerer Test (60 s statt 10 s), -P 4 4 parallele Datenströme (lastet schneller aus), -R umgekehrte Richtung (Server → Client), -u -b 100M UDP-Test mit 100 Mbit/s (für Jitter- und Paketverlustmessungen), -p 5202 anderer Port (mehrere parallele Tests). Vollständige Liste unter man iperf3.", + "firewallTitle": "Öffnen Sie den Firewall-Port auf dem Server", + "firewallBody": "Der Server hört standardmäßig auf TCP 5201. Wenn Sie den Server in einem Proxmox-Host mit einer strengen Firewall (Datacenter oder Host-Level) betreiben, erlauben Sie für die Dauer des Tests eingehende TCP 5201 von der IP des Clients und schließen Sie ihn erneut. Gleiches gilt für nftables / iptables auf bloßen Hosts." + }, + "install": { + "heading": "Erster Start installiert das Paket", + "body": "Alle drei Starter prüfen, ob das Programm vorhanden ist, und führen bei Bedarf apt-get update -qq && apt-get install -y <pkg> aus. Die Installation erfolgt ohne Ausgabe: Das Menü kann beim ersten Mal 10–30 Sekunden lang eingefroren wirken. Spätere Starts erfolgen sofort." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "hangTitle": "Die Installation hängt beim ersten Start endlos", + "hangBody": "Der Host hat kein Internet oder die Apt-Repos sind nicht erreichbar. Brechen Sie mit Ctrl+C ab, führen Sie apt-get update manuell aus, um den tatsächlichen Fehler anzuzeigen (DNS, Repo-Signatur, Proxy …), und kehren Sie dann zum Menü zurück.", + "refusedTitle": "iperf3-Client: „unable to connect to server: Connection refused“", + "refusedBody": "Entweder läuft der Server nicht oder seine Firewall blockiert TCP 5201. Prüfen Sie auf dem Server mit ss -tlnp | grep 5201, ob iperf3 lauscht. Lauscht es, aber der Client kann sich weiterhin nicht verbinden, prüfen Sie die Firewalls auf dem Weg zwischen beiden Hosts.", + "slowTitle": "iperf3 meldet deutlich weniger als die erwartete Verbindungsgeschwindigkeit", + "slowBody": "Häufige Ursachen nach Wahrscheinlichkeit: (1) Die CPU eines Hosts begrenzt den Durchsatz — versuchen Sie iperf3 -c <target> -P 4 zur Nutzung mehrerer Kerne; (2) der Weg enthält eine langsamere Verbindung, etwa einen Gigabit-Switch zwischen zwei 10-GbE-Karten; (3) unterschiedliche MTU — prüfen Sie ip link show an beiden Enden; (4) deaktiviertes NIC-Offloading — siehe Community-Skript Disable NIC Offloading bei einer Intel-e1000e-Karte.", + "noTrafficTitle": "iftop / iptraf-ng zeigt keinen Traffic für einen beschäftigten Host an", + "noTrafficBody": "Die Standarderfassung erfolgt auf der ersten erkannten Schnittstelle. Geben Sie die richtige explizit aus der Shell an: iftop -i vmbr0 oder iptraf-ng -i vmbr0. Der Menüstarter verwendet den Standard; für nicht standardmäßige Schnittstellen, laufen Sie von einer Konsole aus." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Diagnose", + "href": "/docs/network/diagnostics", + "tail": " — die einmaligen, schreibgeschützten Prüfungen (Routing, Konnektivität, erweiterte Statistiken)." + }, + { + "label": "Brückenanalyse und geführte Reparatur", + "href": "/docs/network/bridge-analysis", + "tail": "Wenn die Überwachung zeigt, dass eine Schnittstelle oder Brücke nicht das tut, was sie sollte." + } + ] + } +} diff --git a/web/messages/de/docs/network/persistent-names.json b/web/messages/de/docs/network/persistent-names.json new file mode 100644 index 00000000..4c79b075 --- /dev/null +++ b/web/messages/de/docs/network/persistent-names.json @@ -0,0 +1,130 @@ +{ + "meta": { + "title": "Persistente Schnittstellennamen | ProxMenux-Dokumentation", + "description": "Binden Sie Proxmox-Schnittstellennamen (eno1, enp3s0, …) über systemd-.link-Dateien an MAC-Adressen, damit sie bei neuer PCI-Nummerierung, Kernel-Upgrades und beim Hinzufügen oder Entfernen anderer Netzwerkkarten erhalten bleiben.", + "ogTitle": "Persistente Schnittstellennamen | ProxMenux-Dokumentation", + "ogDescription": "Verhindern Sie, dass sich Proxmox-Schnittstellennamen bei Hardwareänderungen ändern. Verwendet systemd-.link-Dateien mit Zuordnung über die MAC-Adresse." + }, + "header": { + "title": "Persistente Schnittstellennamen", + "description": "Erstellt pro physischer Netzwerkkarte eine systemd-.link-Datei, die den vom Kernel vergebenen Namen an die MAC-Adresse der Karte bindet. Nach der Anwendung beim nächsten Neustart bleiben die Schnittstellennamen beim Hinzufügen, Entfernen oder Umstecken von PCIe-Karten stabil.", + "section": "Netzwerk" + }, + "intro": { + "title": "Was das macht", + "body": "Schreibt für jede physische Netzwerkkarte des Hosts eine kleine Datei unter /etc/systemd/network/10-<iface>.link mit der Regel: „Das Gerät mit dieser MAC-Adresse muss immer diesen Namen tragen.“ systemd-udevd wendet die Regel bei jedem Start an, bevor ifupdown die Datei /etc/network/interfaces liest." + }, + "problem": { + "heading": "Das Problem, das dies löst", + "intro": "Linux leitet Standard-Schnittstellennamen aus der PCI-Topologie ab — eno1 = onboard, enp3s0 = die Karte in PCI-Bus 3, Steckplatz 0 usw. Das Namensschema ist deterministisch, solange die Hardwareanordnung gleich bleibt. Ändert sich die Anordnung, verschieben sich die Namen:", + "items": [ + "Fügen Sie einen GPU vor einem vorhandenen NIC hinzu → die NIC-Busnummer kann sich ändern → Namensänderungen.", + "Bewegen Sie eine Karte in einen anderen PCIe-Slot → Namensänderungen.", + "BIOS / UEFI-Update, das Geräte erneut auflistet → Namen können sich ändern.", + "Ersetzen Sie eine fehlerhafte Karte durch das gleiche Modell in einem anderen Slot → Namensänderungen." + ], + "outro": "Nach einer solchen Änderung verweist /etc/network/interfaces weiterhin auf den alten Namen. Die Bridge lässt sich nicht aktivieren und der Host verliert die Netzwerkverbindung. Persistente Namen verhindern, dass dieses Szenario erneut auftritt." + }, + "howWorks": { + "heading": "Wie es funktioniert", + "arrowLabel": "je NIC", + "nodes": { + "detectLabel": "Physische NIC erkennen", + "detectDetail": "ls /sys/class/net/\nvmbr / bond / docker / veth /\nwireguard … ausschließen", + "readLabel": "Jede MAC-Adresse lesen", + "readDetail": "cat /sys/class/net/\n '<'iface'>'/address", + "writeLabel": ".link-Datei schreiben", + "writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link" + }, + "minimalIntro": "Jede generierte Datei ist absichtlich minimal:", + "minimalOutro": "Beim Start erkennt systemd-udevd das Gerät anhand der MAC-Adresse und weist den gewünschten Namen zu, bevor andere Komponenten wie ifupdown oder die Standardbenennung des Kernels darauf zugreifen. Das Dateipräfix 10- sorgt dafür, dass diese Regeln früh und vor der Standarddatei 99-default.link geladen werden." + }, + "scope": { + "heading": "Was geschrieben wird, was übersprungen wird", + "headerType": "Typ", + "headerBehaviour": "Verhalten", + "headerWhy": "Warum", + "rows": [ + { + "type": "Onboard-/PCIe-Netzwerkkarte", + "behaviour": ".link Datei geschrieben", + "why": "Unterstützt durch ein echtes PCI-Gerät - der Fall, für den das Tool geeignet ist" + }, + { + "type": "Wi-Fi (phy80211)", + "behaviour": ".link Datei geschrieben", + "why": "Hat einen echten MAC und profitiert von Namensstabilität" + }, + { + "type": "Brücken (vmbrX)", + "behaviour": "Übersprungen", + "why": "Virtuell; Name kommt von /etc/network/interfaces" + }, + { + "type": "Bonds (bondX)", + "behaviour": "Übersprungen", + "why": "Virtuell; Bondname wird von ifupdown festgelegt" + }, + { + "type": "veth / docker0 / br-XXXX", + "behaviour": "Übersprungen", + "why": "Erstellt auf Anfrage von Docker / LXC - keine persistente Hardware" + }, + { + "type": "tap / fwpr / fwln", + "behaviour": "Übersprungen", + "why": "Erstellt auf Anfrage von Proxmox per VM/CT" + }, + { + "type": "WireGuard / Cilium / Tailscale", + "behaviour": "Übersprungen", + "why": "Software-Schnittstellen, die von eigenen Daemons verwaltet werden" + } + ] + }, + "safety": { + "heading": "Sicherheitsnetz: Frühere .link-Dateien werden gesichert", + "intro": "Wenn /etc/systemd/network/ bereits .link-Dateien enthält (aus einem früheren Lauf oder anderen Tools), werden diese in ein Backup-Verzeichnis mit Zeitstempel kopiert, bevor die neuen generiert werden:", + "outro": "Zum Zurückrollen: Kopieren Sie die Dateien aus dem Backup-Verzeichnis zurück und starten Sie neu.", + "rebootTitle": "Effekt beim nächsten Neustart, nicht sofort", + "rebootBody": "Änderungen an .link-Dateien gelten nur beim Booten, wenn udev Geräte erneut auflistet. Das Tool meldet \"Änderungen gelten nach dem Neustart\" aus diesem Grund. Das Umbenennen einer Schnittstelle ist riskant und wird nicht versucht: Ein aktiver vmbr0 mit Mitgliedern müsste atomar neu konfiguriert werden, weshalb die Operation auf den nächsten sauberen Boot verschoben wird." + }, + "afterReboot": { + "heading": "Nach dem Reboot", + "intro": "Sobald die Namen angeheftet sind, ist der Workflow für zukünftige Hardwareänderungen einfach:", + "items": [ + "Ausschalten, Hardware ändern (Karte hinzufügen, in einen anderen Steckplatz umstecken, …), starten.", + "Jedes NIC behält seinen vorherigen Namen, weil sein MAC mit einer .link-Datei übereinstimmt.", + "Wenn ein NIC ersetzt wird (anderer MAC), erhält er einen Standard-Kernelnamen (enp<bus>s<slot>); Führen Sie dieses Menü erneut aus, um einen .link-Eintrag für den MAC der neuen Karte hinzuzufügen." + ] + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "emptyTitle": "\"Keine physischen Schnittstellen gefunden\" nach dem Ausführen des Tools", + "emptyBody": "Der Kernel erkennt auf dem Host keine auf PCI oder phy80211 basierenden Schnittstellen. Prüfen Sie mit ls -l /sys/class/net/ — jeder Eintrag sollte entweder einen device-Symlink (PCI) oder einen phy80211-Eintrag (WLAN) haben. Fehlt bei einer echten Netzwerkkarte beides, ist der Treiber nicht geladen.", + "noChangeTitle": "Nach dem Neustart änderten sich die Namen nicht wie erwartet", + "noChangeBody": "Überprüfen Sie, ob die Datei vorhanden und gut geformt ist: cat /etc/systemd/network/10-<iface>.link. Dann überprüfen Sie udev logs: journalctl -u systemd-udevd -b | grep -i link. Eine häufige Ursache ist ein veralteter net.ifnames=0-Kernelparameter, der die vorhersagbare Benennung vollständig deaktiviert - entfernen Sie ihn aus /etc/default/grub, führen Sie update-grub aus, Neustart.", + "undoTitle": "Ich möchte persistente Benennung rückgängig machen", + "undoBody": "Löschen Sie entweder die .link-Dateien (rm /etc/systemd/network/10-*.link) oder stellen Sie sie aus dem beim vorherigen Durchlauf erstellten Backup-Verzeichnis wieder her. Starten Sie neu, um die Änderung anzuwenden." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Brückenanalyse und geführte Reparatur", + "href": "/docs/network/bridge-analysis", + "tailRich": " — der Wiederherstellungsweg, wenn sich die Namen bereits geändert haben." + }, + { + "label": "Konfigurationsanalyse und geführte Bereinigung", + "href": "/docs/network/config-analysis", + "tail": "- um verwaiste Blöcke zu entfernen, die durch Namensverschiebungen zurückgelassen wurden." + }, + { + "label": "Diagnose", + "href": "/docs/network/diagnostics", + "tailRich": " — bestätigen Sie die neuen Namen nach dem Neustart mit Routingtabelle anzeigen." + } + ] + } +} diff --git a/web/messages/en/docs/network/monitoring.json b/web/messages/en/docs/network/monitoring.json index c6e85f08..ef749366 100644 --- a/web/messages/en/docs/network/monitoring.json +++ b/web/messages/en/docs/network/monitoring.json @@ -7,7 +7,7 @@ }, "header": { "title": "Live monitoring tools", - "description": "Three interactive launchers for real-time network observation and bandwidth measurement: iftop, iptraf-ng and iperf3. Each tool is auto-installed from apt on first use, runs in the foreground, and is exited with the documented keystroke. Read-only against the host configuration — they only observe traffic.", + "description": "Three interactive launchers for real-time network observation and bandwidth measurement: iftop, iptraf-ng and iperf3. Each tool is auto-installed from apt on first use, runs in the foreground, and is exited with the documented keystroke. They do not change the host network configuration; iperf3 generates test traffic.", "section": "Network" }, "intro": { diff --git a/web/messages/es/docs/network/backup-restore.json b/web/messages/es/docs/network/backup-restore.json index 4e6945a4..75ead38d 100644 --- a/web/messages/es/docs/network/backup-restore.json +++ b/web/messages/es/docs/network/backup-restore.json @@ -1,8 +1,8 @@ { "meta": { - "title": "Backup y reinicio de interfaces | ProxMenux Documentation", + "title": "Backup y reinicio de interfaces | Documentación de ProxMenux", "description": "Snapshot manual, navegación y restauración de backups de /etc/network/interfaces almacenados en /var/backups/proxmenux/. Incluye un reinicio del servicio de red con confirmación y una vista rápida de la configuración en vivo.", - "ogTitle": "Backup y reinicio de interfaces | ProxMenux Documentation", + "ogTitle": "Backup y reinicio de interfaces | Documentación de ProxMenux", "ogDescription": "Snapshot y restauración de la configuración de red de Proxmox; reinicia el servicio de red con confirmación." }, "header": { @@ -27,7 +27,7 @@ "heading": "Crear backup de red", "body": "Copia el /etc/network/interfaces actual al directorio de backups con un timestamp nuevo. Ya está — sin análisis, sin prompts, solo un snapshot.", "whenTitle": "Cuándo hacer un backup manual", - "whenBody": "Antes de editar /etc/network/interfaces a mano, antes de instalar un paquete que pueda tocar la stack de red (p. ej. NetworkManager, Open vSwitch) o antes de cualquier cambio de hardware. Las reparaciones guiadas ya hacen snapshot automáticamente — esta opción es para los momentos manuales." + "whenBody": "Antes de editar /etc/network/interfaces a mano, antes de instalar un paquete que pueda modificar la pila de red (p. ej. NetworkManager, Open vSwitch) o antes de cualquier cambio de hardware. Las reparaciones guiadas ya crean una copia automáticamente; esta opción es para las operaciones manuales." }, "restore": { "heading": "Restaurar backup de red", @@ -96,7 +96,7 @@ "tail": " — la razón más habitual por la que un backup acaba aquí." }, { - "label": "Análisis de config y limpieza guiada", + "label": "Análisis de configuración y limpieza guiada", "href": "/docs/network/config-analysis", "tailRich": " — también escribe en /var/backups/proxmenux/ automáticamente." }, diff --git a/web/messages/es/docs/network/bridge-analysis.json b/web/messages/es/docs/network/bridge-analysis.json index 6fba5f64..af1f211f 100644 --- a/web/messages/es/docs/network/bridge-analysis.json +++ b/web/messages/es/docs/network/bridge-analysis.json @@ -1,8 +1,8 @@ { "meta": { - "title": "Análisis de bridges y reparación guiada | ProxMenux Documentation", + "title": "Análisis de bridges y reparación guiada | Documentación de ProxMenux", "description": "Detecta bridges vmbrX con puertos físicos ausentes o inválidos (típico tras una re-enumeración PCI), los reporta con comandos de shell propuestos y ofrece una reparación guiada de 5 pasos con backup obligatorio.", - "ogTitle": "Análisis de bridges y reparación guiada | ProxMenux Documentation", + "ogTitle": "Análisis de bridges y reparación guiada | Documentación de ProxMenux", "ogDescription": "Auditar y reparar los puertos de bridge de Proxmox tras cambios de hardware, con flujo guiado y rollback seguro." }, "header": { @@ -35,7 +35,7 @@ "bridgeLabel": "Analizar (solo lectura)", "bridgeDetail": "ip link show enp3s0\n→ no existe", "targetLabel": "Informe + sugerencia", - "targetDetail": "❌ enp3s0: NOT FOUND\nReemplazar por: eno1\n(aún sin cambios)" + "targetDetail": "❌ enp3s0: NO ENCONTRADA\nReemplazar por: eno1\n(aún sin cambios)" } }, "diagram2": { @@ -50,7 +50,7 @@ }, "step1": { "heading": "Paso 1: análisis (solo lectura)", - "intro": "Seleccionar Analizar configuración de bridges aborta inmediatamente si el host no usa la stack clásica de Debian/Proxmox. Si no, recorre cada bridge y reporta:", + "intro": "Al seleccionar Analizar configuración de bridges, la herramienta se detiene inmediatamente si el host no usa la pila clásica de Debian/Proxmox. En caso contrario, recorre todos los bridges e informa de:", "items": [ "Nombre del bridge, estado actual (UP / DOWN), IP asignada.", "Cada puerto declarado y si existe actualmente (ip link show <port>).", @@ -76,7 +76,7 @@ }, { "title": "3. Previsualizar los cambios propuestos", - "body": "Lista exactamente qué bridges se van a tocar y qué sustituciones de puerto se van a hacer. Si el análisis decide que en realidad no hay que arreglar nada (race condition: el puerto volvió), el flujo sale limpio con \"No changes needed.\"", + "body": "Lista exactamente qué bridges se modificarán y qué sustituciones de puertos se harán. Si el análisis determina que no hay nada que reparar porque el puerto ha reaparecido entre las comprobaciones, el proceso termina con «No es necesario realizar cambios».", "tone": "blue" }, { @@ -90,7 +90,7 @@ "tone": "emerald" } ], - "restartTitle": "Reiniciar networking ≠ un undo gratis", + "restartTitle": "Reiniciar la red ≠ deshacer los cambios sin riesgo", "restartBody": "La reparación se escribe en disco independientemente de si reinicias el servicio. systemctl restart networking aplica el cambio ahora, lo que puede cortar tu sesión SSH si el nuevo puerto es incorrecto. Si rechazas el reinicio, el cambio sigue surtiendo efecto en el siguiente reinicio — confirma antes la nueva config o haz rollback con el comando impreso." }, "edits": { @@ -99,8 +99,8 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "unsupportedTitle": "El análisis aborta con \"Unsupported Network Stack\"", - "unsupportedBody": "El host usa netplan, systemd-networkd o NetworkManager. La herramienta solo soporta /etc/network/interfaces. Cambia el host a la stack clásica primero, o edita la configuración con las herramientas nativas del gestor (p. ej. netplan apply).", + "unsupportedTitle": "El análisis se detiene con «Pila de red no compatible»", + "unsupportedBody": "El host usa netplan, systemd-networkd o NetworkManager. La herramienta solo admite /etc/network/interfaces. Cambia primero el host a la pila clásica o edita la configuración con las herramientas nativas del gestor (p. ej. netplan apply).", "noSuggestTitle": "No se imprime sugerencia para un puerto inválido", "noSuggestBody": "El host no tiene ninguna interfaz física libre (todas están ya en otro bridge o no existen). El análisis cae a sugerir bridge-ports none para que el bridge al menos pueda levantar sin puerto. Añade una NIC o migra puertos entre bridges manualmente antes de volver a ejecutar.", "stillDownTitle": "La reparación termina pero el bridge sigue DOWN", @@ -118,7 +118,7 @@ "tail": " — fija los nombres a direcciones MAC para que esto deje de pasar." }, { - "label": "Análisis de config y limpieza guiada", + "label": "Análisis de configuración y limpieza guiada", "href": "/docs/network/config-analysis", "tailRich": " — para bloques iface huérfanos (la otra mitad del mismo problema)." }, diff --git a/web/messages/es/docs/network/config-analysis.json b/web/messages/es/docs/network/config-analysis.json index af835473..637b08f6 100644 --- a/web/messages/es/docs/network/config-analysis.json +++ b/web/messages/es/docs/network/config-analysis.json @@ -1,12 +1,12 @@ { "meta": { - "title": "Análisis de config y limpieza guiada | ProxMenux Documentation", + "title": "Análisis de configuración y limpieza guiada | Documentación de ProxMenux", "description": "Detecta bloques iface en /etc/network/interfaces que referencian NICs físicas que ya no están en el host. Los reporta y ofrece una eliminación guiada de 5 pasos con backup obligatorio y previsualización por bloque.", - "ogTitle": "Análisis de config y limpieza guiada | ProxMenux Documentation", + "ogTitle": "Análisis de configuración y limpieza guiada | Documentación de ProxMenux", "ogDescription": "Encuentra y elimina bloques de interfaz huérfanos dejados por cambios de hardware, con previsualización completa y rollback." }, "header": { - "title": "Análisis de config y limpieza guiada", + "title": "Análisis de configuración y limpieza guiada", "description": "Recorre cada bloque iface en /etc/network/interfaces y verifica que la NIC física subyacente sigue existiendo. Reporta los bloques huérfanos dejados por cambios de hardware y ofrece una eliminación guiada con backup, previsualización y confirmación por bloque.", "section": "Red" }, @@ -18,7 +18,7 @@ "heading": "En qué se diferencia del análisis de bridges", "headerAspect": "Aspecto", "headerBridge": "Análisis de bridges", - "headerConfig": "Análisis de config", + "headerConfig": "Análisis de configuración", "rows": [ { "aspect": "Mira", @@ -45,7 +45,7 @@ }, "step1": { "heading": "Paso 1: análisis (solo lectura)", - "intro": "Aborta inmediatamente si el host no usa la stack clásica. Si no, lista cada interfaz configurada que no sea loopback y reporta su estado:", + "intro": "Se detiene inmediatamente si el host no usa la pila clásica. En caso contrario, lista todas las interfaces configuradas salvo loopback e indica su estado:", "virtTitle": "Las interfaces virtuales están protegidas", "virtBody": "Los bridges (vmbrX) y los bonds (bondX) son construcciones virtuales. Pueden no existir legítimamente en el momento de la inspección (p. ej. un bridge aún sin puertos), por lo que el análisis nunca propone eliminarlos — solo NICs físicas." }, @@ -60,7 +60,7 @@ }, { "title": "2. Confirmar la lista a eliminar", - "body": "Lista exactamente qué bloques de interfaz física se van a eliminar. Si, entre el análisis y la limpieza, las NICs han reaparecido (p. ej. has reasentado una tarjeta), el flujo sale con \"No cleanup needed.\"", + "body": "Lista exactamente qué bloques de interfaz física se eliminarán. Si las NIC han reaparecido entre el análisis y la limpieza, por ejemplo al volver a insertar una tarjeta, el proceso termina con «No es necesaria ninguna limpieza».", "tone": "blue" }, { @@ -91,7 +91,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "notFoundTitle": "El análisis muestra mi NIC nueva como \"NOT FOUND\"", + "notFoundTitle": "El análisis muestra mi NIC nueva como «NO ENCONTRADA»", "notFoundBody": "El kernel ve el dispositivo con un nombre distinto al que hay en el fichero. Ejecuta ip link show para obtener el nombre real. Este es exactamente el caso en el que Nombres persistentes de interfaz evitaría el problema de aquí en adelante.", "tooMuchTitle": "La limpieza eliminó demasiado (un bloque que quería conservar)", "tooMuchBody": "Restaura desde el backup impreso en el paso 5:", diff --git a/web/messages/es/docs/network/diagnostics.json b/web/messages/es/docs/network/diagnostics.json index 2e01d19e..7ea0b105 100644 --- a/web/messages/es/docs/network/diagnostics.json +++ b/web/messages/es/docs/network/diagnostics.json @@ -1,8 +1,8 @@ { "meta": { - "title": "Diagnóstico | ProxMenux Documentation", - "description": "Tres comprobaciones de diagnóstico puntuales de solo lectura: Mostrar tabla de rutas, Test de conectividad y Diagnóstico avanzado. Pura inspección — nunca escribe en /etc/network/interfaces y nunca ejecuta un comando modificador (con una excepción explícita y opt-in para purgar NetworkManager cuando se detecta).", - "ogTitle": "Diagnóstico | ProxMenux Documentation", + "title": "Diagnóstico | Documentación de ProxMenux", + "description": "Tres comprobaciones de diagnóstico puntuales de solo lectura: Mostrar tabla de rutas, Test de conectividad y Diagnóstico avanzado. Pura inspección: nunca escribe en /etc/network/interfaces ni ejecuta comandos modificadores, con una excepción explícita que requiere tu aceptación para purgar NetworkManager si se detecta.", + "ogTitle": "Diagnóstico | Documentación de ProxMenux", "ogDescription": "Diagnóstico de red de solo lectura para el host Proxmox: rutas, alcanzabilidad, estadísticas avanzadas." }, "header": { @@ -21,12 +21,12 @@ "connectivity": { "heading": "Test de conectividad", "intro": "Envía dos sondas ICMP a tres destinos en secuencia y reporta cada uno. Luego ejecuta un nslookup google.com para verificar la resolución DNS independientemente de ICMP.", - "headerTest": "Test", + "headerTest": "Prueba", "headerTarget": "Destino", "headerConfirms": "Qué confirma", "rows": [ { - "test": "Google DNS", + "test": "DNS de Google", "target": "8.8.8.8", "confirms": "Alcanzabilidad externa por IP anycast conocida" }, @@ -36,7 +36,7 @@ "confirms": "Segunda opinión independiente si Google bloquea ICMP" }, { - "test": "Gateway", + "test": "Pasarela", "target": "(ruta por defecto)", "confirms": "Conectividad L2 / L3 con el router local" }, @@ -53,7 +53,7 @@ "heading": "Diagnóstico avanzado", "intro": "Agrega estadísticas de red a nivel global y ejecuta una batería de comprobaciones de problemas comunes. Reporta el número de conexiones activas, puertos en escucha, total de interfaces y señala dos antipatrones explícitamente:", "items": [ - "NetworkManager corriendo en un host Proxmox. NetworkManager y el ifupdown de Proxmox entran en conflicto — los dos intentan gestionar interfaces, lo que provoca bridges que flapean o se niegan a levantar. Si se detecta, la herramienta ofrece un prompt interactivo para detenerlo, deshabilitarlo y purgarlo (es el único diagnóstico que puede modificar el sistema, y solo tras consentimiento explícito).", + "NetworkManager ejecutándose en un host Proxmox. NetworkManager y el ifupdown de Proxmox entran en conflicto: ambos intentan gestionar las interfaces, lo que provoca bridges con caídas intermitentes o que no se activan. Si se detecta, la herramienta ofrece una confirmación interactiva para detenerlo, deshabilitarlo y purgarlo (es el único diagnóstico que puede modificar el sistema, y solo tras consentimiento explícito).", "Direcciones IP duplicadas en distintas interfaces. Dos interfaces con la misma IPv4 causan conectividad intermitente extremadamente difícil de depurar desde dentro de la VM. Se detecta vía ip -4 addr show | sort | uniq -d." ], "nmTitle": "El prompt de NetworkManager es la única acción modificadora aquí", @@ -80,7 +80,7 @@ "tail": " — cuando un vmbrX se queda sin su puerto físico." }, { - "label": "Análisis de config y limpieza guiada", + "label": "Análisis de configuración y limpieza guiada", "href": "/docs/network/config-analysis", "tail": " — cuando una NIC antigua sigue declarada pero ya no está." }, diff --git a/web/messages/es/docs/network/index.json b/web/messages/es/docs/network/index.json index 2d7e778e..66c61ea1 100644 --- a/web/messages/es/docs/network/index.json +++ b/web/messages/es/docs/network/index.json @@ -1,15 +1,15 @@ { "meta": { "title": "Gestión de red en Proxmox — bridges, bonds, diagnóstico, reparación | ProxMenux", - "description": "Diagnóstico de solo lectura, flujos de analizar-y-sugerir y reparaciones guiadas para la stack de red Debian / Proxmox (/etc/network/interfaces). Inspecciona bridges y bonds, ejecuta herramientas de monitorización en vivo, persiste nombres de interfaz, hace backup y reinicia la red de forma segura — con backups obligatorios y previsualizaciones paso a paso.", + "description": "Diagnóstico de solo lectura, análisis con propuestas y reparaciones guiadas para la pila de red Debian / Proxmox (/etc/network/interfaces). Inspecciona bridges y bonds, ejecuta herramientas de monitorización en vivo, fija nombres de interfaz, crea copias de seguridad y reinicia la red de forma segura, con copias obligatorias y vistas previas paso a paso.", "ogTitle": "Gestión de red en Proxmox — bridges, bonds, diagnóstico, reparación", - "ogDescription": "Diagnóstico, análisis y reparaciones guiadas para la stack de red de Proxmox con backups obligatorios y previsualizaciones paso a paso.", + "ogDescription": "Diagnóstico, análisis y reparaciones guiadas para la pila de red de Proxmox con copias de seguridad obligatorias y vistas previas paso a paso.", "twitterTitle": "Gestión de red en Proxmox | ProxMenux", - "twitterDescription": "Bridges, bonds, diagnóstico y reparaciones guiadas para la stack de red de Proxmox con backups obligatorios." + "twitterDescription": "Bridges, bonds, diagnóstico y reparaciones guiadas para la pila de red de Proxmox con copias de seguridad obligatorias." }, "header": { "title": "Gestión de red", - "description": "Diagnóstico de solo lectura, informes de analizar-y-sugerir y reparaciones guiadas para la stack clásica de red Debian/Proxmox. Cada flujo destructivo hace primero un backup y previsualiza los cambios exactos antes de aplicarlos.", + "description": "Diagnóstico de solo lectura, informes de análisis con propuestas y reparaciones guiadas para la pila de red clásica de Debian/Proxmox. Cada operación destructiva crea primero una copia de seguridad y muestra los cambios exactos antes de aplicarlos.", "section": "Red" }, "intro": { @@ -52,8 +52,8 @@ ] } }, - "classicTitle": "Solo stack clásica", - "classicBody": "Cada función de análisis y reparación comprueba el gestor de red activo antes de tocar nada. Si el host usa netplan, systemd-networkd o NetworkManager, la herramienta aborta inmediatamente con un mensaje claro — el menú solo soporta la stack clásica de Debian/Proxmox en /etc/network/interfaces. Es intencional: editar un fichero de netplan con reglas escritas para ifupdown corrompería silenciosamente la configuración.", + "classicTitle": "Solo la pila de red clásica", + "classicBody": "Cada función de análisis y reparación comprueba el gestor de red activo antes de tocar nada. Si el host usa netplan, systemd-networkd o NetworkManager, la herramienta se detiene inmediatamente con un mensaje claro: el menú solo admite la pila clásica de Debian/Proxmox en /etc/network/interfaces. Es intencional: editar un fichero de netplan con reglas escritas para ifupdown corrompería silenciosamente la configuración.", "backups": { "heading": "Dónde van los backups", "intro": "Cada reparación guiada, restauración o backup manual escribe una copia con timestamp de /etc/network/interfaces en /var/backups/proxmenux/:", @@ -61,7 +61,7 @@ }, "readOnlySection": { "heading": "Inspección de solo lectura", - "body": "El punto de partida cuando algo huele raro. Pura inspección — nunca escribe en /etc/network/interfaces y nunca ejecuta un comando modificador (con una única excepción explícita y opt-in para purgar NetworkManager cuando se detecta). Seguro de usar por SSH en cualquier momento.", + "body": "El punto de partida cuando algo parece ir mal. Pura inspección: nunca escribe en /etc/network/interfaces ni ejecuta comandos que modifiquen el sistema (con una única excepción explícita, que requiere tu aceptación, para purgar NetworkManager cuando se detecta). Se puede usar por SSH en cualquier momento de forma segura.", "options": [ { "title": "Diagnóstico", @@ -82,7 +82,7 @@ "description": "Detecta bridges vmbrX con puertos ausentes o inválidos (típico tras una re-enumeración PCI). Muestra primero un informe; solo repara cuando aceptas el flujo guiado de 5 pasos." }, { - "title": "Análisis de config y limpieza guiada", + "title": "Análisis de configuración y limpieza guiada", "description": "Encuentra interfaces físicas declaradas en /etc/network/interfaces que ya no existen (configs huérfanas que dejan cambios de hardware). Las reporta y ofrece una eliminación guiada." } ] diff --git a/web/messages/es/docs/network/monitoring.json b/web/messages/es/docs/network/monitoring.json index 2db64fb1..d2d6c671 100644 --- a/web/messages/es/docs/network/monitoring.json +++ b/web/messages/es/docs/network/monitoring.json @@ -1,13 +1,13 @@ { "meta": { - "title": "Herramientas de monitorización en vivo | ProxMenux Documentation", + "title": "Herramientas de monitorización en vivo | Documentación de ProxMenux", "description": "Tres lanzadores interactivos de monitorización de red: iftop (ancho de banda en tiempo real por par de hosts), iptraf-ng (monitor de tráfico multimodo) e iperf3 (test de ancho de banda, modo servidor / cliente). Cada uno se instala la primera vez que se usa.", - "ogTitle": "Herramientas de monitorización en vivo | ProxMenux Documentation", + "ogTitle": "Herramientas de monitorización en vivo | Documentación de ProxMenux", "ogDescription": "Monitorización interactiva de red y test de ancho de banda para el host Proxmox: iftop, iptraf-ng, iperf3." }, "header": { "title": "Herramientas de monitorización en vivo", - "description": "Tres lanzadores interactivos para observación de red en tiempo real y medición de ancho de banda: iftop, iptraf-ng e iperf3. Cada herramienta se autoinstala desde apt la primera vez que se usa, corre en primer plano y se sale con la tecla documentada. De solo lectura sobre la configuración del host — solo observan el tráfico.", + "description": "Tres lanzadores interactivos para observar la red en tiempo real y medir el ancho de banda: iftop, iptraf-ng e iperf3. Cada herramienta se instala automáticamente desde apt la primera vez que se usa, se ejecuta en primer plano y se cierra con la tecla indicada. No cambian la configuración de red del host; iperf3 genera tráfico de prueba.", "section": "Red" }, "intro": { @@ -48,28 +48,28 @@ "headerUseFor": "Úsalo para", "rows": [ { - "mode": "IP traffic monitor", + "mode": "Monitor de tráfico IP", "useFor": "Lista en vivo de flujos TCP / UDP / ICMP / otro-IP con contadores de bytes y estado de conexión" }, { - "mode": "General interface stats", + "mode": "Estadísticas generales de interfaces", "useFor": "Conteos agregados de paquetes IPv4 / IPv6 / TCP / UDP / ICMP / no-IP por NIC" }, { - "mode": "Detailed interface stats", + "mode": "Estadísticas de interfaz detalladas", "useFor": "Igual que arriba pero para una interfaz, con detalle de tamaño y tasa de paquetes" }, { - "mode": "Statistical breakdowns", + "mode": "Desglose estadístico", "useFor": "Histograma de distribución de tamaño de paquete, por puerto TCP / UDP" }, { - "mode": "LAN station monitor", + "mode": "Monitor de estaciones LAN", "useFor": "Estadísticas de tráfico por MAC del dominio de broadcast local" } ], "exit": "Salir: pulsa x desde cualquier vista (o Q desde el menú principal). ProxMenux muestra un diálogo recordatorio antes de lanzarlo.", - "logTitle": "El logging captura a fichero", + "logTitle": "Guardar las capturas en un fichero", "logBody": "Cada modo ofrece registrar las estadísticas capturadas en /var/log/iptraf-ng/. Útil si necesitas un registro de un pico de tráfico — déjalo corriendo, vuelca al fichero, revisa el fichero después en lugar de intentar leer la pantalla en vivo." }, "iperf3": { @@ -81,24 +81,24 @@ "headerCli": "CLI equivalente", "rows": [ { - "mode": "Server", + "mode": "Servidor", "behaviour": "Escucha en TCP 5201 e imprime resultados de cada test entrante. Se detiene con Ctrl+C.", "cli": "iperf3 -s" }, { - "mode": "Client", + "mode": "Cliente", "behaviour": "Pide la IP / hostname del servidor, conecta, ejecuta un test por defecto de 10 segundos e imprime el informe.", "cli": "iperf3 -c " } ], "workflowIntro": "Flujo típico para probar un enlace 10 GbE entre dos hosts Proxmox:", "workflow": [ - "En el host A, abre el menú Red → Test de ancho de banda (iperf3) → elige Server.", - "En el host B, abre la misma entrada de menú → elige Client → introduce la IP del host A.", + "En el host A, abre el menú Red → Test de ancho de banda (iperf3) → elige Servidor.", + "En el host B, abre la misma entrada de menú → elige Cliente → introduce la IP del host A.", "Espera 10 segundos. Compara la tasa reportada con el máximo teórico del enlace." ], "sample": "Salida de ejemplo del cliente:", - "flagsTitle": "Flags útiles a mano (desde una shell)", + "flagsTitle": "Opciones útiles para ejecutar a mano desde una shell", "flagsBody": "-t 60 test más largo (60s en lugar de los 10s por defecto), -P 4 4 streams en paralelo (satura más rápido), -R dirección inversa (servidor → cliente), -u -b 100M test UDP a 100 Mbit/s (para mediciones de jitter / pérdida de paquetes), -p 5202 usa un puerto distinto (varios tests en paralelo). man iperf3 para el set completo.", "firewallTitle": "Abre el puerto del firewall en el servidor", "firewallBody": "El servidor escucha en TCP 5201 por defecto. Si corres el servidor dentro de un host Proxmox con un firewall estricto (a nivel de datacenter o de host), permite entrada TCP 5201 desde la IP del cliente durante el test y luego ciérralo. Lo mismo aplica a nftables / iptables en hosts bare metal." diff --git a/web/messages/es/docs/network/persistent-names.json b/web/messages/es/docs/network/persistent-names.json index fb4e9b9f..c6c4de2a 100644 --- a/web/messages/es/docs/network/persistent-names.json +++ b/web/messages/es/docs/network/persistent-names.json @@ -1,8 +1,8 @@ { "meta": { - "title": "Nombres persistentes de interfaz | ProxMenux Documentation", + "title": "Nombres persistentes de interfaz | Documentación de ProxMenux", "description": "Fija los nombres de interfaz de Proxmox (eno1, enp3s0, …) a direcciones MAC mediante ficheros .link de systemd para que los nombres sobrevivan a la re-enumeración PCI, actualizaciones de kernel y al añadir / quitar otras NICs.", - "ogTitle": "Nombres persistentes de interfaz | ProxMenux Documentation", + "ogTitle": "Nombres persistentes de interfaz | Documentación de ProxMenux", "ogDescription": "Evita que los nombres de interfaz de Proxmox cambien al modificar el hardware. Usa ficheros .link de systemd basados en la dirección MAC." }, "header": { @@ -16,7 +16,7 @@ }, "problem": { "heading": "El problema que resuelve", - "intro": "Linux deriva los nombres de interfaz por defecto a partir de la topología PCI — eno1 = onboard, enp3s0 = la tarjeta en el bus PCI 3, slot 0, etc. El esquema de naming es determinista dado el mismo layout de hardware. Cambia el layout y los nombres se mueven:", + "intro": "Linux obtiene los nombres de interfaz predeterminados a partir de la topología PCI: eno1 = integrada en placa, enp3s0 = la tarjeta en el bus PCI 3, ranura 0, etc. El esquema de nombres es determinista con la misma disposición de hardware. Si cambia la disposición, cambian los nombres:", "items": [ "Añade una GPU delante de una NIC existente → el número de bus de la NIC puede cambiar → el nombre cambia.", "Mueve una tarjeta a otro slot PCIe → el nombre cambia.", @@ -46,7 +46,7 @@ "headerWhy": "Por qué", "rows": [ { - "type": "NIC onboard / PCIe", + "type": "NIC integrada / PCIe", "behaviour": "Se escribe fichero .link", "why": "Respaldada por un dispositivo PCI real — el caso para el que está la herramienta" }, @@ -56,7 +56,7 @@ "why": "Tiene una MAC real y se beneficia de la estabilidad de nombre" }, { - "type": "Bridges (vmbrX)", + "type": "Puentes (vmbrX)", "behaviour": "Se omite", "why": "Virtual; el nombre viene de /etc/network/interfaces" }, @@ -87,7 +87,7 @@ "intro": "Si /etc/systemd/network/ ya contiene ficheros .link (de una ejecución anterior u otra herramienta), se copian a un directorio de backup con timestamp antes de generar los nuevos:", "outro": "Para hacer rollback: copia los ficheros desde el directorio de backup y reinicia.", "rebootTitle": "Tiene efecto en el siguiente reinicio, no inmediatamente", - "rebootBody": "Los cambios en ficheros .link solo se aplican en el arranque, cuando udev re-enumera los dispositivos. La herramienta reporta \"Changes will apply after reboot\" por este motivo. Renombrar una interfaz en vivo es arriesgado y no se intenta: un vmbr0 activo con miembros tendría que reconfigurarse atómicamente, por eso la operación se difiere al siguiente arranque limpio." + "rebootBody": "Los cambios en ficheros .link solo se aplican en el arranque, cuando udev vuelve a enumerar los dispositivos. Por eso la herramienta indica «Los cambios se aplicarán tras reiniciar». No intenta renombrar una interfaz en vivo por el riesgo que supone: un vmbr0 activo con interfaces miembro tendría que reconfigurarse de forma atómica, así que la operación se aplaza al siguiente arranque limpio." }, "afterReboot": { "heading": "Tras el reinicio", @@ -100,11 +100,11 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "emptyTitle": "\"No physical interfaces found\" tras ejecutar la herramienta", + "emptyTitle": "«No se han encontrado interfaces físicas» tras ejecutar la herramienta", "emptyBody": "El host no tiene interfaces respaldadas por PCI / phy80211 visibles para el kernel. Confirma con ls -l /sys/class/net/ — cada entrada debería tener un symlink device (PCI) o una entrada phy80211 (Wi-Fi). Si faltan ambos para lo que debería ser una NIC real, el driver no está cargado.", "noChangeTitle": "Tras el reinicio, los nombres no han cambiado como esperaba", "noChangeBody": "Comprueba que el fichero está presente y bien formado: cat /etc/systemd/network/10-<iface>.link. Después mira los logs de udev: journalctl -u systemd-udevd -b | grep -i link. Una causa habitual es un parámetro de kernel net.ifnames=0 residual que deshabilita el naming predictivo por completo — quítalo de /etc/default/grub, ejecuta update-grub y reinicia.", - "undoTitle": "Quiero deshacer el naming persistente", + "undoTitle": "Quiero deshacer los nombres persistentes", "undoBody": "O bien borra los ficheros .link (rm /etc/systemd/network/10-*.link) o restaura desde el directorio de backup generado en la ejecución anterior. Reinicia para aplicar." }, "related": { @@ -116,7 +116,7 @@ "tailRich": " — el camino de recuperación cuando los nombres ya se han movido." }, { - "label": "Análisis de config y limpieza guiada", + "label": "Análisis de configuración y limpieza guiada", "href": "/docs/network/config-analysis", "tail": " — para eliminar bloques huérfanos dejados por los cambios de nombre." }, diff --git a/web/messages/fr/docs/network/backup-restore.json b/web/messages/fr/docs/network/backup-restore.json new file mode 100644 index 00000000..5273c0c9 --- /dev/null +++ b/web/messages/fr/docs/network/backup-restore.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Sauvegarde et redémarrage des interfaces | Documentation ProxMenux", + "description": "Capture manuelle, navigation et restauration des sauvegardes /etc/network/interfaces stockées sous /var/backups/proxmenux/. Comprend un redémarrage du service réseau avec confirmation et une vue rapide de la configuration en direct.", + "ogTitle": "Sauvegarde et redémarrage des interfaces | Documentation ProxMenux", + "ogDescription": "Créez un instantané de la configuration réseau Proxmox et restaurez-la ; redémarrez le service réseau avec confirmation." + }, + "header": { + "title": "Sauvegarde et redémarrage des interfaces", + "description": "Quatre utilitaires qui tournent autour de /etc/network/interfaces: prennent un instantané manuel, visualisent la configuration en direct, restaurent une sauvegarde précédente avec prévisualisation optionnelle et redémarrent le service de réseautage avec un consentement explicite. Même répertoire de sauvegarde utilisé par les flux de réparation guidés.", + "section": "Réseau" + }, + "intro": { + "title": "Ce que ça fait", + "body": "Gère le même répertoire de sauvegarde utilisé par les flux de réparation guidés (/var/backups/proxmenux/). Permet de prendre un instantané supplémentaire avant tout changement manuel, de parcourir toutes les sauvegardes existantes, et de revenir à l'une d'entre elles — toujours avec une nouvelle sauvegarde pré-restauration prise automatiquement comme deuxième filet de sécurité." + }, + "shared": { + "heading": "Le répertoire de sauvegarde partagé", + "intro": "Chaque sauvegarde prise n'importe où dans le menu Réseau atterrit au même endroit :", + "outro": "Les noms de fichiers sont horodatés, triés par date et jamais écrasés. Le répertoire est créé lors de la première utilisation." + }, + "show": { + "heading": "Afficher le fichier de configuration réseau", + "body": "Affiche le contenu exact de /etc/network/interfaces dans le terminal. En lecture seule. Utile pour vérifier la configuration avant une sauvegarde ou après une restauration. Il n’existe pas d’outil distinct pour comparer avec la sauvegarde précédente ; examiner le fichier actuel est donc le moyen le plus simple de confirmer son contenu." + }, + "create": { + "heading": "Créer une sauvegarde réseau", + "body": "Copie le /etc/network/interfaces actuel dans le répertoire de sauvegarde avec un nouvel horodatage. C'est tout — pas d'analyse, pas d'invite, juste un instantané.", + "whenTitle": "Quand prendre une sauvegarde manuelle", + "whenBody": "Avant de modifier /etc/network/interfaces à la main, d’installer un paquet pouvant toucher la pile réseau (par exemple NetworkManager ou Open vSwitch), ou de changer le matériel. Les réparations guidées créent déjà automatiquement un instantané — cette option sert aux opérations manuelles." + }, + "restore": { + "heading": "Restaurer la sauvegarde réseau", + "intro": "Liste les sauvegardes de /var/backups/proxmenux/, de la plus récente à la plus ancienne, et guide une restauration avec des garde-fous :", + "steps": [ + { + "title": "1. Choisir une sauvegarde", + "body": "Un menu liste chaque sauvegarde par son horodatage. S'il n'y a pas de sauvegardes, le flux sort avec un message clair.", + "tone": "blue" + }, + { + "title": "2. Aperçu facultatif", + "body": "Offre d'ouvrir la sauvegarde sélectionnée dans une vue défilante avant de s'engager. Oui par défaut — ne le sautez pas sur un hôte distant.", + "tone": "blue" + }, + { + "title": "3. Sauvegarde avant restauration", + "body": "Avant d'écraser /etc/network/interfaces, prend une autre sauvegarde de l'état actuel. La restauration d'une sauvegarde est elle-même une action destructrice, de sorte que le nouvel instantané pré-restauration vous permet de revenir si la sauvegarde choisie s'avère être la mauvaise.", + "tone": "amber" + }, + { + "title": "4. Appliquer la restauration", + "body": "Copie la sauvegarde choisie sur /etc/network/interfaces. Le changement de fichier est sur disque; l'état du noyau en direct reflète toujours la configuration précédente.", + "tone": "amber" + }, + { + "title": "5. Redémarrage facultatif", + "body": "Demande s’il faut exécuter systemctl restart networking maintenant. Refusez pour reporter l’application au prochain redémarrage.", + "tone": "emerald" + } + ], + "autoBackupTitle": "Une restauration prend sa propre sauvegarde automatiquement", + "autoBackupBody": "Sélectionner Restaurer la sauvegarde réseau crée toujours un nouvel instantané de la configuration actuelle avant de l’écraser. Si vous restaurez la mauvaise sauvegarde, le fichier le plus récent dans /var/backups/proxmenux/ contient l’état précédent." + }, + "restart": { + "heading": "Redémarrer le service réseau", + "body": "Exécute systemctl restart networking après confirmation oui/non. Affiche le résultat avec msg_ok / msg_error. La plupart des procédures de ce menu proposent déjà un redémarrage à la fin ; cette option sert après une modification manuelle ou si vous avez refusé le redémarrage proposé auparavant.", + "warnTitle": "Brève déconnexion garantie; possibilité de déconnexion permanente", + "warnBody": "Redémarrer networking désactive puis reconfigure chaque interface déclarée dans /etc/network/interfaces. Les sessions SSH passant par ces interfaces sont interrompues. Si la nouvelle configuration est invalide, le réseau ne revient pas. N’exécutez cette opération que si :", + "warnItems": [ + "Vous avez la console / IPMI / accès iKVM prêt, ou", + "Vous êtes physiquement à côté de la machine, ou", + "Vous venez de restaurer avec succès une configuration dont le bon fonctionnement est connu et souhaitez l’appliquer." + ] + }, + "manualRollback": { + "heading": "Retour manuel depuis une console", + "intro": "Si vous ne pouvez pas accéder au menu (pas de SSH, plantage de dialog, …) mais disposez d’une console, deux commandes suffisent pour revenir en arrière :", + "outro": "C’est la même opération que celle du menu, simplement saisie à la main. Si networking ne démarre toujours pas, consultez journalctl -u networking -b pour identifier l’erreur de syntaxe ou de pilote." + }, + "troubleshoot": { + "heading": "Dépannage", + "noneTitle": "« Aucune sauvegarde trouvée » lors de la restauration", + "noneBody": "Le répertoire /var/backups/proxmenux/ n’existe pas ou ne contient aucun fichier interfaces_backup_*. Exécutez Créer une sauvegarde réseau au moins une fois ou lancez une réparation guidée, qui crée automatiquement une sauvegarde. Vérifiez avec ls /var/backups/proxmenux/.", + "unreachTitle": "Le redémarrage du réseau réussit, mais l’hôte reste inaccessible", + "unreachBody": "La nouvelle configuration est incorrecte ou n’attribue pas votre adresse IP de gestion. Revenez en arrière depuis la console (voir ci-dessus). Utilisez ensuite l’analyse des ponts et l’analyse de configuration pour comprendre le problème avant de réappliquer la configuration.", + "emptyTitle": "L’aperçu de restauration affiche un fichier vide", + "emptyBody": "Le fichier de sauvegarde est vide (0 octet). Cela arrive si une copie a échoué silencieusement lors d’une exécution précédente. Choisissez une sauvegarde plus ancienne ou relancez Créer une sauvegarde réseau maintenant si la configuration actuelle fonctionne." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Analyse des ponts et réparation guidée", + "href": "/docs/network/bridge-analysis", + "tail": "— la raison la plus courante pour laquelle une sauvegarde se termine ici." + }, + { + "label": "Analyse de configuration et nettoyage guidé", + "href": "/docs/network/config-analysis", + "tailRich": "— écrit également à /var/backups/proxmenux/ automatiquement." + }, + { + "label": "Diagnostic", + "href": "/docs/network/diagnostics", + "tail": " — pour vérifier l’état actuel après une restauration." + } + ] + } +} diff --git a/web/messages/fr/docs/network/bridge-analysis.json b/web/messages/fr/docs/network/bridge-analysis.json new file mode 100644 index 00000000..7a5a5903 --- /dev/null +++ b/web/messages/fr/docs/network/bridge-analysis.json @@ -0,0 +1,132 @@ +{ + "meta": { + "title": "Analyse des ponts et réparation guidée | Documentation ProxMenux", + "description": "Détecte les ponts vmbrX dont les ports physiques sont absents ou invalides, généralement après une réénumération PCI. Les signale avec des commandes shell proposées et offre une réparation guidée en 5 étapes avec sauvegarde obligatoire.", + "ogTitle": "Analyse des ponts et réparation guidée | Documentation ProxMenux", + "ogDescription": "Vérifiez et réparez les ports des ponts Proxmox après des changements matériels, avec une procédure guidée permettant un retour en arrière sûr." + }, + "header": { + "title": "Analyse des ponts et réparation guidée", + "description": "Examine chaque pont vmbrX déclaré dans /etc/network/interfaces, vérifie l’existence de ses ports physiques et propose une réparation étape par étape s’ils sont absents. L’analyse est en lecture seule ; la réparation nécessite un accord, présente un aperçu et crée une sauvegarde.", + "section": "Réseau" + }, + "intro": { + "title": "Ce que ça fait", + "body": "Lit chaque pont dans /etc/network/interfaces, examine sa ligne bridge-ports et vérifie l’existence de chaque port déclaré, par exemple enp3s0, sur l’hôte. Si un port manque, propose un remplacement et applique la modification avec un consentement explicite selon la procédure sauvegarder, prévisualiser, appliquer, vérifier." + }, + "when": { + "heading": "Quand vous en avez besoin", + "intro": "Linux attribue des noms d'interface prévisibles à partir de la topologie PCI et de l'ordre des fentes. Plusieurs événements les mélangent et laissent /etc/network/interfaces se référant à des noms qui n'existent plus :", + "items": [ + "Ajouter ou retirer une carte PCIe (une carte NIC, un GPU, un HBA, un support NVMe).", + "Déplacement d'une carte existante vers une autre fente PCIe.", + "Mises à jour du BIOS / UEFI qui réénumèrent les périphériques PCI.", + "Migrer le disque de démarrage vers différents matériels." + ], + "outro": "Après le prochain démarrage, le pont tente de se fixer à un port qui n'existe plus, ne parvient pas à monter, et l'hôte perd son réseau. Les noms d'interface persistants empêchent cela de se reproduire — mais si vous êtes déjà verrouillé, cette page est le chemin de récupération." + }, + "bigPicture": { + "heading": "La situation générale", + "diagram1": { + "arrowLabel": "étape 1", + "nodes": { + "sourceLabel": "/etc/network/interfaces", + "sourceDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports enp3s0", + "bridgeLabel": "Analyser (lecture seule)", + "bridgeDetail": "ip link show enp3s0\n→ n’existe pas", + "targetLabel": "Rapport + suggestion", + "targetDetail": "❌ enp3s0 : INTROUVABLE\nRemplacer par : eno1\n(pas encore de modification)" + } + }, + "diagram2": { + "arrowLabel": "appliquer avec sauvegarde", + "nodes": { + "sourceLabel": "Réparation guidée", + "sourceDetail": "1. Sauvegarder\n2. Afficher l’état actuel\n3. Prévisualiser les modifications\n4. Appliquer\n5. Vérifier", + "targetLabel": "/etc/network/interfaces (nouveau)", + "targetDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports eno1" + } + } + }, + "step1": { + "heading": "Étape 1: analyse (lecture seule)", + "intro": "Sélectionner Analyser la configuration des ponts arrête immédiatement l’outil si l’hôte n’utilise pas la pile classique Debian/Proxmox. Sinon, il examine chaque pont et indique :", + "items": [ + "Nom du pont, état actuel (UP / DOWN), IP assigné.", + "Chaque port déclaré et s'il existe actuellement (ip link show <port>).", + "Pour chaque port invalide : un remplacement proposé (la première interface physique disponible) plus la commande exacte sed pour l'appliquer manuellement.", + "Ponts sans bridge-ports du tout et entrées orphelines auto (pas de bloc correspondant iface)." + ], + "readonlyTitle": "Garantie en lecture seule", + "readonlyBody": "Jusqu'à ce point, le script n'a pas exécuté une seule commande de modification. Vous pouvez laisser l'analyse ouverte, copier les commandes sed suggérées et les appliquer manuellement si vous préférez — ou accepter l'invite suivante pour entrer dans la réparation guidée." + }, + "step2": { + "heading": "Étape 2 : réparation guidée (5 étapes)", + "intro": "Accessible uniquement si vous acceptez la proposition à la fin de l’analyse. Chaque étape présente l’action prévue et demande une confirmation avant de continuer.", + "steps": [ + { + "title": "1. Sauvegarde de sécurité", + "body": "Copie /etc/network/interfaces vers /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Le chemin exact de sauvegarde est affiché avant la copie et à nouveau après, avec la commande rollback.", + "tone": "blue" + }, + { + "title": "2. Examiner la configuration actuelle", + "body": "Ouvre le fichier actuel /etc/network/interfaces dans une boîte de dialogue avec défilement pour voir exactement ce qui va être modifié.", + "tone": "blue" + }, + { + "title": "3. Aperçu des modifications proposées", + "body": "Liste précisément les ponts concernés et les remplacements de ports prévus. Si aucune réparation n’est plus nécessaire parce que le port est réapparu entre les vérifications, la procédure se termine avec « Aucune modification nécessaire. »", + "tone": "blue" + }, + { + "title": "4. Appliquer les modifications", + "body": "Pour chaque pont touché, exécute sed -i \"/iface $bridge/,/bridge-ports/ s/bridge-ports.*/bridge-ports $new_ports/\" contre /etc/network/interfaces. Si un pont n'avait pas de remplacement valide disponible, la substitution est ignorée et signalée à l'étape 5.", + "tone": "amber" + }, + { + "title": "5. Vérification", + "body": "Relit le fichier et confirme l’existence du nouveau port de chaque pont. Affiche la commande de retour en arrière (cp <backup> /etc/network/interfaces). Propose enfin Redémarrer le réseau : n’acceptez que si vous disposez d’un accès de secours à la console.", + "tone": "emerald" + } + ], + "restartTitle": "Redémarrer le réseau ≠ annuler sans risque", + "restartBody": "La réparation est écrite sur le disque, même si vous ne redémarrez pas le service. systemctl restart networking applique la modification maintenant, ce qui peut interrompre votre session SSH si le nouveau port est incorrect. En cas de refus, la modification prendra quand même effet au prochain redémarrage : vérifiez d’abord la configuration ou revenez en arrière avec la commande affichée." + }, + "edits": { + "heading": "Ce qui est édité (exactement)", + "body": "Uniquement la ligne bridge-ports de chaque pont concerné. Les autres directives (address, netmask, gateway, bridge-stp, …) restent intactes. Le script ne crée ni ne supprime de blocs iface dans cette procédure : c’est le rôle de l’analyse de configuration & du nettoyage." + }, + "troubleshoot": { + "heading": "Dépannage", + "unsupportedTitle": "L’analyse s’arrête avec « Pile réseau non prise en charge »", + "unsupportedBody": "L'hôte exécute netplan, systemd-networkd ou NetworkManager. L'outil ne prend en charge que /etc/network/interfaces. Passez d'abord l'hôte à la pile classique ou modifiez la configuration avec l'outil natif du gestionnaire (p. ex. netplan apply).", + "noSuggestTitle": "Aucune suggestion n'est imprimée pour un port invalide", + "noSuggestBody": "L'hôte a zéro interfaces physiques libres (tout est déjà dans un autre pont ou n'existe pas). L'analyse revient à suggérer bridge-ports none afin que le pont puisse au moins monter sans port. Ajouter un NIC ou migrer les ports entre les ponts manuellement avant de recommencer.", + "stillDownTitle": "La réparation s'achève mais le pont est toujours DOWN", + "stillDownBody": "sed a mis à jour le fichier, mais systemctl restart networking a été refusé. Exécutez-le manuellement une fois que la nouvelle configuration est vérifiée, ou redémarrez. Si le redémarrage a été accepté et que le pont est toujours DOWN, exécutez ip link show pour confirmer l'existence du nouveau port, puis vérifiez journalctl -u networking pour l'erreur réelle (câble débranché, lien non négocié, port déjà membre d'un autre pont).", + "lostSshTitle": "J'ai perdu l'accès SSH juste après le redémarrage du réseau", + "lostSshIntro": "Utilisez console / IPMI / iKVM pour atteindre l'hôte. Restaurer la sauvegarde :", + "lostSshOutro": "Relancez ensuite l’analyse depuis la console pour comprendre pourquoi la suggestion n’a pas fonctionné, généralement parce que le port de remplacement n’est pas branché." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Noms d'interface persistants", + "href": "/docs/network/persistent-names", + "tail": "— épingler les noms aux adresses MAC afin que ce scénario cesse de se produire." + }, + { + "label": "Analyse de configuration et nettoyage guidé", + "href": "/docs/network/config-analysis", + "tailRich": "— pour les blocs orphelins de iface (l'autre moitié du même problème)." + }, + { + "label": "Sauvegarde et redémarrage des interfaces", + "href": "/docs/network/backup-restore", + "tail": "— les instantanés manuels et le navigateur de restauration." + } + ] + } +} diff --git a/web/messages/fr/docs/network/config-analysis.json b/web/messages/fr/docs/network/config-analysis.json new file mode 100644 index 00000000..1ada39d6 --- /dev/null +++ b/web/messages/fr/docs/network/config-analysis.json @@ -0,0 +1,122 @@ +{ + "meta": { + "title": "Analyse de configuration et nettoyage guidé | Documentation ProxMenux", + "description": "Détecte les blocs iface de /etc/network/interfaces qui font référence à des cartes réseau physiques absentes de l’hôte. Les signale et propose une suppression guidée en 5 étapes avec sauvegarde obligatoire et aperçu de chaque bloc.", + "ogTitle": "Analyse de configuration et nettoyage guidé | Documentation ProxMenux", + "ogDescription": "Trouver et supprimer les blocs d'interface orphelins laissés derrière par les changements matériels, avec prévisualisation complète et retour." + }, + "header": { + "title": "Analyse de configuration et nettoyage guidé", + "description": "Examine chaque bloc iface de /etc/network/interfaces et vérifie que la carte réseau physique correspondante existe toujours. Signale les blocs orphelins laissés par des changements matériels et propose une suppression guidée avec sauvegarde, aperçu et confirmation de chaque bloc.", + "section": "Réseau" + }, + "intro": { + "title": "Ce que ça fait", + "body": "Identifie les déclarations iface dont le support NIC n'est plus présent sur l'hôte (typique après le remplacement ou la suppression d'une carte réseau). Ensuite, offre un nettoyage guidé qui supprime seulement les blocs orphelins, avec une sauvegarde, un aperçu par section et une confirmation finale explicite." + }, + "differs": { + "heading": "Comment il diffère de l'analyse de pont", + "headerAspect": "Aspect", + "headerBridge": "Analyse des ponts", + "headerConfig": "Analyse de la configuration", + "rows": [ + { + "aspect": "Regarde", + "bridge": "Ponts (vmbrX) et leur ligne bridge-ports", + "config": "Chaque bloc iface, sauf loopback, ponts et agrégations" + }, + { + "aspect": "Détecte", + "bridge": "Ponts faisant référence à un port inexistant", + "config": "Blocs d'interface autonomes pour les NIC qui n'existent pas" + }, + { + "aspect": "Action de réparation", + "bridge": "Remplace le nom du port dans bridge-ports", + "config": "Supprime tout le bloc iface" + }, + { + "aspect": "Non compris", + "bridge": "Rien — chaque pont est analysé", + "config": "Les ponts (vmbrX) et agrégations (bondX) sont toujours conservés : ils sont virtuels et leur absence peut être normale au démarrage" + } + ], + "outro": "En pratique, on utilise souvent les deux dans cet ordre : analyse de configuration pour supprimer les blocs orphelins, puis analyse des ponts pour réaffecter tout pont qui dépendait de l’interface supprimée." + }, + "step1": { + "heading": "Étape 1: analyse (lecture seule)", + "intro": "Avorte immédiatement si l'hôte n'est pas sur la pile classique. Sinon, liste toutes les interfaces non loopback configurées et indique son état :", + "virtTitle": "Les interfaces virtuelles sont protégées", + "virtBody": "Les ponts (vmbrX) et agrégations (bondX) sont virtuels. Leur absence peut être normale au moment de l’inspection, par exemple pour un pont sans port. L’analyse ne propose donc jamais de les supprimer, seulement les cartes réseau physiques." + }, + "step2": { + "heading": "Étape 2 : nettoyage guidé (5 étapes)", + "intro": "Accessible uniquement si vous acceptez la proposition à la fin de l’analyse. Chaque étape exige une confirmation ; annuler à tout moment quitte sans écrire.", + "steps": [ + { + "title": "1. Sauvegarde de sécurité", + "body": "Copie /etc/network/interfaces vers /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Chemin montré avant et après.", + "tone": "blue" + }, + { + "title": "2. Confirmer la liste de suppression", + "body": "Liste précisément les blocs d’interface physique à supprimer. Si les cartes réseau réapparaissent entre l’analyse et le nettoyage, par exemple après avoir réinséré une carte, la procédure se termine avec « Aucun nettoyage nécessaire. »", + "tone": "blue" + }, + { + "title": "3. Aperçu du ou des blocs exacts", + "body": "Ouvre une vue défilante de chaque bloc iface qui serait supprimé, mot à mot du fichier. C'est le moment de repérer par exemple un crochet up intéressant que vous voulez préserver.", + "tone": "blue" + }, + { + "title": "4. Appliquer la suppression", + "body": "Pour chaque interface orpheline, exécute sed -i \"/^iface $iface/,/^$/d\" /etc/network/interfaces. Cela supprime de la ligne correspondante iface jusqu'à la ligne blanche suivante.", + "tone": "amber" + }, + { + "title": "5. Vérification", + "body": "Relit le fichier, répertorie ce qui a été supprimé et revérifie les interfaces restantes. Imprime la commande de restauration. ne redémarre pas automatiquement le réseau : la suppression d'un bloc inutilisé peut être appliquée en toute sécurité au prochain redémarrage et évite de toucher à l'état actif.", + "tone": "emerald" + } + ], + "noRestartTitle": "Ne redémarre pas automatiquement le réseau", + "noRestartBody": "Contrairement à la réparation de pont, le flux de nettoyage n'offre pas de redémarrer le service. L'élimination d'un bloc d'interface inutilisé n'a aucun effet immédiat sur la configuration en cours d'exécution, de sorte qu'un redémarrage est inutile et serait un risque inutile de connectivité. Le changement prend effet sur le prochain manuel systemctl restart networking ou au prochain redémarrage." + }, + "caveats": { + "heading": "Mises en garde importantes", + "boundaryTitle": "La limite du bloc est la première ligne vide", + "boundaryBody": "Le motif sed supprime de iface <name> jusqu’à la ligne vide suivante. Si /etc/network/interfaces ne contient pas de ligne vide entre les blocs, ce qui est rare mais possible après une modification manuelle, le bloc suivant peut aussi être supprimé. C’est pourquoi l’étape 3 est obligatoire : examinez l’aperçu avant de confirmer.", + "tandemTitle": "Un bloc iface orphelin utilisé par un pont est détecté ici, pas dans l’analyse des ponts", + "tandemBody": "Si vmbr0 déclare bridge-ports enp3s0 et qu’enp3s0 a aussi son propre bloc iface enp3s0 inet manual, supprimer enp3s0 ici laisse une référence invalide dans vmbr0. Après le nettoyage, lancez l’analyse des ponts pour réaffecter ou retirer le port du pont. Les deux procédures sont conçues pour être utilisées ensemble." + }, + "troubleshoot": { + "heading": "Dépannage", + "notFoundTitle": "L’analyse indique « INTROUVABLE » pour ma nouvelle carte réseau", + "notFoundBody": "Le noyau voit le périphérique sous un autre nom que celui du fichier. Lancez ip link show pour connaître son nom réel. C’est précisément un cas où les noms d’interface persistants éviteraient le problème à l’avenir.", + "tooMuchTitle": "Le nettoyage a trop supprimé, dont un bloc que je voulais garder", + "tooMuchBody": "Restaurer à partir de la sauvegarde imprimée dans l'étape 5:", + "tooMuchOutro": "Modifier le fichier à la main pour ajouter une ligne blanche claire entre les blocs avant de ré-exécuter le nettoyage, ou supprimer le bloc problématique manuellement.", + "bridgeBreakTitle": "Un pont s'arrête après le nettoyage", + "bridgeBreakBody": "Le pont utilisait un port dont le bloc iface vient d’être supprimé. Lancez l’analyse des ponts ; la suggestion associera le pont à une interface physique existante." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Analyse des ponts et réparation guidée", + "href": "/docs/network/bridge-analysis", + "tail": "— le suivi naturel après un nettoyage." + }, + { + "label": "Noms d'interface persistants", + "href": "/docs/network/persistent-names", + "tail": "— empêche les blocs orphelins de s'accumuler après chaque changement matériel." + }, + { + "label": "Sauvegarde et redémarrage des interfaces", + "href": "/docs/network/backup-restore", + "tail": "— les instantanés manuels et le navigateur de restauration." + } + ] + } +} diff --git a/web/messages/fr/docs/network/diagnostics.json b/web/messages/fr/docs/network/diagnostics.json new file mode 100644 index 00000000..8560be31 --- /dev/null +++ b/web/messages/fr/docs/network/diagnostics.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Diagnostic | Documentation ProxMenux", + "description": "Trois diagnostics ponctuels en lecture seule : Afficher la table de routage, Tester la connectivité et Diagnostic avancé. Inspection uniquement — n’écrit jamais dans /etc/network/interfaces et n’exécute aucune commande de modification, à une exception explicite près : la purge de NetworkManager, s’il est détecté, nécessite votre accord.", + "ogTitle": "Diagnostic | Documentation ProxMenux", + "ogDescription": "Diagnostic réseau en lecture seule pour l'hôte Proxmox : routage, accessibilité, statistiques avancées." + }, + "header": { + "title": "Diagnostic", + "description": "Trois contrôles ponctuels en lecture seule de l’état actuel du réseau : table de routage, test de connectivité et statistiques avancées. Aucun n’écrit dans /etc/network/interfaces — utilisables en toute sécurité à tout moment, y compris via SSH. Pour la surveillance interactive en direct, consultez Outils de surveillance en direct.", + "section": "Réseau" + }, + "intro": { + "title": "Ce que ça fait", + "body": "Présente le routage, l’accessibilité et les statistiques agrégées sans rien modifier. Permet de vérifier le bon fonctionnement du réseau ou de repérer des adresses IP en double. Pour observer le trafic en continu, voir Outils de surveillance en direct ; pour consulter le fichier de configuration brut, voir Sauvegarde et redémarrage des interfaces." + }, + "routing": { + "heading": "Afficher la table de routage", + "body": "Liste chaque route que le noyau utilise actuellement (ip route show) et souligne la passerelle par défaut. Utile pour confirmer que le trafic vers Internet passe par l'interface prévue et qu'aucune route restante n'a priorité." + }, + "connectivity": { + "heading": "Tester la connectivité", + "intro": "Envoie deux sondes ICMP à trois cibles dans l'ordre et signale chacune. Ensuite, exécute un nslookup google.com pour vérifier la résolution DNS indépendamment de ICMP.", + "headerTest": "Essai", + "headerTarget": "Cible", + "headerConfirms": "Ce qu'il confirme", + "rows": [ + { + "test": "Google DNS", + "target": "8.8.8.8", + "confirms": "Accessibilité externe via une adresse IP anycast connue" + }, + { + "test": "Cloudflare DNS", + "target": "1.1.1.1", + "confirms": "Deuxième avis indépendant si Google bloque ICMP" + }, + { + "test": "Passerelle", + "target": "(route par défaut)", + "confirms": "Connectivité L2 / L3 au routeur local" + }, + { + "test": "Résolution DNS", + "target": "google.com", + "confirms": "Le serveur DNS est accessible et répond" + } + ], + "readingTitle": "Lecture du résultat", + "readingBody": "Si le test de la passerelle réussit mais que les cibles DNS publiques ne répondent pas, vous avez une connectivité locale mais pas d’accès Internet : vérifiez la connexion en amont de la passerelle. Si la résolution DNS échoue mais que les pings vers 8.8.8.8 réussissent, le problème vient du résolveur, pas du réseau : vérifiez /etc/resolv.conf." + }, + "advanced": { + "heading": "Diagnostic avancé", + "intro": "Agrège les statistiques du réseau et effectue une série de vérifications des problèmes courants. Affiche le nombre de connexions actives, les ports en écoute et le nombre total d’interfaces, et signale explicitement deux configurations problématiques :", + "items": [ + "NetworkManager fonctionne sur un hôte Proxmox. NetworkManager et ifupdown de Proxmox entrent en conflit : tous deux tentent de gérer les interfaces, ce qui rend les ponts instables ou les empêche de s’activer. Si NetworkManager est détecté, l’outil propose une confirmation interactive pour l’arrêter, le désactiver et le purger (c’est le seul diagnostic pouvant modifier le système, et uniquement après consentement explicite).", + "Adresses IP en double sur différentes interfaces. Deux interfaces utilisant la même adresse IPv4 provoquent des problèmes de connexion intermittents très difficiles à diagnostiquer depuis la VM. Détection via ip -4 addr show | sort | uniq -d." + ], + "nmTitle": "L'invite NetworkManager est la seule action de modification ici", + "nmBody": "Toutes les autres vérifications du diagnostic avancé sont en lecture seule. La suppression de NetworkManager nécessite une confirmation oui/non et exécute systemctl stop / disable + apt-get purge -y network-manager. Si vous refusez, rien ne change." + }, + "troubleshoot": { + "heading": "Dépannage", + "gwTitle": "Tester la connectivité signale un échec de la passerelle, mais l’hôte a accès à Internet", + "gwBody": "Certains routeurs ne répondent pas aux requêtes ICMP sur leur interface interne même s’ils acheminent correctement le trafic. Testez avec traceroute 8.8.8.8 depuis une console : si le deuxième saut correspond à votre FAI et que le test DNS public a réussi, la passerelle fonctionne malgré l’échec du ping.", + "dupTitle": "Le diagnostic avancé signale toujours des adresses IP en double après que j’en ai supprimé une", + "dupBody": "La vérification examine l'état du noyau en direct, et non le fichier de configuration. Exécutez ip -4 addr show pour confirmer ; si le duplicata est toujours présent, une interface le tient toujours. Utilisez ip addr del <IP>/<mask> dev <iface> pour le supprimer de l'état en direct, puis modifiez /etc/network/interfaces si elle est aussi persistante." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Outils de surveillance en direct", + "href": "/docs/network/monitoring", + "tail": "— les lanceurs interactifs iftop / iptraf-ng / iperf3." + }, + { + "label": "Analyse des ponts et réparation guidée", + "href": "/docs/network/bridge-analysis", + "tail": " — lorsqu’un vmbrX n’a plus de port physique." + }, + { + "label": "Analyse de configuration et nettoyage guidé", + "href": "/docs/network/config-analysis", + "tail": " — lorsqu’une ancienne carte réseau est toujours déclarée mais n’est plus présente." + }, + { + "label": "Sauvegarde et redémarrage des interfaces", + "href": "/docs/network/backup-restore", + "tail": " — pour créer un instantané de la configuration avant toute modification." + } + ] + } +} diff --git a/web/messages/fr/docs/network/index.json b/web/messages/fr/docs/network/index.json new file mode 100644 index 00000000..b6eaf6d6 --- /dev/null +++ b/web/messages/fr/docs/network/index.json @@ -0,0 +1,107 @@ +{ + "meta": { + "title": "Gestion réseau Proxmox — Ponts, agrégations, diagnostic, réparation | ProxMenux", + "description": "Diagnostics en lecture seule, analyses suivies de suggestions et réparations guidées pour la pile réseau Debian / Proxmox (/etc/network/interfaces). Inspectez les ponts et les agrégations, lancez des outils de surveillance en direct, rendez les noms d’interface persistants, sauvegardez et redémarrez le réseau en toute sécurité — avec sauvegardes obligatoires et aperçus étape par étape.", + "ogTitle": "Gestion réseau Proxmox — Ponts, agrégations, diagnostic, réparation", + "ogDescription": "Diagnostics, analyses et réparations guidées pour la pile réseau Proxmox avec sauvegardes obligatoires et prévisualisations étape par étape.", + "twitterTitle": "Gestion réseau Proxmox | ProxMenux", + "twitterDescription": "Ponts, agrégations, diagnostics et réparations guidées pour la pile réseau Proxmox avec sauvegardes obligatoires." + }, + "header": { + "title": "Gestion du réseau", + "description": "Diagnostics en lecture seule, rapports d’analyse suivis de suggestions et réparations guidées pour la pile réseau classique Debian/Proxmox. Toute opération destructive crée d’abord une sauvegarde et affiche les modifications exactes avant de les appliquer.", + "section": "Réseau" + }, + "intro": { + "title": "À quoi sert ce menu", + "body": "Inspectez, diagnostiquez et, au besoin, réparez la configuration réseau de l’hôte Proxmox sans perdre l’accès à distance. Les outils suivent un principe : lire d’abord, proposer, puis appliquer uniquement avec un consentement explicite et une sauvegarde de sécurité. Il n’existe pas de bouton « Tout réparer automatiquement »." + }, + "openingMenu": { + "heading": "Ouverture du menu", + "intro": "Dans le menu principal de ProxMenux, sélectionnez Réseau. Vous verrez ceci :", + "imageAlt": "Menu de gestion de réseau avec diagnostic, suivi, analyse, réparation, noms persistants et options de sauvegarde" + }, + "safety": { + "heading": "Le modèle de sécurité", + "body": "Modifier la configuration réseau d’un hôte Proxmox distant est l’un des moyens les plus faciles de perdre son accès. ProxMenux en tient compte pour chaque action. Les outils se répartissent en trois niveaux de comportement : choisissez la carte correspondant à votre objectif :" + }, + "tiers": { + "readOnly": { + "title": "Lecture seule", + "body": "Contrôle pur. Impossible de modifier le système en aucune circonstance.", + "items": [ + "Tableau d'acheminement, tests de connectivité, statistiques avancées", + "Surveillance du trafic en temps réel (iftop, iptraf-ng)", + "Test de bande passante (iperf3)" + ] + }, + "analyze": { + "title": "Analysez, puis suggérez", + "body": "Détecte les problèmes, affiche un rapport avec les commandes shell proposées, puis s’arrête. Vous décidez ensuite de lancer ou non la réparation guidée.", + "items": [ + "Analyse de la configuration des ponts", + "Analyse de la configuration du réseau" + ] + }, + "apply": { + "title": "Appliquer avec sauvegarde", + "body": "Modifie le système. Crée toujours d’abord une sauvegarde horodatée du fichier concerné et affiche un aperçu avant l’écriture.", + "items": [ + "Noms d’interface persistants (fichiers .link)", + "Sauvegarde manuelle, restauration et redémarrage du service" + ] + } + }, + "classicTitle": "Pile classique seulement", + "classicBody": "Chaque fonction d'analyse et de réparation vérifie le gestionnaire de réseau actif avant de toucher quoi que ce soit. Si l'hôte exécute netplan, systemd-networkd ou NetworkManager, l'outil avorte immédiatement avec un message clair — le menu ne prend en charge que la pile classique Debian/Proxmox à /etc/network/interfaces. Ceci est intentionnel : l'édition d'un fichier netplan avec des règles écrites pour ifupdown corromprait silencieusement la configuration.", + "backups": { + "heading": "Où vont les sauvegardes", + "intro": "Chaque réparation guidée, restauration ou sauvegarde manuelle écrit une copie horodatée de /etc/network/interfaces à /var/backups/proxmenux/ :", + "rollbackIntro": "Pour revenir manuellement à la configuration précédente depuis une console :" + }, + "readOnlySection": { + "heading": "Contrôle en lecture seule", + "body": "Le point de départ lorsque quelque chose semble anormal. Inspection uniquement — n’écrit jamais dans /etc/network/interfaces et n’exécute aucune commande de modification, à une exception explicite près : la purge de NetworkManager, s’il est détecté, nécessite votre accord. Utilisable en toute sécurité via SSH à tout moment.", + "options": [ + { + "title": "Diagnostic", + "description": "Trois vérifications en lecture seule : Afficher la table d'acheminement, tester la connectivité et les diagnostics avancés. L'inspection pure n'écrit jamais au système." + }, + { + "title": "Outils de surveillance en direct", + "description": "Trois lanceurs interactifs : iftop (bande passante en temps réel par paire d'hôtes), iptraf-ng (moniteur de trafic multimode) et iperf3 (test de bande passante, serveur / mode client)." + } + ] + }, + "analyzeSection": { + "heading": "Analysez, puis suggérez", + "body": "À utiliser lorsqu’une inspection ou une panne réelle révèle un problème de configuration. Chaque outil examine la partie concernée de /etc/network/interfaces, affiche un rapport détaillé avec la commande shell exacte qui corrigerait chaque problème, puis s’arrête. Si vous acceptez ensuite la réparation guidée facultative, chaque modification est sauvegardée et prévisualisée avant d’être écrite.", + "options": [ + { + "title": "Analyse des ponts et réparation guidée", + "description": "Détecte les ponts vmbrX dont les ports sont absents ou invalides, par exemple après une réénumération PCI. Affiche d’abord un rapport et ne répare que si vous acceptez la procédure guidée en 5 étapes." + }, + { + "title": "Analyse de configuration et nettoyage guidé", + "description": "Repère les interfaces physiques déclarées dans /etc/network/interfaces qui n’existent plus, c’est-à-dire les configurations orphelines laissées par des changements matériels. Les signale et propose une suppression guidée." + } + ] + }, + "applySection": { + "heading": "Appliquer avec sauvegarde", + "body": "Ces outils écrivent sur le disque par leur fonctionnement même. Chacun crée une sauvegarde horodatée du fichier concerné avant l’écriture, et les options destructives, comme la restauration et le redémarrage, exigent une confirmation explicite oui/non. Les noms d’interface persistants prennent effet au prochain redémarrage, pas immédiatement ; leur mise en place peut donc être planifiée en toute sécurité même sur un hôte distant.", + "options": [ + { + "title": "Noms d'interface persistants", + "description": "Associe les noms d’interface (eno1, enp3s0, …) aux adresses MAC au moyen de fichiers .link de systemd. Les noms restent stables après un changement d’emplacement PCI, une mise à niveau du noyau ou l’ajout ou le retrait d’autres cartes réseau." + }, + { + "title": "Sauvegarde et redémarrage des interfaces", + "description": "Un instantané manuel de /etc/network/interfaces, parcourir et restaurer les sauvegardes précédentes, afficher la configuration en direct et redémarrer le service de réseautage au besoin." + } + ] + }, + "consoleTitle": "Préparez l'accès à la console", + "consoleSubTitle": "Avant toute réparation sur un hôte distant", + "consoleBody": "Si vous êtes connecté via SSH et ne disposez que d’un seul accès à l’hôte, prévoyez une solution de secours avant toute modification réseau : console physique / IPMI / iKVM ou autre machine sur le même réseau local. Les réparations guidées sont sûres et proposent toujours une commande de retour en arrière, mais un pont mal configuré ou une liaison interrompue peut tout de même vous priver d’accès jusqu’à ce que vous puissiez atteindre la console." +} diff --git a/web/messages/fr/docs/network/monitoring.json b/web/messages/fr/docs/network/monitoring.json new file mode 100644 index 00000000..d81420cb --- /dev/null +++ b/web/messages/fr/docs/network/monitoring.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Outils de surveillance en direct | Documentation ProxMenux", + "description": "Trois lanceurs interactifs de surveillance du réseau : iftop (bande passante en temps réel par paire d'hôtes), iptraf-ng (moniteur de trafic multimode) et iperf3 (test de bande passante, serveur / mode client). Chacun est installé lors de la première utilisation.", + "ogTitle": "Outils de surveillance en direct | Documentation ProxMenux", + "ogDescription": "Surveillance réseau interactive et test de bande passante pour l'hôte Proxmox : iftop, iptraf-ng, iperf3." + }, + "header": { + "title": "Outils de surveillance en direct", + "description": "Trois lanceurs interactifs pour observer le réseau en temps réel et mesurer la bande passante : iftop, iptraf-ng et iperf3. Chaque outil est installé automatiquement via apt au premier usage, fonctionne au premier plan et se quitte avec la touche indiquée. Ils ne modifient pas la configuration réseau de l’hôte ; iperf3 génère du trafic de test.", + "section": "Réseau" + }, + "intro": { + "title": "Ce que ça fait", + "body": "Trois outils de suivi interactifs, chacun derrière sa propre entrée de menu. La première fois que vous en lancez un, le paquet est installé silencieusement via apt-get. Les lancements suivants commencent instantanément. Aucun de ces outils ne modifie la configuration du réseau hôte." + }, + "when": { + "heading": "Quel outil utiliser selon le besoin", + "headerQuestion": "Question", + "headerUse": "Utiliser", + "rows": [ + { + "question": "Qui sature le lien maintenant ?", + "use": "iftop" + }, + { + "question": "Quelle est la répartition par protocole, quelles tailles de paquets et quels flux TCP circulent ?", + "use": "iptraf-ng" + }, + { + "question": "Combien de bande passante est disponible entre deux hôtes ?", + "use": "iperf3" + } + ] + }, + "iftop": { + "heading": "Utilisation du réseau en temps réel (iftop)", + "body": "Bande passante en direct par paire d’hôtes (source ↔ destination) — comme top pour le trafic. Affiche les flux les plus importants en haut, avec des moyennes glissantes sur 2/10/40 secondes. L’outil idéal pour savoir « pourquoi ma liaison montante est saturée ».", + "exit": "Quitter : appuyez sur q. ProxMenux affiche un rappel avant le lancement.", + "keysTitle": "Touches utiles dans iftop", + "keysBody": "n active ou désactive les recherches DNS, p affiche les numéros de port, P fige l’affichage, t change le sens des lignes (envoi / réception / les deux), 1/2/3 trie par moyenne sur 2 s / 10 s / 40 s. Liste complète dans man iftop." + }, + "iptraf": { + "heading": "Outil de surveillance du réseau (iptraf-ng)", + "intro": "Un outil de surveillance du trafic à plusieurs modes, piloté par menu. iftop répond à « qui », tandis qu’iptraf-ng répond à « quoi » : compteurs d’octets et de paquets par protocole, suivi de l’état des connexions TCP, histogrammes de taille des paquets et activité LAN par station.", + "menuIntro": "Au lancement, vous obtenez un menu à cinq options :", + "headerMode": "Mode", + "headerUseFor": "Utilisez-le pour", + "rows": [ + { + "mode": "Surveillance du trafic IP", + "useFor": "Liste de flux en direct TCP / UDP / ICMP / autre-IP avec compteurs d'octets et état de connexion" + }, + { + "mode": "Statistiques générales de l'interface", + "useFor": "Nombre total de paquets IPv4 / IPv6 / TCP / UDP / ICMP / non IP par carte réseau" + }, + { + "mode": "Statistiques détaillées de l'interface", + "useFor": "Comme ci-dessus, mais pour une interface, avec la taille du paquet et le détail du taux" + }, + { + "mode": "Ventilations statistiques", + "useFor": "Histogramme de distribution de la taille du paquet, par port TCP / UDP" + }, + { + "mode": "Moniteur de station LAN", + "useFor": "Statistiques du trafic par adresse MAC pour le domaine de diffusion local" + } + ], + "exit": "Quitter : appuyez sur x depuis n’importe quelle vue ou sur Q depuis le menu principal. ProxMenux affiche un rappel avant le lancement.", + "logTitle": "Enregistrer les captures dans un fichier", + "logBody": "Chaque mode propose d’enregistrer les statistiques capturées dans /var/log/iptraf-ng/. Pour conserver une trace d’un pic de trafic, laissez l’outil tourner, enregistrez dans un fichier et examinez-le ensuite plutôt que d’essayer de suivre l’écran en direct." + }, + "iperf3": { + "heading": "Test de bande passante (iperf3)", + "intro1": "Mesure le débit TCP réel entre deux hôtes. Contrairement à iftop / iptraf-ng, qui observent le trafic existant, iperf3 génère du trafic synthétique pour tester la liaison en charge. Indispensable pour répondre à « Ma liaison 10 GbE atteint-elle vraiment 10 GbE ? » ou « Le goulot d’étranglement vient-il de la carte réseau, du commutateur ou du stockage ? ».", + "intro2": "iperf3 est un outil à deux hôtes : l’un est le serveur, en écoute sur le port TCP 5201 ; l’autre est le client, qui se connecte, envoie les données et affiche le débit. Le lanceur ProxMenux demande le mode souhaité :", + "headerMode": "Mode", + "headerBehaviour": "Comportement", + "headerCli": "Commande CLI équivalente", + "rows": [ + { + "mode": "Serveur", + "behaviour": "Écoute sur TCP 5201 et imprime les résultats pour chaque test entrant. Arrête sur Ctrl+C.", + "cli": "iperf3 -s" + }, + { + "mode": "Client", + "behaviour": "Demande l’adresse IP ou le nom d’hôte du serveur, se connecte, lance le test par défaut de 10 secondes et affiche le rapport.", + "cli": "iperf3 -c " + } + ], + "workflowIntro": "Typiquement pour tester un lien 10 GbE entre deux hôtes Proxmox :", + "workflow": [ + "Sur l’hôte A, ouvrez le menu Réseau → Test de bande passante (iperf3) → choisissez Serveur.", + "Sur l'hôte B, ouvrez la même entrée de menu → choisissez Client → saisissez l'IP de l'hôte A.", + "Attendez 10 secondes. Comparez le taux déclaré au maximum théorique du lien." + ], + "sample": "Exemple de sortie client :", + "flagsTitle": "Options utiles à utiliser manuellement depuis un shell", + "flagsBody": "-t 60 test plus long (60 s au lieu de 10 s), -P 4 4 flux parallèles (saturation plus rapide), -R sens inverse (serveur → client), -u -b 100M test UDP à 100 Mbit/s (mesure de la gigue et des pertes de paquets), -p 5202 autre port (plusieurs tests en parallèle). Liste complète dans man iperf3.", + "firewallTitle": "Ouvrez le port pare-feu sur le serveur", + "firewallBody": "Le serveur écoute sur TCP 5201 par défaut. Si vous exécutez le serveur à l'intérieur d'un hôte Proxmox avec un pare-feu strict (datacenter ou niveau hôte), autorisez TCP 5201 entrant à partir de l'IP du client pour la durée du test, puis fermez-le à nouveau. Il en va de même pour nftables / iptables sur les hôtes nus." + }, + "install": { + "heading": "Le premier lancement installe le paquet", + "body": "Les trois lanceurs vérifient le binaire et exécutent apt-get update -qq && apt-get install -y <pkg> s'il manque. L'installation est silencieuse : le menu peut apparaître gelé pour 10–30 secondes la première fois. Les lancements suivants commencent instantanément." + }, + "troubleshoot": { + "heading": "Dépannage", + "hangTitle": "L’installation reste bloquée au premier lancement", + "hangBody": "L'hôte n'a pas d'internet ou les repos apt sont inaccessibles. Annuler avec Ctrl+C, exécuter apt-get update manuellement pour voir l'erreur réelle (DNS, repo signature, proxy ...), puis revenir au menu.", + "refusedTitle": "Client iperf3 : « unable to connect to server: Connection refused »", + "refusedBody": "Soit le serveur ne fonctionne pas, soit son pare-feu bloque TCP 5201. Confirmer sur le serveur: ss -tlnp | grep 5201 — doit afficher l'écoute iperf3. Si l'écoute, mais que le client échoue, vérifiez le chemin du pare-feu entre les deux hôtes.", + "slowTitle": "iperf3 indique un débit bien inférieur à la vitesse attendue de la liaison", + "slowBody": "Causes courantes par ordre de probabilité : (1) le processeur d’un hôte limite le débit — essayez iperf3 -c <target> -P 4 pour utiliser plusieurs cœurs ; (2) le trajet passe par une liaison plus lente, par exemple un commutateur gigabit entre deux cartes 10 GbE ; (3) MTU différents — vérifiez ip link show aux deux extrémités ; (4) offloading de la carte réseau désactivé — voir le script communautaire Disable NIC Offloading pour une carte Intel e1000e.", + "noTrafficTitle": "iftop / iptraf-ng ne montre aucun trafic pour un hôte occupé", + "noTrafficBody": "La capture par défaut est sur la première interface détectée. Spécifiez le bon explicitement depuis le shell : iftop -i vmbr0 ou iptraf-ng -i vmbr0. Le lanceur de menu utilise la valeur par défaut; pour les interfaces non par défaut, exécuter à partir d'une console." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Diagnostic", + "href": "/docs/network/diagnostics", + "tail": "— les contrôles en lecture seule (routage, connectivité, statistiques avancées)." + }, + { + "label": "Analyse des ponts et réparation guidée", + "href": "/docs/network/bridge-analysis", + "tail": "— lorsque la surveillance révèle qu'une interface ou un pont ne fait pas ce qu'il faut." + } + ] + } +} diff --git a/web/messages/fr/docs/network/persistent-names.json b/web/messages/fr/docs/network/persistent-names.json new file mode 100644 index 00000000..26472165 --- /dev/null +++ b/web/messages/fr/docs/network/persistent-names.json @@ -0,0 +1,130 @@ +{ + "meta": { + "title": "Noms d’interface persistants | Documentation ProxMenux", + "description": "Associez les noms d’interface Proxmox (eno1, enp3s0, …) aux adresses MAC via des fichiers .link de systemd pour les conserver après une réénumération PCI, une mise à niveau du noyau ou l’ajout ou le retrait d’autres cartes réseau.", + "ogTitle": "Noms d’interface persistants | Documentation ProxMenux", + "ogDescription": "Empêchez les noms d’interface Proxmox de changer lors des modifications matérielles. Utilise des fichiers .link de systemd associés aux adresses MAC." + }, + "header": { + "title": "Noms d'interface persistants", + "description": "Génère un fichier .link de systemd par carte réseau physique pour associer le nom attribué par le noyau à son adresse MAC. Après application au prochain redémarrage, les noms d’interface restent stables lorsque vous ajoutez, retirez ou déplacez des cartes PCIe.", + "section": "Réseau" + }, + "intro": { + "title": "Ce que ça fait", + "body": "Pour chaque NIC physique sur l'hôte, écrit un petit fichier sous /etc/systemd/network/10-<iface>.link qui dit : \"le périphérique avec ce MAC doit toujours être appelé ce nom\". systemd-udevd applique la règle à chaque démarrage, avant que ifupdown ne lise /etc/network/interfaces." + }, + "problem": { + "heading": "Le problème que cela résout", + "intro": "Linux déduit les noms d’interface par défaut de la topologie PCI — eno1 = intégrée à la carte mère, enp3s0 = carte sur le bus PCI 3, emplacement 0, etc. Le nommage est déterministe pour une même disposition matérielle. Si cette disposition change, les noms changent :", + "items": [ + "Ajoutez un GPU devant un NIC existant → le numéro de bus NIC peut changer → changement de nom.", + "Déplacer une carte vers une autre fente PCIe → nom change.", + "BIOS / UEFI mise à jour qui réénumère les appareils → noms peuvent changer.", + "Remplacer une carte défectueuse par le même modèle dans une autre fente → nom change." + ], + "outro": "Après un tel changement, /etc/network/interfaces fait toujours référence à l’ancien nom ; le pont ne s’active pas et l’hôte perd le réseau. Les noms persistants évitent que cette situation se reproduise." + }, + "howWorks": { + "heading": "Comment ça marche", + "arrowLabel": "par NIC", + "nodes": { + "detectLabel": "Détecter les cartes réseau physiques", + "detectDetail": "ls /sys/class/net/\nexclure vmbr / bond /\ndocker / veth / wireguard …", + "readLabel": "Lire chaque MAC", + "readDetail": "cat /sys/class/net/\n '<'iface'>'/address", + "writeLabel": "Écrivez le fichier .link", + "writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link" + }, + "minimalIntro": "Chaque fichier généré est volontairement minimal :", + "minimalOutro": "Au démarrage, systemd-udevd identifie le périphérique par son adresse MAC et lui attribue le nom demandé avant l’intervention d’autres composants (ifupdown, nommage par défaut du noyau). Le préfixe 10- garantit le chargement précoce de ces règles, avant le fichier par défaut 99-default.link." + }, + "scope": { + "heading": "Ce qui est écrit, ce qui est ignoré", + "headerType": "Type", + "headerBehaviour": "Comportement", + "headerWhy": "Pourquoi", + "rows": [ + { + "type": "Carte réseau intégrée / PCIe", + "behaviour": "fichier .link écrit", + "why": "Repose sur un véritable périphérique PCI — le cas auquel l’outil est destiné" + }, + { + "type": "Wi-Fi (phy80211)", + "behaviour": "fichier .link écrit", + "why": "A une vraie MAC et bénéficie de la stabilité des noms" + }, + { + "type": "Ponts (vmbrX)", + "behaviour": "Ignoré", + "why": "Virtuel; le nom vient de /etc/network/interfaces" + }, + { + "type": "Agrégations (bondX)", + "behaviour": "Ignoré", + "why": "Virtuel ; le nom de l’agrégation est défini par ifupdown" + }, + { + "type": "veth / docker0 / br-XXXX", + "behaviour": "Ignoré", + "why": "Créé sur demande par Docker / LXC — matériel non persistant" + }, + { + "type": "tap / fwpr / fwln", + "behaviour": "Ignoré", + "why": "Créé sur demande par Proxmox par VM/CT" + }, + { + "type": "WireGuard / Cilium / Tailscale", + "behaviour": "Ignoré", + "why": "Interfaces logicielles gérées par leurs propres démons" + } + ] + }, + "safety": { + "heading": "Filet de sécurité : les fichiers .link précédents sont sauvegardés", + "intro": "Si /etc/systemd/network/ contient déjà des fichiers .link (à partir d'une exécution précédente ou d'un autre outil), ils sont copiés dans un répertoire de sauvegarde horodaté avant que les nouveaux fichiers ne soient générés :", + "outro": "Pour revenir en arrière : copiez les fichiers à partir du répertoire de sauvegarde et redémarrez.", + "rebootTitle": "Prend effet sur le prochain redémarrage, pas immédiatement", + "rebootBody": "Les modifications des fichiers .link ne s’appliquent qu’au démarrage, lorsque udev réénumère les périphériques. L’outil indique donc « Les modifications s’appliqueront après le redémarrage ». Renommer une interface en cours de fonctionnement est risqué et n’est pas tenté : un vmbr0 actif avec des interfaces membres devrait être reconfiguré de manière atomique. L’opération est donc reportée au prochain démarrage propre." + }, + "afterReboot": { + "heading": "Après le redémarrage", + "intro": "Une fois les noms épinglés, le flux de travail des futurs changements matériels est simple :", + "items": [ + "Éteignez, modifiez le matériel (ajout de carte, changement d’emplacement, …), puis démarrez.", + "Chaque NIC conserve son nom précédent car son MAC correspond à un fichier .link.", + "Si un NIC est remplacé (différent MAC), il obtient un nom de noyau par défaut (enp<bus>s<slot>); ré-exécutez ce menu pour ajouter une entrée .link pour le MAC de la nouvelle carte." + ] + }, + "troubleshoot": { + "heading": "Dépannage", + "emptyTitle": "\"Aucune interface physique trouvée\" après avoir lancé l'outil", + "emptyBody": "Aucune interface reposant sur PCI ou phy80211 n’est visible par le noyau sur l’hôte. Vérifiez avec ls -l /sys/class/net/ : chaque entrée doit avoir soit un lien symbolique device (PCI), soit une entrée phy80211 (Wi-Fi). Si les deux sont absents pour une véritable carte réseau, le pilote n’est pas chargé.", + "noChangeTitle": "Après le redémarrage, les noms n'ont pas changé comme prévu", + "noChangeBody": "Vérifiez que le fichier est présent et correctement formé : cat /etc/systemd/network/10-<iface>.link. Consultez ensuite les journaux udev : journalctl -u systemd-udevd -b | grep -i link. Un ancien paramètre du noyau net.ifnames=0 désactive entièrement le nommage prévisible : supprimez-le de /etc/default/grub, exécutez update-grub, puis redémarrez.", + "undoTitle": "Je veux annuler les noms persistants", + "undoBody": "Supprimez les fichiers .link (rm /etc/systemd/network/10-*.link) ou restaurez-les depuis le répertoire de sauvegarde créé lors de l’exécution précédente. Redémarrez pour appliquer les modifications." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Analyse des ponts et réparation guidée", + "href": "/docs/network/bridge-analysis", + "tailRich": " — la solution de récupération lorsque les noms ont déjà changé." + }, + { + "label": "Analyse de configuration et nettoyage guidé", + "href": "/docs/network/config-analysis", + "tail": " — pour supprimer les blocs orphelins laissés par les changements de noms." + }, + { + "label": "Diagnostic", + "href": "/docs/network/diagnostics", + "tailRich": "— confirmer les nouveaux noms avec Afficher la table d'acheminement après le redémarrage." + } + ] + } +} diff --git a/web/messages/it/docs/network/backup-restore.json b/web/messages/it/docs/network/backup-restore.json new file mode 100644 index 00000000..721be2b8 --- /dev/null +++ b/web/messages/it/docs/network/backup-restore.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Backup e riavvio delle interfacce | Documentazione ProxMenux", + "description": "Crea istantanee manuali, sfoglia e ripristina i backup di /etc/network/interfaces salvati in /var/backups/proxmenux/. Include il riavvio del servizio di rete con conferma e una vista rapida della configurazione attuale.", + "ogTitle": "Backup e riavvio delle interfacce | Documentazione ProxMenux", + "ogDescription": "Crea un’istantanea e ripristina la configurazione di rete Proxmox; riavvia il servizio di rete con conferma." + }, + "header": { + "title": "Backup e riavvio delle interfacce", + "description": "Quattro utility che ruotano intorno a /etc/network/interfaces: scattano un'istantanea manuale, visualizzano la configurazione live, ripristinano un backup precedente con un'anteprima facoltativa e riavviano il servizio di rete con esplicito consenso. Stessa directory di backup utilizzata dai flussi di riparazione guidati.", + "section": "Rete" + }, + "intro": { + "title": "Cosa fa", + "body": "Gestisce la stessa directory di backup utilizzata dai flussi di riparazione guidati (/var/backups/proxmenux/). Consente di scattare un'istantanea aggiuntiva prima di qualsiasi cambiamento manuale, sfogliare tutti i backup esistenti e tornare a uno qualsiasi di essi — sempre con un backup pre-restore fresco preso automaticamente come una seconda rete di sicurezza." + }, + "shared": { + "heading": "La directory di backup condivisa", + "intro": "Ogni backup preso ovunque nel menu di rete atterra nello stesso posto:", + "outro": "I nomi dei file contengono data e ora, sono ordinati per data e non vengono mai sovrascritti. La directory viene creata al primo utilizzo." + }, + "show": { + "heading": "Mostra file di configurazione di rete", + "body": "Mostra il contenuto esatto di /etc/network/interfaces nel terminale. Sola lettura. Utile come controllo prima di un backup o dopo un ripristino. Non esiste uno strumento separato per confrontare il file con il backup precedente: esaminare il file attuale è quindi il modo più semplice per verificarne il contenuto." + }, + "create": { + "heading": "Crea backup di rete", + "body": "Copia l'attuale /etc/network/interfaces nella directory di backup con un timestamp fresco. Questo è tutto — nessuna analisi, nessun prompt, solo un'istantanea.", + "whenTitle": "Quando creare un backup manuale", + "whenBody": "Prima di modificare /etc/network/interfaces a mano, di installare un pacchetto che può alterare lo stack di rete (ad esempio NetworkManager o Open vSwitch) o di cambiare l’hardware. Le riparazioni guidate creano già un’istantanea automaticamente: questa opzione serve per gli interventi manuali." + }, + "restore": { + "heading": "Ripristina backup di rete", + "intro": "Elenca tutti i backup in /var/backups/proxmenux/ dal più recente al più vecchio e guida un ripristino protetto:", + "steps": [ + { + "title": "1. Scegli un backup", + "body": "Un menu elenca ogni backup dal suo timestamp. Se non esistono backup, il flusso esce con un messaggio chiaro.", + "tone": "blue" + }, + { + "title": "2. Anteprima opzionale", + "body": "Propone di aprire il backup selezionato in una vista scorrevole prima di confermare il ripristino. Sì è l’opzione predefinita: non saltare questo passaggio su un host remoto.", + "tone": "blue" + }, + { + "title": "3. Backup prima del ripristino", + "body": "Prima di sovrascrivere /etc/network/interfaces, crea un altro backup dello stato attuale. Il ripristino è esso stesso un’operazione distruttiva: la nuova istantanea precedente al ripristino permette di tornare indietro se il backup scelto era quello sbagliato.", + "tone": "amber" + }, + { + "title": "4. Applicare il ripristino", + "body": "Copia il backup scelto su /etc/network/interfaces. La modifica del file è su disco; lo stato del kernel live riflette ancora la configurazione precedente.", + "tone": "amber" + }, + { + "title": "5. Riavvio opzionale", + "body": "Chiede se eseguire systemctl restart networking ora. Rifiuta per rimandare l’applicazione al prossimo riavvio.", + "tone": "emerald" + } + ], + "autoBackupTitle": "Il ripristino crea automaticamente un proprio backup", + "autoBackupBody": "Selezionare Ripristina backup di rete crea sempre una nuova istantanea della configurazione attuale prima di sovrascriverla. Se ripristini il backup sbagliato, il file più recente in /var/backups/proxmenux/ contiene lo stato precedente." + }, + "restart": { + "heading": "Riavvia servizio di rete", + "body": "Esegue systemctl restart networking dopo una conferma sì/no. Mostra il risultato con msg_ok / msg_error. La maggior parte delle procedure di questo menu propone già un riavvio finale: questa opzione serve dopo una modifica manuale o se hai rifiutato il riavvio proposto in precedenza.", + "warnTitle": "Breve disconnessione garantita; possibile disconnessione permanente", + "warnBody": "Riavviare networking disattiva e riconfigura tutte le interfacce dichiarate in /etc/network/interfaces. Le sessioni SSH su queste interfacce si interrompono. Se la nuova configurazione non è valida, la rete non torna disponibile. Esegui questa operazione solo quando:", + "warnItems": [ + "Hai un accesso alla console / IPMI / iKVM pronto, oppure", + "Sei fisicamente accanto alla macchina, oppure", + "Hai appena ripristinato con successo una configurazione sicuramente funzionante e vuoi applicarla." + ] + }, + "manualRollback": { + "heading": "Ripristino manuale da una console", + "intro": "Se non riesci ad accedere al menu (SSH non disponibile, dialog che si arresta, …) ma puoi usare una console, il ripristino richiede due comandi:", + "outro": "È la stessa operazione eseguita dal menu, semplicemente digitata a mano. Se networking continua a non avviarsi, controlla journalctl -u networking -b per individuare l’errore di sintassi o del driver." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "noneTitle": "\"Nessun backup trovato\" in Ripristino", + "noneBody": "La directory /var/backups/proxmenux/ non esiste o non contiene file interfaces_backup_*. Esegui Crea backup di rete almeno una volta oppure una riparazione guidata, che ne crea uno automaticamente. Verifica con ls /var/backups/proxmenux/.", + "unreachTitle": "Riavviare la rete riesce, ma l'host è ancora irraggiungibile", + "unreachBody": "La nuova configurazione è errata oppure non assegna il tuo IP di gestione. Ripristina la configurazione dalla console (vedi sopra). Poi usa l’analisi dei bridge e l’analisi della configurazione per capire il problema prima di applicarla nuovamente.", + "emptyTitle": "L'anteprima del ripristino mostra un file vuoto", + "emptyBody": "Il file di backup è vuoto (0 byte). Succede se una copia è fallita senza segnalazioni in un’esecuzione precedente. Scegli un backup più vecchio oppure esegui di nuovo Crea backup di rete adesso, se la configurazione attuale funziona." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Analisi dei bridge e riparazione guidata", + "href": "/docs/network/bridge-analysis", + "tail": "— il motivo più comune per cui un backup finisce qui." + }, + { + "label": "Analisi della configurazione e pulizia guidata", + "href": "/docs/network/config-analysis", + "tailRich": "— scrive anche a /var/backups/proxmenux/ automaticamente." + }, + { + "label": "Diagnostica", + "href": "/docs/network/diagnostics", + "tail": " — per verificare lo stato attuale dopo un ripristino." + } + ] + } +} diff --git a/web/messages/it/docs/network/bridge-analysis.json b/web/messages/it/docs/network/bridge-analysis.json new file mode 100644 index 00000000..23bf0ee1 --- /dev/null +++ b/web/messages/it/docs/network/bridge-analysis.json @@ -0,0 +1,132 @@ +{ + "meta": { + "title": "Analisi dei bridge e riparazione guidata | Documentazione ProxMenux", + "description": "Rileva bridge vmbrX con porte fisiche mancanti o non valide, tipicamente dopo la rinumerazione PCI. Li segnala con comandi shell proposti e offre una riparazione guidata in 5 passaggi con backup obbligatorio.", + "ogTitle": "Analisi dei bridge e riparazione guidata | Documentazione ProxMenux", + "ogDescription": "Controlla e ripara le porte dei bridge Proxmox dopo modifiche hardware, con una procedura guidata che consente un ripristino sicuro." + }, + "header": { + "title": "Analisi dei bridge e riparazione guidata", + "description": "Controlla ogni bridge vmbrX dichiarato in /etc/network/interfaces, verifica che le porte fisiche esistano e propone una riparazione passo passo se mancano. L’analisi è di sola lettura; la riparazione richiede conferma, mostra un’anteprima e crea un backup.", + "section": "Rete" + }, + "intro": { + "title": "Cosa fa", + "body": "Legge ogni bridge in /etc/network/interfaces, esamina la riga bridge-ports e verifica che ogni porta dichiarata, ad esempio enp3s0, esista sull’host. Se una porta manca, propone una sostituzione e, con consenso esplicito, applica la modifica seguendo la procedura backup, anteprima, applicazione, verifica." + }, + "when": { + "heading": "Quando hai bisogno di questo", + "intro": "Linux assegna nomi prevedibili alle interfacce in base alla topologia PCI e all’ordine degli slot. Diversi eventi possono modificarli, lasciando in /etc/network/interfaces riferimenti a nomi non più esistenti:", + "items": [ + "Aggiungere o rimuovere una scheda PCIe (scheda di rete, GPU, HBA o adattatore NVMe).", + "Spostare una scheda esistente in un'altra slot PCIe.", + "Aggiornamenti BIOS / UEFI che rinumerano i dispositivi PCI.", + "Migrare il disco di avvio su hardware diverso." + ], + "outro": "Dopo il prossimo avvio, il ponte cerca di attaccare a una porta che non esiste più, non riesce a salire, e l'host perde la sua rete. Nomi di interfaccia persistenti impedisce che questo accada di nuovo — ma se sei già bloccato fuori, questa pagina è il percorso di recupero." + }, + "bigPicture": { + "heading": "Quadro generale", + "diagram1": { + "arrowLabel": "passo 1", + "nodes": { + "sourceLabel": "/etc/network/interfaces", + "sourceDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports enp3s0", + "bridgeLabel": "Analizzare (solo lettura)", + "bridgeDetail": "ip link show enp3s0\n→ non esiste", + "targetLabel": "Report + suggerimento", + "targetDetail": "❌ enp3s0: NON TROVATA\nSostituisci con: eno1\n(ancora nessuna modifica)" + } + }, + "diagram2": { + "arrowLabel": "applicare con il backup", + "nodes": { + "sourceLabel": "Riparazione guidata", + "sourceDetail": "1. Backup\n2. Mostra configurazione attuale\n3. Anteprima delle modifiche\n4. Applica\n5. Verifica", + "targetLabel": "/etc/network/interfaces (nuovo)", + "targetDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports eno1" + } + } + }, + "step1": { + "heading": "Passo 1: analisi (solo lettura)", + "intro": "Selezionando Analizza configurazione dei bridge, lo strumento si interrompe se l’host non usa lo stack classico Debian/Proxmox. Altrimenti esamina ogni bridge e mostra:", + "items": [ + "Nome del ponte, stato corrente (UP / DOWN), IP assegnato.", + "Ogni porta dichiarata e la sua effettiva presenza (ip link show <port>).", + "Per ogni porta non valida: una sostituzione proposta (la prima interfaccia fisica disponibile) più il comando esatto sed per applicarla manualmente.", + "Bridge senza alcuna riga bridge-ports e voci auto orfane senza un blocco iface corrispondente." + ], + "readonlyTitle": "Garanzia di sola lettura", + "readonlyBody": "Fino a questo punto lo script non ha eseguito un singolo comando di modifica. È possibile lasciare l'analisi aperta, copiare i comandi sed suggeriti e applicarli manualmente se si preferisce — o accettare il prompt successivo per inserire la riparazione guidata." + }, + "step2": { + "heading": "Passo 2: riparazione guidata (5 passi)", + "intro": "Solo se accetti il prompt alla fine dell'analisi. Ogni passo mostra cosa accadrà e chiederà la conferma prima di continuare.", + "steps": [ + { + "title": "1. Backup di sicurezza", + "body": "Copia /etc/network/interfaces in /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Il percorso esatto del backup viene mostrato prima e dopo la copia, insieme al comando di ripristino.", + "tone": "blue" + }, + { + "title": "2. Controlla la configurazione attuale", + "body": "Apre l’attuale /etc/network/interfaces in una finestra scorrevole per vedere esattamente cosa verrà modificato.", + "tone": "blue" + }, + { + "title": "3. Anteprima delle modifiche proposte", + "body": "Elenca esattamente i bridge interessati e le sostituzioni delle porte previste. Se non serve più alcuna riparazione perché la porta è ricomparsa tra i controlli, la procedura termina con «Nessuna modifica necessaria.»", + "tone": "blue" + }, + { + "title": "4. Applicare le modifiche", + "body": "Per ogni ponte interessato, viene eseguito sed -i \"/iface $bridge/,/bridge-ports/ s/bridge-ports.*/bridge-ports $new_ports/\" contro /etc/network/interfaces. Se un ponte non ha una sostituzione valida disponibile, la sostituzione è saltata e riportata nella fase 5.", + "tone": "amber" + }, + { + "title": "5. Verifica", + "body": "Rilegge il file e verifica che la nuova porta di ogni bridge esista. Mostra il comando di ripristino (cp <backup> /etc/network/interfaces). Infine propone Riavvia la rete: accetta solo se hai un accesso di riserva alla console.", + "tone": "emerald" + } + ], + "restartTitle": "Riavviare la rete ≠ annullare senza rischi", + "restartBody": "La riparazione viene scritta su disco anche se non riavvii il servizio. systemctl restart networking applica la modifica ora e può interrompere la sessione SSH se la nuova porta è errata. Se rifiuti, la modifica avrà comunque effetto al prossimo avvio: verifica prima la configurazione oppure annulla con il comando mostrato." + }, + "edits": { + "heading": "Cosa viene modificato (esattamente)", + "body": "Solo la riga bridge-ports di ogni bridge interessato. Le altre direttive (address, netmask, gateway, bridge-stp, …) restano invariate. In questa procedura lo script non crea né rimuove blocchi iface: se ne occupa Analisi della configurazione & pulizia." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "unsupportedTitle": "L’analisi si interrompe con «Stack di rete non supportato»", + "unsupportedBody": "L'host esegue netplan, systemd-networkd o NetworkManager. Lo strumento supporta solo /etc/network/interfaces. Passare l'host al classico stack prima, o modificare la configurazione con il tooling nativo del manager (ad es. netplan apply).", + "noSuggestTitle": "Non viene mostrato alcun suggerimento per una porta non valida", + "noSuggestBody": "L’host non ha interfacce fisiche libere: sono già tutte in un altro bridge oppure non esistono. L’analisi suggerisce come alternativa bridge-ports none, così il bridge può almeno attivarsi senza una porta. Aggiungi una scheda di rete o sposta manualmente le porte tra i bridge prima di riprovare.", + "stillDownTitle": "La riparazione completa ma il ponte è ancora DOWN", + "stillDownBody": "sed ha aggiornato il file, ma systemctl restart networking è stato rifiutato. Eseguilo manualmente dopo aver verificato la nuova configurazione oppure riavvia. Se il riavvio è stato accettato e il bridge è ancora DOWN, esegui ip link show per verificare che la nuova porta esista e controlla journalctl -u networking per l’errore effettivo: cavo scollegato, collegamento non negoziato o porta già appartenente a un altro bridge.", + "lostSshTitle": "Ho perso l'accesso SSH subito dopo il riavvio della rete", + "lostSshIntro": "Utilizzare la console / IPMI / iKVM per raggiungere l'host. Ripristinare il backup:", + "lostSshOutro": "Esegui poi di nuovo l’analisi dalla console per capire perché il suggerimento non ha funzionato, in genere perché la porta sostitutiva non è collegata." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Nomi di interfaccia persistenti", + "href": "/docs/network/persistent-names", + "tail": " — associa i nomi agli indirizzi MAC per evitare che il problema si ripeta." + }, + { + "label": "Analisi della configurazione e pulizia guidata", + "href": "/docs/network/config-analysis", + "tailRich": "— per i blocchi iface orfani (l'altra metà dello stesso problema)." + }, + { + "label": "Backup e riavvio delle interfacce", + "href": "/docs/network/backup-restore", + "tail": "— snapshot manuali e browser di ripristino." + } + ] + } +} diff --git a/web/messages/it/docs/network/config-analysis.json b/web/messages/it/docs/network/config-analysis.json new file mode 100644 index 00000000..42961b94 --- /dev/null +++ b/web/messages/it/docs/network/config-analysis.json @@ -0,0 +1,122 @@ +{ + "meta": { + "title": "Analisi della configurazione e pulizia guidata | Documentazione ProxMenux", + "description": "Rileva i blocchi iface in /etc/network/interfaces che fanno riferimento a schede di rete fisiche non più presenti sull’host. Li segnala e offre una rimozione guidata in 5 passaggi con backup obbligatorio e anteprima di ogni blocco.", + "ogTitle": "Analisi della configurazione e pulizia guidata | Documentazione ProxMenux", + "ogDescription": "Trovare e rimuovere i blocchi di interfaccia orfano lasciati dietro da modifiche hardware, con anteprima completa e rollback." + }, + "header": { + "title": "Analisi della configurazione e pulizia guidata", + "description": "Esamina ogni blocco iface in /etc/network/interfaces e verifica che la scheda di rete fisica corrispondente esista ancora. Segnala i blocchi orfani rimasti dopo modifiche hardware e offre una rimozione guidata con backup, anteprima e conferma per ogni blocco.", + "section": "Rete" + }, + "intro": { + "title": "Cosa fa", + "body": "Identifica le dichiarazioni iface il cui supporto NIC non è più presente sull'host (tipico dopo aver sostituito o rimosso una scheda di rete). Poi offre una pulizia guidata che rimuove solo i blocchi orfani, con un backup, un'anteprima per sezione e una conferma finale esplicita." + }, + "differs": { + "heading": "Come differisce dall'analisi del ponte", + "headerAspect": "Aspetto", + "headerBridge": "Analisi del ponte", + "headerConfig": "Analisi della configurazione", + "rows": [ + { + "aspect": "Esamina", + "bridge": "Ponti (vmbrX) e la loro linea bridge-ports", + "config": "Ogni blocco iface, esclusi loopback, bridge e bond" + }, + { + "aspect": "Rilevamento", + "bridge": "Bridge che fanno riferimento a una porta inesistente", + "config": "Blocchi di interfaccia standalone per NIC che non esistono" + }, + { + "aspect": "Azione di riparazione", + "bridge": "Sostituisce il nome della porta in bridge-ports", + "config": "Rimuove l'intero blocco iface" + }, + { + "aspect": "Esclusi", + "bridge": "Nulla — ogni ponte viene analizzato", + "config": "Bridge (vmbrX) e bond (bondX) vengono sempre mantenuti: sono virtuali e la loro assenza durante l’avvio può essere normale" + } + ], + "outro": "In pratica si usano spesso entrambi in quest’ordine: prima analisi della configurazione per rimuovere i blocchi orfani, poi analisi dei bridge per riassegnare i bridge che dipendevano dall’interfaccia rimossa." + }, + "step1": { + "heading": "Passo 1: analisi (solo lettura)", + "intro": "Interrompe immediatamente se l'host non è sulla pila classica. Altrimenti elenca ogni interfaccia non-loopback configurata e segnala il suo stato:", + "virtTitle": "Le interfacce virtuali sono protette", + "virtBody": "Bridge (vmbrX) e bond (bondX) sono strutture virtuali. È possibile che non esistano al momento dell’ispezione, ad esempio un bridge ancora senza porte. L’analisi non propone mai di rimuoverli, ma solo le schede di rete fisiche." + }, + "step2": { + "heading": "Passo 2: pulizia guidata (5 passi)", + "intro": "Solo se accetti il prompt alla fine dell'analisi. Ogni passo richiede la conferma; la cancellazione in qualsiasi punto esce senza scrivere.", + "steps": [ + { + "title": "1. Backup di sicurezza", + "body": "Copia /etc/network/interfaces in /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Il percorso viene mostrato prima e dopo.", + "tone": "blue" + }, + { + "title": "2. Confermare la lista di rimozione", + "body": "Elenca esattamente i blocchi delle interfacce fisiche da rimuovere. Se le schede di rete riappaiono tra analisi e pulizia, ad esempio dopo aver reinserito una scheda, la procedura termina con «Nessuna pulizia necessaria.»", + "tone": "blue" + }, + { + "title": "3. Visualizza in anteprima i blocchi esatti", + "body": "Apre una vista scorrevole di ogni blocco iface che verrebbe eliminato, esattamente come appare nel file. È il momento di individuare, ad esempio, un hook up che vuoi conservare.", + "tone": "blue" + }, + { + "title": "4. Applicare la rimozione", + "body": "Per ogni interfaccia orfano, funziona sed -i \"/^iface $iface/,/^$/d\" /etc/network/interfaces. Questo elimina dalla linea iface corrispondente fino alla riga vuota successiva.", + "tone": "amber" + }, + { + "title": "5. Verifica", + "body": "Rilegge il file, elenca ciò che è stato rimosso e ricontrolla le restanti interfacce. Stampa il comando di rollback. non riavvia automaticamente la rete: la rimozione di un blocco inutilizzato è sicura da applicare al riavvio successivo ed evita di toccare lo stato live.", + "tone": "emerald" + } + ], + "noRestartTitle": "Non riavvia automaticamente la rete", + "noRestartBody": "A differenza della riparazione del ponte, il flusso di pulizia non offre di riavviare il servizio. Rimuovere un blocco di interfaccia non utilizzato non ha alcun effetto immediato sulla configurazione in esecuzione, quindi un riavvio è inutile e sarebbe un rischio di connettività inutile. La modifica ha effetto sul successivo manuale systemctl restart networking o al successivo riavvio." + }, + "caveats": { + "heading": "Osservazioni importanti", + "boundaryTitle": "Il confine del blocco è la prima linea vuota", + "boundaryBody": "Il pattern sed elimina da iface <name> fino alla riga vuota successiva. Se in /etc/network/interfaces manca una riga vuota tra i blocchi, cosa rara ma possibile dopo modifiche manuali, può essere eliminato anche il blocco successivo. Per questo il passaggio 3 è obbligatorio: controlla l’anteprima prima di confermare.", + "tandemTitle": "Un blocco iface orfano usato da un bridge viene rilevato qui, non nell’analisi dei bridge", + "tandemBody": "Se vmbr0 dichiara bridge-ports enp3s0 e enp3s0 ha anche un blocco iface enp3s0 inet manual, rimuovere enp3s0 qui lascia un riferimento non valido in vmbr0. Dopo la pulizia, esegui l’analisi dei bridge per riassegnare o rimuovere la porta del bridge. Le due procedure sono pensate per essere usate insieme." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "notFoundTitle": "L’analisi indica «NON TROVATA» per la mia nuova scheda di rete", + "notFoundBody": "Il kernel vede il dispositivo con un nome diverso da quello nel file. Esegui ip link show per trovare il nome effettivo. È proprio il caso in cui i nomi persistenti delle interfacce eviterebbero il problema in futuro.", + "tooMuchTitle": "La pulizia ha rimosso troppo (un blocco che volevo mantenere)", + "tooMuchBody": "Ripristino dal backup stampato nella fase 5:", + "tooMuchOutro": "Modificare il file a mano per aggiungere una linea vuota chiara tra i blocchi prima di eseguire la pulizia, o rimuovere il blocco problematico manualmente.", + "bridgeBreakTitle": "Un ponte smette di funzionare dopo la pulizia", + "bridgeBreakBody": "Il bridge dipendeva da una porta il cui blocco iface è stato appena rimosso. Esegui l’analisi dei bridge: il suggerimento assegnerà al bridge un’interfaccia fisica esistente." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Analisi dei bridge e riparazione guidata", + "href": "/docs/network/bridge-analysis", + "tail": "— il follow-up naturale dopo una pulizia." + }, + { + "label": "Nomi di interfaccia persistenti", + "href": "/docs/network/persistent-names", + "tail": "— blocca i blocchi orfani dall'accumulo dopo ogni cambio hardware." + }, + { + "label": "Backup e riavvio delle interfacce", + "href": "/docs/network/backup-restore", + "tail": "— snapshot manuali e browser di ripristino." + } + ] + } +} diff --git a/web/messages/it/docs/network/diagnostics.json b/web/messages/it/docs/network/diagnostics.json new file mode 100644 index 00000000..9d5f54e0 --- /dev/null +++ b/web/messages/it/docs/network/diagnostics.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Diagnostica | Documentazione ProxMenux", + "description": "Tre controlli diagnostici puntuali di sola lettura: Mostra tabella di routing, Test di connettività e Diagnostica avanzata. Semplice ispezione: non scrive mai in /etc/network/interfaces e non esegue comandi di modifica, con un’unica eccezione esplicita: la rimozione completa di NetworkManager, se rilevato, richiede il tuo consenso.", + "ogTitle": "Diagnostica | Documentazione ProxMenux", + "ogDescription": "Diagnostica di rete di sola lettura per l'host Proxmox: routing, raggiungibilità, statistiche avanzate." + }, + "header": { + "title": "Diagnostica", + "description": "Tre controlli puntuali di sola lettura dello stato attuale della rete: tabella di routing, test di connettività e statistiche avanzate. Nessuno scrive in /etc/network/interfaces: sono utilizzabili in sicurezza in qualsiasi momento, anche via SSH. Per il monitoraggio interattivo in tempo reale, vedi Strumenti di monitoraggio in tempo reale.", + "section": "Rete" + }, + "intro": { + "title": "Cosa fa", + "body": "Mostra informazioni su routing, raggiungibilità e statistiche aggregate senza modificare nulla. Usalo per verificare che la rete funzioni o individuare IP duplicati. Per osservare il traffico in modo continuo, vedi Strumenti di monitoraggio in tempo reale; per visualizzare il file di configurazione grezzo, vedi Backup e riavvio delle interfacce." + }, + "routing": { + "heading": "Mostra tabella di routing", + "body": "Elenca tutte le rotte attualmente usate dal kernel (ip route show) ed evidenzia il gateway predefinito. Utile per verificare che il traffico verso Internet esca dall’interfaccia prevista e che nessuna vecchia rotta abbia la precedenza." + }, + "connectivity": { + "heading": "Test connettività", + "intro": "Invia due sonde ICMP a tre obiettivi in sequenza e segnala ciascuno. Poi viene eseguito un nslookup google.com per verificare la risoluzione DNS indipendentemente da ICMP.", + "headerTest": "Test", + "headerTarget": "Destinazione", + "headerConfirms": "Cosa conferma", + "rows": [ + { + "test": "DNS Google", + "target": "8.8.8.8", + "confirms": "Raggiungibilità esterna tramite un indirizzo IP anycast noto" + }, + { + "test": "Cloudflare DNS", + "target": "1.1.1.1", + "confirms": "Seconda opzione indipendente se Google blocca ICMP" + }, + { + "test": "Gateway", + "target": "(percorso di default)", + "confirms": "Connettività L2 / L3 al router locale" + }, + { + "test": "Risoluzione DNS", + "target": "google.com", + "confirms": "Il server DNS è raggiungibile e risponde" + } + ], + "readingTitle": "Leggere il risultato", + "readingBody": "Se il test del gateway riesce ma i server DNS pubblici non rispondono, la connettività locale funziona ma non hai accesso a Internet: controlla la connessione a monte del gateway. Se la risoluzione DNS fallisce ma i ping verso 8.8.8.8 riescono, il problema è il resolver, non la rete: controlla /etc/resolv.conf." + }, + "advanced": { + "heading": "Diagnostica avanzata", + "intro": "Aggrega le statistiche dell’intera rete ed esegue una serie di controlli sui problemi comuni. Mostra il numero di connessioni attive, le porte in ascolto e il totale delle interfacce, e segnala esplicitamente due configurazioni problematiche:", + "items": [ + "NetworkManager in esecuzione su un host Proxmox. NetworkManager e ifupdown di Proxmox entrano in conflitto: entrambi tentano di gestire le interfacce, rendendo i bridge instabili o impedendone l’attivazione. Se viene rilevato, lo strumento propone una conferma interattiva per arrestarlo, disabilitarlo e rimuoverlo completamente (è l’unica diagnostica che può modificare il sistema, e solo dopo un consenso esplicito).", + "Indirizzi IP duplicati su interfacce diverse. Due interfacce con lo stesso indirizzo IPv4 causano problemi di connettività intermittenti molto difficili da diagnosticare dall’interno della VM. Rilevamento tramite ip -4 addr show | sort | uniq -d." + ], + "nmTitle": "Il prompt NetworkManager è l'unica azione di modifica qui", + "nmBody": "Tutti gli altri controlli della diagnostica avanzata sono di sola lettura. La rimozione di NetworkManager richiede una conferma sì/no ed esegue systemctl stop / disable + apt-get purge -y network-manager. Se rifiuti, non cambia nulla." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "gwTitle": "Il test di connettività segnala un errore del gateway, ma l’host ha accesso a Internet", + "gwBody": "Alcuni router non rispondono a ICMP sulla loro interfaccia interna anche se inoltrano correttamente il traffico. Prova traceroute 8.8.8.8 da una console: se il secondo hop è il tuo ISP e il test del DNS pubblico è riuscito, il gateway funziona nonostante il ping fallito.", + "dupTitle": "La diagnostica avanzata continua a segnalare IP duplicati dopo che ne ho rimosso uno", + "dupBody": "Il controllo guarda lo stato del kernel dal vivo, non il file di configurazione. Eseguire ip -4 addr show per confermare; se il duplicato è ancora presente, un'interfaccia lo tiene ancora. Utilizzare ip addr del <IP>/<mask> dev <iface> per rimuoverlo dallo stato in tempo reale, quindi modificare /etc/network/interfaces se è anche persistente." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Strumenti di monitoraggio dal vivo", + "href": "/docs/network/monitoring", + "tail": "— lanciatori interattivi iftop / iptraf-ng / iperf3." + }, + { + "label": "Analisi dei bridge e riparazione guidata", + "href": "/docs/network/bridge-analysis", + "tail": " — quando a un vmbrX manca la porta fisica." + }, + { + "label": "Analisi della configurazione e pulizia guidata", + "href": "/docs/network/config-analysis", + "tail": " — quando una vecchia scheda di rete è ancora dichiarata ma non è più presente." + }, + { + "label": "Backup e riavvio delle interfacce", + "href": "/docs/network/backup-restore", + "tail": " — per creare un’istantanea della configurazione prima di qualsiasi modifica." + } + ] + } +} diff --git a/web/messages/it/docs/network/index.json b/web/messages/it/docs/network/index.json new file mode 100644 index 00000000..725ea79e --- /dev/null +++ b/web/messages/it/docs/network/index.json @@ -0,0 +1,107 @@ +{ + "meta": { + "title": "Gestione della rete Proxmox — Bridge, bond, diagnostica, riparazione | ProxMenux", + "description": "Diagnostica di sola lettura, analisi con suggerimenti e riparazioni guidate per lo stack di rete Debian / Proxmox (/etc/network/interfaces). Ispeziona bridge e bond, avvia strumenti di monitoraggio in tempo reale, rendi persistenti i nomi delle interfacce, crea backup e riavvia la rete in sicurezza, con backup obbligatori e anteprime passo passo.", + "ogTitle": "Gestione della rete Proxmox — Bridge, bond, diagnostica, riparazione", + "ogDescription": "Diagnostica, analisi e riparazioni guidate per lo stack di rete Proxmox con backup obbligatori e anteprime passo-passo.", + "twitterTitle": "Gestione della rete Proxmox | ProxMenux", + "twitterDescription": "Bridge, bond, diagnostica e riparazioni guidate per lo stack di rete Proxmox con backup obbligatori." + }, + "header": { + "title": "Gestione rete", + "description": "Diagnostica di sola lettura, rapporti di analisi con suggerimenti e riparazioni guidate per il classico stack di rete Debian/Proxmox. Ogni operazione distruttiva crea prima un backup e mostra in anteprima le modifiche esatte prima di applicarle.", + "section": "Rete" + }, + "intro": { + "title": "A cosa serve questo menu", + "body": "Ispeziona, diagnostica e, quando necessario, ripara la configurazione di rete dell’host Proxmox senza perdere l’accesso remoto. Gli strumenti seguono un principio: prima leggere, poi proporre e infine applicare solo con consenso esplicito e un backup di sicurezza. Non esiste un pulsante «Correggi tutto automaticamente»." + }, + "openingMenu": { + "heading": "Apertura del menu", + "intro": "Dal menu principale di ProxMenux, seleziona Rete. Vedrai questo:", + "imageAlt": "Menù Gestione rete con diagnostica, monitoraggio, analisi, riparazione, nomi persistenti e opzioni di backup" + }, + "safety": { + "heading": "Il modello di sicurezza", + "body": "Modificare la configurazione di rete di un host Proxmox remoto è uno dei modi più semplici per perdere l’accesso. ProxMenux ne tiene conto per ogni azione. Gli strumenti si dividono in tre livelli di comportamento: scegli la scheda che corrisponde al tuo obiettivo:" + }, + "tiers": { + "readOnly": { + "title": "Sola lettura", + "body": "Ispezione pura. Non può modificare il sistema in nessuna circostanza.", + "items": [ + "Tabella di routing, test di connettività, statistiche avanzate", + "Monitoraggio del traffico dal vivo (iftop, iptraf-ng)", + "Test della larghezza di banda (iperf3)" + ] + }, + "analyze": { + "title": "Analizzare, quindi suggerire", + "body": "Rileva i problemi, stampa un rapporto con i comandi di shell proposti e si ferma. Si decide se entrare nella riparazione guidata dopo.", + "items": [ + "Analisi della configurazione del ponte", + "Analisi della configurazione di rete" + ] + }, + "apply": { + "title": "Applicare con backup", + "body": "Modifica il sistema. Crea sempre prima un backup del file interessato con data e ora e mostra un’anteprima prima di scrivere.", + "items": [ + "Nomi persistenti delle interfacce (file .link)", + "Backup manuale, ripristino e riavvio del servizio" + ] + } + }, + "classicTitle": "Solo pila classica", + "classicBody": "Ogni funzione di analisi e riparazione controlla il gestore di rete attivo prima di toccare qualsiasi cosa. Se l'host esegue netplan, systemd-networkd o NetworkManager, lo strumento si interrompe immediatamente con un messaggio chiaro — il menu supporta solo il classico stack Debian/Proxmox a /etc/network/interfaces. Questo è intenzionale: la modifica di un file netplan con regole scritte per ifupdown avrebbe corrotto silenziosamente la configurazione.", + "backups": { + "heading": "Dove vengono salvati i backup", + "intro": "Ogni riparazione guidata, ripristino o backup manuale scrive una copia di /etc/network/interfaces con data e ora in /var/backups/proxmenux/:", + "rollbackIntro": "Per ripristinare manualmente la configurazione precedente da una console:" + }, + "readOnlySection": { + "heading": "Ispezione di sola lettura", + "body": "Il punto di partenza quando qualcosa non va. Semplice ispezione: non scrive mai in /etc/network/interfaces e non esegue comandi che modificano il sistema, con un’unica eccezione esplicita: la rimozione completa di NetworkManager, se rilevato, richiede il tuo consenso. Utilizzabile in sicurezza via SSH in qualsiasi momento.", + "options": [ + { + "title": "Diagnostica", + "description": "Tre controlli puntuali di sola lettura: Mostra tabella di routing, Test di connettività e Diagnostica avanzata. Semplice ispezione: non scrive mai nel sistema." + }, + { + "title": "Strumenti di monitoraggio dal vivo", + "description": "Tre strumenti avviabili in modo interattivo: iftop (larghezza di banda in tempo reale per coppia di host), iptraf-ng (monitor del traffico con più modalità) e iperf3 (test della larghezza di banda, modalità server / client)." + } + ] + }, + "analyzeSection": { + "heading": "Analizzare, quindi suggerire", + "body": "Da usare quando un’ispezione o un’effettiva interruzione del servizio indica un problema di configurazione. Ogni strumento esamina la parte pertinente di /etc/network/interfaces, stampa un rapporto dettagliato con l’esatto comando shell che risolverebbe ogni problema e si ferma. Se in seguito accetti la riparazione guidata facoltativa, ogni modifica viene preceduta da un backup e mostrata in anteprima prima della scrittura.", + "options": [ + { + "title": "Analisi dei bridge e riparazione guidata", + "description": "Rileva bridge vmbrX con porte mancanti o non valide, situazione tipica dopo la rinumerazione PCI. Mostra prima un rapporto e ripara solo se accetti la procedura guidata in 5 passaggi." + }, + { + "title": "Analisi della configurazione e pulizia guidata", + "description": "Trova le interfacce fisiche dichiarate in /etc/network/interfaces che non esistono più, ossia configurazioni orfane rimaste dopo modifiche hardware. Le segnala e propone una rimozione guidata." + } + ] + }, + "applySection": { + "heading": "Applicare con backup", + "body": "Questi strumenti scrivono su disco per loro natura. Ciascuno crea un backup del file interessato con data e ora prima della scrittura e le opzioni distruttive, come ripristino e riavvio, richiedono una conferma esplicita sì/no. I nomi persistenti delle interfacce diventano effettivi al prossimo riavvio, non subito: puoi quindi pianificarne l’impostazione in sicurezza anche su un host remoto.", + "options": [ + { + "title": "Nomi di interfaccia persistenti", + "description": "Associa i nomi delle interfacce (eno1, enp3s0, …) agli indirizzi MAC tramite file .link di systemd. I nomi restano invariati dopo cambi di slot PCI, aggiornamenti del kernel e aggiunta o rimozione di altre schede di rete." + }, + { + "title": "Backup e riavvio delle interfacce", + "description": "snapshot manuale di /etc/network/interfaces, sfoglia e ripristina i backup precedenti, visualizza la configurazione live e riavvia il servizio di rete quando necessario." + } + ] + }, + "consoleTitle": "Prepara un accesso alla console", + "consoleSubTitle": "Prima di qualsiasi riparazione su un host remoto", + "consoleBody": "Se sei connesso via SSH e hai un solo percorso di accesso all’host, prepara un’alternativa prima di applicare modifiche alla rete: console fisica / IPMI / iKVM oppure un’altra macchina sulla stessa LAN. Le riparazioni guidate sono sicure e offrono sempre un comando per annullare le modifiche, ma un bridge configurato male o una connessione interrotta può comunque lasciarti senza accesso finché non raggiungi la console." +} diff --git a/web/messages/it/docs/network/monitoring.json b/web/messages/it/docs/network/monitoring.json new file mode 100644 index 00000000..3474dec7 --- /dev/null +++ b/web/messages/it/docs/network/monitoring.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Strumenti di monitoraggio in tempo reale | Documentazione ProxMenux", + "description": "Tre strumenti interattivi di monitoraggio della rete: iftop (larghezza di banda in tempo reale per coppia di host), iptraf-ng (monitor del traffico con più modalità) e iperf3 (test della larghezza di banda, modalità server / client). Ciascuno viene installato al primo utilizzo.", + "ogTitle": "Strumenti di monitoraggio in tempo reale | Documentazione ProxMenux", + "ogDescription": "Monitoraggio interattivo della rete e test di larghezza di banda per l'host Proxmox: iftop, iptraf-ng, iperf3." + }, + "header": { + "title": "Strumenti di monitoraggio dal vivo", + "description": "Tre strumenti avviabili in modo interattivo per osservare la rete in tempo reale e misurare la larghezza di banda: iftop, iptraf-ng e iperf3. Ogni strumento viene installato automaticamente tramite apt al primo utilizzo, viene eseguito in primo piano e si chiude con il tasto indicato. Non modificano la configurazione di rete dell’host; iperf3 genera traffico di prova.", + "section": "Rete" + }, + "intro": { + "title": "Cosa fa", + "body": "Tre strumenti di monitoraggio interattivo, ciascuno dietro la propria voce menu. La prima volta che si lancia uno, il pacchetto viene installato silenziosamente tramite apt-get. I lanci successivi iniziano immediatamente. Nessuno di questi strumenti modifica la configurazione della rete host." + }, + "when": { + "heading": "Quando usare quale", + "headerQuestion": "Domanda", + "headerUse": "Usa", + "rows": [ + { + "question": "Chi sta saturando il collegamento in questo momento?", + "use": "iftop" + }, + { + "question": "Qual è la ripartizione per protocollo e quali dimensioni dei pacchetti e flussi TCP sono presenti?", + "use": "iptraf-ng" + }, + { + "question": "Quanta larghezza di banda è effettivamente disponibile tra due host?", + "use": "iperf3" + } + ] + }, + "iftop": { + "heading": "Utilizzo rete in tempo reale (iftop)", + "body": "Larghezza di banda in tempo reale per coppia di host (origine ↔ destinazione), come top per il traffico. Mostra in alto i flussi più intensi con medie mobili su 2/10/40 secondi. Lo strumento ideale per rispondere a «perché il mio uplink è saturo?».", + "exit": "Esci: premi q. ProxMenux mostra un promemoria prima dell’avvio.", + "keysTitle": "Tasti utili dentro iftop", + "keysBody": "n attiva o disattiva le ricerche DNS, p mostra i numeri di porta, P mette in pausa la visualizzazione, t cambia la direzione delle righe (inviato / ricevuto / entrambi), 1/2/3 ordina per media su 2 s / 10 s / 40 s. Elenco completo in man iftop." + }, + "iptraf": { + "heading": "Strumento monitoraggio rete (iptraf-ng)", + "intro": "Un monitor del traffico con più modalità, gestito tramite menu. iftop risponde a «chi», mentre iptraf-ng risponde a «cosa»: contatori di byte e pacchetti per protocollo, monitoraggio dello stato delle connessioni TCP, istogrammi delle dimensioni dei pacchetti e attività LAN per stazione.", + "menuIntro": "Al lancio si ottiene un menu a cinque opzioni:", + "headerMode": "Modalità", + "headerUseFor": "Usalo per", + "rows": [ + { + "mode": "Monitor di traffico IP", + "useFor": "Elenco in tempo reale dei flussi TCP / UDP / ICMP / altri protocolli IP con contatori di byte e stato della connessione" + }, + { + "mode": "Statistiche generali delle interfacce", + "useFor": "Conteggi aggregati dei pacchetti IPv4 / IPv6 / TCP / UDP / ICMP / non IP per scheda di rete" + }, + { + "mode": "Statistiche dettagliate dell’interfaccia", + "useFor": "Come sopra, ma per una sola interfaccia, con dettagli sulle dimensioni e sulla frequenza dei pacchetti" + }, + { + "mode": "Ripartizioni statistiche", + "useFor": "Istogramma della distribuzione delle dimensioni dei pacchetti, per porta TCP / UDP" + }, + { + "mode": "Monitor della stazione LAN", + "useFor": "Per-MAC statistiche del traffico per il dominio broadcast locale" + } + ], + "exit": "Esci: premi x da qualsiasi vista oppure Q dal menu principale. ProxMenux mostra un promemoria prima dell’avvio.", + "logTitle": "Salvataggio delle acquisizioni su file", + "logBody": "Ogni modalità offre di registrare le statistiche catturate a /var/log/iptraf-ng/. Utile se avete bisogno di un record di un picco di traffico — lasciare in esecuzione, registrare a file, rivedere il file dopo invece di cercare di leggere lo schermo dal vivo." + }, + "iperf3": { + "heading": "Test della larghezza di banda (iperf3)", + "intro1": "Misura la velocità TCP effettiva tra due host. A differenza di iftop / iptraf-ng, che osservano il traffico esistente, iperf3 genera traffico sintetico per una prova di carico del collegamento. Indispensabile per domande come «la mia rete 10 GbE raggiunge davvero 10 GbE?» oppure «il collo di bottiglia è la scheda di rete, lo switch o lo storage?».", + "intro2": "iperf3 è uno strumento per due host: uno funge da server e ascolta sulla porta TCP 5201; l’altro funge da client, si connette, invia dati e mostra la velocità. Il lanciatore di ProxMenux chiede quale modalità vuoi:", + "headerMode": "Modalità", + "headerBehaviour": "Comportamento", + "headerCli": "Comando CLI equivalente", + "rows": [ + { + "mode": "Server", + "behaviour": "Ascolta sulla porta TCP 5201 e mostra i risultati di ogni test in arrivo. Si arresta con Ctrl+C.", + "cli": "iperf3 -s" + }, + { + "mode": "Cliente", + "behaviour": "Chiede l’indirizzo IP o il nome host del server, si connette, esegue il test predefinito di 10 secondi e mostra il rapporto.", + "cli": "iperf3 -c " + } + ], + "workflowIntro": "Flusso di lavoro tipico per testare un collegamento 10 GbE tra due host Proxmox:", + "workflow": [ + "Sull’host A, apri il menu Rete → Test della larghezza di banda (iperf3) → scegli Server.", + "Su host B, apri la stessa voce del menu → scegli Client → inserisci l'IP dell'host A.", + "Attendere 10 secondi. Confrontare il tasso riportato al massimo teorico del link." + ], + "sample": "Esempio di output del client:", + "flagsTitle": "Opzioni utili da usare manualmente dalla shell", + "flagsBody": "-t 60 test più lungo (60 s invece di 10 s), -P 4 4 flussi paralleli (saturano prima il collegamento), -R direzione inversa (server → client), -u -b 100M test UDP a 100 Mbit/s (misurazione di jitter e perdita di pacchetti), -p 5202 porta diversa (più test in parallelo). Elenco completo in man iperf3.", + "firewallTitle": "Aprire la porta firewall sul server", + "firewallBody": "Il server ascolta TCP 5201 per impostazione predefinita. Se si esegue il server all'interno di un host Proxmox con un firewall rigoroso (datacenter o livello host), consentire TCP 5201 in entrata dall'IP del client per la durata del test, quindi chiudere di nuovo. Lo stesso vale per nftables / iptables su host nudi." + }, + "install": { + "heading": "Il primo lancio installa il pacchetto", + "body": "Tutti e tre i lanciatori controllano il binario ed eseguono apt-get update -qq && apt-get install -y <pkg> se manca. L'installazione è silenziosa: il menu può apparire congelato per 10–30 secondi la prima volta. I lanci successivi iniziano immediatamente." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "hangTitle": "L’installazione resta bloccata al primo avvio", + "hangBody": "L’host non ha accesso a Internet oppure i repository apt sono irraggiungibili. Annulla con Ctrl+C, esegui apt-get update manualmente per vedere l’errore effettivo (DNS, firma del repository, proxy, …), poi torna al menu.", + "refusedTitle": "Client iperf3: «unable to connect to server: Connection refused»", + "refusedBody": "Il server non è in esecuzione oppure il suo firewall blocca TCP 5201. Verifica sul server con ss -tlnp | grep 5201: dovrebbe mostrare iperf3 in ascolto. Se è in ascolto ma il client continua a fallire, controlla i firewall lungo il percorso tra i due host.", + "slowTitle": "iperf3 mostra una velocità molto inferiore a quella prevista per il collegamento", + "slowBody": "Cause comuni in ordine di probabilità: (1) la CPU di uno degli host limita la velocità: prova iperf3 -c <target> -P 4 per usare più core; (2) il percorso passa per un collegamento più lento, come uno switch gigabit tra due schede 10 GbE; (3) MTU diversi: controlla ip link show su entrambi i lati; (4) offloading della scheda di rete disabilitato: vedi lo script della community Disable NIC Offloading se hai una scheda Intel e1000e.", + "noTrafficTitle": "iftop / iptraf-ng non mostrano traffico per un host occupato", + "noTrafficBody": "La cattura predefinita è sulla prima interfaccia rilevata. Specificare quello giusto esplicitamente dalla shell: iftop -i vmbr0 o iptraf-ng -i vmbr0. Il menu launcher utilizza il default; per le interfacce non di default, viene eseguito da una console." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Diagnostica", + "href": "/docs/network/diagnostics", + "tail": "— i controlli di sola lettura (routing, connettività, statistiche avanzate)." + }, + { + "label": "Analisi dei bridge e riparazione guidata", + "href": "/docs/network/bridge-analysis", + "tail": "— quando il monitoraggio rivela un'interfaccia o un ponte non sta facendo ciò che dovrebbe." + } + ] + } +} diff --git a/web/messages/it/docs/network/persistent-names.json b/web/messages/it/docs/network/persistent-names.json new file mode 100644 index 00000000..37fd520c --- /dev/null +++ b/web/messages/it/docs/network/persistent-names.json @@ -0,0 +1,130 @@ +{ + "meta": { + "title": "Nomi di interfaccia persistenti | Documentazione ProxMenux", + "description": "Associa i nomi delle interfacce Proxmox (eno1, enp3s0, …) agli indirizzi MAC tramite file .link di systemd per mantenerli dopo la rinumerazione PCI, aggiornamenti del kernel e aggiunta o rimozione di altre schede di rete.", + "ogTitle": "Nomi di interfaccia persistenti | Documentazione ProxMenux", + "ogDescription": "Evita che i nomi delle interfacce Proxmox cambino quando modifichi l’hardware. Usa file .link di systemd basati sull’indirizzo MAC." + }, + "header": { + "title": "Nomi di interfaccia persistenti", + "description": "Genera un file .link di systemd per ogni scheda di rete fisica, associando il nome assegnato dal kernel all’indirizzo MAC della scheda. Dopo l’applicazione al prossimo riavvio, i nomi delle interfacce rimangono stabili quando aggiungi, rimuovi o sposti schede PCIe.", + "section": "Rete" + }, + "intro": { + "title": "Cosa fa", + "body": "Per ogni NIC fisico sull'host, scrive un piccolo file sotto /etc/systemd/network/10-<iface>.link che dice: \"il dispositivo con questo MAC deve sempre essere chiamato questo nome\". systemd-udevd applica la regola ad ogni avvio, prima che ifupdown legga /etc/network/interfaces." + }, + "problem": { + "heading": "Il problema che risolve", + "intro": "Linux ricava i nomi predefiniti delle interfacce dalla topologia PCI: eno1 = integrata, enp3s0 = scheda sul bus PCI 3, slot 0, ecc. Lo schema dei nomi è deterministico a parità di disposizione hardware. Se la disposizione cambia, cambiano anche i nomi:", + "items": [ + "Aggiungere un GPU di fronte a un NIC esistente → il numero di bus NIC può cambiare → cambi di nome.", + "Spostare una scheda in una diversa slot PCIe → cambia nome.", + "Aggiornamento BIOS / UEFI che rienumera i dispositivi → i nomi possono cambiare.", + "Sostituire una scheda difettosa con lo stesso modello in una slot diversa → cambia nome." + ], + "outro": "Dopo una modifica simile, /etc/network/interfaces fa ancora riferimento al nome precedente; il bridge non si attiva e l’host perde la rete. Impostare nomi persistenti impedisce che la situazione si ripeta." + }, + "howWorks": { + "heading": "Come funziona", + "arrowLabel": "per scheda di rete", + "nodes": { + "detectLabel": "Rileva le schede di rete fisiche", + "detectDetail": "ls /sys/class/net/\nescludi vmbr / bond /\ndocker / veth / wireguard …", + "readLabel": "Leggi ogni MAC", + "readDetail": "cat /sys/class/net/\n '<'iface'>'/address", + "writeLabel": "Scrivi file .link", + "writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link" + }, + "minimalIntro": "Ogni file generato è intenzionalmente minimo:", + "minimalOutro": "All’avvio, systemd-udevd identifica il dispositivo tramite MAC e assegna il nome richiesto prima che intervengano altri componenti (ifupdown, denominazione predefinita del kernel). Il prefisso 10- fa caricare queste regole in anticipo, prima del file predefinito 99-default.link." + }, + "scope": { + "heading": "Quello che viene scritto, quello che viene saltato", + "headerType": "Tipo", + "headerBehaviour": "Comportamento", + "headerWhy": "Perché?", + "rows": [ + { + "type": "Scheda di rete integrata / PCIe", + "behaviour": "File .link scritto", + "why": "Corrisponde a un dispositivo PCI reale: il caso per cui è pensato lo strumento" + }, + { + "type": "Wi-Fi (phy80211)", + "behaviour": "File .link scritto", + "why": "Ha un MAC reale e benefici dalla stabilità dei nomi" + }, + { + "type": "Ponti (vmbrX)", + "behaviour": "Ignorato", + "why": "Virtuale; il nome viene da /etc/network/interfaces" + }, + { + "type": "Bond (bondX)", + "behaviour": "Ignorato", + "why": "Virtuale; il nome del bond è impostato da ifupdown" + }, + { + "type": "veth / docker0 / br-XXXX", + "behaviour": "Ignorato", + "why": "Creato su richiesta da Docker / LXC — hardware non persistente" + }, + { + "type": "tap / fwpr / fwln", + "behaviour": "Ignorato", + "why": "Creato su richiesta da Proxmox per VM/CT" + }, + { + "type": "WireGuard / Cilium / Tailscale", + "behaviour": "Ignorato", + "why": "Interfacce software gestite dai propri demoni" + } + ] + }, + "safety": { + "heading": "Rete di sicurezza: backup dei file .link precedenti", + "intro": "Se /etc/systemd/network/ contiene già file .link da un’esecuzione precedente o da altri strumenti, questi vengono copiati in una directory di backup con data e ora prima di generare i nuovi file:", + "outro": "Per tornare indietro: copiare i file dalla directory di backup e riavviare.", + "rebootTitle": "Prende effetto sul prossimo riavvio, non immediatamente", + "rebootBody": "Le modifiche ai file .link si applicano solo all’avvio, quando udev enumera nuovamente i dispositivi. Per questo lo strumento mostra «Le modifiche saranno applicate dopo il riavvio». Rinominare un’interfaccia in uso è rischioso e non viene tentato: un vmbr0 attivo con interfacce membro andrebbe riconfigurato atomicamente, quindi l’operazione è rimandata al prossimo avvio pulito." + }, + "afterReboot": { + "heading": "Dopo il riavvio", + "intro": "Una volta che i nomi sono bloccati, il flusso di lavoro per le future modifiche hardware è semplice:", + "items": [ + "Spegni, modifica l’hardware (aggiungi una scheda, cambia slot, …), poi avvia.", + "Ogni NIC mantiene il suo nome precedente perché il suo MAC corrisponde a un file .link.", + "Se una scheda di rete viene sostituita e ha un MAC diverso, riceve un nome predefinito del kernel (enp<bus>s<slot>); esegui di nuovo questo menu per aggiungere una voce .link per il MAC della nuova scheda." + ] + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "emptyTitle": "\"Nessuna interfaccia fisica trovata\" dopo aver eseguito lo strumento", + "emptyBody": "Il kernel non vede interfacce basate su PCI / phy80211 sull’host. Verifica con ls -l /sys/class/net/: ogni voce dovrebbe avere un collegamento simbolico device (PCI) oppure una voce phy80211 (Wi-Fi). Se mancano entrambi per una scheda di rete reale, il driver non è caricato.", + "noChangeTitle": "Dopo il riavvio, i nomi non sono cambiati come previsto", + "noChangeBody": "Verifica che il file esista e sia ben formato: cat /etc/systemd/network/10-<iface>.link. Poi controlla i log di udev: journalctl -u systemd-udevd -b | grep -i link. Una causa comune è un vecchio parametro del kernel net.ifnames=0 che disabilita del tutto i nomi prevedibili: rimuovilo da /etc/default/grub, esegui update-grub e riavvia.", + "undoTitle": "Voglio annullare la denominazione persistente", + "undoBody": "Elimina i file .link (rm /etc/systemd/network/10-*.link) oppure ripristinali dalla directory di backup creata nell’esecuzione precedente. Riavvia per applicare." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Analisi dei bridge e riparazione guidata", + "href": "/docs/network/bridge-analysis", + "tailRich": " — il percorso di ripristino quando i nomi sono già cambiati." + }, + { + "label": "Analisi della configurazione e pulizia guidata", + "href": "/docs/network/config-analysis", + "tail": "— rimuovere i blocchi orfani lasciati alle spalle con i cambi di nome." + }, + { + "label": "Diagnostica", + "href": "/docs/network/diagnostics", + "tailRich": " — verifica i nuovi nomi con Mostra tabella di routing dopo il riavvio." + } + ] + } +} diff --git a/web/messages/pt/docs/network/backup-restore.json b/web/messages/pt/docs/network/backup-restore.json new file mode 100644 index 00000000..76e2b371 --- /dev/null +++ b/web/messages/pt/docs/network/backup-restore.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Cópia de segurança e reinício das interfaces | Documentação ProxMenux", + "description": "Snapshot manual, navegar e restaurar backups /etc/network/interfaces armazenados em /var/backups/proxmenux/. Inclui uma reinicialização do serviço de rede com confirmação e uma visão rápida da configuração ao vivo.", + "ogTitle": "Cópia de segurança e reinício das interfaces | Documentação ProxMenux", + "ogDescription": "Instantâneo e restauração da configuração de rede Proxmox; reinicie o serviço de rede com confirmação." + }, + "header": { + "title": "Cópia de segurança e reinício das interfaces", + "description": "Quatro utilitários que giram em torno de /etc/network/interfaces: tirar um instantâneo manual, visualizar a configuração ao vivo, restaurar um backup anterior com visualização opcional, e reiniciar o serviço de rede com consentimento explícito. Mesmo diretório de backup usado pelos fluxos de reparo guiados.", + "section": "Rede" + }, + "intro": { + "title": "O que isto faz", + "body": "Gere o mesmo diretório de cópias de segurança usado pelas reparações guiadas (/var/backups/proxmenux/). Permite criar uma cópia extra antes de qualquer alteração manual, consultar todas as cópias existentes e repor qualquer uma delas — sempre com uma nova cópia do estado anterior ao restauro, criada automaticamente como segunda proteção." + }, + "shared": { + "heading": "O diretório de backup compartilhado", + "intro": "Cada backup feito em qualquer lugar no menu Rede chega no mesmo lugar:", + "outro": "Os nomes dos ficheiros contêm data e hora, são ordenados por data e nunca são substituídos. O diretório é criado na primeira utilização." + }, + "show": { + "heading": "Mostrar arquivo de configuração de rede", + "body": "Imprime /etc/network/interfaces na íntegra para o terminal. Só para leitura. Útil como uma verificação de sanidade antes de fazer um backup ou depois de uma restauração — não há nenhuma ferramenta separada \"diff com backup anterior\", então olhar para o arquivo ao vivo é a maneira mais fácil de confirmar o que você tem." + }, + "create": { + "heading": "Criar backup de rede", + "body": "Copia o /etc/network/interfaces atual para o diretório de backup com um timestamp fresco. É isso — sem análise, sem prompts, apenas um instantâneo.", + "whenTitle": "Quando criar uma cópia de segurança manual", + "whenBody": "Antes de editar /etc/network/interfaces à mão, instalar um pacote que possa alterar a pilha de rede (por exemplo NetworkManager ou Open vSwitch) ou fazer qualquer alteração de hardware. As reparações guiadas já criam uma cópia automaticamente — esta opção serve para as operações manuais." + }, + "restore": { + "heading": "Restaurar backup de rede", + "intro": "Lista todas as cópias em /var/backups/proxmenux/ da mais recente à mais antiga e guia um restauro com proteções:", + "steps": [ + { + "title": "1. Escolher uma cópia de segurança", + "body": "Um menu lista cada backup pelo seu timestamp. Se não existirem backups, o fluxo sai com uma mensagem clara.", + "tone": "blue" + }, + { + "title": "2. Visualização opcional", + "body": "Propõe abrir a cópia selecionada numa vista com deslocamento antes de confirmar o restauro. A opção predefinida é Sim — não ignore este passo num host remoto.", + "tone": "blue" + }, + { + "title": "3. Cópia de segurança antes do restauro", + "body": "Antes de sobrepor /etc/network/interfaces, toma outro backup do estado atual. Restaurar um backup é em si uma ação destrutiva, então o novo instantâneo pré-restore permite que você volte se o backup escolhido acabar sendo o errado.", + "tone": "amber" + }, + { + "title": "4. Aplicar a restauração", + "body": "Substitui /etc/network/interfaces pela cópia selecionada. A alteração do ficheiro está no disco; o estado atual do kernel ainda reflete a configuração anterior.", + "tone": "amber" + }, + { + "title": "5. Reinício opcional", + "body": "Pergunta se deve executar o systemctl restart networking agora. Recusar para adiar a alteração para a próxima reinicialização.", + "tone": "emerald" + } + ], + "autoBackupTitle": "O restauro cria automaticamente a sua própria cópia de segurança", + "autoBackupBody": "Selecionar Restaurar backup de rede cria sempre uma nova cópia da configuração atual antes de a substituir. Se restaurar a cópia errada, o ficheiro mais recente em /var/backups/proxmenux/ contém o estado anterior." + }, + "restart": { + "heading": "Reinicie o serviço de rede", + "body": "Executa systemctl restart networking após uma confirmação sim/não. Relata o resultado com msg_ok / msg_error. A maioria dos fluxos neste menu oferece o seu próprio prompt de reinicialização no final; esta opção é para reiniciar após uma edição manual ou depois de recusar o reinício do fluxo antes.", + "warnTitle": "Breve desconexão garantida; desconexão permanente possível", + "warnBody": "Reiniciando networking derruba e reaplica cada interface declarada em /etc/network/interfaces. As sessões SSH hospedadas nessas interfaces caem. Se a nova configuração for inválida, a rede nunca voltará. Execute isto apenas quando:", + "warnItems": [ + "Você tem o console / IPMI / iKVM pronto, ou", + "Está fisicamente ao lado da máquina, ou", + "Você acabou de voltar com sucesso para uma configuração conhecida-boa e quer aplicá-la." + ] + }, + "manualRollback": { + "heading": "Retroceder manualmente de uma consola", + "intro": "Se você não conseguir alcançar o menu (sem SSH, a janela está a falhar, ...) mas pode chegar a uma consola, o rollback são dois comandos:", + "outro": "É a mesma operação executada pelo menu, apenas escrita à mão. Se networking continuar sem iniciar, consulte journalctl -u networking -b para identificar o erro de sintaxe ou do controlador." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "noneTitle": "\"Nenhum backup encontrado\" na Restauração", + "noneBody": "O diretório /var/backups/proxmenux/ não existe ou não contém ficheiros interfaces_backup_*. Execute Criar backup de rede pelo menos uma vez ou faça uma reparação guiada, que cria uma cópia automaticamente. Confirme com ls /var/backups/proxmenux/.", + "unreachTitle": "Reiniciar a rede tem sucesso, mas a máquina ainda não está acessível", + "unreachBody": "A nova configuração está errada ou não atribui o seu IP de gestão. Reponha a configuração a partir da consola (ver acima). Depois use a análise de bridges e a análise de configuração para perceber o problema antes de voltar a aplicar.", + "emptyTitle": "A antevisão da restauração mostra um arquivo vazio", + "emptyBody": "O ficheiro de backup está vazio (0 bytes). Isto acontece se uma cópia falhar silenciosamente numa execução anterior. Escolha uma cópia mais antiga ou execute novamente Criar backup de rede agora, se a configuração atual funcionar." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Análise de ponte e reparo guiado", + "href": "/docs/network/bridge-analysis", + "tail": " — a razão mais comum pela qual um backup acaba aqui." + }, + { + "label": "Análise de configuração e limpeza guiada", + "href": "/docs/network/config-analysis", + "tailRich": " — escreve igualmente para o /var/backups/proxmenux/ automaticamente." + }, + { + "label": "Diagnósticos", + "href": "/docs/network/diagnostics", + "tail": " — para verificar o estado atual após um restauro." + } + ] + } +} diff --git a/web/messages/pt/docs/network/bridge-analysis.json b/web/messages/pt/docs/network/bridge-analysis.json new file mode 100644 index 00000000..f20eddca --- /dev/null +++ b/web/messages/pt/docs/network/bridge-analysis.json @@ -0,0 +1,132 @@ +{ + "meta": { + "title": "Análise de bridges e reparação guiada | Documentação ProxMenux", + "description": "Deteta bridges vmbrX com portas físicas em falta ou inválidas, tipicamente após a reenumeração PCI. Apresenta-os com sugestões de comandos de shell e propõe uma reparação guiada em 5 passos com cópia de segurança obrigatória.", + "ogTitle": "Análise de bridges e reparação guiada | Documentação ProxMenux", + "ogDescription": "Verifique e repare portas de bridges Proxmox após alterações de hardware, com um procedimento guiado que permite reverter em segurança." + }, + "header": { + "title": "Análise de ponte e reparo guiado", + "description": "Verifica cada bridge vmbrX declarado em /etc/network/interfaces e se as suas portas físicas existem. Caso faltem, propõe uma reparação passo a passo. A análise é só de leitura; a reparação exige confirmação, apresenta uma pré-visualização e cria uma cópia de segurança.", + "section": "Rede" + }, + "intro": { + "title": "O que isto faz", + "body": "Lê cada ponte em /etc/network/interfaces, olha para sua linha bridge-ports e verifica se cada porta declarada (por exemplo. enp3s0) realmente existe na máquina. Se falta uma porta, propõe um substituto e – com consentimento explícito – aplica a alteração com um backup, visualização, aplicação, verificação." + }, + "when": { + "heading": "Quando precisares disto", + "intro": "Linux atribui nomes de interface previsíveis de topologia PCI e ordem de fenda. Vários eventos os embaralham e deixam o /etc/network/interfaces referindo-se a nomes que já não existem:", + "items": [ + "Adicionar ou remover uma placa PCIe (placa de rede, GPU, HBA ou adaptador NVMe).", + "Mudar uma placa existente para outro slot PCIe.", + "BIOS / UEFI atualiza que re-enumeram dispositivos PCI.", + "Migrando o disco de inicialização para hardware diferente." + ], + "outro": "Após a próxima inicialização, a ponte tenta anexar a uma porta que já não existe, falha em aparecer, e o host perde sua rede. Nomes de interface persistentes impede que isso aconteça novamente — mas se você já estiver bloqueado, esta página é o caminho de recuperação." + }, + "bigPicture": { + "heading": "O quadro geral", + "diagram1": { + "arrowLabel": "passo 1", + "nodes": { + "sourceLabel": "/etc/network/interfaces", + "sourceDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports enp3s0", + "bridgeLabel": "Analisar (somente leitura)", + "bridgeDetail": "ip link show enp3s0\n→ não existe", + "targetLabel": "Relatório + sugestão", + "targetDetail": "❌ enp3s0: NÃO ENCONTRADA\nSubstituir por: eno1\n(ainda sem alterações)" + } + }, + "diagram2": { + "arrowLabel": "aplicar com backup", + "nodes": { + "sourceLabel": "Reparação guiada", + "sourceDetail": "1. Cópia de Segurança\n2. Mostrar actual\n3. Antevisão das alterações\n4. Aplicar\n5. Verificar", + "targetLabel": "/etc/network/interfaces (novo)", + "targetDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports eno1" + } + } + }, + "step1": { + "heading": "Passo 1: análise (somente leitura)", + "intro": "Ao selecionar Analisar configuração de bridges, a ferramenta para imediatamente se o host não usar a pilha clássica Debian/Proxmox. Caso contrário, verifica cada bridge e apresenta:", + "items": [ + "Nome do bridge, estado atual (UP / DOWN) e IP atribuído.", + "Cada porta declarada e se existe atualmente (ip link show <port>).", + "Para cada porta inválida: uma substituição proposta (a primeira interface física disponível) mais o comando exato sed para aplicá-lo manualmente.", + "Bridges sem qualquer linha bridge-ports e entradas auto órfãs sem bloco iface correspondente." + ], + "readonlyTitle": "Garantia apenas para leitura", + "readonlyBody": "Até este ponto o script não executou um único comando modificando. Você pode deixar a análise aberta, copiar os comandos sed sugeridos e aplicá-los manualmente se preferir — ou aceitar o próximo prompt para inserir o reparo guiado." + }, + "step2": { + "heading": "Passo 2: reparação guiada (5 passos)", + "intro": "Só se inicia se aceitar a proposta no fim da análise. Cada passo mostra o que vai acontecer e pede confirmação antes de continuar.", + "steps": [ + { + "title": "1. Cópia de segurança", + "body": "Copia /etc/network/interfaces para /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. O caminho exato de backup é mostrado antes da cópia e novamente depois, com o comando rollback.", + "tone": "blue" + }, + { + "title": "2. Rever a configuração actual", + "body": "Abre o /etc/network/interfaces ao vivo numa janela de rolagem para que possa ver exactamente o que está prestes a ser alterado.", + "tone": "blue" + }, + { + "title": "3. Antever as alterações propostas", + "body": "Lista exatamente os bridges afetados e as substituições de portas previstas. Se já não for necessária reparação porque a porta reapareceu entre as verificações, o processo termina com «Não são necessárias alterações.»", + "tone": "blue" + }, + { + "title": "4. Aplicar alterações", + "body": "Para cada ponte afetada, executa sed -i \"/iface $bridge/,/bridge-ports/ s/bridge-ports.*/bridge-ports $new_ports/\" contra /etc/network/interfaces. Se uma ponte não tiver nenhuma substituição válida disponível, a substituição é ignorada e relatada na etapa 5.", + "tone": "amber" + }, + { + "title": "5. Verificação", + "body": "Lê novamente o ficheiro e confirma a existência da nova porta de cada bridge. Mostra o comando para reverter (cp <backup> /etc/network/interfaces). Por fim propõe Reiniciar a rede — aceite apenas se tiver acesso de reserva à consola.", + "tone": "emerald" + } + ], + "restartTitle": "Reiniciar a rede ≠ anular sem risco", + "restartBody": "A reparação é gravada no disco mesmo que não reinicie o serviço. systemctl restart networking aplica a alteração agora e pode interromper a sessão SSH se a nova porta estiver errada. Se recusar, a alteração entra na mesma em vigor no próximo arranque — confirme primeiro a configuração ou reverta com o comando apresentado." + }, + "edits": { + "heading": "O que é editado (exatamente)", + "body": "Apenas a linha bridge-ports de cada bridge afetado. As outras diretivas (address, netmask, gateway, bridge-stp, …) ficam intactas. Neste procedimento o script não cria nem remove blocos iface — isso cabe à Análise de configuração & limpeza." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "unsupportedTitle": "A análise para com «Pilha de rede não suportada»", + "unsupportedBody": "O host usa netplan, systemd-networkd ou NetworkManager. A ferramenta só suporta /etc/network/interfaces. Mude primeiro o host para a pilha clássica ou altere a configuração com as ferramentas nativas do gestor (por exemplo netplan apply).", + "noSuggestTitle": "Nenhuma sugestão é impressa para uma porta inválida", + "noSuggestBody": "O host tem zero interfaces físicas livres (tudo já está em outra ponte ou não existe). A análise remonta a sugerir bridge-ports none para que a ponte possa pelo menos subir sem um porto. Adicionar um NIC ou migrar portas entre pontes manualmente antes de repetir.", + "stillDownTitle": "O reparo completa, mas a ponte ainda está em baixo", + "stillDownBody": "sed atualizou o arquivo, mas systemctl restart networking foi recusado. Execute-o manualmente assim que a nova configuração for verificada, ou reinicie. Se o reinício foi aceito e a ponte ainda estiver baixa, execute ip link show para confirmar a nova porta existe, em seguida, verifique journalctl -u networking para o erro real (cabo desconectado, link não negociado, porto já um membro de outra ponte).", + "lostSshTitle": "Perdi o acesso SSH logo após reiniciar a rede", + "lostSshIntro": "Use console / IPMI / iKVM para chegar ao host. Restaurar o backup:", + "lostSshOutro": "Em seguida, re-execute a análise do console para descobrir por que a sugestão não funcionou (normalmente: a porta de substituição não está realmente conectada)." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Nomes de interface persistentes", + "href": "/docs/network/persistent-names", + "tail": " — atribuir nomes aos endereços MAC para que este cenário deixe de acontecer." + }, + { + "label": "Análise de configuração e limpeza guiada", + "href": "/docs/network/config-analysis", + "tailRich": " — para os blocos iface órfãos (a outra metade do mesmo problema)." + }, + { + "label": "Cópia de segurança e reinício das interfaces", + "href": "/docs/network/backup-restore", + "tail": " — instantâneos manuais e o navegador de restauração." + } + ] + } +} diff --git a/web/messages/pt/docs/network/config-analysis.json b/web/messages/pt/docs/network/config-analysis.json new file mode 100644 index 00000000..b165f844 --- /dev/null +++ b/web/messages/pt/docs/network/config-analysis.json @@ -0,0 +1,122 @@ +{ + "meta": { + "title": "Análise de configuração e limpeza guiada | Documentação ProxMenux", + "description": "Deteta blocos iface em /etc/network/interfaces que referem placas de rede físicas já ausentes do host. Apresenta-os e propõe uma remoção guiada em 5 passos com cópia de segurança obrigatória e pré-visualização de cada bloco.", + "ogTitle": "Análise de configuração e limpeza guiada | Documentação ProxMenux", + "ogDescription": "Encontrar e remover blocos de interface órfão deixados para trás por mudanças de hardware, com visualização completa e rollback." + }, + "header": { + "title": "Análise de configuração e limpeza guiada", + "description": "Examina cada bloco iface em /etc/network/interfaces e verifica se a placa de rede física correspondente ainda existe. Apresenta os blocos órfãos deixados por alterações de hardware e propõe uma remoção guiada com cópia de segurança, pré-visualização e confirmação de cada bloco.", + "section": "Rede" + }, + "intro": { + "title": "O que isto faz", + "body": "Identifica declarações iface cuja NIC de apoio não está mais presente no host (típico após a substituição ou remoção de uma placa de rede). Em seguida, oferece uma limpeza guiada que remove apenas os blocos órfãos, com um backup, uma visualização por seção e uma confirmação final explícita." + }, + "differs": { + "heading": "Como difere da análise da ponte", + "headerAspect": "Aspecto", + "headerBridge": "Análise da ponte", + "headerConfig": "Análise de configuração", + "rows": [ + { + "aspect": "Olha para", + "bridge": "Pontes (vmbrX) e sua linha bridge-ports", + "config": "Cada bloco iface, excluindo loopback, bridges e bonds" + }, + { + "aspect": "Detecta", + "bridge": "Bridges que referem uma porta inexistente", + "config": "Blocos de interface independentes para NICs que não existem" + }, + { + "aspect": "Acção de reparação", + "bridge": "Substitui o nome do porto em bridge-ports", + "config": "Remove todo o bloco iface" + }, + { + "aspect": "Exclui", + "bridge": "Nada — cada ponte é analisada", + "config": "Bridges (vmbrX) e bonds (bondX) são sempre mantidos, pois são virtuais e a sua ausência durante o arranque pode ser normal" + } + ], + "outro": "Na prática, usam-se frequentemente ambas por esta ordem: primeiro a análise de configuração para remover blocos órfãos, depois a análise de bridges para reatribuir os bridges que dependiam da interface removida." + }, + "step1": { + "heading": "Passo 1: análise (somente leitura)", + "intro": "Aborta imediatamente se a máquina não estiver na pilha clássica. Caso contrário, lista todas as interfaces não- loopback configuradas e reporta o seu estado:", + "virtTitle": "As interfaces virtuais estão protegidas", + "virtBody": "Bridges (vmbrX) e bonds (bondX) são estruturas virtuais. Podem legitimamente não existir no momento da inspeção, como um bridge ainda sem portas. A análise nunca propõe removê-los — apenas placas de rede físicas." + }, + "step2": { + "heading": "Passo 2: limpeza guiada (5 passos)", + "intro": "Só se inicia se aceitar a proposta no fim da análise. Cada passo exige confirmação; cancelar em qualquer ponto termina sem escrever.", + "steps": [ + { + "title": "1. Cópia de segurança", + "body": "Copia /etc/network/interfaces para /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Caminho mostrado antes e depois.", + "tone": "blue" + }, + { + "title": "2. Confirmar a lista de remoção", + "body": "Lista exatamente os blocos de interfaces físicas a remover. Se as placas de rede reaparecerem entre a análise e a limpeza, por exemplo após voltar a inserir uma placa, o processo termina com «Não é necessária limpeza.»", + "tone": "blue" + }, + { + "title": "3. Visualizar o( s) bloco( s) exato( s)", + "body": "Abre uma vista com deslocamento de cada bloco iface que seria eliminado, exatamente como está no ficheiro. É a altura de identificar, por exemplo, um hook up que queira preservar.", + "tone": "blue" + }, + { + "title": "4. Aplicar remoção", + "body": "Para cada interface órfã, executa sed -i \"/^iface $iface/,/^$/d\" /etc/network/interfaces. Isso apaga da linha iface correspondente até a próxima linha em branco.", + "tone": "amber" + }, + { + "title": "5. Verificação", + "body": "Lê novamente o ficheiro, lista o que foi removido e verifica as interfaces restantes. Mostra o comando para reverter. Não reinicia a rede automaticamente — remover um bloco não usado pode ser aplicado em segurança no próximo reinício, evitando alterar o estado ativo.", + "tone": "emerald" + } + ], + "noRestartTitle": "Não reinicia automaticamente a rede", + "noRestartBody": "Ao contrário do reparo de ponte, o fluxo de limpeza não oferece para reiniciar o serviço. Remover um bloco de interface não utilizado não tem efeito imediato na configuração em execução, então uma reinicialização é desnecessária e seria um risco desnecessário de conectividade. A mudança produz efeito no próximo manual systemctl restart networking ou na próxima reinicialização." + }, + "caveats": { + "heading": "Advertências importantes", + "boundaryTitle": "O limite do bloco é a primeira linha em branco", + "boundaryBody": "O padrão sed elimina desde iface <name> até à próxima linha vazia. Se /etc/network/interfaces não tiver linhas vazias entre blocos, algo raro mas possível após edição manual, o bloco seguinte também pode ser eliminado. Por isso, o passo 3 é obrigatório: reveja a pré-visualização antes de confirmar.", + "tandemTitle": "Um bloco iface órfão usado por um bridge é detetado aqui, não na análise de bridges", + "tandemBody": "Se vmbr0 declarar bridge-ports enp3s0 e enp3s0 também tiver o seu bloco iface enp3s0 inet manual, remover enp3s0 aqui deixa uma referência inválida em vmbr0. Após a limpeza, execute a análise de bridges para reatribuir ou remover a porta do bridge. Os dois procedimentos foram concebidos para uso conjunto." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "notFoundTitle": "A análise mostra o meu novo NIC como \"NÃO ENCONTRADO\"", + "notFoundBody": "O kernel vê o dispositivo com um nome diferente do que está no ficheiro. Execute ip link show para obter o nome real. É precisamente um caso em que os nomes persistentes das interfaces evitariam o problema no futuro.", + "tooMuchTitle": "A limpeza removeu demasiado, incluindo um bloco que queria manter", + "tooMuchBody": "Restaurar a partir do backup impresso na etapa 5:", + "tooMuchOutro": "Edite o arquivo manualmente para adicionar uma linha em branco clara entre os blocos antes de repetir a limpeza ou remover o bloco problemático manualmente.", + "bridgeBreakTitle": "Uma ponte pára de funcionar após a limpeza", + "bridgeBreakBody": "O bridge dependia de uma porta cujo bloco iface foi removido. Execute a análise de bridges e a sugestão associará o bridge a uma interface física existente." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Análise de ponte e reparo guiado", + "href": "/docs/network/bridge-analysis", + "tail": " — o acompanhamento natural após uma limpeza." + }, + { + "label": "Nomes de interface persistentes", + "href": "/docs/network/persistent-names", + "tail": " — impede a acumulação de blocos órfãos após cada mudança de hardware." + }, + { + "label": "Cópia de segurança e reinício das interfaces", + "href": "/docs/network/backup-restore", + "tail": " — instantâneos manuais e o navegador de restauração." + } + ] + } +} diff --git a/web/messages/pt/docs/network/diagnostics.json b/web/messages/pt/docs/network/diagnostics.json new file mode 100644 index 00000000..b7d2abd0 --- /dev/null +++ b/web/messages/pt/docs/network/diagnostics.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Diagnósticos | Documentação ProxMenux", + "description": "Três diagnósticos pontuais só de leitura: Mostrar tabela de encaminhamento, Testar conectividade e Diagnósticos avançados. Apenas inspeção — nunca escreve em /etc/network/interfaces nem executa comandos de alteração, com uma exceção explícita que exige a sua aceitação: purgar o NetworkManager, caso seja detetado.", + "ogTitle": "Diagnósticos | Documentação ProxMenux", + "ogDescription": "Diagnósticos de rede somente leitura para o host Proxmox: roteamento, acessibilidade, estatísticas avançadas." + }, + "header": { + "title": "Diagnósticos", + "description": "Três verificações pontuais só de leitura do estado atual da rede: tabela de encaminhamento, teste de conectividade e estatísticas avançadas. Nenhuma escreve em /etc/network/interfaces — são seguras a qualquer momento, incluindo por SSH. Para monitorização interativa em tempo real, consulte Ferramentas de monitorização em tempo real.", + "section": "Rede" + }, + "intro": { + "title": "O que isto faz", + "body": "Apresenta informações de encaminhamento, acessibilidade e estatísticas agregadas sem modificar nada. Use para confirmar que a rede funciona ou identificar IPs duplicados. Para observar o tráfego continuamente, consulte Ferramentas de monitorização em tempo real; para ver o ficheiro de configuração em bruto, consulte Cópia de segurança e reinício das interfaces." + }, + "routing": { + "heading": "Mostrar tabela de roteamento", + "body": "Lista todas as rotas que o kernel usa atualmente (ip route show) e destaca o gateway padrão. Útil para confirmar que o tráfego para a internet sai através da interface esperada e que nenhuma rota restante está tendo precedência." + }, + "connectivity": { + "heading": "Testar conectividade", + "intro": "Envia duas sondas ICMP para três alvos em sequência e reporta cada um. Em seguida, executa um nslookup google.com para verificar a resolução DNS independentemente do ICMP.", + "headerTest": "Teste", + "headerTarget": "Alvo", + "headerConfirms": "O que confirma", + "rows": [ + { + "test": "DNS do Google", + "target": "8.8.8.8", + "confirms": "Alcance externo através de um conhecido IP anycast" + }, + { + "test": "Cloudflare DNS", + "target": "1.1.1.1", + "confirms": "Segunda opinião independente se o Google bloquear ICMP" + }, + { + "test": "Gateway", + "target": "(rota padrão)", + "confirms": "Conectividade L2 / L3 com o roteador local" + }, + { + "test": "Resolução DNS", + "target": "google.com", + "confirms": "O servidor DNS está acessível e responde" + } + ], + "readingTitle": "Lendo o resultado", + "readingBody": "Se o teste do gateway passar mas os destinos DNS públicos falharem, tem conectividade local mas não tem Internet — verifique a ligação a montante do gateway. Se a resolução DNS falhar mas os pings para 8.8.8.8 tiverem sucesso, o problema está no resolvedor, não na rede: verifique /etc/resolv.conf." + }, + "advanced": { + "heading": "Diagnóstico Avançado", + "intro": "Agrega estatísticas em toda a rede e executa uma bateria de verificações de questões comuns. Relata as contagens de conexão ativa, portas de escuta, interfaces totais e sinaliza dois anti- padrões explicitamente:", + "items": [ + "NetworkManager em execução num host Proxmox. O NetworkManager e o ifupdown do Proxmox entram em conflito: ambos tentam gerir as interfaces, tornando os bridges instáveis ou impedindo a sua ativação. Se for detetado, a ferramenta pede confirmação interativa para o parar, desativar e purgar (é o único diagnóstico que pode modificar o sistema, e só após consentimento explícito).", + "Endereços IP duplicados em diferentes interfaces. Duas interfaces com o mesmo IPv4 causam conectividade intermitente extremamente difícil de depurar de dentro do VM. Detectado através de ip -4 addr show | sort | uniq -d." + ], + "nmTitle": "O prompt NetworkManager é a única ação modificadora aqui", + "nmBody": "Todas as outras verificações dos diagnósticos avançados são só de leitura. A remoção do NetworkManager exige confirmação sim/não e executa systemctl stop / disable + apt-get purge -y network-manager. Se recusar, nada muda." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "gwTitle": "Testar conectividade indica uma falha do gateway, mas o host tem acesso à Internet", + "gwBody": "Alguns routers não respondem a ICMP na interface interna mesmo quando encaminham corretamente o tráfego. Teste com traceroute 8.8.8.8 numa consola: se o segundo salto for o seu ISP e o teste de DNS público tiver passado, o gateway está a funcionar apesar do ping falhado.", + "dupTitle": "Diagnóstico avançado continua sinalizando IPs duplicados depois que eu removi um", + "dupBody": "A verificação olha para o estado do kernel ao vivo, não para o arquivo de configuração. Executar ip -4 addr show para confirmar; se a duplicata ainda estiver presente, uma interface ainda está segurando-a. Use ip addr del <IP>/<mask> dev <iface> para removê-lo do estado ao vivo, em seguida, edite /etc/network/interfaces se ele também é persistente." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Ferramentas de monitorização ao vivo", + "href": "/docs/network/monitoring", + "tail": " — lançadores interativos iftop / iptraf-ng / iperf3." + }, + { + "label": "Análise de ponte e reparo guiado", + "href": "/docs/network/bridge-analysis", + "tail": " — quando um vmbrX não tem a sua porta física." + }, + { + "label": "Análise de configuração e limpeza guiada", + "href": "/docs/network/config-analysis", + "tail": " — quando uma NIC antiga é ainda declarada, mas já não está presente." + }, + { + "label": "Cópia de segurança e reinício das interfaces", + "href": "/docs/network/backup-restore", + "tail": " — para criar uma cópia da configuração antes de qualquer alteração." + } + ] + } +} diff --git a/web/messages/pt/docs/network/index.json b/web/messages/pt/docs/network/index.json new file mode 100644 index 00000000..ab44ee7e --- /dev/null +++ b/web/messages/pt/docs/network/index.json @@ -0,0 +1,107 @@ +{ + "meta": { + "title": "Gestão de rede Proxmox — Bridges, bonds, diagnóstico, reparação | ProxMenux", + "description": "Diagnósticos só de leitura, análises seguidas de sugestões e reparações guiadas para a pilha de rede Debian / Proxmox (/etc/network/interfaces). Inspecione bridges e bonds, execute ferramentas de monitorização em tempo real, torne persistentes os nomes das interfaces, crie cópias de segurança e reinicie a rede em segurança — com cópias obrigatórias e pré-visualizações passo a passo.", + "ogTitle": "Gestão de rede Proxmox — Bridges, bonds, diagnóstico, reparação", + "ogDescription": "Diagnósticos, análise e reparos guiados para a pilha de rede Proxmox com backups obrigatórios e pré-visualizações passo a passo.", + "twitterTitle": "Gestão de rede Proxmox | ProxMenux", + "twitterDescription": "Bridges, bonds, diagnósticos e reparações guiadas para a pilha de rede Proxmox com cópias de segurança obrigatórias." + }, + "header": { + "title": "Gerenciamento de rede", + "description": "Diagnósticos só de leitura, relatórios de análise com sugestões e reparações guiadas para a pilha de rede clássica Debian/Proxmox. Cada operação destrutiva cria primeiro uma cópia de segurança e mostra as alterações exatas antes de as aplicar.", + "section": "Rede" + }, + "intro": { + "title": "Para que serve este menu", + "body": "Inspecione, diagnostique e, quando necessário, repare a configuração de rede do host Proxmox sem perder o acesso remoto. As ferramentas seguem um princípio: ler primeiro, propor e só depois aplicar com consentimento explícito e uma cópia de segurança. Não existe um botão «Corrigir tudo automaticamente»." + }, + "openingMenu": { + "heading": "Abrir o menu", + "intro": "No menu principal do ProxMenux, selecione Rede. Verá o seguinte:", + "imageAlt": "Menu de gerenciamento de rede com diagnósticos, monitoramento, análise, reparo, nomes persistentes e opções de backup" + }, + "safety": { + "heading": "O modelo de segurança", + "body": "Editar a configuração de rede de um host Proxmox remoto é uma das formas mais fáceis de perder o acesso. O ProxMenux tem isso em conta em cada ação. As ferramentas dividem-se em três níveis de comportamento — escolha o cartão que corresponde ao seu objetivo:" + }, + "tiers": { + "readOnly": { + "title": "Somente leitura", + "body": "Inspecção pura. Não é possível modificar o sistema em nenhuma circunstância.", + "items": [ + "Tabela de roteamento, testes de conectividade, estatísticas avançadas", + "Monitorização do tráfego ao vivo (iftop, iptraf-ng)", + "Teste de largura de banda (iperf3)" + ] + }, + "analyze": { + "title": "Analisar, então sugerir", + "body": "Detecta problemas, imprime um relatório com comandos de shell propostos e pára. Você decide se deve entrar na reparação guiada depois.", + "items": [ + "Análise de configuração da ponte", + "Análise da configuração da rede" + ] + }, + "apply": { + "title": "Aplicar com backup", + "body": "Modifica o sistema. Cria sempre primeiro uma cópia de segurança do ficheiro afetado com data e hora e mostra uma pré-visualização antes de escrever.", + "items": [ + "Nomes de interface persistentes (ficheiros .link)", + "Backup manual, restauração e reinício do serviço" + ] + } + }, + "classicTitle": "Apenas a pilha clássica", + "classicBody": "Cada função de análise e reparo verifica o gerenciador de rede ativo antes de tocar em qualquer coisa. Se o host executar netplan, systemd-networkd ou NetworkManager, a ferramenta aborta imediatamente com uma mensagem clara — o menu só suporta a pilha Debian/Proxmox clássica no /etc/network/interfaces. Isto é intencional: editar um arquivo netplan com regras escritas para ifupdown iria silenciosamente corromper a configuração.", + "backups": { + "heading": "Para onde vão os backups", + "intro": "Cada reparação guiada, restauro ou cópia de segurança manual grava uma cópia de /etc/network/interfaces com data e hora em /var/backups/proxmenux/:", + "rollbackIntro": "Para repor manualmente a configuração anterior a partir de uma consola:" + }, + "readOnlySection": { + "heading": "Inspeção somente de leitura", + "body": "O ponto de partida quando algo parece errado. Apenas inspeção — nunca escreve em /etc/network/interfaces nem executa comandos que alterem o sistema, com uma única exceção explícita que exige a sua aceitação: purgar o NetworkManager, caso seja detetado. Pode ser usado em segurança por SSH a qualquer momento.", + "options": [ + { + "title": "Diagnósticos", + "description": "Três verificações pontuais só de leitura: Mostrar tabela de encaminhamento, Testar conectividade e Diagnósticos avançados. Apenas inspeção — nunca escreve no sistema." + }, + { + "title": "Ferramentas de monitorização ao vivo", + "description": "Três lançadores interativos: iftop (largura de banda em tempo real por par host), iptraf-ng (monitor de tráfego multimodo) e iperf3 (teste de largura de banda, servidor / modo cliente)." + } + ] + }, + "analyzeSection": { + "heading": "Analisar, então sugerir", + "body": "Usadas quando uma inspeção ou uma falha real aponta para um problema de configuração. Cada ferramenta examina a parte relevante de /etc/network/interfaces, apresenta um relatório detalhado com o comando exato de shell que corrigiria cada problema e para. Se aceitar depois a reparação guiada opcional, é criada uma cópia de segurança antes de cada alteração, que também é pré-visualizada antes da escrita.", + "options": [ + { + "title": "Análise de ponte e reparo guiado", + "description": "Deteta bridges vmbrX com portas em falta ou inválidas, algo típico após a reenumeração PCI. Mostra primeiro um relatório e só repara quando aceita o procedimento guiado de 5 passos." + }, + { + "title": "Análise de configuração e limpeza guiada", + "description": "Encontra interfaces físicas declaradas em /etc/network/interfaces que já não existem (configurações órfãs deixadas por mudanças de hardware). Comunica-os e oferece uma remoção guiada." + } + ] + }, + "applySection": { + "heading": "Aplicar com backup", + "body": "Estas ferramentas escrevem no disco por natureza. Cada uma cria primeiro uma cópia de segurança do ficheiro afetado com data e hora, e as opções destrutivas, como restauro e reinício, exigem confirmação explícita sim/não. Os nomes persistentes das interfaces entram em vigor no próximo reinício, não de imediato, pelo que a sua configuração pode ser agendada em segurança mesmo num host remoto.", + "options": [ + { + "title": "Nomes de interface persistentes", + "description": "Associa os nomes das interfaces (eno1, enp3s0, …) aos endereços MAC através de ficheiros .link do systemd. Os nomes mantêm-se após mudanças de slot PCI, atualizações do kernel e adição ou remoção de outras placas de rede." + }, + { + "title": "Cópia de segurança e reinício das interfaces", + "description": "Instantâneo manual do /etc/network/interfaces, navegar e restaurar backups anteriores, visualizar a configuração ao vivo e reiniciar o serviço de rede quando necessário." + } + ] + }, + "consoleTitle": "Tenha acesso à consola preparado", + "consoleSubTitle": "Antes de qualquer reparação em uma máquina remota", + "consoleBody": "Se estiver ligado por SSH e tiver apenas um caminho de acesso ao host, prepare uma alternativa antes de alterar a rede: consola física / IPMI / iKVM ou outra máquina na mesma LAN. As reparações guiadas são seguras e oferecem sempre um comando para reverter as alterações, mas um bridge mal configurado ou uma ligação interrompida pode deixá-lo sem acesso até conseguir chegar à consola." +} diff --git a/web/messages/pt/docs/network/monitoring.json b/web/messages/pt/docs/network/monitoring.json new file mode 100644 index 00000000..c1e8307b --- /dev/null +++ b/web/messages/pt/docs/network/monitoring.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Ferramentas de monitorização em tempo real | Documentação ProxMenux", + "description": "Três lançadores interativos de monitoramento de rede: iftop (largura de banda em tempo real por par host), iptraf-ng (monitor de tráfego multimodo) e iperf3 (teste de largura de banda, servidor / modo cliente). Cada um é instalado na primeira utilização.", + "ogTitle": "Ferramentas de monitorização em tempo real | Documentação ProxMenux", + "ogDescription": "Monitoramento de rede interativo e testes de largura de banda para o host Proxmox: iftop, iptraf-ng, iperf3." + }, + "header": { + "title": "Ferramentas de monitorização ao vivo", + "description": "Três ferramentas interativas para observar a rede em tempo real e medir a largura de banda: iftop, iptraf-ng e iperf3. Cada uma é instalada automaticamente através do apt na primeira utilização, corre em primeiro plano e termina com a tecla indicada. Não alteram a configuração de rede do host; o iperf3 gera tráfego de teste.", + "section": "Rede" + }, + "intro": { + "title": "O que isto faz", + "body": "Três ferramentas interativas de monitoramento, cada uma atrás de seu próprio menu. A primeira vez que você lança um, o pacote é instalado silenciosamente via apt-get. Lançamentos subsequentes começam instantaneamente. Nenhuma destas ferramentas modifica a configuração da rede host." + }, + "when": { + "heading": "Quando utilizar qual", + "headerQuestion": "Pergunta", + "headerUse": "Usar", + "rows": [ + { + "question": "Quem está saturando o link agora?", + "use": "iftop" + }, + { + "question": "Qual é a distribuição por protocolo e que tamanhos de pacotes e fluxos TCP estão presentes?", + "use": "iptraf-ng" + }, + { + "question": "Quanta largura de banda está disponível entre duas máquinas?", + "use": "iperf3" + } + ] + }, + "iftop": { + "heading": "uso de rede em tempo real (iftop)", + "body": "Largura de banda em tempo real por par de hosts (origem ↔ destino) — como o top para o tráfego. Mostra os fluxos mais intensos no topo, com médias móveis de 2/10/40 segundos. A melhor ferramenta para responder a «porque está a minha ligação de saída saturada?».", + "exit": "Sair: prima q. O ProxMenux mostra um lembrete antes de iniciar.", + "keysTitle": "Teclas úteis no iftop", + "keysBody": "n alterna a consulta DNS, p mostra os números das portas, P pausa a visualização, t alterna a direção das linhas (enviado / recebido / ambos), 1/2/3 ordena pela média de 2 s / 10 s / 40 s. Lista completa em man iftop." + }, + "iptraf": { + "heading": "ferramenta de monitoramento de rede (iptraf-ng)", + "intro": "Um monitor de tráfego com vários modos, controlado por menus. O iftop responde a «quem», enquanto o iptraf-ng responde a «o quê»: contagens de bytes e pacotes por protocolo, acompanhamento do estado das ligações TCP, histogramas de tamanho dos pacotes e atividade LAN por estação.", + "menuIntro": "No lançamento você recebe um menu de cinco opções:", + "headerMode": "Modo", + "headerUseFor": "Use-o para", + "rows": [ + { + "mode": "Monitor de tráfego IP", + "useFor": "Lista em tempo real de fluxos TCP / UDP / ICMP / outros protocolos IP, com contadores de bytes e estado da ligação" + }, + { + "mode": "Estatísticas gerais da interface", + "useFor": "Contagens agregadas de pacotes IPv4 / IPv6 / TCP / UDP / ICMP / não IP por placa de rede" + }, + { + "mode": "Estatísticas de interface detalhadas", + "useFor": "O mesmo que acima, mas para uma interface, com tamanho de pacote e detalhe de taxa" + }, + { + "mode": "Desagregações estatísticas", + "useFor": "Histograma de distribuição do tamanho do pacote, por porta TCP / UDP" + }, + { + "mode": "Monitor de estação LAN", + "useFor": "Estatísticas de tráfego por MAC para o domínio de transmissão local" + } + ], + "exit": "Saída: pressione x de qualquer vista (ou Q do menu principal). O ProxMenux mostra uma janela de lembrete antes do lançamento.", + "logTitle": "Guardar capturas num ficheiro", + "logBody": "Cada modo oferece para registrar estatísticas capturadas para /var/log/iptraf-ng/. Útil se você precisar de um registro de um pico de tráfego — deixe-o em execução, faça log para arquivo, reveja o arquivo depois, em vez de tentar ler a tela ao vivo." + }, + "iperf3": { + "heading": "Teste de largura de banda (iperf3)", + "intro1": "Mede o débito TCP real entre dois hosts. Ao contrário do iftop / iptraf-ng, que observam o tráfego existente, o iperf3 gera tráfego sintético para testar a ligação sob carga. Indispensável para perguntas como «a minha ligação 10 GbE atinge realmente 10 GbE?» ou «o estrangulamento está na placa de rede, no switch ou no armazenamento?».", + "intro2": "O iperf3 é uma ferramenta para dois hosts: um funciona como servidor, à escuta na porta TCP 5201, e o outro como cliente, que se liga, envia dados e mostra o débito. O ProxMenux pergunta qual o modo pretendido:", + "headerMode": "Modo", + "headerBehaviour": "Comportamento", + "headerCli": "CLI equivalente", + "rows": [ + { + "mode": "Servidor", + "behaviour": "Escuta em TCP 5201 e imprime resultados para cada teste de entrada. Para em Ctrl+C.", + "cli": "iperf3 -s" + }, + { + "mode": "Cliente", + "behaviour": "Pede o IP ou nome do servidor, liga-se, executa o teste predefinido de 10 segundos e mostra o relatório.", + "cli": "iperf3 -c " + } + ], + "workflowIntro": "Fluxo de trabalho típico para testar uma ligação 10 GbE entre duas máquinas Proxmox:", + "workflow": [ + "No host A, abra o menu Rede → Teste de largura de banda (iperf3) → escolha Servidor.", + "No host B, abra a mesma entrada de menu → escolha Cliente → introduza o IP do host A.", + "Espere 10 segundos. Compare o débito apresentado com o máximo teórico da ligação." + ], + "sample": "Exemplo de saída do cliente:", + "flagsTitle": "Opções úteis para executar manualmente numa shell", + "flagsBody": "-t 60 teste mais longo (60s em vez de 10s padrão), -P 4 4 fluxos paralelos (satura mais rápido), -R direção reversa (servidor → cliente), -u -b 100M UDP teste em 100 Mbit/s (para medições de jitter / perda de pacotes), -p 5202 usar uma porta diferente (testes múltiplos em paralelo). man iperf3 para o conjunto completo.", + "firewallTitle": "Abrir a porta de firewall no servidor", + "firewallBody": "O servidor escuta por predefinição na porta TCP 5201. Se o executar num host Proxmox com firewall restritiva, ao nível do datacenter ou do host, permita ligações TCP 5201 de entrada a partir do IP do cliente durante o teste e volte a fechar a porta no fim. O mesmo se aplica a nftables / iptables em hosts físicos." + }, + "install": { + "heading": "Primeiro lançamento instala o pacote", + "body": "Todos os três lançadores verificam o binário e executam o apt-get update -qq && apt-get install -y <pkg> se estiver em falta. A instalação é silenciosa: o menu pode aparecer congelado para 10–30 segundos na primeira vez. Lançamentos subsequentes começam instantaneamente." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "hangTitle": "A instalação fica bloqueada na primeira execução", + "hangBody": "O host não tem Internet ou os repositórios apt estão inacessíveis. Cancele com Ctrl+C, execute apt-get update manualmente para ver o erro real (DNS, assinatura do repositório, proxy, …) e volte ao menu.", + "refusedTitle": "Cliente iperf3: «unable to connect to server: Connection refused»", + "refusedBody": "Ou o servidor não está em execução, ou seu firewall bloqueia TCP 5201. Confirme no servidor: ss -tlnp | grep 5201 — deve mostrar iperf3 ouvindo. Se ouvir mas o cliente ainda falhar, verifique o caminho do firewall entre os dois hosts.", + "slowTitle": "O iperf3 apresenta um débito muito inferior à velocidade esperada da ligação", + "slowBody": "Causas comuns por ordem de probabilidade: (1) a CPU de um host limita o débito — tente iperf3 -c <target> -P 4 para usar vários núcleos; (2) o percurso passa por uma ligação mais lenta, como um switch gigabit entre duas placas 10 GbE; (3) MTU diferentes — verifique ip link show nas duas pontas; (4) offloading da placa de rede desativado — consulte o script da comunidade Disable NIC Offloading se tiver uma placa Intel e1000e.", + "noTrafficTitle": "iftop / iptraf-ng não mostram tráfego para uma máquina ocupada", + "noTrafficBody": "A captura padrão está na primeira interface detectada. Especifique o direito explicitamente a partir do shell: iftop -i vmbr0 ou iptraf-ng -i vmbr0. O lançador de menus usa o padrão; para interfaces não padrão, execute a partir de uma consola." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Diagnósticos", + "href": "/docs/network/diagnostics", + "tail": " — as verificações pontuais só de leitura (encaminhamento, conectividade e estatísticas avançadas)." + }, + { + "label": "Análise de ponte e reparo guiado", + "href": "/docs/network/bridge-analysis", + "tail": " — quando o controlo revela que uma interface ou ponte não está a fazer o que deveria." + } + ] + } +} diff --git a/web/messages/pt/docs/network/persistent-names.json b/web/messages/pt/docs/network/persistent-names.json new file mode 100644 index 00000000..ac215469 --- /dev/null +++ b/web/messages/pt/docs/network/persistent-names.json @@ -0,0 +1,130 @@ +{ + "meta": { + "title": "Nomes de interface persistentes | Documentação ProxMenux", + "description": "Associe os nomes das interfaces Proxmox (eno1, enp3s0, …) aos endereços MAC através de ficheiros .link do systemd para os manter após a reenumeração PCI, atualizações do kernel e adição ou remoção de outras placas de rede.", + "ogTitle": "Nomes de interface persistentes | Documentação ProxMenux", + "ogDescription": "Impeça que os nomes das interfaces Proxmox mudem quando altera o hardware. Usa ficheiros .link do systemd associados ao endereço MAC." + }, + "header": { + "title": "Nomes de interface persistentes", + "description": "Gera um ficheiro .link do systemd por placa de rede física para associar o nome atribuído pelo kernel ao endereço MAC da placa. Após a aplicação no próximo reinício, os nomes das interfaces mantêm-se estáveis ao adicionar, remover ou mudar placas PCIe de lugar.", + "section": "Rede" + }, + "intro": { + "title": "O que isto faz", + "body": "Para cada NIC físico no host, escreve um pequeno arquivo sob /etc/systemd/network/10-<iface>.link que diz: \"o dispositivo com este MAC deve ser sempre chamado este nome\". systemd-udevd aplica a regra em cada inicialização, antes que ifupdown leia /etc/network/interfaces." + }, + "problem": { + "heading": "O problema que isto resolve", + "intro": "O Linux deriva os nomes predefinidos das interfaces da topologia PCI — eno1 = integrada na placa principal, enp3s0 = placa no barramento PCI 3, slot 0, etc. O esquema de nomes é determinístico para a mesma disposição de hardware. Se a disposição mudar, os nomes mudam:", + "items": [ + "Adicione um GPU na frente de um NIC existente → o número de barramento NIC pode mudar → alterações de nome.", + "Mudar uma placa para outro slot PCIe → o nome muda.", + "BIOS / UEFI atualização que re-enumera dispositivos → nomes podem mudar.", + "Substituir uma placa avariada pelo mesmo modelo noutro slot → o nome muda." + ], + "outro": "Após uma alteração destas, /etc/network/interfaces continua a referir o nome antigo; o bridge não se ativa e o host perde a rede. Configurar nomes persistentes impede que este cenário se repita." + }, + "howWorks": { + "heading": "Como funciona", + "arrowLabel": "por NIC", + "nodes": { + "detectLabel": "Detetar placas de rede físicas", + "detectDetail": "ls /sys/class/net/\nexcluir vmbr / bond /\ndocker / veth / wireguard …", + "readLabel": "Ler cada MAC", + "readDetail": "cat /sys/class/net/\n '<'iface'>'/address", + "writeLabel": "Gravar o ficheiro .link", + "writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link" + }, + "minimalIntro": "Cada arquivo gerado é intencionalmente mínimo:", + "minimalOutro": "No arranque, o systemd-udevd identifica o dispositivo pelo MAC e atribui o nome pedido antes da intervenção de outros componentes (ifupdown, nomes predefinidos do kernel). O prefixo 10- garante que estas regras carregam cedo, antes do ficheiro predefinido 99-default.link." + }, + "scope": { + "heading": "O que é escrito, o que é ignorado", + "headerType": "Tipo", + "headerBehaviour": "Comportamento", + "headerWhy": "Porquê?", + "rows": [ + { + "type": "Placa de rede integrada / PCIe", + "behaviour": "Arquivo .link escrito", + "why": "Apoiado por um dispositivo PCI real — o caso em que a ferramenta se destina" + }, + { + "type": "Wi-Fi (phy80211)", + "behaviour": "Arquivo .link escrito", + "why": "Tem um MAC real e beneficia da estabilidade do nome" + }, + { + "type": "Pontes (vmbrX)", + "behaviour": "Ignorado", + "why": "Virtual; o nome vem do /etc/network/interfaces" + }, + { + "type": "Bonds (bondX)", + "behaviour": "Ignorado", + "why": "Virtual; o nome do bond é definido pelo ifupdown" + }, + { + "type": "veth / docker0 / br-XXXX", + "behaviour": "Ignorado", + "why": "Criados a pedido pelo Docker / LXC — não são hardware persistente" + }, + { + "type": "tap / fwpr / fwln", + "behaviour": "Ignorado", + "why": "Criados a pedido pelo Proxmox para cada VM/CT" + }, + { + "type": "WireGuard / Cilium / Tailscale", + "behaviour": "Ignorado", + "why": "Interfaces de software gerenciadas por seus próprios daemons" + } + ] + }, + "safety": { + "heading": "Proteção: são criadas cópias de segurança dos ficheiros .link anteriores", + "intro": "Se /etc/systemd/network/ já contiver ficheiros .link de uma execução anterior ou de outra ferramenta, são copiados para um diretório de segurança com data e hora antes de gerar os novos:", + "outro": "Para voltar atrás: copie os arquivos de volta do diretório de backup e reinicie.", + "rebootTitle": "Faz efeito na próxima reinicialização, não imediatamente", + "rebootBody": "Alterações nos arquivos .link só se aplicam no arranque, quando o udev re-enumera dispositivos. A ferramenta informa que \"Alterações serão aplicadas após reiniciar\" por esta razão. Renomear uma interface ao vivo é arriscado e não tentado: um vmbr0 ativo com membros teria que ser reconfigurado atomicamente, por isso a operação é adiada para a próxima inicialização limpa." + }, + "afterReboot": { + "heading": "Após a reinicialização", + "intro": "Uma vez que os nomes são fixados, o fluxo de trabalho para futuras mudanças de hardware é simples:", + "items": [ + "Desligue, altere o hardware (adicione uma placa, mude de slot, …) e ligue novamente.", + "Cada NIC mantém seu nome anterior porque seu MAC corresponde a um arquivo .link.", + "Se um NIC é substituído (MAC diferente), ele recebe um nome padrão do kernel (enp<bus>s<slot>); execute novamente este menu para adicionar uma entrada .link para o MAC do novo cartão." + ] + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "emptyTitle": "\"Nenhuma interface física encontrada\" após executar a ferramenta", + "emptyBody": "O kernel não vê interfaces baseadas em PCI / phy80211 no host. Confirme com ls -l /sys/class/net/ — cada entrada deve ter uma ligação simbólica device (PCI) ou uma entrada phy80211 (Wi-Fi). Se ambas faltarem numa placa de rede real, o controlador não está carregado.", + "noChangeTitle": "Após a reinicialização, os nomes não mudaram como esperado", + "noChangeBody": "Verifique se o arquivo está presente e bem formado: cat /etc/systemd/network/10-<iface>.link. Em seguida, verifique registros udev: journalctl -u systemd-udevd -b | grep -i link. Uma causa comum é um parâmetro antigo do kernel net.ifnames=0 que desativa inteiramente a nomeação previsível — remova-a do /etc/default/grub, execute o update-grub, reinicie.", + "undoTitle": "Quero anular os nomes persistentes", + "undoBody": "Ou delete os arquivos .link (rm /etc/systemd/network/10-*.link) ou restaure do diretório de backup gerado na execução anterior. Reiniciar para aplicar." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Análise de ponte e reparo guiado", + "href": "/docs/network/bridge-analysis", + "tailRich": " — o caminho de recuperação quando os nomes já mudaram." + }, + { + "label": "Análise de configuração e limpeza guiada", + "href": "/docs/network/config-analysis", + "tail": " — para remover blocos órfãos deixados pelas mudanças de nomes." + }, + { + "label": "Diagnósticos", + "href": "/docs/network/diagnostics", + "tailRich": " — confirme os novos nomes com Mostrar tabela de roteamento após reiniciar." + } + ] + } +} diff --git a/web/messages/sk/docs/network/backup-restore.json b/web/messages/sk/docs/network/backup-restore.json new file mode 100644 index 00000000..077fdfba --- /dev/null +++ b/web/messages/sk/docs/network/backup-restore.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Záloha a reštart rozhraní | Dokumentácia ProxMenux", + "description": "Ručné vytváranie snímok, prehliadanie a obnova záloh /etc/network/interfaces uložených v /var/backups/proxmenux/. Zahŕňa reštart sieťovej služby s potvrdením a rýchle zobrazenie aktuálnej konfigurácie.", + "ogTitle": "Záloha a reštart rozhraní | Dokumentácia ProxMenux", + "ogDescription": "Vytvorte snímku a obnovte sieťovú konfiguráciu Proxmox; reštartujte sieťovú službu s potvrdením." + }, + "header": { + "title": "Záloha a reštart rozhraní", + "description": "Štyri nástroje pre /etc/network/interfaces: ručne vytvoriť snímku, zobraziť aktuálnu konfiguráciu, obnoviť predchádzajúcu zálohu s voliteľným náhľadom a reštartovať sieťovú službu s výslovným súhlasom. Používajú rovnaký záložný adresár ako opravy so sprievodcom.", + "section": "Sieť" + }, + "intro": { + "title": "Čo to robí?", + "body": "Spravuje rovnaký adresár záloh ako opravy so sprievodcom (/var/backups/proxmenux/). Umožňuje vytvoriť ďalšiu snímku pred každou ručnou zmenou, prehliadať všetky existujúce zálohy a obnoviť ktorúkoľvek z nich — vždy s automaticky vytvorenou novou zálohou stavu pred obnovou ako druhou ochranou." + }, + "shared": { + "heading": "Zdieľaný adresár zálohovania", + "intro": "Každá záloha vytvorená kdekoľvek v menu Sieť sa uloží na rovnaké miesto:", + "outro": "Názvy súborov sú časovo označené, zoradené podľa dátumu a nikdy neprepísané. Adresár je vytvorený pri prvom použití." + }, + "show": { + "heading": "Zobraziť konfiguračný súbor siete", + "body": "Vypíše presný obsah /etc/network/interfaces do terminálu. Iba na čítanie. Užitočné na kontrolu pred zálohovaním alebo po obnove. Samostatný nástroj na porovnanie s predchádzajúcou zálohou neexistuje, takže najjednoduchšie je skontrolovať obsah aktuálneho súboru pohľadom." + }, + "create": { + "heading": "Vytvoriť zálohu siete", + "body": "Skopíruje aktuálny /etc/network/interfaces do adresára záloh s novou časovou pečiatkou. To je všetko — bez analýzy, bez výziev, iba snímka.", + "whenTitle": "Kedy vytvoriť ručnú zálohu", + "whenBody": "Pred ručnou úpravou /etc/network/interfaces, pred inštaláciou balíka, ktorý môže meniť sieťový stack (napríklad NetworkManager alebo Open vSwitch), alebo pred zmenami hardvéru. Opravy so sprievodcom už vytvárajú snímky automaticky — táto možnosť je určená na ručné zásahy." + }, + "restore": { + "heading": "Obnoviť sieť zo zálohy", + "intro": "Zobrazí všetky zálohy v /var/backups/proxmenux/ od najnovšej po najstaršiu a prevedie vás obnovou s bezpečnostnými opatreniami:", + "steps": [ + { + "title": "1. Vybrať zálohu", + "body": "Menu zobrazí každú zálohu podľa jej časovej pečiatky. Ak neexistujú žiadne zálohy, postup sa ukončí s jasným hlásením.", + "tone": "blue" + }, + { + "title": "2. Nepovinný náhľad", + "body": "Ponúkne otvorenie vybranej zálohy v posúvateľnom zobrazení pred potvrdením obnovy. Predvolená odpoveď je Áno — na vzdialenom hostiteľovi tento krok nevynechávajte.", + "tone": "blue" + }, + { + "title": "3. Záloha pred obnovou", + "body": "Pred prepísaním /etc/network/interfaces vytvorí ďalšiu zálohu aktuálneho stavu. Obnova je sama osebe deštruktívna akcia, preto nová snímka pred obnovou umožní návrat, ak bola vybraná záloha nesprávna.", + "tone": "amber" + }, + { + "title": "4. Použiť obnovenie", + "body": "Kopíruje vybranú zálohu cez /etc/network/interfaces. Zmena súboru je na disku; stav živého jadra stále odráža predchádzajúcu konfiguráciu.", + "tone": "amber" + }, + { + "title": "5. Nepovinný reštart", + "body": "Pýta sa, či má teraz spustiť systemctl restart networking. Odmietnutím odložíte použitie zmeny na ďalší reštart.", + "tone": "emerald" + } + ], + "autoBackupTitle": "Obnova automaticky vytvorí vlastnú zálohu", + "autoBackupBody": "Výber Obnoviť sieť zo zálohy vždy vytvorí novú snímku aktuálnej konfigurácie pred jej prepísaním. Ak obnovíte nesprávnu zálohu, najnovší súbor v /var/backups/proxmenux/ obsahuje predchádzajúci stav." + }, + "restart": { + "heading": "Reštartovať sieťovú službu", + "body": "Po potvrdení áno/nie spustí systemctl restart networking. Výsledok oznámi cez msg_ok / msg_error. Väčšina postupov v tomto menu ponúka vlastný reštart na konci. Táto možnosť slúži na reštart po ručnej úprave alebo po odmietnutí skôr ponúknutého reštartu.", + "warnTitle": "Zaručené krátke odpojenie; možné trvalé odpojenie", + "warnBody": "Reštart networking deaktivuje a znovu nastaví každé rozhranie deklarované v /etc/network/interfaces. Relácie SSH cez tieto rozhrania sa prerušia. Ak je nová konfigurácia neplatná, sieť sa neobnoví. Spustite to iba vtedy, keď:", + "warnItems": [ + "Máte konzolu / IPMI / iKVM prístup pripravený, alebo", + "Ste fyzicky vedľa stroja, alebo", + "Práve ste úspešne obnovili overenú funkčnú konfiguráciu a chcete ju použiť." + ] + }, + "manualRollback": { + "heading": "Ručné vrátenie zmien z konzoly", + "intro": "Ak nemôžete dosiahnuť menu (žiadne SSH, dialógové zrútenie, ...), ale môžete dosiahnuť konzolu, rollback je dva príkazy:", + "outro": "Ide o rovnakú operáciu, akú vykonáva menu, iba zadanú ručne. Ak sa networking stále nespustí, skontrolujte journalctl -u networking -b a zistite príčinu v syntaxi alebo ovládači." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "noneTitle": "„Nenašli sa žiadne zálohy“ pri obnove", + "noneBody": "Adresár /var/backups/proxmenux/ neexistuje alebo neobsahuje súbory interfaces_backup_*. Aspoň raz spustite Vytvoriť zálohu siete alebo opravu so sprievodcom, ktorá vytvorí zálohu automaticky. Overte to cez ls /var/backups/proxmenux/.", + "unreachTitle": "Reštart siete prejde, ale hostiteľ je stále nedosiahnuteľný", + "unreachBody": "Nová konfigurácia je nesprávna alebo nepriraďuje vašu IP adresu na správu. Obnovte predchádzajúci stav z konzoly (pozri vyššie). Potom použite analýzu mostov a analýzu konfigurácie, aby ste pred opätovným použitím pochopili príčinu.", + "emptyTitle": "Náhľad obnovy zobrazuje prázdny súbor", + "emptyBody": "Záložný súbor je prázdny (0 bajtov). Stane sa to, ak kopírovanie počas predchádzajúceho spustenia nepozorovane zlyhalo. Vyberte staršiu zálohu alebo znovu spustite Vytvoriť zálohu siete, ak je aktuálna konfigurácia funkčná." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Analýza mostov a oprava so sprievodcom", + "href": "/docs/network/bridge-analysis", + "tail": " — Najbežnejší dôvod, prečo tu končí záloha." + }, + { + "label": "Analýza konfigurácie a čistenie so sprievodcom", + "href": "/docs/network/config-analysis", + "tailRich": " — tiež automaticky zapisuje do /var/backups/proxmenux/." + }, + { + "label": "Diagnostika", + "href": "/docs/network/diagnostics", + "tail": " — na overenie aktuálneho stavu po obnove." + } + ] + } +} diff --git a/web/messages/sk/docs/network/bridge-analysis.json b/web/messages/sk/docs/network/bridge-analysis.json new file mode 100644 index 00000000..c4f7388b --- /dev/null +++ b/web/messages/sk/docs/network/bridge-analysis.json @@ -0,0 +1,132 @@ +{ + "meta": { + "title": "Analýza mostov a oprava so sprievodcom | Dokumentácia ProxMenux", + "description": "Zistí mosty vmbrX s chýbajúcimi alebo neplatnými fyzickými portmi, typicky po opätovnom číslovaní PCI. Nahlási ich s návrhmi príkazov shellu a ponúkne opravu so sprievodcom v 5 krokoch s povinnou zálohou.", + "ogTitle": "Analýza mostov a oprava so sprievodcom | Dokumentácia ProxMenux", + "ogDescription": "Skontrolujte a opravte porty mostov Proxmox po zmenách hardvéru pomocou postupu so sprievodcom a bezpečným vrátením zmien." + }, + "header": { + "title": "Analýza mostov a oprava so sprievodcom", + "description": "Skontroluje každý most vmbrX deklarovaný v /etc/network/interfaces, overí existenciu fyzických portov a pri chýbajúcich ponúkne opravu krok za krokom. Analýza je iba na čítanie; oprava vyžaduje súhlas, zobrazí náhľad a vytvorí zálohu.", + "section": "Sieť" + }, + "intro": { + "title": "Čo to robí?", + "body": "Prečíta každý most v /etc/network/interfaces, skontroluje jeho riadok bridge-ports a overí, či každý deklarovaný port, napríklad enp3s0, existuje na hostiteľovi. Ak port chýba, navrhne náhradu a s výslovným súhlasom použije zmenu postupom záloha, náhľad, použitie, overenie." + }, + "when": { + "heading": "Keď to potrebujete", + "intro": "Linux prideľuje predvídateľné názvy rozhraní podľa topológie PCI a poradia slotov. Viaceré udalosti ich môžu zmeniť, takže /etc/network/interfaces odkazuje na názvy, ktoré už neexistujú:", + "items": [ + "Pridanie alebo odstránenie PCIe karty (NIC, GPU, a HBA, nosič NVMe).", + "Presun existujúcej karty na iný PCIe slot.", + "Aktualizácie BIOS / UEFI, ktoré znovu číslujú zariadenia PCI.", + "Migrácia zavádzacieho disku na iný hardvér." + ], + "outro": "Po ďalšom štarte sa most pokúsi pripojiť k portu, ktorý už neexistuje, neaktivuje sa a hostiteľ stratí sieťové pripojenie. Trvalé názvy rozhraní zabránia opakovaniu tohto problému. Ak ste už stratili prístup, táto stránka opisuje postup obnovy." + }, + "bigPicture": { + "heading": "Celkový prehľad", + "diagram1": { + "arrowLabel": "krok 1", + "nodes": { + "sourceLabel": "/etc/network/interfaces", + "sourceDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports enp3s0", + "bridgeLabel": "Analyzovať (iba na čítanie)", + "bridgeDetail": "ip link show enp3s0\n→ neexistuje", + "targetLabel": "Správa + návrh", + "targetDetail": "❌ enp3s0: NENÁJDENÉ\nNahradiť za: eno1\n(zatiaľ bez zmien)" + } + }, + "diagram2": { + "arrowLabel": "aplikovať so zálohou", + "nodes": { + "sourceLabel": "Oprava so sprievodcom", + "sourceDetail": "1. Záloha\n2. Zobraziť aktuálny stav\n3. Náhľad zmien\n4. Použiť\n5. Overiť", + "targetLabel": "/etc/network/interfaces (nový)", + "targetDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports eno1" + } + } + }, + "step1": { + "heading": "Krok 1: analýza (iba na čítanie)", + "intro": "Po výbere Analyzovať konfiguráciu mostov sa nástroj okamžite zastaví, ak hostiteľ nepoužíva klasický stack Debian/Proxmox. Inak prejde každý most a nahlási:", + "items": [ + "Názov mosta, aktuálny stav (UP / DOWN) a pridelená IP adresa.", + "Každý deklarovaný port a či v súčasnosti existuje (ip link show <port>).", + "Pre každý neplatný port: navrhovaná náhrada (prvé dostupné fyzické rozhranie) plus presný sed príkaz na manuálne použitie.", + "Mosty bez riadka bridge-ports a osirelé položky auto bez zodpovedajúceho bloku iface." + ], + "readonlyTitle": "Záruka režimu iba na čítanie", + "readonlyBody": "Až do tohto bodu skript nespustil žiadny príkaz meniaci systém. Analýzu môžete nechať otvorenú, skopírovať navrhnuté príkazy sed a použiť ich ručne, ak to uprednostňujete. Alebo prijmite nasledujúcu výzvu na spustenie opravy so sprievodcom." + }, + "step2": { + "heading": "Krok 2: oprava so sprievodcom (5 krokov)", + "intro": "Spustí sa iba po prijatí výzvy na konci analýzy. Každý krok zobrazí plánovanú akciu a pred pokračovaním vyžiada potvrdenie.", + "steps": [ + { + "title": "1. Bezpečnostná záloha", + "body": "Skopíruje /etc/network/interfaces do /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Presnú cestu zálohy zobrazí pred kopírovaním aj po ňom spolu s príkazom na vrátenie zmien.", + "tone": "blue" + }, + { + "title": "2. Preskúmanie aktuálnej konfigurácie", + "body": "Otvorí aktuálny /etc/network/interfaces v posúvateľnom dialógu, aby ste presne videli, čo sa zmení.", + "tone": "blue" + }, + { + "title": "3. Náhľad navrhovaných zmien", + "body": "Presne vypíše dotknuté mosty a plánované náhrady portov. Ak už oprava nie je potrebná, pretože sa port medzi kontrolami znovu objavil, postup sa ukončí hlásením „Nie sú potrebné žiadne zmeny.“", + "tone": "blue" + }, + { + "title": "4. Použiť zmeny", + "body": "Pre každý postihnutý most beží sed -i \"/iface $bridge/,/bridge-ports/ s/bridge-ports.*/bridge-ports $new_ports/\" proti /etc/network/interfaces. Ak most nemal k dispozícii platnú náhradu, substitúcia sa preskočí a zaznamená v kroku 5.", + "tone": "amber" + }, + { + "title": "5. Overovanie", + "body": "Znovu prečíta súbor a potvrdí, že nový port každého mosta existuje. Vypíše príkaz na vrátenie zmien (cp <backup> /etc/network/interfaces). Nakoniec ponúkne Reštartovať sieť — prijmite iba vtedy, ak máte náhradný prístup cez konzolu.", + "tone": "emerald" + } + ], + "restartTitle": "Reštart siete ≠ bezpečné vrátenie zmien", + "restartBody": "Oprava sa zapíše na disk bez ohľadu na reštart služby. systemctl restart networking použije zmenu teraz, čo môže prerušiť reláciu SSH, ak je nový port nesprávny. Ak reštart odmietnete, zmena sa aj tak prejaví pri ďalšom štarte. Najprv overte novú konfiguráciu alebo ju vráťte zobrazeným príkazom." + }, + "edits": { + "heading": "Čo sa edituje (presne)", + "body": "Iba riadok bridge-ports každého dotknutého mosta. Ostatné direktívy (address, netmask, gateway, bridge-stp, …) zostávajú nezmenené. Skript v tomto postupe nevytvára ani neodstraňuje bloky iface — to je úloha analýzy konfigurácie & čistenia." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "unsupportedTitle": "Analýza sa zastaví s hlásením „Nepodporovaný sieťový stack“", + "unsupportedBody": "Hostiteľ používa netplan, systemd-networkd alebo NetworkManager. Nástroj podporuje iba /etc/network/interfaces. Najprv prepnite hostiteľa na klasický stack alebo upravte konfiguráciu natívnymi nástrojmi správcu (napríklad netplan apply).", + "noSuggestTitle": "Pre neplatný port sa nevypíše žiadny návrh", + "noSuggestBody": "Hostiteľ nemá žiadne voľné fyzické rozhrania: všetky sú už v inom moste alebo neexistujú. Analýza preto navrhne bridge-ports none, aby sa most mohol aspoň aktivovať bez portu. Pred opätovným spustením pridajte sieťovú kartu alebo ručne presuňte porty medzi mostmi.", + "stillDownTitle": "Oprava sa skončila, ale most je stále dole", + "stillDownBody": "sed aktualizoval súbor, ale systemctl restart networking bol odmietnutý. Po overení novej konfigurácie ho spustite ručne alebo reštartujte systém. Ak bol reštart prijatý a most je stále DOWN, overte existenciu nového portu cez ip link show a skontrolujte journalctl -u networking pre skutočnú chybu: odpojený kábel, nevyjednané spojenie alebo port už patriaci do iného mosta.", + "lostSshTitle": "Stratila som prístup SSH hneď po reštarte siete", + "lostSshIntro": "Použite konzolu / IPMI / iKVM na dosiahnutie hostiteľa. Obnoviť zálohu:", + "lostSshOutro": "Potom znovu spustite analýzu z konzoly a zistite, prečo návrh nefungoval, typicky preto, že náhradný port nie je zapojený." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Trvalé názvy rozhraní", + "href": "/docs/network/persistent-names", + "tail": " — priradí názvy k MAC adresám, aby sa problém neopakoval." + }, + { + "label": "Analýza konfigurácie a čistenie so sprievodcom", + "href": "/docs/network/config-analysis", + "tailRich": " — Pre osirotené iface bloky (druhá polovica rovnakého problému)." + }, + { + "label": "Záloha a reštart rozhraní", + "href": "/docs/network/backup-restore", + "tail": " — ručné snímky a prehliadanie záloh na obnovu." + } + ] + } +} diff --git a/web/messages/sk/docs/network/config-analysis.json b/web/messages/sk/docs/network/config-analysis.json new file mode 100644 index 00000000..819ef52f --- /dev/null +++ b/web/messages/sk/docs/network/config-analysis.json @@ -0,0 +1,122 @@ +{ + "meta": { + "title": "Analýza konfigurácie a čistenie so sprievodcom | Dokumentácia ProxMenux", + "description": "Zistí bloky iface v /etc/network/interfaces odkazujúce na fyzické sieťové karty, ktoré už nie sú na hostiteľovi. Nahlási ich a ponúkne odstránenie so sprievodcom v 5 krokoch s povinnou zálohou a náhľadom každého bloku.", + "ogTitle": "Analýza konfigurácie a čistenie so sprievodcom | Dokumentácia ProxMenux", + "ogDescription": "Nájdite a odstráňte osirelé bloky rozhraní, ktoré zostali po zmenách hardvéru, s úplným náhľadom a možnosťou vrátenia zmien." + }, + "header": { + "title": "Analýza konfigurácie a čistenie so sprievodcom", + "description": "Prejde každý blok iface v /etc/network/interfaces a overí, či príslušná fyzická sieťová karta stále existuje. Nahlási osirelé bloky po zmenách hardvéru a ponúkne odstránenie so sprievodcom, zálohou, náhľadom a potvrdením každého bloku.", + "section": "Sieť" + }, + "intro": { + "title": "Čo to robí?", + "body": "Identifikuje deklarácie iface, ktorých sieťová karta už nie je na hostiteľovi, typicky po výmene alebo odobratí karty. Potom ponúkne čistenie so sprievodcom, ktoré odstráni iba osirelé bloky, so zálohou, náhľadom každej sekcie a výslovným záverečným potvrdením." + }, + "differs": { + "heading": "Ako sa líši od analýzy mosta", + "headerAspect": "Aspekt", + "headerBridge": "Analýza mosta", + "headerConfig": "Analýza konfigurácie", + "rows": [ + { + "aspect": "Pozerá sa na", + "bridge": "Mosty (vmbrX) a ich riadok bridge-ports", + "config": "Každý blok iface okrem loopbacku, mostov a bondov" + }, + { + "aspect": "Zisťuje", + "bridge": "Mosty odkazujúce na neexistujúci port", + "config": "Samostatné bloky rozhrania pre NIC, ktoré neexistujú" + }, + { + "aspect": "Oprava", + "bridge": "Nahrádza názov portu v bridge-ports", + "config": "Odstráni celý blok iface" + }, + { + "aspect": "Nezahŕňa", + "bridge": "Nič, každý most je analyzovaný", + "config": "Mosty (vmbrX) a bondy (bondX) sa vždy zachovajú, pretože sú virtuálne a ich neprítomnosť počas štartu môže byť normálna" + } + ], + "outro": "V praxi často použijete oba nástroje v tomto poradí: najprv analýzu konfigurácie na odstránenie osirelých blokov, potom analýzu mostov na nové priradenie mostov, ktoré používali odstránené rozhranie." + }, + "step1": { + "heading": "Krok 1: analýza (iba na čítanie)", + "intro": "Okamžite sa zastaví, ak hostiteľ nepoužíva klasický sieťový stack. Inak zobrazí všetky nakonfigurované rozhrania okrem loopbacku a ich stav:", + "virtTitle": "Virtuálne rozhrania sú chránené", + "virtBody": "Mosty (vmbrX) a bondy (bondX) sú virtuálne konštrukcie. Pri kontrole môžu oprávnene chýbať, napríklad most bez portov. Analýza preto nikdy nenavrhuje ich odstránenie, iba odstránenie fyzických sieťových kariet." + }, + "step2": { + "heading": "Krok 2: čistenie so sprievodcom (5 krokov)", + "intro": "Spustí sa iba po prijatí výzvy na konci analýzy. Každý krok vyžaduje potvrdenie; zrušením v ktoromkoľvek bode sa postup ukončí bez zápisu.", + "steps": [ + { + "title": "1. Bezpečnostná záloha", + "body": "Skopíruje /etc/network/interfaces do /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Cestu zobrazí pred kopírovaním aj po ňom.", + "tone": "blue" + }, + { + "title": "2. Potvrdenie zoznamu odstránenia", + "body": "Presne vypíše bloky fyzických rozhraní určené na odstránenie. Ak sa karty medzi analýzou a čistením znovu objavia, napríklad po opätovnom zasunutí, postup sa ukončí hlásením „Čistenie nie je potrebné.“", + "tone": "blue" + }, + { + "title": "3. Náhľad presných blokov", + "body": "Otvorí rolovací pohľad na každý blok iface, ktorý by bol vymazaný, doslovne zo súboru. Toto je chvíľa, kedy si môžete všimnúť napríklad zaujímavý up hák, ktorý chcete zachovať.", + "tone": "blue" + }, + { + "title": "4. Použiť odstránenie", + "body": "Pre každé sirotské rozhranie beží sed -i \"/^iface $iface/,/^$/d\" /etc/network/interfaces. To odstráni zo zodpovedajúcej línie iface až do ďalšieho prázdneho riadku.", + "tone": "amber" + }, + { + "title": "5. Overovanie", + "body": "Opätovne načíta súbor, vypíše, čo bolo odstránené, a znova skontroluje zostávajúce rozhrania. Vytlačí príkaz na vrátenie. nereštartuje automaticky sieť – odstránenie nepoužívaného bloku je bezpečné použiť pri ďalšom reštarte a nedotýka sa aktívneho stavu.", + "tone": "emerald" + } + ], + "noRestartTitle": "Nereštartuje sieť automaticky", + "noRestartBody": "Na rozdiel od opravy mostov čistenie neponúka reštart služby. Odstránenie nepoužívaného bloku rozhrania okamžite neovplyvní bežiacu konfiguráciu, takže reštart nie je potrebný a zbytočne by ohrozil pripojenie. Zmena sa prejaví pri ďalšom ručnom systemctl restart networking alebo pri ďalšom reštarte systému." + }, + "caveats": { + "heading": "Dôležité upozornenia", + "boundaryTitle": "Hranica bloku je prvý prázdny riadok", + "boundaryBody": "Vzor sed odstráni obsah od iface <name> po ďalší prázdny riadok. Ak v /etc/network/interfaces chýbajú prázdne riadky medzi blokmi, čo je zriedkavé, ale možné po ručných úpravách, môže sa odstrániť aj nasledujúci blok. Preto je krok 3 povinný: pred potvrdením skontrolujte náhľad.", + "tandemTitle": "Osirelý blok iface používaný mostom sa zistí tu, nie pri analýze mostov", + "tandemBody": "Ak vmbr0 deklaruje bridge-ports enp3s0 a enp3s0 má aj vlastný blok iface enp3s0 inet manual, odstránenie enp3s0 tu ponechá neplatný odkaz v vmbr0. Po čistení spustite analýzu mostov na zmenu priradenia alebo odstránenie portu mosta. Oba postupy sú navrhnuté na spoločné použitie." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "notFoundTitle": "Analýza zobrazuje moju novú sieťovú kartu ako „NENÁJDENÁ“", + "notFoundBody": "Jadro vidí zariadenie pod iným názvom, než je v súbore. Spustite ip link show a zistite skutočný názov. Presne v takomto prípade by trvalé názvy rozhraní zabránili problému v budúcnosti.", + "tooMuchTitle": "Čistenie odstránilo príliš veľa, aj blok, ktorý som chcel zachovať", + "tooMuchBody": "Obnovte stav zo zálohy uvedenej v kroku 5:", + "tooMuchOutro": "Pred opätovným spustením čistenia ručne upravte súbor a pridajte prázdny riadok medzi bloky alebo problematický blok odstráňte ručne.", + "bridgeBreakTitle": "Most prestane pracovať po vyčistení.", + "bridgeBreakBody": "Most používal port, ktorého blok iface sa práve odstránil. Spustite analýzu mostov a návrh priradí most k existujúcemu fyzickému rozhraniu." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Analýza mostov a oprava so sprievodcom", + "href": "/docs/network/bridge-analysis", + "tail": " — prirodzený ďalší krok po čistení." + }, + { + "label": "Trvalé názvy rozhraní", + "href": "/docs/network/persistent-names", + "tail": " — zabraňuje hromadeniu osirelých blokov po každej zmene hardvéru." + }, + { + "label": "Záloha a reštart rozhraní", + "href": "/docs/network/backup-restore", + "tail": " — ručné snímky a prehliadanie záloh na obnovu." + } + ] + } +} diff --git a/web/messages/sk/docs/network/diagnostics.json b/web/messages/sk/docs/network/diagnostics.json new file mode 100644 index 00000000..1381afe4 --- /dev/null +++ b/web/messages/sk/docs/network/diagnostics.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Diagnostika | Dokumentácia ProxMenux", + "description": "Tri jednorazové diagnostické kontroly iba na čítanie: Zobraziť smerovaciu tabuľku, Test pripojenia a Pokročilá diagnostika. Iba kontrola — nikdy nezapisuje do /etc/network/interfaces ani nespúšťa príkazy meniace systém, s jedinou výslovnou výnimkou: úplné odstránenie zisteného NetworkManager vyžaduje váš súhlas.", + "ogTitle": "Diagnostika | Dokumentácia ProxMenux", + "ogDescription": "Sieťová diagnostika iba na čítanie pre hostiteľa Proxmoxu: smerovanie, dosiahnuteľnosť, pokročilé štatistiky." + }, + "header": { + "title": "Diagnostika", + "description": "Tri jednorazové kontroly aktuálneho stavu siete iba na čítanie: smerovacia tabuľka, test pripojenia a pokročilé štatistiky. Žiadna nezapisuje do /etc/network/interfaces — bezpečné použitie kedykoľvek, aj cez SSH. Pre interaktívne sledovanie v reálnom čase pozrite Nástroje na sledovanie v reálnom čase.", + "section": "Sieť" + }, + "intro": { + "title": "Čo to robí?", + "body": "Zobrazuje informácie o smerovaní, dosiahnuteľnosti a súhrnných štatistikách bez akýchkoľvek zmien. Overte ním správne fungovanie siete alebo odhaľte duplicitné IP adresy. Na nepretržité sledovanie prevádzky pozrite Nástroje na sledovanie v reálnom čase; na zobrazenie nespracovaného konfiguračného súboru pozrite Záloha a reštart rozhraní." + }, + "routing": { + "heading": "Zobraziť smerovaciu tabuľku", + "body": "Zobrazí všetky trasy aktuálne používané jadrom (ip route show) a zvýrazní predvolenú bránu. Umožňuje overiť, že prevádzka do internetu odchádza očakávaným rozhraním a žiadne zvyšné trasy nemajú prednosť." + }, + "connectivity": { + "heading": "Otestovať pripojenie", + "intro": "Postupne odošle na každý z troch cieľov dve sondy ICMP a vypíše výsledky. Potom spustí nslookup google.com na overenie prekladu DNS nezávisle od ICMP.", + "headerTest": "Skúška", + "headerTarget": "Cieľ", + "headerConfirms": "Čo potvrdzuje", + "rows": [ + { + "test": "Google DNS", + "target": "8.8.8.8", + "confirms": "Externá dosiahnuteľnosť cez známu IP adresu anycast" + }, + { + "test": "Cloudflare DNS", + "target": "1.1.1.1", + "confirms": "Nezávislé druhé stanovisko, ak Google blokuje ICMP" + }, + { + "test": "Brána", + "target": "(štandardná trasa)", + "confirms": "L2 / L3 pripojenie k miestnemu routeru" + }, + { + "test": "Preklad DNS", + "target": "google.com", + "confirms": "DNS server je dosiahnuteľný a odpovedá" + } + ], + "readingTitle": "Čítanie výsledku", + "readingBody": "Ak test brány prejde, ale verejné servery DNS neodpovedajú, máte lokálne pripojenie, no nemáte internet — skontrolujte pripojenie brány smerom k poskytovateľovi. Ak preklad DNS zlyhá, ale ping na 8.8.8.8 funguje, problém je v resolveri, nie v sieti: skontrolujte /etc/resolv.conf." + }, + "advanced": { + "heading": "Pokročilá diagnostika", + "intro": "Zhromažďuje štatistiky celej siete a vykonáva sériu kontrol bežných problémov. Hlási počet aktívnych pripojení, načúvajúce porty a celkový počet rozhraní a výslovne upozorňuje na dve nevhodné konfigurácie:", + "items": [ + "NetworkManager beží na hostiteľovi Proxmox. NetworkManager a ifupdown systému Proxmox sú v konflikte: oba sa pokúšajú spravovať rozhrania, takže mosty opakovane menia stav alebo sa nedajú aktivovať. Ak sa zistí NetworkManager, nástroj ponúkne interaktívne potvrdenie jeho zastavenia, zakázania a úplného odstránenia (ide o jedinú diagnostiku, ktorá môže meniť systém, a to iba po výslovnom súhlase).", + "Duplicitné IP adresy na rôznych rozhraniach. Dve rozhrania s rovnakou IPv4 adresou spôsobujú občasné výpadky pripojenia, ktoré sa zvnútra VM veľmi ťažko diagnostikujú. Zisťujú sa cez ip -4 addr show | sort | uniq -d." + ], + "nmTitle": "Výzva pre NetworkManager je tu jedinou akciou, ktorá môže meniť systém", + "nmBody": "Všetky ostatné kontroly pokročilej diagnostiky sú iba na čítanie. Odstránenie NetworkManager vyžaduje potvrdenie áno/nie a spustí systemctl stop / disable + apt-get purge -y network-manager. Ak odmietnete, nič sa nezmení." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "gwTitle": "Test pripojenia hlási zlyhanie brány, ale hostiteľ má prístup na internet", + "gwBody": "Niektoré smerovače neodpovedajú na ICMP na internom rozhraní, aj keď správne preposielajú prevádzku. V konzole skúste traceroute 8.8.8.8: ak je druhým skokom váš poskytovateľ a test verejného DNS prešiel, brána funguje aj napriek neúspešnému pingu.", + "dupTitle": "Pokročilá diagnostika stále hlási duplicitné IP adresy aj po odstránení jednej z nich", + "dupBody": "Kontrola skúma aktuálny stav jadra, nie konfiguračný súbor. Overte ho príkazom ip -4 addr show; ak je duplicitná adresa stále prítomná, niektoré rozhranie ju stále používa. Pomocou ip addr del <IP>/<mask> dev <iface> ju odstráňte z aktuálneho stavu a potom upravte /etc/network/interfaces, ak je nastavená aj natrvalo." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Nástroje na sledovanie v reálnom čase", + "href": "/docs/network/monitoring", + "tail": " — Interaktívne iftop / iptraf-ng / iperf3 spúšťače." + }, + { + "label": "Analýza mostov a oprava so sprievodcom", + "href": "/docs/network/bridge-analysis", + "tail": " — Keď vmbrX chýba fyzický port." + }, + { + "label": "Analýza konfigurácie a čistenie so sprievodcom", + "href": "/docs/network/config-analysis", + "tail": " — keď je stará sieťová karta stále deklarovaná, ale už nie je prítomná." + }, + { + "label": "Záloha a reštart rozhraní", + "href": "/docs/network/backup-restore", + "tail": " — na vytvorenie snímky konfigurácie pred každou zmenou." + } + ] + } +} diff --git a/web/messages/sk/docs/network/index.json b/web/messages/sk/docs/network/index.json new file mode 100644 index 00000000..871acbef --- /dev/null +++ b/web/messages/sk/docs/network/index.json @@ -0,0 +1,107 @@ +{ + "meta": { + "title": "Správa siete Proxmox — Mosty, bondy, diagnostika, oprava | ProxMenux", + "description": "Diagnostika iba na čítanie, analýzy s následnými návrhmi a opravy so sprievodcom pre sieťový stack Debian / Proxmox (/etc/network/interfaces). Skontrolujte mosty a bondy, spustite nástroje na sledovanie v reálnom čase, nastavte trvalé názvy rozhraní, zálohujte konfiguráciu a bezpečne reštartujte sieť — s povinnými zálohami a náhľadmi jednotlivých krokov.", + "ogTitle": "Správa siete Proxmox — Mosty, bondy, diagnostika, oprava", + "ogDescription": "Diagnostika, analýza a opravy sieťového stacku Proxmox so sprievodcom, povinnými zálohami a náhľadmi jednotlivých krokov.", + "twitterTitle": "Správa siete Proxmox | ProxMenux", + "twitterDescription": "Mosty, bondy, diagnostika a opravy sieťového stacku Proxmox so sprievodcom a povinnými zálohami." + }, + "header": { + "title": "Správa siete", + "description": "Diagnostika iba na čítanie, analytické správy s následnými návrhmi a opravy so sprievodcom pre klasický sieťový stack Debian/Proxmox. Každý deštruktívny postup najprv vytvorí zálohu a pred použitím zobrazí presné zmeny.", + "section": "Sieť" + }, + "intro": { + "title": "Na čo je toto menu", + "body": "Skontrolujte, diagnostikujte a v prípade potreby opravte sieťovú konfiguráciu hostiteľa Proxmox bez straty vzdialeného prístupu. Nástroje sa riadia jednou zásadou: najprv prečítať, potom navrhnúť a zmeny použiť iba s výslovným súhlasom a bezpečnostnou zálohou. Tlačidlo „Automaticky opraviť všetko“ neexistuje." + }, + "openingMenu": { + "heading": "Otvorenie menu", + "intro": "V hlavnom menu ProxMenux vyberte Sieť. Zobrazí sa toto:", + "imageAlt": "Menu Správa siete s možnosťami diagnostiky, sledovania, analýzy, opráv, trvalých názvov a zálohovania" + }, + "safety": { + "heading": "Bezpečnostný model", + "body": "Úprava sieťovej konfigurácie vzdialeného hostiteľa Proxmox je jedným z najjednoduchších spôsobov, ako stratiť prístup. ProxMenux to zohľadňuje pri každej akcii. Nástroje sú rozdelené do troch úrovní správania — vyberte kartu, ktorá zodpovedá vášmu zámeru:" + }, + "tiers": { + "readOnly": { + "title": "Iba na čítanie", + "body": "Iba kontrola. Za žiadnych okolností nemôže meniť systém.", + "items": [ + "Smerovacia tabuľka, testy pripojenia, pokročilé štatistiky", + "Sledovanie sieťovej prevádzky v reálnom čase (iftop, iptraf-ng)", + "Test priepustnosti (iperf3)" + ] + }, + "analyze": { + "title": "Analyzovať, potom navrhnúť", + "body": "Zistí problémy, vypíše správu s navrhovanými príkazmi shellu a zastaví sa. Sami sa rozhodnete, či potom spustíte opravu so sprievodcom.", + "items": [ + "Analýza konfigurácie mosta", + "Analýza konfigurácie siete" + ] + }, + "apply": { + "title": "Aplikovať so zálohou", + "body": "Mení systém. Vždy najprv vytvorí zálohu dotknutého súboru s časovou pečiatkou a pred zápisom zobrazí náhľad.", + "items": [ + "Trvalé názvy rozhraní (súbory .link)", + "Ručné zálohovanie, obnovenie a reštart služby" + ] + } + }, + "classicTitle": "Iba klasický sieťový stack", + "classicBody": "Každá funkcia analýzy a opravy pred zásahom skontroluje aktívneho správcu siete. Ak hostiteľ používa netplan, systemd-networkd alebo NetworkManager, nástroj sa ihneď zastaví s jasným hlásením. Menu podporuje iba klasickú sieťovú konfiguráciu Debian/Proxmox v /etc/network/interfaces. Je to zámerné: úprava súboru netplan podľa pravidiel pre ifupdown by mohla konfiguráciu nepozorovane poškodiť.", + "backups": { + "heading": "Kam sa ukladajú zálohy", + "intro": "Každá oprava so sprievodcom, obnova alebo ručné zálohovanie zapíše kópiu /etc/network/interfaces s časovou pečiatkou do /var/backups/proxmenux/:", + "rollbackIntro": "Na ručné obnovenie predchádzajúceho stavu z konzoly:" + }, + "readOnlySection": { + "heading": "Kontrola len na čítanie", + "body": "Východiskový bod, keď niečo nefunguje správne. Iba kontrola — nikdy nezapisuje do /etc/network/interfaces ani nespúšťa príkazy meniace systém, s jedinou výslovnou výnimkou: úplné odstránenie zisteného NetworkManager vyžaduje váš súhlas. Bezpečné použitie cez SSH kedykoľvek.", + "options": [ + { + "title": "Diagnostika", + "description": "Tri jednorazové kontroly iba na čítanie: Zobraziť smerovaciu tabuľku, Test pripojenia a Pokročilá diagnostika. Iba kontrola — nikdy nezapisuje do systému." + }, + { + "title": "Nástroje na sledovanie v reálnom čase", + "description": "Tri interaktívne spúšťače: iftop (šírka pásma v reálnom čase pre každú dvojicu hostiteľov), iptraf-ng (sledovanie prevádzky vo viacerých režimoch) a iperf3 (test šírky pásma, režim server / klient)." + } + ] + }, + "analyzeSection": { + "heading": "Analyzovať, potom navrhnúť", + "body": "Používajú sa, keď kontrola alebo skutočný výpadok poukazuje na problém konfigurácie. Každý nástroj prejde príslušnú časť /etc/network/interfaces, vypíše podrobnú správu s presným príkazom shellu na opravu každého zistenia a zastaví sa. Ak potom prijmete voliteľnú opravu so sprievodcom, pred každou zmenou sa vytvorí záloha a zmena sa zobrazí pred zápisom.", + "options": [ + { + "title": "Analýza mostov a oprava so sprievodcom", + "description": "Zistí mosty vmbrX s chýbajúcimi alebo neplatnými portmi, typicky po opätovnom číslovaní zariadení PCI. Najprv zobrazí správu a opravu vykoná iba po prijatí postupu so sprievodcom v 5 krokoch." + }, + { + "title": "Analýza konfigurácie a čistenie so sprievodcom", + "description": "Nájde fyzické rozhrania deklarované v /etc/network/interfaces, ktoré už neexistujú — osirelé konfigurácie po zmenách hardvéru. Nahlási ich a ponúkne odstránenie so sprievodcom." + } + ] + }, + "applySection": { + "heading": "Aplikovať so zálohou", + "body": "Tieto nástroje zo svojej podstaty zapisujú na disk. Každý pred zápisom vytvorí zálohu dotknutého súboru s časovou pečiatkou. Deštruktívne možnosti, ako obnova a reštart, vyžadujú výslovné potvrdenie áno/nie. Trvalé názvy rozhraní sa prejavia až pri ďalšom reštarte, nie okamžite, takže ich nastavenie možno bezpečne naplánovať aj na vzdialenom hostiteľovi.", + "options": [ + { + "title": "Trvalé názvy rozhraní", + "description": "Priradí názvy rozhraní (eno1, enp3s0, …) k MAC adresám pomocou súborov .link služby systemd. Názvy zostanú zachované pri zmene slotov PCI, aktualizáciách jadra aj pridávaní alebo odoberaní iných sieťových kariet." + }, + { + "title": "Záloha a reštart rozhraní", + "description": "Ručné vytvorenie snímky /etc/network/interfaces, prehliadanie a obnova predchádzajúcich záloh, zobrazenie aktuálnej konfigurácie a reštart sieťovej služby podľa potreby." + } + ] + }, + "consoleTitle": "Pripravte si prístup ku konzole", + "consoleSubTitle": "Pred akoukoľvek opravou na vzdialenom hostiteľovi", + "consoleBody": "Ak ste pripojení cez SSH a máte iba jednu cestu k hostiteľovi, pred zmenami siete si pripravte náhradný prístup: fyzickú konzolu / IPMI / iKVM alebo iný počítač v rovnakej LAN. Opravy so sprievodcom sú bezpečné a vždy ponúkajú príkaz na vrátenie zmien, ale nesprávne nakonfigurovaný most alebo prerušené spojenie vás aj tak môže pripraviť o prístup, kým sa nedostanete ku konzole." +} diff --git a/web/messages/sk/docs/network/monitoring.json b/web/messages/sk/docs/network/monitoring.json new file mode 100644 index 00000000..6038905a --- /dev/null +++ b/web/messages/sk/docs/network/monitoring.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Nástroje na sledovanie v reálnom čase | Dokumentácia ProxMenux", + "description": "Tri interaktívne spúšťače nástrojov na sledovanie siete: iftop (šírka pásma v reálnom čase pre každú dvojicu hostiteľov), iptraf-ng (sledovanie prevádzky vo viacerých režimoch) a iperf3 (test šírky pásma, režim server / klient). Každý sa nainštaluje pri prvom použití.", + "ogTitle": "Nástroje na sledovanie v reálnom čase | Dokumentácia ProxMenux", + "ogDescription": "Interaktívne monitorovanie siete a testovanie šírky pásma pre Proxmox host: iftop, iptraf-ng, iperf3." + }, + "header": { + "title": "Nástroje na sledovanie v reálnom čase", + "description": "Tri interaktívne spúšťače na sledovanie siete v reálnom čase a meranie šírky pásma: iftop, iptraf-ng a iperf3. Každý nástroj sa pri prvom použití automaticky nainštaluje cez apt, beží v popredí a ukončuje sa uvedeným klávesom. Nemenia sieťovú konfiguráciu hostiteľa; iperf3 generuje testovaciu prevádzku.", + "section": "Sieť" + }, + "intro": { + "title": "Čo to robí?", + "body": "Tri interaktívne monitorovacie nástroje, každý za vlastným vstupom do menu. Pri prvom spustení jedného sa balík inštaluje ticho cez apt-get. Následné štarty začínajú okamžite. Žiadny z týchto nástrojov nemení konfiguráciu hostiteľskej siete." + }, + "when": { + "heading": "Kedy použiť ktorý", + "headerQuestion": "Otázka", + "headerUse": "Použitie", + "rows": [ + { + "question": "Kto vyťažuje spojenie práve teraz?", + "use": "iftop" + }, + { + "question": "Aké členenie protokolu / veľkosti paketov / toky TCP prúdia?", + "use": "iptraf-ng" + }, + { + "question": "Koľko šírky pásma je skutočne k dispozícii medzi dvoma hostiteľmi?", + "use": "iperf3" + } + ] + }, + "iftop": { + "heading": "Sieťová prevádzka v reálnom čase (iftop)", + "body": "Šírka pásma v reálnom čase pre dvojice hostiteľov (zdroj ↔ cieľ) — ako top pre sieťovú prevádzku. Najväčšie toky zobrazuje navrchu s kĺzavými priemermi za 2/10/40 sekúnd. Najlepší nástroj na otázku „Prečo je moje odchádzajúce spojenie vyťažené?“.", + "exit": "Ukončenie: stlačte q. ProxMenux pred spustením zobrazí pripomenutie.", + "keysTitle": "Užitočné klávesy v iftop", + "keysBody": "n prepína vyhľadávanie DNS, p zobrazuje čísla portov, P pozastaví zobrazenie, t prepína smer riadku (odoslané / prijaté / oboje), 1/2/3 zoradí podľa priemeru za 2 s / 10 s / 40 s. Úplný zoznam nájdete v man iftop." + }, + "iptraf": { + "heading": "Nástroj na sledovanie siete (iptraf-ng)", + "intro": "Nástroj na sledovanie prevádzky vo viacerých režimoch, ovládaný cez menu. iftop odpovedá na „kto“, iptraf-ng na „čo“: počty bajtov a paketov podľa protokolu, sledovanie stavu spojení TCP, histogramy veľkosti paketov a aktivita LAN podľa stanice.", + "menuIntro": "Pri spustení dostanete ponuku piatich možností:", + "headerMode": "Režim", + "headerUseFor": "Použiť pre", + "rows": [ + { + "mode": "Monitor prevádzky IP", + "useFor": "Zoznam tokov TCP / UDP / ICMP / iných protokolov IP v reálnom čase s počítadlami bajtov a stavom pripojenia" + }, + { + "mode": "Všeobecné štatistiky rozhraní", + "useFor": "Súhrnný počet paketov IPv4 / IPv6 / TCP / UDP / ICMP / non-IP paketov na sieťovú kartu" + }, + { + "mode": "Podrobné štatistiky rozhrania", + "useFor": "Rovnaké ako vyššie, ale pre jedno rozhranie, s podrobnosťami o veľkosti a rýchlosti paketov" + }, + { + "mode": "Štatistické členenia", + "useFor": "Histogram rozdelenia veľkosti paketov podľa portu TCP / UDP" + }, + { + "mode": "Monitor stanice LAN", + "useFor": "Štatistiky prevádzky podľa MAC adresy pre lokálnu broadcastovú doménu" + } + ], + "exit": "Ukončenie: stlačte x v ľubovoľnom zobrazení alebo Q v hlavnom menu. ProxMenux pred spustením zobrazí pripomenutie.", + "logTitle": "Zaznamenávanie zachytených údajov do súboru", + "logBody": "Každý režim ponúka zápis zachytených štatistík do /var/log/iptraf-ng/. Ak potrebujete záznam špičky prevádzky, nechajte nástroj bežať, zapisujte do súboru a skontrolujte ho neskôr namiesto sledovania obrazovky v reálnom čase." + }, + "iperf3": { + "heading": "Test priepustnosti (iperf3)", + "intro1": "Meria skutočnú priepustnosť TCP medzi dvoma hostiteľmi. Na rozdiel od iftop / iptraf-ng, ktoré sledujú existujúcu prevádzku, iperf3 generuje syntetickú prevádzku na záťažový test spojenia. Nevyhnutné pri otázkach ako „Dosahuje moje 10 GbE skutočne 10 GbE?“ alebo „Je úzkym miestom sieťová karta, prepínač alebo úložisko?“.", + "intro2": "iperf3 je nástroj pre dvoch hostiteľov: jeden beží ako server a načúva na porte TCP 5201, druhý ako klient, ktorý sa pripojí, odošle údaje a vypíše rýchlosť. Spúšťač ProxMenux sa opýta na požadovaný režim:", + "headerMode": "Režim", + "headerBehaviour": "Správanie", + "headerCli": "Ekvivalentný príkaz CLI", + "rows": [ + { + "mode": "Server", + "behaviour": "Načúva na porte TCP 5201 a vypíše výsledky každého prichádzajúceho testu. Ukončí sa cez Ctrl+C.", + "cli": "iperf3 -s" + }, + { + "mode": "Klient", + "behaviour": "Vyžiada IP adresu alebo názov servera, pripojí sa, spustí predvolený 10-sekundový test a vypíše správu.", + "cli": "iperf3 -c " + } + ], + "workflowIntro": "Typický pracovný postup na testovanie 10 GbE spojenia medzi dvoma hostiteľmi Proxmox:", + "workflow": [ + "Na hostiteľovi A otvorte menu Sieť → Test priepustnosti (iperf3) → vyberte Server.", + "Na hostiteľovi B otvorte rovnakú položku ponuky → vyberte Klient → zadajte IP hostiteľa A.", + "Počkajte 10 sekúnd. Porovnajte nameranú rýchlosť s teoretickým maximom spojenia." + ], + "sample": "Vzorový výstup klienta:", + "flagsTitle": "Užitočné voľby pri ručnom spustení zo shellu", + "flagsBody": "-t 60 dlhší test (60 s namiesto 10 s), -P 4 4 paralelné toky (rýchlejšie vyťažia spojenie), -R opačný smer (server → klient), -u -b 100M test UDP pri 100 Mbit/s (meranie kolísania oneskorenia a straty paketov), -p 5202 iný port (viac testov súčasne). Úplný zoznam nájdete v man iperf3.", + "firewallTitle": "Otvoriť firewall port na serveri", + "firewallBody": "Server predvolene načúva na porte TCP 5201. Ak ho spustíte na hostiteľovi Proxmox s prísnym firewallom na úrovni dátového centra alebo hostiteľa, počas testu povoľte prichádzajúce TCP 5201 z IP adresy klienta a potom port opäť zatvorte. To isté platí pre nftables / iptables na fyzických hostiteľoch." + }, + "install": { + "heading": "Prvé spustenie nainštaluje balík", + "body": "Všetky tri spúšťače overia prítomnosť programu a ak chýba, spustia apt-get update -qq && apt-get install -y <pkg>. Inštalácia prebieha bez výpisu: pri prvom použití môže menu pôsobiť zamrznuto 10–30 sekúnd. Ďalšie spustenia sú okamžité." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "hangTitle": "Inštalácia visí navždy pri prvom spustení", + "hangBody": "Hostiteľ nemá internet alebo apt repo sú nedosiahnuteľné. Zrušiť pomocou Ctrl+C, spustiť apt-get update ručne vidieť skutočnú chybu (DNS, repo podpis, proxy ...), potom sa vrátiť do menu.", + "refusedTitle": "Klient iperf3: „unable to connect to server: Connection refused“", + "refusedBody": "Server buď nebeží, alebo jeho firewall blokuje TCP 5201. Na serveri overte cez ss -tlnp | grep 5201, že iperf3 načúva. Ak načúva, ale klient stále zlyháva, skontrolujte firewally na trase medzi hostiteľmi.", + "slowTitle": "iperf3 hlási výrazne nižšiu rýchlosť, než sa od spojenia očakáva", + "slowBody": "Bežné príčiny v poradí pravdepodobnosti: (1) CPU jedného hostiteľa je úzkym miestom — skúste iperf3 -c <target> -P 4 na využitie viacerých jadier; (2) prenos prechádza pomalším spojom, napríklad gigabitovým prepínačom medzi dvoma kartami 10 GbE; (3) nezhodné MTU — skontrolujte ip link show na oboch koncoch; (4) vypnutý NIC offloading — pri karte Intel e1000e pozrite komunitný skript Disable NIC Offloading.", + "noTrafficTitle": "iftop / iptraf-ng nevykazujú žiadnu prevádzku pre rušného hostiteľa", + "noTrafficBody": "Predvolené zachytávanie používa prvé zistené rozhranie. Správne rozhranie zadajte výslovne zo shellu: iftop -i vmbr0 alebo iptraf-ng -i vmbr0. Spúšťač v menu používa predvolené rozhranie; pre iné rozhrania spustite nástroj z konzoly." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Diagnostika", + "href": "/docs/network/diagnostics", + "tail": " — jednorazové kontroly iba na čítanie (smerovanie, pripojenie a pokročilé štatistiky)." + }, + { + "label": "Analýza mostov a oprava so sprievodcom", + "href": "/docs/network/bridge-analysis", + "tail": " — keď sledovanie odhalí, že rozhranie alebo most nefunguje správne." + } + ] + } +} diff --git a/web/messages/sk/docs/network/persistent-names.json b/web/messages/sk/docs/network/persistent-names.json new file mode 100644 index 00000000..bb2a952e --- /dev/null +++ b/web/messages/sk/docs/network/persistent-names.json @@ -0,0 +1,130 @@ +{ + "meta": { + "title": "Trvalé názvy rozhraní | Dokumentácia ProxMenux", + "description": "Priraďte názvy rozhraní Proxmox (eno1, enp3s0, …) k MAC adresám pomocou súborov .link služby systemd, aby zostali zachované pri opätovnom číslovaní PCI, aktualizáciách jadra a pridávaní či odoberaní iných sieťových kariet.", + "ogTitle": "Trvalé názvy rozhraní | Dokumentácia ProxMenux", + "ogDescription": "Zabráňte zmene názvov rozhraní Proxmox pri zmene hardvéru. Používa súbory .link služby systemd s priradením podľa MAC adresy." + }, + "header": { + "title": "Trvalé názvy rozhraní", + "description": "Pre každú fyzickú sieťovú kartu vytvorí súbor .link služby systemd, ktorý priradí názov pridelený jadrom k MAC adrese karty. Po použití pri ďalšom reštarte sa názvy rozhraní prestanú meniť pri pridávaní, odoberaní alebo presúvaní kariet PCIe.", + "section": "Sieť" + }, + "intro": { + "title": "Čo to robí?", + "body": "Pre každú fyzickú sieťovú kartu hostiteľa zapíše malý súbor /etc/systemd/network/10-<iface>.link s pravidlom: „Zariadenie s touto MAC adresou sa musí vždy volať týmto názvom.“ systemd-udevd použije pravidlo pri každom štarte skôr, než ifupdown prečíta /etc/network/interfaces." + }, + "problem": { + "heading": "Problém, ktorý rieši", + "intro": "Linux odvodzuje predvolené názvy rozhraní z topológie PCI — eno1 = integrovaná karta, enp3s0 = karta na zbernici PCI 3, slot 0 atď. Schéma názvov je deterministická pri rovnakom rozložení hardvéru. Ak sa rozloženie zmení, zmenia sa aj názvy:", + "items": [ + "Pridanie GPU pred existujúcu sieťovú kartu → číslo zbernice sieťovej karty sa môže zmeniť → zmení sa názov.", + "Presunutie karty do iného slotu PCIe → zmení sa názov.", + "Aktualizácia BIOS / UEFI s opätovným číslovaním zariadení → názvy sa môžu zmeniť.", + "Nahradenie chybnej karty rovnakým modelom v inom slote → zmení sa názov." + ], + "outro": "Po takejto zmene /etc/network/interfaces stále odkazuje na starý názov; most sa neaktivuje a hostiteľ stratí sieťové pripojenie. Nastavenie trvalých názvov zabráni opakovaniu tejto situácie." + }, + "howWorks": { + "heading": "Ako to funguje", + "arrowLabel": "na NIC", + "nodes": { + "detectLabel": "Zistiť fyzické sieťové karty", + "detectDetail": "ls /sys/class/net/\nvylúčiť vmbr / bond /\ndocker / veth / wireguard …", + "readLabel": "Prečítať každú MAC adresu", + "readDetail": "cat /sys/class/net/\n '<'iface'>'/address", + "writeLabel": "Zapísať súbor .link", + "writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link" + }, + "minimalIntro": "Každý vygenerovaný súbor je zámerne minimálny:", + "minimalOutro": "Pri štarte systemd-udevd identifikuje zariadenie podľa MAC adresy a pridelí požadovaný názov skôr, než zasiahnu iné komponenty (ifupdown, predvolené pomenovanie jadra). Predpona 10- zabezpečuje skoré načítanie pravidiel pred predvoleným súborom 99-default.link." + }, + "scope": { + "heading": "Čo sa napíše, čo sa preskočí", + "headerType": "Typ", + "headerBehaviour": "Správanie", + "headerWhy": "Prečo?", + "rows": [ + { + "type": "Integrovaná / PCIe sieťová karta", + "behaviour": "Zapíše sa súbor .link", + "why": "Zodpovedá skutočnému zariadeniu PCI — prípad, pre ktorý je nástroj určený" + }, + { + "type": "Wi-Fi (phy80211)", + "behaviour": "Zapíše sa súbor .link", + "why": "Má skutočnú MAC adresu a využije stabilný názov" + }, + { + "type": "Mosty (vmbrX)", + "behaviour": "Preskočené", + "why": "Virtuálne; meno pochádza z /etc/network/interfaces" + }, + { + "type": "Bondy (bondX)", + "behaviour": "Preskočené", + "why": "Virtuálne; názov bondu nastavuje ifupdown" + }, + { + "type": "veth / docker0 / br-XXXX", + "behaviour": "Preskočené", + "why": "Vytvárané podľa potreby systémom Docker / LXC — nejde o trvalý hardvér" + }, + { + "type": "tap / fwpr / fwln", + "behaviour": "Preskočené", + "why": "Vytvárané podľa potreby systémom Proxmox pre každú VM/CT" + }, + { + "type": "WireGuard / Cilium / Tailscale", + "behaviour": "Preskočené", + "why": "Softvérové rozhrania spravované vlastnými démonmi" + } + ] + }, + "safety": { + "heading": "Ochrana: predchádzajúce súbory .link sa zálohujú", + "intro": "Ak /etc/systemd/network/ už obsahuje .link súbory (z predchádzajúceho spustenia alebo iného nástroja), skopírujú sa do záložného adresára s časovou značkou pred generovaním nových:", + "outro": "Ak chcete vrátiť späť: skopírujte súbory späť zo záložného adresára a reštartujte.", + "rebootTitle": "Prejaví sa pri ďalšom reštarte, nie okamžite", + "rebootBody": "Zmeny súborov .link sa použijú iba pri štarte, keď udev znovu enumeruje zariadenia. Preto nástroj hlási „Zmeny sa použijú po reštarte“. Premenovanie rozhrania za behu je riskantné a nástroj sa oň nepokúša: aktívny vmbr0 s členskými rozhraniami by sa musel prekonfigurovať atómovo. Operácia sa preto odkladá na ďalší čistý štart." + }, + "afterReboot": { + "heading": "Po reštarte", + "intro": "Keď sú názvy napevno priradené, postup pri budúcich zmenách hardvéru je jednoduchý:", + "items": [ + "Vypnite počítač, zmeňte hardvér (pridajte kartu, zmeňte slot, …) a spustite ho.", + "Každý NIC si ponechá svoje predchádzajúce meno, pretože jeho MAC zodpovedá súboru .link.", + "Ak je NIC nahradený (iný MAC), dostane predvolený názov jadra (enp<bus>s<slot>); znovu spustite toto menu pre pridanie položky .link pre MAC novej karty." + ] + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "emptyTitle": "\"Nenájdené žiadne fyzické rozhrania\" po spustení nástroja", + "emptyBody": "Jadro na hostiteľovi nevidí žiadne rozhrania založené na PCI / phy80211. Overte to cez ls -l /sys/class/net/ — každá položka by mala obsahovať symbolický odkaz device (PCI) alebo položku phy80211 (Wi-Fi). Ak pri skutočnej sieťovej karte chýbajú obe, ovládač nie je načítaný.", + "noChangeTitle": "Po reštarte sa mená nezmenili podľa očakávania.", + "noChangeBody": "Skontrolujte, či súbor existuje a má správny formát: cat /etc/systemd/network/10-<iface>.link. Potom skontrolujte záznamy udev: journalctl -u systemd-udevd -b | grep -i link. Bežnou príčinou je starý parameter jadra net.ifnames=0, ktorý úplne vypína predvídateľné názvy — odstráňte ho z /etc/default/grub, spustite update-grub a reštartujte.", + "undoTitle": "Chcem zrušiť trvalé pomenovanie.", + "undoBody": "Buď odstráňte súbory .link (rm /etc/systemd/network/10-*.link), alebo ich obnovte z adresára záloh vytvoreného pri predchádzajúcom spustení. Zmenu použijete reštartom." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Analýza mostov a oprava so sprievodcom", + "href": "/docs/network/bridge-analysis", + "tailRich": " — postup obnovy, keď sa názvy už zmenili." + }, + { + "label": "Analýza konfigurácie a čistenie so sprievodcom", + "href": "/docs/network/config-analysis", + "tail": " — na odstránenie osirelých blokov, ktoré zostali po zmenách názvov." + }, + { + "label": "Diagnostika", + "href": "/docs/network/diagnostics", + "tailRich": " — po reštarte overte nové názvy cez Zobraziť smerovaciu tabuľku." + } + ] + } +} diff --git a/web/messages/sv/docs/network/backup-restore.json b/web/messages/sv/docs/network/backup-restore.json new file mode 100644 index 00000000..6b0269b3 --- /dev/null +++ b/web/messages/sv/docs/network/backup-restore.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Säkerhetskopiering och omstart av gränssnitt | ProxMenux-dokumentation", + "description": "Ta manuella ögonblicksbilder, bläddra bland och återställ säkerhetskopior av /etc/network/interfaces som lagras i /var/backups/proxmenux/. Inkluderar omstart av nätverkstjänsten med bekräftelse och en snabbvy av den aktuella konfigurationen.", + "ogTitle": "Säkerhetskopiering och omstart av gränssnitt | ProxMenux-dokumentation", + "ogDescription": "Ta en ögonblicksbild och återställ Proxmox nätverkskonfiguration; starta om nätverkstjänsten med bekräftelse." + }, + "header": { + "title": "Säkerhetskopiering och omstart av gränssnitt", + "description": "Fyra verktyg för /etc/network/interfaces: ta en manuell ögonblicksbild, visa aktuell konfiguration, återställa en tidigare säkerhetskopia med valfri förhandsvisning och starta om nätverkstjänsten med uttryckligt samtycke. Samma katalog för säkerhetskopior används av de guidade reparationerna.", + "section": "Nätverk" + }, + "intro": { + "title": "Vad detta gör", + "body": "Hanterar samma katalog för säkerhetskopior som de guidade reparationerna (/var/backups/proxmenux/). Du kan ta en extra ögonblicksbild före manuella ändringar, bläddra bland alla befintliga säkerhetskopior och återställa vilken som helst — alltid med en ny automatisk säkerhetskopia före återställningen som ett andra skydd." + }, + "shared": { + "heading": "Den gemensamma katalogen för säkerhetskopior", + "intro": "Varje säkerhetskopia som tas någonstans i nätverksmenyn landar på samma ställe:", + "outro": "Filnamnen är tidsstämplade och sorterade efter datum, och filerna skrivs aldrig över. Katalogen skapas vid första användningen." + }, + "show": { + "heading": "Visa nätverkskonfigurationsfil", + "body": "Skriver ut /etc/network/interfaces oförändrad i terminalen. Skrivskyddat. Användbart som kontroll före säkerhetskopiering eller efter återställning. Det finns inget separat verktyg för att jämföra med föregående säkerhetskopia, så att granska den aktuella filen är det enklaste sättet att kontrollera innehållet." + }, + "create": { + "heading": "Skapa nätverksbackup", + "body": "Kopierar den nuvarande /etc/network/interfaces i backupkatalogen med en ny tidsstämpel. Det är det - ingen analys, inga prompts, bara en ögonblicksbild.", + "whenTitle": "När man tar en manuell backup", + "whenBody": "Innan du redigerar /etc/network/interfaces för hand, installerar ett paket som kan ändra nätverksstacken (till exempel NetworkManager eller Open vSwitch) eller gör en maskinvaruändring. De guidade reparationerna tar redan ögonblicksbilder automatiskt — det här alternativet är för manuella ingrepp." + }, + "restore": { + "heading": "Återställ nätverkssäkerhetskopia", + "intro": "Listar alla säkerhetskopior i /var/backups/proxmenux/ från nyast till äldst och vägleder genom en återställning med skyddsåtgärder:", + "steps": [ + { + "title": "1. Välj en backup", + "body": "En meny listar varje säkerhetskopia med dess tidsstämpel. Om det inte finns några säkerhetskopior avslutas flödet med ett tydligt meddelande.", + "tone": "blue" + }, + { + "title": "2. Valfri förhandsvisning", + "body": "Erbjuder att öppna den valda säkerhetskopian i en rullningsbar vy innan återställningen bekräftas. Ja är standardvalet — hoppa inte över detta på en fjärransluten värd.", + "tone": "blue" + }, + { + "title": "3. Säkerhetskopiering före återställning", + "body": "Tar ytterligare en säkerhetskopia av det aktuella tillståndet innan /etc/network/interfaces skrivs över. Återställning är i sig en destruktiv åtgärd, så den nya ögonblicksbilden före återställningen gör att du kan gå tillbaka om du valde fel säkerhetskopia.", + "tone": "amber" + }, + { + "title": "4. Applicera återställningen", + "body": "Skriver den valda säkerhetskopian över /etc/network/interfaces. Filen har ändrats på disk, men kärnans aktuella tillstånd speglar fortfarande den tidigare konfigurationen.", + "tone": "amber" + }, + { + "title": "5. Valfri omstart", + "body": "Frågar om systemctl restart networking ska köras nu. Avböj för att skjuta upp ändringen till nästa omstart.", + "tone": "emerald" + } + ], + "autoBackupTitle": "En återställning tar sin egen backup automatiskt", + "autoBackupBody": "När du väljer Återställ nätverkssäkerhetskopia tas alltid en ny ögonblicksbild av den aktuella konfigurationen innan den skrivs över. Om du återställer fel säkerhetskopia innehåller den senaste filen i /var/backups/proxmenux/ tillståndet du hade före återställningen." + }, + "restart": { + "heading": "Starta om nätverkstjänsten", + "body": "Kör systemctl restart networking efter en ja/nej-bekräftelse. Rapporterar resultatet med msg_ok / msg_error. De flesta flöden i menyn erbjuder redan en omstart i slutet. Detta alternativ används efter en manuell ändring eller om du tidigare avböjt den erbjudna omstarten.", + "warnTitle": "Kort frånkoppling garanteras; permanent frånkoppling är möjlig", + "warnBody": "Omstart av networking tar ned och konfigurerar om alla gränssnitt som deklareras i /etc/network/interfaces. SSH-sessioner via dessa gränssnitt bryts. Om den nya konfigurationen är ogiltig kommer nätverket inte tillbaka. Kör endast detta när:", + "warnItems": [ + "Du har konsolåtkomst / IPMI / iKVM redo, eller", + "Du befinner dig fysiskt bredvid maskinen, eller", + "Du har precis återställt en konfiguration som du vet fungerar och vill tillämpa den." + ] + }, + "manualRollback": { + "heading": "Manuell återgång från en konsol", + "intro": "Om du inte kan nå menyn (ingen SSH, dialog kraschar, ...) men kan nå en konsol, är återgång två kommandon:", + "outro": "Det är samma åtgärd som menyn utför, bara inmatad för hand. Om networking fortfarande inte startar, kontrollera journalctl -u networking -b för att hitta det bakomliggande syntax- eller drivrutinsfelet." + }, + "troubleshoot": { + "heading": "Felsökning", + "noneTitle": "”Inga säkerhetskopior hittades” vid återställning", + "noneBody": "Katalogen /var/backups/proxmenux/ finns inte eller innehåller inga interfaces_backup_*-filer. Kör Skapa nätverksbackup minst en gång eller en guidad reparation som tar en säkerhetskopia automatiskt. Bekräfta med ls /var/backups/proxmenux/.", + "unreachTitle": "Omstart av nätverket lyckas men värden är fortfarande onåbar", + "unreachBody": "Den nya konfigurationen är fel eller tilldelar inte din IP-adress för administration. Återställ från konsolen (se ovan). Använd sedan brygganalys och konfigurationsanalys för att förstå felet innan du tillämpar den igen.", + "emptyTitle": "Förhandsvisningen för återställning visar en tom fil", + "emptyBody": "Säkerhetskopian är tom (0 byte). Det händer om en kopiering misslyckats utan felmeddelande under en tidigare körning. Välj en äldre säkerhetskopia eller kör Skapa nätverksbackup igen nu om den aktuella konfigurationen fungerar." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Brygganalys och guidad reparation", + "href": "/docs/network/bridge-analysis", + "tail": " — Den vanligaste orsaken till att en säkerhetskopia hamnar här." + }, + { + "label": "Konfigurationsanalys och guidad rensning", + "href": "/docs/network/config-analysis", + "tailRich": " - skriver också till /var/backups/proxmenux/ automatiskt." + }, + { + "label": "Diagnostik", + "href": "/docs/network/diagnostics", + "tail": " — för att verifiera det aktuella tillståndet efter en återställning." + } + ] + } +} diff --git a/web/messages/sv/docs/network/bridge-analysis.json b/web/messages/sv/docs/network/bridge-analysis.json new file mode 100644 index 00000000..24d477a6 --- /dev/null +++ b/web/messages/sv/docs/network/bridge-analysis.json @@ -0,0 +1,132 @@ +{ + "meta": { + "title": "Brygganalys och guidad reparation | ProxMenux-dokumentation", + "description": "Upptäcker vmbrX-bryggor med saknade eller ogiltiga fysiska portar, vanligen efter omnumrering av PCI-enheter. Rapporterar dem med föreslagna skalkommandon och erbjuder guidad reparation i 5 steg med obligatorisk säkerhetskopia.", + "ogTitle": "Brygganalys och guidad reparation | ProxMenux-dokumentation", + "ogDescription": "Granska och reparera Proxmox bryggportar efter maskinvaruändringar med ett guidat flöde som ger säker återställning." + }, + "header": { + "title": "Brygganalys och guidad reparation", + "description": "Granskar varje vmbrX-brygga i /etc/network/interfaces, kontrollerar att dess fysiska portar finns och erbjuder stegvis reparation om de saknas. Analysen är skrivskyddad; reparationen kräver godkännande, visar en förhandsvisning och tar en säkerhetskopia.", + "section": "Nätverk" + }, + "intro": { + "title": "Vad detta gör", + "body": "Läser varje brygga i /etc/network/interfaces, granskar dess bridge-ports-rad och kontrollerar att varje deklarerad port, till exempel enp3s0, finns på värden. Om en port saknas föreslås en ersättning och ändringen tillämpas med uttryckligt samtycke i flödet säkerhetskopiera, förhandsvisa, tillämpa, verifiera." + }, + "when": { + "heading": "När du behöver detta", + "intro": "Linux tilldelar förutsägbara gränssnittsnamn från PCI topologi och slot order. Flera händelser blandar dem och lämnar /etc/network/interfaces med hänvisning till namn som inte längre finns:", + "items": [ + "Lägga till eller ta bort ett PCIe-kort (en NIC, en GPU, en HBA, en NVMe-bärare).", + "Flytta ett befintligt kort till en annan PCIe slot.", + "BIOS-/UEFI-uppdateringar som numrerar om PCI-enheter.", + "Flytta startdisken till annan maskinvara." + ], + "outro": "Efter nästa start försöker bryggan ansluta till en port som inte längre finns. Den kan inte aktiveras och värden förlorar nätverksanslutningen. Beständiga gränssnittsnamn förhindrar att detta händer igen. Om du redan är utelåst visar den här sidan hur du återställer åtkomsten." + }, + "bigPicture": { + "heading": "Överblick", + "diagram1": { + "arrowLabel": "Steg 1", + "nodes": { + "sourceLabel": "/etc/network/interfaces", + "sourceDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports enp3s0", + "bridgeLabel": "Analysera (skrivskyddat)", + "bridgeDetail": "ip link show enp3s0\n→ finns inte", + "targetLabel": "Rapport + förslag", + "targetDetail": "❌ enp3s0: HITTADES INTE\nErsätt med: eno1\n(inga ändringar ännu)" + } + }, + "diagram2": { + "arrowLabel": "tillämpa med säkerhetskopia", + "nodes": { + "sourceLabel": "Guidad reparation", + "sourceDetail": "1. Säkerhetskopiera\n2. Visa aktuell konfiguration\n3. Förhandsvisa ändringar\n4. Tillämpa\n5. Verifiera", + "targetLabel": "/etc/network/interfaces (ny)", + "targetDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports eno1" + } + } + }, + "step1": { + "heading": "Steg 1: analys (skrivskyddad)", + "intro": "När du väljer Analysera bryggkonfiguration avbryts verktyget direkt om värden inte använder den klassiska Debian/Proxmox-stacken. Annars granskas varje brygga och följande rapporteras:", + "items": [ + "Bryggnamn, aktuell status (UP / DOWN), tilldelad IP.", + "Varje deklarerad port och om den för närvarande finns (ip link show <port>).", + "För varje ogiltig port: en föreslagen ersättning (det första tillgängliga fysiska gränssnittet) och det exakta sed-kommandot för att tillämpa ändringen manuellt.", + "Broar utan bridge-ports alls och föräldralösa auto-poster (ingen matchande iface-block)." + ], + "readonlyTitle": "Garanti för skrivskyddad analys", + "readonlyBody": "Fram till denna punkt har skriptet inte kört ett enda kommando som ändrar systemet. Du kan lämna analysen öppen, kopiera de föreslagna sed-kommandona och tillämpa dem manuellt om du vill, eller godkänna nästa fråga för att gå vidare till den guidade reparationen." + }, + "step2": { + "heading": "Steg 2: guidad reparation (5 steg)", + "intro": "Startas bara om du godkänner frågan i slutet av analysen. Varje steg visar vad som kommer att ske och ber om bekräftelse innan flödet fortsätter.", + "steps": [ + { + "title": "1. Säkerhetskopia", + "body": "Kopierar /etc/network/interfaces till /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Den exakta sökvägen visas före och efter kopieringen, tillsammans med återställningskommandot.", + "tone": "blue" + }, + { + "title": "2. Granska nuvarande konfiguration", + "body": "Öppnar live /etc/network/interfaces i en rullningsbar dialog så att du kan se exakt vad som ska ändras.", + "tone": "blue" + }, + { + "title": "3. Förhandsgranska föreslagna ändringar", + "body": "Listar exakt vilka bryggor som berörs och vilka portbyten som planeras. Om ingen reparation längre behövs eftersom porten har dykt upp igen mellan kontrollerna avslutas flödet med ”Inga ändringar behövs.”", + "tone": "blue" + }, + { + "title": "4. Tillämpa ändringarna", + "body": "För varje drabbad bro kör sed -i \"/iface $bridge/,/bridge-ports/ s/bridge-ports.*/bridge-ports $new_ports/\" mot /etc/network/interfaces. Om en bro inte hade någon giltig ersättning tillgänglig, är ersättningen hoppad och rapporterad i steg 5.", + "tone": "amber" + }, + { + "title": "5. Verifiering", + "body": "Läser filen igen och bekräftar att varje bryggas nya port finns. Skriver ut återställningskommandot (cp <backup> /etc/network/interfaces). Erbjuder slutligen Starta om nätverket — godkänn bara om du har konsolåtkomst som reserv.", + "tone": "emerald" + } + ], + "restartTitle": "Omstart av nätverket ≠ riskfri återställning", + "restartBody": "Reparationen skrivs till disk oavsett om du startar om tjänsten. systemctl restart networking tillämpar ändringen nu, vilket kan bryta SSH-sessionen om den nya porten är fel. Om du avböjer börjar ändringen ändå gälla vid nästa omstart — kontrollera först den nya konfigurationen eller återställ med det utskrivna kommandot." + }, + "edits": { + "heading": "Vad blir redigerat (exakt)", + "body": "Endast bridge-ports-raden för varje berörd brygga. Andra direktiv (address, netmask, gateway, bridge-stp, …) lämnas orörda. Skriptet skapar eller tar aldrig bort iface-block i detta flöde — det sköts av konfigurationsanalys & rensning." + }, + "troubleshoot": { + "heading": "Felsökning", + "unsupportedTitle": "Analysen avbryts med ”Nätverksstacken stöds inte”", + "unsupportedBody": "Värden kör netplan, systemd-networkd eller NetworkManager. Verktyget stöder endast /etc/network/interfaces. Byt först till den klassiska stacken eller redigera konfigurationen med nätverkshanterarens egna verktyg, till exempel netplan apply.", + "noSuggestTitle": "Inget förslag trycks för en ogiltig port", + "noSuggestBody": "Värden har noll fria fysiska gränssnitt (allt är antingen redan i en annan bro eller inte existerar). Analysen faller tillbaka för att föreslå bridge-ports none så att bron åtminstone kan komma upp utan en port. Lägg till en NIC eller migrera portar mellan broar manuellt innan du kör.", + "stillDownTitle": "Reparationen slutförs men bron är fortfarande DOWN", + "stillDownBody": "sed uppdaterade filen men systemctl restart networking avböjdes. Kör kommandot manuellt när den nya konfigurationen har kontrollerats eller starta om. Om omstarten godkändes och bryggan fortfarande är DOWN, kör ip link show för att kontrollera att den nya porten finns och granska sedan journalctl -u networking för det verkliga felet: urkopplad kabel, länk som inte förhandlats fram eller port som redan tillhör en annan brygga.", + "lostSshTitle": "Jag förlorade SSH-åtkomst direkt efter att ha startat om nätverk", + "lostSshIntro": "Använd konsol / IPMI / iKVM för att nå värden. Återställ backup:", + "lostSshOutro": "Kör sedan analysen igen från konsolen för att ta reda på varför förslaget inte fungerade, oftast för att ersättningsporten inte är ansluten." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Beständiga gränssnittsnamn", + "href": "/docs/network/persistent-names", + "tail": " — binder namn till MAC-adresser så att problemet inte återkommer." + }, + { + "label": "Konfigurationsanalys och guidad rensning", + "href": "/docs/network/config-analysis", + "tailRich": " — för föräldralösa iface block (den andra hälften av samma problem)." + }, + { + "label": "Säkerhetskopiering och omstart av gränssnitt", + "href": "/docs/network/backup-restore", + "tail": " — manuella ögonblicksbilder och bläddring bland säkerhetskopior för återställning." + } + ] + } +} diff --git a/web/messages/sv/docs/network/config-analysis.json b/web/messages/sv/docs/network/config-analysis.json new file mode 100644 index 00000000..213f14af --- /dev/null +++ b/web/messages/sv/docs/network/config-analysis.json @@ -0,0 +1,122 @@ +{ + "meta": { + "title": "Konfigurationsanalys och guidad rensning | ProxMenux-dokumentation", + "description": "Upptäcker iface-block i /etc/network/interfaces som refererar till fysiska nätverkskort som inte längre finns på värden. Rapporterar dem och erbjuder guidad borttagning i 5 steg med obligatorisk säkerhetskopiering och förhandsvisning av varje block.", + "ogTitle": "Konfigurationsanalys och guidad rensning | ProxMenux-dokumentation", + "ogDescription": "Hitta och ta bort föräldralösa gränssnittsblock kvar av hårdvaruförändringar, med full förhandsgranskning och återgång." + }, + "header": { + "title": "Konfigurationsanalys och guidad rensning", + "description": "Går igenom varje iface-block i /etc/network/interfaces och kontrollerar att det underliggande fysiska nätverkskortet finns kvar. Rapporterar överblivna block efter maskinvaruändringar och erbjuder guidad borttagning med säkerhetskopia, förhandsvisning och bekräftelse för varje block.", + "section": "Nätverk" + }, + "intro": { + "title": "Vad detta gör", + "body": "Identifierar iface-deklarationer vars stödjande NIC inte längre finns på värden (vanligtvis efter att ett nätverkskort har bytts ut eller tagits bort). Erbjuder sedan en guidad rensning som endast tar bort de föräldralösa blocken, med en säkerhetskopia, en förhandsgranskning per sektion och en explicit slutlig bekräftelse." + }, + "differs": { + "heading": "Hur det skiljer sig från brygganalys", + "headerAspect": "Aspekt", + "headerBridge": "Brygganalys", + "headerConfig": "Konfigurationsanalys", + "rows": [ + { + "aspect": "Granskar", + "bridge": "Bryggor (vmbrX) och deras bridge-ports linje", + "config": "Varje iface-block utom loopback, bryggor och bondgränssnitt" + }, + { + "aspect": "Detekterar", + "bridge": "Bryggor som refererar till en port som inte finns", + "config": "Fristående gränssnittsblock för nätverkskort som inte finns" + }, + { + "aspect": "Reparationsåtgärder", + "bridge": "Ersätter portnamnet i bridge-ports", + "config": "Ta bort hela iface-blocket" + }, + { + "aspect": "Exkluderar", + "bridge": "Ingenting – varje bro analyseras", + "config": "Bryggor (vmbrX) och bondgränssnitt (bondX) behålls alltid eftersom de är virtuella och det kan vara normalt att de saknas under start" + } + ], + "outro": "I praktiken kör du ofta båda i denna ordning: först konfigurationsanalys för att ta bort överblivna block, sedan brygganalys för att ändra portkopplingen för bryggor som använde det borttagna gränssnittet." + }, + "step1": { + "heading": "Steg 1: analys (skrivskyddad)", + "intro": "Avbryter omedelbart om värden inte använder den klassiska stacken. Annars listas alla konfigurerade gränssnitt utom loopback med sina tillstånd:", + "virtTitle": "Virtuella gränssnitt skyddas", + "virtBody": "Bryggor (vmbrX) och bondgränssnitt (bondX) är virtuella konstruktioner. De kan av giltiga skäl saknas vid inspektionen, till exempel en brygga som ännu saknar portar. Analysen föreslår därför aldrig att de tas bort, bara fysiska nätverkskort." + }, + "step2": { + "heading": "Steg 2: guidad rensning (5 steg)", + "intro": "Startas bara om du godkänner frågan i slutet av analysen. Varje steg kräver bekräftelse; om du avbryter avslutas flödet utan att skriva.", + "steps": [ + { + "title": "1. Säkerhetskopia", + "body": "Kopierar /etc/network/interfaces till /var/backups/proxmenux/interfaces_backup_<TIMESTAMP>. Sökvägen visas före och efter.", + "tone": "blue" + }, + { + "title": "2. Bekräfta borttagningslistan", + "body": "Listar exakt vilka fysiska gränssnittsblock som ska tas bort. Om nätverkskorten har dykt upp igen mellan analys och rensning, till exempel efter att ett kort satts i igen, avslutas flödet med ”Ingen rensning behövs.”", + "tone": "blue" + }, + { + "title": "3. Förhandsvisa de exakta blocken", + "body": "Öppnar en rullningsbar vy av varje iface-block som skulle raderas, exakt som det står i filen. Här kan du till exempel upptäcka en viktig up-hook som du vill behålla.", + "tone": "blue" + }, + { + "title": "4. Tillämpa borttagningen", + "body": "För varje föräldralös gränssnitt, kör sed -i \"/^iface $iface/,/^$/d\" /etc/network/interfaces. Det tar bort från matchande iface linje upp till nästa tomma rad.", + "tone": "amber" + }, + { + "title": "5. Verifiering", + "body": "Läser filen igen, listar det som togs bort och kontrollerar återstående gränssnitt. Skriver ut återställningskommandot. Startar inte om nätverket automatiskt — borttagning av ett oanvänt block kan säkert tillämpas vid nästa omstart utan att ändra det aktuella tillståndet.", + "tone": "emerald" + } + ], + "noRestartTitle": "Startar inte om nätverket automatiskt", + "noRestartBody": "Till skillnad från bryggreparation erbjuder rensningen ingen omstart av tjänsten. Att ta bort ett oanvänt gränssnittsblock påverkar inte den aktiva konfigurationen direkt, så en omstart är onödig och skulle innebära en onödig risk för anslutningen. Ändringen börjar gälla vid nästa manuella systemctl restart networking eller vid nästa systemomstart." + }, + "caveats": { + "heading": "Viktiga förbehåll", + "boundaryTitle": "Blockgränsen är den första tomma linjen", + "boundaryBody": "sed-mönstret raderar från iface <name> till nästa tomma rad. Om /etc/network/interfaces saknar tomma rader mellan block, vilket är ovanligt men möjligt efter manuell redigering, kan även nästa block tas bort. Därför är steg 3 obligatoriskt: granska förhandsvisningen innan du bekräftar.", + "tandemTitle": "Ett överblivet iface-block som används av en brygga upptäcks här, inte i brygganalysen", + "tandemBody": "Om vmbr0 deklarerar bridge-ports enp3s0 och enp3s0 också har ett eget block iface enp3s0 inet manual lämnar borttagning av enp3s0 en ogiltig referens i vmbr0. Kör brygganalys efter rensningen för att ändra eller ta bort bryggporten. De två flödena är avsedda att användas tillsammans." + }, + "troubleshoot": { + "heading": "Felsökning", + "notFoundTitle": "Analysen visar mitt nya nätverkskort som ”HITTADES INTE”", + "notFoundBody": "Kärnan ser enheten under ett annat namn än det som står i filen. Kör ip link show för att se det verkliga namnet. Det här är precis ett sådant fall där beständiga gränssnittsnamn skulle förhindra problemet framöver.", + "tooMuchTitle": "Städningen tog bort för mycket (ett block jag ville behålla)", + "tooMuchBody": "Återställ från backupen tryckt i steg 5:", + "tooMuchOutro": "Redigera filen för hand för att lägga till en tydlig tom linje mellan block innan du kör rengöring, eller ta bort problematiskt block manuellt.", + "bridgeBreakTitle": "En bro slutar fungera efter rengöring", + "bridgeBreakBody": "Bryggan använde en port vars iface-block just togs bort. Kör brygganalys så föreslås ett befintligt fysiskt gränssnitt för bryggan." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Brygganalys och guidad reparation", + "href": "/docs/network/bridge-analysis", + "tail": " — Den naturliga uppföljningen efter en rengöring." + }, + { + "label": "Beständiga gränssnittsnamn", + "href": "/docs/network/persistent-names", + "tail": " — stoppar föräldralösa block från att ackumulera efter varje hårdvaruförändring." + }, + { + "label": "Säkerhetskopiering och omstart av gränssnitt", + "href": "/docs/network/backup-restore", + "tail": " — manuella ögonblicksbilder och bläddring bland säkerhetskopior för återställning." + } + ] + } +} diff --git a/web/messages/sv/docs/network/diagnostics.json b/web/messages/sv/docs/network/diagnostics.json new file mode 100644 index 00000000..4baf1157 --- /dev/null +++ b/web/messages/sv/docs/network/diagnostics.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Diagnostik | ProxMenux Dokumentation", + "description": "Tre enstaka skrivskyddade diagnostikkontroller: Visa routningstabell, Testa anslutning och Avancerad diagnostik. Ren inspektion — skriver aldrig till /etc/network/interfaces och kör aldrig kommandon som ändrar systemet, med ett uttryckligt undantag: fullständig borttagning av NetworkManager, om det upptäcks, kräver ditt samtycke.", + "ogTitle": "Diagnostik | ProxMenux Dokumentation", + "ogDescription": "Skrivskyddad nätverksdiagnostik för Proxmox-värden: routning, nåbarhet och avancerad statistik." + }, + "header": { + "title": "Diagnostik", + "description": "Tre enstaka skrivskyddade kontroller av nätverkets aktuella tillstånd: routningstabell, anslutningstest och avancerad statistik. Ingen skriver till /etc/network/interfaces — säkra att använda när som helst, även via SSH. För interaktiv övervakning i realtid, se Övervakningsverktyg i realtid.", + "section": "Nätverk" + }, + "intro": { + "title": "Vad detta gör", + "body": "Visar information om routning, nåbarhet och samlad statistik utan att ändra något. Använd verktyget för att kontrollera att nätverket fungerar eller identifiera dubbla IP-adresser. För kontinuerlig trafikövervakning, se Övervakningsverktyg i realtid; för att visa den obearbetade konfigurationsfilen, se Säkerhetskopiering och omstart av gränssnitt." + }, + "routing": { + "heading": "Visa routningstabell", + "body": "Listar alla rutter som kärnan använder för tillfället (ip route show) och markerar standardgatewayen. Användbart för att kontrollera att internettrafiken går genom rätt gränssnitt och att inga kvarvarande gamla rutter har företräde." + }, + "connectivity": { + "heading": "Testa anslutning", + "intro": "Skickar två ICMP-sonder till vart och ett av tre mål i tur och ordning och rapporterar resultatet för varje mål. Kör sedan nslookup google.com för att verifiera DNS-uppslagning oberoende av ICMP.", + "headerTest": "Test", + "headerTarget": "Mål", + "headerConfirms": "Vad den bekräftar", + "rows": [ + { + "test": "Google DNS", + "target": "8.8.8.8", + "confirms": "Extern nåbarhet via en välkänd anycast-IP-adress" + }, + { + "test": "Cloudflare DNS", + "target": "1.1.1.1", + "confirms": "Oberoende andra åsikt om Google blockerar ICMP" + }, + { + "test": "Gateway", + "target": "(standardrutt)", + "confirms": "L2 / L3-anslutning till den lokala routern" + }, + { + "test": "DNS-upplösning", + "target": "google.com", + "confirms": "DNS server är tillgänglig och svarar" + } + ], + "readingTitle": "Läsa resultatet", + "readingBody": "Om gatewaytestet lyckas men de offentliga DNS-målen inte svarar har du lokal anslutning men inget internet — kontrollera gatewayens anslutning uppströms. Om DNS-uppslagning misslyckas men ping till 8.8.8.8 fungerar ligger problemet i DNS-resolvern, inte i nätverket: kontrollera /etc/resolv.conf." + }, + "advanced": { + "heading": "Avancerad diagnostik", + "intro": "Sammanställer statistik för hela nätverket och utför en serie kontroller av vanliga problem. Rapporterar antalet aktiva anslutningar, lyssnande portar och totalt antal gränssnitt samt pekar uttryckligen ut två problematiska konfigurationer:", + "items": [ + "NetworkManager körs på en Proxmox-värd. NetworkManager och Proxmox ifupdown står i konflikt: båda försöker hantera gränssnitten, vilket gör att bryggor växlar mellan aktivt och inaktivt tillstånd eller inte kan aktiveras. Om NetworkManager upptäcks erbjuder verktyget en interaktiv bekräftelse för att stoppa, inaktivera och ta bort det helt (detta är den enda diagnostik som kan ändra systemet, och bara efter uttryckligt samtycke).", + "Dubbla IP-adresser på olika gränssnitt. Två gränssnitt med samma IPv4-adress orsakar intermittenta anslutningsproblem som är mycket svåra att felsöka inifrån en VM. Upptäcks via ip -4 addr show | sort | uniq -d." + ], + "nmTitle": "NetworkManager-prompten är den enda modifierande åtgärden här", + "nmBody": "Alla andra kontroller i Avancerad diagnostik är skrivskyddade. Borttagning av NetworkManager kräver en ja/nej-bekräftelse och kör systemctl stop / disable + apt-get purge -y network-manager. Om du avböjer ändras ingenting." + }, + "troubleshoot": { + "heading": "Felsökning", + "gwTitle": "Testa anslutning rapporterar ett gatewayfel men värden har internetåtkomst", + "gwBody": "Vissa routrar svarar inte på ICMP via sitt interna gränssnitt även om de vidarebefordrar trafiken korrekt. Testa med traceroute 8.8.8.8 från en konsol: om det andra hoppet är din internetleverantör och det offentliga DNS-testet lyckades fungerar gatewayen trots att ping misslyckades.", + "dupTitle": "Avancerad diagnostik fortsätter att rapportera dubbla IP-adresser efter att jag tagit bort en", + "dupBody": "Kontrollen granskar kärnans aktuella tillstånd, inte konfigurationsfilen. Kör ip -4 addr show för att kontrollera. Om dubbletten finns kvar har ett gränssnitt fortfarande adressen. Använd ip addr del <IP>/<mask> dev <iface> för att ta bort den från det aktuella tillståndet och redigera sedan /etc/network/interfaces om den också är beständigt konfigurerad." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Övervakningsverktyg i realtid", + "href": "/docs/network/monitoring", + "tail": " — interaktiva iftop / iptraf-ng / iperf3-startare." + }, + { + "label": "Brygganalys och guidad reparation", + "href": "/docs/network/bridge-analysis", + "tail": " — när en vmbrX saknar sin fysiska port." + }, + { + "label": "Konfigurationsanalys och guidad rensning", + "href": "/docs/network/config-analysis", + "tail": " — när ett gammalt nätverkskort fortfarande deklareras men inte längre finns." + }, + { + "label": "Säkerhetskopiering och omstart av gränssnitt", + "href": "/docs/network/backup-restore", + "tail": " — för att ta en ögonblicksbild av konfigurationen före varje ändring." + } + ] + } +} diff --git a/web/messages/sv/docs/network/index.json b/web/messages/sv/docs/network/index.json new file mode 100644 index 00000000..f8a424ea --- /dev/null +++ b/web/messages/sv/docs/network/index.json @@ -0,0 +1,107 @@ +{ + "meta": { + "title": "Nätverkshantering i Proxmox — Bryggor, bondning, diagnostik, reparation | ProxMenux", + "description": "Skrivskyddad diagnostik, analyser med efterföljande förslag och guidade reparationer för nätverksstacken i Debian / Proxmox (/etc/network/interfaces). Inspektera bryggor och bondgränssnitt, starta övervakningsverktyg i realtid, ge gränssnitt beständiga namn, säkerhetskopiera och starta om nätverket säkert — med obligatoriska säkerhetskopior och förhandsvisning steg för steg.", + "ogTitle": "Nätverkshantering i Proxmox — Bryggor, bondning, diagnostik, reparation", + "ogDescription": "Diagnostik, analys och guidade reparationer för Proxmox nätverksstack med obligatoriska säkerhetskopior och förhandsvisning steg för steg.", + "twitterTitle": "Nätverkshantering i Proxmox | ProxMenux", + "twitterDescription": "Bryggor, bondning, diagnostik och guidade reparationer för Proxmox nätverksstack med obligatoriska säkerhetskopior." + }, + "header": { + "title": "Nätverkshantering", + "description": "Skrivskyddad diagnostik, analysrapporter med efterföljande förslag och guidade reparationer för den klassiska nätverksstacken i Debian/Proxmox. Varje destruktiv åtgärd tar först en säkerhetskopia och visar de exakta ändringarna innan de tillämpas.", + "section": "Nätverk" + }, + "intro": { + "title": "Vad menyn används till", + "body": "Inspektera, diagnostisera och vid behov reparera Proxmox-värdens nätverkskonfiguration utan att förlora fjärråtkomsten. Verktygen följer en princip: läs först, föreslå sedan och tillämpa endast med uttryckligt samtycke och en säkerhetskopia. Det finns ingen knapp som automatiskt åtgärdar allt." + }, + "openingMenu": { + "heading": "Öppna menyn", + "intro": "Välj Nätverk i ProxMenux huvudmeny. Då visas följande:", + "imageAlt": "Nätverkshanteringsmenyn med alternativ för diagnostik, övervakning, analys, reparation, beständiga namn och säkerhetskopiering" + }, + "safety": { + "heading": "Säkerhetsmodellen", + "body": "Att redigera nätverkskonfigurationen på en fjärransluten Proxmox-värd är ett av de enklaste sätten att låsa sig ute. ProxMenux tar hänsyn till det vid varje åtgärd. Verktygen delas in i tre nivåer efter hur de fungerar — välj det kort som motsvarar ditt mål:" + }, + "tiers": { + "readOnly": { + "title": "Skrivskyddad", + "body": "Ren inspektion. Kan inte ändra systemet under några omständigheter.", + "items": [ + "Routningstabell, anslutningstester, avancerad statistik", + "Trafikövervakning i realtid (iftop, iptraf-ng)", + "Bandbreddstest (iperf3)" + ] + }, + "analyze": { + "title": "Analysera, sedan föreslå", + "body": "Upptäcker problem, skriver ut en rapport med föreslagna skalkommandon och stannar sedan. Du avgör om du vill gå vidare till den guidade reparationen.", + "items": [ + "Analys av bryggkonfiguration", + "Nätverkskonfigurationsanalys" + ] + }, + "apply": { + "title": "Tillämpa med säkerhetskopia", + "body": "Ändrar systemet. Tar alltid först en tidsstämplad säkerhetskopia av den berörda filen och visar en förhandsvisning innan den skriver.", + "items": [ + "Beständiga gränssnittsnamn (.link-filer)", + "Manuell säkerhetskopiering, återställning och omstart av tjänsten" + ] + } + }, + "classicTitle": "Endast den klassiska stacken", + "classicBody": "Varje analys- och reparationsfunktion kontrollerar den aktiva nätverkshanteraren innan något ändras. Om värden kör netplan, systemd-networkd eller NetworkManager avbryts verktyget omedelbart med ett tydligt meddelande — menyn stöder endast den klassiska Debian/Proxmox-stacken i /etc/network/interfaces. Det är avsiktligt: att redigera en netplan-fil enligt regler för ifupdown skulle skada konfigurationen utan att det märks.", + "backups": { + "heading": "Var säkerhetskopiorna sparas", + "intro": "Varje guidad reparation, återställning eller manuell säkerhetskopia skriver en tidsstämplad kopia av /etc/network/interfaces till /var/backups/proxmenux/:", + "rollbackIntro": "Så återställer du manuellt från en konsol:" + }, + "readOnlySection": { + "heading": "Skrivskyddad inspektion", + "body": "Börja här när något verkar fel. Ren inspektion — skriver aldrig till /etc/network/interfaces och kör aldrig kommandon som ändrar systemet, med ett uttryckligt undantag: fullständig borttagning av NetworkManager, om det upptäcks, kräver ditt samtycke. Kan användas säkert via SSH när som helst.", + "options": [ + { + "title": "Diagnostik", + "description": "Tre enstaka skrivskyddade kontroller: Visa routningstabell, Testa anslutning och Avancerad diagnostik. Ren inspektion — skriver aldrig till systemet." + }, + { + "title": "Övervakningsverktyg i realtid", + "description": "Tre interaktiva verktygsstartare: iftop (bandbredd i realtid per värdpar), iptraf-ng (trafikövervakning med flera lägen) och iperf3 (bandbreddstest i server- eller klientläge)." + } + ] + }, + "analyzeSection": { + "heading": "Analysera, sedan föreslå", + "body": "Används när en inspektion eller ett verkligt avbrott pekar på ett konfigurationsproblem. Varje verktyg granskar den relevanta delen av /etc/network/interfaces, skriver ut en detaljerad rapport med det exakta skalkommando som skulle åtgärda varje problem och stannar. Om du därefter godkänner den valfria guidade reparationen säkerhetskopieras och förhandsvisas varje ändring innan den skrivs.", + "options": [ + { + "title": "Brygganalys och guidad reparation", + "description": "Upptäcker vmbrX-bryggor med saknade eller ogiltiga portar, vilket är vanligt efter omnumrering av PCI-enheter. Visar först en rapport och reparerar endast om du godkänner det guidade flödet med 5 steg." + }, + { + "title": "Konfigurationsanalys och guidad rensning", + "description": "Hittar fysiska gränssnitt som deklareras i /etc/network/interfaces men inte längre finns, alltså överblivna konfigurationer efter maskinvaruändringar. Rapporterar dem och erbjuder guidad borttagning." + } + ] + }, + "applySection": { + "heading": "Tillämpa med säkerhetskopia", + "body": "Dessa verktyg är avsedda att skriva till disk. Varje verktyg tar först en tidsstämplad säkerhetskopia av den berörda filen, och destruktiva alternativ som återställning och omstart kräver ett uttryckligt ja/nej-svar. Beständiga gränssnittsnamn börjar gälla vid nästa omstart, inte omedelbart, så inställningen kan planeras säkert även på en fjärransluten värd.", + "options": [ + { + "title": "Beständiga gränssnittsnamn", + "description": "Binder gränssnittsnamn (eno1, enp3s0, …) till MAC-adresser via systemds .link-filer. Namnen består när PCI-kort byter plats, kärnan uppgraderas och andra nätverkskort läggs till eller tas bort." + }, + { + "title": "Säkerhetskopiering och omstart av gränssnitt", + "description": "Ta en manuell ögonblicksbild av /etc/network/interfaces, bläddra bland och återställ tidigare säkerhetskopior, visa den aktuella konfigurationen och starta om nätverkstjänsten vid behov." + } + ] + }, + "consoleTitle": "Ha konsolåtkomst redo", + "consoleSubTitle": "Före varje reparation på en fjärransluten värd", + "consoleBody": "Om du är ansluten via SSH och bara har en åtkomstväg till värden bör du ha en reservväg redo innan du ändrar nätverket: fysisk konsol / IPMI / iKVM eller en annan dator i samma LAN. De guidade reparationerna är säkra och erbjuder alltid ett kommando för att återställa ändringarna, men en felkonfigurerad brygga eller en bruten länk kan ändå låsa dig ute tills du kommer åt konsolen." +} diff --git a/web/messages/sv/docs/network/monitoring.json b/web/messages/sv/docs/network/monitoring.json new file mode 100644 index 00000000..6ef3b059 --- /dev/null +++ b/web/messages/sv/docs/network/monitoring.json @@ -0,0 +1,136 @@ +{ + "meta": { + "title": "Övervakningsverktyg i realtid | ProxMenux-dokumentation", + "description": "Tre interaktiva startare för nätverksverktyg: iftop (bandbredd i realtid per värdpar), iptraf-ng (trafikövervakning med flera lägen) och iperf3 (bandbreddstest i server- eller klientläge). Varje verktyg installeras vid första användningen.", + "ogTitle": "Övervakningsverktyg i realtid | ProxMenux-dokumentation", + "ogDescription": "Interaktiv nätverksövervakning och bandbreddstestning för Proxmox värd: iftop, iptraf-ng, iperf3." + }, + "header": { + "title": "Övervakningsverktyg i realtid", + "description": "Tre interaktiva verktygsstartare för nätverksövervakning i realtid och bandbreddsmätning: iftop, iptraf-ng och iperf3. Varje verktyg installeras automatiskt via apt vid första användningen, körs i förgrunden och avslutas med den angivna tangenten. De ändrar inte värdens nätverkskonfiguration; iperf3 genererar testtrafik.", + "section": "Nätverk" + }, + "intro": { + "title": "Vad detta gör", + "body": "Tre interaktiva övervakningsverktyg, var och en bakom sin egen meny. Första gången du startar ett installeras paketet tyst via apt-get. Efterföljande lanseringar börjar omedelbart. Inget av dessa verktyg ändrar värdnätverkskonfigurationen." + }, + "when": { + "heading": "När du ska använda vilken", + "headerQuestion": "Fråga", + "headerUse": "Använd", + "rows": [ + { + "question": "Vem mättar länken just nu?", + "use": "iftop" + }, + { + "question": "Hur ser fördelningen per protokoll, paketstorlekarna och TCP-flödena ut?", + "use": "iptraf-ng" + }, + { + "question": "Hur mycket bandbredd är faktiskt tillgänglig mellan två värdar?", + "use": "iperf3" + } + ] + }, + "iftop": { + "heading": "Nätverksanvändning i realtid (iftop)", + "body": "Bandbredd i realtid per värdpar (källa ↔ destination) — som top för trafik. Visar de största flödena överst med glidande medelvärden över 2/10/40 sekunder. Bästa verktyget för frågan ”Varför är min upplänk mättad?”.", + "exit": "Avsluta: tryck på q. ProxMenux visar en påminnelse före start.", + "keysTitle": "Användbara tangenter i iftop", + "keysBody": "n växlar DNS-uppslagning, p visar portnummer, P pausar visningen, t växlar radens riktning (skickat / mottaget / båda), 1/2/3 sorterar efter medelvärdet över 2 s / 10 s / 40 s. Se man iftop för hela listan." + }, + "iptraf": { + "heading": "Nätverksövervakningsverktyg (iptraf-ng)", + "intro": "En menystyrd trafikövervakare med flera lägen. iftop svarar på ”vem”, medan iptraf-ng svarar på ”vad”: antal byte och paket per protokoll, spårning av TCP-anslutningars tillstånd, histogram över paketstorlekar och LAN-aktivitet per station.", + "menuIntro": "Vid start visas en meny med fem alternativ:", + "headerMode": "Läge", + "headerUseFor": "Använd den för", + "rows": [ + { + "mode": "IP trafikövervakning", + "useFor": "Lista i realtid över TCP-/UDP-/ICMP-/övriga IP-flöden med byteräknare och anslutningstillstånd" + }, + { + "mode": "Allmän gränssnittsstatistik", + "useFor": "Samlat antal IPv4-/IPv6-/TCP-/UDP-/ICMP-/icke-IP-paket per nätverkskort" + }, + { + "mode": "Detaljerad gränssnittsstatistik", + "useFor": "Samma som ovan men för ett gränssnitt, med paketstorlek och hastighetsdetalj" + }, + { + "mode": "Statistisk fördelning", + "useFor": "Histogram över paketstorleksfördelningen per TCP-/UDP-port" + }, + { + "mode": "Övervakning av LAN-stationer", + "useFor": "Per-MAC trafikstatistik för den lokala sändningsdomänen" + } + ], + "exit": "Avsluta: tryck på x i valfri vy eller Q i huvudmenyn. ProxMenux visar en påminnelse före start.", + "logTitle": "Logga insamlade data till fil", + "logBody": "Varje läge erbjuder loggning av insamlad statistik till /var/log/iptraf-ng/. Om du behöver dokumentera en trafikspik kan du låta verktyget köra, logga till fil och granska filen efteråt i stället för att försöka läsa skärmen i realtid." + }, + "iperf3": { + "heading": "Bandbreddstest (iperf3)", + "intro1": "Mäter den faktiska TCP-genomströmningen mellan två värdar. Till skillnad från iftop / iptraf-ng, som observerar befintlig trafik, genererar iperf3 syntetisk trafik för att belastningstesta länken. Oumbärligt för frågor som ”Når min 10 GbE-länk verkligen 10 GbE?” eller ”Är nätverkskortet, switchen eller lagringen flaskhalsen?”.", + "intro2": "iperf3 är ett verktyg för två värdar: den ena kör som server och lyssnar på TCP-port 5201, den andra som klient som ansluter, skickar data och skriver ut hastigheten. ProxMenux-startaren frågar vilket läge du vill använda:", + "headerMode": "Läge", + "headerBehaviour": "Beteende", + "headerCli": "Motsvarande CLI-kommando", + "rows": [ + { + "mode": "Server", + "behaviour": "Lyssnar på TCP 5201 och skriver ut resultat för varje inkommande test. Slutar på Ctrl+C.", + "cli": "iperf3 -s" + }, + { + "mode": "Klient", + "behaviour": "Frågar efter serverns IP-adress eller värdnamn, ansluter, kör standardtestet på 10 sekunder och skriver ut rapporten.", + "cli": "iperf3 -c " + } + ], + "workflowIntro": "Typiskt arbetsflöde för att testa en 10 GbE länk mellan två Proxmox värdar:", + "workflow": [ + "Öppna nätverksmenyn på värd A → Bandbreddstest (iperf3) → välj Server.", + "Öppna samma menyalternativ på värd B → välj Klient → ange IP-adressen för värd A.", + "Vänta 10 sekunder. Jämför den rapporterade hastigheten med länkens teoretiska maximum." + ], + "sample": "Exempel på klientutdata:", + "flagsTitle": "Användbara manuella flaggor (kör från ett skal)", + "flagsBody": "-t 60 längre test (60 s i stället för 10 s), -P 4 4 parallella strömmar (mättar länken snabbare), -R omvänd riktning (server → klient), -u -b 100M UDP-test med 100 Mbit/s (mätning av jitter och paketförlust), -p 5202 annan port (flera tester parallellt). Se man iperf3 för hela listan.", + "firewallTitle": "Öppna brandväggsporten på servern", + "firewallBody": "Servern lyssnar på TCP 5201 som standard. Om du kör servern i en Proxmox-värd med en strikt brandvägg (datacenter eller värdnivå), låt inkommande TCP 5201 från klientens IP för testets varaktighet, stäng sedan den igen. Samma gäller för nftables / iptables på bara värdar." + }, + "install": { + "heading": "Första lanseringen installerar paketet", + "body": "Alla tre startare kontrollerar om programmet finns och kör annars apt-get update -qq && apt-get install -y <pkg>. Installationen sker utan utdata: menyn kan verka frusen i 10–30 sekunder första gången. Senare starter sker omedelbart." + }, + "troubleshoot": { + "heading": "Felsökning", + "hangTitle": "Installationen fastnar vid första start", + "hangBody": "Värden har inget internet eller apt repos är oåtkomliga. Avbryt med Ctrl+C, kör apt-get update manuellt för att se det faktiska felet (DNS, repo signatur, proxy ...), sedan komma tillbaka till menyn.", + "refusedTitle": "iperf3-klient: ”unable to connect to server: Connection refused”", + "refusedBody": "Antingen körs inte servern eller så blockerar dess brandvägg TCP 5201. Kontrollera på servern med ss -tlnp | grep 5201 — det ska visa att iperf3 lyssnar. Om den lyssnar men klienten fortfarande misslyckas, kontrollera brandväggarna på vägen mellan de två värdarna.", + "slowTitle": "iperf3 rapporterar mycket lägre hastighet än förväntat för länken", + "slowBody": "Vanliga orsaker i sannolikhetsordning: (1) en av värdarnas CPU begränsar hastigheten — prova iperf3 -c <target> -P 4 för att använda flera kärnor; (2) trafiken passerar en långsammare länk, till exempel en gigabitswitch mellan två 10 GbE-kort; (3) olika MTU — kontrollera ip link show i båda ändarna; (4) avstängd NIC offloading — se communityskriptet Disable NIC Offloading om du har ett Intel e1000e-kort.", + "noTrafficTitle": "iftop / iptraf-ng visar ingen trafik för en upptagen värd", + "noTrafficBody": "Standardfångst är på det första upptäckta gränssnittet. Ange rätt från skalet: iftop -i vmbr0 eller iptraf-ng -i vmbr0. Menyn launcher använder standarden; för icke-standardgränssnitt, kör från en konsol." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Diagnostik", + "href": "/docs/network/diagnostics", + "tail": " — de enstaka skrivskyddade kontrollerna (routning, anslutning och avancerad statistik)." + }, + { + "label": "Brygganalys och guidad reparation", + "href": "/docs/network/bridge-analysis", + "tail": " — när övervakningen visar att ett gränssnitt eller en brygga inte fungerar som det ska." + } + ] + } +} diff --git a/web/messages/sv/docs/network/persistent-names.json b/web/messages/sv/docs/network/persistent-names.json new file mode 100644 index 00000000..adaf92cf --- /dev/null +++ b/web/messages/sv/docs/network/persistent-names.json @@ -0,0 +1,130 @@ +{ + "meta": { + "title": "Beständiga gränssnittsnamn | ProxMenux-dokumentation", + "description": "Bind Proxmox-gränssnittsnamn (eno1, enp3s0, …) till MAC-adresser via systemds .link-filer så att namnen består vid omnumrering av PCI-enheter, kärnuppgraderingar och när andra nätverkskort läggs till eller tas bort.", + "ogTitle": "Beständiga gränssnittsnamn | ProxMenux-dokumentation", + "ogDescription": "Förhindra att Proxmox gränssnittsnamn ändras när du ändrar maskinvaran. Använder systemds .link-filer med matchning på MAC-adress." + }, + "header": { + "title": "Beständiga gränssnittsnamn", + "description": "Skapar en .link-fil för systemd per fysiskt nätverkskort som binder det kärntilldelade namnet till kortets MAC-adress. När detta tillämpats efter nästa omstart förblir gränssnittsnamnen stabila när du lägger till, tar bort eller flyttar PCIe-kort.", + "section": "Nätverk" + }, + "intro": { + "title": "Vad detta gör", + "body": "För varje fysisk NIC på värden, skriver en liten fil under /etc/systemd/network/10-<iface>.link som säger: \"enheten med denna MAC måste alltid kallas detta namn\" . systemd-udevd tillämpar regeln vid varje start, innan ifupdown läser /etc/network/interfaces." + }, + "problem": { + "heading": "Problemet detta löser", + "intro": "Linux härleder standardnamn för gränssnitt från PCI-topologin — eno1 = inbyggt nätverkskort, enp3s0 = kortet på PCI-buss 3, plats 0 osv. Namnschemat är deterministiskt vid samma maskinvaruplacering. Ändras placeringen kan namnen ändras:", + "items": [ + "Lägg till en GPU före ett befintligt nätverkskort → nätverkskortets bussnummer kan ändras → namnet ändras.", + "Flytta ett kort till en annan PCIe slot → namnändringar.", + "BIOS-/UEFI-uppdatering som numrerar om enheter → namnen kan ändras.", + "Ersätt ett felaktigt kort med samma modell i en annan slot → namnändringar." + ], + "outro": "Efter en sådan ändring refererar /etc/network/interfaces fortfarande till det gamla namnet. Bryggan kan inte aktiveras och värden förlorar nätverksanslutningen. Beständiga namn förhindrar att detta händer igen." + }, + "howWorks": { + "heading": "Hur det fungerar", + "arrowLabel": "per nätverkskort", + "nodes": { + "detectLabel": "Identifiera fysiska nätverkskort", + "detectDetail": "ls /sys/class/net/\nuteslut vmbr / bond /\ndocker / veth / wireguard …", + "readLabel": "Läs varje MAC", + "readDetail": "cat /sys/class/net/\n '<'iface'>'/address", + "writeLabel": "Skriv .link-fil", + "writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link" + }, + "minimalIntro": "Varje genererad fil är avsiktligt minimal:", + "minimalOutro": "Vid start matchar systemd-udevd enheten på MAC-adress och tilldelar det begärda namnet innan andra komponenter (ifupdown, kärnans standardnamngivning) kommer åt den. Filprefixet 10- ser till att reglerna läses in tidigt, före standardfilen 99-default.link." + }, + "scope": { + "heading": "Vad som skrivs och vad som hoppas över", + "headerType": "Typ", + "headerBehaviour": "Beteende", + "headerWhy": "Varför", + "rows": [ + { + "type": "Inbyggt nätverkskort / PCIe-nätverkskort", + "behaviour": ".link-fil skrivs", + "why": "Motsvarar en verklig PCI-enhet — det fall verktyget är avsett för" + }, + { + "type": "Wi-Fi (phy80211)", + "behaviour": ".link-fil skrivs", + "why": "Har en verklig MAC-adress och gynnas av ett stabilt namn" + }, + { + "type": "Bryggor (vmbrX)", + "behaviour": "Överhoppad", + "why": "Virtuell; namn kommer från /etc/network/interfaces" + }, + { + "type": "Bondgränssnitt (bondX)", + "behaviour": "Överhoppad", + "why": "Virtuellt; bondgränssnittets namn anges av ifupdown" + }, + { + "type": "veth / docker0 / br-XXXX", + "behaviour": "Överhoppad", + "why": "Skapas vid behov av Docker / LXC — ingen beständig maskinvara" + }, + { + "type": "tap / fwpr / fwln", + "behaviour": "Överhoppad", + "why": "Skapas vid behov av Proxmox för varje VM/CT" + }, + { + "type": "WireGuard / Cilium / Tailscale", + "behaviour": "Överhoppad", + "why": "Programvarugränssnitt som hanteras av sina egna daemoner" + } + ] + }, + "safety": { + "heading": "Säkerhetsnät: tidigare .link-filer backas upp", + "intro": "Om /etc/systemd/network/ redan innehåller .link-filer från en tidigare körning eller andra verktyg kopieras de till en tidsstämplad säkerhetskopieringskatalog innan de nya skapas:", + "outro": "För att rulla tillbaka: kopiera filerna tillbaka från backupkatalogen och starta om.", + "rebootTitle": "Börjar gälla vid nästa omstart, inte omedelbart", + "rebootBody": "Ändringar i .link-filer tillämpas endast vid start, när udev räknar upp enheterna på nytt. Därför rapporterar verktyget ”Ändringarna tillämpas efter omstart”. Namnbyte på ett aktivt gränssnitt är riskabelt och försöks inte: en aktiv vmbr0 med medlemsgränssnitt skulle behöva konfigureras om atomärt. Åtgärden skjuts därför upp till nästa rena start." + }, + "afterReboot": { + "heading": "Efter omstarten", + "intro": "När namnen är beständigt bundna är arbetsflödet för framtida maskinvaruändringar enkelt:", + "items": [ + "Stäng av, ändra maskinvaran (lägg till kort, byt plats, …) och starta.", + "Varje NIC håller sitt tidigare namn eftersom dess MAC matchar en .link-fil.", + "Om ett nätverkskort ersätts med ett som har en annan MAC-adress får det ett standardnamn från kärnan (enp<bus>s<slot>). Kör menyn igen för att lägga till en .link-post för det nya kortets MAC-adress." + ] + }, + "troubleshoot": { + "heading": "Felsökning", + "emptyTitle": "\"Inga fysiska gränssnitt hittades\" efter att ha kört verktyget", + "emptyBody": "Kärnan ser inga gränssnitt som bygger på PCI / phy80211 på värden. Kontrollera med ls -l /sys/class/net/ — varje post ska ha antingen en symbolisk länk device (PCI) eller en post phy80211 (Wi-Fi). Om båda saknas för ett verkligt nätverkskort är drivrutinen inte inläst.", + "noChangeTitle": "Efter omstarten ändrades inte namnen som förväntat.", + "noChangeBody": "Kontrollera att filen finns och är korrekt formaterad: cat /etc/systemd/network/10-<iface>.link. Kontrollera sedan udev-loggarna: journalctl -u systemd-udevd -b | grep -i link. En vanlig orsak är en kvarvarande kärnparameter net.ifnames=0 som helt inaktiverar förutsägbara namn — ta bort den från /etc/default/grub, kör update-grub och starta om.", + "undoTitle": "Jag vill ångra beständig namngivning", + "undoBody": "Radera antingen .link-filerna (rm /etc/systemd/network/10-*.link) eller återställ dem från säkerhetskopieringskatalogen som skapades vid föregående körning. Starta om för att tillämpa ändringen." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Brygganalys och guidad reparation", + "href": "/docs/network/bridge-analysis", + "tailRich": " — återställningsvägen när namnen redan har ändrats." + }, + { + "label": "Konfigurationsanalys och guidad rensning", + "href": "/docs/network/config-analysis", + "tail": " — för att ta bort föräldralösa block kvar efter namnskiften." + }, + { + "label": "Diagnostik", + "href": "/docs/network/diagnostics", + "tailRich": " — bekräfta de nya namnen med Visa routningstabell efter omstart." + } + ] + } +} From d15876d94021ed850b27cf8c9dc3341a9e871951 Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:08:53 +0200 Subject: [PATCH 15/73] docs: review OCI manager documentation in all seven translations --- .github/workflows/test-i18n.yml | 10 + .../de/docs/oci-manager/architecture.json | 171 ++++++ .../de/docs/oci-manager/custom-image.json | 278 ++++++++++ .../de/docs/oci-manager/hardware.json | 392 ++++++++++++++ web/messages/de/docs/oci-manager/index.json | 213 ++++++++ .../de/docs/oci-manager/lifecycle.json | 499 ++++++++++++++++++ web/messages/de/docs/oci-manager/monitor.json | 213 ++++++++ web/messages/de/docs/oci-manager/stacks.json | 404 ++++++++++++++ .../de/docs/oci-manager/storage-network.json | 305 +++++++++++ .../en/docs/oci-manager/custom-image.json | 2 +- .../en/docs/oci-manager/lifecycle.json | 4 +- .../en/docs/oci-manager/storage-network.json | 2 +- .../es/docs/oci-manager/architecture.json | 111 +++- .../es/docs/oci-manager/custom-image.json | 191 ++++--- .../es/docs/oci-manager/hardware.json | 247 +++++++-- web/messages/es/docs/oci-manager/index.json | 165 ++++-- .../es/docs/oci-manager/lifecycle.json | 8 +- web/messages/es/docs/oci-manager/monitor.json | 8 +- web/messages/es/docs/oci-manager/stacks.json | 246 +++++++-- .../es/docs/oci-manager/storage-network.json | 229 ++++++-- .../fr/docs/oci-manager/architecture.json | 171 ++++++ .../fr/docs/oci-manager/custom-image.json | 278 ++++++++++ .../fr/docs/oci-manager/hardware.json | 392 ++++++++++++++ web/messages/fr/docs/oci-manager/index.json | 213 ++++++++ .../fr/docs/oci-manager/lifecycle.json | 499 ++++++++++++++++++ web/messages/fr/docs/oci-manager/monitor.json | 213 ++++++++ web/messages/fr/docs/oci-manager/stacks.json | 404 ++++++++++++++ .../fr/docs/oci-manager/storage-network.json | 305 +++++++++++ .../it/docs/oci-manager/architecture.json | 171 ++++++ .../it/docs/oci-manager/custom-image.json | 278 ++++++++++ .../it/docs/oci-manager/hardware.json | 392 ++++++++++++++ web/messages/it/docs/oci-manager/index.json | 213 ++++++++ .../it/docs/oci-manager/lifecycle.json | 499 ++++++++++++++++++ web/messages/it/docs/oci-manager/monitor.json | 213 ++++++++ web/messages/it/docs/oci-manager/stacks.json | 404 ++++++++++++++ .../it/docs/oci-manager/storage-network.json | 305 +++++++++++ .../pt/docs/oci-manager/architecture.json | 171 ++++++ .../pt/docs/oci-manager/custom-image.json | 278 ++++++++++ .../pt/docs/oci-manager/hardware.json | 392 ++++++++++++++ web/messages/pt/docs/oci-manager/index.json | 213 ++++++++ .../pt/docs/oci-manager/lifecycle.json | 499 ++++++++++++++++++ web/messages/pt/docs/oci-manager/monitor.json | 213 ++++++++ web/messages/pt/docs/oci-manager/stacks.json | 404 ++++++++++++++ .../pt/docs/oci-manager/storage-network.json | 305 +++++++++++ .../sk/docs/oci-manager/architecture.json | 171 ++++++ .../sk/docs/oci-manager/custom-image.json | 278 ++++++++++ .../sk/docs/oci-manager/hardware.json | 392 ++++++++++++++ web/messages/sk/docs/oci-manager/index.json | 213 ++++++++ .../sk/docs/oci-manager/lifecycle.json | 499 ++++++++++++++++++ web/messages/sk/docs/oci-manager/monitor.json | 213 ++++++++ web/messages/sk/docs/oci-manager/stacks.json | 404 ++++++++++++++ .../sk/docs/oci-manager/storage-network.json | 305 +++++++++++ .../sv/docs/oci-manager/architecture.json | 171 ++++++ .../sv/docs/oci-manager/custom-image.json | 278 ++++++++++ .../sv/docs/oci-manager/hardware.json | 392 ++++++++++++++ web/messages/sv/docs/oci-manager/index.json | 213 ++++++++ .../sv/docs/oci-manager/lifecycle.json | 499 ++++++++++++++++++ web/messages/sv/docs/oci-manager/monitor.json | 213 ++++++++ web/messages/sv/docs/oci-manager/stacks.json | 404 ++++++++++++++ .../sv/docs/oci-manager/storage-network.json | 305 +++++++++++ 60 files changed, 15788 insertions(+), 285 deletions(-) create mode 100644 web/messages/de/docs/oci-manager/architecture.json create mode 100644 web/messages/de/docs/oci-manager/custom-image.json create mode 100644 web/messages/de/docs/oci-manager/hardware.json create mode 100644 web/messages/de/docs/oci-manager/index.json create mode 100644 web/messages/de/docs/oci-manager/lifecycle.json create mode 100644 web/messages/de/docs/oci-manager/monitor.json create mode 100644 web/messages/de/docs/oci-manager/stacks.json create mode 100644 web/messages/de/docs/oci-manager/storage-network.json create mode 100644 web/messages/fr/docs/oci-manager/architecture.json create mode 100644 web/messages/fr/docs/oci-manager/custom-image.json create mode 100644 web/messages/fr/docs/oci-manager/hardware.json create mode 100644 web/messages/fr/docs/oci-manager/index.json create mode 100644 web/messages/fr/docs/oci-manager/lifecycle.json create mode 100644 web/messages/fr/docs/oci-manager/monitor.json create mode 100644 web/messages/fr/docs/oci-manager/stacks.json create mode 100644 web/messages/fr/docs/oci-manager/storage-network.json create mode 100644 web/messages/it/docs/oci-manager/architecture.json create mode 100644 web/messages/it/docs/oci-manager/custom-image.json create mode 100644 web/messages/it/docs/oci-manager/hardware.json create mode 100644 web/messages/it/docs/oci-manager/index.json create mode 100644 web/messages/it/docs/oci-manager/lifecycle.json create mode 100644 web/messages/it/docs/oci-manager/monitor.json create mode 100644 web/messages/it/docs/oci-manager/stacks.json create mode 100644 web/messages/it/docs/oci-manager/storage-network.json create mode 100644 web/messages/pt/docs/oci-manager/architecture.json create mode 100644 web/messages/pt/docs/oci-manager/custom-image.json create mode 100644 web/messages/pt/docs/oci-manager/hardware.json create mode 100644 web/messages/pt/docs/oci-manager/index.json create mode 100644 web/messages/pt/docs/oci-manager/lifecycle.json create mode 100644 web/messages/pt/docs/oci-manager/monitor.json create mode 100644 web/messages/pt/docs/oci-manager/stacks.json create mode 100644 web/messages/pt/docs/oci-manager/storage-network.json create mode 100644 web/messages/sk/docs/oci-manager/architecture.json create mode 100644 web/messages/sk/docs/oci-manager/custom-image.json create mode 100644 web/messages/sk/docs/oci-manager/hardware.json create mode 100644 web/messages/sk/docs/oci-manager/index.json create mode 100644 web/messages/sk/docs/oci-manager/lifecycle.json create mode 100644 web/messages/sk/docs/oci-manager/monitor.json create mode 100644 web/messages/sk/docs/oci-manager/stacks.json create mode 100644 web/messages/sk/docs/oci-manager/storage-network.json create mode 100644 web/messages/sv/docs/oci-manager/architecture.json create mode 100644 web/messages/sv/docs/oci-manager/custom-image.json create mode 100644 web/messages/sv/docs/oci-manager/hardware.json create mode 100644 web/messages/sv/docs/oci-manager/index.json create mode 100644 web/messages/sv/docs/oci-manager/lifecycle.json create mode 100644 web/messages/sv/docs/oci-manager/monitor.json create mode 100644 web/messages/sv/docs/oci-manager/stacks.json create mode 100644 web/messages/sv/docs/oci-manager/storage-network.json diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 2b3e4685..7f4dfb51 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -9,15 +9,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' push: branches: [main, develop] paths: @@ -27,15 +32,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' workflow_dispatch: permissions: diff --git a/web/messages/de/docs/oci-manager/architecture.json b/web/messages/de/docs/oci-manager/architecture.json new file mode 100644 index 00000000..63cb18c1 --- /dev/null +++ b/web/messages/de/docs/oci-manager/architecture.json @@ -0,0 +1,171 @@ +{ + "meta": { + "title": "So wird ein OCI-Image umgesetzt | ProxMenux", + "description": "Vom Image-Repository und der Compose-Datei über eine überprüfbare Vorlage und einen Bereitstellungsplan zu einem nativen LXC unter Proxmox VE – ohne Docker im Container." + }, + "header": { + "title": "So wird ein OCI-Image umgesetzt", + "description": "Vom Image-Repository und der Compose-Datei über eine überprüfbare Vorlage und einen Bereitstellungsplan zu einem nativen LXC, ohne Docker darin zu installieren.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "pipeline", + "title": "Der Umsetzungsablauf", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]", + "labels": { + "repo": "Image-Repository", + "converter": "Konverter", + "template": "JSON-Vorlage", + "blockers": "Keine Hindernisse?", + "no": "Nein", + "yes": "Ja", + "review": "Prüfung / Overlay", + "plan": "Bereitstellungsplan", + "lxc": "Nativer LXC" + } + } + }, + { + "p": "Der Konverter liest das vom Projekt veröffentlichte Image und die Compose-Datei und erzeugt eine JSON-Vorlage. Lassen sich Anforderungen noch nicht umsetzen und verhindern dadurch die Installation, wird die Vorlage vor der Veröffentlichung im Katalog geprüft. Eine Datei mit geprüften Anpassungen, das Overlay, löst diese Hindernisse. Nur Vorlagen ohne verbleibende Hindernisse werden zur Installation angeboten." + } + ] + }, + { + "id": "template", + "title": "Was die Vorlage bewahrt", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Image-Identität", + "body": "Repository, fortlaufend aktualisiertes Tag, Architektur, ermittelter Digest und Quellrevision." + }, + { + "icon": "braces", + "title": "Container-Vertrag", + "body": "Entrypoint, Cmd, Umgebung, Benutzer, Arbeitsverzeichnis, Stoppsignal, Ports und Volumes." + }, + { + "icon": "layers", + "title": "Umsetzung für Proxmox VE", + "body": "Ressourcen, Sicherheit, Mountpoints, Geräte, sysctls und Zustandsprüfungen sowie die jeweils nötigen Anpassungen mit ihrer Begründung." + }, + { + "icon": "shield", + "title": "Kompatibilität", + "body": "Unterstützte Schlüssel, noch nicht umgesetzte Anforderungen, die die Installation verhindern, und der Status jeder Validierung." + } + ] + } + } + ] + }, + { + "id": "sources", + "title": "OCI liefert den Prozess, Compose die Umgebung", + "blocks": [ + { + "table": { + "headers": [ + "Quelle", + "Beispiel", + "Natives Ergebnis" + ], + "rows": [ + [ + "OCI-Metadaten", + "Entrypoint, Cmd, User", + "Proxmox VE importiert sie beim Erstellen des CT" + ], + [ + "Docker Compose", + "environment, volumes, devices", + "LXC-Umgebungseinträge, mpN und devN" + ], + [ + "ProxMenux-Profil", + "GPU, Zustandsprüfung, Zugangsdaten", + "Rückfragen und geprüfte Anpassungen" + ], + [ + "Benutzer", + "VMID, Speicher, Netzwerk", + "Der Instanzvertrag" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Was während der Installation passiert", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Referenz auflösen", + "body": "Die Registry wird abgefragt, die Architektur des Hosts ausgewählt und der konkrete Digest festgehalten, auf den das fortlaufend aktualisierte Tag verweist." + }, + { + "title": "Herunterladen und prüfen", + "body": "Skopeo lädt das Image als OCI-Archiv herunter. Bevor etwas erstellt wird, wird jede Schicht anhand ihres Digests geprüft und entpackt. Ist der Download beschädigt, wird er einmal wiederholt, bevor die Installation abbricht." + }, + { + "title": "Dateisystem erstellen", + "body": "pct create erstellt das rootfs aus dem Archiv und übernimmt die offiziellen Prozessmetadaten des Images." + }, + { + "title": "Ressourcen anbinden", + "body": "Die deklarierten Volumes, Netzwerkeinstellungen, Umgebung, Geräte und Sicherheitsprofile werden eingebunden." + }, + { + "title": "Konsole", + "body": "Die Konsolenausgabe des Containers wird auf dem Host gespeichert. Die Proxmox-VE-Konsole öffnet eine Shell, sofern das Image eine enthält." + }, + { + "title": "Prüfen", + "body": "Beim ersten Start wird gewartet, bis der Container eine Adresse hat und der Dienst antwortet. Schlägt dies fehl, wird die Installation nicht als erfolgreich gemeldet." + }, + { + "title": "Konfiguration erfassen", + "body": "Die tatsächlich verwendete Konfiguration wird im Instanzvertrag gespeichert, den Aktualisierungen und Neuerstellungen verwenden." + } + ] + } + } + ] + }, + { + "id": "example", + "title": "Beispiel: ein Image mit /config und /downloads", + "intro": "Eine typische Compose-Definition und die daraus erzeugte Proxmox-VE-Konfiguration. Die von der Anwendung erwarteten Pfade bleiben unverändert.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Docker Compose", + "code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080" + }, + { + "title": "/etc/pve/lxc/VMID.conf (Auszug)", + "code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000" + } + ] + } + }, + { + "p": "mp0 ist ein zweiter Datenträger des Containers, der im gewählten Speicher vm-VMID-disk-N heißt. Er wird unter /config eingehängt und mit backup=1 in die Containersicherung aufgenommen. mp1 erstellt keinen Datenträger, sondern bindet das Host-Verzeichnis /srv/downloads unter /downloads im LXC ein. Port 8080 wird nicht weitergeleitet: Der LXC hat eine eigene Adresse, unter der der Dienst antwortet." + } + ] + } + ] +} diff --git a/web/messages/de/docs/oci-manager/custom-image.json b/web/messages/de/docs/oci-manager/custom-image.json new file mode 100644 index 00000000..225e88dd --- /dev/null +++ b/web/messages/de/docs/oci-manager/custom-image.json @@ -0,0 +1,278 @@ +{ + "meta": { + "title": "Image außerhalb des Katalogs installieren | ProxMenux", + "description": "Übernehmen Sie ein OCI-Image aus einer Compose-Datei, einer URL, einem docker run-Befehl oder einer Image-Referenz und prüfen Sie vor der Installation, welche Konfiguration ProxMenux umsetzen kann." + }, + "header": { + "title": "Image außerhalb des Katalogs installieren", + "description": "Ein eigenes Image wird anhand seiner Compose-Datei, eines docker run-Befehls oder allein seiner Referenz für LXC umgesetzt. Das Ergebnis wird zur Prüfung angezeigt, bevor ein LXC erstellt wird.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Derselbe Konverter und Installer", + "body": "Die Option Image außerhalb des Katalogs installieren nutzt denselben Konverter und Installer wie die Katalogvorlagen. Der Unterschied: Der Vertrag wird erst in diesem Moment aus der angegebenen Definition erzeugt und vor dem Erstellen eines LXC validiert." + } + } + ] + }, + { + "id": "sources", + "title": "Wie das Image beschrieben wird", + "intro": "Die erste Ansicht fragt, wie das Image beschrieben ist. Vier Möglichkeiten liefern eine Definition, die umgesetzt wird. Eine fünfte verwendet nur den Image-Namen. Drei weitere lesen eine bereits geschriebene oci-compose-Datei.", + "blocks": [ + { + "table": { + "headers": [ + "Option", + "Was eingelesen wird" + ], + "rows": [ + [ + "Compose-Datei im Terminal einfügen", + "Fügen Sie den YAML-Inhalt im Terminal ein und schließen Sie mit Ctrl+D ab." + ], + [ + "Compose-Datei auf diesem Host lesen", + "Ein Pfad auf dem Knoten, standardmäßig /root/docker-compose.yml. Die Datei muss existieren und darf höchstens 256 KiB groß sein." + ], + [ + "Compose-Datei von einer Adresse herunterladen", + "Eine http://- oder https://-Adresse, die den unverarbeiteten YAML-Inhalt bereitstellt. Es werden höchstens 256 KiB heruntergeladen." + ], + [ + "docker run-Befehl im Terminal einfügen", + "Der vom Projekt veröffentlichte Befehl. Ports, Umgebung, Volumes, Geräte, Capabilities, Benutzer, gemeinsam genutzter Speicher und die weiteren unterstützten Optionen werden umgesetzt." + ], + [ + "Nur die Image-Referenz, ohne Compose-Datei", + "Eine Referenz wie ghcr.io/user/application:latest. Die Registry wird abgefragt und die OCI-Metadaten des Images werden übernommen." + ], + [ + "oci-compose im Terminal einfügen", + "Fügen Sie den JSON-Inhalt im Terminal ein und schließen Sie mit Ctrl+D ab. Er wird nicht konvertiert, sondern geprüft und so installiert, wie er geschrieben ist." + ], + [ + "oci-compose-Datei auf diesem Host lesen", + "Eine JSON-Datei auf dem Knoten, standardmäßig /root/oci-compose.json, mit höchstens 2 MiB." + ], + [ + "oci-compose von einer Adresse herunterladen", + "Eine http://- oder https://-Adresse, die die JSON-Datei bereitstellt. Es werden höchstens 2 MiB heruntergeladen." + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-source-menu.png", + "alt": "Menü zur Auswahl der Beschreibung eines Images außerhalb des Katalogs", + "caption": "Möglichkeiten zur Beschreibung eines Images außerhalb des Katalogs." + } + } + ] + }, + { + "id": "reference-only", + "title": "Was die Image-Referenz allein liefert", + "intro": "Das Image enthält seine Prozessmetadaten, aber nicht die gesamte Umgebung, die eine Compose-Datei gewöhnlich ergänzt.", + "blocks": [ + { + "table": { + "headers": [ + "Aus dem Image gelesen", + "Nicht im Image enthalten", + "Folge" + ], + "rows": [ + [ + "Entrypoint, Cmd, User, WorkingDir und die enthaltene Umgebung", + "Variablen, die nur in der Dokumentation stehen", + "Werden bei der Installation oder über Ändern ergänzt" + ], + [ + "Vom Image deklarierte Volumes", + "Host-Verzeichnisse, die nur in der Compose-Datei angegeben sind", + "Weitere Pfade werden vor der Installation ergänzt" + ], + [ + "EXPOSE-Ports", + "URL, Protokoll oder funktionale Zustandsprüfung", + "Port und Prüfverfahren des Dienstes werden bestätigt" + ], + [ + "Architekturen und Digest in der Registry", + "Geräte, Privilegien oder externe Abhängigkeiten", + "Ohne eine entsprechende Anforderung in der Definition werden sie nicht aktiviert" + ] + ] + } + } + ] + }, + { + "id": "review", + "title": "Vor der Installation prüfen", + "intro": "Nach dem Umsetzen der Definition zeigt ProxMenux seine Interpretation, bevor VMID, Ressourcen oder Speicher abgefragt werden.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Analysieren", + "body": "Dienste, Image, Ports, Pfade, Umgebung, Geräte, Sicherheit und Zustandsprüfung werden eingelesen." + }, + { + "title": "Registry abfragen", + "body": "Das Image muss in seiner Registry vorhanden sein; die veröffentlichten Architekturen werden aufgelistet. Bei einer privaten Registry wird das dafür gespeicherte Konto verwendet." + }, + { + "title": "Nicht angewendete Optionen auflisten", + "body": "Labels, Docker-Netzwerke, Swarm-Einstellungen und andere Schlüssel ohne Wirkung in einem LXC werden aufgelistet." + }, + { + "title": "Optionen ohne sichere Entsprechung blockieren", + "body": "Schlüssel ohne sichere Entsprechung erscheinen unter Nicht umsetzbare Optionen; die Installation wird dann nicht fortgesetzt. Nichts wird stillschweigend verworfen." + }, + { + "title": "Geheime Werte abfragen", + "body": "Variablen, deren Namen auf Passwort, Token oder Schlüssel hinweisen, werden bei der Installation als sensible Werte abgefragt." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-review.png", + "alt": "Zusammenfassung der Interpretation einer Compose-Datei durch ProxMenux", + "caption": "Zusammenfassung, die vor der Abfrage von VMID und Ressourcen erscheint." + } + }, + { + "p": "Nach Bestätigung der Zusammenfassung folgt derselbe Ablauf wie im Katalog: Name, Standard- oder erweiterter Modus, VMID, CPU, Arbeitsspeicher, Netzwerk, Start mit dem Knoten, persistente und zusätzliche Pfade, kompatible Geräte und abschließende Zusammenfassung." + } + ] + }, + { + "id": "examples", + "title": "Eingabebeispiele", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Compose", + "code": "services:\n app:\n image: ghcr.io/example/app:latest\n ports:\n - \"8080:8080\"\n volumes:\n - ./config:/config\n - /srv/media:/media\n environment:\n TZ: Europe/Madrid" + }, + { + "title": "docker run", + "code": "docker run -d \\\n --name app \\\n -p 8080:8080 \\\n -e TZ=Europe/Madrid \\\n -v app-config:/config \\\n -v /srv/media:/media \\\n ghcr.io/example/app:latest" + } + ] + } + } + ] + }, + { + "id": "oci-compose", + "title": "Eine von Hand geschriebene oci-compose-Datei", + "intro": "oci-compose ist die JSON-Datei, aus der eine Anwendung installiert wird. Der Katalog enthält eine solche Datei pro Anwendung. Dasselbe Format kann von Hand geschrieben und über diese Option installiert werden.", + "blocks": [ + { + "p": "Bei einer handgeschriebenen Datei legt der Autor Image, Ports, Variablen, Volumes und Installationsfragen fest. ProxMenux ergänzt den Rest beim Einlesen. Das Format kann Dinge ausdrücken, die Compose nicht enthält: Fragetexte, bei der Installation erzeugte Passwörter, GPU-Profile, Eigentümer einzelner Volumes, die Prüfung des ersten Starts und abschließend angezeigte Zugangsdaten." + }, + { + "steps": { + "items": [ + { + "title": "Prüfen", + "body": "Dateien mit Fehlern werden nicht installiert. Jeder Fehler nennt das betroffene Feld. Bei ungültigem JSON werden Zeile und Spalte angegeben." + }, + { + "title": "Überprüfen", + "body": "Eine gültige Datei zeigt, was sie installiert: Image, Webadresse, Ports, persistente Pfade, abgefragte Variablen und geschriebene Dateien." + }, + { + "title": "Installieren", + "body": "Die Installation erfolgt wie bei jeder Kataloganwendung mit Standard- oder erweiterten Einstellungen." + } + ] + } + }, + { + "calloutWarning": { + "title": "Eine Datei, die Privilegien festlegt", + "body": "oci-compose legt fest, was im Container eingehängt wird und mit welchen Privilegien. Die Prüfung zeigt dies vor der Installation. Installieren Sie nur Dateien aus vertrauenswürdigen Quellen." + } + }, + { + "p": "Die README der OCI-Engine beschreibt das Format Block für Block und enthält zwei vollständige Beispiele. Auch ein Installationsdatensatz kann so eingelesen werden: Verwendet wird nur die ursprüngliche Vorlage, keine der damaligen Antworten." + } + ] + }, + { + "id": "private-registries", + "title": "Images aus privaten Registries", + "intro": "Ein Image aus einer privaten Registry, etwa ein privates GitHub-Paket oder ein privates Docker-Hub-Repository, wird mit einem in ProxMenux gespeicherten Konto gelesen.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Die Registry verweigert den Image-Zugriff", + "body": "Meldet die Registry, dass ein Konto benötigt wird, bietet die Prüfung eine Anmeldung an und liest das Image danach erneut." + }, + { + "title": "Anmelden", + "body": "Benutzername und Passwort oder Zugriffstoken mit Download-Berechtigung. Die Registry prüft sie; gespeichert werden sie nur bei erfolgreicher Anmeldung." + }, + { + "title": "Installieren und aktuell halten", + "body": "Dieses Konto wird beim Herunterladen während der Installation und ebenso für Aktualisieren, Ändern, Neuerstellen, Watchdog und die Update-Prüfung des Monitors verwendet – auf jedem Cluster-Knoten." + } + ] + } + }, + { + "p": "Registry-Konten im Hauptmenü von OCI manager Apps zeigt gespeicherte Konten nach Registry und Benutzer, niemals ihre geheimen Zugangsdaten. Pro Konto können Images geprüft, heruntergeladen oder installiert sowie Zugangsdaten aktualisiert oder entfernt werden." + }, + { + "list": { + "items": [ + "GitHub (ghcr.io): Als Benutzer dient das GitHub-Konto, als Passwort ein persönliches Zugriffstoken mit read:packages-Berechtigung.", + "Docker Hub (docker.io): Als Benutzer dient das Docker-Hub-Konto, als Passwort ein Zugriffstoken mit Leseberechtigung.", + "Andere Registries, auch mit eigenem Port wie registry.example.com:5000: Benutzername und Passwort oder Token dieser Registry." + ] + } + }, + { + "calloutInfo": { + "title": "Wo die Konten gespeichert werden", + "body": "Unter /etc/pve/priv/proxmenux/registry-auth.json, nur für root lesbar, im selben Ordner wie die Speicherpasswörter von Proxmox. /etc/pve wird von allen Cluster-Knoten gemeinsam genutzt. Ein auf einem Knoten hinzugefügtes Konto gilt daher auf allen. Die Host-Sicherung enthält die Datei; die Deinstallation von ProxMenux entfernt sie auf allen Knoten." + } + } + ] + }, + { + "id": "limits", + "title": "Nicht installierbare Definitionen", + "blocks": [ + { + "list": { + "items": [ + "Ein Dockerfile ohne veröffentlichtes Image: Das Image muss zuerst gebaut und in einer OCI-Registry veröffentlicht werden.", + "Eine Compose-Datei mit mehreren Diensten: Diese Option installiert jeweils einen Dienst in einem Container, auch wenn mehrere Dienste dasselbe Image verwenden.", + "configs, externe Geheimnisse oder Geräteformate, die sich nicht eindeutig umsetzen lassen.", + "Shell-Ersetzungen wie $(command): Stattdessen muss der resultierende Wert angegeben werden.", + "Nicht erkannte docker run-Optionen und --env-file: Verwenden Sie stattdessen eine Compose-Datei mit expliziten Werten." + ] + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/oci-manager/hardware.json b/web/messages/de/docs/oci-manager/hardware.json new file mode 100644 index 00000000..6f07b1aa --- /dev/null +++ b/web/messages/de/docs/oci-manager/hardware.json @@ -0,0 +1,392 @@ +{ + "meta": { + "title": "Geräte und Beschleunigung | ProxMenux", + "description": "Wie OCI manager Apps GPU, NVIDIA, Coral, USB, FUSE und weitere Geräte als geprüfte native Proxmox-VE-Ressourcen für einen OCI-Container bereitstellt." + }, + "header": { + "title": "Geräte und Beschleunigung", + "description": "GPU, NVIDIA, Coral, USB, FUSE und Blockgeräte werden validierte native Proxmox VE-Ressourcen des Containers.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "principle", + "title": "Das Gerät, das die Anwendung benötigt, nicht der gesamte Host", + "blocks": [ + { + "p": "Ein in der Compose-Datei oder im Anwendungsprofil angefordertes Gerät wird als konkreter devN-Eintrag oder LXC-Mount eingerichtet. Das Anfordern einer GPU, eines USB-Geräts oder eines Coral-Beschleunigers macht den Container nicht privilegiert." + }, + { + "flow": { + "nodes": [ + { + "label": "Host-Inventar", + "detail": "/dev/dri/renderD128\nGID 993 · Intel" + }, + { + "label": "ProxMenux", + "detail": "Hersteller und\nBerechtigungen geprüft" + }, + { + "label": "LXC", + "detail": "dasselbe Gerät\neffektive GID" + } + ] + } + } + ] + }, + { + "id": "origin", + "title": "Woher die Geräteanforderung kommt", + "blocks": [ + { + "table": { + "headers": [ + "Quelle", + "Was gelesen wird", + "Was der Installateur macht" + ], + "rows": [ + [ + "Docker Compose", + "devices, group_add, deploy.resources und NVIDIA Anforderungen", + "Jede Anforderung wird zu einer Geräteanforderung, die zur Überprüfung angezeigt wird" + ], + [ + "Katalogprofil", + "Die tatsächliche GPU-, Coral-, OpenCL-, USB- oder FUSE-Unterstützung der Anwendung", + "Es werden nur die für dieses Image validierten Optionen angeboten" + ], + [ + "Bildmetadaten und Dokumentation", + "VA-API, Selkies, LinuxServer Mods oder die NVIDIA Laufzeit", + "Die dokumentierten Variablen und die Vorbereitung werden hinzugefügt" + ], + [ + "Auswahl der Nutzer", + "Nur CPU, Intel/AMD, OpenCL, NVIDIA oder ein optionales Gerät", + "Die Auswahl wird im Instanzvertrag gespeichert" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Erkannte Geräte werden nicht automatisch eingebunden", + "body": "Der Host wird inventarisiert, aber nur Geräte, die in der Compose-Datei oder in einem kompatiblen Profil deklariert sind, werden angeboten und angehängt. Ein GPU, USB-Dongle oder Coral auf dem Host ist nicht jedem LXC ausgesetzt." + } + } + ] + }, + { + "id": "identify", + "title": "Wie das Host-Gerät identifiziert wird", + "intro": "Bevor der LXC geändert wird, wird das Gerät auf dem Host gelesen und mit dem gewählten Profil verglichen.", + "blocks": [ + { + "table": { + "headers": [ + "Typ", + "Identität", + "Validierung" + ], + "rows": [ + [ + "Intel/AMD DRM", + "/dev/dri/renderD* und /sys/class/drm/NODE/device/vendor", + "Ein Zeichengerät mit dem Anbieter 0x8086 (Intel) oder 0x1002 (AMD)" + ], + [ + "AMD OpenCL", + "Der Render-Knoten plus /dev/kfd, wenn das Profil es benötigt", + "Existenz, Typ, Anbieter, Berechtigungen und deklarierte Kompatibilität" + ], + [ + "AMD ROCm", + "Der Renderknoten, /dev/kfd und die Generation, die der Compute-Treiber in /sys/class/kfd/kfd/topology/nodes/*/properties meldet", + "Eine GPU-Generation, für die das ROCm-Image der Anwendung passende Rechenkernel enthält — die dort genannten RDNA2-GPUs und neuere — wird unverändert angeboten. Andere GPUs dieser Familien, etwa Radeon 680M und 780M, werden als experimentell angeboten und nie vorausgewählt: ROCm unterstützt sie nicht offiziell, die Anwendung meldet sie als Generation ihrer Familie (HSA_OVERRIDE_GFX_VERSION), und vor dem Download des größeren Images ist eine Bestätigung erforderlich. Ältere GPUs, etwa die integrierte Grafik eines Ryzen 5000U, werden nicht angeboten; Immich führt die Erkennung weiter auf der CPU aus." + ], + [ + "NVIDIA", + "nvidia-smi und nvidia-container-cli", + "GPU, UUID, PCI-Bus, Treiberversion, Toolkit, /dev/nvidia*-Knoten, Binärdateien und Bibliotheken" + ], + [ + "Coral PCIe/M.2", + "/dev/apex_N und sein Link in /sys/dev/char/MAJOR:MINOR", + "Zeichengeräteknoten, Major-/Minor-Nummern, Eigentümer, GID und Berechtigungen" + ], + [ + "USB und serielle", + "/dev/ttyUSB*, /dev/ttyACM* oder /dev/bus/usb/BBB/DDD", + "Zeichenknoten; für USB auch Anbieter, Produkt und Seriennummer, wenn sysfs sie veröffentlicht" + ], + [ + "KVM, TUN, FUSE, Video und generische SCSI", + "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN oder /dev/sgN", + "Unterstützter Pfad, Knotentyp und effektive Berechtigungen" + ], + [ + "Optisches Laufwerk", + "/dev/srN", + "Ein Blockgerät" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Was passiert während der Installation", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Das Template bietet seine Profile", + "body": "Nur CPU, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL oder NVIDIA. Die Optionen gehören zum Image, nicht zu einem gemeinsamen Menü." + }, + { + "title": "Ein Profil wird gewählt", + "body": "Es definiert die Geräteknoten, die Umgebung, die Mods oder die Laufzeit, die die Anwendung benötigt." + }, + { + "title": "Ein Pfad wird vorgeschlagen", + "body": "Für DRM /dev/dri/renderD128, das auf einem Host mit mehreren Renderknoten geändert werden kann. Für USB oder seriell wird der konkrete Knoten ausgewählt." + }, + { + "title": "Validierung", + "body": "Existenz, Typ, erlaubter Anbieter, Berechtigungen und GID werden überprüft. Eine Abweichung stoppt die Operation." + }, + { + "title": "Der Vertrag ist geschrieben", + "body": "Pfad, Modus, GID, Schreibzugriff und Profil werden für Updates und Neuerstellungen aufgezeichnet." + }, + { + "title": "Einbinden und testen", + "body": "pct set fügt den devN-Eintrag hinzu und der Zugriff wird dann im LXC überprüft. LinuxServer-Images werden auch als Benutzer abc überprüft." + } + ] + } + } + ] + }, + { + "id": "config", + "title": "Wie es in der LXC-Konfiguration erscheint", + "intro": "Beispiele: dev0 und dev1 sind die freien Slots, die Proxmox VE zuweist, und renderD128, apex_0 und die GID hängen von der Hardware des Knotens ab.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Intel/AMD VA-API", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" + }, + { + "title": "Coral PCIe/M.2", + "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "Ein spezifisches USB-Gerät", + "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "AMD OpenCL", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" + } + ] + } + }, + { + "p": "Die GID wird mit stat auf dem Host gelesen und in den devN-Eintrag geschrieben; es wird nicht angenommen, dass die Gruppen render und video eine feste Nummer haben. Das Gerät behält den gleichen /dev-Pfad innerhalb des LXC, wo die anwendungseigenen Mechanismen danach suchen." + } + ] + }, + { + "id": "profiles", + "title": "Profile, die ein Image bieten kann", + "blocks": [ + { + "table": { + "headers": [ + "Profil", + "Umsetzung", + "Angeboten, wenn" + ], + "rows": [ + [ + "Intel/AMD VA-API", + "/dev/dri Renderknoten", + "Die Anwendung unterstützt Videobeschleunigung" + ], + [ + "OpenCL", + "Renderknoten, /dev/kfd bei Bedarf und der offizielle Mod", + "Das Image oder Profil dokumentiert es" + ], + [ + "NVIDIA", + "Treibergeräte und Bibliotheken des Hosts", + "Der Host hat einen funktionierenden Treiber und das NVIDIA Container Toolkit" + ], + [ + "Coral", + "/dev/apex_0 oder USB-Bus", + "Das Profil erklärt Coral-Unterstützung (Frigate)" + ], + [ + "USB, seriell, FUSE", + "Ein einzelnes Gerät, ein validierter Baum oder eine LXC-Funktion", + "Der Vertrag verlangt es" + ] + ] + } + } + ] + }, + { + "id": "nvidia", + "title": "NVIDIA", + "blocks": [ + { + "calloutWarning": { + "title": "Voraussetzung auf dem Knoten: NVIDIA Container Toolkit", + "body": "Ein funktionierender Treiber auf Proxmox VE reicht nicht aus, um einem OCI-Image eine NVIDIA-GPU zu geben. OCI Manager Apps verwendet nvidia-container-cli aus dem NVIDIA Container Toolkit, um die Geräte zu identifizieren und die Binärdateien und Bibliotheken zu erhalten, die dem geladenen Treiber entsprechen." + } + }, + { + "p": "ProxMenux NVIDIA installer installiert das NVIDIA Container Toolkit aus dem offiziellen NVIDIA-Repository zusammen mit dem Treiber. Es überprüft seine vier Pakete, validiert nvidia-container-cli und zeichnet das Ergebnis im Change Journal von Audit & Report auf." + }, + { + "p": "Diese beiden Befehle auf dem Host zeigen an, ob der Treiber und das Toolkit verfügbar sind:" + }, + { + "shell": { + "code": "nvidia-smi -L\nnvidia-container-cli --version" + } + }, + { + "p": "Auf einem Host, auf dem der Treiber auf andere Weise installiert wurde, wird das Toolkit aus dem offiziellen stabilen Repository installiert:" + }, + { + "shell": { + "code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools" + } + }, + { + "p": "Das von OCI manager Apps verwendete Inventar stammt aus der Ausgabe von:" + }, + { + "shell": { + "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" + } + }, + { + "calloutInfo": { + "title": "Docker Laufzeitkonfiguration ist nicht beteiligt", + "body": "Die Container sind native LXCs ohne Docker-Daemon. Daher spielt nvidia-ctk runtime configure --runtime=docker keine Rolle: ProxMenux fragt nvidia-container-cli direkt ab und trägt Geräte und Mounts in die LXC-Konfiguration ein. Die aktuellen Befehle und unterstützten Plattformen stehen in der Installationsanleitung zum NVIDIA Container Toolkit." + } + }, + { + "cards": { + "items": [ + { + "icon": "cpu", + "title": "Inventar aus dem Treiber", + "body": "nvidia-container-cli listet Geräteknoten, Binärdateien, Firmware und Bibliotheken des installierten Treibers auf." + }, + { + "icon": "refresh", + "title": "Keine feste Version", + "body": "Die Vorlage nennt keine Bibliotheksdateien. Das Profil wird vom aktuellen Host generiert." + }, + { + "icon": "shield", + "title": "Nur lesbare Mounts", + "body": "Die Hostbibliotheken werden schreibgeschützt montiert, anstatt in den Container kopiert zu werden." + }, + { + "icon": "hardDrive", + "title": "Treiberänderungen", + "body": "Nach einem Treiberwechsel wird das Inventar erneut generiert, bevor die betroffenen LXCs starten." + } + ] + } + }, + { + "code": { + "title": "NVIDIA Ergebnis (vereinfacht)", + "code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0" + } + }, + { + "p": "Nur /dev/nvidia0 zu übergeben ist nicht genug. Die Benutzerraumkomponenten des geladenen Treibers werden schreibgeschützt montiert, und nvidia-smi läuft dann innerhalb des LXC, um GPU, UUID, PCI-Bus und Version mit dem Host-Inventar zu vergleichen." + } + ] + }, + { + "id": "usb", + "title": "USB, serielle und USB Coral", + "blocks": [ + { + "calloutWarning": { + "title": "USB-Nummerierung kann sich ändern", + "body": "Ein Pfad wie /dev/bus/usb/003/004 kann sich ändern, wenn das Gerät wieder angeschlossen wird oder der Host neu gestartet wird. Das Profil zeichnet Anbieter, Produkt und Seriennummer auf, wenn sie verfügbar sind, aber eine neue Busadresse wird nicht automatisch neu zugeordnet." + } + }, + { + "p": "Ein Peripheriegerät wird durch seinen konkreten Knoten angegeben: /dev/ttyUSB0, /dev/ttyACM0, /dev/apex_0 oder /dev/bus/usb/BBB/DDD. Die Weitergabe des gesamten /dev wird nicht akzeptiert. Coral wird nur Anwendungen angeboten, deren Profil es deklariert." + } + ] + }, + { + "id": "trees", + "title": "Gerätebäume und LXC-Funktionen", + "blocks": [ + { + "table": { + "headers": [ + "Anforderung", + "Umsetzung", + "Umfang" + ], + "rows": [ + [ + "/dev/dvb, /dev/snd oder /dev/bus/usb", + "Jeder Zeichenknoten des Baumes erhält seinen eigenen devN-Eintrag mit dem Host-Modus und GID", + "Nur der angeforderte Baum, nicht der Rest von /dev" + ], + [ + "/dev/fuse", + "Der Knoten und, wenn das Profil es benötigt, die fuse=1-Funktion", + "FUSE allein veröffentlicht keine Mounts für andere LXCs" + ], + [ + "/dev/net/tun", + "Ein devN-Eintrag auf demselben Pfad innerhalb des LXC", + "Die VPN- oder Netzwerkkonfiguration bleibt in der Anwendung" + ], + [ + "/dev/kvm", + "Ein validierter devN-Eintrag", + "Angeboten nur, wenn der Vertrag es verlangt" + ] + ] + } + } + ] + }, + { + "id": "security", + "title": "Bestätigungen nach Risikograd", + "blocks": [ + { + "p": "Konkrete Geräte, optionale Privilegien, erforderliche Privilegien, AppArmor- oder seccomp-Entspannung und der Zugriff auf den Host-PID-Namespace werden als separate Fälle behandelt, nicht unter einem generischen privilegierten Label. Jede Option mit einem Risiko wird während der Installation erklärt und bestätigt." + } + ] + } + ] +} diff --git a/web/messages/de/docs/oci-manager/index.json b/web/messages/de/docs/oci-manager/index.json new file mode 100644 index 00000000..c46433f7 --- /dev/null +++ b/web/messages/de/docs/oci-manager/index.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "OCI manager Apps | ProxMenux", + "description": "Führen Sie offizielle OCI-Images als native LXC-Container unter Proxmox VE aus – mit persistenten Daten, Gerätezugriff, Anwendungen aus mehreren Containern und transaktionalen Aktualisierungen." + }, + "header": { + "title": "OCI manager Apps", + "description": "Offizielle OCI-Images laufen als native LXC-Container unter Proxmox VE. Das vom Maintainer veröffentlichte Image bleibt unverändert; ProxMenux bildet die Umgebung nach, die Docker Compose dafür eingerichtet hätte.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "model", + "blocks": [ + { + "calloutInfo": { + "title": "Ein OCI-Image, ein nativer LXC", + "body": "In den Containern läuft keine Docker Engine. Proxmox VE importiert das Dateisystem und die OCI-Metadaten des Images. Die Anwendung wird zum Hauptprozess eines nativen LXC und lässt sich mit denselben Werkzeugen verwalten wie andere Container auf dem Knoten." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Quelle", + "detail": "OCI-Image\nCompose und Dokumentation" + }, + { + "label": "ProxMenux", + "detail": "JSON-Vertrag\nValidierung und Planung" + }, + { + "label": "Proxmox VE", + "detail": "Nativer LXC\nVolumes und Geräte" + } + ], + "caption": "Die Anwendung wird nicht neu gebaut. Ihre Umgebung wird deklarativ beschrieben und nachgebildet." + } + } + ] + }, + { + "id": "where", + "title": "Wo Sie es finden", + "intro": "Öffnen Sie auf dem Proxmox-Knoten als root den Eintrag OCI manager Apps (Technology Preview) im ProxMenux-Hauptmenü. Die erste Ansicht bietet:", + "blocks": [ + { + "list": { + "items": [ + "Anwendungen suchen – den gesamten Katalog nach Namen durchsuchen.", + "Alle Anwendungen – den vollständigen Katalog samt Anzahl der Anwendungen anzeigen.", + "Installierte OCI-Anwendungen verwalten – vorhandene Installationen aktualisieren, ändern, entfernen oder wiederherstellen.", + "Registry-Konten – Konten zum Installieren und Aktualisieren von Images aus privaten Registries verwalten.", + "Image außerhalb des Katalogs installieren – eine Compose-Datei, einen docker run-Befehl oder eine Image-Referenz übernehmen und anpassen.", + "Die Kategorien des Katalogs, jeweils mit der Anzahl ihrer Anwendungen." + ] + } + }, + { + "figure": { + "src": "/oci-manager/main-menu.png", + "alt": "Hauptansicht von OCI manager Apps mit Suche, Gesamtkatalog, Anwendungsverwaltung, eigenen Images und Katalogkategorien.", + "caption": "Hauptansicht von OCI manager Apps." + } + }, + { + "p": "Nach der Auswahl einer Anwendung sehen Sie deren Beschreibung, das verwendete Image und zwei Installationsarten. Mit Standardeinstellungen installieren fragt nur die grundlegenden Entscheidungen ab: Speicher, Datenablage, Adresse und Start. Mit erweiterten Einstellungen installieren führt nacheinander durch alle Optionen: VMID und Ressourcen, Speicher für jeden Pfad, Netzwerk-Bridge und Geräte." + }, + { + "p": "Tatsächlich getestete Anwendungen zeigen in dieser Ansicht Geprüft und sind in den Listen mit ✓ gekennzeichnet. Das gilt für Tests im ProxMenux-Labor ebenso wie für Tests durch die Community." + } + ] + }, + { + "id": "beta", + "title": "Warum es als Technology Preview gekennzeichnet ist", + "blocks": [ + { + "p": "OCI manager Apps verwendet die Bezeichnung Technology Preview, die Proxmox VE den aus OCI-Images erstellten Anwendungscontainern zuweist. Deren Unterstützung wurde mit Proxmox VE 9.1 eingeführt. Die Bezeichnung betrifft die zugrunde liegende Proxmox-Technik, nicht die ProxMenux-Engine: Das Verhalten dieser Container kann sich zwischen Proxmox-VE-Versionen noch ändern. Die Kennzeichnung bleibt bestehen, bis Proxmox VE diese Unterstützung als stabil einstuft." + }, + { + "p": "Die Funktionen von OCI manager Apps werden im ProxMenux-Labor getestet: Installation, Aktualisierung, Änderung, Neuerstellung, Sicherung, Wiederherstellung, Migration und Watchdog. Jede Anwendung wird separat geprüft. Tatsächlich getestete Anwendungen tragen die Kennzeichnung Geprüft und ein ✓ in den Listen." + } + ] + }, + { + "id": "translation", + "title": "Wie Docker Anforderungen beschreibt und OCI manager Apps sie umsetzt", + "blocks": [ + { + "table": { + "headers": [ + "Anforderung", + "Darstellung in Docker", + "Umsetzung durch OCI manager Apps" + ], + "rows": [ + [ + "Anwendung ausführen", + "image, entrypoint, command", + "OCI-rootfs und Hauptprozess des LXC" + ], + [ + "Konfiguration erhalten", + "volumes: /config", + "Ein persistentes mpN-Volume, das in die Sicherung aufgenommen wird, oder ein Verzeichnis auf dem Host." + ], + [ + "Dienst bereitstellen", + "ports", + "Eine eigene Adresse für den LXC und die Zugriffs-URL des Dienstes." + ], + [ + "Hardware verwenden", + "devices, group_add", + "devN-Einträge mit der tatsächlich verwendeten Gruppen-ID (GID) des Hosts und einem validierten Profil." + ], + [ + "Abhängigkeiten verbinden", + "networks, depends_on", + "Eine private Netzwerk-Bridge, feste Adressen, Startreihenfolge und Zustandsprüfungen." + ], + [ + "Aktualisieren", + "Mit pull herunterladen und neu erstellen", + "Ein neues rootfs mit demselben Persistenzvertrag." + ] + ] + } + } + ] + }, + { + "id": "kept", + "title": "Was erhalten bleibt und was sich ändert", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Bleibt erhalten", + "body": "Das offizielle Image, seine internen Pfade, seine Umgebung, sein Startprozess und seine Nutzungsdokumentation." + }, + { + "icon": "boxes", + "title": "Wird angepasst", + "body": "Die Laufzeitumgebung: Netzwerk, Persistenz, Geräte, Berechtigungen und Abhängigkeiten werden mit den nativen LXC-Funktionen von Proxmox VE umgesetzt." + }, + { + "icon": "shield", + "title": "Ohne Entsprechung", + "body": "Eine Compose-Option ohne sichere Entsprechung wird als Installationshindernis aufgeführt. Vorlagen mit solchen Hindernissen werden nicht zur Installation angeboten. Sensible Optionen müssen während der Installation bestätigt werden." + }, + { + "icon": "refresh", + "title": "Wird gespeichert", + "body": "Image-Digest, Ressourcen, Pfade, Netzwerk, Geräte und Zugehörigkeit zu einem Stack werden im Instanzvertrag gespeichert. Aktualisierungen und Neuerstellungen bilden diesen Vertrag wieder ab." + } + ] + } + } + ] + }, + { + "id": "pages", + "title": "Seiten in diesem Abschnitt", + "blocks": [ + { + "next": { + "items": [ + { + "label": "So wird ein OCI-Image umgesetzt", + "href": "/docs/oci-manager/architecture", + "tail": "Vom Image und seiner Compose-Datei zu einem nativen LXC." + }, + { + "label": "Image außerhalb des Katalogs installieren", + "href": "/docs/oci-manager/custom-image", + "tail": "Compose-Datei, docker run oder eine Image-Referenz." + }, + { + "label": "Daten, Pfade und Netzwerk", + "href": "/docs/oci-manager/storage-network", + "tail": "Container-Volumes, Host-Verzeichnisse, rclone-Mounts und Adressen." + }, + { + "label": "Geräte und Beschleunigung", + "href": "/docs/oci-manager/hardware", + "tail": "GPU, NVIDIA, Coral, USB und weitere Geräte." + }, + { + "label": "Anwendungen mit mehreren Containern", + "href": "/docs/oci-manager/stacks", + "tail": "Anwendung, Datenbank und Cache als koordinierte LXCs." + }, + { + "label": "Installieren, aktualisieren und ändern", + "href": "/docs/oci-manager/lifecycle", + "tail": "Der Instanzvertrag und seine Vorgänge." + }, + { + "label": "In ProxMenux Monitor", + "href": "/docs/oci-manager/monitor", + "tail": "Versionen, Aktualisierungen, Konsolenausgabe und Terminal." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/oci-manager/lifecycle.json b/web/messages/de/docs/oci-manager/lifecycle.json new file mode 100644 index 00000000..7fb24421 --- /dev/null +++ b/web/messages/de/docs/oci-manager/lifecycle.json @@ -0,0 +1,499 @@ +{ + "meta": { + "title": "Installieren, Aktualisieren und Ändern | ProxMenux", + "description": "Der Instanzvertrag eines OCI-Containers und die darauf beruhenden Vorgänge: Aktualisieren, Ändern, Entfernen, Fortsetzen eines unterbrochenen Vorgangs und Wiederherstellen des Betriebs nach einer Wiederherstellung auf diesem oder einem anderen Host." + }, + "header": { + "title": "Installation, Aktualisierung und Änderung", + "description": "Jede Instanz behält einen reproduzierbaren Vertrag, sodass ihr rootfs ersetzt werden kann, ohne Konfiguration oder persistente Daten zu verlieren.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "contract", + "title": "Der Instanzvertrag", + "blocks": [ + { + "p": "Nach einer Installation wird die effektive Konfiguration in /usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json gespeichert. Es ist keine Kopie der ursprünglichen Compose-Datei: Es ist der reproduzierbare Vertrag des LXC, der auf diesem Host existiert." + }, + { + "code": { + "code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle" + } + }, + { + "p": "Eine Kopie des Vertrags liegt im Container unter /.proxmenux/oci-record.json und ist nur für dessen Benutzer root lesbar. Eine Containersicherung enthält daher immer den zu diesem Zeitpunkt gültigen Vertrag. Eine zweite Kopie liegt unter /etc/pve/priv/proxmenux/oci; dieses Verzeichnis ist auf allen Clusterknoten verfügbar und nur für root des Hosts lesbar. Beide Kopien werden nach jeder Installation, Aktualisierung und Änderung geschrieben." + } + ] + }, + { + "id": "manage", + "title": "Verwalten installierter OCI-Anwendungen", + "intro": "Diese Option auf dem Hauptbildschirm listet die registrierten Instanzen mit ihrer Anwendung und ihrem Image auf. Vor jeder Aktion wird jede Instanz mit ihrem Vertrag abgeglichen; ein CT, der nicht mehr zu seinem Datensatz passt, wird weder geändert noch gelöscht. Dieselbe Aktualisierungsfunktion und derselbe Editor stehen auf der Registerkarte Aktualisierungen von ProxMenux Monitor bereit.", + "blocks": [ + { + "table": { + "headers": [ + "Option", + "Was sich ändert", + "Was erhalten bleibt" + ], + "rows": [ + [ + "Aktualisieren Sie das Image mit der gespeicherten Konfiguration", + "Das rootfs wird durch das Image ersetzt, das der gespeicherte Kanal aktuell bereitstellt", + "Vertrag, Containerplatten, Hostverzeichnisse, Netzwerk und Geräte" + ], + [ + "Ändern: Ressourcen, Netzwerk, Pfade und GPU bearbeiten", + "Der Editor öffnet sich mit dem aktuellen Vertrag; der CT wird mit den Änderungen neu erstellt", + "Die Daten von Container-Disks und Host-Verzeichnissen" + ], + [ + "Watchdog: Neustart der Anwendung, wenn sie abstürzt", + "Ob die Anwendung nach einem selbstständigen Beenden erneut gestartet wird. Es wird nichts neu erstellt", + "Die gesamte Installation; nur die Wahl ist im Vertrag gespeichert" + ], + [ + "Entfernen: Löschen Sie die Anwendung und ihre Container", + "Der LXC oder jedes Mitglied eines Stacks und seine Verträge werden gelöscht", + "Host-Verzeichnisse mit ihren Inhalten" + ] + ] + } + }, + { + "p": "Für eine Anwendung mit mehreren Containern bietet das Menü Alle Container der Anwendung aktualisieren, Zusätzliche Pfade und Geräte ändern, Alle Container mit ihrer gespeicherten Konfiguration neu erstellen, den Watchdog und die Entfernung. Ändern fügt die zusätzlichen Pfade und Geräte des Anwendungscontainers hinzu oder entfernt sie, ohne etwas neu zu erstellen. Bei Immich lässt sich damit auch ändern, womit die Erkennung ausgeführt wird. Neu erstellen erstellt jeden Container anhand des ursprünglich installierten Images neu, ohne nach einem neueren zu suchen." + }, + { + "figure": { + "src": "/oci-manager/manage-menu.png", + "alt": "Liste der installierten OCI-Anwendungen und der Optionen zum Aktualisieren, Ändern und Entfernen", + "caption": "Verwalten Sie installierte OCI-Anwendungen." + } + } + ] + }, + { + "id": "update", + "title": "Transaktionsaktualisierung", + "blocks": [ + { + "mermaid": { + "chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end", + "labels": { + "user": "Benutzer", + "registry": "OCI-Register", + "update": "Instanz aktualisieren", + "resolve": "Tag auflösen", + "verify": "Archiv prüfen und Vorabprüfungen durchführen", + "backup": "Stoppen und sichern Sie den CT", + "import": "Neues rootfs importieren", + "reapply": "Den Vertrag erneut anwenden", + "healthy": "in Ordnung", + "failure": "Ausfall", + "commit": "Vertrag mit dem neuen Digest veröffentlicht", + "restored": "Frühere Instanz wiederhergestellt" + } + } + }, + { + "list": { + "items": [ + "Wenn die Registry weiterhin den installierten Digest bedient, wird nichts heruntergeladen und die Instanz nicht berührt.", + "Das neue Image wird Schicht für Schicht verifiziert, bevor der CT stoppt. Ein Download, der beschädigt ankommt, wird ein zweites Mal abgerufen; ein bereits zwischengespeichertes Image, das den Check nicht besteht, wird erneut heruntergeladen.", + "Nach der Installation in Proxmox VE geänderte Einstellungen (Arbeitsspeicher, Swap, Kerne, CPU-Limit, CPU-Priorität, Start mit dem Knoten) bleiben erhalten und werden in den neuen Vertrag übernommen.", + "Die LAN-Schnittstelle, die die Arr-Suite und Multi-Container-Anwendungen hinzufügen (net1) und die Startreihenfolge (startup) werden an den neuen Container zurückgegeben.", + "Jeder andere Unterschied zwischen dem CT und seinem Vertrag stoppt das Update, bevor der CT gestoppt wird." + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Vorher", + "detail": "rootfs A\n/config mp0\n/media Hostverzeichnis" + }, + { + "label": "Aktualisierung", + "detail": "ersetzt nur\ndas rootfs" + }, + { + "label": "Nachher", + "detail": "rootfs B\n/config mp0\n/media Hostverzeichnis" + } + ] + } + }, + { + "p": "Bevor etwas gestoppt wird, prüft der Vorgang, ob ausreichend Platz für die Sicherung vorhanden ist: die belegten Daten der zu sichernden Volumes plus eine Reserve. Die Sicherung wird neben dem Anwendungsdatensatz auf dem Systemlaufwerk des Hosts gespeichert. Reicht der Platz dort nicht aus, fragt das Menü nach einem anderen Host-Speicher, der Sicherungen unterstützt. Dort wird die Sicherung erstellt und nach Abschluss des Vorgangs gelöscht. Die Auswahl wird für diese Anwendung auch für geplante Aktualisierungen gespeichert. Hat kein Speicher ausreichend Platz, wird der Vorgang abgelehnt und die Anwendung bleibt unverändert. Der Platzbedarf des neuen Images wird vor dem Herunterladen ebenso geprüft." + } + ] + }, + { + "id": "recovery", + "title": "Wiederherstellung eines unterbrochenen Vorgangs", + "intro": "Ein Update und eine Änderung verwenden eine persistente Transaktion. Wenn der Prozess, das Terminal oder der Knoten nach dem Stoppen des CT unterbrochen wird, wird die Operation nicht als abgeschlossen angesehen.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Ausstehender Marker", + "body": "Beim Öffnen von „Installierte OCI-Anwendungen verwalten“ zeigt der gespeicherte Zustand, dass der Ersatz nie veröffentlicht wurde." + }, + { + "title": "Status anzeigen", + "body": "Zeigt die Phase an, die erreicht wurde, ohne Container oder Daten zu ändern." + }, + { + "title": "Wiederherstellen der vorherigen Installation", + "body": "Stellt die vor dem Ersatz erstellte und geprüfte native Sicherung sowie den vorherigen Vertrag wieder her." + }, + { + "title": "Stacks als Einheit", + "body": "Für eine Multi-Container-Anwendung wird jedes Mitglied aus dem gleichen Transaktionspunkt wiederhergestellt, nicht nur das ausgewählte." + } + ] + } + }, + { + "calloutWarning": { + "title": "Host-Verzeichnisse liegen außerhalb des Rollbacks", + "body": "Die Sicherung umfasst das rootfs und die darin eingeschlossenen Containerlaufwerke. Ein Hostverzeichnis wird nicht zurückgesetzt, da andere LXCs dessen Daten verwenden können." + } + } + ] + }, + { + "id": "watchdog", + "title": "Watchdog: Neustart einer Anwendung, die stoppt", + "intro": "Proxmox hat keine Neustartrichtlinie: Wenn der Prozess eines Anwendungscontainers endet, bleibt der Container gestoppt. Mit dem Watchdog wird eine Anwendung, die von selbst aufhört, erneut gestartet. Es tut für eine OCI-Anwendung, was restart: unless-stopped in einer Compose-Datei tut.", + "blocks": [ + { + "table": { + "headers": [ + "Was passiert", + "Mit aktiviertem Watchdog" + ], + "rows": [ + [ + "Die Anwendung stürzt ab oder ihr Prozess endet", + "Der Container wird innerhalb von Sekunden wieder gestartet" + ], + [ + "Es wird von Proxmox, vom Monitor oder mit pct gestoppt oder heruntergefahren", + "Er bleibt gestoppt, bis ihn jemand startet" + ], + [ + "Ein Backup, eine Migration oder eine ProxMenux-Operation arbeitet daran", + "Nichts wird getan, bis das endet" + ], + [ + "Er war beim Start des Hosts bereits gestoppt", + "Er bleibt gestoppt; dafür ist Mit Proxmox starten zuständig" + ], + [ + "Es stoppt direkt nach dem Start", + "Bei einer Anwendung, die Sekunden nach dem Start wieder stoppt oder gar nicht startet, werden fünf Startversuche unternommen. Dazwischen liegen Wartezeiten von 30 Sekunden, 1, 2 und 5 Minuten. Danach bleibt sie gestoppt und eine Benachrichtigung wird gesendet" + ] + ] + } + }, + { + "p": "Das Installationsprogramm fragt in beiden Installationsmodi danach und schlägt den im Anwendungsrezept angegebenen Wert vor. Später lässt sich die Einstellung unter Installierte OCI-Anwendungen verwalten oder mit dem Schalter Watchdog des Containers in ProxMenux Monitor ändern. Sie gilt für alle Container einer Anwendung mit mehreren Containern. Ein einziger Host-Dienst, proxmenux-oci-watchdog.service, überwacht alle Anwendungen, für die dies aktiviert wurde; seine Installation erscheint auf der Registerkarte Änderungen von Audit & Report." + }, + { + "calloutInfo": { + "title": "Was der Host nicht sagen kann", + "body": "Der Exit-Code der Anwendung erreicht den Host nicht. Daher sind ein reguläres Beenden und ein Absturz nicht unterscheidbar; in beiden Fällen wird neu gestartet, wie bei always und unless-stopped in Docker. Ein außerhalb von Proxmox mit lxc-stop oder systemctl angeforderter Stopp hinterlässt keinen Stopp-Task und wird als selbstständiges Beenden gewertet." + } + } + ] + }, + { + "id": "restore", + "title": "Backup, Wiederherstellung und ein weiterer Host", + "intro": "Eine mit vzdump oder Proxmox Backup Server erstellte Sicherung enthält den Container, die für die Sicherung ausgewählten Containerlaufwerke und die Kopie seines Vertrags. Was die Installation auf dem Host speichert, ist nicht darin enthalten. Installierte OCI-Anwendungen verwalten erkennt Container, die auf einem Host ohne ihren Vertrag wiederhergestellt wurden, etwa nach einer Proxmox-Neuinstallation oder auf einem anderen Host, und bietet ihre erneute Registrierung an.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Wiederherstellen der Container in Proxmox", + "body": "Vom Sicherungsspeicher, mit der ursprünglichen ID oder einer beliebigen freien ID. Bei einer Anwendung mit mehreren Containern werden alle ihre Container benötigt." + }, + { + "title": "Installierte OCI-Anwendungen verwalten öffnen", + "body": "Die wiederhergestellten Container werden aufgelistet und die Wiederherstellung ihrer Registrierung wird angeboten. Die Schaltfläche Wiederherstellen auf der Registerkarte Aktualisierungen von ProxMenux Monitor öffnet denselben Vorgang." + }, + { + "title": "Überprüfen Sie vor dem Wechsel", + "body": "Die Wiederherstellung überprüft, ob der Host alles hat, was jede Anwendung benötigt. Eine Anwendung, die nicht als Ganzes wiederhergestellt werden kann, bleibt so, wie sie gefunden wurde, mit dem Grund." + }, + { + "title": "Registrieren und starten", + "body": "Der Vertrag wird auf diesem Host registriert und was die Installation darauf aufbewahrt, wird erneut geschrieben. Das Starten der Anwendungen ist eine separate Frage, die mit Nein beantwortet wird, wenn die ursprünglichen Container noch auf einem anderen Host ausgeführt werden." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/restore-offer.png", + "alt": "Dialog, der die wiederhergestellten Container auflistet und anbietet, sie wiederherzustellen", + "caption": "Die beim Öffnen von „Installierte OCI-Anwendungen verwalten“ angebotene Wiederherstellung." + } + }, + { + "table": { + "headers": [ + "Was der Host behalten hat", + "Nach der Wiederherstellung" + ], + "rows": [ + [ + "Instanzvertrag", + "Wird aus der Kopie im Container registriert und mit der von Proxmox wiederhergestellten Konfiguration abgeglichen" + ], + [ + "Privates Netzwerk einer Multicontainer-Anwendung", + "Wird mit derselben Bridge und demselben Subnetz neu erstellt; die festen Adressen der Container ändern sich nicht" + ], + [ + "Startreihenfolge einer Anwendung mit mehreren Containern", + "Das Abhängigkeits-Hookscript und sein Vertrag werden wieder installiert; Snippets sind auf dem local-Speicher aktiviert, wenn kein Speicher sie akzeptiert" + ], + [ + "Netzwerk sysctls und Host-Monitor-Datei", + "Nochmals geschrieben in /etc/pve/proxmenux" + ], + [ + "NVIDIA Laufzeit", + "Der Hook eines unprivilegierten Containers wird erneut installiert. Ein privilegierter Container erhält die Treiberdateien dieses Hosts statt der Dateien seines ursprünglichen Hosts" + ], + [ + "Rclone mount", + "Das Hookscript und die Programme, die das Mount veröffentlichen, werden erneut geschrieben, mit den gleichen Ansichten auf dem Host" + ], + [ + "Host-Firewallregel eines Host-Monitors", + "Wird erneut abgefragt, für seinen Web-Port und das Subnetz der Bridge auf diesem Host" + ], + [ + "lost+found jeder wiederhergestellten Festplatte", + "Wird entfernt, wenn es leer ist; bei einer Wiederherstellung wird es angelegt, und manche Anwendungen starten nicht, wenn es in ihrem Datenverzeichnis liegt" + ], + [ + "Disks auf einem anderen Speicher wiederhergestellt", + "Der Vertrag wird auf den Speicher aktualisiert, auf dem sie sich jetzt befinden" + ] + ] + } + }, + { + "p": "Ein mit einer anderen ID wiederhergestellter Container behält seine Anwendung. Der Vertrag, sein Konsolenprotokoll, seine Netzwerk-sysctls, das Hookscript einer Rclone-Einhängung und die Startreihenfolge einer Anwendung mit mehreren Containern werden mit den IDs registriert, die die Container auf diesem Host haben." + }, + { + "table": { + "headers": [ + "Was eine Wiederherstellung verhindert", + "Was zu tun ist" + ], + "rows": [ + [ + "Ein Container einer Multicontainer-Anwendung fehlt", + "Stellen Sie es auch wieder her; Die Anwendung wird als Ganzes wiederhergestellt" + ], + [ + "Das private Subnetz wird bereits auf diesem Host verwendet", + "Die Wiederherstellung wird abgebrochen und nichts wird geändert: Die Adressen der Container sind fixiert und werden nicht in ein anderes Subnetz verschoben" + ], + [ + "Ein Hostverzeichnis existiert nicht", + "Mounten oder erstellen Sie es mit seinen Daten; ein Backup des Containers enthält keine Hostverzeichnisse" + ], + [ + "Ein Gerät existiert nicht auf diesem Host", + "Verbinden Sie es oder entfernen Sie es aus dem Container in Proxmox" + ], + [ + "Eine Anwendung mit NVIDIA auf einem Host ohne Treiber", + "Installieren Sie den NVIDIA-Treiber und das Container Toolkit" + ], + [ + "Das Backup wurde erstellt, bevor die Kopie des Vertrages existierte", + "Der Container bleibt als gewöhnlicher LXC und wird nicht wieder angeboten" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Ein Container, der zurückkommt", + "body": "Ein Container, der von einem älteren Backup wiederhergestellt, zu einem Snapshot zurückgerollt oder von einem anderen Knoten zurückgegeben wurde, trägt den Vertrag des Zustands, in dem er sich befindet. Wenn es für eine Operation ausgewählt wird und sein Vertrag von dem dieses Hosts abweicht, startet die Operation nicht und der Container wird zur Wiederherstellung angeboten." + } + }, + { + "figure": { + "src": "/oci-manager/restore-result.png", + "alt": "Ergebnis der Wiederherstellung mit privatem Netzwerk, Startreihenfolge und registrierten Containern", + "caption": "Das Ergebnis einer Wiederherstellung, Schritt für Schritt." + } + } + ] + }, + { + "id": "remove", + "title": "Entfernen einer OCI-Anwendung", + "blocks": [ + { + "p": "Vor der Bestätigung wird eine Zusammenfassung aus der tatsächlichen Konfiguration erstellt: die zu entfernenden Container, die damit gelöschten Daten, das freigegebene private Netzwerk und die erhaltenen Hostverzeichnisse. Die Bestätigung steht standardmäßig auf Nein, da die Daten gelöschter Laufwerke anschließend nicht wiederhergestellt werden können." + }, + { + "table": { + "headers": [ + "Ressource", + "Beim Entfernen", + "Grund" + ], + "rows": [ + [ + "rootfs und Container-Festplatten", + "Gelöscht", + "Sie gehören nur zum Container" + ], + [ + "Hostverzeichnis", + "Bleibt mit seinem Inhalt erhalten", + "Andere Anwendungen können es verwenden" + ], + [ + "Host-Dateien des Containers", + "Gelöscht", + "Sein Konsolenprotokoll, Netzwerk-Sysctls, Rclone Mount Hookscript und seine Registrierung in der App-Registerkarte von ProxMenux Monitor dienen keinem anderen Container" + ], + [ + "Von mehreren Installationen gemeinsam genutzte Dateien", + "Gelöscht mit der letzten Installation, die sie verwendet", + "Die Host-Monitor-Datei und das Dependency-Hookscript von Multi-Container-Anwendungen" + ], + [ + "Instanzvertrag", + "Nach erfolgreicher Entfernung gelöscht", + "Kein CT ist mehr damit verbunden" + ], + [ + "Private Bridge eines Stacks", + "Mit dem Stack freigegeben", + "Es sind keine Mitglieder mehr zu verbinden" + ], + [ + "Von der Arr-Suite gemeinsam genutztes Netzwerk", + "Wird beim Entfernen der letzten Anwendung der Suite freigegeben", + "Jede Anwendung der Suite ist unabhängig und wird einzeln entfernt" + ], + [ + "Ein einzelnes Mitglied eines Stapels", + "Wird nicht einzeln entfernt", + "Die gesamte Anwendung wird entfernt, so dass kein Stapel unvollständig bleibt" + ], + [ + "Ein Container auf einem anderen Knoten des Clusters", + "Nicht entfernt", + "Seine Datensatz- und Hostdateien befinden sich auf dem Knoten, auf dem es installiert wurde: Es wird dort entfernt, nachdem es zurück migriert wurde." + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/remove-summary.png", + "alt": "Zusammenfassung zum Entfernen mit den betroffenen Containern, Daten und Hostverzeichnissen", + "caption": "Die Entfernungszusammenfassung, aufgebaut aus der realen Konfiguration." + } + } + ] + }, + { + "id": "archives", + "title": "Heruntergeladene Images und Speicherplatz auf dem Host", + "blocks": [ + { + "p": "Das OCI-Archiv dient zum Erstellen des rootfs; der laufende CT liest es nicht. Nach einer Installation oder Aktualisierung werden die dabei heruntergeladenen Archive mit ihrer Größe aufgelistet und zur Löschung angeboten. Ihre Löschung gibt Speicherplatz frei, ohne den Container oder seine Daten zu beeinträchtigen." + }, + { + "calloutInfo": { + "title": "Updates benötigen das Archiv nicht", + "body": "Ohne Archiv löst ein Update den gespeicherten Kanal auf und lädt den neuen Digest herunter. Mit ihm wird ein Archiv nur dann wiederverwendet, wenn seine Referenz und Integrität mit dem übereinstimmen, was angefordert wird." + } + } + ] + }, + { + "id": "registry", + "title": "Einträge und Bereinigung", + "blocks": [ + { + "p": "Beim Öffnen von Installierte OCI-Anwendungen verwalten werden zuerst Reste von Containern entfernt, die auf keinem Clusterknoten mehr existieren: der als Verlauf aufbewahrte Datensatz eines über die Proxmox-Oberfläche gelöschten Containers sowie Host-Dateien, die bei einer Entfernung zurückblieben. Ein Datensatz mit einem unterbrochenen Vorgang bleibt erhalten, da seine Sicherung noch benötigt werden könnte. Volumes und Hostverzeichnisse werden niemals aufgrund bloßer Schlussfolgerungen gelöscht." + } + ] + }, + { + "id": "cluster", + "title": "In einem Cluster: Migration und hohe Verfügbarkeit", + "intro": "Ein OCI-Container ist ein gewöhnlicher Proxmox-LXC: Er kann wie jeder andere migriert oder von HA verwaltet werden, mit denselben Einschränkungen. Alles, was er zum Starten benötigt, wird dort gespeichert, wo jeder Clusterknoten darauf zugreifen kann.", + "blocks": [ + { + "table": { + "headers": [ + "Teil", + "Auf einem anderen Knoten des Clusters" + ], + "rows": [ + [ + "Konsolenlogbuch", + "Der Container erstellt /var/log/proxmenux/oci vor dem Start auf dem jeweiligen ausführenden Knoten. Jeder Knoten behält das Protokoll der von ihm ausgeführten Starts." + ], + [ + "Netzwerk sysctls und Host-Monitor", + "Werden in /etc/pve/proxmenux gespeichert, das alle Clusterknoten gemeinsam nutzen, sodass ein migrierter Container sie findet." + ], + [ + "Containerfestplatten", + "Proxmox verschiebt sie mit dem Container. Für HA müssen ihre Daten auf dem Zielknoten verfügbar sein, über gemeinsamen Speicher oder eine unterstützte Replikationskonfiguration." + ], + [ + "Host-Verzeichnisse und Geräte", + "Die gleichen Regeln wie bei jedem LXC: Ein Host-Verzeichnis muss auf dem Zielknoten vorhanden sein und als gemeinsam genutzt markiert werden, und ein GPU, Coral oder NPU muss dort vorhanden sein." + ], + [ + "ProxMenux-Datensatz", + "Der Vertrag bleibt auf dem Knoten, auf dem die Anwendung installiert wurde; alle Knoten lesen die Kopie unter /etc/pve/priv/proxmenux/oci. Eine migrierte Anwendung mit einem einzelnen Container wird auf dem Zielknoten registriert, sobald Installierte OCI-Anwendungen verwalten geöffnet oder eine Aktion für sie gestartet wird. Eine Anwendung mit mehreren Containern wird dort zur Wiederherstellung angeboten, da ihr privates Netzwerk auf diesem Knoten erstellt werden muss." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Nicht für hohe Verfügbarkeit", + "body": "Eine Multicontainer-Anwendung erreicht ihre Mitglieder über eine private Brücke des Knotens, auf dem sie installiert wurde, so dass ihre Mitglieder auf diesem Knoten bleiben. Ein Hostmonitor, z. B. Glances im Hostmodus oder Netdata, überwacht den Knoten, auf dem er ausgeführt wird; das Bewegen würde einen anderen Knoten überwachen." + } + }, + { + "p": "Ein Backup, das außerhalb des Clusters wiederhergestellt wird, erhält die Dateien von /etc/pve/proxmenux, die der Container verwendet, wenn die Anwendung wiederhergestellt wird." + } + ] + }, + { + "id": "channel", + "title": "Ein Rolling Tag ist kein unbeaufsichtigtes Update", + "blocks": [ + { + "p": "Der Katalog installiert das vom Maintainer veröffentlichte Rolling-Tag. Der tatsächliche Digest wird aufgelöst und aufgezeichnet und nur durch eine explizite Aktualisierung mit Vorabprüfung und Rollback geändert. ProxMenux Monitor vergleicht den installierten Digest mit dem von der Registry veröffentlichten Digest und zeigt und meldet, wenn ein neues Image verfügbar ist." + } + ] + } + ] +} diff --git a/web/messages/de/docs/oci-manager/monitor.json b/web/messages/de/docs/oci-manager/monitor.json new file mode 100644 index 00000000..9f02cd8b --- /dev/null +++ b/web/messages/de/docs/oci-manager/monitor.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "OCI Container in ProxMenux Monitor | ProxMenux", + "description": "Was ProxMenux Monitor für einen mit OCI manager Apps installierten Container zeigt: Anwendungs- und Image-Versionen, neue Images, Konsolenausgabe und Proxmox-VE-Terminal." + }, + "header": { + "title": "In ProxMenux Monitor", + "description": "Ein mit OCI manager Apps installierter Container erscheint wie jeder andere LXC unter VMs & LXCs. Sein Detaildialog liest den Installationsdatensatz: Anwendungs- und Image-Versionen, neue Images, Konsolenausgabe und Terminal.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Die Aufzeichnung ist die Quelle", + "body": "OCI manager Apps kennt die installierte Anwendung und ihre Herkunft. Der Monitor liest diesen Installationsdatensatz, statt die Anwendung im Container zu untersuchen. Diese Informationen stehen deshalb sowohl bei laufendem als auch bei gestopptem Container zur Verfügung." + } + }, + { + "table": { + "headers": [ + "Tab.", + "Was ändert sich für einen OCI Container" + ], + "rows": [ + [ + "Status", + "Ein Watchdog Switch unter Start beim Booten: Die Anwendung wird wieder gestartet, wenn sie von selbst stoppt" + ], + [ + "App", + "Die Anwendung wird aus dem Datensatz identifiziert und Updates werden nach Image verfolgt" + ], + [ + "Aktualisierungen", + "Das Image wird aktualisiert oder die Anwendung geändert, mit dem gleichen Ablauf wie das OCI-Menü" + ], + [ + "Mounts", + "Containerfestplatten und Hostverzeichnisse mit ihrer Belegung" + ], + [ + "Protokolle", + "Nur für OCI-Container: die Konsolenausgabe der Anwendung" + ] + ] + } + } + ] + }, + { + "id": "app", + "title": "App", + "intro": "Die Registerkarte App bietet die installierte Anwendung als Erkennung mit dem Namen, dem Logo, dem Port und dem Schema des Datensatzes. Die Registrierung öffnet den Editor mit der Methode OCI-Image (installiert von ProxMenux), die keine Konfiguration benötigt.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "boxes", + "title": "Anwendung", + "body": "Die Version der Anwendung im Image, gelesen aus dem Image selbst: seine Umgebung oder seine org.opencontainers.image.version Label. Es ist informativ." + }, + { + "icon": "archive", + "title": "Image", + "body": "Das Build-Datum und der Digest des installierten Images. Das Update wird hier entschieden: Der installierte Digest wird mit dem verglichen, den die Registry heute für dasselbe Tag veröffentlicht." + } + ] + } + }, + { + "list": { + "items": [ + "Wenn die Registry einen neuen Digest veröffentlicht, zeigt die Karte Neues Image mit seinem Datum und Digest an, auch wenn sich die Anwendungsversion im Inneren nicht geändert hat: Ein Neuaufbau auf einer aktualisierten Basis ist ein Update.", + "Wenn die Digests übereinstimmen, liest die Karte Version.", + "Die Karte verlinkt auf das Repository des Images: das GitHub-Projekt oder die Docker-Hub-Seite für ein offizielles Image.", + "Der Zugangslink verwendet die LAN-Adresse des Containers, auch für das Hauptmitglied einer Multicontainer-Anwendung, die eine zweite Adresse in ihrem privaten Netzwerk hat.", + "Die Schaltfläche Daten aktualisieren liest den Datensatz und die Registry erneut. Die Optionen zum Suchen oder Registrieren weiterer Anwendungen werden nicht angeboten: Der Container enthält genau die Anwendung seines Datensatzes." + ] + } + }, + { + "figure": { + "src": "/oci-manager/monitor-app-tab.png", + "alt": "App-Tab eines OCI-Containers mit Anwendungsversion, Image und Repository-Link", + "caption": "Registerkarte App eines mit OCI manager Apps installierten Containers." + } + }, + { + "p": "Der Check läuft einmal täglich mit den Update-Checks des Monitors und Daten aktualisieren führt ihn sofort aus. Ein neues Image wird als Benachrichtigung über die in Benachrichtigungen konfigurierten Kanäle gesendet. Das Update wird über den Tab Updates angewendet." + } + ] + }, + { + "id": "updates", + "title": "Aktualisierungen", + "intro": "Bei einem mit OCI manager Apps installierten Container zeigt die Registerkarte Updates die Anwendung mit ihrem installierten Image und gegebenenfalls dem neuen Image aus der Registry, im selben Format wie andere Anwendungen. Die Paket- und Anwendungs-Updater eines gewöhnlichen LXC werden nicht angeboten.", + "blocks": [ + { + "table": { + "headers": [ + "Schaltfläche", + "Was es öffnet" + ], + "rows": [ + [ + "Aktualisierung", + "Die Aktualisierung aus Installierte OCI-Anwendungen verwalten für diesen Container im Monitor-Terminal. Sie kann mit oder ohne neues Image ausgeführt werden; ohne neues Image wird nichts verändert. Bei einer Multicontainer-Anwendung werden alle Mitglieder aktualisiert." + ], + [ + "Ändern", + "Der Editor der Anwendung (Ressourcen, Netzwerk, Pfade und GPU). In einer Multicontainer-Anwendung werden die zusätzlichen Pfade und Geräte des Anwendungscontainers hinzugefügt oder entfernt und in Immich wird geändert, was die Erkennung ausführt." + ], + [ + "Wiederherstellen", + "Ersetzt Update, wenn eine Operation auf dem Container unterbrochen wurde, und öffnet seine Wiederherstellung." + ], + [ + "Wiederherstellen (wiederhergestellter Container)", + "Wird für einen aus einem Backup wiederhergestellten Container ohne Vertrag auf diesem Host unter Wiederhergestellte OCI-Anwendung angezeigt. Öffnet die Wiederherstellung im Monitor-Terminal; Aktualisieren und Ändern erscheinen nach der Registrierung." + ] + ] + } + }, + { + "p": "Externe Änderungen, Hostverzeichnisse und Multicontainer-Anwendungen werden wie im OCI-Menü behandelt. In einer Multicontainer-Anwendung erscheinen die Buttons und die Optionen nur auf dem Hauptcontainer; die anderen Mitglieder zeigen ihr Image, eine Notiz, dass sie vom Hauptcontainer aktualisiert werden, und eine Schaltfläche, die es öffnet. Wenn das Terminal schließt, werden das Image, der Datensatz und die Mounts erneut gelesen." + }, + { + "table": { + "headers": [ + "Option", + "Verhalten" + ], + "rows": [ + [ + "Das vor dem Update erstellte Backup behalten", + "Jedes Update sichert den Container, um ihn wiederherzustellen, wenn das Update fehlschlägt. Mit dieser Option wird dasselbe Backup im ausgewählten Speicher gespeichert und erscheint unter den Backups des CT; auf Proxmox Backup Server wird vor dem Update ein Backup geschrieben." + ], + [ + "Geplante Updates", + "Das Image wird zum gewählten Zeitpunkt nur aktualisiert, wenn die Registry ein neues veröffentlicht, und optional nur, wenn es 1, 3, 7 oder 14 Tage alt ist. Ein Container mit Änderungen außerhalb von ProxMenux wird übersprungen und gemeldet." + ] + ] + } + } + ] + }, + { + "id": "logs", + "title": "Protokolle", + "intro": "Die Registerkarte Logs erscheint nur bei mit OCI manager Apps installierten Containern, zwischen Mounts und Backups. Sie zeigt Standardausgabe und Standardfehler des Hauptprozesses des Images, entsprechend der Ausgabe von docker logs bei Docker-Containern.", + "blocks": [ + { + "list": { + "items": [ + "Die Ausgabe wird auf dem Host in /var/log/proxmenux/oci/VMID.console.log (Modus 0600) vom ersten Start und über Neustarts gehalten, so dass sie mit gestopptem Container gelesen werden kann.", + "Die Datei wird bei 10 MB gedreht und behält drei komprimierte Kopien (/etc/logrotate.d/proxmenux-oci).", + "Jeder Start des Containers wird in der Ausgabe markiert. Die Registerkarte zeigt die Ausgabe seit dem letzten Start standardmäßig; Vollständiger Verlauf zeigt auch die vorherigen.", + "Wenn die Anwendung entfernt wird, wird ihre Ausgabe mit ihr entfernt.", + "Die letzten 100-, 500- oder 1000-Zeilen werden gezeigt. Während der Container läuft, werden neue Zeilen live verfolgt; das Scrollen nach oben pausiert das Folgen und Follow nimmt es wieder auf.", + "Ein Filter zeigt nur die Zeilen an, die einen Text enthalten, und Herunterladen speichert die geladenen Zeilen.", + "Farbcodes werden entfernt und eine Zeile, die eine Fortschrittsleiste neu zeichnet, wird in ihrem endgültigen Zustand angezeigt.", + "Die Registerkarte liest die Datei bei jedem Öffnen; es wird nicht zwischengespeichert." + ] + } + }, + { + "calloutInfo": { + "title": "Zugangsdaten beim ersten Start", + "body": "Images, die ein generiertes Passwort beim ersten Start ausdrucken, lassen es in dieser Ausgabe, wie docker logs. Der Installateur liest es von dort aus, um es in seiner Zusammenfassung zu zeigen." + } + }, + { + "figure": { + "src": "/oci-manager/monitor-logs-tab.png", + "alt": "Logs Tab mit dem Konsolenausgang eines OCI-Containers, dem Zeilenwähler, dem Filter und der Follow-Taste", + "caption": "Konsolenausgabe eines OCI-Containers." + } + } + ] + }, + { + "id": "terminal", + "title": "Proxmox VE Konsole", + "blocks": [ + { + "p": "Ein OCI-Image startet seinen eigenen Prozess als PID 1 und keinen Anmeldedienst. Die übliche LXC-Konsole würde deshalb ein Terminal ohne antwortenden Login-Prozess öffnen. Mit OCI manager Apps installierte Container erhalten cmode: shell: Die Proxmox-VE-Konsole öffnet über lxc-attach eine Shell, entsprechend docker exec. Die laufende Anwendung bleibt dabei unverändert." + }, + { + "list": { + "items": [ + "Die Shell ist diejenige, die /etc/passwd dem Root im Image gibt. Ein Image, dessen Root keine Shell hat oder keine ausliefert, behält die Standardkonsole.", + "Die Shell ist root im Container, ohne Passwort. Wer es öffnen kann, wird durch die VM.Console-Berechtigung von Proxmox VE entschieden.", + "Das Terminal des Monitors betritt den Container mit pct enter, was auf die gleiche Weise funktioniert." + ] + } + } + ] + }, + { + "id": "mounts", + "title": "Mounts", + "blocks": [ + { + "p": "Die Registerkarte Mounts listet die Festplatten und Hostverzeichnisse des Containers auf. Die Belegung einer Containerfestplatte auf Blockspeicher wie LVM-thin wird aus deren Dateisystem gelesen, das nur im Container eingehängt ist." + } + ] + } + ] +} diff --git a/web/messages/de/docs/oci-manager/stacks.json b/web/messages/de/docs/oci-manager/stacks.json new file mode 100644 index 00000000..9a00532a --- /dev/null +++ b/web/messages/de/docs/oci-manager/stacks.json @@ -0,0 +1,404 @@ +{ + "meta": { + "title": "Multicontainer-Anwendungen | ProxMenux", + "description": "Wie OCI manager Apps eine Anwendung mit Datenbank und Cache als koordinierte native LXCs umsetzt: Planung, privates Netzwerk, Abhängigkeits-Hook, Validierung und transaktionale Aktualisierungen." + }, + "header": { + "title": "Anwendungen mit mehreren Containern", + "description": "Eine Anwendung mit Datenbank, Cache und anderen Diensten wird zu mehreren koordinierten nativen LXCs, die als eine installiert und aktualisiert werden.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Eine Anwendung für den Benutzer, mehrere LXCs für Proxmox VE", + "body": "Eine Multicontainer-Definition ist ein Eintrag des Katalogs. Der Installer erstellt einen nativen LXC pro Dienst und behält seine Abhängigkeiten explizit. Immich, Nextcloud, Paperless-ngx und Tandoor werden auf diese Weise installiert." + } + }, + { + "mermaid": { + "chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}
{{appNet}}\"]\n O --> D[\"{{db}}
{{private}}\"]\n O --> R[\"{{cache}}
{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A", + "labels": { + "plan": "Stack-Plan", + "app": "Anwendungs-LXC", + "appNet": "LAN + privat", + "db": "PostgreSQL LXC", + "cache": "Valkey LXC", + "private": "privat" + } + } + } + ] + }, + { + "id": "plan", + "title": "1. Der Plan, bevor ein Container existiert", + "blocks": [ + { + "p": "Es wird kein LXC erstellt, während die Compose-Definition interpretiert wird. Ein vollständiger Plan steht an erster Stelle, mit jedem Mitglied, Image, VMID, Netzwerk, Pfad, Geheimnis, Ordnung und Gesundheitscheck. Wenn der Plan nicht konsistent ist, wird die Installation nicht gestartet." + }, + { + "table": { + "headers": [ + "Planelement", + "Inhalt", + "Vor dem Erstellen geprüft" + ], + "rows": [ + [ + "Mitglieder", + "Hauptanwendung, Datenbank, Cache, maschinelles Lernen und andere Abhängigkeiten", + "Einzigartige VMIDs, bekannte Rollen und genau ein Hauptmitglied" + ], + [ + "Images", + "Rollende Referenz, Architektur und aufgelöster Digest jedes Dienstes", + "Alle existieren, unterstützen die Architektur und bestehen die OCI-Integritätsprüfung" + ], + [ + "Netzwerk", + "Private Bridge, Subnetz, eine feste Adresse pro Dienst und LAN-Zugang für das Hauptmitglied", + "Keine Kollision mit vorhandenen Brücken oder Subnetzen und keine wiederholte Adresse" + ], + [ + "Persistenz", + "Container-Disks, Host-Verzeichnisse, Besitzer und Backup", + "Keine überlappenden Pfade, Speicher verfügbar und deklarierte Berechtigungen" + ], + [ + "Geheimnisse", + "Datenbankpasswort, Anwendungsschlüssel und erste Anmeldeinformationen", + "Einmal generiert und nur an die Mitglieder gegeben, die sie verwenden" + ], + [ + "Lebenszyklus", + "Start-Order, Stop-Order und Gesundheitscheck pro Mitglied", + "Die Hauptanwendung startet zuletzt und stoppt zuerst" + ] + ] + } + } + ] + }, + { + "id": "create", + "title": "2. Erstellung, Mitglied für Mitglied", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Reservieren Sie jeden VMID", + "body": "Das Proxmox-VE-Inventar und das Instanzverzeichnis werden geprüft. Ein vorhandener CT wird nicht übernommen; ein Vertrag, der noch zu einer anderen Instanz gehört, wird nicht wiederverwendet." + }, + { + "title": "Jedes Image vorbereiten", + "body": "Alle Images werden aufgelöst, heruntergeladen und verifiziert, bevor der erste Container erstellt wird." + }, + { + "title": "Erstellen Sie alle Rootfs", + "body": "Die offiziellen OCI-Metadaten werden importiert und die ProxMenux-Instanzidentität und die Mitgliedsrolle hinzugefügt." + }, + { + "title": "Privates Netzwerk", + "body": "Eine Brücke und ein Subnetz werden erstellt und jedes Mitglied erhält seine feste Adresse; nur das Hauptmitglied erhält auch die LAN-Schnittstelle." + }, + { + "title": "Persistenz", + "body": "Jede Datenbank und Konfiguration erhält eine eigene Containerplatte; nur Daten, die freigegeben werden sollen, verwenden Hostverzeichnisse." + }, + { + "title": "Umgebung", + "body": "Interne Endpunkte, Shared Secrets und Servicevariablen werden geschrieben. Die Anwendung erreicht ihre Abhängigkeiten an ihren reservierten Privatadressen." + }, + { + "title": "Aufzeichnung", + "body": "Jedes Mitglied zeichnet seine native Konfiguration, die Rootfs-Änderungen, die Updates reproduzieren müssen, und seine Beziehung zum Stack auf." + } + ] + } + } + ] + }, + { + "id": "checks", + "title": "3. Starten und Überprüfen Sie jeden Container", + "intro": "Ein erstellter LXC bedeutet noch keinen betriebsbereiten Dienst. Die Abhängigkeiten starten der Reihe nach und durchlaufen jeweils eine dienstspezifische Prüfung.", + "blocks": [ + { + "table": { + "headers": [ + "Dienst", + "Überprüfung", + "Was es zeigt" + ], + "rows": [ + [ + "PostgreSQL", + "pg_isready im CT mit erwartetem Host, Benutzer und Datenbank", + "Der Server akzeptiert Verbindungen für die konfigurierte Datenbank" + ], + [ + "Redis / Valkey", + "redis-cli oder valkey-cli PING gegen seine Privatadresse", + "Der Broker hört zu und antwortet" + ], + [ + "Immich Maschinelles Lernen", + "HTTP GET /ping, plus eine Überprüfung der ausgewählten GPU-Laufzeit", + "Der Service antwortet und die angeforderte Beschleunigung ist nicht auf CPU zurückgefallen" + ], + [ + "Nextcloud", + "GET /status.php mit installed=true, maintenance=false und needsDbUpgrade=false", + "Initialisierung ohne anstehende Migration beendet" + ], + [ + "Paperless-ngx / Tandoor", + "HTTP über die LAN-Adresse und den realen Port des Dienstes", + "Das Frontend und seine Abhängigkeiten stellen die Anwendung bereit" + ], + [ + "Hauptanwendung", + "Der Endpunkt seines Templates, zum Beispiel /api/server/ping in Immich", + "Der gesamte Stapel arbeitet durch die Anwendung, die die Abhängigkeiten verwendet" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Laufend bedeutet nicht funktionsfähig", + "body": "Der laufende Zustand sagt nur, dass der LXC-Prozess existiert. Wenn der Dienst eine bessere Prüfung bietet, wird eine Exec- oder HTTP-Prüfung mit einem Timeout verwendet. Wenn ein Mitglied stoppt oder seine Prüfung nicht besteht, wird der Stapel nicht als installiert deklariert." + } + } + ] + }, + { + "id": "hook", + "title": "4. Der Abhängigkeits-Hook", + "blocks": [ + { + "p": "Der Haken wird nur auf den Hauptcontainer eines abhängigen Stapels gesetzt. Proxmox VE behält das Skript als Snippet und führt es als hookscript dieses CT aus. Das Stack-Rezept ist nicht im Skript geschrieben: Es befindet sich in einem separaten privaten Vertrag." + }, + { + "codeGrid": { + "items": [ + { + "title": "Hauptkonfiguration CT", + "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" + }, + { + "title": "Privatvertrag (Beispiel)", + "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" + } + ] + } + }, + { + "snippet": { + "summary": "Vollständige Quelle von proxmenux-stack-dependencies.sh", + "pathCode": "local:snippets/proxmenux-stack-dependencies.sh", + "snippetCode": "stackDependencyHook" + } + }, + { + "p": "Das Skript ist für jeden Stack gleich. VMIDs, Namen, Prüftypen und Timeouts stammen aus dem privaten Vertrag /etc/pve/priv/proxmenux-stack-VMID.json jedes Stacks." + }, + { + "steps": { + "items": [ + { + "title": "Proxmox VE ruft pre-start auf", + "body": "Bevor der Haupt-CT startet, läuft der Hook mit seinem VMID und der Lebenszyklusphase." + }, + { + "title": "Eine Sperre pro Stack", + "body": "flock auf /run/lock/proxmenux-stack-VMID.lock verhindert zwei Startsequenzen gleichzeitig." + }, + { + "title": "Der Vertrag wird gelesen und validiert", + "body": "Ein bekanntes Schema, numerische Abhängigkeiten, Labels, ein exec, http oder Running Check und ein positives Timeout sind erforderlich." + }, + { + "title": "Abhängigkeiten in der Reihenfolge", + "body": "Jeder CT muss vorhanden sein; ein gestoppter wird gestartet und ein bereits laufender wird nicht neu gestartet." + }, + { + "title": "Auf Betriebsbereitschaft warten", + "body": "Der Check läuft alle zwei Sekunden, und der CT wird ebenfalls bestätigt, dass er noch läuft." + }, + { + "title": "Der Haupt-CT startet", + "body": "Wenn jede Abhängigkeit bereit ist, endet der Vorstart und Proxmox VE startet die Anwendung." + } + ] + } + }, + { + "calloutInfo": { + "title": "Der Haken stoppt Abhängigkeiten nicht", + "body": "Die Post-Start-, Pre-Stop- und Post-Stop-Phasen tun nichts. Das Stoppen des Haupt-CT lässt PostgreSQL, Redis, Valkey oder Machine Learning laufen. Der Hook ordnet den Start an; er verwandelt nicht mehrere LXCs in einen Prozess." + } + }, + { + "table": { + "headers": [ + "Typ", + "Beispiel", + "Spätere Starts" + ], + "rows": [ + [ + "Abhängiger Stapel", + "Immich, Nextcloud, Anwendung mit PostgreSQL", + "Der Haken des Haupt-CT startet die Abhängigkeiten und wartet auf sie" + ], + [ + "Anwendungssuite", + "Arr Suite", + "Kein Hauptmitglied: jeder LXC folgt seinem eigenen onboot" + ], + [ + "Einzelne Anwendung", + "Jellyfin", + "Proxmox VE startet diesen LXC direkt" + ] + ] + } + } + ] + }, + { + "id": "stack-checks", + "title": "5. Kontrollen am Stapel als Ganzes", + "blocks": [ + { + "list": { + "items": [ + "Jede VMID existiert, ist einzigartig und behält die erwartete Instanzidentität.", + "Jeder Vertrag gehört zum selben Stack, behält seine Rolle und seine aufgezeichnete native Konfiguration.", + "Das Hauptmitglied ist das letzte in start_order und das erste in stop_order.", + "Es fehlt keine Member-, Volume- oder Rootfs-Adaption.", + "Der Haken zeigt auf das offizielle Snippet, sein Inhalt ist unverändert und sein Vertrag entspricht dem Stapelrezept.", + "Die beobachteten Images und Digests stimmen mit den vorbereiteten OCI-Archiven überein.", + "Geräte, GPU-Profile, Mounts, Geheimnisse und Endpunkte stimmen immer noch mit den Verträgen überein.", + "Nachdem alle Abhängigkeiten ihre Prüfung bestanden haben, prüft der Endpunkt der Hauptanwendung die Integration zwischen den Mitgliedern." + ] + } + } + ] + }, + { + "id": "manage", + "title": "Verwalten eines installierten Stapels", + "intro": "Unter Installierte OCI-Anwendungen verwalten führt jedes Mitglied zum gesamten Stack. Das Menü bietet Alle Container der Anwendung aktualisieren, Zusätzliche Pfade und Geräte ändern, Alle Container mit ihrer gespeicherten Konfiguration neu erstellen und Entfernen: Anwendung und Container löschen. Die Neuerstellung baut jeden Container anhand des gespeicherten Digests aus seinem ursprünglichen Image neu auf, ohne nach einem neueren zu suchen. Sie verwendet dieselben Schritte wie ein Update und wird für aktualisierbare Stacks angeboten.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Jedes Mitglied", + "body": "Der Vertrag des Mitglieds nennt die Haupt-VMID und die vollständige Liste der Mitglieder." + }, + { + "title": "Der Stapel ist reproduzierbar", + "body": "Identitäten, Verträge, Hook, Anpassungen und eine koordinierte Wiederholung für dieses Rezept werden validiert." + }, + { + "title": "Images zuerst", + "body": "Die Anwendung wird nicht gestoppt, bis jeder Digest gelöst, heruntergeladen und verifiziert wurde." + }, + { + "title": "Stoppen und sichern Sie das Set", + "body": "Verifizierte native Backups werden mit gestopptem Stack übernommen, sodass Anwendung und Datenbanken zum selben Zeitpunkt gehören." + }, + { + "title": "Aktualisieren und überprüfen Sie jedes Mitglied", + "body": "Anpassung, Netzwerk, Mounts, Geheimnisse und Geräte werden vor dem Gesundheitscheck jedes Mitglieds erneut angewendet." + }, + { + "title": "Alles veröffentlichen oder wiederherstellen", + "body": "Die neuen Verträge werden nur veröffentlicht, wenn jedes Mitglied besteht. Wenn einer scheitert, wird jedes Mitglied wiederhergestellt." + } + ] + } + }, + { + "table": { + "headers": [ + "Ändern", + "Was sich ändert", + "Was erhalten bleibt" + ], + "rows": [ + [ + "Extra Pfade und Geräte", + "Sie werden dem Anwendungscontainer hinzugefügt oder daraus entfernt, der neu gestartet wird. Es wird nichts neu erstellt", + "Die Daten der Anwendung, ihrer Datenbank und der anderen Container" + ], + [ + "Was die Erkennung ausführt (Immich)", + "Der Machine Learning Container nimmt das Image und die Geräte des CPU oder eines GPU des Hosts auf. Die gesamte Anwendung wird gestoppt und aktualisiert, wie in einem Update", + "Der Modell-Cache, die Bibliothek und die Datenbank. Wenn etwas fehlschlägt, werden die vorherigen Container und die vorherige Auswahl wiederhergestellt" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Ein Stack ohne koordinierte Wiederholung wird nicht aktualisiert", + "body": "Wenn die Vorbereitung eines Stapels nicht reproduziert werden kann, wird die Aktualisierung abgelehnt, bevor der Stapel gestoppt wird. Die Anwendung läuft so, wie sie ist." + } + } + ] + }, + { + "id": "failure", + "title": "6. Wenn etwas versagt", + "blocks": [ + { + "p": "Während einer Installation stoppt und entfernt ein Fehler die unvollständigen Container, die die Operation erstellt hat, und die private Bridge, wenn die Operation sie erstellt hat. Ein Stack wird nicht als gültig veröffentlicht, bis die gesamte Sequenz beendet ist." + }, + { + "p": "Ein Update ist transaktional: Alle Images werden zuerst vorbereitet, dann stoppt der Stapel, jedes Mitglied wird gesichert und das Backup verifiziert, und nur dann werden alle Rootfs ersetzt. Mitglieder beginnen eins nach dem anderen mit ihrem Gesundheitscheck; Wenn einer fehlschlägt, wird jedes Mitglied aus dem gleichen Backup-Satz wiederhergestellt, so dass die Datenbank und die Anwendung niemals zu verschiedenen Momenten gehören." + }, + { + "mermaid": { + "chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]", + "labels": { + "prepare": "Jedes Image vorbereiten", + "stop": "Stop, Hauptelement zuerst", + "backup": "Verifiziertes Backup jedes CT", + "replace": "rootfs ersetzen", + "healthy": "Alle funktionsfähig?", + "yes": "Ja", + "no": "Nein", + "commit": "Verträge veröffentlichen", + "rollback": "Jedes Mitglied wiederherstellen" + } + } + } + ] + }, + { + "id": "not-assumed", + "title": "Was ein Stack nicht beinhaltet", + "blocks": [ + { + "list": { + "items": [ + "Eine in einem Fluss installierte Suite, wie die Arr-Suite, ist kein abhängiger Stapel: Ihre Container haben keine Startreihenfolge zwischen ihnen.", + "Das private Netzwerk ersetzt nicht die Authentifizierung, TLS oder die Konfiguration jeder Anwendung.", + "Das Backup eines LXC enthält nicht die Brücke, den Haken oder die Verträge des Rests des Stapels.", + "Prowlarr, Sonarr oder Radarr erhalten von ProxMenux keine Indexer, Profile oder Anbieter." + ] + } + } + ] + } + ] +} diff --git a/web/messages/de/docs/oci-manager/storage-network.json b/web/messages/de/docs/oci-manager/storage-network.json new file mode 100644 index 00000000..181d3bf3 --- /dev/null +++ b/web/messages/de/docs/oci-manager/storage-network.json @@ -0,0 +1,305 @@ +{ + "meta": { + "title": "Daten, Pfade und Netzwerk | ProxMenux", + "description": "So bewahrt OCI manager Apps die Daten eines OCI-Containers: Container-Datenträger, Host-Verzeichnisse, rclone-Mounts, Adressen und private Netzwerke." + }, + "header": { + "title": "Daten, Pfade und Netzwerk", + "description": "Was im rootfs liegt, was beim Ersetzen erhalten bleibt, wie Container Daten gemeinsam nutzen und wie jeder Container seine Adresse erhält.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Persistenz wird vor dem Erstellen des LXC festgelegt", + "body": "Vor dem Erstellen des Containers werden die vom Image und seiner Compose-Datei deklarierten Volumes ausgelesen. Jeder Pfad, der eine Aktualisierung überstehen muss, erhält einen vom rootfs unabhängigen Mountpoint. Das rootfs enthält damit nur die zum Image gehörenden Dateien und kann ersetzt werden." + } + } + ] + }, + { + "id": "questions", + "title": "Was der Installer abfragt", + "intro": "Die Vorlage gibt die von der Anwendung benötigten Pfade vor. Jeder wird auf einem Container-Datenträger oder in einem Host-Verzeichnis abgelegt. Vor der Zusammenfassung können weitere Pfade ergänzt werden.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Benötigte Pfade", + "body": "/config, /data, Bibliotheken, Downloads und alle von der Anwendung deklarierten Volumes werden aufgelistet." + }, + { + "title": "Speicherort", + "body": "Jeder Pfad wird auf einem Container-Datenträger oder in einem vorhandenen Host-Verzeichnis abgelegt." + }, + { + "title": "Speicher und Größe", + "body": "Ein Container-Datenträger wird mit der angegebenen Größe auf einem Proxmox-VE-Speicher erstellt. Die Standardinstallation verwendet local-lvm. Die erweiterte Installation fragt für jeden Pfad zuerst den Speicher und dann die Größe ab; vorgeschlagen wird der Speicher des rootfs. Der Datenträger erscheint als vm-VMID-disk-N und wird als mpN eingebunden." + }, + { + "title": "Host-Verzeichnis", + "body": "Das Host-Verzeichnis wird über seinen Pfad angegeben. Existiert es noch nicht, wird es angelegt und dem Host-Benutzer zugeordnet, auf den der Container-Benutzer abgebildet wird." + }, + { + "title": "Weitere Pfade", + "body": "Vor der Installation können weitere Zuordnungen von Host-Pfad oder Volume zu einem Pfad im Container ergänzt werden." + }, + { + "title": "Zusammenfassung", + "body": "Vor dem Erstellen des CT wird die vollständige Pfadzuordnung angezeigt und im Instanzvertrag gespeichert." + } + ] + } + } + ] + }, + { + "id": "options", + "title": "Die beiden persistenten Speicherorte", + "blocks": [ + { + "table": { + "headers": [ + "Eigenschaft", + "Container-Datenträger", + "Host-Verzeichnis" + ], + "rows": [ + [ + "In der Konfiguration", + "mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G", + "mpN: /mnt/oci-shared/media,mp=/data/media" + ], + [ + "Containersicherung (vzdump)", + "Mit backup=1 enthalten", + "Nicht enthalten" + ], + [ + "Größe", + "Festgelegt; durch Vergrößern des Mountpoints erweiterbar", + "Der freie Platz im Dateisystem oder Dataset des Hosts" + ], + [ + "Andere Container", + "Nur vom zugehörigen Container eingebunden", + "Dasselbe Verzeichnis kann in mehrere Container eingebunden werden" + ], + [ + "Snapshots und Wiederherstellung", + "Von Proxmox VE zusammen mit dem CT verwaltet", + "Im Speicher des Hosts verwaltet" + ], + [ + "Beim Entfernen der Anwendung", + "Wird mit dem Container gelöscht", + "Bleibt mit seinem Inhalt erhalten" + ], + [ + "Beim Verschieben des CT auf einen anderen Knoten", + "Wird mit dem CT verschoben", + "Derselbe Pfad muss auf dem anderen Knoten vorhanden sein" + ] + ] + } + }, + { + "p": "Das rootfs ist den Binärdateien und dem Inhalt des Images vorbehalten. Eine Aktualisierung oder Neuerstellung ersetzt es, ohne eine der beiden Arten von Mountpoints anzutasten." + } + ] + }, + { + "id": "example", + "title": "Beispiel: ein Container mit beiden Speicherorten", + "blocks": [ + { + "code": { + "title": "Jellyfin als CT 151 auf local-lvm installiert (Auszug)", + "code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media" + } + }, + { + "p": "Eine Aktualisierung oder Neuerstellung ersetzt nur das rootfs: mp0 bewahrt Benutzer, Bibliotheken und Einstellungen, während mp1 weiterhin dieselben Medien bereitstellt. Die Wiederherstellung der CT-Sicherung stellt /config wieder her. Das Medienverzeichnis wird bei Bedarf aus der Sicherung des Host-Speichers wiederhergestellt." + }, + { + "flow": { + "nodes": [ + { + "label": "Vertrag", + "detail": "/config" + }, + { + "label": "Speicherort", + "detail": "Container-Datenträger\noder Host-Verzeichnis" + }, + { + "label": "LXC", + "detail": "Für die Anwendung\nimmer /config" + } + ], + "caption": "Die Anwendung sieht den vom Image vorgegebenen Pfad. Nur der Speicherort ändert sich." + } + } + ] + }, + { + "id": "shared", + "title": "Ein Host-Verzeichnis, mehrere Container", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart TB\n H[\"{{host}}
/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent
/data\"]\n H --> J[\"Jellyfin
/data\"]\n H --> R[\"Radarr / Sonarr
/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]", + "labels": { + "host": "Host-Verzeichnis", + "config": "Eigene Konfiguration" + } + } + }, + { + "p": "Jeder Container speichert seine Konfiguration auf einem eigenen Datenträger. Bibliothek oder Downloads liegen in einem gemeinsamen Host-Verzeichnis, das in allen Containern unter demselben internen Pfad eingebunden wird. So ist der Pfad, in den eine Anwendung schreibt, derselbe, aus dem eine andere liest." + } + ] + }, + { + "id": "rclone", + "title": "Cloud-Speicher über die rclone-Anwendung", + "intro": "Der rclone-Eintrag im Katalog bietet neben der Installation auch Mount in einem vorhandenen rclone-OCI-Container aktivieren. Dabei wird ein bereits in der rclone-Weboberfläche angelegtes und autorisiertes Remote eingehängt und auf dem Host bereitgestellt. Andere Container können es als Host-Verzeichnis nutzen.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Container und Remote", + "body": "Die VMID des rclone-Containers, der genaue Name des Remotes und optional ein Pfad darin." + }, + { + "title": "Mount-Name und Cache", + "body": "Der Name des Mounts und der VFS-Cache-Modus: off, minimal, writes oder full (Standard)." + }, + { + "title": "Bereitgestellte Ansichten", + "body": "Ein gemeinsames Stammverzeichnis, standardmäßig /mnt/oci-shared, enthält eine Ansicht mit Lese- und Schreibzugriff unter /mnt/oci-shared/remotes/NAME sowie eine schreibgeschützte Ansicht unter /mnt/oci-shared/remotes-ro/NAME." + }, + { + "title": "Aktivierung", + "body": "Nach der Bestätigung wird der CT gestoppt. Sein Startbefehl und ein Proxmox-VE-Hookscript werden eingerichtet, dann wird er wieder gestartet. Der Vorgang wartet, bis beide Ansichten auf dem Host eingehängt sind." + } + ] + } + }, + { + "calloutInfo": { + "title": "Wenn der Mount nicht zustande kommt", + "body": "Die vorherige Container-Konfiguration wird wiederhergestellt und der Container erneut gestartet. Eine fehlgeschlagene Aktivierung lässt rclone damit im bisherigen Zustand." + } + } + ] + }, + { + "id": "network", + "title": "Adressen und Netzwerke", + "intro": "Eine einzelne Anwendung benötigt eine Adresse. Eine Anwendung aus mehreren Containern braucht zusätzlich ein stabiles Netzwerk zwischen ihren Mitgliedern.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "network", + "title": "Anwendung mit einem Container", + "body": "Gewählt werden die Netzwerk-Bridge sowie DHCP oder eine feste Adresse im CIDR-Format. Der LXC hat eine eigene Adresse, und die Zusammenfassung zeigt die vollständigen Dienst-URLs." + }, + { + "icon": "waypoints", + "title": "Anwendung mit mehreren Containern", + "body": "Ein freies Subnetz wird ermittelt und eine dauerhafte private Bridge erstellt. Jedes Mitglied – Anwendung, Datenbank und Cache – erhält dort eine feste Adresse." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "LAN", + "detail": "Erreichbare Adresse\nnur für den Hauptdienst" + }, + { + "label": "Haupt-LXC", + "detail": "Web / API\nLAN + privates Netzwerk" + }, + { + "label": "Privates Netzwerk", + "detail": "PostgreSQL · Valkey · ML\nfeste Adressen" + } + ], + "caption": "Abhängigkeiten kommunizieren über das private Netzwerk und haben keine Adresse im LAN." + } + }, + { + "p": "Der Stack-Vertrag speichert Bridge, Subnetz, Adressen und Beziehungen zwischen den Diensten. Bei einer Aktualisierung der Anwendung wird dieselbe Topologie für alle Mitglieder wiederverwendet. ProxMenux Monitor öffnet den Hauptcontainer über seine LAN-Adresse, nicht über seine Adresse im privaten Netzwerk." + } + ] + }, + { + "id": "ownership", + "title": "Datei- und Verzeichnisbesitz", + "blocks": [ + { + "list": { + "items": [ + "Neue Verzeichnisse werden mit der UID und GID angelegt, auf die der unprivilegierte LXC abgebildet wird.", + "Bei vorhandenen Verzeichnissen wird der Eigentümer nicht rekursiv geändert.", + "Sockets, Systemdateien und sensible Pfade werden nicht als allgemeine Host-Verzeichnisse angeboten." + ] + } + } + ] + }, + { + "id": "backup", + "title": "Was eine Containersicherung enthält", + "blocks": [ + { + "table": { + "headers": [ + "Bestandteil", + "In der vzdump-Sicherung des CT", + "Aufbewahrungsort" + ], + "rows": [ + [ + "OCI-rootfs", + "Ja", + "In der CT-Sicherung; außerdem aus Image und Vertrag neu erstellbar" + ], + [ + "Container-Datenträger mit backup=1", + "Ja", + "Die CT-Sicherung" + ], + [ + "Host-Verzeichnis", + "Nein", + "Die Sicherung des Host-Speichers" + ], + [ + "Instanzvertrag", + "Ja, die im CT mitgeführte Kopie", + "/.proxmenux/oci-record.json im CT; weitere Host- und Cluster-Kopien werden separat gespeichert" + ], + [ + "Anwendung mit mehreren Containern", + "Jedes Mitglied in einer eigenen Sicherung", + "Die Sicherungen aller Mitglieder sowie der Stack-Vertrag und seine Netzwerk-Bridge auf dem Host" + ] + ] + } + } + ] + } + ] +} diff --git a/web/messages/en/docs/oci-manager/custom-image.json b/web/messages/en/docs/oci-manager/custom-image.json index 7b3fc108..5ae7cb95 100644 --- a/web/messages/en/docs/oci-manager/custom-image.json +++ b/web/messages/en/docs/oci-manager/custom-image.json @@ -192,7 +192,7 @@ "list": { "items": [ "A Dockerfile without a published image: the image has to be built and published in an OCI registry first.", - "A Compose file with several services: it is blocked because it describes more than one image. This option installs a single container.", + "A Compose file with several services is blocked: this option installs one service in one container at a time, even when several services use the same image.", "configs, external secrets or device formats that cannot be translated unambiguously.", "Shell substitutions such as $(command): the resulting value has to be written instead.", "docker run options that are not recognised, and --env-file: an explicit Compose file is read instead." diff --git a/web/messages/en/docs/oci-manager/lifecycle.json b/web/messages/en/docs/oci-manager/lifecycle.json index 96ccaf84..cdb3f103 100644 --- a/web/messages/en/docs/oci-manager/lifecycle.json +++ b/web/messages/en/docs/oci-manager/lifecycle.json @@ -215,7 +215,7 @@ { "id": "restore", "title": "Backup, restore and another host", - "intro": "A backup made with vzdump or Proxmox Backup Server includes the container, its disks and the copy of its contract. What the installation keeps on the host is not part of it. Manage installed OCI applications detects the containers restored on a host that has no contract for them, a new Proxmox installation or another host, and offers to register them again.", + "intro": "A backup made with vzdump or Proxmox Backup Server includes the container, the container disks selected for backup and the copy of its contract. What the installation keeps on the host is not part of it. Manage installed OCI applications detects the containers restored on a host that has no contract for them, a new Proxmox installation or another host, and offers to register them again.", "blocks": [ { "steps": { @@ -462,7 +462,7 @@ ], [ "Container disks", - "Proxmox moves them with the container. HA needs them on shared storage." + "Proxmox moves them with the container. HA needs their data available on the target node, through shared storage or a supported replication setup." ], [ "Host directories and devices", diff --git a/web/messages/en/docs/oci-manager/storage-network.json b/web/messages/en/docs/oci-manager/storage-network.json index 5c4fee47..4665d890 100644 --- a/web/messages/en/docs/oci-manager/storage-network.json +++ b/web/messages/en/docs/oci-manager/storage-network.json @@ -179,7 +179,7 @@ ["OCI rootfs", "Yes", "The CT backup; it can also be rebuilt from the image and the contract"], ["Container disk with backup=1", "Yes", "The CT backup"], ["Host directory", "No", "The backup of the host storage"], - ["Instance contract", "No", "/usr/local/share/proxmenux/oci/instances/VMID/ on the host"], + ["Instance contract", "Yes, the copy carried inside the CT", "/.proxmenux/oci-record.json inside the CT; additional host and cluster copies are kept separately"], ["Multi-container application", "Each member in its own backup", "The backups of every member, plus the stack contract and its bridge on the host"] ] } diff --git a/web/messages/es/docs/oci-manager/architecture.json b/web/messages/es/docs/oci-manager/architecture.json index b9b22769..75094840 100644 --- a/web/messages/es/docs/oci-manager/architecture.json +++ b/web/messages/es/docs/oci-manager/architecture.json @@ -1,17 +1,17 @@ { "meta": { - "title": "Cómo se traduce una imagen OCI | ProxMenux", - "description": "Del repositorio de la imagen y su archivo Compose a una plantilla revisable, un plan de despliegue y un LXC nativo de Proxmox VE, sin Docker dentro." + "title": "Cómo se adapta una imagen OCI | ProxMenux", + "description": "Del repositorio de la imagen y su archivo Compose a una plantilla que puedes revisar, un plan de despliegue y un LXC nativo de Proxmox VE, sin Docker dentro." }, "header": { - "title": "Cómo se traduce una imagen OCI", - "description": "Del repositorio de la imagen y su archivo Compose a una plantilla revisable, un plan de despliegue y un LXC nativo, sin instalar Docker dentro.", + "title": "Cómo se adapta una imagen OCI", + "description": "Del repositorio de la imagen y su archivo Compose a una plantilla que puedes revisar, un plan de despliegue y un LXC nativo, sin instalar Docker dentro.", "section": "OCI manager Apps" }, "sections": [ { "id": "pipeline", - "title": "La cadena de traducción", + "title": "El proceso de adaptación", "blocks": [ { "mermaid": { @@ -20,7 +20,7 @@ "repo": "Repositorio de la imagen", "converter": "Conversor", "template": "Plantilla JSON", - "blockers": "¿Sin bloqueos?", + "blockers": "¿Sin impedimentos?", "no": "No", "yes": "Sí", "review": "Revisión / overlay", @@ -30,7 +30,7 @@ } }, { - "p": "El conversor lee la imagen y el archivo Compose que publica su proyecto y escribe una plantilla JSON. Una plantilla con bloqueos sin traducir pasa por revisión, donde un overlay curado los resuelve, antes de publicarse en el catálogo. Solo las plantillas sin bloqueos se ofrecen para instalar." + "p": "El conversor lee la imagen y el archivo Compose publicados por el proyecto y genera una plantilla JSON. Si quedan requisitos que no se han podido adaptar y que impiden la instalación, la plantilla pasa por una revisión: un archivo de ajustes revisados, llamado overlay, los resuelve antes de publicarla en el catálogo. Solo se ofrecen para instalar las plantillas que no tienen impedimentos pendientes." } ] }, @@ -41,10 +41,26 @@ { "cards": { "items": [ - { "icon": "archive", "title": "Identidad de la imagen", "body": "Repositorio, etiqueta rolling, arquitectura, digest resuelto y revisión del origen." }, - { "icon": "braces", "title": "Contrato del contenedor", "body": "Entrypoint, Cmd, entorno, usuario, directorio de trabajo, señal de parada, puertos y volúmenes." }, - { "icon": "layers", "title": "Traducción a Proxmox VE", "body": "Recursos, seguridad, puntos de montaje, dispositivos, sysctls, healthchecks y las adaptaciones que necesita cada uno, con su motivo." }, - { "icon": "shield", "title": "Compatibilidad", "body": "Claves admitidas, bloqueos sin traducir y el estado de cada validación." } + { + "icon": "archive", + "title": "Identidad de la imagen", + "body": "Repositorio, etiqueta de actualización continua, arquitectura, digest resuelto y revisión de origen." + }, + { + "icon": "braces", + "title": "Contrato del contenedor", + "body": "Entrypoint, Cmd, entorno, usuario, directorio de trabajo, señal de parada, puertos y volúmenes." + }, + { + "icon": "layers", + "title": "Adaptación a Proxmox VE", + "body": "Recursos, seguridad, puntos de montaje, dispositivos, sysctls, comprobaciones de estado y las adaptaciones necesarias en cada caso, con su justificación." + }, + { + "icon": "shield", + "title": "Compatibilidad", + "body": "Claves compatibles, requisitos pendientes de adaptar que impiden la instalación y estado de cada validación." + } ] } } @@ -56,12 +72,32 @@ "blocks": [ { "table": { - "headers": ["Origen", "Ejemplo", "Resultado nativo"], + "headers": [ + "Origen", + "Ejemplo", + "Resultado nativo" + ], "rows": [ - ["Metadatos OCI", "Entrypoint, Cmd, User", "Proxmox VE los importa al crear el CT"], - ["Docker Compose", "environment, volumes, devices", "entradas de entorno del LXC, mpN y devN"], - ["Perfil de ProxMenux", "GPU, healthcheck, credenciales", "preguntas y adaptaciones revisadas"], - ["Usuario", "VMID, almacenamiento, red", "el contrato de la instancia"] + [ + "Metadatos OCI", + "Entrypoint, Cmd, User", + "Proxmox VE los importa al crear el CT" + ], + [ + "Docker Compose", + "environment, volumes, devices", + "Entradas de entorno de LXC, mpN y devN" + ], + [ + "Perfil de ProxMenux", + "GPU, comprobación de estado, credenciales", + "Preguntas y adaptaciones revisadas" + ], + [ + "Usuario", + "VMID, almacenamiento, red", + "El contrato de la instancia" + ] ] } } @@ -69,18 +105,39 @@ }, { "id": "install", - "title": "Qué ocurre durante una instalación", + "title": "Qué ocurre durante la instalación", "blocks": [ { "steps": { "items": [ - { "title": "Resolver", "body": "Se consulta el registro, se selecciona la arquitectura del host y se fija el digest efectivo de la etiqueta rolling." }, - { "title": "Descargar y verificar", "body": "Skopeo descarga la imagen como archivo OCI, y cada capa se comprueba contra su digest y se descomprime antes de crear nada. Una descarga dañada se repite una vez antes de detener la instalación." }, - { "title": "Construir", "body": "pct create construye el rootfs a partir del archivo y conserva los metadatos oficiales de proceso de la imagen." }, - { "title": "Conectar", "body": "Se añaden los volúmenes, la red, el entorno, los dispositivos y los perfiles de seguridad declarados." }, - { "title": "Consola", "body": "La salida de consola del contenedor se guarda en el host, y la consola de Proxmox VE abre un shell cuando la imagen incluye uno." }, - { "title": "Comprobar", "body": "El primer arranque espera una dirección y la respuesta del servicio; un fallo no se presenta como instalación correcta." }, - { "title": "Registrar", "body": "La configuración efectiva se escribe en el contrato de la instancia que usan las actualizaciones y las recreaciones." } + { + "title": "Resolver la referencia", + "body": "Se consulta el registro, se selecciona la arquitectura del host y se fija el digest concreto al que apunta la etiqueta de actualización continua." + }, + { + "title": "Descargar y verificar", + "body": "Skopeo descarga la imagen como un archivo OCI. Antes de crear nada, se verifica el digest de cada capa y se descomprimen todas las capas. Si la descarga está dañada, se vuelve a descargar una vez antes de detener la instalación." + }, + { + "title": "Crear el sistema de archivos", + "body": "pct create crea el rootfs a partir del archivo y conserva los metadatos oficiales del proceso de la imagen." + }, + { + "title": "Conectar los recursos", + "body": "Se aplican los volúmenes, la red, el entorno, los dispositivos y los perfiles de seguridad declarados." + }, + { + "title": "Consola", + "body": "La salida de consola del contenedor se guarda en el host. La consola de Proxmox VE abre una shell si la imagen incluye una." + }, + { + "title": "Comprobar", + "body": "En el primer arranque se espera a que el contenedor tenga una dirección y el servicio responda. Si falla, la instalación no se da por completada correctamente." + }, + { + "title": "Registrar la configuración", + "body": "La configuración efectiva se guarda en el contrato de la instancia que utilizan las actualizaciones y las recreaciones." + } ] } } @@ -89,7 +146,7 @@ { "id": "example", "title": "Ejemplo: una imagen con /config y /downloads", - "intro": "Una definición habitual de Compose y la configuración de Proxmox VE en la que se convierte. Las rutas que espera la aplicación no cambian.", + "intro": "Una definición Compose habitual y la configuración de Proxmox VE que se genera a partir de ella. Las rutas que espera la aplicación no cambian.", "blocks": [ { "codeGrid": { @@ -99,14 +156,14 @@ "code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080" }, { - "title": "/etc/pve/lxc/VMID.conf (extracto)", + "title": "/etc/pve/lxc/VMID.conf (fragmento)", "code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000" } ] } }, { - "p": "mp0 es un segundo disco que pertenece al contenedor, con el nombre vm-VMID-disk-N en el almacenamiento elegido. Se monta en /config y, con backup=1, forma parte del backup del contenedor. mp1 no crea ningún disco: enlaza el directorio del host /srv/downloads con /downloads dentro del LXC. El puerto 8080 no se mapea: el LXC tiene una dirección propia y el servicio responde en ella." + "p": "mp0 es un segundo disco que pertenece al contenedor, con el nombre vm-VMID-disk-N en el almacenamiento seleccionado. Se monta en /config y, con backup=1, se incluye en la copia de seguridad del contenedor. mp1 no crea ningún disco: monta el directorio del host /srv/downloads en /downloads dentro del LXC. El puerto 8080 no se mapea: el LXC tiene su propia dirección y el servicio responde en ella." } ] } diff --git a/web/messages/es/docs/oci-manager/custom-image.json b/web/messages/es/docs/oci-manager/custom-image.json index 5a9316c7..c1f9642d 100644 --- a/web/messages/es/docs/oci-manager/custom-image.json +++ b/web/messages/es/docs/oci-manager/custom-image.json @@ -1,11 +1,11 @@ { "meta": { - "title": "Instalar una imagen que no está en el catálogo | ProxMenux", - "description": "Traducción de una imagen OCI desde un archivo Compose, una URL, un comando docker run o una referencia de imagen, con revisión de lo que ProxMenux puede reproducir antes de instalarla." + "title": "Instalar una imagen fuera del catálogo | ProxMenux", + "description": "Adapta una imagen OCI a partir de un archivo Compose, una URL, un comando docker run o una referencia de imagen, y revisa qué puede reproducir ProxMenux antes de instalarla." }, "header": { - "title": "Instalar una imagen que no está en el catálogo", - "description": "Una imagen propia se traduce desde su archivo Compose, un comando docker run o solo su referencia, y el resultado se presenta para revisión antes de crear ningún LXC.", + "title": "Instalar una imagen que no esté en el catálogo", + "description": "Tu imagen se adapta a partir de su archivo Compose, de un comando docker run o de su referencia. El resultado se muestra para que lo revises antes de crear ningún LXC.", "section": "OCI manager Apps" }, "sections": [ @@ -14,8 +14,8 @@ "blocks": [ { "calloutInfo": { - "title": "El mismo conversor, el mismo instalador", - "body": "La opción Instalar una imagen que no está en el catálogo utiliza el conversor y el instalador de las plantillas del catálogo. La diferencia es que el contrato se genera en ese momento a partir de la definición aportada y se valida antes de crear ningún LXC." + "title": "El mismo conversor y el mismo instalador", + "body": "La opción Instalar una imagen que no esté en el catálogo utiliza el mismo conversor y el mismo instalador que las plantillas del catálogo. La diferencia es que el contrato se genera en ese momento a partir de la definición proporcionada y se valida antes de crear ningún LXC." } } ] @@ -23,45 +23,92 @@ { "id": "sources", "title": "Cómo se describe la imagen", - "intro": "La primera pantalla pregunta cómo se describe la imagen. Cuatro formas aportan una definición que se traduce, una quinta usa solo el nombre de la imagen y tres reciben un oci-compose ya escrito.", + "intro": "La primera pantalla pregunta cómo vas a describir la imagen. Cuatro opciones reciben una definición que se adapta, una quinta usa solo el nombre de la imagen y otras tres leen un oci-compose ya escrito.", "blocks": [ { "table": { - "headers": ["Opción", "Qué lee"], + "headers": [ + "Opción", + "Qué lee" + ], "rows": [ - ["Pegar su archivo Compose en la terminal", "El YAML se pega en la terminal y termina con Ctrl+D."], - ["Leer su archivo Compose desde un archivo de este host", "Una ruta del nodo, /root/docker-compose.yml por defecto. El archivo debe existir y ocupar como máximo 256 KiB."], - ["Descargar su archivo Compose desde una dirección", "Una dirección http:// o https:// que sirva el YAML sin procesar. Se descargan como máximo 256 KiB."], - ["Pegar su comando docker run en la terminal", "El comando que publica el proyecto. Se traducen puertos, entorno, volúmenes, dispositivos, capacidades, usuario, memoria compartida y el resto de opciones admitidas."], - ["Solo la referencia de la imagen, sin archivo Compose", "Una referencia como ghcr.io/user/application:latest. Se consulta el registro y se conservan los metadatos OCI de la imagen."], - ["Pegar un oci-compose en la terminal", "El JSON se pega en la terminal y termina con Ctrl+D. No se traduce: se comprueba y se instala tal como está escrito."], - ["Leer un oci-compose desde un archivo de este host", "Un archivo JSON del nodo, /root/oci-compose.json por defecto, de 2 MiB como máximo."], - ["Descargar un oci-compose desde una dirección", "Una dirección http:// o https:// que sirva el archivo JSON. Se descargan como máximo 2 MiB."] + [ + "Pegar su archivo Compose en la terminal", + "Pega el YAML en la terminal y termina con Ctrl+D." + ], + [ + "Leer su archivo Compose desde este host", + "Una ruta del nodo; la predeterminada es /root/docker-compose.yml. El archivo debe existir y no superar los 256 KiB." + ], + [ + "Descargar su archivo Compose desde una dirección", + "Una dirección http:// o https:// que sirva el YAML sin procesar. Se descargan como máximo 256 KiB." + ], + [ + "Pegar su comando docker run en la terminal", + "El comando publicado por el proyecto. Se adaptan los puertos, el entorno, los volúmenes, los dispositivos, las capabilities, el usuario, la memoria compartida y las demás opciones compatibles." + ], + [ + "Solo la referencia de imagen, sin archivo Compose", + "Una referencia como ghcr.io/user/application:latest. Se consulta el registro y se conservan los metadatos OCI de la imagen." + ], + [ + "Pegar un oci-compose en la terminal", + "Pega el JSON en la terminal y termina con Ctrl+D. No se convierte: se valida y se instala tal como está escrito." + ], + [ + "Leer un oci-compose desde este host", + "Un archivo JSON del nodo, /root/oci-compose.json por defecto, de un máximo de 2 MiB." + ], + [ + "Descargar un oci-compose desde una dirección", + "Una dirección http:// o https:// que sirva el archivo JSON. Se descargan como máximo 2 MiB." + ] ] } }, { "figure": { "src": "/oci-manager/custom-source-menu.png", - "alt": "Menú que pregunta cómo se describe una imagen que no está en el catálogo", - "caption": "Las formas de describir una imagen que no está en el catálogo." + "alt": "Menú para elegir cómo describir una imagen que no está en el catálogo", + "caption": "Formas de describir una imagen fuera del catálogo." } } ] }, { "id": "reference-only", - "title": "Qué aporta solo la referencia de la imagen", - "intro": "Una imagen lleva sus metadatos de proceso, pero no todo lo que un archivo Compose suele añadir a su alrededor.", + "title": "Qué aporta una referencia de imagen por sí sola", + "intro": "La imagen contiene los metadatos de su proceso, pero no todo el entorno que suele añadir un archivo Compose.", "blocks": [ { "table": { - "headers": ["Se lee de la imagen", "No está en la imagen", "Consecuencia"], + "headers": [ + "Se lee de la imagen", + "No está en la imagen", + "Consecuencia" + ], "rows": [ - ["Entrypoint, Cmd, User, WorkingDir y entorno integrado", "Variables que solo aparecen en la documentación", "Se añaden durante la instalación o con Modificar"], - ["Volúmenes declarados por la imagen", "Directorios del host que solo nombra un archivo Compose", "Las rutas adicionales se añaden antes de instalar"], - ["Puertos EXPOSE", "La URL, el protocolo o un healthcheck funcional", "Se confirman el puerto y la forma de comprobar el servicio"], - ["Arquitecturas y digest del registro", "Dispositivos, privilegios o dependencias externas", "Ninguno se activa sin una definición que lo pida"] + [ + "Entrypoint, Cmd, User, WorkingDir y el entorno incorporado", + "Variables que solo figuran en la documentación", + "Se añaden durante la instalación o desde Modificar" + ], + [ + "Volúmenes declarados por la imagen", + "Directorios del host que solo se indican en Compose", + "Las rutas adicionales se añaden antes de instalar" + ], + [ + "Puertos EXPOSE", + "La URL, el protocolo o la comprobación funcional del servicio", + "Se confirman el puerto y la forma de comprobar el servicio" + ], + [ + "Arquitecturas y digest del registro", + "Dispositivos, privilegios o dependencias externas", + "No se habilitan sin una definición que los solicite" + ] ] } } @@ -69,29 +116,44 @@ }, { "id": "review", - "title": "Revisión antes de instalar", - "intro": "Tras traducir la definición, ProxMenux muestra lo que ha entendido antes de pedir VMID, recursos o almacenamiento.", + "title": "Revisar antes de instalar", + "intro": "Tras adaptar la definición, ProxMenux muestra cómo la ha interpretado antes de preguntar el VMID, los recursos o el almacenamiento.", "blocks": [ { "steps": { "items": [ - { "title": "Analizar", "body": "Se leen servicios, imagen, puertos, rutas, entorno, dispositivos, seguridad y healthcheck." }, - { "title": "Consultar el registro", "body": "La imagen debe existir en su registro, y se enumeran las arquitecturas que publica. Un registro privado se lee con la cuenta guardada para él." }, - { "title": "Enumerar lo que no se aplica", "body": "Se enumeran las etiquetas, las redes Docker, los ajustes de Swarm y el resto de claves que no tienen efecto en un LXC." }, - { "title": "Bloquear lo que no puede traducirse", "body": "Una clave sin equivalencia segura aparece en Lo que no puede traducirse y la instalación no continúa. Nada se descarta en silencio." }, - { "title": "Pedir los secretos", "body": "Las variables cuyo nombre corresponde a una contraseña, un token o una clave se convierten en preguntas sensibles de la instalación." } + { + "title": "Analizar", + "body": "Se leen servicios, imagen, puertos, rutas, entorno, dispositivos, seguridad y comprobaciones de estado." + }, + { + "title": "Consultar el registro", + "body": "La imagen debe existir en el registro y se muestran las arquitecturas publicadas. Si el registro es privado, se utiliza la cuenta guardada para él." + }, + { + "title": "Enumerar lo que no se aplica", + "body": "Se enumeran las etiquetas, redes de Docker, ajustes de Swarm y otras claves que no tienen efecto en un LXC." + }, + { + "title": "Bloquear opciones sin equivalente seguro", + "body": "Las claves sin equivalente seguro aparecen en Opciones sin equivalente e impiden continuar con la instalación. No se descartan silenciosamente." + }, + { + "title": "Solicitar secretos", + "body": "Las variables cuyo nombre indica una contraseña, token o clave se solicitan como datos sensibles durante la instalación." + } ] } }, { "figure": { "src": "/oci-manager/custom-review.png", - "alt": "Resumen de lo que ProxMenux ha entendido de un archivo Compose", - "caption": "El resumen que se muestra antes de que la instalación pida VMID y recursos." + "alt": "Resumen de cómo ProxMenux ha interpretado el archivo Compose", + "caption": "Resumen mostrado antes de que el instalador pregunte el VMID y los recursos." } }, { - "p": "Tras aceptar el resumen, el recorrido es el del catálogo: nombre, modo predeterminado o avanzado, VMID, CPU, memoria, red, arranque con el nodo, rutas persistentes, rutas adicionales, dispositivos compatibles y resumen final." + "p": "Tras aceptar el resumen se sigue el mismo asistente que en el catálogo: nombre, modo predeterminado o avanzado, VMID, CPU, memoria, red, arranque con el nodo, rutas persistentes, rutas adicionales, dispositivos compatibles y resumen final." } ] }, @@ -118,68 +180,79 @@ { "id": "oci-compose", "title": "Un oci-compose escrito a mano", - "intro": "Un oci-compose es el archivo JSON desde el que se instala una aplicación. El catálogo guarda uno por cada aplicación, y el mismo formato puede escribirse a mano e instalarse con esta opción.", + "intro": "Un oci-compose es el archivo JSON a partir del cual se instala una aplicación. El catálogo conserva uno por aplicación. Puedes escribir el mismo formato a mano e instalarlo con esta opción.", "blocks": [ { - "p": "El que se escribe a mano indica lo que decide su autor: la imagen, sus puertos, variables y volúmenes, y lo que pregunta la instalación. ProxMenux completa el resto al leer el archivo. Puede decir lo que un archivo Compose no puede: el texto de una pregunta, una contraseña generada durante la instalación, un perfil de GPU, el propietario de cada volumen, la comprobación del primer arranque o las credenciales que se muestran al terminar." + "p": "Al escribirlo a mano, el autor decide la imagen, los puertos, las variables, los volúmenes y las preguntas de la instalación. ProxMenux completa el resto al leer el archivo. Permite expresar lo que Compose no incluye: el texto de una pregunta, una contraseña generada durante la instalación, un perfil de GPU, el propietario de cada volumen, la comprobación del primer arranque o las credenciales mostradas al final." }, { "steps": { "items": [ { "title": "Comprobar", - "body": "Un archivo con errores no se instala. Cada error indica el campo en el que está, y un archivo que no es JSON válido indica la línea y la columna." + "body": "Los archivos con errores no se instalan. Cada error indica el campo afectado; si el JSON no es válido, se muestran la línea y la columna." }, { "title": "Revisar", - "body": "Un archivo válido muestra lo que instala: imagen, dirección web, puertos, rutas persistentes, las variables que pide la instalación y los archivos que escribe." + "body": "Si el archivo es válido, se muestra lo que instalará: imagen, dirección web, puertos, rutas persistentes, variables que solicitará el instalador y archivos que escribirá." }, { "title": "Instalar", - "body": "La instalación es la de cualquier aplicación del catálogo, con ajustes por defecto o avanzados." + "body": "Se utiliza el mismo instalador que para cualquier aplicación del catálogo, con ajustes predeterminados o avanzados." } ] } }, { "calloutWarning": { - "title": "Un archivo que decide privilegios", - "body": "Un oci-compose decide qué se monta en el contenedor y con qué privilegios. El resumen lo indica antes de instalar: instala solo archivos que vengan de una fuente de confianza." + "title": "Un archivo que decide los privilegios", + "body": "El oci-compose determina qué se monta dentro del contenedor y con qué privilegios. La revisión lo muestra antes de instalar: utiliza únicamente archivos de fuentes de confianza." } }, { - "p": "El formato se describe bloque a bloque, con dos ejemplos completos, en el README del motor OCI. El registro de una instalación se lee de la misma forma: solo se usa la plantilla con la que se instaló, y ninguna de las respuestas de esa instalación." + "p": "El README del motor OCI explica el formato bloque a bloque e incluye dos ejemplos completos. También se puede leer el registro de una instalación: solo se utiliza la plantilla original, sin incorporar ninguna de las respuestas de aquella instalación." } ] }, { "id": "private-registries", - "title": "Imágenes en registros privados", - "intro": "Una imagen en un registro privado, como un paquete privado de GitHub o un repositorio privado de Docker Hub, se lee con una cuenta guardada en ProxMenux.", + "title": "Imágenes de registros privados", + "intro": "Las imágenes de registros privados, como un paquete privado de GitHub o un repositorio privado de Docker Hub, se consultan con una cuenta guardada en ProxMenux.", "blocks": [ { "steps": { "items": [ - { "title": "El registro rechaza la imagen", "body": "Cuando el registro responde que la imagen necesita una cuenta, la revisión ofrece iniciar sesión en ese registro y vuelve a leer la imagen." }, - { "title": "Iniciar sesión", "body": "Un usuario y una contraseña o un token de acceso que puedan descargar la imagen. El registro los comprueba y solo se guardan si los acepta." }, - { "title": "Instalar y mantener al día", "body": "La instalación descarga la imagen con esa cuenta, y también las actualizaciones, Modificar, Recrear, la vigilancia y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster." } + { + "title": "El registro deniega el acceso a la imagen", + "body": "Si el registro indica que la imagen requiere una cuenta, la revisión ofrece iniciar sesión en ese registro y vuelve a consultar la imagen." + }, + { + "title": "Iniciar sesión", + "body": "Un usuario y una contraseña o token con permiso para descargar la imagen. El registro los comprueba y solo se guardan si los acepta." + }, + { + "title": "Instalar y mantener al día", + "body": "Esa cuenta se utiliza para descargar la imagen durante la instalación y también en las actualizaciones, Modificar, Recrear, el watchdog y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster." + } ] } }, - { "p": "Cuentas de registro, en el menú principal de OCI manager Apps, lista las cuentas guardadas por registro y usuario, nunca su secreto. Desde cada cuenta se puede comprobar, descargar o instalar una imagen, y actualizar o eliminar la cuenta." }, + { + "p": "Cuentas de registros, en el menú principal de OCI manager Apps, muestra las cuentas guardadas por registro y usuario, nunca sus secretos. Desde cada cuenta puedes comprobar, descargar o instalar una imagen, actualizar las credenciales o eliminarlas." + }, { "list": { "items": [ - "GitHub (ghcr.io): el usuario es la cuenta de GitHub, y la contraseña un token de acceso personal con el permiso read:packages.", - "Docker Hub (docker.io): el usuario es la cuenta de Docker Hub, y la contraseña un token de acceso con permiso de lectura.", - "Otros registros, también uno con su propio puerto como registry.example.com:5000: el usuario y la contraseña o token que da ese registro." + "GitHub (ghcr.io): el usuario es la cuenta de GitHub y la contraseña es un token de acceso personal con permiso read:packages.", + "Docker Hub (docker.io): el usuario es la cuenta de Docker Hub y la contraseña es un token con permiso de lectura.", + "Otros registros, incluidos los que usan un puerto propio como registry.example.com:5000: el usuario y la contraseña o token que proporcione ese registro." ] } }, { "calloutInfo": { - "title": "Dónde se guardan", - "body": "En /etc/pve/priv/proxmenux/registry-auth.json, legible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de sus almacenamientos. /etc/pve lo comparten todos los nodos del clúster, así que una cuenta añadida en un nodo se usa en todos. El backup del host lo incluye, y al desinstalar ProxMenux se elimina de todos los nodos." + "title": "Dónde se guardan las cuentas", + "body": "En /etc/pve/priv/proxmenux/registry-auth.json, accesible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de almacenamiento. /etc/pve se comparte entre los nodos del clúster, de modo que una cuenta añadida en un nodo se utiliza en todos. La copia del host incluye ese archivo y desinstalar ProxMenux lo elimina de todos los nodos." } } ] @@ -191,11 +264,11 @@ { "list": { "items": [ - "Un Dockerfile sin imagen publicada: la imagen debe construirse y publicarse antes en un registro OCI.", - "Un archivo Compose con varios servicios: queda bloqueado porque describe más de una imagen. Esta opción instala un único contenedor.", - "configs, secretos externos o formatos de dispositivo que no pueden traducirse sin ambigüedad.", - "Sustituciones del shell como $(command): debe escribirse el valor resultante.", - "Opciones de docker run no reconocidas y --env-file: se lee en su lugar un archivo Compose explícito." + "Un Dockerfile sin imagen publicada: primero hay que construir la imagen y publicarla en un registro OCI.", + "Un archivo Compose con varios servicios: se bloquea porque esta opción instala un único servicio por contenedor, aunque varios servicios utilicen la misma imagen.", + "configs, secretos externos o formatos de dispositivo que no puedan adaptarse de forma inequívoca.", + "Sustituciones de shell como $(command): hay que escribir directamente el valor resultante.", + "Opciones de docker run no reconocidas y --env-file: utiliza un archivo Compose con los valores explícitos." ] } } diff --git a/web/messages/es/docs/oci-manager/hardware.json b/web/messages/es/docs/oci-manager/hardware.json index b4f24154..72239db9 100644 --- a/web/messages/es/docs/oci-manager/hardware.json +++ b/web/messages/es/docs/oci-manager/hardware.json @@ -19,9 +19,18 @@ { "flow": { "nodes": [ - { "label": "Inventario del host", "detail": "/dev/dri/renderD128\nGID 993 · Intel" }, - { "label": "ProxMenux", "detail": "fabricante y\npermisos comprobados" }, - { "label": "LXC", "detail": "mismo dispositivo\nGID efectivo" } + { + "label": "Inventario del host", + "detail": "/dev/dri/renderD128\nGID 993 · Intel" + }, + { + "label": "ProxMenux", + "detail": "fabricante y\npermisos comprobados" + }, + { + "label": "LXC", + "detail": "mismo dispositivo\nGID efectivo" + } ] } } @@ -33,12 +42,32 @@ "blocks": [ { "table": { - "headers": ["Origen", "Qué se lee", "Qué hace el instalador"], + "headers": [ + "Origen", + "Qué se lee", + "Qué hace el instalador" + ], "rows": [ - ["Docker Compose", "devices, group_add, deploy.resources y peticiones NVIDIA", "Cada requisito se convierte en una petición de dispositivo que se muestra para revisión"], - ["Perfil del catálogo", "El soporte de GPU, Coral, OpenCL, USB o FUSE que tiene realmente la aplicación", "Solo se ofrecen las opciones validadas para esa imagen"], - ["Metadatos y documentación de la imagen", "VA-API, Selkies, mods de LinuxServer o el runtime NVIDIA", "Se añaden las variables y la preparación documentadas"], - ["Selección del usuario", "Solo CPU, Intel/AMD, OpenCL, NVIDIA o un dispositivo opcional", "La selección se guarda en el contrato de la instancia"] + [ + "Docker Compose", + "devices, group_add, deploy.resources y peticiones NVIDIA", + "Cada requisito se convierte en una petición de dispositivo que se muestra para revisión" + ], + [ + "Perfil del catálogo", + "El soporte de GPU, Coral, OpenCL, USB o FUSE que tiene realmente la aplicación", + "Solo se ofrecen las opciones validadas para esa imagen" + ], + [ + "Metadatos y documentación de la imagen", + "VA-API, Selkies, mods de LinuxServer o el runtime NVIDIA", + "Se añaden las variables y la preparación documentadas" + ], + [ + "Selección del usuario", + "Solo CPU, Intel/AMD, OpenCL, NVIDIA o un dispositivo opcional", + "La selección se guarda en el contrato de la instancia" + ] ] } }, @@ -57,16 +86,52 @@ "blocks": [ { "table": { - "headers": ["Tipo", "Identificación", "Validación"], + "headers": [ + "Tipo", + "Identificación", + "Validación" + ], "rows": [ - ["Intel/AMD DRM", "/dev/dri/renderD* y /sys/class/drm/NODO/device/vendor", "Un dispositivo de caracteres con fabricante 0x8086 (Intel) o 0x1002 (AMD)"], - ["OpenCL AMD", "El render node, más /dev/kfd cuando el perfil lo necesita", "Existencia, tipo, fabricante, permisos y compatibilidad declarada"], - ["AMD ROCm", "El nodo de render, /dev/kfd y la generación que declara el driver de cómputo en /sys/class/kfd/kfd/topology/nodes/*/properties", "Una generación para la que la imagen ROCm de la aplicación trae kernels, las GPU RDNA2 que incluye y las posteriores, se ofrece tal cual. Las demás GPU de esas familias, como las Radeon 680M y 780M, se ofrecen como experimentales y nunca son la opción propuesta: ROCm no las soporta oficialmente, la aplicación las presenta como la generación de su familia (HSA_OVERRIDE_GFX_VERSION) y el instalador pide confirmación antes de descargar la imagen, que es más grande. Una GPU anterior, como los gráficos integrados de un Ryzen 5000U, no se ofrece e Immich deja el reconocimiento en la CPU"], - ["NVIDIA", "nvidia-smi y nvidia-container-cli", "GPU, UUID, bus PCI, versión del driver, Toolkit, nodos /dev/nvidia*, binarios y librerías"], - ["Coral PCIe/M.2", "/dev/apex_N y su enlace en /sys/dev/char/MAJOR:MINOR", "Nodo de caracteres, major/minor, propietario, GID y permisos"], - ["USB y serie", "/dev/ttyUSB*, /dev/ttyACM* o /dev/bus/usb/BBB/DDD", "Nodo de caracteres; en USB también fabricante, producto y número de serie cuando sysfs los publica"], - ["KVM, TUN, FUSE, vídeo y SCSI genérico", "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN o /dev/sgN", "Ruta admitida, tipo de nodo y permisos efectivos"], - ["Unidad óptica", "/dev/srN", "Un dispositivo de bloques"] + [ + "Intel/AMD DRM", + "/dev/dri/renderD* y /sys/class/drm/NODE/device/vendor", + "Un dispositivo de caracteres con fabricante 0x8086 (Intel) o 0x1002 (AMD)" + ], + [ + "OpenCL AMD", + "El render node, más /dev/kfd cuando el perfil lo necesita", + "Existencia, tipo, fabricante, permisos y compatibilidad declarada" + ], + [ + "AMD ROCm", + "El nodo de render, /dev/kfd y la generación que declara el driver de cómputo en /sys/class/kfd/kfd/topology/nodes/*/properties", + "Una generación para la que la imagen ROCm de la aplicación trae kernels, las GPU RDNA2 que incluye y las posteriores, se ofrece tal cual. Las demás GPU de esas familias, como las Radeon 680M y 780M, se ofrecen como experimentales y nunca son la opción propuesta: ROCm no las soporta oficialmente, la aplicación las presenta como la generación de su familia (HSA_OVERRIDE_GFX_VERSION) y el instalador pide confirmación antes de descargar la imagen, que es más grande. Una GPU anterior, como los gráficos integrados de un Ryzen 5000U, no se ofrece e Immich deja el reconocimiento en la CPU" + ], + [ + "NVIDIA", + "nvidia-smi y nvidia-container-cli", + "GPU, UUID, bus PCI, versión del driver, Toolkit, nodos /dev/nvidia*, binarios y librerías" + ], + [ + "Coral PCIe/M.2", + "/dev/apex_N y su enlace en /sys/dev/char/MAJOR:MINOR", + "Nodo de caracteres, major/minor, propietario, GID y permisos" + ], + [ + "USB y serie", + "/dev/ttyUSB*, /dev/ttyACM* o /dev/bus/usb/BBB/DDD", + "Nodo de caracteres; en USB también fabricante, producto y número de serie cuando sysfs los publica" + ], + [ + "KVM, TUN, FUSE, vídeo y SCSI genérico", + "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN o /dev/sgN", + "Ruta admitida, tipo de nodo y permisos efectivos" + ], + [ + "Unidad óptica", + "/dev/srN", + "Un dispositivo de bloques" + ] ] } } @@ -79,12 +144,30 @@ { "steps": { "items": [ - { "title": "La plantilla ofrece sus perfiles", "body": "Por ejemplo solo CPU, Intel/AMD VA-API, OpenCL AMD, OpenCL Intel o NVIDIA. Las opciones pertenecen a la imagen, no a un menú común." }, - { "title": "Se elige un perfil", "body": "Define los nodos de dispositivo, el entorno, los mods o el runtime que necesita la aplicación." }, - { "title": "Se propone una ruta", "body": "Para DRM, /dev/dri/renderD128, que puede cambiarse en un host con varios render nodes. Para USB o serie se selecciona el nodo concreto." }, - { "title": "Validación", "body": "Se comprueban existencia, tipo, fabricante admitido, permisos y GID. Una discrepancia detiene la operación." }, - { "title": "Se escribe el contrato", "body": "Ruta, modo, GID, acceso de escritura y perfil quedan registrados para las actualizaciones y las recreaciones." }, - { "title": "Conexión y prueba", "body": "pct set añade la entrada devN y después se comprueba el acceso dentro del LXC. Las imágenes de LinuxServer se comprueban también como usuario abc." } + { + "title": "La plantilla ofrece sus perfiles", + "body": "Por ejemplo solo CPU, Intel/AMD VA-API, OpenCL AMD, OpenCL Intel o NVIDIA. Las opciones pertenecen a la imagen, no a un menú común." + }, + { + "title": "Se elige un perfil", + "body": "Define los nodos de dispositivo, el entorno, los mods o el runtime que necesita la aplicación." + }, + { + "title": "Se propone una ruta", + "body": "Para DRM, /dev/dri/renderD128, que puede cambiarse en un host con varios render nodes. Para USB o serie se selecciona el nodo concreto." + }, + { + "title": "Validación", + "body": "Se comprueban existencia, tipo, fabricante admitido, permisos y GID. Una discrepancia detiene la operación." + }, + { + "title": "Se escribe el contrato", + "body": "Ruta, modo, GID, acceso de escritura y perfil quedan registrados para las actualizaciones y las recreaciones." + }, + { + "title": "Conexión y prueba", + "body": "pct set añade la entrada devN y después se comprueba el acceso dentro del LXC. Las imágenes de LinuxServer se comprueban también como usuario abc." + } ] } } @@ -98,10 +181,22 @@ { "codeGrid": { "items": [ - { "title": "Intel/AMD VA-API", "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" }, - { "title": "Coral PCIe/M.2", "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" }, - { "title": "Un dispositivo USB concreto", "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" }, - { "title": "OpenCL AMD", "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" } + { + "title": "Intel/AMD VA-API", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" + }, + { + "title": "Coral PCIe/M.2", + "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "Un dispositivo USB concreto", + "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "OpenCL AMD", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" + } ] } }, @@ -116,13 +211,37 @@ "blocks": [ { "table": { - "headers": ["Perfil", "Traducción", "Se ofrece cuando"], + "headers": [ + "Perfil", + "Configuración resultante", + "Se ofrece cuando" + ], "rows": [ - ["Intel/AMD VA-API", "Render node de /dev/dri", "La aplicación admite aceleración de vídeo"], - ["OpenCL", "Render node, /dev/kfd si hace falta y el mod oficial", "La imagen o el perfil lo documentan"], - ["NVIDIA", "Dispositivos y librerías del driver del host", "El host tiene un driver operativo y NVIDIA Container Toolkit"], - ["Coral", "/dev/apex_0 o el bus USB", "El perfil declara soporte de Coral (Frigate)"], - ["USB, serie, FUSE", "Un dispositivo concreto, un árbol validado o una función LXC", "El contrato lo pide"] + [ + "Intel/AMD VA-API", + "Render node de /dev/dri", + "La aplicación admite aceleración de vídeo" + ], + [ + "OpenCL", + "Render node, /dev/kfd si hace falta y el mod oficial", + "La imagen o el perfil lo documentan" + ], + [ + "NVIDIA", + "Dispositivos y librerías del driver del host", + "El host tiene un driver operativo y NVIDIA Container Toolkit" + ], + [ + "Coral", + "/dev/apex_0 o el bus USB", + "El perfil declara soporte de Coral (Frigate)" + ], + [ + "USB, serie, FUSE", + "Un dispositivo concreto, un árbol validado o una función LXC", + "El contrato lo pide" + ] ] } } @@ -145,7 +264,9 @@ "p": "Estos dos comandos, en el host, muestran si el driver y el Toolkit están disponibles:" }, { - "shell": { "code": "nvidia-smi -L\nnvidia-container-cli --version" } + "shell": { + "code": "nvidia-smi -L\nnvidia-container-cli --version" + } }, { "p": "En un host cuyo driver se instaló por otros medios, el Toolkit se instala desde el repositorio estable oficial:" @@ -159,7 +280,9 @@ "p": "El inventario que usa OCI manager Apps es la salida de:" }, { - "shell": { "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" } + "shell": { + "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" + } }, { "calloutInfo": { @@ -170,10 +293,26 @@ { "cards": { "items": [ - { "icon": "cpu", "title": "Inventario desde el driver", "body": "nvidia-container-cli enumera los nodos de dispositivo, los binarios, el firmware y las librerías del driver instalado." }, - { "icon": "refresh", "title": "Sin versión fija", "body": "La plantilla no nombra archivos de librería. El perfil se genera a partir del host actual." }, - { "icon": "shield", "title": "Montajes de solo lectura", "body": "Las librerías del host se montan en solo lectura en lugar de copiarse dentro del contenedor." }, - { "icon": "hardDrive", "title": "Cambios de driver", "body": "Tras un cambio de driver, el inventario se genera de nuevo antes de que arranquen los LXC afectados." } + { + "icon": "cpu", + "title": "Inventario desde el driver", + "body": "nvidia-container-cli enumera los nodos de dispositivo, los binarios, el firmware y las librerías del driver instalado." + }, + { + "icon": "refresh", + "title": "Sin versión fija", + "body": "La plantilla no nombra archivos de librería. El perfil se genera a partir del host actual." + }, + { + "icon": "shield", + "title": "Montajes de solo lectura", + "body": "Las librerías del host se montan en solo lectura en lugar de copiarse dentro del contenedor." + }, + { + "icon": "hardDrive", + "title": "Cambios de driver", + "body": "Tras un cambio de driver, el inventario se genera de nuevo antes de que arranquen los LXC afectados." + } ] } }, @@ -209,12 +348,32 @@ "blocks": [ { "table": { - "headers": ["Petición", "Traducción", "Alcance"], + "headers": [ + "Petición", + "Configuración resultante", + "Alcance" + ], "rows": [ - ["/dev/dvb, /dev/snd o /dev/bus/usb", "Cada nodo de caracteres del árbol recibe su propia entrada devN con el modo y el GID del host", "Solo el árbol pedido, no el resto de /dev"], - ["/dev/fuse", "El nodo y, cuando el perfil lo necesita, la función fuse=1", "FUSE por sí solo no publica montajes a otros LXC"], - ["/dev/net/tun", "Una entrada devN en la misma ruta dentro del LXC", "La configuración de la VPN o de la red queda en la aplicación"], - ["/dev/kvm", "Una entrada devN validada", "Solo se ofrece cuando el contrato lo pide"] + [ + "/dev/dvb, /dev/snd o /dev/bus/usb", + "Cada nodo de caracteres del árbol recibe su propia entrada devN con el modo y el GID del host", + "Solo el árbol pedido, no el resto de /dev" + ], + [ + "/dev/fuse", + "El nodo y, cuando el perfil lo necesita, la función fuse=1", + "FUSE por sí solo no publica montajes a otros LXC" + ], + [ + "/dev/net/tun", + "Una entrada devN en la misma ruta dentro del LXC", + "La configuración de la VPN o de la red queda en la aplicación" + ], + [ + "/dev/kvm", + "Una entrada devN validada", + "Solo se ofrece cuando el contrato lo pide" + ] ] } } diff --git a/web/messages/es/docs/oci-manager/index.json b/web/messages/es/docs/oci-manager/index.json index 5f548dbf..8eef2329 100644 --- a/web/messages/es/docs/oci-manager/index.json +++ b/web/messages/es/docs/oci-manager/index.json @@ -1,11 +1,11 @@ { "meta": { "title": "OCI manager Apps | ProxMenux", - "description": "Imágenes OCI oficiales ejecutadas como contenedores LXC nativos de Proxmox VE, con datos persistentes, dispositivos, aplicaciones multicontenedor y actualizaciones transaccionales." + "description": "Ejecuta imágenes OCI oficiales como contenedores LXC nativos de Proxmox VE, con datos persistentes, acceso a dispositivos, aplicaciones con varios contenedores y actualizaciones transaccionales." }, "header": { "title": "OCI manager Apps", - "description": "Las imágenes OCI oficiales se ejecutan como contenedores LXC nativos de Proxmox VE. La imagen sigue siendo la que publica su responsable; ProxMenux reproduce el entorno que Docker Compose habría creado a su alrededor.", + "description": "Las imágenes OCI oficiales se ejecutan como contenedores LXC nativos de Proxmox VE. Se utiliza la misma imagen que publica su desarrollador; ProxMenux reproduce el entorno que Docker Compose habría creado a su alrededor.", "section": "OCI manager Apps" }, "sections": [ @@ -15,34 +15,43 @@ { "calloutInfo": { "title": "Una imagen OCI, un LXC nativo", - "body": "Dentro de los contenedores no se ejecuta ningún motor Docker. Proxmox VE importa el sistema de archivos de la imagen y sus metadatos OCI, y la aplicación pasa a ser el proceso principal de un LXC nativo, gestionado con las mismas herramientas que cualquier otro contenedor del nodo." + "body": "No se ejecuta Docker Engine dentro de los contenedores. Proxmox VE importa el sistema de archivos de la imagen y sus metadatos OCI; la aplicación pasa a ser el proceso principal de un LXC nativo, administrado con las mismas herramientas que cualquier otro contenedor del nodo." } }, { "flow": { "nodes": [ - { "label": "Origen", "detail": "Imagen OCI\nCompose y documentación" }, - { "label": "ProxMenux", "detail": "Contrato JSON\nvalidación y plan" }, - { "label": "Proxmox VE", "detail": "LXC nativo\nvolúmenes y dispositivos" } + { + "label": "Origen", + "detail": "Imagen OCI\nCompose y documentación" + }, + { + "label": "ProxMenux", + "detail": "Contrato JSON\nvalidación y planificación" + }, + { + "label": "Proxmox VE", + "detail": "LXC nativo\nvolúmenes y dispositivos" + } ], - "caption": "La aplicación no se reconstruye: su entorno se reproduce de forma declarativa." + "caption": "Se utiliza la aplicación original; su entorno se define de forma declarativa y se reproduce." } } ] }, { "id": "where", - "title": "Dónde se encuentra", - "intro": "OCI manager Apps se abre desde la opción OCI manager Apps (Technology Preview) del menú principal de ProxMenux, en el nodo Proxmox y como root. Su primera pantalla ofrece:", + "title": "Dónde encontrarlo", + "intro": "OCI manager Apps se abre desde la opción OCI manager Apps (Technology Preview) del menú principal de ProxMenux, en el nodo Proxmox y como root. La primera pantalla ofrece:", "blocks": [ { "list": { "items": [ - "Buscar aplicaciones: búsqueda por nombre en todo el catálogo.", - "Todas las aplicaciones: el catálogo completo, con el número de aplicaciones.", - "Gestionar aplicaciones OCI instaladas: actualizar, modificar, eliminar o recuperar lo instalado.", - "Cuentas de registro: las cuentas con las que se instalan y actualizan imágenes de registros privados.", - "Instalar una imagen que no está en el catálogo: traducción de un archivo Compose, un comando docker run o una referencia de imagen.", + "Buscar aplicaciones: busca por nombre en todo el catálogo.", + "Todas las aplicaciones: muestra el catálogo completo y su número de aplicaciones.", + "Gestionar aplicaciones OCI instaladas: actualiza, modifica, elimina o recupera las aplicaciones que ya has instalado.", + "Cuentas de registros: administra las cuentas utilizadas para instalar y actualizar imágenes de registros privados.", + "Instalar una imagen que no esté en el catálogo: adapta un archivo Compose, un comando docker run o una referencia de imagen.", "Las categorías del catálogo, cada una con su número de aplicaciones." ] } @@ -50,40 +59,72 @@ { "figure": { "src": "/oci-manager/main-menu.png", - "alt": "Pantalla principal de OCI manager Apps con la búsqueda, todas las aplicaciones, la gestión, la imagen propia y las categorías del catálogo", + "alt": "Pantalla principal de OCI manager Apps con búsqueda, listado completo, gestión de aplicaciones, imágenes fuera del catálogo y categorías.", "caption": "Pantalla principal de OCI manager Apps." } }, { - "p": "Al seleccionar una aplicación se muestra su descripción, la imagen que ejecuta y dos modos de instalación: Instalar con la configuración predeterminada, que pregunta solo lo que decide toda instalación (almacenamiento, dónde van los datos, dirección e inicio), e Instalar con la configuración avanzada, que abre cada decisión en orden: VMID y recursos, el almacenamiento de cada ruta, el bridge y los dispositivos." + "p": "Al seleccionar una aplicación se muestran su descripción, la imagen que utiliza y dos modos de instalación. Instalar con ajustes predeterminados solo pregunta lo esencial de cada instalación: almacenamiento, ubicación de los datos, dirección y arranque. Instalar con ajustes avanzados recorre todas las decisiones en orden: VMID y recursos, almacenamiento de cada ruta, puente de red y dispositivos." }, { - "p": "Una aplicación probada en real muestra Verificado en esa vista y aparece marcada con ✓ en las listas, tanto si se probó en el laboratorio de ProxMenux como si la probó la comunidad." + "p": "Las aplicaciones que se han probado realmente muestran Verificado en esa vista y una marca ✓ en las listas, tanto si la prueba se hizo en el laboratorio de ProxMenux como si la realizó la comunidad." } ] }, { "id": "beta", - "title": "Por qué es una Technology Preview", + "title": "Por qué lleva la etiqueta Technology Preview", "blocks": [ - { "p": "OCI manager Apps lleva la etiqueta Technology Preview que Proxmox VE da a los contenedores de aplicación creados a partir de imágenes OCI, introducidos en Proxmox VE 9.1. Se refiere a aquello sobre lo que funciona OCI manager Apps, no al motor de ProxMenux: el comportamiento de esos contenedores todavía puede cambiar entre versiones de Proxmox VE. La etiqueta se mantiene hasta que Proxmox VE dé ese soporte por estable." }, - { "p": "El motor de OCI manager Apps (instalación, actualización, modificación, recreación, backups, restauración, migración y vigilancia) está probado en el laboratorio de ProxMenux. Cada aplicación se prueba por separado: las que se han probado de verdad muestran Verified y llevan una ✓ en las listas." } + { + "p": "OCI manager Apps mantiene la etiqueta Technology Preview que Proxmox VE asigna a los contenedores de aplicaciones creados a partir de imágenes OCI, cuyo soporte se introdujo en Proxmox VE 9.1. La etiqueta se refiere a la tecnología sobre la que funciona OCI manager Apps, no al motor de ProxMenux: el comportamiento de estos contenedores puede cambiar entre versiones de Proxmox VE. Se mantendrá hasta que Proxmox VE considere estable ese soporte." + }, + { + "p": "El motor de OCI manager Apps se prueba en el laboratorio de ProxMenux: instalación, actualización, modificación, recreación, copias de seguridad, restauración, migración y watchdog. Cada aplicación se verifica por separado. Las que se han probado realmente muestran Verificado y llevan un ✓ en las listas." + } ] }, { "id": "translation", - "title": "Lo que Docker expresa y en qué lo convierte OCI manager Apps", + "title": "Cómo describe Docker los requisitos y cómo los aplica OCI manager Apps", "blocks": [ { "table": { - "headers": ["Necesidad", "Docker la expresa como", "OCI manager Apps la convierte en"], + "headers": [ + "Requisito", + "Cómo lo expresa Docker", + "Cómo lo aplica OCI manager Apps" + ], "rows": [ - ["Ejecutar la aplicación", "image, entrypoint, command", "rootfs OCI y proceso principal del LXC"], - ["Conservar la configuración", "volumes: /config", "un disco mpN persistente incluido en el backup, o un directorio del host"], - ["Publicar el servicio", "ports", "una dirección propia del LXC y la URL de acceso al servicio"], - ["Usar hardware", "devices, group_add", "entradas devN con el GID efectivo del host y un perfil validado"], - ["Conectar dependencias", "networks, depends_on", "un bridge privado, direcciones fijas, orden de arranque y healthchecks"], - ["Actualizar", "pull y recrear", "un rootfs nuevo con el mismo contrato persistente"] + [ + "Ejecutar la aplicación", + "image, entrypoint, command", + "El rootfs de la imagen OCI y el proceso principal del LXC" + ], + [ + "Conservar la configuración", + "volumes: /config", + "Un volumen persistente mpN incluido en la copia de seguridad, o bien un directorio del host." + ], + [ + "Publicar el servicio", + "ports", + "Una dirección propia para el LXC y la URL de acceso al servicio." + ], + [ + "Usar hardware", + "devices, group_add", + "Entradas devN con el GID efectivo del host y un perfil validado." + ], + [ + "Conectar las dependencias", + "networks, depends_on", + "Un puente de red privado, direcciones fijas, orden de arranque y comprobaciones de estado." + ], + [ + "Actualizar", + "Descargar con pull y recrear", + "Un rootfs nuevo que mantiene el mismo contrato de persistencia." + ] ] } } @@ -91,15 +132,31 @@ }, { "id": "kept", - "title": "Qué se mantiene y qué cambia", + "title": "Qué se conserva y qué cambia", "blocks": [ { "cards": { "items": [ - { "icon": "archive", "title": "Se mantiene", "body": "La imagen oficial, sus rutas internas, su entorno, su proceso de arranque y su documentación funcional." }, - { "icon": "boxes", "title": "Se adapta", "body": "El entorno de ejecución: red, persistencia, dispositivos, permisos y dependencias usan primitivas LXC nativas de Proxmox VE." }, - { "icon": "shield", "title": "No se traduce", "body": "Una clave de Compose sin equivalencia segura figura como bloqueo. Las plantillas con bloqueos no se ofrecen, y las opciones sensibles se confirman durante la instalación." }, - { "icon": "refresh", "title": "Se registra", "body": "Digest de la imagen, recursos, rutas, red, dispositivos y pertenencia a una pila quedan en el contrato de la instancia, que las actualizaciones y las recreaciones reproducen." } + { + "icon": "archive", + "title": "Se conserva", + "body": "La imagen oficial, sus rutas internas, su entorno, su proceso de arranque y su documentación de uso." + }, + { + "icon": "boxes", + "title": "Se adapta", + "body": "El entorno de ejecución: la red, la persistencia, los dispositivos, los permisos y las dependencias utilizan los mecanismos nativos de LXC de Proxmox VE." + }, + { + "icon": "shield", + "title": "Sin equivalente", + "body": "Una opción de Compose sin una equivalencia segura se registra como un impedimento para la instalación. Las plantillas con impedimentos no se ofrecen para instalar, y las opciones sensibles requieren confirmación durante el asistente." + }, + { + "icon": "refresh", + "title": "Se registra", + "body": "El digest de la imagen, los recursos, las rutas, la red, los dispositivos y la pertenencia a una pila se guardan en el contrato de la instancia. Las actualizaciones y recreaciones reproducen ese contrato." + } ] } } @@ -112,13 +169,41 @@ { "next": { "items": [ - { "label": "Cómo se traduce una imagen OCI", "href": "/docs/oci-manager/architecture", "tail": "de la imagen y su archivo Compose a un LXC nativo." }, - { "label": "Instalar una imagen que no está en el catálogo", "href": "/docs/oci-manager/custom-image", "tail": "Compose, docker run o una referencia de imagen." }, - { "label": "Datos, rutas y red", "href": "/docs/oci-manager/storage-network", "tail": "discos del contenedor, directorios del host, montajes Rclone y direcciones." }, - { "label": "Dispositivos y aceleración", "href": "/docs/oci-manager/hardware", "tail": "GPU, NVIDIA, Coral, USB y otros dispositivos." }, - { "label": "Aplicaciones multicontenedor", "href": "/docs/oci-manager/stacks", "tail": "aplicación, base de datos y caché como LXC coordinados." }, - { "label": "Instalar, actualizar y modificar", "href": "/docs/oci-manager/lifecycle", "tail": "el contrato de la instancia y sus operaciones." }, - { "label": "En ProxMenux Monitor", "href": "/docs/oci-manager/monitor", "tail": "versiones, actualizaciones, salida de consola y terminal." } + { + "label": "Cómo se adapta una imagen OCI", + "href": "/docs/oci-manager/architecture", + "tail": "De la imagen y su archivo Compose a un LXC nativo." + }, + { + "label": "Instalar una imagen que no esté en el catálogo", + "href": "/docs/oci-manager/custom-image", + "tail": "Un archivo Compose, un comando docker run o una referencia de imagen." + }, + { + "label": "Datos, rutas y red", + "href": "/docs/oci-manager/storage-network", + "tail": "Volúmenes del contenedor, directorios del host, montajes con rclone y direcciones." + }, + { + "label": "Dispositivos y aceleración", + "href": "/docs/oci-manager/hardware", + "tail": "GPU, NVIDIA, Coral, USB y otros dispositivos." + }, + { + "label": "Aplicaciones con varios contenedores", + "href": "/docs/oci-manager/stacks", + "tail": "Aplicación, base de datos y caché en varios LXC coordinados." + }, + { + "label": "Instalar, actualizar y modificar", + "href": "/docs/oci-manager/lifecycle", + "tail": "El contrato de la instancia y sus operaciones." + }, + { + "label": "En ProxMenux Monitor", + "href": "/docs/oci-manager/monitor", + "tail": "Versiones, actualizaciones, salida de consola y terminal." + } ] } } diff --git a/web/messages/es/docs/oci-manager/lifecycle.json b/web/messages/es/docs/oci-manager/lifecycle.json index a722935a..0649c11e 100644 --- a/web/messages/es/docs/oci-manager/lifecycle.json +++ b/web/messages/es/docs/oci-manager/lifecycle.json @@ -18,7 +18,7 @@ }, { "code": { - "code": "instances/\n└── 105/\n └── oci-compose.json\n ├── imagen y digest resuelto\n ├── recursos y red\n ├── entorno (secretos protegidos)\n ├── discos del contenedor y directorios del host\n ├── perfil de hardware y dispositivos\n ├── log de consola y modo de terminal\n └── pertenencia a una pila y ciclo de vida" + "code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle" } }, { @@ -86,7 +86,7 @@ "registry": "Registro OCI", "update": "Actualizar la instancia", "resolve": "Resolver la etiqueta", - "verify": "Verificar el archivo y preflight", + "verify": "Verificar el archivo y realizar las comprobaciones previas", "backup": "Detener y respaldar el CT", "import": "Importar el rootfs nuevo", "reapply": "Aplicar de nuevo el contrato", @@ -215,7 +215,7 @@ { "id": "restore", "title": "Backup, restauración y otro host", - "intro": "Un backup hecho con vzdump o Proxmox Backup Server incluye el contenedor, sus discos y la copia de su contrato. Lo que la instalación guarda en el host no forma parte de él. Gestionar aplicaciones OCI instaladas detecta los contenedores restaurados en un host que no tiene su contrato, un Proxmox recién instalado u otro host, y ofrece registrarlos de nuevo.", + "intro": "Un backup hecho con vzdump o Proxmox Backup Server incluye el contenedor, los discos del contenedor seleccionados para el backup y la copia de su contrato. Lo que la instalación guarda en el host no forma parte de él. Gestionar aplicaciones OCI instaladas detecta los contenedores restaurados en un host que no tiene su contrato, un Proxmox recién instalado u otro host, y ofrece registrarlos de nuevo.", "blocks": [ { "steps": { @@ -462,7 +462,7 @@ ], [ "Discos del contenedor", - "Proxmox los mueve con el contenedor. HA necesita que estén en un almacenamiento compartido." + "Proxmox los mueve con el contenedor. HA necesita sus datos disponibles en el nodo de destino, mediante almacenamiento compartido o una configuración de replicación compatible." ], [ "Directorios del host y dispositivos", diff --git a/web/messages/es/docs/oci-manager/monitor.json b/web/messages/es/docs/oci-manager/monitor.json index 80b1361b..aae9c49f 100644 --- a/web/messages/es/docs/oci-manager/monitor.json +++ b/web/messages/es/docs/oci-manager/monitor.json @@ -30,7 +30,7 @@ "Un interruptor Vigilancia bajo Iniciar al arrancar: la aplicación se inicia de nuevo cuando se detiene sola" ], [ - "App", + "Aplicación", "La aplicación se identifica desde el registro y sus actualizaciones se siguen por la imagen" ], [ @@ -42,7 +42,7 @@ "Discos del contenedor y directorios del host, con su uso" ], [ - "Logs", + "Registros", "Solo en contenedores OCI: la salida de consola de la aplicación" ] ] @@ -52,7 +52,7 @@ }, { "id": "app", - "title": "App", + "title": "Aplicación", "intro": "La pestaña App ofrece la aplicación instalada como una detección, con el nombre, el logo, el puerto y el esquema del registro. Al registrarla se abre el editor con el método Imagen OCI (instalada por ProxMenux), que no necesita configuración.", "blocks": [ { @@ -150,7 +150,7 @@ }, { "id": "logs", - "title": "Logs", + "title": "Registros", "intro": "La pestaña Logs solo aparece en los contenedores instalados por OCI manager Apps, entre Montajes y Backups. Muestra la salida estándar y de errores del proceso principal de la imagen, la misma que muestra docker logs en un contenedor Docker.", "blocks": [ { diff --git a/web/messages/es/docs/oci-manager/stacks.json b/web/messages/es/docs/oci-manager/stacks.json index 854f3f5b..2f690790 100644 --- a/web/messages/es/docs/oci-manager/stacks.json +++ b/web/messages/es/docs/oci-manager/stacks.json @@ -4,7 +4,7 @@ "description": "Cómo convierte OCI manager Apps una aplicación con su base de datos y su caché en LXC nativos coordinados: plan, red privada, hook de dependencias, validación y actualizaciones transaccionales." }, "header": { - "title": "Aplicaciones multicontenedor", + "title": "Aplicaciones con varios contenedores", "description": "Una aplicación con su base de datos, su caché y otros servicios se convierte en varios LXC nativos coordinados, que se instalan y actualizan como uno solo.", "section": "OCI manager Apps" }, @@ -21,7 +21,14 @@ { "mermaid": { "chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}
{{appNet}}\"]\n O --> D[\"{{db}}
{{private}}\"]\n O --> R[\"{{cache}}
{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A", - "labels": { "plan": "Plan de la pila", "app": "LXC de la aplicación", "appNet": "LAN + privada", "db": "LXC PostgreSQL", "cache": "LXC Valkey", "private": "privada" } + "labels": { + "plan": "Plan de la pila", + "app": "LXC de la aplicación", + "appNet": "LAN + privada", + "db": "LXC PostgreSQL", + "cache": "LXC Valkey", + "private": "privada" + } } } ] @@ -35,14 +42,42 @@ }, { "table": { - "headers": ["Elemento del plan", "Contenido", "Comprobado antes de crear nada"], + "headers": [ + "Elemento del plan", + "Contenido", + "Comprobado antes de crear nada" + ], "rows": [ - ["Miembros", "Aplicación principal, base de datos, caché, aprendizaje automático y demás dependencias", "VMID únicos, roles conocidos y exactamente un miembro principal"], - ["Imágenes", "Referencia rolling, arquitectura y digest resuelto de cada servicio", "Todas existen, admiten la arquitectura y superan la verificación de integridad OCI"], - ["Red", "Bridge privado, subred, una dirección fija por servicio y acceso LAN para el miembro principal", "Sin colisión con bridges o subredes existentes y sin direcciones repetidas"], - ["Persistencia", "Discos del contenedor, directorios del host, propietarios y backup", "Rutas sin solapamientos, almacenamiento disponible y permisos declarados"], - ["Secretos", "Contraseña de la base de datos, claves de la aplicación y credenciales iniciales", "Se generan una vez y solo se entregan a los miembros que los usan"], - ["Ciclo de vida", "Orden de arranque, orden de parada y una comprobación de salud por miembro", "La aplicación principal arranca la última y se detiene la primera"] + [ + "Miembros", + "Aplicación principal, base de datos, caché, aprendizaje automático y demás dependencias", + "VMID únicos, roles conocidos y exactamente un miembro principal" + ], + [ + "Imágenes", + "Referencia rolling, arquitectura y digest resuelto de cada servicio", + "Todas existen, admiten la arquitectura y superan la verificación de integridad OCI" + ], + [ + "Red", + "Bridge privado, subred, una dirección fija por servicio y acceso LAN para el miembro principal", + "Sin colisión con bridges o subredes existentes y sin direcciones repetidas" + ], + [ + "Persistencia", + "Discos del contenedor, directorios del host, propietarios y backup", + "Rutas sin solapamientos, almacenamiento disponible y permisos declarados" + ], + [ + "Secretos", + "Contraseña de la base de datos, claves de la aplicación y credenciales iniciales", + "Se generan una vez y solo se entregan a los miembros que los usan" + ], + [ + "Ciclo de vida", + "Orden de arranque, orden de parada y una comprobación de salud por miembro", + "La aplicación principal arranca la última y se detiene la primera" + ] ] } } @@ -55,13 +90,34 @@ { "steps": { "items": [ - { "title": "Reservar todos los VMID", "body": "Se comprueban el inventario de Proxmox VE y el registro de instancias. No se adopta un CT existente ni se reutiliza un contrato que todavía pertenece a otra instancia." }, - { "title": "Preparar todas las imágenes", "body": "Todas las imágenes se resuelven, descargan y verifican antes de crear el primer contenedor." }, - { "title": "Crear cada rootfs", "body": "Se importan los metadatos OCI oficiales y se añaden la identidad de instancia de ProxMenux y el rol del miembro." }, - { "title": "Red privada", "body": "Se crean un bridge y una subred y cada miembro recibe su dirección fija; solo el miembro principal recibe además la interfaz de la LAN." }, - { "title": "Persistencia", "body": "Cada base de datos y configuración recibe su propio disco del contenedor; solo los datos destinados a compartirse usan directorios del host." }, - { "title": "Entorno", "body": "Se escriben los endpoints internos, los secretos compartidos y las variables de servicio. La aplicación llega a sus dependencias en sus direcciones privadas reservadas." }, - { "title": "Registro", "body": "Cada miembro registra su configuración nativa, los cambios del rootfs que las actualizaciones deben reproducir y su relación con la pila." } + { + "title": "Reservar todos los VMID", + "body": "Se comprueban el inventario de Proxmox VE y el registro de instancias. No se adopta un CT existente ni se reutiliza un contrato que todavía pertenece a otra instancia." + }, + { + "title": "Preparar todas las imágenes", + "body": "Todas las imágenes se resuelven, descargan y verifican antes de crear el primer contenedor." + }, + { + "title": "Crear cada rootfs", + "body": "Se importan los metadatos OCI oficiales y se añaden la identidad de instancia de ProxMenux y el rol del miembro." + }, + { + "title": "Red privada", + "body": "Se crean un bridge y una subred y cada miembro recibe su dirección fija; solo el miembro principal recibe además la interfaz de la LAN." + }, + { + "title": "Persistencia", + "body": "Cada base de datos y configuración recibe su propio disco del contenedor; solo los datos destinados a compartirse usan directorios del host." + }, + { + "title": "Entorno", + "body": "Se escriben los endpoints internos, los secretos compartidos y las variables de servicio. La aplicación llega a sus dependencias en sus direcciones privadas reservadas." + }, + { + "title": "Registro", + "body": "Cada miembro registra su configuración nativa, los cambios del rootfs que las actualizaciones deben reproducir y su relación con la pila." + } ] } } @@ -74,20 +130,48 @@ "blocks": [ { "table": { - "headers": ["Servicio", "Comprobación", "Qué demuestra"], + "headers": [ + "Servicio", + "Comprobación", + "Qué demuestra" + ], "rows": [ - ["PostgreSQL", "pg_isready en el CT con el host, el usuario y la base de datos esperados", "El servidor acepta conexiones para la base de datos configurada"], - ["Redis / Valkey", "redis-cli o valkey-cli PING contra su dirección privada", "El broker escucha y responde"], - ["Aprendizaje automático de Immich", "HTTP GET /ping, más una comprobación del runtime GPU seleccionado", "El servicio responde y la aceleración pedida no ha pasado a CPU"], - ["Nextcloud", "GET /status.php con installed=true, maintenance=false y needsDbUpgrade=false", "La inicialización terminó sin migraciones pendientes"], - ["Paperless-ngx / Tandoor", "HTTP en la dirección de la LAN y el puerto real del servicio", "El frontend y sus dependencias sirven la aplicación"], - ["Aplicación principal", "El endpoint de su plantilla, por ejemplo /api/server/ping en Immich", "La pila completa funciona a través de la aplicación que usa las dependencias"] + [ + "PostgreSQL", + "pg_isready en el CT con el host, el usuario y la base de datos esperados", + "El servidor acepta conexiones para la base de datos configurada" + ], + [ + "Redis / Valkey", + "redis-cli o valkey-cli PING contra su dirección privada", + "El broker escucha y responde" + ], + [ + "Aprendizaje automático de Immich", + "HTTP GET /ping, más una comprobación del runtime GPU seleccionado", + "El servicio responde y la aceleración pedida no ha pasado a CPU" + ], + [ + "Nextcloud", + "GET /status.php con installed=true, maintenance=false y needsDbUpgrade=false", + "La inicialización terminó sin migraciones pendientes" + ], + [ + "Paperless-ngx / Tandoor", + "HTTP en la dirección de la LAN y el puerto real del servicio", + "El frontend y sus dependencias sirven la aplicación" + ], + [ + "Aplicación principal", + "El endpoint de su plantilla, por ejemplo /api/server/ping en Immich", + "La pila completa funciona a través de la aplicación que usa las dependencias" + ] ] } }, { "calloutWarning": { - "title": "running no significa healthy", + "title": "En ejecución no significa que funcione correctamente", "body": "El estado running solo indica que existe el proceso del LXC. Cuando el servicio ofrece una comprobación mejor, se usa una comprobación exec o HTTP con un tiempo límite. Si un miembro se detiene o no supera su comprobación, la pila no se declara instalada." } } @@ -103,8 +187,14 @@ { "codeGrid": { "items": [ - { "title": "Configuración del CT principal", "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" }, - { "title": "Contrato privado (ejemplo)", "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" } + { + "title": "Configuración del CT principal", + "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" + }, + { + "title": "Contrato privado (ejemplo)", + "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" + } ] } }, @@ -121,12 +211,30 @@ { "steps": { "items": [ - { "title": "Proxmox VE llama a pre-start", "body": "Antes de arrancar el CT principal, el hook se ejecuta con su VMID y la fase del ciclo de vida." }, - { "title": "Un bloqueo por pila", "body": "flock sobre /run/lock/proxmenux-stack-VMID.lock impide dos secuencias de arranque a la vez." }, - { "title": "Se lee y valida el contrato", "body": "Se exigen un esquema conocido, dependencias numéricas, etiquetas, una comprobación exec, http o running y un tiempo límite positivo." }, - { "title": "Dependencias en orden", "body": "Cada CT debe existir; uno detenido se arranca y uno que ya está en marcha no se reinicia." }, - { "title": "Espera de salud", "body": "La comprobación se ejecuta cada dos segundos y se confirma además que el CT sigue en marcha." }, - { "title": "Arranca el CT principal", "body": "Cuando todas las dependencias están listas, pre-start termina y Proxmox VE arranca la aplicación." } + { + "title": "Proxmox VE llama a pre-start", + "body": "Antes de arrancar el CT principal, el hook se ejecuta con su VMID y la fase del ciclo de vida." + }, + { + "title": "Un bloqueo por pila", + "body": "flock sobre /run/lock/proxmenux-stack-VMID.lock impide dos secuencias de arranque a la vez." + }, + { + "title": "Se lee y valida el contrato", + "body": "Se exigen un esquema conocido, dependencias numéricas, etiquetas, una comprobación exec, http o running y un tiempo límite positivo." + }, + { + "title": "Dependencias en orden", + "body": "Cada CT debe existir; uno detenido se arranca y uno que ya está en marcha no se reinicia." + }, + { + "title": "Esperar a que el servicio esté listo", + "body": "La comprobación se ejecuta cada dos segundos y se confirma además que el CT sigue en marcha." + }, + { + "title": "Arranca el CT principal", + "body": "Cuando todas las dependencias están listas, pre-start termina y Proxmox VE arranca la aplicación." + } ] } }, @@ -138,11 +246,27 @@ }, { "table": { - "headers": ["Tipo", "Ejemplo", "Arranques posteriores"], + "headers": [ + "Tipo", + "Ejemplo", + "Arranques posteriores" + ], "rows": [ - ["Pila dependiente", "Immich, Nextcloud, aplicación con PostgreSQL", "El hook del CT principal arranca las dependencias y las espera"], - ["Suite de aplicaciones", "Suite Arr", "Sin miembro principal: cada LXC sigue su propio onboot"], - ["Aplicación simple", "Jellyfin", "Proxmox VE arranca directamente ese LXC"] + [ + "Pila dependiente", + "Immich, Nextcloud, aplicación con PostgreSQL", + "El hook del CT principal arranca las dependencias y las espera" + ], + [ + "Suite de aplicaciones", + "Suite Arr", + "Sin miembro principal: cada LXC sigue su propio onboot" + ], + [ + "Aplicación simple", + "Jellyfin", + "Proxmox VE arranca directamente ese LXC" + ] ] } } @@ -176,21 +300,51 @@ { "steps": { "items": [ - { "title": "Cualquier miembro", "body": "El contrato del miembro indica el VMID principal y la lista completa de miembros." }, - { "title": "La pila es reproducible", "body": "Se validan identidades, contratos, hook, adaptaciones y la existencia de una reproducción coordinada para esa receta." }, - { "title": "Primero las imágenes", "body": "La aplicación no se detiene hasta que todos los digests están resueltos, descargados y verificados." }, - { "title": "Detener y respaldar el conjunto", "body": "Los backups nativos verificados se toman con la pila detenida, de modo que aplicación y bases de datos corresponden al mismo momento." }, - { "title": "Actualizar y comprobar cada miembro", "body": "Adaptación, red, montajes, secretos y dispositivos se aplican de nuevo antes de la comprobación de salud de cada miembro." }, - { "title": "Publicar o recuperar todo", "body": "Los contratos nuevos solo se publican cuando todos los miembros pasan. Si uno falla, se restauran todos." } + { + "title": "Cualquier miembro", + "body": "El contrato del miembro indica el VMID principal y la lista completa de miembros." + }, + { + "title": "La pila es reproducible", + "body": "Se validan identidades, contratos, hook, adaptaciones y la existencia de una reproducción coordinada para esa receta." + }, + { + "title": "Primero las imágenes", + "body": "La aplicación no se detiene hasta que todos los digests están resueltos, descargados y verificados." + }, + { + "title": "Detener y respaldar el conjunto", + "body": "Los backups nativos verificados se toman con la pila detenida, de modo que aplicación y bases de datos corresponden al mismo momento." + }, + { + "title": "Actualizar y comprobar cada miembro", + "body": "Adaptación, red, montajes, secretos y dispositivos se aplican de nuevo antes de la comprobación de salud de cada miembro." + }, + { + "title": "Publicar o recuperar todo", + "body": "Los contratos nuevos solo se publican cuando todos los miembros pasan. Si uno falla, se restauran todos." + } ] } }, { "table": { - "headers": ["Modificar", "Qué cambia", "Qué se conserva"], + "headers": [ + "Modificar", + "Qué cambia", + "Qué se conserva" + ], "rows": [ - ["Rutas y dispositivos extra", "Se añaden al contenedor de la aplicación o se eliminan de él, y el contenedor se reinicia. No se reconstruye nada", "Los datos de la aplicación, su base de datos y los demás contenedores"], - ["Qué ejecuta el reconocimiento (Immich)", "El contenedor Machine learning toma la imagen y los dispositivos de la CPU o de una GPU del host. Toda la aplicación se detiene y se actualiza, como en una actualización", "La caché de modelos, la biblioteca y la base de datos. Si algo falla, se restauran los contenedores y la opción anteriores"] + [ + "Rutas y dispositivos extra", + "Se añaden al contenedor de la aplicación o se eliminan de él, y el contenedor se reinicia. No se reconstruye nada", + "Los datos de la aplicación, su base de datos y los demás contenedores" + ], + [ + "Qué ejecuta el reconocimiento (Immich)", + "El contenedor Machine learning toma la imagen y los dispositivos de la CPU o de una GPU del host. Toda la aplicación se detiene y se actualiza, como en una actualización", + "La caché de modelos, la biblioteca y la base de datos. Si algo falla, se restauran los contenedores y la opción anteriores" + ] ] } }, @@ -220,7 +374,7 @@ "stop": "Detener, primero el principal", "backup": "Backup verificado de cada CT", "replace": "Sustituir el rootfs", - "healthy": "¿Todos sanos?", + "healthy": "¿Todos funcionan correctamente?", "yes": "Sí", "no": "No", "commit": "Publicar los contratos", diff --git a/web/messages/es/docs/oci-manager/storage-network.json b/web/messages/es/docs/oci-manager/storage-network.json index 08d67c4e..554e3f91 100644 --- a/web/messages/es/docs/oci-manager/storage-network.json +++ b/web/messages/es/docs/oci-manager/storage-network.json @@ -1,11 +1,11 @@ { "meta": { "title": "Datos, rutas y red | ProxMenux", - "description": "Cómo conserva OCI manager Apps los datos de un contenedor OCI: discos del contenedor, directorios del host, montajes Rclone, direcciones y redes privadas." + "description": "Cómo conserva OCI manager Apps los datos de un contenedor OCI: discos del contenedor, directorios del host, montajes con rclone, direcciones y redes privadas." }, "header": { "title": "Datos, rutas y red", - "description": "Qué vive en el rootfs, qué sobrevive a su sustitución, cómo se comparten datos entre contenedores y cómo obtiene cada contenedor su dirección.", + "description": "Qué se guarda en el rootfs, qué sobrevive a su sustitución, cómo se comparten datos entre contenedores y cómo obtiene cada uno su dirección.", "section": "OCI manager Apps" }, "sections": [ @@ -14,8 +14,8 @@ "blocks": [ { "calloutInfo": { - "title": "La persistencia se decide antes de que exista el LXC", - "body": "Los volúmenes que publican la imagen y su archivo Compose se leen antes de crear el contenedor. Cada ruta que debe sobrevivir a una actualización se convierte en un punto de montaje independiente del rootfs, de modo que el rootfs solo contiene lo que pertenece a la imagen y puede sustituirse." + "title": "La persistencia se decide antes de crear el LXC", + "body": "Antes de crear el contenedor se leen los volúmenes declarados por la imagen y por su archivo Compose. Cada ruta que deba conservarse tras una actualización se convierte en un punto de montaje independiente del rootfs. Así, el rootfs solo contiene lo que pertenece a la imagen y puede sustituirse." } } ] @@ -23,17 +23,35 @@ { "id": "questions", "title": "Qué pregunta el instalador", - "intro": "La plantilla aporta las rutas que necesita la aplicación. Cada una se sitúa en un disco del contenedor o en un directorio del host, y pueden añadirse más rutas antes del resumen.", + "intro": "La plantilla proporciona las rutas que necesita la aplicación. Cada una se ubica en un disco del contenedor o en un directorio del host, y se pueden añadir más rutas antes del resumen.", "blocks": [ { "steps": { "items": [ - { "title": "Rutas requeridas", "body": "Se enumeran /config, /data, bibliotecas, descargas y cualquier volumen que declare la aplicación." }, - { "title": "Ubicación", "body": "Cada ruta se sitúa en un disco del contenedor o en un directorio existente del host." }, - { "title": "Almacenamiento y tamaño", "body": "Un disco del contenedor se crea en un almacenamiento de Proxmox VE con el tamaño indicado. La instalación por defecto usa local-lvm; la instalación avanzada pregunta el almacenamiento de cada ruta justo antes de su tamaño y propone el del rootfs. Aparece como vm-VMID-disk-N y se conecta como mpN." }, - { "title": "Directorio del host", "body": "Un directorio del host se indica por su ruta. Si no existe, se crea con el propietario que mapea el contenedor." }, - { "title": "Rutas adicionales", "body": "Antes de instalar pueden añadirse más pares de ruta del host o volumen y ruta del contenedor." }, - { "title": "Resumen", "body": "La relación completa se muestra antes de crear el CT y se guarda en su contrato de instancia." } + { + "title": "Rutas necesarias", + "body": "Se enumeran /config, /data, bibliotecas, descargas y todos los volúmenes declarados por la aplicación." + }, + { + "title": "Ubicación", + "body": "Cada ruta se ubica en un disco del contenedor o en un directorio del host ya existente." + }, + { + "title": "Almacenamiento y tamaño", + "body": "Se crea un disco del contenedor en un almacenamiento de Proxmox VE con el tamaño indicado. La instalación predeterminada usa local-lvm; la avanzada pregunta el almacenamiento de cada ruta justo antes de su tamaño y propone el del rootfs. El disco aparece como vm-VMID-disk-N y se conecta como mpN." + }, + { + "title": "Directorio del host", + "body": "El directorio del host se indica mediante su ruta. Si no existe, se crea con el usuario al que se mapea el del contenedor como propietario." + }, + { + "title": "Rutas adicionales", + "body": "Antes de instalar se pueden añadir más pares de ruta o volumen del host y ruta dentro del contenedor." + }, + { + "title": "Resumen", + "body": "Antes de crear el CT se muestra la correspondencia completa de rutas y se guarda en el contrato de la instancia." + } ] } } @@ -45,44 +63,85 @@ "blocks": [ { "table": { - "headers": ["Propiedad", "Disco del contenedor", "Directorio del host"], + "headers": [ + "Propiedad", + "Disco del contenedor", + "Directorio del host" + ], "rows": [ - ["En la configuración", "mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G", "mpN: /mnt/oci-shared/media,mp=/data/media"], - ["Backup del contenedor (vzdump)", "Incluido, con backup=1", "No incluido"], - ["Tamaño", "Fijo; crece con un redimensionado del punto de montaje", "El espacio libre del sistema de archivos o dataset del host"], - ["Otros contenedores", "Solo lo monta su propio contenedor", "El mismo directorio puede montarse en varios contenedores"], - ["Snapshots y restauración", "Los gestiona Proxmox VE junto con el CT", "Se gestionan en el almacenamiento del host"], - ["Al eliminar la aplicación", "Se elimina con el contenedor", "Se conserva, con su contenido"], - ["Al mover el CT a otro nodo", "Se mueve con el CT", "La misma ruta debe existir en el otro nodo"] + [ + "En la configuración", + "mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G", + "mpN: /mnt/oci-shared/media,mp=/data/media" + ], + [ + "Copia del contenedor (vzdump)", + "Incluido, con backup=1", + "No incluido" + ], + [ + "Tamaño", + "Fijo; se amplía redimensionando el punto de montaje", + "El espacio libre del sistema de archivos o dataset del host" + ], + [ + "Otros contenedores", + "Solo lo monta el contenedor al que pertenece", + "El mismo directorio se puede montar en varios contenedores" + ], + [ + "Snapshots y restauración", + "Los gestiona Proxmox VE junto con el CT", + "Se gestionan en el almacenamiento del host" + ], + [ + "Al eliminar la aplicación", + "Se elimina con el contenedor", + "Se conserva con su contenido" + ], + [ + "Al mover el CT a otro nodo", + "Se mueve con el CT", + "La misma ruta debe existir en el otro nodo" + ] ] } }, { - "p": "El rootfs queda reservado para los binarios y el contenido de la imagen. Una actualización o una recreación lo sustituye sin tocar ninguno de los dos tipos de punto de montaje." + "p": "El rootfs se reserva para los binarios y el contenido de la imagen. Una actualización o recreación lo sustituye sin tocar ninguno de los dos tipos de punto de montaje." } ] }, { "id": "example", - "title": "Ejemplo: un contenedor con las dos ubicaciones", + "title": "Ejemplo: un contenedor con ambas ubicaciones", "blocks": [ { "code": { - "title": "Jellyfin instalado como CT 151 en local-lvm (extracto)", - "code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Disco del contenedor, incluido en el backup del CT\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Directorio del host, fuera del backup del CT\nmp1: /mnt/oci-shared/media,mp=/data/media" + "title": "Jellyfin instalado como CT 151 en local-lvm (fragmento)", + "code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media" } }, { - "p": "Una actualización o una recreación sustituye solo el rootfs: mp0 conserva usuarios, bibliotecas y ajustes, y mp1 sigue mostrando los mismos archivos multimedia. Restaurar el backup del CT devuelve /config; el directorio multimedia se restaura, si hace falta, desde el backup del almacenamiento del host." + "p": "Una actualización o recreación solo sustituye el rootfs: mp0 conserva usuarios, bibliotecas y ajustes, y mp1 sigue mostrando los mismos archivos multimedia. Al restaurar la copia del CT se recupera /config; si hace falta restaurar el directorio multimedia, se utiliza la copia de seguridad del almacenamiento del host." }, { "flow": { "nodes": [ - { "label": "Contrato", "detail": "/config" }, - { "label": "Ubicación", "detail": "disco del contenedor\no directorio del host" }, - { "label": "LXC", "detail": "siempre /config\npara la aplicación" } + { + "label": "Contrato", + "detail": "/config" + }, + { + "label": "Ubicación", + "detail": "Disco del contenedor\no directorio del host" + }, + { + "label": "LXC", + "detail": "Siempre /config\npara la aplicación" + } ], - "caption": "La aplicación ve la ruta que publica la imagen; solo cambia dónde se guarda." + "caption": "La aplicación ve la ruta declarada por la imagen; solo cambia dónde se almacena." } } ] @@ -94,33 +153,48 @@ { "mermaid": { "chartCode": "flowchart TB\n H[\"{{host}}
/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent
/data\"]\n H --> J[\"Jellyfin
/data\"]\n H --> R[\"Radarr / Sonarr
/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]", - "labels": { "host": "Directorio del host", "config": "configuración propia" } + "labels": { + "host": "Directorio del host", + "config": "Configuración propia" + } } }, { - "p": "Cada contenedor guarda su configuración en su propio disco. La biblioteca o las descargas son un único directorio del host montado en la misma ruta interna de todos los contenedores, de modo que la ruta en la que escribe una aplicación es la misma en la que lee otra." + "p": "Cada contenedor guarda su configuración en su propio disco. La biblioteca o las descargas se guardan en un único directorio del host, montado en la misma ruta interna en todos los contenedores. Así, una ruta en la que escribe una aplicación es la misma desde la que lee otra." } ] }, { "id": "rclone", - "title": "Almacenamiento en la nube con la aplicación Rclone", - "intro": "La aplicación Rclone del catálogo ofrece, además de su instalación, Activar un montaje en un contenedor Rclone OCI existente. Monta un remoto ya creado y autorizado en la interfaz web de Rclone y lo publica en el host, donde otros contenedores pueden usarlo como directorio del host.", + "title": "Almacenamiento en la nube mediante la aplicación rclone", + "intro": "Además de instalarla, la ficha de rclone en el catálogo permite Activar un montaje en un contenedor OCI de rclone existente. Se monta un remoto ya creado y autorizado en la interfaz web de rclone y se publica en el host. Otros contenedores pueden usarlo como un directorio del host.", "blocks": [ { "steps": { "items": [ - { "title": "Contenedor y remoto", "body": "El VMID del contenedor Rclone, el nombre exacto del remoto y, opcionalmente, una ruta dentro de él." }, - { "title": "Nombre y caché", "body": "El nombre del montaje y el modo de caché VFS: off, minimal, writes o full (por defecto)." }, - { "title": "Vistas publicadas", "body": "Una raíz común, /mnt/oci-shared por defecto, contiene una vista de lectura y escritura en /mnt/oci-shared/remotes/NOMBRE y una de solo lectura en /mnt/oci-shared/remotes-ro/NOMBRE." }, - { "title": "Activación", "body": "Tras una confirmación, el CT se detiene, se configuran su orden de arranque y un hookscript de Proxmox VE, y se vuelve a iniciar. La operación espera hasta que las dos vistas están montadas en el host." } + { + "title": "Contenedor y remoto", + "body": "El VMID del contenedor de rclone, el nombre exacto del remoto y, opcionalmente, una ruta dentro de él." + }, + { + "title": "Nombre del montaje y caché", + "body": "El nombre del montaje y el modo de caché VFS: off, minimal, writes o full (predeterminado)." + }, + { + "title": "Vistas publicadas", + "body": "Una raíz común, /mnt/oci-shared de forma predeterminada, contiene una vista de lectura y escritura en /mnt/oci-shared/remotes/NAME y otra de solo lectura en /mnt/oci-shared/remotes-ro/NAME." + }, + { + "title": "Activación", + "body": "Tras confirmar, se detiene el CT, se configuran su comando de arranque y un hookscript de Proxmox VE y se vuelve a iniciar. La operación espera a que ambas vistas estén montadas en el host." + } ] } }, { "calloutInfo": { - "title": "Si el montaje no llega a activarse", - "body": "Se restaura la configuración anterior del contenedor y se vuelve a iniciar, de modo que una activación fallida deja Rclone como estaba." + "title": "Si el montaje no se activa", + "body": "Se restaura la configuración anterior del contenedor y se vuelve a iniciar. Así, si la activación falla, rclone queda como estaba." } } ] @@ -128,41 +202,58 @@ { "id": "network", "title": "Direcciones y redes", - "intro": "Una aplicación simple necesita una dirección. Una aplicación multicontenedor necesita además una red estable entre sus miembros.", + "intro": "Una aplicación de un solo contenedor necesita una dirección. Una aplicación con varios contenedores también necesita una red estable entre sus miembros.", "blocks": [ { "cards": { "items": [ - { "icon": "network", "title": "Aplicación simple", "body": "Se eligen el bridge y DHCP o una dirección CIDR fija. El LXC tiene una dirección propia y el resumen muestra las URL completas de los servicios." }, - { "icon": "waypoints", "title": "Aplicación multicontenedor", "body": "Se busca una subred libre, se crea un bridge privado persistente y cada miembro (aplicación, base de datos, caché) recibe en él una dirección fija." } + { + "icon": "network", + "title": "Aplicación de un contenedor", + "body": "Se elige el puente de red y DHCP o una dirección fija en formato CIDR. El LXC tiene su propia dirección y el resumen muestra las URL completas de los servicios." + }, + { + "icon": "waypoints", + "title": "Aplicación con varios contenedores", + "body": "Se busca una subred libre, se crea un puente privado persistente y cada miembro —aplicación, base de datos y caché— recibe una dirección fija en él." + } ] } }, { "flow": { "nodes": [ - { "label": "LAN", "detail": "dirección accesible\nsolo el servicio principal" }, - { "label": "LXC principal", "detail": "web / API\nLAN + red privada" }, - { "label": "Red privada", "detail": "PostgreSQL · Valkey · ML\ndirecciones fijas" } + { + "label": "LAN", + "detail": "Dirección accesible\nsolo para el servicio principal" + }, + { + "label": "LXC principal", + "detail": "Web / API\nLAN + red privada" + }, + { + "label": "Red privada", + "detail": "PostgreSQL · Valkey · ML\ndirecciones fijas" + } ], - "caption": "Las dependencias se comunican por la red privada y no tienen dirección en la LAN." + "caption": "Las dependencias se comunican por la red privada y no tienen una dirección en la LAN." } }, { - "p": "El contrato de la pila guarda el bridge, la subred, las direcciones y las relaciones entre servicios. La actualización de la aplicación reutiliza la misma topología en todos sus miembros. ProxMenux Monitor abre el contenedor principal en su dirección de la LAN, no en la de la red privada." + "p": "El contrato de la pila guarda el puente, la subred, las direcciones y las relaciones entre servicios. Al actualizar la aplicación se reutiliza la misma topología para todos sus miembros. ProxMenux Monitor abre el contenedor principal en su dirección de la LAN, no en la de la red privada." } ] }, { "id": "ownership", - "title": "Propietarios", + "title": "Propietarios de archivos y directorios", "blocks": [ { "list": { "items": [ - "Los directorios nuevos se crean con el UID y el GID que mapea el LXC no privilegiado.", - "Los directorios existentes no cambian de propietario de forma recursiva.", - "Los sockets, los archivos del sistema y las rutas sensibles no se ofrecen como directorios del host genéricos." + "Los directorios nuevos se crean con el UID y el GID a los que se mapea el LXC sin privilegios.", + "No se cambia recursivamente el propietario de los directorios existentes.", + "Los sockets, archivos del sistema y rutas sensibles no se ofrecen como directorios genéricos del host." ] } } @@ -170,17 +261,41 @@ }, { "id": "backup", - "title": "Qué contiene el backup de un contenedor", + "title": "Qué contiene una copia del contenedor", "blocks": [ { "table": { - "headers": ["Elemento", "En el vzdump del CT", "Dónde se conserva"], + "headers": [ + "Elemento", + "En la copia vzdump del CT", + "Dónde se conserva" + ], "rows": [ - ["rootfs OCI", "Sí", "El backup del CT; también puede reconstruirse desde la imagen y el contrato"], - ["Disco del contenedor con backup=1", "Sí", "El backup del CT"], - ["Directorio del host", "No", "El backup del almacenamiento del host"], - ["Contrato de la instancia", "No", "/usr/local/share/proxmenux/oci/instances/VMID/ en el host"], - ["Aplicación multicontenedor", "Cada miembro en su propio backup", "Los backups de cada miembro, más el contrato de la pila y su bridge en el host"] + [ + "Rootfs OCI", + "Sí", + "En la copia del CT; también se puede reconstruir a partir de la imagen y el contrato" + ], + [ + "Disco del contenedor con backup=1", + "Sí", + "La copia del CT" + ], + [ + "Directorio del host", + "No", + "La copia de seguridad del almacenamiento del host" + ], + [ + "Contrato de la instancia", + "Sí, la copia que guarda el CT", + "/.proxmenux/oci-record.json dentro del CT; las copias adicionales del host y del clúster se guardan por separado" + ], + [ + "Aplicación con varios contenedores", + "Cada miembro en su propia copia", + "Las copias de todos los miembros, más el contrato de la pila y su puente de red en el host" + ] ] } } diff --git a/web/messages/fr/docs/oci-manager/architecture.json b/web/messages/fr/docs/oci-manager/architecture.json new file mode 100644 index 00000000..215730e8 --- /dev/null +++ b/web/messages/fr/docs/oci-manager/architecture.json @@ -0,0 +1,171 @@ +{ + "meta": { + "title": "Comment une image OCI est adaptée | ProxMenux", + "description": "Du dépôt de l’image et de son fichier Compose à un modèle vérifiable, un plan de déploiement et un LXC natif de Proxmox VE, sans Docker à l’intérieur." + }, + "header": { + "title": "Comment une image OCI est adaptée", + "description": "Du dépôt de l’image et de son fichier Compose à un modèle vérifiable, un plan de déploiement et un LXC natif, sans installer Docker à l’intérieur.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "pipeline", + "title": "Le processus d’adaptation", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]", + "labels": { + "repo": "Dépôt de l’image", + "converter": "Convertisseur", + "template": "Modèle JSON", + "blockers": "Aucun point bloquant ?", + "no": "Non", + "yes": "Oui", + "review": "Révision / overlay", + "plan": "Plan de déploiement", + "lxc": "LXC natif" + } + } + }, + { + "p": "Le convertisseur lit l’image et le fichier Compose publiés par le projet, puis produit un modèle JSON. Si des exigences n’ont pas pu être adaptées et bloquent l’installation, le modèle est révisé avant sa publication dans le catalogue. Un fichier d’ajustements vérifiés, appelé overlay, permet de résoudre ces points. Seuls les modèles sans point bloquant sont proposés à l’installation." + } + ] + }, + { + "id": "template", + "title": "Ce que conserve le modèle", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Identité de l’image", + "body": "Dépôt, tag mis à jour en continu, architecture, digest résolu et révision de la source." + }, + { + "icon": "braces", + "title": "Contrat du conteneur", + "body": "Entrypoint, Cmd, environnement, utilisateur, répertoire de travail, signal d’arrêt, ports et volumes." + }, + { + "icon": "layers", + "title": "Adaptation à Proxmox VE", + "body": "Ressources, sécurité, points de montage, périphériques, sysctls, contrôles de bon fonctionnement et adaptations nécessaires pour chacun, avec leur justification." + }, + { + "icon": "shield", + "title": "Compatibilité", + "body": "Clés prises en charge, exigences non adaptées qui bloquent l’installation et état de chaque validation." + } + ] + } + } + ] + }, + { + "id": "sources", + "title": "OCI fournit le processus ; Compose fournit l’environnement", + "blocks": [ + { + "table": { + "headers": [ + "Source", + "Exemple", + "Résultat natif" + ], + "rows": [ + [ + "Métadonnées OCI", + "Entrypoint, Cmd, User", + "Proxmox VE les importe à la création du CT" + ], + [ + "Docker Compose", + "environment, volumes, devices", + "Entrées d’environnement LXC, mpN et devN" + ], + [ + "Profil ProxMenux", + "GPU, contrôle de bon fonctionnement, identifiants", + "Questions et adaptations vérifiées" + ], + [ + "Utilisateur", + "VMID, stockage, réseau", + "Le contrat de l’instance" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Ce qui se passe pendant l’installation", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Résoudre la référence", + "body": "Le registre est interrogé, l’architecture de l’hôte est sélectionnée et le digest exact désigné par le tag mis à jour en continu est fixé." + }, + { + "title": "Télécharger et vérifier", + "body": "Skopeo télécharge l’image sous forme d’archive OCI. Avant toute création, chaque couche est vérifiée à l’aide de son digest, puis décompressée. Si le téléchargement est endommagé, il est tenté une seconde fois avant l’arrêt de l’installation." + }, + { + "title": "Créer le système de fichiers", + "body": "pct create crée le rootfs à partir de l’archive et conserve les métadonnées officielles du processus de l’image." + }, + { + "title": "Raccorder les ressources", + "body": "Les volumes, le réseau, l’environnement, les périphériques et les profils de sécurité déclarés sont appliqués." + }, + { + "title": "Console", + "body": "La sortie console du conteneur est conservée sur l’hôte. La console de Proxmox VE ouvre un shell si l’image en contient un." + }, + { + "title": "Vérifier", + "body": "Au premier démarrage, l’installation attend l’attribution d’une adresse et la réponse du service. En cas d’échec, elle n’est pas signalée comme réussie." + }, + { + "title": "Enregistrer la configuration", + "body": "La configuration effective est enregistrée dans le contrat de l’instance utilisé lors des mises à jour et des recréations." + } + ] + } + } + ] + }, + { + "id": "example", + "title": "Exemple : une image avec /config et /downloads", + "intro": "Une définition Compose courante et la configuration Proxmox VE qui en résulte. Les chemins attendus par l’application ne changent pas.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Docker Compose", + "code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080" + }, + { + "title": "/etc/pve/lxc/VMID.conf (extrait)", + "code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000" + } + ] + } + }, + { + "p": "mp0 est un second disque appartenant au conteneur, nommé vm-VMID-disk-N sur le stockage sélectionné. Il est monté dans /config et, avec backup=1, inclus dans la sauvegarde du conteneur. mp1 ne crée aucun disque : il monte le répertoire de l’hôte /srv/downloads dans /downloads à l’intérieur du LXC. Le port 8080 n’est pas redirigé : le LXC possède sa propre adresse et le service y répond." + } + ] + } + ] +} diff --git a/web/messages/fr/docs/oci-manager/custom-image.json b/web/messages/fr/docs/oci-manager/custom-image.json new file mode 100644 index 00000000..6817b296 --- /dev/null +++ b/web/messages/fr/docs/oci-manager/custom-image.json @@ -0,0 +1,278 @@ +{ + "meta": { + "title": "Installer une image absente du catalogue | ProxMenux", + "description": "Adaptez une image OCI à partir d’un fichier Compose, d’une URL, d’une commande docker run ou d’une référence d’image, puis vérifiez ce que ProxMenux peut reproduire avant l’installation." + }, + "header": { + "title": "Installer une image absente du catalogue", + "description": "Votre image est adaptée à partir de son fichier Compose, d’une commande docker run ou de sa seule référence. Le résultat est présenté pour vérification avant la création du moindre LXC.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Le même convertisseur et le même installateur", + "body": "L’option Installer une image absente du catalogue utilise le même convertisseur et le même installateur que les modèles du catalogue. Le contrat est simplement généré à ce moment-là à partir de la définition fournie, puis validé avant toute création de LXC." + } + } + ] + }, + { + "id": "sources", + "title": "Comment décrire l’image", + "intro": "Le premier écran demande comment l’image est décrite. Quatre possibilités fournissent une définition à adapter, une cinquième utilise uniquement le nom de l’image et trois autres lisent un oci-compose déjà rédigé.", + "blocks": [ + { + "table": { + "headers": [ + "Option", + "Contenu lu" + ], + "rows": [ + [ + "Coller son fichier Compose dans le terminal", + "Collez le contenu YAML dans le terminal et terminez avec Ctrl+D." + ], + [ + "Lire son fichier Compose depuis cet hôte", + "Un chemin sur le nœud, /root/docker-compose.yml par défaut. Le fichier doit exister et ne pas dépasser 256 KiB." + ], + [ + "Télécharger son fichier Compose depuis une adresse", + "Une adresse http:// ou https:// qui fournit le YAML brut. Le téléchargement est limité à 256 KiB." + ], + [ + "Coller sa commande docker run dans le terminal", + "La commande publiée par le projet. Les ports, l’environnement, les volumes, les périphériques, les capabilities, l’utilisateur, la mémoire partagée et les autres options prises en charge sont adaptés." + ], + [ + "Uniquement la référence de l’image, sans fichier Compose", + "Une référence comme ghcr.io/user/application:latest. Le registre est interrogé et les métadonnées OCI de l’image sont conservées." + ], + [ + "Coller un oci-compose dans le terminal", + "Collez le JSON dans le terminal et terminez avec Ctrl+D. Il n’est pas converti : il est vérifié puis installé tel qu’il est rédigé." + ], + [ + "Lire un oci-compose depuis cet hôte", + "Un fichier JSON sur le nœud, /root/oci-compose.json par défaut, de 2 MiB au maximum." + ], + [ + "Télécharger un oci-compose depuis une adresse", + "Une adresse http:// ou https:// qui fournit le fichier JSON. Le téléchargement est limité à 2 MiB." + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-source-menu.png", + "alt": "Menu de choix de la description d’une image absente du catalogue", + "caption": "Les façons de décrire une image absente du catalogue." + } + } + ] + }, + { + "id": "reference-only", + "title": "Ce que fournit la seule référence de l’image", + "intro": "L’image contient les métadonnées de son processus, mais pas tout l’environnement habituellement ajouté par un fichier Compose.", + "blocks": [ + { + "table": { + "headers": [ + "Lu depuis l’image", + "Absent de l’image", + "Conséquence" + ], + "rows": [ + [ + "Entrypoint, Cmd, User, WorkingDir et l’environnement intégré", + "Variables présentes uniquement dans la documentation", + "Ajoutées pendant l’installation ou avec Modifier" + ], + [ + "Volumes déclarés par l’image", + "Répertoires de l’hôte indiqués uniquement dans le fichier Compose", + "Les chemins supplémentaires sont ajoutés avant l’installation" + ], + [ + "Ports EXPOSE", + "L’URL, le protocole ou le contrôle de bon fonctionnement", + "Le port et la méthode de vérification du service sont confirmés" + ], + [ + "Architectures et digest dans le registre", + "Périphériques, privilèges ou dépendances externes", + "Ils ne sont pas activés sans une définition qui les demande" + ] + ] + } + } + ] + }, + { + "id": "review", + "title": "Vérifier avant l’installation", + "intro": "Après adaptation de la définition, ProxMenux présente ce qu’il en a compris avant de demander le VMID, les ressources ou le stockage.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Analyser", + "body": "Les services, l’image, les ports, les chemins, l’environnement, les périphériques, la sécurité et le contrôle de bon fonctionnement sont lus." + }, + { + "title": "Interroger le registre", + "body": "L’image doit exister dans le registre et les architectures publiées sont affichées. Un registre privé est consulté avec le compte enregistré pour celui-ci." + }, + { + "title": "Lister les options non appliquées", + "body": "Les labels, réseaux Docker, paramètres Swarm et autres clés sans effet sur un LXC sont répertoriés." + }, + { + "title": "Bloquer les options sans équivalent sûr", + "body": "Les clés sans équivalent sûr apparaissent sous Options sans équivalent et empêchent la poursuite de l’installation. Aucune n’est ignorée silencieusement." + }, + { + "title": "Demander les secrets", + "body": "Les variables dont le nom évoque un mot de passe, un jeton ou une clé sont demandées comme données sensibles pendant l’installation." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-review.png", + "alt": "Récapitulatif de l’interprétation du fichier Compose par ProxMenux", + "caption": "Récapitulatif affiché avant la demande du VMID et des ressources." + } + }, + { + "p": "Après validation du récapitulatif, le parcours est celui du catalogue : nom, mode par défaut ou avancé, VMID, CPU, mémoire, réseau, démarrage avec le nœud, chemins persistants et supplémentaires, périphériques compatibles et récapitulatif final." + } + ] + }, + { + "id": "examples", + "title": "Exemples de saisie", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Compose", + "code": "services:\n app:\n image: ghcr.io/example/app:latest\n ports:\n - \"8080:8080\"\n volumes:\n - ./config:/config\n - /srv/media:/media\n environment:\n TZ: Europe/Madrid" + }, + { + "title": "docker run", + "code": "docker run -d \\\n --name app \\\n -p 8080:8080 \\\n -e TZ=Europe/Madrid \\\n -v app-config:/config \\\n -v /srv/media:/media \\\n ghcr.io/example/app:latest" + } + ] + } + } + ] + }, + { + "id": "oci-compose", + "title": "Un oci-compose rédigé à la main", + "intro": "Un oci-compose est le fichier JSON à partir duquel une application est installée. Le catalogue en conserve un par application. Le même format peut être rédigé à la main et installé avec cette option.", + "blocks": [ + { + "p": "Dans un fichier rédigé à la main, l’auteur définit l’image, les ports, les variables, les volumes et les questions de l’installation. ProxMenux complète le reste à la lecture. Le format permet d’exprimer ce que Compose ne prévoit pas : texte d’une question, mot de passe généré à l’installation, profil GPU, propriétaire de chaque volume, contrôle du premier démarrage ou identifiants affichés à la fin." + }, + { + "steps": { + "items": [ + { + "title": "Vérifier", + "body": "Un fichier contenant des erreurs n’est pas installé. Chaque erreur indique le champ concerné ; un JSON invalide signale la ligne et la colonne." + }, + { + "title": "Examiner", + "body": "Un fichier valide affiche ce qu’il installe : image, adresse web, ports, chemins persistants, variables demandées et fichiers écrits pendant l’installation." + }, + { + "title": "Installer", + "body": "L’installation suit le même parcours que pour toute application du catalogue, avec les paramètres par défaut ou avancés." + } + ] + } + }, + { + "calloutWarning": { + "title": "Un fichier qui détermine les privilèges", + "body": "Un oci-compose détermine ce qui est monté dans le conteneur et avec quels privilèges. La vérification le précise avant l’installation : n’installez que des fichiers de sources fiables." + } + }, + { + "p": "Le README du moteur OCI décrit le format bloc par bloc avec deux exemples complets. Un enregistrement d’installation peut aussi être lu de cette façon : seul le modèle d’origine est utilisé, sans aucune des réponses de cette installation." + } + ] + }, + { + "id": "private-registries", + "title": "Images de registres privés", + "intro": "Une image d’un registre privé, comme un paquet privé GitHub ou un dépôt privé Docker Hub, est lue avec un compte enregistré dans ProxMenux.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Le registre refuse l’accès à l’image", + "body": "Si le registre indique que l’image nécessite un compte, la vérification propose de s’y connecter, puis lit à nouveau l’image." + }, + { + "title": "Se connecter", + "body": "Un nom d’utilisateur et un mot de passe ou jeton autorisé à télécharger l’image. Le registre les vérifie ; ils ne sont enregistrés que s’il les accepte." + }, + { + "title": "Installer et maintenir à jour", + "body": "Ce compte sert au téléchargement pendant l’installation, ainsi qu’aux mises à jour, à Modifier, à Recréer, au watchdog et à la recherche de mises à jour du Monitor, sur chaque nœud du cluster." + } + ] + } + }, + { + "p": "Comptes de registres, dans le menu principal d’OCI manager Apps, affiche les comptes enregistrés par registre et utilisateur, jamais leurs secrets. Chaque compte permet de vérifier, télécharger ou installer une image, ainsi que de mettre à jour ou supprimer les identifiants." + }, + { + "list": { + "items": [ + "GitHub (ghcr.io) : l’utilisateur est le compte GitHub et le mot de passe un jeton d’accès personnel avec l’autorisation read:packages.", + "Docker Hub (docker.io) : l’utilisateur est le compte Docker Hub et le mot de passe un jeton d’accès avec autorisation de lecture.", + "Autres registres, y compris avec un port propre comme registry.example.com:5000 : l’utilisateur et le mot de passe ou jeton fournis par ce registre." + ] + } + }, + { + "calloutInfo": { + "title": "Où les comptes sont conservés", + "body": "Dans /etc/pve/priv/proxmenux/registry-auth.json, lisible uniquement par root, dans le même dossier que les mots de passe de stockage de Proxmox. /etc/pve est partagé entre tous les nœuds du cluster : un compte ajouté sur un nœud est donc utilisé partout. La sauvegarde de l’hôte inclut ce fichier et la désinstallation de ProxMenux le supprime de tous les nœuds." + } + } + ] + }, + { + "id": "limits", + "title": "Définitions qui ne sont pas installées", + "blocks": [ + { + "list": { + "items": [ + "Un Dockerfile sans image publiée : l’image doit d’abord être construite et publiée dans un registre OCI.", + "Un fichier Compose à plusieurs services : cette option installe un seul service par conteneur, même si plusieurs services utilisent la même image.", + "configs, secrets externes ou formats de périphériques impossibles à adapter sans ambiguïté.", + "Substitutions shell comme $(command) : il faut saisir directement la valeur résultante.", + "Options docker run non reconnues et --env-file : utilisez plutôt un fichier Compose aux valeurs explicites." + ] + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/oci-manager/hardware.json b/web/messages/fr/docs/oci-manager/hardware.json new file mode 100644 index 00000000..e1bf73c0 --- /dev/null +++ b/web/messages/fr/docs/oci-manager/hardware.json @@ -0,0 +1,392 @@ +{ + "meta": { + "title": "Dispositifs et accélération ProxMenux", + "description": "Comment OCI manager Apps rend les GPU, NVIDIA, Coral, USB, FUSE et autres périphériques accessibles à un conteneur OCI sous forme de ressources natives Proxmox VE validées." + }, + "header": { + "title": "Dispositifs et accélération", + "description": "GPU, NVIDIA, Coral, USB, FUSE et les dispositifs de blocs deviennent des ressources natives validées Proxmox VE du conteneur.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "principle", + "title": "L'appareil dont l'application a besoin, pas l'hôte entier", + "blocks": [ + { + "p": "Un appareil demandé par le fichier Compose ou par le profil d'application devient une entrée concrète devN ou un montage LXC. Demander un GPU, un périphérique USB ou un Coral ne rend pas le conteneur privilégié." + }, + { + "flow": { + "nodes": [ + { + "label": "Inventaire des hôtes", + "detail": "/dev/dri/renderD128\nGID 993 · Intel" + }, + { + "label": "ProxMenux", + "detail": "fournisseur et\npermissions vérifiées" + }, + { + "label": "LXC", + "detail": "même périphérique\nGID effectif" + } + ] + } + } + ] + }, + { + "id": "origin", + "title": "D'où vient la demande de l'appareil", + "blocks": [ + { + "table": { + "headers": [ + "Source", + "Ce qui est lu", + "Ce que fait l'installateur" + ], + "rows": [ + [ + "Docker Compose", + "Demandes devices, group_add, deploy.resources et NVIDIA", + "Chaque exigence devient une demande d'appareil présentée pour examen" + ], + [ + "Profil du catalogue", + "La prise en charge réelle des GPU, de Coral, d’OpenCL, d’USB ou de FUSE par l’application", + "Seules les options validées pour cette image sont proposées" + ], + [ + "métadonnées d'images et documentation", + "VA-API, Selkies, LinuxServer mods ou le NVIDIA runtime", + "Les variables documentées et la préparation sont ajoutées" + ], + [ + "Sélection de l'utilisateur", + "CPU uniquement, Intel/AMD, OpenCL, NVIDIA ou un appareil optionnel", + "La sélection est stockée dans le contrat d'instance" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Les périphériques détectés ne sont pas ajoutés automatiquement", + "body": "L'hôte est inventorié, mais seuls les appareils déclarés par le fichier Compose ou par un profil compatible sont proposés et attachés. Un GPU, un dongle USB ou un Coral présent sur l'hôte n'est pas exposé à tous les LXC." + } + } + ] + }, + { + "id": "identify", + "title": "Comment le périphérique hôte est identifié", + "intro": "Avant que le LXC ne soit modifié, l'appareil est lu sur l'hôte et correspond au profil choisi.", + "blocks": [ + { + "table": { + "headers": [ + "Type", + "Identité", + "Validation" + ], + "rows": [ + [ + "Intel/AMD DRM", + "/dev/dri/renderD* et /sys/class/drm/NODE/device/vendor", + "Dispositif de caractères avec fournisseur 0x8086 (Intel) ou 0x1002 (AMD)" + ], + [ + "AMD OpenCL", + "Le nœud de rendu, plus /dev/kfd lorsque le profil en a besoin", + "Existence, type, fournisseur, autorisations et compatibilité déclarée" + ], + [ + "AMD ROCm", + "Le nœud de rendu, /dev/kfd et la génération indiquée par le pilote de calcul dans /sys/class/kfd/kfd/topology/nodes/*/properties", + "Une génération pour laquelle l’image ROCm de l’application contient des noyaux de calcul — les GPU RDNA2 cités et les plus récents — est proposée telle quelle. Les autres GPU de ces familles, comme les Radeon 680M et 780M, sont proposés à titre expérimental et jamais présélectionnés : ROCm ne les prend pas officiellement en charge, l’application les présente comme la génération de leur famille (HSA_OVERRIDE_GFX_VERSION) et l’installateur demande confirmation avant de télécharger l’image plus volumineuse. Une GPU plus ancienne, telle que la partie graphique intégrée d’un Ryzen 5000U, n’est pas proposée et Immich conserve la reconnaissance sur le CPU." + ], + [ + "NVIDIA", + "nvidia-smi et nvidia-container-cli", + "GPU, UUID, PCI bus, version pilote, Toolkit, /dev/nvidia* nœuds, binaires et bibliothèques" + ], + [ + "Coral PCIe/M.2", + "/dev/apex_N et son lien dans /sys/dev/char/MAJOR:MINOR", + "Nœud de caractère, majeur/mineur, propriétaire, GID et permissions" + ], + [ + "USB et série", + "/dev/ttyUSB*, /dev/ttyACM* ou /dev/bus/usb/BBB/DDD", + "Nœud de caractère; pour USB aussi fournisseur, produit et série lorsque sysfs les publie" + ], + [ + "KVM, TUN, FUSE, vidéo et SCSI générique", + "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN ou /dev/sgN", + "Chemin pris en charge, type de nœud et permissions effectives" + ], + [ + "Lecteur optique", + "/dev/srN", + "Un périphérique bloc" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Ce qui se passe pendant l'installation", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Le modèle offre ses profils", + "body": "Par exemple CPU seulement, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL ou NVIDIA. Les options appartiennent à l'image, pas à un menu commun." + }, + { + "title": "Un profil est choisi", + "body": "Il définit les nœuds de périphérique, l'environnement, les mods ou l'exécution dont l'application a besoin." + }, + { + "title": "Un chemin est proposé", + "body": "Pour DRM, /dev/dri/renderD128, qui peut être modifié sur un hôte avec plusieurs nœuds de rendu. Pour USB ou série, le nœud précis est sélectionné." + }, + { + "title": "Validation", + "body": "L'existence, le type, le fournisseur autorisé, les autorisations et le GID sont vérifiés. Une inadéquation arrête l'opération." + }, + { + "title": "Le contrat est écrit", + "body": "Chemin, mode, GID, accès à l'écriture et profil sont enregistrés pour les mises à jour et les recréations de conteneurs." + }, + { + "title": "Ajout et vérification", + "body": "pct set ajoute l'entrée devN et l'accès est ensuite vérifié à l'intérieur du LXC. Les images LinuxServer sont également vérifiées en tant qu'utilisateur abc." + } + ] + } + } + ] + }, + { + "id": "config", + "title": "Comment il apparaît dans la configuration LXC", + "intro": "Valeurs indicatives : dev0 et dev1 sont les emplacements libres attribués par Proxmox VE ; renderD128, apex_0 et le GID dépendent du matériel du nœud.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Intel/AMD VA-API", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" + }, + { + "title": "Coral PCIe/M.2", + "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "Un périphérique USB spécifique", + "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "AMD OpenCL", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" + } + ] + } + }, + { + "p": "Le GID est lu avec stat sur l'hôte et écrit à l'entrée devN; les groupes render et video ne sont pas supposés avoir un nombre fixe. L'appareil conserve le même chemin /dev à l'intérieur du LXC, où les propres mécanismes de l'application le recherchent." + } + ] + }, + { + "id": "profiles", + "title": "Profils qu'une image peut offrir", + "blocks": [ + { + "table": { + "headers": [ + "Profil", + "Configuration résultante", + "Proposé quand" + ], + "rows": [ + [ + "Intel/AMD VA-API", + "Le noeud de rendu /dev/dri", + "L'application prend en charge l'accélération vidéo" + ], + [ + "OpenCL", + "Noeud Render, /dev/kfd au besoin et le mod officiel", + "L'image ou le profil le documente" + ], + [ + "NVIDIA", + "Dispositifs pilotes et bibliothèques de l'hôte", + "L’hôte dispose d’un pilote fonctionnel et de NVIDIA Container Toolkit" + ], + [ + "Coral", + "/dev/apex_0 ou le bus USB", + "Le profil déclare la prise en charge de Coral (Frigate)" + ], + [ + "USB, série, FUSE", + "Un seul appareil, un arbre validé ou une fonction LXC", + "Le contrat le demande" + ] + ] + } + } + ] + }, + { + "id": "nvidia", + "title": "NVIDIA", + "blocks": [ + { + "calloutWarning": { + "title": "Prérequis sur le nœud : NVIDIA Container Toolkit", + "body": "Un pilote fonctionnel sur Proxmox VE ne suffit pas à donner une GPU NVIDIA à une image OCI. OCI Manager Apps utilise nvidia-container-cli, de NVIDIA Container Toolkit, pour identifier les appareils et obtenir les binaires et les bibliothèques qui correspondent au pilote chargé." + } + }, + { + "p": "Le installateur NVIDIA de ProxMenux installe NVIDIA Container Toolkit du dépôt officiel NVIDIA avec le pilote. Il vérifie ses quatre paquets, valide nvidia-container-cli et enregistre le résultat dans le journal de changement de Audit & Report." + }, + { + "p": "Ces deux commandes sur l'hôte montrent si le pilote et le Toolkit sont disponibles :" + }, + { + "shell": { + "code": "nvidia-smi -L\nnvidia-container-cli --version" + } + }, + { + "p": "Sur un hôte où le pilote a été installé par d'autres moyens, le Toolkit est installé à partir du dépôt stable officiel:" + }, + { + "shell": { + "code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools" + } + }, + { + "p": "L’inventaire utilisé par OCI manager Apps provient de la sortie de :" + }, + { + "shell": { + "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" + } + }, + { + "calloutInfo": { + "title": "La configuration d'exécution Docker n'est pas impliquée", + "body": "Les conteneurs sont des LXC natifs sans démon Docker : nvidia-ctk runtime configure --runtime=docker ne joue donc aucun rôle. ProxMenux interroge directement nvidia-container-cli et écrit les périphériques et montages LXC. Les commandes et plateformes prises en charge sont maintenues dans le guide d’installation de NVIDIA Container Toolkit." + } + }, + { + "cards": { + "items": [ + { + "icon": "cpu", + "title": "Inventaire issu du pilote", + "body": "nvidia-container-cli énumère les nœuds de périphérique, les binaires, les micrologiciels et les bibliothèques du pilote installé." + }, + { + "icon": "refresh", + "title": "Pas de version fixe", + "body": "Le modèle ne nomme pas les fichiers de bibliothèque. Le profil est généré à partir de l'hôte actuel." + }, + { + "icon": "shield", + "title": "Montages en lecture seule", + "body": "Les bibliothèques hôtes sont montées en lecture seule au lieu d'être copiées dans le conteneur." + }, + { + "icon": "hardDrive", + "title": "Changements de pilote", + "body": "Après un changement de pilote, l'inventaire est généré à nouveau avant le démarrage des LXC touchés." + } + ] + } + }, + { + "code": { + "title": "Résultat NVIDIA (simplifié)", + "code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0" + } + }, + { + "p": "Passer uniquement /dev/nvidia0 ne suffit pas. Les composants espace utilisateur du pilote chargé sont montés en lecture seule, et nvidia-smi fonctionne ensuite à l'intérieur du LXC pour comparer GPU, UUID, PCI bus et version avec l'inventaire hôte." + } + ] + }, + { + "id": "usb", + "title": "Coral USB, série et USB", + "blocks": [ + { + "calloutWarning": { + "title": "La numérotation USB peut changer", + "body": "Un chemin tel que /dev/bus/usb/003/004 peut changer lorsque le périphérique est reconnecté ou que l'hôte redémarre. Le profil enregistre le fournisseur, le produit et la série lorsqu'ils sont disponibles, mais une nouvelle adresse de bus n'est pas automatiquement réaffectée." + } + }, + { + "p": "Un périphérique est donné par son nœud concret : /dev/ttyUSB0, /dev/ttyACM0, /dev/apex_0 ou /dev/bus/usb/BBB/DDD. Passer l'intégralité de /dev n'est pas accepté. Coral est proposé uniquement aux applications dont le profil le déclare." + } + ] + }, + { + "id": "trees", + "title": "Arbres de périphériques et fonctionnalités LXC", + "blocks": [ + { + "table": { + "headers": [ + "Demande", + "Configuration résultante", + "Portée" + ], + "rows": [ + [ + "/dev/dvb, /dev/snd ou /dev/bus/usb", + "Chaque noeud de caractère de l'arbre obtient sa propre entrée devN avec le mode hôte et GID", + "Seulement l'arbre demandé, pas le reste de /dev" + ], + [ + "/dev/fuse", + "Le nœud et, lorsque le profil en a besoin, la fonction fuse=1", + "FUSE seul ne publie pas de montages sur d'autres LXC" + ], + [ + "/dev/net/tun", + "Une entrée devN sur le même chemin à l'intérieur du LXC", + "La configuration VPN ou réseau reste dans l'application" + ], + [ + "/dev/kvm", + "Une entrée devN validée", + "Offert seulement lorsque le contrat le demande" + ] + ] + } + } + ] + }, + { + "id": "security", + "title": "Confirmations par niveau de risque", + "blocks": [ + { + "p": "Les périphériques concrets, les privilèges facultatifs, les privilèges requis, la relaxation AppArmor ou seccomp et l'accès à l'espace de noms PID hôte sont traités comme des cas distincts, et non sous une seule étiquette privilégiée générique. Chaque option présentant un risque est expliquée et confirmée lors de l'installation." + } + ] + } + ] +} diff --git a/web/messages/fr/docs/oci-manager/index.json b/web/messages/fr/docs/oci-manager/index.json new file mode 100644 index 00000000..9a82d408 --- /dev/null +++ b/web/messages/fr/docs/oci-manager/index.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "OCI manager Apps | ProxMenux", + "description": "Exécutez des images OCI officielles dans des conteneurs LXC natifs de Proxmox VE, avec des données persistantes, l’accès aux périphériques, des applications à plusieurs conteneurs et des mises à jour transactionnelles." + }, + "header": { + "title": "OCI manager Apps", + "description": "Les images OCI officielles s’exécutent dans des conteneurs LXC natifs de Proxmox VE. L’image reste celle publiée par son mainteneur ; ProxMenux reproduit l’environnement que Docker Compose aurait créé autour d’elle.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "model", + "blocks": [ + { + "calloutInfo": { + "title": "Une image OCI, un LXC natif", + "body": "Aucun moteur Docker ne s’exécute dans les conteneurs. Proxmox VE importe le système de fichiers de l’image et ses métadonnées OCI. L’application devient le processus principal d’un LXC natif, administré avec les mêmes outils que les autres conteneurs du nœud." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Source", + "detail": "Image OCI\nCompose et documentation" + }, + { + "label": "ProxMenux", + "detail": "Contrat JSON\nvalidation et planification" + }, + { + "label": "Proxmox VE", + "detail": "LXC natif\nvolumes et périphériques" + } + ], + "caption": "L’application d’origine est conservée : son environnement est décrit de façon déclarative, puis reproduit." + } + } + ] + }, + { + "id": "where", + "title": "Où le trouver", + "intro": "Sur le nœud Proxmox, en tant que root, ouvrez OCI manager Apps (Technology Preview) dans le menu principal de ProxMenux. Le premier écran propose :", + "blocks": [ + { + "list": { + "items": [ + "Rechercher des applications : rechercher par nom dans tout le catalogue.", + "Toutes les applications : afficher le catalogue complet et le nombre d’applications.", + "Gérer les applications OCI installées : mettre à jour, modifier, supprimer ou récupérer les applications déjà installées.", + "Comptes de registres : gérer les comptes utilisés pour installer et mettre à jour des images provenant de registres privés.", + "Installer une image absente du catalogue : adapter un fichier Compose, une commande docker run ou une référence d’image.", + "Les catégories du catalogue, chacune avec son nombre d’applications." + ] + } + }, + { + "figure": { + "src": "/oci-manager/main-menu.png", + "alt": "Écran principal d’OCI manager Apps avec recherche, catalogue complet, gestion des applications, images hors catalogue et catégories.", + "caption": "Écran principal d’OCI manager Apps." + } + }, + { + "p": "La sélection d’une application affiche sa description, l’image utilisée et deux modes d’installation. Installer avec les paramètres par défaut ne application que les choix essentiels : stockage, emplacement des données, adresse et démarrage. Installer avec les paramètres avancés présente toutes les décisions dans l’ordre : VMID et ressources, stockage de chaque chemin, pont réseau et périphériques." + }, + { + "p": "Les applications effectivement testées affichent Vérifié dans cette vue et portent un ✓ dans les listes, que le test ait été effectué dans le laboratoire ProxMenux ou par la communauté." + } + ] + }, + { + "id": "beta", + "title": "Pourquoi le label Technology Preview est conservé", + "blocks": [ + { + "p": "OCI manager Apps conserve le label Technology Preview que Proxmox VE attribue aux conteneurs d’applications créés à partir d’images OCI, dont la prise en charge a été introduite dans Proxmox VE 9.1. Ce label concerne la technologie sur laquelle repose OCI manager Apps, et non le moteur de ProxMenux : le comportement de ces conteneurs peut encore changer entre les versions de Proxmox VE. Le label restera en place jusqu’à ce que Proxmox VE considère cette prise en charge comme stable." + }, + { + "p": "Le moteur d’OCI manager Apps est testé dans le laboratoire ProxMenux : installation, mise à jour, modification, recréation, sauvegarde, restauration, migration et watchdog. Chaque application est vérifiée séparément. Celles qui ont été effectivement testées affichent Vérifié et portent un ✓ dans les listes." + } + ] + }, + { + "id": "translation", + "title": "Comment Docker décrit les besoins et comment OCI manager Apps les applique", + "blocks": [ + { + "table": { + "headers": [ + "Besoin", + "Expression dans Docker", + "Mise en œuvre par OCI manager Apps" + ], + "rows": [ + [ + "Exécuter l’application", + "image, entrypoint, command", + "Le rootfs OCI et le processus principal du LXC" + ], + [ + "Conserver la configuration", + "volumes: /config", + "Un volume persistant mpN inclus dans la sauvegarde, ou un répertoire de l’hôte." + ], + [ + "Rendre le service accessible", + "ports", + "Une adresse propre au LXC et l’URL d’accès au service." + ], + [ + "Utiliser du matériel", + "devices, group_add", + "Des entrées devN avec le GID effectif de l’hôte et un profil validé." + ], + [ + "Relier les dépendances", + "networks, depends_on", + "Un pont réseau privé, des adresses fixes, un ordre de démarrage et des contrôles de bon fonctionnement." + ], + [ + "Mettre à jour", + "Télécharger avec pull et recréer", + "Un nouveau rootfs avec le même contrat de persistance." + ] + ] + } + } + ] + }, + { + "id": "kept", + "title": "Ce qui est conservé et ce qui change", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Conservé", + "body": "L’image officielle, ses chemins internes, son environnement, son processus de démarrage et sa documentation d’utilisation." + }, + { + "icon": "boxes", + "title": "Adapté", + "body": "L’environnement d’exécution : le réseau, la persistance, les périphériques, les permissions et les dépendances utilisent les mécanismes LXC natifs de Proxmox VE." + }, + { + "icon": "shield", + "title": "Sans équivalent", + "body": "Une option Compose sans équivalent sûr est signalée comme un point bloquant. Les modèles comportant des points bloquants ne sont pas proposés à l’installation, et les options sensibles doivent être confirmées pendant l’assistant." + }, + { + "icon": "refresh", + "title": "Enregistré", + "body": "Le digest de l’image, les ressources, les chemins, le réseau, les périphériques et l’appartenance à une pile sont enregistrés dans le contrat de l’instance. Les mises à jour et les recréations reproduisent ce contrat." + } + ] + } + } + ] + }, + { + "id": "pages", + "title": "Pages de cette section", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Comment une image OCI est adaptée", + "href": "/docs/oci-manager/architecture", + "tail": "De l’image et de son fichier Compose à un LXC natif." + }, + { + "label": "Installer une image absente du catalogue", + "href": "/docs/oci-manager/custom-image", + "tail": "Un fichier Compose, une commande docker run ou une référence d’image." + }, + { + "label": "Données, chemins et réseau", + "href": "/docs/oci-manager/storage-network", + "tail": "Volumes du conteneur, répertoires de l’hôte, montages rclone et adresses." + }, + { + "label": "Périphériques et accélération", + "href": "/docs/oci-manager/hardware", + "tail": "GPU, NVIDIA, Coral, USB et autres périphériques." + }, + { + "label": "Applications à plusieurs conteneurs", + "href": "/docs/oci-manager/stacks", + "tail": "Application, base de données et cache dans des LXC coordonnés." + }, + { + "label": "Installer, mettre à jour et modifier", + "href": "/docs/oci-manager/lifecycle", + "tail": "Le contrat de l’instance et ses opérations." + }, + { + "label": "Dans ProxMenux Monitor", + "href": "/docs/oci-manager/monitor", + "tail": "Versions, mises à jour, sortie console et terminal." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/oci-manager/lifecycle.json b/web/messages/fr/docs/oci-manager/lifecycle.json new file mode 100644 index 00000000..5030ebcc --- /dev/null +++ b/web/messages/fr/docs/oci-manager/lifecycle.json @@ -0,0 +1,499 @@ +{ + "meta": { + "title": "Installer, mettre à jour et modifier | ProxMenux", + "description": "Le contrat d'instance d'un conteneur OCI et les opérations qui s'appuient dessus : mise à jour, modification, suppression, reprise d'une opération interrompue et remise en service après une restauration sur cet hôte ou un autre." + }, + "header": { + "title": "Installer, mettre à jour et modifier", + "description": "Chaque instance conserve un contrat reproductible, ce qui permet de remplacer son rootfs sans perdre sa configuration ni ses données persistantes.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "contract", + "title": "Le contrat d'instance", + "blocks": [ + { + "p": "Après l'installation, la configuration effective est enregistrée dans /usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json. Il ne s'agit pas d'une copie du fichier Compose d'origine : c'est le contrat reproductible du LXC présent sur cet hôte." + }, + { + "code": { + "code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle" + } + }, + { + "p": "Une copie du contrat est conservée dans le conteneur, dans /.proxmenux/oci-record.json, et seul l'utilisateur root du conteneur peut la lire. Une sauvegarde du conteneur emporte donc toujours le contrat en vigueur au moment de la sauvegarde. Une seconde copie est conservée dans /etc/pve/priv/proxmenux/oci, un emplacement partagé par tous les nœuds du cluster et lisible uniquement par root sur l'hôte. Les deux copies sont écrites après chaque installation, mise à jour et modification." + } + ] + }, + { + "id": "manage", + "title": "Gérer les applications OCI installées", + "intro": "Cette option de l'écran principal liste les instances enregistrées avec leur application et image. Chacun d'eux est vérifié par rapport à son contrat avant toute action; un CT qui ne correspond plus à son enregistrement n'est ni modifié ni supprimé. La même mise à jour et le même éditeur sont proposés dans l'onglet Mises à jour de ProxMenux Monitor.", + "blocks": [ + { + "table": { + "headers": [ + "Option", + "Ce qui change", + "Ce qui est gardé" + ], + "rows": [ + [ + "Mettre à jour l'image avec la configuration enregistrée", + "Le rootfs est remplacé par l'image actuellement publiée sur le canal enregistré", + "Contrat, disques de conteneur, répertoires hôtes, réseau et appareils" + ], + [ + "Modifier : éditer les ressources, le réseau, les chemins et le GPU", + "L'éditeur s'ouvre avec le contrat actuel; le CT est reconstruit avec les modifications", + "Les données des disques de conteneur et des répertoires hôtes" + ], + [ + "Watchdog : redémarrer l'application lorsqu'elle plante", + "Détermine si l'application est relancée lorsqu'elle s'arrête d'elle-même. Rien n'est reconstruit", + "L'ensemble de l'installation ; seul le choix est sauvegardé dans le contrat" + ], + [ + "Supprimer: supprimer l'application et ses conteneurs", + "Le LXC, ou chaque membre d'une pile, et leurs contrats sont supprimés", + "Répertoires hôtes, avec leur contenu" + ] + ] + } + }, + { + "p": "Pour une application à plusieurs conteneurs, le menu propose Mettre à jour tous les conteneurs de l'application, Modifier les chemins et périphériques supplémentaires, Recréer tous les conteneurs avec leur configuration enregistrée, le watchdog et la suppression. Modifier ajoute ou supprime les chemins et périphériques supplémentaires du conteneur applicatif sans rien reconstruire et, pour Immich, change le composant qui exécute la reconnaissance. Recréer reconstruit chaque conteneur à partir de l'image utilisée lors de son installation, sans en chercher une plus récente." + }, + { + "figure": { + "src": "/oci-manager/manage-menu.png", + "alt": "Liste des applications OCI installées, avec les options de mise à jour, de modification et de suppression", + "caption": "Gérer les applications OCI installées." + } + } + ] + }, + { + "id": "update", + "title": "Une mise à jour transactionnelle", + "blocks": [ + { + "mermaid": { + "chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end", + "labels": { + "user": "Utilisateur", + "registry": "Registre OCI", + "update": "Mettre à jour l'instance", + "resolve": "Résoudre la balise", + "verify": "Vérifier l’archive et effectuer les contrôles préalables", + "backup": "Arrêter et sauvegarder le CT", + "import": "Importer le nouveau rootfs", + "reapply": "Appliquer à nouveau le contrat", + "healthy": "sain", + "failure": "défaillance", + "commit": "Contrat publié avec le nouveau digest", + "restored": "instance précédente restaurée" + } + } + }, + { + "list": { + "items": [ + "Lorsque le registre sert encore le digest installé, rien n'est téléchargé et l'instance n'est pas touchée.", + "La nouvelle image est vérifiée couche par couche avant l'arrêt du CT. Un téléchargement qui arrive endommagé est récupéré une deuxième fois ; une image déjà mise en cache qui échoue la vérification est à nouveau téléchargée.", + "Les paramètres modifiés dans Proxmox VE après l'installation (mémoire, swap, cœurs, limite et priorité du CPU, démarrage avec le nœud) sont conservés et intégrés au nouveau contrat.", + "L'interface LAN ajoutée par la suite Arr et les applications à plusieurs conteneurs (net1), ainsi que l'ordre de démarrage (startup), sont réappliqués tels quels au nouveau conteneur.", + "Toute autre différence entre le CT et son contrat arrête la mise à jour avant que le CT ne soit arrêté." + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Avant", + "detail": "rootfs A\n/config mp0\n/media répertoire de l’hôte" + }, + { + "label": "Mise à jour", + "detail": "remplace uniquement\nle rootfs" + }, + { + "label": "Après", + "detail": "rootfs B\n/config mp0\n/media répertoire de l’hôte" + } + ] + } + }, + { + "p": "Avant tout arrêt, l'opération vérifie l'espace nécessaire à la sauvegarde : les données utilisées sur les volumes inclus, plus une marge. La sauvegarde est écrite à côté de l'enregistrement de l'application, sur le disque système de l'hôte. Si l'espace y est insuffisant, le menu demande un autre stockage de l'hôte acceptant les sauvegardes. La sauvegarde y est créée puis supprimée à la fin de l'opération. Ce choix est mémorisé pour l'application, y compris pour les mises à jour planifiées. Si aucun stockage n'a assez de place, l'opération est refusée et l'application reste inchangée. L'espace nécessaire à la nouvelle image est également vérifié avant son téléchargement." + } + ] + }, + { + "id": "recovery", + "title": "Récupération d'une opération interrompue", + "intro": "Une mise à jour et un changement utilisent une transaction persistante. Si le processus, le terminal ou le nœud est interrompu après l'arrêt du CT, l'opération n'est pas prise comme terminée.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Marqueur en attente", + "body": "À l'ouverture de Gérer les applications OCI installées, l'état enregistré indique que le remplacement n'a jamais été publié." + }, + { + "title": "Afficher l’état", + "body": "Affiche la phase qui a été atteinte sans changer de conteneur ou de données." + }, + { + "title": "Récupérer l'installation précédente", + "body": "Restaure la sauvegarde native vérifiée réalisée avant le remplacement, ainsi que le contrat précédent." + }, + { + "title": "Piles traitées comme une unité", + "body": "Pour une application multi-conteneurs, chaque membre est récupéré du même point de transaction, pas seulement celui sélectionné." + } + ] + } + }, + { + "calloutWarning": { + "title": "Les répertoires de l’hôte sont exclus du retour arrière", + "body": "La sauvegarde couvre le rootfs et les disques du conteneur qui y sont inclus. Un répertoire de l’hôte n’est pas rétabli à son état précédent, car d’autres LXC peuvent utiliser ses données." + } + } + ] + }, + { + "id": "watchdog", + "title": "Watchdog: redémarrer une application qui s'arrête", + "intro": "Proxmox n'a pas de politique de redémarrage : quand le processus d'un conteneur applicatif se termine, le conteneur reste arrêté. Si le watchdog est activé, une application qui s'arrête d'elle-même est relancée. Il joue pour une application OCI le rôle de restart: unless-stopped dans un fichier Compose.", + "blocks": [ + { + "table": { + "headers": [ + "Ce qui se passe", + "Avec le watchdog activé" + ], + "rows": [ + [ + "L’application plante ou son processus se termine", + "Le conteneur est relancé en quelques secondes" + ], + [ + "Il est arrêté ou éteint depuis Proxmox, depuis le Monitor ou avec pct", + "Il reste arrêté jusqu’à ce que quelqu’un le démarre" + ], + [ + "Une sauvegarde, une migration ou une opération ProxMenux travaille dessus", + "Rien n'est fait jusqu'à la fin" + ], + [ + "Il était déjà arrêté au démarrage de l’hôte", + "Il reste arrêté ; cela dépend de Démarrer avec Proxmox" + ], + [ + "Il s’arrête systématiquement juste après son démarrage", + "Pour une application qui s’arrête quelques secondes après son démarrage ou qui ne démarre pas, cinq tentatives sont effectuées, séparées par des délais de 30 secondes, 1, 2 et 5 minutes. Elle reste ensuite arrêtée et une notification est envoyée" + ] + ] + } + }, + { + "p": "L'installateur pose la question dans les deux modes d'installation et propose la valeur déclarée par la recette de l'application. Ce réglage peut ensuite être modifié dans Gérer les applications OCI installées ou avec le commutateur Watchdog du conteneur dans ProxMenux Monitor. Il s'applique à tous les conteneurs d'une application à plusieurs conteneurs. Un seul service de l'hôte, proxmenux-oci-watchdog.service, surveille les applications pour lesquelles il est activé ; son installation figure dans l'onglet Modifications d'Audit & Report." + }, + { + "calloutInfo": { + "title": "Ce que l'hôte ne peut pas dire", + "body": "Le code de sortie de l'application ne parvient pas à l'hôte. Un arrêt normal et un plantage sont donc indiscernables et entraînent tous deux un redémarrage, comme avec always et unless-stopped dans Docker. Un arrêt demandé en dehors de Proxmox, avec lxc-stop ou systemctl, ne laisse aucune tâche d'arrêt et est interprété comme un arrêt spontané." + } + } + ] + }, + { + "id": "restore", + "title": "Sauvegarde, restauration et un autre hôte", + "intro": "Une sauvegarde réalisée avec vzdump ou Proxmox Backup Server contient le conteneur, les disques du conteneur sélectionnés pour la sauvegarde et la copie de son contrat. Les éléments conservés par l'installation sur l'hôte n'en font pas partie. Gérer les applications OCI installées détecte les conteneurs restaurés sur un hôte dépourvu de leur contrat, après une nouvelle installation de Proxmox ou sur un autre hôte, et propose de les enregistrer à nouveau.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Restaurer les conteneurs dans Proxmox", + "body": "Depuis le stockage de sauvegarde, avec l’ID d’origine ou tout autre ID libre. Une application à plusieurs conteneurs nécessite tous ses conteneurs." + }, + { + "title": "Ouvrir la gestion des applications OCI installées", + "body": "Les conteneurs restaurés sont listés et la récupération est proposée. Le bouton Récupérer de l’onglet Mises à jour de ProxMenux Monitor ouvre la même récupération." + }, + { + "title": "Vérifier avant de changer", + "body": "La récupération vérifie que l'hôte a tout ce dont chaque application a besoin. Une application qui ne peut pas être récupérée entière est laissée comme elle a été trouvée, avec la raison." + }, + { + "title": "Enregistrer et démarrer", + "body": "Le contrat est enregistré sur cet hôte et les éléments que l'installation y conservait sont réécrits. Le démarrage des applications fait l'objet d'une question distincte, à laquelle il faut répondre Non si les conteneurs d'origine fonctionnent encore sur un autre hôte." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/restore-offer.png", + "alt": "Boîte de dialogue qui énumère les conteneurs restaurés et propose de les récupérer", + "caption": "La récupération offerte lors de l'ouverture de la gestion des applications OCI installées." + } + }, + { + "table": { + "headers": [ + "Ce que l'hôte a gardé", + "Après la récupération" + ], + "rows": [ + [ + "Contrat d’instance", + "Enregistré à partir de la copie conservée dans le conteneur et vérifié par rapport à la configuration restaurée par Proxmox" + ], + [ + "Réseau privé d'une application multiconteneurs", + "Recréé avec le même pont et sous-réseau ; les adresses fixes des conteneurs ne changent pas" + ], + [ + "Ordre de démarrage d'une application multi-conteneurs", + "Le hookscript de dépendance et son contrat sont à nouveau installés ; les extraits sont activés sur le stockage local quand aucun stockage ne les accepte" + ], + [ + "Sysctls réseau et fichier host-monitor", + "Ecrit à nouveau en /etc/pve/proxmenux" + ], + [ + "Environnement d’exécution NVIDIA", + "Le hook d’un conteneur non privilégié est réinstallé. Un conteneur privilégié reçoit les fichiers de pilote de cet hôte à la place de ceux de son hôte d’origine" + ], + [ + "Rclone montage", + "Le hookscript et les programmes qui publient le montage sont à nouveau écrits, avec les mêmes vues sur l'hôte" + ], + [ + "Règle du pare-feu d'un moniteur hôte", + "Une nouvelle confirmation est demandée pour son port web et le sous-réseau du pont sur cet hôte" + ], + [ + "lost+found de chaque disque restauré", + "Supprimé s’il est vide ; une restauration le crée et certaines applications ne démarrent pas s’il figure dans leurs données" + ], + [ + "Disques restaurés sur un autre stockage", + "Le contrat est mis à jour pour refléter le stockage sur lequel ils se trouvent maintenant" + ] + ] + } + }, + { + "p": "Un conteneur restauré avec un autre ID conserve son application. Le contrat, son journal de console, ses paramètres sysctl réseau, le hookscript d'un montage Rclone et l'ordre de démarrage d'une application à plusieurs conteneurs sont enregistrés avec les ID des conteneurs sur cet hôte." + }, + { + "table": { + "headers": [ + "Ce qui empêche une récupération", + "Que faire" + ], + "rows": [ + [ + "Il manque un conteneur d'une application multiconteneurs", + "Restaurer aussi; l'application est récupérée entière" + ], + [ + "Le sous-réseau privé est déjà utilisé sur cet hôte", + "La récupération est annulée et rien n’est modifié : les adresses des conteneurs sont fixes et ne sont pas déplacées vers un autre sous-réseau" + ], + [ + "Un répertoire hôte n'existe pas", + "Monter ou créer avec ses données; une sauvegarde du conteneur n'inclut pas les répertoires hôtes" + ], + [ + "Un périphérique n'existe pas sur cet hôte", + "Connectez-le ou retirez-le du conteneur dans Proxmox" + ], + [ + "Une application avec NVIDIA sur un hôte sans pilote", + "Installez le pilote NVIDIA et le Container Toolkit" + ], + [ + "La sauvegarde a été effectuée avant l'existence de la copie du contrat", + "Le conteneur reste en tant que LXC ordinaire et n'est pas offert à nouveau" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Un conteneur qui revient", + "body": "Un conteneur restauré sur lui-même à partir d'une ancienne sauvegarde, retourné à un instantané ou retourné d'un autre noeud porte le contrat de l'état dans lequel il est. Lorsqu'il est sélectionné pour une opération et que son contrat diffère de celui de cet hôte, l'opération ne démarre pas et le conteneur est offert pour récupération." + } + }, + { + "figure": { + "src": "/oci-manager/restore-result.png", + "alt": "Résultat de la récupération avec le réseau privé, l’ordre de démarrage et les conteneurs enregistrés", + "caption": "Résultat d'une reprise, étape par étape." + } + } + ] + }, + { + "id": "remove", + "title": "Supprimer une application OCI", + "blocks": [ + { + "p": "Avant la confirmation, un résumé est établi à partir de la configuration réelle : les conteneurs supprimés, les données supprimées avec eux, le réseau privé libéré et les répertoires de l’hôte conservés. La réponse par défaut est Non, car les données des disques supprimés ne pourront pas être récupérées ensuite." + }, + { + "table": { + "headers": [ + "Ressource", + "À la suppression", + "Motifs" + ], + "rows": [ + [ + "rootfs et disques du conteneur", + "Supprimés", + "Ils appartiennent seulement au conteneur" + ], + [ + "Répertoire de l'hôte", + "Conservé, avec son contenu", + "D'autres applications peuvent l'utiliser" + ], + [ + "Fichiers hôtes du conteneur", + "Supprimés", + "Son journal de console, ses paramètres sysctl réseau, le hookscript du montage Rclone et son inscription dans l’onglet App de ProxMenux Monitor ne servent à aucun autre conteneur" + ], + [ + "Fichiers partagés par plusieurs installations", + "Supprimé avec la dernière installation qui les utilise", + "Le fichier de surveillance de l’hôte et le hookscript des dépendances des applications à plusieurs conteneurs" + ], + [ + "Contrat d’instance", + "Supprimé après une suppression réussie", + "Aucun CT ne lui est plus associé" + ], + [ + "Pont privé d'une pile", + "Relâché avec la pile", + "Il n'y a plus de membres pour se connecter" + ], + [ + "Réseau partagé par la suite Arr", + "Libéré lors de la suppression de la dernière application de la suite", + "Chaque application de la suite est indépendante et se supprime séparément" + ], + [ + "Un seul membre d'une pile", + "Non enlevé seul", + "Toute l'application est retirée, donc aucune pile n'est laissée incomplète" + ], + [ + "Un conteneur sur un autre noeud du cluster", + "Non enlevé", + "Son enregistrement et ses fichiers sur l’hôte se trouvent sur le nœud où il a été installé : il faut le supprimer là-bas, après l’y avoir remigré" + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/remove-summary.png", + "alt": "Résumé de suppression avec les conteneurs, les données et les répertoires hôtes touchés", + "caption": "Le résumé de suppression, construit à partir de la configuration réelle." + } + } + ] + }, + { + "id": "archives", + "title": "Images téléchargées et espace hôte", + "blocks": [ + { + "p": "L’archive OCI sert à construire le rootfs ; le CT en cours d’exécution ne la lit pas. Après une installation ou une mise à jour, les archives téléchargées pendant cette opération sont listées avec leur taille et leur suppression est proposée. Les supprimer libère de l’espace sans affecter le conteneur ni ses données." + }, + { + "calloutInfo": { + "title": "Les mises à jour ne nécessitent pas l'archive", + "body": "Sans l'archive, une mise à jour résout le canal enregistré et télécharge le nouveau digest. Avec elle, une archive n'est réutilisée que lorsque sa référence et son intégrité correspondent à ce qui est demandé." + } + } + ] + }, + { + "id": "registry", + "title": "Registre et nettoyage", + "blocks": [ + { + "p": "À l'ouverture de Gérer les applications OCI installées, les restes des conteneurs absents de tous les nœuds du cluster sont d'abord supprimés : l'enregistrement conservé comme historique après une suppression depuis l'interface Proxmox, et les fichiers de l'hôte laissés par une suppression. Un enregistrement lié à une opération interrompue est conservé, car sa sauvegarde peut encore être nécessaire. Les volumes et répertoires de l'hôte ne sont jamais supprimés par déduction." + } + ] + }, + { + "id": "cluster", + "title": "Dans un cluster : migration et haute disponibilité", + "intro": "Un conteneur OCI est un LXC Proxmox ordinaire : il peut être migré ou géré par HA comme les autres, avec les mêmes limites. Les éléments nécessaires à son démarrage sont conservés à un emplacement accessible à tous les nœuds du cluster.", + "blocks": [ + { + "table": { + "headers": [ + "Partie", + "Sur un autre noeud du cluster" + ], + "rows": [ + [ + "Journal de console", + "Le conteneur crée /var/log/proxmenux/oci avant de démarrer, quel que soit le nœud qui l’exécute. Chaque nœud conserve le journal des démarrages qu’il a effectués." + ], + [ + "Paramètres sysctl réseau et surveillance de l’hôte", + "Conservés dans /etc/pve/proxmenux, partagé par tous les nœuds du cluster, afin qu’un conteneur migré les retrouve." + ], + [ + "Disques du conteneur", + "Proxmox les déplace avec le conteneur. HA nécessite que leurs données soient disponibles sur le nœud cible, via un stockage partagé ou une configuration de réplication prise en charge." + ], + [ + "Répertoires et périphériques de l'hôte", + "Les mêmes règles que n'importe quel LXC : un répertoire hôte doit exister sur le nœud cible et être marqué comme partagé, et un GPU, Coral ou NPU doit y être présent." + ], + [ + "Enregistrement ProxMenux", + "Le contrat reste sur le nœud où l'application a été installée, et chaque nœud lit la copie conservée dans /etc/pve/priv/proxmenux/oci. Une application à un seul conteneur est enregistrée sur son nœud de destination après migration lors de l'ouverture de Gérer les applications OCI installées ou du lancement d'une opération la concernant. Une application à plusieurs conteneurs y est proposée à la récupération, car son réseau privé doit être créé sur ce nœud." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Pas pour une disponibilité élevée", + "body": "Une application à plusieurs conteneurs relie ses membres par un pont privé du nœud sur lequel elle a été installée ; ses membres restent donc sur ce nœud. Un outil de surveillance de l’hôte, comme Glances en mode hôte ou Netdata, surveille le nœud qui l’exécute ; le déplacer reviendrait à surveiller un autre nœud." + } + }, + { + "p": "Une sauvegarde restaurée à l'extérieur du cluster obtient les fichiers de /etc/pve/proxmenux que le conteneur utilise lorsque l'application est récupérée." + } + ] + }, + { + "id": "channel", + "title": "Une étiquette évolutive n’est pas une mise à jour sans surveillance", + "blocks": [ + { + "p": "Le catalogue installe l’étiquette évolutive publiée par son responsable, mais le digest effectif est résolu et enregistré, puis modifié uniquement lors d’une mise à jour explicite avec contrôles préalables et retour arrière. ProxMenux Monitor compare le digest installé à celui publié par le registre et affiche une indication et une notification lorsqu’une nouvelle image est disponible." + } + ] + } + ] +} diff --git a/web/messages/fr/docs/oci-manager/monitor.json b/web/messages/fr/docs/oci-manager/monitor.json new file mode 100644 index 00000000..bf77e449 --- /dev/null +++ b/web/messages/fr/docs/oci-manager/monitor.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "Conteneurs OCI dans ProxMenux Monitor | ProxMenux", + "description": "Ce que ProxMenux Monitor montre pour un conteneur installé par OCI Manager Apps : versions d'applications et d'images, nouvelles images, sortie console et terminal Proxmox VE." + }, + "header": { + "title": "Dans ProxMenux Monitor", + "description": "Un conteneur installé par OCI Manager Apps apparaît dans VMs & LXCs comme n'importe quel autre LXC. Sa fenêtre modale lit l'enregistrement d'installation : versions d'application et d'image, nouvelles images, sortie console et terminal.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "L'enregistrement est la source", + "body": "OCI manager Apps connaît l’application installée et sa provenance. Le Monitor lit cet enregistrement d’installation au lieu de rechercher l’application dans le conteneur. Ces informations restent donc disponibles que le conteneur fonctionne ou soit arrêté." + } + }, + { + "table": { + "headers": [ + "onglet", + "Ce qui change pour un conteneur OCI" + ], + "rows": [ + [ + "État", + "Un commutateur Watchdog sous Démarrer au démarrage: l'application est redémarrée quand elle s'arrête seule" + ], + [ + "Application", + "L'application est identifiée à partir du dossier et les mises à jour sont suivies par l'image" + ], + [ + "Mises à jour", + "L'image est mise à jour ou l'application modifiée, avec le même flux que le menu OCI" + ], + [ + "Montages", + "Disques de conteneurs et répertoires hôtes, avec leur utilisation" + ], + [ + "Journaux", + "Uniquement pour les conteneurs OCI : la sortie console de l'application" + ] + ] + } + } + ] + }, + { + "id": "app", + "title": "Application", + "intro": "L'onglet App offre l'application installée comme détection, avec le nom, le logo, le port et le schéma de l'enregistrement. L'enregistrer ouvre l'éditeur avec la méthode OCI image (installée par ProxMenux), qui ne nécessite aucune configuration.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "boxes", + "title": "Application", + "body": "La version de l'application à l'intérieur de l'image, lue à partir de l'image elle-même : son environnement ou son étiquette org.opencontainers.image.version. Cette information est indicative." + }, + { + "icon": "archive", + "title": "Image", + "body": "La date de construction et le digest de l'image installée. La mise à jour est décidée ici: le digest installé est comparé à celui que le registre publie aujourd'hui pour le même tag." + } + ] + } + }, + { + "list": { + "items": [ + "Lorsque le registre publie un nouveau digest, la carte affiche Nouvelle image avec sa date et son digest, même si la version de l'application à l'intérieur n'a pas changé: une reconstruction sur une base mise à jour est une mise à jour.", + "Lorsque les digests correspondent, la carte lit Version.", + "La carte relie au dépôt de l'image : son projet GitHub, ou sa page Docker Hub pour une image officielle.", + "Le lien d'accès utilise l'adresse LAN du conteneur, également pour le membre principal d'une application multi-conteneurs, qui a une deuxième adresse sur son réseau privé.", + "Le bouton Actualiser les données relit l’enregistrement et le registre des images. Les options de recherche ou d’enregistrement d’une autre application ne sont pas proposées : le conteneur contient exactement l’application de son enregistrement." + ] + } + }, + { + "figure": { + "src": "/oci-manager/monitor-app-tab.png", + "alt": "Onglet App d'un conteneur OCI avec la version de l'application, l'image et le lien du dépôt", + "caption": "Onglet Application d’un conteneur installé par OCI manager Apps." + } + }, + { + "p": "La vérification s'effectue une fois par jour avec les vérifications de mise à jour du moniteur, et Actualiser les données l'exécute immédiatement. Une nouvelle image est envoyée sous forme de notification via les canaux configurés dans Notifications. La mise à jour est appliquée depuis l'onglet Mises à jour." + } + ] + }, + { + "id": "updates", + "title": "Mises à jour", + "intro": "Pour un conteneur installé par OCI manager Apps, l’onglet Mises à jour présente l’application avec son image installée et, si le registre en publie une, la nouvelle image, au même format que les autres applications. Les outils de mise à jour des paquets et applications d’un LXC ordinaire ne sont pas proposés.", + "blocks": [ + { + "table": { + "headers": [ + "Bouton", + "Ce qu'il ouvre" + ], + "rows": [ + [ + "Mise à jour", + "La mise à jour de Gérer les applications OCI installées pour ce conteneur, dans le terminal de Monitor. Elle peut être lancée avec ou sans nouvelle image ; sans nouvelle image, rien ne change. Pour une application multiconteneur, elle met à jour tous les membres." + ], + [ + "Modifier", + "L'éditeur de l'application (ressources, réseau, chemins et GPU). Dans une application multi-conteneurs, il ajoute ou supprime les chemins et périphériques supplémentaires du conteneur d'application et, dans Immich, modifie ce qui exécute la reconnaissance." + ], + [ + "Récupérer", + "Remplace Mise à jour quand une opération sur le conteneur a été interrompue, et ouvre sa récupération." + ], + [ + "Récupérer (conteneur restauré)", + "Affiché pour un conteneur restauré depuis une sauvegarde sans contrat sur cet hôte, sous Application OCI restaurée. Ouvre la récupération dans le terminal de Monitor ; Mettre à jour et Modifier apparaissent après son enregistrement." + ] + ] + } + }, + { + "p": "Les modifications externes, les répertoires hôtes et les applications multiconteneurs sont traités comme dans le menu OCI. Dans une application multi-conteneurs, les boutons et les options apparaissent uniquement sur le conteneur principal; les autres membres montrent leur image, une note qu'ils sont mis à jour à partir du conteneur principal et un bouton qui l'ouvre. Lorsque le terminal se ferme, l'image, l'enregistrement et les montages sont à nouveau lus." + }, + { + "table": { + "headers": [ + "Option", + "Comportement" + ], + "rows": [ + [ + "Conserver la sauvegarde prise avant la mise à jour", + "Chaque mise à jour sauvegarde le conteneur pour le restaurer si la mise à jour échoue. Avec cette option, la même sauvegarde est conservée dans le stockage choisi et apparaît parmi les sauvegardes du CT; sur Proxmox Backup Server une sauvegarde est écrite avant la mise à jour." + ], + [ + "Mises à jour programmées", + "L’image n’est mise à jour à l’heure choisie que si le registre en publie une nouvelle, avec la possibilité d’attendre qu’elle ait 1, 3, 7 ou 14 jours. Un conteneur modifié en dehors de ProxMenux est ignoré et signalé." + ] + ] + } + } + ] + }, + { + "id": "logs", + "title": "Journaux", + "intro": "L'onglet Logs n'apparaît que pour les conteneurs installés par l'OCI Manager Apps, entre Montages et Sauvegardes. Il montre la sortie standard et l'erreur du processus principal de l'image, la même sortie docker logs affiche pour un conteneur Docker.", + "blocks": [ + { + "list": { + "items": [ + "La sortie est conservée sur l'hôte dans /var/log/proxmenux/oci/VMID.console.log (mode 0600), dès le premier démarrage et sur les redémarrages, de sorte qu'il peut être lu avec le conteneur arrêté.", + "Le fichier est tourné à 10 MB, en conservant trois copies compressées (/etc/logrotate.d/proxmenux-oci).", + "Chaque démarrage du conteneur est marqué dans la sortie. L'onglet affiche la sortie depuis le dernier démarrage par défaut; L'historique complet montre également les précédents.", + "Lorsque l'application est supprimée, sa sortie est supprimée avec elle.", + "Les 100, 500 ou 1000 dernières lignes sont affichées. Quand le conteneur fonctionne, les nouvelles lignes sont suivies en direct ; faire défiler vers le haut met le suivi en pause et Suivre le reprend.", + "Un filtre n'indique que les lignes qui contiennent un texte, et Télécharger enregistre les lignes chargées.", + "Les codes de couleur sont supprimés et une ligne qu'une barre de progression redessine est affichée dans son état final.", + "L’onglet relit le fichier à chaque ouverture, sans mise en cache." + ] + } + }, + { + "calloutInfo": { + "title": "Identifiants du premier démarrage", + "body": "Les images qui impriment un mot de passe généré sur leur premier démarrage le laissent dans cette sortie, comme le fait docker logs. L'installateur le lit à partir de là pour le montrer dans son résumé." + } + }, + { + "figure": { + "src": "/oci-manager/monitor-logs-tab.png", + "alt": "Onglet Logs avec la sortie console d'un conteneur OCI, le sélecteur de ligne, le filtre et le bouton suivant", + "caption": "Sortie de console d'un conteneur OCI." + } + } + ] + }, + { + "id": "terminal", + "title": "Console Proxmox VE", + "blocks": [ + { + "p": "Une image OCI exécute son propre processus comme PID 1 et aucun service de connexion, de sorte que la console par défaut d'un LXC ouvrirait un terminal où rien ne répond. Les conteneurs installés par OCI Manager Apps sont créés avec cmode: shell : la console Proxmox VE ouvre un shell avec lxc-attach, l'équivalent de docker exec, avec l'application en cours d'exécution intacte." + }, + { + "list": { + "items": [ + "Le shell est celui attribué à root dans l’image par /etc/passwd. Si root n’a pas de shell ou si l’image n’en contient aucun, la console par défaut est conservée.", + "Le shell s’exécute en tant que root dans le conteneur, sans mot de passe. Qui peut l'ouvrir est décidé par la permission VM.Console de Proxmox VE.", + "Le terminal du moniteur entre dans le conteneur avec pct enter, qui fonctionne de la même manière." + ] + } + } + ] + }, + { + "id": "mounts", + "title": "Montages", + "blocks": [ + { + "p": "L'onglet Mounts énumère les disques de conteneur et les répertoires hôtes du conteneur. L'utilisation d'un disque de conteneur sur le stockage de blocs comme LVM-thin est lue à partir du système de fichiers du disque, qui est monté uniquement à l'intérieur du conteneur." + } + ] + } + ] +} diff --git a/web/messages/fr/docs/oci-manager/stacks.json b/web/messages/fr/docs/oci-manager/stacks.json new file mode 100644 index 00000000..5a1dfd4c --- /dev/null +++ b/web/messages/fr/docs/oci-manager/stacks.json @@ -0,0 +1,404 @@ +{ + "meta": { + "title": "Applications multiconteneurs ProxMenux", + "description": "Comment OCI manager Apps transforme une application avec sa base de données et cache en LXC natifs coordonnés: plan, réseau privé, crochet de dépendance, validation et mises à jour transactionnelles." + }, + "header": { + "title": "Applications à plusieurs conteneurs", + "description": "Une application avec sa base de données, cache et d'autres services devient plusieurs LXC natifs coordonnés, installés et mis à jour comme un seul.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Une application pour l'utilisateur, plusieurs LXC pour Proxmox VE", + "body": "Une définition multi-conteneurs est une entrée du catalogue. L'installateur crée un LXC natif par service et garde leurs dépendances explicites. Immich, Nextcloud, Paperless-ngx et Tandoor sont installés de cette façon." + } + }, + { + "mermaid": { + "chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}
{{appNet}}\"]\n O --> D[\"{{db}}
{{private}}\"]\n O --> R[\"{{cache}}
{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A", + "labels": { + "plan": "Plan de la pile", + "app": "Application LXC", + "appNet": "LAN + privé", + "db": "PostgreSQL LXC", + "cache": "Valkey LXC", + "private": "privé" + } + } + } + ] + }, + { + "id": "plan", + "title": "1. Le plan, avant l'existence d'un conteneur", + "blocks": [ + { + "p": "Aucun LXC n'est créé pendant que la définition Compose est interprétée. Un plan complet vient en premier, avec chaque membre, image, VMID, réseau, chemin, secret, ordre et bilan de santé. Si le plan n'est pas cohérent, l'installation ne démarre pas." + }, + { + "table": { + "headers": [ + "Élément du plan", + "Contenu", + "Vérification avant de créer quelque chose" + ], + "rows": [ + [ + "Membres", + "Application principale, base de données, cache, apprentissage automatique et autres dépendances", + "VMID uniques, rôles connus et exactement un membre principal" + ], + [ + "Images", + "Référence roulante, architecture et digest résolu de chaque service", + "Toutes existent, prennent en charge l’architecture et réussissent la vérification d’intégrité OCI" + ], + [ + "Réseau", + "Pont privé, sous-net, une adresse fixe par service et accès au réseau local pour le membre principal", + "Aucune collision avec des ponts ou sous-réseaux existants et aucune adresse répétée" + ], + [ + "Persistance", + "Disques de conteneur, répertoires hôtes, propriétaires et sauvegarde", + "Aucun chemin de chevauchement, stockage disponible et autorisations déclarées" + ], + [ + "Secrets", + "Mot de passe de la base de données, clés d'application et identifiants initiaux", + "Généré une fois et donné seulement aux membres qui les utilisent" + ], + [ + "Cycle de vie", + "Ordre de départ, ordre d'arrêt et bilan de santé par membre", + "L'application principale démarre en dernier et s'arrête en premier" + ] + ] + } + } + ] + }, + { + "id": "create", + "title": "2. Création, membre par membre", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Réserve tous les VMID", + "body": "L'inventaire Proxmox VE et le registre des instances sont vérifiés. Un CT existant n'est pas adopté et un contrat qui appartient encore à une autre instance n'est pas réutilisé." + }, + { + "title": "Préparer chaque image", + "body": "Toutes les images sont résolues, téléchargées et vérifiées avant la création du premier conteneur." + }, + { + "title": "Créer chaque rootfs", + "body": "Les métadonnées OCI officielles sont importées, puis l’identité de l’instance ProxMenux et le rôle du membre sont ajoutés." + }, + { + "title": "Réseau privé", + "body": "Un bridge et un sous-net sont créés et chaque membre obtient son adresse fixe; seul le membre principal obtient également l'interface LAN." + }, + { + "title": "Persistance", + "body": "Chaque base de données et configuration obtient son propre disque conteneur ; seules les données destinées à être partagées utilisent des répertoires hôtes." + }, + { + "title": "Environnement", + "body": "Les points d’accès internes, les secrets partagés et les variables de service sont écrits. L’application accède à ses dépendances via leurs adresses privées réservées." + }, + { + "title": "Enregistrement", + "body": "Chaque membre enregistre sa configuration native, les changements rootfs que les mises à jour doivent reproduire et sa relation avec la pile." + } + ] + } + } + ] + }, + { + "id": "checks", + "title": "3. Démarrer et vérifier chaque conteneur", + "intro": "Un LXC créé ne signifie pas un service prêt. Les dépendances commencent dans l'ordre et chacune passe un contrôle spécifique à son service.", + "blocks": [ + { + "table": { + "headers": [ + "Services", + "Vérification", + "Ce qu'il montre" + ], + "rows": [ + [ + "PostgreSQL", + "pg_isready dans le CT avec l'hôte, l'utilisateur et la base de données attendus", + "Le serveur accepte les connexions pour la base de données configurée" + ], + [ + "Redis / Valkey", + "redis-cli ou valkey-cli PING contre son adresse privée", + "Le broker écoute et répond" + ], + [ + "Immich apprentissage automatique", + "HTTP GET /ping, avec vérification de l’environnement d’exécution GPU sélectionné", + "Le service répond et l’accélération demandée n’a pas basculé vers le CPU" + ], + [ + "Nextcloud", + "GET /status.php avec installed=true, maintenance=false et needsDbUpgrade=false", + "Initialisation terminée sans aucune migration en attente" + ], + [ + "Paperless-ngx / Tandoor", + "HTTP sur l'adresse LAN et le port réel du service", + "La façade et ses dépendances servent l’application" + ], + [ + "Application principale", + "L'extrémité de son modèle, par exemple /api/server/ping dans Immich", + "La pile entière fonctionne à travers l'application qui utilise les dépendances" + ] + ] + } + }, + { + "calloutWarning": { + "title": "En cours d’exécution ne signifie pas opérationnel", + "body": "L’état en cours d’exécution indique seulement que le processus LXC existe. Si le service propose une meilleure vérification, un contrôle exec ou HTTP avec délai maximal est utilisé. Si un membre s’arrête ou échoue à son contrôle, la pile n’est pas déclarée installée." + } + } + ] + }, + { + "id": "hook", + "title": "4. Le crochet de dépendance", + "blocks": [ + { + "p": "Le crochet est placé uniquement sur le conteneur principal d'une pile dépendante. Proxmox VE conserve le script comme un extrait et l'exécute comme le hookscript de ce CT. La recette de pile n'est pas écrite dans le script : elle vit dans un contrat privé séparé." + }, + { + "codeGrid": { + "items": [ + { + "title": "Configuration principale CT", + "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" + }, + { + "title": "Contrat privé (exemple)", + "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" + } + ] + } + }, + { + "snippet": { + "summary": "Source complète de proxmenux-stack-dependencies.sh", + "pathCode": "local:snippets/proxmenux-stack-dependencies.sh", + "snippetCode": "stackDependencyHook" + } + }, + { + "p": "Le script est le même pour chaque pile. Les VMID, noms, types de vérifications et délais proviennent du contrat privé /etc/pve/priv/proxmenux-stack-VMID.json de chaque pile." + }, + { + "steps": { + "items": [ + { + "title": "Proxmox VE appelle pre-start", + "body": "Avant le démarrage du CT principal, le crochet fonctionne avec son VMID et la phase du cycle de vie." + }, + { + "title": "Un verrou par pile", + "body": "flock sur /run/lock/proxmenux-stack-VMID.lock empêche deux séquences de démarrage en même temps." + }, + { + "title": "Le contrat est lu et validé", + "body": "Un schéma connu, des dépendances numériques, des étiquettes, un contrôle exec, http ou running et un délai maximal positif sont requis." + }, + { + "title": "Dépendances dans l'ordre", + "body": "Chaque CT doit exister ; un CT arrêté est démarré, tandis qu’un CT déjà actif n’est pas redémarré." + }, + { + "title": "Attendre que le service soit prêt", + "body": "Le contrôle est effectué toutes les deux secondes, et le CT est également confirmé être toujours en cours d'exécution." + }, + { + "title": "Le principal CT démarre", + "body": "Lorsque chaque dépendance est prête, prédémarrage se termine et Proxmox VE démarre l'application." + } + ] + } + }, + { + "calloutInfo": { + "title": "Le crochet n'arrête pas les dépendances", + "body": "Les phases post-démarrage, pré-stop et post-stop ne font rien. L'arrêt du principal CT laisse tourner PostgreSQL, Redis, Valkey ou l'apprentissage automatique. Le crochet commande le démarrage; il ne transforme pas plusieurs LXC en un seul processus." + } + }, + { + "table": { + "headers": [ + "Type", + "Exemple", + "Démarrages suivants" + ], + "rows": [ + [ + "Pile dépendante", + "Immich, Nextcloud, application avec PostgreSQL", + "Le crochet du CT principal commence les dépendances et les attend" + ], + [ + "Suite d'application", + "Suite Arr", + "Aucun membre principal: chaque LXC suit son propre onboot" + ], + [ + "Application unique", + "Jellyfin", + "Proxmox VE commence directement ce LXC" + ] + ] + } + } + ] + }, + { + "id": "stack-checks", + "title": "5. Contrôle de la pile dans son ensemble", + "blocks": [ + { + "list": { + "items": [ + "Chaque VMID existe, est unique et conserve l'identité d'instance attendue.", + "Chaque contrat appartient à la même pile, conserve son rôle et sa configuration native enregistrée.", + "Le membre principal est le dernier en start_order et le premier en stop_order.", + "Aucun membre, volume ou ajustement du rootfs ne manque.", + "Le crochet pointe vers l'extrait officiel, son contenu est inchangé et son contrat correspond à la recette de la pile.", + "Les images et les digests observés correspondent aux archives OCI préparées.", + "Les appareils, les profils GPU, les montages, les secrets et les paramètres correspondent encore aux contrats.", + "Une fois toutes les dépendances validées, le point d’accès de l’application principale vérifie l’intégration entre les membres." + ] + } + } + ] + }, + { + "id": "manage", + "title": "Gestion d'une pile installée", + "intro": "Dans Gérer les applications OCI installées, chaque membre mène à toute la pile. Le menu propose Mettre à jour tous les conteneurs de l’application, Modifier les chemins et périphériques supplémentaires, Recréer tous les conteneurs avec leur configuration enregistrée et Retirer : supprimer l’application et ses conteneurs. La recréation reconstruit chaque conteneur depuis son image d’origine, identifiée par le digest enregistré, sans chercher d’image plus récente. Elle suit les mêmes étapes qu’une mise à jour et est proposée pour les piles pouvant être mises à jour.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Tout membre", + "body": "Le contrat du membre nomme le VMID principal et la liste complète des membres." + }, + { + "title": "La pile est reproductible", + "body": "Les identités, les contrats, le crochet, les adaptations et un replay coordonné pour cette recette sont validés." + }, + { + "title": "Images d'abord", + "body": "L'application n'est pas arrêtée avant que chaque digest ait été résolu, téléchargé et vérifié." + }, + { + "title": "Arrêter les membres et sauvegarder l’ensemble", + "body": "Les sauvegardes natives vérifiées sont prises avec la pile arrêtée, de sorte que l'application et les bases de données appartiennent au même moment." + }, + { + "title": "Mettre à jour et vérifier chaque membre", + "body": "Adaptation, réseau, montages, secrets et dispositifs sont appliqués à nouveau avant le contrôle de santé de chaque membre." + }, + { + "title": "Publier ou récupérer tout", + "body": "Les nouveaux contrats ne sont publiés que lorsque chaque membre passe. Si on échoue, chaque membre est rétabli." + } + ] + } + }, + { + "table": { + "headers": [ + "Modifier", + "Ce qui change", + "Ce qui est gardé" + ], + "rows": [ + [ + "Chemins et périphériques supplémentaires", + "Ils sont ajoutés ou retirés du conteneur d'application, qui redémarre. Rien n'est reconstruit", + "Les données de l'application, sa base de données et les autres conteneurs" + ], + [ + "Ce qui exécute la reconnaissance (Immich)", + "Le conteneur d'apprentissage de la machine prend l'image et les appareils du CPU ou d'un GPU de l'hôte. Toute l'application est arrêtée et mise à jour, comme dans une mise à jour", + "Le cache modèle, la bibliothèque et la base de données. Si quelque chose échoue, les conteneurs précédents et le choix précédent sont restaurés" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Une pile sans replay coordonné n'est pas mise à jour", + "body": "Si la préparation d'une pile ne peut pas être reproduite, la mise à jour est refusée avant l'arrêt de la pile. L'application continue à fonctionner comme elle est." + } + } + ] + }, + { + "id": "failure", + "title": "6. Quand quelque chose échoue", + "blocks": [ + { + "p": "Pendant une installation, une erreur s'arrête et enlève les conteneurs incomplets que l'opération a créés, et le pont privé si l'opération l'a créé. Une pile n'est pas publiée comme valide jusqu'à ce que la séquence entière se termine." + }, + { + "p": "Une mise à jour est transactionnelle: toutes les images sont préparées d'abord, puis la pile s'arrête, chaque membre est sauvegardé et la sauvegarde vérifiée, et seulement alors chaque rootfs est remplacé. Les membres commencent un par un avec leur bilan de santé; si on échoue, chaque membre est restauré à partir du même ensemble de sauvegardes, de sorte que la base de données et l'application n'appartiennent jamais à différents moments." + }, + { + "mermaid": { + "chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]", + "labels": { + "prepare": "Préparer chaque image", + "stop": "Stop, membre principal d'abord", + "backup": "Sauvegarde vérifiée de chaque CT", + "replace": "Remplacer le rootfs", + "healthy": "Tous opérationnels ?", + "yes": "Oui", + "no": "Non", + "commit": "Publier les contrats", + "rollback": "Restaurer chaque membre" + } + } + } + ] + }, + { + "id": "not-assumed", + "title": "Ce qu'une pile ne comprend pas", + "blocks": [ + { + "list": { + "items": [ + "Une suite installée dans un flux, comme la suite Arr, n'est pas une pile dépendante : ses conteneurs n'ont pas d'ordre de départ entre eux.", + "Le réseau privé ne remplace pas l'authentification, TLS ou la configuration de chaque application.", + "La sauvegarde d'un LXC ne contient pas le pont, le crochet ou les contrats du reste de la pile.", + "Prowlarr, Sonarr ou Radarr ne reçoivent aucun indexeur, profil ou fournisseur de ProxMenux." + ] + } + } + ] + } + ] +} diff --git a/web/messages/fr/docs/oci-manager/storage-network.json b/web/messages/fr/docs/oci-manager/storage-network.json new file mode 100644 index 00000000..8f7f3649 --- /dev/null +++ b/web/messages/fr/docs/oci-manager/storage-network.json @@ -0,0 +1,305 @@ +{ + "meta": { + "title": "Données, chemins et réseau | ProxMenux", + "description": "Comment OCI manager Apps conserve les données d’un conteneur OCI : disques du conteneur, répertoires de l’hôte, montages rclone, adresses et réseaux privés." + }, + "header": { + "title": "Données, chemins et réseau", + "description": "Ce qui se trouve dans le rootfs, ce qui subsiste après son remplacement, comment les données sont partagées entre conteneurs et comment chacun obtient son adresse.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "La persistance se décide avant la création du LXC", + "body": "Les volumes déclarés par l’image et son fichier Compose sont lus avant la création du conteneur. Chaque chemin à conserver après une mise à jour devient un point de montage indépendant du rootfs. Celui-ci ne contient donc que les fichiers appartenant à l’image et peut être remplacé." + } + } + ] + }, + { + "id": "questions", + "title": "Ce que demande l’installateur", + "intro": "Le modèle fournit les chemins nécessaires à l’application. Chacun est placé sur un disque du conteneur ou dans un répertoire de l’hôte. D’autres chemins peuvent être ajoutés avant le récapitulatif.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Chemins nécessaires", + "body": "/config, /data, les bibliothèques, les téléchargements et tous les volumes déclarés par l’application sont répertoriés." + }, + { + "title": "Emplacement", + "body": "Chaque chemin est placé sur un disque du conteneur ou dans un répertoire existant de l’hôte." + }, + { + "title": "Stockage et taille", + "body": "Un disque du conteneur est créé sur un stockage Proxmox VE avec la taille indiquée. L’installation par défaut utilise local-lvm. L’installation avancée demande le stockage de chaque chemin juste avant sa taille et propose celui du rootfs. Le disque apparaît sous le nom vm-VMID-disk-N et est rattaché comme mpN." + }, + { + "title": "Répertoire de l’hôte", + "body": "Le répertoire de l’hôte est indiqué par son chemin. S’il n’existe pas, il est créé avec pour propriétaire l’utilisateur de l’hôte correspondant à celui du conteneur." + }, + { + "title": "Chemins supplémentaires", + "body": "Avant l’installation, d’autres associations entre un chemin ou un volume de l’hôte et un chemin du conteneur peuvent être ajoutées." + }, + { + "title": "Récapitulatif", + "body": "La correspondance complète des chemins est affichée avant la création du CT et enregistrée dans le contrat de l’instance." + } + ] + } + } + ] + }, + { + "id": "options", + "title": "Les deux emplacements persistants", + "blocks": [ + { + "table": { + "headers": [ + "Propriété", + "Disque du conteneur", + "Répertoire de l’hôte" + ], + "rows": [ + [ + "Dans la configuration", + "mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G", + "mpN: /mnt/oci-shared/media,mp=/data/media" + ], + [ + "Sauvegarde du conteneur (vzdump)", + "Inclus avec backup=1", + "Non inclus" + ], + [ + "Taille", + "Fixe ; extensible en redimensionnant le point de montage", + "L’espace libre du système de fichiers ou du dataset de l’hôte" + ], + [ + "Autres conteneurs", + "Monté uniquement par son propre conteneur", + "Le même répertoire peut être monté dans plusieurs conteneurs" + ], + [ + "Snapshots et restauration", + "Gérés par Proxmox VE avec le CT", + "Gérés sur le stockage de l’hôte" + ], + [ + "Lors de la suppression de l’application", + "Supprimé avec le conteneur", + "Conservé avec son contenu" + ], + [ + "Lors du déplacement du CT vers un autre nœud", + "Déplacé avec le CT", + "Le même chemin doit exister sur l’autre nœud" + ] + ] + } + }, + { + "p": "Le rootfs est réservé aux binaires et au contenu de l’image. Une mise à jour ou une recréation le remplace sans toucher à l’un ou l’autre type de point de montage." + } + ] + }, + { + "id": "example", + "title": "Exemple : un conteneur avec les deux emplacements", + "blocks": [ + { + "code": { + "title": "Jellyfin installé comme CT 151 sur local-lvm (extrait)", + "code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media" + } + }, + { + "p": "Une mise à jour ou une recréation remplace uniquement le rootfs : mp0 conserve les utilisateurs, les bibliothèques et les paramètres, tandis que mp1 donne toujours accès aux mêmes médias. Restaurer la sauvegarde du CT rétablit /config. Le répertoire des médias est restauré, si nécessaire, depuis la sauvegarde du stockage de l’hôte." + }, + { + "flow": { + "nodes": [ + { + "label": "Contrat", + "detail": "/config" + }, + { + "label": "Emplacement", + "detail": "Disque du conteneur\nou répertoire de l’hôte" + }, + { + "label": "LXC", + "detail": "Toujours /config\npour l’application" + } + ], + "caption": "L’application voit le chemin déclaré par l’image ; seul son emplacement de stockage change." + } + } + ] + }, + { + "id": "shared", + "title": "Un répertoire de l’hôte, plusieurs conteneurs", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart TB\n H[\"{{host}}
/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent
/data\"]\n H --> J[\"Jellyfin
/data\"]\n H --> R[\"Radarr / Sonarr
/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]", + "labels": { + "host": "Répertoire de l’hôte", + "config": "Configuration propre" + } + } + }, + { + "p": "Chaque conteneur conserve sa configuration sur son propre disque. La bibliothèque ou les téléchargements se trouvent dans un unique répertoire de l’hôte, monté au même chemin interne dans chaque conteneur. Ainsi, le chemin dans lequel une application écrit est celui depuis lequel une autre lit." + } + ] + }, + { + "id": "rclone", + "title": "Stockage cloud avec l’application rclone", + "intro": "Outre son installation, la fiche rclone du catalogue propose Activer un montage dans un conteneur OCI rclone existant. Un stockage distant déjà créé et autorisé dans l’interface web de rclone est monté et rendu accessible sur l’hôte. D’autres conteneurs peuvent alors l’utiliser comme un répertoire de l’hôte.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Conteneur et stockage distant", + "body": "Le VMID du conteneur rclone, le nom exact du stockage distant et, éventuellement, un chemin à l’intérieur de celui-ci." + }, + { + "title": "Nom du montage et cache", + "body": "Le nom du montage et le mode du cache VFS : off, minimal, writes ou full (par défaut)." + }, + { + "title": "Vues exposées", + "body": "Une racine commune, /mnt/oci-shared par défaut, contient une vue en lecture-écriture dans /mnt/oci-shared/remotes/NAME et une vue en lecture seule dans /mnt/oci-shared/remotes-ro/NAME." + }, + { + "title": "Activation", + "body": "Après confirmation, le CT est arrêté, sa commande de démarrage et un hookscript Proxmox VE sont configurés, puis il est redémarré. L’opération attend que les deux vues soient montées sur l’hôte." + } + ] + } + }, + { + "calloutInfo": { + "title": "Si le montage ne s’active pas", + "body": "La configuration précédente du conteneur est restaurée, puis celui-ci est redémarré. Ainsi, un échec d’activation laisse rclone dans son état initial." + } + } + ] + }, + { + "id": "network", + "title": "Adresses et réseaux", + "intro": "Une application à un seul conteneur a besoin d’une adresse. Une application à plusieurs conteneurs nécessite aussi un réseau stable entre ses membres.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "network", + "title": "Application à un seul conteneur", + "body": "Le pont réseau est choisi, ainsi que DHCP ou une adresse fixe au format CIDR. Le LXC possède sa propre adresse et le récapitulatif affiche les URL complètes des services." + }, + { + "icon": "waypoints", + "title": "Application à plusieurs conteneurs", + "body": "Un sous-réseau libre est recherché et un pont privé persistant est créé. Chaque membre — application, base de données et cache — y reçoit une adresse fixe." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "LAN", + "detail": "Adresse accessible\nservice principal uniquement" + }, + { + "label": "LXC principal", + "detail": "Web / API\nLAN + réseau privé" + }, + { + "label": "Réseau privé", + "detail": "PostgreSQL · Valkey · ML\nadresses fixes" + } + ], + "caption": "Les dépendances communiquent sur le réseau privé et n’ont pas d’adresse sur le LAN." + } + }, + { + "p": "Le contrat de la pile enregistre le pont, le sous-réseau, les adresses et les relations entre services. La mise à jour de l’application réutilise la même topologie pour tous les membres. ProxMenux Monitor ouvre le conteneur principal à son adresse LAN, et non à celle du réseau privé." + } + ] + }, + { + "id": "ownership", + "title": "Propriétaires des fichiers et répertoires", + "blocks": [ + { + "list": { + "items": [ + "Les nouveaux répertoires sont créés avec les UID et GID auxquels le LXC non privilégié est mappé.", + "Le propriétaire des répertoires existants n’est pas modifié récursivement.", + "Les sockets, fichiers système et chemins sensibles ne sont pas proposés comme répertoires génériques de l’hôte." + ] + } + } + ] + }, + { + "id": "backup", + "title": "Ce que contient une sauvegarde du conteneur", + "blocks": [ + { + "table": { + "headers": [ + "Élément", + "Dans la sauvegarde vzdump du CT", + "Lieu de conservation" + ], + "rows": [ + [ + "Rootfs OCI", + "Oui", + "Dans la sauvegarde du CT ; il peut aussi être recréé à partir de l’image et du contrat" + ], + [ + "Disque du conteneur avec backup=1", + "Oui", + "La sauvegarde du CT" + ], + [ + "Répertoire de l’hôte", + "Non", + "La sauvegarde du stockage de l’hôte" + ], + [ + "Contrat de l’instance", + "Oui, la copie conservée dans le CT", + "/.proxmenux/oci-record.json dans le CT ; les copies supplémentaires de l’hôte et du cluster sont conservées séparément" + ], + [ + "Application à plusieurs conteneurs", + "Chaque membre dans sa propre sauvegarde", + "Les sauvegardes de tous les membres, ainsi que le contrat de la pile et son pont réseau sur l’hôte" + ] + ] + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/oci-manager/architecture.json b/web/messages/it/docs/oci-manager/architecture.json new file mode 100644 index 00000000..3723eb23 --- /dev/null +++ b/web/messages/it/docs/oci-manager/architecture.json @@ -0,0 +1,171 @@ +{ + "meta": { + "title": "Come viene adattata un’immagine OCI | ProxMenux", + "description": "Dal repository dell’immagine e dal suo file Compose a un modello verificabile, un piano di distribuzione e un LXC nativo di Proxmox VE, senza Docker al suo interno." + }, + "header": { + "title": "Come viene adattata un’immagine OCI", + "description": "Dal repository dell’immagine e dal suo file Compose a un modello verificabile, un piano di distribuzione e un LXC nativo, senza installare Docker al suo interno.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "pipeline", + "title": "Il processo di adattamento", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]", + "labels": { + "repo": "Repository dell’immagine", + "converter": "Convertitore", + "template": "Modello JSON", + "blockers": "Nessun requisito bloccante?", + "no": "No", + "yes": "Sì", + "review": "Revisione / overlay", + "plan": "Piano di distribuzione", + "lxc": "LXC nativo" + } + } + }, + { + "p": "Il convertitore legge l’immagine e il file Compose pubblicati dal progetto e genera un modello JSON. Se alcuni requisiti non possono ancora essere adattati e impediscono l’installazione, il modello viene revisionato prima della pubblicazione nel catalogo. Un file di modifiche verificate, chiamato overlay, risolve questi problemi. Solo i modelli senza requisiti bloccanti vengono proposti per l’installazione." + } + ] + }, + { + "id": "template", + "title": "Cosa conserva il modello", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Identità dell’immagine", + "body": "Repository, tag ad aggiornamento continuo, architettura, digest risolto e revisione di origine." + }, + { + "icon": "braces", + "title": "Contratto del container", + "body": "Entrypoint, Cmd, ambiente, utente, directory di lavoro, segnale di arresto, porte e volumi." + }, + { + "icon": "layers", + "title": "Adattamento a Proxmox VE", + "body": "Risorse, sicurezza, punti di mount, dispositivi, sysctls, controlli di stato e adattamenti necessari per ciascuno, con la relativa motivazione." + }, + { + "icon": "shield", + "title": "Compatibilità", + "body": "Chiavi supportate, requisiti non adattati che impediscono l’installazione e stato di ogni verifica." + } + ] + } + } + ] + }, + { + "id": "sources", + "title": "OCI fornisce il processo, Compose l’ambiente", + "blocks": [ + { + "table": { + "headers": [ + "Origine", + "Esempio", + "Risultato nativo" + ], + "rows": [ + [ + "Metadati OCI", + "Entrypoint, Cmd, User", + "Proxmox VE li importa durante la creazione del CT" + ], + [ + "Docker Compose", + "environment, volumes, devices", + "Voci dell’ambiente LXC, mpN e devN" + ], + [ + "Profilo ProxMenux", + "GPU, controllo di stato, credenziali", + "Domande e adattamenti verificati" + ], + [ + "Utente", + "VMID, storage, rete", + "Il contratto dell’istanza" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Cosa succede durante l’installazione", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Risolvere il riferimento", + "body": "Viene interrogato il registro, viene scelta l’architettura dell’host e viene fissato il digest esatto a cui punta il tag ad aggiornamento continuo." + }, + { + "title": "Scaricare e verificare", + "body": "Skopeo scarica l’immagine come archivio OCI. Prima di creare qualsiasi risorsa, ogni livello viene verificato rispetto al suo digest e decompresso. Se il download è danneggiato, viene ripetuto una volta prima di interrompere l’installazione." + }, + { + "title": "Creare il filesystem", + "body": "pct create crea il rootfs a partire dall’archivio e conserva i metadati ufficiali del processo dell’immagine." + }, + { + "title": "Collegare le risorse", + "body": "Vengono applicati i volumi, la rete, l’ambiente, i dispositivi e i profili di sicurezza dichiarati." + }, + { + "title": "Console", + "body": "L’output della console del container viene conservato sull’host. La console di Proxmox VE apre una shell se l’immagine ne include una." + }, + { + "title": "Verificare", + "body": "Al primo avvio si attende che il container riceva un indirizzo e che il servizio risponda. In caso di errore, l’installazione non viene indicata come riuscita." + }, + { + "title": "Registrare la configurazione", + "body": "La configurazione effettiva viene salvata nel contratto dell’istanza usato per gli aggiornamenti e le ricreazioni." + } + ] + } + } + ] + }, + { + "id": "example", + "title": "Esempio: un’immagine con /config e /downloads", + "intro": "Una definizione Compose comune e la configurazione Proxmox VE che ne deriva. I percorsi attesi dall’applicazione non cambiano.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Docker Compose", + "code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080" + }, + { + "title": "/etc/pve/lxc/VMID.conf (estratto)", + "code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000" + } + ] + } + }, + { + "p": "mp0 è un secondo disco appartenente al container, denominato vm-VMID-disk-N sullo storage selezionato. Viene montato in /config e, con backup=1, incluso nel backup del container. mp1 non crea alcun disco: monta la directory dell’host /srv/downloads in /downloads all’interno dell’LXC. La porta 8080 non viene mappata: l’LXC ha un proprio indirizzo e il servizio risponde su quello." + } + ] + } + ] +} diff --git a/web/messages/it/docs/oci-manager/custom-image.json b/web/messages/it/docs/oci-manager/custom-image.json new file mode 100644 index 00000000..7d48a5b7 --- /dev/null +++ b/web/messages/it/docs/oci-manager/custom-image.json @@ -0,0 +1,278 @@ +{ + "meta": { + "title": "Installare un’immagine non presente nel catalogo | ProxMenux", + "description": "Adatta un’immagine OCI da un file Compose, un URL, un comando docker run o un riferimento all’immagine e verifica cosa può riprodurre ProxMenux prima di installarla." + }, + "header": { + "title": "Installa un’immagine non presente nel catalogo", + "description": "L’immagine viene adattata dal suo file Compose, da un comando docker run o dal solo riferimento. Il risultato viene mostrato per la revisione prima di creare qualsiasi LXC.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Lo stesso convertitore e lo stesso installer", + "body": "L’opzione Installa un’immagine non presente nel catalogo usa il convertitore e l’installer dei modelli del catalogo. La differenza è che il contratto viene generato al momento dalla definizione fornita e verificato prima di creare qualsiasi LXC." + } + } + ] + }, + { + "id": "sources", + "title": "Come viene descritta l’immagine", + "intro": "La prima schermata chiede come viene descritta l’immagine. Quattro opzioni forniscono una definizione da adattare, una quinta usa solo il nome dell’immagine e altre tre leggono un oci-compose già scritto.", + "blocks": [ + { + "table": { + "headers": [ + "Opzione", + "Cosa legge" + ], + "rows": [ + [ + "Incolla il file Compose nel terminale", + "Incolla il contenuto YAML nel terminale e termina con Ctrl+D." + ], + [ + "Leggi il file Compose da questo host", + "Un percorso sul nodo, /root/docker-compose.yml per impostazione predefinita. Il file deve esistere e non superare 256 KiB." + ], + [ + "Scarica il file Compose da un indirizzo", + "Un indirizzo http:// o https:// che fornisce il contenuto YAML grezzo. Vengono scaricati al massimo 256 KiB." + ], + [ + "Incolla il comando docker run nel terminale", + "Il comando pubblicato dal progetto. Vengono adattati porte, ambiente, volumi, dispositivi, capability, utente, memoria condivisa e le altre opzioni supportate." + ], + [ + "Solo il riferimento all’immagine, senza file Compose", + "Un riferimento come ghcr.io/user/application:latest. Viene interrogato il registro e vengono conservati i metadati OCI dell’immagine." + ], + [ + "Incolla un oci-compose nel terminale", + "Incolla il JSON nel terminale e termina con Ctrl+D. Non viene convertito: viene verificato e installato così come è scritto." + ], + [ + "Leggi un oci-compose da questo host", + "Un file JSON sul nodo, /root/oci-compose.json per impostazione predefinita, di massimo 2 MiB." + ], + [ + "Scarica un oci-compose da un indirizzo", + "Un indirizzo http:// o https:// che fornisce il file JSON. Vengono scaricati al massimo 2 MiB." + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-source-menu.png", + "alt": "Menu per scegliere come descrivere un’immagine non presente nel catalogo", + "caption": "Modi per descrivere un’immagine non presente nel catalogo." + } + } + ] + }, + { + "id": "reference-only", + "title": "Cosa fornisce il solo riferimento all’immagine", + "intro": "L’immagine contiene i metadati del processo, ma non tutto l’ambiente che normalmente aggiunge un file Compose.", + "blocks": [ + { + "table": { + "headers": [ + "Letto dall’immagine", + "Non presente nell’immagine", + "Conseguenza" + ], + "rows": [ + [ + "Entrypoint, Cmd, User, WorkingDir e l’ambiente incorporato", + "Variabili presenti solo nella documentazione", + "Vengono aggiunte durante l’installazione o con Modifica" + ], + [ + "Volumi dichiarati dall’immagine", + "Directory dell’host indicate solo nel file Compose", + "I percorsi aggiuntivi vengono inseriti prima dell’installazione" + ], + [ + "Porte EXPOSE", + "L’URL, il protocollo o il controllo funzionale del servizio", + "Vengono confermati la porta e il metodo di verifica del servizio" + ], + [ + "Architetture e digest nel registro", + "Dispositivi, privilegi o dipendenze esterne", + "Non vengono abilitati senza una definizione che li richieda" + ] + ] + } + } + ] + }, + { + "id": "review", + "title": "Verifica prima di installare", + "intro": "Dopo aver adattato la definizione, ProxMenux mostra come l’ha interpretata prima di chiedere VMID, risorse o storage.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Analizza", + "body": "Vengono letti servizi, immagine, porte, percorsi, ambiente, dispositivi, sicurezza e controllo di stato." + }, + { + "title": "Interroga il registro", + "body": "L’immagine deve esistere nel registro e vengono elencate le architetture pubblicate. Per un registro privato viene usato l’account salvato per quel registro." + }, + { + "title": "Elenca ciò che non viene applicato", + "body": "Vengono elencati label, reti Docker, impostazioni Swarm e altre chiavi che non hanno effetto su un LXC." + }, + { + "title": "Blocca le opzioni senza equivalente sicuro", + "body": "Le chiavi senza un equivalente sicuro compaiono in Opzioni senza equivalente e impediscono di proseguire con l’installazione. Non vengono ignorate senza avviso." + }, + { + "title": "Richiedi i segreti", + "body": "Le variabili il cui nome indica una password, un token o una chiave vengono richieste come dati sensibili durante l’installazione." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-review.png", + "alt": "Riepilogo di come ProxMenux ha interpretato il file Compose", + "caption": "Riepilogo mostrato prima che l’installer chieda VMID e risorse." + } + }, + { + "p": "Dopo aver accettato il riepilogo, il flusso è quello del catalogo: nome, modalità predefinita o avanzata, VMID, CPU, memoria, rete, avvio con il nodo, percorsi persistenti e aggiuntivi, dispositivi compatibili e riepilogo finale." + } + ] + }, + { + "id": "examples", + "title": "Esempi di input", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Compose", + "code": "services:\n app:\n image: ghcr.io/example/app:latest\n ports:\n - \"8080:8080\"\n volumes:\n - ./config:/config\n - /srv/media:/media\n environment:\n TZ: Europe/Madrid" + }, + { + "title": "docker run", + "code": "docker run -d \\\n --name app \\\n -p 8080:8080 \\\n -e TZ=Europe/Madrid \\\n -v app-config:/config \\\n -v /srv/media:/media \\\n ghcr.io/example/app:latest" + } + ] + } + } + ] + }, + { + "id": "oci-compose", + "title": "Un oci-compose scritto a mano", + "intro": "Un oci-compose è il file JSON da cui viene installata un’applicazione. Il catalogo ne conserva uno per ogni applicazione. Lo stesso formato può essere scritto a mano e installato con questa opzione.", + "blocks": [ + { + "p": "In un file scritto a mano l’autore decide immagine, porte, variabili, volumi e domande dell’installazione. ProxMenux completa il resto durante la lettura. Il formato può esprimere ciò che Compose non prevede: il testo di una domanda, una password generata all’installazione, un profilo GPU, il proprietario di ciascun volume, il controllo del primo avvio o le credenziali mostrate alla fine." + }, + { + "steps": { + "items": [ + { + "title": "Verifica", + "body": "I file con errori non vengono installati. Ogni errore indica il campo interessato; se il JSON non è valido, vengono segnalate riga e colonna." + }, + { + "title": "Rivedi", + "body": "Un file valido mostra cosa installa: immagine, indirizzo web, porte, percorsi persistenti, variabili richieste dall’installer e file che verranno scritti." + }, + { + "title": "Installa", + "body": "L’installazione è la stessa delle applicazioni del catalogo, con impostazioni predefinite o avanzate." + } + ] + } + }, + { + "calloutWarning": { + "title": "Un file che determina i privilegi", + "body": "Un oci-compose stabilisce cosa viene montato nel container e con quali privilegi. La revisione lo mostra prima dell’installazione: installa solo file provenienti da fonti attendibili." + } + }, + { + "p": "Il README del motore OCI descrive il formato blocco per blocco con due esempi completi. Anche il record di un’installazione può essere letto nello stesso modo: viene usato solo il modello originale, senza alcuna delle risposte di quell’installazione." + } + ] + }, + { + "id": "private-registries", + "title": "Immagini in registri privati", + "intro": "Un’immagine in un registro privato, come un pacchetto privato su GitHub o un repository privato su Docker Hub, viene letta con un account salvato in ProxMenux.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Il registro nega l’accesso all’immagine", + "body": "Quando il registro indica che l’immagine richiede un account, la revisione propone di accedere a quel registro e legge di nuovo l’immagine." + }, + { + "title": "Accedi", + "body": "Un nome utente e una password o un token autorizzato a scaricare l’immagine. Il registro li verifica e vengono salvati solo se accettati." + }, + { + "title": "Installa e mantieni aggiornato", + "body": "L’account viene usato per scaricare l’immagine durante l’installazione e anche per aggiornamenti, Modifica, Ricrea, watchdog e ricerca degli aggiornamenti del Monitor, su qualsiasi nodo del cluster." + } + ] + } + }, + { + "p": "Account dei registri, nel menu principale di OCI manager Apps, elenca gli account salvati per registro e utente, senza mostrarne i segreti. Da ogni account puoi verificare, scaricare o installare un’immagine e aggiornare o rimuovere le credenziali." + }, + { + "list": { + "items": [ + "GitHub (ghcr.io): l’utente è l’account GitHub e la password è un token di accesso personale con il permesso read:packages.", + "Docker Hub (docker.io): l’utente è l’account Docker Hub e la password è un token di accesso con permesso di lettura.", + "Altri registri, anche con una porta propria come registry.example.com:5000: nome utente e password o token forniti da quel registro." + ] + } + }, + { + "calloutInfo": { + "title": "Dove vengono salvati gli account", + "body": "In /etc/pve/priv/proxmenux/registry-auth.json, leggibile solo da root, nella stessa cartella in cui Proxmox conserva le password degli storage. /etc/pve è condiviso tra tutti i nodi del cluster, quindi un account aggiunto su un nodo viene usato su tutti. Il backup dell’host include il file e la disinstallazione di ProxMenux lo rimuove da tutti i nodi." + } + } + ] + }, + { + "id": "limits", + "title": "Definizioni che non vengono installate", + "blocks": [ + { + "list": { + "items": [ + "Un Dockerfile senza immagine pubblicata: prima occorre creare l’immagine e pubblicarla in un registro OCI.", + "Un file Compose con più servizi: viene bloccato perché questa opzione installa un solo servizio per container, anche se più servizi usano la stessa immagine.", + "configs, segreti esterni o formati di dispositivi che non possono essere adattati senza ambiguità.", + "Sostituzioni della shell come $(command): occorre inserire direttamente il valore risultante.", + "Opzioni docker run non riconosciute e --env-file: usa invece un file Compose con valori espliciti." + ] + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/oci-manager/hardware.json b/web/messages/it/docs/oci-manager/hardware.json new file mode 100644 index 00000000..8a60aa10 --- /dev/null +++ b/web/messages/it/docs/oci-manager/hardware.json @@ -0,0 +1,392 @@ +{ + "meta": { + "title": "Dispositivi e accelerazione | ProxMenux", + "description": "Come OCI manager Apps passa GPU, NVIDIA, Coral, USB, FUSE e altri dispositivi a un contenitore OCI come risorse native Proxmox VE convalidate." + }, + "header": { + "title": "Dispositivi e accelerazione", + "description": "I dispositivi GPU, NVIDIA, Coral, USB, FUSE e a blocchi diventano risorse native convalidate Proxmox VE del contenitore.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "principle", + "title": "Il dispositivo di cui l'applicazione ha bisogno, non l'intero host", + "blocks": [ + { + "p": "Un dispositivo richiesto dal file Compose o dal profilo dell’applicazione viene configurato come voce devN specifica o come montaggio LXC. Richiedere una GPU, un dispositivo USB o un acceleratore Coral non rende il container privilegiato." + }, + { + "flow": { + "nodes": [ + { + "label": "Inventario host", + "detail": "/dev/dri/renderD128\nGID 993 · Intel" + }, + { + "label": "ProxMenux", + "detail": "produttore e\npermessi verificati" + }, + { + "label": "LXC", + "detail": "stesso dispositivo\nGID effettivo" + } + ] + } + } + ] + }, + { + "id": "origin", + "title": "Da dove proviene la richiesta del dispositivo", + "blocks": [ + { + "table": { + "headers": [ + "Fonte", + "Cosa si legge", + "Cosa fa l'installatore" + ], + "rows": [ + [ + "Docker Compose", + "devices, group_add, deploy.resources e NVIDIA richieste", + "Ogni esigenza diventa una richiesta di dispositivo mostrata per la revisione" + ], + [ + "Profilo del catalogo", + "Il supporto effettivo dell’applicazione per GPU, Coral, OpenCL, USB o FUSE", + "Solo le opzioni convalidate per quell'immagine sono offerte" + ], + [ + "Metadati e documentazione dell’immagine", + "VA-API, Selkies, mod LinuxServer o runtime NVIDIA", + "Vengono aggiunte le variabili documentate e la preparazione" + ], + [ + "Selezione utente", + "CPU solo, Intel/AMD, OpenCL, NVIDIA o un dispositivo opzionale", + "La selezione viene memorizzata nel contratto di istanza" + ] + ] + } + }, + { + "calloutWarning": { + "title": "I dispositivi rilevati non vengono collegati automaticamente", + "body": "Viene creato un inventario dell’host, ma solo i dispositivi dichiarati dal file Compose o da un profilo compatibile sono offerti e allegati. Una GPU, USB dongle o Coral presente sull'host non è esposto ad ogni LXC." + } + } + ] + }, + { + "id": "identify", + "title": "Come viene identificato il dispositivo host", + "intro": "Prima della modifica del LXC, il dispositivo viene letto sull'host e abbinato al profilo scelto.", + "blocks": [ + { + "table": { + "headers": [ + "Tipo", + "Identità", + "Validazione" + ], + "rows": [ + [ + "Intel/AMD DRM", + "/dev/dri/renderD* e /sys/class/drm/NODE/device/vendor", + "Un dispositivo a caratteri con il fornitore 0x8086 (Intel) o 0x1002 (AMD)" + ], + [ + "AMD OpenCL", + "Il nodo di rendering, più /dev/kfd quando il profilo ne ha bisogno", + "Esistenza, tipo, fornitore, autorizzazioni e compatibilità dichiarata" + ], + [ + "AMD ROCm", + "Il nodo di rendering, /dev/kfd e la generazione indicata dal driver di calcolo in /sys/class/kfd/kfd/topology/nodes/*/properties", + "Una generazione per cui l’immagine ROCm dell’applicazione include kernel di calcolo — le GPU RDNA2 indicate e quelle più recenti — viene proposta così com’è. Le altre GPU di queste famiglie, come Radeon 680M e 780M, sono proposte come sperimentali e non sono mai preselezionate: ROCm non le supporta ufficialmente, l’applicazione le presenta come la generazione della rispettiva famiglia (HSA_OVERRIDE_GFX_VERSION) e l’installatore chiede conferma prima di scaricare l’immagine più grande. Una GPU precedente, come la grafica integrata di un Ryzen 5000U, non viene proposta e Immich mantiene il riconoscimento sulla CPU." + ], + [ + "NVIDIA", + "nvidia-smi e nvidia-container-cli", + "GPU, UUID, bus PCI, versione driver, Toolkit, nodi /dev/nvidia*, binari e librerie" + ], + [ + "Coral PCIe/M.2", + "/dev/apex_N e il suo collegamento in /sys/dev/char/MAJOR:MINOR", + "Nodo a caratteri, numeri major/minor, proprietario, GID e permessi" + ], + [ + "USB e seriale", + "/dev/ttyUSB*, /dev/ttyACM* o /dev/bus/usb/BBB/DDD", + "Nodo di carattere; per USB anche produttore, prodotto e seriale quando sysfs li pubblica" + ], + [ + "KVM, TUN, FUSE, video e SCSI generici", + "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN o /dev/sgN", + "Percorso supportato, tipo nodo e permessi effettivi" + ], + [ + "Unità ottica", + "/dev/srN", + "Un dispositivo a blocchi" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Cosa succede durante l'installazione", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Il modello offre i suoi profili", + "body": "Ad esempio solo CPU, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL o NVIDIA. Le opzioni appartengono all'immagine, non a un menu comune." + }, + { + "title": "Viene scelto un profilo", + "body": "Definisce i nodi del dispositivo, ambiente, mod o runtime di cui l'applicazione ha bisogno." + }, + { + "title": "Si propone un percorso", + "body": "Per DRM, /dev/dri/renderD128, che può essere modificato su un host con diversi nodi di rendering. Per USB o seriale, viene selezionato il nodo specifico." + }, + { + "title": "Validazione", + "body": "Esistenza, tipo, fornitore consentito, autorizzazioni e GID sono controllati. Un errore blocca l'operazione." + }, + { + "title": "Il contratto è scritto", + "body": "Percorso, modalità, GID, accesso scrittura e profilo sono registrati per aggiornamenti e ricreazioni." + }, + { + "title": "Collega e verifica", + "body": "pct set aggiunge l'ingresso devN e l'accesso viene quindi controllato all'interno del LXC. Le immagini LinuxServer vengono anche controllate come utente abc." + } + ] + } + } + ] + }, + { + "id": "config", + "title": "Come appare nella configurazione LXC", + "intro": "Valori illustrativi: dev0 e dev1 sono gli slot liberi assegnati da Proxmox VE; renderD128, apex_0 e il GID dipendono dall’hardware del nodo.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Intel/AMD VA-API", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" + }, + { + "title": "Coral PCIe/M.2", + "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "Un dispositivo USB specifico", + "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "AMD OpenCL", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" + } + ] + } + }, + { + "p": "Il GID è letto con stat sull'host e scritto all'ingresso devN; i gruppi render e video non si presume abbiano un numero fisso. Il dispositivo mantiene lo stesso percorso /dev all'interno del LXC, dove i propri meccanismi dell'applicazione lo cercano." + } + ] + }, + { + "id": "profiles", + "title": "Profili che un’immagine può offrire", + "blocks": [ + { + "table": { + "headers": [ + "Profilo", + "Configurazione risultante", + "Offerto quando" + ], + "rows": [ + [ + "Intel/AMD VA-API", + "Nodo di rendering /dev/dri", + "L'applicazione supporta l'accelerazione video" + ], + [ + "OpenCL", + "Nodo di rendering, /dev/kfd quando necessario e mod ufficiale", + "L'immagine o il profilo lo documentano" + ], + [ + "NVIDIA", + "Dispositivi driver e librerie dell'host", + "L’host dispone di un driver funzionante e di NVIDIA Container Toolkit" + ], + [ + "Coral", + "/dev/apex_0 o il bus USB", + "Il profilo dichiara il supporto Coral (Frigate)" + ], + [ + "USB, seriale, FUSE", + "Un singolo dispositivo, un albero convalidato o una funzione LXC", + "Il contratto lo chiede" + ] + ] + } + } + ] + }, + { + "id": "nvidia", + "title": "NVIDIA", + "blocks": [ + { + "calloutWarning": { + "title": "Requisito del nodo: NVIDIA Container Toolkit", + "body": "Un driver funzionante su Proxmox VE non è sufficiente per dare un NVIDIA GPU ad un'immagine OCI. OCI manager Apps utilizza nvidia-container-cli, dal NVIDIA Container Toolkit, per identificare i dispositivi e per ottenere i binari e le librerie che corrispondono al driver caricato." + } + }, + { + "p": "L’installatore NVIDIA di ProxMenux installa NVIDIA Container Toolkit dal repository ufficiale NVIDIA insieme al driver. Controlla i quattro pacchetti, convalida nvidia-container-cli e registra il risultato nel registro delle modifiche di Audit & Report." + }, + { + "p": "Questi due comandi sull'host mostrano se il driver e il Toolkit sono disponibili:" + }, + { + "shell": { + "code": "nvidia-smi -L\nnvidia-container-cli --version" + } + }, + { + "p": "Su un host dove il driver è stato installato con altri mezzi, il Toolkit è installato dal repository ufficiale stabile:" + }, + { + "shell": { + "code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools" + } + }, + { + "p": "L’inventario utilizzato da OCI manager Apps è l'output di:" + }, + { + "shell": { + "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" + } + }, + { + "calloutInfo": { + "title": "La configurazione di runtime Docker non è coinvolta", + "body": "I container sono LXC nativi e non usano un demone Docker, quindi nvidia-ctk runtime configure --runtime=docker non interviene: ProxMenux interroga direttamente nvidia-container-cli e configura dispositivi e montaggi LXC. I comandi e le piattaforme supportate sono mantenuti nella guida di installazione di NVIDIA Container Toolkit." + } + }, + { + "cards": { + "items": [ + { + "icon": "cpu", + "title": "Inventario dal driver", + "body": "nvidia-container-cli elenca i nodi del dispositivo, i binari, il firmware e le librerie del driver installato." + }, + { + "icon": "refresh", + "title": "Nessuna versione fissa", + "body": "Il modello non nomina i file della libreria. Il profilo viene generato dall'host corrente." + }, + { + "icon": "shield", + "title": "Montaggi in sola lettura", + "body": "Le librerie ospitanti sono montate in sola lettura invece di essere copiate nel contenitore." + }, + { + "icon": "hardDrive", + "title": "Modifiche dei driver", + "body": "Dopo che un driver cambia l'inventario viene generato nuovamente prima dell'avvio dei LXC colpiti." + } + ] + } + }, + { + "code": { + "title": "Risultati NVIDIA (semplificati)", + "code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0" + } + }, + { + "p": "Passare solo /dev/nvidia0 non è sufficiente. I componenti user-space del driver caricato sono montati in sola lettura e nvidia-smi poi funziona all'interno del LXC per confrontare GPU, UUID, PCI bus e versione con l'inventario host." + } + ] + }, + { + "id": "usb", + "title": "USB, seriale e USB Coral", + "blocks": [ + { + "calloutWarning": { + "title": "Numerazione USB può cambiare", + "body": "Un percorso come /dev/bus/usb/003/004 può cambiare quando il dispositivo viene ricollegato o l'host si riavvia. Il profilo registra il fornitore, il prodotto e la serie quando sono disponibili, ma un nuovo indirizzo del bus non viene rimappato automaticamente." + } + }, + { + "p": "Una periferica è data dal suo nodo specifico: /dev/ttyUSB0, /dev/ttyACM0, /dev/apex_0 o /dev/bus/usb/BBB/DDD. Passare l'intero /dev non è accettato. Coral è offerto solo a applicazioni il cui profilo lo dichiara." + } + ] + }, + { + "id": "trees", + "title": "Alberi dei dispositivi e funzionalità LXC", + "blocks": [ + { + "table": { + "headers": [ + "Richiesta", + "Configurazione risultante", + "Ambito" + ], + "rows": [ + [ + "/dev/dvb, /dev/snd o /dev/bus/usb", + "Ogni nodo di carattere dell'albero ottiene il proprio ingresso devN con la modalità host e GID", + "Solo l'albero richiesto, non il resto di /dev" + ], + [ + "/dev/fuse", + "Il nodo e, quando il profilo ne ha bisogno, la funzione fuse=1", + "FUSE da solo non rende disponibili i montaggi agli altri LXC" + ], + [ + "/dev/net/tun", + "Un ingresso devN nello stesso percorso all'interno del LXC", + "La configurazione VPN o di rete rimane nell’applicazione" + ], + [ + "/dev/kvm", + "Una voce valida devN", + "Offerto solo quando il contratto lo chiede" + ] + ] + } + } + ] + }, + { + "id": "security", + "title": "Conferma per livello di rischio", + "blocks": [ + { + "p": "Dispositivi concreti, privilegio facoltativo, privilegio richiesto, allentamento di AppArmor o seccomp e accesso al namespace PID host sono trattati come casi separati, non sotto una generica etichetta privilegiata. Ogni opzione con un rischio viene spiegata e confermata durante l'installazione." + } + ] + } + ] +} diff --git a/web/messages/it/docs/oci-manager/index.json b/web/messages/it/docs/oci-manager/index.json new file mode 100644 index 00000000..62358d6c --- /dev/null +++ b/web/messages/it/docs/oci-manager/index.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "OCI manager Apps | ProxMenux", + "description": "Esegui immagini OCI ufficiali come container LXC nativi di Proxmox VE, con dati persistenti, accesso ai dispositivi, applicazioni composte da più container e aggiornamenti transazionali." + }, + "header": { + "title": "OCI manager Apps", + "description": "Le immagini OCI ufficiali vengono eseguite come container LXC nativi di Proxmox VE. L’immagine rimane quella pubblicata dal manutentore; ProxMenux ricrea l’ambiente che Docker Compose avrebbe predisposto intorno ad essa.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "model", + "blocks": [ + { + "calloutInfo": { + "title": "Un’immagine OCI, un LXC nativo", + "body": "Nei container non viene eseguito Docker Engine. Proxmox VE importa il filesystem dell’immagine e i suoi metadati OCI. L’applicazione diventa il processo principale di un LXC nativo, gestito con gli stessi strumenti degli altri container del nodo." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Origine", + "detail": "Immagine OCI\nCompose e documentazione" + }, + { + "label": "ProxMenux", + "detail": "Contratto JSON\nvalidazione e pianificazione" + }, + { + "label": "Proxmox VE", + "detail": "LXC nativo\nvolumi e dispositivi" + } + ], + "caption": "Si usa l’applicazione originale: il suo ambiente viene descritto in modo dichiarativo e riprodotto." + } + } + ] + }, + { + "id": "where", + "title": "Dove si trova", + "intro": "Sul nodo Proxmox, come root, apri OCI manager Apps (Technology Preview) dal menu principale di ProxMenux. La prima schermata offre:", + "blocks": [ + { + "list": { + "items": [ + "Cerca applicazioni: cerca per nome nell’intero catalogo.", + "Tutte le applicazioni: mostra il catalogo completo e il numero di applicazioni.", + "Gestisci le applicazioni OCI installate: aggiorna, modifica, rimuovi o recupera le applicazioni già installate.", + "Account dei registri: gestisci gli account usati per installare e aggiornare immagini da registri privati.", + "Installa un’immagine non presente nel catalogo: adatta un file Compose, un comando docker run o un riferimento a un’immagine.", + "Le categorie del catalogo, ciascuna con il numero di applicazioni." + ] + } + }, + { + "figure": { + "src": "/oci-manager/main-menu.png", + "alt": "Schermata principale di OCI manager Apps con ricerca, catalogo completo, gestione delle applicazioni, immagini fuori catalogo e categorie.", + "caption": "Schermata principale di OCI manager Apps." + } + }, + { + "p": "Selezionando un’applicazione vengono mostrati la descrizione, l’immagine usata e due modalità di installazione. Installa con le impostazioni predefinite chiede solo le scelte essenziali: storage, posizione dei dati, indirizzo e avvio. Installa con le impostazioni avanzate presenta tutte le decisioni in ordine: VMID e risorse, storage per ogni percorso, bridge di rete e dispositivi." + }, + { + "p": "Le applicazioni provate sul campo mostrano Verificato in questa schermata e un ✓ negli elenchi, sia per i test del laboratorio ProxMenux sia per quelli della community." + } + ] + }, + { + "id": "beta", + "title": "Perché mantiene l’etichetta Technology Preview", + "blocks": [ + { + "p": "OCI manager Apps mantiene l’etichetta Technology Preview assegnata da Proxmox VE ai container applicativi creati da immagini OCI, il cui supporto è stato introdotto in Proxmox VE 9.1. L’etichetta riguarda la tecnologia su cui si basa OCI manager Apps, non il motore di ProxMenux: il comportamento di questi container può ancora cambiare tra le versioni di Proxmox VE. Rimarrà finché Proxmox VE non considererà stabile tale supporto." + }, + { + "p": "Il motore di OCI manager Apps viene testato nel laboratorio ProxMenux: installazione, aggiornamento, modifica, ricreazione, backup, ripristino, migrazione e watchdog. Ogni applicazione viene verificata separatamente. Quelle provate sul campo mostrano Verificato e un ✓ negli elenchi." + } + ] + }, + { + "id": "translation", + "title": "Come Docker descrive i requisiti e come li realizza OCI manager Apps", + "blocks": [ + { + "table": { + "headers": [ + "Requisito", + "Come lo esprime Docker", + "Come lo realizza OCI manager Apps" + ], + "rows": [ + [ + "Eseguire l’applicazione", + "image, entrypoint, command", + "Il rootfs OCI e il processo principale dell’LXC" + ], + [ + "Conservare la configurazione", + "volumes: /config", + "Un volume persistente mpN incluso nel backup, oppure una directory dell’host." + ], + [ + "Rendere accessibile il servizio", + "ports", + "Un indirizzo proprio per l’LXC e l’URL di accesso al servizio." + ], + [ + "Usare l’hardware", + "devices, group_add", + "Voci devN con il GID effettivo dell’host e un profilo validato." + ], + [ + "Collegare le dipendenze", + "networks, depends_on", + "Un bridge di rete privato, indirizzi fissi, ordine di avvio e controlli di stato." + ], + [ + "Aggiornare", + "Scaricare con pull e ricreare", + "Un nuovo rootfs che mantiene lo stesso contratto di persistenza." + ] + ] + } + } + ] + }, + { + "id": "kept", + "title": "Cosa viene conservato e cosa cambia", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Conservato", + "body": "L’immagine ufficiale, i percorsi interni, l’ambiente, il processo di avvio e la documentazione d’uso." + }, + { + "icon": "boxes", + "title": "Adattato", + "body": "L’ambiente di esecuzione: rete, persistenza, dispositivi, permessi e dipendenze utilizzano i meccanismi LXC nativi di Proxmox VE." + }, + { + "icon": "shield", + "title": "Senza equivalente", + "body": "Un’opzione Compose senza un equivalente sicuro viene segnalata come requisito bloccante. I modelli con requisiti bloccanti non vengono proposti per l’installazione e le opzioni sensibili richiedono conferma durante la procedura." + }, + { + "icon": "refresh", + "title": "Registrato", + "body": "Il digest dell’immagine, le risorse, i percorsi, la rete, i dispositivi e l’appartenenza a uno stack vengono salvati nel contratto dell’istanza. Aggiornamenti e ricreazioni riproducono tale contratto." + } + ] + } + } + ] + }, + { + "id": "pages", + "title": "Pagine di questa sezione", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Come viene adattata un’immagine OCI", + "href": "/docs/oci-manager/architecture", + "tail": "Dall’immagine e dal suo file Compose a un LXC nativo." + }, + { + "label": "Installare un’immagine non presente nel catalogo", + "href": "/docs/oci-manager/custom-image", + "tail": "Un file Compose, un comando docker run o un riferimento a un’immagine." + }, + { + "label": "Dati, percorsi e rete", + "href": "/docs/oci-manager/storage-network", + "tail": "Volumi del container, directory dell’host, mount con rclone e indirizzi." + }, + { + "label": "Dispositivi e accelerazione", + "href": "/docs/oci-manager/hardware", + "tail": "GPU, NVIDIA, Coral, USB e altri dispositivi." + }, + { + "label": "Applicazioni con più container", + "href": "/docs/oci-manager/stacks", + "tail": "Applicazione, database e cache in LXC coordinati." + }, + { + "label": "Installazione, aggiornamento e modifica", + "href": "/docs/oci-manager/lifecycle", + "tail": "Il contratto dell’istanza e le sue operazioni." + }, + { + "label": "In ProxMenux Monitor", + "href": "/docs/oci-manager/monitor", + "tail": "Versioni, aggiornamenti, output della console e terminale." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/oci-manager/lifecycle.json b/web/messages/it/docs/oci-manager/lifecycle.json new file mode 100644 index 00000000..a0271b28 --- /dev/null +++ b/web/messages/it/docs/oci-manager/lifecycle.json @@ -0,0 +1,499 @@ +{ + "meta": { + "title": "Installare, aggiornare e modificare | ProxMenux", + "description": "Il contratto di istanza di un contenitore OCI e le operazioni che lo utilizzano: aggiornamento, modifica, rimozione, recupero di un'operazione interrotta e recupero dopo un ripristino su questo o un altro host." + }, + "header": { + "title": "Installare, aggiornare e modificare", + "description": "Ogni istanza conserva un contratto riproducibile, così il suo rootfs può essere sostituito senza perdere la configurazione o i dati persistenti.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "contract", + "title": "Il contratto di istanza", + "blocks": [ + { + "p": "Dopo l'installazione, la configurazione effettiva viene salvata in /usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json. Non è una copia del file Compose originale: è il contratto riproducibile del LXC presente su questo host." + }, + { + "code": { + "code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle" + } + }, + { + "p": "Una copia del contratto si trova nel contenitore, in /.proxmenux/oci-record.json, ed è leggibile solo dall'utente root del contenitore. Il backup del contenitore include quindi sempre il contratto in uso in quel momento. Una seconda copia si trova in /etc/pve/priv/proxmenux/oci, condiviso da tutti i nodi del cluster e leggibile solo da root dell'host. Entrambe le copie vengono scritte dopo ogni installazione, aggiornamento e modifica." + } + ] + }, + { + "id": "manage", + "title": "Gestisci le applicazioni OCI installate", + "intro": "Questa opzione della schermata principale elenca le istanze registrate con la relativa applicazione e immagine. Prima di ogni azione, ciascuna istanza viene confrontata con il proprio contratto; un CT che non corrisponde più al proprio record non viene né modificato né eliminato. Lo stesso aggiornamento e lo stesso editor sono disponibili nella scheda Aggiornamenti di ProxMenux Monitor.", + "blocks": [ + { + "table": { + "headers": [ + "Opzione", + "Che cosa cambia", + "Che cosa viene conservato" + ], + "rows": [ + [ + "Aggiorna l’immagine mantenendo la configurazione salvata", + "Il rootfs viene sostituito dall'immagine attualmente pubblicata dal canale salvato", + "Contratto, dischi container, directory host, rete e dispositivi" + ], + [ + "Modifica risorse, rete, percorsi e GPU", + "L’editor si apre con il contratto attuale; il CT viene ricreato con le modifiche", + "I dati dei dischi container e delle directory host" + ], + [ + "Watchdog: riavviare l'applicazione quando si blocca", + "Determina se l'applicazione viene riavviata quando si arresta da sola. Non viene ricreato nulla", + "L'intera installazione; solo la scelta viene salvata nel contratto" + ], + [ + "Rimuovi: elimina l'applicazione e i suoi container", + "Il LXC, o ogni membro di uno stack, e i loro contratti vengono eliminati", + "Directory dell’host, con il loro contenuto" + ] + ] + } + }, + { + "p": "Per un'applicazione con più contenitori, il menu offre Aggiorna tutti i contenitori dell'applicazione, Modifica percorsi e dispositivi aggiuntivi, Ricrea tutti i contenitori con la configurazione salvata, il watchdog e la rimozione. Modifica aggiunge o rimuove percorsi e dispositivi aggiuntivi del contenitore applicativo senza ricreare nulla e, in Immich, cambia il componente che esegue il riconoscimento. Ricrea ricostruisce ogni contenitore dall'immagine usata per installarlo, senza cercarne una più recente." + }, + { + "figure": { + "src": "/oci-manager/manage-menu.png", + "alt": "Elenco delle applicazioni OCI installate e delle opzioni di aggiornamento, modifica e rimozione", + "caption": "Gestione delle applicazioni OCI installate." + } + } + ] + }, + { + "id": "update", + "title": "Un aggiornamento transazionale", + "blocks": [ + { + "mermaid": { + "chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end", + "labels": { + "user": "Utente", + "registry": "Registro OCI", + "update": "Aggiorna istanza", + "resolve": "Risolvere il tag", + "verify": "Verifica archivio e controlli preliminari", + "backup": "Arresta e salva un backup del CT", + "import": "Importa il nuovo rootfs", + "reapply": "Applicare nuovamente il contratto", + "healthy": "integro", + "failure": "guasto", + "commit": "Contratto pubblicato con il nuovo digest", + "restored": "Precedente istanza ripristinata" + } + } + }, + { + "list": { + "items": [ + "Se il registro restituisce ancora il digest installato, non viene scaricato nulla e l’istanza rimane invariata.", + "La nuova immagine viene verificata livello per livello prima di arrestare il CT. Un download danneggiato viene ripetuto una seconda volta; un’immagine già nella cache che non supera la verifica viene scaricata di nuovo.", + "Le impostazioni modificate in Proxmox VE dopo l’installazione (memoria, swap, core, limite e priorità della CPU, avvio con il nodo) vengono conservate e incluse nel nuovo contratto.", + "L'interfaccia LAN che la suite Arr e le applicazioni multi-container aggiungono (net1) e l'ordine di avvio (startup) sono restituiti al nuovo contenitore come sono.", + "Qualsiasi altra differenza tra il CT e il suo contratto interrompe l’aggiornamento prima che il CT venga arrestato." + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Prima", + "detail": "rootfs A\n/config mp0\ndirectory host /media" + }, + { + "label": "Aggiornamento", + "detail": "sostituisce solo\nil rootfs" + }, + { + "label": "Dopo", + "detail": "rootfs B\n/config mp0\ndirectory host /media" + } + ] + } + }, + { + "p": "Prima di arrestare qualsiasi cosa, l’operazione verifica lo spazio necessario al backup: i dati in uso nei volumi inclusi, più un margine. Il backup viene scritto accanto al record dell’applicazione, sul disco di sistema dell’host. Se lo spazio non basta, il menu richiede un altro storage dell’host che supporti i backup: il backup viene creato lì ed eliminato al termine dell’operazione. La scelta viene memorizzata per l’applicazione, anche per gli aggiornamenti pianificati. Se nessuno storage ha spazio sufficiente, l’operazione viene rifiutata e l’applicazione resta invariata. Anche lo spazio per la nuova immagine viene verificato prima del download." + } + ] + }, + { + "id": "recovery", + "title": "Recuperare un'operazione interrotta", + "intro": "L’aggiornamento e la modifica usano una transazione persistente. Se il processo, il terminale o il nodo subisce un’interruzione dopo l’arresto del CT, l’operazione non viene considerata conclusa.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Indicatore di operazione in sospeso", + "body": "Aprendo Gestisci le applicazioni OCI installate, lo stato salvato indica che la sostituzione non è mai stata pubblicata." + }, + { + "title": "Visualizza stato", + "body": "Mostra la fase raggiunta senza cambiare contenitori o dati." + }, + { + "title": "Ripristina l’installazione precedente", + "body": "Ripristina il backup nativo verificato eseguito prima della sostituzione e il contratto precedente." + }, + { + "title": "Stacks come unità", + "body": "Per un'applicazione multicontainer, ogni membro viene recuperato dallo stesso punto di transazione, non solo quello selezionato." + } + ] + } + }, + { + "calloutWarning": { + "title": "Le directory dell’host sono escluse dal rollback", + "body": "Il backup comprende il rootfs e i dischi del contenitore inclusi nella copia. Una directory dell’host non viene riportata allo stato precedente, perché altri LXC potrebbero usarne i dati." + } + } + ] + }, + { + "id": "watchdog", + "title": "Watchdog: riavviare un’applicazione che si arresta", + "intro": "Proxmox non ha una politica di riavvio: quando termina il processo di un contenitore applicativo, il contenitore resta arrestato. Con il watchdog attivo, un’applicazione che si arresta da sola viene riavviata. Per un’applicazione OCI svolge il ruolo di restart: unless-stopped in un file Compose.", + "blocks": [ + { + "table": { + "headers": [ + "Cosa succede?", + "Con il watchdog attivo" + ], + "rows": [ + [ + "L'applicazione si blocca o il suo processo termina", + "Il contenitore viene riavviato entro pochi secondi" + ], + [ + "Viene fermato o spento da Proxmox, dal Monitor o con pct", + "Resta arrestato finché qualcuno non lo avvia" + ], + [ + "Un backup, una migrazione o un'operazione ProxMenux sta lavorando su di esso", + "Niente è fatto fino a che non finisce" + ], + [ + "Era già arrestato all’avvio dell’host", + "Resta arrestato; lo decide Avvia con Proxmox" + ], + [ + "Continua ad arrestarsi subito dopo l’avvio", + "Per un’applicazione che si arresta pochi secondi dopo l’avvio o che non si avvia, vengono effettuati cinque tentativi, con attese di 30 secondi, 1, 2 e 5 minuti tra un tentativo e l’altro. Poi viene lasciata arrestata e viene inviata una notifica" + ] + ] + } + }, + { + "p": "L’installatore lo chiede in entrambe le modalità e propone il valore dichiarato nella ricetta dell’applicazione. In seguito si può cambiare da Gestisci le applicazioni OCI installate o con l’interruttore Watchdog del contenitore in ProxMenux Monitor; vale per tutti i contenitori di un’applicazione con più contenitori. Un unico servizio dell’host, proxmenux-oci-watchdog.service, sorveglia tutte le applicazioni che lo hanno richiesto; la sua installazione compare nella scheda Modifiche di Audit & Report." + }, + { + "calloutInfo": { + "title": "Ciò che l’host non può distinguere", + "body": "Il codice di uscita dell’applicazione non raggiunge l’host: un’uscita regolare e un arresto anomalo risultano quindi indistinguibili e in entrambi i casi l’applicazione viene riavviata, come con always e unless-stopped in Docker. Un arresto richiesto fuori da Proxmox, con lxc-stop o systemctl, non lascia un’attività di arresto e viene interpretato come un arresto spontaneo." + } + } + ] + }, + { + "id": "restore", + "title": "Backup, ripristino e un altro host", + "intro": "Un backup creato con vzdump o Proxmox Backup Server include il contenitore, i dischi del contenitore selezionati per il backup e la copia del suo contratto. Ciò che l’installazione conserva sull’host non vi è incluso. Gestisci le applicazioni OCI installate rileva i contenitori ripristinati su un host privo del loro contratto, dopo una nuova installazione di Proxmox o su un altro host, e propone di registrarli di nuovo.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Ripristinare i contenitori in Proxmox", + "body": "Dall'archivio di backup, con l'ID originale o con uno qualsiasi libero. Un'applicazione multi-container ha bisogno di tutti i suoi contenitori." + }, + { + "title": "Apri Gestisci applicazioni OCI installate", + "body": "Vengono elencati i contenitori ripristinati e viene proposto il recupero. Il pulsante Recupera nella scheda Aggiornamenti di ProxMenux Monitor apre lo stesso recupero." + }, + { + "title": "Controllare prima di cambiare", + "body": "Il recupero verifica che l’host disponga di tutto ciò che serve a ciascuna applicazione. Se un’applicazione non può essere recuperata interamente, viene lasciata invariata e viene indicato il motivo." + }, + { + "title": "Registra e avvia", + "body": "Il contratto viene registrato su questo host e gli elementi che l’installazione vi conservava vengono riscritti. L’avvio delle applicazioni viene chiesto separatamente: rispondi No se i contenitori originali sono ancora in esecuzione su un altro host." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/restore-offer.png", + "alt": "Finestra di dialogo che elenca i contenitori ripristinati e ne propone il recupero", + "caption": "Il recupero offerto quando si apre Gestione applicazioni OCI installate." + } + }, + { + "table": { + "headers": [ + "Ciò che l’host conservava", + "Dopo il recupero" + ], + "rows": [ + [ + "Contratto dell’istanza", + "Registrato dalla copia presente nel contenitore, verificata rispetto alla configurazione ripristinata da Proxmox" + ], + [ + "Rete privata di un'applicazione multicontainer", + "Creato nuovamente con lo stesso ponte e sottorete; gli indirizzi fissi dei contenitori non cambiano" + ], + [ + "Ordine di avvio di un’applicazione con più contenitori", + "L’hookscript delle dipendenze e il suo contratto vengono reinstallati; gli snippet vengono abilitati nello storage local se nessuno storage li supporta" + ], + [ + "Sysctl di rete e file del monitor dell’host", + "Scritto di nuovo in /etc/pve/proxmenux" + ], + [ + "Runtime NVIDIA", + "L’hook di un contenitore non privilegiato viene reinstallato. Un contenitore privilegiato riceve i file del driver di questo host al posto di quelli dell’host di origine" + ], + [ + "Montaggio Rclone", + "L’hookscript e i programmi che rendono disponibile il mount vengono riscritti, con le stesse viste sull’host" + ], + [ + "Regola del firewall host di un monitor host", + "Viene chiesto di nuovo, per la sua porta web e la sottorete del bridge su questo host" + ], + [ + "lost+found di ogni disco restaurato", + "Viene rimosso se vuoto; il ripristino lo crea e alcune applicazioni non si avviano se è presente tra i loro dati" + ], + [ + "Dischi ripristinati su un altro storage", + "Il contratto viene aggiornato con lo storage su cui si trovano ora" + ] + ] + } + }, + { + "p": "Un container ripristinato con un ID diverso conserva la propria applicazione. Il contratto, il log della console, i parametri sysctl di rete, lo hookscript del montaggio Rclone e l’ordine di avvio di un’applicazione composta da più container vengono registrati usando gli ID assegnati ai container su questo host." + }, + { + "table": { + "headers": [ + "Cosa ferma un recupero", + "Cosa fare" + ], + "rows": [ + [ + "Manca un contenitore di un'applicazione multi-container", + "Ripristina anche quello; l’applicazione viene recuperata per intero" + ], + [ + "La sottorete privata è già utilizzata su questo host", + "Il recupero è annullato e nulla è cambiato: gli indirizzi dei contenitori sono fissi e non vengono spostati in un'altra subnet" + ], + [ + "Una directory host non esiste", + "Montare o crearlo con i suoi dati; un backup del contenitore non include directory host" + ], + [ + "Un dispositivo non esiste su questo host", + "Collegarlo o rimuoverlo dal contenitore in Proxmox" + ], + [ + "Un'applicazione con NVIDIA su un host senza driver", + "Installa il driver NVIDIA e il Container Toolkit" + ], + [ + "Il backup è stato fatto prima che la copia del contratto esistesse", + "Il contenitore rimane come un normale LXC e non viene offerto di nuovo" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Un contenitore che ritorna", + "body": "Un contenitore ripristinato su se stesso da un backup precedente, riportato a uno snapshot o rientrato da un altro nodo porta il contratto dello stato in cui si trova. Se viene selezionato per un’operazione e il suo contratto differisce da quello dell’host, l’operazione non parte e viene proposto il recupero del contenitore." + } + }, + { + "figure": { + "src": "/oci-manager/restore-result.png", + "alt": "Risultato del recupero con la rete privata, l’ordine di avvio e i contenitori registrati", + "caption": "Il risultato di un recupero, passo dopo passo." + } + } + ] + }, + { + "id": "remove", + "title": "Rimozione di un'applicazione OCI", + "blocks": [ + { + "p": "Prima della conferma viene creato un riepilogo dalla configurazione effettiva: i contenitori da rimuovere, i dati eliminati insieme a loro, la rete privata liberata e le directory dell’host conservate. La conferma è impostata su No per impostazione predefinita, perché i dati dei dischi eliminati non possono essere recuperati in seguito." + }, + { + "table": { + "headers": [ + "Risorsa", + "Alla rimozione", + "Motivo" + ], + "rows": [ + [ + "rootfs e dischi del contenitore", + "Eliminati", + "Essi appartengono solo al contenitore" + ], + [ + "Directory host", + "Tenuto, con il suo contenuto", + "Altre applicazioni possono utilizzarlo" + ], + [ + "File host del contenitore", + "Eliminati", + "Il log della console, i parametri sysctl di rete, l’hookscript del mount Rclone e la registrazione nella scheda App di ProxMenux Monitor non servono ad altri contenitori" + ], + [ + "File condivisi da più installazioni", + "Eliminato con l'ultima installazione che li utilizza", + "Il file del monitor dell’host e l’hookscript delle dipendenze delle applicazioni con più contenitori" + ], + [ + "Contratto dell’istanza", + "Eliminato dopo una rimozione di successo", + "Non vi è più associato alcun CT" + ], + [ + "Ponte privato di una pila", + "Rilasciato con lo stack", + "Non ha più membri da collegare" + ], + [ + "Rete condivisa dalla suite Arr", + "Rilasciato con l'ultima applicazione della suite", + "Ogni applicazione della suite è indipendente e viene rimossa da sola" + ], + [ + "Un singolo membro di una pila", + "Non rimosso da solo", + "L'intera applicazione viene rimossa, quindi nessun stack viene lasciato incompleto" + ], + [ + "Un contenitore su un altro nodo del cluster", + "Non rimosso", + "I suoi file di registrazione e host sono sul nodo dove è stato installato: viene rimosso lì, dopo la migrazione indietro" + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/remove-summary.png", + "alt": "Riepilogo di rimozione con i container, i dati e le directory host interessate", + "caption": "Il sommario di rimozione, costruito dalla configurazione reale." + } + } + ] + }, + { + "id": "archives", + "title": "Immagini scaricate e spazio host", + "blocks": [ + { + "p": "L’archivio OCI serve a costruire il rootfs; il CT in esecuzione non lo legge. Dopo un’installazione o un aggiornamento, gli archivi scaricati durante l’operazione vengono elencati con le loro dimensioni e ne viene proposta l’eliminazione. Eliminarli libera spazio senza influire sul contenitore o sui suoi dati." + }, + { + "calloutInfo": { + "title": "Gli aggiornamenti non hanno bisogno dell'archivio", + "body": "Senza l'archivio, un aggiornamento risolve il canale salvato e scarica il nuovo digest. Con esso, un archivio viene riutilizzato solo quando il suo riferimento e l'integrità corrispondono a ciò che è richiesto." + } + } + ] + }, + { + "id": "registry", + "title": "Registro e pulizia", + "blocks": [ + { + "p": "Aprendo Gestisci le applicazioni OCI installate, vengono prima rimossi i resti dei contenitori che non esistono su alcun nodo del cluster: il record conservato come cronologia dopo l’eliminazione dall’interfaccia Proxmox e i file sull’host lasciati da una rimozione. Un record con un’operazione incompleta viene conservato, perché il relativo backup potrebbe ancora servire. Volumi e directory dell’host non vengono mai eliminati per deduzione." + } + ] + }, + { + "id": "cluster", + "title": "In un cluster: migrazione e elevata disponibilità", + "intro": "Un contenitore OCI è un normale LXC Proxmox: può essere migrato o gestito da HA come gli altri, con gli stessi limiti. Ciò che gli serve per avviarsi viene conservato dove ogni nodo del cluster può trovarlo.", + "blocks": [ + { + "table": { + "headers": [ + "Parte", + "Su un altro nodo del cluster" + ], + "rows": [ + [ + "Registro della console", + "Il contenitore crea /var/log/proxmenux/oci prima di avviarsi, su qualunque nodo lo esegua. Ogni nodo conserva il log degli avvii eseguiti su quel nodo." + ], + [ + "Sysctl di rete e monitor dell’host", + "Tenuto in /etc/pve/proxmenux, che ogni nodo del cluster condivide, quindi un contenitore migrato li trova." + ], + [ + "Dischi del contenitore", + "Proxmox li sposta con il contenitore. HA richiede che i dati siano disponibili sul nodo di destinazione tramite storage condiviso o una configurazione di replica supportata." + ], + [ + "directory e dispositivi host", + "Valgono le stesse regole degli altri LXC: una directory dell’host deve esistere sul nodo di destinazione ed essere contrassegnata come condivisa, e una GPU, un Coral o una NPU deve essere presente su quel nodo." + ], + [ + "Record ProxMenux", + "Il contratto resta sul nodo in cui l’applicazione è stata installata e ogni nodo legge la copia conservata in /etc/pve/priv/proxmenux/oci. Dopo la migrazione, un’applicazione con un solo contenitore viene registrata sul nodo di destinazione quando si apre Gestisci le applicazioni OCI installate o si avvia un’operazione su di essa. Per un’applicazione con più contenitori viene proposto il recupero, perché la rete privata deve essere creata su quel nodo." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Non per alta disponibilità", + "body": "Un'applicazione multicontainer raggiunge i suoi membri attraverso un ponte privato del nodo su cui è stato installato, quindi i suoi membri rimangono su quel nodo. Un monitor host, come Glances in modalità host o Netdata, monitora il nodo su cui corre; spostandolo monitorerebbe un altro nodo." + } + }, + { + "p": "Quando si recupera l’applicazione, un backup ripristinato fuori dal cluster riceve i file di /etc/pve/proxmenux usati dal contenitore." + } + ] + }, + { + "id": "channel", + "title": "Un rolling tag non è un aggiornamento incustodito", + "blocks": [ + { + "p": "Il catalogo installa il rolling tag pubblicato dal manutentore, ma il digest effettivo viene risolto e registrato e cambia solo con un aggiornamento esplicito, dotato di controlli preliminari e rollback. ProxMenux Monitor confronta il digest installato con quello pubblicato dal registro e segnala, anche con una notifica, la disponibilità di una nuova immagine." + } + ] + } + ] +} diff --git a/web/messages/it/docs/oci-manager/monitor.json b/web/messages/it/docs/oci-manager/monitor.json new file mode 100644 index 00000000..ca107f84 --- /dev/null +++ b/web/messages/it/docs/oci-manager/monitor.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "Contenitori OCI in ProxMenux Monitor | ProxMenux", + "description": "Ciò che ProxMenux Monitor mostra per un contenitore installato da OCI manager Apps: versioni di applicazione e immagine, nuove immagini, uscita console e terminale Proxmox VE." + }, + "header": { + "title": "In ProxMenux Monitor", + "description": "Un contenitore installato da OCI manager Apps appare in VMs & LXCs come qualsiasi altro LXC. Il suo modal legge il record di installazione: versioni di applicazione e immagine, nuove immagini, uscita console e terminale.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Il record è la fonte", + "body": "OCI manager Apps sa cosa ha installato e da dove viene. Il Monitor legge quel record di installazione invece di interrogare il container, quindi i dati sono gli stessi se il contenitore è in esecuzione o interrotto." + } + }, + { + "table": { + "headers": [ + "Scheda", + "Quali cambiamenti per un contenitore OCI" + ], + "rows": [ + [ + "Stato", + "Un commutatore Watchdog sotto Start al boot: l'applicazione viene riavviata quando si ferma da sola" + ], + [ + "App", + "L'applicazione è identificata dal record, e gli aggiornamenti sono tracciati dall'immagine" + ], + [ + "Aggiornamenti", + "L'immagine viene aggiornata o l'applicazione modificata, con lo stesso flusso del menu OCI" + ], + [ + "Montaggi", + "Dischi del container e directory dell’host, con il relativo utilizzo" + ], + [ + "Log", + "Solo per contenitori OCI: l'uscita della console dell'applicazione" + ] + ] + } + } + ] + }, + { + "id": "app", + "title": "App", + "intro": "La scheda App offre l'applicazione installata come rilevamento, con il nome, il logo, la porta e lo schema del record. Registrandolo si apre l'editor con il metodo Immagine OCI (installata da ProxMenux), che non ha bisogno di configurazione.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "boxes", + "title": "Applicazione", + "body": "La versione dell'applicazione all'interno dell'immagine, letta dall'immagine stessa: il suo ambiente o la sua etichetta org.opencontainers.image.version. È informativo." + }, + { + "icon": "archive", + "title": "Immagine", + "body": "La data di creazione e digest dell'immagine installata. L'aggiornamento si decide qui: il digest installato viene confrontato con quello che il registro pubblica oggi per lo stesso tag." + } + ] + } + }, + { + "list": { + "items": [ + "Quando il registro pubblica un nuovo digest, la scheda mostra Nuova immagine con la sua data e digest, anche se la versione dell'applicazione al suo interno non è cambiata: una ricostruzione su una base aggiornata è un aggiornamento.", + "Quando i digest coincidono, la scheda mostra Versione.", + "La scheda si collega al repository dell'immagine: il suo progetto GitHub, o la sua pagina Hub Docker per un'immagine ufficiale.", + "Il collegamento di accesso utilizza l'indirizzo LAN del contenitore, anche per il membro principale di un'applicazione multi-container, che ha un secondo indirizzo sulla sua rete privata.", + "Il pulsante Aggiorna dati rilegge il record dell’installazione e il registro delle immagini. Non vengono proposte opzioni per cercare o registrare altre applicazioni: il container contiene esattamente l’applicazione descritta nel suo record." + ] + } + }, + { + "figure": { + "src": "/oci-manager/monitor-app-tab.png", + "alt": "Scheda App di un contenitore OCI con la versione dell'applicazione, l'immagine e il link del repository", + "caption": "Scheda app di un contenitore installato da OCI manager Apps." + } + }, + { + "p": "Il controllo viene eseguito una volta al giorno con i controlli di aggiornamento del Monitor e Aggiorna dati lo esegue subito. Una nuova immagine viene inviata come notifica attraverso i canali configurati in Notifiche. L'aggiornamento viene applicato dalla scheda Aggiornamenti." + } + ] + }, + { + "id": "updates", + "title": "Aggiornamenti", + "intro": "Per un contenitore installato da OCI manager Apps la scheda Aggiornamenti mostra l'applicazione con la sua immagine installata e, quando il registro pubblica una, la nuova immagine, nello stesso formato di qualsiasi altra applicazione. Gli strumenti di aggiornamento di pacchetti e applicazioni di un normale LXC non appaiono.", + "blocks": [ + { + "table": { + "headers": [ + "Pulsante", + "Che cosa si apre" + ], + "rows": [ + [ + "Aggiornamento", + "L’aggiornamento di Gestisci applicazioni OCI installate per questo container, nel terminale di Monitor. Può essere eseguito anche senza una nuova immagine; in quel caso non cambia nulla. In un’applicazione composta da più container aggiorna tutti i membri." + ], + [ + "Modifica", + "L'editor dell'applicazione (risorse, rete, percorsi e GPU). In un'applicazione multi-container aggiunge o rimuove i percorsi e i dispositivi aggiuntivi del contenitore di applicazione e, in Immich, cambia ciò che esegue il riconoscimento." + ], + [ + "Recupera", + "Sostituisce l'aggiornamento quando un'operazione sul contenitore è stata interrotta e apre il suo recupero." + ], + [ + "Recupera (container ripristinato)", + "Mostrato per un container ripristinato da un backup che non ha un contratto su questo host, sotto Applicazione OCI ripristinata. Apre il recupero nel terminale di Monitor; Aggiorna e Modifica compaiono dopo la registrazione." + ] + ] + } + }, + { + "p": "Modifiche esterne, directory dell’host e applicazioni composte da più container vengono gestite come nel menu OCI. Per queste applicazioni, pulsanti e opzioni compaiono solo nel container principale. Gli altri membri mostrano la propria immagine, una nota che rimanda al principale per gli aggiornamenti e un pulsante per aprirlo. Alla chiusura del terminale vengono riletti l’immagine, il record e i montaggi." + }, + { + "table": { + "headers": [ + "Opzione", + "Comportamento" + ], + "rows": [ + [ + "Conserva il backup eseguito prima dell'aggiornamento", + "Ogni aggiornamento esegue il backup del container per ripristinarlo se l'aggiornamento non riesce. Con questa opzione, lo stesso backup viene mantenuto nello storage scelto e compare tra i backup del CT; su Proxmox Backup Server viene scritto un backup prima dell'aggiornamento." + ], + [ + "Aggiornamenti pianificati", + "L’immagine viene aggiornata all’ora scelta solo se il registro ne pubblica una nuova, con la possibilità di attendere che abbia 1, 3, 7 o 14 giorni. Un container modificato al di fuori di ProxMenux viene saltato e segnalato." + ] + ] + } + } + ] + }, + { + "id": "logs", + "title": "Log", + "intro": "La scheda Logs appare solo per i contenitori installati da OCI manager Apps, tra Mounts e Backups. Mostra l'uscita standard e l'errore del processo principale dell'immagine, la stessa uscita mostra docker logs per un contenitore Docker.", + "blocks": [ + { + "list": { + "items": [ + "L'output viene mantenuto sull'host in /var/log/proxmenux/oci/VMID.console.log (mode 0600), dal primo avvio e attraverso riavviamenti, in modo da poter essere letto con il contenitore fermato.", + "Il file viene ruotato a 10 MB, mantenendo tre copie compresse (/etc/logrotate.d/proxmenux-oci).", + "Ogni avvio del contenitore è contrassegnato nell'uscita. La scheda mostra l'output dall'ultimo avvio per impostazione predefinita; Cronologia completa mostra anche quelli precedenti.", + "Quando l'applicazione viene rimossa, la sua uscita viene rimossa con essa.", + "Vengono mostrate le ultime 100, 500 o 1000 righe. Mentre il container è in esecuzione, le nuove righe sono seguite in tempo reale; scorrere verso l’alto mette in pausa il seguito e Segui lo riprende.", + "Un filtro mostra solo le linee che contengono un testo e Scarica salva le linee caricate.", + "I codici a colori sono rimossi e una linea che una barra di avanzamento ridisegna è mostrata nel suo stato finale.", + "La scheda legge il file a ogni apertura; non usa una copia in cache." + ] + } + }, + { + "calloutInfo": { + "title": "credenziali di primo avviamento", + "body": "Le immagini che stampano una password generata sul loro primo inizio lo lasciano in questa uscita, come fa docker logs. L'installatore lo legge da lì per mostrarlo nel suo riassunto." + } + }, + { + "figure": { + "src": "/oci-manager/monitor-logs-tab.png", + "alt": "Scheda di log con l'uscita della console di un contenitore OCI, il selettore della linea, il filtro e il pulsante seguente", + "caption": "Uscita console di un contenitore OCI." + } + } + ] + }, + { + "id": "terminal", + "title": "Console Proxmox VE", + "blocks": [ + { + "p": "Un'immagine OCI esegue il proprio processo come PID 1 e nessun servizio di login, quindi la console predefinita di un LXC aprirebbe un terminale in cui nulla risponde. I contenitori installati da OCI manager Apps sono creati con cmode: shell: la console Proxmox VE apre una shell con lxc-attach, l'equivalente di docker exec, con l'applicazione in esecuzione intatta." + }, + { + "list": { + "items": [ + "La shell è quella assegnata a root nell’immagine da /etc/passwd. Se root non ha una shell o l’immagine non ne include alcuna, viene mantenuta la console predefinita.", + "La shell viene eseguita come root all'interno del contenitore, senza una password. Chi può aprirlo è deciso dal permesso VM.Console di Proxmox VE.", + "Il terminale del Monitor entra nel contenitore con pct enter, che funziona allo stesso modo." + ] + } + } + ] + }, + { + "id": "mounts", + "title": "Montaggi", + "blocks": [ + { + "p": "La scheda Mounts elenca i dischi container e le directory host del contenitore. L'uso di un disco contenitore su blocco di archiviazione come LVM-thin è letto dal filesystem del disco, che è montato solo all'interno del contenitore." + } + ] + } + ] +} diff --git a/web/messages/it/docs/oci-manager/stacks.json b/web/messages/it/docs/oci-manager/stacks.json new file mode 100644 index 00000000..78160aba --- /dev/null +++ b/web/messages/it/docs/oci-manager/stacks.json @@ -0,0 +1,404 @@ +{ + "meta": { + "title": "Applicazioni multicontainer | ProxMenux", + "description": "Come OCI manager Apps trasforma un'applicazione con il suo database e la cache in LXCs nativi coordinati: piano, rete privata, gancio di dipendenza, convalida e aggiornamenti transazionali." + }, + "header": { + "title": "Applicazioni con più container", + "description": "Un'applicazione con il suo database, la cache e altri servizi diventa diversi LXC nativi coordinati, installati e aggiornati come uno.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Un'applicazione per l'utente, diversi LXC per Proxmox VE", + "body": "Una definizione multi-container è una voce del catalogo. L'installatore crea un LXC nativo per servizio e mantiene esplicite le proprie dipendenze. Immich, Nextcloud, Paperless-ngx e Tandoor sono installati in questo modo." + } + }, + { + "mermaid": { + "chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}
{{appNet}}\"]\n O --> D[\"{{db}}
{{private}}\"]\n O --> R[\"{{cache}}
{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A", + "labels": { + "plan": "Piano di stack", + "app": "Applicazione LXC", + "appNet": "LAN + privato", + "db": "PostgreSQL LXC", + "cache": "Valkey LXC", + "private": "privato" + } + } + } + ] + }, + { + "id": "plan", + "title": "1. Il piano, prima che esista un contenitore", + "blocks": [ + { + "p": "Nessun LXC viene creato mentre la definizione Compose viene interpretata. Un piano completo arriva prima, con ogni membro, immagine, VMID, rete, percorso, segreto, ordine e controllo sanitario. Se il piano non è coerente, l'installazione non inizia." + }, + { + "table": { + "headers": [ + "Elemento di piano", + "Contenuto", + "Controllato prima di creare qualcosa" + ], + "rows": [ + [ + "Membri", + "Applicazione principale, database, cache, machine learning e altre dipendenze", + "VMID unici, ruoli noti e esattamente un membro principale" + ], + [ + "Immagini", + "Riferimento rolling, architettura e digest risolto di ogni servizio", + "Tutte esistono, supportano l’architettura e superano il controllo di integrità OCI" + ], + [ + "Rete", + "Ponte privato, subnet, indirizzo fisso per servizio e accesso LAN per il membro principale", + "Nessuna collisione con ponti o sottorete esistenti e nessun indirizzo ripetuto" + ], + [ + "Persistenza", + "Dischi dei container, directory dell’host, proprietari e backup", + "Nessun percorso sovrapposto, deposito disponibile e permessi dichiarati" + ], + [ + "Segreti", + "password del database, chiavi dell'applicazione e credenziali iniziali", + "Generati una volta e forniti solo ai membri che li usano" + ], + [ + "Ciclo di vita", + "Ordine di inizio, ordine di arresto e un controllo sanitario per membro", + "L'applicazione principale inizia l'ultima e si ferma prima" + ] + ] + } + } + ] + }, + { + "id": "create", + "title": "2. Creazione, membro per membro", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Prenota ogni VMID", + "body": "L'inventario Proxmox VE e il registro delle istanze sono controllati. Un CT esistente non è adottato e un contratto che appartiene ancora ad un'altra istanza non viene riutilizzato." + }, + { + "title": "Preparare ogni immagine", + "body": "Tutte le immagini vengono risolte, scaricate e verificate prima che venga creato il primo contenitore." + }, + { + "title": "Creare ogni rootfs", + "body": "I metadati OCI ufficiali sono importati, e l'identità di istanza ProxMenux e il ruolo membro sono aggiunti." + }, + { + "title": "Rete privata", + "body": "Viene creato un ponte e una subnet e ogni membro riceve il suo indirizzo fisso; solo il membro principale riceve anche l'interfaccia LAN." + }, + { + "title": "Persistenza", + "body": "Ogni database e configurazione ottiene il proprio disco contenitore; solo i dati destinati ad essere condivisi utilizzano directory host." + }, + { + "title": "Ambiente", + "body": "Vengono scritti endpoint interni, segreti condivisi e variabili di servizio. L'applicazione raggiunge le sue dipendenze nei loro indirizzi privati riservati." + }, + { + "title": "Registrazione", + "body": "Ogni membro registra la sua configurazione nativa, le modifiche rootfs che gli aggiornamenti devono riprodurre e la sua relazione con lo stack." + } + ] + } + } + ] + }, + { + "id": "checks", + "title": "3. Avviare e controllare ogni contenitore", + "intro": "Un LXC creato non significa un servizio pronto. Le dipendenze iniziano in ordine e ognuno passa un controllo specifico al suo servizio.", + "blocks": [ + { + "table": { + "headers": [ + "Servizio", + "Controllo", + "Cosa mostra" + ], + "rows": [ + [ + "PostgreSQL", + "pg_isready nel CT con l'host previsto, l'utente e il database", + "Il server accetta le connessioni per il database configurato" + ], + [ + "Redis / Valkey", + "redis-cli o valkey-cli PING contro il suo indirizzo privato", + "Il broker ascolta e risponde" + ], + [ + "Machine learning Immich", + "HTTP GET /ping, oltre a un controllo del runtime GPU selezionato", + "Il servizio risponde e l’accelerazione richiesta non è passata alla CPU" + ], + [ + "Nextcloud", + "GET /status.php con installed=true, maintenance=false e needsDbUpgrade=false", + "Inizializzazione terminata senza migrazione in sospeso" + ], + [ + "Paperless-ngx / Tandoor", + "HTTP sull'indirizzo LAN e vera porta del servizio", + "Il frontend e le sue dipendenze servono l'applicazione" + ], + [ + "Applicazione principale", + "Il punto finale del suo modello, ad esempio /api/server/ping in Immich", + "L'intero stack funziona attraverso l'applicazione che utilizza le dipendenze" + ] + ] + } + }, + { + "calloutWarning": { + "title": "In esecuzione non significa funzionante", + "body": "Lo stato in esecuzione dice solo che esiste il processo LXC. Se il servizio offre un controllo migliore, viene utilizzato un controllo exec o HTTP con un timeout. Se un membro si ferma o non supera la verifica, lo stack non viene dichiarato installato." + } + } + ] + }, + { + "id": "hook", + "title": "4. Il gancio di dipendenza", + "blocks": [ + { + "p": "Il gancio è impostato solo sul contenitore principale di uno stack dipendente. Proxmox VE mantiene lo script come snippet e lo gestisce come hookscript di quel CT. La ricetta dello stack non è scritta nello script: vive in un contratto privato separato." + }, + { + "codeGrid": { + "items": [ + { + "title": "Configurazione principale CT", + "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" + }, + { + "title": "Contratto privato (esempio)", + "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" + } + ] + } + }, + { + "snippet": { + "summary": "Fonte completa di proxmenux-stack-dependencies.sh", + "pathCode": "local:snippets/proxmenux-stack-dependencies.sh", + "snippetCode": "stackDependencyHook" + } + }, + { + "p": "Lo script è lo stesso per ogni stack. VMID, nomi, tipi di controllo e timeout provengono dal contratto privato /etc/pve/priv/proxmenux-stack-VMID.json di ogni stack." + }, + { + "steps": { + "items": [ + { + "title": "Proxmox VE chiama pre-start", + "body": "Prima dell'avvio principale di CT, il gancio viene eseguito con il VMID e la fase del ciclo di vita." + }, + { + "title": "Un blocco per stack", + "body": "flock su /run/lock/proxmenux-stack-VMID.lock previene due sequenze di avvio contemporaneamente." + }, + { + "title": "Il contratto viene letto e convalidato", + "body": "Uno schema noto, dipendenze numeriche, etichette, un exec, http o controllo in esecuzione e un timeout positivo sono necessari." + }, + { + "title": "Dipendenze in ordine", + "body": "Ogni CT deve esistere; se è fermo viene avviato, se è già in esecuzione non viene riavviato." + }, + { + "title": "Attendi che il servizio sia pronto", + "body": "Il controllo viene eseguito ogni due secondi, e il CT è confermato anche di essere ancora in esecuzione." + }, + { + "title": "Il principale CT inizia", + "body": "Quando ogni dipendenza è pronta, pre-start termina e Proxmox VE avvia l'applicazione." + } + ] + } + }, + { + "calloutInfo": { + "title": "Il gancio non ferma le dipendenze", + "body": "Le fasi post-start, pre-stop e post-stop non fanno nulla. Arrestare il CT principale lascia in esecuzione PostgreSQL, Redis, Valkey o il machine learning. L’hook ordina l’avvio; non trasforma diversi LXC in un unico processo." + } + }, + { + "table": { + "headers": [ + "Tipo", + "Esempio", + "Avvii successivi" + ], + "rows": [ + [ + "stack dipendente", + "Immich, Nextcloud, applicazione con PostgreSQL", + "L’hook del CT principale avvia le dipendenze e attende che siano pronte." + ], + [ + "Suite di applicazione", + "Suite Arr", + "Nessun membro principale: ogni LXC segue il proprio onboot" + ], + [ + "Applicazione singola", + "Jellyfin", + "Proxmox VE avvia direttamente LXC" + ] + ] + } + } + ] + }, + { + "id": "stack-checks", + "title": "5. Controlla sullo stack nel suo complesso", + "blocks": [ + { + "list": { + "items": [ + "Ogni VMID esiste, è unico e mantiene l'identità di istanza prevista.", + "Ogni contratto appartiene allo stesso stack, mantiene il suo ruolo e la sua configurazione nativa registrata.", + "Il membro principale è l’ultimo in start_order e il primo in stop_order.", + "Nessun membro, volume o adattamento rootfs manca.", + "Il gancio punta al snippet ufficiale, il suo contenuto è invariato e il suo contratto corrisponde alla ricetta stack.", + "Le immagini e i digest osservati corrispondono agli archivi OCI preparati.", + "Dispositivi, profili GPU, montaggi, segreti ed endpoint corrispondono ancora ai contratti.", + "Quando tutte le dipendenze superano i controlli, l’endpoint dell’applicazione principale verifica l’integrazione fra i membri." + ] + } + } + ] + }, + { + "id": "manage", + "title": "Gestione di uno stack installato", + "intro": "In Gestisci applicazioni OCI installate, qualsiasi membro porta all’intero stack. Il menu offre Aggiorna tutti i container dell’applicazione, Modifica percorsi e dispositivi aggiuntivi, Ricrea tutti i container con la configurazione salvata e Rimuovi: elimina l’applicazione e i suoi container. Ricrea ricostruisce ogni container dall’immagine originale tramite il digest salvato, senza cercarne una più recente, seguendo gli stessi passaggi di un aggiornamento. È disponibile per gli stack aggiornabili.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Qualsiasi membro", + "body": "Il contratto dei membri nomina il VMID principale e l'elenco completo dei membri." + }, + { + "title": "Lo stack è riproducibile", + "body": "Identità, contratti, gancio, adattamenti e una ripetizione coordinata per quella ricetta sono convalidati." + }, + { + "title": "Immagini prima", + "body": "L'applicazione non viene fermata fino a quando ogni digest è stato risolto, scaricato e verificato." + }, + { + "title": "Arresta i componenti e crea un backup dell'insieme", + "body": "I backup nativi verificati sono presi con lo stack fermato, quindi l'applicazione e i database appartengono allo stesso momento." + }, + { + "title": "Aggiornare e controllare ogni membro", + "body": "Adattamento, rete, montaggi, segreti e dispositivi vengono applicati nuovamente prima del controllo di integrità di ciascun membro." + }, + { + "title": "Pubblica o recupera tutto", + "body": "I nuovi contratti sono pubblicati solo quando ogni membro passa. Se uno fallisce, ogni membro viene ripristinato." + } + ] + } + }, + { + "table": { + "headers": [ + "Modifica", + "Quali cambiamenti", + "Cosa viene conservato" + ], + "rows": [ + [ + "Percorsi e dispositivi aggiuntivi", + "Vengono aggiunti o rimossi dal contenitore di applicazione, che si riavvia. Nulla è ricostruito", + "I dati dell'applicazione, il suo database e gli altri contenitori" + ], + [ + "Che cosa esegue il riconoscimento (Immich)", + "Il contenitore di apprendimento automatico prende l'immagine e i dispositivi del CPU o di un GPU dell'host. L'intera applicazione viene interrotta e aggiornata, come in un aggiornamento", + "La cache del modello, la libreria e il database. Se qualcosa fallisce, i contenitori precedenti e la scelta precedente vengono ripristinati" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Una pila senza un replay coordinato non è aggiornata", + "body": "Se la preparazione di uno stack non può essere riprodotta, l'aggiornamento viene rifiutato prima che lo stack venga interrotto. L'applicazione continua a funzionare come è." + } + } + ] + }, + { + "id": "failure", + "title": "6. Quando qualcosa fallisce", + "blocks": [ + { + "p": "Durante un'installazione, un errore si ferma e rimuove i contenitori incompleti che l'operazione ha creato, e il ponte privato se l'operazione l'ha creata. Una pila non viene pubblicata come valida fino al termine dell'intera sequenza." + }, + { + "p": "Un aggiornamento è transazionale: tutte le immagini sono preparate prima, poi lo stack si ferma, viene eseguito e verificato il backup di ogni membro, e solo allora è sostituito ogni rootfs. I membri iniziano uno per uno con il loro controllo sanitario; se uno fallisce, ogni membro viene ripristinato dalla stessa serie di backup, quindi il database e l'applicazione non appartengono mai a momenti diversi." + }, + { + "mermaid": { + "chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]", + "labels": { + "prepare": "Preparare ogni immagine", + "stop": "Stop, primo membro principale", + "backup": "Backup verificato di ogni CT", + "replace": "Sostituisci il rootfs", + "healthy": "Tutti funzionanti?", + "yes": "Sì", + "no": "No", + "commit": "Pubblica i contratti", + "rollback": "Ripristinare ogni membro" + } + } + } + ] + }, + { + "id": "not-assumed", + "title": "Che cosa uno stack non include", + "blocks": [ + { + "list": { + "items": [ + "Una suite installata in un unico flusso, come la suite Arr, non è uno stack dipendente: i suoi contenitori non hanno ordine di partenza tra di loro.", + "La rete privata non sostituisce l'autenticazione, TLS o la configurazione di ogni applicazione.", + "Il backup di un LXC non contiene il ponte, il gancio o i contratti del resto dello stack.", + "Prowlarr, Sonarr o Radarr non ricevono indici, profili o fornitori da ProxMenux." + ] + } + } + ] + } + ] +} diff --git a/web/messages/it/docs/oci-manager/storage-network.json b/web/messages/it/docs/oci-manager/storage-network.json new file mode 100644 index 00000000..60b32b16 --- /dev/null +++ b/web/messages/it/docs/oci-manager/storage-network.json @@ -0,0 +1,305 @@ +{ + "meta": { + "title": "Dati, percorsi e rete | ProxMenux", + "description": "Come OCI manager Apps conserva i dati di un container OCI: dischi del container, directory dell’host, mount con rclone, indirizzi e reti private." + }, + "header": { + "title": "Dati, percorsi e rete", + "description": "Cosa risiede nel rootfs, cosa viene conservato quando lo si sostituisce, come si condividono i dati tra container e come ciascuno ottiene il proprio indirizzo.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "La persistenza si decide prima di creare l’LXC", + "body": "I volumi dichiarati dall’immagine e dal suo file Compose vengono letti prima di creare il container. Ogni percorso da conservare dopo un aggiornamento diventa un punto di mount indipendente dal rootfs. In questo modo, il rootfs contiene solo ciò che appartiene all’immagine e può essere sostituito." + } + } + ] + }, + { + "id": "questions", + "title": "Cosa chiede l’installer", + "intro": "Il modello fornisce i percorsi necessari all’applicazione. Ciascuno viene collocato su un disco del container o in una directory dell’host; prima del riepilogo si possono aggiungere altri percorsi.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Percorsi necessari", + "body": "Vengono elencati /config, /data, librerie, download e tutti i volumi dichiarati dall’applicazione." + }, + { + "title": "Posizione", + "body": "Ogni percorso viene collocato su un disco del container o in una directory già esistente sull’host." + }, + { + "title": "Storage e dimensione", + "body": "Viene creato un disco del container su uno storage Proxmox VE con la dimensione indicata. L’installazione predefinita usa local-lvm; quella avanzata chiede lo storage di ogni percorso subito prima della dimensione e propone quello del rootfs. Il disco appare come vm-VMID-disk-N e viene collegato come mpN." + }, + { + "title": "Directory dell’host", + "body": "La directory dell’host viene indicata tramite il suo percorso. Se non esiste, viene creata e assegnata all’utente dell’host a cui viene mappato quello del container." + }, + { + "title": "Percorsi aggiuntivi", + "body": "Prima dell’installazione si possono aggiungere altre coppie formate da un percorso o volume dell’host e dal relativo percorso nel container." + }, + { + "title": "Riepilogo", + "body": "La mappatura completa viene mostrata prima della creazione del CT e salvata nel contratto dell’istanza." + } + ] + } + } + ] + }, + { + "id": "options", + "title": "Le due posizioni persistenti", + "blocks": [ + { + "table": { + "headers": [ + "Proprietà", + "Disco del container", + "Directory dell’host" + ], + "rows": [ + [ + "Nella configurazione", + "mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G", + "mpN: /mnt/oci-shared/media,mp=/data/media" + ], + [ + "Backup del container (vzdump)", + "Incluso con backup=1", + "Non incluso" + ], + [ + "Dimensione", + "Fissa; si aumenta ridimensionando il punto di mount", + "Lo spazio libero del filesystem o del dataset dell’host" + ], + [ + "Altri container", + "Montato solo dal container a cui appartiene", + "La stessa directory può essere montata in più container" + ], + [ + "Snapshot e ripristino", + "Gestiti da Proxmox VE insieme al CT", + "Gestiti sullo storage dell’host" + ], + [ + "Rimozione dell’applicazione", + "Eliminato con il container", + "Conservato con il suo contenuto" + ], + [ + "Spostamento del CT su un altro nodo", + "Si sposta con il CT", + "Lo stesso percorso deve esistere sull’altro nodo" + ] + ] + } + }, + { + "p": "Il rootfs è riservato ai binari e al contenuto dell’immagine. Un aggiornamento o una ricreazione lo sostituisce senza toccare nessuno dei due tipi di punto di mount." + } + ] + }, + { + "id": "example", + "title": "Esempio: un container con entrambe le posizioni", + "blocks": [ + { + "code": { + "title": "Jellyfin installato come CT 151 su local-lvm (estratto)", + "code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media" + } + }, + { + "p": "Un aggiornamento o una ricreazione sostituisce solo il rootfs: mp0 conserva utenti, librerie e impostazioni, mentre mp1 continua a mostrare gli stessi contenuti multimediali. Il ripristino del backup del CT recupera /config; se necessario, la directory dei contenuti multimediali viene ripristinata dal backup dello storage dell’host." + }, + { + "flow": { + "nodes": [ + { + "label": "Contratto", + "detail": "/config" + }, + { + "label": "Posizione", + "detail": "Disco del container\no directory dell’host" + }, + { + "label": "LXC", + "detail": "Sempre /config\nper l’applicazione" + } + ], + "caption": "L’applicazione vede il percorso dichiarato dall’immagine; cambia solo dove viene memorizzato." + } + } + ] + }, + { + "id": "shared", + "title": "Una directory dell’host, più container", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart TB\n H[\"{{host}}
/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent
/data\"]\n H --> J[\"Jellyfin
/data\"]\n H --> R[\"Radarr / Sonarr
/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]", + "labels": { + "host": "Directory dell’host", + "config": "Configurazione propria" + } + } + }, + { + "p": "Ogni container conserva la propria configurazione sul suo disco. La libreria o i download si trovano in un’unica directory dell’host, montata nello stesso percorso interno in tutti i container. Così il percorso in cui scrive un’applicazione è lo stesso da cui legge un’altra." + } + ] + }, + { + "id": "rclone", + "title": "Storage cloud tramite l’applicazione rclone", + "intro": "Oltre all’installazione, la scheda di rclone nel catalogo offre Abilita un mount in un container OCI rclone esistente. Viene montato un remote già creato e autorizzato nell’interfaccia web di rclone, che viene poi reso disponibile sull’host. Gli altri container possono usarlo come una directory dell’host.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Container e remote", + "body": "Il VMID del container rclone, il nome esatto del remote e, facoltativamente, un percorso al suo interno." + }, + { + "title": "Nome del mount e cache", + "body": "Il nome del mount e la modalità della cache VFS: off, minimal, writes o full (predefinita)." + }, + { + "title": "Viste pubblicate", + "body": "Una radice comune, /mnt/oci-shared per impostazione predefinita, contiene una vista in lettura e scrittura in /mnt/oci-shared/remotes/NAME e una in sola lettura in /mnt/oci-shared/remotes-ro/NAME." + }, + { + "title": "Attivazione", + "body": "Dopo la conferma, il CT viene arrestato, vengono configurati il suo comando di avvio e un hookscript di Proxmox VE, quindi viene riavviato. L’operazione attende che entrambe le viste siano montate sull’host." + } + ] + } + }, + { + "calloutInfo": { + "title": "Se il mount non viene attivato", + "body": "Viene ripristinata la configurazione precedente del container, che viene quindi riavviato. In questo modo, se l’attivazione fallisce, rclone resta com’era." + } + } + ] + }, + { + "id": "network", + "title": "Indirizzi e reti", + "intro": "Un’applicazione con un solo container ha bisogno di un indirizzo. Un’applicazione con più container richiede anche una rete stabile tra i suoi componenti.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "network", + "title": "Applicazione con un solo container", + "body": "Si sceglie il bridge di rete e si imposta DHCP oppure un indirizzo fisso in formato CIDR. L’LXC ha un proprio indirizzo e il riepilogo mostra gli URL completi dei servizi." + }, + { + "icon": "waypoints", + "title": "Applicazione con più container", + "body": "Viene individuata una sottorete libera e creato un bridge privato persistente. Ogni componente — applicazione, database e cache — riceve un indirizzo fisso su quella rete." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "LAN", + "detail": "Indirizzo raggiungibile\nsolo per il servizio principale" + }, + { + "label": "LXC principale", + "detail": "Web / API\nLAN + rete privata" + }, + { + "label": "Rete privata", + "detail": "PostgreSQL · Valkey · ML\nindirizzi fissi" + } + ], + "caption": "Le dipendenze comunicano sulla rete privata e non hanno un indirizzo sulla LAN." + } + }, + { + "p": "Il contratto dello stack conserva bridge, sottorete, indirizzi e relazioni tra i servizi. L’aggiornamento dell’applicazione riutilizza la stessa topologia per tutti i componenti. ProxMenux Monitor apre il container principale al suo indirizzo LAN, non a quello della rete privata." + } + ] + }, + { + "id": "ownership", + "title": "Proprietà di file e directory", + "blocks": [ + { + "list": { + "items": [ + "Le nuove directory vengono create con UID e GID a cui viene mappato l’LXC non privilegiato.", + "Il proprietario delle directory esistenti non viene modificato ricorsivamente.", + "Socket, file di sistema e percorsi sensibili non vengono proposti come directory generiche dell’host." + ] + } + } + ] + }, + { + "id": "backup", + "title": "Cosa contiene un backup del container", + "blocks": [ + { + "table": { + "headers": [ + "Elemento", + "Nel backup vzdump del CT", + "Dove viene conservato" + ], + "rows": [ + [ + "Rootfs OCI", + "Sì", + "Nel backup del CT; può anche essere ricreato dall’immagine e dal contratto" + ], + [ + "Disco del container con backup=1", + "Sì", + "Il backup del CT" + ], + [ + "Directory dell’host", + "No", + "Il backup dello storage dell’host" + ], + [ + "Contratto dell’istanza", + "Sì, la copia conservata nel CT", + "/.proxmenux/oci-record.json nel CT; le copie aggiuntive dell’host e del cluster sono conservate separatamente" + ], + [ + "Applicazione con più container", + "Ogni componente nel proprio backup", + "I backup di tutti i componenti, più il contratto dello stack e il suo bridge di rete sull’host" + ] + ] + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/oci-manager/architecture.json b/web/messages/pt/docs/oci-manager/architecture.json new file mode 100644 index 00000000..3e6229c5 --- /dev/null +++ b/web/messages/pt/docs/oci-manager/architecture.json @@ -0,0 +1,171 @@ +{ + "meta": { + "title": "Como é adaptada uma imagem OCI | ProxMenux", + "description": "Do repositório da imagem e do respetivo ficheiro Compose a um modelo que pode ser revisto, um plano de implementação e um LXC nativo do Proxmox VE, sem Docker no seu interior." + }, + "header": { + "title": "Como é adaptada uma imagem OCI", + "description": "Do repositório da imagem e do respetivo ficheiro Compose a um modelo que pode ser revisto, um plano de implementação e um LXC nativo, sem instalar Docker no seu interior.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "pipeline", + "title": "O processo de adaptação", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]", + "labels": { + "repo": "Repositório da imagem", + "converter": "Conversor", + "template": "Modelo JSON", + "blockers": "Sem impedimentos?", + "no": "Não", + "yes": "Sim", + "review": "Revisão / overlay", + "plan": "Plano de implementação", + "lxc": "LXC nativo" + } + } + }, + { + "p": "O conversor lê a imagem e o ficheiro Compose publicados pelo projeto e gera um modelo JSON. Se houver requisitos ainda não adaptados que impeçam a instalação, o modelo é revisto antes de ser publicado no catálogo. Um ficheiro de ajustes revistos, chamado overlay, resolve esses impedimentos. Só os modelos sem impedimentos pendentes são propostos para instalação." + } + ] + }, + { + "id": "template", + "title": "O que o modelo preserva", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Identidade da imagem", + "body": "Repositório, tag de atualização contínua, arquitetura, digest resolvido e revisão de origem." + }, + { + "icon": "braces", + "title": "Contrato do contentor", + "body": "Entrypoint, Cmd, ambiente, utilizador, diretório de trabalho, sinal de paragem, portas e volumes." + }, + { + "icon": "layers", + "title": "Adaptação ao Proxmox VE", + "body": "Recursos, segurança, pontos de montagem, dispositivos, sysctls, verificações de estado e as adaptações necessárias em cada caso, com a respetiva justificação." + }, + { + "icon": "shield", + "title": "Compatibilidade", + "body": "Chaves suportadas, requisitos por adaptar que impedem a instalação e estado de cada validação." + } + ] + } + } + ] + }, + { + "id": "sources", + "title": "O OCI fornece o processo; o Compose fornece o ambiente", + "blocks": [ + { + "table": { + "headers": [ + "Origem", + "Exemplo", + "Resultado nativo" + ], + "rows": [ + [ + "Metadados OCI", + "Entrypoint, Cmd, User", + "O Proxmox VE importa-os ao criar o CT" + ], + [ + "Docker Compose", + "environment, volumes, devices", + "Entradas de ambiente LXC, mpN e devN" + ], + [ + "Perfil do ProxMenux", + "GPU, verificação de estado, credenciais", + "Perguntas e adaptações revistas" + ], + [ + "Utilizador", + "VMID, armazenamento, rede", + "O contrato da instância" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "O que acontece durante a instalação", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Resolver a referência", + "body": "O registo é consultado, a arquitetura do host é selecionada e é fixado o digest exato para o qual aponta a tag de atualização contínua." + }, + { + "title": "Descarregar e verificar", + "body": "O Skopeo descarrega a imagem como um arquivo OCI. Antes de criar qualquer recurso, cada camada é verificada através do respetivo digest e descomprimida. Se a descarga estiver danificada, é repetida uma vez antes de a instalação ser interrompida." + }, + { + "title": "Criar o sistema de ficheiros", + "body": "O pct create cria o rootfs a partir do arquivo e preserva os metadados oficiais do processo da imagem." + }, + { + "title": "Ligar os recursos", + "body": "São aplicados os volumes, a rede, o ambiente, os dispositivos e os perfis de segurança declarados." + }, + { + "title": "Consola", + "body": "A saída da consola do contentor é guardada no host. A consola do Proxmox VE abre uma shell se a imagem incluir uma." + }, + { + "title": "Verificar", + "body": "No primeiro arranque, aguarda-se que o contentor tenha um endereço e que o serviço responda. Em caso de falha, a instalação não é apresentada como concluída com sucesso." + }, + { + "title": "Registar a configuração", + "body": "A configuração efetiva é guardada no contrato da instância utilizado nas atualizações e recriações." + } + ] + } + } + ] + }, + { + "id": "example", + "title": "Exemplo: uma imagem com /config e /downloads", + "intro": "Uma definição Compose habitual e a configuração do Proxmox VE que dela resulta. Os caminhos esperados pela aplicação não mudam.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Docker Compose", + "code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080" + }, + { + "title": "/etc/pve/lxc/VMID.conf (excerto)", + "code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000" + } + ] + } + }, + { + "p": "O mp0 é um segundo disco pertencente ao contentor, com o nome vm-VMID-disk-N no armazenamento selecionado. É montado em /config e, com backup=1, incluído na cópia de segurança do contentor. O mp1 não cria um disco: monta o diretório do host /srv/downloads em /downloads dentro do LXC. A porta 8080 não é mapeada: o LXC tem um endereço próprio e o serviço responde nesse endereço." + } + ] + } + ] +} diff --git a/web/messages/pt/docs/oci-manager/custom-image.json b/web/messages/pt/docs/oci-manager/custom-image.json new file mode 100644 index 00000000..d8fc1551 --- /dev/null +++ b/web/messages/pt/docs/oci-manager/custom-image.json @@ -0,0 +1,278 @@ +{ + "meta": { + "title": "Instalar uma imagem fora do catálogo | ProxMenux", + "description": "Adapte uma imagem OCI a partir de um ficheiro Compose, de um URL, de um comando docker run ou de uma referência de imagem e reveja o que o ProxMenux consegue reproduzir antes de a instalar." + }, + "header": { + "title": "Instalar uma imagem fora do catálogo", + "description": "A sua imagem é adaptada a partir do ficheiro Compose, de um comando docker run ou apenas da referência. O resultado é apresentado para revisão antes de criar qualquer LXC.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "O mesmo conversor e o mesmo instalador", + "body": "A opção Instalar uma imagem fora do catálogo utiliza o mesmo conversor e instalador dos modelos do catálogo. A diferença é que o contrato é gerado nesse momento a partir da definição fornecida e validado antes de criar qualquer LXC." + } + } + ] + }, + { + "id": "sources", + "title": "Como é descrita a imagem", + "intro": "O primeiro ecrã pergunta como é descrita a imagem. Quatro opções recebem uma definição a adaptar, uma quinta utiliza apenas o nome da imagem e outras três leem um oci-compose já escrito.", + "blocks": [ + { + "table": { + "headers": [ + "Opção", + "O que é lido" + ], + "rows": [ + [ + "Colar o ficheiro Compose no terminal", + "Cole o conteúdo YAML no terminal e termine com Ctrl+D." + ], + [ + "Ler o ficheiro Compose deste host", + "Um caminho no nó, /root/docker-compose.yml por predefinição. O ficheiro tem de existir e não ultrapassar 256 KiB." + ], + [ + "Descarregar o ficheiro Compose de um endereço", + "Um endereço http:// ou https:// que disponibilize o YAML em bruto. São descarregados no máximo 256 KiB." + ], + [ + "Colar o comando docker run no terminal", + "O comando publicado pelo projeto. São adaptadas as portas, o ambiente, os volumes, os dispositivos, as capabilities, o utilizador, a memória partilhada e as restantes opções suportadas." + ], + [ + "Apenas a referência da imagem, sem ficheiro Compose", + "Uma referência como ghcr.io/user/application:latest. O registo é consultado e os metadados OCI da imagem são preservados." + ], + [ + "Colar um oci-compose no terminal", + "Cole o JSON no terminal e termine com Ctrl+D. Não é convertido: é validado e instalado tal como está escrito." + ], + [ + "Ler um oci-compose deste host", + "Um ficheiro JSON no nó, /root/oci-compose.json por predefinição, com um máximo de 2 MiB." + ], + [ + "Descarregar um oci-compose de um endereço", + "Um endereço http:// ou https:// que disponibilize o ficheiro JSON. São descarregados no máximo 2 MiB." + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-source-menu.png", + "alt": "Menu para escolher como descrever uma imagem fora do catálogo", + "caption": "Formas de descrever uma imagem fora do catálogo." + } + } + ] + }, + { + "id": "reference-only", + "title": "O que fornece apenas a referência da imagem", + "intro": "A imagem contém os metadados do seu processo, mas não todo o ambiente que um ficheiro Compose costuma acrescentar.", + "blocks": [ + { + "table": { + "headers": [ + "Lido da imagem", + "Ausente da imagem", + "Consequência" + ], + "rows": [ + [ + "Entrypoint, Cmd, User, WorkingDir e o ambiente incorporado", + "Variáveis presentes apenas na documentação", + "São acrescentadas na instalação ou em Modificar" + ], + [ + "Volumes declarados pela imagem", + "Diretórios do host indicados apenas no ficheiro Compose", + "Os caminhos adicionais são acrescentados antes da instalação" + ], + [ + "Portas EXPOSE", + "O URL, o protocolo ou a verificação funcional do serviço", + "São confirmados a porta e o método de verificação do serviço" + ], + [ + "Arquiteturas e digest no registo", + "Dispositivos, privilégios ou dependências externas", + "Não são ativados sem uma definição que os solicite" + ] + ] + } + } + ] + }, + { + "id": "review", + "title": "Rever antes de instalar", + "intro": "Após adaptar a definição, o ProxMenux apresenta como a interpretou antes de perguntar o VMID, os recursos ou o armazenamento.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Analisar", + "body": "São lidos os serviços, a imagem, as portas, os caminhos, o ambiente, os dispositivos, a segurança e a verificação de estado." + }, + { + "title": "Consultar o registo", + "body": "A imagem tem de existir no registo e são apresentadas as arquiteturas publicadas. Um registo privado é consultado com a conta guardada para ele." + }, + { + "title": "Listar o que não é aplicado", + "body": "São listados os labels, as redes Docker, as definições Swarm e outras chaves sem efeito num LXC." + }, + { + "title": "Bloquear opções sem equivalente seguro", + "body": "As chaves sem equivalente seguro aparecem em Opções sem equivalente e impedem a continuação da instalação. Nenhuma é descartada sem aviso." + }, + { + "title": "Pedir segredos", + "body": "As variáveis cujo nome indica uma palavra-passe, token ou chave são pedidas como dados sensíveis durante a instalação." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-review.png", + "alt": "Resumo da interpretação do ficheiro Compose pelo ProxMenux", + "caption": "Resumo apresentado antes de o instalador perguntar o VMID e os recursos." + } + }, + { + "p": "Após aceitar o resumo, segue-se o mesmo assistente do catálogo: nome, modo predefinido ou avançado, VMID, CPU, memória, rede, arranque com o nó, caminhos persistentes e adicionais, dispositivos compatíveis e resumo final." + } + ] + }, + { + "id": "examples", + "title": "Exemplos de entrada", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Compose", + "code": "services:\n app:\n image: ghcr.io/example/app:latest\n ports:\n - \"8080:8080\"\n volumes:\n - ./config:/config\n - /srv/media:/media\n environment:\n TZ: Europe/Madrid" + }, + { + "title": "docker run", + "code": "docker run -d \\\n --name app \\\n -p 8080:8080 \\\n -e TZ=Europe/Madrid \\\n -v app-config:/config \\\n -v /srv/media:/media \\\n ghcr.io/example/app:latest" + } + ] + } + } + ] + }, + { + "id": "oci-compose", + "title": "Um oci-compose escrito à mão", + "intro": "Um oci-compose é o ficheiro JSON a partir do qual se instala uma aplicação. O catálogo guarda um por aplicação. O mesmo formato pode ser escrito à mão e instalado com esta opção.", + "blocks": [ + { + "p": "Num ficheiro escrito à mão, o autor define a imagem, as portas, as variáveis, os volumes e as perguntas da instalação. O ProxMenux completa o resto ao ler o ficheiro. O formato permite expressar o que o Compose não prevê: o texto de uma pergunta, uma palavra-passe gerada durante a instalação, um perfil de GPU, o proprietário de cada volume, a verificação do primeiro arranque ou as credenciais apresentadas no fim." + }, + { + "steps": { + "items": [ + { + "title": "Verificar", + "body": "Os ficheiros com erros não são instalados. Cada erro indica o campo afetado; se o JSON for inválido, são indicadas a linha e a coluna." + }, + { + "title": "Rever", + "body": "Um ficheiro válido apresenta o que instala: imagem, endereço web, portas, caminhos persistentes, variáveis pedidas pelo instalador e ficheiros que serão escritos." + }, + { + "title": "Instalar", + "body": "A instalação segue o mesmo processo das aplicações do catálogo, com definições predefinidas ou avançadas." + } + ] + } + }, + { + "calloutWarning": { + "title": "Um ficheiro que define os privilégios", + "body": "Um oci-compose determina o que é montado no contentor e com que privilégios. A revisão mostra-o antes da instalação: instale apenas ficheiros de fontes de confiança." + } + }, + { + "p": "O README do motor OCI descreve o formato bloco a bloco, com dois exemplos completos. O registo de uma instalação também pode ser lido desta forma: apenas é utilizado o modelo original, sem nenhuma das respostas dessa instalação." + } + ] + }, + { + "id": "private-registries", + "title": "Imagens em registos privados", + "intro": "Uma imagem num registo privado, como um pacote privado do GitHub ou um repositório privado do Docker Hub, é consultada com uma conta guardada no ProxMenux.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "O registo recusa o acesso à imagem", + "body": "Quando o registo indica que a imagem requer uma conta, a revisão propõe iniciar sessão nesse registo e consulta novamente a imagem." + }, + { + "title": "Iniciar sessão", + "body": "Um utilizador e uma palavra-passe ou token com permissão para descarregar a imagem. O registo verifica-os e só são guardados se forem aceites." + }, + { + "title": "Instalar e manter atualizado", + "body": "A conta é utilizada para descarregar a imagem na instalação e também nas atualizações, em Modificar, Recriar, no watchdog e na verificação de atualizações do Monitor, em qualquer nó do cluster." + } + ] + } + }, + { + "p": "Contas de registos, no menu principal do OCI manager Apps, apresenta as contas guardadas por registo e utilizador, nunca os seus segredos. Cada conta permite verificar, descarregar ou instalar uma imagem, atualizar as credenciais ou removê-las." + }, + { + "list": { + "items": [ + "GitHub (ghcr.io): o utilizador é a conta GitHub e a palavra-passe é um token de acesso pessoal com a permissão read:packages.", + "Docker Hub (docker.io): o utilizador é a conta Docker Hub e a palavra-passe é um token de acesso com permissão de leitura.", + "Outros registos, incluindo os que usam uma porta própria como registry.example.com:5000: o utilizador e a palavra-passe ou token fornecidos por esse registo." + ] + } + }, + { + "calloutInfo": { + "title": "Onde são guardadas as contas", + "body": "Em /etc/pve/priv/proxmenux/registry-auth.json, legível apenas por root, na mesma pasta onde o Proxmox guarda as palavras-passe de armazenamento. /etc/pve é partilhado por todos os nós do cluster, pelo que uma conta adicionada num nó é utilizada em todos. A cópia do host inclui o ficheiro e a desinstalação do ProxMenux remove-o de todos os nós." + } + } + ] + }, + { + "id": "limits", + "title": "Definições que não são instaladas", + "blocks": [ + { + "list": { + "items": [ + "Um Dockerfile sem imagem publicada: primeiro é necessário construir a imagem e publicá-la num registo OCI.", + "Um ficheiro Compose com vários serviços: é bloqueado porque esta opção instala um único serviço por contentor, mesmo que vários serviços utilizem a mesma imagem.", + "configs, segredos externos ou formatos de dispositivo que não possam ser adaptados sem ambiguidade.", + "Substituições de shell como $(command): é necessário escrever diretamente o valor resultante.", + "Opções docker run não reconhecidas e --env-file: utilize antes um ficheiro Compose com valores explícitos." + ] + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/oci-manager/hardware.json b/web/messages/pt/docs/oci-manager/hardware.json new file mode 100644 index 00000000..7f98c0e9 --- /dev/null +++ b/web/messages/pt/docs/oci-manager/hardware.json @@ -0,0 +1,392 @@ +{ + "meta": { + "title": "Dispositivos e aceleração ProxMenux", + "description": "Como o OCI Manager Apps passa GPU, NVIDIA, Coral, USB, FUSE e outros dispositivos para um recipiente OCI como recursos Proxmox VE nativos validados." + }, + "header": { + "title": "Dispositivos e aceleração", + "description": "GPU, NVIDIA, Coral, USB, FUSE e dispositivos de bloco tornam-se os recursos de Proxmox VE nativos validados do recipiente.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "principle", + "title": "O dispositivo de que a aplicação necessita, não a máquina inteira", + "blocks": [ + { + "p": "Um dispositivo solicitado pelo arquivo Compose ou pelo perfil da aplicação torna-se uma entrada de devN ou uma montagem LXC. Pedir um GPU, um dispositivo USB ou um Coral não torna o recipiente privilegiado." + }, + { + "flow": { + "nodes": [ + { + "label": "Inventário da máquina", + "detail": "/dev/dri/renderD128\nGID 993 · Intel" + }, + { + "label": "ProxMenux", + "detail": "fornecedor e\npermissões verificadas" + }, + { + "label": "LXC", + "detail": "mesmo dispositivo\nGID efetivo" + } + ] + } + } + ] + }, + { + "id": "origin", + "title": "De onde vem o pedido do dispositivo", + "blocks": [ + { + "table": { + "headers": [ + "Origem", + "O que é lido", + "O que o instalador faz" + ], + "rows": [ + [ + "Docker Compose", + "Pedidos de devices, group_add, deploy.resources e NVIDIA", + "Cada requisito torna-se um pedido de dispositivo mostrado para revisão" + ], + [ + "Perfil do catálogo", + "O suporte que o aplicativo realmente tem para GPU, Coral, OpenCL, USB ou FUSE", + "Apenas são oferecidas as opções validadas para essa imagem" + ], + [ + "Metadados e documentação da imagem", + "VA-API, Selkies, LinuxServer mods ou o tempo de execução NVIDIA", + "As variáveis documentadas e preparação são adicionadas" + ], + [ + "Seleção do usuário", + "Apenas CPU, Intel/AMD, OpenCL, NVIDIA ou um dispositivo opcional", + "A seleção é armazenada no contrato de instância" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Os dispositivos detectados não são anexados automaticamente", + "body": "O host é inventariado, mas apenas dispositivos declarados pelo arquivo Compose ou por um perfil compatível são oferecidos e anexados. Um GPU, dongle USB ou Coral presente no host não é exposto a cada LXC." + } + } + ] + }, + { + "id": "identify", + "title": "Como o dispositivo da máquina é identificado", + "intro": "Antes de o LXC ser modificado, o dispositivo é lido no host e corresponde ao perfil escolhido.", + "blocks": [ + { + "table": { + "headers": [ + "Tipo", + "Identidade", + "Validação" + ], + "rows": [ + [ + "Intel/AMD DRM", + "/dev/dri/renderD* e /sys/class/drm/NODE/device/vendor", + "Um dispositivo de caracteres com o fornecedor 0x8086 (Intel) ou 0x1002 (AMD)" + ], + [ + "AMD OpenCL", + "O nó de renderização, mais /dev/kfd quando o perfil precisa dele", + "Existência, tipo, fornecedor, permissões e compatibilidade declarada" + ], + [ + "AMD ROCm", + "O nó de renderização, /dev/kfd e a geração que o controlador de computação relata em /sys/class/kfd/kfd/topology/nodes/*/properties", + "Uma geração para a qual a imagem ROCm do aplicativo inclui kernels de computação — as GPUs RDNA2 citadas e as mais recentes — é oferecida sem adaptação. As outras GPUs dessas famílias, como Radeon 680M e 780M, são oferecidas como experimentais e nunca são a opção sugerida: o ROCm não as suporta oficialmente, o aplicativo as apresenta como a geração de sua família (HSA_OVERRIDE_GFX_VERSION) e o instalador pede confirmação antes de baixar a imagem maior. Uma GPU mais antiga, como a integrada de um Ryzen 5000U, não é oferecida e o Immich mantém o reconhecimento na CPU." + ], + [ + "NVIDIA", + "nvidia-smi e nvidia-container-cli", + "GPU, UUID, PCI bus, versão driver, Toolkit, /dev/nvidia* nós, binários e bibliotecas" + ], + [ + "Coral PCIe/M.2", + "/dev/apex_N e sua ligação em /sys/dev/char/MAJOR:MINOR", + "Nó de caracteres, major/menor, proprietário, GID e permissões" + ], + [ + "USB e serial", + "/dev/ttyUSB*, /dev/ttyACM* ou /dev/bus/usb/BBB/DDD", + "Nó de caracteres; para USB também fornecedor, produto e série quando sysfs publica-los" + ], + [ + "KVM, TUN, FUSE, vídeo e SCSI genérico", + "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN ou /dev/sgN", + "Caminho suportado, tipo de nó e permissões efetivas" + ], + [ + "Unidade óptica", + "/dev/srN", + "Um dispositivo de bloco" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "O que acontece durante a instalação", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "O modelo oferece seus perfis", + "body": "Por exemplo, CPU apenas, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL ou NVIDIA. As opções pertencem à imagem, não a um menu comum." + }, + { + "title": "Um perfil é escolhido", + "body": "Ele define os nós do dispositivo, ambiente, mods ou tempo de execução que a aplicação precisa." + }, + { + "title": "É proposto um caminho", + "body": "Para DRM, /dev/dri/renderD128, que pode ser alterado em um host com vários nós de renderização. Para USB ou serial, o nó específico é selecionado." + }, + { + "title": "Validação", + "body": "Existência, tipo, fornecedor permitido, permissões e GID são verificados. Um desencontro impede a operação." + }, + { + "title": "O contrato está escrito", + "body": "Caminho, modo, GID, acesso de escrita e perfil são gravados para atualizações e recriações." + }, + { + "title": "Anexar e testar", + "body": "pct set adiciona a entrada devN e o acesso é então verificado dentro do LXC. As imagens LinuxServer também são verificadas como usuário abc." + } + ] + } + } + ] + }, + { + "id": "config", + "title": "Como aparece na configuração LXC", + "intro": "Valores ilustrativos: dev0 e dev1 são as atribuições de slots livres Proxmox VE, e renderD128, apex_0 e o GID dependem do hardware do nó.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Intel/AMD VA-API", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" + }, + { + "title": "Coral PCIe/M.2", + "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "Um dispositivo USB específico", + "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "AMD OpenCL", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" + } + ] + } + }, + { + "p": "O GID é lido com stat no host e escrito na entrada devN; os grupos render e video não são assumidos como tendo um número fixo. O dispositivo mantém o mesmo caminho /dev dentro do LXC, onde os próprios mecanismos da aplicação procuram por ele." + } + ] + }, + { + "id": "profiles", + "title": "Perfis que uma imagem pode oferecer", + "blocks": [ + { + "table": { + "headers": [ + "Perfil", + "Configuração resultante", + "Oferecido quando" + ], + "rows": [ + [ + "Intel/AMD VA-API", + "Nó de renderização /dev/dri", + "O aplicativo suporta aceleração de vídeo" + ], + [ + "OpenCL", + "Nó de renderização, /dev/kfd quando necessário e o mod oficial", + "A imagem ou perfil documenta- a" + ], + [ + "NVIDIA", + "Dispositivos de driver e bibliotecas da máquina", + "O host tem um driver funcionando e o NVIDIA Container Toolkit" + ], + [ + "Coral", + "/dev/apex_0 ou o barramento USB", + "O perfil declara suporte ao Coral (Frigate)" + ], + [ + "USB, série, FUSE", + "Um único dispositivo, uma árvore validada ou uma funcionalidade LXC", + "O contrato pede-o." + ] + ] + } + } + ] + }, + { + "id": "nvidia", + "title": "NVIDIA", + "blocks": [ + { + "calloutWarning": { + "title": "Requisito do nó: NVIDIA Container Toolkit", + "body": "Um driver funcional em Proxmox VE não é suficiente para dar um NVIDIA GPU a uma imagem OCI. O OCI Manager Apps usa nvidia-container-cli, do NVIDIA Container Toolkit, para identificar os dispositivos e obter os binários e bibliotecas que correspondem ao driver carregado." + } + }, + { + "p": "O ProxMenux NVIDIA instalador instala o NVIDIA Container Toolkit do repositório oficial NVIDIA juntamente com o driver. Ele verifica seus quatro pacotes, valida o nvidia-container-cli e registra o resultado na registro de alterações do Audit & Report." + }, + { + "p": "Estes dois comandos na máquina mostram se o driver e o Toolkit estão disponíveis:" + }, + { + "shell": { + "code": "nvidia-smi -L\nnvidia-container-cli --version" + } + }, + { + "p": "Em uma máquina onde o driver foi instalado por outros meios, o Toolkit é instalado a partir do repositório estável oficial:" + }, + { + "shell": { + "code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools" + } + }, + { + "p": "O inventário que o OCI manager Apps usa é a saída de:" + }, + { + "shell": { + "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" + } + }, + { + "calloutInfo": { + "title": "A configuração do tempo de execução do Docker não está envolvida", + "body": "Os contêineres são LXC nativos e não usam daemon Docker, portanto nvidia-ctk runtime configure --runtime=docker não faz parte do processo: o ProxMenux consulta nvidia-container-cli diretamente e configura os dispositivos e montagens LXC. Os comandos e as plataformas suportadas são mantidos no guia de instalação do NVIDIA Container Toolkit." + } + }, + { + "cards": { + "items": [ + { + "icon": "cpu", + "title": "Inventário do driver", + "body": "nvidia-container-cli lista os nós do dispositivo, binários, firmware e bibliotecas do driver instalado." + }, + { + "icon": "refresh", + "title": "Nenhuma versão fixa", + "body": "O modelo não nomeia arquivos de bibliotecas. O perfil é gerado a partir da máquina atual." + }, + { + "icon": "shield", + "title": "Montagens somente de leitura", + "body": "As bibliotecas host são montadas somente para leitura em vez de serem copiadas para o recipiente." + }, + { + "icon": "hardDrive", + "title": "Alterações do driver", + "body": "Após uma mudança de driver, o inventário é gerado novamente antes do início dos LXCs afetados." + } + ] + } + }, + { + "code": { + "title": "Resultado NVIDIA (simplificado)", + "code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0" + } + }, + { + "p": "Passar apenas /dev/nvidia0 não é suficiente. Os componentes de espaço de usuário do driver carregado são montados somente de leitura, e nvidia-smi então é executado dentro do LXC para comparar GPU, UUID, PCI bus e versão com o inventário host." + } + ] + }, + { + "id": "usb", + "title": "Coral USB, serial e USB", + "blocks": [ + { + "calloutWarning": { + "title": "Numeração USB pode mudar", + "body": "Um caminho como o /dev/bus/usb/003/004 pode mudar quando o dispositivo é reconectado ou a máquina reinicia. O perfil registra fornecedor, produto e série quando estão disponíveis, mas um novo endereço de barramento não é remapeado automaticamente." + } + }, + { + "p": "Um periférico é dado pelo seu nó específico: /dev/ttyUSB0, /dev/ttyACM0, /dev/apex_0 ou /dev/bus/usb/BBB/DDD. Não é aceite passar todo o /dev. O Coral é oferecido apenas para aplicações cujo perfil o declara." + } + ] + }, + { + "id": "trees", + "title": "Árvores de dispositivos e recursos LXC", + "blocks": [ + { + "table": { + "headers": [ + "Pedido", + "Configuração resultante", + "Escopo" + ], + "rows": [ + [ + "/dev/dvb, /dev/snd ou /dev/bus/usb", + "Cada nó de caracteres da árvore recebe sua própria entrada devN com o modo host e GID", + "Apenas a árvore solicitada, e não o resto do /dev" + ], + [ + "/dev/fuse", + "O nó e, quando o perfil precisa dele, o recurso fuse=1", + "O FUSE sozinho não publica montagens para outros LXCs" + ], + [ + "/dev/net/tun", + "Uma entrada devN no mesmo caminho dentro do LXC", + "A configuração VPN ou rede permanece na aplicação" + ], + [ + "/dev/kvm", + "Uma entrada devN validada", + "Oferecido apenas quando o contrato o solicitar" + ] + ] + } + } + ] + }, + { + "id": "security", + "title": "Confirmações por nível de risco", + "blocks": [ + { + "p": "Dispositivos específicos, privilégio opcional, privilégio exigido, relaxamento AppArmor ou seccomp e acesso ao espaço de nomes PID do hospedeiro são tratados como casos separados, não sob uma etiqueta genérica privilegiada. Cada opção com risco é explicada e confirmada durante a instalação." + } + ] + } + ] +} diff --git a/web/messages/pt/docs/oci-manager/index.json b/web/messages/pt/docs/oci-manager/index.json new file mode 100644 index 00000000..8249fc49 --- /dev/null +++ b/web/messages/pt/docs/oci-manager/index.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "OCI manager Apps | ProxMenux", + "description": "Execute imagens OCI oficiais como contentores LXC nativos do Proxmox VE, com dados persistentes, acesso a dispositivos, aplicações com vários contentores e atualizações transacionais." + }, + "header": { + "title": "OCI manager Apps", + "description": "As imagens OCI oficiais são executadas como contentores LXC nativos do Proxmox VE. A imagem continua a ser a publicada pelo respetivo responsável; o ProxMenux reproduz o ambiente que o Docker Compose teria criado à sua volta.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "model", + "blocks": [ + { + "calloutInfo": { + "title": "Uma imagem OCI, um LXC nativo", + "body": "O Docker Engine não é executado dentro dos contentores. O Proxmox VE importa o sistema de ficheiros da imagem e os seus metadados OCI. A aplicação passa a ser o processo principal de um LXC nativo, gerido com as mesmas ferramentas dos restantes contentores do nó." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Origem", + "detail": "Imagem OCI\nCompose e documentação" + }, + { + "label": "ProxMenux", + "detail": "Contrato JSON\nvalidação e planeamento" + }, + { + "label": "Proxmox VE", + "detail": "LXC nativo\nvolumes e dispositivos" + } + ], + "caption": "É utilizada a aplicação original; o seu ambiente é descrito de forma declarativa e reproduzido." + } + } + ] + }, + { + "id": "where", + "title": "Onde encontrar", + "intro": "No nó Proxmox, como root, abra OCI manager Apps (Technology Preview) no menu principal do ProxMenux. O primeiro ecrã apresenta:", + "blocks": [ + { + "list": { + "items": [ + "Pesquisar aplicações: pesquisar por nome em todo o catálogo.", + "Todas as aplicações: apresentar o catálogo completo e o número de aplicações.", + "Gerir aplicações OCI instaladas: atualizar, modificar, remover ou recuperar as aplicações já instaladas.", + "Contas de registos: gerir as contas utilizadas para instalar e atualizar imagens de registos privados.", + "Instalar uma imagem fora do catálogo: adaptar um ficheiro Compose, um comando docker run ou uma referência de imagem.", + "As categorias do catálogo, cada uma com o respetivo número de aplicações." + ] + } + }, + { + "figure": { + "src": "/oci-manager/main-menu.png", + "alt": "Ecrã principal do OCI manager Apps com pesquisa, catálogo completo, gestão de aplicações, imagens fora do catálogo e categorias.", + "caption": "Ecrã principal do OCI manager Apps." + } + }, + { + "p": "Ao selecionar uma aplicação, são apresentadas a descrição, a imagem utilizada e duas opções de instalação. Instalar com as definições predefinidas pergunta apenas o essencial: armazenamento, localização dos dados, endereço e arranque. Instalar com as definições avançadas percorre todas as decisões por ordem: VMID e recursos, armazenamento de cada caminho, bridge de rede e dispositivos." + }, + { + "p": "As aplicações efetivamente testadas apresentam Verificado nesta vista e um ✓ nas listas, quer o teste tenha sido realizado no laboratório do ProxMenux quer pela comunidade." + } + ] + }, + { + "id": "beta", + "title": "Por que mantém a designação Technology Preview", + "blocks": [ + { + "p": "O OCI manager Apps mantém a designação Technology Preview que o Proxmox VE atribui aos contentores de aplicações criados a partir de imagens OCI, cujo suporte foi introduzido no Proxmox VE 9.1. A designação refere-se à tecnologia em que o OCI manager Apps se baseia, não ao motor do ProxMenux: o comportamento destes contentores ainda pode mudar entre versões do Proxmox VE. Será mantida até que o Proxmox VE considere esse suporte estável." + }, + { + "p": "O motor do OCI manager Apps é testado no laboratório do ProxMenux: instalação, atualização, modificação, recriação, cópia de segurança, restauro, migração e watchdog. Cada aplicação é verificada separadamente. As que foram efetivamente testadas apresentam Verificado e um ✓ nas listas." + } + ] + }, + { + "id": "translation", + "title": "Como o Docker descreve os requisitos e como o OCI manager Apps os concretiza", + "blocks": [ + { + "table": { + "headers": [ + "Requisito", + "Como é expresso no Docker", + "Como é concretizado pelo OCI manager Apps" + ], + "rows": [ + [ + "Executar a aplicação", + "image, entrypoint, command", + "O rootfs OCI e o processo principal do LXC" + ], + [ + "Preservar a configuração", + "volumes: /config", + "Um volume persistente mpN incluído na cópia de segurança ou um diretório do host." + ], + [ + "Disponibilizar o serviço", + "ports", + "Um endereço próprio para o LXC e o URL de acesso ao serviço." + ], + [ + "Utilizar hardware", + "devices, group_add", + "Entradas devN com o GID efetivo do host e um perfil validado." + ], + [ + "Ligar as dependências", + "networks, depends_on", + "Uma bridge de rede privada, endereços fixos, ordem de arranque e verificações de estado." + ], + [ + "Atualizar", + "Descarregar com pull e recriar", + "Um novo rootfs com o mesmo contrato de persistência." + ] + ] + } + } + ] + }, + { + "id": "kept", + "title": "O que é preservado e o que muda", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Preservado", + "body": "A imagem oficial, os caminhos internos, o ambiente, o processo de arranque e a documentação de utilização." + }, + { + "icon": "boxes", + "title": "Adaptado", + "body": "O ambiente de execução: rede, persistência, dispositivos, permissões e dependências utilizam os mecanismos LXC nativos do Proxmox VE." + }, + { + "icon": "shield", + "title": "Sem equivalente", + "body": "Uma opção Compose sem equivalente seguro é identificada como impedimento à instalação. Os modelos com impedimentos não são propostos para instalação e as opções sensíveis exigem confirmação durante o assistente." + }, + { + "icon": "refresh", + "title": "Registado", + "body": "O digest da imagem, os recursos, os caminhos, a rede, os dispositivos e a pertença a uma stack são guardados no contrato da instância. As atualizações e recriações reproduzem esse contrato." + } + ] + } + } + ] + }, + { + "id": "pages", + "title": "Páginas desta secção", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Como é adaptada uma imagem OCI", + "href": "/docs/oci-manager/architecture", + "tail": "Da imagem e do respetivo ficheiro Compose a um LXC nativo." + }, + { + "label": "Instalar uma imagem fora do catálogo", + "href": "/docs/oci-manager/custom-image", + "tail": "Um ficheiro Compose, um comando docker run ou uma referência de imagem." + }, + { + "label": "Dados, caminhos e rede", + "href": "/docs/oci-manager/storage-network", + "tail": "Volumes do contentor, diretórios do host, montagens com rclone e endereços." + }, + { + "label": "Dispositivos e aceleração", + "href": "/docs/oci-manager/hardware", + "tail": "GPU, NVIDIA, Coral, USB e outros dispositivos." + }, + { + "label": "Aplicações com vários contentores", + "href": "/docs/oci-manager/stacks", + "tail": "Aplicação, base de dados e cache em LXC coordenados." + }, + { + "label": "Instalar, atualizar e modificar", + "href": "/docs/oci-manager/lifecycle", + "tail": "O contrato da instância e as respetivas operações." + }, + { + "label": "No ProxMenux Monitor", + "href": "/docs/oci-manager/monitor", + "tail": "Versões, atualizações, saída da consola e terminal." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/oci-manager/lifecycle.json b/web/messages/pt/docs/oci-manager/lifecycle.json new file mode 100644 index 00000000..ece467a3 --- /dev/null +++ b/web/messages/pt/docs/oci-manager/lifecycle.json @@ -0,0 +1,499 @@ +{ + "meta": { + "title": "Instalar, atualizar e modificar | ProxMenux", + "description": "O contrato de instância de um contentor OCI e as operações que o utilizam: atualização, modificação, remoção, recuperação de uma operação interrompida e recuperação após um restauro neste ou noutro host." + }, + "header": { + "title": "Instalar, atualizar e modificar", + "description": "Cada instância mantém um contrato reprodutível, permitindo substituir o seu rootfs sem perder a configuração ou os dados persistentes.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "contract", + "title": "O contrato de instância", + "blocks": [ + { + "p": "Após a instalação, a configuração efetiva é guardada em /usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json. Não é uma cópia do ficheiro Compose original: é o contrato reprodutível do LXC existente neste host." + }, + { + "code": { + "code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle" + } + }, + { + "p": "Uma cópia do contrato fica dentro do contentor, em /.proxmenux/oci-record.json, e só pode ser lida pelo utilizador root do contentor. Assim, uma cópia de segurança do contentor inclui sempre o contrato que estava em vigor nesse momento. Uma segunda cópia é mantida em /etc/pve/priv/proxmenux/oci, partilhado por todos os nós do cluster e legível apenas por root do host. Ambas são escritas após cada instalação, atualização e alteração." + } + ] + }, + { + "id": "manage", + "title": "Gerenciar aplicativos OCI instalados", + "intro": "Esta opção da tela principal lista as instâncias registradas com sua aplicação e imagem. Cada um é verificado em relação ao seu contrato antes de qualquer ação; um CT que já não corresponde ao seu registro não é modificado nem excluído. A mesma atualização e o mesmo editor são oferecidos na aba Atualizações do ProxMenux Monitor.", + "blocks": [ + { + "table": { + "headers": [ + "Opção", + "O que muda", + "O que é guardado" + ], + "rows": [ + [ + "Atualizar a imagem com a configuração salva", + "O rootfs é substituído pela imagem que o canal salvo publica hoje", + "Contrato, discos de contêiner, diretórios de host, rede e dispositivos" + ], + [ + "Modificar: editar recursos, rede, caminhos e GPU", + "O editor abre com o contrato atual; o CT é reconstruído com as alterações", + "Os dados dos discos de contentores e pastas da máquina" + ], + [ + "Watchdog: reinicie o aplicativo quando ele falhar", + "Se o aplicativo é iniciado novamente quando ele pára por conta própria. Nada é reconstruído.", + "Toda a instalação; somente a escolha é salva no contrato" + ], + [ + "Remover: eliminar a aplicação e os seus contentores", + "O LXC, ou cada membro de uma pilha, e seus contratos são excluídos", + "Directórios da máquina, com o seu conteúdo" + ] + ] + } + }, + { + "p": "Para uma aplicação com vários contentores, o menu oferece Atualizar todos os contentores da aplicação, Modificar caminhos e dispositivos adicionais, Recriar todos os contentores com a configuração guardada, o watchdog e a remoção. Modificar adiciona ou remove caminhos e dispositivos adicionais do contentor da aplicação sem recriar nada e, no Immich, altera o componente que executa o reconhecimento. Recriar reconstrói cada contentor a partir da imagem com que foi instalado, sem procurar uma mais recente." + }, + { + "figure": { + "src": "/oci-manager/manage-menu.png", + "alt": "Lista de aplicativos OCI instalados e as opções de atualização, modificação e remoção", + "caption": "Gerencie aplicativos OCI instalados." + } + } + ] + }, + { + "id": "update", + "title": "Uma atualização transacional", + "blocks": [ + { + "mermaid": { + "chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end", + "labels": { + "user": "Usuário", + "registry": "Registo de OCI", + "update": "Atualizar instância", + "resolve": "Resolver a etiqueta", + "verify": "Verificar o arquivo e executar as verificações prévias", + "backup": "Pare e faça backup do CT", + "import": "Importar o novo rootfs", + "reapply": "Aplicar o contrato novamente", + "healthy": "íntegro", + "failure": "falha", + "commit": "Contrato publicado com o novo digest", + "restored": "A instância anterior foi restaurada" + } + } + }, + { + "list": { + "items": [ + "Quando o registro ainda serve o digest instalado, nada é baixado e a instância não é tocada.", + "A nova imagem é verificada camada a camada antes de parar o CT. Uma transferência que chega danificada é repetida uma segunda vez; uma imagem já em cache que não passa na verificação é transferida novamente.", + "As definições alteradas no Proxmox VE após a instalação (memória, swap, núcleos, limite e prioridade da CPU, arranque com o nó) são mantidas e incluídas no novo contrato.", + "A interface LAN adicionada pela suite Arr e pelas aplicações com vários contentores (net1) e a ordem de arranque (startup) são repostas sem alterações no novo contentor.", + "Qualquer outra diferença entre o CT e o seu contrato interrompe a atualização antes de parar o CT." + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Antes", + "detail": "rootfs A\n/config mp0\nDirectório da máquina /media" + }, + { + "label": "Atualizar", + "detail": "substitui apenas\no rootfs" + }, + { + "label": "Após", + "detail": "rootfs B\n/config mp0\nDirectório da máquina /media" + } + ] + } + }, + { + "p": "Antes de parar seja o que for, a operação verifica o espaço necessário para a cópia de segurança: os dados utilizados nos volumes incluídos, mais uma margem. A cópia é guardada junto ao registo da aplicação, no disco de sistema do host. Se não houver espaço suficiente, o menu pede outro armazenamento do host que aceite cópias de segurança. A cópia é criada aí e eliminada no fim da operação. A escolha fica guardada para essa aplicação, incluindo as atualizações agendadas. Se nenhum armazenamento tiver espaço suficiente, a operação é recusada e a aplicação fica como estava. O espaço necessário para a nova imagem também é verificado antes da transferência." + } + ] + }, + { + "id": "recovery", + "title": "Recuperar uma operação interrompida", + "intro": "Uma atualização e uma mudança usam uma transação persistente. Se o processo, o terminal ou o nó são interrompidos após a parada do CT, a operação não é tomada como terminada.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Marcador pendente", + "body": "Ao abrir Gerir aplicações OCI instaladas, o estado guardado mostra que a substituição nunca chegou a ser publicada." + }, + { + "title": "Ver o estado", + "body": "Mostra a fase atingida sem alterar contentores ou dados." + }, + { + "title": "Recuperar a instalação anterior", + "body": "Restaura a cópia de segurança nativa verificada, criada antes da substituição, e o contrato anterior." + }, + { + "title": "Pilha como unidade", + "body": "Para um aplicativo multi-contentor, cada membro é recuperado do mesmo ponto de transação, não apenas o selecionado." + } + ] + } + }, + { + "calloutWarning": { + "title": "Os diretórios da máquina estão fora do rollback", + "body": "A cópia de segurança abrange o rootfs e os discos do contentor nela incluídos. Um diretório do host não é reposto no estado anterior, pois outros LXC podem utilizar os seus dados." + } + } + ] + }, + { + "id": "watchdog", + "title": "Watchdog: reiniciar uma aplicação que pára", + "intro": "O Proxmox não tem uma política de reinício: quando termina o processo de um contentor de aplicação, o contentor fica parado. Com o watchdog ativo, uma aplicação que para por si própria é iniciada novamente. Para uma aplicação OCI, faz o que restart: unless-stopped faz num ficheiro Compose.", + "blocks": [ + { + "table": { + "headers": [ + "O que acontece?", + "Com o watchdog ativo" + ], + "rows": [ + [ + "O aplicativo trava ou seu processo termina", + "O contentor é iniciado novamente em segundos" + ], + [ + "É parado ou desligado do Proxmox, do Monitor ou com pct", + "Fica parado até alguém o iniciar" + ], + [ + "Um backup, uma migração ou uma operação ProxMenux está trabalhando nele", + "Nada é feito até que isso acabe." + ], + [ + "Já estava parado quando o host arrancou", + "Fica parado; isso é determinado por Iniciar com o Proxmox" + ], + [ + "Ele continua parando logo após começar", + "Uma aplicação que volta a parar segundos depois de arrancar, ou que não arranca, tem cinco tentativas de início, com intervalos de 30 segundos, 1, 2 e 5 minutos. Depois fica parada e é enviada uma notificação" + ] + ] + } + }, + { + "p": "O instalador faz esta pergunta nos dois modos de instalação e propõe o valor declarado na receita da aplicação. Mais tarde, a opção pode ser alterada em Gerir aplicações OCI instaladas ou no interruptor Watchdog do contentor em ProxMenux Monitor; aplica-se a todos os contentores de uma aplicação com vários contentores. Um único serviço do host, proxmenux-oci-watchdog.service, vigia todas as aplicações que o pediram; a sua instalação aparece no separador Alterações de Audit & Report." + }, + { + "calloutInfo": { + "title": "O que a máquina não pode dizer", + "body": "O código de saída da aplicação não chega ao host, pelo que uma saída normal e uma falha são indistinguíveis e ambas provocam um reinício, como always e unless-stopped no Docker. Uma paragem pedida fora do Proxmox, com lxc-stop ou systemctl, não deixa uma tarefa de paragem e é interpretada como uma paragem espontânea." + } + } + ] + }, + { + "id": "restore", + "title": "Backup, restauração e outra máquina", + "intro": "Uma cópia de segurança feita com vzdump ou Proxmox Backup Server inclui o contentor, os discos do contentor selecionados para a cópia e a cópia do seu contrato. O que a instalação guarda no host não faz parte dela. Gerir aplicações OCI instaladas deteta contentores restaurados num host sem o respetivo contrato, após uma nova instalação do Proxmox ou noutro host, e oferece o novo registo.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Restaurar os contentores no Proxmox", + "body": "A partir do armazenamento de cópias de segurança, com o ID original ou qualquer ID livre. Uma aplicação com vários contentores precisa de todos eles." + }, + { + "title": "Abrir Gerenciar aplicativos OCI instalados", + "body": "Os contentores restaurados são listados e é oferecida a recuperação. O botão Recuperar do separador Atualizações de ProxMenux Monitor abre a mesma recuperação." + }, + { + "title": "Verificar antes de mudar", + "body": "A recuperação verifica se o host tem tudo o que cada aplicação precisa. Uma aplicação que não possa ser recuperada por completo fica como estava, com indicação do motivo." + }, + { + "title": "Registar e iniciar", + "body": "O contrato está registrado neste host e o que a instalação manteve nele é escrito novamente. Iniciar as aplicações é uma pergunta separada, respondida com Não quando os recipientes originais ainda estão em execução em outro host." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/restore-offer.png", + "alt": "Diálogo que lista os contentores restaurados e oferece a sua recuperação", + "caption": "A recuperação oferecida quando Gerenciar aplicativos OCI instalados abre." + } + }, + { + "table": { + "headers": [ + "O que o host guardava", + "Após a recuperação" + ], + "rows": [ + [ + "Contrato de instância", + "Registado a partir da cópia no contentor, verificada face à configuração restaurada pelo Proxmox" + ], + [ + "Rede privada de uma aplicação multi-contentor", + "Criado novamente com a mesma ponte e sub-rede; os endereços fixos dos contentores não mudam" + ], + [ + "Ordem de arranque de uma aplicação com vários contentores", + "O hookscript de dependências e o seu contrato são instalados novamente; os snippets são ativados no armazenamento local quando nenhum armazenamento os aceita" + ], + [ + "Sysctls de rede e ficheiro de monitorização da máquina", + "Escrito novamente em /etc/pve/proxmenux" + ], + [ + "Ambiente de execução NVIDIA", + "O hook de um contentor sem privilégios é instalado novamente. Um contentor privilegiado recebe os ficheiros do controlador deste host em vez dos do host de origem" + ], + [ + "Montagem Rclone", + "O hookscript e os programas que publicam a montagem são escritos novamente, com as mesmas vistas na máquina" + ], + [ + "Regra da firewall do host para um monitor do host", + "É pedida novamente, para a porta web e a sub-rede da bridge neste host" + ], + [ + "lost+found de cada disco restaurado", + "É removido quando está vazio; um restauro cria-o e algumas aplicações não arrancam se estiver presente nos seus dados" + ], + [ + "Discos restaurados em outro armazenamento", + "O contrato é atualizado para o armazenamento em que eles estão agora" + ] + ] + } + }, + { + "p": "Um recipiente restaurado com outro ID mantém sua aplicação. O contrato, seu log de console, seus sysctls de rede, o hookscript de uma montagem Rclone e a ordem de início de uma aplicação multi-contentor são registrados com os IDs que os contêineres têm neste host." + }, + { + "table": { + "headers": [ + "O que impede uma recuperação", + "O que fazer" + ], + "rows": [ + [ + "Falta um contentor de uma aplicação com vários contentores", + "Restaure-o também; o aplicativo é recuperado inteiro" + ], + [ + "A sub- rede privada já é usada nesta máquina", + "A recuperação é cancelada e nada é alterado: os endereços dos contentores são fixados e não são movidos para outra subrede" + ], + [ + "Não existe uma pasta da máquina", + "Montar ou criar com os seus dados; uma cópia de segurança do contentor não inclui pastas da máquina" + ], + [ + "Não existe um dispositivo nesta máquina", + "Ligue-o ou remova-o do contentor no Proxmox" + ], + [ + "Um aplicativo com NVIDIA em uma máquina sem o driver", + "Instale o controlador NVIDIA e o Container Toolkit" + ], + [ + "O backup foi feito antes da cópia do contrato existir", + "O recipiente permanece como um LXC normal e não é oferecido novamente" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Um contentor que volta", + "body": "Um contentor restaurado sobre si próprio a partir de uma cópia de segurança anterior, reposto num snapshot ou devolvido de outro nó transporta o contrato do estado em que se encontra. Se for selecionado para uma operação e o seu contrato diferir do deste host, a operação não começa e é oferecida a recuperação do contentor." + } + }, + { + "figure": { + "src": "/oci-manager/restore-result.png", + "alt": "Resultado da recuperação com a rede privada, a ordem de início e os contentores registados", + "caption": "Resultado de uma recuperação, passo a passo." + } + } + ] + }, + { + "id": "remove", + "title": "Removendo uma aplicação OCI", + "blocks": [ + { + "p": "Antes da confirmação é criado um resumo da configuração real: os contentores removidos, os dados eliminados com eles, a rede privada libertada e os diretórios do host mantidos. A confirmação tem Não como resposta predefinida, pois os dados dos discos eliminados não podem ser recuperados depois." + }, + { + "table": { + "headers": [ + "Recurso", + "Ao remover", + "Justificação" + ], + "rows": [ + [ + "rootfs e discos de contentores", + "Removido", + "Pertencem apenas ao recipiente." + ], + [ + "Pasta da máquina", + "Mantido, com o seu conteúdo", + "Outras aplicações podem utilizá-lo" + ], + [ + "Ficheiros do contentor no host", + "Removido", + "O registo da consola, os parâmetros sysctl de rede, o hookscript da montagem Rclone e o registo no separador App do ProxMenux Monitor não servem outros contentores" + ], + [ + "Ficheiros partilhados por várias instalações", + "Excluído com a última instalação que os usa", + "O arquivo host-monitor e o hookscript de dependência de aplicativos multi-contentor" + ], + [ + "Contrato de instância", + "Excluído após uma remoção bem- sucedida", + "Nenhum CT está mais associado a ele" + ], + [ + "Ponte privada de uma pilha", + "Libertada com a pilha", + "Não tem mais membros para conectar" + ], + [ + "Rede partilhada pela suite Arr", + "Libertada com a última aplicação da suite", + "Cada aplicação da suite é independente e é removida por conta própria" + ], + [ + "Um único membro de uma pilha", + "Não removido isoladamente", + "O aplicativo inteiro é removido, então nenhuma pilha fica incompleta" + ], + [ + "Um recipiente em outro nó do cluster", + "Não removido", + "Seus arquivos de registro e host estão no nó onde foi instalado: ele é removido lá, depois de migrar de volta" + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/remove-summary.png", + "alt": "Resumo de remoção com os recipientes, dados e diretórios do host afetados", + "caption": "O resumo de remoção, construído a partir da configuração real." + } + } + ] + }, + { + "id": "archives", + "title": "Imagens transferidas e espaço da máquina", + "blocks": [ + { + "p": "O arquivo OCI é usado para criar o rootfs; o CT em execução não o lê. Após uma instalação ou atualização, são listados os arquivos transferidos nessa operação, com o respetivo tamanho, e é oferecida a sua eliminação. Eliminá-los liberta espaço sem afetar o contentor ou os seus dados." + }, + { + "calloutInfo": { + "title": "As atualizações não precisam do arquivo", + "body": "Sem o arquivo, uma atualização resolve o canal salvo e baixa o novo digest. Com ele, um arquivo é reutilizado apenas quando sua referência e integridade correspondem ao que é solicitado." + } + } + ] + }, + { + "id": "registry", + "title": "Registo e limpeza", + "blocks": [ + { + "p": "Ao abrir Gerir aplicações OCI instaladas, são primeiro removidos os restos de contentores que não existem em nenhum nó do cluster: o registo guardado como histórico após a eliminação na interface do Proxmox e os ficheiros do host deixados por uma remoção. Um registo com uma operação incompleta é mantido, pois a sua cópia de segurança ainda pode ser necessária. Os volumes e diretórios do host nunca são eliminados por dedução." + } + ] + }, + { + "id": "cluster", + "title": "Em um cluster: migração e alta disponibilidade", + "intro": "Um contentor OCI é um LXC normal do Proxmox: pode ser migrado ou gerido por HA como os restantes, com as mesmas limitações. O que precisa para arrancar é guardado onde todos os nós do cluster o encontram.", + "blocks": [ + { + "table": { + "headers": [ + "Parte", + "Em outro nó do cluster" + ], + "rows": [ + [ + "Registo da consola", + "O contentor cria /var/log/proxmenux/oci antes de arrancar, no nó que o executa. Cada nó mantém o registo dos arranques que executou." + ], + [ + "Sysctls de rede e monitor host", + "Mantido em /etc/pve/proxmenux, que cada nó do cluster compartilha, então um contêiner migrado os encontra." + ], + [ + "Discos de contentores", + "O Proxmox move-os com o contentor. O HA precisa dos dados disponíveis no nó de destino, através de armazenamento partilhado ou de uma configuração de replicação suportada." + ], + [ + "Directórios e dispositivos da máquina", + "As mesmas regras que qualquer LXC: um diretório host deve existir no nó alvo e ser marcado como compartilhado, e um GPU, Coral ou NPU deve estar presente lá." + ], + [ + "Registo ProxMenux", + "O contrato permanece no nó onde a aplicação foi instalada, e todos os nós leem a cópia mantida em /etc/pve/priv/proxmenux/oci. Uma aplicação com um só contentor que migra é registada no nó de destino ao abrir Gerir aplicações OCI instaladas ou ao iniciar uma operação para ela. Uma aplicação com vários contentores é oferecida para recuperação nesse nó, pois a sua rede privada tem de ser criada aí." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Não para alta disponibilidade", + "body": "Uma aplicação multi-contentor atinge seus membros através de uma ponte privada do nó onde foi instalado, então seus membros permanecem nesse nó. Um monitor host, como o Glances no modo host ou o Netdata, monitora o nó em que ele é executado; movendo-o monitoraria outro nó." + } + }, + { + "p": "Um backup restaurado fora do cluster recebe os arquivos de /etc/pve/proxmenux que o recipiente usa quando o aplicativo é recuperado." + } + ] + }, + { + "id": "channel", + "title": "Uma etiqueta rolling não é uma atualização sem supervisão", + "blocks": [ + { + "p": "O catálogo instala a etiqueta rolling publicada pelo responsável, mas o digest efetivo é resolvido e registado e só muda através de uma atualização explícita, com verificações prévias e rollback. O ProxMenux Monitor compara o digest instalado com o publicado pelo registo e apresenta um aviso e uma notificação quando há uma nova imagem disponível." + } + ] + } + ] +} diff --git a/web/messages/pt/docs/oci-manager/monitor.json b/web/messages/pt/docs/oci-manager/monitor.json new file mode 100644 index 00000000..68a4775b --- /dev/null +++ b/web/messages/pt/docs/oci-manager/monitor.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "Contêineres OCI no ProxMenux Monitor | ProxMenux", + "description": "O que o ProxMenux Monitor mostra para um container instalado pelo OCI Manager Apps: versões de aplicativos e imagens, novas imagens, saída do console e o terminal Proxmox VE." + }, + "header": { + "title": "No ProxMenux Monitor", + "description": "Um recipiente instalado pelo OCI Manager Apps aparece em VMs & LXCs como qualquer outro LXC. Seu modal lê o registro de instalação: versões de aplicação e imagem, novas imagens, saída de console e terminal.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "O registro é a fonte", + "body": "O OCI Manager Apps sabe o que ele instalou e de onde veio. O Monitor lê esse registro de instalação em vez de sondar o recipiente, por isso os dados são os mesmos se o recipiente está em execução ou parado." + } + }, + { + "table": { + "headers": [ + "Página", + "O que muda para um recipiente OCI" + ], + "rows": [ + [ + "Estado", + "Um interruptor Watchdog em Iniciar no arranque: o aplicativo é iniciado novamente quando pára por conta própria" + ], + [ + "Aplicativo", + "O aplicativo é identificado a partir do registro, e as atualizações são monitoradas pela imagem" + ], + [ + "Atualizações", + "A imagem é atualizada ou a aplicação modificada, com o mesmo fluxo que o menu OCI" + ], + [ + "Montagens", + "Discos de contentores e pastas de máquinas, com a sua utilização" + ], + [ + "Registros", + "Apenas para recipientes OCI: a saída do console da aplicação" + ] + ] + } + } + ] + }, + { + "id": "app", + "title": "Aplicativo", + "intro": "A aba App oferece o aplicativo instalado como uma detecção, com o nome, logotipo, porta e esquema do registro. Registrando-o abre o editor com o método Imagem OCI (instalada por ProxMenux), que não precisa de configuração.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "boxes", + "title": "Aplicação", + "body": "A versão da aplicação dentro da imagem, lida a partir da imagem em si: o seu ambiente ou a sua etiqueta org.opencontainers.image.version. É informativo." + }, + { + "icon": "archive", + "title": "Imagem", + "body": "A data de compilação e o digest da imagem instalada. A atualização é decidida aqui: o digest instalado é comparado com o que o registro publica hoje para a mesma tag." + } + ] + } + }, + { + "list": { + "items": [ + "Quando o registro publica um novo digest, o cartão mostra Nova imagem com sua data e digest, mesmo que a versão do aplicativo dentro não mudou: uma reconstrução em uma base atualizada é uma atualização.", + "Quando os digests coincidem, o cartão mostra Versão.", + "O cartão faz links para o repositório da imagem: seu projeto GitHub, ou sua página Docker Hub para uma imagem oficial.", + "O link de acesso usa o endereço LAN do recipiente, também para o principal membro de um aplicativo multi-contentor, que tem um segundo endereço em sua rede privada.", + "O botão Atualizar dados lê novamente o registro de instalação e o registro de imagens. Não são oferecidas opções para procurar ou registrar outro aplicativo: o contêiner contém exatamente o aplicativo de seu registro." + ] + } + }, + { + "figure": { + "src": "/oci-manager/monitor-app-tab.png", + "alt": "Página de aplicação de um contentor OCI com a versão da aplicação, a imagem e o link do repositório", + "caption": "Página da aplicação de um recipiente instalado pelo OCI Manager Apps." + } + }, + { + "p": "A verificação é executada uma vez por dia com as verificações de atualização do Monitor e o Atualizar dados a executa imediatamente. Uma nova imagem é enviada como uma notificação através dos canais configurados em Notificações. A atualização é aplicada na aba Atualizações." + } + ] + }, + { + "id": "updates", + "title": "Atualizações", + "intro": "Para um contêiner instalado pelo OCI Manager Apps a aba Atualizações mostra o aplicativo com sua imagem instalada e, quando o registro publica uma, a nova imagem, no mesmo formato que qualquer outra aplicação. Os atualizadores de pacotes e aplicativos de um LXC comum não aparecem.", + "blocks": [ + { + "table": { + "headers": [ + "Botão", + "O que abre" + ], + "rows": [ + [ + "Atualizar", + "A atualização de Gerenciar aplicativos OCI instalados para este contêiner, no terminal do Monitor. Pode ser executada com ou sem uma nova imagem; sem imagem nova, nada muda. Em um aplicativo com vários contêineres, atualiza todos os membros." + ], + [ + "Modificar", + "O editor da aplicação (recursos, rede, caminhos e GPU). Em uma aplicação multi-contentor adiciona ou remove os caminhos e dispositivos extras do recipiente de aplicação e, em Immich, altera o que executa o reconhecimento." + ], + [ + "Recuperar", + "Substitui a atualização quando uma operação no recipiente foi interrompida e abre sua recuperação." + ], + [ + "Recuperar (contêiner restaurado)", + "Exibido para um contêiner restaurado de backup que não tem contrato neste host, em Aplicativo OCI restaurado. Abre a recuperação no terminal do Monitor; Atualizar e Modificar aparecem após o registro." + ] + ] + } + }, + { + "p": "Alterações externas, diretórios host e aplicativos multi-contentores são tratados como no menu OCI. Em uma aplicação multi-contentor, os botões e as opções aparecem apenas no recipiente principal; os outros membros mostram sua imagem, uma nota de que eles são atualizados do recipiente principal e um botão que a abre. Quando o terminal fecha, a imagem, o registro e as montagens são lidos novamente." + }, + { + "table": { + "headers": [ + "Opção", + "Comportamento" + ], + "rows": [ + [ + "Manter o backup feito antes da atualização", + "Cada atualização faz backup do recipiente para restaurá-lo se a atualização falhar. Com esta opção, o mesmo backup é mantido no armazenamento escolhido e aparece entre os backups do CT; em Proxmox Backup Server um backup é escrito antes da atualização." + ], + [ + "Atualizações agendadas", + "A imagem é atualizada no horário escolhido somente se o registro publicar uma nova, com a opção de esperar que ela tenha 1, 3, 7 ou 14 dias. Um contêiner com alterações feitas fora do ProxMenux é ignorado e reportado." + ] + ] + } + } + ] + }, + { + "id": "logs", + "title": "Registros", + "intro": "A guia Logs aparece apenas para recipientes instalados pelo OCI Manager Apps, entre Mounts e Backups. Ele mostra a saída padrão e erro do processo principal da imagem, a mesma saída docker logs mostra para um recipiente Docker.", + "blocks": [ + { + "list": { + "items": [ + "A saída é mantida no host em /var/log/proxmenux/oci/VMID.console.log (modo 0600), desde o primeiro início e através de reinícios, para que possa ser lido com o recipiente parado.", + "O arquivo é rodado em 10 MB, mantendo três cópias comprimidas (/etc/logrotate.d/proxmenux-oci).", + "Cada início do recipiente é marcado na saída. A aba mostra a saída desde o último início por padrão; Histórico completo também mostra as anteriores.", + "Quando o aplicativo é removido, sua saída é removida com ele.", + "São exibidas as últimas 100, 500 ou 1000 linhas. Enquanto o contêiner está em execução, as novas linhas são acompanhadas ao vivo; rolar para cima pausa o acompanhamento e Acompanhar o retoma.", + "Um filtro mostra apenas as linhas que contêm um texto, e Baixar salva as linhas carregadas.", + "Os códigos de cores são removidos e uma linha que uma barra de progresso redesenha é mostrada em seu estado final.", + "A aba lê o arquivo a cada abertura, sem usar uma cópia em cache." + ] + } + }, + { + "calloutInfo": { + "title": "Credenciais de primeiro início", + "body": "Imagens que imprimem uma senha gerada em seu primeiro início deixam-na nesta saída, como docker logs faz. O instalador lê-o de lá para o mostrar em seu resumo." + } + }, + { + "figure": { + "src": "/oci-manager/monitor-logs-tab.png", + "alt": "Aba Logs com a saída do console de um contêiner OCI, seletor de linhas, filtro e botão de acompanhamento", + "caption": "Saída do console de um recipiente OCI." + } + } + ] + }, + { + "id": "terminal", + "title": "Consola Proxmox VE", + "blocks": [ + { + "p": "Uma imagem OCI executa seu próprio processo como PID 1 e nenhum serviço de login, então o console padrão de um LXC abriria um terminal onde nada responde. Containers instalados pelo OCI Manager Apps são criados com cmode: shell: o console Proxmox VE abre uma shell com lxc-attach, o equivalente a docker exec, com a aplicação em execução intocada." + }, + { + "list": { + "items": [ + "O shell é o que /etc/passwd atribui ao root na imagem. Se root não tiver shell ou a imagem não incluir nenhum, o console padrão será mantido.", + "O shell é root dentro do recipiente, sem senha. Quem pode abri-lo é decidido pela permissão VM.Console de Proxmox VE.", + "O terminal do Monitor entra no recipiente com pct enter, que funciona da mesma forma." + ] + } + } + ] + }, + { + "id": "mounts", + "title": "Montagens", + "blocks": [ + { + "p": "A aba Montagens lista os discos do contêiner e seus diretórios do host. O uso de um disco em armazenamento de blocos, como LVM-thin, é lido do sistema de arquivos desse disco, montado apenas dentro do contêiner." + } + ] + } + ] +} diff --git a/web/messages/pt/docs/oci-manager/stacks.json b/web/messages/pt/docs/oci-manager/stacks.json new file mode 100644 index 00000000..9a1c3625 --- /dev/null +++ b/web/messages/pt/docs/oci-manager/stacks.json @@ -0,0 +1,404 @@ +{ + "meta": { + "title": "Aplicações multi-contêineres ProxMenux", + "description": "Como o OCI Manager Apps transforma um aplicativo com seu banco de dados e cache em LXCs nativos coordenados: plano, rede privada, gancho de dependência, validação e atualizações transacionais." + }, + "header": { + "title": "Aplicações com vários contentores", + "description": "Uma aplicação com seu banco de dados, cache e outros serviços torna-se vários LXCs nativos coordenados, instalados e atualizados como um.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Um aplicativo para o usuário, vários LXCs para Proxmox VE", + "body": "Uma definição multi-contentor é uma entrada do catálogo. O instalador cria um LXC nativo por serviço e mantém suas dependências explícitas. Immich, Nextcloud, Paperless-ngx e Tandoor são instalados desta forma." + } + }, + { + "mermaid": { + "chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}
{{appNet}}\"]\n O --> D[\"{{db}}
{{private}}\"]\n O --> R[\"{{cache}}
{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A", + "labels": { + "plan": "Plano de pilha", + "app": "Aplicação LXC", + "appNet": "LAN + privado", + "db": "PostgreSQL LXC", + "cache": "Valkey LXC", + "private": "privado" + } + } + } + ] + }, + { + "id": "plan", + "title": "1. O plano, antes de existir qualquer recipiente", + "blocks": [ + { + "p": "Nenhum LXC é criado enquanto a definição Compose é interpretada. Um plano completo vem em primeiro lugar, com cada membro, imagem, VMID, rede, caminho, segredo, ordem e verificação de saúde. Se o plano não for consistente, a instalação não começa." + }, + { + "table": { + "headers": [ + "Elemento do plano", + "Conteúdo", + "Verificado antes de criar qualquer coisa" + ], + "rows": [ + [ + "Membros", + "Aplicação principal, banco de dados, cache, aprendizado de máquina e outras dependências", + "VMIDs exclusivos, papéis conhecidos e exatamente um membro principal" + ], + [ + "Imagens", + "Referência rolling, arquitetura e digest resolvido de cada serviço", + "Todos existem, suportam a arquitetura e passam pela verificação de integridade do OCI" + ], + [ + "Rede", + "Ponte privada, sub-rede, endereço fixo por serviço e acesso LAN para o membro principal", + "Sem colisão com pontes ou subredes existentes e sem endereço repetido" + ], + [ + "Persistência", + "Discos de container, diretórios de host, proprietários e backup", + "Nenhum caminho sobreposto, armazenamento disponível e permissões declaradas" + ], + [ + "Segredos", + "Senha do banco de dados, chaves do aplicativo e credenciais iniciais", + "Gerado uma vez e dado apenas aos membros que os usam" + ], + [ + "Ciclo de vida", + "Ordem de início, ordem de parada e uma verificação de funcionamento por membro", + "A aplicação principal começa por último e pára primeiro" + ] + ] + } + } + ] + }, + { + "id": "create", + "title": "2. Criação, membro por membro", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Reserve cada VMID", + "body": "O inventário Proxmox VE e o registro de instância são verificados. Um CT existente não é adotado e um contrato que ainda pertence a outra instância não é reutilizado." + }, + { + "title": "Preparar cada imagem", + "body": "Todas as imagens são resolvidas, baixadas e verificadas antes da criação do primeiro container." + }, + { + "title": "Criar cada rootfs", + "body": "Os metadados oficiais do OCI são importados, e a identidade da instância ProxMenux e o papel de membro são adicionados." + }, + { + "title": "Rede privada", + "body": "Uma ponte e uma sub-rede são criadas e cada membro recebe seu endereço fixo; apenas o membro principal também recebe a interface LAN." + }, + { + "title": "Persistência", + "body": "Cada banco de dados e configuração obtém seu próprio disco de contêiner; somente os dados destinados a serem compartilhados usam diretórios de host." + }, + { + "title": "Ambiente", + "body": "Endpoints internos, segredos compartilhados e variáveis de serviço são escritos. O aplicativo atinge suas dependências em seus endereços privados reservados." + }, + { + "title": "Registro", + "body": "Cada membro registra sua configuração nativa, as mudanças rootfs que as atualizações têm que reproduzir e sua relação com a pilha." + } + ] + } + } + ] + }, + { + "id": "checks", + "title": "3. Iniciar e verificar cada recipiente", + "intro": "Um LXC criado não significa um serviço pronto. As dependências começam em ordem e cada um passa uma verificação específica para o seu serviço.", + "blocks": [ + { + "table": { + "headers": [ + "Serviço", + "Verificação", + "O que mostra" + ], + "rows": [ + [ + "PostgreSQL", + "pg_isready no CT com o host, usuário e banco de dados esperados", + "O servidor aceita conexões para o banco de dados configurado" + ], + [ + "Redis / Valkey", + "redis-cli ou valkey-cli PING contra o seu endereço privado", + "O broker escuta e responde" + ], + [ + "aprendizado de máquina Immich", + "HTTP GET /ping, mais uma verificação do tempo de execução GPU selecionado", + "O serviço responde e a aceleração solicitada não passou a usar a CPU" + ], + [ + "Nextcloud", + "GET /status.php com installed=true, maintenance=false e needsDbUpgrade=false", + "A inicialização terminou sem migração pendente" + ], + [ + "Paperless-ngx / Tandoor", + "HTTP no endereço LAN e porto real do serviço", + "O frontend e suas dependências servem a aplicação" + ], + [ + "Aplicação principal", + "O ponto final do seu modelo, por exemplo, /api/server/ping em Immich", + "A pilha inteira funciona através da aplicação que usa as dependências" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Em execução não significa funcionando corretamente", + "body": "O estado em execução apenas diz que o processo LXC existe. Quando o serviço oferece uma verificação melhor, é utilizado uma verificação exec ou HTTP com tempo limite. Se um membro para ou falha na verificação, a pilha não é declarada instalada." + } + } + ] + }, + { + "id": "hook", + "title": "4. O gancho de dependência", + "blocks": [ + { + "p": "O gancho é definido apenas no recipiente principal de uma pilha dependente. Proxmox VE mantém o script como um trecho e o executa como o hookscript daquele CT. A receita da pilha não é escrita no script: ela vive em um contrato privado separado." + }, + { + "codeGrid": { + "items": [ + { + "title": "Configuração principal do CT", + "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" + }, + { + "title": "Contrato privado (exemplo)", + "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" + } + ] + } + }, + { + "snippet": { + "summary": "Fonte completa de proxmenux-stack-dependencies.sh", + "pathCode": "local:snippets/proxmenux-stack-dependencies.sh", + "snippetCode": "stackDependencyHook" + } + }, + { + "p": "O script é o mesmo para cada pilha. VMIDs, nomes, tipos de verificação e timeouts vêm do contrato privado /etc/pve/priv/proxmenux-stack-VMID.json de cada pilha." + }, + { + "steps": { + "items": [ + { + "title": "O Proxmox VE chama pre-start", + "body": "Antes do início do CT principal, o gancho funciona com o seu VMID e a fase do ciclo de vida." + }, + { + "title": "Um bloqueio por pilha", + "body": "flock em /run/lock/proxmenux-stack-VMID.lock impede duas sequências de início ao mesmo tempo." + }, + { + "title": "O contrato é lido e validado", + "body": "São exigidos um esquema conhecido, dependências numéricas, rótulos, uma verificação exec, http ou running e um tempo limite positivo." + }, + { + "title": "Dependências em ordem", + "body": "Cada CT deve existir; um parado é iniciado e um já em execução não é reiniciado." + }, + { + "title": "Esperar o serviço ficar pronto", + "body": "A verificação é executada a cada dois segundos, e o CT também é confirmado para estar ainda em execução." + }, + { + "title": "O CT principal começa", + "body": "Quando cada dependência está pronta, termina pré-inicial e o Proxmox VE inicia a aplicação." + } + ] + } + }, + { + "calloutInfo": { + "title": "O gancho não para dependências", + "body": "As fases pós-início, pré-parar e pós-parar não fazem nada. Parar o CT principal deixa PostgreSQL, Redis, Valkey ou aprendizado de máquina em execução. O gancho ordena o início; ele não transforma vários LXCs em um processo." + } + }, + { + "table": { + "headers": [ + "Tipo", + "Exemplo", + "Início posterior" + ], + "rows": [ + [ + "Pilha dependente", + "Immich, Nextcloud, aplicação com PostgreSQL", + "O gancho do CT principal inicia as dependências e espera por eles" + ], + [ + "Conjunto de aplicativos", + "Conjunto de aplicações Arr", + "Nenhum membro principal: cada LXC segue o seu próprio onboot" + ], + [ + "Aplicação única", + "Jellyfin", + "Proxmox VE inicia esse LXC diretamente" + ] + ] + } + } + ] + }, + { + "id": "stack-checks", + "title": "5. Verifica a pilha como um todo", + "blocks": [ + { + "list": { + "items": [ + "Cada VMID existe, é único e mantém a identidade de instância esperada.", + "Cada contrato pertence à mesma pilha, mantém seu papel e sua configuração nativa gravada.", + "O membro principal é o último em start_order e o primeiro em stop_order.", + "Nenhum membro, volume ou adaptação rootfs está faltando.", + "O gancho aponta para o trecho oficial, seu conteúdo é inalterado e seu contrato corresponde à receita da pilha.", + "As imagens e digests observados correspondem aos arquivos OCI preparados.", + "Dispositivos, perfis GPU, montagens, segredos e endpoints ainda correspondem aos contratos.", + "Após cada dependência passar, o ponto final da aplicação principal verifica a integração entre os membros." + ] + } + } + ] + }, + { + "id": "manage", + "title": "Gerenciando uma pilha instalada", + "intro": "Em Gerenciar aplicativos OCI instalados, qualquer membro leva à pilha inteira. O menu oferece Atualizar todos os contêineres do aplicativo, Modificar caminhos e dispositivos extras, Recriar todos os contêineres com a configuração salva e Remover: excluir o aplicativo e seus contêineres. Recriar reconstrói cada contêiner da imagem original pelo digest salvo, sem procurar uma mais nova, seguindo os mesmos passos de uma atualização. A opção aparece para pilhas que podem ser atualizadas.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Qualquer membro", + "body": "O contrato dos membros nomeia o VMID principal e a lista completa de membros." + }, + { + "title": "A pilha é reprodutível", + "body": "Identificações, contratos, gancho, adaptações e uma repetição coordenada para essa receita são validadas." + }, + { + "title": "Primeiro as imagens", + "body": "O aplicativo não é parado até que cada digest tenha sido resolvido, baixado e verificado." + }, + { + "title": "Parar e fazer backup do conjunto", + "body": "Os backups nativos verificados são feitos com a pilha parada, então a aplicação e os bancos de dados pertencem ao mesmo momento." + }, + { + "title": "Atualizar e verificar cada membro", + "body": "Adaptação, rede, montagens, segredos e dispositivos são novamente aplicados antes do exame de saúde de cada membro." + }, + { + "title": "Publicar ou recuperar tudo", + "body": "Os novos contratos só são publicados quando todos os membros passam. Se alguém falhar, cada membro é restaurado." + } + ] + } + }, + { + "table": { + "headers": [ + "Modificar", + "O que muda", + "O que é guardado" + ], + "rows": [ + [ + "Caminhos e dispositivos adicionais", + "Eles são adicionados ou removidos do recipiente de aplicação, que reinicia. Nada é reconstruído.", + "Os dados da aplicação, da sua base de dados e dos outros contentores" + ], + [ + "O que executa o reconhecimento (Immich)", + "O recipiente de aprendizado de máquina leva a imagem e os dispositivos do CPU ou de um GPU do hospedeiro. Todo o aplicativo é parado e atualizado, como em uma atualização", + "O cache do modelo, a biblioteca e o banco de dados. Se algo falhar, os recipientes anteriores e a escolha anterior são restaurados" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Uma pilha sem uma repetição coordenada não é atualizada", + "body": "Se a preparação de uma pilha não puder ser reproduzida, a atualização é recusada antes de a pilha ser parada. A aplicação continua a correr como está." + } + } + ] + }, + { + "id": "failure", + "title": "6. Quando algo falha", + "blocks": [ + { + "p": "Durante uma instalação, um erro para e remove os contêineres incompletos que a operação criou, e a ponte privada se a operação criou. Uma pilha não é publicada como válida até que toda a sequência termine." + }, + { + "p": "Uma atualização é transacional: todas as imagens são preparadas primeiro, depois a pilha pára, cada membro é feito backup e o backup verificado, e só então é substituído cada rootfs. Os membros começam um a um com seu exame de saúde; se um falha, cada membro é restaurado a partir do mesmo conjunto de backups, de modo que o banco de dados eo aplicativo nunca pertencem a momentos diferentes." + }, + { + "mermaid": { + "chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]", + "labels": { + "prepare": "Preparar cada imagem", + "stop": "Parar, membro principal primeiro", + "backup": "Cópia de segurança verificada de cada CT", + "replace": "Substituir rootfs", + "healthy": "Todos funcionando corretamente?", + "yes": "Sim", + "no": "Não", + "commit": "Publicar contratos", + "rollback": "Restaurar cada membro" + } + } + } + ] + }, + { + "id": "not-assumed", + "title": "O que uma pilha não inclui", + "blocks": [ + { + "list": { + "items": [ + "Uma suíte instalada em um fluxo, como a suíte Arr, não é uma pilha dependente: seus recipientes não têm ordem de início entre eles.", + "A rede privada não substitui a autenticação, TLS ou a configuração de cada aplicativo.", + "O backup de um LXC não contém a ponte, o gancho ou os contratos do resto da pilha.", + "Prowlarr, Sonarr ou Radarr não recebem indexadores, perfis ou provedores de ProxMenux." + ] + } + } + ] + } + ] +} diff --git a/web/messages/pt/docs/oci-manager/storage-network.json b/web/messages/pt/docs/oci-manager/storage-network.json new file mode 100644 index 00000000..3fb8a7ee --- /dev/null +++ b/web/messages/pt/docs/oci-manager/storage-network.json @@ -0,0 +1,305 @@ +{ + "meta": { + "title": "Dados, caminhos e rede | ProxMenux", + "description": "Como o OCI manager Apps preserva os dados de um contentor OCI: discos do contentor, diretórios do host, montagens com rclone, endereços e redes privadas." + }, + "header": { + "title": "Dados, caminhos e rede", + "description": "O que fica no rootfs, o que é preservado quando este é substituído, como os dados são partilhados entre contentores e como cada um obtém o seu endereço.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "A persistência é decidida antes de criar o LXC", + "body": "Os volumes declarados pela imagem e pelo respetivo ficheiro Compose são lidos antes de criar o contentor. Cada caminho que deva ser preservado após uma atualização torna-se um ponto de montagem independente do rootfs. Assim, o rootfs contém apenas o que pertence à imagem e pode ser substituído." + } + } + ] + }, + { + "id": "questions", + "title": "O que o instalador pergunta", + "intro": "O modelo fornece os caminhos necessários à aplicação. Cada um é colocado num disco do contentor ou num diretório do host, e podem ser acrescentados mais caminhos antes do resumo.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Caminhos necessários", + "body": "São apresentados /config, /data, bibliotecas, descargas e todos os volumes declarados pela aplicação." + }, + { + "title": "Localização", + "body": "Cada caminho é colocado num disco do contentor ou num diretório já existente no host." + }, + { + "title": "Armazenamento e tamanho", + "body": "É criado um disco do contentor num armazenamento do Proxmox VE com o tamanho indicado. A instalação predefinida utiliza local-lvm; a avançada pergunta o armazenamento de cada caminho imediatamente antes do tamanho e propõe o do rootfs. O disco aparece como vm-VMID-disk-N e é associado como mpN." + }, + { + "title": "Diretório do host", + "body": "O diretório do host é indicado pelo seu caminho. Se não existir, é criado e atribuído ao utilizador do host para o qual é mapeado o utilizador do contentor." + }, + { + "title": "Caminhos adicionais", + "body": "Antes de instalar, podem ser acrescentados mais pares de caminho ou volume do host e caminho dentro do contentor." + }, + { + "title": "Resumo", + "body": "O mapeamento completo é apresentado antes de criar o CT e guardado no contrato da instância." + } + ] + } + } + ] + }, + { + "id": "options", + "title": "As duas localizações persistentes", + "blocks": [ + { + "table": { + "headers": [ + "Propriedade", + "Disco do contentor", + "Diretório do host" + ], + "rows": [ + [ + "Na configuração", + "mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G", + "mpN: /mnt/oci-shared/media,mp=/data/media" + ], + [ + "Cópia de segurança do contentor (vzdump)", + "Incluído, com backup=1", + "Não incluído" + ], + [ + "Tamanho", + "Fixo; aumenta-se redimensionando o ponto de montagem", + "O espaço livre do sistema de ficheiros ou dataset do host" + ], + [ + "Outros contentores", + "Montado apenas pelo contentor a que pertence", + "O mesmo diretório pode ser montado em vários contentores" + ], + [ + "Snapshots e restauro", + "Geridos pelo Proxmox VE juntamente com o CT", + "Geridos no armazenamento do host" + ], + [ + "Ao remover a aplicação", + "Eliminado com o contentor", + "Preservado com o seu conteúdo" + ], + [ + "Ao mover o CT para outro nó", + "É movido com o CT", + "O mesmo caminho tem de existir no outro nó" + ] + ] + } + }, + { + "p": "O rootfs fica reservado para os binários e o conteúdo da imagem. Uma atualização ou recriação substitui-o sem tocar em nenhum dos dois tipos de ponto de montagem." + } + ] + }, + { + "id": "example", + "title": "Exemplo: um contentor com ambas as localizações", + "blocks": [ + { + "code": { + "title": "Jellyfin instalado como CT 151 em local-lvm (excerto)", + "code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media" + } + }, + { + "p": "Uma atualização ou recriação substitui apenas o rootfs: o mp0 preserva utilizadores, bibliotecas e definições, e o mp1 continua a apresentar os mesmos ficheiros multimédia. Restaurar a cópia do CT recupera /config; se necessário, o diretório multimédia é restaurado a partir da cópia de segurança do armazenamento do host." + }, + { + "flow": { + "nodes": [ + { + "label": "Contrato", + "detail": "/config" + }, + { + "label": "Localização", + "detail": "Disco do contentor\nou diretório do host" + }, + { + "label": "LXC", + "detail": "Sempre /config\npara a aplicação" + } + ], + "caption": "A aplicação vê o caminho declarado pela imagem; só muda o local onde é armazenado." + } + } + ] + }, + { + "id": "shared", + "title": "Um diretório do host, vários contentores", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart TB\n H[\"{{host}}
/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent
/data\"]\n H --> J[\"Jellyfin
/data\"]\n H --> R[\"Radarr / Sonarr
/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]", + "labels": { + "host": "Diretório do host", + "config": "Configuração própria" + } + } + }, + { + "p": "Cada contentor guarda a sua configuração no respetivo disco. A biblioteca ou as descargas ficam num único diretório do host, montado no mesmo caminho interno em todos os contentores. Assim, o caminho onde uma aplicação escreve é o mesmo de onde outra lê." + } + ] + }, + { + "id": "rclone", + "title": "Armazenamento na nuvem através da aplicação rclone", + "intro": "Além da instalação, a ficha do rclone no catálogo permite Ativar uma montagem num contentor OCI de rclone existente. É montado um armazenamento remoto já criado e autorizado na interface web do rclone e disponibilizado no host. Outros contentores podem utilizá-lo como um diretório do host.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Contentor e armazenamento remoto", + "body": "O VMID do contentor de rclone, o nome exato do armazenamento remoto e, opcionalmente, um caminho dentro dele." + }, + { + "title": "Nome da montagem e cache", + "body": "O nome da montagem e o modo de cache VFS: off, minimal, writes ou full (predefinido)." + }, + { + "title": "Vistas disponibilizadas", + "body": "Uma raiz comum, /mnt/oci-shared por predefinição, contém uma vista de leitura e escrita em /mnt/oci-shared/remotes/NAME e uma vista só de leitura em /mnt/oci-shared/remotes-ro/NAME." + }, + { + "title": "Ativação", + "body": "Após confirmação, o CT é parado, o seu comando de arranque e um hookscript do Proxmox VE são configurados e o CT é iniciado novamente. A operação aguarda até ambas as vistas estarem montadas no host." + } + ] + } + }, + { + "calloutInfo": { + "title": "Se a montagem não for ativada", + "body": "A configuração anterior do contentor é restaurada e este é iniciado novamente. Assim, se a ativação falhar, o rclone fica como estava." + } + } + ] + }, + { + "id": "network", + "title": "Endereços e redes", + "intro": "Uma aplicação com um só contentor precisa de um endereço. Uma aplicação com vários contentores também precisa de uma rede estável entre os seus membros.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "network", + "title": "Aplicação com um só contentor", + "body": "Escolhe-se a bridge de rede e DHCP ou um endereço fixo em formato CIDR. O LXC tem um endereço próprio e o resumo apresenta os URL completos dos serviços." + }, + { + "icon": "waypoints", + "title": "Aplicação com vários contentores", + "body": "É encontrada uma sub-rede livre e criada uma bridge privada persistente. Cada membro — aplicação, base de dados e cache — recebe nela um endereço fixo." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "LAN", + "detail": "Endereço acessível\napenas para o serviço principal" + }, + { + "label": "LXC principal", + "detail": "Web / API\nLAN + rede privada" + }, + { + "label": "Rede privada", + "detail": "PostgreSQL · Valkey · ML\nendereços fixos" + } + ], + "caption": "As dependências comunicam pela rede privada e não têm um endereço na LAN." + } + }, + { + "p": "O contrato da stack guarda a bridge, a sub-rede, os endereços e as relações entre serviços. Ao atualizar a aplicação, a mesma topologia é reutilizada para todos os membros. O ProxMenux Monitor abre o contentor principal no seu endereço LAN, não no da rede privada." + } + ] + }, + { + "id": "ownership", + "title": "Proprietários de ficheiros e diretórios", + "blocks": [ + { + "list": { + "items": [ + "Os novos diretórios são criados com o UID e o GID para os quais é mapeado o LXC sem privilégios.", + "O proprietário dos diretórios existentes não é alterado de forma recursiva.", + "Sockets, ficheiros de sistema e caminhos sensíveis não são propostos como diretórios genéricos do host." + ] + } + } + ] + }, + { + "id": "backup", + "title": "O que contém uma cópia de segurança do contentor", + "blocks": [ + { + "table": { + "headers": [ + "Elemento", + "Na cópia vzdump do CT", + "Onde é guardado" + ], + "rows": [ + [ + "Rootfs OCI", + "Sim", + "Na cópia do CT; também pode ser reconstruído a partir da imagem e do contrato" + ], + [ + "Disco do contentor com backup=1", + "Sim", + "A cópia do CT" + ], + [ + "Diretório do host", + "Não", + "A cópia de segurança do armazenamento do host" + ], + [ + "Contrato da instância", + "Sim, a cópia guardada no CT", + "/.proxmenux/oci-record.json dentro do CT; as cópias adicionais do host e do cluster são guardadas separadamente" + ], + [ + "Aplicação com vários contentores", + "Cada membro na sua própria cópia", + "As cópias de todos os membros, mais o contrato da stack e a respetiva bridge no host" + ] + ] + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/oci-manager/architecture.json b/web/messages/sk/docs/oci-manager/architecture.json new file mode 100644 index 00000000..657730c7 --- /dev/null +++ b/web/messages/sk/docs/oci-manager/architecture.json @@ -0,0 +1,171 @@ +{ + "meta": { + "title": "Ako sa prispôsobí obraz OCI | ProxMenux", + "description": "Od repozitára obrazu a jeho súboru Compose cez skontrolovateľnú šablónu a plán nasadenia až po natívny LXC v Proxmox VE, bez Dockeru v kontajneri." + }, + "header": { + "title": "Ako sa prispôsobí obraz OCI", + "description": "Od repozitára obrazu a jeho súboru Compose cez skontrolovateľnú šablónu a plán nasadenia až po natívny LXC, bez inštalácie Dockeru v kontajneri.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "pipeline", + "title": "Postup prispôsobenia", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]", + "labels": { + "repo": "Repozitár obrazu", + "converter": "Konvertor", + "template": "Šablóna JSON", + "blockers": "Bez prekážok?", + "no": "Nie", + "yes": "Áno", + "review": "Kontrola / overlay", + "plan": "Plán nasadenia", + "lxc": "Natívny LXC" + } + } + }, + { + "p": "Konvertor načíta obraz a súbor Compose zverejnené projektom a vytvorí šablónu JSON. Ak niektoré požiadavky ešte nie sú prispôsobené a bránia inštalácii, šablóna pred zverejnením v katalógu prejde kontrolou. Súbor overených úprav, nazývaný overlay, tieto prekážky vyrieši. Na inštaláciu sa ponúkajú iba šablóny bez nevyriešených prekážok." + } + ] + }, + { + "id": "template", + "title": "Čo šablóna zachováva", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Identita obrazu", + "body": "Repozitár, priebežne aktualizovaná značka, architektúra, zistený digest a revízia zdroja." + }, + { + "icon": "braces", + "title": "Kontrakt kontajnera", + "body": "Entrypoint, Cmd, prostredie, používateľ, pracovný adresár, signál na zastavenie, porty a zväzky." + }, + { + "icon": "layers", + "title": "Prispôsobenie pre Proxmox VE", + "body": "Zdroje, zabezpečenie, prípojné body, zariadenia, sysctls, kontroly stavu a potrebné úpravy pre každú položku vrátane ich zdôvodnenia." + }, + { + "icon": "shield", + "title": "Kompatibilita", + "body": "Podporované kľúče, neprispôsobené požiadavky brániace inštalácii a stav každej kontroly." + } + ] + } + } + ] + }, + { + "id": "sources", + "title": "OCI poskytuje proces, Compose poskytuje prostredie", + "blocks": [ + { + "table": { + "headers": [ + "Zdroj", + "Príklad", + "Natívny výsledok" + ], + "rows": [ + [ + "Metadáta OCI", + "Entrypoint, Cmd, User", + "Proxmox VE ich importuje pri vytváraní CT" + ], + [ + "Docker Compose", + "environment, volumes, devices", + "Záznamy prostredia LXC, mpN a devN" + ], + [ + "Profil ProxMenux", + "GPU, kontrola stavu, prihlasovacie údaje", + "Otázky a overené úpravy" + ], + [ + "Používateľ", + "VMID, úložisko, sieť", + "Kontrakt inštancie" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Čo sa deje počas inštalácie", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Zistiť konkrétny obraz", + "body": "Vyhľadá sa obraz v registri, vyberie sa architektúra hostiteľa a zaznamená sa konkrétny digest, na ktorý odkazuje priebežne aktualizovaná značka." + }, + { + "title": "Stiahnuť a overiť", + "body": "Skopeo stiahne obraz ako archív OCI. Pred vytvorením akýchkoľvek prostriedkov sa každá vrstva overí podľa jej digestu a rozbalí. Ak je stiahnutý súbor poškodený, sťahovanie sa ešte raz zopakuje, až potom sa inštalácia zastaví." + }, + { + "title": "Vytvoriť súborový systém", + "body": "pct create vytvorí rootfs z archívu a zachová oficiálne metadáta procesu obrazu." + }, + { + "title": "Pripojiť prostriedky", + "body": "Pripoja sa deklarované zväzky a zariadenia a nastavia sa sieť, prostredie a bezpečnostné profily." + }, + { + "title": "Konzola", + "body": "Výstup konzoly kontajnera sa uchováva na hostiteľovi. Konzola Proxmox VE otvorí shell, ak ho obraz obsahuje." + }, + { + "title": "Overiť", + "body": "Pri prvom spustení sa čaká na pridelenie adresy a odpoveď služby. V prípade zlyhania sa inštalácia neoznačí za úspešnú." + }, + { + "title": "Zaznamenať konfiguráciu", + "body": "Výsledná konfigurácia sa uloží do kontraktu inštancie, ktorý sa používa pri aktualizáciách a opätovnom vytvorení." + } + ] + } + } + ] + }, + { + "id": "example", + "title": "Príklad: obraz s /config a /downloads", + "intro": "Bežná definícia Compose a konfigurácia Proxmox VE, ktorá z nej vznikne. Cesty očakávané aplikáciou sa nemenia.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Docker Compose", + "code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080" + }, + { + "title": "/etc/pve/lxc/VMID.conf (úryvok)", + "code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000" + } + ] + } + }, + { + "p": "mp0 je druhý disk patriaci kontajneru, na zvolenom úložisku pomenovaný vm-VMID-disk-N. Pripája sa do /config a pri backup=1 je súčasťou zálohy kontajnera. mp1 nevytvára disk: pripája adresár hostiteľa /srv/downloads do /downloads v LXC. Port 8080 sa nemapuje: LXC má vlastnú adresu a služba odpovedá na nej." + } + ] + } + ] +} diff --git a/web/messages/sk/docs/oci-manager/custom-image.json b/web/messages/sk/docs/oci-manager/custom-image.json new file mode 100644 index 00000000..7122dedf --- /dev/null +++ b/web/messages/sk/docs/oci-manager/custom-image.json @@ -0,0 +1,278 @@ +{ + "meta": { + "title": "Inštalácia obrazu mimo katalógu | ProxMenux", + "description": "Prispôsobte obraz OCI zo súboru Compose, URL, príkazu docker run alebo odkazu na obraz a pred inštaláciou skontrolujte, čo ProxMenux dokáže reprodukovať." + }, + "header": { + "title": "Nainštalovať obraz mimo katalógu", + "description": "Vlastný obraz sa prispôsobí zo súboru Compose, príkazu docker run alebo iba z odkazu na obraz. Výsledok sa zobrazí na kontrolu skôr, než sa vytvorí akýkoľvek LXC.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Rovnaký konvertor a inštalátor", + "body": "Voľba Nainštalovať obraz mimo katalógu používa rovnaký konvertor a inštalátor ako šablóny katalógu. Rozdiel je v tom, že kontrakt sa vytvorí až vtedy zo zadanej definície a overí sa pred vytvorením akéhokoľvek LXC." + } + } + ] + }, + { + "id": "sources", + "title": "Ako je obraz opísaný", + "intro": "Úvodná obrazovka sa pýta, ako je obraz opísaný. Štyri možnosti poskytnú definíciu na prispôsobenie, piata používa iba názov obrazu a ďalšie tri načítajú už napísaný oci-compose.", + "blocks": [ + { + "table": { + "headers": [ + "Voľba", + "Čo sa načíta" + ], + "rows": [ + [ + "Vložiť súbor Compose do terminálu", + "Vložte obsah YAML do terminálu a ukončite ho pomocou Ctrl+D." + ], + [ + "Načítať súbor Compose z tohto hostiteľa", + "Cesta na uzle, predvolene /root/docker-compose.yml. Súbor musí existovať a nesmie presiahnuť 256 KiB." + ], + [ + "Stiahnuť súbor Compose z adresy", + "Adresa http:// alebo https://, ktorá poskytuje nespracovaný YAML. Stiahne sa najviac 256 KiB." + ], + [ + "Vložiť príkaz docker run do terminálu", + "Príkaz zverejnený projektom. Prispôsobia sa porty, prostredie, zväzky, zariadenia, capabilities, používateľ, zdieľaná pamäť a ďalšie podporované voľby." + ], + [ + "Iba odkaz na obraz, bez súboru Compose", + "Odkaz, napríklad ghcr.io/user/application:latest. Vyhľadá sa obraz v registri a zachovajú sa jeho metadáta OCI." + ], + [ + "Vložiť oci-compose do terminálu", + "Vložte JSON do terminálu a ukončite ho pomocou Ctrl+D. Nekonvertuje sa: overí sa a nainštaluje tak, ako je napísaný." + ], + [ + "Načítať oci-compose z tohto hostiteľa", + "Súbor JSON na uzle, predvolene /root/oci-compose.json, s veľkosťou najviac 2 MiB." + ], + [ + "Stiahnuť oci-compose z adresy", + "Adresa http:// alebo https://, ktorá poskytuje súbor JSON. Stiahnu sa najviac 2 MiB." + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-source-menu.png", + "alt": "Menu výberu spôsobu opisu obrazu mimo katalógu", + "caption": "Spôsoby opisu obrazu mimo katalógu." + } + } + ] + }, + { + "id": "reference-only", + "title": "Čo poskytuje samotný odkaz na obraz", + "intro": "Obraz obsahuje metadáta svojho procesu, nie však celé prostredie, ktoré zvyčajne dopĺňa súbor Compose.", + "blocks": [ + { + "table": { + "headers": [ + "Načítané z obrazu", + "Nie je v obraze", + "Dôsledok" + ], + "rows": [ + [ + "Entrypoint, Cmd, User, WorkingDir a zahrnuté prostredie", + "Premenné uvedené iba v dokumentácii", + "Pridajú sa pri inštalácii alebo cez Upraviť" + ], + [ + "Zväzky deklarované obrazom", + "Adresáre hostiteľa uvedené iba v súbore Compose", + "Ďalšie cesty sa pridajú pred inštaláciou" + ], + [ + "Porty EXPOSE", + "URL, protokol alebo funkčná kontrola služby", + "Potvrdí sa port a spôsob kontroly služby" + ], + [ + "Architektúry a digest v registri", + "Zariadenia, oprávnenia alebo externé závislosti", + "Bez požiadavky v definícii sa nepovolia" + ] + ] + } + } + ] + }, + { + "id": "review", + "title": "Kontrola pred inštaláciou", + "intro": "Po prispôsobení definície ProxMenux zobrazí, ako ju pochopil, ešte pred otázkami na VMID, zdroje a úložisko.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Analyzovať", + "body": "Načítajú sa služby, obraz, porty, cesty, prostredie, zariadenia, zabezpečenie a kontroly stavu." + }, + { + "title": "Overiť obraz v registri", + "body": "Obraz musí existovať v registri a zobrazia sa jeho publikované architektúry. Súkromný register sa načíta pomocou účtu uloženého pre daný register." + }, + { + "title": "Uviesť nepoužité voľby", + "body": "Vypíšu sa štítky, siete Docker, nastavenia Swarm a ďalšie kľúče, ktoré nemajú na LXC vplyv." + }, + { + "title": "Zablokovať voľby bez bezpečného ekvivalentu", + "body": "Kľúče bez bezpečného ekvivalentu sa zobrazia v časti Voľby bez ekvivalentu a inštalácia nepokračuje. Žiadny sa nevynechá bez upozornenia." + }, + { + "title": "Vyžiadať tajné údaje", + "body": "Premenné, ktorých názov označuje heslo, token alebo kľúč, sa pri inštalácii vyžiadajú ako citlivé údaje." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-review.png", + "alt": "Súhrn interpretácie súboru Compose v ProxMenux", + "caption": "Súhrn zobrazený pred otázkami na VMID a zdroje." + } + }, + { + "p": "Po potvrdení súhrnu nasleduje rovnaký postup ako v katalógu: názov, predvolený alebo rozšírený režim, VMID, CPU, pamäť, sieť, spúšťanie s uzlom, trvalé a ďalšie cesty, kompatibilné zariadenia a záverečný súhrn." + } + ] + }, + { + "id": "examples", + "title": "Príklady vstupu", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Compose", + "code": "services:\n app:\n image: ghcr.io/example/app:latest\n ports:\n - \"8080:8080\"\n volumes:\n - ./config:/config\n - /srv/media:/media\n environment:\n TZ: Europe/Madrid" + }, + { + "title": "docker run", + "code": "docker run -d \\\n --name app \\\n -p 8080:8080 \\\n -e TZ=Europe/Madrid \\\n -v app-config:/config \\\n -v /srv/media:/media \\\n ghcr.io/example/app:latest" + } + ] + } + } + ] + }, + { + "id": "oci-compose", + "title": "Ručne napísaný oci-compose", + "intro": "oci-compose je súbor JSON, z ktorého sa inštaluje aplikácia. Katalóg uchováva jeden pre každú aplikáciu. Rovnaký formát možno napísať ručne a nainštalovať touto voľbou.", + "blocks": [ + { + "p": "V ručne napísanom súbore autor určí obraz, porty, premenné, zväzky a otázky pri inštalácii. ProxMenux pri načítaní doplní zvyšok. Formát vyjadrí aj to, čo Compose neobsahuje: text otázky, heslo vytvorené pri inštalácii, profil GPU, vlastníka každého zväzku, kontrolu prvého spustenia alebo prihlasovacie údaje zobrazené na konci." + }, + { + "steps": { + "items": [ + { + "title": "Overiť", + "body": "Súbor s chybami sa nenainštaluje. Každá chyba označí príslušné pole; pri neplatnom JSON sa uvedie riadok a stĺpec." + }, + { + "title": "Skontrolovať", + "body": "Platný súbor zobrazí, čo nainštaluje: obraz, webovú adresu, porty, trvalé cesty, premenné požadované pri inštalácii a súbory, ktoré zapíše." + }, + { + "title": "Nainštalovať", + "body": "Inštalácia je rovnaká ako pri aplikáciách katalógu, s predvolenými alebo rozšírenými nastaveniami." + } + ] + } + }, + { + "calloutWarning": { + "title": "Súbor, ktorý určuje oprávnenia", + "body": "oci-compose určuje, čo sa v kontajneri pripojí a s akými oprávneniami. Kontrola to ukáže pred inštaláciou: používajte iba súbory z dôveryhodných zdrojov." + } + }, + { + "p": "Formát je opísaný po blokoch s dvoma úplnými príkladmi v README enginu OCI. Rovnakým spôsobom možno načítať aj záznam inštalácie: použije sa iba pôvodná šablóna, nie odpovede z danej inštalácie." + } + ] + }, + { + "id": "private-registries", + "title": "Obrazy v súkromných registroch", + "intro": "Obraz zo súkromného registra, napríklad súkromný balík GitHub alebo repozitár Docker Hub, sa načíta pomocou účtu uloženého v ProxMenux.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Register odmietne prístup k obrazu", + "body": "Ak register oznámi, že obraz vyžaduje účet, kontrola ponúkne prihlásenie a potom obraz načíta znova." + }, + { + "title": "Prihlásiť sa", + "body": "Používateľské meno a heslo alebo token s oprávnením na stiahnutie obrazu. Register ich overí a uložia sa iba pri úspešnom overení." + }, + { + "title": "Nainštalovať a udržiavať aktuálne", + "body": "Účet sa použije na stiahnutie obrazu pri inštalácii aj pri aktualizáciách, úpravách, opätovnom vytvorení, vo watchdogu a pri kontrole aktualizácií Monitora na ľubovoľnom uzle klastra." + } + ] + } + }, + { + "p": "Účty registrov v hlavnom menu OCI manager Apps zobrazujú uložené účty podľa registra a používateľa, nikdy nie ich tajné údaje. Z každého účtu možno overiť, stiahnuť alebo nainštalovať obraz a aktualizovať alebo odstrániť prihlasovacie údaje." + }, + { + "list": { + "items": [ + "GitHub (ghcr.io): používateľ je účet GitHub a heslo je osobný prístupový token s oprávnením read:packages.", + "Docker Hub (docker.io): používateľ je účet Docker Hub a heslo je prístupový token s oprávnením na čítanie.", + "Ostatné registre, aj s vlastným portom, napríklad registry.example.com:5000: používateľské meno a heslo alebo token poskytnuté daným registrom." + ] + } + }, + { + "calloutInfo": { + "title": "Kde sa účty ukladajú", + "body": "V /etc/pve/priv/proxmenux/registry-auth.json, ktorý môže čítať iba root, v rovnakom adresári ako heslá úložísk Proxmox. /etc/pve zdieľajú všetky uzly klastra, preto sa účet pridaný na jednom uzle používa na všetkých. Záloha hostiteľa tento súbor obsahuje a odinštalovanie ProxMenux ho odstráni zo všetkých uzlov." + } + } + ] + }, + { + "id": "limits", + "title": "Definície, ktoré sa nenainštalujú", + "blocks": [ + { + "list": { + "items": [ + "Dockerfile bez publikovaného obrazu: obraz sa musí najprv zostaviť a zverejniť v registri OCI.", + "Súbor Compose s viacerými službami sa zablokuje, pretože táto voľba inštaluje iba jednu službu do jedného kontajnera, aj keď viaceré služby používajú rovnaký obraz.", + "configs, externé tajné údaje alebo formáty zariadení, ktoré nemožno jednoznačne prispôsobiť.", + "Nahradenia shellu, napríklad $(command): namiesto nich treba zapísať výslednú hodnotu.", + "Nerozpoznané voľby docker run a --env-file: namiesto nich použite súbor Compose s výslovne uvedenými hodnotami." + ] + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/oci-manager/hardware.json b/web/messages/sk/docs/oci-manager/hardware.json new file mode 100644 index 00000000..f6a5bf36 --- /dev/null +++ b/web/messages/sk/docs/oci-manager/hardware.json @@ -0,0 +1,392 @@ +{ + "meta": { + "title": "Zariadenia a zrýchlenie ProxMenux", + "description": "Ako OCI manager Apps sprístupňuje GPU, NVIDIA, Coral, USB, FUSE a ďalšie zariadenia kontajneru OCI ako overené natívne zdroje Proxmox VE." + }, + "header": { + "title": "Zariadenia a akcelerácia", + "description": "GPU, NVIDIA, Coral, USB, FUSE a blokové zariadenia sa stávajú overenými natívnymi zdrojmi Proxmox VE pre kontajner.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "principle", + "title": "Zariadenie, ktoré aplikácia potrebuje, nie celý hostiteľ", + "blocks": [ + { + "p": "Zariadenie požadované súborom Compose alebo aplikačným profilom sa stáva konkrétnou položkou devN alebo LXC pripojením. Požiadanie o GPU, USB zariadenie alebo Coral nerobí kontajner privilegovaným." + }, + { + "flow": { + "nodes": [ + { + "label": "Inventár hostiteľa", + "detail": "/dev/dri/renderD128\nGID 993 · Intel" + }, + { + "label": "ProxMenux", + "detail": "výrobca a\noverenie oprávnení" + }, + { + "label": "LXC", + "detail": "rovnaké zariadenie\nefektívne GID" + } + ] + } + } + ] + }, + { + "id": "origin", + "title": "Odkiaľ pochádza požiadavka na zariadenie", + "blocks": [ + { + "table": { + "headers": [ + "Zdroj", + "Čo sa číta", + "Čo robí inštalátor" + ], + "rows": [ + [ + "Docker Compose", + "devices, group_add, deploy.resources a NVIDIA žiadosti", + "Každá požiadavka sa stáva požiadavkou zariadenia zobrazenou na preskúmanie" + ], + [ + "Katalógový profil", + "Podpora GPU, Coral, OpenCL, USB alebo FUSE, ktorú aplikácia skutočne má", + "Ponúkajú sa len možnosti overené pre tento obraz" + ], + [ + "Metadáta a dokumentácia obrazu", + "VA-API, Selkies, LinuxServer mods alebo NVIDIA runtime", + "Pridávajú sa zdokumentované premenné a príprava" + ], + [ + "Výber užívateľa", + "iba CPU, Intel/AMD, OpenCL, NVIDIA alebo voliteľné zariadenie", + "Výber je uložený v inštančnej zmluve" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Zistené zariadenia sa nepripájajú automaticky", + "body": "Na hostiteľovi sa vytvorí inventár, ale ponúknu a pripoja sa len zariadenia deklarované v súbore Compose alebo kompatibilnom profile. GPU, USB adaptér či Coral prítomný na hostiteľovi sa nesprístupní každému LXC." + } + } + ] + }, + { + "id": "identify", + "title": "Ako sa identifikuje hostiteľské zariadenie", + "intro": "Pred úpravou LXC sa zariadenie číta na hostiteľovi a zodpovedá zvolenému profilu.", + "blocks": [ + { + "table": { + "headers": [ + "Typ", + "Identita", + "Overenie" + ], + "rows": [ + [ + "Intel/AMD DRM", + "/dev/dri/renderD* a /sys/class/drm/NODE/device/vendor", + "Znakové zariadenie s výrobcom 0x8086 (Intel) alebo 0x1002 (AMD)" + ], + [ + "AMD OpenCL", + "Renderovací uzol a /dev/kfd, ak ho profil potrebuje", + "Existencia, typ, výrobca, oprávnenia a deklarovaná zlučiteľnosť" + ], + [ + "AMD ROCm", + "Renderovací uzol, /dev/kfd a generácia, ktorú výpočtový ovládač hlási v /sys/class/kfd/kfd/topology/nodes/*/properties", + "Generácia, pre ktorú obraz ROCm aplikácie obsahuje výpočtové jadrá — uvedené GPU RDNA2 a novšie — sa ponúkne bez úprav. Ostatné GPU týchto rodín, napríklad Radeon 680M a 780M, sa ponúkajú ako experimentálne a nikdy nie sú navrhnutou voľbou: ROCm ich oficiálne nepodporuje, aplikácia ich prezentuje ako generáciu danej rodiny (HSA_OVERRIDE_GFX_VERSION) a inštalátor pred stiahnutím väčšieho obrazu vyžiada potvrdenie. Staršia GPU, napríklad integrovaná grafika Ryzen 5000U, sa neponúkne a Immich ponechá rozpoznávanie na CPU." + ], + [ + "NVIDIA", + "nvidia-smi a nvidia-container-cli", + "GPU, UUID, PCI bus, verzia ovládača, Toolkit, uzly /dev/nvidia*, binárne súbory a knižnice" + ], + [ + "Coral PCIe/M.2", + "/dev/apex_N a jeho odkaz na /sys/dev/char/MAJOR:MINOR", + "Uzol znakového zariadenia, čísla major/minor, vlastník, GID a oprávnenia" + ], + [ + "USB a sériové", + "/dev/ttyUSB*, /dev/ttyACM* alebo /dev/bus/usb/BBB/DDD", + "Uzol znakového zariadenia; pri USB aj výrobca, produkt a sériové číslo, ak ich sysfs zverejňuje" + ], + [ + "KVM, TUN, FUSE, video a generické SCSI", + "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN alebo /dev/sgN", + "Podporovaná cesta, typ uzla a účinné práva" + ], + [ + "Optická mechanika", + "/dev/srN", + "Blokové zariadenie" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Čo sa stane počas inštalácie", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Šablóna ponúka svoje profily", + "body": "Napríklad len CPU, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL alebo NVIDIA. Možnosti patria k obrazu, nie k spoločnému menu." + }, + { + "title": "Vyberie sa profil", + "body": "Určuje uzly zariadení, prostredie, mody alebo runtime, ktoré aplikácia potrebuje." + }, + { + "title": "Navrhuje sa cesta", + "body": "Pre DRM, /dev/dri/renderD128, ktoré môžu byť zmenené na hostiteľa s niekoľkými renderových uzlov. Pre USB alebo sériový je vybraný konkrétny uzol." + }, + { + "title": "Overenie", + "body": "Existencia, typ, povolený výrobca, povolenia a GID sú kontrolované. Nesúlad zastaví operáciu." + }, + { + "title": "Zapíše sa kontrakt", + "body": "Cesta, režim, GID, zápis a profil sa zaznamenávajú pre aktualizácie a opätovné vytvorenia." + }, + { + "title": "Pripojenie a skúška", + "body": "pct set pridáva položku devN a prístup sa potom kontroluje vo vnútri LXC. LinuxServer obrazy sú tiež kontrolované ako používateľ abc." + } + ] + } + } + ] + }, + { + "id": "config", + "title": "Ako sa objavuje v konfigurácii LXC", + "intro": "Ilustračné hodnoty: dev0 a dev1 sú voľné pozície priradené Proxmox VE. renderD128, apex_0 a GID závisia od hardvéru uzla.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Intel/AMD VA-API", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" + }, + { + "title": "Coral PCIe/M.2", + "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "Špecifické USB zariadenie", + "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "AMD OpenCL", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" + } + ] + } + }, + { + "p": "GID sa načíta na hostiteľovi pomocou stat a zapíše do položky devN; nepredpokladá sa, že skupiny render a video majú pevné číslo. Zariadenie má v LXC rovnakú cestu /dev, na ktorej ho vyhľadávajú vlastné mechanizmy aplikácie." + } + ] + }, + { + "id": "profiles", + "title": "Profily, ktoré môže obraz ponúknuť", + "blocks": [ + { + "table": { + "headers": [ + "Profil", + "Výsledná konfigurácia", + "Ponúknuté, keď" + ], + "rows": [ + [ + "Intel/AMD VA-API", + "Renderovací uzol /dev/dri", + "Aplikácia podporuje video zrýchlenie" + ], + [ + "OpenCL", + "Render uzol, /dev/kfd v prípade potreby a oficiálny mod", + "Obraz alebo profil ho dokumentuje" + ], + [ + "NVIDIA", + "Zariadenia a knižnice ovládača na hostiteľovi", + "Hostiteľ má funkčný ovládač a NVIDIA Container Toolkit" + ], + [ + "Coral", + "/dev/apex_0 alebo zbernica USB", + "Profil vyhlasuje Coral podporu (Frigate)" + ], + [ + "USB, sériové, FUSE", + "Jediné zariadenie, validovaný strom alebo funkcia LXC", + "Zmluva o ňu žiada" + ] + ] + } + } + ] + }, + { + "id": "nvidia", + "title": "NVIDIA", + "blocks": [ + { + "calloutWarning": { + "title": "Požiadavka na uzol: NVIDIA Container Toolkit", + "body": "Funkčný ovládač na Proxmox VE nestačí na sprístupnenie GPU NVIDIA obrazu OCI. OCI manager Apps používa nvidia-container-cli zo súpravy NVIDIA Container Toolkit na identifikáciu zariadení a získanie binárnych súborov a knižníc zodpovedajúcich načítanému ovládaču." + } + }, + { + "p": "Inštalátor NVIDIA nástroja ProxMenux nainštaluje NVIDIA Container Toolkit z oficiálneho repozitára NVIDIA spolu s ovládačom. Skontroluje jeho štyri balíky, overí nvidia-container-cli a zaznamená výsledok do denníka zmien Audit a správa." + }, + { + "p": "Tieto dva príkazy na hostiteľovi ukazujú, či je k dispozícii ovládač a súbor nástrojov:" + }, + { + "shell": { + "code": "nvidia-smi -L\nnvidia-container-cli --version" + } + }, + { + "p": "Na hostiteľovi, kde bol ovládač nainštalovaný inými prostriedkami, je Toolkit nainštalovaný z oficiálneho stabilného úložiska:" + }, + { + "shell": { + "code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools" + } + }, + { + "p": "Inventár, ktorý používa OCI manager Apps, je výstupom príkazu:" + }, + { + "shell": { + "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" + } + }, + { + "calloutInfo": { + "title": "Konfigurácia Runtime Docker nie je zahrnutá", + "body": "Kontajnery sú natívne LXC a nepoužívajú démona Docker, takže nvidia-ctk runtime configure --runtime=docker nehrá žiadnu úlohu: ProxMenux priamo volá nvidia-container-cli a zapíše zariadenia a pripojenia LXC. Príkazy a podporované platformy sú uvedené v návode na inštaláciu NVIDIA Container Toolkit." + } + }, + { + "cards": { + "items": [ + { + "icon": "cpu", + "title": "Inventár z ovládača", + "body": "nvidia-container-cli uvádza uzly zariadenia, binárne súbory, firmware a knižnice nainštalovaného ovládača." + }, + { + "icon": "refresh", + "title": "Bez pevnej verzie", + "body": "Šablóna nepomenuje súbory knižnice. Profil je generovaný z aktuálneho hostiteľa." + }, + { + "icon": "shield", + "title": "Pripojenia iba na čítanie", + "body": "Hostiteľské knižnice sú namontované iba na čítanie namiesto kopírovania do kontajnera." + }, + { + "icon": "hardDrive", + "title": "Zmeny ovládača", + "body": "Po zmene ovládača sa inventár znovu vygeneruje pred začiatkom postihnutých LXC." + } + ] + } + }, + { + "code": { + "title": "Výsledok NVIDIA (zjednodušený)", + "code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0" + } + }, + { + "p": "Sprístupniť len /dev/nvidia0 nestačí. Komponenty užívateľského priestoru načítaného ovládača sú namontované len na čítanie a nvidia-smi potom beží vnútri LXC pre porovnanie GPU, UUID, PCI zbernice a verzie s inventárom hostiteľa." + } + ] + }, + { + "id": "usb", + "title": "USB, sériové a USB Coral", + "blocks": [ + { + "calloutWarning": { + "title": "Číslovanie USB sa môže zmeniť", + "body": "Cesta ako /dev/bus/usb/003/004 sa môže zmeniť po opätovnom pripojení zariadenia alebo reštarte hostiteľa. Profil zaznamená výrobcu, produkt a sériové číslo, ak sú dostupné, ale nová adresa zbernice sa automaticky nepremapuje." + } + }, + { + "p": "Periférne zariadenie je daný jeho konkrétnym uzlom: /dev/ttyUSB0, /dev/ttyACM0, /dev/apex_0 alebo /dev/bus/usb/BBB/DDD. Sprístupnenie celého /dev nie je akceptovaný. Coral je ponúkaný len pre aplikácie, ktorých profil deklaruje." + } + ] + }, + { + "id": "trees", + "title": "Stromy zariadení a funkcie LXC", + "blocks": [ + { + "table": { + "headers": [ + "Žiadosť", + "Výsledná konfigurácia", + "Rozsah" + ], + "rows": [ + [ + "/dev/dvb, /dev/snd alebo /dev/bus/usb", + "Každý uzol znakového zariadenia v strome dostane vlastnú položku devN s režimom a GID hostiteľa", + "Len požadovaný strom, nie zvyšok /dev" + ], + [ + "/dev/fuse", + "Uzol a, keď ho profil potrebuje, funkcia fuse=1", + "Samotná FUSE nepublikuje pripojenia do iných LXC" + ], + [ + "/dev/net/tun", + "Položka devN s rovnakou cestou vo vnútri LXC", + "VPN alebo konfigurácia siete zostáva v aplikácii" + ], + [ + "/dev/kvm", + "Potvrdená položka devN", + "Ponúkané iba vtedy, keď o to zmluva požiada" + ] + ] + } + } + ] + }, + { + "id": "security", + "title": "Potvrdenie podľa úrovne rizika", + "blocks": [ + { + "p": "Konkrétne zariadenia, voliteľné privilégium, požadované privilégium, AppArmor alebo seccomp relaxácia a prístup k mennému priestoru PID hostiteľa sa považujú za samostatné prípady, nie pod jedným generickým privilegovaným označením. Každá možnosť s rizikom sa vysvetľuje a potvrdzuje počas inštalácie." + } + ] + } + ] +} diff --git a/web/messages/sk/docs/oci-manager/index.json b/web/messages/sk/docs/oci-manager/index.json new file mode 100644 index 00000000..00fea885 --- /dev/null +++ b/web/messages/sk/docs/oci-manager/index.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "OCI manager Apps | ProxMenux", + "description": "Spúšťajte oficiálne obrazy OCI ako natívne kontajnery LXC v Proxmox VE, s trvalými údajmi, prístupom k zariadeniam, aplikáciami s viacerými kontajnermi a transakčnými aktualizáciami." + }, + "header": { + "title": "OCI manager Apps", + "description": "Oficiálne obrazy OCI bežia ako natívne kontajnery LXC v Proxmox VE. Používa sa rovnaký obraz, aký zverejňuje jeho správca; ProxMenux vytvorí prostredie, ktoré by okolo neho pripravil Docker Compose.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "model", + "blocks": [ + { + "calloutInfo": { + "title": "Jeden obraz OCI, jeden natívny LXC", + "body": "V kontajneroch nebeží Docker Engine. Proxmox VE importuje súborový systém obrazu a jeho metadáta OCI. Aplikácia sa stane hlavným procesom natívneho LXC, ktorý sa spravuje rovnakými nástrojmi ako ostatné kontajnery uzla." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Zdroj", + "detail": "Obraz OCI\nCompose a dokumentácia" + }, + { + "label": "ProxMenux", + "detail": "Kontrakt JSON\noverenie a plánovanie" + }, + { + "label": "Proxmox VE", + "detail": "Natívny LXC\nzväzky a zariadenia" + } + ], + "caption": "Používa sa pôvodná aplikácia; jej prostredie sa deklaratívne opíše a následne znovu vytvorí." + } + } + ] + }, + { + "id": "where", + "title": "Kde ho nájdete", + "intro": "Na uzle Proxmox otvorte ako root položku OCI manager Apps (Technology Preview) v hlavnom menu ProxMenux. Úvodná obrazovka ponúka:", + "blocks": [ + { + "list": { + "items": [ + "Vyhľadať aplikácie – vyhľadávanie podľa názvu v celom katalógu.", + "Všetky aplikácie – úplný katalóg s počtom aplikácií.", + "Spravovať nainštalované aplikácie OCI – aktualizovať, upravovať, odstraňovať alebo obnovovať existujúce inštalácie.", + "Účty registrov – správa účtov na inštaláciu a aktualizáciu obrazov zo súkromných registrov.", + "Nainštalovať obraz mimo katalógu – prispôsobiť súbor Compose, príkaz docker run alebo odkaz na obraz.", + "Kategórie katalógu, každá s počtom aplikácií." + ] + } + }, + { + "figure": { + "src": "/oci-manager/main-menu.png", + "alt": "Hlavná obrazovka OCI manager Apps s vyhľadávaním, úplným katalógom, správou aplikácií, obrazmi mimo katalógu a kategóriami.", + "caption": "Hlavná obrazovka OCI manager Apps." + } + }, + { + "p": "Po výbere aplikácie sa zobrazí jej opis, používaný obraz a dva režimy inštalácie. Inštalovať s predvolenými nastaveniami sa pýta len na základné voľby: úložisko, umiestnenie údajov, adresu a spustenie. Inštalovať s rozšírenými nastaveniami postupne prejde všetky rozhodnutia: VMID a zdroje, úložisko pre každú cestu, sieťový most a zariadenia." + }, + { + "p": "Aplikácie, ktoré boli skutočne otestované, majú v tomto zobrazení označenie Overené a v zoznamoch značku ✓. Platí to pre testy v laboratóriu ProxMenux aj pre testy komunity." + } + ] + }, + { + "id": "beta", + "title": "Prečo má označenie Technology Preview", + "blocks": [ + { + "p": "OCI manager Apps ponecháva označenie Technology Preview, ktoré Proxmox VE používa pre aplikačné kontajnery vytvorené z obrazov OCI. Ich podpora bola zavedená v Proxmox VE 9.1. Označenie sa týka technológie, na ktorej OCI manager Apps beží, nie jadra ProxMenuxu: správanie týchto kontajnerov sa ešte môže meniť medzi vydaniami Proxmox VE. Označenie zostane, kým Proxmox VE túto podporu neoznačí za stabilnú." + }, + { + "p": "Funkcie OCI manager Apps sa testujú v laboratóriu ProxMenux: inštalácia, aktualizácia, úpravy, opätovné vytvorenie, zálohovanie, obnova, migrácia a watchdog. Každá aplikácia sa overuje samostatne. Skutočne otestované aplikácie majú označenie Overené a v zoznamoch značku ✓." + } + ] + }, + { + "id": "translation", + "title": "Ako Docker opisuje požiadavky a OCI manager Apps ich realizuje", + "blocks": [ + { + "table": { + "headers": [ + "Požiadavka", + "Vyjadrenie v Dockeri", + "Realizácia v OCI manager Apps" + ], + "rows": [ + [ + "Spustiť aplikáciu", + "image, entrypoint, command", + "Rootfs obrazu OCI a hlavný proces LXC" + ], + [ + "Zachovať konfiguráciu", + "volumes: /config", + "Trvalý zväzok mpN zahrnutý do zálohy alebo adresár na hostiteľovi." + ], + [ + "Sprístupniť službu", + "ports", + "Vlastná adresa pre LXC a URL na prístup k službe." + ], + [ + "Použiť hardvér", + "devices, group_add", + "Záznamy devN s efektívnym GID hostiteľa a overeným profilom." + ], + [ + "Prepojiť závislosti", + "networks, depends_on", + "Súkromný sieťový most, pevné adresy, poradie spúšťania a kontroly stavu." + ], + [ + "Aktualizovať", + "Stiahnuť cez pull a znovu vytvoriť", + "Nový rootfs so zachovaným kontraktom trvalých údajov." + ] + ] + } + } + ] + }, + { + "id": "kept", + "title": "Čo zostáva a čo sa mení", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Zachované", + "body": "Oficiálny obraz, jeho vnútorné cesty, prostredie, proces spustenia a dokumentácia používania." + }, + { + "icon": "boxes", + "title": "Prispôsobené", + "body": "Prostredie behu: sieť, trvalé údaje, zariadenia, oprávnenia a závislosti využívajú natívne mechanizmy LXC v Proxmox VE." + }, + { + "icon": "shield", + "title": "Bez ekvivalentu", + "body": "Voľba Compose bez bezpečného ekvivalentu sa označí ako prekážka inštalácie. Šablóny s takými prekážkami sa na inštaláciu neponúkajú a citlivé voľby vyžadujú potvrdenie v sprievodcovi." + }, + { + "icon": "refresh", + "title": "Uložené", + "body": "Digest obrazu, zdroje, cesty, sieť, zariadenia a príslušnosť k zostave sa ukladajú do kontraktu inštancie. Aktualizácie aj opätovné vytvorenie tento kontrakt zachovávajú." + } + ] + } + } + ] + }, + { + "id": "pages", + "title": "Stránky tejto časti", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Ako sa prispôsobí obraz OCI", + "href": "/docs/oci-manager/architecture", + "tail": "Od obrazu a jeho súboru Compose k natívnemu LXC." + }, + { + "label": "Inštalácia obrazu mimo katalógu", + "href": "/docs/oci-manager/custom-image", + "tail": "Súbor Compose, príkaz docker run alebo odkaz na obraz." + }, + { + "label": "Údaje, cesty a sieť", + "href": "/docs/oci-manager/storage-network", + "tail": "Zväzky kontajnera, adresáre hostiteľa, pripojenia cez rclone a adresy." + }, + { + "label": "Zariadenia a akcelerácia", + "href": "/docs/oci-manager/hardware", + "tail": "GPU, NVIDIA, Coral, USB a ďalšie zariadenia." + }, + { + "label": "Aplikácie s viacerými kontajnermi", + "href": "/docs/oci-manager/stacks", + "tail": "Aplikácia, databáza a vyrovnávacia pamäť v koordinovaných LXC." + }, + { + "label": "Inštalácia, aktualizácia a úpravy", + "href": "/docs/oci-manager/lifecycle", + "tail": "Kontrakt inštancie a operácie s ním." + }, + { + "label": "V ProxMenux Monitor", + "href": "/docs/oci-manager/monitor", + "tail": "Verzie, aktualizácie, výstup konzoly a terminál." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/oci-manager/lifecycle.json b/web/messages/sk/docs/oci-manager/lifecycle.json new file mode 100644 index 00000000..5f345b34 --- /dev/null +++ b/web/messages/sk/docs/oci-manager/lifecycle.json @@ -0,0 +1,499 @@ +{ + "meta": { + "title": "Inštalácia, aktualizácia a úpravy | ProxMenux", + "description": "Kontrakt inštancie kontajnera OCI a operácie, ktoré ho používajú: aktualizácia, úprava, odstránenie, zotavenie z prerušenej operácie a obnovenie prevádzky po obnove zo zálohy na tomto alebo inom hostiteľovi." + }, + "header": { + "title": "Inštalácia, aktualizácia a úpravy", + "description": "Každá inštancia uchováva reprodukovateľný kontrakt, takže jej rootfs možno nahradiť bez straty konfigurácie alebo trvalých dát.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "contract", + "title": "Kontrakt inštancie", + "blocks": [ + { + "p": "Po inštalácii sa výsledná konfigurácia uloží do /usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json. Nejde o kópiu pôvodného súboru Compose: je to reprodukovateľný kontrakt kontajnera LXC, ktorý existuje na tomto hostiteľovi." + }, + { + "code": { + "code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle" + } + }, + { + "p": "Kópia kontraktu sa nachádza v kontajneri v /.proxmenux/oci-record.json a môže ju čítať iba používateľ root kontajnera. Záloha kontajnera preto vždy obsahuje kontrakt platný v čase zálohovania. Druhá kópia je uložená v /etc/pve/priv/proxmenux/oci, ktorý zdieľajú všetky uzly klastra a môže ho čítať iba root hostiteľa. Obe kópie sa zapisujú po každej inštalácii, aktualizácii a zmene." + } + ] + }, + { + "id": "manage", + "title": "Spravovať nainštalované aplikácie OCI", + "intro": "Táto možnosť na hlavnej obrazovke zobrazí registrované inštancie s ich aplikáciou a obrazom. Pred každou akciou sa každá inštancia porovná so svojím kontraktom; CT, ktorý už nezodpovedá svojmu záznamu, sa neupraví ani neodstráni. Rovnaká aktualizácia a rovnaký editor sú dostupné na karte Aktualizácie v ProxMenux Monitor.", + "blocks": [ + { + "table": { + "headers": [ + "Možnosť", + "Čo sa zmení?", + "Čo sa uchováva" + ], + "rows": [ + [ + "Aktualizovať obraz pomocou uloženej konfigurácie", + "Rootfs sa nahradí obrazom, ktorý uložený kanál aktuálne publikuje", + "Zmluva, kontajnerové disky, hostiteľské adresáre, siete a zariadenia" + ], + [ + "Upraviť: upraviť zdroje, sieť, cesty a GPU", + "Editor sa otvorí s aktuálnym kontraktom; CT sa znova vytvorí so zmenami", + "Dáta kontajnerových diskov a hostiteľských adresárov" + ], + [ + "Watchdog: reštartovať aplikáciu pri havárii", + "Určuje, či sa aplikácia znova spustí, keď sa sama zastaví. Nič sa nevytvára znova", + "Celá inštalácia; len voľba je uložená v zmluve" + ], + [ + "Odstrániť: odstrániť aplikáciu a jej kontajnery", + "LXC alebo všetci členovia zostavy a ich kontrakty sa odstránia", + "Hostiteľské adresáre s obsahom" + ] + ] + } + }, + { + "p": "Pre aplikáciu s viacerými kontajnermi menu ponúka Aktualizovať všetky kontajnery aplikácie, Upraviť ďalšie cesty a zariadenia, Znovu vytvoriť všetky kontajnery s uloženou konfiguráciou, watchdog a odstránenie. Úprava pridáva alebo odstraňuje ďalšie cesty a zariadenia aplikačného kontajnera bez opätovného vytvárania. V Immich tiež mení zariadenie, ktoré vykonáva rozpoznávanie. Opätovné vytvorenie zostaví každý kontajner z pôvodne nainštalovaného obrazu bez vyhľadávania novšieho." + }, + { + "figure": { + "src": "/oci-manager/manage-menu.png", + "alt": "Zoznam nainštalovaných aplikácií OCI s možnosťami aktualizácie, úpravy a odstránenia", + "caption": "Spravovať nainštalované aplikácie OCI." + } + } + ] + }, + { + "id": "update", + "title": "Transakčná aktualizácia", + "blocks": [ + { + "mermaid": { + "chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end", + "labels": { + "user": "Používateľ", + "registry": "Register OCI", + "update": "Aktualizovať inštanciu", + "resolve": "Zistiť obraz podľa značky", + "verify": "Overiť archív a vykonať predbežné kontroly", + "backup": "Zastaviť a zálohovať CT", + "import": "Importovať nové rootfs", + "reapply": "Znova použiť kontrakt", + "healthy": "v poriadku", + "failure": "zlyhanie", + "commit": "Kontrakt zverejnený s novým digestom", + "restored": "Predchádzajúca inštancia obnovená" + } + } + }, + { + "list": { + "items": [ + "Ak register stále poskytuje nainštalovaný digest, nič sa nesťahuje a inštancia zostáva nezmenená.", + "Nový obraz sa overí vrstvu po vrstve ešte pred zastavením CT. Poškodené stiahnutie sa zopakuje druhýkrát; obraz už uložený vo vyrovnávacej pamäti, ktorý neprejde kontrolou, sa stiahne znova.", + "Nastavenia zmenené v Proxmox VE po inštalácii (pamäť, swap, jadrá, limit CPU, priorita CPU, spustenie spolu s uzlom) sa zachovajú a prenesú do nového kontraktu.", + "Rozhranie LAN, ktoré pridáva súprava Arr a aplikácie s viacerými kontajnermi (net1), aj poradie spúšťania (startup) sa bez zmeny prenesú do nového kontajnera.", + "Akýkoľvek iný rozdiel medzi CT a jeho zmluvou zastaví aktualizáciu pred zastavením CT." + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Pred", + "detail": "rootfs A\n/config mp0\n/media hostiteľský adresár" + }, + { + "label": "Aktualizácia", + "detail": "nahradí iba\nrootfs" + }, + { + "label": "Po", + "detail": "rootfs B\n/config mp0\n/media hostiteľský adresár" + } + ] + } + }, + { + "p": "Pred zastavením čohokoľvek sa overí dostatok miesta pre zálohu: využité dáta na zálohovaných zväzkoch plus rezerva. Záloha sa zapisuje vedľa záznamu aplikácie na systémový disk hostiteľa. Ak tam nie je dosť miesta, ponuka vyžiada iné úložisko hostiteľa podporujúce zálohy. Záloha sa vytvorí tam a po skončení operácie sa odstráni. Výber sa zapamätá pre danú aplikáciu aj pre plánované aktualizácie. Ak žiadne úložisko nemá dosť miesta, operácia sa odmietne a aplikácia zostane nezmenená. Rovnako sa pred stiahnutím overí miesto pre nový obraz." + } + ] + }, + { + "id": "recovery", + "title": "Zotavenie z prerušenej operácie", + "intro": "Aktualizácia aj úprava používajú trvalo uloženú transakciu. Ak sa proces, terminál alebo uzol preruší po zastavení CT, operácia sa nepovažuje za dokončenú.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Značka nedokončenej operácie", + "body": "Keď sa otvorí správa nainštalovaných aplikácií OCI, uložený stav ukazuje, že výmena nebola nikdy zverejnená." + }, + { + "title": "Zobraziť stav", + "body": "Zobrazí dosiahnutú fázu bez zmeny kontajnerov alebo dát." + }, + { + "title": "Obnoviť predchádzajúcu inštaláciu", + "body": "Obnoví overenú natívnu zálohu vytvorenú pred výmenou aj predchádzajúci kontrakt." + }, + { + "title": "Zostavy ako celok", + "body": "V prípade aplikácie s viacerými kontajnermi je každý člen obnovený z rovnakého transakčného bodu, nielen z vybraného." + } + ] + } + }, + { + "calloutWarning": { + "title": "Hostiteľské adresáre sú mimo návratu do pôvodného stavu", + "body": "Záloha zahŕňa rootfs a disky kontajnera, ktoré sú do nej zahrnuté. Hostiteľský adresár sa nevracia do predchádzajúceho stavu, pretože jeho dáta môžu používať iné kontajnery LXC." + } + } + ] + }, + { + "id": "watchdog", + "title": "Watchdog: reštartovanie aplikácie, ktorá sa zastaví", + "intro": "Proxmox nemá politiku reštartovania: keď sa proces aplikačného kontajnera skončí, kontajner zostane zastavený. Pri zapnutom watchdogu sa aplikácia, ktorá sa sama zastaví, znova spustí. Pre aplikáciu OCI zabezpečuje to, čo restart: unless-stopped v súbore Compose.", + "blocks": [ + { + "table": { + "headers": [ + "Čo sa stane?", + "So zapnutým watchdogom" + ], + "rows": [ + [ + "Aplikácia havaruje alebo jej proces končí", + "Kontajner sa znova spustí do niekoľkých sekúnd" + ], + [ + "Zastaví sa alebo vypne cez Proxmox, Monitor alebo pomocou pct", + "Zostane zastavený, kým ho niekto nespustí" + ], + [ + "Pracuje na tom záloha, migrácia alebo operácia ProxMenux", + "Nič sa nerobí, kým to neskončí." + ], + [ + "Bol už zastavený pri spustení hostiteľa", + "Zostane zastavený; rozhoduje o tom Spustiť s Proxmox" + ], + [ + "Opakovane sa zastavuje hneď po spustení", + "Aplikácia, ktorá sa zastaví v priebehu niekoľkých sekúnd po spustení alebo sa nespustí vôbec, sa skúsi spustiť päťkrát s odstupmi 30 sekúnd, 1, 2 a 5 minút. Potom zostane zastavená a odošle sa oznámenie" + ] + ] + } + }, + { + "p": "Inštalátor sa na túto možnosť pýta v oboch režimoch inštalácie a navrhuje hodnotu uvedenú v recepte aplikácie. Neskôr sa mení cez Spravovať nainštalované aplikácie OCI alebo prepínačom Watchdog kontajnera v ProxMenux Monitor a platí pre všetky kontajnery aplikácie. Jediná služba hostiteľa, proxmenux-oci-watchdog.service, sleduje všetky aplikácie, ktoré si to vyžiadali; jej inštalácia je uvedená na karte Zmeny v Audit & Report." + }, + { + "calloutInfo": { + "title": "Čo hostiteľ nevie povedať", + "body": "Návratový kód aplikácie sa k hostiteľovi nedostane, takže riadne ukončenie a pád vyzerajú rovnako a v oboch prípadoch nasleduje reštart, podobne ako pri always a unless-stopped v Dockeri. Zastavenie vyžiadané mimo Proxmox pomocou lxc-stop alebo systemctl nevytvorí úlohu zastavenia a považuje sa za samovoľné zastavenie." + } + } + ] + }, + { + "id": "restore", + "title": "Zálohovanie, obnova a ďalší hostiteľ", + "intro": "Záloha vytvorená pomocou vzdump alebo Proxmox Backup Server obsahuje kontajner, disky kontajnera vybrané na zálohovanie a kópiu jeho kontraktu. To, čo inštalácia uchováva na hostiteľovi, do nej nepatrí. Spravovať nainštalované aplikácie OCI rozpozná kontajnery obnovené na hostiteľovi, ktorý nemá ich kontrakt, napríklad po novej inštalácii Proxmox alebo na inom hostiteľovi, a ponúkne ich opätovnú registráciu.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Obnoviť kontajnery v Proxmoxe", + "body": "Zo zálohovacieho úložiska, s pôvodným ID alebo ľubovoľným voľným ID. Aplikácia s viacerými kontajnermi potrebuje všetky svoje kontajnery." + }, + { + "title": "Otvoriť Spravovať nainštalované aplikácie OCI", + "body": "Zobrazia sa obnovené kontajnery a ponúkne sa obnovenie. Tlačidlo Obnoviť na karte Aktualizácie ProxMenux Monitor otvorí rovnaké obnovenie." + }, + { + "title": "Pred zmenou skontrolujte", + "body": "Obnova overí, či hostiteľ má všetko, čo každá aplikácia potrebuje. Aplikácia, ktorú nemožno obnoviť ako celok, zostane nezmenená a uvedie sa dôvod." + }, + { + "title": "Registrácia a spustenie", + "body": "Kontrakt sa zaregistruje na tomto hostiteľovi a znova sa zapíše to, čo na ňom inštalácia uchovávala. Spustenie aplikácií je samostatná otázka, na ktorú treba odpovedať Nie, ak pôvodné kontajnery stále bežia na inom hostiteľovi." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/restore-offer.png", + "alt": "Dialóg, ktorý uvádza obnovené kontajnery a ponúka ich obnoviť", + "caption": "Obnova ponúknutá po otvorení Spravovať nainštalované aplikácie OCI." + } + }, + { + "table": { + "headers": [ + "Čo si hostiteľ nechal?", + "Po zotavení" + ], + "rows": [ + [ + "Kontrakt inštancie", + "Zaregistruje sa z kópie v kontajneri, ktorá sa porovná s konfiguráciou obnovenou systémom Proxmox" + ], + [ + "Súkromná sieť multikontajnerovej aplikácie", + "Znova sa vytvorí s rovnakým mostom a podsieťou; pevné adresy kontajnerov sa nezmenia" + ], + [ + "Poradie spúšťania aplikácie s viacerými kontajnermi", + "Hookscript závislostí a jeho kontrakt sa znova nainštalujú; ak žiadne úložisko nepodporuje snippets, povolia sa na úložisku local" + ], + [ + "Sieťové sysctls a súbor host-monitor", + "Znova sa zapíšu do /etc/pve/proxmenux" + ], + [ + "Runtime NVIDIA", + "Hook neprivilegovaného kontajnera sa znova nainštaluje. Privilegovaný kontajner dostane súbory ovládača tohto hostiteľa namiesto súborov pôvodného hostiteľa" + ], + [ + "Pripojenie Rclone", + "Hookscript a programy, ktoré sprístupňujú pripojenie, sa znova zapíšu s rovnakými pohľadmi na hostiteľovi" + ], + [ + "Pravidlo firewallu hostiteľa pre monitor hostiteľa", + "Znova sa vyžiada súhlas pre webový port a podsieť mosta na tomto hostiteľovi" + ], + [ + "lost+found z každého obnoveného disku", + "Odstráni sa, ak je prázdny; obnova ho vytvorí a niektoré aplikácie sa nespustia, ak je medzi ich dátami" + ], + [ + "Disky obnovené na inom úložisku", + "Kontrakt sa aktualizuje podľa úložiska, na ktorom sa teraz nachádzajú" + ] + ] + } + }, + { + "p": "Kontajner obnovený s iným ID si zachová svoju aplikáciu. Kontrakt, záznam konzoly, sieťové nastavenia sysctl, hookscript pripojenia Rclone a poradie spúšťania viackontajnerovej aplikácie sa zaregistrujú s ID, ktoré majú kontajnery na tomto hostiteľovi." + }, + { + "table": { + "headers": [ + "Čo bráni obnove", + "Čo urobiť" + ], + "rows": [ + [ + "Chýba kontajner aplikácie s viacerými kontajnermi", + "Obnovte aj tento kontajner; aplikácia sa obnovuje ako celok" + ], + [ + "Súkromná podsieť sa už používa na tomto hostiteľovi", + "Obnova sa zruší a nič sa nezmení: adresy kontajnerov sú pevné a nepresúvajú sa do inej podsiete" + ], + [ + "Adresár hostiteľa neexistuje", + "Pripojiť alebo vytvoriť s jeho dátami; záloha kontajnera nezahŕňa adresáre hostiteľa" + ], + [ + "Zariadenie neexistuje na tomto hostiteľovi", + "Pripojte ho alebo ho odstráňte z kontajnera v Proxmox" + ], + [ + "Aplikácia s NVIDIA na hostiteľovi bez ovládača", + "Nainštalujte ovládač NVIDIA a Container Toolkit" + ], + [ + "Záloha bola vytvorená skôr, než existovala kópia kontraktu", + "Kontajner zostáva ako bežný LXC a nie je opäť ponúkaný" + ] + ] + } + }, + { + "calloutInfo": { + "title": "Kontajner, ktorý sa vráti", + "body": "Kontajner obnovený s pôvodným ID zo staršej zálohy, vrátený do snímky alebo presunutý späť z iného uzla nesie kontrakt svojho aktuálneho stavu. Ak sa pri výbere na operáciu jeho kontrakt líši od kontraktu na tomto hostiteľovi, operácia sa nespustí a ponúkne sa obnova kontajnera." + } + }, + { + "figure": { + "src": "/oci-manager/restore-result.png", + "alt": "Výsledok obnovy so súkromnou sieťou, poradím spúšťania a zaregistrovanými kontajnermi", + "caption": "Výsledok zotavenia, krok za krokom." + } + } + ] + }, + { + "id": "remove", + "title": "Odstránenie aplikácie OCI", + "blocks": [ + { + "p": "Pred potvrdením je zostavený súhrn zo skutočnej konfigurácie: kontajnery, ktoré sú odstránené, údaje s nimi vymazané, súkromná sieť, ktorá je uvoľnená a hostiteľské adresáre, ktoré sú uchovávané. Potvrdenie je predvolene Nie, pretože údaje z vymazaných diskov nie je možné následne obnoviť." + }, + { + "table": { + "headers": [ + "Prostriedok", + "Po odstránení", + "Dôvod" + ], + "rows": [ + [ + "rootfs a kontajnerové disky", + "Odstránia sa", + "Patria len do kontajnera." + ], + [ + "Adresár hostiteľa", + "Zachová sa aj s obsahom", + "Iné aplikácie ho môžu používať" + ], + [ + "Hostiteľské súbory kontajnera", + "Odstránia sa", + "Jeho záznam konzoly, sieťové parametre sysctl, hookscript pripojenia Rclone a registrácia na karte App v ProxMenux Monitor neslúžia žiadnemu inému kontajneru" + ], + [ + "Súbory zdieľané viacerými inštaláciami", + "Vymazané s poslednou inštaláciou, ktorá ich používa", + "Súbor monitora hostiteľa a hookscript závislostí aplikácií s viacerými kontajnermi" + ], + [ + "Kontrakt inštancie", + "Odstráni sa po úspešnom odstránení aplikácie", + "Už s ním nie je spojený žiadny CT" + ], + [ + "Súkromný most zostavy", + "Uvoľní sa spolu so zostavou", + "Nemá žiadnych členov na pripojenie" + ], + [ + "Sieť zdieľaná súpravou Arr", + "Uvoľní sa s poslednou aplikáciou súpravy", + "Každá aplikácia súpravy je nezávislá a odstraňuje sa samostatne" + ], + [ + "Jeden člen zostavy", + "Neodstránené samostatne", + "Odstráni sa celá aplikácia, aby nezostala neúplná zostava" + ], + [ + "Kontajner na inom uzle klastra", + "Neodstránené", + "Jeho záznam a súbory na hostiteľovi sú na uzle, kde bol nainštalovaný: odstráni sa tam po migrácii späť" + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/remove-summary.png", + "alt": "Prehľad odstránenia s dotknutými kontajnermi, dátami a adresármi hostiteľa", + "caption": "Prehľad odstránenia, postavený z reálnej konfigurácie." + } + } + ] + }, + { + "id": "archives", + "title": "Stiahnuté obrazy a miesto na hostiteľovi", + "blocks": [ + { + "p": "Archív OCI slúži na vytvorenie rootfs; bežiaci CT ho nečíta. Po inštalácii alebo aktualizácii sa zobrazia archívy stiahnuté počas danej operácie aj s ich veľkosťou a ponúkne sa ich odstránenie. Odstránením sa uvoľní miesto bez vplyvu na kontajner alebo jeho dáta." + }, + { + "calloutInfo": { + "title": "Aktualizácie nepotrebujú archív", + "body": "Bez archívu aktualizácia vyrieši uložený kanál a stiahne nový digest. S ním sa archív znova použije iba vtedy, keď sa jeho referencia a integrita zhodujú s požadovaným." + } + } + ] + }, + { + "id": "registry", + "title": "Register a čistenie", + "blocks": [ + { + "p": "Pri otvorení Spravovať nainštalované aplikácie OCI sa najskôr odstránia pozostatky kontajnerov, ktoré už neexistujú na žiadnom uzle klastra: uložený záznam kontajnera odstráneného cez rozhranie Proxmox, uchovávaný ako história, a súbory hostiteľa, ktoré zostali po odstránení. Záznam s nedokončenou operáciou sa zachová, pretože jeho záloha môže byť ešte potrebná. Zväzky ani adresáre hostiteľa sa nikdy neodstraňujú na základe domnienok." + } + ] + }, + { + "id": "cluster", + "title": "V klastri: migrácia a vysoká dostupnosť", + "intro": "Kontajner OCI je bežný LXC Proxmox: možno ho migrovať alebo spravovať pomocou HA ako ostatné, s rovnakými obmedzeniami. Všetko potrebné na spustenie je uložené tam, kde to nájde každý uzol klastra.", + "blocks": [ + { + "table": { + "headers": [ + "Časť", + "Na inom uzle klastra" + ], + "rows": [ + [ + "Konzolový log", + "Kontajner pred spustením vytvorí /var/log/proxmenux/oci na uzle, ktorý ho spúšťa. Každý uzol uchováva záznam spustení, ktoré vykonal." + ], + [ + "Sieťové parametre sysctl a monitor hostiteľa", + "Uchovávajú sa v /etc/pve/proxmenux, ktorý zdieľajú všetky uzly klastra, takže migrovaný kontajner ich nájde." + ], + [ + "Kontajnerové disky", + "Proxmox ich presúva s kontajnerom. HA potrebuje mať ich dáta dostupné na cieľovom uzle cez zdieľané úložisko alebo podporovanú konfiguráciu replikácie." + ], + [ + "Hostiteľské adresáre a zariadenia", + "Rovnaké pravidlá ako všetky LXC: hostiteľský adresár musí existovať na cieľovom uzle a musí byť označený ako zdieľaný a musí tam byť prítomný GPU, Coral alebo NPU." + ], + [ + "Záznam ProxMenux", + "Kontrakt zostáva na uzle, kde bola aplikácia nainštalovaná, a každý uzol číta kópiu v /etc/pve/priv/proxmenux/oci. Migrovaná aplikácia s jedným kontajnerom sa zaregistruje na cieľovom uzle po otvorení Spravovať nainštalované aplikácie OCI alebo po spustení operácie pre danú aplikáciu. Aplikácia s viacerými kontajnermi sa tam ponúkne na obnovu, pretože jej súkromná sieť sa musí vytvoriť na tomto uzle." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Nie je určené pre vysokú dostupnosť", + "body": "Aplikácia s viacerými kontajnermi komunikuje so svojimi členmi cez súkromný most uzla, na ktorom bola nainštalovaná, preto jej členovia zostávajú na tomto uzle. Monitor hostiteľa, napríklad Glances v režime hostiteľa alebo Netdata, sleduje uzol, na ktorom beží; presunutím by sledoval iný uzol." + } + }, + { + "p": "Pri obnove aplikácie dostane záloha obnovená mimo klastra súbory z /etc/pve/proxmenux, ktoré kontajner používa." + } + ] + }, + { + "id": "channel", + "title": "Priebežne aktualizovaná značka neznamená bezobslužnú aktualizáciu", + "blocks": [ + { + "p": "Katalóg nainštaluje priebežne aktualizovanú značku, ktorú publikuje správca, ale skutočný digest sa zistí a zaznamená a zmení sa iba explicitnou aktualizáciou s predbežnou kontrolou a možnosťou návratu späť. ProxMenux Monitor porovná nainštalovaný digest s digestom publikovaným registrom a zobrazí aj odošle upozornenie, keď je dostupný nový obraz." + } + ] + } + ] +} diff --git a/web/messages/sk/docs/oci-manager/monitor.json b/web/messages/sk/docs/oci-manager/monitor.json new file mode 100644 index 00000000..e8b44003 --- /dev/null +++ b/web/messages/sk/docs/oci-manager/monitor.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "Kontajnery OCI v ProxMenux Monitor | ProxMenux", + "description": "Čo ProxMenux Monitor zobrazuje pre kontajner nainštalovaný cez OCI manager Apps: verzie aplikácie a obrazu, nové obrazy, výstup konzoly a terminál Proxmox VE." + }, + "header": { + "title": "V ProxMenux Monitore", + "description": "Kontajner nainštalovaný cez OCI manager Apps sa zobrazuje v časti VM a LXC ako každý iný LXC. Jeho detail načíta záznam inštalácie: verzie aplikácie a obrazu, nové obrazy, výstup konzoly a terminál.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Záznam je zdroj", + "body": "OCI manager Apps vie, čo nainštaloval a odkiaľ to pochádza. Monitor načíta tento záznam inštalácie namiesto vyhľadávania aplikácie v kontajneri. Tieto údaje sú preto rovnaké pri spustenom aj zastavenom kontajneri." + } + }, + { + "table": { + "headers": [ + "Karta", + "Čo sa mení pri kontajneri OCI" + ], + "rows": [ + [ + "Stav", + "Prepínač Watchdog pod Start at boot: aplikácia sa znova spustí, keď sa sama zastaví" + ], + [ + "Aplikácia", + "Aplikácia je identifikovaná zo záznamu a aktualizácie sú sledované obrazom" + ], + [ + "Aktualizácie", + "Obraz je aktualizovaný alebo aplikácia upravená s rovnakým tokom ako OCI menu" + ], + [ + "Pripojenia", + "Kontajnerové disky a hostiteľské adresáre s ich použitím" + ], + [ + "Logy", + "Len pre kontajnery OCI: výstup konzoly aplikácie" + ] + ] + } + } + ] + }, + { + "id": "app", + "title": "Aplikácia", + "intro": "Záložka App ponúka nainštalovanú aplikáciu ako detekciu s názvom, logom, portom a schémou záznamu. Zaregistrovanie otvára editor metódou Obraz OCI (nainštalovaný ProxMenux), ktorá nepotrebuje konfiguráciu.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "boxes", + "title": "Aplikácia", + "body": "Verzia aplikácie v obraze, načítaná zo samotného obrazu: z jeho prostredia alebo štítku org.opencontainers.image.version. Je to informatívny údaj." + }, + { + "icon": "archive", + "title": "Obraz", + "body": "Dátum zostavenia a digest nainštalovaného obrazu. O aktualizácii sa rozhoduje tu: nainštalovaný digest sa porovná s tým, ktorý register dnes publikuje pre rovnakú značku." + } + ] + } + }, + { + "list": { + "items": [ + "Keď register zverejní nový digest, na karte sa zobrazí Nový obraz s jeho dátumom a digest, aj keď sa verzia aplikácie vo vnútri nezmenila: prestavba na aktualizovanej báze je aktualizáciou.", + "Keď sa hodnoty digest zhodujú, karta zobrazí Verzia.", + "Karta odkazuje na úložisko obrazu: jeho projekt GitHub alebo jeho stránku Docker Hub pre oficiálny obraz.", + "Prístupové spojenie používa LAN adresu kontajnera, aj pre hlavného člena viackontajnerovej aplikácie, ktorá má druhú adresu vo svojej súkromnej sieti.", + "Tlačidlo Obnoviť údaje znovu načíta záznam aj register obrazov. Možnosti vyhľadávania alebo registrácie ďalších aplikácií sa neponúkajú: kontajner obsahuje presne aplikáciu zo svojho záznamu." + ] + } + }, + { + "figure": { + "src": "/oci-manager/monitor-app-tab.png", + "alt": "App záložka kontajnera OCI s verziou aplikácie, obrazom a odkazom na úložisko", + "caption": "Karta Aplikácia kontajnera nainštalovaného cez OCI manager Apps." + } + }, + { + "p": "Kontrola prebieha raz denne s kontrolami aktualizácií monitora a Obnoviť údaje ju spustí okamžite. Nový obraz sa odošle ako upozornenie prostredníctvom kanálov nakonfigurovaných v Upozornenia. Aktualizácia sa aplikuje na karte Aktualizácie." + } + ] + }, + { + "id": "updates", + "title": "Aktualizácie", + "intro": "Pri kontajneri nainštalovanom cez OCI manager Apps zobrazuje karta Aktualizácie aplikáciu s nainštalovaným obrazom a prípadným novým obrazom z registra, rovnako ako pri ostatných aplikáciách. Nástroje na aktualizáciu balíkov a aplikácií bežného LXC sa nezobrazujú.", + "blocks": [ + { + "table": { + "headers": [ + "Tlačidlo", + "Čo to otvára?" + ], + "rows": [ + [ + "Aktualizácia", + "Aktualizácia z časti Spravovať nainštalované aplikácie OCI pre tento kontajner v termináli Monitor. Možno ju spustiť aj bez nového obrazu; vtedy sa nič nezmení. Vo viackontajnerovej aplikácii aktualizuje všetkých členov." + ], + [ + "Upraviť", + "Editor aplikácie (zdroje, sieť, cesty a GPU). Vo viackontajnerovej aplikácii pridáva alebo odstraňuje ďalšie cesty a zariadenia aplikačného kontajnera a v Immich mení, čo vykonáva rozpoznávanie." + ], + [ + "Obnoviť", + "Nahradí Aktualizáciu po prerušení operácie na kontajneri a otvorí jeho obnovu." + ], + [ + "Obnoviť (obnovený kontajner)", + "Zobrazí sa pri kontajneri obnovenom zo zálohy, ktorý na tomto hostiteľovi nemá kontrakt, v časti Obnovená aplikácia OCI. Otvorí obnovu v termináli Monitor; po registrácii sa zobrazia možnosti Aktualizovať a Upraviť." + ] + ] + } + }, + { + "p": "Externé zmeny, hostiteľské adresáre a multikontajnerové aplikácie sú spracované ako v ponuke OCI. Vo viackontajnerovej aplikácii sa tlačidlá a možnosti zobrazia len na hlavnom kontajneri; ostatní členovia zobrazujú svoj obraz, poznámku, že sú aktualizované z hlavného kontajnera a tlačidlo, ktoré ho otvára. Keď sa terminál uzavrie, obraz, záznam a pripojenia sa znovu prečítajú." + }, + { + "table": { + "headers": [ + "Možnosť", + "Správanie" + ], + "rows": [ + [ + "Ponechať zálohu vytvorenú pred aktualizáciou", + "Každá aktualizácia zálohuje kontajner, aby ho bolo možné obnoviť pri zlyhaní aktualizácie. Pri tejto voľbe sa tá istá záloha ponechá vo vybranom úložisku a zobrazí medzi zálohami CT; pri Proxmox Backup Server sa záloha zapíše pred aktualizáciou." + ], + [ + "Plánované aktualizácie", + "Obraz sa aktualizuje v zvolenom čase iba vtedy, keď register publikuje nový obraz; voliteľne až po jeho dosiahnutí veku 1, 3, 7 alebo 14 dní. Kontajner so zmenami mimo ProxMenux sa preskočí a nahlási." + ] + ] + } + } + ] + }, + { + "id": "logs", + "title": "Logy", + "intro": "Karta Záznamy sa zobrazuje iba pri kontajneroch nainštalovaných cez OCI manager Apps, medzi kartami Pripojenia a Zálohy. Zobrazuje štandardný a chybový výstup hlavného procesu obrazu, teda rovnaký výstup ako docker logs pri kontajneri Docker.", + "blocks": [ + { + "list": { + "items": [ + "Výstup sa uchováva na hostiteľovi v /var/log/proxmenux/oci/VMID.console.log (režim 0600) od prvého spustenia aj cez reštarty, takže ho možno čítať pri zastavenom kontajneri.", + "Súbor sa otáča na 10 MB, pričom sa uchovávajú tri komprimované kópie (/etc/logrotate.d/proxmenux-oci).", + "Každý začiatok kontajnera je označený vo výstupe. Karta štandardne zobrazuje výstup od posledného spustenia; Úplná história zobrazuje aj predchádzajúce.", + "Po odstránení aplikácie sa odstráni jej výstup.", + "Zobrazuje sa posledných 100, 500 alebo 1000 riadkov. Počas behu kontajnera sa nové riadky sledujú naživo; posunutie nahor sledovanie pozastaví a tlačidlo Sledovať ho obnoví.", + "Filter zobrazí iba riadky, ktoré obsahujú text a Stiahnuť uloží načítané riadky.", + "Farebné kódy sa odstránia a riadok opakovane prekresľovaný ukazovateľom priebehu sa zobrazí v konečnom stave.", + "Karta načíta súbor pri každom otvorení; nepoužíva vyrovnávaciu pamäť." + ] + } + }, + { + "calloutInfo": { + "title": "Prihlasovacie údaje pri prvom spustení", + "body": "Obrazy, ktoré vytlačia vygenerované heslo na ich prvom štarte, to nechajú v tomto výstupe, ako to robí docker logs. Inštalátor ho odtiaľ prečíta, aby ju ukázal v súhrne." + } + }, + { + "figure": { + "src": "/oci-manager/monitor-logs-tab.png", + "alt": "Karta záznamov s výstupom konzoly kontajnera OCI, výberom počtu riadkov, filtrom a tlačidlom sledovania", + "caption": "Konzolový výstup kontajnera OCI." + } + } + ] + }, + { + "id": "terminal", + "title": "konzola Proxmox VE", + "blocks": [ + { + "p": "Obraz OCI spúšťa vlastný proces ako PID 1 a neobsahuje prihlasovaciu službu. Predvolená konzola LXC by preto otvorila terminál bez procesu, ktorý by odpovedal na prihlásenie. Kontajnery nainštalované cez OCI manager Apps sa vytvárajú s cmode: shell: konzola Proxmox VE otvorí shell pomocou lxc-attach, čo zodpovedá docker exec. Spustená aplikácia zostáva nedotknutá." + }, + { + "list": { + "items": [ + "Shell je ten, ktorý súbor /etc/passwd v obraze priraďuje používateľovi root. Ak root nemá shell alebo obraz žiadny neobsahuje, zostane predvolená konzola.", + "Shell beží ako root vnútri kontajnera, bez hesla. O tom, kto ho môže otvoriť, rozhoduje VM.Console povolenie Proxmox VE.", + "Terminál monitora vstupuje do kontajnera s pct enter, ktorý funguje rovnako." + ] + } + } + ] + }, + { + "id": "mounts", + "title": "Pripojenia", + "blocks": [ + { + "p": "Karta Pripojenia uvádza disky kontajnera a jeho adresáre hostiteľa. Využitie disku kontajnera na blokovom úložisku, napríklad LVM-thin, sa číta zo súborového systému disku, ktorý je pripojený iba v kontajneri." + } + ] + } + ] +} diff --git a/web/messages/sk/docs/oci-manager/stacks.json b/web/messages/sk/docs/oci-manager/stacks.json new file mode 100644 index 00000000..5a0c1640 --- /dev/null +++ b/web/messages/sk/docs/oci-manager/stacks.json @@ -0,0 +1,404 @@ +{ + "meta": { + "title": "Aplikácie s viacerými kontajnermi | ProxMenux", + "description": "Ako OCI manager Apps mení aplikáciu s databázou a vyrovnávacou pamäťou na koordinované natívne LXC: plán, súkromná sieť, hook závislostí, overenie a transakčné aktualizácie." + }, + "header": { + "title": "Aplikácie s viacerými kontajnermi", + "description": "Aplikácia so svojou databázou, vyrovnávacou pamäťou a ďalšími službami sa stáva niekoľkými koordinovanými LXC, nainštalovanými a aktualizovanými ako jedna.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Jedna aplikácia pre užívateľa, niekoľko LXC pre Proxmox VE", + "body": "Definícia viacerých kontajnerov je jedným záznamom v katalógu. Inštalátor vytvorí jeden natívny LXC pre každú službu a explicitne spravuje ich závislosti. Immich, Nextcloud, Paperless-ngx a Tandoor sú nainštalované týmto spôsobom." + } + }, + { + "mermaid": { + "chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}
{{appNet}}\"]\n O --> D[\"{{db}}
{{private}}\"]\n O --> R[\"{{cache}}
{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A", + "labels": { + "plan": "Stack plán", + "app": "Aplikácia LXC", + "appNet": "LAN + súkromné", + "db": "PostgreSQL LXC", + "cache": "Valkey LXC", + "private": "súkromné" + } + } + } + ] + }, + { + "id": "plan", + "title": "1. Plán ešte pred vytvorením kontajnerov", + "blocks": [ + { + "p": "Počas spracovania definície Compose sa nevytvára žiadny LXC. Najprv vznikne úplný plán so všetkými členmi, obrazmi, VMID, sieťami, cestami, tajnými údajmi, poradím a kontrolami stavu. Ak plán nie je konzistentný, inštalácia sa nezačne." + }, + { + "table": { + "headers": [ + "Prvok plánu", + "Obsah", + "Overenie pred vytvorením čohokoľvek" + ], + "rows": [ + [ + "Členovia", + "Hlavná aplikácia, databáza, vyrovnávacia pamäť, strojové učenie a iné závislosti", + "Jedinečné VMID, známe úlohy a presne jeden hlavný člen" + ], + [ + "Obrazy", + "Priebežne aktualizovaný odkaz, architektúra a určený digest každej služby", + "Všetky existujú, podporujú architektúru a prejdú kontrolou integrity OCI" + ], + [ + "Sieť", + "Súkromný most, podsieť, pevná adresa pre každú službu a prístup LAN pre hlavného člena", + "Žiadna zrážka s existujúcimi mostmi alebo podsietami a žiadna opakovaná adresa" + ], + [ + "Perzistencia", + "Kontajnerové disky, hostiteľské adresáre, majitelia a zálohovanie", + "Žiadne prekrývanie ciest, dostupné úložisko a deklarované oprávnenia" + ], + [ + "Tajomstvá", + "Heslo databázy, aplikačné kľúče a počiatočné prihlasovacie údaje", + "Generované raz a podané iba členom, ktorí ich používajú" + ], + [ + "Životný cyklus", + "Poradie spúšťania, poradie zastavovania a kontrola stavu každého člena", + "Hlavná aplikácia sa spúšťa posledná a zastavuje prvá" + ] + ] + } + } + ] + }, + { + "id": "create", + "title": "2. Vytváranie jednotlivých členov", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Rezervujte každý VMID", + "body": "Súpis Proxmox VE a inštančný register sú kontrolované. Existujúce CT nie je prijaté a zmluva, ktorá stále patrí do inej inštancie, sa opätovne nepoužíva." + }, + { + "title": "Pripravte každý obraz", + "body": "Všetky obrazy sú vyriešené, stiahnuté a overené pred vytvorením prvého kontajnera." + }, + { + "title": "Vytvoriť každý rootfs", + "body": "Importujú sa oficiálne metadáta OCI a pridá sa identita inštancie ProxMenux a rola člena." + }, + { + "title": "Súkromná sieť", + "body": "Vytvorí sa most a podsieť a každý člen dostane pevnú adresu; iba hlavný člen navyše dostane rozhranie LAN." + }, + { + "title": "Perzistencia", + "body": "Každá databáza a konfigurácia dostane svoj vlastný disk kontajnera; iba údaje určené na zdieľanie používajú adresáre hostiteľov." + }, + { + "title": "Prostredie", + "body": "Zapíšu sa interné koncové body, zdieľané tajné údaje a premenné služieb. Aplikácia pristupuje k svojim závislostiam cez ich vyhradené súkromné adresy." + }, + { + "title": "Záznam", + "body": "Každý člen zaznamenáva svoju natívnu konfiguráciu, rootfs zmeny, ktoré aktualizácie musia reprodukovať a jeho vzťah k stohu." + } + ] + } + } + ] + }, + { + "id": "checks", + "title": "3. Spustiť a skontrolovať každý kontajner", + "intro": "Vytvorený LXC ešte neznamená pripravenú službu. Závislosti sa spúšťajú v určenom poradí a každá prejde kontrolou špecifickou pre danú službu.", + "blocks": [ + { + "table": { + "headers": [ + "Služba", + "Kontrola", + "Čo ukazuje" + ], + "rows": [ + [ + "PostgreSQL", + "pg_isready v CT s očakávaným hostiteľom, používateľom a databázou", + "Server akceptuje spojenia pre nakonfigurovanú databázu" + ], + [ + "Redis / Valkey", + "redis-cli alebo valkey-cli s príkazom PING na jeho súkromnej adrese", + "Broker počúva a odpovedá" + ], + [ + "Immich strojové učenie", + "HTTP GET /ping, plus kontrola zvoleného runtime GPU", + "Služba odpovedá a požadovaná akcelerácia neprešla na CPU" + ], + [ + "Nextcloud", + "GET /status.php s installed=true, maintenance=false a needsDbUpgrade=false", + "Inicializácia ukončená bez ďalšej migrácie" + ], + [ + "Paperless-ngx / Tandoor", + "HTTP na adrese LAN a skutočnom porte služby", + "Frontend a jeho závislosti poskytujú aplikáciu" + ], + [ + "Hlavná aplikácia", + "Koncový bod jeho šablóny, napríklad /api/server/ping v Immich", + "Celý zásobník pracuje prostredníctvom aplikácie, ktorá používa závislosti" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Spustený neznamená funkčný", + "body": "Stav spustené len hovorí, že proces LXC existuje. Tam, kde služba ponúka lepšiu kontrolu, sa používa exec alebo HTTP kontrola s časovým limitom. Ak člen zastaví alebo zlyhá jeho kontrola, zásobník nie je deklarovaný ako nainštalovaný." + } + } + ] + }, + { + "id": "hook", + "title": "4. Hook závislostí", + "blocks": [ + { + "p": "Hook sa nastaví iba na hlavnom kontajneri zostavy so závislosťami. Proxmox VE uchováva skript ako snippet a spúšťa ho ako hookscript daného CT. Recept zostavy nie je zapísaný v skripte: nachádza sa v samostatnom súkromnom kontrakte." + }, + { + "codeGrid": { + "items": [ + { + "title": "Hlavné nastavenie CT", + "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" + }, + { + "title": "Súkromná zmluva (príklad)", + "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" + } + ] + } + }, + { + "snippet": { + "summary": "Kompletný zdroj proxmenux-stack-dependencies.sh", + "pathCode": "local:snippets/proxmenux-stack-dependencies.sh", + "snippetCode": "stackDependencyHook" + } + }, + { + "p": "Skript je rovnaký pre každý zásobník. VMID, názvy, kontrolné typy a timeouty pochádzajú zo súkromného kontraktu /etc/pve/priv/proxmenux-stack-VMID.json každého zásobníka." + }, + { + "steps": { + "items": [ + { + "title": "Proxmox VE zavolá pre-start", + "body": "Pred spustením hlavného CT sa hook spustí s jeho VMID a fázou životného cyklu." + }, + { + "title": "Zámok na zásobník", + "body": "flock na /run/lock/proxmenux-stack-VMID.lock zabraňuje dvom štartovým sekvenciám súčasne." + }, + { + "title": "Zmluva je prečítaná a overená", + "body": "Požaduje sa známa schéma, numerické závislosti, etikety, exec, http alebo kontrola chodu a pozitívny timeout." + }, + { + "title": "Závislosti v poradí", + "body": "Každý CT musí existovať; zastavený sa spustí, už spustený sa nereštartuje." + }, + { + "title": "Čakanie na pripravenosť služby", + "body": "Kontrola beží každé dve sekundy, a CT je tiež potvrdené, že stále beží." + }, + { + "title": "Hlavné CT začína", + "body": "Keď je každá závislosť pripravená, pre-start končí a Proxmox VE spustí aplikáciu." + } + ] + } + }, + { + "calloutInfo": { + "title": "Háčik nezastaví závislosť", + "body": "Fázy post-start, pre-stop a post-stop nič nevykonávajú. Zastavenie hlavného CT ponechá PostgreSQL, Redis, Valkey alebo strojové učenie spustené. Hook určuje poradie spúšťania; nemení viaceré LXC na jeden proces." + } + }, + { + "table": { + "headers": [ + "Typ", + "Príklad", + "Neskoršie spustenia" + ], + "rows": [ + [ + "Závislý zásobník", + "Immich, Nextcloud, aplikácia s PostgreSQL", + "Hook hlavného CT spustí závislosti a čaká na ich pripravenosť." + ], + [ + "Súprava aplikácií", + "Súprava Arr", + "Žiadny hlavný člen: každý LXC sleduje svoje vlastné onboot" + ], + [ + "Samostatná aplikácia", + "Jellyfin", + "Proxmox VE spustí daný LXC priamo" + ] + ] + } + } + ] + }, + { + "id": "stack-checks", + "title": "5. Kontrola stohu ako celku", + "blocks": [ + { + "list": { + "items": [ + "Každý VMID existuje, je jedinečný a udržiava očakávanú inštančnú identitu.", + "Každý kontrakt patrí do rovnakej zostavy, zachováva svoju rolu a zaznamenanú natívnu konfiguráciu.", + "Hlavný člen je posledný v start_order a prvý v stop_order.", + "Nechýba žiadny člen, zväzok ani úprava rootfs.", + "Hook odkazuje na oficiálny snippet, jeho obsah sa nezmenil a jeho kontrakt zodpovedá receptu zostavy.", + "Zistené obrazy a hodnoty digest zodpovedajú pripraveným archívom OCI.", + "Zariadenia, profily GPU, pripojenia, tajomstvá a koncové body stále zodpovedajú zmluvám.", + "Keď všetky závislosti prejdú kontrolou, koncový bod hlavnej aplikácie overí integráciu medzi členmi." + ] + } + } + ] + }, + { + "id": "manage", + "title": "Správa nainštalovaného zásobníka", + "intro": "V časti Spravovať nainštalované aplikácie OCI vedie každý člen k celej zostave. Ponuka obsahuje Aktualizovať všetky kontajnery aplikácie, Upraviť dodatočné cesty a zariadenia, Znova vytvoriť všetky kontajnery s uloženou konfiguráciou a Odstrániť: vymazať aplikáciu a jej kontajnery. Opätovné vytvorenie zostaví každý kontajner z pôvodného obrazu podľa uloženého digestu bez hľadania novšieho obrazu. Používa rovnaké kroky ako aktualizácia a ponúka sa pre aktualizovateľné zostavy.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Každý člen", + "body": "Zmluva člena menuje hlavné VMID a kompletný zoznam členov." + }, + { + "title": "Stack je reprodukovateľný", + "body": "Overia sa identity, kontrakty, hook, úpravy a koordinované opätovné vykonanie daného receptu." + }, + { + "title": "Prvé obrazy", + "body": "Aplikácia sa nezastaví, kým sa každý digest neurčí, nestiahne a neoverí." + }, + { + "title": "Zastaviť súčasti a zálohovať celú zostavu", + "body": "Overené natívne zálohy sa vytvoria pri zastavenej zostave, aby aplikácia a databázy zodpovedali rovnakému okamihu." + }, + { + "title": "Aktualizovať a skontrolovať každého člena", + "body": "Adaptácia, sieť, pripojenia, tajomstvá a zariadenia sa používajú opäť pred kontrolou stavu každého člena." + }, + { + "title": "Publikovať alebo obnoviť všetko", + "body": "Nové zmluvy sa uverejňujú iba vtedy, keď každý člen prejde. Ak jeden zlyhá, každý člen je obnovený." + } + ] + } + }, + { + "table": { + "headers": [ + "Upraviť", + "Čo sa zmení?", + "Čo sa uchováva" + ], + "rows": [ + [ + "Extra cesty a zariadenia", + "Pridajú sa do aplikačného kontajnera alebo sa z neho odstránia a kontajner sa reštartuje. Nič sa znova nevytvára.", + "Údaje aplikácie, jej databázy a ostatných kontajnerov" + ], + [ + "Čo spúšťa rozpoznanie (Immich)", + "Kontajner strojového učenia dostane obraz a zariadenia pre CPU alebo GPU hostiteľa. Celá aplikácia sa zastaví a aktualizuje rovnakým postupom ako pri aktualizácii.", + "Modelová vyrovnávacia pamäť, knižnica a databáza. Ak niečo zlyhá, predchádzajúce kontajnery a predchádzajúca voľba sú obnovené" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Zostava bez koordinovaného opätovného vykonania sa neaktualizuje", + "body": "Ak sa príprava zásobníka nedá reprodukovať, aktualizácia sa zamietne pred zastavením zásobníka. Aplikácia funguje tak, ako je." + } + } + ] + }, + { + "id": "failure", + "title": "6. Keď niečo zlyhá", + "blocks": [ + { + "p": "Ak počas inštalácie nastane chyba, zastavia a odstránia sa neúplné kontajnery vytvorené touto operáciou aj súkromný most, ak ho operácia vytvorila. Zostava sa nezverejní ako platná, kým neskončí celý postup." + }, + { + "p": "Aktualizácia je transakčná: všetky obrazy sú pripravené ako prvé, potom stack zastaví, každý člen je zálohovaný a záloha overená, a len potom je každý rootfs nahradený. Členovia začínajú jeden po druhom so zdravotnou kontrolou; ak jeden zlyhá, každý člen je obnovený z rovnakého súboru záloh, takže databáza a aplikácia nikdy nepatria do rôznych momentov." + }, + { + "mermaid": { + "chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]", + "labels": { + "prepare": "Pripravte každý obraz", + "stop": "Stop, hlavný člen prvý", + "backup": "Overená záloha každého CT", + "replace": "Nahradiť rootfs", + "healthy": "Sú všetky funkčné?", + "yes": "Áno", + "no": "Nie", + "commit": "Zverejniť kontrakty", + "rollback": "Obnoviť každého člena" + } + } + } + ] + }, + { + "id": "not-assumed", + "title": "Čo zásobník nezahŕňa", + "blocks": [ + { + "list": { + "items": [ + "Súprava nainštalovaná v jednom postupe, napríklad súprava Arr, nie je zostavou so závislosťami: jej kontajnery nemajú určené vzájomné poradie spúšťania.", + "Súkromná sieť nenahrádza autentifikáciu, TLS ani konfiguráciu každej aplikácie.", + "Zálohovanie jedného LXC neobsahuje most, hák ani zmluvy zvyšku zásobníka.", + "Prowlarr, Sonarr alebo Radarr neprijímajú žiadne indexátory, profily alebo poskytovateľov z ProxMenux." + ] + } + } + ] + } + ] +} diff --git a/web/messages/sk/docs/oci-manager/storage-network.json b/web/messages/sk/docs/oci-manager/storage-network.json new file mode 100644 index 00000000..f0ff007e --- /dev/null +++ b/web/messages/sk/docs/oci-manager/storage-network.json @@ -0,0 +1,305 @@ +{ + "meta": { + "title": "Údaje, cesty a sieť | ProxMenux", + "description": "Ako OCI manager Apps uchováva údaje kontajnera OCI: disky kontajnera, adresáre hostiteľa, pripojenia cez rclone, adresy a súkromné siete." + }, + "header": { + "title": "Údaje, cesty a sieť", + "description": "Čo sa nachádza v rootfs, čo sa zachová pri jeho výmene, ako sa zdieľajú údaje medzi kontajnermi a ako každý kontajner získa svoju adresu.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Trvalé uloženie údajov sa určí pred vytvorením LXC", + "body": "Pred vytvorením kontajnera sa načítajú zväzky deklarované obrazom a jeho súborom Compose. Každá cesta, ktorá sa má zachovať po aktualizácii, sa stane prípojným bodom nezávislým od rootfs. Rootfs tak obsahuje iba súbory patriace obrazu a možno ho vymeniť." + } + } + ] + }, + { + "id": "questions", + "title": "Na čo sa pýta inštalátor", + "intro": "Šablóna poskytuje cesty potrebné pre aplikáciu. Každá sa umiestni na disk kontajnera alebo do adresára hostiteľa. Pred súhrnom možno pridať ďalšie cesty.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Potrebné cesty", + "body": "Zobrazia sa /config, /data, knižnice, stiahnuté súbory a všetky zväzky deklarované aplikáciou." + }, + { + "title": "Umiestnenie", + "body": "Každá cesta sa umiestni na disk kontajnera alebo do existujúceho adresára hostiteľa." + }, + { + "title": "Úložisko a veľkosť", + "body": "Na úložisku Proxmox VE sa vytvorí disk kontajnera so zadanou veľkosťou. Predvolená inštalácia používa local-lvm. Rozšírená inštalácia sa pri každej ceste pýta najprv na úložisko a potom na veľkosť; navrhuje úložisko rootfs. Disk sa zobrazuje ako vm-VMID-disk-N a pripája sa ako mpN." + }, + { + "title": "Adresár hostiteľa", + "body": "Adresár hostiteľa sa zadáva jeho cestou. Ak neexistuje, vytvorí sa a jeho vlastníkom bude používateľ hostiteľa, na ktorého sa mapuje používateľ kontajnera." + }, + { + "title": "Ďalšie cesty", + "body": "Pred inštaláciou možno pridať ďalšie dvojice cesty alebo zväzku hostiteľa a cesty v kontajneri." + }, + { + "title": "Súhrn", + "body": "Pred vytvorením CT sa zobrazí úplné mapovanie ciest a uloží sa do kontraktu inštancie." + } + ] + } + } + ] + }, + { + "id": "options", + "title": "Dve možnosti trvalého uloženia", + "blocks": [ + { + "table": { + "headers": [ + "Vlastnosť", + "Disk kontajnera", + "Adresár hostiteľa" + ], + "rows": [ + [ + "V konfigurácii", + "mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G", + "mpN: /mnt/oci-shared/media,mp=/data/media" + ], + [ + "Záloha kontajnera (vzdump)", + "Zahrnutý pri backup=1", + "Nezahrnutý" + ], + [ + "Veľkosť", + "Pevná; zväčšuje sa zmenou veľkosti prípojného bodu", + "Voľné miesto v súborovom systéme alebo datasete hostiteľa" + ], + [ + "Ostatné kontajnery", + "Pripája ho iba kontajner, ktorému patrí", + "Ten istý adresár možno pripojiť do viacerých kontajnerov" + ], + [ + "Snapshoty a obnova", + "Spravuje ich Proxmox VE spolu s CT", + "Spravujú sa na úložisku hostiteľa" + ], + [ + "Pri odstránení aplikácie", + "Odstráni sa spolu s kontajnerom", + "Zachová sa aj s obsahom" + ], + [ + "Pri presune CT na iný uzol", + "Presunie sa spolu s CT", + "Na druhom uzle musí existovať rovnaká cesta" + ] + ] + } + }, + { + "p": "Rootfs je vyhradený pre binárne súbory a obsah obrazu. Aktualizácia alebo opätovné vytvorenie ho nahradí bez zásahu do ktoréhokoľvek z dvoch typov prípojných bodov." + } + ] + }, + { + "id": "example", + "title": "Príklad: kontajner s oboma umiestneniami", + "blocks": [ + { + "code": { + "title": "Jellyfin nainštalovaný ako CT 151 na local-lvm (úryvok)", + "code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media" + } + }, + { + "p": "Aktualizácia alebo opätovné vytvorenie nahradí iba rootfs: mp0 zachová používateľov, knižnice a nastavenia a mp1 naďalej sprístupňuje rovnaké médiá. Obnova zálohy CT obnoví /config. Adresár s médiami sa v prípade potreby obnovuje zo zálohy úložiska hostiteľa." + }, + { + "flow": { + "nodes": [ + { + "label": "Kontrakt", + "detail": "/config" + }, + { + "label": "Umiestnenie", + "detail": "Disk kontajnera\nalebo adresár hostiteľa" + }, + { + "label": "LXC", + "detail": "Pre aplikáciu\nvždy /config" + } + ], + "caption": "Aplikácia vidí cestu deklarovanú obrazom; mení sa iba miesto jej uloženia." + } + } + ] + }, + { + "id": "shared", + "title": "Jeden adresár hostiteľa, viacero kontajnerov", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart TB\n H[\"{{host}}
/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent
/data\"]\n H --> J[\"Jellyfin
/data\"]\n H --> R[\"Radarr / Sonarr
/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]", + "labels": { + "host": "Adresár hostiteľa", + "config": "Vlastná konfigurácia" + } + } + }, + { + "p": "Každý kontajner uchováva svoju konfiguráciu na vlastnom disku. Knižnica alebo stiahnuté súbory sú v jednom adresári hostiteľa, pripojenom na rovnakej vnútornej ceste v každom kontajneri. Cesta, do ktorej jedna aplikácia zapisuje, je preto rovnaká ako cesta, z ktorej druhá číta." + } + ] + }, + { + "id": "rclone", + "title": "Cloudové úložisko cez aplikáciu rclone", + "intro": "Položka rclone v katalógu okrem inštalácie ponúka aj možnosť Aktivovať pripojenie v existujúcom kontajneri OCI s rclone. Pripojí sa vzdialené úložisko, ktoré už bolo vytvorené a autorizované vo webovom rozhraní rclone, a sprístupní sa na hostiteľovi. Ostatné kontajnery ho môžu používať ako adresár hostiteľa.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Kontajner a vzdialené úložisko", + "body": "VMID kontajnera s rclone, presný názov vzdialeného úložiska a voliteľne cesta v ňom." + }, + { + "title": "Názov pripojenia a vyrovnávacia pamäť", + "body": "Názov pripojenia a režim vyrovnávacej pamäte VFS: off, minimal, writes alebo full (predvolený)." + }, + { + "title": "Sprístupnené zobrazenia", + "body": "Spoločný koreňový adresár, predvolene /mnt/oci-shared, obsahuje zobrazenie na čítanie aj zápis v /mnt/oci-shared/remotes/NAME a zobrazenie iba na čítanie v /mnt/oci-shared/remotes-ro/NAME." + }, + { + "title": "Aktivácia", + "body": "Po potvrdení sa CT zastaví, nastaví sa jeho spúšťací príkaz a hookscript Proxmox VE a znova sa spustí. Operácia čaká, kým budú obe zobrazenia pripojené na hostiteľovi." + } + ] + } + }, + { + "calloutInfo": { + "title": "Ak sa pripojenie neaktivuje", + "body": "Obnoví sa predchádzajúca konfigurácia kontajnera a kontajner sa znova spustí. Ak aktivácia zlyhá, rclone tak zostane v pôvodnom stave." + } + } + ] + }, + { + "id": "network", + "title": "Adresy a siete", + "intro": "Aplikácia s jedným kontajnerom potrebuje adresu. Aplikácia s viacerými kontajnermi potrebuje aj stabilnú sieť medzi svojimi členmi.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "network", + "title": "Aplikácia s jedným kontajnerom", + "body": "Vyberie sa sieťový most a DHCP alebo pevná adresa vo formáte CIDR. LXC má vlastnú adresu a súhrn zobrazuje úplné URL služieb." + }, + { + "icon": "waypoints", + "title": "Aplikácia s viacerými kontajnermi", + "body": "Vyhľadá sa voľná podsieť a vytvorí sa trvalý súkromný sieťový most. Každý člen — aplikácia, databáza a vyrovnávacia pamäť — v ňom dostane pevnú adresu." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "LAN", + "detail": "Dostupná adresa\niba pre hlavnú službu" + }, + { + "label": "Hlavný LXC", + "detail": "Web / API\nLAN + súkromná sieť" + }, + { + "label": "Súkromná sieť", + "detail": "PostgreSQL · Valkey · ML\npevné adresy" + } + ], + "caption": "Závislé služby komunikujú cez súkromnú sieť a nemajú adresu v LAN." + } + }, + { + "p": "Kontrakt zostavy uchováva sieťový most, podsieť, adresy a vzťahy medzi službami. Pri aktualizácii aplikácie sa pre všetkých členov znovu použije rovnaká topológia. ProxMenux Monitor otvára hlavný kontajner na jeho adrese v LAN, nie na adrese v súkromnej sieti." + } + ] + }, + { + "id": "ownership", + "title": "Vlastníctvo súborov a adresárov", + "blocks": [ + { + "list": { + "items": [ + "Nové adresáre sa vytvárajú s UID a GID, na ktoré sa mapuje neprivilegovaný LXC.", + "Vlastníctvo existujúcich adresárov sa nemení rekurzívne.", + "Sockety, systémové súbory a citlivé cesty sa neponúkajú ako bežné adresáre hostiteľa." + ] + } + } + ] + }, + { + "id": "backup", + "title": "Čo obsahuje záloha kontajnera", + "blocks": [ + { + "table": { + "headers": [ + "Položka", + "V zálohe vzdump kontajnera CT", + "Kde sa uchováva" + ], + "rows": [ + [ + "Rootfs OCI", + "Áno", + "V zálohe CT; možno ho tiež znovu vytvoriť z obrazu a kontraktu" + ], + [ + "Disk kontajnera s backup=1", + "Áno", + "Záloha CT" + ], + [ + "Adresár hostiteľa", + "Nie", + "Záloha úložiska hostiteľa" + ], + [ + "Kontrakt inštancie", + "Áno, kópia uložená v CT", + "/.proxmenux/oci-record.json v CT; ďalšie kópie hostiteľa a klastra sa uchovávajú samostatne" + ], + [ + "Aplikácia s viacerými kontajnermi", + "Každý člen vo vlastnej zálohe", + "Zálohy všetkých členov spolu s kontraktom zostavy a jej sieťovým mostom na hostiteľovi" + ] + ] + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/oci-manager/architecture.json b/web/messages/sv/docs/oci-manager/architecture.json new file mode 100644 index 00000000..fa8bb5ab --- /dev/null +++ b/web/messages/sv/docs/oci-manager/architecture.json @@ -0,0 +1,171 @@ +{ + "meta": { + "title": "Så anpassas en OCI-avbildning | ProxMenux", + "description": "Från avbildningens arkiv och Compose-fil till en granskningsbar mall, en distributionsplan och en LXC direkt i Proxmox VE, utan Docker i containern." + }, + "header": { + "title": "Så anpassas en OCI-avbildning", + "description": "Från avbildningens arkiv och Compose-fil till en granskningsbar mall, en distributionsplan och en LXC direkt i Proxmox VE, utan att installera Docker i containern.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "pipeline", + "title": "Anpassningsflödet", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]", + "labels": { + "repo": "Avbildningens arkiv", + "converter": "Konverterare", + "template": "JSON-mall", + "blockers": "Inga hinder?", + "no": "Nej", + "yes": "Ja", + "review": "Granskning / overlay", + "plan": "Distributionsplan", + "lxc": "LXC direkt i Proxmox VE" + } + } + }, + { + "p": "Konverteraren läser avbildningen och Compose-filen som projektet publicerar och skapar en JSON-mall. Om krav ännu inte har kunnat anpassas och hindrar installationen granskas mallen innan den publiceras i katalogen. En fil med granskade anpassningar, en så kallad overlay, löser dessa hinder. Bara mallar utan kvarstående hinder erbjuds för installation." + } + ] + }, + { + "id": "template", + "title": "Vad mallen bevarar", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Avbildningens identitet", + "body": "Arkiv, löpande uppdaterad tagg, arkitektur, fastställd digest och källrevision." + }, + { + "icon": "braces", + "title": "Containerkontrakt", + "body": "Entrypoint, Cmd, miljö, användare, arbetskatalog, stoppsignal, portar och volymer." + }, + { + "icon": "layers", + "title": "Anpassning till Proxmox VE", + "body": "Resurser, säkerhet, monteringspunkter, enheter, sysctls, hälsokontroller och de anpassningar som behövs för var och en, med motivering." + }, + { + "icon": "shield", + "title": "Kompatibilitet", + "body": "Nycklar som stöds, krav som ännu inte anpassats och hindrar installationen samt status för varje validering." + } + ] + } + } + ] + }, + { + "id": "sources", + "title": "OCI anger processen, Compose anger miljön", + "blocks": [ + { + "table": { + "headers": [ + "Källa", + "Exempel", + "Resultat i Proxmox VE" + ], + "rows": [ + [ + "OCI-metadata", + "Entrypoint, Cmd, User", + "Proxmox VE importerar dem när CT:n skapas" + ], + [ + "Docker Compose", + "environment, volumes, devices", + "Miljöposter för LXC, mpN och devN" + ], + [ + "ProxMenux-profil", + "GPU, hälsokontroll, inloggningsuppgifter", + "Frågor och granskade anpassningar" + ], + [ + "Användare", + "VMID, lagring, nätverk", + "Instanskontraktet" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Vad som händer under installationen", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Fastställ avbildningen", + "body": "Registret frågas, värdens arkitektur väljs och den exakta digest som den löpande uppdaterade taggen pekar på fastställs." + }, + { + "title": "Hämta och verifiera", + "body": "Skopeo hämtar avbildningen som ett OCI-arkiv. Innan något skapas kontrolleras varje lager mot sin digest och packas upp. Om hämtningen är skadad görs ett nytt försök innan installationen avbryts." + }, + { + "title": "Skapa filsystemet", + "body": "pct create skapar rootfs från arkivet och bevarar avbildningens officiella processmetadata." + }, + { + "title": "Anslut resurserna", + "body": "Deklarerade volymer, nätverk, miljö, enheter och säkerhetsprofiler kopplas in." + }, + { + "title": "Konsol", + "body": "Containerns konsolutdata sparas på värden. Konsolen i Proxmox VE öppnar ett skal om avbildningen innehåller ett." + }, + { + "title": "Kontrollera", + "body": "Vid första starten väntar installationen på en adress och på att tjänsten ska svara. Ett misslyckande rapporteras inte som en lyckad installation." + }, + { + "title": "Registrera konfigurationen", + "body": "Den faktiska konfigurationen sparas i instanskontraktet som används vid uppdateringar och återskapande." + } + ] + } + } + ] + }, + { + "id": "example", + "title": "Exempel: en avbildning med /config och /downloads", + "intro": "En vanlig Compose-definition och den Proxmox VE-konfiguration som den omvandlas till. Sökvägarna som programmet förväntar sig ändras inte.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Docker Compose", + "code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080" + }, + { + "title": "/etc/pve/lxc/VMID.conf (utdrag)", + "code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000" + } + ] + } + }, + { + "p": "mp0 är en andra disk som tillhör containern och heter vm-VMID-disk-N på den valda lagringen. Den monteras på /config och ingår i containerns säkerhetskopia med backup=1. mp1 skapar ingen disk: värdens katalog /srv/downloads monteras på /downloads i LXC-containern. Port 8080 mappas inte: LXC-containern har en egen adress där tjänsten svarar." + } + ] + } + ] +} diff --git a/web/messages/sv/docs/oci-manager/custom-image.json b/web/messages/sv/docs/oci-manager/custom-image.json new file mode 100644 index 00000000..c8c04c7e --- /dev/null +++ b/web/messages/sv/docs/oci-manager/custom-image.json @@ -0,0 +1,278 @@ +{ + "meta": { + "title": "Installera en avbildning utanför katalogen | ProxMenux", + "description": "Anpassa en OCI-avbildning från en Compose-fil, en URL, ett docker run-kommando eller en avbildningsreferens och granska vad ProxMenux kan återskapa före installationen." + }, + "header": { + "title": "Installera en avbildning utanför katalogen", + "description": "Din avbildning anpassas från sin Compose-fil, ett docker run-kommando eller enbart referensen. Resultatet visas för granskning innan någon LXC-container skapas.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Samma konverterare och installationsflöde", + "body": "Alternativet Installera en avbildning utanför katalogen använder samma konverterare och installationsflöde som katalogmallarna. Skillnaden är att kontraktet skapas vid det tillfället från den angivna definitionen och valideras innan någon LXC-container skapas." + } + } + ] + }, + { + "id": "sources", + "title": "Så beskrivs avbildningen", + "intro": "Första vyn frågar hur avbildningen beskrivs. Fyra alternativ läser en definition som anpassas, ett femte använder bara avbildningens namn och tre andra läser en färdig oci-compose-fil.", + "blocks": [ + { + "table": { + "headers": [ + "Alternativ", + "Vad som läses" + ], + "rows": [ + [ + "Klistra in Compose-filen i terminalen", + "Klistra in YAML-innehållet i terminalen och avsluta med Ctrl+D." + ], + [ + "Läs Compose-filen från värden", + "En sökväg på noden, som standard /root/docker-compose.yml. Filen måste finnas och får vara högst 256 KiB." + ], + [ + "Hämta Compose-filen från en adress", + "En http://- eller https://-adress som tillhandahåller rå YAML. Högst 256 KiB hämtas." + ], + [ + "Klistra in docker run-kommandot i terminalen", + "Kommandot som projektet publicerar. Portar, miljö, volymer, enheter, capabilities, användare, delat minne och andra alternativ som stöds anpassas." + ], + [ + "Bara avbildningsreferensen, utan Compose-fil", + "En referens som ghcr.io/user/application:latest. Registret frågas och avbildningens OCI-metadata bevaras." + ], + [ + "Klistra in en oci-compose i terminalen", + "Klistra in JSON-innehållet i terminalen och avsluta med Ctrl+D. Det konverteras inte utan kontrolleras och installeras som det är skrivet." + ], + [ + "Läs en oci-compose-fil från värden", + "En JSON-fil på noden, som standard /root/oci-compose.json, på högst 2 MiB." + ], + [ + "Hämta en oci-compose från en adress", + "En http://- eller https://-adress som tillhandahåller JSON-filen. Högst 2 MiB hämtas." + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-source-menu.png", + "alt": "Meny för att välja hur en avbildning utanför katalogen ska beskrivas", + "caption": "Olika sätt att beskriva en avbildning utanför katalogen." + } + } + ] + }, + { + "id": "reference-only", + "title": "Vad enbart avbildningsreferensen ger", + "intro": "Avbildningen innehåller processens metadata, men inte allt som en Compose-fil brukar lägga till runt den.", + "blocks": [ + { + "table": { + "headers": [ + "Läses från avbildningen", + "Finns inte i avbildningen", + "Konsekvens" + ], + "rows": [ + [ + "Entrypoint, Cmd, User, WorkingDir och den inbyggda miljön", + "Variabler som bara finns i dokumentationen", + "Läggs till under installationen eller via Ändra" + ], + [ + "Volymer som avbildningen deklarerar", + "Kataloger på värden som bara anges i Compose-filen", + "Ytterligare sökvägar läggs till före installationen" + ], + [ + "EXPOSE-portar", + "URL, protokoll eller funktionell hälsokontroll", + "Porten och sättet att kontrollera tjänsten bekräftas" + ], + [ + "Arkitekturer och digest i registret", + "Enheter, privilegier eller externa beroenden", + "Aktiveras inte utan en definition som begär dem" + ] + ] + } + } + ] + }, + { + "id": "review", + "title": "Granska före installationen", + "intro": "Efter att definitionen anpassats visar ProxMenux hur den har tolkats, innan VMID, resurser eller lagring efterfrågas.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Analysera", + "body": "Tjänster, avbildning, portar, sökvägar, miljö, enheter, säkerhet och hälsokontroll läses in." + }, + { + "title": "Fråga registret", + "body": "Avbildningen måste finnas i registret och de publicerade arkitekturerna listas. Ett privat register läses med kontot som sparats för det." + }, + { + "title": "Lista det som inte tillämpas", + "body": "Etiketter, Docker-nätverk, Swarm-inställningar och andra nycklar som inte påverkar en LXC-container listas." + }, + { + "title": "Blockera alternativ utan säker motsvarighet", + "body": "Nycklar utan säker motsvarighet visas under Alternativ utan motsvarighet och installationen fortsätter inte. Inget ignoreras utan besked." + }, + { + "title": "Fråga efter hemliga uppgifter", + "body": "Variabler vars namn tyder på lösenord, token eller nyckel efterfrågas som känsliga uppgifter under installationen." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/custom-review.png", + "alt": "Sammanfattning av hur ProxMenux har tolkat Compose-filen", + "caption": "Sammanfattningen som visas innan installationen frågar efter VMID och resurser." + } + }, + { + "p": "Efter att sammanfattningen godkänts följer samma flöde som i katalogen: namn, standardläge eller avancerat läge, VMID, CPU, minne, nätverk, start med noden, beständiga och extra sökvägar, kompatibla enheter och en slutlig sammanfattning." + } + ] + }, + { + "id": "examples", + "title": "Exempel på indata", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Compose", + "code": "services:\n app:\n image: ghcr.io/example/app:latest\n ports:\n - \"8080:8080\"\n volumes:\n - ./config:/config\n - /srv/media:/media\n environment:\n TZ: Europe/Madrid" + }, + { + "title": "docker run", + "code": "docker run -d \\\n --name app \\\n -p 8080:8080 \\\n -e TZ=Europe/Madrid \\\n -v app-config:/config \\\n -v /srv/media:/media \\\n ghcr.io/example/app:latest" + } + ] + } + } + ] + }, + { + "id": "oci-compose", + "title": "En oci-compose skriven för hand", + "intro": "En oci-compose är JSON-filen som ett program installeras från. Katalogen innehåller en sådan fil per program. Samma format kan skrivas för hand och installeras med det här alternativet.", + "blocks": [ + { + "p": "I en handskriven fil bestämmer författaren avbildning, portar, variabler, volymer och installationsfrågor. ProxMenux kompletterar resten när filen läses. Formatet kan ange sådant som Compose inte kan: frågetexter, ett lösenord som skapas under installationen, en GPU-profil, ägaren till varje volym, kontrollen vid första starten eller inloggningsuppgifterna som visas till sist." + }, + { + "steps": { + "items": [ + { + "title": "Kontrollera", + "body": "En fil med fel installeras inte. Varje fel anger vilket fält det gäller; vid ogiltig JSON visas rad och kolumn." + }, + { + "title": "Granska", + "body": "En giltig fil visar vad den installerar: avbildning, webbadress, portar, beständiga sökvägar, variabler som efterfrågas och filer som skrivs." + }, + { + "title": "Installera", + "body": "Installationen är densamma som för katalogens program, med standardinställningar eller avancerade inställningar." + } + ] + } + }, + { + "calloutWarning": { + "title": "En fil som bestämmer privilegierna", + "body": "En oci-compose bestämmer vad som monteras i containern och med vilka privilegier. Granskningen visar detta före installationen: installera bara filer från betrodda källor." + } + }, + { + "p": "Formatet beskrivs block för block med två fullständiga exempel i OCI-motorns README. Även en installationspost kan läsas på samma sätt: bara den ursprungliga mallen används, inga av svaren från den installationen." + } + ] + }, + { + "id": "private-registries", + "title": "Avbildningar i privata register", + "intro": "En avbildning i ett privat register, till exempel ett privat GitHub-paket eller ett privat Docker Hub-arkiv, läses med ett konto som sparats i ProxMenux.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Registret nekar åtkomst till avbildningen", + "body": "Om registret svarar att avbildningen kräver ett konto erbjuder granskningen inloggning och läser sedan avbildningen igen." + }, + { + "title": "Logga in", + "body": "Ett användarnamn och ett lösenord eller en token som får hämta avbildningen. Registret kontrollerar uppgifterna och de sparas bara om de godkänns." + }, + { + "title": "Installera och håll uppdaterat", + "body": "Kontot används för att hämta avbildningen under installationen och även vid uppdatering, Ändra, Återskapa, watchdog och Monitors uppdateringskontroll, på alla noder i klustret." + } + ] + } + }, + { + "p": "Registerkonton i huvudmenyn för OCI manager Apps visar sparade konton per register och användare, aldrig deras hemliga uppgifter. Från varje konto kan du kontrollera, hämta eller installera en avbildning samt uppdatera eller ta bort inloggningsuppgifterna." + }, + { + "list": { + "items": [ + "GitHub (ghcr.io): användaren är GitHub-kontot och lösenordet en personlig åtkomsttoken med behörigheten read:packages.", + "Docker Hub (docker.io): användaren är Docker Hub-kontot och lösenordet en åtkomsttoken med läsbehörighet.", + "Andra register, även med egen port som registry.example.com:5000: användarnamn och lösenord eller token som registret tillhandahåller." + ] + } + }, + { + "calloutInfo": { + "title": "Var kontona sparas", + "body": "I /etc/pve/priv/proxmenux/registry-auth.json, läsbar bara av root, i samma mapp där Proxmox sparar lagringslösenord. /etc/pve delas mellan alla noder i klustret, så ett konto som läggs till på en nod används på alla. Värdens säkerhetskopia innehåller filen och avinstallation av ProxMenux tar bort den från alla noder." + } + } + ] + }, + { + "id": "limits", + "title": "Definitioner som inte installeras", + "blocks": [ + { + "list": { + "items": [ + "En Dockerfile utan publicerad avbildning: avbildningen måste först byggas och publiceras i ett OCI-register.", + "En Compose-fil med flera tjänster blockeras eftersom det här alternativet installerar en tjänst i en container, även om flera tjänster använder samma avbildning.", + "configs, externa hemligheter eller enhetsformat som inte kan anpassas entydigt.", + "Skalsubstitutioner som $(command): ange det resulterande värdet direkt i stället.", + "Okända docker run-alternativ och --env-file: använd en Compose-fil med uttryckliga värden i stället." + ] + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/oci-manager/hardware.json b/web/messages/sv/docs/oci-manager/hardware.json new file mode 100644 index 00000000..e828a5d7 --- /dev/null +++ b/web/messages/sv/docs/oci-manager/hardware.json @@ -0,0 +1,392 @@ +{ + "meta": { + "title": "Enheter och acceleration | ProxMenux", + "description": "Hur OCI manager Apps ger en OCI-container tillgång till GPU, NVIDIA, Coral, USB, FUSE och andra enheter som validerade inbyggda Proxmox VE-resurser." + }, + "header": { + "title": "Enheter och acceleration", + "description": "GPU, NVIDIA, Coral, USB, FUSE och blockenheter blir validerade inbyggda Proxmox VE-resurser för containern.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "principle", + "title": "Enheten som programmet behöver, inte hela värden", + "blocks": [ + { + "p": "En enhet som begärs av Compose-filen eller av applikationsprofilen blir en konkret devN-post eller LXC-montering. Be om en GPU, en USB-enhet eller en Coral gör inte containern privilegierad." + }, + { + "flow": { + "nodes": [ + { + "label": "Värdinventering", + "detail": "/dev/dri/renderD128\nGID 993 · Intel" + }, + { + "label": "ProxMenux", + "detail": "tillverkare och\nbehörigheter kontrollerade" + }, + { + "label": "LXC", + "detail": "samma enhet\neffektiv GID" + } + ] + } + } + ] + }, + { + "id": "origin", + "title": "Varifrån enhetsbegäran kommer", + "blocks": [ + { + "table": { + "headers": [ + "Källa", + "Vad läses", + "Vad installationsprogrammet gör" + ], + "rows": [ + [ + "Docker Compose", + "devices, group_add, deploy.resources och NVIDIA förfrågningar", + "Varje krav blir en begäran om enhet som visas för granskning" + ], + [ + "Katalogprofil", + "Programmets faktiska stöd för GPU, Coral, OpenCL, USB eller FUSE", + "Endast de alternativ som valideras för den avbildningen erbjuds" + ], + [ + "Avbildningens metadata och dokumentation", + "VA-API, Selkies, LinuxServer mods eller NVIDIA runtime", + "Dokumenterade variabler och förberedelser läggs till" + ], + [ + "Användarval", + "CPU endast, Intel/AMD, OpenCL, NVIDIA eller en valfri enhet", + "Urvalet lagras i instansavtalet" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Upptäckta enheter ansluts inte automatiskt", + "body": "Värden är inventerad, men endast enheter som deklareras av Compose-filen eller av en kompatibel profil erbjuds och bifogas. En GPU, USB-dongel eller Coral närvarande på värden är inte utsatt för varje LXC." + } + } + ] + }, + { + "id": "identify", + "title": "Hur värdenheten identifieras", + "intro": "Innan LXC modifieras läses enheten på värden och matchas mot den valda profilen.", + "blocks": [ + { + "table": { + "headers": [ + "Typ", + "Identitet", + "Validering" + ], + "rows": [ + [ + "Intel/AMD DRM", + "/dev/dri/renderD* och /sys/class/drm/NODE/device/vendor", + "En teckenenhet med leverantör 0x8086 (Intel) eller 0x1002 (AMD)" + ], + [ + "AMD OpenCL", + "Rendernoden plus /dev/kfd när profilen behöver den", + "Existens, typ, leverantör, behörigheter och förklarad kompatibilitet" + ], + [ + "AMD ROCm", + "Rendernoden, /dev/kfd och generationen som beräkningsdrivrutinen rapporterar i /sys/class/kfd/kfd/topology/nodes/*/properties", + "En generation som programmets ROCm-avbildning innehåller beräkningskärnor för — de namngivna RDNA2-GPU:erna och nyare — erbjuds utan anpassning. Andra GPU:er i dessa familjer, till exempel Radeon 680M och 780M, erbjuds som experimentella och väljs aldrig som föreslaget alternativ: ROCm stöder dem inte officiellt, programmet presenterar dem som familjens generation (HSA_OVERRIDE_GFX_VERSION) och installeraren begär bekräftelse innan den större avbildningen hämtas. Äldre GPU:er, till exempel den integrerade grafiken i Ryzen 5000U, erbjuds inte och Immich fortsätter köra igenkänningen på CPU:n." + ], + [ + "NVIDIA", + "nvidia-smi och nvidia-container-cli", + "GPU, UUID, PCI buss, drivrutinsversion, Toolkit, /dev/nvidia* noder, binärer och bibliotek" + ], + [ + "Coral PCIe/M.2", + "/dev/apex_N och dess länk i /sys/dev/char/MAJOR:MINOR", + "Teckenenhetsnod, major/minor-nummer, ägare, GID och behörigheter" + ], + [ + "USB och seriell", + "/dev/ttyUSB*, /dev/ttyACM* eller /dev/bus/usb/BBB/DDD", + "Teckenenhetsnod; för USB även tillverkare, produkt och serienummer när sysfs publicerar dem" + ], + [ + "KVM, TUN, FUSE, video och generisk SCSI", + "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN eller /dev/sgN", + "Sökväg som stöds, nodtyp och effektiva behörigheter" + ], + [ + "Optisk enhet", + "/dev/srN", + "En blockenhet" + ] + ] + } + } + ] + }, + { + "id": "install", + "title": "Vad händer under installationen", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Mallen erbjuder sina profiler", + "body": "Till exempel CPU endast, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL eller NVIDIA. Alternativen hör till avbildningen, inte till en vanlig meny." + }, + { + "title": "En profil väljs", + "body": "Den anger enhetsnoder, miljö, moddar eller den körmiljö som programmet behöver." + }, + { + "title": "En väg föreslås", + "body": "För DRM, /dev/dri/renderD128, som kan ändras på en värd med flera rendernoder. För USB eller seriell, är den specifika noden vald." + }, + { + "title": "Validering", + "body": "Existens, typ, tillåten leverantör, behörigheter och GID kontrolleras. En missmatchning stoppar operationen." + }, + { + "title": "Kontraktet är skrivet", + "body": "Sökväg, läge, GID, skrivåtkomst och profil sparas för uppdateringar och när containern skapas om." + }, + { + "title": "Anslut och testa", + "body": "pct set lägger till devN inträde och åtkomst kontrolleras sedan inuti LXC. LinuxServer avbildningar kontrolleras också som användare abc." + } + ] + } + } + ] + }, + { + "id": "config", + "title": "Hur det visas i LXC-konfigurationen", + "intro": "Exempelvärden: dev0 och dev1 är lediga platser som Proxmox VE tilldelar, och renderD128, apex_0 samt GID beror på nodens maskinvara.", + "blocks": [ + { + "codeGrid": { + "items": [ + { + "title": "Intel/AMD VA-API", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0" + }, + { + "title": "Coral PCIe/M.2", + "code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "En specifik USB-enhet", + "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" + }, + { + "title": "AMD OpenCL", + "code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0" + } + ] + } + }, + { + "p": "GID läses med stat på värden och skrivs till devN-posten; render och video-grupper antas inte ha ett fast nummer. Enheten håller samma /dev-väg inuti LXC, där programmets egna mekanismer letar efter det." + } + ] + }, + { + "id": "profiles", + "title": "Profiler en avbildning kan erbjuda", + "blocks": [ + { + "table": { + "headers": [ + "Profil", + "Resulterande konfiguration", + "Erbjuds när" + ], + "rows": [ + [ + "Intel/AMD VA-API", + "Rendernod i /dev/dri", + "Applikationen stöder videoacceleration" + ], + [ + "OpenCL", + "Rendernod, /dev/kfd vid behov och den officiella modden", + "Avbildningen eller profilen dokumenterar den" + ], + [ + "NVIDIA", + "Värdens drivrutinsenheter och bibliotek", + "Värden har en fungerande drivrutin och NVIDIA Container Toolkit" + ], + [ + "Coral", + "/dev/apex_0 eller USB buss", + "Profilen förklarar Coral Support (Frigate)" + ], + [ + "USB, seriell, FUSE", + "En enhet, ett validerat träd eller en LXC-funktion", + "Kontraktet begär det" + ] + ] + } + } + ] + }, + { + "id": "nvidia", + "title": "NVIDIA", + "blocks": [ + { + "calloutWarning": { + "title": "Nodkrav: NVIDIA Container Toolkit", + "body": "En fungerande drivrutin på Proxmox VE är inte tillräckligt för att ge en NVIDIA GPU till en OCI-avbildning. OCI Manager Apps använder nvidia-container-cli, från NVIDIA Container Toolkit, för att identifiera enheterna och för att få binärer och bibliotek som matchar den laddade drivrutinen." + } + }, + { + "p": "ProxMenux NVIDIA-installerare installerar NVIDIA Container Toolkit från NVIDIAs officiella arkiv tillsammans med drivrutinen. Den kontrollerar dess fyra paket, validerar nvidia-container-cli och registrerar resultatet i ändringsloggen för Audit & Report." + }, + { + "p": "Dessa två kommandon på värden visar om drivrutinen och Toolkit är tillgängliga:" + }, + { + "shell": { + "code": "nvidia-smi -L\nnvidia-container-cli --version" + } + }, + { + "p": "På en värd där drivrutinen installerades på annat sätt installeras Toolkit från det officiella stabila förvaret:" + }, + { + "shell": { + "code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools" + } + }, + { + "p": "Inventeringen OCI Manager Apps använder är utdata av:" + }, + { + "shell": { + "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" + } + }, + { + "calloutInfo": { + "title": "Docker runtime konfiguration är inte involverad", + "body": "Containrarna är inbyggda LXC:er utan Docker-demon, så nvidia-ctk runtime configure --runtime=docker ingår inte: ProxMenux frågar nvidia-container-cli direkt och skriver LXC-enheter och monteringar. Kommandon och plattformar som stöds underhålls i installationsguiden för NVIDIA Container Toolkit." + } + }, + { + "cards": { + "items": [ + { + "icon": "cpu", + "title": "Inventering från drivrutinen", + "body": "nvidia-container-cli listar enhetsnoder, binärer, firmware och bibliotek av den installerade drivrutinen." + }, + { + "icon": "refresh", + "title": "Ingen fast version", + "body": "Mallen anger inga biblioteksfilnamn. Profilen genereras från den aktuella värden." + }, + { + "icon": "shield", + "title": "Skrivskyddade monteringar", + "body": "Värdens bibliotek monteras skrivskyddat i stället för att kopieras till containern." + }, + { + "icon": "hardDrive", + "title": "Ändringar av drivrutin", + "body": "Efter en drivrutinsändring genereras inventeringen på nytt innan berörda LXC:er startar." + } + ] + } + }, + { + "code": { + "title": "NVIDIA resultat (förenklad)", + "code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0" + } + }, + { + "p": "Att bara ge tillgång till /dev/nvidia0 räcker inte. Den laddade drivrutinens användarkomponenter monteras skrivskyddat, och nvidia-smi körs sedan i LXC:n för att jämföra GPU, UUID, PCI-buss och version med värdens inventering." + } + ] + }, + { + "id": "usb", + "title": "USB, seriell och USB Coral", + "blocks": [ + { + "calloutWarning": { + "title": "USB-nummer kan ändra", + "body": "En väg som /dev/bus/usb/003/004 kan ändras när enheten är återansluten eller värden startar om. Profilen registrerar tillverkaren, produkten och serienumret när de är tillgängliga, men en ny bussadress mappas om inte automatiskt." + } + }, + { + "p": "En kringutrustning anges med sin specifika nod: /dev/ttyUSB0, /dev/ttyACM0, /dev/apex_0 eller /dev/bus/usb/BBB/DDD. Att passera hela /dev accepteras inte. Coral erbjuds endast program vars profil anger det." + } + ] + }, + { + "id": "trees", + "title": "Enhetsträd och LXC-funktioner", + "blocks": [ + { + "table": { + "headers": [ + "Begäran", + "Resulterande konfiguration", + "Omfattning" + ], + "rows": [ + [ + "/dev/dvb, /dev/snd eller /dev/bus/usb", + "Varje teckenenhetsnod i trädet får en egen devN-post med värdens läge och GID", + "Endast det begärda trädet, inte resten av /dev" + ], + [ + "/dev/fuse", + "Noden och när profilen behöver den, funktionen fuse=1", + "FUSE offentliggör inte fästen till andra LXCs" + ], + [ + "/dev/net/tun", + "En devN-post med samma sökväg inuti LXC:n", + "VPN- eller nätverkskonfigurationen stannar i programmet" + ], + [ + "/dev/kvm", + "En validerad devN-post", + "Erbjuds endast när kontraktet begär det" + ] + ] + } + } + ] + }, + { + "id": "security", + "title": "Bekräftelser av risknivå", + "blocks": [ + { + "p": "Konkreta enheter, valfri privilegiering, krävs privilegier, AppArmor eller seccomp avslappning och tillgång till värd PID-namnrymden behandlas som separata fall, inte under en generisk privilegierad etikett. Varje alternativ med en risk förklaras och bekräftas under installationen." + } + ] + } + ] +} diff --git a/web/messages/sv/docs/oci-manager/index.json b/web/messages/sv/docs/oci-manager/index.json new file mode 100644 index 00000000..390aa4d6 --- /dev/null +++ b/web/messages/sv/docs/oci-manager/index.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "OCI manager Apps | ProxMenux", + "description": "Kör officiella OCI-avbildningar som LXC-containrar direkt i Proxmox VE, med beständiga data, enhetsåtkomst, program med flera containrar och transaktionsbaserade uppdateringar." + }, + "header": { + "title": "OCI manager Apps", + "description": "Officiella OCI-avbildningar körs som inbyggda LXC-containrar i Proxmox VE. Avbildningen är fortfarande den som underhållaren publicerar; ProxMenux återskapar miljön som Docker Compose annars skulle ha skapat runt den.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "model", + "blocks": [ + { + "calloutInfo": { + "title": "En OCI-avbildning, en LXC direkt i Proxmox VE", + "body": "Ingen Docker Engine körs i containrarna. Proxmox VE importerar avbildningens filsystem och OCI-metadata. Programmet blir huvudprocessen i en inbyggd LXC-container som hanteras med samma verktyg som övriga containrar på noden." + } + }, + { + "flow": { + "nodes": [ + { + "label": "Källa", + "detail": "OCI-avbildning\nCompose och dokumentation" + }, + { + "label": "ProxMenux", + "detail": "JSON-kontrakt\nvalidering och planering" + }, + { + "label": "Proxmox VE", + "detail": "LXC direkt i Proxmox VE\nvolymer och enheter" + } + ], + "caption": "Programmet byggs inte om. Dess miljö beskrivs deklarativt och återskapas." + } + } + ] + }, + { + "id": "where", + "title": "Var du hittar det", + "intro": "Öppna OCI manager Apps (Technology Preview) i ProxMenux huvudmeny på Proxmox-noden som root. Den första vyn erbjuder:", + "blocks": [ + { + "list": { + "items": [ + "Sök program – sök efter namn i hela katalogen.", + "Alla program – visa hela katalogen och antalet program.", + "Hantera installerade OCI-program – uppdatera, ändra, ta bort eller återställ befintliga installationer.", + "Registerkonton – hantera konton för att installera och uppdatera avbildningar från privata register.", + "Installera en avbildning utanför katalogen – anpassa en Compose-fil, ett docker run-kommando eller en avbildningsreferens.", + "Katalogens kategorier, var och en med sitt antal program." + ] + } + }, + { + "figure": { + "src": "/oci-manager/main-menu.png", + "alt": "Huvudvyn i OCI manager Apps med sökning, hela katalogen, programhantering, avbildningar utanför katalogen och kategorier.", + "caption": "Huvudvyn i OCI manager Apps." + } + }, + { + "p": "När du väljer ett program visas dess beskrivning, avbildningen som används och två installationslägen. Installera med standardinställningar frågar bara efter grundvalen: lagring, dataplacering, adress och start. Installera med avancerade inställningar går igenom alla val i ordning: VMID och resurser, lagring för varje sökväg, nätverksbrygga och enheter." + }, + { + "p": "Program som faktiskt har testats visas som Verifierad i den här vyn och markeras med ✓ i listorna, oavsett om testet gjordes i ProxMenux labb eller av användargemenskapen." + } + ] + }, + { + "id": "beta", + "title": "Varför beteckningen Technology Preview används", + "blocks": [ + { + "p": "OCI manager Apps behåller beteckningen Technology Preview som Proxmox VE använder för programcontainrar skapade från OCI-avbildningar. Stödet infördes i Proxmox VE 9.1. Beteckningen gäller tekniken som OCI manager Apps bygger på, inte ProxMenux-motorn: containrarnas beteende kan fortfarande ändras mellan Proxmox VE-versioner. Beteckningen behålls tills Proxmox VE bedömer att stödet är stabilt." + }, + { + "p": "Funktionerna i OCI manager Apps testas i ProxMenux labb: installation, uppdatering, ändringar, återskapande, säkerhetskopiering, återställning, migrering och watchdog. Varje program testas separat. De som faktiskt har testats visas som Verifierad och markeras med ✓ i listorna." + } + ] + }, + { + "id": "translation", + "title": "Så beskriver Docker kraven och så omsätter OCI manager Apps dem", + "blocks": [ + { + "table": { + "headers": [ + "Krav", + "Så uttrycks det i Docker", + "Så omsätts det i OCI manager Apps" + ], + "rows": [ + [ + "Kör programmet", + "image, entrypoint, command", + "OCI-avbildningens rootfs och LXC-containerns huvudprocess" + ], + [ + "Bevara konfigurationen", + "volumes: /config", + "En beständig mpN-volym som tas med i säkerhetskopian, eller en katalog på värden." + ], + [ + "Gör tjänsten tillgänglig", + "ports", + "En egen adress för LXC-containern och tjänstens åtkomst-URL." + ], + [ + "Använd maskinvara", + "devices, group_add", + "devN-poster med värdens effektiva grupp-ID (GID) och en validerad profil." + ], + [ + "Koppla ihop beroenden", + "networks, depends_on", + "En privat nätverksbrygga, fasta adresser, startordning och hälsokontroller." + ], + [ + "Uppdatera", + "Hämta med pull och återskapa", + "Ett nytt rootfs med samma kontrakt för beständiga data." + ] + ] + } + } + ] + }, + { + "id": "kept", + "title": "Vad som bevaras och vad som ändras", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "archive", + "title": "Bevaras", + "body": "Den officiella avbildningen, dess interna sökvägar, miljö, startprocess och användardokumentation." + }, + { + "icon": "boxes", + "title": "Anpassas", + "body": "Körmiljön: nätverk, beständiga data, enheter, behörigheter och beroenden använder de inbyggda LXC-funktionerna i Proxmox VE." + }, + { + "icon": "shield", + "title": "Utan motsvarighet", + "body": "Ett Compose-alternativ utan en säker motsvarighet markeras som ett hinder för installationen. Mallar med sådana hinder erbjuds inte för installation, och känsliga alternativ måste bekräftas i installationsguiden." + }, + { + "icon": "refresh", + "title": "Sparas", + "body": "Avbildningens digest, resurser, sökvägar, nätverk, enheter och tillhörighet till en stack sparas i instanskontraktet. Uppdateringar och återskapande följer samma kontrakt." + } + ] + } + } + ] + }, + { + "id": "pages", + "title": "Sidor i det här avsnittet", + "blocks": [ + { + "next": { + "items": [ + { + "label": "Så anpassas en OCI-avbildning", + "href": "/docs/oci-manager/architecture", + "tail": "Från avbildningen och dess Compose-fil till en LXC direkt i Proxmox VE." + }, + { + "label": "Installera en avbildning utanför katalogen", + "href": "/docs/oci-manager/custom-image", + "tail": "En Compose-fil, ett docker run-kommando eller en avbildningsreferens." + }, + { + "label": "Data, sökvägar och nätverk", + "href": "/docs/oci-manager/storage-network", + "tail": "Containervolymer, kataloger på värden, rclone-monteringar och adresser." + }, + { + "label": "Enheter och acceleration", + "href": "/docs/oci-manager/hardware", + "tail": "GPU, NVIDIA, Coral, USB och andra enheter." + }, + { + "label": "Program med flera containrar", + "href": "/docs/oci-manager/stacks", + "tail": "Program, databas och cache i samordnade LXC-containrar." + }, + { + "label": "Installera, uppdatera och ändra", + "href": "/docs/oci-manager/lifecycle", + "tail": "Instanskontraktet och dess åtgärder." + }, + { + "label": "I ProxMenux Monitor", + "href": "/docs/oci-manager/monitor", + "tail": "Versioner, uppdateringar, konsolutdata och terminal." + } + ] + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/oci-manager/lifecycle.json b/web/messages/sv/docs/oci-manager/lifecycle.json new file mode 100644 index 00000000..b4a5ad6e --- /dev/null +++ b/web/messages/sv/docs/oci-manager/lifecycle.json @@ -0,0 +1,499 @@ +{ + "meta": { + "title": "Installera, uppdatera och ändra | ProxMenux", + "description": "Instanskontraktet för en OCI-container och de åtgärder som använder det: uppdatering, ändring, borttagning, återupptagning av en avbruten åtgärd och återställning av driften efter en återläsning på denna eller en annan värd." + }, + "header": { + "title": "Installera, uppdatera och modifiera", + "description": "Varje instans behåller ett reproducerbart kontrakt, så att dess rootfs kan ersättas utan att konfiguration eller beständiga data går förlorade.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "contract", + "title": "Instanskontraktet", + "blocks": [ + { + "p": "Efter installationen sparas den faktiska konfigurationen i /usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json. Det är inte en kopia av den ursprungliga Compose-filen, utan ett reproducerbart kontrakt för den LXC som finns på värden." + }, + { + "code": { + "code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle" + } + }, + { + "p": "En kopia av kontraktet finns i containern under /.proxmenux/oci-record.json och kan bara läsas av containerns root-användare. En säkerhetskopia av containern innehåller därför alltid det kontrakt som gällde då. En andra kopia sparas i /etc/pve/priv/proxmenux/oci, som delas av alla noder i klustret och bara kan läsas av värdens root-användare. Båda kopiorna skrivs efter varje installation, uppdatering och ändring." + } + ] + }, + { + "id": "manage", + "title": "Hantera installerade OCI-program", + "intro": "Det här alternativet på huvudskärmen listar registrerade instanser med tillhörande program och avbildning. Varje instans kontrolleras mot sitt kontrakt före varje åtgärd. En CT som inte längre stämmer med sin post varken ändras eller tas bort. Samma uppdatering och editor finns på fliken Uppdateringar i ProxMenux Monitor.", + "blocks": [ + { + "table": { + "headers": [ + "Alternativ", + "Vad ändras", + "Vad bevaras" + ], + "rows": [ + [ + "Uppdatera avbildningen med sparad konfiguration", + "Rootfs ersätts med den avbildning som den sparade kanalen publicerar för närvarande", + "Kontrakt, containerdiskar, värdkataloger, nätverk och enheter" + ], + [ + "Ändra: redigera resurser, nätverk, sökvägar och GPU", + "Editorn öppnas med det aktuella kontraktet; CT:n byggs om med ändringarna", + "Data på containerdiskar och i värdkataloger" + ], + [ + "Watchdog: starta om programmet när det kraschar", + "Om programmet ska startas igen när det stannar av sig självt. Ingenting byggs om", + "Hela installationen; endast valet sparas i kontraktet" + ], + [ + "Ta bort: ta bort programmet och dess containrar", + "LXC, eller varje medlem i en stack, och deras kontrakt raderas", + "Värdkataloger, med deras innehåll" + ] + ] + } + }, + { + "p": "För ett program med flera containrar erbjuder menyn Uppdatera alla programmets containrar, Ändra extra sökvägar och enheter, Återskapa alla containrar med sparad konfiguration, watchdog och borttagning. Ändra lägger till eller tar bort extra sökvägar och enheter i programcontainern utan att bygga om något och ändrar i Immich vad som kör igenkänningen. Återskapa bygger om varje container från den avbildning som användes vid installationen utan att söka efter en nyare." + }, + { + "figure": { + "src": "/oci-manager/manage-menu.png", + "alt": "Lista över installerade OCI-program med alternativ för att uppdatera, ändra och ta bort", + "caption": "Hantera installerade OCI-program." + } + } + ] + }, + { + "id": "update", + "title": "En transaktionell uppdatering", + "blocks": [ + { + "mermaid": { + "chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end", + "labels": { + "user": "Användare", + "registry": "OCI-registret", + "update": "Uppdatera instans", + "resolve": "Slå upp taggen", + "verify": "Verifiera arkivet och kör förkontroller", + "backup": "Stoppa och säkerhetskopiera CT:n", + "import": "Importera det nya rootfs", + "reapply": "Applicera kontraktet igen", + "healthy": "frisk", + "failure": "misslyckande", + "commit": "Kontraktet publiceras med den nya digesten", + "restored": "Tidigare instans återställd" + } + } + }, + { + "list": { + "items": [ + "Om registret fortfarande tillhandahåller den installerade digesten laddas ingenting ned och instansen lämnas orörd.", + "Den nya avbildningen verifieras lager för lager innan CT:n stoppas. En skadad nedladdning hämtas en andra gång; en redan cachad avbildning som inte klarar kontrollen laddas ned igen.", + "Inställningar som ändrats i Proxmox VE efter installationen (minne, swap, kärnor, CPU-gräns, CPU-prioritet och start med noden) bevaras och förs över till det nya kontraktet.", + "LAN-gränssnittet som Arr-sviten och multi-container-applikationerna lägger till (net1) och startordern (startup) ges tillbaka till den nya containern som de är.", + "Alla andra skillnader mellan CT och dess kontrakt stoppar uppdateringen innan CT stoppas." + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "Före", + "detail": "rootfs A\n/config mp0\n/media värdkatalog" + }, + { + "label": "Uppdatering", + "detail": "ersätter endast\nrootfs" + }, + { + "label": "Efter", + "detail": "rootfs B\n/config mp0\n/media värdkatalog" + } + ] + } + }, + { + "p": "Innan något stoppas kontrolleras att det finns plats för säkerhetskopian: använda data på de volymer som ingår, plus en marginal. Den skrivs intill programmets post på värdens systemdisk. Om utrymmet inte räcker ber menyn om en annan lagring på värden som stöder säkerhetskopior. Kopian skapas där och tas bort när åtgärden är klar. Valet sparas för programmet, även för schemalagda uppdateringar. Om ingen lagring har tillräckligt med plats avvisas åtgärden och programmet förblir oförändrat. Utrymmet för den nya avbildningen kontrolleras på samma sätt före nedladdningen." + } + ] + }, + { + "id": "recovery", + "title": "Återställa en avbruten operation", + "intro": "En uppdatering och en förändring använder en ihållande transaktion. Om processen, terminalen eller noden avbryts efter CT-stoppen, är operationen inte färdig.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Markör för väntande åtgärd", + "body": "När Hantera installerade OCI-program öppnas visar det sparade tillståndet att ersättningen aldrig publicerades." + }, + { + "title": "Visa status", + "body": "Visar den fas som uppnåddes utan att ändra containrar eller data." + }, + { + "title": "Återställ den tidigare installationen", + "body": "Återläser den verifierade säkerhetskopia i plattformens eget format som togs före ersättningen samt det tidigare kontraktet." + }, + { + "title": "Stackar som en enhet", + "body": "För en multicontainer-applikation återhämtas varje medlem från samma transaktionspunkt, inte bara den valda." + } + ] + } + }, + { + "calloutWarning": { + "title": "Värdkataloger ingår inte i återställningen", + "body": "Säkerhetskopian omfattar rootfs och de containerdiskar som ingår i den. En värdkatalog återställs inte till sitt tidigare tillstånd, eftersom andra LXC-containrar kan använda dess data." + } + } + ] + }, + { + "id": "watchdog", + "title": "Watchdog: starta om ett program som stannar", + "intro": "Proxmox har ingen omstartspolicy: när processen i en programcontainer avslutas förblir containern stoppad. Med watchdog aktiverad startas ett program som stannar av sig självt igen. För ett OCI-program gör den vad restart: unless-stopped gör i en Compose-fil.", + "blocks": [ + { + "table": { + "headers": [ + "Vad händer", + "Med Watchdog på" + ], + "rows": [ + [ + "Programmet kraschar eller dess process avslutas", + "Containern startas igen inom några sekunder" + ], + [ + "Det stoppas eller stängs av från Proxmox, från Monitor eller med pct", + "Den förblir stoppad tills någon startar den" + ], + [ + "En backup, en migration eller en ProxMenux-operation arbetar med den", + "Ingenting görs förrän det slutar" + ], + [ + "Den var redan stoppad när värden startade", + "Den förblir stoppad; detta styrs av Starta med Proxmox" + ], + [ + "Den stannar upprepade gånger direkt efter start", + "För ett program som stannar inom några sekunder efter start, eller inte startar alls, görs fem startförsök med 30 sekunders, 1, 2 och 5 minuters väntan mellan försöken. Därefter lämnas det stoppat och en avisering skickas" + ] + ] + } + }, + { + "p": "Installationsprogrammet frågar om detta i båda installationslägena och föreslår värdet från programmets recept. Inställningen kan senare ändras under Hantera installerade OCI-program eller med containerns Watchdog-reglage i ProxMenux Monitor och gäller alla containrar i ett program med flera containrar. En enda tjänst på värden, proxmenux-oci-watchdog.service, övervakar alla program som begärt det. Installationen visas på fliken Ändringar i Audit & Report." + }, + { + "calloutInfo": { + "title": "Vad värden inte kan avgöra", + "body": "Programmets slutkod når inte värden, så ett normalt avslut och en krasch ser likadana ut och leder båda till omstart, som always och unless-stopped i Docker. Ett stopp som begärs utanför Proxmox med lxc-stop eller systemctl lämnar ingen stoppuppgift och tolkas som att programmet stannade av sig självt." + } + } + ] + }, + { + "id": "restore", + "title": "Backup, restaurering och en annan värd", + "intro": "En säkerhetskopia som görs med vzdump eller Proxmox Backup Server innehåller containern, de containerdiskar som valts för säkerhetskopiering och kopian av dess kontrakt. Det som installationen sparar på värden ingår inte. Hantera installerade OCI-program upptäcker containrar som återlästs på en värd utan deras kontrakt, efter en ny Proxmox-installation eller på en annan värd, och erbjuder att registrera dem igen.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Återställ containrarna i Proxmox", + "body": "Från säkerhetskopieringslagringen, med det ursprungliga ID:t eller ett annat ledigt ID. Ett program med flera containrar behöver samtliga sina containrar." + }, + { + "title": "Öppna Hantera installerade OCI-program", + "body": "De återlästa containrarna listas och återställning erbjuds. Knappen Återställ på fliken Uppdateringar i ProxMenux Monitor öppnar samma återställning." + }, + { + "title": "Kontrollera innan du ändrar", + "body": "Återställningen kontrollerar att värden har allt som varje program behöver. Ett program som inte kan återställas i sin helhet lämnas oförändrat och orsaken anges." + }, + { + "title": "Registrera och starta", + "body": "Kontraktet registreras på den här värden och det som installationen sparade där skrivs på nytt. Om programmen ska startas är en separat fråga. Svara Nej om de ursprungliga containrarna fortfarande körs på en annan värd." + } + ] + } + }, + { + "figure": { + "src": "/oci-manager/restore-offer.png", + "alt": "Dialog som listar de restaurerade containrarna och erbjuder att återställa dem", + "caption": "Återställningen som erbjuds när Hantera installerade OCI-program öppnas." + } + }, + { + "table": { + "headers": [ + "Vad värden sparade", + "Efter återhämtningen" + ], + "rows": [ + [ + "Instanskontrakt", + "Registreras från kopian i containern, som kontrolleras mot den konfiguration som Proxmox återläste" + ], + [ + "Privat nätverk av en multi-container-applikation", + "Skapad igen med samma bro och undernät; de fasta adresserna i containrarna ändras inte" + ], + [ + "Startorder för en multicontainer-applikation", + "Beroende hookscript och dess kontrakt installeras igen; snippets är aktiverade på local lagring när ingen lagring accepterar dem" + ], + [ + "Nätverks-sysctl och fil för värdövervakning", + "Skriven igen i /etc/pve/proxmenux" + ], + [ + "NVIDIA-körmiljö", + "Hooken för en oprivilegierad container installeras på nytt. En privilegierad container får den här värdens drivrutinsfiler i stället för filerna från ursprungsvärden" + ], + [ + "Rclone montering", + "Hookscriptet och de program som gör monteringen tillgänglig skrivs på nytt, med samma vyer på värden" + ], + [ + "Brandväggsregel på värden för en värdmonitor", + "Efterfrågas igen för dess webbport och bryggans undernät på den här värden" + ], + [ + "lost+found av varje återställd disk", + "Tas bort om den är tom; en återläsning skapar den och vissa program kan inte starta om den finns bland deras data" + ], + [ + "Diskar som återlästs till annan lagring", + "Kontraktet uppdateras till lagringen de är på nu" + ] + ] + } + }, + { + "p": "En container som återlästs med ett annat ID behåller sitt program. Kontraktet, konsolloggen, nätverksparametrarna för sysctl, hookscriptet för en Rclone-montering och startordningen för ett program med flera containrar registreras med de ID:n som containrarna har på den här värden." + }, + { + "table": { + "headers": [ + "Vad hindrar en återställning", + "Vad du gör" + ], + "rows": [ + [ + "En container av en multicontainer-applikation saknas", + "Återläs den också; programmet återställs i sin helhet" + ], + [ + "Det privata undernätet används redan på den här värden", + "Återhämtningen avbryts och ingenting ändras: adresserna till containrarna är fasta och flyttas inte till ett annat undernät." + ], + [ + "En värdkatalog finns inte", + "Montera eller skapa den med dess data; en säkerhetskopia av containern inkluderar inte värdkataloger" + ], + [ + "En enhet finns inte på denna värd", + "Anslut den eller ta bort den från containern i Proxmox" + ], + [ + "Ett program med NVIDIA på en värd utan drivrutinen", + "Installera NVIDIA-drivrutinen och Container Toolkit" + ], + [ + "Backupen gjordes innan kopian av kontraktet fanns", + "Containern stannar som en vanlig LXC och erbjuds inte igen" + ] + ] + } + }, + { + "calloutInfo": { + "title": "En container som kommer tillbaka", + "body": "En container som återlästs över sig själv från en äldre säkerhetskopia, återställts till en ögonblicksbild eller återvänt från en annan nod bär kontraktet för sitt nuvarande tillstånd. Om den väljs för en åtgärd och dess kontrakt skiljer sig från värdens startar åtgärden inte, och containern erbjuds för återställning." + } + }, + { + "figure": { + "src": "/oci-manager/restore-result.png", + "alt": "Resultatet av återhämtningen med det privata nätverket, startordern och de registrerade containrarna", + "caption": "Resultatet av en återhämtning steg för steg." + } + } + ] + }, + { + "id": "remove", + "title": "Ta bort en OCI-applikation", + "blocks": [ + { + "p": "Före bekräftelsen skapas en sammanfattning utifrån den faktiska konfigurationen: containrarna som tas bort, data som raderas med dem, det privata nätverket som frigörs och värdkatalogerna som bevaras. Bekräftelsen är förvald till Nej, eftersom data på raderade diskar inte kan återställas efteråt." + }, + { + "table": { + "headers": [ + "Resurs", + "Vid borttagning", + "Orsak" + ], + "rows": [ + [ + "rootfs och containerdiskar", + "Raderas", + "De tillhör endast containern" + ], + [ + "Värdkatalog", + "Bevaras med sitt innehåll", + "Andra applikationer kan använda den" + ], + [ + "Containerns filer på värden", + "Raderas", + "Dess konsollogg, nätverkssysctls, Rclone montering hookscript och dess registrering i App-fliken ProxMenux Monitor tjänar ingen annan container" + ], + [ + "Filer som delas av flera installationer", + "Tas bort när den sista installationen som använder dem tas bort", + "Värdmonitorfilen och hookscriptet för beroenden i program med flera containrar" + ], + [ + "Instanskontrakt", + "Tas bort efter en framgångsrik borttagning", + "Ingen CT är associerad med den mer" + ], + [ + "Privat brygga för en stack", + "Frigörs med stacken", + "Det har inga medlemmar kvar att ansluta" + ], + [ + "Nätverk som delas av Arr-paketet", + "Frigörs när det sista programmet i sviten tas bort", + "Varje program i sviten är oberoende och tas bort separat" + ], + [ + "En enda medlem av en stack", + "Tas inte bort separat", + "Hela applikationen tas bort, så ingen stack lämnas ofullständig" + ], + [ + "En container på en annan nod av klustret", + "Inte borttagen", + "Dess rekord och värdfiler är på noden där den installerades: den tas bort där, efter att ha migrerat den tillbaka." + ] + ] + } + }, + { + "figure": { + "src": "/oci-manager/remove-summary.png", + "alt": "Sammanfattning av borttagningen med berörda containrar, data och värdkataloger", + "caption": "Sammanfattningen av borttagningen, skapad utifrån den faktiska konfigurationen." + } + } + ] + }, + { + "id": "archives", + "title": "Nedladdade avbildningar och utrymme på värden", + "blocks": [ + { + "p": "OCI-arkivet används för att bygga rootfs; den körande CT:n läser det inte. Efter en installation eller uppdatering listas de arkiv som laddades ned under åtgärden med sina storlekar, och borttagning erbjuds. Att ta bort dem frigör utrymme utan att påverka containern eller dess data." + }, + { + "calloutInfo": { + "title": "Uppdateringar behöver inte arkivet", + "body": "Utan arkivet slår en uppdatering upp den sparade kanalen och laddar ned den nya digesten. Om arkivet finns återanvänds det bara när dess referens och integritet motsvarar det som begärs." + } + } + ] + }, + { + "id": "registry", + "title": "Register och rensning", + "blocks": [ + { + "p": "När Hantera installerade OCI-program öppnas tas först rester bort efter containrar som inte längre finns på någon nod i klustret: posten som sparats som historik efter borttagning via Proxmox-gränssnittet och värdfiler som lämnats kvar efter en borttagning. En post med en halvfärdig åtgärd behålls eftersom säkerhetskopian fortfarande kan behövas. Volymer och värdkataloger raderas aldrig utifrån antaganden." + } + ] + }, + { + "id": "cluster", + "title": "I ett kluster: migration och hög tillgänglighet", + "intro": "En OCI-container är en vanlig Proxmox-LXC: den kan migreras eller hanteras av HA som andra containrar, med samma begränsningar. Det som behövs för att starta den sparas där alla noder i klustret kan hitta det.", + "blocks": [ + { + "table": { + "headers": [ + "Delar", + "På en annan nod av klustret" + ], + "rows": [ + [ + "Konsollogg", + "Containern skapar /var/log/proxmenux/oci före start på den nod som kör den. Varje nod sparar loggen för de starter som utförts där." + ], + [ + "Nätverks-sysctl och värdmonitor", + "Sparas i /etc/pve/proxmenux, som delas av alla noder i klustret, så att en migrerad container hittar dem." + ], + [ + "Containerdiskar", + "Proxmox flyttar dem med containern. HA behöver ha deras data tillgängliga på målnoden via delad lagring eller en replikering som stöds." + ], + [ + "Värdkataloger och enheter", + "Samma regler som alla LXC: en värdkatalog måste finnas på målnoden och markeras som delad, och en GPU, Coral eller NPU måste finnas där." + ], + [ + "ProxMenux-post", + "Kontraktet stannar på noden där programmet installerades, och varje nod läser kopian i /etc/pve/priv/proxmenux/oci. Ett program med en enda container som migreras registreras på målnoden när Hantera installerade OCI-program öppnas eller en åtgärd startas för programmet. Ett program med flera containrar erbjuds för återställning där eftersom dess privata nätverk måste skapas på den noden." + ] + ] + } + }, + { + "calloutWarning": { + "title": "Inte för hög tillgänglighet", + "body": "En multi-container-applikation når sina medlemmar genom en privat bro av noden som den installerades på, så dess medlemmar stannar på den noden. En värdmonitor, såsom Glances i värdläge eller Netdata, övervakar den nod som den körs på; flytta den skulle övervaka en annan nod." + } + }, + { + "p": "När programmet återställs får en säkerhetskopia som återlästs utanför klustret de filer från /etc/pve/proxmenux som containern använder." + } + ] + }, + { + "id": "channel", + "title": "En rullande tag är inte en obevakad uppdatering", + "blocks": [ + { + "p": "Katalogen installerar den rullande tagg som underhållaren publicerar, men den faktiska digesten slås upp och sparas och ändras bara genom en uttrycklig uppdatering med förkontroller och återställning. ProxMenux Monitor jämför den installerade digesten med den som registret publicerar och visar och aviserar när en ny avbildning är tillgänglig." + } + ] + } + ] +} diff --git a/web/messages/sv/docs/oci-manager/monitor.json b/web/messages/sv/docs/oci-manager/monitor.json new file mode 100644 index 00000000..c1780c38 --- /dev/null +++ b/web/messages/sv/docs/oci-manager/monitor.json @@ -0,0 +1,213 @@ +{ + "meta": { + "title": "OCI-behållare i ProxMenux Monitor | ProxMenux", + "description": "Vad ProxMenux Monitor visar för en container installerad av OCI Manager Apps: applikations- och avbildningsversioner, nya avbildningar, konsolutdata och Proxmox VE-terminalen." + }, + "header": { + "title": "I ProxMenux Monitor", + "description": "En container installerad av OCI Manager Apps visas i VMs & LXCs som alla andra LXC. Dess modal läser installationsposten: applikations- och avbildningsversioner, nya avbildningar, konsolutdata och terminal.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Posten är källan", + "body": "OCI Manager Apps vet vad den installerade och var den kom ifrån. Monitorn läser det installationsrekordet istället för att prova containern, så data är detsamma om containern körs eller stoppas." + } + }, + { + "table": { + "headers": [ + "Flik", + "Vilka förändringar för en OCI container" + ], + "rows": [ + [ + "Status", + "En Watchdog-brytare under Start vid start: programmet startas igen när det stannar på egen hand." + ], + [ + "App", + "Programmet identifieras från posten och uppdateringar spåras av avbildning" + ], + [ + "Uppdateringar", + "Avbildningen uppdateras eller programmet ändras, med samma flöde som OCI-menyn" + ], + [ + "Monteringar", + "Container diskar och värd kataloger, med deras användning" + ], + [ + "Loggar", + "Endast för OCI-containrar: programmets konsolutdata" + ] + ] + } + } + ] + }, + { + "id": "app", + "title": "App", + "intro": "App-fliken erbjuder den installerade applikationen som en detektering, med namnet, logotypen, porten och schemat för posten. När den registreras öppnas redigeraren med metoden OCI-avbildning (installerad av ProxMenux) , som inte behöver någon konfiguration.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "boxes", + "title": "Program", + "body": "Versionen av applikationen i avbildningen, läs från själva avbildningen: dess miljö eller org.opencontainers.image.version-etiketten. Det är informativt." + }, + { + "icon": "archive", + "title": "Avbildning", + "body": "Byggdatum och digest för den installerade avbildningen. Uppdateringen avgörs här: installerad digest jämförs med den som registret publicerar för samma tagg i dag." + } + ] + } + }, + { + "list": { + "items": [ + "När registret publicerar en ny digest visar kortet Ny avbildning med datum och digest, även om programversionen inuti inte ändrats: en ombyggnad på en uppdaterad bas är en uppdatering.", + "När digestvärdena matchar visar kortet Version.", + "Kortet länkar till bildförvaret: dess GitHub-projekt, eller dess Docker Hub-sida för en officiell avbildning.", + "Tillgångslänken använder containerns LAN-adress, även för huvudmedlemmen i en multi-container-applikation, som har en andra adress på sitt privata nätverk.", + "Knappen Uppdatera data läser installationsposten och avbildningsregistret igen. Alternativen för att söka efter eller registrera andra program visas inte: containern innehåller exakt det program som anges i posten." + ] + } + }, + { + "figure": { + "src": "/oci-manager/monitor-app-tab.png", + "alt": "App-fliken för en OCI-behållare med applikationsversionen, avbildningen och förvaringslänken", + "caption": "App-fliken för en container installerad av OCI Manager Apps." + } + }, + { + "p": "Kontrollen körs en gång om dagen med uppdateringskontrollerna av Monitor, och Uppdatera data kör den omedelbart. En ny avbildning skickas som ett meddelande via de kanaler som konfigureras i Aviseringar. Uppdateringen tillämpas från fliken Uppdateringar." + } + ] + }, + { + "id": "updates", + "title": "Uppdateringar", + "intro": "För en container installerad av OCI Manager Apps visar fliken Uppdateringar programmet med sin installerade avbildning och när registret publicerar en, den nya avbildningen, i samma format som alla andra program. Paket- och programuppdaterarna för en vanlig LXC visas inte.", + "blocks": [ + { + "table": { + "headers": [ + "Knapp", + "Vad det öppnar" + ], + "rows": [ + [ + "Uppdatering", + "Uppdateringen från Hantera installerade OCI-program för denna container i Monitors terminal. Den kan köras med eller utan ny avbildning; utan en ny avbildning ändras ingenting. I ett program med flera containrar uppdateras alla medlemmar." + ], + [ + "Ändra", + "Redigeraren för programmet (resurser, nätverk, vägar och GPU). I en multi-container-applikation lägger den till eller tar bort de extra vägarna och enheterna i applikationsbehållaren och i Immich ändrar det som kör igenkänning." + ], + [ + "Återställ", + "Ersätter uppdatering när en operation på containern avbröts och öppnar sin återhämtning." + ], + [ + "Återställ (återställd container)", + "Visas för en container återställd från säkerhetskopia som saknar kontrakt på denna värd, under Återställt OCI-program. Öppnar återställningen i Monitors terminal; Uppdatera och Ändra visas när den har registrerats." + ] + ] + } + }, + { + "p": "Externa förändringar, värdkataloger och multi-container-applikationer hanteras som i OCI-menyn. I en multi-container-applikation visas knapparna och alternativen endast på huvudbehållaren; de andra medlemmarna visar sin avbildning, en anteckning om att de uppdateras från huvudbehållaren och en knapp som öppnar den. När terminalen stängs läses avbildningen, posten och monteringarna igen." + }, + { + "table": { + "headers": [ + "Alternativ", + "Beteende" + ], + "rows": [ + [ + "Behåll säkerhetskopian som tas före uppdateringen", + "Varje uppdatering backar upp containern för att återställa den om uppdateringen misslyckas. Med det här alternativet hålls samma säkerhetskopiering i den valda lagringen och visas bland säkerhetskopiorna i CT; på Proxmox Backup Server skrivs en säkerhetskopia före uppdateringen." + ], + [ + "Schemalagda uppdateringar", + "Avbildningen uppdateras vid vald tid bara om registret publicerar en ny, med möjlighet att vänta tills den är 1, 3, 7 eller 14 dagar gammal. En container med ändringar gjorda utanför ProxMenux hoppas över och rapporteras." + ] + ] + } + } + ] + }, + { + "id": "logs", + "title": "Loggar", + "intro": "Logs-fliken visas bara för containrar installerade av OCI manager Apps, mellan Monteringar och Säkerhetskopior. Den visar standardutdata och standardfel från avbildningens huvudprocess, samma utdata som docker logs visar för en Docker-container.", + "blocks": [ + { + "list": { + "items": [ + "Utdata sparas på värden i /var/log/proxmenux/oci/VMID.console.log (läge 0600), från första starten och över omstarter, så att de kan läsas när containern är stoppad.", + "Filen roteras på 10 MB och håller tre komprimerade kopior (/etc/logrotate.d/proxmenux-oci).", + "Varje start av containern är markerad i utgången. Fliken visar utgången sedan den sista starten som standard; Full historia visar också de tidigare.", + "När programmet tas bort tas även dess utdata bort.", + "De senaste 100, 500 eller 1000 raderna visas. När containern körs följs nya rader i realtid; om du rullar upp pausas följningen och Följ återupptar den.", + "Ett filter visar endast linjer som innehåller en text, och Ladda ner sparar linjerna laddade.", + "Färgkoder tas bort och en rad som ritas om av en förloppsindikator visas i sitt slutliga tillstånd.", + "Fliken läser filen varje gång den öppnas; den mellanlagras inte." + ] + } + }, + { + "calloutInfo": { + "title": "Inloggningsuppgifter vid första starten", + "body": "Avbildningar som skriver ut ett genererat lösenord på sin första start lämnar det i denna utgång, som docker logs gör. Installatören läser den därifrån för att visa den i sin sammanfattning." + } + }, + { + "figure": { + "src": "/oci-manager/monitor-logs-tab.png", + "alt": "Logs-fliken med konsolutgången av en OCI-behållare, linjeväljaren, filtret och följknappen", + "caption": "Konsolutgång av en OCI-behållare." + } + } + ] + }, + { + "id": "terminal", + "title": "Proxmox VE konsol", + "blocks": [ + { + "p": "En OCI-bild kör sin egen process som PID 1 och ingen inloggningstjänst, så standardkonsolen för en LXC skulle öppna en terminal där inget svarar. Containers installerade av OCI Manager Apps skapas med cmode: shell: Proxmox VE-konsolen öppnar ett skal med lxc-attach, motsvarande docker exec, med den löpande applikationen orörd." + }, + { + "list": { + "items": [ + "Skalet är det som /etc/passwd anger för root i avbildningen. Om root saknar skal eller avbildningen inte innehåller något behålls standardkonsolen.", + "Skalet körs som root i containern, utan ett lösenord. Vem kan öppna det beslutas av VM.Console tillstånd av Proxmox VE.", + "Monitorns terminal går in i containern med pct enter, som fungerar på samma sätt." + ] + } + } + ] + }, + { + "id": "mounts", + "title": "Monteringar", + "blocks": [ + { + "p": "Monteringar-fliken listar containerns diskar och värdkataloger. Användningen av en containerdisk på blocklagring som LVM-thin läses från diskens filsystem, som bara är monterat inuti containern." + } + ] + } + ] +} diff --git a/web/messages/sv/docs/oci-manager/stacks.json b/web/messages/sv/docs/oci-manager/stacks.json new file mode 100644 index 00000000..b50eadde --- /dev/null +++ b/web/messages/sv/docs/oci-manager/stacks.json @@ -0,0 +1,404 @@ +{ + "meta": { + "title": "Multi-container applikationer | ProxMenux", + "description": "Hur OCI Manager Apps förvandlar en applikation med sin databas och cache till samordnade inbyggda LXC:er: plan, privat nätverk, beroendehook, validering och transaktionsuppdateringar." + }, + "header": { + "title": "Program med flera containrar", + "description": "En applikation med sin databas, cache och andra tjänster blir flera samordnade inbyggda LXC:er, installerade och uppdaterade som en.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "En applikation för användaren, flera LXCs för Proxmox VE", + "body": "En multi-container definition är en post av katalogen. Installationsprogrammet skapar en inbyggd LXC per tjänst och håller sina beroenden explicit. Immich, Nextcloud, Paperless-ngx och Tandoor installeras på detta sätt." + } + }, + { + "mermaid": { + "chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}
{{appNet}}\"]\n O --> D[\"{{db}}
{{private}}\"]\n O --> R[\"{{cache}}
{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A", + "labels": { + "plan": "Stackplan", + "app": "Programmets LXC", + "appNet": "LAN + privat", + "db": "PostgreSQL LXC", + "cache": "Valkey LXC", + "private": "privat" + } + } + } + ] + }, + { + "id": "plan", + "title": "1. Planen, innan någon container finns", + "blocks": [ + { + "p": "Inget LXC skapas medan Compose definitionen tolkas. En komplett plan kommer först, med varje medlem, avbildning, VMID, nätverk, väg, hemlighet, ordning och hälsokontroll. Om planen inte är konsekvent startar installationen inte." + }, + { + "table": { + "headers": [ + "Planelement", + "Innehåll", + "Kontrolleras innan du skapar något" + ], + "rows": [ + [ + "Medlemmar", + "Huvudapplikation, databas, cache, maskininlärning och andra beroenden", + "Unika VMID, kända roller och exakt en huvudmedlem" + ], + [ + "Avbilder", + "Rullande referens, arkitektur och fastställd digest för varje tjänst", + "Alla finns, stöder arkitekturen och klarar OCI-integritetskontrollen" + ], + [ + "Nätverk", + "Privat bro, subnet, en fast adress per tjänst och LAN-åtkomst för huvudmedlemmen", + "Ingen kollision med befintliga broar eller undernät och ingen upprepad adress" + ], + [ + "Persistens", + "Container diskar, värdkataloger, ägare och backup", + "Inga överlappande vägar, lagring tillgängliga och deklarerade behörigheter" + ], + [ + "Hemligheter", + "Databaslösenord, applikationsnycklar och inledande inloggningsuppgifter", + "Genereras en gång och ges endast till de medlemmar som använder dem" + ], + [ + "Livscykel", + "Startorder, stopporder och hälsokontroll per medlem", + "Huvudapplikationen börjar sist och stoppar först" + ] + ] + } + } + ] + }, + { + "id": "create", + "title": "2. Skapa en medlem i taget", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Reservera varje VMID", + "body": "Proxmox VE-inventeringen och instansregistret kontrolleras. En befintlig CT tas inte över och ett kontrakt som fortfarande tillhör en annan instans återanvänds inte." + }, + { + "title": "Förbered varje avbildning", + "body": "Alla avbildningar löses, laddas ner och verifieras innan den första containern skapas." + }, + { + "title": "Skapa varje rootfs", + "body": "Den officiella OCI-metadatan importeras och ProxMenux-instansidentiteten och medlemsrollen läggs till." + }, + { + "title": "Privat nätverk", + "body": "En bro och undernät skapas och varje medlem får sin fasta adress; endast huvudmedlemmen får också LAN-gränssnittet." + }, + { + "title": "Persistens", + "body": "Varje databas och konfiguration får sin egen containerdisk; endast data avsedda att delas använder värdkataloger." + }, + { + "title": "Miljö", + "body": "Interna slutpunkter, delade hemligheter och servicevariabler skrivs. Programmet når sina beroenden på deras reserverade privata adresser." + }, + { + "title": "Post", + "body": "Varje medlem registrerar sin inbyggda konfiguration, de rootfs-ändringar som uppdateringar måste återskapa och sin relation till stacken." + } + ] + } + } + ] + }, + { + "id": "checks", + "title": "3. Börja och kontrollera varje container", + "intro": "En skapad LXC betyder inte att tjänsten är redo. Beroendena startar i ordning och varje tjänst genomgår en egen kontroll.", + "blocks": [ + { + "table": { + "headers": [ + "Tjänst", + "Kontroll", + "Vad det visar" + ], + "rows": [ + [ + "PostgreSQL", + "pg_isready i CT med förväntad värd, användare och databas", + "Servern accepterar anslutningar för den konfigurerade databasen" + ], + [ + "Redis / Valkey", + "redis-cli eller valkey-cli PING mot sin privata adress", + "Brokern lyssnar och svarar" + ], + [ + "Immich maskininlärning", + "HTTP GET /ping, plus en kontroll av den valda GPU runtime", + "Tjänsten svarar och den begärda accelerationen har inte fallit tillbaka till CPU" + ], + [ + "Nextcloud", + "GET /status.php med installed=true, maintenance=false och needsDbUpgrade=false", + "Initieringen är klar utan väntande migrering" + ], + [ + "Paperless-ngx / Tandoor", + "HTTP på LAN-adressen och tjänstens faktiska port", + "Frontend och dess beroenden tillhandahåller programmet" + ], + [ + "Huvudapplikation", + "Slutpunkten för dess mall, till exempel /api/server/ping i Immich", + "Hela stacken fungerar genom programmet som använder beroenden" + ] + ] + } + }, + { + "calloutWarning": { + "title": "Körs betyder inte att allt fungerar", + "body": "Det löpande tillståndet säger bara att LXC-processen existerar. Där tjänsten erbjuder en bättre check, en exec eller HTTP check med en timeout används. Om en medlem slutar eller misslyckas med sin kontroll, deklareras inte stacken installerad." + } + } + ] + }, + { + "id": "hook", + "title": "4. Beroende hook", + "blocks": [ + { + "p": "Kroken är endast inställd på huvudbehållaren av en beroende stack. Proxmox VE håller manuset som en snippet och kör det som hookscript av den CT. Receptet är inte skrivet i manuset: det lever i ett separat privat kontrakt." + }, + { + "codeGrid": { + "items": [ + { + "title": "Huvud CT konfiguration", + "code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh" + }, + { + "title": "Privat kontrakt (exempel)", + "code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}" + } + ] + } + }, + { + "snippet": { + "summary": "Fullständig källa till proxmenux-stack-dependencies.sh", + "pathCode": "local:snippets/proxmenux-stack-dependencies.sh", + "snippetCode": "stackDependencyHook" + } + }, + { + "p": "Skriptet är detsamma för varje stack. VMID, namn, checktyper och timeouts kommer från det privata kontraktet /etc/pve/priv/proxmenux-stack-VMID.json av varje stack." + }, + { + "steps": { + "items": [ + { + "title": "Proxmox VE anropar pre-start", + "body": "Innan CT startar körs kroken med sin VMID och livscykelfasen." + }, + { + "title": "Ett lås per stack", + "body": "flock på /run/lock/proxmenux-stack-VMID.lock förhindrar två startsekvenser samtidigt." + }, + { + "title": "Kontraktet läses och valideras", + "body": "Ett känt schema, numeriska beroenden, etiketter, en exec, http eller kör kontroll och en positiv timeout krävs." + }, + { + "title": "Beroende i ordning", + "body": "Varje CT måste finnas; en stoppad startas och en som redan körs inte startas om." + }, + { + "title": "Vänta tills tjänsten är redo", + "body": "Kontrollen körs vartannat sekund, och CT bekräftas också vara igång." + }, + { + "title": "Huvud CT startar", + "body": "När alla beroenden är redo avslutas pre-start och Proxmox VE startar programmet." + } + ] + } + }, + { + "calloutInfo": { + "title": "Kroken stoppar inte beroenden", + "body": "Faserna post-start, pre-stop och post-stop gör ingenting. Om huvud-CT:n stoppas fortsätter PostgreSQL, Redis, Valkey eller maskininlärningen att köras. Hooken ordnar starten; den gör inte flera LXC:er till en process." + } + }, + { + "table": { + "headers": [ + "Typ", + "Exempel", + "Senare starter" + ], + "rows": [ + [ + "Beroende stack", + "Immich, Nextcloud, applikation med PostgreSQL", + "Huvud-CT:ns hook startar beroendena och väntar på dem" + ], + [ + "Applikationssvit", + "Arr-programsviten", + "Ingen huvudmedlem: varje LXC följer sin egen onboot" + ], + [ + "Enskilt program", + "Jellyfin", + "Proxmox VE startar den LXC:n direkt" + ] + ] + } + } + ] + }, + { + "id": "stack-checks", + "title": "5. Kontroller på stacken som helhet", + "blocks": [ + { + "list": { + "items": [ + "Varje VMID finns, är unik och håller den förväntade instansidentiteten.", + "Varje kontrakt tillhör samma stack och behåller sin roll och registrerade inbyggda konfiguration.", + "Huvudmedlemmen är senast i start_order och först i stop_order.", + "Ingen medlem, volym eller rootfs anpassning saknas.", + "Kroken pekar på den officiella snippet, dess innehåll är oförändrat och dess kontrakt matchar stack receptet.", + "De observerade avbildningarna och digestvärdena matchar de förberedda OCI-arkiven.", + "Enheter, GPU-profiler, monteringar, hemligheter och ändpunkter matchar fortfarande kontrakten.", + "När alla beroenden har klarat kontrollerna verifierar huvudprogrammets ändpunkt integrationen mellan medlemmarna." + ] + } + } + ] + }, + { + "id": "manage", + "title": "Hantera en installerad stack", + "intro": "Under Hantera installerade OCI-program leder varje medlem till hela stacken. Menyn erbjuder Uppdatera alla programmets containrar, Ändra extra sökvägar och enheter, Återskapa alla containrar med sparad konfiguration och Ta bort: radera programmet och dess containrar. Återskapa bygger om varje container från dess ursprungliga avbildning med sparad digest, utan att leta efter en nyare. Samma steg som vid en uppdatering används; alternativet erbjuds för stackar som kan uppdateras.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Alla medlemmar", + "body": "Medlemmens kontrakt anger huvud-VMID och den fullständiga listan över medlemmar." + }, + { + "title": "Stacken är reproducerbar", + "body": "Identiteter, kontrakt, krok, anpassningar och en samordnad replay för det receptet valideras." + }, + { + "title": "Avbildningar först", + "body": "Programmet stoppas inte förrän varje digest har fastställts, hämtats och verifierats." + }, + { + "title": "Stoppa och backa upp setet", + "body": "Verifierade inbyggda säkerhetskopior tas när stacken är stoppad, så att program och databaser motsvarar samma tidpunkt." + }, + { + "title": "Uppdatera och kontrollera varje medlem", + "body": "Anpassning, nätverk, fästen, hemligheter och enheter appliceras igen innan hälsokontrollen av varje medlem." + }, + { + "title": "Publicera eller återställa allt", + "body": "De nya kontrakten publiceras endast när varje medlem passerar. Om man misslyckas återställs varje medlem." + } + ] + } + }, + { + "table": { + "headers": [ + "Ändra", + "Vilka förändringar", + "Vad som behålls" + ], + "rows": [ + [ + "Extra sökvägar och enheter", + "De läggs till eller tas bort från applikationsbehållaren, som startar om. Ingenting byggs om", + "Uppgifterna för programmet, dess databas och andra containrar" + ], + [ + "Vad som kör igenkänningen (Immich)", + "Maskininlärningsbehållaren tar avbildningen och enheterna i CPU eller en GPU av värden. Hela programmet stoppas och uppdateras, som i en uppdatering", + "Modellcachen, biblioteket och databasen. Om något misslyckas, återställs tidigare containrar och tidigare val" + ] + ] + } + }, + { + "calloutWarning": { + "title": "En stack utan samordnad replay uppdateras inte", + "body": "Om beredningen av en stack inte kan reproduceras vägras uppdateringen innan stacken stoppas. Applikationen fortsätter att fungera som det är." + } + } + ] + }, + { + "id": "failure", + "title": "6. När något misslyckas", + "blocks": [ + { + "p": "Under en installation stannar ett fel och tar bort de ofullständiga containrarna som skapats och den privata broen om operationen skapade den. En stack publiceras inte som giltig tills hela sekvensen avslutas." + }, + { + "p": "En uppdatering är transaktionell: alla avbildningar är förberedda först, sedan stacken stannar, varje medlem backas upp och backup verifieras, och först då är varje rootfs ersatt. Medlemmar startar en efter en med sin hälsokontroll; om man misslyckas återställs varje medlem från samma uppsättning säkerhetskopior, så databasen och programmet hör aldrig till olika ögonblick." + }, + { + "mermaid": { + "chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]", + "labels": { + "prepare": "Förbered varje avbildning", + "stop": "Sluta, huvudmedlem först", + "backup": "Verifierad säkerhetskopia av varje CT", + "replace": "Ersätt rootfs", + "healthy": "Fungerar alla?", + "yes": "Ja", + "no": "Nej", + "commit": "Publicera avtal", + "rollback": "Återställ varje medlem" + } + } + } + ] + }, + { + "id": "not-assumed", + "title": "Vad en stack inte inkluderar", + "blocks": [ + { + "list": { + "items": [ + "En svit installerad i ett flöde, till exempel Arr-sviten, är inte en beroende stack: dess containrar har ingen startordning mellan dem.", + "Det privata nätverket ersätter inte autentisering, TLS eller konfigurationen av varje applikation.", + "Säkerhetskopieringen av en LXC innehåller inte bron, kroken eller kontrakten i resten av stacken.", + "Prowlarr, Sonarr eller Radarr får inga indexerare, profiler eller leverantörer från ProxMenux." + ] + } + } + ] + } + ] +} diff --git a/web/messages/sv/docs/oci-manager/storage-network.json b/web/messages/sv/docs/oci-manager/storage-network.json new file mode 100644 index 00000000..db121e93 --- /dev/null +++ b/web/messages/sv/docs/oci-manager/storage-network.json @@ -0,0 +1,305 @@ +{ + "meta": { + "title": "Data, sökvägar och nätverk | ProxMenux", + "description": "Så bevarar OCI manager Apps data i en OCI-container: containerdiskar, kataloger på värden, rclone-monteringar, adresser och privata nätverk." + }, + "header": { + "title": "Data, sökvägar och nätverk", + "description": "Vad som finns i rootfs, vad som bevaras när det ersätts, hur data delas mellan containrar och hur varje container får sin adress.", + "section": "OCI manager Apps" + }, + "sections": [ + { + "id": "intro", + "blocks": [ + { + "calloutInfo": { + "title": "Beständig lagring bestäms innan LXC-containern skapas", + "body": "Volymerna som deklareras av avbildningen och dess Compose-fil läses innan containern skapas. Varje sökväg som måste bevaras vid en uppdatering blir en monteringspunkt som är oberoende av rootfs. Därmed innehåller rootfs bara det som tillhör avbildningen och kan ersättas." + } + } + ] + }, + { + "id": "questions", + "title": "Vad installationsguiden frågar efter", + "intro": "Mallen anger de sökvägar som programmet behöver. Var och en placeras på en containerdisk eller i en katalog på värden. Fler sökvägar kan läggas till före sammanfattningen.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Nödvändiga sökvägar", + "body": "/config, /data, bibliotek, hämtningar och alla volymer som programmet deklarerar listas." + }, + { + "title": "Plats", + "body": "Varje sökväg placeras på en containerdisk eller i en befintlig katalog på värden." + }, + { + "title": "Lagring och storlek", + "body": "En containerdisk skapas på en Proxmox VE-lagring med den angivna storleken. Standardinstallationen använder local-lvm. Den avancerade installationen frågar efter lagring för varje sökväg strax före storleken och föreslår lagringen för rootfs. Disken visas som vm-VMID-disk-N och ansluts som mpN." + }, + { + "title": "Katalog på värden", + "body": "Katalogen på värden anges med sin sökväg. Om den inte finns skapas den med den värdanvändare som containeranvändaren mappas till som ägare." + }, + { + "title": "Ytterligare sökvägar", + "body": "Före installationen kan fler kopplingar läggas till mellan en sökväg eller volym på värden och en sökväg i containern." + }, + { + "title": "Sammanfattning", + "body": "Hela sökvägsmappningen visas innan CT:n skapas och sparas i instanskontraktet." + } + ] + } + } + ] + }, + { + "id": "options", + "title": "De två platserna för beständig lagring", + "blocks": [ + { + "table": { + "headers": [ + "Egenskap", + "Containerdisk", + "Katalog på värden" + ], + "rows": [ + [ + "I konfigurationen", + "mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G", + "mpN: /mnt/oci-shared/media,mp=/data/media" + ], + [ + "Containerns säkerhetskopia (vzdump)", + "Ingår med backup=1", + "Ingår inte" + ], + [ + "Storlek", + "Fast; kan utökas genom att ändra monteringspunktens storlek", + "Det lediga utrymmet i värdens filsystem eller dataset" + ], + [ + "Andra containrar", + "Monteras bara av den container som den tillhör", + "Samma katalog kan monteras i flera containrar" + ], + [ + "Ögonblicksbilder och återställning", + "Hanteras av Proxmox VE tillsammans med CT:n", + "Hanteras på värdens lagring" + ], + [ + "När programmet tas bort", + "Tas bort med containern", + "Bevaras med sitt innehåll" + ], + [ + "När CT:n flyttas till en annan nod", + "Flyttas med CT:n", + "Samma sökväg måste finnas på den andra noden" + ] + ] + } + }, + { + "p": "Rootfs är reserverat för binärfilerna och avbildningens innehåll. En uppdatering eller ett återskapande ersätter det utan att röra någon av de två typerna av monteringspunkt." + } + ] + }, + { + "id": "example", + "title": "Exempel: en container med båda platserna", + "blocks": [ + { + "code": { + "title": "Jellyfin installerat som CT 151 på local-lvm (utdrag)", + "code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media" + } + }, + { + "p": "En uppdatering eller ett återskapande ersätter bara rootfs: mp0 bevarar användare, bibliotek och inställningar, och mp1 visar fortfarande samma medier. När CT:ns säkerhetskopia återställs kommer /config tillbaka. Mediekatalogen återställs vid behov från säkerhetskopian av värdens lagring." + }, + { + "flow": { + "nodes": [ + { + "label": "Kontrakt", + "detail": "/config" + }, + { + "label": "Plats", + "detail": "Containerdisk\neller katalog på värden" + }, + { + "label": "LXC", + "detail": "Alltid /config\nför programmet" + } + ], + "caption": "Programmet ser sökvägen som avbildningen anger. Bara lagringsplatsen ändras." + } + } + ] + }, + { + "id": "shared", + "title": "En katalog på värden, flera containrar", + "blocks": [ + { + "mermaid": { + "chartCode": "flowchart TB\n H[\"{{host}}
/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent
/data\"]\n H --> J[\"Jellyfin
/data\"]\n H --> R[\"Radarr / Sonarr
/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]", + "labels": { + "host": "Katalog på värden", + "config": "Egen konfiguration" + } + } + }, + { + "p": "Varje container sparar sin konfiguration på sin egen disk. Biblioteket eller hämtningarna ligger i en enda katalog på värden som monteras på samma interna sökväg i alla containrar. Därmed är sökvägen som ett program skriver till samma sökväg som ett annat läser från." + } + ] + }, + { + "id": "rclone", + "title": "Molnlagring via programmet rclone", + "intro": "Utöver installation erbjuder rclone-posten i katalogen Aktivera en montering i en befintlig OCI-container med rclone. En fjärrlagring som redan skapats och auktoriserats i rclones webbgränssnitt monteras och görs tillgänglig på värden. Andra containrar kan använda den som en katalog på värden.", + "blocks": [ + { + "steps": { + "items": [ + { + "title": "Container och fjärrlagring", + "body": "VMID för rclone-containern, fjärrlagringens exakta namn och, valfritt, en sökväg i den." + }, + { + "title": "Monteringens namn och cache", + "body": "Monteringens namn och VFS-cacheläget: off, minimal, writes eller full (standard)." + }, + { + "title": "Tillgängliga vyer", + "body": "En gemensam rot, som standard /mnt/oci-shared, innehåller en läs- och skrivbar vy i /mnt/oci-shared/remotes/NAME och en skrivskyddad vy i /mnt/oci-shared/remotes-ro/NAME." + }, + { + "title": "Aktivering", + "body": "Efter bekräftelsen stoppas CT:n, dess startkommando och ett Proxmox VE-hookscript konfigureras, och den startas igen. Åtgärden väntar tills båda vyerna är monterade på värden." + } + ] + } + }, + { + "calloutInfo": { + "title": "Om monteringen inte aktiveras", + "body": "Containerns tidigare konfiguration återställs och containern startas igen. En misslyckad aktivering lämnar därmed rclone som det var." + } + } + ] + }, + { + "id": "network", + "title": "Adresser och nätverk", + "intro": "Ett program med en enda container behöver en adress. Ett program med flera containrar behöver också ett stabilt nätverk mellan sina delar.", + "blocks": [ + { + "cards": { + "items": [ + { + "icon": "network", + "title": "Program med en container", + "body": "En nätverksbrygga väljs tillsammans med DHCP eller en fast adress i CIDR-format. LXC-containern har en egen adress och sammanfattningen visar tjänsternas fullständiga URL:er." + }, + { + "icon": "waypoints", + "title": "Program med flera containrar", + "body": "Ett ledigt subnät hittas och en beständig privat brygga skapas. Varje del – program, databas och cache – får en fast adress på nätverket." + } + ] + } + }, + { + "flow": { + "nodes": [ + { + "label": "LAN", + "detail": "Nåbar adress\nbara huvudtjänsten" + }, + { + "label": "Huvud-LXC", + "detail": "Webb / API\nLAN + privat nätverk" + }, + { + "label": "Privat nätverk", + "detail": "PostgreSQL · Valkey · ML\nfasta adresser" + } + ], + "caption": "Beroenden kommunicerar över det privata nätverket och har ingen adress på LAN:et." + } + }, + { + "p": "Stackkontraktet sparar brygga, subnät, adresser och relationerna mellan tjänsterna. När programmet uppdateras återanvänds samma topologi för alla delar. ProxMenux Monitor öppnar huvudcontainern på dess LAN-adress, inte dess adress på det privata nätverket." + } + ] + }, + { + "id": "ownership", + "title": "Ägarskap för filer och kataloger", + "blocks": [ + { + "list": { + "items": [ + "Nya kataloger skapas med de UID och GID som den oprivilegierade LXC-containern mappas till.", + "Ägarskapet för befintliga kataloger ändras inte rekursivt.", + "Socklar, systemfiler och känsliga sökvägar erbjuds inte som vanliga kataloger på värden." + ] + } + } + ] + }, + { + "id": "backup", + "title": "Vad en säkerhetskopia av containern innehåller", + "blocks": [ + { + "table": { + "headers": [ + "Del", + "I CT:ns vzdump-säkerhetskopia", + "Var det sparas" + ], + "rows": [ + [ + "OCI-rootfs", + "Ja", + "I CT:ns säkerhetskopia; kan också återskapas från avbildningen och kontraktet" + ], + [ + "Containerdisk med backup=1", + "Ja", + "CT:ns säkerhetskopia" + ], + [ + "Katalog på värden", + "Nej", + "Säkerhetskopian av värdens lagring" + ], + [ + "Instanskontrakt", + "Ja, kopian som finns i CT:n", + "/.proxmenux/oci-record.json i CT:n; ytterligare kopior på värden och i klustret sparas separat" + ], + [ + "Program med flera containrar", + "Varje del i sin egen säkerhetskopia", + "Säkerhetskopiorna av alla delar samt stackkontraktet och dess nätverksbrygga på värden" + ] + ] + } + } + ] + } + ] +} From f36b5e22a8cbb265b6291e54a48c1c8855b01e4e Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:08:53 +0200 Subject: [PATCH 16/73] docs: review project information in all seven translations --- .../tests/test_documentation_markdown.py | 16 + .github/workflows/test-i18n.yml | 10 + .../docs/about/code-of-conduct/page.tsx | 18 +- .../de/docs/about/code-of-conduct.json | 13 + web/messages/de/docs/about/contributing.json | 293 ++++++++++++++++++ web/messages/de/docs/about/contributors.json | 38 +++ web/messages/de/docs/about/faq.json | 94 ++++++ web/messages/de/docs/about/index.json | 67 ++++ .../en/docs/about/code-of-conduct.json | 3 +- web/messages/en/docs/about/faq.json | 12 +- .../es/docs/about/code-of-conduct.json | 7 +- web/messages/es/docs/about/contributing.json | 6 +- web/messages/es/docs/about/contributors.json | 18 +- web/messages/es/docs/about/faq.json | 28 +- web/messages/es/docs/about/index.json | 8 +- .../fr/docs/about/code-of-conduct.json | 13 + web/messages/fr/docs/about/contributing.json | 293 ++++++++++++++++++ web/messages/fr/docs/about/contributors.json | 38 +++ web/messages/fr/docs/about/faq.json | 94 ++++++ web/messages/fr/docs/about/index.json | 67 ++++ .../it/docs/about/code-of-conduct.json | 13 + web/messages/it/docs/about/contributing.json | 293 ++++++++++++++++++ web/messages/it/docs/about/contributors.json | 38 +++ web/messages/it/docs/about/faq.json | 94 ++++++ web/messages/it/docs/about/index.json | 67 ++++ .../pt/docs/about/code-of-conduct.json | 13 + web/messages/pt/docs/about/contributing.json | 293 ++++++++++++++++++ web/messages/pt/docs/about/contributors.json | 38 +++ web/messages/pt/docs/about/faq.json | 94 ++++++ web/messages/pt/docs/about/index.json | 67 ++++ .../sk/docs/about/code-of-conduct.json | 13 + web/messages/sk/docs/about/contributing.json | 293 ++++++++++++++++++ web/messages/sk/docs/about/contributors.json | 38 +++ web/messages/sk/docs/about/faq.json | 94 ++++++ web/messages/sk/docs/about/index.json | 67 ++++ .../sv/docs/about/code-of-conduct.json | 13 + web/messages/sv/docs/about/contributing.json | 293 ++++++++++++++++++ web/messages/sv/docs/about/contributors.json | 38 +++ web/messages/sv/docs/about/faq.json | 94 ++++++ web/messages/sv/docs/about/index.json | 67 ++++ 40 files changed, 3111 insertions(+), 45 deletions(-) create mode 100644 .github/scripts/tests/test_documentation_markdown.py create mode 100644 web/messages/de/docs/about/code-of-conduct.json create mode 100644 web/messages/de/docs/about/contributing.json create mode 100644 web/messages/de/docs/about/contributors.json create mode 100644 web/messages/de/docs/about/faq.json create mode 100644 web/messages/de/docs/about/index.json create mode 100644 web/messages/fr/docs/about/code-of-conduct.json create mode 100644 web/messages/fr/docs/about/contributing.json create mode 100644 web/messages/fr/docs/about/contributors.json create mode 100644 web/messages/fr/docs/about/faq.json create mode 100644 web/messages/fr/docs/about/index.json create mode 100644 web/messages/it/docs/about/code-of-conduct.json create mode 100644 web/messages/it/docs/about/contributing.json create mode 100644 web/messages/it/docs/about/contributors.json create mode 100644 web/messages/it/docs/about/faq.json create mode 100644 web/messages/it/docs/about/index.json create mode 100644 web/messages/pt/docs/about/code-of-conduct.json create mode 100644 web/messages/pt/docs/about/contributing.json create mode 100644 web/messages/pt/docs/about/contributors.json create mode 100644 web/messages/pt/docs/about/faq.json create mode 100644 web/messages/pt/docs/about/index.json create mode 100644 web/messages/sk/docs/about/code-of-conduct.json create mode 100644 web/messages/sk/docs/about/contributing.json create mode 100644 web/messages/sk/docs/about/contributors.json create mode 100644 web/messages/sk/docs/about/faq.json create mode 100644 web/messages/sk/docs/about/index.json create mode 100644 web/messages/sv/docs/about/code-of-conduct.json create mode 100644 web/messages/sv/docs/about/contributing.json create mode 100644 web/messages/sv/docs/about/contributors.json create mode 100644 web/messages/sv/docs/about/faq.json create mode 100644 web/messages/sv/docs/about/index.json diff --git a/.github/scripts/tests/test_documentation_markdown.py b/.github/scripts/tests/test_documentation_markdown.py new file mode 100644 index 00000000..98255351 --- /dev/null +++ b/.github/scripts/tests/test_documentation_markdown.py @@ -0,0 +1,16 @@ +"""Keep the canonical conduct policy and its English website source in sync.""" +import json +from pathlib import Path +import unittest + +ROOT = Path(__file__).resolve().parents[3] + + +class DocumentationMarkdownTests(unittest.TestCase): + def test_english_conduct_body_matches_canonical_policy(self): + source = json.loads((ROOT / 'web/messages/en/docs/about/code-of-conduct.json').read_text(encoding='utf-8')) + self.assertEqual(source['contentMarkdown'], (ROOT / 'CODE_OF_CONDUCT.md').read_text(encoding='utf-8')) + + +if __name__ == '__main__': + unittest.main() diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 2b3e4685..7f4dfb51 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -9,15 +9,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' push: branches: [main, develop] paths: @@ -27,15 +32,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' workflow_dispatch: permissions: diff --git a/web/app/[locale]/docs/about/code-of-conduct/page.tsx b/web/app/[locale]/docs/about/code-of-conduct/page.tsx index de18716b..53365824 100644 --- a/web/app/[locale]/docs/about/code-of-conduct/page.tsx +++ b/web/app/[locale]/docs/about/code-of-conduct/page.tsx @@ -24,23 +24,27 @@ export async function generateMetadata({ params }: { params: Promise<{ locale: s } } -async function getCodeOfConductContent(notFoundMsg: string, loadFailedMsg: string) { +async function getCodeOfConductContent(notFoundMsg: string, loadFailedMsg: string, translatedMarkdown?: string) { try { const codeOfConductPath = path.join(process.cwd(), "..", "CODE_OF_CONDUCT.md") - if (!fs.existsSync(codeOfConductPath)) { + if (!translatedMarkdown && !fs.existsSync(codeOfConductPath)) { console.error("CODE_OF_CONDUCT.md file not found.") return `

${notFoundMsg}

` } - const fileContents = fs.readFileSync(codeOfConductPath, "utf8") + const fileContents = translatedMarkdown || fs.readFileSync(codeOfConductPath, "utf8") const result = await remark() .use(gfm.default || gfm) .use(html) .process(fileContents) - return result.toString() + // Repository-relative policy links otherwise resolve under the docs URL. + return result.toString().replaceAll( + 'href="./SECURITY.md"', + 'href="https://github.com/MacRimi/ProxMenux/blob/main/SECURITY.md"', + ) } catch (error) { console.error("Error reading the CODE_OF_CONDUCT.md file", error) return `

${loadFailedMsg}

` @@ -71,7 +75,11 @@ export default async function CodeOfConductPage({ params }: { params: Promise<{ const { locale } = await params setRequestLocale(locale) const t = await getTranslations({ locale, namespace: "docs.about.codeOfConduct" }) - const codeOfConductContent = await getCodeOfConductContent(t("errors.notFound"), t("errors.loadFailed")) + const translatedMarkdown = t.has("contentMarkdown") ? t.raw("contentMarkdown") : undefined + const codeOfConductContent = await getCodeOfConductContent( + t("errors.notFound"), t("errors.loadFailed"), + typeof translatedMarkdown === "string" ? translatedMarkdown : undefined, + ) const cleanedInlineCode = cleanInlineCode(codeOfConductContent) const parsedContent = wrapCodeBlocksWithCopyable(cleanedInlineCode) diff --git a/web/messages/de/docs/about/code-of-conduct.json b/web/messages/de/docs/about/code-of-conduct.json new file mode 100644 index 00000000..4e79d0fe --- /dev/null +++ b/web/messages/de/docs/about/code-of-conduct.json @@ -0,0 +1,13 @@ +{ + "meta": { + "title": "Verhaltenskodex | ProxMenux-Dokumentation", + "description": "ProxMenux Verhaltenskodex und Best Practices für Mitwirkende, Tester und Nutzer.", + "ogTitle": "Verhaltenskodex | ProxMenux-Dokumentation", + "ogDescription": "Erwartungen an die Verantwortung für eingereichten Code, die Meldung von Sicherheitslücken und den Umfang von Pull Requests im ProxMenux-Projekt." + }, + "errors": { + "notFound": "Fehler: Die Datei CODE_OF_CONDUCT.md wurde nicht gefunden.", + "loadFailed": "Fehler: Der Inhalt des Verhaltenskodex kann nicht geladen werden." + }, + "contentMarkdown": "# 📝 Verhaltenskodex und bewährte Vorgehensweisen\n\nDieses Dokument legt die **Grundsätze und Richtlinien** für die Nutzung von **ProxMenux** fest. Es soll **Respekt, Zusammenarbeit und Sicherheit** bei der Entwicklung fördern.\n\n## 📌 1. Urheberangaben und Anerkennung\n\n- Werden **Skripte, Codeausschnitte oder Ideen** anderer Repositorys oder Entwickler verwendet, wird der ursprüngliche Urheber immer genannt.\n- Ein Kommentar im Code oder in der Dokumentation nennt die Quelle und verlinkt möglichst auf das ursprüngliche Repository.\n- Bei Code mit einer bestimmten **Lizenz** müssen deren Bedingungen eingehalten werden.\n\n### ✅ Beispiel für eine korrekte Quellenangabe im Code:\n\n```bash\n# Skript auf Grundlage der Arbeit von [Autor] unter [Repository-Link]\n```\n\n## 🔒 2. Sicherheit und Verantwortung für den Code\n\n- Der gesamte Code in diesem Repository folgt bewährten Vorgehensweisen für sichere Entwicklung.\n- Beiträge mit absichtlich eingebauten Schwachstellen oder unsicheren Vorgehensweisen sind nicht erlaubt.\n- Skripte dürfen niemals die Systemsicherheit oder Benutzerdaten gefährden.\n- Beiträge sollen vor der Implementierung auf Sicherheit und Stabilität geprüft werden.\n\n### ⚠️ Verantwortungsvolle Meldung von Sicherheitslücken\n\nEntdecken Sie eine Sicherheitslücke, melden Sie diese NICHT in öffentlichen Issues oder Foren.\n\nMelden Sie sie stattdessen vertraulich per E-Mail:\n\n📧 proxmenux@macrimi.pro\n\nWeitere Informationen zu Sicherheitslücken und deren Meldung finden Sie in unserer [Sicherheitsrichtlinie](./SECURITY.md).\n\n## 🤝 3. Regeln für die Community\n\nFür ein respektvolles und professionelles Umfeld müssen alle Benutzer diese Regeln beachten:\n\n- ✅ Bleiben Sie in Diskussionen respektvoll und konstruktiv.\n- ❌ Belästigung, Hassrede und beleidigendes Verhalten werden nicht toleriert.\n- ✅ Geben Sie Rückmeldungen sachlich und ohne persönliche Angriffe.\n- ❌ Verstöße können je nach Schwere zu Verwarnungen oder Ausschlüssen führen.\n\n##\n\nDieses Dokument fördert den ethischen Umgang mit Code, Sicherheitsbewusstsein und eine respektvolle Community.\n\n📢 Lassen Sie uns gemeinsam etwas Großartiges schaffen!\n" +} diff --git a/web/messages/de/docs/about/contributing.json b/web/messages/de/docs/about/contributing.json new file mode 100644 index 00000000..7827e51f --- /dev/null +++ b/web/messages/de/docs/about/contributing.json @@ -0,0 +1,293 @@ +{ + "meta": { + "title": "Zu ProxMenux beitragen | ProxMenux-Dokumentation", + "description": "Zu ProxMenux beitragen: Branch-Modell (main / develop / feature/*), Pull-Request-Ablauf, Skript-Header mit Autorenangabe und optionalem Sponsoring-Link, zweiphasige UI-Richtlinie, Nachrichtenfunktionen und der Weg vom Feature-Branch zur stabilen Version.", + "ogTitle": "Zu ProxMenux beitragen", + "ogDescription": "Branch-Modell, Arbeitsablauf, Autorenangabe im Skript-Header und zweiphasige UI-Richtlinie für Mitwirkende." + }, + "header": { + "title": "Zu ProxMenux beitragen", + "description": "ProxMenux ist offen für Community-Beiträge - neue Skripte, Fixes für bestehende, Dialogverbesserungen, Übersetzungen, Integrationen. Diese Seite ist die formale Tür: wie das Repository strukturiert ist, das Verzweigungsmodell und der Pull-Request-Workflow, der Skript-Header mit Autorzuweisung und optionalem Sponsor-Link und die Design-Konventionen, denen jeder Beitrag folgen muss.", + "section": "Über" + }, + "twoPagesCallout": { + "title": "Zwei verwandte Seiten, ein Projekt", + "body": "Verwechseln Sie diese Seite nicht mit Mitwirkende, die bisherige Beiträge von Testern, Reviewern und Entwicklern würdigt. Diese Seite richtet sich an Sie als künftigen Mitwirkenden und erklärt, wie Sie einen Pull Request zur Aufnahme vorbereiten." + }, + "branching": { + "heading": "Verzweigungsmodell", + "intro": "ProxMenux verwendet ein dreistufiges Verzweigungsmodell:", + "headerBranch": "Branch", + "headerPurpose": "Zweck", + "rows": [ + { + "branch": "main", + "purposeRich": "Stabiler, produktionsreifer Code. Hier werden nur veröffentlichungsreife Änderungen aufgenommen. Diese Version erhalten Endnutzer bei einer normalen ProxMenux-Installation." + }, + { + "branch": "develop", + "purposeRich": "Aktiver Entwicklungsbranch. Neue Arbeiten werden zuerst hier aufgenommen; dies ist der Beta-Kanal. Ist eine stabile Version bereit, wird sie von hier nach main übernommen." + }, + { + "branch": "feature/*", + "purposeRich": "Kurzlebige Branchs pro Feature, Fix oder Verbesserung. Erstellt aus develop, nach Überprüfung über einen Pull Request wieder in develop zusammengeführt." + } + ], + "calloutTitle": "Was das für die Nutzer bedeutet", + "calloutBody": "Endbenutzer, die main verfolgen, erhalten getestete Releases. Benutzer, die die neuesten Funktionen frühzeitig wünschen - und gelegentliche raue Kanten nicht stören - können develop folgen. Neue Funktionen passieren immer zuerst develop; nichts erreicht main, ohne diesen Zyklus zu durchlaufen." + }, + "workflow": { + "heading": "Pull Request Workflow", + "intro": "Von der Idee zum fusionierten Release in fünf Schritten:", + "step1Lead": "Erstellen Sie einen Feature Branch aus develop:", + "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": "Verwenden Sie einen beschreibenden Zweignamen: feature/zfs-arc-tuning, feature/fix-iommu-detection, feature/add-tailscale-script.", + "step2Lead": "Arbeiten Sie an Ihren Änderungen und schieben Sie den Branch: ", + "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": "Öffnen Sie einen Pull Request für develop, nicht für main. Prüfen Sie auf GitHub, dass der Basisbranch auf develop steht. Beschreiben Sie, was das Skript tut und ändert und auf welchen Proxmox-VE-Versionen es getestet wurde.", + "step4": "Nach der Prüfung werden Änderungen in develop zusammengeführt. Ein Maintainer prüft Codequalität, Header-Konventionen und die zweiphasige UI-Richtlinie. Falls Änderungen nötig sind, pushen Sie weitere Commits in denselben Branch; der PR aktualisiert sich automatisch.", + "step5": "Stabile Versionen werden von develop nach main übernommen. Bei der Veröffentlichung wird main per Fast-Forward auf develop gebracht und mit einem Tag versehen. Ihr Beitrag wird Teil der nächsten stabilen Version." + }, + "scriptHeader": { + "heading": "Skript-Header — Metadaten und Beschreibung", + "intro": "Jedes Skript in ProxMenux wird mit zwei benachbarten Kommentarblöcken geöffnet, die zusammen den Header bilden. Sie sind beide erforderlich - zusammen lassen sie jeden Leser wissen, wer das Skript geschrieben hat und was es tut, alles ohne den Code selbst zu öffnen.", + "bullets": [ + "Oberer Block: Metadaten. Autor, optionale GitHub-/Sponsoring-Links, Maintainer, Copyright, Lizenz, Version und Aktualisierungsdatum. Hier erfolgt auch die Würdigung der Mitwirkenden: Bei einem neuen Skript tragen Sie Ihren Namen und optional Links zur persönlichen GitHub-Seite und einem Unterstützungsprofil ein, etwa Ko-fi, GitHub Sponsors oder Buy Me a Coffee.", + "Unterer Block: Beschreibung. Ein kurzer Absatz in einfachem Englisch erklärt die Funktion. Nutzer lesen ihn vor dem Code. Er muss für sich allein Zweck, Hauptaktionen, betroffene Ressourcen und Voraussetzungen verständlich machen." + ], + "licenseCalloutTitle": "Die Lizenzlinie ist festgelegt — GPL-3.0", + "licenseCalloutBody": "ProxMenux wird unter der GNU General Public License v3.0 veröffentlicht. Jedes Skript im Projekt wird unter derselben Lizenz ausgeliefert; die License-Zeile im Header ist immer die GPL-3.0-Referenz, die im folgenden Beispiel gezeigt wird - es ist keine Per-Script-Wahl. Indem Sie ein Skript beisteuern, erklären Sie sich damit einverstanden, es unter GPL-3.0 zu veröffentlichen, was bedeutet, dass jeder es lesen, ändern und weiterverteilen kann (einschließlich Änderungen), solange er es unter der gleichen Lizenz behält. Der vollständige Text befindet sich unter MacRimi/ProxMenux/LICENSE.", + "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": "Die Linien GitHub und Sponsor sind optional - lassen Sie sie aus, wenn Sie sie nicht veröffentlichen möchten. Alles andere ist erforderlich.", + "whyCalloutTitle": "Warum das wichtig ist", + "whyCalloutBody": "Open-Source-Beiträge sind freiwillige Arbeit. Name und optionaler Sponsoring-Link im Quellcode machen die Urheberschaft bei jedem Lesen sichtbar, statt sie hinter dem Projektnamen zu verbergen. Der Beschreibungsblock ist aus einem anderen Grund wichtig: Er ist der erste Anlaufpunkt künftiger Maintainer und neugieriger Nutzer. Eine klare Erklärung entscheidet oft darüber, ob sie einem Skript vertrauen oder es meiden." + }, + "structure": { + "heading": "Projektstruktur", + "intro": "Wo jede Art von Skript im Repository lebt:", + "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": "Jedes Skript lädt utils.sh beim Start per source, um Nachrichtenfunktionen, Spinner, Farbvariablen und Übersetzungssystem einzubinden. Gemeinsame Hilfsbibliotheken in scripts/global/ werden ausdrücklich von den Skripten geladen, die sie benötigen." + }, + "twoPhase": { + "heading": "Die zweiphasige UI Design Policy", + "intro": "Dies ist die wichtigste Konvention in ProxMenux und die PRs werden am häufigsten gebeten, sie zu beheben. Jedes Skript ist in genau zwei Phasen unterteilt:", + "headerPhase": "Phase", + "headerPurpose": "Zweck", + "headerScreen": "Bildschirmzustand", + "rows": [ + { + "phaseRich": "Phase 1 — Auswahl", + "purposeRich": "Sammeln Sie jede Benutzerentscheidung. Führen Sie alle erforderlichen Vorbereitungsarbeiten durch (Sonden, Scans, Überprüfungen).", + "screenRich": "dialog-Overlays. Wenn eine Suche zwischen zwei Menüs länger als ein oder zwei Sekunden dauert, zeigen Sie einen msg_info-Spinner an, damit der Benutzer weiß, dass das Skript nicht eingefroren ist, und rufen Sie dann stop_spinner direkt vor dem nächsten Dialog auf." + }, + { + "phaseRich": "Phase 2 — Ausführung", + "purposeRich": "Führen Sie jede Operation aus. Zeigen Sie den gesamten Fortschrittsverlauf an, der sich auf dem Bildschirm ansammelt.", + "screenRich": "Sichtbare msg_info / msg_ok Nachrichten; niemals dialog." + } + ], + "principle": "Das Prinzip: Sammeln Sie zuerst alles und führen Sie dann alles aus. Der Benutzer sieht ein sauberes dialoggesteuertes Menü (Phase 1), dann eine saubere Ausführungsansicht im Protokollstil (Phase 2). Kein Mischen — kein Dialog erscheint mitten in der Ausführung, kein Fortschrittsrauschen während der Auswahl.", + "phase1Heading": "Phase 1 — typisches Muster", + "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": "Regeln für Phase 1:", + "phase1Rules": [ + "Läuft gerade ein msg_info-Spinner und soll ein Menü mit dialog oder whiptail geöffnet werden, rufen Sie zuerst stop_spinner auf. Der Spinner verträgt sich nicht mit deren Bildschirmüberlagerung. Ohne aktiven Spinner ist der Aufruf nicht nötig.", + "Verwenden Sie show_proxmenux_logo + msg_title + msg_info, um in Phase 1 einen längeren Vorgang sichtbar einzuordnen, etwa eine Prüfung ab fünf Sekunden. Die Funktion leert bereits den Bildschirm; rufen Sie davor nicht clear auf.", + "Rufen Sie show_proxmenux_logo nicht zwischen Dialogmenüs auf, in denen nichts angezeigt werden kann - das Löschen des Bildschirms für ein leeres Terminal ist nur visuelles Rauschen.", + "Speichern Sie alle Entscheidungen und Sondenergebnisse in Variablen oder parallelen Arrays. Die sichtbare Zusammenfassung erfolgt zu Beginn der Phase 2, nicht in Phase 1." + ], + "phase2Heading": "Phase 2 — typisches Muster", + "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": "Regeln für Phase 2: Beginnen Sie mit show_proxmenux_logo + msg_title und fassen Sie Phase 1 sofort in msg_ok-Zeilen zusammen. Rufen Sie show_proxmenux_logo nicht erneut auf, da dies den bisherigen Verlauf löscht. Verwenden Sie kein dialog; ist eine Entscheidung zur Laufzeit unvermeidbar, nutzen Sie whiptail wie im nächsten Abschnitt." + }, + "dialogVsWhiptail": { + "headingRich": "Wann dialog vs whiptail zu verwenden", + "intro": "Beide Tools zeichnen Benutzeroberflächen im Textmodus, aber sie verhalten sich auf dem Bildschirm sehr unterschiedlich - und ProxMenux verwendet sie aus einem bestimmten Grund in zwei verschiedenen Phasen.", + "headerTool": "Werkzeug", + "headerWhen": "Wann man es benutzt", + "headerEffect": "Wirkung auf den Bildschirm", + "rows": [ + { + "toolRich": "dialog", + "whenRich": "Immer in Phase 1. Jede interaktive Auswahl – Auswahl einer VM, einer Festplatte, eines Dateisystems, das eine Aktion bestätigt – verwendet dialog. Dies ist das Standard-UI-Tool von ProxMenux.", + "effectRich": "Übernimmt das Terminal: löscht den Bildschirm, zieht sein Overlay und bringt das Terminal beim Schließen in seinen vorherigen Zustand zurück. Fein in Phase 1, weil sich noch nichts Nützliches zeigt." + }, + { + "toolRich": "whiptail", + "whenRich": "Nur in Phase 2, nur wenn unvermeidlich. Der typische Fall ist eine Neustartaufforderung am Ende der Ausführung. Greifen Sie nicht zu whiptail, um \"Weiter?\" mitten in der Ausführung zu fragen - diese Entscheidung hätte in Phase 1 getroffen werden sollen.", + "effectRich": "Leichteres Overlay, das den Terminalkontext nicht löscht. Der akkumulierte msg_ok / msg_info-Verlauf der Phase 2 bleibt hinter dem Dialogfeld sichtbar. Deshalb ist es die richtige Wahl, wenn der Fortschritt bereits auf dem Bildschirm zu sehen ist." + } + ], + "calloutTitle": "Warum die Trennung wichtig ist", + "calloutBody": "Wenn Sie dialog in der Mitte der Phase 2 anrufen, verschwindet jede msg_ok-Zeile, die der Benutzer beobachtet hat. Sie wischen den Audit-Trail. whiptail vermeidet das. Die Regel ist also nicht willkürlich - es geht darum, die Sicht des Benutzers auf das, was das Skript bisher getan hat, zu bewahren.", + "rebootHeading": "Neustartabfrage: das typische whiptail in Phase 2", + "rebootIntro": "Wenn ein Skript endet und ein Neustart erforderlich ist (z.B.) IOMMU aktiviert, Kernelparameter geändert), die Aufforderung am Ende der Phase 2 verwendet whiptail. Fügen Sie immer einen \"Nein\"-Zweig hinzu, der den Benutzer warnt, die betroffene Ressource nicht zu verwenden, bis er neu startet:", + "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": "Referenz der Nachrichtenfunktionen", + "intro": "Alle definiert in utils.sh. Verwenden Sie sie als Standard für jede benutzersichtliche Ausgabe - konsistente Visuals über Skripte hinweg ist der springende Punkt. Wenn Ihr Skript eine neue Funktion benötigt, die nicht zum vorhandenen Set passt (ein neuer Schweregrad, ein neuer Layout-Helfer usw.), schlagen Sie es in Ihrem Pull Request vor - es wird überprüft und zu utils.sh hinzugefügt, wenn es allgemein nützlich ist.", + "headerFunction": "Funktion", + "headerWhen": "Wann zu verwenden", + "headerSpinner": "Fortschrittsanzeige", + "rows": [ + { + "function": "msg_info \"text\"", + "whenRich": "Operation in Arbeit.", + "spinner": "Startet" + }, + { + "function": "stop_spinner", + "whenRich": "Ende der stillen Vorbereitungsarbeiten in Phase 1 — tötet Spinner, löscht die Linie.", + "spinner": "Stoppt" + }, + { + "function": "msg_ok \"text\"", + "whenRich": "Vorgang erfolgreich. Auch für „Funktion aktiviert“ verwenden, wenn noch ein Neustart erforderlich ist.", + "spinner": "Stoppt" + }, + { + "function": "msg_warn \"text\"", + "whenRich": "Tatsächliche Warnung oder gestörter Zustand.", + "spinner": "Stoppt" + }, + { + "function": "msg_error \"text\"", + "whenRich": "Schwerwiegender Fehler.", + "spinner": "Stoppt" + }, + { + "function": "msg_info2 \"text\"", + "whenRich": "Nicht blockierender Hinweis (türkisfarbene Infozeile).", + "spinner": "Stoppt" + }, + { + "function": "msg_success \"text\"", + "whenRich": "Abschließende Aufforderung „Enter zum Zurückkehren“ am Ende von Phase 2.", + "spinner": "Stoppt" + }, + { + "function": "msg_title \"text\"", + "whenRich": "Fetter Titel mit eingebautem Abstand. Wird zu Beginn der Phase 2 verwendet.", + "spinner": "—" + }, + { + "function": "show_proxmenux_logo", + "whenRich": "Leert den Bildschirm und zeigt das Logo. Zu Beginn von Phase 2 einmal aufrufen.", + "spinner": "—" + } + ] + }, + "dialogConventions": { + "heading": "Dialogkonventionen", + "bullets": [ + "Geben Sie --backtitle \"$BACKTITLE\" immer an jeden dialog- und whiptail-Aufruf weiter. $BACKTITLE ist immer \"ProxMenux\" - einmal im Skript-Header gesetzt und nie außer Kraft gesetzt. Der Benutzer muss den Projektnamen immer als Framing-Kontext sehen, niemals den eigenen Titel des Skripts.", + "Verpacken Sie Titel und Nachrichten immer mit $(translate \"...\").", + "Immer dialog Ausgabe mit 2>&1 >/dev/tty umleiten — die erfasste stdout wird die Auswahl des Benutzers, während der Dialog selbst auf das Terminal zieht.", + "Verwenden Sie die Standard-UI-Dimensionsvariablen ($UI_MENU_H, $UI_MSG_W, usw.) für eine konsistente Dimensionierung über Skripte hinweg.", + "Prüfen Sie immer auf leere oder abgebrochene Auswahlen und behandeln Sie diese sauber." + ], + "exampleIntro": "Vollständiges Beispiel — Erstellung eines VM-Auswahlmenüs und Bearbeitung der Stornierung:", + "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": "Übersetzungspolitik", + "intro": "Alle vom Benutzer sichtbaren Zeichenfolgen müssen mit der translate-Funktion gewickelt sein. ProxMenux übersetzt sie automatisch in alle unterstützten Sprachen - Sie schreiben Englisch, der Benutzer liest seine Muttersprache.", + "code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...", + "bullets": [ + "Schreibe Strings in Englisch – die Übersetzung wird automatisch vom Build bearbeitet.", + "Halten Sie Strings kurz. Vermeiden Sie das Einbetten von Variablen in lange Sätze, wenn möglich.", + "Variablennamen, Pfade oder technische Bezeichner nichtübersetzen." + ] + }, + "variableStyle": { + "heading": "Variable und Stilkonventionen", + "bullets": [ + "Verwenden Sie UPPER_CASE für Variablen auf Skriptebene.", + "Verwenden Sie lower_case für lokale Funktionsvariablen (mit local deklarieren).", + "Setzen Sie alle Variablenexpansionen in Anführungszeichen: \"$VAR\" statt $VAR.", + "Verwenden Sie [[ ]] für Konditionale, nicht [ ] (außer wenn POSIX erforderlich ist).", + "show_proxmenux_logo ist der geeignete Weg, um den Bildschirm zu löschen - er enthält das Clear und zeigt das Projektlogo, so dass der Benutzer immer einen visuellen Kontext hat. Rufen Sie es einmal zu Beginn der Phase 2 (und optional vor einem langen Phase 1-Spinnerblock) auf." + ], + "standardNamesIntro": "Standardvariablennamen im gesamten Projekt:", + "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": "Umleitung der Werkzeugausgabe während der Phase 2", + "redirectIntro": "Phase 2 zeigt ein sauberes Protokoll der msg_info → msg_ok-Zeilen an, die sich auf dem Bildschirm ansammeln. Wenn ein Tool, das Sie aufrufen (apt, mkfs, qm, pct, dd, etc.), seine eigene Ausgabe in stdout/stderr schreibt, scrollt es an Ihren Nachrichten vorbei und unterbricht den visuellen Fluss - Sie haben ein chaotisches Terminal, in dem der Benutzer die eigenen Fortschrittslinien des Skripts nicht vom Rauschen des zugrunde liegenden Tools unterscheiden kann.", + "withoutRedirectIntro": "Ohne Umleitung: die Ausgabe für Nutzer, wenn zusätzliche Werkzeugausgaben nicht abgefangen werden.", + "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": "Mit Umleitung: dieselbe Aktion, wenn zusätzliche Ausgaben an anderer Stelle landen.", + "withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.", + "twoPatternsIntro": "Zwei Muster zur Auswahl:", + "discardLead": "Ausgabe verwerfen, wenn sie nicht benötigt wird: die einfachste und schnellste Variante.", + "discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1", + "logLead": "Ausgabe in eine Protokolldatei schreiben, wenn Sie sie später prüfen möchten, etwa zur Fehlersuche bei einer Installation oder um dpkg-Aktionen nachzuvollziehen. Dies ist das bevorzugte Muster für apt-Aufrufe:", + "logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1", + "referenceOutro": "scripts/global/update-pve9_2.sh dient als Referenz: Jeder apt-get-Aufruf schreibt in eine Protokolldatei. Nutzer sehen nur den Ablauf msg_info → msg_ok, während die Datei bei Fehlern genau zeigt, was apt getan hat." + }, + "dosAndDonts": { + "heading": "Do's und Don'ts", + "doHeading": "✅ Empfohlen", + "doBullets": [ + "stop_spinner vor einem dialog in Phase 1 nur dann, wenn ein msg_info Spinner gerade läuft.", + "Phase 2 beginnt mit show_proxmenux_logo + msg_title + msg_ok als Zusammenfassung der Ergebnisse von Phase 1.", + "Verwenden Sie msg_ok für erfolgreich aktivierte Funktionen – auch wenn ein Neustart erforderlich ist.", + "Verwenden Sie whiptail (nicht dialog) für jede Aufforderung nach der Ausführung, die in Phase 2 erscheinen muss.", + "Fügen Sie immer einen \"Nein\" -Zweig in Reboot-Dialoge ein, der den Benutzer warnt, die betroffene Ressource bis zum Neustart nicht zu starten.", + "Schützen Sie die reine VM-Logik, indem Sie [[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]] überprüfen - Controller und NVMe PCIe können nicht zu LXC-Containern hinzugefügt werden.", + "Verwenden Sie ensure_repositories von utils-install-functions.sh anstelle von bedingungslosem apt-get update.", + "Verwenden Sie parallele Arrays in Phase 1, wenn jedes Element mehrere Dialoge benötigt." + ], + "dontHeading": "❌ Vermeiden", + "dontBullets": [ + "Rufen Sie dialog an, während ein Spinner aktiv ist.", + "Überspringen Sie die Phase 1 Zusammenfassung zu Beginn der Phase 2.", + "Rufen Sie show_proxmenux_logo ein zweites Mal an - es löscht alles, was Phase 2 gedruckt hat.", + "Verwenden Sie dialog in Phase 2 (verwenden Sie whiptail für den seltenen unvermeidlichen Fall).", + "Verwenden Sie reine clear.", + "msg_title mit Leerzeilen aus echo \"\" umgeben; die Abstände sind bereits enthalten.", + "Verwenden Sie msg_warn, um eine erfolgreich aktivierte Funktion zu melden - das ist ein msg_ok.", + "Führen Sie bedingungslos apt-get update aus - verwenden Sie ensure_repositories." + ] + }, + "submitting": { + "heading": "Einreichen Ihres Beitrags", + "steps": [ + "Fork MacRimi/ProxMenux auf GitHub und klonen Sie Ihre Fork.", + "Erstellen Sie einen feature/*-Zweig aus develop (siehe Branching-Modell oben).", + "Befolgen Sie diese Anleitung für neue oder geänderte Skripte. Schreiben Sie den Header mit Ihrem Namen; fügen Sie die optionale Sponsorenzeile hinzu, wenn Sie möchten.", + "Testen Sie Ihr Skript auf einer echten Proxmox VE-Instanz - sowohl Phase 1 (jeder Dialogzweig) als auch Phase 2 (jede Operation ist erfolgreich und wird bei Fehlern sauber zurückgesetzt).", + "Öffnen Sie eine Pull Request gegen develop mit einer klaren Beschreibung: was das Skript macht, was sich geändert hat, auf welcher Proxmox VE-Version es getestet wurde.", + "Stellen Sie sicher, dass Ihr Beitrag den Code of Conduct respektiert." + ], + "securityOutro": "Befolgen Sie bei sicherheitsrelevanten Problemen den Offenlegungsfluss in SECURITY.md, anstatt ein öffentliches Problem zu öffnen." + }, + "whereNext": { + "heading": "Wohin als nächstes", + "items": [ + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md", + "label": "CONTRIBUTING.md (vollständige Anleitung)", + "tail": "— die Quelle der Wahrheit für jede Konvention, einschließlich der fortgeschrittenen Hardware-Muster." + }, + { + "kind": "internal", + "href": "/docs/about/contributors", + "label": "Beitragende", + "tail": " — die Menschen, deren Arbeit ProxMenux-Versionen geprägt hat. Eine andere Seite als diese hier." + }, + { + "kind": "internal", + "href": "/docs/about/code-of-conduct", + "label": "Verhaltenskodex", + "tail": "- die Standards, die jeder Mitwirkende zu befolgen bereit ist." + }, + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/discussions", + "label": "GitHub Discussions", + "tail": "Fragen Sie, bevor Sie bauen, ob Sie nicht sicher sind, ob eine Idee passt, oder um Mitarbeiter für ein größeres Feature zu finden." + } + ] + } +} diff --git a/web/messages/de/docs/about/contributors.json b/web/messages/de/docs/about/contributors.json new file mode 100644 index 00000000..40718e21 --- /dev/null +++ b/web/messages/de/docs/about/contributors.json @@ -0,0 +1,38 @@ +{ + "meta": { + "title": "Mitwirkende | ProxMenux-Dokumentation", + "description": "Anerkennung für die Menschen, die ProxMenux möglich machen: Tester, Reviewer und Entwickler, die jede Version mitgestalten.", + "ogTitle": "Mitwirkende | ProxMenux-Dokumentation", + "ogDescription": "Treffen Sie die Mitwirkenden hinter ProxMenux." + }, + "header": { + "title": "Mitwirkende", + "description": "Das ProxMenux-Projekt wächst dank seiner Mitwirkenden. Diese Seite würdigt ihre Arbeit: Versionen vor der Veröffentlichung testen, Regressionen erkennen, PRs prüfen und die Entwicklung neuer Funktionen mitgestalten.", + "section": "Über" + }, + "beyond": { + "title": "Weitere Mitwirkende", + "body": "Viele weitere Menschen helfen mit Fehlermeldungen, Funktionsideen in Discussions, Beta-Tests und Übersetzungen. Die vollständige Liste der Code-Mitwirkenden steht im GitHub-Mitwirkendendiagramm. Diese Seite hebt diejenigen hervor, die besonders aktiv ProxMenux-Versionen testen und prüfen." + }, + "testers": { + "heading": "Tester & Reviewer", + "intro": "Diese Personen gehörten zu den ersten Mitwirkenden. Mit Tests, Fehlermeldungen und Verbesserungsvorschlägen halfen sie ProxMenux dabei, zu dem zu werden, was es heute ist.", + "roles": { + "testing": "Testen", + "testingReviewer": "Tests und Review" + }, + "youtube": "YouTube" + }, + "contribute": { + "heading": "Möchten Sie dazu beitragen?", + "intro": "Jeder Beitrag ist willkommen - Code, Testen, Design, Dokumentation oder einfach nur das Teilen Ihrer Ideen:", + "tester": "Tester — probieren Sie den Beta-Kanal aus und melden Sie vor der stabilen Veröffentlichung, was funktioniert und was nicht.", + "developer": "Entwickler — Bash, Next.js (TypeScript) und etwas Python für die virtuelle Übersetzungsumgebung (venv). PRs auf GitHub sind willkommen.", + "designer": "Designer — Verbesserungen der Benutzeroberfläche, Icons, Screenshots zur Dokumentation.", + "ideas": "Ideen — eröffnen Sie zuerst ein Thema in GitHub Discussions, bevor Sie einen Funktionswunsch als Issue einreichen." + }, + "coc": { + "title": "Lesen Sie zuerst den Verhaltenskodex", + "body": "Lesen Sie vor dem Einreichen von Code oder Fehlermeldungen kurz den Verhaltenskodex und die bewährten Vorgehensweisen. Darin werden die Verantwortung für Code, die Meldung von Sicherheitslücken und der Umfang von PRs erläutert." + } +} diff --git a/web/messages/de/docs/about/faq.json b/web/messages/de/docs/about/faq.json new file mode 100644 index 00000000..579a8de6 --- /dev/null +++ b/web/messages/de/docs/about/faq.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Häufige Fragen | ProxMenux-Dokumentation", + "description": "Häufige Fragen zu ProxMenux: Funktionsumfang, Installation, Kompatibilität ab PVE 8, Anpassung, Updates, Sicherheit, Produktionseinsatz, Systemdateien, Beiträge und Deinstallation.", + "ogTitle": "Häufige Fragen | ProxMenux-Dokumentation", + "ogDescription": "Häufige Fragen zu Installation, Kompatibilität, Sicherheit und Beiträgen zu ProxMenux." + }, + "header": { + "title": "Häufig gestellte Fragen", + "description": "Häufige Fragen zu ProxMenux: Funktionsumfang, Zielgruppe, Installation, Updates, Deinstallation, Kompatibilität, Anpassung, Sicherheit und Beiträge. Fehlt Ihre Frage, sehen Sie in GitHub Discussions nach oder erstellen Sie ein Issue.", + "section": "Über" + }, + "quickLinks": { + "title": "Schnelle Links", + "installationLabel": "Installation", + "installationSuffix": "— der One-Line-Installationsbefehl + Abhängigkeiten.", + "introductionLabel": "Einleitung", + "introductionSuffix": "— was ProxMenux tut, in 5 Minuten.", + "uninstallLabel": "Deinstallieren", + "uninstallSuffix": "— sauberes Entfernen.", + "issuesLabel": "GitHub Issues", + "discussionsLabel": "Diskussionen" + }, + "q1": { + "question": "Was ist ProxMenux und wofür wird es verwendet?", + "p1Rich": "ProxMenux ist ein interaktives menügesteuertes Tool, das Proxmox VE für alle Benutzer unabhängig von ihrer technischen Erfahrung zugänglich macht. Es vereinfacht die Befehlsausführung und ermöglicht es Benutzern, Aktionen auf ihrem System durchzuführen, ohne dass fortgeschrittene Linux-Kenntnisse erforderlich sind.", + "p2": "Weniger erfahrene Benutzer können Befehle über übersichtliche Menüs ausführen und müssen seltener selbst im Terminal tippen. Erfahrenen Administratoren erspart ProxMenux Eingaben bei wiederkehrenden Aufgaben wie der Absicherung nach der Installation, GPU-Passthrough, OVF-VM-Importen und der Rotation von ZFS-Snapshots.", + "p3": "Proxmox VE ist weit verbreitet für:", + "items": [ + "Virtualisierung auf Unternehmensebene", + "HomeLab und persönliche Cloud-Lösungen", + "Multimedia-Server, Automatisierung und mehr" + ] + }, + "q2": { + "question": "Wie installiere ich ProxMenux?", + "p1Rich": "Folgen Sie der Installationsanleitung. Kurz zusammengefasst:", + "stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"", + "p2": "Einmal installiert, starten Sie es einfach mit:", + "menuCmd": "menu" + }, + "q3": { + "question": "Ist ProxMenux mit allen Proxmox-Versionen kompatibel?", + "bodyRich": "Nein — ProxMenux benötigt Proxmox VE 8 oder neuer. PVE 7 und ältere Versionen werden nicht unterstützt. Aktualisieren Sie PVE 7 zunächst nach der offiziellen Proxmox-Anleitung auf 8.x. Den anschließenden Wechsel von 8 auf 9 können Sie über Werkzeuge → PVE 8 auf PVE 9 aktualisieren in ProxMenux durchführen." + }, + "q4": { + "question": "Kann ich ProxMenux anpassen?", + "p1Rich": "Lokale Änderungen an den Hauptskripten können beim Aktualisieren überschrieben werden. Bearbeiten Sie diese Dateien daher möglichst nicht direkt. Folgendes können Sie anpassen:", + "items": [ + "Das Konsolenbanner über das FastFetch Tool in den Post-Install-Optionen.", + "Welche optionalen Komponenten installiert werden (Monitor, Fail2Ban, Lynis...) – wählen Sie während der Installation oder später über das entsprechende Menü aus." + ] + }, + "q5": { + "question": "Wie aktualisiere ich ProxMenux?", + "p1Rich": "Wenn eine neue Version verfügbar ist, erkennt ProxMenux sie beim nächsten Aufruf von menu und bietet ein Update an. Stimmen Sie zu, werden die Dateien und die Konfiguration des Werkzeugs in der bestehenden Installation ersetzt. Ein manueller Download ist nicht nötig.", + "p2Rich": "Benutzer der stabilen Version erhalten stabile Updates, Beta-Benutzer die Beta-Updates. Sobald eine stabile Version erscheint, informiert die Beta beim nächsten Menüstart darüber und bietet den automatischen Wechsel an. Weitere Informationen finden Sie im Beta-Programm." + }, + "q6": { + "question": "Wo kann ich Probleme melden?", + "p1Rich": "Melden Sie Fehler über GitHub Issues. Beschreiben Sie die Schritte zum Reproduzieren, den Fehlertext und gegebenenfalls die Monitor-Ausgabe von journalctl -u proxmenux-monitor -n 50.", + "p2Rich": "Bei Sicherheitsproblemen: Veröffentlichen Sie keine Details. Folgen Sie dem Verfahren zur verantwortungsvollen Meldung im Verhaltenskodex und den bewährten Vorgehensweisen." + }, + "q7": { + "question": "Kann ich zu ProxMenux beitragen?", + "p1Rich": "Unbedingt. ProxMenux ist ein gemeinschaftliches Open-Source-Projekt. Beiträge sind als Code (Bash, Next.js/TypeScript und Python-Übersetzungswerkzeuge), Tests, Dokumentation, Design oder Ideen willkommen.", + "item1Rich": "Besprechen Sie Ideen in GitHub Discussions, bevor Sie eine Feature Request öffnen.", + "item2Rich": "Lesen Sie vor einem Pull Request den Verhaltenskodex und die bewährten Vorgehensweisen.", + "item3Rich": "Auf der Mitwirkendenseite finden Sie die aktuellen Tester und Reviewer." + }, + "q8": { + "question": "Ändert ProxMenux kritische Systemdateien?", + "p1Rich": "Bei der Installation von ProxMenux werden folgende Komponenten hinzugefügt.", + "item1Rich": "Abhängigkeiten über apt: dialog, curl, jq und git. Die Übersetzungen verwenden vorgefertigte JSON-Kataloge. Der Installer legt auf dem Host keine virtuelle Python-Umgebung für Übersetzungen an.", + "item2Rich": "Der Skriptbaum bei /usr/local/share/proxmenux/.", + "item3Rich": "Das Startskript unter /usr/local/bin/menu.", + "item4Rich": "Optional: der systemd-Dienst von Monitor unter proxmenux-monitor.service.", + "p2Rich": "ProxMenux verändert die zentrale Proxmox-Konfiguration nicht, es sei denn, Sie fordern dies ausdrücklich über ein entsprechendes Menü an. Die Netzwerkreparatur bearbeitet beispielsweise /etc/network/interfaces, jedoch erst nach Ihrer Bestätigung und dem Anlegen einer Sicherung." + }, + "q9": { + "question": "Ist es sicher, ProxMenux in der Produktion zu verwenden?", + "bodyRich": "Ja. Da ProxMenux die zentralen Proxmox-Dateien nur auf ausdrücklichen Wunsch verändert, kann es in Produktionsumgebungen eingesetzt werden. Testen Sie automatisierte Abläufe zunächst in einer kontrollierten Umgebung und erstellen Sie Sicherungen, bevor Sie destruktive Vorgänge ausführen, etwa das Upgrade von PVE 8 auf 9, das Formatieren eines Datenträgers oder das Löschen einer VM." + }, + "q10": { + "question": "Wie deinstalliere ich ProxMenux?", + "p1Rich": "In ProxMenux: Einstellungen → ProxMenux deinstallieren. Die Deinstallation entfernt den Skriptbaum, das Startskript und den Monitor-Dienst sowie auf Wunsch ausgewählte Abhängigkeiten. /root/.bashrc und /etc/motd werden aus den bei der Installation angelegten Sicherungen wiederhergestellt, sofern diese vorhanden sind.", + "p2Rich": "Die vollständige Anleitung finden Sie unter ProxMenux deinstallieren." + }, + "q11": { + "question": "VirusTotal markiert die Installations-URL - ist es sicher?", + "p1Rich": "Der in Issue #162 gemeldete Treffer von Chong Lua Dao bei 1 von 95 Prüfungen wurde vom Maintainer als Fehlalarm eingestuft. Der Installer verwendet das Muster curl | bash und kann jq aus dessen offizieller GitHub-Veröffentlichung herunterladen. Dieses Verhalten kann heuristische Scanner auslösen. Der damalige Bericht ist keine Bewertung aller künftigen Downloads.", + "p2Rich": "ProxMenux ist vollständig quelloffen. Sie können das Installationsskript Zeile für Zeile prüfen: install_proxmenux.sh. Weitere Hintergründe finden Sie in Issue #162." + } +} diff --git a/web/messages/de/docs/about/index.json b/web/messages/de/docs/about/index.json new file mode 100644 index 00000000..335ab2d4 --- /dev/null +++ b/web/messages/de/docs/about/index.json @@ -0,0 +1,67 @@ +{ + "meta": { + "title": "Über das Projekt | ProxMenux-Dokumentation", + "description": "Über ProxMenux: Projektziele, Mitwirkende, FAQ und Verhaltenskodex. Open-Source-Menümanagement-Tool für Proxmox VE 8+, erstellt und gepflegt von MacRimi mit einem kleinen Team von Testern und Mitwirkenden.", + "ogTitle": "Über das Projekt | ProxMenux-Dokumentation", + "ogDescription": "Über ProxMenux — ein menügesteuertes Open-Source-Werkzeug zur Verwaltung von Proxmox VE 8+." + }, + "header": { + "title": "Über", + "description": "Projektinformationen, FAQ, Mitwirkende und Verhaltenskodex. ProxMenux ist ein Open-Source-Menümanagement-Tool für Proxmox VE 8+, das von MacRimi mit Hilfe eines kleinen Teams von Testern und Mitwirkenden entwickelt und gewartet wird.", + "section": "Über" + }, + "callout": { + "title": "Open Source, von der Community getragen", + "body": "ProxMenux steht unter der GPL-3.0-Lizenz und wird öffentlich auf GitHub entwickelt. Jedes Skript lässt sich prüfen, jede Änderung nachvollziehen. Beiträge in Form von Fehlermeldungen, Ideen, Code und Tests sind willkommen." + }, + "section": { + "heading": "In diesem Abschnitt", + "options": [ + { + "icon": "HelpCircle", + "href": "/docs/about/faq", + "title": "FAQ", + "description": "Häufig gestellte Fragen: Was ist ProxMenux, Installation, Kompatibilität, Anpassung, Updates, Sicherheit, Produktionsnutzung, Deinstallation." + }, + { + "icon": "Users", + "href": "/docs/about/contributors", + "title": "Mitwirkende", + "description": "Anerkennung für die Menschen, die ProxMenux möglich machen: Tester, Reviewer und Entwickler, die jede Version mitgestalten." + }, + { + "icon": "ScrollText", + "href": "/docs/about/code-of-conduct", + "title": "Verhaltenskodex", + "description": "Projektwerte, Verantwortung für eingereichten Code und Beitragsrichtlinien. Pflichtlektüre vor dem Einreichen eines PR oder einer Fehlermeldung." + } + ] + }, + "involved": { + "heading": "Beteiligen Sie sich", + "intro": "Drei Orte, um sich mit dem Projekt zu beschäftigen:", + "cards": [ + { + "href": "https://github.com/MacRimi/ProxMenux/issues/new", + "title": "🐛 Einen Bug melden", + "description": "GitHub Issues — fügen Sie Protokolle und Schritte zum Nachstellen bei." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/discussions", + "title": "💡 Schlagen Sie ein Feature vor", + "description": "GitHub Discussions — teilen Sie Ideen, bevor Sie eine PR öffnen." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/pulls", + "title": "🔀 Einen PR einreichen", + "description": "GitHub Pull Requests – lesen Sie zuerst den Verhaltenskodex." + } + ] + }, + "support": { + "heading": "Unterstützung des Projekts", + "introRich": "Wenn ProxMenux Ihnen Zeit spart, ist der einfachste Weg, anderen zu helfen, es zu entdecken, dem Repo ein ⭐ auf GitHub zu geben. Wenn Sie weiter gehen wollen:", + "kofiLabel": "Auf Ko-fi unterstützen", + "kofiOutro": "- kauft dem Betreuer einen Kaffee und hält die Entwicklung am Laufen." + } +} diff --git a/web/messages/en/docs/about/code-of-conduct.json b/web/messages/en/docs/about/code-of-conduct.json index e8923f6a..6eefef4b 100644 --- a/web/messages/en/docs/about/code-of-conduct.json +++ b/web/messages/en/docs/about/code-of-conduct.json @@ -8,5 +8,6 @@ "errors": { "notFound": "Error: CODE_OF_CONDUCT.md file not found.", "loadFailed": "Error: Unable to load the Code of Conduct content." - } + }, + "contentMarkdown": "# 📝 Code of Conduct & Best Practices\n\nThis document defines the **principles and guidelines** for the use of **ProxMenux**, aiming to foster **respect, collaboration, and security** in development.\n\n## 📌 1. Code Attribution & Recognition\n\n- If **scripts, code snippets, or ideas** from other repositories or developers are used, the original author will always be credited. \n- A comment will be added in the code or documentation mentioning the source and linking to the original repository if possible. \n- When using code with a specific **license**, its terms must be respected. \n\n### ✅ Example of proper attribution in code:\n\n```bash\n# Script based on the work of [Author] at [Repository Link]\n```\n\n## 🔒 2. Security & Code Responsibility\n\n- All code in this repository follows secure development best practices.\n- Contributions introducing intentional vulnerabilities or unsafe practices are not allowed.\n- Scripts should never compromise system security or user data.\n- Before implementation, contributions should be reviewed to ensure security and stability.\n\n### ⚠️ Responsible Disclosure of Vulnerabilities\n\nIf you discover a security vulnerability, DO NOT report it in public Issues or forums.\n\nInstead, please report it privately via email:\n\n📧 proxmenux@macrimi.pro\n\nFor detailed information on security vulnerabilities and how to report them, please refer to our [Security Policy](./SECURITY.md).\n\n## 🤝 3. Community Guidelines\n\nTo maintain a respectful and professional environment, all users must follow these guidelines:\n\n- ✅ Be respectful and constructive in discussions.\n- ❌ No harassment, hate speech, or offensive behavior will be tolerated.\n- ✅ Provide feedback professionally, avoiding personal attacks.\n- ❌ Violating these guidelines may result in warnings or bans, depending on severity.\n\n\n##\n\nWith this document, we promote ethical code use, security awareness, and a respectful community.\n\n📢 Let's build something great, together!\n\n" } diff --git a/web/messages/en/docs/about/faq.json b/web/messages/en/docs/about/faq.json index ab16cfa6..e1a33f96 100644 --- a/web/messages/en/docs/about/faq.json +++ b/web/messages/en/docs/about/faq.json @@ -45,7 +45,7 @@ }, "q4": { "question": "Can I customise ProxMenux?", - "p1Rich": "The core scripts can't be modified directly because they're hosted on GitHub and refreshed by the auto-update flow. What you can customise:", + "p1Rich": "Local changes to the core scripts can be overwritten by the update flow, so avoid editing those files directly. What you can customise:", "items": [ "The console banner via the FastFetch tool in the Post-Install options.", "Which optional components are installed (Monitor, Fail2Ban, Lynis…) — pick during install or via the relevant menu later." @@ -63,15 +63,15 @@ }, "q7": { "question": "Can I contribute to ProxMenux?", - "p1Rich": "Absolutely. ProxMenux is open source and collaborative. Contributions can be code (bash, Next.js / TypeScript, the translation Python venv), testing, documentation, design, or just ideas.", + "p1Rich": "Absolutely. ProxMenux is open source and collaborative. Contributions can be code (Bash, Next.js/TypeScript and Python translation tools), testing, documentation, design, or just ideas.", "item1Rich": "Discuss ideas in GitHub Discussions before opening a feature request.", "item2Rich": "For PRs, read the Code of Conduct & Best Practices first.", "item3Rich": "See the Contributors page for current testers and reviewers." }, "q8": { "question": "Does ProxMenux modify critical system files?", - "p1Rich": "No. ProxMenux installs:", - "item1Rich": "Dependencies via apt: dialog, curl, jq, git (and python3 + googletrans on the Translation install).", + "p1Rich": "Installing ProxMenux adds the following components.", + "item1Rich": "Dependencies via apt: dialog, curl, jq and git. Translations use pre-built JSON catalogs; the installer does not add a translation virtualenv to the host.", "item2Rich": "The script tree at /usr/local/share/proxmenux/.", "item3Rich": "The launcher at /usr/local/bin/menu.", "item4Rich": "Optional: the Monitor systemd service at proxmenux-monitor.service.", @@ -83,12 +83,12 @@ }, "q10": { "question": "How do I uninstall ProxMenux?", - "p1Rich": "From inside ProxMenux: Settings → Uninstall ProxMenux. The uninstaller removes the script tree, the launcher and the Monitor service, optionally removes selected dependencies, and restores /root/.bashrc and /etc/motd backups taken at install time.", + "p1Rich": "From inside ProxMenux: Settings → Uninstall ProxMenux. The uninstaller removes the script tree, the launcher and the Monitor service, optionally removes selected dependencies, and restores /root/.bashrc and /etc/motd from install-time backups if those backups exist.", "p2Rich": "Full step-by-step: Uninstall ProxMenux." }, "q11": { "question": "VirusTotal flags the install URL — is it safe?", - "p1Rich": "A 1/95 detection by heuristic engines (e.g. Chong Lua Dao) is a known false positive. The installer uses the standard curl | bash pattern and downloads legitimate binaries (like jq from its official GitHub release), which aggressive scanners flag based on behaviour rather than actual malicious code.", + "p1Rich": "The 1/95 result reported in Issue #162, from Chong Lua Dao, was identified by the maintainer as a false positive. The installer uses the curl | bash pattern and can download jq from its official GitHub release. Such behaviour can trigger heuristic scanners; the historical report is not a verdict on every future download.", "p2Rich": "ProxMenux is 100% open source and the install script is reviewable line by line: install_proxmenux.sh. More context in Issue #162." } } diff --git a/web/messages/es/docs/about/code-of-conduct.json b/web/messages/es/docs/about/code-of-conduct.json index 77757c6a..b1ee353a 100644 --- a/web/messages/es/docs/about/code-of-conduct.json +++ b/web/messages/es/docs/about/code-of-conduct.json @@ -1,12 +1,13 @@ { "meta": { - "title": "Código de conducta | ProxMenux Documentation", + "title": "Código de conducta | Documentación de ProxMenux", "description": "Código de conducta y buenas prácticas de ProxMenux para colaboradores, testers y usuarios.", - "ogTitle": "Código de conducta | ProxMenux Documentation", + "ogTitle": "Código de conducta | Documentación de ProxMenux", "ogDescription": "Expectativas sobre responsabilidad del código, divulgación de problemas de seguridad y alcance de los PRs para el proyecto ProxMenux." }, "errors": { "notFound": "Error: archivo CODE_OF_CONDUCT.md no encontrado.", "loadFailed": "Error: no se pudo cargar el contenido del código de conducta." - } + }, + "contentMarkdown": "# 📝 Código de conducta y buenas prácticas\n\nEste documento define los **principios y las pautas** de uso de **ProxMenux** para promover el **respeto, la colaboración y la seguridad** durante el desarrollo.\n\n## 📌 1. Autoría del código y reconocimiento\n\n- Si se utilizan **scripts, fragmentos de código o ideas** de otros repositorios o desarrolladores, se reconocerá siempre la autoría original.\n- Se añadirá un comentario en el código o la documentación que indique la fuente y, si es posible, enlace al repositorio original.\n- Al utilizar código con una **licencia** concreta, se deben respetar sus condiciones.\n\n### ✅ Ejemplo de reconocimiento de autoría en el código:\n\n```bash\n# Script basado en el trabajo de [Autor] en [Enlace al repositorio]\n```\n\n## 🔒 2. Seguridad y responsabilidad del código\n\n- Todo el código de este repositorio sigue las buenas prácticas de desarrollo seguro.\n- No se permiten contribuciones que introduzcan vulnerabilidades intencionadas o prácticas inseguras.\n- Los scripts nunca deben comprometer la seguridad del sistema ni los datos de los usuarios.\n- Las contribuciones deben revisarse antes de implementarlas para comprobar su seguridad y estabilidad.\n\n### ⚠️ Divulgación responsable de vulnerabilidades\n\nSi descubres una vulnerabilidad de seguridad, NO la notifiques en incidencias o foros públicos.\n\nComunícala en privado por correo electrónico:\n\n📧 proxmenux@macrimi.pro\n\nPara más información sobre las vulnerabilidades y cómo notificarlas, consulta nuestra [política de seguridad](./SECURITY.md).\n\n## 🤝 3. Normas de la comunidad\n\nPara mantener un entorno respetuoso y profesional, todos los usuarios deben seguir estas pautas:\n\n- ✅ Sé respetuoso y constructivo en las discusiones.\n- ❌ No se tolerarán el acoso, el discurso de odio ni las conductas ofensivas.\n- ✅ Aporta comentarios de forma profesional, sin ataques personales.\n- ❌ El incumplimiento puede dar lugar a advertencias o expulsiones, según la gravedad.\n\n##\n\nEste documento promueve un uso ético del código, la conciencia de seguridad y una comunidad respetuosa.\n\n📢 ¡Construyamos algo grande juntos!\n" } diff --git a/web/messages/es/docs/about/contributing.json b/web/messages/es/docs/about/contributing.json index aeaeb889..5ac006ce 100644 --- a/web/messages/es/docs/about/contributing.json +++ b/web/messages/es/docs/about/contributing.json @@ -1,6 +1,6 @@ { "meta": { - "title": "Contribuir a ProxMenux | ProxMenux Documentation", + "title": "Contribuir a ProxMenux | Documentación de ProxMenux", "description": "Cómo contribuir a ProxMenux — modelo de ramas (main / develop / feature/*), flujo de pull requests, plantilla de cabecera de script con atribución de autor y enlace opcional de patrocinio, política de diseño UI en dos fases, funciones de mensajes y el camino desde una rama de función hasta un release estable.", "ogTitle": "Contribuir a ProxMenux", "ogDescription": "Modelo de ramas, flujo de trabajo, atribución en la cabecera del script y política de diseño UI en dos fases que los colaboradores deben seguir." @@ -129,7 +129,7 @@ "intro": "Todas definidas en utils.sh. Úsalas como el valor por defecto para cualquier salida visible para el usuario — visuales coherentes entre scripts es la idea. Si tu script necesita una función nueva que no encaja en el conjunto existente (un nuevo nivel de severidad, un nuevo helper de layout, etc.), propónla en tu Pull Request — se revisará y se añadirá a utils.sh si es útil de forma amplia.", "headerFunction": "Función", "headerWhen": "Cuándo usar", - "headerSpinner": "Spinner", + "headerSpinner": "Indicador de progreso", "rows": [ { "function": "msg_info \"text\"", @@ -163,7 +163,7 @@ }, { "function": "msg_success \"text\"", - "whenRich": "Prompt final \"Press Enter to return\" al final de la fase 2.", + "whenRich": "Mensaje final «Pulsa Intro para volver» al terminar la fase 2.", "spinner": "Para" }, { diff --git a/web/messages/es/docs/about/contributors.json b/web/messages/es/docs/about/contributors.json index 6cf0ca0f..bba0ff22 100644 --- a/web/messages/es/docs/about/contributors.json +++ b/web/messages/es/docs/about/contributors.json @@ -1,32 +1,32 @@ { "meta": { - "title": "Colaboradores | ProxMenux Documentation", - "description": "Reconocimiento a las personas que hacen posible ProxMenux — testers, revisores y desarrolladores que dan forma a cada release.", - "ogTitle": "Colaboradores | ProxMenux Documentation", + "title": "Colaboradores | Documentación de ProxMenux", + "description": "Reconocimiento a las personas que hacen posible ProxMenux: quienes prueban, revisan y desarrollan cada versión.", + "ogTitle": "Colaboradores | Documentación de ProxMenux", "ogDescription": "Conoce a los colaboradores detrás de ProxMenux." }, "header": { "title": "Colaboradores", - "description": "El proyecto ProxMenux crece y prospera gracias a la contribución de sus colaboradores. Este es el merecido reconocimiento a su trabajo — probando builds antes del release, cazando regresiones, revisando PRs y dando forma a la dirección de las nuevas funciones.", + "description": "ProxMenux crece gracias a sus colaboradores. Esta página reconoce su trabajo: probar versiones antes de publicarlas, detectar regresiones, revisar PR y ayudar a orientar las nuevas funciones.", "section": "Acerca de" }, "beyond": { "title": "Más allá de esta lista", - "body": "Mucha más gente contribuye vía reportes de bugs, ideas de funciones en Discussions, pruebas beta y traducciones. La lista completa de colaboradores de código vive en el grafo de colaboradores de GitHub. La página de abajo destaca a las personas que han estado más activamente involucradas en probar y revisar releases de ProxMenux." + "body": "Muchas más personas contribuyen notificando errores, proponiendo funciones en Discussions, probando versiones beta y traduciendo el proyecto. La lista completa de colaboradores del código está en el gráfico de colaboradores de GitHub. Esta página destaca a quienes participan más activamente en las pruebas y la revisión de las versiones de ProxMenux." }, "testers": { - "heading": "Testers y revisores", - "intro": "Estas personas fueron de las primeras en contribuir al proyecto, probando, reportando incidencias y proponiendo mejoras que ayudaron a que ProxMenux haya crecido hasta convertirse en lo que es hoy.", + "heading": "Pruebas y revisión", + "intro": "Estas personas estuvieron entre las primeras en contribuir al proyecto. Sus pruebas, avisos de errores y propuestas de mejora ayudaron a convertir ProxMenux en lo que es hoy.", "roles": { "testing": "Pruebas", - "testingReviewer": "Pruebas y revisor" + "testingReviewer": "Pruebas y revisión" }, "youtube": "YouTube" }, "contribute": { "heading": "¿Quieres colaborar?", "intro": "Cualquier contribución es bienvenida — código, pruebas, diseño, documentación o simplemente compartir tus ideas:", - "tester": "Tester — prueba el canal beta y reporta qué funciona y qué no antes de los releases estables.", + "tester": "Pruebas: prueba el canal beta y comunica qué funciona y qué no antes de que se publiquen las versiones estables.", "developer": "Desarrollador — Bash + Next.js (TypeScript) + un poco de Python para el venv de traducción. Los PRs son bienvenidos en GitHub.", "designer": "Diseñador — mejoras de UI, iconos, capturas para la documentación.", "ideas": "Ideas — abre un hilo en GitHub Discussions antes de abrir una incidencia de petición de función." diff --git a/web/messages/es/docs/about/faq.json b/web/messages/es/docs/about/faq.json index 404377e6..834d8ffa 100644 --- a/web/messages/es/docs/about/faq.json +++ b/web/messages/es/docs/about/faq.json @@ -1,8 +1,8 @@ { "meta": { - "title": "FAQ | ProxMenux Documentation", + "title": "Preguntas frecuentes | Documentación de ProxMenux", "description": "Preguntas frecuentes sobre ProxMenux: qué es, instalación, compatibilidad (solo PVE 8+), personalización, actualizaciones, seguridad, uso en producción, seguridad de archivos del sistema, contribuir, desinstalación.", - "ogTitle": "FAQ | ProxMenux Documentation", + "ogTitle": "Preguntas frecuentes | Documentación de ProxMenux", "ogDescription": "Preguntas frecuentes sobre instalación, compatibilidad, seguridad y contribución a ProxMenux." }, "header": { @@ -19,12 +19,12 @@ "uninstallLabel": "Desinstalación", "uninstallSuffix": " — eliminación limpia.", "issuesLabel": "GitHub Issues", - "discussionsLabel": "Discussions" + "discussionsLabel": "Discusiones" }, "q1": { "question": "¿Qué es ProxMenux y para qué sirve?", "p1Rich": "ProxMenux es una herramienta interactiva basada en menús diseñada para hacer Proxmox VE accesible a todos los usuarios, independientemente de su experiencia técnica. Simplifica la ejecución de comandos, permitiendo a los usuarios realizar acciones en su sistema sin necesidad de conocimientos avanzados de Linux.", - "p2": "Para usuarios menos experimentados, ProxMenux ofrece una forma intuitiva de ejecutar comandos mediante una interfaz de menús estructurada, reduciendo la necesidad de entrada manual por terminal. Para administradores con experiencia, recorta pulsaciones para flujos repetitivos (hardening post-instalación, passthrough de GPU, importación de VMs OVF, rotaciones de snapshots ZFS).", + "p2": "Para quienes tienen menos experiencia, ProxMenux ofrece menús estructurados que reducen la necesidad de escribir comandos a mano. A los administradores con experiencia les ahorra pasos en tareas repetitivas: reforzar la seguridad tras instalar, pasar una GPU, importar VM en formato OVF o gestionar la rotación de snapshots ZFS.", "p3": "Proxmox VE se usa ampliamente para:", "items": [ "Virtualización de nivel empresarial", @@ -34,7 +34,7 @@ }, "q2": { "question": "¿Cómo instalo ProxMenux?", - "p1Rich": "Sigue la guía de instalación. En corto:", + "p1Rich": "Sigue la guía de instalación. En resumen:", "stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"", "p2": "Una vez instalado, simplemente arráncalo con:", "menuCmd": "menu" @@ -45,7 +45,7 @@ }, "q4": { "question": "¿Puedo personalizar ProxMenux?", - "p1Rich": "Los scripts del núcleo no se pueden modificar directamente porque están alojados en GitHub y se refrescan con el flujo de auto-actualización. Lo que sí puedes personalizar:", + "p1Rich": "Las actualizaciones pueden sobrescribir los cambios locales en los scripts principales, así que evita editar esos archivos directamente. Lo que sí puedes personalizar:", "items": [ "El banner de la consola vía la herramienta FastFetch en las opciones de post-instalación.", "Qué componentes opcionales se instalan (Monitor, Fail2Ban, Lynis…) — elige durante la instalación o vía el menú correspondiente más tarde." @@ -53,8 +53,8 @@ }, "q5": { "question": "¿Cómo actualizo ProxMenux?", - "p1Rich": "Cuando hay una nueva versión disponible, ProxMenux la detecta en el siguiente lanzamiento de menu y te pide actualizar. Aceptar reemplaza los archivos de utilidad y las configuraciones en sitio. No hace falta descarga manual.", - "p2Rich": "Los usuarios estables reciben releases estables; los usuarios beta reciben releases beta. Cuando se publica una versión estable, ProxMenux notifica a los usuarios beta en el siguiente lanzamiento y ofrece cambiar automáticamente — mira la página del programa beta." + "p1Rich": "Cuando hay una nueva versión, ProxMenux la detecta la próxima vez que ejecutas menu y te propone actualizar. Si aceptas, sustituye los archivos de la herramienta y su configuración en la instalación existente; no necesitas descargar nada a mano.", + "p2Rich": "Los usuarios de la versión estable reciben las actualizaciones estables y los de la beta, las actualizaciones beta. Cuando se publica una versión estable, la beta avisa al volver a abrir el menú y ofrece cambiar automáticamente a la estable. Consulta el programa beta." }, "q6": { "question": "¿Dónde puedo reportar incidencias?", @@ -63,19 +63,19 @@ }, "q7": { "question": "¿Puedo contribuir a ProxMenux?", - "p1Rich": "Absolutamente. ProxMenux es de código abierto y colaborativo. Las contribuciones pueden ser código (bash, Next.js / TypeScript, el venv de Python de traducción), pruebas, documentación, diseño o simplemente ideas.", + "p1Rich": "Por supuesto. ProxMenux es un proyecto de código abierto y colaborativo. Puedes contribuir con código (Bash, Next.js/TypeScript y herramientas de traducción en Python), pruebas, documentación, diseño o ideas.", "item1Rich": "Discute ideas en GitHub Discussions antes de abrir una petición de función.", "item2Rich": "Para PRs, lee primero el código de conducta y buenas prácticas.", "item3Rich": "Mira la página de colaboradores para los testers y revisores actuales." }, "q8": { "question": "¿ProxMenux modifica archivos críticos del sistema?", - "p1Rich": "No. ProxMenux instala:", - "item1Rich": "Dependencias vía apt: dialog, curl, jq, git (y python3 + googletrans en la instalación con traducción).", + "p1Rich": "La instalación de ProxMenux añade los siguientes componentes.", + "item1Rich": "Dependencias mediante apt: dialog, curl, jq y git. Las traducciones usan catálogos JSON pregenerados; el instalador no añade al host un entorno virtual de traducción.", "item2Rich": "El árbol de scripts en /usr/local/share/proxmenux/.", "item3Rich": "El lanzador en /usr/local/bin/menu.", "item4Rich": "Opcional: el servicio systemd del Monitor en proxmenux-monitor.service.", - "p2Rich": "ProxMenux no toca la configuración del núcleo de Proxmox a menos que se lo pidas explícitamente vía un menú dedicado (p. ej. el flujo de reparación de red edita /etc/network/interfaces — pero solo después de que confirmes y se haga un backup)." + "p2Rich": "ProxMenux no modifica la configuración principal de Proxmox salvo que lo solicites expresamente desde un menú específico. Por ejemplo, la reparación de red edita /etc/network/interfaces, pero solo después de tu confirmación y de crear una copia de seguridad." }, "q9": { "question": "¿Es seguro usar ProxMenux en producción?", @@ -83,12 +83,12 @@ }, "q10": { "question": "¿Cómo desinstalo ProxMenux?", - "p1Rich": "Desde dentro de ProxMenux: Settings → Desinstalar ProxMenux. El desinstalador elimina el árbol de scripts, el lanzador y el servicio del Monitor, opcionalmente elimina las dependencias seleccionadas y restaura los backups de /root/.bashrc y /etc/motd tomados en el momento de la instalación.", + "p1Rich": "Desde ProxMenux: Configuración → Desinstalar ProxMenux. El desinstalador elimina el árbol de scripts, el lanzador y el servicio Monitor, permite eliminar dependencias seleccionadas y restaura /root/.bashrc y /etc/motd desde las copias de la instalación, si existen.", "p2Rich": "Paso a paso completo: Desinstalar ProxMenux." }, "q11": { "question": "VirusTotal marca la URL de instalación — ¿es seguro?", - "p1Rich": "Una detección 1/95 por motores heurísticos (p. ej. Chong Lua Dao) es un falso positivo conocido. El instalador usa el patrón estándar curl | bash y descarga binarios legítimos (como jq desde su release oficial en GitHub), que los escáneres agresivos marcan basándose en el comportamiento y no en código realmente malicioso.", + "p1Rich": "El resultado de 1/95 notificado en el issue #162, de Chong Lua Dao, fue identificado por el mantenedor como un falso positivo. El instalador usa el patrón curl | bash y puede descargar jq desde su versión oficial de GitHub. Este comportamiento puede activar análisis heurísticos; aquel informe histórico no determina la seguridad de futuras descargas.", "p2Rich": "ProxMenux es 100% código abierto y el script de instalación es revisable línea por línea: install_proxmenux.sh. Más contexto en la Issue #162." } } diff --git a/web/messages/es/docs/about/index.json b/web/messages/es/docs/about/index.json index e0ca4406..058cc210 100644 --- a/web/messages/es/docs/about/index.json +++ b/web/messages/es/docs/about/index.json @@ -1,8 +1,8 @@ { "meta": { - "title": "Acerca de | ProxMenux Documentation", + "title": "Acerca del proyecto | Documentación de ProxMenux", "description": "Acerca de ProxMenux: objetivos del proyecto, colaboradores, FAQ y código de conducta. Herramienta de gestión basada en menús, de código abierto, para Proxmox VE 8+, construida y mantenida por MacRimi con un pequeño equipo de testers y colaboradores.", - "ogTitle": "Acerca de | ProxMenux Documentation", + "ogTitle": "Acerca del proyecto | Documentación de ProxMenux", "ogDescription": "Acerca de ProxMenux — herramienta de gestión basada en menús, de código abierto, para Proxmox VE 8+." }, "header": { @@ -27,7 +27,7 @@ "icon": "Users", "href": "/docs/about/contributors", "title": "Colaboradores", - "description": "Reconocimiento a las personas que hacen posible ProxMenux — testers, revisores y desarrolladores que dan forma a cada release." + "description": "Reconocimiento a las personas que hacen posible ProxMenux: quienes prueban, revisan y desarrollan cada versión." }, { "icon": "ScrollText", @@ -38,7 +38,7 @@ ] }, "involved": { - "heading": "Implicarse", + "heading": "Participa", "intro": "Tres lugares para participar en el proyecto:", "cards": [ { diff --git a/web/messages/fr/docs/about/code-of-conduct.json b/web/messages/fr/docs/about/code-of-conduct.json new file mode 100644 index 00000000..4842f6b2 --- /dev/null +++ b/web/messages/fr/docs/about/code-of-conduct.json @@ -0,0 +1,13 @@ +{ + "meta": { + "title": "Code de conduite | Documentation ProxMenux", + "description": "Code de conduite et bonnes pratiques de ProxMenux pour les contributeurs, les testeurs et les utilisateurs.", + "ogTitle": "Code de conduite | Documentation ProxMenux", + "ogDescription": "Attentes concernant la responsabilité du code, le signalement des vulnérabilités et le périmètre des PR du projet ProxMenux." + }, + "errors": { + "notFound": "Erreur : fichier CODE_OF_CONDUCT.md introuvable.", + "loadFailed": "Erreur : Impossible de charger le contenu du Code de conduite." + }, + "contentMarkdown": "# 📝 Code de conduite et bonnes pratiques\n\nCe document définit les **principes et les consignes** d’utilisation de **ProxMenux**, afin de promouvoir le **respect, la collaboration et la sécurité** dans le développement.\n\n## 📌 1. Attribution du code et reconnaissance\n\n- Si des **scripts, extraits de code ou idées** proviennent d’autres dépôts ou développeurs, leur auteur d’origine sera toujours cité.\n- Un commentaire dans le code ou la documentation indiquera la source et, si possible, un lien vers le dépôt original.\n- Lors de l’utilisation de code soumis à une **licence** particulière, ses conditions doivent être respectées.\n\n### ✅ Exemple d’attribution correcte dans le code :\n\n```bash\n# Script fondé sur le travail de [Auteur] dans [Lien du dépôt]\n```\n\n## 🔒 2. Sécurité et responsabilité du code\n\n- Tout le code de ce dépôt suit les bonnes pratiques de développement sécurisé.\n- Les contributions introduisant volontairement des vulnérabilités ou des pratiques dangereuses sont interdites.\n- Les scripts ne doivent jamais compromettre la sécurité du système ni les données des utilisateurs.\n- Avant leur mise en œuvre, les contributions doivent être examinées pour vérifier leur sécurité et leur stabilité.\n\n### ⚠️ Divulgation responsable des vulnérabilités\n\nSi vous découvrez une vulnérabilité de sécurité, ne la signalez PAS dans des issues ou forums publics.\n\nSignalez-la plutôt en privé par e-mail :\n\n📧 proxmenux@macrimi.pro\n\nPour en savoir plus sur les vulnérabilités et leur signalement, consultez notre [politique de sécurité](./SECURITY.md).\n\n## 🤝 3. Règles de la communauté\n\nPour maintenir un cadre respectueux et professionnel, tous les utilisateurs doivent suivre ces règles :\n\n- ✅ Restez respectueux et constructifs dans les discussions.\n- ❌ Le harcèlement, les propos haineux et les comportements offensants ne seront pas tolérés.\n- ✅ Formulez vos retours de manière professionnelle, sans attaques personnelles.\n- ❌ Les manquements peuvent entraîner des avertissements ou des exclusions selon leur gravité.\n\n##\n\nCe document encourage un usage éthique du code, la vigilance en matière de sécurité et une communauté respectueuse.\n\n📢 Construisons ensemble quelque chose de remarquable !\n" +} diff --git a/web/messages/fr/docs/about/contributing.json b/web/messages/fr/docs/about/contributing.json new file mode 100644 index 00000000..6b46bd4c --- /dev/null +++ b/web/messages/fr/docs/about/contributing.json @@ -0,0 +1,293 @@ +{ + "meta": { + "title": "Contribution à ProxMenux | ProxMenux Documentation", + "description": "Comment contribuer à ProxMenux : modèle de branches (main / develop / feature/*), processus de pull request, en-tête de script avec attribution et lien de soutien facultatif, interface en deux phases, fonctions de message et passage d’une branche de fonctionnalité à une version stable.", + "ogTitle": "Contribuer à ProxMenux", + "ogDescription": "Modèle de branches, processus, attribution dans l’en-tête et règle d’interface en deux phases à respecter pour contribuer." + }, + "header": { + "title": "Contribuer à ProxMenux", + "description": "ProxMenux accueille les contributions de la communauté : nouveaux scripts, corrections, amélioration des dialogues, traductions et intégrations. Cette page présente la structure du dépôt, le modèle de branches, le processus de pull request, l’en-tête avec attribution et lien de soutien facultatif, ainsi que les conventions à respecter.", + "section": "À propos" + }, + "twoPagesCallout": { + "title": "Deux pages connexes, un projet", + "body": "Ne confondez pas cette page avec Contributeurs, qui met à l’honneur les testeurs, relecteurs et développeurs déjà impliqués. Cette page s’adresse à vous, futur contributeur, et explique comment préparer une pull request en vue de son intégration." + }, + "branching": { + "heading": "Modèle de branchement", + "intro": "ProxMenux utilise un modèle de branchement à trois niveaux :", + "headerBranch": "Branche", + "headerPurpose": "Objet", + "rows": [ + { + "branch": "main", + "purposeRich": "Code stable, prêt pour la production. Seules les modifications prêtes à être publiées sont intégrées ici. C’est la version obtenue lors d’une installation normale de ProxMenux." + }, + { + "branch": "develop", + "purposeRich": "Branche de développement actif : tous les nouveaux changements y sont intégrés en premier. Elle correspond au canal « bêta ». Lorsqu’une version stable est prête, elle est publiée dans main à partir de cette branche." + }, + { + "branch": "feature/*", + "purposeRich": "Branches temporaires pour une fonctionnalité, une correction ou une amélioration. Créées à partir de develop, puis fusionnées dans develop par pull request après relecture." + } + ], + "calloutTitle": "Ce que cela signifie pour les utilisateurs", + "calloutBody": "Les utilisateurs qui suivent main reçoivent des versions testées. Ceux qui souhaitent les nouveautés plus tôt et acceptent quelques imperfections peuvent suivre develop. Les nouvelles fonctions passent toujours d’abord par develop ; rien n’arrive dans main sans ce cycle." + }, + "workflow": { + "heading": "Processus de pull request", + "intro": "De l'idée à la version fusionnée en cinq étapes:", + "step1Lead": "Créer une branche de fonction à partir de develop:", + "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": "Utilisez un nom descriptif de branche : feature/zfs-arc-tuning, feature/fix-iommu-detection, feature/add-tailscale-script.", + "step2Lead": "Travailler sur vos changements et pousser la branche:", + "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": "Ouvrez une pull request vers develop, pas vers main. Vérifiez sur GitHub que la branche de base est develop. Décrivez le rôle du script, ses modifications et les versions de Proxmox VE utilisées pour les tests.", + "step4": "Après relecture, les modifications sont fusionnées dans develop. Un responsable vérifie le code, les conventions d’en-tête et la règle d’interface en deux phases. S’il demande des corrections, envoyez de nouveaux commits dans la même branche : la PR se met à jour automatiquement.", + "step5": "Les versions stables passent de develop à main. Lors d’une publication, main est avancée jusqu’à develop par fast-forward, puis étiquetée. Votre contribution entre dans la prochaine version stable." + }, + "scriptHeader": { + "heading": "En-tête de script — métadonnées et description", + "intro": "Chaque script de ProxMenux s'ouvre avec deux blocs de commentaires adjacents qui forment ensemble l'en-tête. Ils sont tous les deux requis — ensemble, ils font savoir à tout lecteur qui a écrit le script et ce qu'il fait, le tout sans ouvrir le code lui-même.", + "bullets": [ + "Bloc supérieur : métadonnées. Auteur, liens GitHub/de soutien facultatifs, responsable, copyright, licence, version et date de mise à jour. C’est aussi la reconnaissance des contributeurs : pour un nouveau script, ajoutez votre nom et, si vous le souhaitez, votre page GitHub et un profil de soutien tel que Ko-fi, GitHub Sponsors ou Buy Me a Coffee.", + "Bloc inférieur : description. Un court paragraphe en anglais simple explique le rôle du script. Il se lit avant le code et doit se suffire à lui-même : objectif, actions principales, ressources concernées et prérequis." + ], + "licenseCalloutTitle": "La ligne de licence est fixe — GPL-3.0", + "licenseCalloutBody": "ProxMenux est publié sous la licence publique générale GNU v3.0. Chaque script du projet est livré sous cette même licence; la ligne License dans l'en-tête est toujours la référence GPL-3.0 montrée dans l'exemple ci-dessous — ce n'est pas un choix par script. En contribuant un script, vous acceptez de le publier sous GPL-3.0, ce qui signifie que n'importe qui peut le lire, le modifier et le redistribuer (y compris les modifications) tant qu'ils le conservent sous la même licence. Le texte entier vit à MacRimi/ProxMenux/LICENSE.", + "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": "Les lignes GitHub et Sponsor sont optionnelles — laissez-les dehors si vous ne voulez pas les publier. Tout le reste est nécessaire.", + "whyCalloutTitle": "Pourquoi cela est important", + "whyCalloutBody": "Contribuer à l’open source est un travail bénévole. Le nom et le lien de soutien éventuel dans le code rendent l’auteur visible à chaque lecture, au lieu de le cacher derrière le projet. La description a un autre rôle : c’est la première chose qu’un futur responsable ou utilisateur curieux lit. Sa clarté détermine souvent si le script inspire confiance ou est évité." + }, + "structure": { + "heading": "Structure du projet", + "intro": "Où chaque type de script vit dans le dépôt :", + "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": "Chaque script charge utils.sh au démarrage avec source pour obtenir les fonctions de message, l’indicateur d’attente, les couleurs et le système de traduction. Les bibliothèques communes dans scripts/global/ sont chargées explicitement par les scripts qui les utilisent." + }, + "twoPhase": { + "heading": "La règle de conception de l’interface en deux phases", + "intro": "C’est la convention la plus importante de ProxMenux et celle qui entraîne le plus souvent des demandes de correction dans les PR. Chaque script est divisé en exactement deux phases :", + "headerPhase": "Phase", + "headerPurpose": "Objet", + "headerScreen": "État de l'écran", + "rows": [ + { + "phaseRich": "Phase 1 — Sélection", + "purposeRich": "Recueillir chaque décision de l'utilisateur. Effectuer tout travail préparatoire nécessaire (sondes, scans, vérifications).", + "screenRich": "dialog superpositions. Si une sonde entre deux menus prend plus d'une seconde ou deux, montrez un spinner msg_info afin que l'utilisateur sache que le script n'a pas gelé, puis appelez stop_spinner juste avant la boîte de dialogue suivante." + }, + { + "phaseRich": "Phase 2 — Exécution", + "purposeRich": "Exécutez toutes les opérations. Affichez l'historique complet des progrès accumulés à l'écran.", + "screenRich": "Messages visibles msg_info / msg_ok; jamais dialog." + } + ], + "principle": "Le principe: collecte tout d'abord, puis exécute tout. L'utilisateur voit un menu de dialogue propre (phase 1), puis une vue d'exécution propre (phase 2). Pas de mélange — pas de dialogue apparaissant au milieu de l'exécution, pas de bruit de progression pendant la sélection.", + "phase1Heading": "Phase 1 — modèle typique", + "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": "Règles pour la phase 1:", + "phase1Rules": [ + "Si un spinner msg_info est en cours d'exécution et que vous devez ouvrir un menu dialog ou whiptail, appelez d'abord stop_spinner — le spinner ne peut pas coexister avec la superposition dessinée par l'un ou l'autre des outils. Si aucun spinner n'est actif, vous n'avez pas besoin de l'appeler.", + "Utilisez show_proxmenux_logo + msg_title + msg_info pour donner un contexte visuel à une opération longue en phase 1, par exemple une vérification de plus de cinq secondes. La fonction efface déjà l’écran : n’appelez pas clear avant.", + "N'appelez pas show_proxmenux_logo entre les menus de dialogue où il n'y a rien à afficher — le nettoyage de l'écran pour un terminal vide n'est que du bruit visuel.", + "Conservez toutes les décisions et les résultats de la sonde dans des variables ou des tableaux parallèles. La récapitulation visible se produit au début de la phase 2, pas dans la phase 1." + ], + "phase2Heading": "Phase 2 — modèle typique", + "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": "Règles pour la phase 2: toujours commencer avec show_proxmenux_logo + msg_title; récapituler immédiatement les résultats de la phase 1 sous la forme de lignes msg_ok; n'appelez plus jamais show_proxmenux_logo (il effacerait les progrès accumulés); n'appelez jamais dialog dans la phase 2 — si une décision d'exécution est vraiment inévitable, utilisez whiptail (voir la section suivante)." + }, + "dialogVsWhiptail": { + "headingRich": "Quand utiliser dialog vs whiptail", + "intro": "Les deux outils dessinent des interfaces utilisateur en mode texte, mais ils se comportent très différemment à l'écran — et ProxMenux les utilise en deux phases distinctes pour une raison.", + "headerTool": "Outil", + "headerWhen": "Quand l'utiliser", + "headerEffect": "Effet sur l'écran", + "rows": [ + { + "toolRich": "dialog", + "whenRich": "Toujours dans la phase 1. Chaque sélection interactive — choisir un VM, un disque, un système de fichiers, confirmer une action — utilise dialog. C'est l'outil d'interface utilisateur par défaut de ProxMenux.", + "effectRich": "Prend le contrôle du terminal : efface l’écran, dessine son interface et rétablit l’état précédent à la fermeture. Cela convient à la phase 1, où aucun résultat utile n’est encore affiché." + }, + { + "toolRich": "whiptail", + "whenRich": "Seulement en phase 2, en cas de nécessité. Le cas typique est la proposition de redémarrage en fin d’exécution. N’utilisez pas whiptail pour demander « continuer ? » en cours d’exécution : cette décision devait être prise en phase 1.", + "effectRich": "Interface plus légère qui n’efface pas le contexte du terminal. L’historique msg_ok/msg_info de la phase 2 reste visible derrière la boîte de dialogue. Elle convient donc lorsque la progression est déjà affichée." + } + ], + "calloutTitle": "Pourquoi la scission est importante", + "calloutBody": "Si vous appelez dialog au milieu de la phase 2, chaque ligne msg_ok que l'utilisateur regarde disparaît. Vous effacez la piste de vérification. whiptail évite cela. Donc la règle n'est pas arbitraire — il s'agit de préserver la vision de l'utilisateur de ce que le script a fait jusqu'ici.", + "rebootHeading": "Proposition de redémarrage : le cas type de whiptail en phase 2", + "rebootIntro": "Si un script peut nécessiter un redémarrage après l’activation d’IOMMU ou la modification du noyau, la question de fin de phase 2 utilise whiptail. Prévoyez toujours une branche « Non » avertissant de ne pas utiliser la ressource concernée avant le redémarrage :", + "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": "Référence des fonctions du message", + "intro": "Toutes sont définies dans utils.sh. Utilisez-les par défaut pour les sorties visibles afin de garder une présentation cohérente entre scripts. Si une fonction manque, par exemple un niveau de sévérité ou un outil de mise en page, proposez-la dans votre pull request. Elle sera examinée et ajoutée à utils.sh si elle est utile à plusieurs scripts.", + "headerFunction": "Fonction", + "headerWhen": "Quand utiliser", + "headerSpinner": "Indicateur de progression", + "rows": [ + { + "function": "msg_info \"text\"", + "whenRich": "Opération en cours.", + "spinner": "Démarre" + }, + { + "function": "stop_spinner", + "whenRich": "Fin des travaux préparatoires silencieux dans la phase 1 — tue spinner, efface la ligne.", + "spinner": "Arrête" + }, + { + "function": "msg_ok \"text\"", + "whenRich": "Opération réussie. À utiliser aussi pour une fonction activée, même si un redémarrage reste nécessaire.", + "spinner": "Arrête" + }, + { + "function": "msg_warn \"text\"", + "whenRich": "Avertissement réel ou état dégradé.", + "spinner": "Arrête" + }, + { + "function": "msg_error \"text\"", + "whenRich": "Erreur fatale.", + "spinner": "Arrête" + }, + { + "function": "msg_info2 \"text\"", + "whenRich": "Conseil sans blocage, dans une ligne d’information cyan.", + "spinner": "Arrête" + }, + { + "function": "msg_success \"text\"", + "whenRich": "Message final « Appuyez sur Entrée pour revenir » en fin de phase 2.", + "spinner": "Arrête" + }, + { + "function": "msg_title \"text\"", + "whenRich": "Titre gras avec espacement intégré. Utilisé au début de la phase 2.", + "spinner": "—" + }, + { + "function": "show_proxmenux_logo", + "whenRich": "Efface l’écran et affiche le logo. À appeler une seule fois au début de la phase 2.", + "spinner": "—" + } + ] + }, + "dialogConventions": { + "heading": "conventions de dialogue", + "bullets": [ + "Passez toujours --backtitle \"$BACKTITLE\" à chaque appel dialog et whiptail. $BACKTITLE est toujours \"ProxMenux\" — réglé une fois à l'en-tête du script et jamais dépassé. L'utilisateur doit toujours voir le nom du projet comme le contexte de cadrage, jamais le propre titre du script.", + "Enveloppez toujours les titres et les messages avec $(translate \"...\").", + "Redirige toujours la sortie dialog avec 2>&1 >/dev/tty — le stdout capturé devient la sélection de l'utilisateur, tandis que la boîte de dialogue elle-même s'appuie sur le terminal.", + "Utilisez les variables standard de dimension UI ($UI_MENU_H, $UI_MSG_W, etc.) pour un calibrage cohérent entre les scripts.", + "Vérifiez toujours les choix vides ou annulés et gérez-les proprement." + ], + "exampleIntro": "Exemple complet — construire un menu de sélection VM et gérer l'annulation:", + "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": "Politique de traduction", + "intro": "Toutes les chaînes visibles par l'utilisateur doivent être enveloppées avec la fonction translate. ProxMenux les traduit automatiquement dans toutes les langues prises en charge — vous écrivez l'anglais, l'utilisateur lit leur langue maternelle.", + "code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...", + "bullets": [ + "Écrivez les chaînes en anglais : la traduction est gérée automatiquement lors du build.", + "Rédigez des chaînes concises. Évitez si possible les variables dans de longues phrases.", + "Ne traduisez pas les noms de variables, chemins ou identifiants techniques." + ] + }, + "variableStyle": { + "heading": "Conventions de variables et de style", + "bullets": [ + "Utilisez UPPER_CASE pour les variables de niveau script.", + "Utiliser lower_case pour les variables de fonction locales (déclarer avec local).", + "Entourez les expansions de variables de guillemets : \"$VAR\", pas $VAR.", + "Utiliser [[ ]] pour les conditions, et non [ ] (sauf lorsque POSIX est nécessaire).", + "show_proxmenux_logo est le moyen prévu pour effacer l’écran : il le nettoie et affiche le logo du projet pour conserver un contexte visuel. Appelez-le une fois au début de la phase 2, et éventuellement avant une longue attente en phase 1." + ], + "standardNamesIntro": "Noms de variables standard dans l'ensemble du projet :", + "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": "Réorienter la sortie de l'outil pendant la phase 2", + "redirectIntro": "La phase 2 affiche un journal de lignes msg_info → msg_ok. Si un outil appelé, comme apt, mkfs, qm, pct ou dd, écrit sur stdout/stderr, sa sortie fait défiler les messages et brouille la présentation. L’utilisateur ne distingue plus la progression du script des détails produits par l’outil.", + "withoutRedirectIntro": "Sans redirection — ce que l'utilisateur voit si vous ne manipulez pas le bruit:", + "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": "Avec redirection — à quoi ressemble la même opération lorsque le bruit est envoyé ailleurs:", + "withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.", + "twoPatternsIntro": "Deux modèles à choisir :", + "discardLead": "Éliminez la sortie lorsque vous n'en avez pas besoin — plus rapide et plus simple:", + "discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1", + "logLead": "Envoyez la sortie à un fichier journal lorsque vous voudrez peut-être l'inspecter plus tard (débogage d'une installation échouée, vérification de ce que dpkg a fait réellement). C'est le modèle préféré pour toute opération apt:", + "logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1", + "referenceOutro": "Le script scripts/global/update-pve9_2.sh est une implémentation de référence — chaque appel apt-get envoie une sortie vers un fichier journal de sorte que l'utilisateur ne voit que le flux propre msg_info → msg_ok, tandis que le journal sur le disque vous permet de reconstruire exactement ce qu'apt a fait si quelque chose tourne mal." + }, + "dosAndDonts": { + "heading": "Faites et ne faites pas", + "doHeading": "✅ À faire", + "doBullets": [ + "stop_spinner avant un dialog dans la phase 1 seulement quand un spinner msg_info est en cours d'exécution.", + "La phase 2 commence par show_proxmenux_logo + msg_title + msg_ok pour récapituler les résultats de la phase 1.", + "Utilisez msg_ok pour des fonctionnalités activées avec succès, même si un redémarrage est nécessaire.", + "Utilisez le whiptail (et non le dialog) pour toute invitation après exécution qui doit apparaître dans la phase 2.", + "Prévoyez toujours une branche « Non » dans les dialogues de redémarrage pour avertir de ne pas démarrer la ressource concernée avant le redémarrage.", + "Protégez la logique VM uniquement en vérifiant [[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]] — les contrôleurs et NVMe PCIe ne peuvent pas être ajoutés aux conteneurs LXC.", + "Utiliser ensure_repositories de utils-install-functions.sh au lieu de apt-get update inconditionnel.", + "Utiliser des tableaux parallèles dans la phase 1 lorsque chaque élément nécessite plusieurs dialogues." + ], + "dontHeading": "❌ À éviter", + "dontBullets": [ + "Appelez dialog alors qu'un spinner est actif.", + "Passez la récapitulation de la phase 1 au début de la phase 2.", + "Appelez show_proxmenux_logo une deuxième fois — il efface tout ce que la phase 2 a imprimé.", + "Utiliser dialog dans la phase 2 (utiliser whiptail pour le cas inévitable rare).", + "Utiliser clear seul.", + "Enveloppez msg_title dans des lignes vierges echo \"\" — il inclut déjà l'espacement.", + "Utilisez msg_warn pour signaler une fonctionnalité activée avec succès — c'est un msg_ok.", + "Exécuter sans condition apt-get update — utiliser ensure_repositories." + ] + }, + "submitting": { + "heading": "Soumettre votre contribution", + "steps": [ + "Créez un fork de MacRimi/ProxMenux sur GitHub, puis clonez votre fork.", + "Créer une branche feature/* à partir de develop (voir Modèle de branchage ci-dessus).", + "Suivez ce guide pour tout script nouveau ou modifié. Écrivez l'en-tête avec votre nom; ajoutez la ligne de sponsor optionnelle si vous voulez.", + "Testez le script sur une véritable instance Proxmox VE : phase 1 avec toutes les branches de dialogue, et phase 2 avec chaque opération et son retour arrière propre en cas d’erreur.", + "Ouvrez une pull request vers develop avec une description claire : rôle du script, changements et version Proxmox VE utilisée pour les tests.", + "Assurez-vous que votre contribution respecte le Code de conduite." + ], + "securityOutro": "Pour les questions sensibles à la sécurité, suivez le flux de divulgation dans SECURITY.md plutôt que d'ouvrir une question publique." + }, + "whereNext": { + "heading": "Où aller ensuite", + "items": [ + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md", + "label": "CONTRIBUTING.md (guide complet)", + "tail": "— la source de vérité pour chaque convention, y compris les modèles matériels avancés." + }, + { + "kind": "internal", + "href": "/docs/about/contributors", + "label": "Contributeurs", + "tail": " — les personnes dont le travail a façonné les versions de ProxMenux. Il s’agit d’une autre page." + }, + { + "kind": "internal", + "href": "/docs/about/code-of-conduct", + "label": "Code de conduite", + "tail": "— les normes que chaque contributeur accepte de respecter." + }, + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/discussions", + "label": "GitHub Discussions", + "tail": "— demander avant de construire si vous n'êtes pas sûr si une idée correspond, ou de trouver des collaborateurs sur une fonctionnalité plus grande." + } + ] + } +} diff --git a/web/messages/fr/docs/about/contributors.json b/web/messages/fr/docs/about/contributors.json new file mode 100644 index 00000000..47f3e6f5 --- /dev/null +++ b/web/messages/fr/docs/about/contributors.json @@ -0,0 +1,38 @@ +{ + "meta": { + "title": "Contributeurs | Documentation ProxMenux", + "description": "Un hommage aux personnes qui rendent ProxMenux possible : testeurs, relecteurs et développeurs qui contribuent à chaque version.", + "ogTitle": "Contributeurs | Documentation ProxMenux", + "ogDescription": "Rencontrez les contributeurs derrière ProxMenux." + }, + "header": { + "title": "Contributeurs", + "description": "Le projet ProxMenux grandit grâce à ses contributeurs. Cette page reconnaît leur travail : tester les versions avant leur publication, détecter les régressions, examiner les PR et orienter les nouvelles fonctionnalités.", + "section": "À propos" + }, + "beyond": { + "title": "Au-delà de cette liste", + "body": "De nombreuses autres personnes contribuent en signalant des bugs, en proposant des fonctionnalités dans Discussions, en testant les versions bêta ou en traduisant le projet. La liste complète des contributeurs au code figure dans le graphique des contributeurs GitHub. La page ci-dessous met en avant les personnes les plus actives dans les tests et la vérification des versions de ProxMenux." + }, + "testers": { + "heading": "Testeurs et évaluateurs", + "intro": "Ces personnes ont été parmi les premières à contribuer au projet. Leurs tests, signalements de problèmes et suggestions ont aidé ProxMenux à devenir ce qu’il est aujourd’hui.", + "roles": { + "testing": "Tests", + "testingReviewer": "Tests et relecture" + }, + "youtube": "YouTube" + }, + "contribute": { + "heading": "Vous voulez contribuer ?", + "intro": "Toute contribution est la bienvenue — code, test, conception, documentation, ou tout simplement partager vos idées:", + "tester": "Testeur — essayez le canal bêta et signalez ce qui fonctionne ou non avant la publication des versions stables.", + "developer": "Développeur — Bash, Next.js (TypeScript) et un peu de Python pour l’environnement virtuel de traduction (venv). Les PR sont les bienvenues sur GitHub.", + "designer": "Designer — Améliorations de l'interface utilisateur, icônes, captures d'écran pour la documentation.", + "ideas": "Idées — ouvrez un sujet dans GitHub Discussions avant de créer une issue pour demander une fonctionnalité." + }, + "coc": { + "title": "Lisez d'abord le Code de conduite", + "body": "Avant de proposer du code ou de signaler un problème, lisez le Code de conduite et les bonnes pratiques. Il précise les attentes sur la responsabilité du code, le signalement des vulnérabilités et le périmètre des PR." + } +} diff --git a/web/messages/fr/docs/about/faq.json b/web/messages/fr/docs/about/faq.json new file mode 100644 index 00000000..af1d0db6 --- /dev/null +++ b/web/messages/fr/docs/about/faq.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Questions fréquentes | Documentation ProxMenux", + "description": "Questions fréquentes sur ProxMenux : présentation, installation, compatibilité à partir de PVE 8, personnalisation, mises à jour, sécurité, utilisation en production, fichiers système, contributions et désinstallation.", + "ogTitle": "Questions fréquentes | Documentation ProxMenux", + "ogDescription": "Questions fréquentes sur l’installation de ProxMenux, sa compatibilité, sa sécurité et les façons de contribuer." + }, + "header": { + "title": "Foire aux questions", + "description": "Questions courantes sur ProxMenux : présentation, public visé, installation, mise à jour, désinstallation, compatibilité, personnalisation, sécurité et contributions. Si votre question n’est pas ici, consultez GitHub Discussions ou ouvrez une issue.", + "section": "À propos" + }, + "quickLinks": { + "title": "Liens rapides", + "installationLabel": "Installation", + "installationSuffix": "— la commande d'installation en une seule ligne + dépendances.", + "introductionLabel": "Présentation", + "introductionSuffix": " — ce que fait ProxMenux, en cinq minutes.", + "uninstallLabel": "Désinstaller", + "uninstallSuffix": " — désinstallation propre.", + "issuesLabel": "GitHub Issues", + "discussionsLabel": "Discussions" + }, + "q1": { + "question": "Qu'est-ce que ProxMenux et dans quel cas est-il utilisé?", + "p1Rich": "ProxMenux est un outil interactif à menus qui rend Proxmox VE accessible à tous, quel que soit le niveau technique. Il simplifie l’exécution des commandes et permet d’agir sur le système sans connaissances avancées de Linux.", + "p2": "Les utilisateurs moins expérimentés exécutent les commandes depuis des menus structurés, avec moins de saisie manuelle dans le terminal. Les administrateurs expérimentés gagnent du temps sur les tâches répétitives : sécurisation après installation, passthrough GPU, importation de VM OVF et rotation des instantanés ZFS.", + "p3": "Proxmox VE est largement utilisé pour:", + "items": [ + "Virtualisation de qualité entreprise", + "HomeLab et solutions cloud personnelles", + "Serveurs multimédias, automatisation et plus encore" + ] + }, + "q2": { + "question": "Comment installer ProxMenux ?", + "p1Rich": "Suivez le guide d’installation. En résumé :", + "stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"", + "p2": "Une fois l’installation terminée, lancez simplement :", + "menuCmd": "menu" + }, + "q3": { + "question": "ProxMenux est-il compatible avec toutes les versions Proxmox ?", + "bodyRich": "Non — ProxMenux nécessite Proxmox VE 8 ou une version ultérieure. PVE 7 et les versions antérieures ne sont pas pris en charge. Passez d’abord de PVE 7 à 8.x en suivant la procédure officielle Proxmox. ProxMenux peut ensuite gérer le passage de 8 à 9 via Utilitaires → Mettre à niveau PVE 8 vers PVE 9." + }, + "q4": { + "question": "Puis-je personnaliser ProxMenux ?", + "p1Rich": "Les mises à jour peuvent écraser les modifications locales des scripts principaux. Évitez donc de modifier directement ces fichiers. Voici ce que vous pouvez personnaliser :", + "items": [ + "La bannière console via l'outil FastFetch dans les options Post-Install.", + "Quels composants optionnels sont installés (Monitor, Fail2Ban, Lynis...) — choisissez lors de l'installation ou via le menu correspondant plus tard." + ] + }, + "q5": { + "question": "Comment mettre à jour ProxMenux?", + "p1Rich": "Lorsqu’une nouvelle version est disponible, ProxMenux la détecte au prochain lancement de menu et propose la mise à jour. Si vous acceptez, les fichiers et la configuration de l’outil sont remplacés dans l’installation existante ; aucun téléchargement manuel n’est nécessaire.", + "p2Rich": "Les utilisateurs de la version stable reçoivent les mises à jour stables, et ceux de la bêta, les mises à jour bêta. Lorsqu’une version stable est publiée, la bêta le signale à la prochaine ouverture du menu et propose de basculer automatiquement. Consultez le programme bêta." + }, + "q6": { + "question": "Où puis-je signaler les problèmes?", + "p1Rich": "Signalez les bogues sur GitHub Issues. Indiquez les étapes pour les reproduire, le message d’erreur et, si nécessaire, la sortie de Monitor obtenue avec journalctl -u proxmenux-monitor -n 50.", + "p2Rich": "Pour les problèmes de sécurité, ne les divulguez pas publiquement. Suivez la procédure de signalement responsable du code de conduite et des bonnes pratiques." + }, + "q7": { + "question": "Puis-je contribuer au ProxMenux?", + "p1Rich": "Bien sûr. ProxMenux est un projet libre et collaboratif. Vous pouvez contribuer au code (Bash, Next.js/TypeScript et outils de traduction en Python), aux tests, à la documentation, au design ou proposer des idées.", + "item1Rich": "Discutez des idées dans GitHub Discussions avant d'ouvrir une demande de fonctionnalité.", + "item2Rich": "Avant de soumettre une pull request, lisez le code de conduite et les bonnes pratiques.", + "item3Rich": "Consultez la page des contributeurs pour connaître les personnes qui participent actuellement aux tests et aux revues." + }, + "q8": { + "question": "Est-ce que ProxMenux modifie les fichiers système critiques?", + "p1Rich": "L’installation de ProxMenux ajoute les composants suivants.", + "item1Rich": "Dépendances via apt : dialog, curl, jq et git. Les traductions utilisent des catalogues JSON préconstruits ; l’installateur n’ajoute aucun environnement virtuel de traduction à l’hôte.", + "item2Rich": "L'arborescence des scripts à /usr/local/share/proxmenux/.", + "item3Rich": "Le lanceur situé dans /usr/local/bin/menu.", + "item4Rich": "En option : le service systemd de Monitor, proxmenux-monitor.service.", + "p2Rich": "ProxMenux ne modifie pas la configuration principale de Proxmox, sauf si vous le demandez explicitement depuis un menu dédié. Par exemple, la réparation du réseau modifie /etc/network/interfaces, mais seulement après votre confirmation et la création d’une sauvegarde." + }, + "q9": { + "question": "Est-il sûr d'utiliser ProxMenux en production?", + "bodyRich": "Oui. ProxMenux ne modifie les fichiers principaux de Proxmox que sur demande explicite et peut donc être utilisé en production. Comme pour toute automatisation, testez d’abord dans un environnement contrôlé et prévoyez des sauvegardes avant les opérations destructives : mise à niveau de PVE 8 vers 9, formatage d’un disque, suppression d’une VM, etc." + }, + "q10": { + "question": "Comment désinstaller ProxMenux ?", + "p1Rich": "Dans ProxMenux : Paramètres → Désinstaller ProxMenux. La désinstallation supprime l’arborescence des scripts, le lanceur et le service Monitor, ainsi que les dépendances sélectionnées si vous le souhaitez. Elle restaure /root/.bashrc et /etc/motd depuis les sauvegardes de l’installation, si elles existent.", + "p2Rich": "Étape par étape : Désinstaller ProxMenux." + }, + "q11": { + "question": "VirusTotal affiche l'URL d'installation — est-ce sûr?", + "p1Rich": "Le résultat de 1/95 attribué à Chong Lua Dao et signalé dans l’issue #162 a été identifié par le mainteneur comme un faux positif. L’installateur utilise le modèle curl | bash et peut télécharger jq depuis sa version officielle sur GitHub. Ce comportement peut déclencher des analyses heuristiques ; ce rapport historique ne préjuge pas de tous les téléchargements futurs.", + "p2Rich": "ProxMenux est entièrement open source. Vous pouvez examiner le script d’installation ligne par ligne : install_proxmenux.sh. Plus de contexte dans l’issue #162." + } +} diff --git a/web/messages/fr/docs/about/index.json b/web/messages/fr/docs/about/index.json new file mode 100644 index 00000000..d0bb7318 --- /dev/null +++ b/web/messages/fr/docs/about/index.json @@ -0,0 +1,67 @@ +{ + "meta": { + "title": "À propos | Documentation ProxMenux", + "description": "À propos de ProxMenux : objectifs du projet, contributeurs, FAQ et code de conduite. Cet outil de gestion open source à menus pour Proxmox VE 8+ est développé et maintenu par MacRimi avec une petite équipe de testeurs et de contributeurs.", + "ogTitle": "À propos | Documentation ProxMenux", + "ogDescription": "À propos de ProxMenux — un outil de gestion open source à menus pour Proxmox VE 8+." + }, + "header": { + "title": "À propos", + "description": "Informations sur le projet, FAQ, contributeurs et code de conduite. ProxMenux est un outil de gestion open source à menus pour Proxmox VE 8+, développé et maintenu par MacRimi avec l’aide d’une petite équipe de testeurs et de contributeurs.", + "section": "À propos" + }, + "callout": { + "title": "Open source, porté par la communauté", + "body": "ProxMenux est distribué sous licence GPL-3.0 et développé publiquement sur GitHub. Chaque script peut être examiné et chaque modification retracée. Les contributions sont les bienvenues : signalements de bugs, idées, code et tests." + }, + "section": { + "heading": "Dans cette section", + "options": [ + { + "icon": "HelpCircle", + "href": "/docs/about/faq", + "title": "FAQ", + "description": "Questions fréquentes : présentation de ProxMenux, installation, compatibilité, personnalisation, mises à jour, sécurité, utilisation en production et désinstallation." + }, + { + "icon": "Users", + "href": "/docs/about/contributors", + "title": "Contributeurs", + "description": "Un hommage aux personnes qui rendent ProxMenux possible : testeurs, relecteurs et développeurs qui contribuent à chaque version." + }, + { + "icon": "ScrollText", + "href": "/docs/about/code-of-conduct", + "title": "Code de conduite", + "description": "Valeurs du projet, attentes en matière de responsabilité du code et lignes directrices en matière de contribution. Lecture obligatoire avant d'ouvrir un PR ou un rapport." + } + ] + }, + "involved": { + "heading": "Participer", + "intro": "Trois endroits pour participer au projet :", + "cards": [ + { + "href": "https://github.com/MacRimi/ProxMenux/issues/new", + "title": "🐛 Signaler un bug", + "description": "GitHub Issues — joignez les journaux et les étapes pour reproduire le problème." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/discussions", + "title": "💡 Proposer une fonctionnalité", + "description": "GitHub Discussions — échangez des idées avant d'ouvrir un PR." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/pulls", + "title": "🔀 Proposer une PR", + "description": "GitHub Pull Requests — lisez d’abord le code de conduite." + } + ] + }, + "support": { + "heading": "Soutenir le projet", + "introRich": "Si ProxMenux vous fait gagner du temps, le moyen le plus simple de le faire découvrir est de donner une ⭐ au dépôt sur GitHub. Pour aller plus loin :", + "kofiLabel": "Soutien sur Ko-fi", + "kofiOutro": "— achète au responsable un café et continue le développement." + } +} diff --git a/web/messages/it/docs/about/code-of-conduct.json b/web/messages/it/docs/about/code-of-conduct.json new file mode 100644 index 00000000..e452eda3 --- /dev/null +++ b/web/messages/it/docs/about/code-of-conduct.json @@ -0,0 +1,13 @@ +{ + "meta": { + "title": "Codice di condotta | Documentazione ProxMenux", + "description": "Codice di condotta e buone pratiche di ProxMenux per collaboratori, tester e utenti.", + "ogTitle": "Codice di condotta | Documentazione ProxMenux", + "ogDescription": "Aspettative sulla responsabilità del codice, sulla segnalazione delle vulnerabilità e sull’ambito delle PR nel progetto ProxMenux." + }, + "errors": { + "notFound": "Errore: file CODE_OF_CONDUCT.md non trovato.", + "loadFailed": "Errore: impossibile caricare il contenuto del codice di condotta." + }, + "contentMarkdown": "# 📝 Codice di condotta e buone pratiche\n\nQuesto documento definisce i **principi e le linee guida** per l’uso di **ProxMenux**, promuovendo **rispetto, collaborazione e sicurezza** nello sviluppo.\n\n## 📌 1. Attribuzione del codice e riconoscimenti\n\n- Se si usano **script, frammenti di codice o idee** di altri repository o sviluppatori, l’autore originale verrà sempre citato.\n- Un commento nel codice o nella documentazione indicherà la fonte e, se possibile, un collegamento al repository originale.\n- Quando si utilizza codice con una **licenza** specifica, occorre rispettarne le condizioni.\n\n### ✅ Esempio di attribuzione corretta nel codice:\n\n```bash\n# Script basato sul lavoro di [Autore] in [Link al repository]\n```\n\n## 🔒 2. Sicurezza e responsabilità del codice\n\n- Tutto il codice di questo repository segue le buone pratiche di sviluppo sicuro.\n- Non sono ammessi contributi che introducano vulnerabilità intenzionali o pratiche non sicure.\n- Gli script non devono mai compromettere la sicurezza del sistema o i dati degli utenti.\n- Prima dell’implementazione, i contributi vanno revisionati per verificarne sicurezza e stabilità.\n\n### ⚠️ Divulgazione responsabile delle vulnerabilità\n\nSe scopri una vulnerabilità di sicurezza, NON segnalarla in issue o forum pubblici.\n\nComunicala invece in privato tramite e-mail:\n\n📧 proxmenux@macrimi.pro\n\nPer maggiori informazioni sulle vulnerabilità e su come segnalarle, consulta la nostra [politica di sicurezza](./SECURITY.md).\n\n## 🤝 3. Regole della comunità\n\nPer mantenere un ambiente rispettoso e professionale, tutti gli utenti devono seguire queste regole:\n\n- ✅ Mantieni un atteggiamento rispettoso e costruttivo nelle discussioni.\n- ❌ Non saranno tollerati molestie, discorsi d’odio o comportamenti offensivi.\n- ✅ Fornisci riscontri in modo professionale, evitando attacchi personali.\n- ❌ Le violazioni possono comportare avvertimenti o esclusioni, in base alla gravità.\n\n##\n\nQuesto documento promuove l’uso etico del codice, la consapevolezza della sicurezza e una comunità rispettosa.\n\n📢 Costruiamo insieme qualcosa di straordinario!\n" +} diff --git a/web/messages/it/docs/about/contributing.json b/web/messages/it/docs/about/contributing.json new file mode 100644 index 00000000..58d394ec --- /dev/null +++ b/web/messages/it/docs/about/contributing.json @@ -0,0 +1,293 @@ +{ + "meta": { + "title": "Contributo a ProxMenux | Documentazione ProxMenux", + "description": "Come contribuire a ProxMenux: modello dei rami (main / develop / feature/*), procedura delle pull request, intestazione con autore e link di sostegno facoltativo, interfaccia in due fasi, funzioni dei messaggi e passaggio da un ramo di funzionalità a una versione stabile.", + "ogTitle": "Contributi a ProxMenux", + "ogDescription": "Modello dei rami, procedura, attribuzione nell’intestazione e regola dell’interfaccia in due fasi per chi contribuisce." + }, + "header": { + "title": "Contributi a ProxMenux", + "description": "ProxMenux è aperto ai contributi comunitari — nuovi script, correzioni per quelli esistenti, miglioramenti di dialogo, traduzioni, integrazioni. Questa pagina è la porta formale: come il repository è strutturato, il modello di ramificazione e il flusso di lavoro di pull-request, l'intestazione dello script con attribuzione dell'autore e link di sponsor opzionale, e le convenzioni di progettazione ogni contributo deve seguire.", + "section": "Informazioni" + }, + "twoPagesCallout": { + "title": "Due pagine correlate, un progetto", + "body": "Non confondere questa pagina con Collaboratori, che riconosce il lavoro di tester, revisori e sviluppatori già coinvolti. Questa pagina è per te, futuro collaboratore, e spiega come preparare una pull request da integrare." + }, + "branching": { + "heading": "Modello di ramificazione", + "intro": "ProxMenux utilizza un modello di ramificazione a tre livelli:", + "headerBranch": "Ramo", + "headerPurpose": "Scopo", + "rows": [ + { + "branch": "main", + "purposeRich": "Codice stabile, pronto per la produzione. Qui vengono integrate solo modifiche pronte per il rilascio. È la versione ricevuta con un’installazione normale di ProxMenux." + }, + { + "branch": "develop", + "purposeRich": "Ramo di sviluppo attivo. Il nuovo lavoro viene integrato prima qui: è il canale beta. Quando una versione stabile è pronta, viene trasferita da qui a main." + }, + { + "branch": "feature/*", + "purposeRich": "Rami temporanei per una funzionalità, una correzione o un miglioramento. Creati da develop e reintegrati in develop tramite pull request dopo la revisione." + } + ], + "calloutTitle": "Ciò significa per gli utenti", + "calloutBody": "Chi segue main riceve versioni testate. Chi vuole prima le novità e accetta qualche imperfezione può seguire develop. Le nuove funzioni passano sempre prima da develop; nulla arriva in main senza questo ciclo." + }, + "workflow": { + "heading": "Procedura delle pull request", + "intro": "Dall'idea alla fusione del rilascio in cinque fasi:", + "step1Lead": "Crea un ramo per la funzionalità da develop:", + "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": "Utilizzare un nome di ramo descrittivo: feature/zfs-arc-tuning, feature/fix-iommu-detection, feature/add-tailscale-script.", + "step2Lead": "Lavora alle modifiche e pubblica il ramo:", + "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": "Apri una pull request verso develop, non verso main. Su GitHub verifica che il ramo di base sia develop. Descrivi cosa fa e modifica lo script e su quali versioni di Proxmox VE è stato testato.", + "step4": "Dopo la revisione le modifiche vengono integrate in develop. Un manutentore verifica codice, intestazione e interfaccia in due fasi. Se richiede modifiche, aggiungi commit allo stesso ramo: la PR si aggiorna automaticamente.", + "step5": "Le versioni stabili passano da develop a main. Al rilascio, main viene portato a develop con un fast-forward e riceve un tag. Il tuo contributo entra nella prossima versione stabile." + }, + "scriptHeader": { + "heading": "Intestazione script — metadati & descrizione", + "intro": "Ogni script ProxMenux inizia con due blocchi di commenti adiacenti che formano l’intestazione. Sono entrambi obbligatori: indicano autore e scopo senza dover leggere il corpo del codice.", + "bullets": [ + "Blocco superiore: metadati. Autore, link GitHub/di sostegno facoltativi, manutentore, copyright, licenza, versione e data di aggiornamento. Qui avviene il riconoscimento dei collaboratori: per un nuovo script inserisci il tuo nome e, facoltativamente, la pagina GitHub e un profilo come Ko-fi, GitHub Sponsors o Buy Me a Coffee.", + "Blocco inferiore: descrizione. Un breve paragrafo in inglese semplice spiega il compito dello script. Si legge prima del codice e deve chiarire da solo scopo, azioni principali, risorse coinvolte e prerequisiti." + ], + "licenseCalloutTitle": "La linea di licenza è fissa — GPL-3.0", + "licenseCalloutBody": "ProxMenux è pubblicato sotto GNU General Public License v3.0. Tutti gli script usano la stessa licenza: la riga License nell’intestazione deve essere il riferimento GPL-3.0 dell’esempio seguente, non una scelta per singolo script. Contribuendo accetti il rilascio sotto GPL-3.0: chiunque può leggere, modificare e ridistribuire lo script e le modifiche mantenendo la stessa licenza. Testo completo: MacRimi/ProxMenux/LICENSE.", + "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": "Le linee GitHub e Sponsor sono facoltative: lasciatele fuori se non volete pubblicarle. Tutto il resto è richiesto.", + "whyCalloutTitle": "Perché questo è importante", + "whyCalloutBody": "Contribuire all’open source è un lavoro volontario. Il nome e l’eventuale link di sostegno nel codice rendono visibile l’autore a ogni lettura, senza nasconderlo dietro il progetto. La descrizione ha un altro scopo: è la prima cosa letta da un futuro manutentore o utente curioso. La sua chiarezza spesso determina se ci si fida dello script o lo si evita." + }, + "structure": { + "heading": "Struttura del progetto", + "intro": "Dove ogni tipo di script vive nel repository:", + "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": "Ogni script carica utils.sh all’avvio tramite source per avere funzioni dei messaggi, indicatore di attesa, colori e sistema di traduzione. Le librerie condivise in scripts/global/ vengono caricate esplicitamente dagli script che ne hanno bisogno." + }, + "twoPhase": { + "heading": "La politica di progettazione dell'interfaccia utente bifase", + "intro": "È la convenzione più importante di ProxMenux e quella per cui vengono richieste più spesso correzioni alle PR. Ogni script è diviso in esattamente due fasi:", + "headerPhase": "Fase", + "headerPurpose": "Scopo", + "headerScreen": "Stato dello schermo", + "rows": [ + { + "phaseRich": "Phase 1 — Selezione", + "purposeRich": "Raccogliere ogni decisione dell'utente. Eseguire qualsiasi lavoro preparatorio necessario (sonde, scansioni, controlli).", + "screenRich": "Finestre dialog. Se una verifica tra due menu richiede più di uno o due secondi, mostra l’indicatore di attesa msg_info perché l’utente sappia che lo script non è bloccato, poi chiama stop_spinner subito prima del prossimo dialogo." + }, + { + "phaseRich": "Phase 2 — Esecuzione", + "purposeRich": "Eseguire ogni operazione. Visualizza la storia del progresso completo che si accumula sullo schermo.", + "screenRich": "Messaggi msg_info / msg_ok visibili; mai dialog." + } + ], + "principle": "Il principio è raccogliere prima tutte le scelte, poi eseguire tutto. L’utente vede prima menu ordinati con dialoghi (fase 1), poi una vista di esecuzione come un log (fase 2). Le fasi non si mescolano: niente dialoghi durante l’esecuzione né messaggi di avanzamento durante la selezione.", + "phase1Heading": "Fase 1 — modello tipico", + "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": "Regole per la fase 1:", + "phase1Rules": [ + "Se è attivo un indicatore msg_info e devi aprire un menu dialog o whiptail, chiama prima stop_spinner: l’indicatore non può convivere con l’overlay dei due strumenti. Se nessun indicatore è attivo, la chiamata non serve.", + "Usa show_proxmenux_logo + msg_title + msg_info per dare un contesto visivo a un’operazione lunga nella fase 1, ad esempio una verifica di oltre cinque secondi. La funzione pulisce già lo schermo: non chiamare prima clear.", + "Non chiamare show_proxmenux_logo tra i menu di dialogo in cui non c'è nulla da mostrare — cancellare lo schermo per un terminale vuoto è solo rumore visivo.", + "Conservare tutte le decisioni e i risultati della sonda in variabili o array paralleli. Il recap visibile avviene all'inizio della fase 2, non in fase 1." + ], + "phase2Heading": "Fase 2 — modello tipico", + "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": "Regole per la fase 2: inizia con show_proxmenux_logo + msg_title e riepiloga subito la fase 1 con righe msg_ok. Non richiamare show_proxmenux_logo, perché cancellerebbe il progresso accumulato. Non usare dialog; se una scelta durante l’esecuzione è inevitabile, usa whiptail come spiegato nella sezione seguente." + }, + "dialogVsWhiptail": { + "headingRich": "Quando utilizzare dialog vs whiptail", + "intro": "Entrambi gli strumenti disegnano interfacce utente in modalità testo, ma si comportano molto diversamente sullo schermo — e ProxMenux li utilizza in due fasi distinte per un motivo.", + "headerTool": "Strumento", + "headerWhen": "Quando usarlo", + "headerEffect": "Effetti sullo schermo", + "rows": [ + { + "toolRich": "dialog", + "whenRich": " Sempre in Fase 1. Ogni selezione interattiva — raccogliendo un VM, un disco, un filesystem, confermando un'azione — utilizza dialog. Questo è lo strumento UI predefinito di ProxMenux.", + "effectRich": "Prende il controllo del terminale: pulisce lo schermo, disegna l’interfaccia e alla chiusura ripristina lo stato precedente. Va bene nella fase 1, quando non ci sono ancora risultati utili da mostrare." + }, + { + "toolRich": "whiptail", + "whenRich": "Solo in Fase 2, solo quando inevitabile. Il caso tipico è un prompt di riavvio alla fine dell'esecuzione. Non raggiungere whiptail per chiedere “continua?” mid-execution — tale decisione dovrebbe essere presa in fase 1.", + "effectRich": "Overlay più leggero che non cancella il contesto del terminale. La cronologia msg_ok/msg_info della fase 2 resta visibile dietro il dialogo. È quindi adatto quando l’avanzamento è già sullo schermo." + } + ], + "calloutTitle": "Perché la divisione conta", + "calloutBody": "Se si chiama dialog nel mezzo della fase 2, ogni linea msg_ok l'utente sta guardando scompare. Tu pulisci la pista di controllo. whiptail lo evita. Quindi la regola non è arbitraria — si tratta di preservare la vista dell'utente di ciò che lo script ha fatto finora.", + "rebootHeading": "Richiesta di riavvio: il caso tipico di whiptail nella fase 2", + "rebootIntro": "Quando uno script termina e un riavvio può essere richiesto (ad es. IOMMU abilitato, parametri del kernel modificati), il prompt alla fine della fase 2 utilizza whiptail. Sempre includere un ramo “No” che avverte l’utente di non utilizzare la risorsa interessata fino al riavvio:", + "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": "Funzioni di messaggio", + "intro": "Tutti definiti in utils.sh. Utilizzarli come predefinito per qualsiasi output visibile dall'utente — visuali coerenti tra gli script è l'intero punto. Se il tuo script ha bisogno di una nuova funzione che non si adatta al set esistente (un nuovo livello di gravità, un nuovo aiutante di layout, ecc.), proporlo nella tua richiesta di pull — sarà rivisto e aggiunto a utils.sh se è ampiamente utile.", + "headerFunction": "Funzione", + "headerWhen": "Quando usare", + "headerSpinner": "Indicatore di avanzamento", + "rows": [ + { + "function": "msg_info \"text\"", + "whenRich": "Operazione in corso.", + "spinner": "Inizia" + }, + { + "function": "stop_spinner", + "whenRich": "Fine del lavoro preparatorio silenzioso in Fase 1 — uccide spinner, cancella la linea.", + "spinner": "Arresta" + }, + { + "function": "msg_ok \"text\"", + "whenRich": "L'operazione è riuscita. Utilizzare anche per “funzione abilitata” anche quando è richiesto un riavvio.", + "spinner": "Arresta" + }, + { + "function": "msg_warn \"text\"", + "whenRich": "Avvertenza effettiva o stato degradato.", + "spinner": "Arresta" + }, + { + "function": "msg_error \"text\"", + "whenRich": "Errore fatale.", + "spinner": "Arresta" + }, + { + "function": "msg_info2 \"text\"", + "whenRich": "Avviso non bloccante, su una riga informativa ciano.", + "spinner": "Arresta" + }, + { + "function": "msg_success \"text\"", + "whenRich": "Messaggio finale «Premi Invio per tornare» alla fine della fase 2.", + "spinner": "Arresta" + }, + { + "function": "msg_title \"text\"", + "whenRich": "Titolo in grassetto con spaziatura integrata. Usato all’inizio della fase 2.", + "spinner": "—" + }, + { + "function": "show_proxmenux_logo", + "whenRich": "Pulisce lo schermo e mostra il logo. Da chiamare una sola volta all’inizio della fase 2.", + "spinner": "—" + } + ] + }, + "dialogConventions": { + "heading": "convenzioni di dialogo", + "bullets": [ + "Passa sempre --backtitle \"$BACKTITLE\" ad ogni chiamata dialog e whiptail. $BACKTITLE è sempre \"ProxMenux\" — impostato una volta all'intestazione dello script e mai sovrascritto. L'utente deve sempre vedere il nome del progetto come il contesto di inquadramento, mai il titolo dello script.", + "Avvolgi sempre titoli e messaggi con $(translate \"...\").", + "Reindirizza sempre l'output dialog con 2>&1 >/dev/tty — lo stdout catturato diventa la selezione dell'utente, mentre la finestra di dialogo si disegna sul terminale.", + "Utilizzare le variabili standard di dimensione dell'interfaccia utente ($UI_MENU_H, $UI_MSG_W, ecc.) per un dimensionamento coerente tra gli script.", + "Controlla sempre le selezioni vuote o annullate e gestiscile correttamente." + ], + "exampleIntro": "Esempio completo: creare un menu di selezione della VM e gestire l’annullamento.", + "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": "Politica di traduzione", + "intro": "Tutte le stringhe visualizzabili dall'utente devono essere avvolte con la funzione translate. ProxMenux li traduce automaticamente in tutte le lingue supportate — scrivi inglese, l'utente legge la loro lingua madre.", + "code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...", + "bullets": [ + "Scrivere stringhe in inglese — la traduzione viene gestita automaticamente dalla build.", + "Mantieni concise le stringhe. Evita, se possibile, variabili all’interno di frasi lunghe.", + "non tradurre nomi di variabili, percorsi o identificatori tecnici." + ] + }, + "variableStyle": { + "heading": "Convenzioni variabili e di stile", + "bullets": [ + "Utilizzare UPPER_CASE per le variabili a livello di script.", + "Utilizzare lower_case per le variabili di funzione locali (dichiarazione con local).", + "Quotare tutte le espansioni variabili: \"$VAR\" — non $VAR.", + "Utilizzare [[ ]] per condizionali, non [ ] (eccetto dove è richiesto il POSIX).", + "show_proxmenux_logo è il modo previsto per pulire lo schermo: lo cancella e mostra il logo del progetto per dare un contesto visivo. Chiamalo una volta all’inizio della fase 2, e facoltativamente prima di una lunga attesa nella fase 1." + ], + "standardNamesIntro": "Nomi variabili standard nel progetto:", + "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": "Reindirizza l'output dello strumento durante la fase 2", + "redirectIntro": "La fase 2 mostra un log di righe msg_info → msg_ok. Se uno strumento chiamato, come apt, mkfs, qm, pct o dd, scrive su stdout/stderr, il suo output fa scorrere i messaggi e confonde la vista. L’utente non distingue più l’avanzamento dello script dai dettagli dello strumento.", + "withoutRedirectIntro": "Senza reindirizzare — ciò che l'utente vede se non si gestisce il rumore:", + "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": "Con redirect — quale sia la stessa operazione quando il rumore viene inviato altrove:", + "withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.", + "twoPatternsIntro": "Due modelli tra cui scegliere:", + "discardLead": "Scarta l’output quando non serve: è la soluzione più semplice e rapida.", + "discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1", + "logLead": "Inviare l'output a un file di registro quando si può desiderare di ispezionare in seguito (debugging un'installazione fallita, controllando ciò che dpkg effettivamente fatto). Questo è il modello preferito per qualsiasi operazione apt:", + "logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1", + "referenceOutro": "Lo script scripts/global/update-pve9_2.sh è un'implementazione di riferimento — ogni chiamata apt-get invia l'output a un file di registro in modo che l'utente vede solo il flusso msg_info → msg_ok pulito, mentre il log su disco consente di ricostruire esattamente ciò che ha fatto apt se qualcosa va storto." + }, + "dosAndDonts": { + "heading": "Cosa fare e cosa non fare", + "doHeading": "✅ Da fare", + "doBullets": [ + "stop_spinner prima di un dialog in Fase 1 solo quando un girante msg_info è in esecuzione.", + "La fase 2 inizia con show_proxmenux_logo + msg_title + msg_ok per riepilogare i risultati della fase 1.", + "Utilizzare msg_ok per funzioni abilitate con successo, anche se è necessario un riavvio.", + "Utilizzare whiptail (non dialog) per qualsiasi prompt post-esecuzione che deve apparire in Fase 2.", + "Sempre includere un ramo “No” nelle finestre di dialogo di riavvio che avverte l’utente di non avviare la risorsa interessata fino al riavvio.", + "Limita la logica riservata alle VM verificando [[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]]: controller e NVMe PCIe non possono essere assegnati a LXC con passthrough PCI.", + "Utilizzare ensure_repositories da utils-install-functions.sh invece di apt-get update incondizionato.", + "Utilizzare array paralleli in Fase 1 quando ogni elemento ha bisogno di finestre di dialogo multiple." + ], + "dontHeading": "❌ Da evitare", + "dontBullets": [ + "Chiama dialog mentre uno spinner è attivo.", + "Saltare la fase 1 recap all'inizio della fase 2.", + "Chiama show_proxmenux_logo una seconda volta — cancella tutto Fase 2 ha stampato.", + "Utilizzare dialog in Fase 2 (usare whiptail per il raro caso inevitabile).", + "Usare il solo clear.", + "Avvolgere msg_title in linee vuote echo \"\" — include già spaziatura.", + "Utilizzare msg_warn per segnalare una funzione abilitata con successo: è un msg_ok.", + "Eseguire apt-get update incondizionato — utilizzare ensure_repositories." + ] + }, + "submitting": { + "heading": "Inviare il tuo contributo", + "steps": [ + "Crea un fork di MacRimi/ProxMenux su GitHub e clonalo.", + "Crea un ramo feature/* da develop (vedi Modello dei rami sopra).", + "Segui questa guida per qualsiasi script nuovo o modificato. Scrivi l'intestazione con il tuo nome; aggiungi la linea di sponsor opzionale se vuoi.", + "Prova lo script su una vera istanza Proxmox VE: fase 1 con tutti i rami dei dialoghi e fase 2 con ogni operazione e il ripristino pulito in caso di errore.", + "Apri una pull request verso develop con una descrizione chiara: cosa fa lo script, cosa è cambiato e su quale versione di Proxmox VE è stato testato.", + "Assicurati che il contributo rispetti il Codice di condotta." + ], + "securityOutro": "Per problemi di sicurezza sensibili, segui la procedura di divulgazione in SECURITY.md invece di aprire una segnalazione pubblica." + }, + "whereNext": { + "heading": "Come proseguire", + "items": [ + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md", + "label": "CONTRIBUTING.md (guida completa)", + "tail": "— la fonte di verità per ogni convenzione, compresi i modelli hardware avanzati." + }, + { + "kind": "internal", + "href": "/docs/about/contributors", + "label": "Contributori", + "tail": "— le persone il cui lavoro ha plasmato le versioni ProxMenux (pagina diversa da questa)." + }, + { + "kind": "internal", + "href": "/docs/about/code-of-conduct", + "label": "Codice di condotta", + "tail": "— gli standard che ogni collaboratore accetta di seguire." + }, + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/discussions", + "label": "GitHub Discussions", + "tail": "— chiedere prima di costruire se non sei sicuro se un'idea si adatta, o trovare collaboratori su una caratteristica più grande." + } + ] + } +} diff --git a/web/messages/it/docs/about/contributors.json b/web/messages/it/docs/about/contributors.json new file mode 100644 index 00000000..3704a329 --- /dev/null +++ b/web/messages/it/docs/about/contributors.json @@ -0,0 +1,38 @@ +{ + "meta": { + "title": "Contributori | Documentazione ProxMenux", + "description": "Un riconoscimento alle persone che rendono possibile ProxMenux: tester, revisori e sviluppatori che contribuiscono a ogni versione.", + "ogTitle": "Contributori | Documentazione ProxMenux", + "ogDescription": "Incontra i contributori dietro ProxMenux." + }, + "header": { + "title": "Contributori", + "description": "Il progetto ProxMenux cresce grazie ai suoi collaboratori. Questa pagina riconosce il loro lavoro: provare le versioni prima della pubblicazione, individuare regressioni, esaminare le PR e orientare le nuove funzionalità.", + "section": "Informazioni" + }, + "beyond": { + "title": "Oltre questa lista", + "body": "Molte altre persone contribuiscono segnalando bug, proponendo funzionalità in Discussions, provando le versioni beta e traducendo il progetto. L’elenco completo dei collaboratori al codice si trova nel grafico dei contributori di GitHub. Questa pagina presenta chi partecipa più attivamente ai test e alla revisione delle versioni di ProxMenux." + }, + "testers": { + "heading": "Tester e recensori", + "intro": "Queste persone sono state tra le prime a contribuire al progetto. I loro test, le segnalazioni di problemi e le proposte di miglioramento hanno aiutato ProxMenux a diventare ciò che è oggi.", + "roles": { + "testing": "Test", + "testingReviewer": "Test e revisione" + }, + "youtube": "YouTube" + }, + "contribute": { + "heading": "Vuoi contribuire?", + "intro": "Ogni contributo è benvenuto: codice, test, design, documentazione o anche solo la condivisione delle tue idee:", + "tester": "Tester — prova il canale beta e segnala ciò che funziona e ciò che non funziona prima delle versioni stabili.", + "developer": "Sviluppatore — Bash, Next.js (TypeScript) e un po’ di Python per l’ambiente virtuale di traduzione (venv). Le PR sono benvenute su GitHub.", + "designer": "Designer — Miglioramenti dell'interfaccia utente, icone, screenshot per la documentazione.", + "ideas": "Idee — apri una discussione in GitHub Discussions prima di creare una issue per richiedere una funzionalità." + }, + "coc": { + "title": "Leggi prima il codice di condotta", + "body": "Prima di proporre codice o segnalare problemi, leggi il Codice di condotta e le buone pratiche. Descrive le aspettative sulla responsabilità del codice, sulla segnalazione delle vulnerabilità e sull’ambito delle PR." + } +} diff --git a/web/messages/it/docs/about/faq.json b/web/messages/it/docs/about/faq.json new file mode 100644 index 00000000..a0252618 --- /dev/null +++ b/web/messages/it/docs/about/faq.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "FAQ | Documentazione ProxMenux", + "description": "Domande frequenti su ProxMenux: funzionalità, installazione, compatibilità da PVE 8, personalizzazione, aggiornamenti, sicurezza, uso in produzione, file di sistema, contributi e disinstallazione.", + "ogTitle": "FAQ | Documentazione ProxMenux", + "ogDescription": "Domande frequenti su installazione, compatibilità, sicurezza e modi per contribuire a ProxMenux." + }, + "header": { + "title": "Domande frequenti", + "description": "Domande comuni su ProxMenux: che cos’è, a chi serve, installazione, aggiornamento, disinstallazione, compatibilità, personalizzazione, sicurezza e contributi. Se non trovi la tua domanda, consulta GitHub Discussions o apri una issue.", + "section": "Informazioni" + }, + "quickLinks": { + "title": "Collegamenti rapidi", + "installationLabel": "Installazione", + "installationSuffix": " — il comando di installazione su una sola riga e le dipendenze.", + "introductionLabel": "Introduzione", + "introductionSuffix": " — cosa fa ProxMenux, in cinque minuti.", + "uninstallLabel": "Disinstalla", + "uninstallSuffix": "— rimozione pulita.", + "issuesLabel": "GitHub Issues", + "discussionsLabel": "Discussioni" + }, + "q1": { + "question": "Che cosa è ProxMenux, e per cosa è usato?", + "p1Rich": "ProxMenux è uno strumento interattivo a menu che rende Proxmox VE accessibile a tutti, a prescindere dall’esperienza tecnica. Semplifica l’esecuzione dei comandi e consente di gestire il sistema senza conoscenze avanzate di Linux.", + "p2": "Gli utenti meno esperti possono eseguire comandi da menu strutturati, riducendo ciò che devono digitare nel terminale. Gli amministratori esperti risparmiano passaggi nelle attività ripetitive: protezione dopo l’installazione, passthrough GPU, importazione di VM OVF e rotazione degli snapshot ZFS.", + "p3": "Proxmox VE è ampiamente usato per:", + "items": [ + "Virtualizzazione di livello aziendale", + "HomeLab e soluzioni cloud personali", + "Server multimediali, automazione e altro ancora" + ] + }, + "q2": { + "question": "Come posso installare ProxMenux?", + "p1Rich": "Segui la guida all’installazione. In breve:", + "stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"", + "p2": "Una volta installato, basta avviarlo con:", + "menuCmd": "menu" + }, + "q3": { + "question": "ProxMenux è compatibile con tutte le versioni Proxmox?", + "bodyRich": "No — ProxMenux richiede Proxmox VE 8 o successivo. PVE 7 e le versioni precedenti non sono supportati. Se usi ancora PVE 7, passa prima a 8.x seguendo la procedura ufficiale Proxmox. Puoi poi gestire il passaggio da 8 a 9 con ProxMenux da Utilità → Aggiorna PVE 8 a PVE 9." + }, + "q4": { + "question": "Posso personalizzare ProxMenux?", + "p1Rich": "Gli aggiornamenti possono sovrascrivere le modifiche locali agli script principali: evita quindi di modificare direttamente questi file. Ecco cosa puoi personalizzare:", + "items": [ + "Il banner della console tramite lo strumento FastFetch nelle opzioni Post-Install.", + "Quali componenti opzionali sono installati (Monitor, Fail2Ban, Lynis...) — scegliere durante l'installazione o tramite il menu pertinente in seguito." + ] + }, + "q5": { + "question": "Come posso aggiornare ProxMenux?", + "p1Rich": "Quando è disponibile una nuova versione, ProxMenux la rileva al successivo avvio di menu e propone l’aggiornamento. Se accetti, sostituisce i file e la configurazione dello strumento nell’installazione esistente, senza richiedere download manuali.", + "p2Rich": "Chi usa la versione stabile riceve aggiornamenti stabili; chi usa la beta riceve quelli beta. Quando viene pubblicata una versione stabile, la beta lo segnala alla successiva apertura del menu e propone il passaggio automatico. Consulta il programma beta." + }, + "q6": { + "question": "Dove posso segnalare i problemi?", + "p1Rich": "Segnala i bug su GitHub Issues. Includi i passaggi per riprodurli, il messaggio di errore e, se pertinente, l’output di Monitor ottenuto con journalctl -u proxmenux-monitor -n 50.", + "p2Rich": "Per i problemi di sicurezza, non pubblicare i dettagli. Segui la procedura di segnalazione responsabile nel codice di condotta e nelle buone pratiche." + }, + "q7": { + "question": "Posso contribuire a ProxMenux?", + "p1Rich": "Certamente. ProxMenux è un progetto collaborativo e open source. Puoi contribuire con codice (Bash, Next.js/TypeScript e strumenti di traduzione in Python), test, documentazione, design o idee.", + "item1Rich": "Discuti le idee in GitHub Discussions prima di aprire una richiesta di funzionalità.", + "item2Rich": "Prima di inviare una pull request, leggi il codice di condotta e le buone pratiche.", + "item3Rich": "Consulta la pagina dei collaboratori per conoscere chi si occupa attualmente di test e revisioni." + }, + "q8": { + "question": "ProxMenux modifica i file di sistema critici?", + "p1Rich": "L’installazione di ProxMenux aggiunge i seguenti componenti.", + "item1Rich": "Dipendenze tramite apt: dialog, curl, jq e git. Le traduzioni usano cataloghi JSON già generati; l’installazione non aggiunge all’host un ambiente virtuale per la traduzione.", + "item2Rich": "L'albero di script a /usr/local/share/proxmenux/.", + "item3Rich": "Il comando di avvio in /usr/local/bin/menu.", + "item4Rich": "Facoltativo: il servizio systemd di Monitor, proxmenux-monitor.service.", + "p2Rich": "ProxMenux non modifica la configurazione principale di Proxmox, a meno che tu non lo richieda esplicitamente da un menu dedicato. Per esempio, la riparazione della rete modifica /etc/network/interfaces, ma solo dopo la tua conferma e la creazione di un backup." + }, + "q9": { + "question": "È sicuro usare ProxMenux in produzione?", + "bodyRich": "Sì. Poiché ProxMenux modifica i file principali di Proxmox solo su richiesta esplicita, può essere usato in produzione. Come per ogni automazione, provalo prima in un ambiente controllato e prepara i backup prima delle operazioni distruttive: aggiornamento da PVE 8 a 9, formattazione di dischi, eliminazione di VM e simili." + }, + "q10": { + "question": "Come posso disinstallare ProxMenux?", + "p1Rich": "Da ProxMenux: Impostazioni → Disinstalla ProxMenux. La disinstallazione rimuove gli script, il comando di avvio e il servizio Monitor, oltre alle dipendenze selezionate se richiesto. Ripristina /root/.bashrc e /etc/motd dalle copie create all’installazione, se presenti.", + "p2Rich": "Procedura completa: Disinstallare ProxMenux." + }, + "q11": { + "question": "VirusTotal contrassegna l'URL di installazione — è sicuro?", + "p1Rich": "Il risultato di 1/95 del motore Chong Lua Dao, riportato nella issue #162, è stato identificato dal manutentore come falso positivo. L’installazione usa il modello curl | bash e può scaricare jq dalla sua release ufficiale su GitHub. Questo comportamento può attivare gli scanner euristici; il rapporto storico non costituisce una valutazione di ogni download futuro.", + "p2Rich": "ProxMenux è completamente open source e puoi esaminare lo script di installazione riga per riga: install_proxmenux.sh. Altri dettagli nella issue #162." + } +} diff --git a/web/messages/it/docs/about/index.json b/web/messages/it/docs/about/index.json new file mode 100644 index 00000000..1be9dc8d --- /dev/null +++ b/web/messages/it/docs/about/index.json @@ -0,0 +1,67 @@ +{ + "meta": { + "title": "Informazioni su | Documentazione ProxMenux", + "description": "Informazioni su ProxMenux: obiettivi del progetto, collaboratori, FAQ e codice di condotta. Uno strumento di gestione open source a menu per Proxmox VE 8+, sviluppato e mantenuto da MacRimi con un piccolo gruppo di tester e collaboratori.", + "ogTitle": "Informazioni su | Documentazione ProxMenux", + "ogDescription": "Informazioni su ProxMenux — strumento di gestione a menu open source per Proxmox VE 8+." + }, + "header": { + "title": "Informazioni", + "description": "Informazioni sul progetto, FAQ, contributori e codice di condotta. ProxMenux è uno strumento di gestione a menu open source per Proxmox VE 8+, costruito e mantenuto da MacRimi con l'aiuto di un piccolo team di tester e collaboratori.", + "section": "Informazioni" + }, + "callout": { + "title": "Open source, sviluppato dalla comunità", + "body": "ProxMenux è distribuito con licenza GPL-3.0 e sviluppato pubblicamente su GitHub. Ogni script può essere esaminato e ogni modifica tracciata. Sono benvenuti segnalazioni di bug, idee, codice e test." + }, + "section": { + "heading": "In questa sezione", + "options": [ + { + "icon": "HelpCircle", + "href": "/docs/about/faq", + "title": "FAQ", + "description": "Domande frequenti: che cos’è ProxMenux, installazione, compatibilità, personalizzazione, aggiornamenti, sicurezza, uso in produzione e disinstallazione." + }, + { + "icon": "Users", + "href": "/docs/about/contributors", + "title": "Contributori", + "description": "Un riconoscimento alle persone che rendono possibile ProxMenux: tester, revisori e sviluppatori che contribuiscono a ogni versione." + }, + { + "icon": "ScrollText", + "href": "/docs/about/code-of-conduct", + "title": "Codice di condotta", + "description": "Valori del progetto, responsabilità del codice e linee guida per contribuire. Da leggere prima di aprire una PR o segnalare un problema." + } + ] + }, + "involved": { + "heading": "Partecipa", + "intro": "Tre modi per partecipare al progetto:", + "cards": [ + { + "href": "https://github.com/MacRimi/ProxMenux/issues/new", + "title": "🐛 Segnala un bug", + "description": "GitHub Issues — includi i log e i passaggi per riprodurre il problema." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/discussions", + "title": "💡 Suggerisci una funzionalità", + "description": "GitHub Discussions — condividi le tue idee prima di aprire una PR." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/pulls", + "title": "🔀 Invia una PR", + "description": "GitHub Pull Requests — leggere prima il codice di condotta." + } + ] + }, + "support": { + "heading": "Sostieni il progetto", + "introRich": "Se ProxMenux ti fa risparmiare tempo, il modo più semplice per farlo conoscere è assegnare una ⭐ al repository su GitHub. Se vuoi fare di più:", + "kofiLabel": "Supporto su Ko-fi", + "kofiOutro": " — offri un caffè al manutentore e contribuisci a portare avanti lo sviluppo." + } +} diff --git a/web/messages/pt/docs/about/code-of-conduct.json b/web/messages/pt/docs/about/code-of-conduct.json new file mode 100644 index 00000000..681e28e0 --- /dev/null +++ b/web/messages/pt/docs/about/code-of-conduct.json @@ -0,0 +1,13 @@ +{ + "meta": { + "title": "Código de conduta | Documentação ProxMenux", + "description": "Código de conduta e boas práticas do ProxMenux para colaboradores, responsáveis pelos testes e utilizadores.", + "ogTitle": "Código de conduta | Documentação ProxMenux", + "ogDescription": "Expectativas sobre a responsabilidade pelo código, a comunicação de vulnerabilidades e o âmbito dos PR no projeto ProxMenux." + }, + "errors": { + "notFound": "Erro: O ficheiro CODE_OF_CONDUCT.md não foi encontrado.", + "loadFailed": "Erro: Não foi possível carregar o conteúdo do Código de Conduta." + }, + "contentMarkdown": "# 📝 Código de conduta e boas práticas\n\nEste documento define os **princípios e as orientações** para o uso do **ProxMenux**, promovendo o **respeito, a colaboração e a segurança** no desenvolvimento.\n\n## 📌 1. Autoria do código e reconhecimento\n\n- Se forem usados **scripts, excertos de código ou ideias** de outros repositórios ou programadores, o autor original será sempre reconhecido.\n- Será acrescentado um comentário no código ou na documentação que indique a origem e, se possível, uma ligação para o repositório original.\n- Ao usar código com uma **licença** específica, é obrigatório respeitar as suas condições.\n\n### ✅ Exemplo de atribuição correta no código:\n\n```bash\n# Script baseado no trabalho de [Autor] em [Ligação do repositório]\n```\n\n## 🔒 2. Segurança e responsabilidade pelo código\n\n- Todo o código deste repositório segue boas práticas de desenvolvimento seguro.\n- Não são permitidos contributos que introduzam vulnerabilidades intencionais ou práticas inseguras.\n- Os scripts nunca devem comprometer a segurança do sistema nem os dados dos utilizadores.\n- Antes da implementação, os contributos devem ser revistos para verificar a segurança e a estabilidade.\n\n### ⚠️ Divulgação responsável de vulnerabilidades\n\nSe descobrir uma vulnerabilidade de segurança, NÃO a comunique em issues ou fóruns públicos.\n\nComunique-a em privado por e-mail:\n\n📧 proxmenux@macrimi.pro\n\nPara mais informações sobre vulnerabilidades e como as comunicar, consulte a nossa [política de segurança](./SECURITY.md).\n\n## 🤝 3. Regras da comunidade\n\nPara manter um ambiente respeitador e profissional, todos os utilizadores devem seguir estas regras:\n\n- ✅ Seja respeitador e construtivo nas discussões.\n- ❌ Não serão tolerados assédio, discurso de ódio ou comportamentos ofensivos.\n- ✅ Dê opiniões de forma profissional, evitando ataques pessoais.\n- ❌ O incumprimento pode resultar em avisos ou exclusões, consoante a gravidade.\n\n##\n\nEste documento promove o uso ético do código, a consciência de segurança e uma comunidade respeitadora.\n\n📢 Vamos construir algo extraordinário em conjunto!\n" +} diff --git a/web/messages/pt/docs/about/contributing.json b/web/messages/pt/docs/about/contributing.json new file mode 100644 index 00000000..a18924b9 --- /dev/null +++ b/web/messages/pt/docs/about/contributing.json @@ -0,0 +1,293 @@ +{ + "meta": { + "title": "Contribuir para ProxMenux | ProxMenux Documentação", + "description": "Como contribuir para o ProxMenux: modelo de ramos (main / develop / feature/*), processo de pull request, cabeçalho com autoria e ligação de apoio opcional, interface em duas fases, funções de mensagens e percurso até uma versão estável.", + "ogTitle": "Contribuição para ProxMenux", + "ogDescription": "Modelo de ramos, processo, autoria no cabeçalho e regra da interface em duas fases a seguir pelos colaboradores." + }, + "header": { + "title": "Contribuição para ProxMenux", + "description": "O ProxMenux está aberto a contribuições comunitárias — novos scripts, correções para os existentes, melhorias de diálogo, traduções, integrações. Esta página é a porta formal: como o repositório é estruturado, o modelo de ramificação e fluxo de trabalho pull-request, o cabeçalho do script com atribuição do autor e link de patrocinador opcional, e as convenções de projeto cada contribuição deve seguir.", + "section": "Sobre" + }, + "twoPagesCallout": { + "title": "Duas páginas relacionadas, um projecto", + "body": "Não confunda esta página com Colaboradores, que reconhece testadores, revisores e programadores já envolvidos. Esta página é para si, futuro colaborador, e explica como preparar uma pull request para integração." + }, + "branching": { + "heading": "Modelo de ramificação", + "intro": "ProxMenux usa um modelo de ramificação de três camadas:", + "headerBranch": "Ramo", + "headerPurpose": "Finalidade", + "rows": [ + { + "branch": "main", + "purposeRich": "Código estável, pronto para produção. Só são integradas aqui alterações prontas para lançamento. É a versão recebida numa instalação normal do ProxMenux." + }, + { + "branch": "develop", + "purposeRich": "Ramo de desenvolvimento ativo. O trabalho novo é integrado primeiro aqui: é o canal beta. Quando uma versão estável está pronta, passa daqui para main." + }, + { + "branch": "feature/*", + "purposeRich": "Ramos de curta duração por recurso, correção ou melhoria. Criado a partir de develop, fundiu-se novamente em develop através de um Pull Request após revisão." + } + ], + "calloutTitle": "O que isto significa para os utilizadores", + "calloutBody": "Usuários finais rastreando main recebem versões testadas. Usuários que querem os recursos mais recentes cedo — e não se importem com as bordas ásperas ocasionais — podem seguir o develop. Novos recursos sempre passam por develop primeiro; nada atinge main sem passar por esse ciclo." + }, + "workflow": { + "heading": "Processo de pull request", + "intro": "Da ideia ao lançamento mesclado em cinco etapas:", + "step1Lead": "Criar um ramo de recursos de develop:", + "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": "Use um nome de ramo descritivo: feature/zfs-arc-tuning, feature/fix-iommu-detection, feature/add-tailscale-script.", + "step2Lead": "Trabalhe nas suas alterações e empurre o branch:", + "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": "Abra um pedido de pull contra develop (não contra main). Na página de criação de GitHub PR, verifique novamente se o ramo base está definido como develop. Incluir na descrição: o que o script faz, o que ele muda, e em quais versões Proxmox VE você testou.", + "step4": "Após a revisão, as alterações são integradas em develop. Um responsável verifica o código, o cabeçalho e a interface em duas fases. Se pedir alterações, envie novos commits para o mesmo ramo: a PR atualiza-se automaticamente.", + "step5": "As versões estáveis passam de develop para main. No lançamento, main avança até develop por fast-forward e recebe uma etiqueta. A contribuição passa a integrar a próxima versão estável." + }, + "scriptHeader": { + "heading": "Cabeçalho do programa — metadados e descrição", + "intro": "Cada script em ProxMenux abre com dois blocos de comentários adjacentes que juntos formam o cabeçalho. Eles são ambos necessários — juntos eles deixam qualquer leitor saber quem escreveu o script e o que ele faz, tudo sem abrir o próprio código.", + "bullets": [ + "Bloco superior: metadados. Autor, ligações GitHub/de apoio opcionais, responsável, copyright, licença, versão e data de atualização. É também o reconhecimento dos colaboradores: num script novo, inclua o seu nome e, se quiser, a página GitHub e um perfil como Ko-fi, GitHub Sponsors ou Buy Me a Coffee.", + "Bloco inferior: descrição. Um parágrafo curto em inglês simples explica o script. É lido antes do código e deve bastar para compreender o objetivo, ações principais, recursos afetados e requisitos." + ], + "licenseCalloutTitle": "A linha de licença é fixa — GPL-3.0", + "licenseCalloutBody": "ProxMenux é publicado sob a Licença Pública Geral GNU v3.0. Cada script no projeto envia sob essa mesma licença; a linha License no cabeçalho é sempre a referência GPL-3.0 mostrada no exemplo abaixo — não é uma escolha por script. Ao contribuir com um script, você concorda em lançá-lo sob GPL-3.0, o que significa que qualquer um pode lê-lo, modificá-lo e redistribuí-lo (incluindo modificações), desde que o mantenha sob a mesma licença. O texto completo vive em MacRimi/ProxMenux/LICENSE.", + "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": "As linhas GitHub e Sponsor são opcionais — deixe-as de fora se não quiser publicá-las. Tudo o resto é necessário.", + "whyCalloutTitle": "Por que isso importa?", + "whyCalloutBody": "A contribuição de código aberto é trabalho voluntário. Colocar o nome do contribuinte e (quando fornecido) o link do patrocinador diretamente na fonte dá às pessoas que constroem os scripts reconhecimento visível cada vez que alguém lê o código — sua autoria é preservada, não escondida sob “o projeto”. O bloco de descrição importa por uma razão diferente: é a primeira coisa que um futuro mantenedor ou usuário curioso lê, e uma descrição clara é muitas vezes a diferença entre um script que as pessoas confiam e uma que elas evitam." + }, + "structure": { + "heading": "Estrutura do projecto", + "intro": "Onde cada tipo de script vive no repositório:", + "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": "Cada script carrega utils.sh no arranque através de source para obter funções de mensagens, indicador de espera, cores e sistema de tradução. As bibliotecas partilhadas em scripts/global/ são carregadas explicitamente pelos scripts que delas precisam." + }, + "twoPhase": { + "heading": "A política de design de IU em duas fases", + "intro": "É a convenção mais importante do ProxMenux e a que mais frequentemente leva a pedidos de correção nas PR. Cada script divide-se em exatamente duas fases:", + "headerPhase": "Fase", + "headerPurpose": "Finalidade", + "headerScreen": "Estado da tela", + "rows": [ + { + "phaseRich": "Fase 1 — Selecção", + "purposeRich": "Recolha todas as decisões do utilizador. Executar todos os trabalhos preparatórios necessários (sondas, sondagens, verificações).", + "screenRich": "Janelas dialog. Se uma verificação entre dois menus demorar mais de um ou dois segundos, mostre um indicador msg_info para sinalizar que o script não bloqueou, e chame stop_spinner imediatamente antes do próximo diálogo." + }, + { + "phaseRich": "Fase 2 — Execução", + "purposeRich": "Executar todas as operações. Mostra o histórico de progresso completo acumulado na tela.", + "screenRich": "Mensagens visíveis msg_info / msg_ok; nunca dialog." + } + ], + "principle": "O princípio: colha tudo primeiro, depois executa tudo. O usuário vê um menu de diálogo limpo (Fase 1), em seguida, uma visão de execução de log-style limpo (Fase 2). Nenhuma mistura — nenhuma janela que apareça no meio da execução, nenhum ruído de progresso durante a selecção.", + "phase1Heading": "Fase 1 — padrão típico", + "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": "Regras para fase 1:", + "phase1Rules": [ + "Se estiver ativo um indicador msg_info e precisar de abrir um menu dialog ou whiptail, chame primeiro stop_spinner: o indicador não pode coexistir com a sobreposição das ferramentas. Se nenhum estiver ativo, a chamada não é necessária.", + "Use show_proxmenux_logo + msg_title + msg_info quando você precisa dar ao usuário contexto visual para uma operação de longa duração em fase 1 (por exemplo, uma sonda que leva 5+ segundos). A função inclui uma tela limpa, então não chame clear antes.", + "Não chame o show_proxmenux_logo entre menus de diálogo onde não há nada para exibir — limpar a tela para um terminal vazio é apenas ruído visual.", + "Armazene todas as decisões e resultados de sonda em variáveis ou arrays paralelos. A recapitulação visível ocorre no início da Fase 2, não na Fase 1." + ], + "phase2Heading": "Fase 2 — padrão típico", + "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": "Regras para a fase 2: comece com show_proxmenux_logo + msg_title e resuma de imediato a fase 1 em linhas msg_ok. Não volte a chamar show_proxmenux_logo, pois apagaria o progresso acumulado. Não utilize dialog; se uma decisão durante a execução for inevitável, utilize whiptail como na secção seguinte." + }, + "dialogVsWhiptail": { + "headingRich": "Quando usar dialog vs whiptail", + "intro": "Ambas as ferramentas desenham interfaces de usuário de modo texto, mas elas se comportam de forma muito diferente na tela — e ProxMenux as usa em duas fases distintas por uma razão.", + "headerTool": "Ferramenta", + "headerWhen": "Quando usá-lo", + "headerEffect": "Efeito no ecrã", + "rows": [ + { + "toolRich": "dialog", + "whenRich": "Sempre em fase 1. Cada seleção interativa — escolhendo um VM, um disco, um sistema de arquivos, confirmando uma ação — usa dialog. Esta é a ferramenta padrão de UI do ProxMenux.", + "effectRich": "Assume o terminal: limpa a tela, desenha sua sobreposição, e ao fechar retorna o terminal ao seu estado anterior. Tudo bem na fase 1 porque nada de útil está mostrando ainda." + }, + { + "toolRich": "whiptail", + "whenRich": "Apenas na Fase 2, somente quando inevitável. O caso típico é um prompt de reinicialização no final da execução. Não procure o whiptail para pedir “continuar?” no meio da execução — essa decisão deveria ter sido tomada na Fase 1.", + "effectRich": "Sobreposição mais leve que não limpa o contexto do terminal. O histórico msg_ok/msg_info da fase 2 permanece visível atrás do diálogo. É por isso a escolha indicada quando o progresso já está no ecrã." + } + ], + "calloutTitle": "Por que a divisão importa", + "calloutBody": "Se você chamar dialog no meio da fase 2, cada linha msg_ok que o usuário tem assistido desaparece. Limpas o rasto da auditoria. whiptail evita isso. Então a regra não é arbitrária — é sobre preservar a visão do usuário sobre o que o script tem feito até agora.", + "rebootHeading": "Pedido de reinício: o caso típico de whiptail na fase 2", + "rebootIntro": "Quando um script termina e uma reinicialização pode ser necessária (por exemplo: IOMMU habilitado, parâmetros do kernel alterados), o prompt no final da Fase 2 usa whiptail. Sempre inclua um branch “Não” que avisa o usuário para não usar o recurso afetado até que ele reinicie:", + "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": "Referência das funções da mensagem", + "intro": "Todos definidos em utils.sh. Use-os como padrão para qualquer saída visível pelo usuário — visual consistente entre scripts é o ponto principal. Se seu script precisar de uma nova função que não se encaixe no conjunto existente (um novo nível de gravidade, um novo auxiliar de layout, etc.), proponha-o em seu pedido de pull — ele será revisado e adicionado ao utils.sh se for amplamente útil.", + "headerFunction": "Função", + "headerWhen": "Quando utilizar", + "headerSpinner": "Indicador de progresso", + "rows": [ + { + "function": "msg_info \"text\"", + "whenRich": "Operação em curso.", + "spinner": "Inicia" + }, + { + "function": "stop_spinner", + "whenRich": "Fim dos trabalhos preparatórios silenciosos na fase 1 — mata spinner, limpa a linha.", + "spinner": "Para" + }, + { + "function": "msg_ok \"text\"", + "whenRich": "Operação concluída. Utilize também para uma funcionalidade ativada, mesmo que ainda seja necessário reiniciar.", + "spinner": "Para" + }, + { + "function": "msg_warn \"text\"", + "whenRich": "Aviso real ou estado degradado.", + "spinner": "Para" + }, + { + "function": "msg_error \"text\"", + "whenRich": "Erro fatal.", + "spinner": "Para" + }, + { + "function": "msg_info2 \"text\"", + "whenRich": "Informação sem bloqueio, numa linha ciano.", + "spinner": "Para" + }, + { + "function": "msg_success \"text\"", + "whenRich": "Final “Pressione Enter para retornar” no final da fase 2.", + "spinner": "Para" + }, + { + "function": "msg_title \"text\"", + "whenRich": "Título negrito com espaçamento embutido. Utilizado no início da fase 2.", + "spinner": "—" + }, + { + "function": "show_proxmenux_logo", + "whenRich": "Limpa o ecrã, mostra o logótipo. Chamado uma vez apenas no início da Fase 2.", + "spinner": "—" + } + ] + }, + "dialogConventions": { + "heading": "convenções de diálogo", + "bullets": [ + "Passe sempre --backtitle \"$BACKTITLE\" para cada chamada dialog e whiptail. $BACKTITLE é sempre \"ProxMenux\" — definido uma vez no cabeçalho do script e nunca substituído. O usuário deve sempre ver o nome do projeto como o contexto de enquadramento, nunca o próprio título do script.", + "Enrole sempre títulos e mensagens com $(translate \"...\").", + "Sempre redirecionar saída dialog com 2>&1 >/dev/tty - o stdout capturado torna-se a seleção do usuário, enquanto o diálogo em si desenha no terminal.", + "Use as variáveis de dimensão padrão de UI ($UI_MENU_H, $UI_MSG_W, etc.) para dimensionamento consistente entre scripts.", + "Verifique sempre escolhas vazias ou canceladas e trate-as corretamente." + ], + "exampleIntro": "Exemplo completo: criar um menu de seleção de VM e tratar o cancelamento.", + "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": "Política de tradução", + "intro": "Todas as strings visíveis ao usuário devem ser enroladas com a função translate. ProxMenux traduz-os automaticamente em todas as línguas suportadas — você escreve inglês, o usuário lê sua língua nativa.", + "code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...", + "bullets": [ + "Escreva strings em inglês — a tradução é tratada automaticamente pela compilação.", + "Mantenha as cadeias de texto concisas. Evite, se possível, variáveis dentro de frases longas.", + "Não traduza nomes de variáveis, caminhos ou identificadores técnicos." + ] + }, + "variableStyle": { + "heading": "Convenções de variáveis e estilo", + "bullets": [ + "Usar UPPER_CASE para variáveis de nível de script.", + "Use lower_case para variáveis de função local (declare com local).", + "Coloque todas as expansões de variáveis entre aspas: \"$VAR\", não $VAR.", + "Usar [[ ]] para condicionantes, não [ ] (exceto onde POSIX é necessário).", + "show_proxmenux_logo é a forma prevista de limpar o ecrã: limpa-o e mostra o logótipo do projeto para manter o contexto visual. Chame-o uma vez no início da fase 2, e opcionalmente antes de uma espera longa na fase 1." + ], + "standardNamesIntro": "Nomes de variáveis padrão em todo o projeto:", + "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": "Redirecionando a saída da ferramenta durante a fase 2", + "redirectIntro": "A fase 2 mostra um registo de linhas msg_info → msg_ok. Se uma ferramenta chamada, como apt, mkfs, qm, pct ou dd, escrever em stdout/stderr, a sua saída desloca as mensagens e confunde o ecrã. O utilizador deixa de distinguir o progresso do script dos detalhes da ferramenta.", + "withoutRedirectIntro": "Sem redirecionar — o que o usuário vê se você não lidar com o ruído:", + "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": "Com redirecionamento — como é a mesma operação quando o ruído é enviado para outro lugar:", + "withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.", + "twoPatternsIntro": "Dois padrões para escolher:", + "discardLead": "Descarte a saída quando você não precisar — mais rápido, mais simples:", + "discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1", + "logLead": "Envie a saída para um arquivo de log quando você quiser inspeccioná-lo mais tarde (depurando uma instalação falhada, verificando o que o dpkg realmente fez). Este é o padrão preferido para qualquer operação apt:", + "logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1", + "referenceOutro": "O script scripts/global/update-pve9_2.sh é uma implementação de referência — cada chamada apt-get envia saída para um arquivo de log para que o usuário apenas veja o fluxo limpo msg_info → msg_ok, enquanto o log no disco permite reconstruir exatamente o que o apt fez se algo der errado." + }, + "dosAndDonts": { + "heading": "Fazer e Não Fazer", + "doHeading": "✅ Fazer", + "doBullets": [ + "stop_spinner antes de um dialog em fase 1 somente quando um spinner msg_info está em execução atualmente.", + "Fase 2 começa com show_proxmenux_logo + msg_title + msg_ok recap dos resultados da Fase 1.", + "Use msg_ok para recursos habilitados com sucesso — mesmo que seja necessário reiniciar.", + "Use whiptail (não dialog) para qualquer prompt pós-execução que deve aparecer na Fase 2.", + "Sempre inclua um branch \"Não\" nas janelas de reinicialização que alerta o usuário para não iniciar o recurso afetado até reiniciar.", + "Limite a lógica exclusiva de VM verificando [[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]]: controladores e NVMe PCIe não podem ser atribuídos a LXC por passthrough PCI.", + "Utilizar ensure_repositories de utils-install-functions.sh em vez de apt-get update incondicional.", + "Use arrays paralelos na Fase 1 quando cada item precisar de múltiplas janelas." + ], + "dontHeading": "❌ Não fazer", + "dontBullets": [ + "Chame dialog enquanto um spinner está ativo.", + "Pular a fase 1 recap no início da fase 2.", + "Chame o show_proxmenux_logo pela segunda vez — ele apaga tudo que a Fase 2 imprimiu.", + "Utilizar dialog na Fase 2 (utilizar whiptail para o caso raro inevitável).", + "Utilizar apenas clear.", + "Enrole msg_title em linhas em branco echo \"\" — já inclui espaçamento.", + "Use o msg_warn para relatar um recurso habilitado com sucesso — que é um msg_ok.", + "Executar apt-get update incondicional — utilizar ensure_repositories." + ] + }, + "submitting": { + "heading": "Submissão da sua contribuição", + "steps": [ + "Crie um fork de MacRimi/ProxMenux no GitHub e clone esse fork.", + "Crie um ramo feature/* a partir de develop (veja Modelo de ramos acima).", + "Siga este guia para quaisquer scripts novos ou modificados. Escreva o cabeçalho com o seu nome; adicione a linha de patrocinador opcional se quiser.", + "Teste o script numa instância real do Proxmox VE: fase 1 com todos os ramos dos diálogos e fase 2 com cada operação e a reversão correta em caso de erro.", + "Abra um Pull Request contra develop com uma descrição clara: o que o script faz, o que mudou, em que versão Proxmox VE foi testado.", + "Certifique-se de que sua contribuição respeite o Código de Conduta." + ], + "securityOutro": "Para questões sensíveis à segurança, siga o fluxo de divulgação em SECURITY.md em vez de abrir um problema público." + }, + "whereNext": { + "heading": "Para onde seguir", + "items": [ + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md", + "label": "CONTRIBUTING.md (guia completo)", + "tail": " — a fonte da verdade para cada convenção, incluindo os padrões avançados de hardware." + }, + { + "kind": "internal", + "href": "/docs/about/contributors", + "label": "Contribuidores", + "tail": " — as pessoas cuja obra moldou os lançamentos do ProxMenux (página diferente deste)." + }, + { + "kind": "internal", + "href": "/docs/about/code-of-conduct", + "label": "Código de Conduta", + "tail": " — as normas que cada contribuinte aceita respeitar." + }, + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/discussions", + "label": "GitHub Discussions", + "tail": " — pergunte antes de você construir se você não tem certeza se uma ideia se encaixa, ou para encontrar colaboradores em um recurso maior." + } + ] + } +} diff --git a/web/messages/pt/docs/about/contributors.json b/web/messages/pt/docs/about/contributors.json new file mode 100644 index 00000000..c7d3a8e7 --- /dev/null +++ b/web/messages/pt/docs/about/contributors.json @@ -0,0 +1,38 @@ +{ + "meta": { + "title": "Colaboradores | Documentação ProxMenux", + "description": "Reconhecimento às pessoas que tornam o ProxMenux possível: quem testa, revê e desenvolve cada versão.", + "ogTitle": "Colaboradores | Documentação ProxMenux", + "ogDescription": "Conheça os colaboradores por trás do ProxMenux." + }, + "header": { + "title": "Colaboradores", + "description": "O projeto ProxMenux cresce graças aos seus colaboradores. Esta página reconhece o seu trabalho: testar versões antes da publicação, detetar regressões, rever PR e ajudar a orientar novas funcionalidades.", + "section": "Sobre" + }, + "beyond": { + "title": "Para além desta lista", + "body": "Muitas outras pessoas contribuem ao comunicar erros, propor funcionalidades em Discussions, testar versões beta e traduzir o projeto. A lista completa de colaboradores do código está no gráfico de colaboradores do GitHub. Esta página destaca quem participa mais ativamente nos testes e na revisão das versões do ProxMenux." + }, + "testers": { + "heading": "Testadores e revisores", + "intro": "Estas pessoas estiveram entre as primeiras a contribuir para o projeto. Os seus testes, relatos de problemas e sugestões de melhoria ajudaram o ProxMenux a tornar-se no que é hoje.", + "roles": { + "testing": "Teste", + "testingReviewer": "Testes e revisão" + }, + "youtube": "YouTube" + }, + "contribute": { + "heading": "Queres contribuir?", + "intro": "Todos os contributos são bem-vindos: código, testes, design, documentação ou simplesmente partilhar ideias:", + "tester": "Testes — experimente o canal beta e comunique o que funciona ou não antes da publicação das versões estáveis.", + "developer": "Desenvolvimento — Bash, Next.js (TypeScript) e algum Python para o ambiente virtual de tradução (venv). Os PR são bem-vindos no GitHub.", + "designer": "Designer — Melhorias de interface, ícones, capturas de tela para documentação.", + "ideas": "Ideias — abra um tópico em GitHub Discussions antes de criar uma issue para pedir uma funcionalidade." + }, + "coc": { + "title": "Leia primeiro o Código de Conduta", + "body": "Antes de propor código ou comunicar problemas, leia o Código de conduta e as boas práticas. Explica as expectativas sobre a responsabilidade pelo código, a comunicação de vulnerabilidades e o âmbito dos PR." + } +} diff --git a/web/messages/pt/docs/about/faq.json b/web/messages/pt/docs/about/faq.json new file mode 100644 index 00000000..ba153648 --- /dev/null +++ b/web/messages/pt/docs/about/faq.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Perguntas frequentes | Documentação ProxMenux", + "description": "Perguntas frequentes sobre o ProxMenux: funcionalidades, instalação, compatibilidade a partir do PVE 8, personalização, atualizações, segurança, uso em produção, ficheiros do sistema, contributos e desinstalação.", + "ogTitle": "Perguntas frequentes | Documentação ProxMenux", + "ogDescription": "Perguntas frequentes sobre instalação, compatibilidade, segurança e contribuição do ProxMenux." + }, + "header": { + "title": "Perguntas frequentes", + "description": "Perguntas comuns sobre o ProxMenux: o que é, a quem se destina, instalação, atualização, desinstalação, compatibilidade, personalização, segurança e contributos. Se não encontrar a sua pergunta, consulte GitHub Discussions ou abra uma issue.", + "section": "Sobre" + }, + "quickLinks": { + "title": "Ligações rápidas", + "installationLabel": "Instalação", + "installationSuffix": " — o comando de instalação de uma linha + dependências.", + "introductionLabel": "Introdução", + "introductionSuffix": " — o que faz ProxMenux, em 5 minutos.", + "uninstallLabel": "Desinstalar", + "uninstallSuffix": " — remoção limpa.", + "issuesLabel": "GitHub Issues", + "discussionsLabel": "Discussões" + }, + "q1": { + "question": "O que é o ProxMenux e para que é utilizado?", + "p1Rich": "ProxMenux é uma ferramenta de menu interativa projetada para tornar o Proxmox VE acessível a todos os usuários, independentemente de sua experiência técnica. Ele simplifica a execução de comandos, permitindo que os usuários executem ações em seu sistema sem exigir conhecimento avançado do Linux.", + "p2": "Os utilizadores menos experientes executam comandos através de menus estruturados, reduzindo a escrita manual no terminal. Os administradores experientes poupam passos em tarefas repetitivas: reforço de segurança após a instalação, passthrough de GPU, importação de VM OVF e rotação de snapshots ZFS.", + "p3": "Proxmox VE é amplamente utilizado para:", + "items": [ + "Virtualização de nível empresarial", + "HomeLab e soluções de nuvem pessoal", + "Servidores multimídia, automação e muito mais" + ] + }, + "q2": { + "question": "Como faço para instalar ProxMenux?", + "p1Rich": "Siga o guia de instalação. Em resumo:", + "stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"", + "p2": "Uma vez instalado, basta iniciar com:", + "menuCmd": "menu" + }, + "q3": { + "question": "O ProxMenux é compatível com todas as versões do Proxmox?", + "bodyRich": "Não — o ProxMenux requer Proxmox VE 8 ou posterior. O PVE 7 e as versões anteriores não são suportados. Se ainda usa o PVE 7, atualize primeiro para 8.x segundo o procedimento oficial do Proxmox. Depois, o ProxMenux pode tratar da passagem de 8 para 9 em Utilitários → Atualizar PVE 8 para PVE 9." + }, + "q4": { + "question": "Posso personalizar ProxMenux?", + "p1Rich": "As atualizações podem substituir alterações locais aos scripts principais, pelo que deve evitar editar esses ficheiros diretamente. O que pode personalizar:", + "items": [ + "O banner do console através da ferramenta FastFetch nas opções de Post-Install.", + "Quais componentes opcionais são instalados (Monitor, Fail2Ban, Lynis...) — escolha durante a instalação ou através do menu relevante mais tarde." + ] + }, + "q5": { + "question": "Como faço para atualizar o ProxMenux?", + "p1Rich": "Quando há uma nova versão, o ProxMenux deteta-a na próxima execução de menu e propõe a atualização. Se aceitar, os ficheiros e a configuração da ferramenta são substituídos na instalação existente, sem downloads manuais.", + "p2Rich": "Os utilizadores da versão estável recebem atualizações estáveis; os da beta recebem atualizações beta. Quando é publicada uma versão estável, a beta avisa na próxima abertura do menu e propõe a mudança automática. Consulte o programa beta." + }, + "q6": { + "question": "Onde posso comunicar problemas ou sugerir funcionalidades?", + "p1Rich": "Comunique erros em GitHub Issues. Inclua os passos para os reproduzir, a mensagem de erro e, quando relevante, a saída do Monitor obtida com journalctl -u proxmenux-monitor -n 50.", + "p2Rich": "No caso de problemas de segurança, não publique os detalhes. Siga o procedimento de divulgação responsável no código de conduta e boas práticas." + }, + "q7": { + "question": "Posso contribuir para o ProxMenux?", + "p1Rich": "Claro. O ProxMenux é um projeto colaborativo e de código aberto. Pode contribuir com código (Bash, Next.js/TypeScript e ferramentas de tradução em Python), testes, documentação, design ou ideias.", + "item1Rich": "Discuta as ideias em GitHub Discussions antes de abrir um pedido de funcionalidade.", + "item2Rich": "Antes de enviar uma pull request, leia o código de conduta e boas práticas.", + "item3Rich": "Consulte a página de colaboradores para saber quem participa atualmente nos testes e revisões." + }, + "q8": { + "question": "ProxMenux modifica arquivos críticos do sistema?", + "p1Rich": "A instalação do ProxMenux adiciona os seguintes componentes.", + "item1Rich": "Dependências via apt: dialog, curl, jq e git. As traduções usam catálogos JSON pré-gerados; o instalador não adiciona ao anfitrião um ambiente virtual de tradução.", + "item2Rich": "A árvore de scripts em /usr/local/share/proxmenux/.", + "item3Rich": "O comando de arranque em /usr/local/bin/menu.", + "item4Rich": "Opcional: o serviço systemd do Monitor, proxmenux-monitor.service.", + "p2Rich": "O ProxMenux não altera a configuração principal do Proxmox, salvo se o pedir explicitamente num menu específico. Por exemplo, a reparação de rede edita /etc/network/interfaces, mas apenas após a sua confirmação e a criação de uma cópia de segurança." + }, + "q9": { + "question": "É seguro usar ProxMenux na produção?", + "bodyRich": "Sim. Como o ProxMenux só altera os ficheiros principais do Proxmox quando solicitado explicitamente, pode ser usado em ambientes de produção. Como em qualquer automação, teste primeiro num ambiente controlado e tenha cópias de segurança antes de operações destrutivas: atualização do PVE 8 para 9, formatação de discos, eliminação de VM, entre outras." + }, + "q10": { + "question": "Como faço para desinstalar ProxMenux?", + "p1Rich": "No ProxMenux: Definições → Desinstalar ProxMenux. A desinstalação remove os scripts, o comando de arranque e o serviço Monitor, além das dependências selecionadas, se assim escolher. Restaura /root/.bashrc e /etc/motd a partir das cópias criadas na instalação, caso existam.", + "p2Rich": "Passo a passo completo: Desinstalar ProxMenux." + }, + "q11": { + "question": "VirusTotal sinaliza o URL de instalação — é seguro?", + "p1Rich": "O resultado de 1/95 do motor Chong Lua Dao, comunicado na issue #162, foi identificado pelo responsável do projeto como um falso positivo. O instalador usa o padrão curl | bash e pode descarregar jq da sua versão oficial no GitHub. Este comportamento pode ativar análises heurísticas; esse relatório histórico não avalia todos os downloads futuros.", + "p2Rich": "O ProxMenux é totalmente de código aberto e pode analisar o script de instalação linha a linha: install_proxmenux.sh. Mais contexto na issue #162." + } +} diff --git a/web/messages/pt/docs/about/index.json b/web/messages/pt/docs/about/index.json new file mode 100644 index 00000000..47bd27c2 --- /dev/null +++ b/web/messages/pt/docs/about/index.json @@ -0,0 +1,67 @@ +{ + "meta": { + "title": "Sobre o projeto | Documentação ProxMenux", + "description": "Sobre o ProxMenux: objetivos do projeto, colaboradores, FAQ e Código de Conduta. Ferramenta de gerenciamento orientada por menus de código aberto para Proxmox VE 8+, construída e mantida pela MacRimi com uma pequena equipe de testadores e colaboradores.", + "ogTitle": "Sobre o projeto | Documentação ProxMenux", + "ogDescription": "Sobre ProxMenux — ferramenta de gestão orientada por menus de código aberto para Proxmox VE 8+." + }, + "header": { + "title": "Sobre", + "description": "Informações do projeto, perguntas frequentes, colaboradores e código de conduta. O ProxMenux é uma ferramenta de gestão por menus, de código aberto, para Proxmox VE 8+, desenvolvida e mantida por MacRimi com a ajuda de uma pequena equipa de testes e colaboradores.", + "section": "Sobre" + }, + "callout": { + "title": "Código aberto, baseado na comunidade", + "body": "O ProxMenux é distribuído sob a licença GPL-3.0 e desenvolvido publicamente no GitHub. Cada script pode ser revisto e cada alteração rastreada. São bem-vindos relatos de erros, ideias, código e testes." + }, + "section": { + "heading": "Nesta secção", + "options": [ + { + "icon": "HelpCircle", + "href": "/docs/about/faq", + "title": "FAQ", + "description": "Perguntas frequentes: o que é o ProxMenux, instalação, compatibilidade, personalização, atualizações, segurança, uso em produção e desinstalação." + }, + { + "icon": "Users", + "href": "/docs/about/contributors", + "title": "Colaboradores", + "description": "Reconhecimento às pessoas que tornam o ProxMenux possível: quem testa, revê e desenvolve cada versão." + }, + { + "icon": "ScrollText", + "href": "/docs/about/code-of-conduct", + "title": "Código de Conduta", + "description": "Valores do projeto, expectativas de responsabilidade de código e diretrizes de contribuição. Leitura necessária antes de abrir um PR ou relatório." + } + ] + }, + "involved": { + "heading": "Participe", + "intro": "Três lugares para se envolver com o projeto:", + "cards": [ + { + "href": "https://github.com/MacRimi/ProxMenux/issues/new", + "title": "🐛 Comunicar um erro", + "description": "GitHub Issues — inclua os registos e os passos para reproduzir o problema." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/discussions", + "title": "💡 Sugerir uma funcionalidade", + "description": "GitHub Discussions — partilhe ideias antes de abrir um PR." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/pulls", + "title": "🔀 Enviar um PR", + "description": "GitHub Pull Requests — leia primeiro o Código de Conduta." + } + ] + }, + "support": { + "heading": "Apoiar o projecto", + "introRich": "Se o ProxMenux lhe poupa tempo, a forma mais simples de o dar a conhecer é atribuir uma ⭐ ao repositório no GitHub. Se quiser ir mais longe:", + "kofiLabel": "Apoio em Ko-fi", + "kofiOutro": " — compra um café ao mantenedor e mantém o desenvolvimento." + } +} diff --git a/web/messages/sk/docs/about/code-of-conduct.json b/web/messages/sk/docs/about/code-of-conduct.json new file mode 100644 index 00000000..e46fc339 --- /dev/null +++ b/web/messages/sk/docs/about/code-of-conduct.json @@ -0,0 +1,13 @@ +{ + "meta": { + "title": "Pravidlá správania | Dokumentácia ProxMenux", + "description": "Kódex správania ProxMenux a najlepšie postupy pre prispievateľov, testerov a používateľov.", + "ogTitle": "Pravidlá správania | Dokumentácia ProxMenux", + "ogDescription": "Očakávania týkajúce sa zodpovednosti za kód, oznamovania bezpečnostných chýb a rozsahu PR v projekte ProxMenux." + }, + "errors": { + "notFound": "Chyba: Súbor CODE_OF_CONDUCT.md nebol nájdený.", + "loadFailed": "Chyba: Nemožno načítať obsah kódexu správania." + }, + "contentMarkdown": "# 📝 Kódex správania a odporúčané postupy\n\nTento dokument stanovuje **zásady a usmernenia** na používanie **ProxMenuxu** s cieľom podporovať **rešpekt, spoluprácu a bezpečnosť** pri vývoji.\n\n## 📌 1. Uvedenie autorstva kódu a uznanie\n\n- Pri použití **skriptov, úryvkov kódu alebo nápadov** z iných repozitárov či od iných vývojárov bude vždy uvedený pôvodný autor.\n- V kóde alebo dokumentácii bude komentár s uvedením zdroja a podľa možnosti s odkazom na pôvodný repozitár.\n- Pri použití kódu s konkrétnou **licenciou** je potrebné dodržať jej podmienky.\n\n### ✅ Príklad správneho uvedenia zdroja v kóde:\n\n```bash\n# Skript vychádza z práce [Autor] v [Odkaz na repozitár]\n```\n\n## 🔒 2. Bezpečnosť a zodpovednosť za kód\n\n- Všetok kód v tomto repozitári dodržiava odporúčané postupy bezpečného vývoja.\n- Príspevky, ktoré úmyselne zavádzajú zraniteľnosti alebo nebezpečné postupy, nie sú povolené.\n- Skripty nikdy nesmú ohroziť bezpečnosť systému ani údaje používateľov.\n- Pred implementáciou je potrebné príspevky skontrolovať z hľadiska bezpečnosti a stability.\n\n### ⚠️ Zodpovedné nahlasovanie zraniteľností\n\nAk objavíte bezpečnostnú zraniteľnosť, NEHLÁSTE ju vo verejných issues ani na fórach.\n\nNamiesto toho ju nahláste súkromne e-mailom:\n\n📧 proxmenux@macrimi.pro\n\nPodrobnosti o bezpečnostných zraniteľnostiach a ich nahlasovaní nájdete v našich [bezpečnostných zásadách](./SECURITY.md).\n\n## 🤝 3. Pravidlá komunity\n\nNa zachovanie rešpektujúceho a profesionálneho prostredia musia všetci používatelia dodržiavať tieto pravidlá:\n\n- ✅ V diskusiách buďte úctiví a konštruktívni.\n- ❌ Obťažovanie, nenávistné prejavy ani urážlivé správanie sa nebudú tolerovať.\n- ✅ Spätnú väzbu poskytujte profesionálne a bez osobných útokov.\n- ❌ Porušenie pravidiel môže podľa závažnosti viesť k upozorneniu alebo vylúčeniu.\n\n##\n\nTento dokument podporuje etické používanie kódu, povedomie o bezpečnosti a rešpektujúcu komunitu.\n\n📢 Vytvorme spolu niečo skvelé!\n" +} diff --git a/web/messages/sk/docs/about/contributing.json b/web/messages/sk/docs/about/contributing.json new file mode 100644 index 00000000..b92d38f7 --- /dev/null +++ b/web/messages/sk/docs/about/contributing.json @@ -0,0 +1,293 @@ +{ + "meta": { + "title": "Prispievanie k ProxMenux | ProxMenux Dokumentácia", + "description": "Ako prispieť do ProxMenux: model vetiev (main / develop / feature/*), postup pull requestu, hlavička skriptu s autorstvom a voliteľným odkazom na podporu, dvojfázové rozhranie, funkcie správ a cesta od vetvy funkcie po stabilné vydanie.", + "ogTitle": "Prispievanie k ProxMenux", + "ogDescription": "Model vetiev, pracovný postup, autorstvo v hlavičke a dvojfázové rozhranie, ktoré musia prispievatelia dodržiavať." + }, + "header": { + "title": "Prispievanie k ProxMenux", + "description": "ProxMenux víta príspevky komunity: nové skripty, opravy existujúcich, vylepšenia dialógov, preklady aj integrácie. Táto stránka vysvetľuje štruktúru repozitára, model vetiev a postup pull requestu, hlavičku skriptu s autorstvom a voliteľným odkazom na podporu aj pravidlá návrhu pre každý príspevok.", + "section": "O projekte" + }, + "twoPagesCallout": { + "title": "Dve súvisiace stránky, jeden projekt", + "body": "Nemýľte si túto stránku s Prispievateľmi: tá oslavuje ľudí, ktorí už prispievajú (testeri, recenzenti, vývojári). Táto stránka je pre vás – potenciálneho prispievateľa – a vysvetľuje, ako poslať PR, ktoré bude zlúčené." + }, + "branching": { + "heading": "Model vetiev", + "intro": "ProxMenux používa trojstupňový vetviaci model:", + "headerBranch": "Vetva", + "headerPurpose": "Účel", + "rows": [ + { + "branch": "main", + "purposeRich": "Stabilný kód pripravený na produkciu. Sem sa začleňujú iba zmeny pripravené na vydanie. Túto verziu dostanú používatelia pri bežnej inštalácii ProxMenux." + }, + { + "branch": "develop", + "purposeRich": "Aktívna vývojová vetva. Všetky nové zmeny sa najskôr začleňujú sem; ide o kanál „beta“. Keď je stabilné vydanie pripravené, z tejto vetvy sa prenesie do main." + }, + { + "branch": "feature/*", + "purposeRich": "Krátkodobé vetvy pre funkciu, opravu alebo vylepšenie. Vzniknú z develop a po kontrole sa cez pull request zlúčia späť do develop." + } + ], + "calloutTitle": "Čo to znamená pre užívateľov", + "calloutBody": "Používatelia vetvy main dostávajú otestované vydania. Kto chce nové funkcie skôr a znesie občasné nedostatky, môže sledovať develop. Nové funkcie vždy najprv prejdú cez develop; bez tohto cyklu sa do main nedostanú." + }, + "workflow": { + "heading": "Postup pull requestu", + "intro": "Od nápadu po začlenenie do vydania v piatich krokoch:", + "step1Lead": "Vytvorte vetvu pre funkciu z develop:", + "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": "Použite výstižný názov vetvy: feature/zfs-arc-tuning, feature/fix-iommu-detection, feature/add-tailscale-script.", + "step2Lead": "Pracujte na svojich zmenách a posuňte vetvu:", + "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": "Otvorte pull request do develop, nie do main. Na GitHube overte, že základná vetva je develop. Opíšte účel skriptu, jeho zmeny a verzie Proxmox VE, na ktorých ste ho testovali.", + "step4": "Po kontrole sa zmeny zlúčia do develop. Správca skontroluje kvalitu kódu, hlavičky a dvojfázové rozhranie. Ak vyžiada úpravy, odošlite ďalšie commity do rovnakej vetvy; PR sa aktualizuje automaticky.", + "step5": "Stabilné vydania sa prenášajú z develop do main. Pri vydaní sa main posunie na develop pomocou fast-forward a označí sa tagom. Váš príspevok sa stane súčasťou ďalšej stabilnej verzie." + }, + "scriptHeader": { + "heading": "Hlavička skriptu: metadáta a popis", + "intro": "Každý skript ProxMenux začína dvoma susednými blokmi komentárov, ktoré tvoria hlavičku. Oba sú povinné: prezradia autora a účel bez potreby čítať samotný kód.", + "bullets": [ + "Horný blok: metadáta. Autor, voliteľné odkazy na GitHub a podporu, správca, autorské práva, licencia, verzia a dátum aktualizácie. Tu prebieha aj uznanie prispievateľov: pri novom skripte uveďte svoje meno a voliteľne stránku GitHub a profil podpory, napríklad Ko-fi, GitHub Sponsors alebo Buy Me a Coffee.", + "Dolný blok: popis. Krátky odsek v jednoduchej angličtine vysvetľuje skript. Číta sa pred kódom a musí sám objasniť účel, hlavné akcie, dotknuté zdroje a predpoklady." + ], + "licenseCalloutTitle": "Licenčná linka je pevne stanovená GPL-3.0", + "licenseCalloutBody": "ProxMenux je vydaný pod GNU General Public License v3.0. Všetky skripty používajú rovnakú licenciu; riadok License v hlavičke musí obsahovať odkaz GPL-3.0 z príkladu nižšie. Nie je to voľba pre jednotlivý skript. Prispením súhlasíte s vydaním pod GPL-3.0: každý môže skript čítať, upraviť a ďalej šíriť vrátane zmien pri zachovaní rovnakej licencie. Úplné znenie: MacRimi/ProxMenux/LICENSE.", + "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": "Riadky GitHub a Sponsor sú voliteľné – vynechajte ich, ak ich nechcete zverejniť. Všetko ostatné sa vyžaduje.", + "whyCalloutTitle": "Prečo na tom záleží", + "whyCalloutBody": "Prispievanie do otvoreného softvéru je dobrovoľná práca. Meno a prípadný odkaz na podporu priamo v zdrojovom kóde zviditeľňujú autorstvo pri každom čítaní; nestratí sa za názvom projektu. Popis má iný význam: je prvou vecou, ktorú číta budúci správca alebo zvedavý používateľ. Jasný popis často rozhoduje, či skriptu dôverujú alebo sa mu vyhnú." + }, + "structure": { + "heading": "Štruktúra projektu", + "intro": "Kde sa v repozitári nachádzajú jednotlivé druhy skriptov:", + "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": "Každý skript pri štarte načíta utils.sh pomocou source, aby získal funkcie správ, indikátor priebehu, farby a prekladový systém. Zdieľané pomocné knižnice v scripts/global/ výslovne načítavajú skripty, ktoré ich potrebujú." + }, + "twoPhase": { + "heading": "Dvojfázová politika návrhu UI", + "intro": "Ide o najdôležitejšie pravidlo ProxMenux a najčastejší dôvod požiadaviek na úpravu PR. Každý skript je rozdelený na presne dve fázy:", + "headerPhase": "Fáza", + "headerPurpose": "Účel", + "headerScreen": "Stav obrazovky", + "rows": [ + { + "phaseRich": "Fáza 1: výber", + "purposeRich": "Zbierajte každé rozhodnutie užívateľa. Spustite všetky potrebné prípravné práce (sondy, skeny, kontroly).", + "screenRich": "Prekrytia dialog. Ak kontrola medzi ponukami trvá viac ako sekundu či dve, zobrazte indikátor msg_info, aby používateľ vedel, že skript nezamrzol. Tesne pred ďalším dialógom zavolajte stop_spinner." + }, + { + "phaseRich": "Fáza 2: vykonanie", + "purposeRich": "Vykonajte všetky operácie. Na obrazovke postupne zobrazujte úplnú históriu priebehu.", + "screenRich": "Viditeľné hlásenia msg_info / msg_ok; nikdy nie dialog." + } + ], + "principle": "Zásada: najprv zhromaždiť všetky voľby, potom všetko vykonať. Používateľ najprv pracuje s prehľadným dialógovým menu (fáza 1) a potom sleduje vykonávanie vo forme záznamu (fáza 2). Fázy sa nemiešajú: počas vykonávania sa neotvárajú dialógy a počas výberu sa nevypisuje priebeh.", + "phase1Heading": "Fáza 1: typický vzor", + "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": "Pravidlá pre fázu 1:", + "phase1Rules": [ + "Ak beží indikátor msg_info a potrebujete otvoriť ponuku dialog alebo whiptail, najprv zavolajte stop_spinner. Indikátor nemôže bežať súčasne s prekrytím týchto nástrojov. Ak indikátor nebeží, volanie nie je potrebné.", + "Použite show_proxmenux_logo + msg_title + msg_info na vizuálny kontext dlhej operácie vo fáze 1, napríklad kontroly trvajúcej päť sekúnd či viac. Funkcia už vyčistí obrazovku, preto pred ňou nevolajte clear.", + "Nevolajte show_proxmenux_logo medzi dialógovými menumi, kde nie je čo zobraziť, a vyčistenie obrazovky prázdneho terminálu je len vizuálny hluk.", + "Uložte všetky rozhodnutia a výsledky sondy v premenných alebo paralelných poliach. Viditeľné zhrnutie sa uskutoční na začiatku fázy 2, nie vo fáze 1." + ], + "phase2Heading": "Fáza 2: typický vzor", + "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": "Pravidlá fázy 2: začnite s show_proxmenux_logo + msg_title a hneď zhrňte výsledky fázy 1 riadkami msg_ok. Už nevolajte show_proxmenux_logo, pretože by vymazalo nahromadený priebeh. Nevolajte dialog; pri nevyhnutnom rozhodnutí za behu použite whiptail podľa nasledujúcej časti." + }, + "dialogVsWhiptail": { + "headingRich": "Kedy používať dialog vs whiptail", + "intro": "Oba nástroje vykresľujú textové používateľské rozhranie, ale na obrazovke sa správajú odlišne. ProxMenux ich preto používa v dvoch samostatných fázach.", + "headerTool": "Nástroj", + "headerWhen": "Kedy ju použiť", + "headerEffect": "Účinok na obrazovku", + "rows": [ + { + "toolRich": "dialog", + "whenRich": "Vždy vo fáze 1. Každý interaktívny výber, napríklad VM, disk, súborový systém alebo potvrdenie akcie, používa dialog. Ide o predvolený nástroj rozhrania ProxMenux.", + "effectRich": "Preberá terminál: vyčistí obrazovku, kreslí jej prekrývanie a pri zatvorení vráti terminál do svojho predchádzajúceho stavu. Fáza 1, pretože zatiaľ nič užitočné neukazuje." + }, + { + "toolRich": "whiptail", + "whenRich": "Iba vo fáze 2, iba ak je to nevyhnutné. Typickým prípadom je výzva na reštartovanie na konci vykonávania. Nesiahajte po whiptail, aby ste sa spýtali „pokračovať?“ uprostred vykonávania — toto rozhodnutie malo byť urobené vo fáze 1.", + "effectRich": "Ľahšie prekrytie, ktoré nevymaže kontext terminálu. Nahromadená história msg_ok/msg_info z fázy 2 zostane viditeľná za dialógom. Preto je vhodné, keď už obrazovka zobrazuje priebeh." + } + ], + "calloutTitle": "Prečo je rozdelenie dôležité", + "calloutBody": "Ak zavoláte dialog uprostred fázy 2, zmiznú všetky riadky msg_ok, ktoré používateľ dovtedy sledoval. Vymažete tým viditeľný záznam vykonaných krokov. whiptail tomu zabráni. Pravidlo teda nie je svojvoľné: zachováva používateľovi prehľad o tom, čo skript doteraz urobil.", + "rebootHeading": "Výzva na reštart: typické použitie whiptail vo fáze 2", + "rebootIntro": "Ak môže byť po skončení skriptu potrebný reštart, napríklad po zapnutí IOMMU alebo zmene parametrov jadra, výzva na konci fázy 2 používa whiptail. Vždy pridajte vetvu Nie, ktorá upozorní, aby používateľ nepoužíval dotknutý zdroj pred reštartom:", + "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": "Prehľad funkcií správ", + "intro": "Všetky sú definované v utils.sh. Používajte ich pre výstup viditeľný používateľovi, aby skripty mali jednotný vzhľad. Ak potrebujete novú funkciu, napríklad úroveň závažnosti alebo pomocníka rozloženia, navrhnite ju v pull requeste. Po kontrole sa pridá do utils.sh, ak má širšie využitie.", + "headerFunction": "Funkcia", + "headerWhen": "Kedy používať", + "headerSpinner": "Indikátor priebehu", + "rows": [ + { + "function": "msg_info \"text\"", + "whenRich": "Prebieha operácia.", + "spinner": "Spustí" + }, + { + "function": "stop_spinner", + "whenRich": "Koniec tichej prípravnej práce vo fáze 1: zastaví indikátor a vyčistí riadok.", + "spinner": "Zastaví" + }, + { + "function": "msg_ok \"text\"", + "whenRich": "Operácia bola úspešná. Použite aj pre zapnutú funkciu, hoci je ešte potrebný reštart.", + "spinner": "Zastaví" + }, + { + "function": "msg_warn \"text\"", + "whenRich": "Skutočné varovanie alebo zhoršený stav.", + "spinner": "Zastaví" + }, + { + "function": "msg_error \"text\"", + "whenRich": "Závažná chyba.", + "spinner": "Zastaví" + }, + { + "function": "msg_info2 \"text\"", + "whenRich": "Neblokujúce odporúčanie, tyrkysový informačný riadok.", + "spinner": "Zastaví" + }, + { + "function": "msg_success \"text\"", + "whenRich": "Záverečná výzva „Stlačte Enter pre návrat“ na konci fázy 2.", + "spinner": "Zastaví" + }, + { + "function": "msg_title \"text\"", + "whenRich": "Tučný nadpis so zabudovanými rozostupmi. Používa sa na začiatku fázy 2.", + "spinner": "—" + }, + { + "function": "show_proxmenux_logo", + "whenRich": "Vyčistí obrazovku a zobrazí logo. Na začiatku fázy 2 sa volá raz.", + "spinner": "—" + } + ] + }, + "dialogConventions": { + "heading": "Pravidlá používania dialog", + "bullets": [ + "Každému volaniu dialog a whiptail vždy odovzdajte --backtitle \"$BACKTITLE\". $BACKTITLE je vždy \"ProxMenux\", nastavené raz v hlavičke skriptu a nikdy neprepísané. Rámec rozhrania musí používateľovi ukazovať názov projektu, nie vlastný nadpis skriptu.", + "Vždy zabaľte titulky a správy s $(translate \"...\").", + "Vždy presmerujte dialog výstup pomocou 2>&1 >/dev/tty — zachytený stdout sa stane výberom používateľa, zatiaľ čo samotné dialógové okno sa kreslí na terminál.", + "Použite štandardné premenné rozmerov UI ($UI_MENU_H, $UI_MSG_W, atď.) pre konzistentnú veľkosť medzi skriptmi.", + "Vždy skontrolujte prázdne / zrušené výbery a zaobchádzajte s nimi elegantne." + ], + "exampleIntro": "Úplný príklad: vytvorenie ponuky na výber VM a spracovanie zrušenia.", + "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": "Politika prekladu", + "intro": "Všetky užívateľsky viditeľné reťazce musia byť zabalené s funkciou translate. ProxMenux ich automaticky prekladá do všetkých podporovaných jazykov, ktoré píšete anglicky, užívateľ číta ich rodný jazyk.", + "code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...", + "bullets": [ + "Reťazce píšte po anglicky; preklad sa spracuje automaticky pri zostavení.", + "Udržujte stručnosť. Ak je to možné, nepoužívajte premenné vo vnútri dlhých viet.", + "Neprekladajte názvy premenných, cesty ani technické identifikátory." + ] + }, + "variableStyle": { + "heading": "Pravidlá premenných a štýlu", + "bullets": [ + "Pre premenné úrovne skriptov použite UPPER_CASE.", + "Pre lokálne funkčné premenné (vyhlásiť s local) použite lower_case.", + "Všetky rozvinutia premenných uzavrite do úvodzoviek: \"$VAR\", nie $VAR.", + "Použite [[ ]] pre podmienky, nie [ ] (s výnimkou prípadov, keď sa POSIX vyžaduje).", + "show_proxmenux_logo je správny spôsob vyčistenia obrazovky: vyčistí ju a zobrazí logo projektu pre vizuálny kontext. Zavolajte ho raz na začiatku fázy 2 a voliteľne pred dlhou prípravnou kontrolou s indikátorom vo fáze 1." + ], + "standardNamesIntro": "Štandardné názvy premenných v rámci projektu:", + "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": "Presmerovanie výstupu nástroja počas fázy 2", + "redirectIntro": "Fáza 2 zobrazuje prehľadný záznam riadkov msg_info → msg_ok. Ak volaný nástroj, napríklad apt, mkfs, qm, pct alebo dd, zapisuje na stdout/stderr, posúva správy a naruší prehľad. Používateľ potom nerozozná priebeh skriptu od podrobného výstupu nástroja.", + "withoutRedirectIntro": "Bez presmerovania: čo používateľ vidí, ak neošetríte rušivý výstup.", + "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": "S presmerovaním — ako vyzerá tá istá operácia, keď je šum odoslaný inam:", + "withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.", + "twoPatternsIntro": "Dva vzory na výber:", + "discardLead": "Zahodiť výstup, ak ho nepotrebujete: najjednoduchšia a najrýchlejšia možnosť.", + "discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1", + "logLead": "Pošlite výstup do súboru denníka, keď ho budete chcieť neskôr skontrolovať (ladenie neúspešnej inštalácie, kontrola toho, čo dpkg skutočne urobil). Toto je preferovaný vzor pre akúkoľvek operáciu apt:", + "logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1", + "referenceOutro": "scripts/global/update-pve9_2.sh je referenčná implementácia: každé volanie apt-get zapisuje do súboru záznamu. Používateľ vidí iba prehľadný tok msg_info → msg_ok, no pri probléme možno zo súboru presne zistiť, čo apt vykonal." + }, + "dosAndDonts": { + "heading": "Čo robiť a čomu sa vyhnúť", + "doHeading": "✅ Robiť", + "doBullets": [ + "stop_spinner pred dialog vo fáze 1 iba vtedy, keď msg_info spinner beží.", + "Fáza 2 začína s show_proxmenux_logo + msg_title + msg_ok zhrnutie výsledkov fázy 1.", + "Pre úspešne zapnuté funkcie použite msg_ok, aj keď je potrebný reštart.", + "Používajte whiptail (nie dialog) pre akýkoľvek postup po vykonaní, ktorý sa musí objaviť vo fáze 2.", + "V dialógových oknách reštartu vždy zahrňte vetvu „Nie“, ktorá varuje používateľa, aby nespúšťal dotknutý zdroj, kým nebude reštartovaný.", + "Logiku určenú iba pre VM chráňte kontrolou [[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]]: radiče a NVMe PCIe nemožno priradiť LXC cez PCI passthrough.", + "Použite ensure_repositories z utils-install-functions.sh namiesto bezpodmienečného apt-get update.", + "Používajte paralelné polia vo fáze 1, ak každá položka potrebuje viac dialógov." + ], + "dontHeading": "❌ Nerobiť", + "dontBullets": [ + "Zavolajte dialog, kým je spinner aktívny.", + "Preskočiť zhrnutie fázy 1 na začiatku fázy 2.", + "Zavolať show_proxmenux_logo druhýkrát; vymaže všetko, čo fáza 2 vypísala.", + "Použite dialog vo fáze 2 (použite whiptail pre zriedkavý nevyhnutný prípad).", + "Použite holý clear.", + "Obaľovať msg_title prázdnymi riadkami echo \"\" — potrebné medzery už obsahuje.", + "Použiť msg_warn pre hlásenie úspešne zapnutej funkcie, ktorá je msg_ok.", + "Spustiť bezpodmienečné apt-get update; namiesto toho použite ensure_repositories." + ] + }, + "submitting": { + "heading": "Predloženie príspevku", + "steps": [ + "Vytvorte fork repozitára MacRimi/ProxMenux na GitHube a potom svoj fork naklonujte.", + "Vytvorte vetvu feature/* z develop (pozrite Model vetiev vyššie).", + "Postupujte podľa tejto príručky pre akékoľvek nové alebo zmenené skripty. Napíšte hlavičku s Vaším menom; pridajte voliteľný riadok sponzora, ak chcete.", + "Otestujte skript na skutočnej inštancii Proxmox VE: fázu 1 so všetkými vetvami dialógov a fázu 2 so všetkými operáciami aj čistým návratom pri chybe.", + "Otvorte pull request do vetvy develop s jasným opisom: čo skript robí, čo sa zmenilo a na ktorej verzii Proxmox VE bol otestovaný.", + "Uistite sa, že váš príspevok rešpektuje Kódex správania." + ], + "securityOutro": "Pokiaľ ide o otázky citlivé na bezpečnosť, postupujte podľa toku zverejnenia v SECURITY.md namiesto otvárania verejnej otázky." + }, + "whereNext": { + "heading": "Kam ďalej", + "items": [ + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md", + "label": "CONTRIBUTING.md (úplný sprievodca)", + "tail": " — záväzný zdroj všetkých pravidiel vrátane pokročilých hardvérových postupov." + }, + { + "kind": "internal", + "href": "/docs/about/contributors", + "label": "Prispievatelia", + "tail": " — ľudia, ktorých práca formovala vydania ProxMenux. Ide o inú stránku než túto." + }, + { + "kind": "internal", + "href": "/docs/about/code-of-conduct", + "label": "Kódex správania", + "tail": " — Každý prispievateľ súhlasí s dodržiavaním noriem." + }, + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/discussions", + "label": "GitHub Discussions", + "tail": " — Ak si nie ste istí, či idea sedí, alebo nájsť spolupracovníkov na väčšiu funkciu, spýtajte sa pred stavaním." + } + ] + } +} diff --git a/web/messages/sk/docs/about/contributors.json b/web/messages/sk/docs/about/contributors.json new file mode 100644 index 00000000..cff3f316 --- /dev/null +++ b/web/messages/sk/docs/about/contributors.json @@ -0,0 +1,38 @@ +{ + "meta": { + "title": "Prispievatelia | Dokumentácia ProxMenux", + "description": "Poďakovanie ľuďom, vďaka ktorým ProxMenux vzniká: testerom, kontrolórom a vývojárom, ktorí sa podieľajú na každom vydaní.", + "ogTitle": "Prispievatelia | Dokumentácia ProxMenux", + "ogDescription": "Zoznámte sa s prispievateľmi ProxMenux." + }, + "header": { + "title": "Prispievatelia", + "description": "Projekt ProxMenux rastie vďaka svojim prispievateľom. Táto stránka oceňuje ich prácu: testovanie zostáv pred vydaním, odhaľovanie regresií, kontrolu PR a formovanie nových funkcií.", + "section": "O projekte" + }, + "beyond": { + "title": "Ďalší prispievatelia", + "body": "Mnohí ďalší ľudia prispievajú hlásením chýb, návrhmi funkcií v Discussions, beta testovaním a prekladmi. Úplný zoznam prispievateľov do kódu nájdete v grafe prispievateľov na GitHube. Táto stránka vyzdvihuje ľudí, ktorí sa najaktívnejšie zapájajú do testovania a kontroly vydaní ProxMenuxu." + }, + "testers": { + "heading": "Testeri a kontrolóri", + "intro": "Títo ľudia patrili medzi prvých prispievateľov do projektu. Testovaním, hlásením problémov a návrhmi zlepšení pomohli ProxMenuxu vyrásť do dnešnej podoby.", + "roles": { + "testing": "Testovanie", + "testingReviewer": "Testovanie a kontrola" + }, + "youtube": "YouTube" + }, + "contribute": { + "heading": "Chceš prispieť?", + "intro": "Akýkoľvek príspevok je vítaný – kód, testovanie, dizajn, dokumentácia alebo len zdieľanie nápadov:", + "tester": "Tester — vyskúšajte beta kanál a pred stabilným vydaním nahláste, čo funguje a čo nie.", + "developer": "Vývojár — Bash, Next.js (TypeScript) a trochu Pythonu pre virtuálne prostredie prekladov (venv). PR na GitHube sú vítané.", + "designer": "Dizajnér — vylepšenia používateľského rozhrania, ikony a snímky obrazovky pre dokumentáciu.", + "ideas": "Nápady — pred vytvorením požiadavky na novú funkciu otvorte tému v GitHub Discussions." + }, + "coc": { + "title": "Najprv si prečítajte kódex správania", + "body": "Pred odoslaním kódu alebo nahlásením problému si prečítajte Pravidlá správania a osvedčené postupy. Opisujú očakávania týkajúce sa zodpovednosti za kód, oznamovania bezpečnostných chýb a rozsahu PR." + } +} diff --git a/web/messages/sk/docs/about/faq.json b/web/messages/sk/docs/about/faq.json new file mode 100644 index 00000000..52fe8bd1 --- /dev/null +++ b/web/messages/sk/docs/about/faq.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Časté otázky | Dokumentácia ProxMenux", + "description": "Časté otázky o ProxMenuxe: funkcie, inštalácia, kompatibilita od PVE 8, prispôsobenie, aktualizácie, bezpečnosť, produkčné použitie, systémové súbory, prispievanie a odinštalovanie.", + "ogTitle": "Časté otázky | Dokumentácia ProxMenux", + "ogDescription": "Časté otázky o inštalácii ProxMenuxu, kompatibilite, bezpečnosti a možnostiach prispievania." + }, + "header": { + "title": "Často kladené otázky", + "description": "Bežné otázky o ProxMenuxe: čo to je, komu slúži, inštalácia, aktualizácia, odinštalovanie, kompatibilita, prispôsobenie, bezpečnosť a prispievanie. Ak tu svoju otázku nenájdete, pozrite si GitHub Discussions alebo vytvorte issue.", + "section": "O projekte" + }, + "quickLinks": { + "title": "Rýchle odkazy", + "installationLabel": "Inštalácia", + "installationSuffix": " — inštalačný príkaz na jednom riadku a potrebné závislosti.", + "introductionLabel": "Úvod", + "introductionSuffix": " — čo ProxMenux robí, za päť minút.", + "uninstallLabel": "Odinštalovať", + "uninstallSuffix": " — úplné odstránenie programu.", + "issuesLabel": "GitHub Issues", + "discussionsLabel": "Diskusie" + }, + "q1": { + "question": "Čo je ProxMenux a na čo slúži?", + "p1Rich": "ProxMenux je interaktívny nástroj s ponukami, ktorý sprístupňuje Proxmox VE všetkým používateľom bez ohľadu na ich technické skúsenosti. Zjednodušuje vykonávanie príkazov a umožňuje spravovať systém bez pokročilých znalostí Linuxu.", + "p2": "Menej skúsení používatelia môžu spúšťať príkazy cez prehľadné ponuky a nemusia ich ručne zadávať do terminálu. Skúseným správcom ProxMenux šetrí kroky pri opakovaných úlohách: zabezpečení po inštalácii, GPU passthrough, importe VM vo formáte OVF a rotácii snímok ZFS.", + "p3": "Proxmox VE sa široko používa na:", + "items": [ + "Virtualizácia na podnikovej úrovni", + "HomeLab a osobné cloudové riešenia", + "Multimediálne servery, automatizácia a ďalšie" + ] + }, + "q2": { + "question": "Ako nainštalujem ProxMenux?", + "p1Rich": "Postupujte podľa inštalačnej príručky. V skratke:", + "stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"", + "p2": "Po nainštalovaní jednoducho spustite:", + "menuCmd": "menu" + }, + "q3": { + "question": "Je ProxMenux kompatibilný so všetkými verziami Proxmoxu?", + "bodyRich": "Nie — ProxMenux vyžaduje Proxmox VE 8 alebo novší. PVE 7 a staršie verzie nie sú podporované. Ak ešte používate PVE 7, najskôr prejdite na 8.x podľa oficiálneho postupu Proxmoxu. Následný prechod z 8 na 9 môžete vykonať v ProxMenuxe cez Nástroje → Aktualizovať PVE 8 na PVE 9." + }, + "q4": { + "question": "Môžem prispôsobiť ProxMenux?", + "p1Rich": "Aktualizácie môžu prepísať miestne zmeny hlavných skriptov, preto tieto súbory neupravujte priamo. Prispôsobiť si však môžete:", + "items": [ + "Banner konzoly prostredníctvom nástroja FastFetch v možnostiach po inštalácii.", + "Ktoré voliteľné súčasti sa nainštalujú (Monitor, Fail2Ban, Lynis a ďalšie): vyberiete ich počas inštalácie alebo neskôr v príslušných ponukách." + ] + }, + "q5": { + "question": "Ako aktualizujem ProxMenux?", + "p1Rich": "Keď je dostupná nová verzia, ProxMenux ju zistí pri ďalšom spustení menu a ponúkne aktualizáciu. Ak ju prijmete, nahradí súbory a konfiguráciu nástroja v existujúcej inštalácii. Nemusíte nič sťahovať ručne.", + "p2Rich": "Používatelia stabilnej verzie dostávajú stabilné aktualizácie a používatelia beta verzie beta aktualizácie. Po vydaní stabilnej verzie na to beta upozorní pri ďalšom otvorení ponuky a ponúkne automatický prechod. Pozrite si beta program." + }, + "q6": { + "question": "Kde môžem nahlásiť problémy?", + "p1Rich": "Chyby nahlasujte cez GitHub Issues. Uveďte kroky na ich zopakovanie, chybové hlásenie a podľa potreby výstup Monitora z príkazu journalctl -u proxmenux-monitor -n 50.", + "p2Rich": "V prípade problémov s bezpečnosťou ich prosím nezverejňujte. Prečítajte si Kódex správania a osvedčené postupy o zodpovednom postupe zverejnenia." + }, + "q7": { + "question": "Môžem prispieť k ProxMenux?", + "p1Rich": "Samozrejme. ProxMenux je otvorený komunitný projekt. Prispieť môžete kódom (Bash, Next.js/TypeScript a prekladové nástroje v Pythone), testovaním, dokumentáciou, dizajnom alebo nápadmi.", + "item1Rich": "Pred otvorením žiadosti o funkciu prediskutujte nápady v GitHub diskusiách.", + "item2Rich": "Pred odoslaním pull requestu si prečítajte kódex správania a odporúčané postupy.", + "item3Rich": "Na stránke prispievateľov nájdete aktuálnych testerov a recenzentov." + }, + "q8": { + "question": "Upravuje ProxMenux kritické systémové súbory?", + "p1Rich": "Inštalácia ProxMenuxu pridá nasledujúce súčasti.", + "item1Rich": "Závislosti cez apt: dialog, curl, jq a git. Preklady používajú vopred vytvorené katalógy JSON; inštalátor na hostiteľa nepridáva virtuálne prostredie na preklad.", + "item2Rich": "Adresárový strom skriptov v /usr/local/share/proxmenux/.", + "item3Rich": "Spúšťač v /usr/local/bin/menu.", + "item4Rich": "Voliteľne: služba systemd pre Monitor, proxmenux-monitor.service.", + "p2Rich": "ProxMenux nemení základnú konfiguráciu Proxmoxu, pokiaľ o to výslovne nepožiadate v príslušnej ponuke. Oprava siete napríklad upravuje /etc/network/interfaces, ale až po vašom potvrdení a vytvorení zálohy." + }, + "q9": { + "question": "Je bezpečné používať ProxMenux v produkčnom prostredí?", + "bodyRich": "Áno. Keďže ProxMenux mení základné súbory Proxmoxu iba na výslovnú žiadosť, možno ho používať aj v produkčnom prostredí. Ako pri každej automatizácii ho najprv otestujte v kontrolovanom prostredí a pred deštruktívnymi operáciami majte zálohy. Týka sa to napríklad prechodu z PVE 8 na 9, formátovania diskov či odstránenia VM." + }, + "q10": { + "question": "Ako odinštalujem ProxMenux?", + "p1Rich": "V ProxMenuxe: Nastavenia → Odinštalovať ProxMenux. Odinštalovanie odstráni skripty, spúšťač a službu Monitor a voliteľne aj vybrané závislosti. Súbory /root/.bashrc a /etc/motd obnoví zo záloh vytvorených pri inštalácii, ak sú dostupné.", + "p2Rich": "Celý postup nájdete na stránke Odinštalovanie ProxMenuxu." + }, + "q11": { + "question": "VirusTotal označuje inštalačnú URL ako podozrivú — je bezpečná?", + "p1Rich": "Výsledok 1/95 od Chong Lua Dao, nahlásený v issue #162, správca projektu označil za falošný poplach. Inštalátor používa vzor curl | bash a môže stiahnuť jq z jeho oficiálneho vydania na GitHube. Takéto správanie môže spustiť heuristickú detekciu; historické hlásenie nie je hodnotením všetkých budúcich stiahnutí.", + "p2Rich": "ProxMenux má úplne otvorený zdrojový kód a inštalačný skript si môžete skontrolovať riadok po riadku: install_proxmenux.sh. Ďalšie súvislosti nájdete v issue #162." + } +} diff --git a/web/messages/sk/docs/about/index.json b/web/messages/sk/docs/about/index.json new file mode 100644 index 00000000..163b3c10 --- /dev/null +++ b/web/messages/sk/docs/about/index.json @@ -0,0 +1,67 @@ +{ + "meta": { + "title": "O projekte | Dokumentácia ProxMenux", + "description": "O projekte ProxMenux: ciele, prispievatelia, časté otázky a pravidlá správania. Nástroj s otvoreným zdrojovým kódom na správu Proxmox VE 8+ cez ponuky, ktorý vyvíja a udržiava MacRimi s malým tímom testerov a prispievateľov.", + "ogTitle": "O projekte | Dokumentácia ProxMenux", + "ogDescription": "O ProxMenuxe — nástroji s otvoreným zdrojovým kódom na správu Proxmox VE 8+ cez ponuky." + }, + "header": { + "title": "O projekte", + "description": "Informácie o projekte, časté otázky, prispievatelia a pravidlá správania. ProxMenux je nástroj s otvoreným zdrojovým kódom na správu Proxmox VE 8+ cez ponuky, ktorý vyvíja a udržiava MacRimi s pomocou malého tímu testerov a prispievateľov.", + "section": "O projekte" + }, + "callout": { + "title": "Otvorený zdrojový kód, vývoj vedený komunitou", + "body": "ProxMenux sa poskytuje pod licenciou GPL-3.0 a vyvíja sa verejne na GitHube. Každý skript možno skontrolovať a každú zmenu dohľadať. Hlásenia chýb, nápady, kód aj testovanie sú vítané." + }, + "section": { + "heading": "V tejto časti:", + "options": [ + { + "icon": "HelpCircle", + "href": "/docs/about/faq", + "title": "FAQ", + "description": "Časté otázky: čo je ProxMenux, inštalácia, kompatibilita, prispôsobenie, aktualizácie, bezpečnosť, používanie v produkcii a odinštalovanie." + }, + { + "icon": "Users", + "href": "/docs/about/contributors", + "title": "Prispievatelia", + "description": "Poďakovanie ľuďom, vďaka ktorým ProxMenux vzniká: testerom, kontrolórom a vývojárom, ktorí sa podieľajú na každom vydaní." + }, + { + "icon": "ScrollText", + "href": "/docs/about/code-of-conduct", + "title": "Kódex správania", + "description": "Hodnoty projektu, zodpovednosť za kód a pravidlá prispievania. Povinné čítanie pred odoslaním PR alebo hlásenia problému." + } + ] + }, + "involved": { + "heading": "Zapojte sa", + "intro": "Tri miesta na zapojenie sa do projektu:", + "cards": [ + { + "href": "https://github.com/MacRimi/ProxMenux/issues/new", + "title": "🐛 Nahlásiť chybu", + "description": "GitHub Issues — priložte záznamy a kroky na zopakovanie problému." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/discussions", + "title": "💡 Navrhnúť funkciu", + "description": "GitHub Discussions — podeľte sa o nápady pred odoslaním PR." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/pulls", + "title": "🔀 Odoslať PR", + "description": "GitHub Pull Requests — najskôr si prečítajte pravidlá správania." + } + ] + }, + "support": { + "heading": "Podpora projektu", + "introRich": "Ak vám ProxMenux šetrí čas, najjednoduchšie mu pomôžete osloviť ďalších ľudí tak, že dáte repozitáru na GitHube ⭐. Ak chcete pomôcť viac:", + "kofiLabel": "Podpora pre Ko-fi", + "kofiOutro": " — prispejete správcovi na kávu a podporíte pokračovanie vývoja." + } +} diff --git a/web/messages/sv/docs/about/code-of-conduct.json b/web/messages/sv/docs/about/code-of-conduct.json new file mode 100644 index 00000000..7cddd218 --- /dev/null +++ b/web/messages/sv/docs/about/code-of-conduct.json @@ -0,0 +1,13 @@ +{ + "meta": { + "title": "Uppförandekod | ProxMenux-dokumentation", + "description": "ProxMenux uppförandekod och rekommenderade arbetssätt för bidragsgivare, testare och användare.", + "ogTitle": "Uppförandekod | ProxMenux-dokumentation", + "ogDescription": "Förväntningar på ansvar för koden, rapportering av säkerhetsbrister och omfattningen av PR:ar i ProxMenux-projektet." + }, + "errors": { + "notFound": "Fel: CODE_OF_CONDUCT.md-filen hittades inte.", + "loadFailed": "Fel: Det går inte att läsa in uppförandekodens innehåll." + }, + "contentMarkdown": "# 📝 Uppförandekod och rekommendationer\n\nDetta dokument fastställer **principer och riktlinjer** för användningen av **ProxMenux**, för att främja **respekt, samarbete och säkerhet** i utvecklingen.\n\n## 📌 1. Källangivelser och erkännande\n\n- Om **skript, kodavsnitt eller idéer** från andra kodarkiv eller utvecklare används ska den ursprungliga upphovspersonen alltid anges.\n- En kommentar i koden eller dokumentationen ska ange källan och om möjligt länka till det ursprungliga kodarkivet.\n- Vid användning av kod med en viss **licens** måste dess villkor följas.\n\n### ✅ Exempel på korrekt källangivelse i koden:\n\n```bash\n# Skript baserat på arbetet av [Upphovsperson] i [Länk till kodarkiv]\n```\n\n## 🔒 2. Säkerhet och ansvar för koden\n\n- All kod i detta arkiv följer rekommenderade arbetssätt för säker utveckling.\n- Bidrag som avsiktligt inför sårbarheter eller osäkra arbetssätt tillåts inte.\n- Skript får aldrig äventyra systemsäkerheten eller användarnas data.\n- Bidrag bör granskas med avseende på säkerhet och stabilitet före införandet.\n\n### ⚠️ Ansvarsfull rapportering av sårbarheter\n\nOm du upptäcker en säkerhetssårbarhet ska du INTE rapportera den i offentliga ärenden eller forum.\n\nRapportera den i stället privat via e-post:\n\n📧 proxmenux@macrimi.pro\n\nLäs vår [säkerhetspolicy](./SECURITY.md) för mer information om sårbarheter och hur de rapporteras.\n\n## 🤝 3. Gemenskapens riktlinjer\n\nAlla användare måste följa dessa riktlinjer för att upprätthålla en respektfull och professionell miljö:\n\n- ✅ Var respektfull och konstruktiv i diskussioner.\n- ❌ Trakasserier, hatretorik och stötande beteende tolereras inte.\n- ✅ Ge återkoppling professionellt och undvik personangrepp.\n- ❌ Överträdelser kan leda till varningar eller avstängningar beroende på allvarlighetsgrad.\n\n##\n\nDetta dokument främjar etisk kodanvändning, säkerhetsmedvetenhet och en respektfull gemenskap.\n\n📢 Låt oss bygga något fantastiskt tillsammans!\n" +} diff --git a/web/messages/sv/docs/about/contributing.json b/web/messages/sv/docs/about/contributing.json new file mode 100644 index 00000000..f951f4af --- /dev/null +++ b/web/messages/sv/docs/about/contributing.json @@ -0,0 +1,293 @@ +{ + "meta": { + "title": "Bidra till ProxMenux | ProxMenux Dokumentation", + "description": "Så bidrar du till ProxMenux: grenmodell (main / develop / feature/*), pull request-flöde, skripthuvud med författare och valfri stödlänk, gränssnitt i två faser, meddelandefunktioner och vägen till en stabil utgåva.", + "ogTitle": "Bidra till ProxMenux", + "ogDescription": "Grenmodell, arbetsflöde, författarangivelse i skripthuvudet och regler för gränssnitt i två faser som bidragsgivare ska följa." + }, + "header": { + "title": "Bidra till ProxMenux", + "description": "ProxMenux välkomnar bidrag från gemenskapen: nya skript, rättningar, förbättrade dialogrutor, översättningar och integrationer. Sidan beskriver arkivets struktur, grenmodellen, pull request-flödet, skripthuvudet med författare och valfri stödlänk samt de designregler varje bidrag ska följa.", + "section": "Om" + }, + "twoPagesCallout": { + "title": "Två relaterade sidor, ett projekt", + "body": "Förväxla inte sidan med Bidragsgivare, som uppmärksammar dem som redan bidrar: testare, granskare och utvecklare. Den här sidan är för dig som vill börja bidra och förklarar hur du förbereder en pull request för sammanslagning." + }, + "branching": { + "heading": "Grenmodell", + "intro": "ProxMenux använder en grenmodell med tre nivåer:", + "headerBranch": "Gren", + "headerPurpose": "syfte", + "rows": [ + { + "branch": "main", + "purposeRich": "Stabil kod som är klar för produktion. Bara ändringar som är klara för utgivning slås samman här. Det är den version slutanvändare får vid en vanlig installation av ProxMenux." + }, + { + "branch": "develop", + "purposeRich": "Aktiv utvecklingsgren. Allt nytt arbete tas först in här; det är betakanalen. När en stabil utgåva är klar förs den härifrån till main." + }, + { + "branch": "feature/*", + "purposeRich": "Kortlivade grenar per funktion, fix eller förbättring. Skapad från develop, fusioneras tillbaka till develop via en Pull begäran efter granskning." + } + ], + "calloutTitle": "Vad detta innebär för användare", + "calloutBody": "Slutanvändare som spårar main får testade releaser. Användare som vill ha de senaste funktionerna tidigt - och inte har något emot enstaka grova kanter - kan följa develop. Nya funktioner passerar alltid genom develop först; ingenting når main utan att gå igenom den cykeln." + }, + "workflow": { + "heading": "Arbetsflöde för pull requests", + "intro": "Från idé till fusion i fem steg:", + "step1Lead": "Skapa en funktionsgren från develop:", + "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": "Använd ett beskrivande grennamn: feature/zfs-arc-tuning, feature/fix-iommu-detection, feature/add-tailscale-script.", + "step2Lead": "Arbeta med ändringarna och skicka upp grenen:", + "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": "Öppna en pull request mot develop, inte mot main. Kontrollera på GitHub att basgrenen är develop. Beskriv vad skriptet gör och ändrar och vilka Proxmox VE-versioner det testats på.", + "step4": "Efter granskning slås ändringarna samman i develop. En underhållare granskar kodkvalitet, skripthuvud och gränssnittets två faser. Om ändringar begärs skickar du fler incheckningar till samma gren; PR:n uppdateras automatiskt.", + "step5": "Stabila utgåvor förs från develop till main. Vid utgivning flyttas main fram till develop med fast-forward och taggas. Ditt bidrag ingår i nästa stabila version." + }, + "scriptHeader": { + "heading": "Skripthuvud: metadata och beskrivning", + "intro": "Varje ProxMenux-skript börjar med två intilliggande kommentarsblock som bildar skripthuvudet. Båda krävs: de anger författare och syfte utan att läsaren behöver gå igenom själva koden.", + "bullets": [ + "Övre blocket: metadata. Författare, valfria GitHub-/stödlänkar, underhållare, upphovsrätt, licens, version och uppdateringsdatum. Här ges också erkännande åt bidragsgivare: för ett nytt skript anger du ditt namn och valfritt GitHub-sida och stödprofil, till exempel Ko-fi, GitHub Sponsors eller Buy Me a Coffee.", + "Nedre blocket: beskrivning. Ett kort stycke på enkel engelska förklarar skriptet. Det läses före koden och ska på egen hand klargöra syfte, huvudåtgärder, berörda resurser och förutsättningar." + ], + "licenseCalloutTitle": "Licenslinjen är fast - GPL-3.0", + "licenseCalloutBody": "ProxMenux ges ut under GNU General Public License v3.0. Alla skript har samma licens. Raden License i skripthuvudet ska alltid ha GPL-3.0-hänvisningen i exemplet nedan; den väljs inte per skript. Genom att bidra godkänner du GPL-3.0: alla får läsa, ändra och sprida skriptet och ändringarna med samma licens. Fullständig text: MacRimi/ProxMenux/LICENSE.", + "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": "Raderna GitHub och Sponsor är valfria. Utelämna dem om du inte vill publicera dem. Allt annat krävs.", + "whyCalloutTitle": "Varför detta är viktigt", + "whyCalloutBody": "Bidrag till öppen källkod är frivilligt arbete. Namn och eventuell stödlänk direkt i källkoden ger författaren synligt erkännande vid varje läsning, i stället för att döljas bakom projektet. Beskrivningen har ett annat syfte: den är det första en framtida underhållare eller nyfiken användare läser. En tydlig beskrivning avgör ofta om skriptet inger förtroende eller undviks." + }, + "structure": { + "heading": "Projektstruktur", + "intro": "Var olika typer av skript finns i arkivet:", + "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": "Varje skript läser in utils.sh vid start med source för att få meddelandefunktioner, väntindikator, färgvariabler och översättningssystem. Gemensamma hjälpbibliotek i scripts/global/ läses uttryckligen in av de skript som behöver dem." + }, + "twoPhase": { + "heading": "Regler för gränssnitt i två faser", + "intro": "Detta är den viktigaste regeln i ProxMenux och den som oftast leder till ändringskrav i PR:er. Varje skript delas in i exakt två faser:", + "headerPhase": "Fas", + "headerPurpose": "syfte", + "headerScreen": "Skärmtillstånd", + "rows": [ + { + "phaseRich": "Fas 1 — Urval", + "purposeRich": "Samla varje användarbeslut. Kör något förberedande arbete som behövs (sonder, skanningar, kontroller).", + "screenRich": "dialog-överlägg. Om en kontroll mellan två menyer tar mer än någon sekund, visa en msg_info-väntindikator så att användaren ser att skriptet inte hängt sig. Anropa sedan stop_spinner direkt före nästa dialogruta." + }, + { + "phaseRich": "Fas 2 - Utförande", + "purposeRich": "Utför varje operation. Visa hela framstegshistorien som ackumuleras på skärmen.", + "screenRich": "Synliga msg_info/msg_ok-meddelanden; aldrig dialog." + } + ], + "principle": "Principen är samla alla val först och kör sedan allt. Användaren ser först ordnade dialogmenyer (fas 1), sedan en loggliknande körningsvy (fas 2). Faserna blandas inte: inga dialogrutor mitt i körningen och inga förloppsmeddelanden under valet.", + "phase1Heading": "Fas 1 - typiskt mönster", + "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": "Regler för fas 1:", + "phase1Rules": [ + "Om en msg_info-väntindikator körs och du ska öppna en dialog- eller whiptail-meny, anropa först stop_spinner. Indikatorn kan inte samexistera med verktygens överlägg. Om ingen indikator är aktiv behövs inget anrop.", + "Använd show_proxmenux_logo + msg_title + msg_info för att ge visuellt sammanhang åt längre åtgärder i fas 1, exempelvis en kontroll som tar minst fem sekunder. Funktionen rensar redan skärmen; anropa inte clear före den.", + "Anropa inte show_proxmenux_logo mellan dialogmenyer när det saknas något att visa. Att rensa skärmen för en tom terminal ger bara visuellt brus.", + "Lagra alla val och kontrollresultat i variabler eller parallella arrayer. Sammanfattningen visas i början av fas 2, inte i fas 1." + ], + "phase2Heading": "Fas 2 - typiskt mönster", + "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": "Regler för fas 2: börja med show_proxmenux_logo + msg_title och sammanfatta genast fas 1 som msg_ok-rader. Anropa aldrig show_proxmenux_logo igen, eftersom det raderar förloppshistoriken. Använd inte dialog; om ett val under körningen är oundvikligt, använd whiptail enligt nästa avsnitt." + }, + "dialogVsWhiptail": { + "headingRich": "När du ska använda dialog vs whiptail", + "intro": "Båda verktygen ritar textbaserade gränssnitt men beter sig olika på skärmen. ProxMenux använder dem därför i två skilda faser.", + "headerTool": "Verktyg", + "headerWhen": "När du ska använda den", + "headerEffect": "Effekt på skärmen", + "rows": [ + { + "toolRich": "dialog", + "whenRich": "Alltid i fas 1. Alla interaktiva val, som VM, disk, filsystem eller bekräftelse av en åtgärd, använder dialog. Det är ProxMenux standardverktyg för gränssnitt.", + "effectRich": "Tar över terminalen, rensar skärmen, ritar sitt överlägg och återställer föregående tillstånd när den stängs. Det fungerar i fas 1 eftersom inga användbara resultat visas ännu." + }, + { + "toolRich": "whiptail", + "whenRich": "Bara i fas 2, när det är oundvikligt. Ett typiskt fall är en omstartsfråga när körningen är klar. Använd inte whiptail för att fråga ”fortsätt?” mitt i körningen; det beslutet skulle ha fattats i fas 1.", + "effectRich": "Ett lättare överlägg som inte rensar terminalens innehåll. Historiken från msg_ok/msg_info i fas 2 syns bakom dialogrutan. Därför passar det när förlopp redan visas på skärmen." + } + ], + "calloutTitle": "Varför uppdelningen är viktig", + "calloutBody": "Om du anropar dialog mitt i fas 2 försvinner alla msg_ok-rader användaren har följt. Det synliga händelseförloppet raderas. whiptail undviker det. Regeln bevarar alltså användarens bild av vad skriptet hittills har gjort.", + "rebootHeading": "Omstartsfråga: det typiska whiptail-fallet i fas 2", + "rebootIntro": "Om ett skript kan kräva omstart efter exempelvis aktivering av IOMMU eller ändrade kärnparametrar använder slutfrågan i fas 2 whiptail. Ha alltid en Nej-gren som säger att den berörda resursen inte ska användas före omstart:", + "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": "Referens för meddelandefunktioner", + "intro": "Alla finns i utils.sh. Använd dem som standard för synlig utdata så att skripten får ett enhetligt utseende. Om en ny funktion behövs, till exempel en allvarlighetsnivå eller layouthjälpare, föreslå den i din pull request. Den granskas och läggs till i utils.sh om den är användbar för fler skript.", + "headerFunction": "Funktion", + "headerWhen": "När man ska använda", + "headerSpinner": "Förloppsindikator", + "rows": [ + { + "function": "msg_info \"text\"", + "whenRich": "Operation pågår.", + "spinner": "Börjar" + }, + { + "function": "stop_spinner", + "whenRich": "Slutet av tyst förberedande arbete i fas 1 - dödar spinner, rensar linjen.", + "spinner": "Stopp" + }, + { + "function": "msg_ok \"text\"", + "whenRich": "Operationen lyckades. Använd också för \"funktion aktiverad\" även när en omstart krävs.", + "spinner": "Stopp" + }, + { + "function": "msg_warn \"text\"", + "whenRich": "Faktisk varning eller nedbrutet tillstånd.", + "spinner": "Stopp" + }, + { + "function": "msg_error \"text\"", + "whenRich": "Allvarligt fel.", + "spinner": "Stopp" + }, + { + "function": "msg_info2 \"text\"", + "whenRich": "Icke blockerande upplysning på en cyan informationsrad.", + "spinner": "Stopp" + }, + { + "function": "msg_success \"text\"", + "whenRich": "Avslutande frågan ”Tryck Enter för att återgå” i slutet av fas 2.", + "spinner": "Stopp" + }, + { + "function": "msg_title \"text\"", + "whenRich": "Fet rubrik med inbyggda mellanrum. Används i början av fas 2.", + "spinner": "—" + }, + { + "function": "show_proxmenux_logo", + "whenRich": "Rensar skärmen och visar logotypen. Anropas en gång i början av fas 2.", + "spinner": "—" + } + ] + }, + "dialogConventions": { + "heading": "dialogkonventioner", + "bullets": [ + "Skicka alltid --backtitle \"$BACKTITLE\" till varje dialog- och whiptail-anrop. $BACKTITLE är alltid \"ProxMenux\", satt en gång i skripthuvudet och aldrig överskrivet. Användaren ska alltid se projektnamnet som ram, inte skriptets egen titel.", + "Omslut alltid rubriker och meddelanden med $(translate \"...\").", + "Omdirigera alltid dialog-utgången med 2>&1 >/dev/tty - den fångade stdouten blir användarens val, medan dialogrutan själv drar på terminalen.", + "Använd standard UI dimension variabler ($UI_MENU_H, $UI_MSG_W, etc.) för konsekvent storlek över skript.", + "Kontrollera alltid tomma eller avbrutna val och hantera dem korrekt." + ], + "exampleIntro": "Fullständigt exempel: skapa en VM-valmeny och hantera avbrott.", + "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": "Översättningspolicy", + "intro": "Alla användarsynliga strängar måste inslagas med funktionen translate. ProxMenux översätter dem automatiskt till alla språk - du skriver engelska, användaren läser sitt modersmål.", + "code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...", + "bullets": [ + "Skriv strängar på engelska - översättning hanteras automatiskt av bygget.", + "Håll strängar koncis. Undvik inbäddningsvariabler inom långa meningar där det är möjligt.", + "Översätt inte variabelnamn, sökvägar eller tekniska identifierare." + ] + }, + "variableStyle": { + "heading": "Regler för variabler och stil", + "bullets": [ + "Använd UPPER_CASE för script-nivå variabler.", + "Använd lower_case för lokala funktionsvariabler (deklarera med local).", + "Sätt alla variabelexpansioner inom citattecken: \"$VAR\", inte $VAR.", + "Använd [[ ]] för villkor, inte [ ] (förutom där POSIX krävs).", + "show_proxmenux_logo är det avsedda sättet att rensa skärmen: den rensar och visar projektlogotypen för att ge visuellt sammanhang. Anropa den en gång i början av fas 2, och valfritt före ett längre block med väntindikator i fas 1." + ], + "standardNamesIntro": "Standardvariabla namn över hela projektet:", + "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": "Omdirigera verktygsutgång under fas 2", + "redirectIntro": "Fas 2 visar en logg med msg_info → msg_ok-rader. Om ett anropat verktyg, som apt, mkfs, qm, pct eller dd, skriver till stdout/stderr rullar dess utdata förbi meddelandena och stör överblicken. Användaren kan inte längre skilja skriptets förlopp från verktygets detaljer.", + "withoutRedirectIntro": " Utan omdirigering - vad användaren ser om du inte hanterar ljudet:", + "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": " Med omdirigering - hur samma operation ser ut när buller skickas någon annanstans:", + "withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.", + "twoPatternsIntro": "Två mönster att välja mellan:", + "discardLead": "Kasta utdata när de inte behövs: snabbast och enklast.", + "discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1", + "logLead": "Skicka utdata till en loggfil när de kan behöva granskas senare, exempelvis vid en misslyckad installation eller för att se vad dpkg gjorde. Det är det föredragna mönstret för apt-åtgärder:", + "logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1", + "referenceOutro": "Skriptet scripts/global/update-pve9_2.sh är ett referensimplementering - varje apt-get-samtal skickar ut till en loggfil så att användaren bara ser det rena msg_info → msg_ok-flödet, medan loggen på disken låter dig rekonstruera exakt vad apt gjorde om något går fel." + }, + "dosAndDonts": { + "heading": "Do's och Don'ts", + "doHeading": "✅ Gör", + "doBullets": [ + "stop_spinner före en dialog i fas 1 endast när en msg_info spinner körs för närvarande.", + "Fas 2 börjar med show_proxmenux_logo + msg_title + msg_ok för att sammanfatta resultaten från fas 1.", + "Använd msg_ok för framgångsrikt aktiverade funktioner - även om en omstart krävs.", + "Använd whiptail (inte dialog) för någon post-exekveringsprompt som måste visas i Fas 2.", + "Ha alltid en Nej-gren i omstartsfrågor som säger att den berörda resursen inte ska startas före omstart.", + "Bevakning VM-bara logik genom att kontrollera [[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]] - controllers och NVMe PCIe kan inte läggas till LXC containrar.", + "Använd ensure_repositories från utils-install-functions.sh istället för ovillkorlig apt-get update.", + "Använd parallella arrayer i Fas 1 när varje objekt behöver flera dialoger." + ], + "dontHeading": "❌ Gör inte", + "dontBullets": [ + "Anropa dialog medan en väntindikator är aktiv.", + "Hoppa över fas 1 recap i början av fas 2.", + "Anropa show_proxmenux_logo en andra gång; det raderar allt fas 2 har visat.", + "Använd dialog i Fas 2 (använd whiptail för det sällsynta oundvikliga fallet).", + "Använda enbart clear.", + "Omge msg_title med tomma echo \"\"-rader; mellanrum ingår redan.", + "Använd msg_warn för att rapportera en framgångsrikt aktiverad funktion - det är en msg_ok.", + "Kör ovillkorlig apt-get update - använd ensure_repositories." + ] + }, + "submitting": { + "heading": "Skicka in ditt bidrag", + "steps": [ + "Skapa en fork av MacRimi/ProxMenux på GitHub och klona din fork.", + "Skapa en feature/*-gren från develop (se Grenmodell ovan).", + "Följ denna guide för nya eller modifierade skript. Skriv rubriken med ditt namn; lägg till den valfria sponsorlinjen om du vill.", + "Testa ditt manus på en riktig Proxmox VE-instans - både Fas 1 (varje dialogruta) och Fas 2 (varje operation lyckas och rullar tillbaka rent på fel).", + "Öppna en pull request mot develop med en tydlig beskrivning: skriptets syfte, ändringar och den Proxmox VE-version som användes för tester.", + "Se till att ditt bidrag respekterar Uppförandekod." + ], + "securityOutro": "För säkerhetskänsliga problem följer du rapporteringsprocessen i SECURITY.md i stället för att öppna ett offentligt ärende." + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md", + "label": "CONTRIBUTING.md (fullständig guide)", + "tail": " — källan till sanning för varje konvention, inklusive avancerade hårdvarumönster." + }, + { + "kind": "internal", + "href": "/docs/about/contributors", + "label": "Bidragsgivare", + "tail": " — personerna vars arbete har format ProxMenux-utgåvor. Detta är en annan sida." + }, + { + "kind": "internal", + "href": "/docs/about/code-of-conduct", + "label": "Uppförandekod", + "tail": " - standarderna varje bidragsgivare går med på att följa." + }, + { + "kind": "external", + "url": "https://github.com/MacRimi/ProxMenux/discussions", + "label": "GitHub Discussions", + "tail": " - fråga innan du bygger om du inte är säker på om en idé passar, eller att hitta medarbetare på en större funktion." + } + ] + } +} diff --git a/web/messages/sv/docs/about/contributors.json b/web/messages/sv/docs/about/contributors.json new file mode 100644 index 00000000..c8580f3e --- /dev/null +++ b/web/messages/sv/docs/about/contributors.json @@ -0,0 +1,38 @@ +{ + "meta": { + "title": "Bidragsgivare | ProxMenux-dokumentation", + "description": "Ett erkännande till dem som gör ProxMenux möjligt: testare, granskare och utvecklare som bidrar till varje version.", + "ogTitle": "Bidragsgivare | ProxMenux-dokumentation", + "ogDescription": "Möt bidragsgivarna bakom ProxMenux." + }, + "header": { + "title": "Bidragsgivare", + "description": "ProxMenux växer tack vare sina bidragsgivare. Den här sidan uppmärksammar deras arbete: att testa versioner före publicering, hitta regressioner, granska PR:ar och påverka utvecklingen av nya funktioner.", + "section": "Om" + }, + "beyond": { + "title": "Utöver denna lista", + "body": "Många fler bidrar genom felrapporter, funktionsförslag i Discussions, betatestning och översättningar. Den fullständiga listan över kodbidragsgivare finns i GitHubs bidragsgivargraf. Den här sidan lyfter fram dem som är mest aktiva med att testa och granska ProxMenux-versioner." + }, + "testers": { + "heading": "Testare och granskare", + "intro": "De här personerna var bland de första att bidra till projektet. Deras tester, felrapporter och förbättringsförslag hjälpte ProxMenux att bli vad det är i dag.", + "roles": { + "testing": "Testning", + "testingReviewer": "Testning och granskning" + }, + "youtube": "YouTube" + }, + "contribute": { + "heading": "Vill du bidra?", + "intro": "Alla bidrag är välkomna - kod, testning, design, dokumentation eller bara dela dina idéer:", + "tester": "Testare — prova betakanalen och rapportera vad som fungerar och vad som inte fungerar före de stabila versionerna.", + "developer": "Utvecklare — Bash, Next.js (TypeScript) och lite Python för översättningens virtuella miljö (venv). PR:ar välkomnas på GitHub.", + "designer": "Designer — UI förbättringar, ikoner, skärmdumpar för dokumentation.", + "ideas": "Idéer — öppna en tråd i GitHub Discussions innan du skapar ett ärende med ett funktionsförslag." + }, + "coc": { + "title": "Läs uppförandekoden först", + "body": "Läs uppförandekoden och rekommenderade arbetssätt innan du skickar in kod eller rapporterar problem. Där beskrivs förväntningar på kodansvar, rapportering av säkerhetsbrister och omfattningen av PR:ar." + } +} diff --git a/web/messages/sv/docs/about/faq.json b/web/messages/sv/docs/about/faq.json new file mode 100644 index 00000000..ce2459dc --- /dev/null +++ b/web/messages/sv/docs/about/faq.json @@ -0,0 +1,94 @@ +{ + "meta": { + "title": "Vanliga frågor | ProxMenux-dokumentation", + "description": "Vanliga frågor om ProxMenux: funktioner, installation, kompatibilitet från PVE 8, anpassning, uppdateringar, säkerhet, produktionsanvändning, systemfiler, bidrag och avinstallation.", + "ogTitle": "Vanliga frågor | ProxMenux-dokumentation", + "ogDescription": "Vanliga frågor om ProxMenux installation, kompatibilitet, säkerhet och hur du kan bidra." + }, + "header": { + "title": "Vanliga frågor", + "description": "Vanliga frågor om ProxMenux: vad det är, vem det passar, installation, uppdatering, avinstallation, kompatibilitet, anpassning, säkerhet och bidrag. Om din fråga saknas, titta i GitHub Discussions eller skapa ett ärende.", + "section": "Om" + }, + "quickLinks": { + "title": "Snabba länkar", + "installationLabel": "Installation", + "installationSuffix": " — installationskommandot på en rad och dess beroenden.", + "introductionLabel": "Introduktion", + "introductionSuffix": " — vad ProxMenux gör, på fem minuter.", + "uninstallLabel": "Avinstallera", + "uninstallSuffix": " — ren borttagning.", + "issuesLabel": "GitHub Issues", + "discussionsLabel": "Diskussioner" + }, + "q1": { + "question": "Vad är ProxMenux, och vad används det för?", + "p1Rich": "ProxMenux är ett interaktivt menystyrt verktyg som gör Proxmox VE tillgängligt oavsett teknisk erfarenhet. Det förenklar körningen av kommandon och låter dig hantera systemet utan avancerade Linux-kunskaper.", + "p2": "Mindre erfarna användare kan köra kommandon via strukturerade menyer och behöver skriva mindre i terminalen. Erfarna administratörer sparar steg i återkommande uppgifter som härdning efter installation, GPU-passthrough, import av OVF-VM:ar och rotation av ZFS-snapshots.", + "p3": "Proxmox VE används ofta för:", + "items": [ + "Virtualisering i företagsklass", + "HomeLab och personliga molnlösningar", + "Multimedieservrar, automatisering och mycket mer" + ] + }, + "q2": { + "question": "Hur installerar jag ProxMenux?", + "p1Rich": "Följ installationsguiden. Kortfattat:", + "stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"", + "p2": "När installationen är klar startar du verktyget med:", + "menuCmd": "menu" + }, + "q3": { + "question": "Är ProxMenux kompatibel med alla Proxmox-versioner?", + "bodyRich": "Nej — ProxMenux kräver Proxmox VE 8 eller senare. PVE 7 och äldre stöds inte. Uppgradera först PVE 7 till 8.x enligt Proxmox officiella anvisningar. Därefter kan ProxMenux hantera steget från 8 till 9 via Verktyg → Uppgradera PVE 8 till PVE 9." + }, + "q4": { + "question": "Kan jag anpassa ProxMenux?", + "p1Rich": "Uppdateringar kan skriva över lokala ändringar i huvudskripten, så undvik att redigera dessa filer direkt. Det här kan du anpassa:", + "items": [ + "Konsolens välkomstbanner med verktyget FastFetch i menyn för efterinstallation.", + "Vilka valfria komponenter installeras (Monitor, Fail2Ban, Lynis ...) - välj under installation eller via den relevanta menyn senare." + ] + }, + "q5": { + "question": "Hur uppdaterar jag ProxMenux?", + "p1Rich": "När en ny version finns upptäcker ProxMenux den nästa gång du kör menu och erbjuder en uppdatering. Om du accepterar ersätts verktygets filer och konfiguration i den befintliga installationen. Du behöver inte ladda ned något manuellt.", + "p2Rich": "Användare av den stabila versionen får stabila uppdateringar, och betaanvändare får betauppdateringar. När en stabil version släpps meddelar betan det nästa gång menyn öppnas och erbjuder automatiskt byte. Läs mer om betaprogrammet." + }, + "q6": { + "question": "Var kan jag rapportera problem eller föreslå funktioner?", + "p1Rich": "Rapportera buggar i GitHub Issues. Beskriv stegen för att återskapa felet, felmeddelandet och vid behov Monitor-utdata från journalctl -u proxmenux-monitor -n 50.", + "p2Rich": "För säkerhetsproblem: publicera inte detaljerna. Följ rutinen för ansvarsfull rapportering i uppförandekoden och rekommendationerna." + }, + "q7": { + "question": "Kan jag bidra till ProxMenux?", + "p1Rich": "Absolut. ProxMenux är ett samarbetsprojekt med öppen källkod. Du kan bidra med kod (Bash, Next.js/TypeScript och översättningsverktyg i Python), tester, dokumentation, design eller idéer.", + "item1Rich": "Diskutera idéer i GitHub Discussions innan du skapar en funktionsförfrågan.", + "item2Rich": "Läs uppförandekoden och rekommendationerna innan du skickar en pull request.", + "item3Rich": "På sidan för medverkande ser du vilka som för närvarande testar och granskar projektet." + }, + "q8": { + "question": "Ändrar ProxMenux kritiska systemfiler?", + "p1Rich": "Installationen av ProxMenux lägger till följande komponenter.", + "item1Rich": "Beroenden via apt: dialog, curl, jq och git. Översättningarna använder färdiga JSON-kataloger. Installationsprogrammet lägger inte till någon virtuell översättningsmiljö på värden.", + "item2Rich": "Skriptträdet på /usr/local/share/proxmenux/.", + "item3Rich": "Startkommandot i /usr/local/bin/menu.", + "item4Rich": "Valfritt: Monitors systemd-tjänst proxmenux-monitor.service.", + "p2Rich": "ProxMenux ändrar inte Proxmox centrala konfiguration om du inte uttryckligen begär det via en särskild meny. Nätverksreparationen redigerar till exempel /etc/network/interfaces, men först efter din bekräftelse och efter att en säkerhetskopia har skapats." + }, + "q9": { + "question": "Är det säkert att använda ProxMenux i produktion?", + "bodyRich": "Ja. Eftersom ProxMenux bara ändrar Proxmox centrala filer på uttrycklig begäran kan det användas i produktionsmiljöer. Som med all automatisering bör du först testa i en kontrollerad miljö och ha säkerhetskopior innan du kör destruktiva åtgärder, till exempel uppgradering från PVE 8 till 9, diskformatering eller borttagning av en VM." + }, + "q10": { + "question": "Hur avinstallerar jag ProxMenux?", + "p1Rich": "I ProxMenux: Inställningar → Avinstallera ProxMenux. Avinstallationen tar bort skriptträdet, startkommandot och Monitor-tjänsten samt, om du väljer det, utvalda beroenden. Den återställer /root/.bashrc och /etc/motd från säkerhetskopiorna som skapades vid installationen, om de finns.", + "p2Rich": "Fullständiga instruktioner: Avinstallera ProxMenux." + }, + "q11": { + "question": "VirusTotal flaggar installationsadressen — är den säker?", + "p1Rich": "Resultatet 1/95 från Chong Lua Dao, som rapporterades i ärende #162, bedömdes av projektansvarig som ett falsklarm. Installationsprogrammet använder mönstret curl | bash och kan ladda ned jq från dess officiella GitHub-utgåva. Detta beteende kan utlösa heuristiska skannrar. Den historiska rapporten säger inget avgörande om alla framtida nedladdningar.", + "p2Rich": "ProxMenux har helt öppen källkod och du kan granska installationsskriptet rad för rad: install_proxmenux.sh. Mer bakgrund finns i ärende #162." + } +} diff --git a/web/messages/sv/docs/about/index.json b/web/messages/sv/docs/about/index.json new file mode 100644 index 00000000..437a1b7e --- /dev/null +++ b/web/messages/sv/docs/about/index.json @@ -0,0 +1,67 @@ +{ + "meta": { + "title": "Om projektet | ProxMenux-dokumentation", + "description": "Om ProxMenux: projektmål, bidragsgivare, vanliga frågor och uppförandekod. Ett menystyrt hanteringsverktyg med öppen källkod för Proxmox VE 8+, utvecklat och underhållet av MacRimi tillsammans med en liten grupp testare och bidragsgivare.", + "ogTitle": "Om projektet | ProxMenux-dokumentation", + "ogDescription": "Om ProxMenux — ett menystyrt hanteringsverktyg med öppen källkod för Proxmox VE 8+." + }, + "header": { + "title": "Om", + "description": "Projektinformation, vanliga frågor, bidragsgivare och uppförandekod. ProxMenux är ett menystyrt hanteringsverktyg med öppen källkod för Proxmox VE 8+, utvecklat och underhållet av MacRimi med hjälp av en liten grupp testare och bidragsgivare.", + "section": "Om" + }, + "callout": { + "title": "Öppen källkod, utvecklad av gemenskapen", + "body": "ProxMenux har GPL-3.0-licens och utvecklas öppet på GitHub. Varje skript kan granskas och varje ändring spåras. Felrapporter, idéer, kod och testning välkomnas." + }, + "section": { + "heading": "I detta avsnitt", + "options": [ + { + "icon": "HelpCircle", + "href": "/docs/about/faq", + "title": "FAQ", + "description": "Vanliga frågor: vad ProxMenux är, installation, kompatibilitet, anpassning, uppdateringar, säkerhet, användning i produktion och avinstallation." + }, + { + "icon": "Users", + "href": "/docs/about/contributors", + "title": "Bidragsgivare", + "description": "Ett erkännande till dem som gör ProxMenux möjligt: testare, granskare och utvecklare som bidrar till varje version." + }, + { + "icon": "ScrollText", + "href": "/docs/about/code-of-conduct", + "title": "Uppförandekod", + "description": "Projektvärden, kodansvarsförväntningar och bidragsriktlinjer. Obligatorisk läsning innan du öppnar en PR eller rapport." + } + ] + }, + "involved": { + "heading": "Bli involverad", + "intro": "Tre ställen att engagera sig i projektet:", + "cards": [ + { + "href": "https://github.com/MacRimi/ProxMenux/issues/new", + "title": "🐛 Rapportera en bugg", + "description": "GitHub Issues — bifoga loggar och steg för att återskapa problemet." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/discussions", + "title": "💡 Föreslå en funktion", + "description": "GitHub Discussions — dela idéer innan du öppnar en PR." + }, + { + "href": "https://github.com/MacRimi/ProxMenux/pulls", + "title": "🔀 Skicka en PR", + "description": "GitHub Pull Requests - läs uppförandekoden först." + } + ] + }, + "support": { + "heading": "Stöd projektet", + "introRich": "Om ProxMenux sparar tid åt dig är det enklaste sättet att hjälpa andra hitta det att ge förrådet en ⭐ på GitHub. Om du vill göra mer:", + "kofiLabel": "Stöd på Ko-fi", + "kofiOutro": " — Köper underhållaren en kaffe och håller utvecklingen på gång." + } +} From de9c29a9e95a25f714f57ab3704c7e81f45444c6 Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:08:53 +0200 Subject: [PATCH 17/73] docs: review disk manager documentation in all seven translations --- .github/workflows/test-i18n.yml | 10 ++ .../disk-manager/add-controller-nvme-vm.json | 128 +++++++++++++++ .../de/docs/disk-manager/format-disk.json | 142 +++++++++++++++++ .../disk-manager/import-disk-image-vm.json | 110 +++++++++++++ .../de/docs/disk-manager/import-disk-lxc.json | 115 ++++++++++++++ .../de/docs/disk-manager/import-disk-vm.json | 113 ++++++++++++++ web/messages/de/docs/disk-manager/index.json | 135 ++++++++++++++++ .../de/docs/disk-manager/smart-disk-test.json | 146 ++++++++++++++++++ .../disk-manager/add-controller-nvme-vm.json | 4 +- .../en/docs/disk-manager/format-disk.json | 6 +- .../disk-manager/import-disk-image-vm.json | 4 +- .../en/docs/disk-manager/import-disk-lxc.json | 6 +- .../en/docs/disk-manager/import-disk-vm.json | 6 +- web/messages/en/docs/disk-manager/index.json | 12 +- .../en/docs/disk-manager/smart-disk-test.json | 10 +- .../disk-manager/add-controller-nvme-vm.json | 14 +- .../es/docs/disk-manager/format-disk.json | 26 ++-- .../disk-manager/import-disk-image-vm.json | 16 +- .../es/docs/disk-manager/import-disk-lxc.json | 14 +- .../es/docs/disk-manager/import-disk-vm.json | 14 +- web/messages/es/docs/disk-manager/index.json | 18 +-- .../es/docs/disk-manager/smart-disk-test.json | 16 +- .../disk-manager/add-controller-nvme-vm.json | 128 +++++++++++++++ .../fr/docs/disk-manager/format-disk.json | 142 +++++++++++++++++ .../disk-manager/import-disk-image-vm.json | 110 +++++++++++++ .../fr/docs/disk-manager/import-disk-lxc.json | 115 ++++++++++++++ .../fr/docs/disk-manager/import-disk-vm.json | 113 ++++++++++++++ web/messages/fr/docs/disk-manager/index.json | 135 ++++++++++++++++ .../fr/docs/disk-manager/smart-disk-test.json | 146 ++++++++++++++++++ .../disk-manager/add-controller-nvme-vm.json | 128 +++++++++++++++ .../it/docs/disk-manager/format-disk.json | 142 +++++++++++++++++ .../disk-manager/import-disk-image-vm.json | 110 +++++++++++++ .../it/docs/disk-manager/import-disk-lxc.json | 115 ++++++++++++++ .../it/docs/disk-manager/import-disk-vm.json | 113 ++++++++++++++ web/messages/it/docs/disk-manager/index.json | 135 ++++++++++++++++ .../it/docs/disk-manager/smart-disk-test.json | 146 ++++++++++++++++++ .../disk-manager/add-controller-nvme-vm.json | 128 +++++++++++++++ .../pt/docs/disk-manager/format-disk.json | 142 +++++++++++++++++ .../disk-manager/import-disk-image-vm.json | 110 +++++++++++++ .../pt/docs/disk-manager/import-disk-lxc.json | 115 ++++++++++++++ .../pt/docs/disk-manager/import-disk-vm.json | 113 ++++++++++++++ web/messages/pt/docs/disk-manager/index.json | 135 ++++++++++++++++ .../pt/docs/disk-manager/smart-disk-test.json | 146 ++++++++++++++++++ .../disk-manager/add-controller-nvme-vm.json | 128 +++++++++++++++ .../sk/docs/disk-manager/format-disk.json | 142 +++++++++++++++++ .../disk-manager/import-disk-image-vm.json | 110 +++++++++++++ .../sk/docs/disk-manager/import-disk-lxc.json | 115 ++++++++++++++ .../sk/docs/disk-manager/import-disk-vm.json | 113 ++++++++++++++ web/messages/sk/docs/disk-manager/index.json | 135 ++++++++++++++++ .../sk/docs/disk-manager/smart-disk-test.json | 146 ++++++++++++++++++ .../disk-manager/add-controller-nvme-vm.json | 128 +++++++++++++++ .../sv/docs/disk-manager/format-disk.json | 142 +++++++++++++++++ .../disk-manager/import-disk-image-vm.json | 110 +++++++++++++ .../sv/docs/disk-manager/import-disk-lxc.json | 115 ++++++++++++++ .../sv/docs/disk-manager/import-disk-vm.json | 113 ++++++++++++++ web/messages/sv/docs/disk-manager/index.json | 135 ++++++++++++++++ .../sv/docs/disk-manager/smart-disk-test.json | 146 ++++++++++++++++++ 57 files changed, 5427 insertions(+), 83 deletions(-) create mode 100644 web/messages/de/docs/disk-manager/add-controller-nvme-vm.json create mode 100644 web/messages/de/docs/disk-manager/format-disk.json create mode 100644 web/messages/de/docs/disk-manager/import-disk-image-vm.json create mode 100644 web/messages/de/docs/disk-manager/import-disk-lxc.json create mode 100644 web/messages/de/docs/disk-manager/import-disk-vm.json create mode 100644 web/messages/de/docs/disk-manager/index.json create mode 100644 web/messages/de/docs/disk-manager/smart-disk-test.json create mode 100644 web/messages/fr/docs/disk-manager/add-controller-nvme-vm.json create mode 100644 web/messages/fr/docs/disk-manager/format-disk.json create mode 100644 web/messages/fr/docs/disk-manager/import-disk-image-vm.json create mode 100644 web/messages/fr/docs/disk-manager/import-disk-lxc.json create mode 100644 web/messages/fr/docs/disk-manager/import-disk-vm.json create mode 100644 web/messages/fr/docs/disk-manager/index.json create mode 100644 web/messages/fr/docs/disk-manager/smart-disk-test.json create mode 100644 web/messages/it/docs/disk-manager/add-controller-nvme-vm.json create mode 100644 web/messages/it/docs/disk-manager/format-disk.json create mode 100644 web/messages/it/docs/disk-manager/import-disk-image-vm.json create mode 100644 web/messages/it/docs/disk-manager/import-disk-lxc.json create mode 100644 web/messages/it/docs/disk-manager/import-disk-vm.json create mode 100644 web/messages/it/docs/disk-manager/index.json create mode 100644 web/messages/it/docs/disk-manager/smart-disk-test.json create mode 100644 web/messages/pt/docs/disk-manager/add-controller-nvme-vm.json create mode 100644 web/messages/pt/docs/disk-manager/format-disk.json create mode 100644 web/messages/pt/docs/disk-manager/import-disk-image-vm.json create mode 100644 web/messages/pt/docs/disk-manager/import-disk-lxc.json create mode 100644 web/messages/pt/docs/disk-manager/import-disk-vm.json create mode 100644 web/messages/pt/docs/disk-manager/index.json create mode 100644 web/messages/pt/docs/disk-manager/smart-disk-test.json create mode 100644 web/messages/sk/docs/disk-manager/add-controller-nvme-vm.json create mode 100644 web/messages/sk/docs/disk-manager/format-disk.json create mode 100644 web/messages/sk/docs/disk-manager/import-disk-image-vm.json create mode 100644 web/messages/sk/docs/disk-manager/import-disk-lxc.json create mode 100644 web/messages/sk/docs/disk-manager/import-disk-vm.json create mode 100644 web/messages/sk/docs/disk-manager/index.json create mode 100644 web/messages/sk/docs/disk-manager/smart-disk-test.json create mode 100644 web/messages/sv/docs/disk-manager/add-controller-nvme-vm.json create mode 100644 web/messages/sv/docs/disk-manager/format-disk.json create mode 100644 web/messages/sv/docs/disk-manager/import-disk-image-vm.json create mode 100644 web/messages/sv/docs/disk-manager/import-disk-lxc.json create mode 100644 web/messages/sv/docs/disk-manager/import-disk-vm.json create mode 100644 web/messages/sv/docs/disk-manager/index.json create mode 100644 web/messages/sv/docs/disk-manager/smart-disk-test.json diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 2b3e4685..7f4dfb51 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -9,15 +9,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' push: branches: [main, develop] paths: @@ -27,15 +32,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' workflow_dispatch: permissions: diff --git a/web/messages/de/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/de/docs/disk-manager/add-controller-nvme-vm.json new file mode 100644 index 00000000..5a9deee2 --- /dev/null +++ b/web/messages/de/docs/disk-manager/add-controller-nvme-vm.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Hinzufügen von Controller oder NVMe zu VM | ProxMenux Dokumentation", + "description": "PCI-Passthrough eines Speichercontrollers (SATA-/SAS-HBA) oder NVMe-Geräts an eine Proxmox-VM mit ProxMenux. Das Werkzeug aktiviert IOMMU, erkennt Konflikte und richtet die Zuweisung mit qm set --hostpci ein.", + "ogTitle": "Hinzufügen von Controller oder NVMe zu VM | ProxMenux Dokumentation", + "ogDescription": "Weisen Sie einer Proxmox-VM einen vollständigen SATA-/SAS-HBA oder ein NVMe-Gerät zu. ProxMenux übernimmt IOMMU, Konflikterkennung und die hostpci-Zuweisung." + }, + "header": { + "title": "Controller oder NVMe zu VM hinzufügen", + "description": "Weisen Sie einer Proxmox-VM einen vollständigen SATA-/SAS-Host-Bus-Adapter (HBA) oder ein NVMe-Gerät per PCI-Passthrough zu. ProxMenux prüft IOMMU und aktiviert es mit Ihrer Zustimmung, ermittelt geeignete Geräte, schließt Konflikte aus und trägt die Zuweisung mit qm set --hostpci ein.", + "section": "Datenträgerverwaltung · VM" + }, + "intro": { + "title": "Was dies tut (und nicht tut)", + "body": "Dies ist Passthrough auf Geräteebene: Die PCIe-Karte wird der Kontrolle des Host-Kernels entzogen und an vfio-pci gebunden. Die VM sieht den Controller selbst statt einzeln durchgereichter Laufwerke und lädt ihren eigenen Treiber für dieses Modell. Alle am Controller angeschlossenen Laufwerke folgen automatisch, mit nativen SMART-Daten, vollständigen Firmware-Funktionen und ohne Proxmox-Zwischenschicht." + }, + "howRuns": { + "heading": "Wie das Skript läuft", + "body": "Der Fluss hat zwei Phasen mit klarer Trennung zwischen \"Sammeln von Informationen, Überprüfen von IOMMU und Auflisten von Kandidaten\" und \"Tatsächliches Anbringen des PCI-Geräts\". Bis zur endgültigen Bestätigung wird nichts an die VM-Konfiguration geschrieben." + }, + "iommu": { + "heading": "IOMMU-Gruppen - warum die gesamte Karte auf einmal geht", + "body": "Die Isolationsgrenze für PCI-Passthrough ist die IOMMU-Gruppe, die kleinste von der IOMMU der CPU isolierbare Einheit. Geräte derselben Gruppe lassen sich nicht voneinander isolieren. Teilt ein SATA-Controller die Gruppe mit einem USB-Controller, muss für SATA-Passthrough möglicherweise auch USB vom Host gelöst werden, oder Passthrough ist nicht möglich. Dabei werden nicht automatisch alle Geräte der Gruppe der VM zugewiesen.", + "outro": "ProxMenux zeigt die IOMMU-Gruppe neben jedem Gerät und warnt Sie, wenn eine Gruppe mehr als nur den gewünschten Controller trägt. Sie können weiterhin fortfahren, wenn die zusätzlichen Geräte in der Gruppe akzeptabel sind (z. B. alle Festplattencontroller) oder zurückgehen, wenn dies nicht der Fall ist." + }, + "prereqs": { + "heading": "Voraussetzungen", + "items": [ + "CPU und Mainboard unterstützen VT-d (Intel) oder AMD-Vi, und die Funktion ist in der Firmware (BIOS/UEFI) aktiviert. ProxMenux kann die Kernelkonfiguration aktivieren, aber keine Firmware-Einstellung umschalten.", + "Die Ziel-VM ist vor dem Anschließen von PCI-Geräten ausgeschaltet.", + "Der Controller/NVMe ist nicht derjenige, der das Proxmox Root-Dateisystem hält. Das Skript verbirgt alles, was vom Host verwendet wird.", + "Das Gastbetriebssystem hat Treiber für das Controllermodell. Linux unterstützt nahezu jeden HBA ab Werk; unter Windows muss der Herstellertreiber vor dem Start mit angeschlossenem Controller installiert sein." + ], + "warnTitle": "Live Migration ist nicht möglich", + "warnBody": "Ein VM mit PCI-Durchgang ist an den Knoten gebunden, der die Karte physisch hält. Live-Migration über Knoten wird fehlschlagen. Planen Sie Backups / Replikation entsprechend." + }, + "steps": { + "heading": "Schritt für Schritt", + "stepLabel": "Schritt", + "list": [ + { + "title": "Ziel-VM auswählen", + "bodyRich": "ProxMenux liest qm list und zeigt alle VMs an. Wählen Sie die VM, die den Controller erhalten soll.", + "img": "/disk/nvme-passthrough/vm-selection.png", + "alt": "VM Auswahldialog", + "caption": "VM Auswahldialog" + }, + { + "title": "IOMMU-Prüfung", + "bodyRich": "Wenn IOMMU auf der Kernel-Cmdline nicht aktiviert ist, bietet ProxMenux an, sie zu aktivieren. Es bearbeitet /etc/kernel/cmdline (für systemd-Boot) oder /etc/default/grub (für GRUB) und fügt den richtigen Parameter für Ihren CPU hinzu:", + "items": [ + "intel_iommu=on für Intel CPUs.", + "amd_iommu=on für AMD CPUs." + ], + "outro": "Nach dieser Änderung ist ein Neustart erforderlich. Das Skript bietet einen Neustart jetzt oder später an; Passthrough kann erst fortgesetzt werden, wenn die neue Kernel-Kommandozeile aktiv ist.", + "img": "/disk/nvme-passthrough/iommu-warning.png", + "alt": "Dialog „IOMMU erforderlich“", + "caption": "IOMMU Erforderlich — Angebot zum Aktivieren und Neustarten" + }, + { + "title": "Geräteaufzählung", + "body": "ProxMenux listet jeden Speichercontroller (SATA / SAS HBA) und jedes NVMe-Gerät auf dem PCI-Bus auf. Für jedes Gerät zeigt es:", + "items": [ + "PCI-Adresse (00:17.0, 01:00.0, ...).", + "Hersteller- und Gerätebeschreibung.", + "IOMMU-Gruppe - und eine ⚠ Warnung, wenn die Gruppe mit anderen, nicht verwandten Geräten geteilt wird.", + "Die aktuell am Controller angeschlossenen Laufwerke, damit Sie wissen, welche zur VM wechseln." + ], + "img": "/disk/nvme-passthrough/device-list.png", + "alt": "Controller / NVMe Geräteaufzählung", + "caption": "Controller / NVMe Geräteaufzählung mit IOMMU Gruppeninfo" + }, + { + "title": "Konflikterkennung", + "bodyRich": "Das Skript sperrt eindeutig unsichere Geräte: bereits einer anderen VM über hostpci zugewiesene Geräte, vom Host verwendete Geräte wie den Root-Laufwerkscontroller sowie Geräte in IOMMU-Gruppen, deren andere Mitglieder nicht sicher erkannt werden können. Geeignete Geräte stehen zur Auswahl.", + "img": "/disk/nvme-passthrough/conflict-warning.png", + "alt": "Konflikterkennungswarnung", + "caption": "Konflikterkennung: Gerät mit Angabe des Grundes gesperrt" + }, + { + "title": "Zuweisen und abschließen", + "bodyRich": "Für jedes gewählte Gerät führt ProxMenux qm set <VMID> --hostpciN <pci-addr>,pcie=1 aus und verwendet den nächsten freien hostpci-Slot. Wurde IOMMU in dieser Sitzung aktiviert, wird vor dem Start der VM an den erforderlichen Neustart erinnert.", + "img": "/disk/nvme-passthrough/assignment.png", + "alt": "Zusammenfassung der Zuweisung", + "caption": "Zusammenfassung der Zuweisung: belegte hostpciN-Slots und zugewiesene PCI-Adressen" + } + ] + }, + "manual": { + "heading": "Manuelles Äquivalent" + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "noGroupsTitle": "IOMMU aktiviert, aber keine Gruppen unter /sys/kernel/iommu_groups/", + "noGroupsBody": "Ein Neustart ist erforderlich, damit die Kernel-Cmdline wirksam wird. Wenn die Gruppen nach dem Neustart immer noch fehlen, ist VT-d / AMD-Vi wahrscheinlich in der Firmware deaktiviert - überprüfen Sie das BIOS / UEFI-Setup.", + "busyTitle": "VM startet nicht: \"hostpciN: device busy\"", + "busyBody": "Ein anderer Prozess hält das PCI-Gerät noch belegt. Häufige Ursachen sind eine abgestürzte VM, die es nicht freigegeben hat, oder der Host-Kernel, der es beim letzten Start wieder übernommen hat. Prüfen Sie mit lspci -nnk -s <addr> den gebundenen Treiber; es sollte vfio-pci sein. Ein vollständiger Neustart des Hosts behebt dies meist.", + "noDisksTitle": "Gast sieht den Controller, aber nicht die Festplatten", + "noDisksBody": "Im Gast fehlt der Treiber für das Controllermodell. Unter Linux tritt dies selten auf, unter Windows hingegen schon. Installieren Sie den Herstellertreiber, etwa von LSI/Broadcom für ältere SAS-HBAs, solange die Karte nicht zugewiesen ist, und starten Sie dann mit zugewiesener Karte neu.", + "sharedTitle": "Die IOMMU-Gruppe enthält ein nicht zugehöriges Gerät", + "sharedBody": "Möglichkeiten: (a) die Karte in einen anderen PCIe-Slot setzen, um ihre Gruppe zu ändern, (b) ACS override im Kernel aktivieren, um Gruppen aufzuteilen (Sicherheitskompromiss, vor der Anwendung recherchieren), oder (c) eine andere Karte in einer besser isolierten Gruppe wählen." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Datenträger in VM importieren", + "tail": "Alternatives Modell: Befestigen Sie eine physische Festplatte über Proxmox ohne vollständigen PCIe-Durchgang." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "GPU zu VM hinzufügen (Passthrough)", + "tail": "- gleiche IOMMU / VFIO-Konzepte, die auf einen GPU angewendet wurden." + }, + { + "href": "/docs/help-info/gpu-commands", + "label": "GPU Durchgangsbefehle", + "tail": "IOMMU-Verifizierungsbefehle gelten auch für den Controller / NVMe-Durchgang." + }, + { + "href": "/docs/disk-manager", + "label": "Übersicht Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/de/docs/disk-manager/format-disk.json b/web/messages/de/docs/disk-manager/format-disk.json new file mode 100644 index 00000000..1a015a7c --- /dev/null +++ b/web/messages/de/docs/disk-manager/format-disk.json @@ -0,0 +1,142 @@ +{ + "meta": { + "title": "Physischen Datenträger formatieren oder löschen | ProxMenux-Dokumentation", + "description": "Physische Datenträger auf Proxmox VE mit ProxMenux löschen und formatieren. Vier Betriebsarten, strenge Sicherheitsfilter gegen Systemlaufwerke, eingehängte oder verwendete Laufwerke und doppelte Bestätigung mit Eingabe des vollständigen Pfads.", + "ogTitle": "Physischen Datenträger formatieren oder löschen | ProxMenux-Dokumentation", + "ogDescription": "Physische Datenträger auf Proxmox löschen oder formatieren. Sicherheitsfilter, vier Betriebsarten und doppelte Bestätigung." + }, + "header": { + "title": "Physischen Datenträger formatieren / löschen", + "description": "Wischen oder formatieren Sie sicher eine physische Festplatte auf dem Proxmox-Host. ProxMenux zeigt nur Festplatten an, die völlig frei sind (keine Systemnutzung, keine Gastreferenz, keine Mounts) und erzwingt eine doppelte Bestätigung - ja / nein plus Eingabe des vollständigen Festplattenpfads -, bevor Daten zerstört werden.", + "section": "Disk Manager · Dienstprogramme" + }, + "danger": { + "title": "Zerstörendes Werkzeug", + "body": "Jede Operation hier schreibt auf die Festplatte. Es gibt kein Rückgängigmachen. ProxMenux wendet strenge Sicherheitsfilter und Bestätigungen an, aber die Verantwortung für die Auswahl der richtigen Festplatte liegt bei Ihnen. Lesen Sie den Festplattenpfad zweimal laut aus, bevor Sie ihn eingeben." + }, + "howRuns": { + "heading": "Wie das Skript läuft", + "body": "Der Ablauf hat zwei Phasen mit einer dreifachen Sicherheitsprüfung dazwischen. In Phase 1 werden Laufwerksauswahl, Betriebsart und Dateisystemdetails erfasst. Geschrieben wird erst, wenn Phase 2 unmittelbar vor der Ausführung eine abschließende erneute Prüfung bestanden hat." + }, + "visibility": { + "heading": "Sichtbarkeitsregeln", + "intro": "Bevor das Menü überhaupt erscheint, filtert ProxMenux die Festplattenliste. Es werden nur Kandidaten gezeigt, die nachweislich sicher sind:", + "items": [ + "Angezeigt werden Laufwerke, die nicht vom Host genutzt werden (Root-Pool, Swap, eingehängte Dateisysteme, aktives ZFS/LVM/RAID) und nicht in einer VM-/LXC-Konfiguration referenziert sind, unabhängig vom Betriebszustand des Gasts.", + "Ausgeblendet: Host- und Systemlaufwerke.", + "Ausgeblendet: in VM-/LXC-Konfigurationen referenzierte Laufwerke." + ], + "safetyTitle": "Sicherheit bei Bestätigung und Ausführung", + "safetyItems": [ + "Bei Laufwerken mit veralteten oder aktiven Metadaten erscheinen detaillierte Warnungen vor der Bestätigung.", + "Von einer laufenden VM genutzte Laufwerke werden bei der Bestätigung vollständig gesperrt.", + "Laufwerke mit eingehängten Partitionen werden bei der Ausführung vollständig gesperrt. Unmittelbar vor dem Schreiben erfolgt eine neue Prüfung.", + "Zwei Bestätigungen sind immer erforderlich: ein Ja/Nein-Dialog und die exakte Eingabe des vollständigen Laufwerkspfads." + ] + }, + "modes": { + "heading": "Betriebsarten", + "intro": "Nachdem Sie eine Festplatte ausgewählt haben, wählen Sie einen von vier Modi. Sie unterscheiden sich darin, was sie zerstören und was sie zurücklassen.", + "headerMode": "Modus", + "headerPart": "Partitionstabelle", + "headerData": "Daten", + "headerUseCase": "Anwendungsfall", + "rows": [ + { + "mode": "1. Alles löschen", + "part": "Zerstört", + "data": "Signaturen gelöscht", + "useCase": "Partitionierung und Metadaten für ein neues Layout entfernen. Dabei werden nicht alle Nutzdaten überschrieben." + }, + { + "mode": "2. FS-Etiketten entfernen", + "part": "Erhalten", + "data": "Erhalten", + "useCase": "Entfernt alte ZFS-/LVM-/RAID-Signaturen, damit das Laufwerk nicht mehr automatisch eingebunden wird. Nutzdaten werden nicht flächig überschrieben, können durch das Entfernen der Signaturen aber unzugänglich werden." + }, + { + "mode": "3. Daten mit Nullen überschreiben", + "part": "Erhalten", + "data": "Zerstört (mit Nullen überschrieben)", + "useCase": "Bestehende Partitionen mit Nullen überschreiben und die Partitionstabelle erhalten. Nicht zugewiesener Speicher und SSD-Reservebereiche sind nicht erfasst; dies garantiert keine vollständige Gerätesanitisierung." + }, + { + "mode": "4. Vollformat", + "part": "Neue GPT", + "data": "Zerstört", + "useCase": "Einsatzbereites Laufwerk mit einer neuen Partition und einem neuen Dateisystem." + } + ], + "fullFormatOutro": "Vollständiges Formatieren führt zu zwei weiteren Dialogen:", + "fullFormatItems": [ + "Dateisystem: ext4, xfs, exfat (portabel) oder btrfs. Fehlen Werkzeuge wie mkfs.btrfs, wird mit einer klaren Meldung abgebrochen.", + "Label — optionales Dateisystem-Etikett zur Identifizierung." + ] + }, + "steps": { + "heading": "Schritt für Schritt", + "stepLabel": "Schritt", + "list": [ + { + "title": "Freies Laufwerk wählen", + "body": "ProxMenux listet jede Festplatte auf, die die oben genannten Sichtbarkeitsfilter passiert. Festplatten mit ⚠-Markern tragen veraltete Metadaten und werden mit den Details angezeigt, damit Sie wissen, was Sie überschreiben möchten." + }, + { + "title": "Wählen Sie einen Betriebsmodus", + "bodyRich": "Wählen Sie gemäß obiger Tabelle Alles löschen, FS-Etiketten entfernen, Daten mit Nullen überschreiben oder Vollständiges Formatieren." + }, + { + "title": "(Nur Vollformat) Dateisystem und Label auswählen", + "body": "ext4 / xfs / exfat / btrfs, plus ein optionales Etikett." + }, + { + "title": "Zweimal bestätigen", + "bodyRich": "ProxMenux zeigt eine Zusammenfassung der geplanten Aktion. Sie bestätigen im Ja/Nein-Dialog und geben den vollständigen Laufwerkspfad exakt wie angezeigt ein, etwa /dev/sdc. Jede andere Eingabe bricht ab." + }, + { + "title": "Revalidierung und Ausführung", + "body": "Kurz vor dem Schreiben überprüft das Skript den Festplattenzustand erneut. Wurde zwischenzeitlich eine Partition gemountet oder ein VM gestartet, wird die Ausführung abgebrochen. Ansonsten läuft die gewählte Operation und eine Zusammenfassung wird am Ende gedruckt." + } + ] + }, + "manual": { + "heading": "Manuelle Äquivalente", + "body": "Wenn Sie es vorziehen, die entsprechenden Befehle von Hand auszuführen:" + }, + "troubleshoot": { + "notListedTitle": "Disk nicht im Menü aufgeführt", + "notListedBody": "Das Laufwerk wurde aus Sicherheitsgründen ausgeblendet. Häufige Gründe: Es ist eingehängt, auch unter /mnt/tmp, aktives Mitglied von ZFS/LVM/RAID, in einer VM-/LXC-Konfiguration referenziert oder das Proxmox-Root-Laufwerk. Prüfen Sie auf dem Host lsblk -f und cat /proc/mdstat, um den Grund zu ermitteln.", + "busyTitle": "\"Disk may be busy\" / Unmount fehlgeschlagen", + "busyBody": "Etwas hält immer noch eine offene Datei auf einer Partition dieser Festplatte - meistens ein Container oder eine Shell, deren cwd sich in einem Mountpoint befindet. Identifizieren Sie es mit lsof | grep /dev/sdX oder fuser -vm /dev/sdX1, stoppen Sie es und führen Sie das Tool erneut aus." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "href": "/docs/disk-manager/smart-disk-test", + "label": "SMART-Festplattenstatus und -test", + "tail": "Überprüfen Sie eine Festplatte vor / nach dem Wischen, um zu bestätigen, dass sie gesund ist." + }, + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Datenträger in VM importieren", + "tail": "Übergeben Sie eine frisch formatierte Festplatte an eine VM." + }, + { + "href": "/docs/storage-share/host-local-disk", + "label": "Lokale Festplatte als Proxmox-Speicher hinzufügen", + "tail": "Registrieren Sie eine gelöschte Festplatte als Proxmox-Speicherpool." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Speicher- und Festplattenbefehle", + "tail": " — Referenz für lsblk, blkid und parted." + }, + { + "href": "/docs/disk-manager", + "label": "Übersicht Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/de/docs/disk-manager/import-disk-image-vm.json b/web/messages/de/docs/disk-manager/import-disk-image-vm.json new file mode 100644 index 00000000..a1d2cb83 --- /dev/null +++ b/web/messages/de/docs/disk-manager/import-disk-image-vm.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Datenträgerbild in VM importieren | ProxMenux Dokumentation", + "description": "Importieren Sie eine Disk-Image-Datei (.img / .qcow2 / .vmdk / .raw) mit ProxMenux in ein vorhandenes Proxmox VM. Per-Image-Schnittstelle, SSD-Emulation und bootfähiges Flag, mit qm importdisk unter der Haube.", + "ogTitle": "Datenträgerbild in VM importieren | ProxMenux Dokumentation", + "ogDescription": "Importieren Sie .img / .qcow2 / .vmdk / .raw Disk-Images in einen vorhandenen VM mit ProxMenux. Verwendet qm importdisk unter der Haube." + }, + "header": { + "title": "Disk-Image in VM importieren", + "description": "Importieren Sie eine Disk-Image-Datei (.img, .qcow2, .vmdk oder .raw) in eine vorhandene Proxmox VM. ProxMenux sammelt jede Entscheidung im Voraus - Ziel VM, Proxmox-Speicher, Quellverzeichnis, Schnittstelle, SSD-Emulation, Boot-Order - und führt dann qm importdisk für jedes ausgewählte Image aus.", + "section": "Datenträgerverwaltung · VM" + }, + "intro": { + "title": "Was das macht", + "body": "Anders als Datenträger in VM importieren, das ein physisches Laufwerk direkt zuweist, verwendet dieser Ablauf eine Datei auf dem Host, etwa einen Export eines anderen Hypervisors, ein heruntergeladenes Cloud-Image oder ein aus einer Sicherung extrahiertes Image. Sie wird in ein Proxmox-VM-Laufwerk auf dem gewählten Speicher umgewandelt. Die Originaldatei bleibt erhalten: ProxMenux kopiert sie, statt sie zu verschieben." + }, + "howRuns": { + "heading": "Wie das Skript läuft", + "body": "Der Ablauf hat zwei Phasen. Phase 1 erfasst über Dialoge vorab alle Entscheidungen: VM, Speicher, Quellverzeichnis, Images und Optionen je Image. Phase 2 führt qm importdisk für jedes ausgewählte Image aus. Vor Beginn von Phase 2 wird weder etwas kopiert noch die VM-Konfiguration verändert." + }, + "prereqs": { + "heading": "Voraussetzungen", + "items": [ + "Mindestens eine VM ist auf dem Host definiert. Die Ziel-VM sollte ausgeschaltet sein.", + "Mindestens eine Disk-Image-Datei in einem unterstützten Format liegt im Quellverzeichnis. Unterstützt werden .img, .qcow2, .vmdk und .raw.", + "Genug freien Speicherplatz auf dem Ziel-Proxmox-Speicher, um jede importierte Festplatte zu halten.", + "ProxMenux sucht standardmäßig nach Images in /var/lib/vz/template/iso. Sie können es auf jedes andere Verzeichnis auf dem Host verweisen, wenn es gefragt wird." + ] + }, + "steps": { + "heading": "Schritt für Schritt", + "stepLabel": "Schritt", + "list": [ + { + "title": "Ziel-VM auswählen", + "bodyRich": "ProxMenux liest qm list und zeigt jeden VM an. Wählen Sie diejenige aus, die die importierten Festplatten erhält." + }, + { + "title": "Wählen Sie den Proxmox-Speicher", + "bodyRich": "Die Liste enthält jeden Speicher, für den der Inhaltstyp images aktiviert ist. Wenn es nur einen Kandidaten gibt, wird er automatisch ausgewählt und der Dialog wird übersprungen." + }, + { + "title": "Wählen Sie das Quellverzeichnis", + "bodyRich": "Wählen Sie das Standardverzeichnis (/var/lib/vz/template/iso) oder geben Sie einen benutzerdefinierten Pfad ein - in der Regel, wo Sie das Image heruntergeladen / hochgeladen haben. Das Skript lehnt Pfade ab, die nicht existieren." + }, + { + "title": "Wählen Sie ein oder mehrere Images", + "bodyRich": "Das Verzeichnis wird nach .img / .qcow2 / .vmdk / .raw Dateien gescannt. Sie können mehrere gleichzeitig auswählen; jede wird im nächsten Schritt die Per-Bild-Optionen durchlaufen." + }, + { + "title": "Per-Image Optionen", + "intro": "Für jedes ausgewählte Image fragt ProxMenux:", + "items": [ + "Interface — scsi (Standard), virtio, sata oder ide. Passt dazu, wie der Gast die Festplatte sehen wird.", + "SSD-Emulation: nur für Nicht-VirtIO-Schnittstellen verfügbar. Fügt ssd=1 hinzu, damit der Gast das Laufwerk als SSD erkennt. Discard/TRIM muss separat konfiguriert werden.", + "Bootfähig: Bei Ja nimmt ProxMenux das Laufwerk als primäres Startgerät in die Bootreihenfolge der VM auf." + ] + }, + { + "title": "Importieren und zuweisen", + "bodyRich": "ProxMenux führt qm importdisk für jedes Image aus (Konvertierung des Formats im laufenden Betrieb, wo dies erforderlich ist), fügt die resultierende Festplatte mit den von Ihnen gewählten Optionen an den nächsten freien Slot (scsiN, sataN, ...) an und aktualisiert - wenn Sie eine Festplatte als bootfähig markiert haben - die Boot-Order. Fortschritt zeigt sich im Terminal." + } + ] + }, + "manual": { + "heading": "Manuelles Äquivalent", + "body": "Ein einzelnes Image lässt sich mit drei qm-Befehlen importieren:", + "warnTitle": "Konvertierung des Disk-Image-Formats", + "warnBody": "Wenn der Zielspeicher das Quellformat nativ nicht halten kann (z. B. LVM-Speicher .qcow2), konvertiert qm importdisk das Image transparent. Dies kann mehrere Minuten für Multi-GB-Bilder dauern; planen Sie entsprechend und unterbrechen Sie das Skript nicht." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "noImagesTitle": "\"Keine kompatiblen Disk Images gefunden\"", + "noImagesBody": "Das Skript fand keine Datei mit .img, .qcow2, .vmdk oder .raw. Prüfen Sie die Erweiterung einschließlich Groß-/Kleinschreibung, ob die Datei direkt im gewählten Verzeichnis liegt (Unterverzeichnisse werden nicht durchsucht) und ob root sie lesen darf.", + "slowTitle": "Import ist langsam", + "slowBody": "Konvertierungen zwischen VMDK, QCOW2 und raw können durch CPU und E/A begrenzt sein. Die Importgeschwindigkeit hängt von Quelllesezugriffen, Zielschreibzugriffen und nötiger Dekomprimierung ab. Bevorzugen Sie nach Möglichkeit raw- oder qcow2-Quellen.", + "uefiTitle": "Importiertes Laufwerk startet in der UEFI-Shell", + "uefiBody": "Das Image wurde für Legacy (SeaBIOS) gebaut, aber der VM verwendet OVMF (oder umgekehrt). Wechseln Sie entweder den VM BIOS in Proxmox, um das Image abzugleichen, oder bauen Sie das Image vor dem Importieren im richtigen Modus neu auf." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Datenträger in VM importieren", + "tail": " — derselbe Ablauf für physische Laufwerke (Passthrough)." + }, + { + "href": "/docs/utils/import-vm", + "label": "VM von OVA / OVF importieren", + "tail": "- wenn Sie ein vollständiges VM-Paket haben, nicht nur ein Festplattenimage." + }, + { + "href": "/docs/utils/UUp-Dump-ISO-Creator", + "label": "UUP-Dump-ISO-Erstellung", + "tail": "- Generieren Sie eine Windows ISO, wenn Sie eine für eine neue Installation benötigen." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Speicher- und Festplattenbefehle", + "tail": " — Referenz für qm importdisk und qemu-img convert." + }, + { + "href": "/docs/disk-manager", + "label": "Übersicht Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/de/docs/disk-manager/import-disk-lxc.json b/web/messages/de/docs/disk-manager/import-disk-lxc.json new file mode 100644 index 00000000..7620d437 --- /dev/null +++ b/web/messages/de/docs/disk-manager/import-disk-lxc.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Datenträger zu LXC importieren | ProxMenux Dokumentation", + "description": "Befestigen Sie eine physische Festplatte an einen vorhandenen LXC-Container auf Proxmox VE mit ProxMenux. Behandelt Dateisystemerkennung / -formatierung, Einhängepunkt, unprivilegierte → privilegierte Konvertierung und persistente Gerätepfade.", + "ogTitle": "Datenträger zu LXC importieren | ProxMenux Dokumentation", + "ogDescription": "Befestigen Sie eine physische Festplatte an einen vorhandenen LXC-Container. Behandelt Dateisystem, Mount Point und unprivilegierte → privilegierte Konvertierung." + }, + "header": { + "title": "Datenträger in LXC importieren", + "description": "Fügen Sie eine physische Festplatte an einen vorhandenen LXC-Container auf dem Proxmox-Host an. ProxMenux erkennt freie Festplatten, formatiert sie optional mit einem unterstützten Dateisystem und verkabelt die Partition mit persistenten Gerätepfaden an einen Einhängepunkt im Container.", + "section": "Datenträgerverwaltung · LXC" + }, + "intro": { + "title": "VM-Passthrough und LXC-Passthrough", + "body": "LXC-Passthrough stellt hier kein rohes Blockgerät bereit. Der Container erhält einen Einhängepunkt, also ein Verzeichnis auf der gewählten Host-Partition. Anders als bei einer VM nutzt der Gast den Host-Kernel; das Dateisystem (ext4/xfs/btrfs) wird daher vom Proxmox-Host gelesen, verwaltet und dem Container zugänglich gemacht." + }, + "howRuns": { + "heading": "Wie das Skript läuft", + "body": "Der Fluss hat zwei Phasen mit klarer Trennung zwischen \"Sammeln von Informationen und Entscheidungen\" und \"tatsächliches Ändern der Containerkonfiguration\". Bis zur endgültigen Bestätigung wird nichts in den CT eingebaut.", + "summary": "ProxMenux blendet das Root-Laufwerk, eingehängte Laufwerke und bereits in VM-/LXC-Konfigurationen referenzierte Laufwerke aus. Aktive ZFS-/LVM-/RAID-Mitglieder werden ausgeblendet; alte Signaturen werden mit ⚠ markiert, damit Sie sie vor dem Formatieren löschen können." + }, + "prereqs": { + "heading": "Voraussetzungen", + "items": [ + "Mindestens ein LXC-Container, der auf dem Host definiert ist.", + "Der Container ist privilegiert, oder Sie nehmen das Konvertierungsangebot des Skripts an.", + "Mindestens eine physische Festplatte, die vom Host oder einem anderen Gast nicht verwendet wird." + ], + "warnTitle": "Privilegierter Container erforderlich", + "warnBody": "Dieses Skript benötigt für die direkte Laufwerkszuweisung einen privilegierten Container. Bei unprivileged: 1 bietet es an, /etc/pve/lxc/<CTID>.conf direkt zu ändern. Das ändert das Sicherheitsmodell, ordnet vorhandene Dateieigentümer aber nicht neu zu. Sichern Sie den Container und prüfen Sie die Eigentümer vor der Zustimmung, oder erstellen Sie ihn privilegiert neu." + }, + "steps": { + "heading": "Schritt für Schritt", + "stepLabel": "Schritt", + "list": [ + { + "title": "Wählen Sie den Zielcontainer", + "img": "/disk/select-container.png", + "caption": "Auswahlmenü für Container", + "bodyRich": "ProxMenux listet jeden LXC-Container auf dem Host auf (pct list). Wählen Sie diejenige, die die Festplatte erhalten wird. Wenn der Container nicht privilegiert ist, wird Ihnen angeboten, ihn jetzt umzuwandeln." + }, + { + "title": "Wählen Sie die physische Festplatte", + "img": "/disk/disk-selection-ct.png", + "caption": "Freie Festplatten auf dem Host erkannt (mit ⚠ Labels für veraltete Metadaten)", + "bodyRich": "Nur sichere Kandidaten werden angezeigt. Anders als bei VMs weist dieses Skript ein Laufwerk pro Durchlauf zu. Führen Sie es für jedes weitere Laufwerk erneut aus." + }, + { + "title": "Formatieren oder wiederverwenden", + "intro": "Das Skript überprüft die Festplatte:", + "items": [ + "Wenn es bereits ein unterstütztes Dateisystem (ext4 / xfs / btrfs) trägt, können Sie es so wiederverwenden, wie es ist (bestehende Dateien bleiben erhalten).", + "Wenn es kein unterstütztes Dateisystem hat, wird Ihnen angeboten, es zu formatieren. Wählen Sie ext4 / xfs / btrfs." + ] + }, + { + "title": "Wählen Sie den Mount Point", + "bodyRich": "Geben Sie den Pfad ein, unter dem der Container das Laufwerk sehen soll, etwa /mnt/data oder /mnt/disk_passthrough. Dies ist der Pfad innerhalb des Containers; der Host sieht die Partition bereits unter /dev/disk/by-id/…." + }, + { + "title": "Zuweisen und prüfen", + "img": "/disk/assignment-ct.png", + "caption": "Zuordnung zu CT", + "bodyRich": "ProxMenux fügt der Containerkonfiguration einen neuen mpN:-Eintrag hinzu, überspringt belegte Indizes und liest die Konfiguration zur Bestätigung erneut. Bei laufendem Container wird die Einhängung sofort angewendet, andernfalls beim nächsten Start.", + "extraImg": "/disk/result-point.png", + "extraAlt": "Mount Point erfolgreich erstellt", + "extraCaption": "Einhängepunkt erstellt und geprüft" + } + ] + }, + "manual": { + "heading": "Manuelles Äquivalent", + "body": "Das Skript wickelt pct set ab. Ein direkter Aufruf für eine einzelne Festplatte sieht so aus:" + }, + "important": { + "heading": "Wichtige Überlegungen", + "items": [ + "Ein Laufwerk pro Durchlauf. Führen Sie das Skript für jedes weitere Laufwerk erneut aus.", + "Hängen Sie nicht dieselbe Partition an mehrere Container an, die sie gleichzeitig bereitstellen könnten – gleichzeitige Schreibvorgänge beschädigen das Dateisystem.", + "Alte Metadaten (RAID / ZFS / LVM-Signaturen) müssen manuell gelöscht werden, bevor Sie das Skript formatieren lassen, andernfalls weigert sich mkfs zu überschreiben. Verwenden Sie dafür das Format / Wipe Physical Disk Tool." + ] + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "unprivTitle": "\"Kann nicht mit einem unprivilegierten Container fortfahren\"", + "unprivBody": "Sie haben die Konvertierung abgelehnt. In /etc/pve/lxc/<CTID>.conf wird unprivileged: 1 zu unprivileged: 0, doch das allein wandelt vorhandene UID-/GID-Eigentümer nicht um. Sichern Sie den Container und klären Sie die Eigentümerzuordnung vor einer direkten Konvertierung; alternativ stellen Sie ihn privilegiert wieder her oder erstellen ihn neu.", + "permsTitle": "Berechtigungen im Container sind falsch", + "permsBody": "Beim Einhängen in einen privilegierten Container bleiben vorhandene Dateieigentümer erhalten; ein neues Dateisystem gehört häufig root:root. Läuft der Dienst unter einem anderen Benutzer, etwa www-data für Nextcloud, prüfen Sie dessen UID/GID und passen Sie die nötigen Dateien mit chown/chmod an. Dies verändert auch den zugrunde liegenden Datenträger." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Datenträger in VM importieren", + "tail": " — entsprechender Ablauf für VMs." + }, + { + "href": "/docs/storage-share/lxc-mount-points", + "label": "LXC-Einhängepunkte (Host ↔ CT)", + "tail": "- Hostverzeichnisse mit einem CT teilen, anstatt eine ganze Festplatte anzuhängen." + }, + { + "href": "/docs/help-info/vm-ct-commands", + "label": "VM und CT Verwaltungsbefehle", + "tail": "- pct config / push / pull Referenz." + }, + { + "href": "/docs/disk-manager", + "label": "Übersicht Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/de/docs/disk-manager/import-disk-vm.json b/web/messages/de/docs/disk-manager/import-disk-vm.json new file mode 100644 index 00000000..c6c8ed3a --- /dev/null +++ b/web/messages/de/docs/disk-manager/import-disk-vm.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Datenträger zu VM importieren | ProxMenux Dokumentation", + "description": "Befestigen Sie eine physische Festplatte an eine vorhandene Proxmox VM mit ProxMenux. Sichere Festplattenerkennung (ausgenommen System, montiert, in Gebrauch, ZFS/RAID/LVM), persistente /dev/disk/by-id-Pfade und SATA / SCSI / VirtIO / IDE-Schnittstellen.", + "ogTitle": "Datenträger zu VM importieren | ProxMenux Dokumentation", + "ogDescription": "Befestigen Sie eine physische Festplatte an eine vorhandene Proxmox VM. Verwendet persistente /dev/disk/by-id-Pfade und unterstützt SATA / SCSI / VirtIO / IDE." + }, + "header": { + "title": "Datenträger in VM importieren", + "description": "Weisen Sie einer vorhandenen VM ein physisches Laufwerk des Proxmox-Hosts zu. ProxMenux erkennt freie Laufwerke, lässt Sie Ziel-VM und Bustyp (SATA/SCSI/VirtIO/IDE) wählen und verwendet persistente /dev/disk/by-id-Pfade. So bleibt die Zuordnung bei Neustarts und geänderter Gerätereihenfolge bestehen.", + "section": "Datenträgerverwaltung · VM" + }, + "intro": { + "title": "Was das macht", + "body": "Ein physisches Laufwerk wird als Backend einer virtuellen Laufwerksschnittstelle zugewiesen. Der Gast erhält nicht automatisch native SMART-Daten oder Funktionen des physischen Controllers; dafür ist Controller-PCI-Passthrough geeignet. Das Laufwerk wird über /dev/disk/by-id/… statt /dev/sdX zugewiesen, sodass eine geänderte Gerätereihenfolge beim Start die Zuordnung nicht unterbricht." + }, + "howRuns": { + "heading": "Wie das Skript läuft", + "body": "Der Fluss hat zwei Phasen mit klarer Trennung zwischen \"Sammeln von Informationen und Entscheidungen\" und \"tatsächliches Anbringen von Festplatten am VM\". Bis zur endgültigen Bestätigung bleibt die VM-Konfiguration unberührt.", + "summary": "ProxMenux blendet unsichere Kandidaten aus: Root-Laufwerk, auf dem Host eingehängte Laufwerke, aktive ZFS-/LVM-/RAID-Mitglieder und bereits in VM-/LXC-Konfigurationen referenzierte Laufwerke. Laufwerke mit alten, nicht mehr verwendeten ZFS-/RAID-/LVM-Metadaten erscheinen mit ⚠, werden aber nicht gesperrt." + }, + "prereqs": { + "heading": "Voraussetzungen", + "items": [ + "Mindestens ein VM, der auf dem Host definiert ist (das Skript wird direkt an qm list gesendet).", + "Die Ziel-VM ist ausgeschaltet. Läuft sie, bricht das Skript mit einer Meldung ab; das Hinzufügen im laufenden Betrieb ist nicht Teil dieses Ablaufs.", + "Mindestens eine physische Festplatte auf dem Host, die nicht vom Host oder einem anderen Gast verwendet wird." + ] + }, + "steps": { + "heading": "Schritt für Schritt", + "stepLabel": "Schritt", + "list": [ + { + "title": "Ziel-VM auswählen", + "bodyRich": "ProxMenux listet alle VMs auf dem Host über qm list auf. Wählen Sie die VM für das Laufwerk. Läuft sie, bricht das Skript ab und fordert Sie auf, sie zuerst herunterzufahren." + }, + { + "title": "Wählen Sie die physische Festplatte(n) zum Anbringen", + "img": "/disk/disk-selection.png", + "caption": "Freie Festplatten auf dem Host erkannt (mit ⚠ Labels für veraltete Metadaten)", + "body": "Das Skript scannt jede Host-Disk und zeigt nur diejenigen an, die sicher angehängt werden können. Mit der Checkliste können Sie eine oder mehrere auf einmal auswählen. Disks mit alten ZFS / LVM / RAID-Signaturen werden immer noch angezeigt, gekennzeichnet mit ⚠, so dass Sie wissen, dass sie ein Wischen benötigen, bevor der Gast sie formatieren kann." + }, + { + "title": "Wählen Sie die Bus-Schnittstelle", + "img": "/disk/disk-assigment.png", + "caption": "Auswahl der Busschnittstellen", + "intro": "Wählen Sie aus, wie der Gast die Festplatte sehen soll:", + "items": [ + "SCSI – moderner Standard für Linux und Windows mit installierten VirtIO-SCSI-Treibern.", + "SATA — breite Kompatibilität, funktioniert out of the box auf praktisch jedem Gast.", + "VirtIO: effizientes paravirtualisiertes Blockgerät; benötigt Gasttreiber.", + "IDE: für ältere Gäste ohne einen der oben genannten Treiber." + ] + }, + { + "title": "Zuweisen und prüfen", + "bodyRich": "ProxMenux verbindet jede ausgewählte Festplatte mit dem besten /dev/disk/by-id/-Pfad, überspringt Slot-Indizes, die bereits in der VM-Konfiguration verwendet werden (scsi0, sata0, ...) und liest die Konfiguration erneut, um die Zuordnung zu bestätigen. Am Ende wird eine Zusammenfassung gedruckt." + } + ] + }, + "manual": { + "heading": "Manuelles Äquivalent", + "body": "Das Skript ist ein Wrapper um qm set. Der genaue Befehl für eine einzelne Festplatte sieht so aus:", + "migrationTitle": "Live Migration ist nicht möglich", + "migrationBody": "Eine VM mit einem direkt zugewiesenen physischen Laufwerk ist an den Host gebunden, der dieses bereitstellt. Ein anderer Knoten hat normalerweise weder denselben Pfad /dev/disk/by-id/… noch dessen Daten. Sichern und übertragen Sie diese separat oder verwenden Sie verwaltete virtuelle Laufwerke auf gemeinsamem oder unterstützt repliziertem Speicher. Gehen Sie nicht davon aus, dass Proxmox-Speicherreplikation dieses Gerät umfasst.", + "shareTitle": "Teilen Sie keine physische Festplatte zwischen VMs", + "shareBody": "Wenn Sie dieselbe physische Festplatte gleichzeitig an zwei VMs anbringen, werden die Daten beim nächsten Schreiben beschädigt. ProxMenux erkennt diese Situation und blockiert sie, aber wenn Sie das Skript umgehen (direktes qm set), stellen Sie sicher, dass nur ein Gast jemals die Festplatte mountet." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "noDisksTitle": "\"Für diesen VM sind keine Festplatten verfügbar\"", + "noDisksIntro": "Das Skript fand Festplatten, aber jeder Kandidat wurde herausgefiltert. Häufige Gründe:", + "noDisksItems": [ + "Jede verbleibende Festplatte wird bereits in der Konfiguration des Ziels VM referenziert.", + "Jede verbleibende Festplatte wird auf dem Host montiert oder ist Teil eines aktiven ZFS / LVM / RAID.", + "Der Host hat nur die Root Disk installiert." + ], + "noDisksOutro": "Führen Sie lsblk -f auf dem Host aus, um den Status jeder Festplatte zu überprüfen.", + "noVisibleTitle": "VM sieht die Festplatte nach dem Booten nicht", + "noVisibleBody": "Bei SCSI oder VirtIO benötigt der Gast den passenden Treiber. Linux bringt ihn im Kernel mit; unter Windows installieren Sie ihn von der VirtIO-ISO (siehe VM erstellen: Windows). SATA auf der Hardware-Registerkarte der VM ist ein schneller Test, ob das Laufwerk zugewiesen ist." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "href": "/docs/disk-manager/import-disk-image-vm", + "label": "Disk-Image in VM importieren", + "tail": " — derselbe Ablauf für Disk-Image-Dateien (qcow2 / vmdk / raw / img)." + }, + { + "href": "/docs/disk-manager/import-disk-lxc", + "label": "Datenträger in LXC importieren", + "tail": " — entsprechender Ablauf für LXC-Container." + }, + { + "href": "/docs/disk-manager/add-controller-nvme-vm", + "label": "Controller oder NVMe zu VM hinzufügen", + "tail": "- wenn Sie einen vollständigen PCIe / NVMe-Durchgang anstelle eines Festplattenanschlusses benötigen." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Speicher- und Festplattenbefehle", + "tail": "qm importdisk und zugehörige Shell-Referenz." + }, + { + "href": "/docs/disk-manager", + "label": "Übersicht Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/de/docs/disk-manager/index.json b/web/messages/de/docs/disk-manager/index.json new file mode 100644 index 00000000..d75fab7d --- /dev/null +++ b/web/messages/de/docs/disk-manager/index.json @@ -0,0 +1,135 @@ +{ + "meta": { + "title": "Proxmox-Datenträgerverwaltung: VM/LXC-Zuweisung, SMART-Tests, Löschen | ProxMenux", + "description": "Verwalten Sie physische Laufwerke auf einem Proxmox-VE-Host mit ProxMenux: Laufwerke VMs oder LXC zuweisen (qm set scsi/sata/virtio, pct mp), img-/qcow2-/vmdk-/raw-Images importieren, ganze HBAs oder NVMe-Controller durchreichen, Laufwerke mit Sicherheitsprüfungen löschen und SMART-Selbsttests ausführen.", + "ogTitle": "Proxmox-Datenträgerverwaltung: VM/LXC-Zuweisung, SMART-Tests, Löschen", + "ogDescription": "Laufwerke VMs/LXC zuweisen, Images importieren, Controller per PCI durchreichen, Laufwerke sicher bedienen und SMART-Tests auf Proxmox VE ausführen.", + "twitterTitle": "Proxmox-Datenträgerverwaltung | ProxMenux", + "twitterDescription": "Laufwerke VMs/LXC zuweisen, Images importieren, PCI-Passthrough, Löschen mit Sicherheitsprüfungen und SMART-Tests." + }, + "header": { + "title": "Festplattenmanager", + "description": "Das Menü Datenträgerverwaltung bündelt ProxMenux-Werkzeuge für physische Laufwerke auf einem Proxmox-Host: Zuweisung an VMs und LXC, Import von Disk-Images, Passthrough ganzer Controller oder NVMe-Geräte, Löschen mit Sicherheitsprüfungen und SMART-Tests.", + "section": "Festplattenmanager" + }, + "intro": { + "title": "Wofür dieses Menü ist", + "body": "Diese Werkzeuge arbeiten mit für den Proxmox-Host sichtbaren physischen Laufwerken und dort gespeicherten Image-Dateien. Es gibt drei Gruppen: VM (Laufwerke zuweisen oder Images importieren), LXC (Laufwerke an Container anbinden) und Dienstprogramme (Formatierung und SMART-Status). Zuweisung und Löschen blenden Systemlaufwerke und belegte Laufwerke aus oder sperren sie; SMART-Prüfungen können sie ohne Löschen untersuchen." + }, + "opening": { + "heading": "Öffnen des Menüs", + "body": "Wählen Sie im Hauptmenü von ProxMenux Disk Manager. Sie werden sehen:", + "imageAlt": "Disk Manager Menü mit VM, LXC und Utilities Blöcken" + }, + "groups": { + "heading": "Drei Werkzeuggruppen", + "intro": "Das Disk Manager-Menü ist in drei Gruppen unterteilt: VM, LXC und Utilities. Klicken Sie auf eine Karte, um direkt zu den Werkzeugen in dieser Gruppe zu springen.", + "vmTitle": "VM", + "vmBody": "Tools, die auf vorhandenen virtuellen Maschinen arbeiten. Der VM muss ausgeschaltet werden; ProxMenux validiert dies, bevor er die Konfiguration berührt.", + "vmItems": [ + "Datenträger in VM importieren", + "Disk-Image in VM importieren", + "Controller oder NVMe zu VM hinzufügen" + ], + "lxcTitle": "LXC", + "lxcBody": "Werkzeuge für bestehende LXC-Container. Dieses Skript benötigt einen privilegierten Container und bietet bei Bedarf die Änderung der Einstellung an. Lesen Sie zuerst die Hinweise zur Konvertierung und zu Dateieigentümern auf der Werkzeugseite.", + "lxcItems": [ + "Datenträger in LXC importieren" + ], + "utilitiesTitle": "Dienstprogramme", + "utilitiesBody": "Hostseitige Tools, die auf den Festplatten selbst arbeiten, unabhängig von VM oder Containern.", + "utilitiesItems": [ + "Physischen Datenträger formatieren / löschen", + "SMART-Festplattenstatus und -test" + ] + }, + "vm": { + "heading": "VM", + "intro": "Tools, die auf vorhandenen virtuellen Maschinen arbeiten. Der VM muss ausgeschaltet werden; ProxMenux validiert dies, bevor er die Konfiguration berührt.", + "options": [ + { + "icon": "HardDrive", + "href": "/docs/disk-manager/import-disk-vm", + "title": "Datenträger in VM importieren", + "description": "Befestigen Sie eine nicht zugewiesene physische Festplatte an eine vorhandene VM. Unterstützt SATA / SCSI / VirtIO / IDE, verwendet persistente /dev/disk/by-id-Pfade." + }, + { + "icon": "FileDown", + "href": "/docs/disk-manager/import-disk-image-vm", + "title": "Disk-Image in VM importieren", + "description": "Importieren Sie Disk-Image-Dateien (.img / .qcow2 / .vmdk / .raw) in eine vorhandene VM. Zweiphasiger Ablauf mit qm importdisk im Hintergrund." + }, + { + "icon": "Cpu", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "title": "Controller oder NVMe zu VM hinzufügen", + "description": "PCI-Durchgang eines ganzen SATA / SAS HBA- oder NVMe-Geräts zu einem VM. Behandelt IOMMU Enablement und Konflikterkennung." + } + ] + }, + "lxc": { + "heading": "LXC", + "intro": "Werkzeuge für bestehende LXC-Container. Dieses Skript benötigt einen privilegierten Container und bietet bei Bedarf die Änderung der Einstellung an. Lesen Sie zuerst die Hinweise zur Konvertierung und zu Dateieigentümern auf der Werkzeugseite.", + "options": [ + { + "icon": "Boxes", + "href": "/docs/disk-manager/import-disk-lxc", + "title": "Datenträger in LXC importieren", + "description": "Befestigen Sie eine nicht zugewiesene physische Festplatte an einem vorhandenen LXC-Container als Montagepunkt. Behandelt Dateisystemerkennung / Format und privilegierte Konvertierung." + } + ] + }, + "utilities": { + "heading": "Dienstprogramme", + "intro": "Hostseitige Tools, die auf den Festplatten selbst arbeiten, unabhängig von VM oder Containern.", + "options": [ + { + "icon": "Eraser", + "href": "/docs/disk-manager/format-disk", + "title": "Physische Festplatte formatieren/löschen (sicher)", + "description": "Laufwerke mit strengen Sicherheitskontrollen löschen: Nur vollständig freie Laufwerke werden angezeigt, und eine doppelte Bestätigung ist immer erforderlich." + }, + { + "icon": "Activity", + "href": "/docs/disk-manager/smart-disk-test", + "title": "SMART-Festplattenstatus und -test", + "description": "Führen Sie SMART Gesundheitschecks und kurze / lange Selbsttests auf SATA-, SAS- und NVMe-Laufwerken durch. Exportiert JSON für den Monitor." + } + ] + }, + "safety": { + "title": "Sicherheitsregeln für Laufwerkszuweisung und Löschen", + "intro": "Zuweisungs- und Löschvorgänge filtern Geräte aus, die den Host gefährden könnten:", + "items": [ + "Das Systemlaufwerk sowie Root-Pool, Swap und aktive ZFS-/LVM-/RAID-Mitglieder bleiben ausgeblendet.", + "Auf dem Host eingehängte Laufwerke werden ausgeblendet oder bei der Ausführung gesperrt.", + "Datenträger , auf die mit einem laufenden VM oder LXC verwiesen wird, können nicht neu zugewiesen oder gelöscht werden.", + "Operationen, die den Host-Status ändern können (IOMMU enable, Wipe) erfordern eine explizite Bestätigung." + ] + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "href": "/docs/storage-share", + "label": "Speicher- und Freigabemanager", + "tail": "- registrieren Sie den Speicher in Proxmox selbst (NFS / Samba / iSCSI / local) und teilen Sie Ordner zwischen Host und CTs." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Speicher- und Festplattenbefehle", + "tail": "— Blockgeräte, LVM, pvesm, SMART Referenz." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "ZFS Verwaltungsbefehle", + "tail": "— für ZFS-Pools und Datensätze." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "GPU zu VM hinzufügen (Passthrough)", + "tail": "- die gleichen IOMMU / VFIO-Konzepte für GPUs." + } + ] + } +} diff --git a/web/messages/de/docs/disk-manager/smart-disk-test.json b/web/messages/de/docs/disk-manager/smart-disk-test.json new file mode 100644 index 00000000..15c0bbba --- /dev/null +++ b/web/messages/de/docs/disk-manager/smart-disk-test.json @@ -0,0 +1,146 @@ +{ + "meta": { + "title": "SMART-Laufwerksstatus und Tests | ProxMenux-Dokumentation", + "description": "Führen Sie SMART-Gesundheitsprüfungen und Festplattentests auf Proxmox VE mit ProxMenux aus. Unterstützt SATA / SAS (smartmontools) und NVMe (nvme-cli). Kurze und lange Selbsttests, JSON Export für ProxMenux Monitor Integration.", + "ogTitle": "SMART-Laufwerksstatus und Tests | ProxMenux-Dokumentation", + "ogDescription": "SMART Gesundheitschecks und Selbsttests für SATA / SAS und NVMe Laufwerke auf Proxmox. JSON Export für den Monitor." + }, + "header": { + "title": "SMART-Festplattenstatus und -test", + "description": "Lesen Sie SMART-Daten und lösen Sie Selbsttests auf den physischen Festplatten aus, die an den Proxmox-Host angeschlossen sind. ProxMenux installiert automatisch Smartmontools für SATA / SAS und nvme-cli für NVMe, führt die Aktion innerhalb der Laufwerk-Firmware aus (lange Tests überleben Terminalschluss) und exportiert JSON-Ergebnisse für den ProxMenux Monitor.", + "section": "Disk Manager · Dienstprogramme" + }, + "intro": { + "title": "Wofür das ist", + "body": "SMART (Self-Monitoring, Analysis and Reporting Technology) ermöglicht es dem Laufwerk selbst, seinen Zustand zu melden und Selbsttests durchzuführen. Dieses Tool stellt diese Daten frei, ohne dass Sie sich die richtige smartctl/nvme-Aufrufung merken müssen, und behält die Ausgabe als JSON, so dass der Monitor Trends im Laufe der Zeit zeichnen kann." + }, + "howRuns": { + "heading": "Wie das Skript läuft", + "body": "Alle Aktionen hier sind zerstörungsfrei - SMART liest die Laufwerk-Firmware-Zähler, und Selbsttests werden innerhalb des Laufwerks selbst in die Warteschlange gestellt. Es ist keine Phasentrennung erforderlich. Der Ablauf ist: Abhängigkeitsprüfung → Festplattenauswahl → Aktionsauswahl → Werkzeugaufruf (smartctl oder nvme-cli abhängig vom Festplattenbus) → gedruckte Ausgabe plus JSON Export für den Monitor." + }, + "deps": { + "heading": "Abhängigkeiten", + "body": "Das Tool installiert automatisch, was es beim ersten Durchlauf benötigt. SATA / SAS-Laufwerke verlassen sich auf smartmontools; NVMe-Laufwerke verlassen sich auf nvme-cli. Beide:" + }, + "actions": { + "heading": "Verfügbare Maßnahmen", + "headerAction": "Aktion", + "headerWhat": "Was gelesen oder ausgeführt wird", + "headerDur": "Dauer", + "rows": [ + { + "action": "Schneller Gesundheitszustand", + "whatRich": "Insgesamt PASSED/FAILED + Schlüsselattribute.
smartctl -H + -A (SATA/SAS) oder nvme smart-log (NVMe).", + "dur": "Sofort" + }, + { + "action": "Vollständiger Bericht", + "whatRich": "Vollständige SMART-Daten, scrollbar. smartctl -x für SATA/SAS oder nvme smart-log + id-ctrl für NVMe.", + "dur": "Sofort" + }, + { + "action": "Kurztest", + "what": "Grundlegende Oberfläche und elektrische Überprüfung, in der Warteschlange innerhalb der Firmware des Laufwerks.", + "dur": "~2 Minuten" + }, + { + "action": "Lange Prüfung", + "what": "Vollständiger Scan der gesamten Oberfläche. Läuft auf der Laufwerk-Hardware - bleibt bestehen, auch wenn Sie das Terminal schließen.", + "dur": "Stunden (abhängig von der Laufwerksgröße)" + }, + { + "action": "Testfortschritt prüfen", + "what": "Status des aktiven oder letzten Selbsttests.", + "dur": "Sofort" + } + ], + "tipTitle": "Lange Tests laufen nach dem Schließen des Terminals weiter", + "tipBody": "Ein langer Test läuft im Laufwerk und benötigt keinen weiterlaufenden ProxMenux-Prozess. Schließen Sie das Terminal und verwenden Sie später Testfortschritt prüfen. Ein Host-Neustart, Controller-Reset oder Stromausfall kann den Test und die Ergebniserfassung unterbrechen; eine automatische Fortsetzung ist nicht garantiert." + }, + "json": { + "heading": "JSON Export für den Monitor", + "intro": "Status-, Kurztest- und Fortschrittsaktionen schreiben eine JSON-Datei mit Zeitstempel nach /usr/local/share/proxmenux/smart/<disk>/; Langtestergebnisse werden im Hintergrund erfasst. Der vollständige Bericht wird nur angezeigt. Die Struktur ist:", + "outro": "ProxMenux Monitor liest diese Dateien zur Darstellung von Zustandstrends je Laufwerk. Beim Erreichen der Aufbewahrungsgrenze werden alte Dateien automatisch entfernt." + }, + "steps": { + "heading": "Schritt für Schritt", + "stepLabel": "Schritt", + "list": [ + { + "title": "Laufwerk auswählen", + "body": "ProxMenux listet jede physische Festplatte auf dem Host mit ihrem Modell und ihrer Größe auf. Im Gegensatz zum Format-Tool wird diese Liste nicht durch die Sicherheit gefiltert - das Lesen von SMART ist eine zerstörungsfreie Operation.", + "img": "/disk/smart/disk-selection.png", + "alt": "SMART Plattenauswahlmenü", + "caption": "SMART Plattenauswahlmenü" + }, + { + "title": "Wählen Sie eine Aktion", + "body": "Wählen Sie schnellen Status, vollständigen Bericht, Kurztest, Langtest oder Testfortschritt. Das Menü bleibt nach jeder Aktion offen, sodass Sie mehrere Abfragen desselben Laufwerks ausführen können.", + "img": "/disk/smart/action-menu.png", + "alt": "SMART Aktionsmenü", + "caption": "SMART Aktionsmenü (5 Aktionen + Abbruch)" + }, + { + "title": "(Nur langer Test) Hintergrundausführung bestätigen", + "body": "ProxMenux weist darauf hin, dass der Test nach dem Schließen des Terminals weiterläuft, und zeigt den Speicherort der JSON-Ergebnisse. Bestätigen Sie, um den Test zu starten.", + "img": "/disk/smart/long-test-warning.png", + "alt": "Dialog über lange Testbestätigung", + "caption": "Lange Testbestätigung – läuft im Hintergrund, Ergebnis wird in JSON gespeichert" + }, + { + "title": "Prüfergebnisse", + "bodyRich": "Status und Berichte erscheinen im Terminal; JSON wird für die oben genannten Aktionen exportiert, nicht für den vollständigen Bericht. Verwenden Sie bei Langtests später Testfortschritt prüfen für dasselbe Laufwerk.", + "img": "/disk/smart/quick-status.png", + "alt": "Schnelle Ausgabe des Gesundheitszustands", + "caption": "Schnelle Ausgabe des Gesundheitszustands (SATA — smartctl -H + -A)" + } + ] + }, + "manual": { + "heading": "Manuelle Äquivalente", + "nvmeWarnTitle": "NVMe Selbsttests sind Laufwerk-Firmware abhängig", + "nvmeWarnBody": "Nicht jedes NVMe-Laufwerk unterstützt den kurzen / langen Selbsttestbefehl. Wenn ein Laufwerk den Test ablehnt, sind das SMART-Protokoll und die ID-Controllerdaten (nvme smart-log + id-ctrl) immer noch das zuverlässigste Gesundheitssignal." + }, + "troubleshoot": { + "heading": "Fehlerbehebung", + "noSmartTitle": "\"Konnte SMART-Daten aus /dev/sdX nicht lesen\"", + "noSmartBody": "Die Festplatte befindet sich wahrscheinlich hinter einem RAID / SAS-Controller, der SMART nicht durchläuft. Versuchen Sie mit Megaraid-basierten Karten smartctl -d megaraid,N /dev/sdX. Für HBAs im IT-Modus funktioniert der direkte Aufruf.", + "longTitle": "Langer Test nie abgeschlossen", + "longBody": "Der Test läuft in der Laufwerksfirmware; hohe E/A-Last kann ihn verzögern. Nutzen Sie eine ruhige Zeit, etwa nachts. Bei SATA/SAS zeigt smartctl -c den verbleibenden Prozentsatz; das Selbsttestprotokoll zeigt Abschlussstatus und gegebenenfalls fehlerhafte LBAs. Lesefehler müssen untersucht werden; langsamer Fortschritt allein beweist keinen defekten Sektor." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "href": "/docs/disk-manager/format-disk", + "label": "Physischen Datenträger formatieren / löschen", + "tail": "Wiederverwendung einer Festplatte, nachdem bestätigt wurde, dass sie gesund ist." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Speicher- und Laufwerksbefehle → SMART-Laufwerksstatus", + "tail": "Referenz smartctl/nvme." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "ZFS Verwaltungsbefehle", + "tail": " — zpool scrub prüft ZFS-Datenprüfsummen und ergänzt SMART-Hardwaretests." + }, + { + "href": "/docs/monitor/dashboard/storage", + "label": "ProxMenux Monitor — Speicherregister", + "tail": " — Laufwerksdetailansicht mit den hier exportierten JSON-Daten: vollständige SMART-Tabelle, Verlauf und PDF-Bericht." + }, + { + "href": "/docs/monitor/dashboard/hardware", + "label": "ProxMenux Monitor — Register Hardware", + "tail": "Speicherzusammenfassung mit Modell, Kapazität und ausgehandelter Verbindungsgeschwindigkeit (aktuell vs. maximal auf NVMe)." + }, + { + "href": "/docs/disk-manager", + "label": "Übersicht Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/en/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/en/docs/disk-manager/add-controller-nvme-vm.json index 5ededbcd..c31d5306 100644 --- a/web/messages/en/docs/disk-manager/add-controller-nvme-vm.json +++ b/web/messages/en/docs/disk-manager/add-controller-nvme-vm.json @@ -20,7 +20,7 @@ }, "iommu": { "heading": "IOMMU groups — why the whole card leaves at once", - "body": "PCI passthrough is done per IOMMU group, which is the smallest unit the CPU's IOMMU can isolate. Everything inside a group moves together. If your SATA controller shares its IOMMU group with the USB controller, passing the SATA card to a VM also takes the USB ports with it — often undesirable.", + "body": "The isolation boundary for PCI passthrough is the IOMMU group, the smallest unit the CPU’s IOMMU can isolate. Devices in the same group cannot be isolated from each other. If a SATA controller shares its group with a USB controller, passing through SATA may also require releasing USB from the host, or may prevent passthrough. It does not automatically assign every device in the group to the VM.", "outro": "ProxMenux shows the IOMMU group next to each device and warns you when a group carries more than just the controller you want. You can still proceed if the extra devices in the group are acceptable (all disk controllers, for example), or back out if they are not." }, "prereqs": { @@ -97,7 +97,7 @@ "busyBody": "Another process still holds the PCI device. Most common causes: a previous VM that crashed without releasing it, or the host kernel reclaimed it on the last boot. Run lspci -nnk -s <addr> to see which driver is bound; it should be vfio-pci. A full host reboot usually clears this.", "noDisksTitle": "Guest sees the controller but not the disks", "noDisksBody": "The controller model lacks an in-guest driver. Linux almost never hits this; Windows does — install the vendor driver (e.g. LSI / Broadcom for older SAS HBAs) while the card is detached, then reboot with the card attached.", - "sharedTitle": "Shared IOMMU group also exports an unrelated device", + "sharedTitle": "The IOMMU group includes an unrelated device", "sharedBody": "Options: (a) move the card to a different PCIe slot to change its group, (b) enable ACS override in the kernel to split groups (security trade-off — research before applying), or (c) pick a different card in a cleaner group." }, "related": { diff --git a/web/messages/en/docs/disk-manager/format-disk.json b/web/messages/en/docs/disk-manager/format-disk.json index 47231c5f..f0ee2449 100644 --- a/web/messages/en/docs/disk-manager/format-disk.json +++ b/web/messages/en/docs/disk-manager/format-disk.json @@ -46,19 +46,19 @@ "mode": "1. Wipe all", "part": "Destroyed", "data": "Signatures wiped", - "useCase": "Starting fresh: everything on the disk goes, ready for a new layout." + "useCase": "Remove partitioning and metadata to prepare a new layout. This does not overwrite all user data." }, { "mode": "2. Remove FS labels", "part": "Preserved", "data": "Preserved", - "useCase": "Clears stale ZFS / LVM / RAID signatures so the disk stops being auto-claimed, without touching the data." + "useCase": "Removes stale ZFS / LVM / RAID signatures so the disk is no longer auto-claimed. Bulk user data is not overwritten, but removing signatures can make it inaccessible." }, { "mode": "3. Zero all data", "part": "Preserved", "data": "Destroyed (zeroed)", - "useCase": "Sanitise before handing the disk over, keeping the existing partition layout." + "useCase": "Overwrite the existing partitions with zeros while keeping the partition table. Unallocated space and SSD spare areas are not covered; this is not a complete device sanitization guarantee." }, { "mode": "4. Full format", diff --git a/web/messages/en/docs/disk-manager/import-disk-image-vm.json b/web/messages/en/docs/disk-manager/import-disk-image-vm.json index f2de9d99..314bbf4e 100644 --- a/web/messages/en/docs/disk-manager/import-disk-image-vm.json +++ b/web/messages/en/docs/disk-manager/import-disk-image-vm.json @@ -52,7 +52,7 @@ "intro": "For every selected image ProxMenux asks:", "items": [ "Interface — scsi (default), virtio, sata or ide. Matches how the guest will see the disk.", - "SSD emulation — only offered for non-VirtIO interfaces. Adds ssd=1 so the guest advertises the disk as solid-state (useful for OS-level TRIM / alignment).", + "SSD emulation — only offered for non-VirtIO interfaces. Adds ssd=1 so the guest recognizes a solid-state disk. Discard/TRIM support must be configured separately.", "Bootable — if yes, ProxMenux adds the disk to the boot order so it becomes the primary boot device of the VM." ] }, @@ -73,7 +73,7 @@ "noImagesTitle": "\"No compatible disk images found\"", "noImagesBody": "The script scanned the directory but found no .img / .qcow2 / .vmdk / .raw file. Check the extension (case matters), that the file sits directly in the selected directory (no sub-directories are searched) and that permissions allow root to read it.", "slowTitle": "Import is slow", - "slowBody": "VMDK → QCOW2 → raw conversions are CPU- and I/O-bound. Import speed depends on the source read speed, the target storage write speed and CPU for decompression. Prefer raw or qcow2 sources when possible.", + "slowBody": "Conversions between VMDK, QCOW2 and raw can be limited by CPU and I/O. Import speed depends on source reads, target writes and any decompression work. Prefer raw or qcow2 sources when possible.", "uefiTitle": "Imported disk boots into UEFI shell", "uefiBody": "The image was built for legacy (SeaBIOS) but the VM uses OVMF (or vice versa). Either switch the VM's BIOS in Proxmox to match the image, or rebuild the image in the correct mode before importing." }, diff --git a/web/messages/en/docs/disk-manager/import-disk-lxc.json b/web/messages/en/docs/disk-manager/import-disk-lxc.json index 9dd095b7..6878456e 100644 --- a/web/messages/en/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/en/docs/disk-manager/import-disk-lxc.json @@ -27,7 +27,7 @@ "At least one physical disk not in use by the host or any other guest." ], "warnTitle": "Privileged container required", - "warnBody": "Direct device passthrough to an LXC container only works if the container is privileged. If the script detects unprivileged: 1 in the config it offers to convert it in place (edits /etc/pve/lxc/<CTID>.conf). Cancel if you cannot accept the security trade-off of a privileged container." + "warnBody": "This script requires a privileged container for its direct disk attachment. If it detects unprivileged: 1, it offers to edit /etc/pve/lxc/<CTID>.conf in place. This changes the security model and does not remap existing file ownership. Back up the container and verify ownership before accepting, or rebuild it as privileged." }, "steps": { "heading": "Step-by-step", @@ -83,9 +83,9 @@ "troubleshoot": { "heading": "Troubleshooting", "unprivTitle": "\"Cannot continue with an unprivileged container\"", - "unprivBody": "You declined the conversion offer. Either re-run and accept the conversion, or convert the container manually by editing /etc/pve/lxc/<CTID>.conf and replacing unprivileged: 1 with unprivileged: 0. You can also rebuild the container as privileged if you prefer not to convert in place.", + "unprivBody": "You declined the conversion. The flag in /etc/pve/lxc/<CTID>.conf changes from unprivileged: 1 to unprivileged: 0, but that alone does not convert existing UID/GID ownership. Back up and handle the ownership mapping before accepting an in-place conversion; alternatively restore or rebuild the container as privileged.", "permsTitle": "Permissions inside the container are wrong", - "permsBody": "Mounts from the host into a privileged container land as root:root. If the service inside the CT runs as a different user (e.g. www-data for Nextcloud), chown/chmod inside the container to match its UID/GID after the first mount." + "permsBody": "Existing file ownership is retained when a partition is mounted into a privileged container; a newly formatted filesystem is often owned by root:root. If the service runs as another user (e.g. www-data for Nextcloud), inspect its UID/GID and adjust the required files with chown/chmod. Changes also affect the underlying disk." }, "related": { "heading": "Related", diff --git a/web/messages/en/docs/disk-manager/import-disk-vm.json b/web/messages/en/docs/disk-manager/import-disk-vm.json index 7d953c4f..3a49c002 100644 --- a/web/messages/en/docs/disk-manager/import-disk-vm.json +++ b/web/messages/en/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "What this does", - "body": "This is a raw-disk passthrough: the guest OS sees the drive as a real block device (with its SMART data and native geometry). The disk is attached via its /dev/disk/by-id/… path — not /dev/sdX — so the assignment does not break if disk controllers enumerate devices in a different order on the next boot." + "body": "This attaches a raw physical disk as the backing device for a virtual disk interface. The guest does not automatically receive native SMART data or the physical controller’s features; use controller PCI passthrough when those are required. The disk is attached through /dev/disk/by-id/…, not /dev/sdX, so a changed device enumeration order at boot does not break the assignment." }, "howRuns": { "heading": "How the script runs", @@ -49,7 +49,7 @@ "items": [ "SCSI — modern default for Linux and Windows with VirtIO-SCSI drivers installed.", "SATA — broad compatibility, works out of the box on virtually every guest.", - "VirtIO — paravirtualised block device, fastest but requires guest drivers.", + "VirtIO — efficient paravirtualised block device; requires guest drivers.", "IDE — for legacy guests that lack any of the above drivers." ] }, @@ -63,7 +63,7 @@ "heading": "Manual equivalent", "body": "The script is a wrapper around qm set. The exact command for a single disk looks like this:", "migrationTitle": "Live migration is not possible", - "migrationBody": "A VM with a passthrough disk is tied to the host that exposes that disk. Live migration to another Proxmox node will fail because the target node does not see the same /dev/disk/by-id/… path. Use replication or backup/restore instead, or pick virtual disks on shared storage if you need mobility.", + "migrationBody": "A VM with a physical passthrough disk is tied to the host that exposes that disk. Another node normally lacks the same /dev/disk/by-id/… path and disk data. Back up and transfer that data separately, or use managed virtual disks on shared or supported replicated storage for mobility; do not assume Proxmox storage replication covers this device.", "shareTitle": "Do not share a physical disk between VMs", "shareBody": "Attaching the same physical disk to two VMs at the same time will corrupt data on next write. ProxMenux detects this situation and blocks it, but if you bypass the script (direct qm set), make sure only one guest ever mounts the disk." }, diff --git a/web/messages/en/docs/disk-manager/index.json b/web/messages/en/docs/disk-manager/index.json index 7ba5f8ae..46a1debd 100644 --- a/web/messages/en/docs/disk-manager/index.json +++ b/web/messages/en/docs/disk-manager/index.json @@ -1,7 +1,7 @@ { "meta": { "title": "Proxmox Disk Manager — Attach Disks to VMs / LXC, SMART Tests, Wipe | ProxMenux", - "description": "Manage physical disks on a Proxmox VE host with ProxMenux: pass disks through to VMs or LXC containers (qm set scsi/sata/virtio, pct mp), import qcow2 / vmdk / vdi disk images, pass through whole HBAs or NVMe controllers, safely wipe disks and run SMART self-tests.", + "description": "Manage physical disks on a Proxmox VE host with ProxMenux: attach disks to VMs or LXC containers (qm set scsi/sata/virtio, pct mp), import img / qcow2 / vmdk / raw disk images, pass through whole HBAs or NVMe controllers, wipe disks with safety checks and run SMART self-tests.", "ogTitle": "Proxmox Disk Manager — Attach Disks to VMs / LXC, SMART Tests, Wipe", "ogDescription": "Attach disks to VMs / LXC, import disk images, PCI passthrough for controllers, safe wipe and SMART tests on Proxmox VE.", "twitterTitle": "Proxmox Disk Manager | ProxMenux", @@ -14,7 +14,7 @@ }, "intro": { "title": "What this menu is for", - "body": "Every option here operates on physical disks already visible to the Proxmox host. The menu is split in three groups — VM (attach disks or import images into a virtual machine), LXC (attach disks to a container), and Utilities (safe format, SMART health). Safety checks apply everywhere: system disks and disks already in use are hidden or blocked." + "body": "These tools work with physical disks visible to the Proxmox host and image files stored on it. The menu has three groups: VM (attach disks or import images), LXC (attach disks to a container), and Utilities (formatting and SMART health). Attachment and wipe operations hide or block system disks and disks already in use; SMART checks can inspect those disks without wiping them." }, "opening": { "heading": "Opening the menu", @@ -32,7 +32,7 @@ "Add Controller or NVMe to VM" ], "lxcTitle": "LXC", - "lxcBody": "Tools that operate on existing containers. Direct device passthrough needs a privileged container; the script offers to convert it if necessary.", + "lxcBody": "Tools for existing LXC containers. This script requires a privileged container and offers to change the flag when needed. Read the conversion and file-ownership cautions on the tool page first.", "lxcItems": [ "Import Disk to LXC" ], @@ -69,7 +69,7 @@ }, "lxc": { "heading": "LXC", - "intro": "Tools that operate on existing LXC containers. Direct device passthrough requires a privileged container; the script offers to convert the container if needed.", + "intro": "Tools for existing LXC containers. This script requires a privileged container and offers to change the flag when needed. Read the conversion and file-ownership cautions on the tool page first.", "options": [ { "icon": "Boxes", @@ -98,8 +98,8 @@ ] }, "safety": { - "title": "Safety rules shared by every option", - "intro": "ProxMenux filters out anything that could harm the host:", + "title": "Safety rules for disk attachment and wiping", + "intro": "Attachment and wipe operations filter out devices that could harm the host:", "items": [ "The system disk (root pool, swap, active ZFS / LVM / RAID members) is always hidden.", "Disks mounted anywhere on the host are hidden or blocked at execution.", diff --git a/web/messages/en/docs/disk-manager/smart-disk-test.json b/web/messages/en/docs/disk-manager/smart-disk-test.json index 0c97b0fe..a06ccdc4 100644 --- a/web/messages/en/docs/disk-manager/smart-disk-test.json +++ b/web/messages/en/docs/disk-manager/smart-disk-test.json @@ -55,11 +55,11 @@ } ], "tipTitle": "Long tests survive terminal close", - "tipBody": "A long test is queued inside the drive — it does not depend on the ProxMenux process staying alive. You can close the terminal, reboot the Proxmox host (the test picks up where it left off on some drives) or just come back later and use Check test progress to see the result." + "tipBody": "A long test runs inside the drive and does not depend on the ProxMenux process staying alive. You can close the terminal and return later to Check test progress. A host reboot, controller reset or power loss may interrupt the test and its result collector; do not assume it will resume automatically." }, "json": { "heading": "JSON export for the Monitor", - "intro": "Every run writes a timestamped JSON file to /usr/local/share/proxmenux/smart/<disk>/. The structure is:", + "intro": "Status, short-test and progress actions write a timestamped JSON file to /usr/local/share/proxmenux/smart/<disk>/; long-test results are collected in the background. The full-report action only displays its report. The structure is:", "outro": "The ProxMenux Monitor picks these up to render health trends per disk; old files are rotated out automatically once the retention limit is reached." }, "steps": { @@ -89,7 +89,7 @@ }, { "title": "Review results", - "bodyRich": "Status and report are printed to the terminal and written to JSON. For long tests, return later and run Check test progress on the same disk to see the outcome.", + "bodyRich": "Status and reports are shown in the terminal; JSON export is performed for supported actions as described above, not for Full report. For long tests, return later and run Check test progress on the same disk to see the outcome.", "img": "/disk/smart/quick-status.png", "alt": "Quick health status output", "caption": "Quick health status output (SATA — smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"Could not read SMART data from /dev/sdX\"", "noSmartBody": "The disk is probably behind a RAID / SAS controller that does not pass SMART through. With megaraid-based cards, try smartctl -d megaraid,N /dev/sdX. For HBAs in IT mode the direct invocation works.", "longTitle": "Long test never completes", - "longBody": "The test is queued on the drive firmware and pauses if the disk is under heavy load. Running it overnight on an idle system usually works. You can also check smartctl -c to see percentage remaining; if it is stuck at a fixed LBA, the disk is failing at that sector." + "longBody": "The drive runs the test in firmware, and heavy I/O can delay completion. Try an idle period such as overnight. For SATA/SAS, smartctl -c shows the remaining percentage; inspect the self-test log for completion status and any failing LBA. A reported read failure needs investigation; slow progress alone does not prove a bad sector." }, "related": { "heading": "Related", @@ -124,7 +124,7 @@ { "href": "/docs/help-info/zfs-commands", "label": "ZFS Management commands", - "tail": " — zpool scrub for the storage-layer equivalent of SMART tests." + "tail": " — zpool scrub verifies ZFS data checksums and complements hardware SMART tests." }, { "href": "/docs/monitor/dashboard/storage", diff --git a/web/messages/es/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/es/docs/disk-manager/add-controller-nvme-vm.json index fd5e9332..0c2a9cf6 100644 --- a/web/messages/es/docs/disk-manager/add-controller-nvme-vm.json +++ b/web/messages/es/docs/disk-manager/add-controller-nvme-vm.json @@ -1,14 +1,14 @@ { "meta": { - "title": "Añadir controladora o NVMe a VM | ProxMenux Documentation", + "title": "Añadir controladora o NVMe a una VM | Documentación de ProxMenux", "description": "PCI passthrough de una controladora de almacenamiento (HBA SATA / SAS) o un dispositivo NVMe a una VM Proxmox usando ProxMenux. Gestiona la habilitación de IOMMU, la detección de conflictos y el conexionado con qm set --hostpci.", - "ogTitle": "Añadir controladora o NVMe a VM | ProxMenux Documentation", + "ogTitle": "Añadir controladora o NVMe a una VM | Documentación de ProxMenux", "ogDescription": "Pasa un HBA SATA / SAS entero o un dispositivo NVMe a una VM Proxmox. ProxMenux gestiona IOMMU, detección de conflictos y conexionado hostpci." }, "header": { "title": "Añadir controladora o NVMe a VM", "description": "Pasa un host bus adapter (HBA) SATA / SAS entero o un dispositivo NVMe a una VM Proxmox mediante PCI passthrough. ProxMenux comprueba — y, con tu consentimiento, habilita — IOMMU, enumera los dispositivos elegibles para passthrough, filtra los conflictos y conecta la asignación con qm set --hostpci.", - "section": "Disk Manager · VM" + "section": "Administrador de discos · VM" }, "intro": { "title": "Qué hace (y qué no hace) esto", @@ -20,7 +20,7 @@ }, "iommu": { "heading": "Grupos IOMMU — por qué la tarjeta entera sale a la vez", - "body": "El PCI passthrough se hace por grupo IOMMU, que es la unidad más pequeña que el IOMMU de la CPU puede aislar. Todo lo que hay dentro de un grupo se mueve junto. Si tu controladora SATA comparte grupo IOMMU con la controladora USB, pasar la tarjeta SATA a una VM se lleva también los puertos USB — algo a menudo no deseado.", + "body": "El límite de aislamiento del passthrough PCI es el grupo IOMMU, la unidad más pequeña que puede aislar el IOMMU de la CPU. Los dispositivos del mismo grupo no pueden aislarse entre sí. Si una controladora SATA comparte grupo con una USB, pasar la SATA puede requerir liberar también la USB del host o impedir el passthrough. Esto no asigna automáticamente a la VM todos los dispositivos del grupo.", "outro": "ProxMenux muestra el grupo IOMMU junto a cada dispositivo y te avisa cuando un grupo lleva algo más que la controladora que quieres. Aún así puedes continuar si los dispositivos extra del grupo son aceptables (todas controladoras de disco, por ejemplo), o echar atrás si no lo son." }, "prereqs": { @@ -54,8 +54,8 @@ ], "outro": "Es necesario reiniciar después de este cambio. El script te pide reiniciar ahora o más tarde; el passthrough no puede continuar hasta que la nueva cmdline del kernel esté activa.", "img": "/disk/nvme-passthrough/iommu-warning.png", - "alt": "Diálogo IOMMU Required", - "caption": "IOMMU Required — propuesta de habilitar y reiniciar" + "alt": "Diálogo que indica que se requiere IOMMU", + "caption": "IOMMU requerido: propuesta de habilitarlo y reiniciar" }, { "title": "Enumeración de dispositivos", @@ -97,7 +97,7 @@ "busyBody": "Otro proceso aún retiene el dispositivo PCI. Causas más comunes: una VM anterior que crasheó sin soltarlo, o el kernel del host lo recuperó en el último arranque. Ejecuta lspci -nnk -s <addr> para ver qué driver está vinculado; debería ser vfio-pci. Un reinicio completo del host suele resolverlo.", "noDisksTitle": "El guest ve la controladora pero no los discos", "noDisksBody": "El modelo de la controladora no tiene driver en el guest. Linux casi nunca tiene este problema; Windows sí — instala el driver del fabricante (p. ej. LSI / Broadcom para HBAs SAS antiguos) con la tarjeta desconectada y luego reinicia con la tarjeta adjuntada.", - "sharedTitle": "Grupo IOMMU compartido que exporta también un dispositivo no relacionado", + "sharedTitle": "El grupo IOMMU incluye un dispositivo no relacionado", "sharedBody": "Opciones: (a) mover la tarjeta a un slot PCIe distinto para cambiar su grupo, (b) habilitar ACS override en el kernel para separar grupos (compromiso de seguridad — investiga antes de aplicarlo), o (c) elegir otra tarjeta en un grupo más limpio." }, "related": { diff --git a/web/messages/es/docs/disk-manager/format-disk.json b/web/messages/es/docs/disk-manager/format-disk.json index 5e630681..24c7099b 100644 --- a/web/messages/es/docs/disk-manager/format-disk.json +++ b/web/messages/es/docs/disk-manager/format-disk.json @@ -1,8 +1,8 @@ { "meta": { - "title": "Formatear / borrar disco físico | ProxMenux Documentation", + "title": "Formatear o borrar un disco físico | Documentación de ProxMenux", "description": "Wipe seguro y formateo de disco físico en Proxmox VE usando ProxMenux. Cuatro modos de operación, filtros estrictos de seguridad (discos del sistema / montados / en uso bloqueados) y doble confirmación incluyendo tecleo de la ruta completa.", - "ogTitle": "Formatear / borrar disco físico | ProxMenux Documentation", + "ogTitle": "Formatear o borrar un disco físico | Documentación de ProxMenux", "ogDescription": "Borra o formatea de forma segura un disco físico en Proxmox. Reglas de visibilidad seguras, 4 modos de operación, doble confirmación." }, "header": { @@ -43,31 +43,31 @@ "headerUseCase": "Caso de uso", "rows": [ { - "mode": "1. Wipe all", + "mode": "1. Borrar todo", "part": "Destruida", "data": "Firmas borradas", - "useCase": "Empezar de cero: todo lo del disco se va, listo para una nueva distribución." + "useCase": "Eliminar las particiones y los metadatos para preparar una nueva distribución. No sobrescribe todos los datos de usuario." }, { - "mode": "2. Remove FS labels", + "mode": "2. Quitar etiquetas FS", "part": "Preservada", "data": "Preservados", - "useCase": "Limpia firmas obsoletas de ZFS / LVM / RAID para que el disco deje de ser reclamado automáticamente, sin tocar los datos." + "useCase": "Elimina firmas antiguas de ZFS / LVM / RAID para evitar que el disco se reclame automáticamente. No sobrescribe los datos de usuario en bloque, pero quitar las firmas puede dejarlos inaccesibles." }, { - "mode": "3. Zero all data", + "mode": "3. Sobrescribir los datos con ceros", "part": "Preservada", - "data": "Destruidos (zerados)", - "useCase": "Sanear antes de entregar el disco, manteniendo la distribución de particiones existente." + "data": "Destruidos (sobrescritos con ceros)", + "useCase": "Sobrescribir con ceros las particiones existentes conservando la tabla de particiones. No cubre el espacio sin asignar ni las áreas de reserva de los SSD; no garantiza el saneamiento completo del dispositivo." }, { - "mode": "4. Full format", + "mode": "4. Formato completo", "part": "Nuevo GPT", "data": "Destruidos", "useCase": "Disco listo para usar con una única partición nueva y un filesystem fresco." } ], - "fullFormatOutro": "Full format continúa con dos diálogos extra:", + "fullFormatOutro": "Formateo completo continúa con dos diálogos más:", "fullFormatItems": [ "Filesystem — ext4, xfs, exfat (portable) o btrfs. Si faltan herramientas (por ejemplo mkfs.btrfs) aborta con un mensaje claro.", "Etiqueta — etiqueta opcional del filesystem para identificación." @@ -83,10 +83,10 @@ }, { "title": "Elige un modo de operación", - "bodyRich": "Elige entre Wipe all, Remove FS labels, Zero all data o Full format según la tabla de arriba." + "bodyRich": "Elige entre Borrar todo, Quitar etiquetas FS, Sobrescribir los datos con ceros o Formateo completo según la tabla anterior." }, { - "title": "(Solo Full format) Elige filesystem y etiqueta", + "title": "(Solo formateo completo) Elegir sistema de archivos y etiqueta", "body": "ext4 / xfs / exfat / btrfs, más una etiqueta opcional." }, { diff --git a/web/messages/es/docs/disk-manager/import-disk-image-vm.json b/web/messages/es/docs/disk-manager/import-disk-image-vm.json index 29901f53..998b0ab8 100644 --- a/web/messages/es/docs/disk-manager/import-disk-image-vm.json +++ b/web/messages/es/docs/disk-manager/import-disk-image-vm.json @@ -1,14 +1,14 @@ { "meta": { - "title": "Importar imagen de disco a VM | ProxMenux Documentation", + "title": "Importar imagen de disco a una VM | Documentación de ProxMenux", "description": "Importa un archivo de imagen de disco (.img / .qcow2 / .vmdk / .raw) a una VM Proxmox existente usando ProxMenux. Interfaz por imagen, emulación SSD y flag bootable, con qm importdisk por debajo.", - "ogTitle": "Importar imagen de disco a VM | ProxMenux Documentation", + "ogTitle": "Importar imagen de disco a una VM | Documentación de ProxMenux", "ogDescription": "Importa imágenes de disco .img / .qcow2 / .vmdk / .raw a una VM existente con ProxMenux. Usa qm importdisk por debajo." }, "header": { "title": "Importar imagen de disco a VM", "description": "Importa un archivo de imagen de disco (.img, .qcow2, .vmdk o .raw) a una VM Proxmox existente. ProxMenux recopila todas las decisiones por adelantado — VM destino, almacenamiento Proxmox, directorio origen, interfaz, emulación SSD, orden de arranque — y luego ejecuta qm importdisk para cada imagen seleccionada.", - "section": "Disk Manager · VM" + "section": "Administrador de discos · VM" }, "intro": { "title": "Qué hace esto", @@ -52,8 +52,8 @@ "intro": "Para cada imagen seleccionada ProxMenux pregunta:", "items": [ "Interfaz — scsi (por defecto), virtio, sata o ide. Determina cómo verá el disco el guest.", - "Emulación SSD — solo se ofrece para interfaces no-VirtIO. Añade ssd=1 para que el guest anuncie el disco como solid-state (útil para TRIM / alineación a nivel de SO).", - "Bootable — si es sí, ProxMenux añade el disco al orden de arranque para que se convierta en el dispositivo de arranque primario de la VM." + "Emulación SSD: solo se ofrece para interfaces que no sean VirtIO. Añade ssd=1 para que el invitado reconozca un disco de estado sólido. La compatibilidad con discard/TRIM debe configurarse aparte.", + "De arranque: si eliges sí, ProxMenux añade el disco al orden de arranque como dispositivo principal de la VM." ] }, { @@ -70,10 +70,10 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "noImagesTitle": "\"No compatible disk images found\"", + "noImagesTitle": "\"No se encuentran imágenes de disco compatibles\"", "noImagesBody": "El script escaneó el directorio pero no encontró ningún archivo .img / .qcow2 / .vmdk / .raw. Comprueba la extensión (las mayúsculas importan), que el archivo esté directamente en el directorio seleccionado (no se buscan subdirectorios) y que los permisos permitan a root leerlo.", "slowTitle": "La importación va lenta", - "slowBody": "Las conversiones VMDK → QCOW2 → raw están limitadas por CPU y E/S. La velocidad de importación depende de la velocidad de lectura del origen, la velocidad de escritura del almacenamiento destino y la CPU para descompresión. Prefiere orígenes raw o qcow2 cuando sea posible.", + "slowBody": "Las conversiones entre VMDK, QCOW2 y raw pueden estar limitadas por CPU y E/S. La velocidad depende de la lectura del origen, la escritura del destino y la descompresión necesaria. Prefiere fuentes raw o qcow2 cuando sea posible.", "uefiTitle": "El disco importado arranca en la UEFI shell", "uefiBody": "La imagen se construyó para legacy (SeaBIOS) pero la VM usa OVMF (o al revés). O bien cambia la BIOS de la VM en Proxmox para que coincida con la imagen, o reconstruye la imagen en el modo correcto antes de importar." }, @@ -92,7 +92,7 @@ }, { "href": "/docs/utils/UUp-Dump-ISO-Creator", - "label": "UUP Dump ISO Creator", + "label": "Creador de ISO UUP Dump", "tail": " — genera una ISO de Windows si necesitas una para una instalación nueva." }, { diff --git a/web/messages/es/docs/disk-manager/import-disk-lxc.json b/web/messages/es/docs/disk-manager/import-disk-lxc.json index 0ed87f3e..a68417d0 100644 --- a/web/messages/es/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/es/docs/disk-manager/import-disk-lxc.json @@ -1,14 +1,14 @@ { "meta": { - "title": "Importar disco a LXC | ProxMenux Documentation", + "title": "Importar disco a LXC | Documentación de ProxMenux", "description": "Adjunta un disco físico a un contenedor LXC existente en Proxmox VE usando ProxMenux. Gestiona la detección / formateo del filesystem, el mount point, la conversión unprivileged → privilegiado y rutas de dispositivo persistentes.", - "ogTitle": "Importar disco a LXC | ProxMenux Documentation", + "ogTitle": "Importar disco a LXC | Documentación de ProxMenux", "ogDescription": "Adjunta un disco físico a un contenedor LXC existente. Gestiona el filesystem, el mount point y la conversión unprivileged → privilegiado." }, "header": { "title": "Importar disco a LXC", "description": "Adjunta un disco físico a un contenedor LXC existente en el host Proxmox. ProxMenux detecta los discos libres, opcionalmente los formatea con un filesystem soportado y conecta la partición a un mount point dentro del contenedor usando rutas de dispositivo persistentes.", - "section": "Disk Manager · LXC" + "section": "Administrador de discos · LXC" }, "intro": { "title": "Passthrough en VM vs passthrough en LXC", @@ -27,7 +27,7 @@ "Al menos un disco físico que no esté en uso por el host ni por ningún otro guest." ], "warnTitle": "Se requiere contenedor privilegiado", - "warnBody": "El passthrough directo de dispositivos a un contenedor LXC solo funciona si el contenedor es privilegiado. Si el script detecta unprivileged: 1 en la config, se ofrece a convertirlo in situ (edita /etc/pve/lxc/<CTID>.conf). Cancela si no puedes aceptar el compromiso de seguridad de un contenedor privilegiado." + "warnBody": "Este script requiere un contenedor privilegiado para conectar el disco directamente. Si detecta unprivileged: 1, ofrece editar /etc/pve/lxc/<CTID>.conf in situ. Esto cambia el modelo de seguridad y no reasigna la propiedad de los archivos existentes. Haz una copia del contenedor y comprueba la propiedad antes de aceptar, o recréalo como privilegiado." }, "steps": { "heading": "Paso a paso", @@ -82,10 +82,10 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "unprivTitle": "\"Cannot continue with an unprivileged container\"", - "unprivBody": "Rechazaste la oferta de conversión. O bien vuelves a ejecutar y aceptas la conversión, o conviertes el contenedor manualmente editando /etc/pve/lxc/<CTID>.conf y reemplazando unprivileged: 1 por unprivileged: 0. También puedes reconstruir el contenedor como privilegiado si prefieres no convertirlo in situ.", + "unprivTitle": "\"No puede continuar con un contenedor no privilegiado\"", + "unprivBody": "Rechazaste la conversión. La opción de /etc/pve/lxc/<CTID>.conf cambia de unprivileged: 1 a unprivileged: 0, pero eso por sí solo no convierte los UID/GID de los archivos existentes. Haz una copia y resuelve el mapeo de propietarios antes de aceptar una conversión in situ; como alternativa, restaura o recrea el contenedor como privilegiado.", "permsTitle": "Los permisos dentro del contenedor están mal", - "permsBody": "Los mounts del host hacia un contenedor privilegiado entran como root:root. Si el servicio dentro del CT corre como otro usuario (p. ej. www-data para Nextcloud), haz chown/chmod dentro del contenedor para que coincida con su UID/GID después del primer mount." + "permsBody": "Al montar una partición en un contenedor privilegiado se conserva la propiedad existente; un sistema de archivos recién formateado suele pertenecer a root:root. Si el servicio usa otro usuario, por ejemplo www-data para Nextcloud, comprueba su UID/GID y ajusta los archivos necesarios con chown/chmod. Los cambios afectan también al disco subyacente." }, "related": { "heading": "Relacionado", diff --git a/web/messages/es/docs/disk-manager/import-disk-vm.json b/web/messages/es/docs/disk-manager/import-disk-vm.json index eee37df8..c0082215 100644 --- a/web/messages/es/docs/disk-manager/import-disk-vm.json +++ b/web/messages/es/docs/disk-manager/import-disk-vm.json @@ -1,18 +1,18 @@ { "meta": { - "title": "Importar disco a VM | ProxMenux Documentation", + "title": "Importar disco a una VM | Documentación de ProxMenux", "description": "Adjunta un disco físico a una VM Proxmox existente con ProxMenux. Detección segura de discos (excluye sistema, montados, en uso, ZFS/RAID/LVM), rutas persistentes /dev/disk/by-id e interfaces SATA / SCSI / VirtIO / IDE.", - "ogTitle": "Importar disco a VM | ProxMenux Documentation", + "ogTitle": "Importar disco a una VM | Documentación de ProxMenux", "ogDescription": "Adjunta un disco físico a una VM Proxmox existente. Usa rutas persistentes /dev/disk/by-id y soporta SATA / SCSI / VirtIO / IDE." }, "header": { "title": "Importar disco a VM", "description": "Adjunta un disco físico ya existente en el host Proxmox a una máquina virtual existente. ProxMenux detecta los discos libres, te deja elegir la VM destino y el tipo de bus (SATA / SCSI / VirtIO / IDE), y lo adjunta todo usando rutas persistentes /dev/disk/by-id para que el mapeo sobreviva a reinicios y cambios en el orden de los dispositivos.", - "section": "Disk Manager · VM" + "section": "Administrador de discos · VM" }, "intro": { "title": "Qué hace esto", - "body": "Esto es un passthrough de disco crudo: el SO guest ve la unidad como un block device real (con sus datos SMART y geometría nativa). El disco se adjunta por su ruta /dev/disk/by-id/… — no /dev/sdX — para que la asignación no se rompa si las controladoras de disco enumeran los dispositivos en otro orden en el siguiente arranque." + "body": "Conecta un disco físico como dispositivo subyacente de una interfaz de disco virtual. El invitado no recibe automáticamente los datos SMART nativos ni las funciones de la controladora física; usa passthrough PCI de la controladora si los necesitas. Se conecta mediante /dev/disk/by-id/…, no /dev/sdX, para que un cambio en el orden de enumeración al arrancar no rompa la asignación." }, "howRuns": { "heading": "Cómo se ejecuta el script", @@ -49,7 +49,7 @@ "items": [ "SCSI — opción por defecto moderna para Linux y Windows con drivers VirtIO-SCSI instalados.", "SATA — amplia compatibilidad, funciona por defecto en prácticamente cualquier guest.", - "VirtIO — block device paravirtualizado, el más rápido pero requiere drivers en el guest.", + "VirtIO: dispositivo de bloques paravirtualizado eficiente; requiere controladores en el invitado.", "IDE — para guests legacy que no tienen ninguno de los drivers anteriores." ] }, @@ -63,13 +63,13 @@ "heading": "Equivalente manual", "body": "El script es un wrapper alrededor de qm set. El comando exacto para un solo disco se ve así:", "migrationTitle": "La migración en vivo no es posible", - "migrationBody": "Una VM con un disco en passthrough está atada al host que expone ese disco. La migración en vivo a otro nodo Proxmox fallará porque el nodo destino no ve la misma ruta /dev/disk/by-id/…. Usa replicación o backup/restore en su lugar, o elige discos virtuales en almacenamiento compartido si necesitas movilidad.", + "migrationBody": "Una VM con un disco físico conectado directamente está ligada al host que expone ese disco. Otro nodo normalmente no dispone de la misma ruta /dev/disk/by-id/… ni de sus datos. Copia y transfiere esos datos por separado, o usa discos virtuales gestionados en almacenamiento compartido o con replicación compatible para facilitar la movilidad. No presupongas que la replicación de almacenamiento de Proxmox cubre este dispositivo.", "shareTitle": "No compartas un disco físico entre VMs", "shareBody": "Adjuntar el mismo disco físico a dos VMs a la vez corromperá los datos en la siguiente escritura. ProxMenux detecta esta situación y la bloquea, pero si te saltas el script (un qm set directo), asegúrate de que solo un guest monte el disco." }, "troubleshoot": { "heading": "Solución de problemas", - "noDisksTitle": "\"No disks available for this VM\"", + "noDisksTitle": "\"No hay discos disponibles para este VM\"", "noDisksIntro": "El script encontró discos, pero todos los candidatos se filtraron. Razones comunes:", "noDisksItems": [ "Cada disco restante ya está referenciado en la config de la VM destino.", diff --git a/web/messages/es/docs/disk-manager/index.json b/web/messages/es/docs/disk-manager/index.json index 8d886d15..b32df976 100644 --- a/web/messages/es/docs/disk-manager/index.json +++ b/web/messages/es/docs/disk-manager/index.json @@ -1,20 +1,20 @@ { "meta": { "title": "Disk Manager de Proxmox — adjuntar discos a VMs / LXC, tests SMART, wipe | ProxMenux", - "description": "Gestiona discos físicos en un host Proxmox VE con ProxMenux: pasa discos a VMs o contenedores LXC (qm set scsi/sata/virtio, pct mp), importa imágenes de disco qcow2 / vmdk / vdi, pasa HBAs o controladoras NVMe enteras, borra discos de forma segura y ejecuta self-tests SMART.", + "description": "Gestiona discos físicos en un host Proxmox VE con ProxMenux: conecta discos a VM o contenedores LXC (qm set scsi/sata/virtio, pct mp), importa imágenes img / qcow2 / vmdk / raw, asigna HBA o controladoras NVMe completas, borra discos con controles de seguridad y ejecuta pruebas SMART.", "ogTitle": "Disk Manager de Proxmox — adjuntar discos a VMs / LXC, tests SMART, wipe", "ogDescription": "Adjuntar discos a VMs / LXC, importar imágenes de disco, PCI passthrough para controladoras, wipe seguro y tests SMART en Proxmox VE.", "twitterTitle": "Disk Manager de Proxmox | ProxMenux", "twitterDescription": "Adjuntar discos a VMs / LXC, importar imágenes, PCI passthrough, wipe seguro y tests SMART." }, "header": { - "title": "Disk Manager", + "title": "Administrador de discos", "description": "El menú Disk Manager agrupa las herramientas de ProxMenux para gestionar discos físicos en un host Proxmox: adjuntar discos a VMs y contenedores LXC, importar imágenes de disco, pasar una controladora entera o un dispositivo NVMe, borrar discos de forma segura y ejecutar tests de salud SMART.", - "section": "Disk Manager" + "section": "Administrador de discos" }, "intro": { "title": "Para qué sirve este menú", - "body": "Cada opción aquí opera sobre discos físicos ya visibles para el host Proxmox. El menú está dividido en tres grupos — VM (adjuntar discos o importar imágenes a una máquina virtual), LXC (adjuntar discos a un contenedor) y Utilidades (format seguro, salud SMART). Los chequeos de seguridad se aplican en todas partes: los discos del sistema y los discos ya en uso están ocultos o bloqueados." + "body": "Estas herramientas trabajan con discos físicos visibles para el host Proxmox y archivos de imagen guardados en él. Hay tres grupos: VM (conectar discos o importar imágenes), LXC (conectar discos a un contenedor) y Utilidades (formateo y salud SMART). Las operaciones de conexión y borrado ocultan o bloquean los discos del sistema y en uso; las comprobaciones SMART pueden examinarlos sin borrarlos." }, "opening": { "heading": "Abrir el menú", @@ -32,7 +32,7 @@ "Añadir controladora o NVMe a VM" ], "lxcTitle": "LXC", - "lxcBody": "Herramientas que operan sobre contenedores existentes. El passthrough directo de dispositivos necesita un contenedor privilegiado; el script se ofrece a convertirlo si hace falta.", + "lxcBody": "Herramientas para contenedores LXC existentes. Este script requiere un contenedor privilegiado y ofrece cambiar la opción cuando hace falta. Lee primero las precauciones sobre conversión y propiedad de archivos en la página de la herramienta.", "lxcItems": [ "Importar disco a LXC" ], @@ -69,7 +69,7 @@ }, "lxc": { "heading": "LXC", - "intro": "Herramientas que operan sobre contenedores LXC existentes. El passthrough directo de dispositivos requiere un contenedor privilegiado; el script se ofrece a convertir el contenedor si hace falta.", + "intro": "Herramientas para contenedores LXC existentes. Este script requiere un contenedor privilegiado y ofrece cambiar la opción cuando hace falta. Lee primero las precauciones sobre conversión y propiedad de archivos en la página de la herramienta.", "options": [ { "icon": "Boxes", @@ -98,8 +98,8 @@ ] }, "safety": { - "title": "Reglas de seguridad comunes a todas las opciones", - "intro": "ProxMenux filtra cualquier cosa que pueda dañar el host:", + "title": "Reglas de seguridad para conectar y borrar discos", + "intro": "Las operaciones de conexión y borrado excluyen los dispositivos que podrían dañar el host:", "items": [ "El disco del sistema (root pool, swap, miembros activos de ZFS / LVM / RAID) está siempre oculto.", "Los discos montados en cualquier punto del host se ocultan o se bloquean en ejecución.", @@ -112,7 +112,7 @@ "items": [ { "href": "/docs/storage-share", - "label": "Storage & Share Manager", + "label": "Gestor de almacenamiento y recursos compartidos", "tail": " — registrar almacenamiento en el propio Proxmox (NFS / Samba / iSCSI / local) y compartir carpetas entre host y CTs." }, { diff --git a/web/messages/es/docs/disk-manager/smart-disk-test.json b/web/messages/es/docs/disk-manager/smart-disk-test.json index 66d91725..3ce64749 100644 --- a/web/messages/es/docs/disk-manager/smart-disk-test.json +++ b/web/messages/es/docs/disk-manager/smart-disk-test.json @@ -1,8 +1,8 @@ { "meta": { - "title": "Salud y test SMART de disco | ProxMenux Documentation", + "title": "Salud y pruebas SMART del disco | Documentación de ProxMenux", "description": "Ejecuta chequeos de salud SMART y tests de disco en Proxmox VE con ProxMenux. Soporta SATA / SAS (smartmontools) y NVMe (nvme-cli). Self-tests cortos y largos, exportación JSON para integración con ProxMenux Monitor.", - "ogTitle": "Salud y test SMART de disco | ProxMenux Documentation", + "ogTitle": "Salud y pruebas SMART del disco | Documentación de ProxMenux", "ogDescription": "Chequeos de salud SMART y self-tests para unidades SATA / SAS y NVMe en Proxmox. Exportación JSON para el Monitor." }, "header": { @@ -55,11 +55,11 @@ } ], "tipTitle": "Los tests largos sobreviven al cierre del terminal", - "tipBody": "Un test largo se encola dentro de la unidad — no depende de que el proceso de ProxMenux siga vivo. Puedes cerrar el terminal, reiniciar el host Proxmox (el test continúa donde lo dejó en algunas unidades) o simplemente volver más tarde y usar Comprobar el progreso del test para ver el resultado." + "tipBody": "Un test largo se ejecuta dentro de la unidad y no depende de que siga activo el proceso de ProxMenux. Puedes cerrar el terminal y volver después a Comprobar el progreso del test. Un reinicio del host, de la controladora o una pérdida de alimentación puede interrumpir el test y su recopilador de resultados; no presupongas que se reanudará automáticamente." }, "json": { "heading": "Exportación JSON para el Monitor", - "intro": "Cada ejecución escribe un archivo JSON con marca de tiempo en /usr/local/share/proxmenux/smart/<disk>/. La estructura es:", + "intro": "Las acciones de estado, test corto y progreso guardan un JSON con fecha en /usr/local/share/proxmenux/smart/<disk>/; los resultados del test largo se recopilan en segundo plano. El informe completo solo se muestra. La estructura es:", "outro": "El ProxMenux Monitor los recoge para renderizar tendencias de salud por disco; los archivos viejos se rotan automáticamente cuando se alcanza el límite de retención." }, "steps": { @@ -89,7 +89,7 @@ }, { "title": "Revisa los resultados", - "bodyRich": "El estado y el informe se imprimen en el terminal y se escriben en JSON. Para los tests largos, vuelve más tarde y ejecuta Comprobar el progreso del test en el mismo disco para ver el resultado.", + "bodyRich": "El estado y los informes se muestran en el terminal; el JSON se exporta para las acciones indicadas arriba, no para Informe completo. Para los tests largos, vuelve después a Comprobar el progreso del test en el mismo disco.", "img": "/disk/smart/quick-status.png", "alt": "Salida del estado de salud rápido", "caption": "Salida del estado de salud rápido (SATA — smartctl -H + -A)" @@ -103,10 +103,10 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "noSmartTitle": "\"Could not read SMART data from /dev/sdX\"", + "noSmartTitle": "\"No se pudieron leer los datos SMART de /dev/sdX\"", "noSmartBody": "El disco está probablemente detrás de una controladora RAID / SAS que no pasa SMART. Con tarjetas basadas en megaraid, prueba smartctl -d megaraid,N /dev/sdX. Para HBAs en modo IT la invocación directa funciona.", "longTitle": "El test largo no termina nunca", - "longBody": "El test se encola en el firmware de la unidad y pausa si el disco tiene carga pesada. Ejecutarlo de noche en un sistema en reposo suele funcionar. También puedes revisar smartctl -c para ver el porcentaje restante; si se queda atascado en un LBA fijo, el disco está fallando en ese sector." + "longBody": "La unidad ejecuta el test en su firmware y la carga de E/S puede retrasarlo. Prueba en un periodo de poca actividad, como de noche. En SATA/SAS, smartctl -c muestra el porcentaje restante; revisa el registro de tests para ver el resultado y posibles LBA con fallos. Un error de lectura requiere investigación; la lentitud por sí sola no demuestra un sector defectuoso." }, "related": { "heading": "Relacionado", @@ -124,7 +124,7 @@ { "href": "/docs/help-info/zfs-commands", "label": "Comandos de gestión de ZFS", - "tail": " — zpool scrub como equivalente a los tests SMART a nivel de capa de almacenamiento." + "tail": " — zpool scrub comprueba las sumas de verificación de los datos ZFS y complementa los tests SMART del hardware." }, { "href": "/docs/monitor/dashboard/storage", diff --git a/web/messages/fr/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/fr/docs/disk-manager/add-controller-nvme-vm.json new file mode 100644 index 00000000..c4f048a2 --- /dev/null +++ b/web/messages/fr/docs/disk-manager/add-controller-nvme-vm.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Ajouter un contrôleur ou un NVMe à une VM | Documentation ProxMenux", + "description": "Attribuez un contrôleur de stockage SATA/SAS HBA ou un périphérique NVMe à une VM Proxmox par passthrough PCI avec ProxMenux. L’outil gère l’activation d’IOMMU, la détection des conflits et l’affectation avec qm set --hostpci.", + "ogTitle": "Ajouter un contrôleur ou un NVMe à une VM | Documentation ProxMenux", + "ogDescription": "Attribuez un HBA SATA/SAS complet ou un périphérique NVMe à une VM Proxmox. ProxMenux gère IOMMU, la détection des conflits et l’affectation hostpci." + }, + "header": { + "title": "Ajouter un contrôleur ou un NVMe à une VM", + "description": "Attribuez un adaptateur de bus SATA/SAS (HBA) complet ou un périphérique NVMe à une VM Proxmox par passthrough PCI. ProxMenux vérifie IOMMU et l’active avec votre accord, recense les périphériques compatibles, écarte les conflits et configure l’affectation avec qm set --hostpci.", + "section": "Gestionnaire de disque · VM" + }, + "intro": { + "title": "Ce que cela fait (et ne fait pas)", + "body": "Il s’agit d’un passthrough au niveau du périphérique : la carte PCIe quitte le contrôle du noyau de l’hôte et est liée à vfio-pci. La VM voit le contrôleur lui-même, au lieu de disques transmis individuellement, et charge son propre pilote pour ce modèle précis. Tous les disques qui y sont raccordés suivent automatiquement, avec les données SMART natives, toutes les fonctions du firmware et aucune couche Proxmox intermédiaire." + }, + "howRuns": { + "heading": "Comment fonctionne le script", + "body": "Le flux a deux phases avec une séparation claire entre \"collecter l'information, vérifier IOMMU et lister les candidats\" et \"en fait fixer l'appareil PCI\". Jusqu'à la confirmation finale rien n'est écrit à la config VM." + }, + "iommu": { + "heading": "Les groupes IOMMU — pourquoi la carte entière part à la fois", + "body": "La limite d’isolation du passthrough PCI est le groupe IOMMU, la plus petite unité que l’IOMMU du CPU peut isoler. Les périphériques d’un même groupe ne peuvent pas être isolés les uns des autres. Si un contrôleur SATA partage son groupe avec un contrôleur USB, le passthrough SATA peut exiger de libérer aussi l’USB de l’hôte, ou être impossible. Il n’attribue pas automatiquement tous les périphériques du groupe à la VM.", + "outro": "ProxMenux montre le groupe IOMMU à côté de chaque appareil et vous avertit lorsqu'un groupe porte plus que le contrôleur que vous voulez. Vous pouvez toujours procéder si les périphériques supplémentaires du groupe sont acceptables (tous les contrôleurs de disque, par exemple), ou revenir en arrière s'ils ne le sont pas." + }, + "prereqs": { + "heading": "Préalables", + "items": [ + "Le CPU et la carte mère prennent en charge VT-d (Intel) ou AMD-Vi, et la fonction est activée dans le firmware (BIOS/UEFI). ProxMenux peut activer la partie noyau, mais ne peut pas modifier le réglage du firmware.", + "La VM cible est éteinte avant l’affectation de périphériques PCI.", + "Le contrôleur/NVMe n'est pas celui qui détient le système de fichiers racine Proxmox. Le script cache tout ce qui est utilisé par l'hôte.", + "Le système invité dispose des pilotes du contrôleur. Linux prend en charge presque tous les HBA sans ajout de pilote ; sous Windows, le pilote du fabricant doit être installé avant le démarrage avec le contrôleur affecté." + ], + "warnTitle": "La migration à chaud est impossible", + "warnBody": "Un VM avec PCI passethrough est lié au noeud qui détient physiquement la carte. La migration en direct à travers les nœuds échouera. Planifiez les sauvegardes / réplication en conséquence." + }, + "steps": { + "heading": "Étape par étape", + "stepLabel": "Étape", + "list": [ + { + "title": "Choisir la VM cible", + "bodyRich": "ProxMenux lit qm list et affiche chaque VM. Choisissez celui qui recevra le contrôleur.", + "img": "/disk/nvme-passthrough/vm-selection.png", + "alt": "Boîte de dialogue de sélection VM", + "caption": "Boîte de dialogue de sélection VM" + }, + { + "title": "Vérification IOMMU", + "bodyRich": "Si IOMMU n’est pas activé dans la ligne de commande du noyau, ProxMenux propose de l’activer. Il modifie /etc/kernel/cmdline pour systemd-boot ou /etc/default/grub pour GRUB et ajoute le paramètre adapté au CPU :", + "items": [ + "intel_iommu=on pour les processeurs Intel.", + "amd_iommu=on pour processeurs AMD." + ], + "outro": "Un redémarrage est nécessaire après cette modification. Le script propose de redémarrer maintenant ou plus tard ; le passthrough ne peut continuer que lorsque la nouvelle ligne de commande du noyau est active.", + "img": "/disk/nvme-passthrough/iommu-warning.png", + "alt": "Boîte de dialogue IOMMU requis", + "caption": "IOMMU requis : proposition d’activation et de redémarrage" + }, + { + "title": "Énumération du périphérique", + "body": "ProxMenux liste tous les contrôleurs de stockage (SATA / SAS HBA) et tous les périphériques NVMe du bus PCI. Pour chaque appareil, il affiche :", + "items": [ + "Adresse PCI (00:17.0, 01:00.0, ...).", + "Description du fournisseur / de l'appareil.", + "Groupe IOMMU, avec un avertissement ⚠ s’il est partagé avec d’autres périphériques sans rapport.", + "Les disques actuellement derrière le contrôleur (pour que vous sachiez ce qui va le suivre au VM)." + ], + "img": "/disk/nvme-passthrough/device-list.png", + "alt": "Liste des contrôleurs et périphériques NVMe", + "caption": "Liste des contrôleurs et périphériques NVMe avec les groupes IOMMU" + }, + { + "title": "Détection des conflits", + "bodyRich": "Le script bloque les périphériques manifestement dangereux : ceux déjà attribués à une autre VM via hostpci dans sa configuration, ceux utilisés par l’hôte comme le contrôleur du disque racine, ou ceux d’un groupe IOMMU dont les autres membres ne peuvent pas être identifiés de façon sûre. Les périphériques admissibles sont proposés à la sélection.", + "img": "/disk/nvme-passthrough/conflict-warning.png", + "alt": "Avertissement de détection des conflits", + "caption": "Détection des conflits — dispositif bloqué avec raison" + }, + { + "title": "Affecter et terminer", + "bodyRich": "Pour chaque appareil sélectionné ProxMenux exécute qm set <VMID> --hostpciN <pci-addr>,pcie=1, en choisissant la prochaine fente libre hostpci. Si IOMMU a été activé pendant cette session, on vous rappelle de redémarrer avant de démarrer le VM.", + "img": "/disk/nvme-passthrough/assignment.png", + "alt": "Résumé de l'attribution", + "caption": "Résumé de l’affectation : emplacements hostpciN et adresses PCI attribuées" + } + ] + }, + "manual": { + "heading": "Équivalent manuel" + }, + "troubleshoot": { + "heading": "Dépannage", + "noGroupsTitle": "IOMMU activé, mais aucun groupe dans /sys/kernel/iommu_groups/", + "noGroupsBody": "Redémarrer est nécessaire pour que le noyau cmdline prenne effet. Si les groupes sont encore manquants après le redémarrage, VT-d / AMD-Vi est probablement désactivé dans le firmware — vérifiez la configuration BIOS/UEFI.", + "busyTitle": "La VM ne démarre pas : \"hostpciN: device busy\"", + "busyBody": "Un autre processus utilise encore le périphérique PCI. Les causes courantes sont une VM ayant planté sans le libérer ou le noyau de l’hôte l’ayant repris au dernier démarrage. Exécutez lspci -nnk -s <addr> pour identifier le pilote associé ; il devrait s’agir de vfio-pci. Un redémarrage complet de l’hôte résout généralement le problème.", + "noDisksTitle": "Invité voit le contrôleur mais pas les disques", + "noDisksBody": "Le système invité ne dispose pas du pilote de ce contrôleur. Ce cas est rare sous Linux, mais se présente sous Windows : installez le pilote du fabricant, par exemple LSI/Broadcom pour les anciens HBA SAS, lorsque la carte n’est pas affectée, puis redémarrez avec la carte affectée.", + "sharedTitle": "Le groupe IOMMU contient un périphérique sans rapport", + "sharedBody": "Options : (a) déplacer la carte vers un autre emplacement PCIe pour changer son groupe, (b) activer ACS override dans le noyau pour diviser les groupes (compromis de sécurité : se renseigner avant de l’appliquer), ou (c) choisir une autre carte dans un groupe mieux isolé." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importer le disque vers la VM", + "tail": "— modèle alternatif: attachez un disque physique via Proxmox sans passage PCIe complet." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Ajouter GPU à VM (Passthrough)", + "tail": "— les mêmes concepts IOMMU/VFIO appliqués à un GPU." + }, + { + "href": "/docs/help-info/gpu-commands", + "label": "commandes GPU Passthrough", + "tail": "— Les commandes de vérification IOMMU s'appliquent également au contrôleur / NVMe passant." + }, + { + "href": "/docs/disk-manager", + "label": "Aperçu du gestionnaire de disque", + "tail": "." + } + ] + } +} diff --git a/web/messages/fr/docs/disk-manager/format-disk.json b/web/messages/fr/docs/disk-manager/format-disk.json new file mode 100644 index 00000000..ec530617 --- /dev/null +++ b/web/messages/fr/docs/disk-manager/format-disk.json @@ -0,0 +1,142 @@ +{ + "meta": { + "title": "Formater ou effacer un disque physique | Documentation ProxMenux", + "description": "Effacez et formatez les disques physiques sur Proxmox VE avec ProxMenux. Quatre modes, des filtres stricts excluant les disques système, montés ou utilisés, et une double confirmation avec saisie du chemin complet.", + "ogTitle": "Formater ou effacer un disque physique | Documentation ProxMenux", + "ogDescription": "Effacez ou formatez un disque physique sur Proxmox. Filtres de sécurité, quatre modes et double confirmation." + }, + "header": { + "title": "Formater ou effacer un disque physique", + "description": "Effacez ou formatez un disque physique sur l’hôte Proxmox. ProxMenux ne montre que les disques entièrement libres : aucun usage par le système, aucune référence dans les invités et aucun montage. Il impose une double confirmation, oui/non puis saisie du chemin complet du disque, avant toute destruction de données.", + "section": "Gestionnaire de disques · Utilitaires" + }, + "danger": { + "title": "Outil destructif", + "body": "Chaque opération ici écrit sur le disque. Il n'y a pas d'annulation. ProxMenux applique des filtres de sécurité stricts et des confirmations, mais la responsabilité de choisir le bon disque est à vous. Lisez le chemin du disque deux fois avant de le taper." + }, + "howRuns": { + "heading": "Comment fonctionne le script", + "body": "Le processus comporte deux phases séparées par un filtre de sécurité à trois contrôles. La première recueille le choix du disque, le mode et les détails du système de fichiers. Aucune écriture n’a lieu avant la validation finale de la seconde phase, juste avant l’exécution." + }, + "visibility": { + "heading": "Règles de visibilité", + "intro": "Avant même que le menu apparaisse, ProxMenux filtre la liste des disques. Seuls les candidats qui sont en sécurité sont présentés :", + "items": [ + "Affichés : les disques non utilisés par l’hôte (pool racine, swap, montages, ZFS/LVM/RAID actifs) et non référencés dans une configuration VM/LXC, que l’invité soit démarré ou arrêté.", + "Masqués : disques de l’hôte et du système.", + "Masqués : disques référencés dans une configuration VM/LXC." + ], + "safetyTitle": "Sécurité lors de la confirmation et de l'exécution", + "safetyItems": [ + "Les disques contenant des métadonnées anciennes ou actives déclenchent des avertissements détaillés avant la confirmation.", + "Les disques utilisés par une VM en cours d’exécution sont strictement bloqués à la confirmation.", + "Les disques comportant des partitions montées sont strictement bloqués à l’exécution. Une nouvelle validation a lieu juste avant toute écriture.", + "Deux confirmations sont toujours nécessaires : un dialogue oui/non et la saisie exacte du chemin complet du disque." + ] + }, + "modes": { + "heading": "Modes de fonctionnement", + "intro": "Après avoir choisi un disque, vous choisissez l'un des quatre modes. Ils diffèrent dans ce qu'ils détruisent et ce qu'ils laissent derrière eux:", + "headerMode": "Mode", + "headerPart": "Table de partitions", + "headerData": "Données", + "headerUseCase": "Cas d'utilisation", + "rows": [ + { + "mode": "1. Tout effacer", + "part": "Détruite", + "data": "Signatures effacées", + "useCase": "Supprimer le partitionnement et les métadonnées pour préparer une nouvelle organisation. Cela n’écrase pas toutes les données utilisateur." + }, + { + "mode": "2. Supprimer les étiquettes FS", + "part": "Préservé", + "data": "Préservé", + "useCase": "Supprime les anciennes signatures ZFS / LVM / RAID pour empêcher la prise en charge automatique du disque. Les données utilisateur ne sont pas écrasées en bloc, mais la suppression des signatures peut les rendre inaccessibles." + }, + { + "mode": "3. Écraser les données avec des zéros", + "part": "Préservé", + "data": "Détruites (écrasées par des zéros)", + "useCase": "Écraser les partitions existantes avec des zéros en conservant la table de partitions. Les espaces non alloués et les zones de réserve des SSD ne sont pas couverts ; cela ne garantit pas un assainissement complet du périphérique." + }, + { + "mode": "4. Format complet", + "part": "Nouvelle GPT", + "data": "Détruite", + "useCase": "Disque prêt à utiliser avec une seule nouvelle partition et un nouveau système de fichiers." + } + ], + "fullFormatOutro": "Format complet continue avec deux dialogues supplémentaires:", + "fullFormatItems": [ + "Système de fichiers : ext4, xfs, exfat (portable) ou btrfs. Si un outil manque, par exemple mkfs.btrfs, l’opération s’arrête avec un message explicite.", + "Étiquette : nom facultatif du système de fichiers pour l’identifier." + ] + }, + "steps": { + "heading": "Étape par étape", + "stepLabel": "Étape", + "list": [ + { + "title": "Choisir un disque libre", + "body": "ProxMenux liste les disques qui passent les filtres ci-dessus. Ceux marqués ⚠ contiennent d’anciennes métadonnées dont les détails sont affichés pour vous indiquer ce que vous allez écraser." + }, + { + "title": "Choisir un mode d'opération", + "bodyRich": "Choisissez Tout effacer, Supprimer les étiquettes FS, Écraser les données avec des zéros ou Format complet selon le tableau ci-dessus." + }, + { + "title": "(Format complet seulement) Choisir le système de fichiers et l'étiquette", + "body": "ext4 / xfs / exfat / btrfs, plus une étiquette en option." + }, + { + "title": "Confirmer deux fois", + "bodyRich": "ProxMenux présente un résumé de ce qui va se passer. Vous acceptez avec une boîte de dialogue oui/non et tapez le chemin complet du disque exactement comme indiqué (par exemple /dev/sdc). Tout le reste avorte." + }, + { + "title": "Revalidation et exécution", + "body": "Juste avant d'écrire, le script revérifie l'état du disque. Si une partition a été montée ou un VM a commencé dans l'intervalle, l'exécution est interrompue. Sinon, l'opération choisie tourne et un résumé est imprimé à la fin." + } + ] + }, + "manual": { + "heading": "Équivalents manuels", + "body": "Si vous préférez exécuter les commandes équivalentes à la main :" + }, + "troubleshoot": { + "notListedTitle": "Disque non listé dans le menu", + "notListedBody": "Il a été filtré pour la sécurité. Raisons courantes : il est monté (même à /mnt/tmp), il est un membre actif ZFS / LVM / RAID, il est référencé par une config VM ou LXC, ou c'est votre disque racine Proxmox. Exécutez lsblk -f et cat /proc/mdstat sur l'hôte pour comprendre pourquoi.", + "busyTitle": "\"Disk may be busy\" / échec du démontage", + "busyBody": "Quelque chose tient toujours un fichier ouvert sur une partition de ce disque — le plus souvent un conteneur ou un shell dont cwd est à l'intérieur d'un point de montage. Identifiez-le avec lsof | grep /dev/sdX ou fuser -vm /dev/sdX1, arrêtez-le, puis lancez l'outil." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "href": "/docs/disk-manager/smart-disk-test", + "label": "Santé et test du disque SMART", + "tail": "— vérifier un disque avant / après l'essuyage pour confirmer qu'il est sain." + }, + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importer le disque vers la VM", + "tail": "— passer un disque fraîchement formaté à un VM." + }, + { + "href": "/docs/storage-share/host-local-disk", + "label": "Ajouter le disque local comme stockage Proxmox", + "tail": " — enregistrer un disque essuyé comme stockage Proxmox pool." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Commandes de stockage et de disques", + "tail": " — référence de lsblk, blkid et parted." + }, + { + "href": "/docs/disk-manager", + "label": "Aperçu du gestionnaire de disque", + "tail": "." + } + ] + } +} diff --git a/web/messages/fr/docs/disk-manager/import-disk-image-vm.json b/web/messages/fr/docs/disk-manager/import-disk-image-vm.json new file mode 100644 index 00000000..769f0b5f --- /dev/null +++ b/web/messages/fr/docs/disk-manager/import-disk-image-vm.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Importer une image disque dans une VM | Documentation ProxMenux", + "description": "Importez un fichier image disque (.img / .qcow2 / .vmdk / .raw) dans une VM Proxmox existante avec ProxMenux. Interface, émulation SSD et option de démarrage par image, avec qm importdisk en arrière-plan.", + "ogTitle": "Importer une image disque dans une VM | Documentation ProxMenux", + "ogDescription": "Importer des images disque .img / .qcow2 / .vmdk / .raw dans un VM existant avec ProxMenux. Utilise qm importdisk sous le capot." + }, + "header": { + "title": "Importer l'image disque vers la VM", + "description": "Importer un fichier image disque (.img, .qcow2, .vmdk ou .raw) dans un Proxmox VM existant. ProxMenux recueille toutes les décisions dès le départ — cible VM, stockage Proxmox, répertoire source, interface, émulation SSD, ordre de démarrage — et exécute ensuite qm importdisk pour chaque image sélectionnée.", + "section": "Gestionnaire de disque · VM" + }, + "intro": { + "title": "Ce que ça fait", + "body": "Contrairement à Importer le disque vers la VM, qui affecte un disque physique brut, ce processus utilise un fichier sur l’hôte, exporté d’un autre hyperviseur, téléchargé comme image cloud ou extrait d’une sauvegarde. Il le convertit en disque de VM Proxmox sur le stockage choisi. L’original est conservé : ProxMenux le copie sans le déplacer." + }, + "howRuns": { + "heading": "Comment fonctionne le script", + "body": "Le flux a deux phases. La phase 1 recueille toutes les décisions (VM, stockage, répertoire source, images, options par image) directement via des dialogues. La phase 2 exécute qm importdisk pour chaque image sélectionnée. Jusqu'à ce que la phase 2 commence, rien n'est copié et la configuration VM n'est pas touchée." + }, + "prereqs": { + "heading": "Préalables", + "items": [ + "Au moins une VM est définie sur l’hôte. La VM cible doit être éteinte.", + "Au moins un fichier image d'un format pris en charge dans le répertoire source. Prise en charge: .img, .qcow2, .vmdk, .raw.", + "Assez d'espace libre sur le stockage Proxmox cible pour tenir chaque disque importé.", + "ProxMenux recherche des images dans /var/lib/vz/template/iso par défaut. Vous pouvez le pointer vers n'importe quel autre répertoire de l'hôte quand il le demande." + ] + }, + "steps": { + "heading": "Étape par étape", + "stepLabel": "Étape", + "list": [ + { + "title": "Choisir la VM cible", + "bodyRich": "ProxMenux lit qm list et affiche chaque VM. Choisissez celui qui recevra le ou les disques importés." + }, + { + "title": "Choisir le stockage Proxmox", + "bodyRich": "La liste contient chaque stockage qui a le type de contenu images activé. S'il n'y a qu'un seul candidat, il est sélectionné automatiquement et le dialogue est ignoré." + }, + { + "title": "Choisir le répertoire source", + "bodyRich": "Choisissez le répertoire par défaut (/var/lib/vz/template/iso) ou saisissez un autre chemin, généralement celui où vous avez téléchargé ou envoyé l’image. Le script refuse les chemins inexistants." + }, + { + "title": "Choisissez une ou plusieurs images", + "bodyRich": "Le répertoire est scanné pour les fichiers .img / .qcow2 / .vmdk / .raw. Vous pouvez en sélectionner plusieurs à la fois; chacun d'eux passera par les options par image dans la prochaine étape." + }, + { + "title": "Options par image", + "intro": "Pour chaque image sélectionnée ProxMenux demande:", + "items": [ + "Interface — scsi (par défaut), virtio, sata ou ide. Correspond à la façon dont l'invité verra le disque.", + "Émulation SSD : proposée uniquement pour les interfaces autres que VirtIO. Ajoute ssd=1 pour que l’invité reconnaisse un disque SSD. La prise en charge de discard/TRIM doit être configurée séparément.", + "Amorçable : si vous répondez oui, ProxMenux place le disque en tête de l’ordre de démarrage de la VM." + ] + }, + { + "title": "Importer et connecter", + "bodyRich": "ProxMenux exécute qm importdisk pour chaque image, en convertissant le format si nécessaire. Il connecte le disque au prochain emplacement libre (scsiN, sataN, …) avec les options choisies et met à jour l’ordre de démarrage si un disque a été marqué comme amorçable. La progression s’affiche dans le terminal." + } + ] + }, + "manual": { + "heading": "Équivalent manuel", + "body": "L’importation d’une seule image correspond à trois commandes qm :", + "warnTitle": "Conversion du format d'image", + "warnBody": "Lorsque le stockage cible ne peut pas contenir le format source nativement (par exemple, le stockage LVM ne peut pas contenir .qcow2), qm importdisk convertit l'image de manière transparente. Cela peut prendre plusieurs minutes pour les images multi-GB; planifier en conséquence et ne pas interrompre le script." + }, + "troubleshoot": { + "heading": "Dépannage", + "noImagesTitle": "\"Aucune image disque compatible trouvée\"", + "noImagesBody": "Le script n’a trouvé aucun fichier .img, .qcow2, .vmdk ou .raw. Vérifiez la casse de l’extension, la présence du fichier directement dans le répertoire choisi (les sous-répertoires ne sont pas parcourus) et les droits de lecture de root.", + "slowTitle": "L'importation est lente", + "slowBody": "Les conversions entre VMDK, QCOW2 et raw peuvent être limitées par le CPU et les entrées-sorties. La vitesse dépend des lectures à la source, des écritures à destination et de la décompression éventuelle. Préférez des sources raw ou qcow2 si possible.", + "uefiTitle": "Le disque importé démarre dans le shell UEFI", + "uefiBody": "L’image a été créée pour le mode hérité (SeaBIOS), mais la VM utilise OVMF, ou inversement. Changez le BIOS de la VM dans Proxmox pour correspondre à l’image, ou recréez l’image dans le bon mode avant l’importation." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importer le disque vers la VM", + "tail": "— même flux mais pour les disques physiques bruts (passthrough)." + }, + { + "href": "/docs/utils/import-vm", + "label": "Importer VM de OVA / OVF", + "tail": "— lorsque vous avez un paquet complet VM, pas seulement une image de disque." + }, + { + "href": "/docs/utils/UUp-Dump-ISO-Creator", + "label": "Créateur d’ISO UUP Dump", + "tail": "— générer une ISO Windows si vous en avez besoin pour une nouvelle installation." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Commandes de stockage et de disques", + "tail": " — référence de qm importdisk et qemu-img convert." + }, + { + "href": "/docs/disk-manager", + "label": "Aperçu du gestionnaire de disque", + "tail": "." + } + ] + } +} diff --git a/web/messages/fr/docs/disk-manager/import-disk-lxc.json b/web/messages/fr/docs/disk-manager/import-disk-lxc.json new file mode 100644 index 00000000..a7be475b --- /dev/null +++ b/web/messages/fr/docs/disk-manager/import-disk-lxc.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Importer le disque vers LXC | ProxMenux Documentation", + "description": "Joindre un disque physique à un conteneur LXC existant sur Proxmox VE en utilisant ProxMenux. Gestion de la détection de système de fichiers / formatage, point de montage, non privilégié → conversion privilégiée et chemins de périphériques persistants.", + "ogTitle": "Importer le disque vers LXC | ProxMenux Documentation", + "ogDescription": "Connectez un disque physique à un conteneur LXC existant. Gestion du système de fichiers, du point de montage et de la conversion de non privilégié à privilégié." + }, + "header": { + "title": "Importer un disque vers LXC", + "description": "Connectez un disque physique à un conteneur LXC existant sur l’hôte Proxmox. ProxMenux détecte les disques libres, propose de les formater avec un système de fichiers pris en charge, puis relie la partition à un point de montage dans le conteneur à l’aide de chemins de périphériques persistants.", + "section": "Gestionnaire de disque · LXC" + }, + "intro": { + "title": "Passthrough VM vs Passthrough LXC", + "body": "Ce passthrough LXC ne fournit pas un périphérique bloc brut. Le conteneur reçoit un point de montage, c’est-à-dire un répertoire reposant sur une partition choisie sur l’hôte. Contrairement à une VM, il utilise le noyau de l’hôte ; le système de fichiers (ext4/xfs/btrfs) est donc lu et géré par l’hôte Proxmox puis exposé au conteneur." + }, + "howRuns": { + "heading": "Comment fonctionne le script", + "body": "Le processus comporte deux phases distinctes : collecte des informations et des choix, puis modification effective de la configuration du conteneur. Rien n’est monté dans le CT avant la confirmation finale.", + "summary": "ProxMenux exclut le disque racine, les disques montés et ceux référencés dans une configuration VM/LXC. Les membres actifs de ZFS/LVM/RAID sont masqués ; les anciennes signatures portent un symbole ⚠ pour pouvoir les effacer avant le formatage." + }, + "prereqs": { + "heading": "Préalables", + "items": [ + "Au moins un conteneur LXC défini sur l'hôte.", + "Le conteneur est privilégié, ou vous acceptez la conversion proposée par le script.", + "Au moins un disque physique non utilisé par l'hôte ou tout autre invité." + ], + "warnTitle": "Conteneur privilégié requis", + "warnBody": "Ce script exige un conteneur privilégié pour connecter directement le disque. S’il détecte unprivileged: 1, il propose de modifier /etc/pve/lxc/<CTID>.conf sur place. Cela change le modèle de sécurité sans remapper les propriétaires des fichiers existants. Sauvegardez le conteneur et vérifiez les propriétaires avant d’accepter, ou recréez-le en mode privilégié." + }, + "steps": { + "heading": "Étape par étape", + "stepLabel": "Étape", + "list": [ + { + "title": "Choisir le conteneur cible", + "img": "/disk/select-container.png", + "caption": "Menu de sélection des conteneurs", + "bodyRich": "ProxMenux liste tous les conteneurs LXC de l’hôte (pct list). Choisissez celui qui recevra le disque. S’il est non privilégié, le script propose de le convertir maintenant." + }, + { + "title": "Choisir le disque physique", + "img": "/disk/disk-selection-ct.png", + "caption": "Disques libres détectés sur l’hôte, avec ⚠ pour les anciennes métadonnées", + "bodyRich": "Seuls les candidats sûrs sont affichés. Contrairement au processus pour VM, ce script connecte un disque par exécution. Relancez-le pour chaque disque supplémentaire." + }, + { + "title": "Formater ou réutiliser", + "intro": "Le script inspecte le disque :", + "items": [ + "S'il porte déjà un système de fichiers supporté (ext4 / xfs / btrfs), vous pouvez le réutiliser tel quel (les fichiers existants sont conservés).", + "S'il n'a pas de système de fichiers pris en charge, vous êtes offert pour le formater. Choisir ext4 / xfs / btrfs." + ] + }, + { + "title": "Choisir le point de montage", + "bodyRich": "Tapez le chemin où le conteneur doit voir le disque, par exemple. /mnt/data ou /mnt/disk_passthrough. C'est le chemin dans le conteneur ; l'hôte voit déjà la partition sous /dev/disk/by-id/…." + }, + { + "title": "Connecter et vérifier", + "img": "/disk/assignment-ct.png", + "caption": "Attribution à CT", + "bodyRich": "ProxMenux ajoute une nouvelle entrée mpN: à la configuration du conteneur, saute les index déjà utilisés et relise la configuration pour la confirmer. Si le conteneur est en cours d'exécution, le montage est en direct; sinon, il prend effet au prochain départ.", + "extraImg": "/disk/result-point.png", + "extraAlt": "Point de montage créé avec succès", + "extraCaption": "Point de montage créé et vérifié" + } + ] + }, + "manual": { + "heading": "Équivalent manuel", + "body": "Le script enveloppe pct set. Une invocation directe pour un seul disque ressemble à :" + }, + "important": { + "heading": "Considérations importantes", + "items": [ + "Un disque par exécution. Relancez le script pour chaque disque supplémentaire.", + "Ne connectez pas la même partition à plusieurs conteneurs susceptibles de la monter simultanément : les écritures concurrentes corrompent le système de fichiers.", + "Les anciennes métadonnées (signature RAID / ZFS / LVM) doivent être effacées manuellement avant que le script ne vous laisse formater, sinon mkfs refuse d'écraser. Utilisez l'outil Format / Wipe Physical Disk pour cela." + ] + }, + "troubleshoot": { + "heading": "Dépannage", + "unprivTitle": "\"Ne peut pas continuer avec un conteneur non privilégié\"", + "unprivBody": "Vous avez refusé la conversion. Le paramètre de /etc/pve/lxc/<CTID>.conf passe de unprivileged: 1 à unprivileged: 0, mais cela ne convertit pas à lui seul les UID/GID des fichiers existants. Sauvegardez et traitez le mappage des propriétaires avant une conversion sur place ; sinon, restaurez ou recréez le conteneur en mode privilégié.", + "permsTitle": "Les autorisations à l'intérieur du conteneur sont erronées", + "permsBody": "Le montage dans un conteneur privilégié conserve les propriétaires des fichiers existants ; un système de fichiers neuf appartient souvent à root:root. Si le service utilise un autre compte, par exemple www-data pour Nextcloud, vérifiez son UID/GID et ajustez les fichiers nécessaires avec chown/chmod. Ces changements affectent aussi le disque sous-jacent." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importer le disque vers la VM", + "tail": " — processus équivalent pour les VM." + }, + { + "href": "/docs/storage-share/lxc-mount-points", + "label": "Points de montage LXC (hôte ↔ CT)", + "tail": "— partager les répertoires hôtes avec un CT au lieu de fixer un disque entier." + }, + { + "href": "/docs/help-info/vm-ct-commands", + "label": "Commandes de gestion VM et CT", + "tail": "— pct config / push / pull reference." + }, + { + "href": "/docs/disk-manager", + "label": "Aperçu du gestionnaire de disque", + "tail": "." + } + ] + } +} diff --git a/web/messages/fr/docs/disk-manager/import-disk-vm.json b/web/messages/fr/docs/disk-manager/import-disk-vm.json new file mode 100644 index 00000000..c01301c8 --- /dev/null +++ b/web/messages/fr/docs/disk-manager/import-disk-vm.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Importer le disque vers VM | ProxMenux Documentation", + "description": "Connectez un disque physique à une VM Proxmox existante avec ProxMenux. Détection excluant les disques système, montés, utilisés ou membres actifs ZFS/RAID/LVM, chemins persistants /dev/disk/by-id et interfaces SATA / SCSI / VirtIO / IDE.", + "ogTitle": "Importer le disque vers VM | ProxMenux Documentation", + "ogDescription": "Joindre un disque physique à un Proxmox VM existant. Utilise des chemins de /dev/disk/by-id persistants et prend en charge SATA / SCSI / VirtIO / IDE." + }, + "header": { + "title": "Importer le disque vers la VM", + "description": "Joindre un disque physique qui existe déjà sur l'hôte Proxmox à une machine virtuelle existante. ProxMenux détecte les disques libres, vous permet de choisir la cible VM, le type de bus (SATA / SCSI / VirtIO / IDE) et fixe tout en utilisant des chemins de /dev/disk/by-id persistants afin que la cartographie survive aux reboots et aux changements d'ordre des appareils.", + "section": "Gestionnaire de disque · VM" + }, + "intro": { + "title": "Ce que ça fait", + "body": "Cette méthode utilise un disque physique brut comme support d’une interface de disque virtuel. L’invité ne reçoit pas automatiquement les données SMART natives ni les fonctions du contrôleur physique ; utilisez le passthrough PCI du contrôleur si elles sont nécessaires. Le disque est connecté via /dev/disk/by-id/… et non /dev/sdX, pour préserver l’affectation si l’ordre des périphériques change au démarrage." + }, + "howRuns": { + "heading": "Comment fonctionne le script", + "body": "Le processus comporte deux phases distinctes : collecte des informations et des choix, puis connexion des disques à la VM. La configuration reste inchangée jusqu’à la confirmation finale.", + "summary": "ProxMenux exclut les candidats non sûrs : disque racine, disques montés sur l’hôte, membres actifs ZFS/LVM/RAID et disques référencés dans une configuration VM/LXC. Ceux comportant d’anciennes métadonnées ZFS/RAID/LVM inutilisées sont marqués ⚠, sans être bloqués." + }, + "prereqs": { + "heading": "Préalables", + "items": [ + "Au moins un VM défini sur l'hôte (le script envoie directement à qm list).", + "La VM cible est éteinte. Si elle fonctionne, le script s’arrête avec un message ; l’ajout à chaud de disques n’est pas pris en charge par ce processus.", + "Au moins un disque physique sur l'hôte qui n'est pas utilisé par l'hôte ou tout autre invité." + ] + }, + "steps": { + "heading": "Étape par étape", + "stepLabel": "Étape", + "list": [ + { + "title": "Choisir la VM cible", + "bodyRich": "ProxMenux liste toutes les VM de l’hôte avec qm list. Choisissez celle qui recevra le disque. Si elle fonctionne, le script s’arrête et demande de l’éteindre d’abord." + }, + { + "title": "Choisissez le ou les disques physiques à attacher", + "img": "/disk/disk-selection.png", + "caption": "Disques libres détectés sur l’hôte, avec ⚠ pour les anciennes métadonnées", + "body": "Le script examine les disques de l’hôte et ne propose que ceux pouvant être connectés sans conflit. La liste permet d’en sélectionner plusieurs. Les disques avec d’anciennes signatures ZFS/LVM/RAID restent affichés avec ⚠ pour indiquer qu’il faut effacer ces signatures avant leur formatage par l’invité." + }, + { + "title": "Choisissez l'interface du bus", + "img": "/disk/disk-assigment.png", + "caption": "Sélection de l'interface de bus", + "intro": "Choisissez comment l'invité devrait voir le disque:", + "items": [ + "SCSI — par défaut moderne pour Linux et Windows avec les pilotes VirtIO-SCSI installés.", + "SATA — large compatibilité, fonctionne hors de la boîte sur presque tous les invités.", + "VirtIO : périphérique bloc paravirtualisé efficace ; nécessite des pilotes dans l’invité.", + "IDE — pour les anciens clients qui n'ont aucun des pilotes ci-dessus." + ] + }, + { + "title": "Connecter et vérifier", + "bodyRich": "ProxMenux attache chaque disque sélectionné avec son meilleur chemin /dev/disk/by-id/, saute les index des fentes qui sont déjà utilisés dans la config VM (scsi0, sata0, ...) et relis la config pour confirmer l'assignation. Un résumé est imprimé à la fin." + } + ] + }, + "manual": { + "heading": "Équivalent manuel", + "body": "Le script est un wrapper autour de qm set. La commande exacte pour un seul disque ressemble à ceci :", + "migrationTitle": "La migration à chaud est impossible", + "migrationBody": "Une VM avec un disque physique connecté directement est liée à l’hôte qui expose ce disque. Un autre nœud ne dispose généralement ni du même chemin /dev/disk/by-id/… ni des données. Sauvegardez et transférez ces données séparément, ou utilisez des disques virtuels gérés sur stockage partagé ou avec réplication prise en charge. Ne supposez pas que la réplication Proxmox couvre ce périphérique.", + "shareTitle": "Ne partagez pas de disque physique entre VMs", + "shareBody": "La fixation du même disque physique à deux VMs en même temps corrompra les données sur l'écriture suivante. ProxMenux détecte cette situation et la bloque, mais si vous contournez le script (direct qm set), assurez-vous qu'un seul invité monte le disque." + }, + "troubleshoot": { + "heading": "Dépannage", + "noDisksTitle": "\"Aucun disque disponible pour ce VM\"", + "noDisksIntro": "Le script a trouvé des disques, mais chaque candidat a été filtré. Raisons communes:", + "noDisksItems": [ + "Chaque disque restant est déjà référencé dans la configuration de la cible VM.", + "Chaque disque restant est monté sur l'hôte ou fait partie d'un ZFS / LVM / RAID actif.", + "L'hôte a seulement le disque racine installé." + ], + "noDisksOutro": "Exécutez lsblk -f sur l'hôte pour examiner l'état de chaque disque.", + "noVisibleTitle": "VM ne voit pas le disque après le démarrage", + "noVisibleBody": "Si vous avez choisi SCSI ou VirtIO, l'invité a besoin du pilote correspondant. Sur Linux qui est natif du noyau; sur Windows vous avez besoin de l'ISO VirtIO et d'un pilote d'installation (voir la page Créer VM: Système Windows). Le passage à SATA dans l'onglet matériel du VM est une solution rapide pour confirmer que le disque est physiquement attaché." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "href": "/docs/disk-manager/import-disk-image-vm", + "label": "Importer l'image disque vers la VM", + "tail": " — même processus pour les fichiers image (qcow2 / vmdk / raw / img)." + }, + { + "href": "/docs/disk-manager/import-disk-lxc", + "label": "Importer un disque vers LXC", + "tail": " — processus équivalent pour les conteneurs LXC." + }, + { + "href": "/docs/disk-manager/add-controller-nvme-vm", + "label": "Ajouter un contrôleur ou un NVMe à une VM", + "tail": "— lorsque vous avez besoin d'un PCIe complet / NVMe passthrough plutôt que le disque attaché." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Commandes de stockage et de disques", + "tail": " — référence de qm importdisk et des commandes shell associées." + }, + { + "href": "/docs/disk-manager", + "label": "Aperçu du gestionnaire de disque", + "tail": "." + } + ] + } +} diff --git a/web/messages/fr/docs/disk-manager/index.json b/web/messages/fr/docs/disk-manager/index.json new file mode 100644 index 00000000..a8ca828c --- /dev/null +++ b/web/messages/fr/docs/disk-manager/index.json @@ -0,0 +1,135 @@ +{ + "meta": { + "title": "Gestionnaire de disques Proxmox : VM/LXC, tests SMART et effacement | ProxMenux", + "description": "Gérez les disques physiques d’un hôte Proxmox VE avec ProxMenux : connexion aux VM ou LXC (qm set scsi/sata/virtio, pct mp), import d’images img / qcow2 / vmdk / raw, passthrough de HBA ou contrôleurs NVMe complets, effacement avec contrôles de sécurité et autotests SMART.", + "ogTitle": "Gestionnaire de disques Proxmox : VM/LXC, tests SMART et effacement", + "ogDescription": "Connecter des disques aux VM/LXC, importer des images, utiliser le passthrough PCI des contrôleurs, effacer avec contrôles de sécurité et lancer des tests SMART sur Proxmox VE.", + "twitterTitle": "Gestionnaire de disques Proxmox | ProxMenux", + "twitterDescription": "Connexion de disques aux VM/LXC, import d’images, passthrough PCI, effacement avec contrôles de sécurité et tests SMART." + }, + "header": { + "title": "Gestionnaire de disque", + "description": "Le menu Gestionnaire de disques regroupe les outils ProxMenux pour les disques physiques de l’hôte : connexion aux VM et LXC, import d’images, passthrough d’un contrôleur complet ou d’un périphérique NVMe, effacement avec contrôles de sécurité et tests SMART.", + "section": "Gestionnaire de disque" + }, + "intro": { + "title": "Ce menu sert à", + "body": "Ces outils utilisent les disques physiques visibles par l’hôte Proxmox et les fichiers image qui y sont stockés. Le menu comporte trois groupes : VM (connexion de disques ou import d’images), LXC (connexion à un conteneur) et Utilitaires (formatage et état SMART). Les opérations de connexion et d’effacement masquent ou bloquent les disques système et utilisés ; SMART peut les examiner sans les effacer." + }, + "opening": { + "heading": "Ouverture du menu", + "body": "Dans le menu principal de ProxMenux, sélectionnez Disk Manager. Vous verrez ceci :", + "imageAlt": "Menu Gestionnaire de disque avec blocs VM, LXC et Utilitaires" + }, + "groups": { + "heading": "Trois groupes d'outils", + "intro": "Le menu est organisé en trois groupes : VM, LXC et Utilitaires. Cliquez sur une carte pour accéder directement aux outils du groupe.", + "vmTitle": "VM", + "vmBody": "Outils qui fonctionnent sur des machines virtuelles existantes. Le VM doit être éteint; ProxMenux le valide avant de toucher la configuration.", + "vmItems": [ + "Importer le disque vers la VM", + "Importer l'image disque vers la VM", + "Ajouter un contrôleur ou un NVMe à une VM" + ], + "lxcTitle": "LXC", + "lxcBody": "Outils pour conteneurs LXC existants. Ce script exige un conteneur privilégié et propose de changer le paramètre si nécessaire. Lisez d’abord les précautions sur la conversion et les propriétaires des fichiers sur la page de l’outil.", + "lxcItems": [ + "Importer un disque vers LXC" + ], + "utilitiesTitle": "Utilitaires", + "utilitiesBody": "Outils côté hôte qui fonctionnent sur les disques eux-mêmes, indépendamment de tout VM ou conteneur.", + "utilitiesItems": [ + "Formater ou effacer un disque physique", + "Santé et test du disque SMART" + ] + }, + "vm": { + "heading": "VM", + "intro": "Outils qui fonctionnent sur des machines virtuelles existantes. Le VM doit être éteint; ProxMenux le valide avant de toucher la configuration.", + "options": [ + { + "icon": "HardDrive", + "href": "/docs/disk-manager/import-disk-vm", + "title": "Importer le disque vers la VM", + "description": "Joindre un disque physique non assigné à un VM existant. Prend en charge SATA / SCSI / VirtIO / IDE, utilise des chemins de /dev/disk/by-id persistants." + }, + { + "icon": "FileDown", + "href": "/docs/disk-manager/import-disk-image-vm", + "title": "Importer l'image disque vers la VM", + "description": "Importez des images disque (.img / .qcow2 / .vmdk / .raw) dans une VM existante. Processus en deux phases utilisant qm importdisk." + }, + { + "icon": "Cpu", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "title": "Ajouter un contrôleur ou un NVMe à une VM", + "description": "Passthrough PCI d’un HBA SATA/SAS complet ou d’un périphérique NVMe à une VM. Gestion de l’activation d’IOMMU et de la détection des conflits." + } + ] + }, + "lxc": { + "heading": "LXC", + "intro": "Outils pour conteneurs LXC existants. Ce script exige un conteneur privilégié et propose de changer le paramètre si nécessaire. Lisez d’abord les précautions sur la conversion et les propriétaires des fichiers sur la page de l’outil.", + "options": [ + { + "icon": "Boxes", + "href": "/docs/disk-manager/import-disk-lxc", + "title": "Importer un disque vers LXC", + "description": "Joindre un disque physique non assigné à un conteneur LXC existant comme point de montage. Gérer la détection de système de fichiers / format et la conversion privilégiée." + } + ] + }, + "utilities": { + "heading": "Utilitaires", + "intro": "Outils côté hôte qui fonctionnent sur les disques eux-mêmes, indépendamment de tout VM ou conteneur.", + "options": [ + { + "icon": "Eraser", + "href": "/docs/disk-manager/format-disk", + "title": "Formater/effacer le disque physique (sûr)", + "description": "Effacement de disques avec des contrôles stricts : seuls les disques entièrement libres sont affichés et une double confirmation est toujours requise." + }, + { + "icon": "Activity", + "href": "/docs/disk-manager/smart-disk-test", + "title": "Santé et test du disque SMART", + "description": "Exécutez des contrôles de santé SMART et des auto-tests courts/longs sur les disques SATA, SAS et NVMe. Exporte JSON pour le moniteur." + } + ] + }, + "safety": { + "title": "Règles de sécurité pour la connexion et l’effacement des disques", + "intro": "Les opérations de connexion et d’effacement excluent les périphériques susceptibles de nuire à l’hôte :", + "items": [ + "Le disque système et les membres actifs du pool racine, du swap et de ZFS/LVM/RAID sont toujours masqués.", + "Les disques montés n'importe où sur l'hôte sont cachés ou bloqués lors de l'exécution.", + "Les disques référencés par un VM ou LXC en cours d'exécution ne peuvent pas être réaffectés ou effacés.", + "Les opérations qui peuvent modifier l'état hôte (activer IOMMU, effacer) nécessitent une confirmation explicite." + ] + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "href": "/docs/storage-share", + "label": "Gestionnaire de stockage et de partage", + "tail": "— enregistrer le stockage dans Proxmox lui-même (NFS / Samba / iSCSI / local) et partager les dossiers entre hôte et CT." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Commandes de stockage et de disques", + "tail": " — référence des périphériques bloc, LVM, pvesm et SMART." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Commandes de gestion ZFS", + "tail": "— pour les pools et ensembles de données ZFS." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Ajouter GPU à VM (Passthrough)", + "tail": "— les mêmes concepts IOMMU/VFIO appliqués aux GPU." + } + ] + } +} diff --git a/web/messages/fr/docs/disk-manager/smart-disk-test.json b/web/messages/fr/docs/disk-manager/smart-disk-test.json new file mode 100644 index 00000000..f39fe0c7 --- /dev/null +++ b/web/messages/fr/docs/disk-manager/smart-disk-test.json @@ -0,0 +1,146 @@ +{ + "meta": { + "title": "État et tests SMART des disques | Documentation ProxMenux", + "description": "Effectuez des contrôles SMART et des tests de disques sur Proxmox VE avec ProxMenux. Prise en charge de SATA/SAS avec smartmontools et de NVMe avec nvme-cli, autotests courts et longs et export JSON pour ProxMenux Monitor.", + "ogTitle": "État et tests SMART des disques | Documentation ProxMenux", + "ogDescription": "SMART contrôles de santé et auto-tests pour les disques SATA / SAS et NVMe sur Proxmox. Exportation de JSON pour le moniteur." + }, + "header": { + "title": "Santé et test du disque SMART", + "description": "Lisez les données SMART et lancez des autotests sur les disques physiques de l’hôte Proxmox. ProxMenux installe automatiquement smartmontools pour SATA/SAS et nvme-cli pour NVMe, lance les tests dans le firmware du disque (les tests longs continuent après la fermeture du terminal) et exporte les résultats JSON pour ProxMenux Monitor.", + "section": "Gestionnaire de disques · Utilitaires" + }, + "intro": { + "title": "C'est pour quoi ?", + "body": "SMART (Autosurveillance, analyse et technologie de rapport) permet au lecteur lui-même de signaler sa santé et de faire des auto-tests. Cet outil expose ces données sans que vous ayez besoin de vous souvenir de la bonne invocation smartctl / nvme et persiste la sortie en tant que JSON afin que le moniteur puisse grapher les tendances au fil du temps." + }, + "howRuns": { + "heading": "Comment fonctionne le script", + "body": "Toutes les actions ici sont non destructives — SMART lit les compteurs de firmware de disque, et les auto-tests sont en attente dans le lecteur lui-même. Aucune séparation de phase n'est nécessaire. Le flux est: vérification de dépendance → sélection de disque → sélection d'action → invocation d'outil (smartctl ou nvme-cli selon le bus disque) → sortie imprimée plus l'exportation de JSON pour le moniteur." + }, + "deps": { + "heading": "Dépendances", + "body": "L'outil installe automatiquement ce dont il a besoin à la première fois. Les lecteurs SATA / SAS dépendent de smartmontools; les lecteurs NVMe dépendent de nvme-cli. Les deux :" + }, + "actions": { + "heading": "Actions disponibles", + "headerAction": "Action", + "headerWhat": "Ce qu'il lit / exécute", + "headerDur": "Durée", + "rows": [ + { + "action": "État de santé rapide", + "whatRich": "État global PASSED/FAILED et attributs clés.
smartctl -H + -A (SATA/SAS) ou nvme smart-log (NVMe).", + "dur": "Instantané" + }, + { + "action": "Rapport complet", + "whatRich": "Données complètes SMART, scrollable. smartctl -x pour SATA/SAS ou nvme smart-log + id-ctrl pour NVMe.", + "dur": "Instantané" + }, + { + "action": "Essai court", + "what": "Contrôle élémentaire de la surface et des circuits, lancé dans le firmware du disque.", + "dur": "~2 minutes" + }, + { + "action": "Essai long", + "what": "Analyse complète de la surface. Elle s’exécute sur le disque et continue même si vous fermez le terminal.", + "dur": "Heures (selon la taille du disque)" + }, + { + "action": "Vérifier la progression du test", + "what": "Statut de l'auto-essai actif ou le plus récent.", + "dur": "Instantané" + } + ], + "tipTitle": "Les longs essais survivent à la fermeture du terminal", + "tipBody": "Un test long s’exécute dans le disque sans dépendre du maintien du processus ProxMenux. Vous pouvez fermer le terminal et revenir à Vérifier la progression du test. Un redémarrage de l’hôte, une réinitialisation du contrôleur ou une coupure de courant peut interrompre le test et la collecte des résultats ; ne présumez pas d’une reprise automatique." + }, + "json": { + "heading": "Exportation de JSON pour le moniteur", + "intro": "Les actions d’état, de test court et de progression écrivent un JSON horodaté dans /usr/local/share/proxmenux/smart/<disk>/ ; les résultats des tests longs sont collectés en arrière-plan. Le rapport complet est uniquement affiché. Structure :", + "outro": "ProxMenux Monitor utilise ces fichiers pour afficher l’évolution de l’état de chaque disque. Les anciens fichiers sont supprimés automatiquement lorsque la limite de conservation est atteinte." + }, + "steps": { + "heading": "Étape par étape", + "stepLabel": "Étape", + "list": [ + { + "title": "Choisir un disque", + "body": "ProxMenux répertorie chaque disque physique de l'hôte avec son modèle et sa taille. Contrairement à l'outil Format, cette liste n'est pas filtrée par sécurité — lire SMART est une opération non destructive.", + "img": "/disk/smart/disk-selection.png", + "alt": "Menu de sélection de disque SMART", + "caption": "Menu de sélection de disque SMART" + }, + { + "title": "Choisir une action", + "body": "Choisissez entre état de santé rapide, rapport complet, test court, test long ou vérifier les progrès. Le menu reste ouvert après chaque action afin que vous puissiez enchaîner plusieurs requêtes contre le même disque.", + "img": "/disk/smart/action-menu.png", + "alt": "Menu d'action SMART", + "caption": "Menu d'action SMART (actions 5 + annulation)" + }, + { + "title": "(Test long seulement) Confirmer l'exécution de fond", + "body": "ProxMenux indique que le test continuera après la fermeture du terminal et montre où sera enregistré le résultat JSON. Confirmez pour lancer le test.", + "img": "/disk/smart/long-test-warning.png", + "alt": "Boîte de dialogue de confirmation de test longue", + "caption": "Confirmation de test longue — fonctionne en arrière-plan, résultat enregistré en JSON" + }, + { + "title": "Examen des résultats", + "bodyRich": "L’état et les rapports s’affichent dans le terminal ; le JSON est exporté pour les actions décrites plus haut, sauf Rapport complet. Pour les tests longs, revenez à Vérifier la progression du test sur le même disque.", + "img": "/disk/smart/quick-status.png", + "alt": "État de santé rapide", + "caption": "État de santé rapide (SATA — smartctl -H + -A)" + } + ] + }, + "manual": { + "heading": "Équivalents manuels", + "nvmeWarnTitle": "Les autotests NVMe dépendent du firmware du disque", + "nvmeWarnBody": "Chaque lecteur NVMe ne supporte pas la commande d'auto-test courte/long. Si un lecteur refuse le test, le journal SMART et les données du contrôleur ID (nvme smart-log + id-ctrl) sont toujours le signal de santé le plus fiable." + }, + "troubleshoot": { + "heading": "Dépannage", + "noSmartTitle": "\"Ne pouvait pas lire les données SMART de /dev/sdX\"", + "noSmartBody": "Le disque est probablement derrière un contrôleur RAID / SAS qui ne passe pas SMART à travers. Avec des cartes à base de megaraid, essayez smartctl -d megaraid,N /dev/sdX. Pour les HBA en mode IT, l'invocation directe fonctionne.", + "longTitle": "Un long test ne se termine jamais", + "longBody": "Le disque exécute le test dans son firmware et une forte activité peut le retarder. Essayez pendant une période calme, par exemple la nuit. Pour SATA/SAS, smartctl -c indique le pourcentage restant ; le journal des autotests contient l’état final et les éventuels LBA en erreur. Une erreur de lecture doit être examinée ; la lenteur seule ne prouve pas un secteur défectueux." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "href": "/docs/disk-manager/format-disk", + "label": "Formater ou effacer un disque physique", + "tail": "— réutiliser un disque après avoir confirmé sa santé." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Commandes de stockage et de disques → État SMART", + "tail": "— référence smartctl / nvme." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Commandes de gestion ZFS", + "tail": " — zpool scrub vérifie les sommes de contrôle des données ZFS et complète les tests matériels SMART." + }, + { + "href": "/docs/monitor/dashboard/storage", + "label": "ProxMenux Monitor — onglet de stockage", + "tail": " — vue détaillée du disque utilisant le JSON exporté ici : table SMART complète, historique et rapport PDF." + }, + { + "href": "/docs/monitor/dashboard/hardware", + "label": "ProxMenux Monitor — Onglet matériel", + "tail": "— Sommaire de stockage avec modèle, capacité et vitesse de liaison négociée (courant vs maximum sur NVMe)." + }, + { + "href": "/docs/disk-manager", + "label": "Aperçu du gestionnaire de disque", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/it/docs/disk-manager/add-controller-nvme-vm.json new file mode 100644 index 00000000..3af536f0 --- /dev/null +++ b/web/messages/it/docs/disk-manager/add-controller-nvme-vm.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Aggiungi controller o NVMe a VM | Documentazione ProxMenux", + "description": "Passthrough PCI di un controller di archiviazione (HBA SATA/SAS) o di un dispositivo NVMe a una VM Proxmox con ProxMenux. Gestisce l’attivazione di IOMMU, il rilevamento dei conflitti e l’assegnazione con qm set --hostpci.", + "ogTitle": "Aggiungi controller o NVMe a VM | Documentazione ProxMenux", + "ogDescription": "Assegna un intero HBA SATA/SAS o un dispositivo NVMe a una VM Proxmox. ProxMenux gestisce IOMMU, il rilevamento dei conflitti e l’assegnazione hostpci." + }, + "header": { + "title": "Aggiungi controller o NVMe a VM", + "description": "Assegna un intero adattatore bus host SATA/SAS (HBA) o un dispositivo NVMe a una VM Proxmox tramite passthrough PCI. ProxMenux verifica IOMMU e, con il tuo consenso, lo abilita, elenca i dispositivi idonei, esclude i conflitti e configura l’assegnazione con qm set --hostpci.", + "section": "Gestione del disco · VM" + }, + "intro": { + "title": "Ciò che fa (e non fa)", + "body": "Si tratta di passthrough a livello di dispositivo: la scheda PCIe esce dal controllo del kernel dell’host e viene associata a vfio-pci. La VM vede il controller stesso, anziché singoli dischi passati separatamente, e carica il proprio driver per quel modello. Tutti i dischi collegati lo seguono automaticamente, con dati SMART nativi, tutte le funzioni del firmware e nessuno strato Proxmox intermedio." + }, + "howRuns": { + "heading": "Come funziona lo script", + "body": "Il flusso ha due fasi distinte: raccolta delle informazioni, verifica di IOMMU ed elenco dei candidati; poi assegnazione effettiva del dispositivo PCI. Fino alla conferma finale non viene scritto nulla nella configurazione della VM." + }, + "iommu": { + "heading": "Gruppi IOMMU: perché occorre considerare l’intera scheda", + "body": "Il confine di isolamento del passthrough PCI è il gruppo IOMMU, la più piccola unità isolabile dall’IOMMU della CPU. I dispositivi nello stesso gruppo non possono essere isolati tra loro. Se un controller SATA condivide il gruppo con un controller USB, il passthrough SATA può richiedere di liberare anche l’USB dall’host oppure risultare impossibile. Non assegna automaticamente alla VM tutti i dispositivi del gruppo.", + "outro": "ProxMenux mostra il gruppo IOMMU accanto a ogni dispositivo e avvisa se il gruppo comprende altri dispositivi oltre al controller desiderato. Puoi procedere se gli altri dispositivi sono accettabili, ad esempio se sono tutti controller disco, oppure annullare." + }, + "prereqs": { + "heading": "Prerequisiti", + "items": [ + "CPU e scheda madre supportano VT-d (Intel) o AMD-Vi, e la funzione è abilitata nel firmware (BIOS/UEFI). ProxMenux può abilitare la parte kernel, ma non modificare l’impostazione del firmware.", + "La VM di destinazione è spenta prima di collegare dispositivi PCI.", + "Il controller/NVMe non ospita il filesystem root di Proxmox. Lo script nasconde tutto ciò che è in uso dall’host.", + "Il sistema operativo guest dispone dei driver per il modello del controller. Linux supporta quasi tutti gli HBA senza driver aggiuntivi; Windows richiede il driver del produttore installato prima di avviare con il controller collegato." + ], + "warnTitle": "La migrazione dal vivo non è possibile", + "warnBody": "Un VM con passante PCI è legato al nodo che tiene fisicamente la scheda. La migrazione dal vivo attraverso i nodi fallirà. Pianifica backup / replica di conseguenza." + }, + "steps": { + "heading": "Passo dopo passo", + "stepLabel": "Passaggio", + "list": [ + { + "title": "Scegli la VM di destinazione", + "bodyRich": "ProxMenux legge qm list e mostra tutte le VM. Scegli quella che riceverà il controller.", + "img": "/disk/nvme-passthrough/vm-selection.png", + "alt": "dialogo di selezione VM", + "caption": "dialogo di selezione VM" + }, + { + "title": "Controllo IOMMU", + "bodyRich": "Se IOMMU non è abilitato sul kernel cmdline, ProxMenux offre per abilitarlo. Modifica /etc/kernel/cmdline (per systemd-boot) o /etc/default/grub (per GRUB) e aggiunge il parametro corretto per il tuo CPU:", + "items": [ + "intel_iommu=on per CPU Intel.", + "amd_iommu=on per CPU AMD." + ], + "outro": "Un riavvio è richiesto dopo questo cambiamento. Lo script richiede di riavviare ora o più tardi; il passthrough non può continuare fino a quando il nuovo kernel cmdline è attivo.", + "img": "/disk/nvme-passthrough/iommu-warning.png", + "alt": "Finestra IOMMU richiesto", + "caption": "IOMMU richiesto — offerta per abilitare e riavviare" + }, + { + "title": "Enumerazione del dispositivo", + "body": "ProxMenux elenca ogni controller di archiviazione (SATA / SAS HBA) e ogni dispositivo NVMe sul bus PCI. Per ogni dispositivo mostra:", + "items": [ + "Indirizzo PCI (00:17.0, 01:00.0, ...).", + "Descrizione del produttore e del dispositivo.", + "gruppo IOMMU — e un avviso ⚠ se il gruppo è condiviso con altri dispositivi non correlati.", + "I dischi attualmente dietro il controller (quindi sai cosa lo seguirà al VM)." + ], + "img": "/disk/nvme-passthrough/device-list.png", + "alt": "Elenco dei controller e dei dispositivi NVMe", + "caption": "Elenco dei controller e dei dispositivi NVMe con informazioni sui gruppi IOMMU" + }, + { + "title": "Rilevamento dei conflitti", + "bodyRich": "Lo script blocca i dispositivi chiaramente non sicuri: quelli già assegnati a un’altra VM tramite hostpci nella relativa configurazione, quelli in uso dall’host come il controller del disco root e quelli in un gruppo IOMMU i cui altri membri non possono essere identificati con sicurezza. I dispositivi idonei sono disponibili per la selezione.", + "img": "/disk/nvme-passthrough/conflict-warning.png", + "alt": "Avvertenza di rilevamento conflitti", + "caption": "Rilevamento di conflitti — dispositivo bloccato con ragione" + }, + { + "title": "Assegna e concludi", + "bodyRich": "Per ogni dispositivo selezionato ProxMenux esegue qm set <VMID> --hostpciN <pci-addr>,pcie=1, scegliendo il successivo slot hostpci libero. Se IOMMU è stato abilitato durante questa sessione, viene ricordato di riavviare l’host prima di avviare la VM.", + "img": "/disk/nvme-passthrough/assignment.png", + "alt": "Riepilogo delle assegnazioni", + "caption": "Riepilogo delle assegnazioni — slot hostpciN e indirizzi PCI allegati" + } + ] + }, + "manual": { + "heading": "Equivalente manuale" + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "noGroupsTitle": "IOMMU abilitato ma nessun gruppo sotto /sys/kernel/iommu_groups/", + "noGroupsBody": "È necessario riavviare perché la nuova riga di comando del kernel abbia effetto. Se i gruppi mancano ancora dopo il riavvio, VT-d/AMD-Vi è probabilmente disabilitato nel firmware: controlla le impostazioni BIOS/UEFI.", + "busyTitle": "La VM non si avvia: \"hostpciN: device busy\"", + "busyBody": "Un altro processo mantiene occupato il dispositivo PCI. Le cause più comuni sono una VM arrestatasi in modo anomalo senza liberarlo o il kernel dell’host che lo ha ripreso all’ultimo avvio. Esegui lspci -nnk -s <addr> per vedere il driver associato: dovrebbe essere vfio-pci. Un riavvio completo dell’host solitamente risolve il problema.", + "noDisksTitle": "Guest vede il controller ma non i dischi", + "noDisksBody": "Nel guest manca il driver per il modello del controller. Su Linux succede raramente, su Windows sì: installa il driver del produttore, ad esempio LSI/Broadcom per i vecchi HBA SAS, mentre la scheda non è assegnata, poi riavvia con la scheda assegnata.", + "sharedTitle": "Il gruppo IOMMU include un dispositivo non correlato", + "sharedBody": "Opzioni: (a) spostare la scheda in una diversa slot PCIe per cambiare il suo gruppo, (b) abilitare ACS override nel kernel per dividere i gruppi (sicurezza trade-off - ricerca prima di applicare), o (c) scegliere una scheda diversa in un gruppo più pulito." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importa disco nella VM", + "tail": "— modello alternativo: collegare un disco fisico tramite Proxmox senza passante PCIe completo." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Aggiungi GPU a VM (Passthrough)", + "tail": "— stessi concetti IOMMU / VFIO applicati a un GPU." + }, + { + "href": "/docs/help-info/gpu-commands", + "label": "Comandi di passaggio GPU", + "tail": "— I comandi di verifica IOMMU si applicano anche al controller / passthrough NVMe." + }, + { + "href": "/docs/disk-manager", + "label": "Panoramica di Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/disk-manager/format-disk.json b/web/messages/it/docs/disk-manager/format-disk.json new file mode 100644 index 00000000..8a33ecb2 --- /dev/null +++ b/web/messages/it/docs/disk-manager/format-disk.json @@ -0,0 +1,142 @@ +{ + "meta": { + "title": "Formatta o cancella un disco fisico | Documentazione ProxMenux", + "description": "Cancella e formatta dischi fisici su Proxmox VE con ProxMenux. Quattro modalità, filtri rigorosi che escludono i dischi di sistema, montati o in uso e doppia conferma con inserimento del percorso completo.", + "ogTitle": "Formatta o cancella un disco fisico | Documentazione ProxMenux", + "ogDescription": "Pulire in modo sicuro o formattare un disco fisico su Proxmox. Regole di visibilità sicure, modalità di funzionamento 4, doppia conferma." + }, + "header": { + "title": "Formatta o cancella un disco fisico", + "description": "Cancella in modo sicuro o formatta un disco fisico sull’host Proxmox. ProxMenux mostra solo i dischi completamente liberi: nessun uso da parte del sistema, nessun riferimento nei guest e nessun filesystem montato. Prima di distruggere i dati richiede una doppia conferma: sì/no e inserimento del percorso completo del disco.", + "section": "Disk Manager · Utilità" + }, + "danger": { + "title": "Strumento distruttivo", + "body": "Ogni operazione scrive sul disco e non può essere annullata. ProxMenux applica filtri e conferme rigorosi, ma la responsabilità di scegliere il disco corretto è tua. Leggi il percorso del disco ad alta voce due volte prima di digitarlo." + }, + "howRuns": { + "heading": "Come funziona lo script", + "body": "Il flusso ha due fasi con un filtro di sicurezza a tripla porta in mezzo. L'elenco dei dischi, la modalità di funzionamento e i dettagli del file system sono tutti raccolti in Fase 1; nulla è scritto fino a quando la Fase 2 passa una ri-validazione finale prima di eseguire." + }, + "visibility": { + "heading": "Regole di visibilità", + "intro": "Prima che il menu venga visualizzato, ProxMenux filtra l'elenco dei dischi. Solo i candidati che sono provabilmente sicuri sono mostrati:", + "items": [ + "Mostrati: dischi non usati dall’host (pool root, swap, filesystem montati, ZFS/LVM/RAID attivi) e non citati in configurazioni VM/LXC, sia avviate sia arrestate.", + "Nascosti: dischi dell’host e di sistema.", + "Nascosti: dischi citati in una configurazione VM/LXC." + ], + "safetyTitle": "Sicurezza alla conferma e all'esecuzione", + "safetyItems": [ + "I dischi con metadati obsoleti o attivi mostrano avvisi dettagliati prima della conferma.", + "I dischi usati da una VM in esecuzione sono bloccati senza possibilità di procedere alla conferma.", + "I dischi con partizioni montate sono bloccati senza possibilità di procedere all’esecuzione. Una nuova verifica avviene subito prima di qualsiasi scrittura.", + "Sono sempre necessarie due conferme: una finestra sì/no e l’inserimento esatto del percorso completo del disco." + ] + }, + "modes": { + "heading": "Modalità di funzionamento", + "intro": "Dopo aver scelto un disco si sceglie una delle quattro modalità. Essi differiscono in quello che distruggono e ciò che lasciano dietro:", + "headerMode": "Modalità", + "headerPart": "Tabella delle partizioni", + "headerData": "Dati", + "headerUseCase": "Caso di utilizzo", + "rows": [ + { + "mode": "1. Pulisci tutto", + "part": "Distrutto", + "data": "Firme cancellate", + "useCase": "Rimuove partizionamento e metadati per preparare una nuova struttura. Non sovrascrive tutti i dati utente." + }, + { + "mode": "2. Rimuovere le etichette FS", + "part": "Conservato", + "data": "Conservato", + "useCase": "Rimuove le vecchie firme ZFS / LVM / RAID per evitare l’acquisizione automatica del disco. I dati utente non vengono sovrascritti in massa, ma la rimozione delle firme può renderli inaccessibili." + }, + { + "mode": "3. Sovrascrivi i dati con zeri", + "part": "Conservato", + "data": "Distrutti (sovrascritti con zeri)", + "useCase": "Sovrascrive con zeri le partizioni esistenti conservando la tabella delle partizioni. Non comprende lo spazio non allocato e le aree di riserva degli SSD; non garantisce una sanificazione completa del dispositivo." + }, + { + "mode": "4. Formattazione completa", + "part": "Nuovo GPT", + "data": "Distrutto", + "useCase": "Disco pronto all'uso con una singola nuova partizione e un filesystem fresco." + } + ], + "fullFormatOutro": "Formattazione completa prosegue con altre due finestre:", + "fullFormatItems": [ + "Filesystem: ext4, xfs, exfat (portabile) o btrfs. Se mancano strumenti come mkfs.btrfs, l’operazione si interrompe con un messaggio chiaro.", + "Etichetta: etichetta facoltativa del filesystem per identificarlo." + ] + }, + "steps": { + "heading": "Passo dopo passo", + "stepLabel": "Passaggio", + "list": [ + { + "title": "Scegli un disco libero", + "body": "ProxMenux elenca ogni disco che passa i filtri di visibilità sopra. I dischi con marcatori ⚠ portano metadati stanti e vengono mostrati con i dettagli in modo da sapere cosa stai per sovrascrivere." + }, + { + "title": "Scegli una modalità di funzionamento", + "bodyRich": "Scegli Pulisci tutto, Rimuovere le etichette FS, Sovrascrivi i dati con zeri o Formattazione completa secondo la tabella sopra." + }, + { + "title": "(Solo formattazione completa) Scegli filesystem ed etichetta", + "body": "ext4 / xfs / exfat / btrfs, più un'etichetta opzionale." + }, + { + "title": "Confermare due volte", + "bodyRich": "ProxMenux mostra un riassunto di ciò che accadrà. Si accetta con una finestra di dialogo sì/no e digitare il percorso completo del disco esattamente come mostrato (ad esempio /dev/sdc). Tutto il resto si interrompe." + }, + { + "title": "Nuova verifica ed esecuzione", + "body": "Subito prima di scrivere, lo script ricontrolla lo stato del disco. Se nel frattempo è stata montata una partizione o avviata una VM, l’esecuzione viene annullata. Altrimenti viene eseguita l’operazione scelta e mostrato un riepilogo finale." + } + ] + }, + "manual": { + "heading": "Equivalenti manuali", + "body": "Se si preferisce eseguire i comandi equivalenti a mano:" + }, + "troubleshoot": { + "notListedTitle": "Disco non elencato nel menu", + "notListedBody": "È stato filtrato per la sicurezza. Motivi comuni: è montato (anche a /mnt/tmp), è un membro attivo ZFS / LVM / RAID, è riferito da una configurazione VM o LXC, o è il disco radice Proxmox. Eseguire lsblk -f e cat /proc/mdstat sull'host per capire perché.", + "busyTitle": "\"Disk may be busy\" / smontaggio non riuscito", + "busyBody": "Un processo mantiene aperto un file in una partizione del disco, spesso un contenitore o una shell la cui directory corrente si trova nel punto di mount. Identificalo con lsof | grep /dev/sdX o fuser -vm /dev/sdX1, arrestalo e riesegui lo strumento." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "href": "/docs/disk-manager/smart-disk-test", + "label": "Integrità e test disco SMART", + "tail": "— controllare un disco prima / dopo aver pulito per confermare che è sano." + }, + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importa disco nella VM", + "tail": "— passare un disco appena formattato a un VM." + }, + { + "href": "/docs/storage-share/host-local-disk", + "label": "Aggiungere disco locale come archiviazione Proxmox", + "tail": "— registrare un disco cancellato come un pool di archiviazione Proxmox." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandi di archiviazione e dischi", + "tail": " — riferimento per lsblk, blkid e parted." + }, + { + "href": "/docs/disk-manager", + "label": "Panoramica di Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/disk-manager/import-disk-image-vm.json b/web/messages/it/docs/disk-manager/import-disk-image-vm.json new file mode 100644 index 00000000..bd8c3cc0 --- /dev/null +++ b/web/messages/it/docs/disk-manager/import-disk-image-vm.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Importa immagine del disco a VM | Documentazione ProxMenux", + "description": "Importa un file immagine disco (.img / .qcow2 / .vmdk / .raw) in una VM Proxmox esistente con ProxMenux. Interfaccia, emulazione SSD e opzione di avvio per ogni immagine, tramite qm importdisk.", + "ogTitle": "Importa immagine del disco a VM | Documentazione ProxMenux", + "ogDescription": "Importare .img / .qcow2 / .vmdk / .raw immagini disco in un VM esistente con ProxMenux. Utilizza qm importdisk sotto il cofano." + }, + "header": { + "title": "Importa immagine disco nella VM", + "description": "Importa un file immagine disco (.img, .qcow2, .vmdk o .raw) in una VM Proxmox esistente. ProxMenux raccoglie prima tutte le scelte: VM di destinazione, storage Proxmox, directory sorgente, interfaccia, emulazione SSD e ordine di avvio. Poi esegue qm importdisk per ogni immagine selezionata.", + "section": "Gestione del disco · VM" + }, + "intro": { + "title": "Che cosa fa", + "body": "A differenza di Importa disco nella VM, che collega un disco fisico direttamente, questa procedura usa un file sull’host, esportato da un altro hypervisor, scaricato come immagine cloud o estratto da un backup. Lo converte in un disco di VM Proxmox sullo storage scelto. Il file originale viene conservato: ProxMenux lo copia senza spostarlo." + }, + "howRuns": { + "heading": "Come funziona lo script", + "body": "Il flusso ha due fasi. La prima raccoglie tutte le scelte tramite finestre di dialogo: VM, storage, directory sorgente, immagini e opzioni per ciascuna immagine. La seconda esegue qm importdisk per ogni immagine selezionata. Prima della seconda fase non viene copiato nulla né modificata la configurazione della VM." + }, + "prereqs": { + "heading": "Prerequisiti", + "items": [ + "Almeno una VM è definita sull’host. La VM di destinazione dovrebbe essere spenta.", + "Almeno un file di immagine di un formato supportato nella directory sorgente. Supportato: .img, .qcow2, .vmdk, .raw.", + "Abbastanza spazio libero sullo storage Proxmox di destinazione per tenere ogni disco importato.", + "ProxMenux cerca le immagini in /var/lib/vz/template/iso per impostazione predefinita. È possibile indicarlo a qualsiasi altra directory sull'host quando chiede." + ] + }, + "steps": { + "heading": "Passo dopo passo", + "stepLabel": "Passaggio", + "list": [ + { + "title": "Scegli la VM di destinazione", + "bodyRich": "ProxMenux legge qm list e mostra tutte le VM. Scegli quella che riceverà i dischi importati." + }, + { + "title": "Scegli lo storage Proxmox", + "bodyRich": "L'elenco contiene ogni archiviazione che ha il tipo di contenuto images abilitato. Se c'è solo un candidato è selezionato automaticamente e la finestra di dialogo è saltata." + }, + { + "title": "Scegli la directory sorgente", + "bodyRich": "Scegliere la directory predefinita (/var/lib/vz/template/iso) o digitare un percorso personalizzato — in genere dove hai scaricato / caricato l'immagine. Lo script rifiuta i percorsi che non esistono." + }, + { + "title": "Scegli una o più immagini", + "bodyRich": "La directory viene scansionata per i file .img / .qcow2 / .vmdk / .raw. È possibile selezionare diversi in una sola volta; ognuno passerà attraverso le opzioni per-immagine nella fase successiva." + }, + { + "title": "Opzioni per immagine", + "intro": "Per ogni immagine selezionata ProxMenux chiede:", + "items": [ + "Interface — scsi (default), virtio, sata o ide. Corrisponde a come l'ospite vedrà il disco.", + "Emulazione SSD: disponibile solo per interfacce diverse da VirtIO. Aggiunge ssd=1 affinché il guest riconosca un disco a stato solido. Il supporto discard/TRIM va configurato separatamente.", + "Avviabile: scegliendo sì, ProxMenux aggiunge il disco all’ordine di avvio come dispositivo principale della VM." + ] + }, + { + "title": "Importa e collega", + "bodyRich": "ProxMenux esegue qm importdisk per ogni immagine, convertendo il formato se necessario, e collega il disco al successivo slot libero (scsiN, sataN, …) con le opzioni scelte. Se hai segnato un disco come avviabile, aggiorna l’ordine di avvio. L’avanzamento compare nel terminale." + } + ] + }, + "manual": { + "heading": "Equivalente manuale", + "body": "L’importazione di una singola immagine corrisponde a tre comandi qm:", + "warnTitle": "Conversione formato immagine", + "warnBody": "Quando lo storage di destinazione non può contenere il formato sorgente in modo nativo (ad esempio, lo storage LVM non può contenere .qcow2), qm importdisk converte l'immagine in modo trasparente. Questo può richiedere diversi minuti per immagini multi-GB; pianificare di conseguenza e non interrompere lo script." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "noImagesTitle": "\"Non sono state trovate immagini disco compatibili\"", + "noImagesBody": "Lo script non ha trovato file .img, .qcow2, .vmdk o .raw. Controlla l’estensione, distinguendo maiuscole e minuscole, che il file sia direttamente nella directory scelta (le sottodirectory non vengono cercate) e che root possa leggerlo.", + "slowTitle": "L'importazione è lenta", + "slowBody": "Le conversioni tra VMDK, QCOW2 e raw possono essere limitate da CPU e I/O. La velocità dipende dalle letture all’origine, dalle scritture a destinazione e dall’eventuale decompressione. Preferisci sorgenti raw o qcow2 quando possibile.", + "uefiTitle": "Il disco importato si avvia nella shell UEFI", + "uefiBody": "L'immagine è stata costruita per legacy (SeaBIOS) ma il VM utilizza OVMF (o viceversa). O commutare il VM di BIOS in Proxmox per abbinare l'immagine, o ricostruire l'immagine nella modalità corretta prima dell'importazione." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importa disco nella VM", + "tail": "— stesso flusso ma per dischi fisici grezzi (passthrough)." + }, + { + "href": "/docs/utils/import-vm", + "label": "Importa VM da OVA / OVF", + "tail": "— quando hai un pacchetto completo VM, non solo un'immagine del disco." + }, + { + "href": "/docs/utils/UUp-Dump-ISO-Creator", + "label": "Creatore di ISO UUP Dump", + "tail": "— generare una ISO di Windows se ne avete bisogno per una nuova installazione." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandi di archiviazione e dischi", + "tail": " — riferimento per qm importdisk e qemu-img convert." + }, + { + "href": "/docs/disk-manager", + "label": "Panoramica di Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/disk-manager/import-disk-lxc.json b/web/messages/it/docs/disk-manager/import-disk-lxc.json new file mode 100644 index 00000000..301cb14d --- /dev/null +++ b/web/messages/it/docs/disk-manager/import-disk-lxc.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Importa disco in LXC | Documentazione ProxMenux", + "description": "Collega un disco fisico a un contenitore LXC esistente su Proxmox VE con ProxMenux. Gestisce rilevamento e formattazione del filesystem, punto di mount, conversione da non privilegiato a privilegiato e percorsi persistenti dei dispositivi.", + "ogTitle": "Importa disco in LXC | Documentazione ProxMenux", + "ogDescription": "Collega un disco fisico a un contenitore LXC esistente. Gestisce filesystem, punto di mount e conversione da non privilegiato a privilegiato." + }, + "header": { + "title": "Importa disco su LXC", + "description": "Collegare un disco fisico a un contenitore LXC esistente sull'host Proxmox. ProxMenux rileva dischi liberi, li formatta facoltativamente con un filesystem supportato, e collega la partizione a un punto di montaggio all'interno del contenitore utilizzando percorsi di dispositivo persistenti.", + "section": "Gestione del disco · LXC" + }, + "intro": { + "title": "Passthrough VM e passthrough LXC", + "body": "Questo passthrough LXC non fornisce un dispositivo a blocchi grezzo. Il contenitore riceve un punto di mount, cioè una directory su una partizione scelta nell’host. A differenza di una VM, usa il kernel dell’host: il filesystem (ext4/xfs/btrfs) viene quindi letto e gestito dall’host Proxmox ed esposto al contenitore." + }, + "howRuns": { + "heading": "Come funziona lo script", + "body": "Il flusso ha due fasi distinte: raccolta di informazioni e scelte, poi modifica effettiva della configurazione del contenitore. Fino alla conferma finale non viene montato nulla nel CT.", + "summary": "ProxMenux esclude il disco root, i dischi montati e quelli citati in configurazioni VM/LXC. I membri attivi ZFS/LVM/RAID sono nascosti; le vecchie firme sono segnalate con ⚠ per poterle cancellare prima della formattazione." + }, + "prereqs": { + "heading": "Prerequisiti", + "items": [ + "Almeno un contenitore LXC definito sull'host.", + "Il contenitore è privilegiato oppure accetti la conversione proposta dallo script.", + "Almeno un disco fisico non in uso dall'host o da qualsiasi altro ospite." + ], + "warnTitle": "Contenitore privilegiato richiesto", + "warnBody": "Questo script richiede un contenitore privilegiato per collegare direttamente il disco. Se rileva unprivileged: 1, propone di modificare /etc/pve/lxc/<CTID>.conf sul posto. Ciò cambia il modello di sicurezza senza rimappare i proprietari dei file esistenti. Salva un backup e verifica i proprietari prima di accettare, oppure ricrea il contenitore come privilegiato." + }, + "steps": { + "heading": "Passo dopo passo", + "stepLabel": "Passaggio", + "list": [ + { + "title": "Scegli il contenitore di destinazione", + "img": "/disk/select-container.png", + "caption": "Menu di selezione del contenitore", + "bodyRich": "ProxMenux elenca tutti i contenitori LXC sull’host (pct list). Scegli quello che riceverà il disco. Se non è privilegiato, viene proposta la conversione." + }, + { + "title": "Scegli il disco fisico", + "img": "/disk/disk-selection-ct.png", + "caption": "Dischi liberi rilevati sull’host, con ⚠ per i metadati obsoleti", + "bodyRich": "Vengono mostrati solo candidati sicuri. A differenza della procedura per VM, questo script collega un disco per esecuzione. Rieseguilo per ogni disco aggiuntivo." + }, + { + "title": "Formatta o riutilizza", + "intro": "Lo script ispeziona il disco:", + "items": [ + "Se già trasporta un filesystem supportato (ext4 / xfs / btrfs) è possibile riutilizzarlo come-è (i file esistenti sono conservati).", + "Se non ha un filesystem supportato, ti viene offerto di formattarlo. Scegli ext4 / xfs / btrfs." + ] + }, + { + "title": "Scegli il punto di montaggio", + "bodyRich": "Inserisci il percorso in cui il contenitore vedrà il disco, ad esempio /mnt/data o /mnt/disk_passthrough. È il percorso all’interno del contenitore; l’host vede già la partizione in /dev/disk/by-id/…." + }, + { + "title": "Collega e verifica", + "img": "/disk/assignment-ct.png", + "caption": "Assegnazione a CT", + "bodyRich": "ProxMenux aggiunge una nuova voce mpN: alla configurazione del container, evitando gli indici già in uso, quindi rilegge la configurazione per verificarla. Se il container è in esecuzione, il montaggio viene applicato subito; altrimenti entrerà in funzione al prossimo avvio.", + "extraImg": "/disk/result-point.png", + "extraAlt": "Punto di montaggio creato con successo", + "extraCaption": "Punto di montaggio creato e verificato" + } + ] + }, + "manual": { + "heading": "Equivalente manuale", + "body": "Lo script avvolge pct set. Un'invocazione diretta per un singolo disco sembra:" + }, + "important": { + "heading": "Considerazioni importanti", + "items": [ + "Un disco per esecuzione. Riesegui lo script per ogni disco aggiuntivo.", + "non collegare la stessa partizione a diversi contenitori che potrebbero montarla simultaneamente: le scritture simultanee corrompono il filesystem.", + "I vecchi metadati (firme RAID/ZFS/LVM) vanno cancellati manualmente prima che lo script consenta di formattare, altrimenti mkfs rifiuta di sovrascrivere. Usa Formatta o cancella un disco fisico." + ] + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "unprivTitle": "\"Impossibile proseguire con un contenitore non privilegiato\"", + "unprivBody": "Hai rifiutato la conversione. In /etc/pve/lxc/<CTID>.conf il valore passa da unprivileged: 1 a unprivileged: 0, ma questo da solo non converte la proprietà UID/GID esistente. Salva un backup e gestisci la mappatura dei proprietari prima della conversione sul posto; in alternativa, ripristina o ricrea il contenitore come privilegiato.", + "permsTitle": "Le autorizzazioni all'interno del contenitore sono sbagliate", + "permsBody": "Montare una partizione in un contenitore privilegiato conserva i proprietari esistenti; un filesystem appena formattato appartiene spesso a root:root. Se il servizio usa un altro utente, ad esempio www-data per Nextcloud, controlla UID/GID e modifica i file necessari con chown/chmod. Le modifiche agiscono anche sul disco sottostante." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importa disco nella VM", + "tail": "— flusso equivalente per le VM." + }, + { + "href": "/docs/storage-share/lxc-mount-points", + "label": "Punti di montaggio LXC (Host ↔ CT)", + "tail": "— condividere directory host con un CT invece di allegare un disco intero." + }, + { + "href": "/docs/help-info/vm-ct-commands", + "label": "Comandi di gestione VM e CT", + "tail": "— pct config / push / pull reference." + }, + { + "href": "/docs/disk-manager", + "label": "Panoramica di Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/disk-manager/import-disk-vm.json b/web/messages/it/docs/disk-manager/import-disk-vm.json new file mode 100644 index 00000000..eb5e3de0 --- /dev/null +++ b/web/messages/it/docs/disk-manager/import-disk-vm.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Importa disco in una VM | Documentazione ProxMenux", + "description": "Collegare un disco fisico a un Proxmox VM esistente con ProxMenux. Rilevamento sicuro del disco (esclude il sistema, montato, in-uso, ZFS/RAID/LVM), persistenti percorsi /dev/disk/by-id e interfacce SATA / SCSI / VirtIO / IDE.", + "ogTitle": "Importa disco in una VM | Documentazione ProxMenux", + "ogDescription": "Collegare un disco fisico a un Proxmox VM esistente. Utilizza percorsi /dev/disk/by-id persistenti e supporta SATA / SCSI / VirtIO / IDE." + }, + "header": { + "title": "Importa disco nella VM", + "description": "Collegare un disco fisico che esiste già sull'host Proxmox ad una macchina virtuale esistente. ProxMenux rileva dischi liberi, consente di scegliere il target VM, il tipo di bus (SATA / SCSI / VirtIO / IDE) e allega tutto utilizzando percorsi /dev/disk/by-id persistenti in modo che la mappatura sopravviva ai riavvimenti e alle modifiche dell'ordine del dispositivo.", + "section": "Gestione del disco · VM" + }, + "intro": { + "title": "Che cosa fa", + "body": "Collega un disco fisico grezzo come supporto di un’interfaccia disco virtuale. Il guest non riceve automaticamente i dati SMART nativi o le funzioni del controller fisico; usa il passthrough PCI del controller se servono. Il disco viene collegato tramite /dev/disk/by-id/…, non /dev/sdX, così un diverso ordine di enumerazione all’avvio non interrompe l’assegnazione." + }, + "howRuns": { + "heading": "Come funziona lo script", + "body": "Il flusso ha due fasi distinte: raccolta delle informazioni e delle scelte, poi collegamento effettivo dei dischi alla VM. La configurazione resta invariata fino alla conferma finale.", + "summary": "ProxMenux esclude i candidati non sicuri: disco root, dischi montati sull’host, membri attivi ZFS/LVM/RAID e dischi citati in configurazioni VM/LXC. I dischi con metadati obsoleti, cioè vecchie firme ZFS/RAID/LVM non più in uso, sono segnalati con ⚠ ma non bloccati." + }, + "prereqs": { + "heading": "Prerequisiti", + "items": [ + "Almeno un VM definito sull'host (lo script invia direttamente a qm list).", + "La VM di destinazione è spenta. Se è in esecuzione, lo script si interrompe con un messaggio; l’aggiunta a caldo dei dischi non rientra in questa procedura.", + "Almeno un disco fisico sull'host che non è in uso dall'host o da qualsiasi altro ospite." + ] + }, + "steps": { + "heading": "Passo dopo passo", + "stepLabel": "Passaggio", + "list": [ + { + "title": "Scegli la VM di destinazione", + "bodyRich": "ProxMenux elenca tutte le VM dell’host con qm list. Scegli quella che riceverà il disco. Se è in esecuzione, lo script si interrompe e chiede di spegnerla prima." + }, + { + "title": "Scegli i dischi fisici da collegare", + "img": "/disk/disk-selection.png", + "caption": "Dischi liberi rilevati sull’host, con ⚠ per i metadati obsoleti", + "body": "Lo script esamina i dischi dell’host e propone solo quelli collegabili senza conflitti. Puoi selezionarne più di uno. I dischi con vecchie firme ZFS/LVM/RAID restano visibili con ⚠, per indicare che occorre cancellare le firme prima che il guest li formatti." + }, + { + "title": "Scegli l’interfaccia bus", + "img": "/disk/disk-assigment.png", + "caption": "Selezione dell'interfaccia bus", + "intro": "Scegliere come l'ospite dovrebbe vedere il disco:", + "items": [ + "SCSI — default moderno per Linux e Windows con driver VirtIO-SCSI installati.", + "SATA — ampia compatibilità, funziona fuori dalla scatola praticamente ogni ospite.", + "VirtIO: dispositivo a blocchi paravirtualizzato efficiente; richiede driver nel guest.", + "IDE — per ospiti legacy che non hanno nessuno dei driver di cui sopra." + ] + }, + { + "title": "Collega e verifica", + "bodyRich": "ProxMenux collega ogni disco selezionato con il suo migliore percorso /dev/disk/by-id/, salta gli indici di slot che sono già in uso nella configurazione VM (scsi0, sata0, ...) e rilegge la configurazione per confermare l'assegnazione. Alla fine viene stampato un riassunto." + } + ] + }, + "manual": { + "heading": "Equivalente manuale", + "body": "Lo script è un wrapper intorno a qm set. Il comando esatto per un singolo disco sembra questo:", + "migrationTitle": "La migrazione dal vivo non è possibile", + "migrationBody": "Una VM con un disco fisico collegato direttamente è legata all’host che espone quel disco. Un altro nodo normalmente non ha lo stesso percorso /dev/disk/by-id/… né i dati. Salva e trasferisci i dati separatamente, oppure usa dischi virtuali gestiti su storage condiviso o con replica supportata. Non presumere che la replica storage di Proxmox includa questo dispositivo.", + "shareTitle": "Non condividere un disco fisico tra VM", + "shareBody": "Attaccare lo stesso disco fisico a due VM allo stesso tempo corromperà i dati sulla prossima scrittura. ProxMenux rileva questa situazione e lo blocca, ma se si bypassa lo script (diretto qm set), assicurarsi che solo un ospite monta mai il disco." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "noDisksTitle": "\"Nessun disco disponibile per questo VM\"", + "noDisksIntro": "Lo script ha trovato dei dischi, ma ogni candidato è stato filtrato. Motivi comuni:", + "noDisksItems": [ + "Ogni disco rimanente è già citato nella configurazione di destinazione VM.", + "Ogni disco rimanente è montato sull'host o fa parte di un ZFS attivo / LVM / RAID.", + "L'host ha installato solo il disco root." + ], + "noDisksOutro": "Eseguire lsblk -f sull'host per rivedere lo stato di ogni disco.", + "noVisibleTitle": "VM non vede il disco dopo il boot", + "noVisibleBody": "Con SCSI o VirtIO il guest richiede il driver corrispondente. Linux lo include nel kernel; su Windows installalo dall’ISO VirtIO (vedi Crea VM: Windows). Passare a SATA nella scheda Hardware della VM è una prova rapida per verificare l’assegnazione del disco." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "href": "/docs/disk-manager/import-disk-image-vm", + "label": "Importa immagine disco nella VM", + "tail": "— stesso flusso ma per file di immagine (qcow2 / vmdk / raw / img)." + }, + { + "href": "/docs/disk-manager/import-disk-lxc", + "label": "Importa disco su LXC", + "tail": "— flusso equivalente per contenitori LXC." + }, + { + "href": "/docs/disk-manager/add-controller-nvme-vm", + "label": "Aggiungi controller o NVMe a VM", + "tail": "— quando è necessario PCIe completo / NVMe passante piuttosto che attaccare disco." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandi di archiviazione e dischi", + "tail": "— qm importdisk e relativo riferimento shell." + }, + { + "href": "/docs/disk-manager", + "label": "Panoramica di Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/disk-manager/index.json b/web/messages/it/docs/disk-manager/index.json new file mode 100644 index 00000000..c67de00d --- /dev/null +++ b/web/messages/it/docs/disk-manager/index.json @@ -0,0 +1,135 @@ +{ + "meta": { + "title": "Gestione dischi Proxmox: VM/LXC, test SMART e cancellazione | ProxMenux", + "description": "Gestisci i dischi fisici di un host Proxmox VE con ProxMenux: collega dischi a VM o LXC (qm set scsi/sata/virtio, pct mp), importa immagini img / qcow2 / vmdk / raw, assegna interi HBA o controller NVMe, cancella dischi con controlli di sicurezza ed esegui autotest SMART.", + "ogTitle": "Proxmox Disk Manager — Collegare dischi a VM / LXC, SMART Test, Wipe", + "ogDescription": "Collega dischi a VM/LXC, importa immagini, usa il passthrough PCI dei controller, cancella con controlli di sicurezza ed esegui test SMART su Proxmox VE.", + "twitterTitle": "Gestore dischi Proxmox | ProxMenux", + "twitterDescription": "Collega dischi a VM/LXC, importa immagini, usa passthrough PCI, cancella con controlli di sicurezza ed esegui test SMART." + }, + "header": { + "title": "Gestione disco", + "description": "Il menu Disk Manager raggruppa gli strumenti ProxMenux per la gestione di dischi fisici su un host Proxmox: collegare dischi a VM e contenitori LXC, importare immagini disco, passare attraverso un intero controller o dispositivo NVMe, pulire i dischi in modo sicuro ed eseguire test di salute SMART.", + "section": "Gestione disco" + }, + "intro": { + "title": "A cosa serve questo menu", + "body": "Questi strumenti operano su dischi fisici visibili all’host Proxmox e file immagine conservati su di esso. Il menu ha tre gruppi: VM (collegare dischi o importare immagini), LXC (collegare dischi a contenitori) e Utilità (formattazione e stato SMART). Collegamento e cancellazione nascondono o bloccano i dischi di sistema e in uso; SMART può esaminarli senza cancellarli." + }, + "opening": { + "heading": "Apertura del menu", + "body": "Dal menu principale di ProxMenux, selezionare Disk Manager. Vedrai questo:", + "imageAlt": "Menu Gestione disco con blocchi VM, LXC e Utilities" + }, + "groups": { + "heading": "Tre gruppi di utensili", + "intro": "Il menu Disk Manager è organizzato in tre gruppi — VM, LXC e Utilities. Fare clic su una scheda per saltare dritto agli strumenti in quel gruppo.", + "vmTitle": "VM", + "vmBody": "Strumenti che operano su macchine virtuali esistenti. Il VM deve essere spento; ProxMenux lo convalida prima di toccare la configurazione.", + "vmItems": [ + "Importa disco nella VM", + "Importa immagine disco nella VM", + "Aggiungi controller o NVMe a VM" + ], + "lxcTitle": "LXC", + "lxcBody": "Strumenti per contenitori LXC esistenti. Questo script richiede un contenitore privilegiato e propone di cambiare l’impostazione se necessario. Leggi prima le indicazioni su conversione e proprietari dei file nella pagina dello strumento.", + "lxcItems": [ + "Importa disco su LXC" + ], + "utilitiesTitle": "Utilità", + "utilitiesBody": "Strumenti lato host che operano sui dischi stessi, indipendentemente da qualsiasi VM o contenitore.", + "utilitiesItems": [ + "Formatta o cancella un disco fisico", + "Integrità e test disco SMART" + ] + }, + "vm": { + "heading": "VM", + "intro": "Strumenti che operano su macchine virtuali esistenti. Il VM deve essere spento; ProxMenux lo convalida prima di toccare la configurazione.", + "options": [ + { + "icon": "HardDrive", + "href": "/docs/disk-manager/import-disk-vm", + "title": "Importa disco nella VM", + "description": "Collega un disco fisico non assegnato a una VM esistente. Supporta SATA/SCSI/VirtIO/IDE e usa percorsi persistenti /dev/disk/by-id." + }, + { + "icon": "FileDown", + "href": "/docs/disk-manager/import-disk-image-vm", + "title": "Importa immagine disco nella VM", + "description": "Importa file di immagine del disco (.img / .qcow2 / .vmdk / .raw) in un VM esistente. Flusso bifase, qm importdisk sotto il cappuccio." + }, + { + "icon": "Cpu", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "title": "Aggiungi controller o NVMe a VM", + "description": "Passthrough PCI di un intero HBA SATA/SAS o dispositivo NVMe a una VM. Gestisce l’attivazione di IOMMU e il rilevamento dei conflitti." + } + ] + }, + "lxc": { + "heading": "LXC", + "intro": "Strumenti per contenitori LXC esistenti. Questo script richiede un contenitore privilegiato e propone di cambiare l’impostazione se necessario. Leggi prima le indicazioni su conversione e proprietari dei file nella pagina dello strumento.", + "options": [ + { + "icon": "Boxes", + "href": "/docs/disk-manager/import-disk-lxc", + "title": "Importa disco su LXC", + "description": "Collega un disco fisico non assegnato a un contenitore LXC come punto di mount. Gestisce rilevamento e formattazione del filesystem e il passaggio alla modalità privilegiata." + } + ] + }, + "utilities": { + "heading": "Utilità", + "intro": "Strumenti lato host che operano sui dischi stessi, indipendentemente da qualsiasi VM o contenitore.", + "options": [ + { + "icon": "Eraser", + "href": "/docs/disk-manager/format-disk", + "title": "Formatta/Cancella disco fisico (sicuro)", + "description": "Cancella dischi con controlli rigorosi: vengono mostrati solo dischi completamente liberi ed è sempre richiesta una doppia conferma." + }, + { + "icon": "Activity", + "href": "/docs/disk-manager/smart-disk-test", + "title": "Integrità e test disco SMART", + "description": "Eseguire controlli sanitari SMART e test brevi / lunghi su drive SATA, SAS e NVMe. Esporta JSON per il Monitor." + } + ] + }, + "safety": { + "title": "Regole di sicurezza per collegamento e cancellazione dei dischi", + "intro": "Le operazioni di collegamento e cancellazione escludono i dispositivi che potrebbero danneggiare l’host:", + "items": [ + "Il disco di sistema, il pool root, lo swap e i membri attivi ZFS/LVM/RAID sono sempre nascosti.", + "I dischi montati in qualsiasi punto dell’host sono nascosti o bloccati all’esecuzione.", + "I dischi riferiti da un VM in esecuzione o LXC non possono essere riassegnati o cancellati.", + "Le operazioni che modificano lo stato dell’host, come attivare IOMMU o cancellare dischi, richiedono una conferma esplicita." + ] + }, + "related": { + "heading": "Correlati", + "items": [ + { + "href": "/docs/storage-share", + "label": "Gestore storage e condivisioni", + "tail": "— registrare lo storage in Proxmox stesso (NFS / Samba / iSCSI / locale) e condividere le cartelle tra host e CT." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandi di archiviazione e dischi", + "tail": "— dispositivi di blocco, LVM, pvesm, riferimento SMART." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Comandi di gestione ZFS", + "tail": " — per ZFS pools e set di dati." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Aggiungi GPU a VM (Passthrough)", + "tail": "— stessi concetti IOMMU / VFIO applicati alle GPU." + } + ] + } +} diff --git a/web/messages/it/docs/disk-manager/smart-disk-test.json b/web/messages/it/docs/disk-manager/smart-disk-test.json new file mode 100644 index 00000000..2dd9a180 --- /dev/null +++ b/web/messages/it/docs/disk-manager/smart-disk-test.json @@ -0,0 +1,146 @@ +{ + "meta": { + "title": "Stato e test SMART del disco | Documentazione ProxMenux", + "description": "Esegui controlli SMART e test dei dischi su Proxmox VE con ProxMenux. Supporta SATA/SAS con smartmontools e NVMe con nvme-cli, autotest brevi e lunghi ed esportazione JSON per ProxMenux Monitor.", + "ogTitle": "Stato e test SMART del disco | Documentazione ProxMenux", + "ogDescription": "SMART controlli di salute e auto-test per unità SATA / SAS e NVMe su Proxmox. Esportazione JSON per il Monitor." + }, + "header": { + "title": "Integrità e test disco SMART", + "description": "Leggi i dati SMART e avvia autotest sui dischi fisici dell’host Proxmox. ProxMenux installa automaticamente smartmontools per SATA/SAS e nvme-cli per NVMe, avvia i test nel firmware del disco (i test lunghi continuano dopo la chiusura del terminale) ed esporta risultati JSON per ProxMenux Monitor.", + "section": "Disk Manager · Utilità" + }, + "intro": { + "title": "A cosa serve", + "body": "SMART (Self-Monitoring, Analysis and Reporting Technology) consente al disco di segnalare il proprio stato ed eseguire autotest. Lo strumento mostra questi dati senza dover ricordare il comando smartctl o nvme corretto e conserva l’output in JSON perché il Monitor possa mostrare le tendenze nel tempo." + }, + "howRuns": { + "heading": "Come funziona lo script", + "body": "Tutte le azioni qui non distruttive — SMART legge i contatori del firmware dell'unità, e i test di auto sono in coda all'interno dell'unità stessa. Non è necessaria alcuna separazione di fase. Il flusso è: controllo di dipendenza → selezione del disco → selezione di azione → invocazione degli strumenti (smartctl o nvme-cli a seconda del bus del disco) → uscita stampata più esportazione JSON per il monitor." + }, + "deps": { + "heading": "Dipendenze", + "body": "Lo strumento installa automaticamente ciò di cui ha bisogno in prima esecuzione. Le unità SATA / SAS si basano su smartmontools; le unità NVMe si basano su nvme-cli. Entrambi:" + }, + "actions": { + "heading": "Azioni disponibili", + "headerAction": "Azione", + "headerWhat": "Che cosa legge o esegue", + "headerDur": "Durata", + "rows": [ + { + "action": "Situazione rapida della salute", + "whatRich": "Complessivamente PASSED/FAILED + attributi chiave.
smartctl -H + -A (SATA/SAS) o nvme smart-log (NVMe).", + "dur": "istantaneamente" + }, + { + "action": "Rapporto completo", + "whatRich": "Dati SMART completi, scorrevoli. smartctl -x per SATA/SAS o nvme smart-log + id-ctrl per NVMe.", + "dur": "istantaneamente" + }, + { + "action": "Test breve", + "what": "Superficie di base e controllo elettrico, in coda all'interno del firmware dell'unità.", + "dur": "~2 minuti" + }, + { + "action": "Test lungo", + "what": "Controllo completo dell'intera superficie. Funziona sull'hardware dell'unità — persiste anche se si chiude il terminale.", + "dur": "Ore (dipendenti dalle dimensioni del disco)" + }, + { + "action": "Verificare i progressi dei test", + "what": "Stato dell'autotest attivo o più recente.", + "dur": "istantaneamente" + } + ], + "tipTitle": "I test lunghi sopravvivono alla chiusura del terminale", + "tipBody": "Un test lungo viene eseguito nel disco e non dipende dal processo ProxMenux. Puoi chiudere il terminale e tornare a Verifica avanzamento test. Un riavvio dell’host, un reset del controller o una perdita di alimentazione può interrompere il test e la raccolta dei risultati; non presumere che riprenda automaticamente." + }, + "json": { + "heading": "JSON export per il Monitor", + "intro": "Le azioni di stato, test breve e avanzamento scrivono un JSON con data e ora in /usr/local/share/proxmenux/smart/<disk>/; i risultati dei test lunghi sono raccolti in background. Il rapporto completo viene solo visualizzato. La struttura è:", + "outro": "ProxMenux Monitor usa questi file per mostrare l’andamento dello stato dei dischi. I vecchi file vengono rimossi automaticamente al raggiungimento del limite di conservazione." + }, + "steps": { + "heading": "Passo dopo passo", + "stepLabel": "Passaggio", + "list": [ + { + "title": "Scegli un disco", + "body": "ProxMenux elenca ogni disco fisico sull'host con il suo modello e dimensione. A differenza dello strumento Formato, questo elenco non è filtrato dalla sicurezza — la lettura SMART è un'operazione non distruttiva.", + "img": "/disk/smart/disk-selection.png", + "alt": "Menu di selezione del disco SMART", + "caption": "Menu di selezione del disco SMART" + }, + { + "title": "Scegli un'azione", + "body": "Scegliere tra stato di salute rapido, rapporto completo, test breve, test lungo o verifica progressi. Il menu rimane aperto dopo ogni azione in modo da poter incatenare diverse query contro lo stesso disco.", + "img": "/disk/smart/action-menu.png", + "alt": "Menu di azione SMART", + "caption": "SMART menu di azione (5 azioni + cancellazione)" + }, + { + "title": "(Solo test lungo) Conferma l’esecuzione in background", + "body": "ProxMenux avvisa che il test continuerà dopo la chiusura del terminale e mostra dove verrà salvato il risultato JSON. Accetta per avviarlo.", + "img": "/disk/smart/long-test-warning.png", + "alt": "Finestra di conferma di prova lunga", + "caption": "Conferma di prova lunga — corre in background, risultato salvato a JSON" + }, + { + "title": "Controlla i risultati", + "bodyRich": "Stato e rapporti compaiono nel terminale; l’esportazione JSON avviene per le azioni indicate sopra, non per Rapporto completo. Per i test lunghi torna a Verifica avanzamento test sullo stesso disco.", + "img": "/disk/smart/quick-status.png", + "alt": "Uscita rapida dello stato di salute", + "caption": "Uscita rapida dello stato di salute (SATA — smartctl -H + -A)" + } + ] + }, + "manual": { + "heading": "Equivalenti manuali", + "nvmeWarnTitle": "Gli autotest NVMe dipendono dal firmware del disco", + "nvmeWarnBody": "Non ogni unità NVMe supporta il comando breve/lungo self-test. Se un'unità rifiuta il test, il registro SMART e i dati del controller ID (nvme smart-log + id-ctrl) sono ancora il segnale sanitario più affidabile." + }, + "troubleshoot": { + "heading": "Risoluzione dei problemi", + "noSmartTitle": "\"Impossibile leggere i dati SMART da /dev/sdX\"", + "noSmartBody": "Il disco è probabilmente dietro un controller RAID / SAS che non passa SMART attraverso. Con le carte a base di megaraid, prova a smartctl -d megaraid,N /dev/sdX. Per HBA in modalità IT l'invocazione diretta funziona.", + "longTitle": "Il lungo test non completa mai", + "longBody": "Il test viene eseguito nel firmware e un carico I/O elevato può ritardarlo. Prova in un periodo di inattività, ad esempio di notte. Su SATA/SAS, smartctl -c mostra la percentuale rimanente; il log degli autotest indica esito ed eventuali LBA difettosi. Un errore di lettura va indagato; la lentezza da sola non prova un settore danneggiato." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "href": "/docs/disk-manager/format-disk", + "label": "Formatta o cancella un disco fisico", + "tail": "— riutilizzare un disco dopo aver confermato che è sano." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandi di archiviazione e dischi → Stato SMART", + "tail": "— riferimento copiabile smartctl / nvme." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Comandi di gestione ZFS", + "tail": " — zpool scrub verifica i checksum dei dati ZFS e affianca i test SMART dell’hardware." + }, + { + "href": "/docs/monitor/dashboard/storage", + "label": "ProxMenux Monitor — scheda Archiviazione", + "tail": " — vista dettagliata del disco che usa il JSON esportato qui: tabella SMART completa, cronologia e rapporto PDF." + }, + { + "href": "/docs/monitor/dashboard/hardware", + "label": "ProxMenux Monitor — Scheda hardware", + "tail": "— Riepilogo di stoccaggio con modello, capacità e velocità di collegamento negoziata (corrente vs massima su NVMe)." + }, + { + "href": "/docs/disk-manager", + "label": "Panoramica di Disk Manager", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/pt/docs/disk-manager/add-controller-nvme-vm.json new file mode 100644 index 00000000..35712be7 --- /dev/null +++ b/web/messages/pt/docs/disk-manager/add-controller-nvme-vm.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Adicionar controlador ou NVMe a uma VM | Documentação ProxMenux", + "description": "Atribua um controlador de armazenamento SATA/SAS HBA ou dispositivo NVMe a uma VM Proxmox por passthrough PCI com o ProxMenux. A ferramenta trata da ativação do IOMMU, deteta conflitos e configura a atribuição com qm set --hostpci.", + "ogTitle": "Adicionar controlador ou NVMe a uma VM | Documentação ProxMenux", + "ogDescription": "Atribua um HBA SATA/SAS completo ou um dispositivo NVMe a uma VM Proxmox. O ProxMenux trata do IOMMU, da deteção de conflitos e da atribuição hostpci." + }, + "header": { + "title": "Adicionar controlador ou NVMe a uma VM", + "description": "Atribua um adaptador de barramento SATA/SAS completo (HBA) ou dispositivo NVMe a uma VM Proxmox por passthrough PCI. O ProxMenux verifica o IOMMU e ativa-o com o seu consentimento, lista os dispositivos elegíveis, exclui conflitos e configura a atribuição com qm set --hostpci.", + "section": "Gerenciador de disco · VM" + }, + "intro": { + "title": "O que isto faz (e não faz)", + "body": "Trata-se de passthrough ao nível do dispositivo: a placa PCIe deixa de estar sob controlo do kernel do host e é associada a vfio-pci. A VM vê o próprio controlador, em vez de discos atribuídos individualmente, e carrega o controlador de software para esse modelo. Todos os discos ligados seguem automaticamente, com dados SMART nativos, todas as funções do firmware e sem uma camada Proxmox intermédia." + }, + "howRuns": { + "heading": "Como o script é executado", + "body": "O fluxo tem duas fases com separação clara entre \"coletar informações, verificar IOMMU e listar candidatos\" e \"realmente anexar o dispositivo PCI\". Até a confirmação final nada é escrito para a configuração VM." + }, + "iommu": { + "heading": "Grupos IOMMU: por que é necessário considerar a placa inteira", + "body": "O limite de isolamento do passthrough PCI é o grupo IOMMU, a menor unidade que o IOMMU da CPU consegue isolar. Os dispositivos do mesmo grupo não podem ser isolados entre si. Se um controlador SATA partilhar o grupo com um controlador USB, o passthrough SATA pode exigir libertar também o USB do host ou ser impossível. Não atribui automaticamente à VM todos os dispositivos do grupo.", + "outro": "O ProxMenux mostra o grupo IOMMU ao lado de cada dispositivo e avisa quando um grupo carrega mais do que o controlador que deseja. Você ainda pode prosseguir se os dispositivos extras do grupo são aceitáveis (todos os controladores de disco, por exemplo), ou voltar se eles não forem." + }, + "prereqs": { + "heading": "Pré-requisitos", + "items": [ + "A CPU e a placa-mãe suportam VT-d (Intel) ou AMD-Vi, e a função está ativa no firmware (BIOS/UEFI). O ProxMenux pode ativar a parte do kernel, mas não alterar a definição do firmware.", + "A VM de destino está desligada antes de ligar dispositivos PCI.", + "O controlador/NVMe não é aquele que detém o sistema de arquivos raiz Proxmox. O script esconde qualquer coisa em uso pela máquina.", + "O sistema operativo convidado tem os controladores de software para o modelo do controlador. O Linux suporta praticamente todos os HBA de origem; o Windows precisa do controlador do fabricante instalado antes de arrancar com o dispositivo atribuído." + ], + "warnTitle": "A migração ao vivo não é possível", + "warnBody": "Um VM com passagem PCI está ligado ao nó que detém fisicamente o cartão. A migração ao vivo nos nós irá falhar. Planeje backups/replicação em conformidade." + }, + "steps": { + "heading": "Passo a passo", + "stepLabel": "Etapa", + "list": [ + { + "title": "Escolher a VM de destino", + "bodyRich": "ProxMenux lê qm list e mostra cada VM. Escolha o que receberá o controlador.", + "img": "/disk/nvme-passthrough/vm-selection.png", + "alt": "Diálogo de seleção do VM", + "caption": "Diálogo de seleção do VM" + }, + { + "title": "Verificação IOMMU", + "bodyRich": "Se o IOMMU não estiver habilitado na linha cmdline do kernel, o ProxMenux oferece para habilitá-lo. Ele edita /etc/kernel/cmdline (para systemd-boot) ou /etc/default/grub (para GRUB) e adiciona o parâmetro correto para o seu CPU:", + "items": [ + "intel_iommu=on para CPUs Intel.", + "amd_iommu=on para CPUs AMD." + ], + "outro": "Uma reinicialização é necessária após esta alteração. O script pede que você reinicie agora ou mais tarde; a passagem não pode continuar até que o novo kernel cmdline esteja ativo.", + "img": "/disk/nvme-passthrough/iommu-warning.png", + "alt": "Diálogo IOMMU necessário", + "caption": "IOMMU Necessário — oferta para ativar e reiniciar" + }, + { + "title": "Enumeração do dispositivo", + "body": "ProxMenux lista cada controlador de armazenamento (SATA / SAS HBA) e cada dispositivo NVMe no barramento PCI. Para cada dispositivo, mostra:", + "items": [ + "Endereço PCI (00:17.0, 01:00.0, ...).", + "Descrição do fornecedor / dispositivo.", + "Grupo IOMMU, com um aviso ⚠ se for partilhado com outros dispositivos não relacionados.", + "Os discos atualmente por trás do controlador (então você sabe o que irá segui-lo para o VM)." + ], + "img": "/disk/nvme-passthrough/device-list.png", + "alt": "Controlador / enumeração do dispositivo NVMe", + "caption": "Controlador / NVMe enumeração do dispositivo com informações do grupo IOMMU" + }, + { + "title": "Detecção de conflitos", + "bodyRich": "O script bloqueia dispositivos claramente inseguros: já atribuídos a outra VM através de hostpci na respetiva configuração, utilizados pelo host como o controlador do disco raiz, ou num grupo IOMMU cujos outros membros não consegue identificar com segurança. Os dispositivos elegíveis ficam disponíveis para seleção.", + "img": "/disk/nvme-passthrough/conflict-warning.png", + "alt": "Aviso de detecção de conflitos", + "caption": "Detecção de conflitos — dispositivo bloqueado com razão" + }, + { + "title": "Anexar e finalizar", + "bodyRich": "Para cada dispositivo selecionado ProxMenux roda qm set <VMID> --hostpciN <pci-addr>,pcie=1, escolhendo o próximo slot livre hostpci. Se IOMMU foi habilitado durante esta sessão você é lembrado para reiniciar antes de iniciar o VM.", + "img": "/disk/nvme-passthrough/assignment.png", + "alt": "Resumo da atribuição", + "caption": "Resumo da atribuição — slots hostpciN e endereços PCI anexados" + } + ] + }, + "manual": { + "heading": "Equivalente manual" + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "noGroupsTitle": "IOMMU activado, mas sem grupos sob /sys/kernel/iommu_groups/", + "noGroupsBody": "É necessário reiniciar para que a linha cmdline do kernel faça efeito. Se os grupos ainda estiverem faltando após o reinício, o VT-d / AMD-Vi provavelmente estará desativado no firmware — verifique a configuração BIOS/UEFI.", + "busyTitle": "A VM não inicia: \"hostpciN: device busy\"", + "busyBody": "Outro processo mantém o dispositivo PCI ocupado. As causas mais comuns são uma VM que falhou sem o libertar ou o kernel do host que o recuperou no último arranque. Execute lspci -nnk -s <addr> para ver o controlador de software associado; deve ser vfio-pci. Um reinício completo do host costuma resolver o problema.", + "noDisksTitle": "Convidado vê o controlador, mas não os discos", + "noDisksBody": "Falta no sistema convidado o controlador de software para esse modelo. No Linux é raro, mas acontece no Windows: instale o controlador do fabricante, por exemplo LSI/Broadcom para HBA SAS antigos, com a placa não atribuída, e reinicie depois de a atribuir.", + "sharedTitle": "O grupo IOMMU inclui um dispositivo não relacionado", + "sharedBody": "Opções: (a) mover a placa para outra ranhura PCIe para alterar o grupo, (b) ativar ACS override no kernel para dividir grupos (compromisso de segurança: informe-se antes de aplicar), ou (c) escolher outra placa num grupo mais isolado." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importar disco para VM", + "tail": " — modelo alternativo: anexar um disco físico via Proxmox sem passagem PCIe completa." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Adicionar GPU a uma VM (passthrough)", + "tail": " — os mesmos conceitos IOMMU / VFIO aplicados a um GPU." + }, + { + "href": "/docs/help-info/gpu-commands", + "label": "Comandos de passagem GPU", + "tail": " — Os comandos de verificação IOMMU também se aplicam à passagem do controlador / NVMe." + }, + { + "href": "/docs/disk-manager", + "label": "Visão geral do Gerenciador de Discos", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/disk-manager/format-disk.json b/web/messages/pt/docs/disk-manager/format-disk.json new file mode 100644 index 00000000..69cd0681 --- /dev/null +++ b/web/messages/pt/docs/disk-manager/format-disk.json @@ -0,0 +1,142 @@ +{ + "meta": { + "title": "Formatar ou apagar um disco físico | Documentação ProxMenux", + "description": "Apague e formate discos físicos no Proxmox VE com o ProxMenux. Quatro modos, filtros rigorosos que bloqueiam discos de sistema, montados ou em uso e confirmação dupla com introdução do caminho completo.", + "ogTitle": "Formatar ou apagar um disco físico | Documentação ProxMenux", + "ogDescription": "Limpar ou formatar com segurança um disco físico no Proxmox. Regras de visibilidade seguras, modos de operação 4, dupla confirmação." + }, + "header": { + "title": "Formatar ou apagar um disco físico", + "description": "Limpar ou formatar com segurança um disco físico no host Proxmox. ProxMenux só mostra discos totalmente livres (sem uso do sistema, sem referência de convidado, sem montagens) e força uma confirmação dupla — sim/não mais digitando o caminho do disco completo — antes de destruir quaisquer dados.", + "section": "Gerenciador de disco · Utilitários" + }, + "danger": { + "title": "Ferramenta destrutiva", + "body": "Cada operação aqui escreve para o disco. Não há nada a desfazer. ProxMenux aplica rigorosos filtros de segurança e confirmações, mas a responsabilidade pela escolha do disco certo é sua. Leia o caminho do disco em voz alta duas vezes antes de digitá-lo." + }, + "howRuns": { + "heading": "Como o script é executado", + "body": "O fluxo tem duas fases com um filtro de segurança de porta tripla no meio. A lista de discos, o modo de operação e os detalhes do sistema de arquivos são todos coletados na Fase 1; nada é escrito até que a Fase 2 passe uma revalidação final logo antes de executar." + }, + "visibility": { + "heading": "Regras de visibilidade", + "intro": "Antes mesmo do menu aparecer, o ProxMenux filtra a lista de discos. Apenas os candidatos que são comprovadamente seguros são mostrados:", + "items": [ + "Mostrados: discos não utilizados pelo host (pool raiz, swap, montagens, ZFS/LVM/RAID ativos) e não referenciados em configurações de VM/LXC, em execução ou paradas.", + "Ocultos: discos do host e do sistema.", + "Ocultos: discos referenciados numa configuração VM/LXC." + ], + "safetyTitle": "Segurança na confirmação e execução", + "safetyItems": [ + "Os discos com metadados antigos ou ativos mostram avisos detalhados antes da confirmação.", + "Os discos utilizados por uma VM em execução são bloqueados sem exceção na confirmação.", + "Os discos com partições montadas são bloqueados sem exceção na execução. Uma nova verificação é realizada imediatamente antes de qualquer escrita.", + "São sempre necessárias duas confirmações: um diálogo sim/não e a introdução exata do caminho completo do disco." + ] + }, + "modes": { + "heading": "Modos de operação", + "intro": "Depois de escolher um disco você escolhe um dos quatro modos. Divergem no que destroem e no que deixam para trás.", + "headerMode": "Modo", + "headerPart": "Tabela de partições", + "headerData": "Dados", + "headerUseCase": "Caso de uso", + "rows": [ + { + "mode": "1. Limpar tudo", + "part": "Destruído", + "data": "Assinaturas apagadas", + "useCase": "Remove o particionamento e os metadados para preparar uma nova organização. Não sobrescreve todos os dados do utilizador." + }, + { + "mode": "2. Remover rótulos FS", + "part": "Preservado", + "data": "Preservado", + "useCase": "Remove assinaturas antigas de ZFS / LVM / RAID para evitar a utilização automática do disco. Os dados do utilizador não são sobrescritos em bloco, mas a remoção das assinaturas pode torná-los inacessíveis." + }, + { + "mode": "3. Sobrescrever os dados com zeros", + "part": "Preservado", + "data": "Destruídos (sobrescritos com zeros)", + "useCase": "Sobrescreve com zeros as partições existentes, mantendo a tabela de partições. Não abrange espaço não atribuído nem áreas de reserva dos SSD; não garante a sanitização completa do dispositivo." + }, + { + "mode": "4. Formato completo", + "part": "Novo GPT", + "data": "Destruído", + "useCase": "Disco pronto a usar com uma nova partição e um novo sistema de ficheiros." + } + ], + "fullFormatOutro": "Formato completo continua com duas janelas extras:", + "fullFormatItems": [ + "Filesystem — ext4, xfs, exfat (portátil), ou btrfs. As ferramentas em falta (por exemplo, mkfs.btrfs) abortam com uma mensagem clara.", + "Etiqueta: nome opcional do sistema de ficheiros para identificação." + ] + }, + "steps": { + "heading": "Passo a passo", + "stepLabel": "Etapa", + "list": [ + { + "title": "Escolha um disco livre", + "body": "O ProxMenux lista os discos que passam nos filtros acima. Os discos marcados com ⚠ contêm metadados antigos, apresentados em detalhe para saber o que vai sobrescrever." + }, + { + "title": "Escolha um modo de operação", + "bodyRich": "Escolha Limpar tudo, Remover rótulos FS, Sobrescrever os dados com zeros ou Formato completo de acordo com a tabela acima." + }, + { + "title": "(Apenas formato completo) Escolha o sistema de arquivos e a etiqueta", + "body": "ext4 / xfs / exfat / btrfs, além de uma etiqueta opcional." + }, + { + "title": "Confirmar duas vezes", + "bodyRich": "O ProxMenux mostra um resumo da operação. Aceite no diálogo sim/não e introduza o caminho completo do disco exatamente como indicado, por exemplo /dev/sdc. Qualquer outra entrada cancela a operação." + }, + { + "title": "Revalidação e execução", + "body": "Pouco antes de escrever, o script verifica novamente o estado do disco. Se uma partição tiver sido montada ou uma VM tiver sido iniciada, a execução será interrompida. Caso contrário, a operação escolhida é executada e um resumo é impresso no final." + } + ] + }, + "manual": { + "heading": "Equivalentes manuais", + "body": "Se preferir executar os comandos equivalentes à mão:" + }, + "troubleshoot": { + "notListedTitle": "Disco não listado no menu", + "notListedBody": "Foi filtrado por segurança. Razões comuns: é montado (mesmo em /mnt/tmp), é um ZFS / LVM / RAID membro, é referenciado por um VM ou LXC config, ou é seu disco raiz Proxmox. Execute lsblk -f e cat /proc/mdstat no host para entender o porquê.", + "busyTitle": "\"Disk may be busy\" / falha ao desmontar", + "busyBody": "Algo ainda está segurando um arquivo aberto em uma partição desse disco — na maioria das vezes um recipiente ou uma shell cujo cwd está dentro de um ponto de montagem. Identifique-o com lsof | grep /dev/sdX ou fuser -vm /dev/sdX1, pare-o e, em seguida, execute novamente a ferramenta." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "href": "/docs/disk-manager/smart-disk-test", + "label": "Integridade e teste do disco SMART", + "tail": " — verificar um disco antes / após limpar para confirmar que é saudável." + }, + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importar disco para VM", + "tail": " — passar um disco recém-formatado para um VM." + }, + { + "href": "/docs/storage-share/host-local-disk", + "label": "Adicionar o disco local como armazenamento Proxmox", + "tail": " — registar um disco apagado como conjunto de armazenamento Proxmox." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandos de armazenamento e discos", + "tail": " — referência de lsblk, blkid e parted." + }, + { + "href": "/docs/disk-manager", + "label": "Visão geral do Gerenciador de Discos", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/disk-manager/import-disk-image-vm.json b/web/messages/pt/docs/disk-manager/import-disk-image-vm.json new file mode 100644 index 00000000..0bdbe940 --- /dev/null +++ b/web/messages/pt/docs/disk-manager/import-disk-image-vm.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Importar imagem de disco para uma VM | Documentação ProxMenux", + "description": "Importar um arquivo de imagem de disco (.img / .qcow2 / .vmdk / .raw) para um Proxmox VM existente usando ProxMenux. Interface por imagem, emulação SSD e bandeira inicializável, com qm importdisk sob o capô.", + "ogTitle": "Importar imagem de disco para uma VM | Documentação ProxMenux", + "ogDescription": "Importar imagens de disco .img / .qcow2 / .vmdk / .raw para um VM existente com ProxMenux. Usa o 'qm importdisk' sob o capô." + }, + "header": { + "title": "Importar imagem de disco para VM", + "description": "Importar um arquivo de imagem de disco (.img, .qcow2, .vmdk ou .raw) para um Proxmox VM existente. ProxMenux coleta cada decisão inicial — destino VM, armazenamento Proxmox, diretório fonte, interface, emulação SSD, ordem de inicialização — e então executa qm importdisk para cada imagem selecionada.", + "section": "Gerenciador de disco · VM" + }, + "intro": { + "title": "O que isto faz", + "body": "Ao contrário de Importar disco para VM, que atribui um disco físico diretamente, este processo utiliza um ficheiro no host, exportado de outro hipervisor, transferido como imagem cloud ou extraído de uma cópia de segurança. Converte-o num disco de VM Proxmox no armazenamento escolhido. O original é preservado: o ProxMenux copia-o, não o move." + }, + "howRuns": { + "heading": "Como o script é executado", + "body": "O fluxo tem duas fases. A fase 1 recolhe todas as decisões (VM, armazenamento, directório de origem, imagens, opções de imagem) à frente através de diálogos. Fase 2 executa qm importdisk para cada imagem selecionada. Até o início da Fase 2, nada é copiado e a configuração VM não é tocada." + }, + "prereqs": { + "heading": "Pré-requisitos", + "items": [ + "Pelo menos uma VM definida no host. A VM de destino deve estar desligada.", + "Pelo menos um arquivo de imagem de um formato suportado no diretório fonte. Suportado: .img, .qcow2, .vmdk, .raw.", + "Espaço livre suficiente no armazenamento Proxmox alvo para segurar cada disco importado.", + "ProxMenux procura imagens em /var/lib/vz/template/iso por padrão. Você pode apontá-lo para qualquer outro diretório no host quando ele perguntar." + ] + }, + "steps": { + "heading": "Passo a passo", + "stepLabel": "Etapa", + "list": [ + { + "title": "Escolher a VM de destino", + "bodyRich": "ProxMenux lê qm list e mostra cada VM. Escolha o que receberá o(s) disco(s) importado(s)." + }, + { + "title": "Escolha o armazenamento do Proxmox", + "bodyRich": "A lista contém cada armazenamento que tem o tipo de conteúdo images habilitado. Se houver apenas um candidato, ele é selecionado automaticamente e a janela é ignorada." + }, + { + "title": "Escolha o diretório de origem", + "bodyRich": "Escolha o diretório padrão (/var/lib/vz/template/iso) ou digite um caminho personalizado — normalmente onde você baixou / enviou a imagem. O script rejeita caminhos que não existem." + }, + { + "title": "Escolha uma ou várias imagens", + "bodyRich": "O diretório é escaneado para arquivos .img / .qcow2 / .vmdk / .raw. Você pode selecionar vários de uma vez; cada um irá passar pelas opções por imagem no próximo passo." + }, + { + "title": "Opções por imagem", + "intro": "Para cada imagem selecionada, o ProxMenux pergunta:", + "items": [ + "Interface — scsi (padrão), virtio, sata ou ide. Corresponde à forma como o hóspede vai ver o disco.", + "Emulação SSD: apenas para interfaces que não sejam VirtIO. Adiciona ssd=1 para o sistema convidado reconhecer um disco de estado sólido. O suporte de discard/TRIM tem de ser configurado separadamente.", + "De arranque: se responder sim, o ProxMenux adiciona o disco à ordem de arranque como dispositivo principal da VM." + ] + }, + { + "title": "Importar e anexar", + "bodyRich": "O ProxMenux executa o qm importdisk para cada imagem (formato de conversão na hora, onde necessário), liga o disco resultante ao próximo slot livre (scsiN, sataN, ...) com as opções escolhidas e — se você marcou qualquer disco como inicializável — atualiza a ordem de inicialização. O progresso mostra-se no terminal." + } + ] + }, + "manual": { + "heading": "Equivalente manual", + "body": "A importação de uma única imagem corresponde a três comandos qm:", + "warnTitle": "Conversão do formato da imagem", + "warnBody": "Quando o armazenamento de destino não pode conter o formato de origem nativamente (por exemplo, o armazenamento LVM não pode conter .qcow2), qm importdisk converte a imagem de forma transparente. Isso pode levar vários minutos para imagens multi-GB; planejar de acordo com isso e não interromper o script." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "noImagesTitle": "\"Nenhuma imagem de disco compatível encontrada\"", + "noImagesBody": "O script não encontrou ficheiros .img, .qcow2, .vmdk ou .raw. Verifique a extensão, distinguindo maiúsculas e minúsculas, se o ficheiro está diretamente no diretório escolhido (os subdiretórios não são pesquisados) e se root o pode ler.", + "slowTitle": "A importação é lenta", + "slowBody": "As conversões entre VMDK, QCOW2 e raw podem ser limitadas pela CPU e E/S. A velocidade depende das leituras na origem, das escritas no destino e da eventual descompressão. Prefira fontes raw ou qcow2 quando possível.", + "uefiTitle": "O disco importado arranca na shell UEFI", + "uefiBody": "A imagem foi construída para legado (SeaBIOS), mas o VM usa OVMF (ou vice-versa). Alternar o VM do BIOS no Proxmox para corresponder à imagem, ou reconstruir a imagem no modo correto antes de importar." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importar disco para VM", + "tail": " — mesmo fluxo, mas para discos físicos brutos (passagem)." + }, + { + "href": "/docs/utils/import-vm", + "label": "Importar VM de OVA / OVF", + "tail": " — quando você tem um pacote completo VM, não apenas uma imagem de disco." + }, + { + "href": "/docs/utils/UUp-Dump-ISO-Creator", + "label": "Criador de ISO do UUP Dump", + "tail": " — gerar uma ISO do Windows se necessitar de uma nova instalação." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandos de armazenamento e discos", + "tail": " — referência de qm importdisk e qemu-img convert." + }, + { + "href": "/docs/disk-manager", + "label": "Visão geral do Gerenciador de Discos", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/disk-manager/import-disk-lxc.json b/web/messages/pt/docs/disk-manager/import-disk-lxc.json new file mode 100644 index 00000000..87e27693 --- /dev/null +++ b/web/messages/pt/docs/disk-manager/import-disk-lxc.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Importar o Disco para LXC | ProxMenux Documentação", + "description": "Anexar um disco físico a um recipiente LXC existente em Proxmox VE usando ProxMenux. Lida com detecção / formatação do sistema de arquivos, ponto de montagem, sem privilégios → conversões privilegiadas e caminhos persistentes do dispositivo.", + "ogTitle": "Importar o Disco para LXC | ProxMenux Documentação", + "ogDescription": "Anexar um disco físico a um recipiente LXC existente. Lida com sistema de arquivos, ponto de montagem e sem privilégios → conversão privilegiada." + }, + "header": { + "title": "Importar disco para LXC", + "description": "Ligue um disco físico a um contentor LXC existente no host Proxmox. O ProxMenux deteta discos livres, permite formatá-los com um sistema de ficheiros suportado e liga a partição a um ponto de montagem dentro do contentor através de caminhos persistentes do dispositivo.", + "section": "Gerenciador de disco · LXC" + }, + "intro": { + "title": "Passthrough em VM e em LXC", + "body": "Este passthrough LXC não fornece um dispositivo de bloco bruto. O contentor recebe um ponto de montagem, ou seja, um diretório numa partição escolhida no host. Ao contrário de uma VM, utiliza o kernel do host: o sistema de ficheiros (ext4/xfs/btrfs) é lido e gerido pelo host Proxmox e depois disponibilizado ao contentor." + }, + "howRuns": { + "heading": "Como o script é executado", + "body": "O fluxo tem duas fases com separação clara entre \"coletar informações e decisões\" e \"na verdade mudar a configuração do recipiente\". Até à confirmação final, nada é montado no CT.", + "summary": "O ProxMenux exclui o disco raiz, os discos montados e os referenciados em configurações VM/LXC. Os membros ativos de ZFS/LVM/RAID são ocultos; as assinaturas antigas aparecem com ⚠ para poderem ser apagadas antes da formatação." + }, + "prereqs": { + "heading": "Pré-requisitos", + "items": [ + "Pelo menos um recipiente LXC definido no hospedeiro.", + "O contentor é privilegiado ou aceita a conversão proposta pelo script.", + "Pelo menos um disco físico que não está em uso pelo host ou por qualquer outro convidado." + ], + "warnTitle": "Recipiente privilegiado necessário", + "warnBody": "Este script exige um contentor privilegiado para ligar diretamente o disco. Se detetar unprivileged: 1, oferece editar /etc/pve/lxc/<CTID>.conf no local. Isso altera o modelo de segurança sem remapear os proprietários dos ficheiros existentes. Faça uma cópia de segurança e verifique os proprietários antes de aceitar, ou recrie o contentor como privilegiado." + }, + "steps": { + "heading": "Passo a passo", + "stepLabel": "Etapa", + "list": [ + { + "title": "Escolher o contentor de destino", + "img": "/disk/select-container.png", + "caption": "Menu de seleção do contentor", + "bodyRich": "ProxMenux lista cada recipiente LXC no host (pct list). Escolha o que vai receber o disco. Se o recipiente não tiver privilégios, é-lhe oferecido converter agora." + }, + { + "title": "Escolha o disco físico", + "img": "/disk/disk-selection-ct.png", + "caption": "Discos livres detetados no host, com ⚠ para metadados antigos", + "bodyRich": "Só são mostrados candidatos seguros. Ao contrário do processo para VM, este script liga um disco por execução. Execute-o novamente para cada disco adicional." + }, + { + "title": "Formatar ou reutilizar", + "intro": "O script inspeciona o disco:", + "items": [ + "Se ele já carrega um sistema de arquivos suportado (ext4 / xfs / btrfs) você pode reutilizá-lo como está (os arquivos existentes são preservados).", + "Se não tiver nenhum sistema de arquivos suportado, você é oferecido para formatá-lo. Escolha ext4 / xfs / btrfs." + ] + }, + { + "title": "Escolha o ponto de montagem", + "bodyRich": "Introduza o caminho onde o contentor verá o disco, por exemplo /mnt/data ou /mnt/disk_passthrough. É o caminho dentro do contentor; o host já vê a partição em /dev/disk/by-id/…." + }, + { + "title": "Anexar e verificar", + "img": "/disk/assignment-ct.png", + "caption": "Atribuição a CT", + "bodyRich": "O ProxMenux adiciona uma entrada mpN: nova à configuração do recipiente, ignorando índices já em uso e re-leia a configuração para confirmar. Se o recipiente estiver rodando, a montagem será executada ao vivo; caso contrário, fará efeito no próximo início.", + "extraImg": "/disk/result-point.png", + "extraAlt": "Ponto de montagem criado com sucesso", + "extraCaption": "Ponto de montagem criado e verificado" + } + ] + }, + "manual": { + "heading": "Equivalente manual", + "body": "O script envolve pct set. Uma invocação direta para um único disco parece:" + }, + "important": { + "heading": "Considerações importantes", + "items": [ + "Um disco por execução. Repita o script para cada disco adicional.", + "Não ligue a mesma partição a vários contentores que a possam montar simultaneamente: escritas concorrentes corrompem o sistema de ficheiros.", + "Os metadados antigos (assinaturas RAID/ZFS/LVM) têm de ser apagados manualmente antes de o script permitir a formatação; caso contrário, mkfs recusa sobrescrever. Utilize Formatar ou apagar um disco físico." + ] + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "unprivTitle": "\"Não posso continuar com um contentor sem privilégios\"", + "unprivBody": "Recusou a conversão. Em /etc/pve/lxc/<CTID>.conf, a opção passa de unprivileged: 1 para unprivileged: 0, mas isso não converte por si só os UID/GID dos ficheiros existentes. Faça uma cópia de segurança e trate do mapeamento de proprietários antes da conversão no local; em alternativa, restaure ou recrie o contentor como privilegiado.", + "permsTitle": "Permissões dentro do recipiente estão erradas", + "permsBody": "Montar uma partição num contentor privilegiado mantém os proprietários existentes; um sistema de ficheiros novo pertence frequentemente a root:root. Se o serviço usar outro utilizador, por exemplo www-data para Nextcloud, verifique o UID/GID e ajuste os ficheiros necessários com chown/chmod. As alterações também afetam o disco subjacente." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importar disco para VM", + "tail": " — fluxo equivalente para VMs." + }, + { + "href": "/docs/storage-share/lxc-mount-points", + "label": "Pontos de montagem LXC (Host ↔ CT)", + "tail": " — compartilhar diretórios de host com um CT em vez de anexar um disco inteiro." + }, + { + "href": "/docs/help-info/vm-ct-commands", + "label": "Comandos de gestão VM e CT", + "tail": " — pct config / push / pull referência." + }, + { + "href": "/docs/disk-manager", + "label": "Visão geral do Gerenciador de Discos", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/disk-manager/import-disk-vm.json b/web/messages/pt/docs/disk-manager/import-disk-vm.json new file mode 100644 index 00000000..eea26349 --- /dev/null +++ b/web/messages/pt/docs/disk-manager/import-disk-vm.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Importar o Disco para VM | ProxMenux Documentação", + "description": "Anexar um disco físico a um Proxmox VM existente com ProxMenux. Detecção segura de disco (exclui sistema, montado, em uso, ZFS/RAID/LVM), caminhos /dev/disk/by-id persistentes e interfaces SATA / SCSI / VirtIO / IDE.", + "ogTitle": "Importar o Disco para VM | ProxMenux Documentação", + "ogDescription": "Anexar um disco físico a um Proxmox VM existente. Usa caminhos /dev/disk/by-id persistentes e suporta SATA / SCSI / VirtIO / IDE." + }, + "header": { + "title": "Importar disco para VM", + "description": "Anexar um disco físico que já existe na máquina Proxmox a uma máquina virtual existente. ProxMenux detecta discos livres, permite que você escolha o alvo VM, o tipo de barramento (SATA / SCSI / VirtIO / IDE) e liga tudo usando caminhos /dev/disk/by-id persistentes para que o mapeamento sobreviva a reinicialização e alterações de ordem do dispositivo.", + "section": "Gerenciador de disco · VM" + }, + "intro": { + "title": "O que isto faz", + "body": "Liga um disco físico bruto como dispositivo subjacente de uma interface de disco virtual. O sistema convidado não recebe automaticamente os dados SMART nativos nem as funções do controlador físico; utilize passthrough PCI do controlador se forem necessários. O disco é ligado por /dev/disk/by-id/…, não por /dev/sdX, para manter a atribuição se a ordem dos dispositivos mudar no arranque." + }, + "howRuns": { + "heading": "Como o script é executado", + "body": "O fluxo tem duas fases com separação clara entre \"coletar informações e decisões\" e \"realmente anexar discos ao VM\". Até a confirmação final, a configuração VM não é tocada.", + "summary": "O ProxMenux exclui candidatos inseguros: disco raiz, discos montados no host, membros ativos ZFS/LVM/RAID e discos referenciados em configurações VM/LXC. Os discos com metadados antigos, ou seja, assinaturas ZFS/RAID/LVM já não utilizadas, aparecem com ⚠ mas não são bloqueados." + }, + "prereqs": { + "heading": "Pré-requisitos", + "items": [ + "Pelo menos um VM definido no host (o script envia diretamente para qm list).", + "A VM de destino está desligada. Se estiver em execução, o script para com uma mensagem; a adição de discos em funcionamento não faz parte deste processo.", + "Pelo menos um disco físico no host que não está em uso pelo host ou qualquer outro hóspede." + ] + }, + "steps": { + "heading": "Passo a passo", + "stepLabel": "Etapa", + "list": [ + { + "title": "Escolher a VM de destino", + "bodyRich": "O ProxMenux lista todas as VM do host com qm list. Escolha a que receberá o disco. Se estiver em execução, o script para e pede que a desligue primeiro." + }, + { + "title": "Escolha o( s) disco( s) físico( s) a anexar", + "img": "/disk/disk-selection.png", + "caption": "Discos livres detetados no host, com ⚠ para metadados antigos", + "body": "O script examina os discos do host e mostra apenas os que podem ser ligados sem conflitos. Pode selecionar vários. Os discos com assinaturas antigas ZFS/LVM/RAID continuam visíveis com ⚠ para indicar que as assinaturas devem ser apagadas antes de o sistema convidado os formatar." + }, + { + "title": "Escolha a interface de barramento", + "img": "/disk/disk-assigment.png", + "caption": "Seleção da interface de barramento", + "intro": "Escolha como o hóspede deve ver o disco:", + "items": [ + "SCSI — padrão moderno para Linux e Windows com drivers VirtIO-SCSI instalados.", + "SATA — ampla compatibilidade, funciona fora da caixa em praticamente todos os hóspedes.", + "VirtIO: dispositivo de bloco paravirtualizado eficiente; exige controladores de software no sistema convidado.", + "IDE — para os hóspedes legados que não possuem nenhum dos drivers acima." + ] + }, + { + "title": "Anexar e verificar", + "bodyRich": "ProxMenux liga cada disco selecionado com seu melhor caminho /dev/disk/by-id/, salta os índices de slot que já estão em uso na configuração VM (scsi0, sata0, ...) e re-ler a configuração para confirmar a atribuição. Um resumo é impresso no final." + } + ] + }, + "manual": { + "heading": "Equivalente manual", + "body": "O script é uma embalagem em torno de qm set. O comando exato para um único disco se parece com este:", + "migrationTitle": "A migração ao vivo não é possível", + "migrationBody": "Uma VM com um disco físico ligado diretamente fica dependente do host que disponibiliza esse disco. Outro nó normalmente não tem o mesmo caminho /dev/disk/by-id/… nem os dados. Faça cópias de segurança e transfira os dados separadamente, ou utilize discos virtuais geridos em armazenamento partilhado ou com replicação suportada. Não pressuponha que a replicação do Proxmox abrange este dispositivo.", + "shareTitle": "Não compartilhar um disco físico entre VMs", + "shareBody": "Anexar o mesmo disco físico a duas VMs ao mesmo tempo irá corromper os dados na próxima gravação. ProxMenux detecta esta situação e bloqueia-a, mas se você ignorar o script (direto qm set), certifique-se de que apenas um convidado monta o disco." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "noDisksTitle": "\"Nenhum disco disponível para este VM\"", + "noDisksIntro": "O script encontrou discos, mas todos os candidatos foram filtrados. Razões comuns:", + "noDisksItems": [ + "Cada disco restante já está referenciado na configuração do VM.", + "Cada disco restante é montado na máquina ou faz parte de um ZFS / LVM / RAID ativo.", + "A máquina só tem o disco raiz instalado." + ], + "noDisksOutro": "Execute lsblk -f no host para rever o estado de cada disco.", + "noVisibleTitle": "O VM não vê o disco após o arranque", + "noVisibleBody": "Se você escolheu SCSI ou VirtIO, o hóspede precisa do driver correspondente. No Linux que é nativo do kernel; no Windows você precisa da ISO VirtIO e de uma instalação de driver (veja a página Criar VM: Sistema Windows). Mudar para SATA na guia de hardware do VM é uma solução rápida para confirmar que o disco está fisicamente ligado." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "href": "/docs/disk-manager/import-disk-image-vm", + "label": "Importar imagem de disco para VM", + "tail": " — mesmo fluxo mas para arquivos de imagem (qcow2 / vmdk / raw / img)." + }, + { + "href": "/docs/disk-manager/import-disk-lxc", + "label": "Importar disco para LXC", + "tail": " — processo equivalente para contentores LXC." + }, + { + "href": "/docs/disk-manager/add-controller-nvme-vm", + "label": "Adicionar controlador ou NVMe a uma VM", + "tail": " — quando necessitar de uma passagem completa PCIe / NVMe em vez de anexar o disco." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandos de armazenamento e discos", + "tail": " — qm importdisk e referência de shell correspondente." + }, + { + "href": "/docs/disk-manager", + "label": "Visão geral do Gerenciador de Discos", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/disk-manager/index.json b/web/messages/pt/docs/disk-manager/index.json new file mode 100644 index 00000000..53d3d344 --- /dev/null +++ b/web/messages/pt/docs/disk-manager/index.json @@ -0,0 +1,135 @@ +{ + "meta": { + "title": "Gestor de discos Proxmox: VM/LXC, testes SMART e eliminação | ProxMenux", + "description": "Faça a gestão de discos físicos num host Proxmox VE com o ProxMenux: ligue discos a VM ou LXC (qm set scsi/sata/virtio, pct mp), importe imagens img / qcow2 / vmdk / raw, atribua HBA ou controladores NVMe completos, apague discos com verificações de segurança e execute autotestes SMART.", + "ogTitle": "Gerenciador de disco Proxmox — Anexar discos a VMs / LXC, testes SMART, limpa", + "ogDescription": "Anexar discos a VMs / LXC, importar imagens de disco, passagem PCI para controladores, limpeza segura e testes SMART em Proxmox VE.", + "twitterTitle": "Gestor de discos Proxmox | ProxMenux", + "twitterDescription": "Anexar discos a VMs / LXC, imagens de importação, passagem PCI, limpeza segura e testes SMART." + }, + "header": { + "title": "Gerenciador de disco", + "description": "O menu Gerenciador de disco agrupa as ferramentas ProxMenux para lidar com discos físicos em um host Proxmox: anexar discos em recipientes VMs e LXC, importar imagens de disco, passar por um controlador inteiro ou dispositivo NVMe, limpar discos com segurança e executar testes de saúde SMART.", + "section": "Gerenciador de disco" + }, + "intro": { + "title": "Para que serve este menu", + "body": "Estas ferramentas trabalham com discos físicos visíveis ao host Proxmox e ficheiros de imagem nele guardados. Há três grupos: VM (ligar discos ou importar imagens), LXC (ligar discos a um contentor) e Utilitários (formatação e estado SMART). As operações de ligação e eliminação ocultam ou bloqueiam discos de sistema e em uso; as verificações SMART podem examiná-los sem os apagar." + }, + "opening": { + "heading": "Abrir o menu", + "body": "No menu principal do ProxMenux, selecione Disk Manager. Você verá isto:", + "imageAlt": "Menu Gerenciador de disco com blocos VM, LXC e Utilitários" + }, + "groups": { + "heading": "Três grupos de ferramentas", + "intro": "O menu está organizado em três grupos: VM, LXC e Utilitários. Clique num cartão para ir diretamente às ferramentas desse grupo.", + "vmTitle": "VM", + "vmBody": "Ferramentas que operam em máquinas virtuais existentes. O VM deve ser desligado; o ProxMenux valida isto antes de tocar na configuração.", + "vmItems": [ + "Importar disco para VM", + "Importar imagem de disco para VM", + "Adicionar controlador ou NVMe a uma VM" + ], + "lxcTitle": "LXC", + "lxcBody": "Ferramentas para contentores LXC existentes. Este script exige um contentor privilegiado e oferece alterar a opção quando necessário. Leia primeiro os cuidados sobre conversão e propriedade dos ficheiros na página da ferramenta.", + "lxcItems": [ + "Importar disco para LXC" + ], + "utilitiesTitle": "Utilitários", + "utilitiesBody": "Ferramentas do lado do hospedeiro que operam nos próprios discos, independentemente de qualquer VM ou recipiente.", + "utilitiesItems": [ + "Formatar ou apagar um disco físico", + "Integridade e teste do disco SMART" + ] + }, + "vm": { + "heading": "VM", + "intro": "Ferramentas que operam em máquinas virtuais existentes. O VM deve ser desligado; o ProxMenux valida isto antes de tocar na configuração.", + "options": [ + { + "icon": "HardDrive", + "href": "/docs/disk-manager/import-disk-vm", + "title": "Importar disco para VM", + "description": "Anexar um disco físico não atribuído a um VM existente. Suporta SATA / SCSI / VirtIO / IDE, usa caminhos /dev/disk/by-id persistentes." + }, + { + "icon": "FileDown", + "href": "/docs/disk-manager/import-disk-image-vm", + "title": "Importar imagem de disco para VM", + "description": "Importar arquivos de imagem de disco (.img / .qcow2 / .vmdk / .raw) para um VM existente. Fluxo bifásico, qm importdisk sob o capô." + }, + { + "icon": "Cpu", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "title": "Adicionar controlador ou NVMe a uma VM", + "description": "Passagem PCI de um dispositivo inteiro SATA / SAS HBA ou NVMe para um VM. Lida com habilitação IOMMU e detecção de conflitos." + } + ] + }, + "lxc": { + "heading": "LXC", + "intro": "Ferramentas para contentores LXC existentes. Este script exige um contentor privilegiado e oferece alterar a opção quando necessário. Leia primeiro os cuidados sobre conversão e propriedade dos ficheiros na página da ferramenta.", + "options": [ + { + "icon": "Boxes", + "href": "/docs/disk-manager/import-disk-lxc", + "title": "Importar disco para LXC", + "description": "Anexar um disco físico não atribuído a um recipiente LXC existente como ponto de montagem. Lida com detecção / formato do sistema de arquivos e conversão privilegiada." + } + ] + }, + "utilities": { + "heading": "Utilitários", + "intro": "Ferramentas do lado do hospedeiro que operam nos próprios discos, independentemente de qualquer VM ou recipiente.", + "options": [ + { + "icon": "Eraser", + "href": "/docs/disk-manager/format-disk", + "title": "Formatar/limpar disco físico (seguro)", + "description": "Limpar o disco seguro com controles de segurança rigorosos: apenas discos totalmente livres são mostrados e uma confirmação dupla é sempre necessária." + }, + { + "icon": "Activity", + "href": "/docs/disk-manager/smart-disk-test", + "title": "Integridade e teste do disco SMART", + "description": "Execute verificações de saúde SMART e auto-testes curtos / longos em unidades SATA, SAS e NVMe. Exporta JSON para o Monitor." + } + ] + }, + "safety": { + "title": "Regras de segurança para ligação e eliminação de discos", + "intro": "As operações de ligação e eliminação excluem dispositivos que possam prejudicar o host:", + "items": [ + "O disco de sistema, o pool raiz, o swap e os membros ativos de ZFS/LVM/RAID ficam sempre ocultos.", + "Os discos montados em qualquer ponto do host são ocultos ou bloqueados na execução.", + "Os discos referenciados por um VM ou LXC em execução não podem ser reatribuídos ou apagados.", + "Operações que podem alterar o estado host (IOMMU habilitar, limpar) requerem confirmação explícita." + ] + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "href": "/docs/storage-share", + "label": "Gerenciador de armazenamento e compartilhamento", + "tail": " — registro de armazenamento no próprio Proxmox (NFS / Samba / iSCSI / local) e compartilhar pastas entre host e CTs." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandos de armazenamento e discos", + "tail": " — referência de dispositivos de bloco, LVM, pvesm e SMART." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Comandos de gerenciamento ZFS", + "tail": " — para conjuntos e conjuntos de dados ZFS." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Adicionar GPU a uma VM (passthrough)", + "tail": " — os mesmos conceitos IOMMU / VFIO aplicados às GPU." + } + ] + } +} diff --git a/web/messages/pt/docs/disk-manager/smart-disk-test.json b/web/messages/pt/docs/disk-manager/smart-disk-test.json new file mode 100644 index 00000000..7eba6a83 --- /dev/null +++ b/web/messages/pt/docs/disk-manager/smart-disk-test.json @@ -0,0 +1,146 @@ +{ + "meta": { + "title": "Estado e testes SMART do disco | Documentação ProxMenux", + "description": "Executar SMART controlos de saúde e testes de disco em Proxmox VE com ProxMenux. Suporta SATA / SAS (smartmontools) e NVMe (nvme-cli). Auto-testes curtos e longos, JSON exportação para ProxMenux Monitor integração.", + "ogTitle": "Estado e testes SMART do disco | Documentação ProxMenux", + "ogDescription": "Verificações de saúde e auto-testes de SMART para unidades SATA / SAS e NVMe em Proxmox. Exportação JSON para o Monitor." + }, + "header": { + "title": "Integridade e teste do disco SMART", + "description": "Leia dados do SMART e ative auto-testes nos discos físicos ligados ao host Proxmox. ProxMenux auto-instala smartmontools para SATA / SAS e nvme-cli para NVMe, executa a ação dentro do firmware da unidade (os testes longos sobrevivem ao encerramento do terminal) e exporta os resultados JSON para o ProxMenux Monitor.", + "section": "Gerenciador de disco · Utilitários" + }, + "intro": { + "title": "Para que serve isto?", + "body": "SMART (Auto-Monitoramento, Análise e Tecnologia de Relatórios) permite que a própria unidade relate sua saúde e execute auto-testes. Esta ferramenta expõe que os dados sem que você precise se lembrar da invocação correta smartctl / nvme, e persiste a saída como JSON, para que o Monitor possa grafar tendências ao longo do tempo." + }, + "howRuns": { + "heading": "Como o script é executado", + "body": "Todas as ações aqui são não destrutivas — SMART lê os contadores de firmware da unidade, e os auto-testes estão em fila dentro da própria unidade. Nenhuma separação de fases é necessária. O fluxo é: verificação de dependência → seleção de disco → seleção de ação → invocação de ferramenta (smartctl ou nvme-cli dependendo do barramento de disco) → saída impressa mais exportação de JSON para o Monitor." + }, + "deps": { + "heading": "Dependências", + "body": "A ferramenta auto-instala o que precisa na primeira execução. As unidades SATA / SAS dependem do smartmontools; as unidades NVMe dependem do nvme-cli. Ambos:" + }, + "actions": { + "heading": "Acções disponíveis", + "headerAction": "Ação", + "headerWhat": "O que lê / roda", + "headerDur": "Duração", + "rows": [ + { + "action": "Estado de saúde rápido", + "whatRich": "Total PASSED/FAILED + atributos-chave.
smartctl -H + -A (SATA/SAS) ou nvme smart-log (NVMe).", + "dur": "Instantânea" + }, + { + "action": "Relatório completo", + "whatRich": "Dados SMART completos, com deslocamento. smartctl -x para SATA/SAS ou nvme smart-log + id-ctrl para NVMe.", + "dur": "Instantânea" + }, + { + "action": "Teste curto", + "what": "Verificação básica de superfície e elétrica, em fila dentro do firmware da unidade.", + "dur": "~2 minutos" + }, + { + "action": "Ensaio longo", + "what": "Varredura completa de toda a superfície. Funciona no hardware da unidade — persiste mesmo se você fechar o terminal.", + "dur": "Horas (dependentes do tamanho do disco)" + }, + { + "action": "Verificar o progresso do teste", + "what": "Estado do auto-teste ativo ou mais recente.", + "dur": "Instantânea" + } + ], + "tipTitle": "Longos testes sobrevivem ao encerramento do terminal", + "tipBody": "Um teste longo corre dentro do disco e não depende do processo ProxMenux continuar ativo. Pode fechar o terminal e voltar a Verificar o progresso do teste. Um reinício do host, uma reposição do controlador ou uma falha de energia pode interromper o teste e a recolha de resultados; não pressuponha que retoma automaticamente." + }, + "json": { + "heading": "Exportação de JSON para o Monitor", + "intro": "As ações de estado, teste curto e progresso guardam um JSON com data e hora em /usr/local/share/proxmenux/smart/<disk>/; os resultados dos testes longos são recolhidos em segundo plano. O relatório completo é apenas apresentado. A estrutura é:", + "outro": "O ProxMenux Monitor utiliza estes ficheiros para mostrar a evolução do estado de cada disco. Os ficheiros antigos são eliminados automaticamente ao atingir o limite de retenção." + }, + "steps": { + "heading": "Passo a passo", + "stepLabel": "Etapa", + "list": [ + { + "title": "Escolha um disco", + "body": "ProxMenux lista cada disco físico no host com seu modelo e tamanho. Ao contrário da ferramenta Format, esta lista não é filtrada pela segurança — ler SMART é uma operação não destrutiva.", + "img": "/disk/smart/disk-selection.png", + "alt": "Menu de seleção de disco SMART", + "caption": "Menu de seleção de disco SMART" + }, + { + "title": "Escolha uma ação", + "body": "Escolha entre estado de saúde rápido, relatório completo, teste curto, teste longo ou check progress. O menu fica aberto após cada ação para que você possa encadear várias consultas contra o mesmo disco.", + "img": "/disk/smart/action-menu.png", + "alt": "Menu de ação SMART", + "caption": "Menu de ação SMART (ações 5 + cancelamento)" + }, + { + "title": "(Apenas teste longo) Confirmar execução em segundo plano", + "body": "O ProxMenux informa que o teste continuará após fechar o terminal e mostra onde será guardado o resultado JSON. Aceite para iniciar o teste.", + "img": "/disk/smart/long-test-warning.png", + "alt": "Diálogo de confirmação de teste longo", + "caption": "Confirmação de teste longa — roda em segundo plano, resultado salvo em JSON" + }, + { + "title": "Rever os resultados", + "bodyRich": "O estado e os relatórios são apresentados no terminal; o JSON é exportado para as ações descritas acima, exceto Relatório completo. Para testes longos, volte a Verificar o progresso do teste no mesmo disco.", + "img": "/disk/smart/quick-status.png", + "alt": "Saída rápida do estado de saúde", + "caption": "Saída rápida do estado de saúde (SATA — smartctl -H + -A)" + } + ] + }, + "manual": { + "heading": "Equivalentes manuais", + "nvmeWarnTitle": "Os autotestes NVMe dependem do firmware do disco", + "nvmeWarnBody": "Nem toda unidade NVMe suporta o comando de auto-teste curto/longo. Se uma unidade recusar o teste, o log SMART e os dados do controlador de ID (nvme smart-log + id-ctrl) ainda são o sinal de saúde mais confiável." + }, + "troubleshoot": { + "heading": "Resolução de Problemas", + "noSmartTitle": "\"Não foi possível ler dados SMART de /dev/sdX\"", + "noSmartBody": "O disco pode estar ligado a um controlador RAID/SAS que não transmite SMART. Com placas megaraid, tente smartctl -d megaraid,N /dev/sdX. Com HBA em modo IT, a chamada direta funciona.", + "longTitle": "O teste longo nunca termina", + "longBody": "O teste corre no firmware e uma carga elevada de E/S pode atrasá-lo. Tente num período calmo, como durante a noite. Em SATA/SAS, smartctl -c mostra a percentagem restante; o registo de autotestes indica o resultado e eventuais LBA com erros. Uma falha de leitura exige investigação; a lentidão, por si só, não prova um setor danificado." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "href": "/docs/disk-manager/format-disk", + "label": "Formatar ou apagar um disco físico", + "tail": " — reutilizar um disco após confirmar que é saudável." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Comandos de armazenamento e discos → Estado SMART", + "tail": " — referência smartctl / nvme." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Comandos de gerenciamento ZFS", + "tail": " — zpool scrub verifica as somas de controlo dos dados ZFS e complementa os testes SMART do hardware." + }, + { + "href": "/docs/monitor/dashboard/storage", + "label": "ProxMenux Monitor — Página de armazenamento", + "tail": " — vista detalhada do disco que utiliza o JSON aqui exportado: tabela SMART completa, histórico e relatório PDF." + }, + { + "href": "/docs/monitor/dashboard/hardware", + "label": "ProxMenux Monitor — Página de hardware", + "tail": " — Resumo de armazenamento com modelo, capacidade e velocidade de ligação negociada (atual vs máximo em NVMe)." + }, + { + "href": "/docs/disk-manager", + "label": "Visão geral do Gerenciador de Discos", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/sk/docs/disk-manager/add-controller-nvme-vm.json new file mode 100644 index 00000000..1f8a0385 --- /dev/null +++ b/web/messages/sk/docs/disk-manager/add-controller-nvme-vm.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Pridať radič alebo NVMe do VM | Dokumentácia ProxMenux", + "description": "Sprístupnenie radiča úložiska SATA/SAS HBA alebo zariadenia NVMe virtuálnemu stroju Proxmox cez PCI passthrough pomocou ProxMenuxu. Nástroj zabezpečuje aktiváciu IOMMU, rozpoznanie konfliktov a priradenie cez qm set --hostpci.", + "ogTitle": "Pridať radič alebo NVMe do VM | Dokumentácia ProxMenux", + "ogDescription": "Priraďte celý HBA SATA/SAS alebo zariadenie NVMe virtuálnemu stroju Proxmox. ProxMenux zabezpečí IOMMU, rozpoznanie konfliktov a priradenie hostpci." + }, + "header": { + "title": "Pridať radič alebo NVMe do VM", + "description": "Priraďte celý adaptér SATA/SAS HBA alebo zariadenie NVMe virtuálnemu stroju Proxmox cez PCI passthrough. ProxMenux skontroluje IOMMU a s vaším súhlasom ho aktivuje, vyhľadá vhodné zariadenia, vylúči konflikty a zapíše priradenie pomocou qm set --hostpci.", + "section": "Správca disku · VM" + }, + "intro": { + "title": "Čo to robí (a nerobí)", + "body": "Toto je priechod na úrovni zariadenia: karta PCIe opustí pohľad hostiteľského jadra a je viazaná na vfio-pci. VM vidí samotný radič – nie jednotlivé disky za ním – a načíta svoj vlastný ovládač pre tento presný model. Každý disk pripojený k tomuto radiču ho nasleduje automaticky, s natívnymi SMART údajmi, úplnými funkciami firmvéru a bez vrstvy Proxmox medzi nimi." + }, + "howRuns": { + "heading": "Ako beží skript", + "body": "Postup má dve oddelené fázy: zhromaždenie informácií, kontrolu IOMMU a výpis vhodných zariadení; potom samotné pripojenie zariadenia PCI. Až do záverečného potvrdenia sa do konfigurácie VM nič nezapisuje." + }, + "iommu": { + "heading": "Skupiny IOMMU: prečo treba posudzovať celú kartu", + "body": "Hranicou izolácie PCI passthrough je skupina IOMMU, najmenšia jednotka, ktorú IOMMU procesora dokáže izolovať. Zariadenia v rovnakej skupine nemožno izolovať navzájom. Ak radič SATA zdieľa skupinu s radičom USB, passthrough SATA môže vyžadovať aj uvoľnenie USB z hostiteľa alebo nemusí byť možný. Automaticky nepriradí VM všetky zariadenia skupiny.", + "outro": "ProxMenux zobrazuje skupinu IOMMU pri každom zariadení a upozorní, ak skupina obsahuje aj iné zariadenia než požadovaný radič. Môžete pokračovať, ak sú tieto ďalšie zariadenia prijateľné, napríklad ak sú všetky radičmi diskov, alebo sa vrátiť späť." + }, + "prereqs": { + "heading": "Predpoklady", + "items": [ + "CPU a základná doska podporujú VT-d (Intel) alebo AMD-Vi a funkcia je povolená vo firmvéri (BIOS/UEFI). ProxMenux môže upraviť nastavenie jadra, ale nemôže prepnúť nastavenie firmvéru.", + "Cieľová VM je pred pripojením zariadení PCI vypnutá.", + "Radič/NVMe nie je ten, na ktorom sa nachádza koreňový súborový systém Proxmox. Skript skryje všetko, čo hostiteľ používa.", + "Hosťujúci OS má ovládače pre model radiča. Linux pokrýva prakticky každý HBA hneď po vybalení; Windows potrebuje nainštalovaný ovládač od dodávateľa pred spustením s pripojeným radičom." + ], + "warnTitle": "Živá migrácia nie je možná", + "warnBody": "VM s PCI passthrough je viazaná na uzol, v ktorom je karta fyzicky osadená. Živá migrácia medzi uzlami zlyhá. Prispôsobte tomu zálohovanie a replikáciu." + }, + "steps": { + "heading": "Krok za krokom", + "stepLabel": "Krok", + "list": [ + { + "title": "Vyberte cieľovú VM", + "bodyRich": "ProxMenux načíta qm list a zobrazí všetky VM. Vyberte tú, ktorej chcete priradiť radič.", + "img": "/disk/nvme-passthrough/vm-selection.png", + "alt": "dialóg výberu VM", + "caption": "dialóg výberu VM" + }, + { + "title": "Kontrola IOMMU", + "bodyRich": "Ak IOMMU nie je povolené v príkazovom riadku jadra, ProxMenux ponúkne jeho aktiváciu. Upraví /etc/kernel/cmdline pre systemd-boot alebo /etc/default/grub pre GRUB a pridá správny parameter pre váš CPU:", + "items": [ + "intel_iommu=on pre procesory Intel.", + "amd_iommu=on pre CPU AMD." + ], + "outro": "Po tejto zmene je potrebný reštart. Skript ponúkne reštart teraz alebo neskôr; passthrough nemôže pokračovať, kým nie je aktívny nový príkazový riadok jadra.", + "img": "/disk/nvme-passthrough/iommu-warning.png", + "alt": "Dialóg IOMMU je vyžadované", + "caption": "IOMMU je vyžadované: ponuka aktivácie a reštartu" + }, + { + "title": "Výpis zariadení", + "body": "ProxMenux vypíše všetky radiče úložiska (HBA SATA/SAS) a všetky zariadenia NVMe na zbernici PCI. Pri každom zariadení zobrazí:", + "items": [ + "Adresa PCI (00:17.0, 01:00.0, ...).", + "Dodávateľ / popis zariadenia.", + "Skupina IOMMU a upozornenie ⚠, ak ju zdieľajú ďalšie nesúvisiace zariadenia.", + "Disky aktuálne pripojené k radiču, aby ste vedeli, ktoré s ním prejdú do VM." + ], + "img": "/disk/nvme-passthrough/device-list.png", + "alt": "Výpis radičov a zariadení NVMe", + "caption": "Výpis radičov a zariadení NVMe s informáciami o skupine IOMMU" + }, + { + "title": "Odhalenie konfliktov", + "bodyRich": "Skript zablokuje jednoznačne nebezpečné zariadenia: už priradené inej VM cez hostpci v jej konfigurácii, používané hostiteľom, napríklad radič koreňového disku, alebo zaradené v skupine IOMMU, ktorej ostatných členov nedokáže bezpečne identifikovať. Vhodné zariadenia sú dostupné na výber.", + "img": "/disk/nvme-passthrough/conflict-warning.png", + "alt": "Upozornenie na zistený konflikt", + "caption": "Rozpoznanie konfliktu: zariadenie zablokované s uvedením dôvodu" + }, + { + "title": "Pripojiť a dokončiť", + "bodyRich": "Pre každé vybrané zariadenie ProxMenux spustí qm set <VMID> --hostpciN <pci-addr>,pcie=1 a vyberie ďalší voľný slot hostpci. Ak sa počas tejto relácie aktivovalo IOMMU, pripomenie potrebu reštartu pred spustením VM.", + "img": "/disk/nvme-passthrough/assignment.png", + "alt": "Prehľad priradenia", + "caption": "Prehľad priradenia: sloty hostpciN a pripojené adresy PCI" + } + ] + }, + "manual": { + "heading": "Ručný ekvivalent" + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "noGroupsTitle": "IOMMU povolené, ale žiadne skupiny pod /sys/kernel/iommu_groups/", + "noGroupsBody": "Na uplatnenie príkazového riadka jadra je potrebný reštart. Ak skupiny chýbajú aj po reštarte, VT-d/AMD-Vi je pravdepodobne vypnuté vo firmvéri: skontrolujte nastavenia BIOS/UEFI.", + "busyTitle": "VM sa nespustí: \"hostpciN: device busy\"", + "busyBody": "Iný proces stále drží PCI zariadenie. Najčastejšie príčiny: predchádzajúci VM, ktorý zlyhal bez jeho uvoľnenia, alebo ho hostiteľské jadro získalo späť pri poslednom spustení. Spustite lspci -nnk -s <addr> a zistite, ktorý ovládač je viazaný; malo by to byť vfio-pci. Úplný reštart hostiteľa to zvyčajne vymaže.", + "noDisksTitle": "Hosť vidí radič, ale nie disky", + "noDisksBody": "V hosťovi chýba ovládač pre daný model radiča. V Linuxe je to zriedkavé, vo Windowse sa to stáva: nainštalujte ovládač výrobcu, napríklad LSI/Broadcom pre staršie HBA SAS, keď karta nie je priradená, a potom reštartujte s priradenou kartou.", + "sharedTitle": "Skupina IOMMU obsahuje nesúvisiace zariadenie", + "sharedBody": "Možnosti: (a) presunúť kartu do iného slotu PCIe a zmeniť tak jej skupinu, (b) zapnúť ACS override v jadre na rozdelenie skupín (bezpečnostný kompromis, pred použitím si ho preštudujte), alebo (c) vybrať inú kartu v lepšie izolovanej skupine." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importovať disk do VM", + "tail": " — alternatíva: pripojiť fyzický disk cez Proxmox bez úplného PCIe passthrough." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Pridať GPU do VM (passthrough)", + "tail": " — Rovnaké IOMMU / VFIO koncepty použité na GPU." + }, + { + "href": "/docs/help-info/gpu-commands", + "label": "Príkazy pre GPU passthrough", + "tail": " — príkazy na overenie IOMMU platia aj pre passthrough radiča alebo NVMe." + }, + { + "href": "/docs/disk-manager", + "label": "Prehľad správcu diskov", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/disk-manager/format-disk.json b/web/messages/sk/docs/disk-manager/format-disk.json new file mode 100644 index 00000000..a3cd9645 --- /dev/null +++ b/web/messages/sk/docs/disk-manager/format-disk.json @@ -0,0 +1,142 @@ +{ + "meta": { + "title": "Formátovať alebo vymazať fyzický disk | Dokumentácia ProxMenux", + "description": "Mazanie a formátovanie fyzických diskov v Proxmox VE pomocou ProxMenux. Štyri režimy, prísne filtre blokujúce systémové, pripojené a používané disky a dvojité potvrdenie vrátane zadania celej cesty.", + "ogTitle": "Formátovať alebo vymazať fyzický disk | Dokumentácia ProxMenux", + "ogDescription": "Vymažte alebo naformátujte fyzický disk v Proxmox. Bezpečnostné filtre, štyri režimy a dvojité potvrdenie." + }, + "header": { + "title": "Formátovať / vymazať fyzický disk", + "description": "Vymažte alebo naformátujte fyzický disk na hostiteľovi Proxmox. ProxMenux zobrazí iba úplne voľné disky, ktoré nepoužíva systém, nie sú uvedené v konfigurácii hosťa a nemajú pripojené súborové systémy. Pred zničením dát vyžaduje dvojité potvrdenie: áno/nie a presné zadanie celej cesty k disku.", + "section": "Správca diskov · Nástroje" + }, + "danger": { + "title": "Deštrukčný nástroj", + "body": "Každá operácia zapisuje na disk. Nedá sa vrátiť späť. ProxMenux používa prísne bezpečnostné filtre a potvrdenia, no za výber správneho disku zodpovedáte vy. Pred zadaním si cestu k disku dvakrát prečítajte nahlas." + }, + "howRuns": { + "heading": "Ako beží skript", + "body": "Postup má dve fázy s trojitou bezpečnostnou kontrolou medzi nimi. V prvej fáze sa zhromaždí výber disku, režim operácie a údaje súborového systému. Nič sa nezapíše, kým druhá fáza neprejde záverečným opätovným overením tesne pred vykonaním." + }, + "visibility": { + "heading": "Pravidlá viditeľnosti", + "intro": "Pred tým, ako sa zobrazí menu, ProxMenux filtruje zoznam diskov. Zobrazujú sa iba kandidáti, ktorí sú preukázateľne v bezpečí:", + "items": [ + "Zobrazené: disky, ktoré nepoužíva hostiteľ (koreňový pool, swap, pripojené systémy, aktívne ZFS/LVM/RAID) a nie sú uvedené v konfigurácii žiadnej VM/LXC, spustenej ani zastavenej.", + "Skryté: disky hostiteľa a systému.", + "Skryté: disky uvedené v konfigurácii VM/LXC." + ], + "safetyTitle": "Bezpečnosť pri potvrdení a vykonávaní", + "safetyItems": [ + "Disky so zastaranými alebo aktívnymi metadátami zobrazia podrobné upozornenia pred potvrdením.", + "Disky používané spustenou VM sa pri potvrdení bez výnimky zablokujú.", + "Disky s pripojenými oddielmi sú pevne zablokované pri spustení (tesne predtým, ako sa čokoľvek zapíše, sa spustí nové overenie).", + "Vždy sa vyžadujú dve potvrdenia: áno/nie dialógové okno + presné napísanie celej cesty k disku." + ] + }, + "modes": { + "heading": "Režimy prevádzky", + "intro": "Po vybratí disku si vyberiete jeden zo štyroch režimov. Odlišujú sa v tom, čo ničia a čo za sebou zanechávajú:", + "headerMode": "Režim", + "headerPart": "Tabuľka oddielov", + "headerData": "Údaje", + "headerUseCase": "Prípad použitia", + "rows": [ + { + "mode": "1. Vymazať všetko", + "part": "Zničené", + "data": "Vymazané podpisy", + "useCase": "Odstráni rozdelenie na oddiely a metadáta pre nové usporiadanie. Neprepíše všetky používateľské dáta." + }, + { + "mode": "2. Odstrániť značky FS", + "part": "Zachované", + "data": "Zachované", + "useCase": "Odstráni staré podpisy ZFS / LVM / RAID, aby sa disk automaticky nepreberal. Používateľské dáta sa plošne neprepisujú, no odstránenie podpisov ich môže zneprístupniť." + }, + { + "mode": "3. Prepísať dáta nulami", + "part": "Zachované", + "data": "Zničené (prepísané nulami)", + "useCase": "Prepíše existujúce oddiely nulami a zachová tabuľku oddielov. Nezahŕňa nepridelené miesto ani rezervné oblasti SSD; nezaručuje úplné bezpečné vymazanie zariadenia." + }, + { + "mode": "4. Úplné formátovanie", + "part": "Nová GPT", + "data": "Zničené", + "useCase": "Disk pripravený na použitie s jednou novou partíciou a novým súborovým systémom." + } + ], + "fullFormatOutro": "Úplné formátovanie pokračuje dvoma ďalšími dialógmi:", + "fullFormatItems": [ + "Súborový systém: ext4, xfs, exfat (prenosný) alebo btrfs. Ak chýbajú nástroje, napríklad mkfs.btrfs, operácia sa preruší s jasnou správou.", + "Menovka: voliteľná menovka súborového systému na jeho identifikáciu." + ] + }, + "steps": { + "heading": "Krok za krokom", + "stepLabel": "Krok", + "list": [ + { + "title": "Vyberte si voľný disk", + "body": "ProxMenux uvádza zoznam všetkých diskov, ktoré vyhovujú vyššie uvedeným filtrom viditeľnosti. Disky so značkami ⚠ nesú neaktuálne metadáta a zobrazujú sa s podrobnosťami, aby ste vedeli, čo sa chystáte prepísať." + }, + { + "title": "Vybrať operačný režim", + "bodyRich": "Podľa tabuľky vyberte Vymazať všetko, Odstrániť značky FS, Prepísať dáta nulami alebo Úplné formátovanie." + }, + { + "title": "(iba celý formát) Vyberte súborový systém a popis", + "body": "ext4 / xfs / exfat / btrfs, plus voliteľný štítok." + }, + { + "title": "Potvrdiť dvakrát", + "bodyRich": "ProxMenux zobrazí prehľad plánovanej operácie. Potvrdíte dialóg áno/nie a zadáte celú cestu k disku presne podľa zobrazenia, napríklad /dev/sdc. Iný vstup operáciu zruší." + }, + { + "title": "Opätovné overenie a vykonanie", + "body": "Tesne pred zápisom skript znova overí stav disku. Ak sa medzitým pripojil oddiel alebo spustila VM, vykonávanie sa preruší. Inak prebehne zvolená operácia a na konci sa zobrazí prehľad." + } + ] + }, + "manual": { + "heading": "Ručné ekvivalenty", + "body": "Ak chcete spustiť rovnocenné príkazy ručne:" + }, + "troubleshoot": { + "notListedTitle": "Disk nie je uvedený v menu", + "notListedBody": "Disk bol z bezpečnostných dôvodov skrytý. Časté dôvody: je pripojený, aj pod /mnt/tmp, je aktívnym členom ZFS/LVM/RAID, je uvedený v konfigurácii VM/LXC alebo ide o koreňový disk Proxmox. Na hostiteľovi spustite lsblk -f a cat /proc/mdstat na zistenie dôvodu.", + "busyTitle": "\"Disk may be busy\" / odpojenie zlyhalo", + "busyBody": "Niektorý proces stále drží otvorený súbor na oddiele tohto disku, najčastejšie kontajner alebo shell s pracovným adresárom v bode pripojenia. Zistite ho pomocou lsof | grep /dev/sdX alebo fuser -vm /dev/sdX1, zastavte ho a znova spustite nástroj." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "href": "/docs/disk-manager/smart-disk-test", + "label": "SMART Zdravie a test disku", + "tail": " — skontrolovať stav disku pred vymazaním alebo po ňom." + }, + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importovať disk do VM", + "tail": " — priradiť čerstvo naformátovaný disk VM." + }, + { + "href": "/docs/storage-share/host-local-disk", + "label": "Pridať lokálny disk ako Proxmox úložisko", + "tail": "— zaregistrujte vymazaný disk ako úložisko Proxmox pool." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Príkazy pre úložiská a disky", + "tail": " — prehľad príkazov lsblk, blkid a parted." + }, + { + "href": "/docs/disk-manager", + "label": "Prehľad správcu diskov", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/disk-manager/import-disk-image-vm.json b/web/messages/sk/docs/disk-manager/import-disk-image-vm.json new file mode 100644 index 00000000..d3d580bf --- /dev/null +++ b/web/messages/sk/docs/disk-manager/import-disk-image-vm.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Importovať obraz disku do VM | Dokumentácia ProxMenux", + "description": "Import súboru obrazu disku (.img / .qcow2 / .vmdk / .raw) do existujúcej VM Proxmox pomocou ProxMenux. Rozhranie, emulácia SSD a príznak spúšťacieho disku sa nastavujú pre každý obraz; na pozadí sa používa qm importdisk.", + "ogTitle": "Importovať obraz disku do VM | Dokumentácia ProxMenux", + "ogDescription": "Importovať .img / .qcow2 / .vmdk / .raw diskové snímky do existujúceho VM s ProxMenux. Používa qm importdisk pod kapotou." + }, + "header": { + "title": "Importovať obraz disku do VM", + "description": "Importujte súbor obrazu disku (.img, .qcow2, .vmdk alebo .raw) do existujúcej VM Proxmox. ProxMenux najprv zhromaždí všetky voľby: cieľovú VM, úložisko Proxmox, zdrojový adresár, rozhranie, emuláciu SSD a poradie spúšťania. Potom spustí qm importdisk pre každý vybraný obraz.", + "section": "Správca disku · VM" + }, + "intro": { + "title": "Čo to robí?", + "body": "Na rozdiel od Importovať disk do VM, ktorý pripája fyzický disk priamo, tento postup používa súbor na hostiteľovi: exportovaný z iného hypervízora, stiahnutý ako cloudový obraz alebo extrahovaný zo zálohy. Prevedie ho na disk VM Proxmox na zvolenom úložisku. Pôvodný súbor zostáva zachovaný; ProxMenux ho skopíruje, nepresunie." + }, + "howRuns": { + "heading": "Ako beží skript", + "body": "Postup má dve fázy. Prvá zhromaždí cez dialógy všetky voľby: VM, úložisko, zdrojový adresár, obrazy a možnosti pre každý obraz. Druhá spustí qm importdisk pre každý vybraný obraz. Kým sa druhá fáza nezačne, nič sa nekopíruje a konfigurácia VM sa nemení." + }, + "prereqs": { + "heading": "Predpoklady", + "items": [ + "Na hostiteľovi je definovaná aspoň jedna VM. Cieľová VM by mala byť vypnutá.", + "V zdrojovom adresári je aspoň jeden súbor obrazu v podporovanom formáte: .img, .qcow2, .vmdk, .raw.", + "Na cieľovom úložisku Proxmox je dosť voľného miesta pre všetky importované disky.", + "ProxMenux štandardne hľadá obrazy v /var/lib/vz/template/iso. Po výzve môžete zadať aj iný adresár na hostiteľovi." + ] + }, + "steps": { + "heading": "Krok za krokom", + "stepLabel": "Krok", + "list": [ + { + "title": "Vyberte cieľovú VM", + "bodyRich": "ProxMenux načíta qm list a zobrazí všetky VM. Vyberte tú, ktorá dostane importované disky." + }, + { + "title": "Vyberte Proxmox úložisko", + "bodyRich": "Zoznam obsahuje všetky úložiská s povoleným typom obsahu images. Ak je dostupné iba jedno, vyberie sa automaticky a dialóg sa preskočí." + }, + { + "title": "Vyberte zdrojový adresár", + "bodyRich": "Vyberte predvolený adresár (/var/lib/vz/template/iso) alebo zadajte vlastnú cestu, zvyčajne tam, kde ste obraz stiahli alebo nahrali. Skript odmietne neexistujúce cesty." + }, + { + "title": "Vybrať jeden alebo viac obrazov", + "bodyRich": "V adresári sa vyhľadajú súbory .img / .qcow2 / .vmdk / .raw. Možno ich vybrať viac naraz; v ďalšom kroku sa pre každý obraz nastavia samostatné voľby." + }, + { + "title": "Možnosti pre jednotlivé obrazy", + "intro": "Pre každý vybraný obraz sa ProxMenux opýta:", + "items": [ + "Rozhranie — scsi (predvolené), virtio, sata alebo ide. Zhoduje sa s tým, ako hosť uvidí disk.", + "Emulácia SSD: ponúka sa iba pre rozhrania iné než VirtIO. Pridá ssd=1, aby hosť rozpoznal disk SSD. Podporu discard/TRIM treba nastaviť samostatne.", + "Spúšťací: pri voľbe áno ProxMenux pridá disk do poradia spúšťania ako hlavné spúšťacie zariadenie VM." + ] + }, + { + "title": "Importovať a pripojiť", + "bodyRich": "ProxMenux spustí qm importdisk pre každý obraz a podľa potreby skonvertuje formát. Výsledný disk pripojí na ďalší voľný slot (scsiN, sataN, …) so zvolenými možnosťami. Ak ste označili niektorý disk ako spúšťací, aktualizuje poradie spúšťania. Priebeh sa zobrazuje v termináli." + } + ] + }, + "manual": { + "heading": "Ručný ekvivalent", + "body": "Import jedného obrazu zodpovedá trom príkazom qm:", + "warnTitle": "Konverzia formátu obrazu", + "warnBody": "Ak cieľové úložisko nemôže držať zdrojový formát natívne (napríklad LVM úložisko nemôže držať .qcow2), qm importdisk konvertuje obraz transparentne. To môže trvať niekoľko minút pre viac-GB snímky; podľa toho plán a neprerušujte skript." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "noImagesTitle": "\"Nenájdené žiadne kompatibilné obrazy disku\"", + "noImagesBody": "Skript prehľadal adresár, ale nenašiel žiadny súbor .img / .qcow2 / .vmdk / .raw. Skontrolujte príponu (rozlišujú sa veľké a malé písmená), či je súbor priamo vo vybranom adresári (podadresáre sa neprehľadávajú) a či ho root môže čítať.", + "slowTitle": "Import je pomalý", + "slowBody": "Konverzie medzi VMDK, QCOW2 a raw môžu byť obmedzené CPU a vstupom/výstupom. Rýchlosť závisí od čítania zdroja, zápisu na cieľ a prípadnej dekompresie. Ak je to možné, uprednostnite zdroje raw alebo qcow2.", + "uefiTitle": "Importovaný disk sa spustí do UEFI shellu", + "uefiBody": "Obraz bol vytvorený pre starší režim (SeaBIOS), ale VM používa OVMF alebo naopak. Prepnite BIOS VM v Proxmox podľa obrazu alebo obraz pred importom znova vytvorte v správnom režime." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importovať disk do VM", + "tail": " — rovnaký postup pre fyzické disky (passthrough)." + }, + { + "href": "/docs/utils/import-vm", + "label": "Importovať VM z OVA / OVF", + "tail": " — keď máte kompletný balík VM, nielen obraz disku." + }, + { + "href": "/docs/utils/UUp-Dump-ISO-Creator", + "label": "Tvorba ISO cez UUP Dump", + "tail": " — vytvoriť ISO Windows pre novú inštaláciu." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Príkazy pre úložiská a disky", + "tail": " — prehľad príkazov qm importdisk a qemu-img convert." + }, + { + "href": "/docs/disk-manager", + "label": "Prehľad správcu diskov", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/disk-manager/import-disk-lxc.json b/web/messages/sk/docs/disk-manager/import-disk-lxc.json new file mode 100644 index 00000000..61d6fdb3 --- /dev/null +++ b/web/messages/sk/docs/disk-manager/import-disk-lxc.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Importovať disk do LXC | ProxMenux Dokumentácia", + "description": "Pripojte fyzický disk k existujúcemu kontajneru LXC v Proxmox VE pomocou ProxMenux. Zabezpečí rozpoznanie a formátovanie súborového systému, bod pripojenia, konverziu z neprivilegovaného na privilegovaný kontajner a trvalé cesty zariadení.", + "ogTitle": "Importovať disk do LXC | ProxMenux Dokumentácia", + "ogDescription": "Pripojte fyzický disk k existujúcemu kontajneru LXC. Zabezpečí súborový systém, bod pripojenia a konverziu z neprivilegovaného na privilegovaný kontajner." + }, + "header": { + "title": "Importovať disk do LXC", + "description": "Pripojte fyzický disk k existujúcemu LXC kontajneru na Proxmox hostiteľa. ProxMenux detekuje voľné disky, voliteľne ich formátuje podporovaným súborovým systémom a prepojí partíciu na bod pripojenia vo vnútri kontajnera pomocou trvalých trás zariadenia.", + "section": "Správca disku · LXC" + }, + "intro": { + "title": "Passthrough vo VM a v LXC", + "body": "Tento passthrough LXC neposkytuje priamo blokové zariadenie. Kontajner dostane bod pripojenia, teda adresár na vybranom oddiele hostiteľa. Na rozdiel od VM používa jadro hostiteľa, preto súborový systém (ext4/xfs/btrfs) číta a spravuje hostiteľ Proxmox a následne ho sprístupní kontajneru." + }, + "howRuns": { + "heading": "Ako beží skript", + "body": "Postup má dve oddelené fázy: zhromaždenie informácií a volieb, potom samotnú zmenu konfigurácie kontajnera. Až do záverečného potvrdenia sa v CT nič nepripája.", + "summary": "ProxMenux skryje koreňový disk, pripojené disky a disky uvedené v konfiguráciách VM/LXC. Aktívni členovia ZFS/LVM/RAID sú skrytí; staré podpisy sú označené ⚠, aby ste ich mohli pred formátovaním vymazať." + }, + "prereqs": { + "heading": "Predpoklady", + "items": [ + "Aspoň jeden kontajner LXC definovaný na hostiteľovi.", + "Kontajner je privilegovaný, alebo akceptujete ponuku skriptu na jeho konverziu.", + "Aspoň jeden fyzický disk nepoužívaný hostiteľom alebo iným hosťom." + ], + "warnTitle": "Požadovaný privilegovaný kontajner", + "warnBody": "Tento skript vyžaduje na priame pripojenie disku privilegovaný kontajner. Ak nájde unprivileged: 1, ponúkne priamu úpravu /etc/pve/lxc/<CTID>.conf. Zmení sa bezpečnostný model, ale vlastníctvo existujúcich súborov sa nepremapuje. Pred prijatím kontajner zálohujte a overte vlastníctvo alebo ho znova vytvorte ako privilegovaný." + }, + "steps": { + "heading": "Krok za krokom", + "stepLabel": "Krok", + "list": [ + { + "title": "Vybrať cieľový kontajner", + "img": "/disk/select-container.png", + "caption": "Výberové menu kontajnera", + "bodyRich": "ProxMenux uvádza každý LXC kontajner na hostiteľa (pct list). Vyberte ten, ktorý dostane disk. Ak je kontajner neprivilegovaný, ponúka sa mu konvertovať teraz." + }, + { + "title": "Vyberte fyzický disk", + "img": "/disk/disk-selection-ct.png", + "caption": "Voľné disky na hostiteľovi, s označením ⚠ pre staré metadáta", + "bodyRich": "Zobrazia sa iba bezpeční kandidáti. Na rozdiel od postupu pre VM tento skript pripojí jeden disk na spustenie. Pre každý ďalší disk ho spustite znova." + }, + { + "title": "Formátovať alebo znova použiť", + "intro": "Skript kontroluje disk:", + "items": [ + "Ak už obsahuje podporovaný súborový systém (ext4/xfs/btrfs), možno ho použiť bez zmeny; existujúce súbory sa zachovajú.", + "Ak disk nemá podporovaný súborový systém, ponúkne sa formátovanie. Vyberte ext4/xfs/btrfs." + ] + }, + { + "title": "Vyberte bod pripojenia", + "bodyRich": "Zadajte cestu, kde má kontajner vidieť disk, napríklad /mnt/data alebo /mnt/disk_passthrough. Ide o cestu vnútri kontajnera; hostiteľ už vidí oddiel pod /dev/disk/by-id/…." + }, + { + "title": "Pripojiť a overiť", + "img": "/disk/assignment-ct.png", + "caption": "Priradenie ku CT", + "bodyRich": "ProxMenux pridá do konfigurácie kontajnera nový záznam mpN:, pričom preskočí už použité indexy. Potom konfiguráciu znovu načíta a overí. Ak kontajner beží, pripojenie sa vykoná za behu; inak sa uplatní pri ďalšom spustení.", + "extraImg": "/disk/result-point.png", + "extraAlt": "Bod pripojenia vytvorený úspešne", + "extraCaption": "Bod pripojenia vytvorený a overený" + } + ] + }, + "manual": { + "heading": "Ručný ekvivalent", + "body": "Skript používa pct set. Priamy príkaz pre jeden disk vyzerá takto:" + }, + "important": { + "heading": "Dôležité úvahy", + "items": [ + "Jeden disk na spustenie. Znova spustite skript pre každý ďalší disk.", + "Nepripájajte rovnaký oddiel k viacerým kontajnerom, ktoré by ho mohli pripojiť súčasne; súbežné zápisy poškodia súborový systém.", + "Staré metadáta (podpisy RAID / ZFS / LVM) sa musia manuálne vymazať skôr, ako vám skript umožní formátovanie, inak mkfs odmietne prepísať. Použite na to nástroj Formátovanie / vymazanie fyzického disku." + ] + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "unprivTitle": "\"Nemôže pokračovať s neprivilegovaným kontajnerom\"", + "unprivBody": "Odmietli ste konverziu. V /etc/pve/lxc/<CTID>.conf sa zmení unprivileged: 1 na unprivileged: 0, no samotná zmena neprevedie existujúce vlastníctvo UID/GID. Pred priamou konverziou kontajner zálohujte a vyriešte mapovanie vlastníkov; prípadne ho obnovte alebo znova vytvorte ako privilegovaný.", + "permsTitle": "Práva vnútri kontajnera sú nesprávne", + "permsBody": "Pri pripojení oddielu do privilegovaného kontajnera sa zachová existujúce vlastníctvo súborov; nový súborový systém často patrí root:root. Ak služba beží pod iným používateľom, napríklad www-data pri Nextcloude, overte UID/GID a upravte potrebné súbory pomocou chown/chmod. Zmeny ovplyvnia aj podkladový disk." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importovať disk do VM", + "tail": " — rovnaký postup pre VM." + }, + { + "href": "/docs/storage-share/lxc-mount-points", + "label": "LXC mount pointy (Host ↔ CT)", + "tail": " Zdieľať adresáre hostiteľa s CT namiesto pripojenia celého disku." + }, + { + "href": "/docs/help-info/vm-ct-commands", + "label": "Príkazy na správu VM a CT", + "tail": " — prehľad príkazov pct config / push / pull." + }, + { + "href": "/docs/disk-manager", + "label": "Prehľad správcu diskov", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/disk-manager/import-disk-vm.json b/web/messages/sk/docs/disk-manager/import-disk-vm.json new file mode 100644 index 00000000..d7e60361 --- /dev/null +++ b/web/messages/sk/docs/disk-manager/import-disk-vm.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Importovať disk do VM | ProxMenux Dokumentácia", + "description": "Pripojte fyzický disk na existujúci Proxmox VM s ProxMenux. Bezpečná detekcia disku (okrem systému, namontovaných, používaných, ZFS/RAID/LVM), perzistentných ciest /dev/disk/by-id a SATA / SCSI / VirtIO / IDE rozhraní.", + "ogTitle": "Importovať disk do VM | ProxMenux Dokumentácia", + "ogDescription": "Pripojte fyzický disk na existujúci Proxmox VM. Používa perzistentné cesty /dev/disk/by-id a podporuje SATA / SCSI / VirtIO / IDE." + }, + "header": { + "title": "Importovať disk do VM", + "description": "Pripojte fyzický disk, ktorý už existuje na Proxmox hostiteľa k existujúcemu virtuálnemu stroju. ProxMenux detekuje voľné disky, umožňuje vám vybrať cieľovú VM, typ zbernice (SATA / SCSI / VirtIO / IDE) a pripojí všetko pomocou perzistentných ciest /dev/disk/by-id, takže mapovanie prežije reštarty a zmeny v poradí zariadenia.", + "section": "Správca disku · VM" + }, + "intro": { + "title": "Čo to robí?", + "body": "Fyzický disk sa pripojí ako podkladové zariadenie rozhrania virtuálneho disku. Hosť automaticky nedostane natívne SMART dáta ani funkcie fyzického radiča; ak ich potrebujete, použite PCI passthrough radiča. Disk sa pripája cez /dev/disk/by-id/…, nie /dev/sdX, takže zmena poradia zariadení pri štarte nenaruší priradenie." + }, + "howRuns": { + "heading": "Ako beží skript", + "body": "Postup má dve oddelené fázy: zhromaždenie informácií a volieb, potom samotné pripojenie diskov k VM. Až do záverečného potvrdenia sa konfigurácia VM nemení.", + "summary": "ProxMenux filtruje všetko, čo nemôže bezpečne prejsť: koreňový disk, disky pripojené k hostiteľovi, členovia aktívneho ZFS/LVM/RAID pool a disky, na ktoré už odkazujú VM/LXC konfigurácia. Disky s zastaranými metadátami (staré ZFS / RAID / LVM podpisy, ktoré sa už nepoužívajú) sú zobrazené s označením ⚠, ale nie sú blokované." + }, + "prereqs": { + "heading": "Predpoklady", + "items": [ + "Aspoň jeden VM definovaný na hostiteľovi (skript odosiela priamo do qm list).", + "Cieľová VM je vypnutá. Ak beží, skript sa preruší so správou; pridávanie diskov za behu nie je súčasťou tohto postupu.", + "Aspoň jeden fyzický disk na hostiteľa, ktorý nie je v prevádzke hostiteľom alebo iným hosťom." + ] + }, + "steps": { + "heading": "Krok za krokom", + "stepLabel": "Krok", + "list": [ + { + "title": "Vyberte cieľovú VM", + "bodyRich": "ProxMenux vypíše všetky VM hostiteľa cez qm list. Vyberte tú, ktorej chcete pripojiť disk. Ak beží, skript sa preruší a vyžiada si jej vypnutie." + }, + { + "title": "Vybrať fyzické disky na pripojenie", + "img": "/disk/disk-selection.png", + "caption": "Voľné disky na hostiteľovi, s označením ⚠ pre staré metadáta", + "body": "Skript prehľadá každý hostiteľský disk a zobrazí len tie, ktoré je možné bezpečne pripojiť. Kontrolný zoznam vám umožňuje vybrať jeden alebo niekoľko naraz. Disky so starými ZFS / LVM / RAID signatúrami sa stále zobrazujú a sú označené ⚠, takže viete, že je potrebné ich vymazať, aby ich hosť mohol naformátovať." + }, + { + "title": "Vyberte rozhranie zbernice", + "img": "/disk/disk-assigment.png", + "caption": "Výber rozhrania zbernice", + "intro": "Vyberte si, ako by mal hosť vidieť disk:", + "items": [ + "SCSI: moderná predvolená voľba pre Linux a Windows s nainštalovanými ovládačmi VirtIO-SCSI.", + "SATA: široká kompatibilita, funguje bez ďalších ovládačov takmer v každom hosťovi.", + "VirtIO: efektívne paravirtualizované blokové zariadenie; vyžaduje ovládače v hosťovi.", + "IDE: pre staršie hosťovské systémy, ktorým chýbajú uvedené ovládače." + ] + }, + { + "title": "Pripojiť a overiť", + "bodyRich": "ProxMenux pripojí každý vybraný disk cez najvhodnejšiu cestu /dev/disk/by-id/, preskočí už obsadené sloty konfigurácie VM (scsi0, sata0, …) a znova načíta konfiguráciu na overenie priradenia. Na konci zobrazí prehľad." + } + ] + }, + "manual": { + "heading": "Ručný ekvivalent", + "body": "Scenár je obal okolo qm set. Presný príkaz pre jeden disk vyzerá takto:", + "migrationTitle": "Živá migrácia nie je možná", + "migrationBody": "VM s priamo pripojeným fyzickým diskom je viazaná na hostiteľa, ktorý disk sprístupňuje. Iný uzol zvyčajne nemá rovnakú cestu /dev/disk/by-id/… ani dáta disku. Zálohujte a preneste dáta samostatne alebo použite spravované virtuálne disky na zdieľanom či podporovanom replikovanom úložisku. Nepredpokladajte, že replikácia Proxmox zahŕňa toto zariadenie.", + "shareTitle": "Nezdieľať fyzický disk medzi VM", + "shareBody": "Pripojenie rovnakého fyzického disku k dvom VM súčasne skazí dáta pri ďalšom zápise. ProxMenux detekuje túto situáciu a blokuje ju, ale ak obídete skript (direct qm set), uistite sa, že len jeden hosť niekedy pripojí disk." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "noDisksTitle": "\"Nie sú k dispozícii disky pre tento VM\"", + "noDisksIntro": "Skript našiel disky, ale každý kandidát bol odfiltrovaný. Časté dôvody:", + "noDisksItems": [ + "Každý zostávajúci disk je už uvedený v cieľovom VM konfigurácii.", + "Každý zostávajúci disk je namontovaný na hostiteľa alebo je súčasťou aktívneho ZFS / LVM / RAID.", + "Hostiteľ má nainštalovaný iba koreňový disk." + ], + "noDisksOutro": "Spustite lsblk -f na hostiteľa skontrolovať stav každého disku.", + "noVisibleTitle": "VM nevidí disk po štarte", + "noVisibleBody": "Pri SCSI alebo VirtIO hosť potrebuje príslušný ovládač. Linux ho má v jadre; vo Windowse ho nainštalujte z VirtIO ISO (pozrite Vytvoriť VM: Windows). Prepnutie na SATA na karte Hardvér VM je rýchly test priradenia disku." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "href": "/docs/disk-manager/import-disk-image-vm", + "label": "Importovať obraz disku do VM", + "tail": " — rovnaký postup pre súbory obrazov (qcow2 / vmdk / raw / img)." + }, + { + "href": "/docs/disk-manager/import-disk-lxc", + "label": "Importovať disk do LXC", + "tail": " — rovnaký postup pre kontajnery LXC." + }, + { + "href": "/docs/disk-manager/add-controller-nvme-vm", + "label": "Pridať radič alebo NVMe do VM", + "tail": " — ak potrebujete úplný PCIe/NVMe passthrough namiesto pripojenia disku." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Príkazy pre úložiská a disky", + "tail": " — prehľad qm importdisk a súvisiacich príkazov shellu." + }, + { + "href": "/docs/disk-manager", + "label": "Prehľad správcu diskov", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/disk-manager/index.json b/web/messages/sk/docs/disk-manager/index.json new file mode 100644 index 00000000..7d892d90 --- /dev/null +++ b/web/messages/sk/docs/disk-manager/index.json @@ -0,0 +1,135 @@ +{ + "meta": { + "title": "Správca diskov Proxmox: VM/LXC, testy SMART a mazanie | ProxMenux", + "description": "Spravujte fyzické disky hostiteľa Proxmox VE pomocou ProxMenux: pripájajte disky k VM alebo LXC (qm set scsi/sata/virtio, pct mp), importujte obrazy img / qcow2 / vmdk / raw, priraďujte celé HBA alebo radiče NVMe, mažte disky s bezpečnostnými kontrolami a spúšťajte testy SMART.", + "ogTitle": "Správca diskov Proxmox: VM/LXC, testy SMART a mazanie", + "ogDescription": "Pripájajte disky k VM/LXC, importujte obrazy, priraďujte radiče cez PCI passthrough, mažte s bezpečnostnými kontrolami a spúšťajte testy SMART v Proxmox VE.", + "twitterTitle": "Správca diskov Proxmox | ProxMenux", + "twitterDescription": "Pripojenie diskov k VM/LXC, import obrazov, PCI passthrough, mazanie s bezpečnostnými kontrolami a testy SMART." + }, + "header": { + "title": "Správca diskov", + "description": "Ponuka Správca diskov združuje nástroje ProxMenux na správu fyzických diskov hostiteľa: pripojenie k VM a LXC, import obrazov diskov, passthrough celého radiča alebo zariadenia NVMe, mazanie s bezpečnostnými kontrolami a testy SMART.", + "section": "Správca diskov" + }, + "intro": { + "title": "Na čo je toto menu", + "body": "Nástroje pracujú s fyzickými diskami viditeľnými pre hostiteľa Proxmox a súbormi obrazov uloženými na ňom. Sú rozdelené do troch skupín: VM (pripojenie diskov alebo import obrazov), LXC (pripojenie diskov ku kontajneru) a Nástroje (formátovanie a stav SMART). Pripájanie a mazanie skryje alebo zablokuje systémové a používané disky; SMART ich môže kontrolovať bez vymazania." + }, + "opening": { + "heading": "Otvorenie menu", + "body": "V hlavnej ponuke ProxMenux vyberte Správca diskov. Zobrazí sa:", + "imageAlt": "Menu správcu diskov s VM, LXC a blokmi utilít" + }, + "groups": { + "heading": "Tri skupiny nástrojov", + "intro": "Ponuka Disk Manager je organizovaná v troch skupinách VM, LXC a Nástroje. Kliknite na kartu pre skok priamo na nástroje v tejto skupine.", + "vmTitle": "VM", + "vmBody": "Nástroje pre existujúce virtuálne stroje. VM musí byť vypnutá; ProxMenux to overí pred zmenou konfigurácie.", + "vmItems": [ + "Importovať disk do VM", + "Importovať obraz disku do VM", + "Pridať radič alebo NVMe do VM" + ], + "lxcTitle": "LXC", + "lxcBody": "Nástroje pre existujúce kontajnery LXC. Tento skript vyžaduje privilegovaný kontajner a podľa potreby ponúkne zmenu príznaku. Najprv si na stránke nástroja prečítajte upozornenia ku konverzii a vlastníctvu súborov.", + "lxcItems": [ + "Importovať disk do LXC" + ], + "utilitiesTitle": "Nástroje", + "utilitiesBody": "Nástroje na strane hostiteľa, ktoré fungujú na samotných diskoch, nezávisle od akéhokoľvek VM alebo kontajnera.", + "utilitiesItems": [ + "Formátovať / vymazať fyzický disk", + "SMART Zdravie a test disku" + ] + }, + "vm": { + "heading": "VM", + "intro": "Nástroje pre existujúce virtuálne stroje. VM musí byť vypnutá; ProxMenux to overí pred zmenou konfigurácie.", + "options": [ + { + "icon": "HardDrive", + "href": "/docs/disk-manager/import-disk-vm", + "title": "Importovať disk do VM", + "description": "Pripojte nepridelený fyzický disk na existujúci VM. Podporuje SATA / SCSI / VirtIO / IDE, používa trvalé cesty /dev/disk/by-id." + }, + { + "icon": "FileDown", + "href": "/docs/disk-manager/import-disk-image-vm", + "title": "Importovať obraz disku do VM", + "description": "Import súborov obrazov disku (.img / .qcow2 / .vmdk / .raw) do existujúcej VM. Dvojfázový postup s qm importdisk na pozadí." + }, + { + "icon": "Cpu", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "title": "Pridať radič alebo NVMe do VM", + "description": "PCI priechod celého zariadenia SATA / SAS HBA alebo NVMe do zariadenia VM. Ovláda IOMMU a umožňuje odhaľovanie konfliktov." + } + ] + }, + "lxc": { + "heading": "LXC", + "intro": "Nástroje pre existujúce kontajnery LXC. Tento skript vyžaduje privilegovaný kontajner a podľa potreby ponúkne zmenu príznaku. Najprv si na stránke nástroja prečítajte upozornenia ku konverzii a vlastníctvu súborov.", + "options": [ + { + "icon": "Boxes", + "href": "/docs/disk-manager/import-disk-lxc", + "title": "Importovať disk do LXC", + "description": "Pripojí nepriradený fyzický disk k existujúcemu kontajneru LXC ako bod pripojenia. Zabezpečí rozpoznanie a formátovanie súborového systému aj zmenu na privilegovaný režim." + } + ] + }, + "utilities": { + "heading": "Nástroje", + "intro": "Nástroje na strane hostiteľa, ktoré fungujú na samotných diskoch, nezávisle od akéhokoľvek VM alebo kontajnera.", + "options": [ + { + "icon": "Eraser", + "href": "/docs/disk-manager/format-disk", + "title": "Formátovať / vymazať fyzický disk (bezpečne)", + "description": "Mazanie diskov s prísnymi bezpečnostnými kontrolami: zobrazia sa iba úplne voľné disky a vždy sa vyžaduje dvojité potvrdenie." + }, + { + "icon": "Activity", + "href": "/docs/disk-manager/smart-disk-test", + "title": "SMART Zdravie a test disku", + "description": "Spustite SMART zdravotné kontroly a krátke / dlhé vlastné testy na SATA, SAS a NVMe disky. Exportuje JSON pre monitor." + } + ] + }, + "safety": { + "title": "Bezpečnostné pravidlá pripájania a mazania diskov", + "intro": "Pripájanie a mazanie vylučuje zariadenia, ktoré by mohli poškodiť hostiteľa:", + "items": [ + "systémový disk (koreňový pool, swap, aktívny ZFS / LVM členovia RAID) je vždy skrytý.", + "Disky pripojené kdekoľvek na hostiteľovi sa nezobrazia alebo sa ich použitie pri vykonávaní zablokuje.", + "Disky, na ktoré odkazuje spustená VM alebo LXC, nemožno priradiť inému hosťovi ani vymazať.", + "Operácie, ktoré môžu zmeniť hostiteľský stav (IOMMU povoliť, vymazať) vyžadujú explicitné potvrdenie." + ] + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "href": "/docs/storage-share", + "label": "Správca úložísk a zdieľania", + "tail": " Registrácia úložiska v Proxmoxe (NFS / Samba / iSCSI / miestne) a zdieľať priečinky medzi hostiteľom a CTs." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Príkazy pre úložiská a disky", + "tail": " — prehľad blokových zariadení, LVM, pvesm a SMART." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Príkazy na správu ZFS", + "tail": " — pre pooly a datasety ZFS." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Pridať GPU do VM (passthrough)", + "tail": " — rovnaké princípy IOMMU/VFIO použité pre GPU." + } + ] + } +} diff --git a/web/messages/sk/docs/disk-manager/smart-disk-test.json b/web/messages/sk/docs/disk-manager/smart-disk-test.json new file mode 100644 index 00000000..de8f1f0f --- /dev/null +++ b/web/messages/sk/docs/disk-manager/smart-disk-test.json @@ -0,0 +1,146 @@ +{ + "meta": { + "title": "Stav a testy diskov SMART | Dokumentácia ProxMenux", + "description": "Kontroly stavu SMART a testy diskov v Proxmox VE pomocou ProxMenux. Podporuje SATA/SAS cez smartmontools a NVMe cez nvme-cli, krátke aj dlhé testy a export JSON pre ProxMenux Monitor.", + "ogTitle": "Stav a testy diskov SMART | Dokumentácia ProxMenux", + "ogDescription": "Kontroly stavu SMART a testy diskov SATA/SAS a NVMe v Proxmox. Export JSON pre Monitor." + }, + "header": { + "title": "SMART Zdravie a test disku", + "description": "Čítajte dáta SMART a spúšťajte testy fyzických diskov hostiteľa Proxmox. ProxMenux automaticky nainštaluje smartmontools pre SATA/SAS a nvme-cli pre NVMe, spustí test vo firmvéri disku (dlhé testy pokračujú aj po zatvorení terminálu) a exportuje výsledky JSON pre ProxMenux Monitor.", + "section": "Správca diskov · Nástroje" + }, + "intro": { + "title": "Načo to je?", + "body": "SMART (Self-Monitoring, Analysis and Reporting Technology) umožňuje disku hlásiť svoj stav a vykonávať vlastné testy. Nástroj zobrazí tieto dáta bez potreby pamätať si správne volanie smartctl alebo nvme a uloží výstup ako JSON, aby Monitor mohol zobrazovať vývoj v čase." + }, + "howRuns": { + "heading": "Ako beží skript", + "body": "Všetky akcie sú nedeštruktívne: SMART číta počítadlá firmvéru disku a testy prebiehajú v samotnom disku. Nie je potrebné oddeľovať fázy. Postup: kontrola závislostí → výber disku → výber akcie → volanie nástroja smartctl alebo nvme-cli podľa typu disku → zobrazenie výstupu a export JSON pre Monitor." + }, + "deps": { + "heading": "Závislosti", + "body": "Nástroj pri prvom spustení automaticky nainštaluje potrebné závislosti. Disky SATA / SAS používajú smartmontools, disky NVMe používajú nvme-cli. Oba balíky:" + }, + "actions": { + "heading": "Dostupné opatrenia", + "headerAction": "Akcia", + "headerWhat": "Čo číta alebo spúšťa", + "headerDur": "Trvanie", + "rows": [ + { + "action": "Rýchly zdravotný stav", + "whatRich": "Celkový stav PASSED/FAILED a kľúčové atribúty.
smartctl -H + -A (SATA/SAS) alebo nvme smart-log (NVMe).", + "dur": "Okamžite" + }, + { + "action": "Úplná správa", + "whatRich": "Kompletné dáta SMART, posuvné. smartctl -x pre SATA/SAS alebo nvme smart-log + id-ctrl pre NVMe.", + "dur": "Okamžite" + }, + { + "action": "Krátky test", + "what": "Základná kontrola povrchu a elektroniky vo firmvéri disku.", + "dur": "~2 minút" + }, + { + "action": "Dlhá skúška", + "what": "Úplná kontrola povrchu. Beží na hardvéri disku a pokračuje aj po zatvorení terminálu.", + "dur": "Hodiny (od veľkosti disku závisí)" + }, + { + "action": "Skontrolovať priebeh testu", + "what": "Stav aktívneho alebo posledného samotestu.", + "dur": "Okamžite" + } + ], + "tipTitle": "Dlhé testy pokračujú po zatvorení terminálu", + "tipBody": "Dlhý test beží vnútri disku a nezávisí od bežiaceho procesu ProxMenux. Terminál môžete zavrieť a neskôr použiť Skontrolovať priebeh testu. Reštart hostiteľa, reset radiča alebo výpadok napájania môže prerušiť test aj zber výsledkov; nepredpokladajte automatické pokračovanie." + }, + "json": { + "heading": "Export JSON pre monitor", + "intro": "Akcie stavu, krátkeho testu a priebehu zapisujú JSON s časovou pečiatkou do /usr/local/share/proxmenux/smart/<disk>/; výsledky dlhého testu sa zbierajú na pozadí. Úplná správa sa iba zobrazí. Štruktúra je:", + "outro": "ProxMenux Monitor používa tieto súbory na zobrazenie vývoja stavu diskov. Staré súbory sa po dosiahnutí limitu uchovávania automaticky odstránia." + }, + "steps": { + "heading": "Krok za krokom", + "stepLabel": "Krok", + "list": [ + { + "title": "Vybrať disk", + "body": "ProxMenux vypíše všetky fyzické disky hostiteľa s modelom a veľkosťou. Na rozdiel od nástroja formátovania sa tu bezpečnostné filtre nepoužívajú, pretože čítanie SMART je nedeštruktívne.", + "img": "/disk/smart/disk-selection.png", + "alt": "Menu výberu disku SMART", + "caption": "Menu výberu disku SMART" + }, + { + "title": "Vybrať akciu", + "body": "Vyberte rýchly stav, úplnú správu, krátky test, dlhý test alebo kontrolu priebehu. Ponuka zostane po každej akcii otvorená, aby ste mohli vykonať viac kontrol toho istého disku.", + "img": "/disk/smart/action-menu.png", + "alt": "Akčné menu SMART", + "caption": "Akčné menu SMART (5 akcie + zrušiť)" + }, + { + "title": "(Iba dlhý test) Potvrdiť vykonávanie na pozadí", + "body": "ProxMenux upozorní, že test bude pokračovať po zatvorení terminálu, a zobrazí miesto uloženia výsledku JSON. Potvrdením spustíte test.", + "img": "/disk/smart/long-test-warning.png", + "alt": "Dialóg potvrdenia dlhého testu", + "caption": "Potvrdenie dlhého testu: beží na pozadí a výsledok sa uloží do JSON" + }, + { + "title": "Skontrolovať výsledky", + "bodyRich": "Stav a správy sa zobrazia v termináli; JSON sa exportuje pri vyššie opísaných akciách, nie pri úplnej správe. Pri dlhých testoch neskôr použite Skontrolovať priebeh testu na rovnakom disku.", + "img": "/disk/smart/quick-status.png", + "alt": "Výstup rýchlej kontroly stavu", + "caption": "Rýchly prehľad stavu disku (SATA — smartctl -H + -A)" + } + ] + }, + "manual": { + "heading": "Ručné ekvivalenty", + "nvmeWarnTitle": "Testy NVMe závisia od firmvéru disku", + "nvmeWarnBody": "Nie každý NVMe disk podporuje krátky/dlhý samotestový príkaz. Ak pohon odmietne test, log SMART a dáta ovládača ID (nvme smart-log + id-ctrl) sú stále najspoľahlivejším zdravotným signálom." + }, + "troubleshoot": { + "heading": "Riešenie problémov", + "noSmartTitle": "\"Nepodarilo sa prečítať dáta SMART z /dev/sdX\"", + "noSmartBody": "Disk je pravdepodobne za radičom RAID/SAS, ktorý nesprístupňuje SMART. Pri kartách megaraid skúste smartctl -d megaraid,N /dev/sdX. Pri HBA v režime IT funguje priame volanie.", + "longTitle": "Dlhý test sa nikdy nedokončil", + "longBody": "Test beží vo firmvéri disku a vysoká záťaž ho môže spomaliť. Skúste pokojné obdobie, napríklad noc. Pri SATA/SAS zobrazí smartctl -c zostávajúce percento; výsledok a prípadné chybné LBA nájdete v zázname testov. Chybu čítania treba preskúmať; pomalý priebeh sám osebe nedokazuje chybný sektor." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "href": "/docs/disk-manager/format-disk", + "label": "Formátovať / vymazať fyzický disk", + "tail": " — znova použiť disk po overení jeho stavu." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Príkazy pre úložiská a disky → Stav SMART", + "tail": " — prehľad smartctl/nvme s príkazmi na skopírovanie." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Príkazy na správu ZFS", + "tail": " — zpool scrub overuje kontrolné súčty dát ZFS a dopĺňa hardvérové testy SMART." + }, + { + "href": "/docs/monitor/dashboard/storage", + "label": "ProxMenux Monitor — karta Úložisko", + "tail": " — podrobný pohľad na disk využívajúci exportovaný JSON: úplná tabuľka SMART, história a správa PDF." + }, + { + "href": "/docs/monitor/dashboard/hardware", + "label": "ProxMenux Monitor — karta Hardvér", + "tail": " — prehľad úložiska s modelom, kapacitou a dohodnutou rýchlosťou spojenia (aktuálna a maximálna pri NVMe)." + }, + { + "href": "/docs/disk-manager", + "label": "Prehľad správcu diskov", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/sv/docs/disk-manager/add-controller-nvme-vm.json new file mode 100644 index 00000000..0aba2356 --- /dev/null +++ b/web/messages/sv/docs/disk-manager/add-controller-nvme-vm.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Lägg till styrenhet eller NVMe i en VM | ProxMenux-dokumentation", + "description": "PCI-passthrough av en lagringsstyrenhet (SATA/SAS-HBA) eller NVMe-enhet till en Proxmox-VM med ProxMenux. Hanterar aktivering av IOMMU, konfliktkontroll och tilldelning med qm set --hostpci.", + "ogTitle": "Lägg till styrenhet eller NVMe i en VM | ProxMenux-dokumentation", + "ogDescription": "Tilldela en hel SATA/SAS-HBA eller NVMe-enhet till en Proxmox-VM. ProxMenux hanterar IOMMU, konfliktkontroll och hostpci-tilldelningen." + }, + "header": { + "title": "Lägg till styrenhet eller NVMe i en VM", + "description": "Tilldela en hel SATA/SAS-värdbussadapter (HBA) eller NVMe-enhet till en Proxmox-VM via PCI-passthrough. ProxMenux kontrollerar IOMMU och aktiverar det med ditt samtycke, listar lämpliga enheter, filtrerar bort konflikter och konfigurerar tilldelningen med qm set --hostpci.", + "section": "Diskhanterare · VM" + }, + "intro": { + "title": "Vad detta gör (och inte) gör", + "body": "Detta är passthrough på enhetsnivå: PCIe-kortet lämnar värdkärnans kontroll och binds till vfio-pci. VM:n ser själva styrenheten i stället för enskilt vidarebefordrade diskar och laddar sin egen drivrutin för modellen. Alla anslutna diskar följer automatiskt med, med inbyggda SMART-data, fullständiga firmwarefunktioner och utan ett Proxmox-lager emellan." + }, + "howRuns": { + "heading": "Så körs skriptet", + "body": "Flödet har två faser med tydlig separation mellan \"samla information, kontrollera IOMMU och lista kandidater\" och \"faktiskt fästa PCI-enheten\". Fram till den slutliga bekräftelsen skrivs ingenting till VM-konfig." + }, + "iommu": { + "heading": "IOMMU-grupper – varför hela kortet lämnar samtidigt", + "body": "Isoleringsgränsen för PCI-passthrough är IOMMU-gruppen, den minsta enhet som processorns IOMMU kan isolera. Enheter i samma grupp kan inte isoleras från varandra. Om en SATA-styrenhet delar grupp med en USB-styrenhet kan SATA-passthrough kräva att även USB frigörs från värden, eller hindra passthrough. Alla enheter i gruppen tilldelas inte automatiskt till VM:n.", + "outro": "ProxMenux visar IOMMU-gruppen bredvid varje enhet och varnar dig när en grupp bär mer än bara den kontroller du vill ha. Du kan fortfarande fortsätta om de extra enheterna i gruppen är acceptabla (alla diskkontroller, till exempel), eller backa ut om de inte är det." + }, + "prereqs": { + "heading": "Förutsättningar", + "items": [ + "Processor och moderkort stöder VT-d (Intel) eller AMD-Vi, och funktionen är aktiverad i firmware (BIOS/UEFI). ProxMenux kan aktivera kärnans inställning men inte ändra firmwareinställningen.", + "Mål-VM:n är avstängd innan PCI-enheter ansluts.", + "Controller/NVMe är inte den som innehar Proxmox root-filsystem. Skriptet döljer allt som används av värden.", + "Gästoperativsystemet har drivrutiner för styrenhetens modell. Linux stöder praktiskt taget alla HBA:er direkt; Windows behöver tillverkarens drivrutin installerad innan du startar med styrenheten ansluten." + ], + "warnTitle": "Live migration är inte möjligt", + "warnBody": "En VM med PCI-passthrough är knuten till noden där kortet sitter fysiskt. Livemigrering mellan noder misslyckas. Planera säkerhetskopiering och replikering därefter." + }, + "steps": { + "heading": "Steg-för-steg", + "stepLabel": "Steg", + "list": [ + { + "title": "Välj mål-VM", + "bodyRich": "ProxMenux läser qm list och visar alla VM:ar. Välj den som ska få styrenheten.", + "img": "/disk/nvme-passthrough/vm-selection.png", + "alt": "VM urvalsdialog", + "caption": "VM urvalsdialog" + }, + { + "title": "IOMMU-kontroll", + "bodyRich": "Om IOMMU inte är aktiverat i kärnans kommandorad erbjuder ProxMenux att aktivera det. Skriptet redigerar /etc/kernel/cmdline för systemd-boot eller /etc/default/grub för GRUB och lägger till rätt parameter för din processor:", + "items": [ + "intel_iommu=on för Intel CPU.", + "amd_iommu=on för AMD CPU." + ], + "outro": "En omstart krävs efter ändringen. Skriptet erbjuder omstart nu eller senare; passthrough kan inte fortsätta förrän kärnans nya kommandorad är aktiv.", + "img": "/disk/nvme-passthrough/iommu-warning.png", + "alt": "Dialogrutan IOMMU krävs", + "caption": "IOMMU krävs: erbjudande om aktivering och omstart" + }, + { + "title": "Enhetsuppräkning", + "body": "ProxMenux listar varje lagringskontroll (SATA / SAS HBA) och varje NVMe-enhet på PCI-bussen. För varje enhet den visar:", + "items": [ + "PCI-adress (00:17.0, 01:00.0, ...).", + "Leverantör / enhetsbeskrivning.", + "IOMMU-grupp, med en ⚠-varning om gruppen delas med andra orelaterade enheter.", + "Diskarna som är anslutna till styrenheten, så att du vet vilka som följer med till VM:n." + ], + "img": "/disk/nvme-passthrough/device-list.png", + "alt": "Lista över styrenheter och NVMe-enheter", + "caption": "Lista över styrenheter och NVMe-enheter med information om IOMMU-grupper" + }, + { + "title": "Konfliktdetektering", + "bodyRich": "Skriptet blockerar tydligt osäkra enheter: sådana som redan tilldelats en annan VM via hostpci i dess konfiguration, används av värden som styrenheten för rotdisken, eller ingår i en IOMMU-grupp vars övriga medlemmar inte kan identifieras säkert. Lämpliga enheter går att välja.", + "img": "/disk/nvme-passthrough/conflict-warning.png", + "alt": "Varning om upptäckt konflikt", + "caption": "Konfliktdetektering - enhet blockerad med anledning" + }, + { + "title": "Anslut och slutför", + "bodyRich": "För varje vald enhet kör ProxMenux qm set <VMID> --hostpciN <pci-addr>,pcie=1 och väljer nästa lediga hostpci-plats. Om IOMMU aktiverades under sessionen påminns du om att starta om värden innan VM:n startas.", + "img": "/disk/nvme-passthrough/assignment.png", + "alt": "Tilldelningssammanfattning", + "caption": "Tilldelningsöversikt: hostpciN-platser och anslutna PCI-adresser" + } + ] + }, + "manual": { + "heading": "Manuell motsvarighet" + }, + "troubleshoot": { + "heading": "Felsökning", + "noGroupsTitle": "IOMMU aktiverade men inga grupper under /sys/kernel/iommu_groups/", + "noGroupsBody": "En omstart krävs för att kärnans kommandorad ska börja gälla. Om grupperna fortfarande saknas efter omstart är VT-d/AMD-Vi troligen inaktiverat i firmware. Kontrollera BIOS/UEFI-inställningarna.", + "busyTitle": "VM:n startar inte: \"hostpciN: device busy\"", + "busyBody": "En annan process håller fortfarande PCI-enheten upptagen. Vanliga orsaker är en VM som kraschat utan att frigöra den eller att värdkärnan tog tillbaka den vid senaste starten. Kör lspci -nnk -s <addr> för att se den bundna drivrutinen; den bör vara vfio-pci. En fullständig omstart av värden brukar lösa problemet.", + "noDisksTitle": "Gästen ser styrenheten men inte diskarna", + "noDisksBody": "Gästen saknar drivrutin för styrenhetens modell. Det är ovanligt i Linux men förekommer i Windows: installera tillverkarens drivrutin, exempelvis LSI/Broadcom för äldre SAS-HBA:er, när kortet inte är tilldelat och starta sedan om med kortet tilldelat.", + "sharedTitle": "IOMMU-gruppen innehåller en orelaterad enhet", + "sharedBody": "Alternativ: (a) flytta kortet till en annan PCIe slot för att ändra sin grupp, (b) aktivera ACS override i kärnan för att dela grupper (säkerhet avvägning - forskning innan applicering), eller (c) välja ett annat kort i en renare grupp." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importera disk till VM", + "tail": " — alternativ: anslut en fysisk disk via Proxmox utan fullständig PCIe-passthrough." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Lägg till GPU till VM (Passthrough)", + "tail": " - samma IOMMU / VFIO-koncept som tillämpas på en GPU." + }, + { + "href": "/docs/help-info/gpu-commands", + "label": "GPU Passthrough kommandon", + "tail": " - IOMMU-verifieringskommandon gäller också för styrenhet / NVMe-genomgång." + }, + { + "href": "/docs/disk-manager", + "label": "Disk Manager översikt", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/disk-manager/format-disk.json b/web/messages/sv/docs/disk-manager/format-disk.json new file mode 100644 index 00000000..443bda73 --- /dev/null +++ b/web/messages/sv/docs/disk-manager/format-disk.json @@ -0,0 +1,142 @@ +{ + "meta": { + "title": "Formatera eller radera en fysisk disk | ProxMenux-dokumentation", + "description": "Radera och formatera fysiska diskar på Proxmox VE med ProxMenux. Fyra driftlägen, strikta filter som blockerar systemdiskar, monterade eller använda diskar och dubbel bekräftelse med inmatning av hela sökvägen.", + "ogTitle": "Formatera eller radera en fysisk disk | ProxMenux-dokumentation", + "ogDescription": "Radera eller formatera en fysisk disk på Proxmox. Säkerhetsfilter, fyra driftlägen och dubbel bekräftelse." + }, + "header": { + "title": "Formatera / radera fysisk disk", + "description": "Radera eller formatera en fysisk disk på Proxmox-värden. ProxMenux visar bara helt lediga diskar som inte används av systemet, inte refereras av gäster och inte har några monteringar. Innan data förstörs krävs dubbel bekräftelse: ja/nej och inmatning av hela disksökvägen.", + "section": "Diskhanterare · Verktyg" + }, + "danger": { + "title": "Destruktivt verktyg", + "body": "Varje operation här skriver till disken. Det finns ingen undo. ProxMenux tillämpar strikta säkerhetsfilter och bekräftelser, men ansvaret för att välja rätt disk är din. Läs diskvägen högt två gånger innan du skriver den." + }, + "howRuns": { + "heading": "Så körs skriptet", + "body": "Flödet har två faser med tre säkerhetskontroller emellan. I fas 1 samlas diskval, driftläge och filsystemsuppgifter in. Ingenting skrivs förrän fas 2 klarar en sista förnyad kontroll direkt före körningen." + }, + "visibility": { + "heading": "Synlighetsregler", + "intro": "Innan menyn ens visas filtrerar ProxMenux disklistan. Endast kandidater som är bevisligen säkra visas:", + "items": [ + "Visas: diskar som inte används av värden (rotpool, swap, monteringar, aktiv ZFS/LVM/RAID) och inte refereras i någon VM/LXC-konfiguration, oavsett om gästen körs eller är stoppad.", + "Döljs: värd- och systemdiskar.", + "Döljs: diskar som refereras i en VM/LXC-konfiguration." + ], + "safetyTitle": "Säkerhet vid bekräftelse och utförande", + "safetyItems": [ + "Diskar med gamla eller aktiva metadata visar detaljerade varningar innan du bekräftar.", + "Diskar som används av en körande VM blockeras helt vid bekräftelsen.", + "Diskar med monterade partitioner blockeras helt vid körningen. En ny kontroll görs direkt innan något skrivs.", + "Två bekräftelser krävs alltid: en ja/nej-dialog och exakt inmatning av hela disksökvägen." + ] + }, + "modes": { + "heading": "Operationslägen", + "intro": "Efter att ha valt en disk väljer du en av fyra lägen. De skiljer sig åt i vad de förstör och vad de lämnar efter sig:", + "headerMode": "Läge", + "headerPart": "Partitionstabell", + "headerData": "Data", + "headerUseCase": "Användningsfall", + "rows": [ + { + "mode": "1. Radera allt", + "part": "Förstörd", + "data": "Signaturer raderade", + "useCase": "Ta bort partitionering och metadata för att förbereda en ny layout. Detta skriver inte över alla användardata." + }, + { + "mode": "2. Ta bort FS-etiketter", + "part": "Bevarad", + "data": "Bevarad", + "useCase": "Tar bort gamla ZFS/LVM/RAID-signaturer så att disken inte tas i bruk automatiskt. Användardata skrivs inte över i sin helhet, men borttagna signaturer kan göra dem oåtkomliga." + }, + { + "mode": "3. Nollställ alla data", + "part": "Bevarad", + "data": "Förstörda (överskrivna med nollor)", + "useCase": "Skriv över befintliga partitioner med nollor och behåll partitionstabellen. Oallokerat utrymme och SSD-reservområden omfattas inte; detta garanterar inte fullständig datasanering av enheten." + }, + { + "mode": "4. Fullständigt format", + "part": "Ny GPT", + "data": "Förstörd", + "useCase": "Redo att använda disk med en enda ny partition och ett nytt filsystem." + } + ], + "fullFormatOutro": "Fullständig formatering fortsätter med två ytterligare dialogrutor:", + "fullFormatItems": [ + "Filsystem: ext4, xfs, exfat (portabelt) eller btrfs. Om verktyg som mkfs.btrfs saknas avbryts åtgärden med ett tydligt meddelande.", + "Etikett: valfri filsystemetikett för identifiering." + ] + }, + "steps": { + "heading": "Steg-för-steg", + "stepLabel": "Steg", + "list": [ + { + "title": "Välj en ledig disk", + "body": "ProxMenux listar de diskar som klarar filtren ovan. Diskar märkta med ⚠ har gamla metadata som visas i detalj så att du vet vad du är på väg att skriva över." + }, + { + "title": "Välj ett operationsläge", + "bodyRich": "Välj Radera allt, Ta bort FS-etiketter, Nollställ alla data eller Fullständig formatering enligt tabellen ovan." + }, + { + "title": "(Endast fullständig formatering) Välj filsystem och etikett", + "body": "ext4 / xfs / exfat / btrfs, plus en valfri etikett." + }, + { + "title": "Bekräfta två gånger", + "bodyRich": "ProxMenux visar en sammanfattning av åtgärden. Bekräfta i ja/nej-dialogen och skriv hela disksökvägen exakt som den visas, exempelvis /dev/sdc. All annan inmatning avbryter." + }, + { + "title": "Re-validering och utförande", + "body": "Direkt före skrivningen kontrollerar skriptet diskens tillstånd igen. Om en partition har monterats eller en VM startats under tiden avbryts körningen. Annars utförs den valda åtgärden och en sammanfattning visas efteråt." + } + ] + }, + "manual": { + "heading": "Manuella motsvarigheter", + "body": "Om du föredrar att köra motsvarande kommandon för hand:" + }, + "troubleshoot": { + "notListedTitle": "Disk som inte anges i menyn", + "notListedBody": "Det filtrerades för säkerhet. Vanliga skäl: det är monterat (även på /mnt/tmp), det är en aktiv ZFS / LVM / RAID-medlem, det refereras av en VM eller LXC config, eller det är din Proxmox root disk. Kör lsblk -f och cat /proc/mdstat på värden för att förstå varför.", + "busyTitle": "\"Disk may be busy\" / avmontering misslyckades", + "busyBody": "Något håller fortfarande en öppen fil på en partition av den disken - oftast en container eller ett skal vars cwd är inuti en monteringspunkt. Identifiera det med lsof | grep /dev/sdX eller fuser -vm /dev/sdX1, stoppa det och sedan köra verktyget igen." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "href": "/docs/disk-manager/smart-disk-test", + "label": "SMART-status och disktest", + "tail": " — Kontrollera en disk före / efter att ha torkat för att bekräfta att den är frisk." + }, + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importera disk till VM", + "tail": " — passera en nyformaterad disk till en VM." + }, + { + "href": "/docs/storage-share/host-local-disk", + "label": "Lägg till lokal disk som Proxmox lagring", + "tail": " - registrera en torkad disk som en Proxmox lagringspool." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Kommandon för lagring och diskar", + "tail": " — referens för lsblk, blkid och parted." + }, + { + "href": "/docs/disk-manager", + "label": "Disk Manager översikt", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/disk-manager/import-disk-image-vm.json b/web/messages/sv/docs/disk-manager/import-disk-image-vm.json new file mode 100644 index 00000000..d0674b63 --- /dev/null +++ b/web/messages/sv/docs/disk-manager/import-disk-image-vm.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Importera diskbild till VM | ProxMenux Dokumentation", + "description": "Importera en disk bildfil (.img / .qcow2 / .vmdk / .raw) till en befintlig Proxmox VM med ProxMenux. Per-image gränssnitt, SSD emulering och startbar flagga, med qm importdisk under huven.", + "ogTitle": "Importera diskbild till VM | ProxMenux Dokumentation", + "ogDescription": "Importera .img / .qcow2 / .vmdk / .raw-diskavbildningar till en befintlig VM med ProxMenux. Använder qm importdisk i bakgrunden." + }, + "header": { + "title": "Importera diskavbildning till virtuell dator", + "description": "Importera en diskbildfil (.img, .qcow2, .vmdk eller .raw) till en befintlig Proxmox VM. ProxMenux samlar varje beslut up-front - mål VM, Proxmox lagring, källkatalog, gränssnitt, SSD emulering, startorder - och sedan kör qm importdisk för varje vald avbildning.", + "section": "Diskhanterare · VM" + }, + "intro": { + "title": "Vad detta gör", + "body": "Till skillnad från Importera disk till VM, som ansluter en fysisk disk direkt, använder detta flöde en fil på värden: exporterad från en annan hypervisor, nedladdad som molnavbildning eller extraherad ur en säkerhetskopia. Den omvandlas till en Proxmox-VM-disk på vald lagring. Originalfilen bevaras; ProxMenux kopierar den utan att flytta den." + }, + "howRuns": { + "heading": "Så körs skriptet", + "body": "Flödet har två faser. Fas 1 samlar alla val via dialogrutor: VM, lagring, källkatalog, avbildningar och alternativ för varje avbildning. Fas 2 kör qm importdisk för varje vald avbildning. Innan fas 2 börjar kopieras ingenting och VM-konfigurationen ändras inte." + }, + "prereqs": { + "heading": "Förutsättningar", + "items": [ + "Minst en VM är definierad på värden. Mål-VM:n bör vara avstängd.", + "Minst en diskavbildningsfil i ett format som stöds finns i källkatalogen: .img, .qcow2, .vmdk, .raw.", + "Tillräckligt med ledigt utrymme på målet Proxmox lagring för att hålla varje importerad disk.", + "ProxMenux letar efter avbildningar i /var/lib/vz/template/iso som standard. Du kan peka det på någon annan katalog på värden när den frågar." + ] + }, + "steps": { + "heading": "Steg-för-steg", + "stepLabel": "Steg", + "list": [ + { + "title": "Välj mål-VM", + "bodyRich": "ProxMenux läser qm list och visar alla VM:ar. Välj den som ska få de importerade diskarna." + }, + { + "title": "Välj Proxmox lagring", + "bodyRich": "Listan innehåller varje lagring som har images-innehållstyp aktiverad. Om det bara finns en kandidat är det automatiskt valt och dialogen hoppas över." + }, + { + "title": "Välj källkatalogen", + "bodyRich": "Välj standardkatalogen (/var/lib/vz/template/iso) eller skriv en anpassad väg - vanligtvis där du laddade ner / laddade upp avbildningen. Skriptet avvisar vägar som inte existerar." + }, + { + "title": "Välj en eller flera avbildningar", + "bodyRich": "Katalogen skannas för .img / .qcow2 / .vmdk / .raw filer. Du kan välja flera samtidigt; var och en kommer att gå igenom alternativen per avbildning i nästa steg." + }, + { + "title": "Alternativ per avbildning", + "intro": "För varje vald avbildning frågar ProxMenux:", + "items": [ + "Interface - scsi (standard), virtio, sata eller ide. Matchar hur gästen kommer att se skivan.", + "SSD-emulering: erbjuds bara för andra gränssnitt än VirtIO. Lägger till ssd=1 så att gästen känner igen en SSD. Stöd för discard/TRIM måste konfigureras separat.", + "Startbar: om du väljer ja lägger ProxMenux disken först i VM:ns startordning." + ] + }, + { + "title": "Importera och anslut", + "bodyRich": "ProxMenux kör qm importdisk för varje avbildning och konverterar formatet vid behov. Disken ansluts till nästa lediga plats (scsiN, sataN, …) med valda alternativ. Om någon disk markerats som startbar uppdateras startordningen. Förloppet visas i terminalen." + } + ] + }, + "manual": { + "heading": "Manuell motsvarighet", + "body": "Import av en enda avbildning motsvarar tre qm-kommandon:", + "warnTitle": "Konvertering av avbildningsformat", + "warnBody": "När mållagringen inte kan hålla källformatet inbyggt (till exempel kan LVM-lagring inte hålla .qcow2), konverterar qm importdisk avbildningen transparent. Detta kan ta flera minuter för multi-GB avbildningar; planera därefter och inte avbryta manuset." + }, + "troubleshoot": { + "heading": "Felsökning", + "noImagesTitle": "\"Inga kompatibla diskbilder hittades\"", + "noImagesBody": "Skriptet hittade ingen .img, .qcow2, .vmdk eller .raw-fil. Kontrollera filändelsens stora och små bokstäver, att filen ligger direkt i vald katalog (underkataloger genomsöks inte) och att root får läsa den.", + "slowTitle": "Importen är långsam", + "slowBody": "Konverteringar mellan VMDK, QCOW2 och raw kan begränsas av CPU och in-/utmatning. Hastigheten beror på läsning från källan, skrivning till målet och eventuell dekomprimering. Välj helst raw- eller qcow2-källor när det går.", + "uefiTitle": "Den importerade disken startar i UEFI-skalet", + "uefiBody": "Avbildningen skapades för äldre BIOS-läge (SeaBIOS) men VM:n använder OVMF, eller tvärtom. Ändra VM:ns BIOS i Proxmox så att det matchar avbildningen, eller bygg om avbildningen i rätt läge före importen." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importera disk till VM", + "tail": " — samma flöde för fysiska diskar (passthrough)." + }, + { + "href": "/docs/utils/import-vm", + "label": "Importera VM från OVA / OVF", + "tail": " — När du har ett komplett VM-paket, inte bara en skivbild." + }, + { + "href": "/docs/utils/UUp-Dump-ISO-Creator", + "label": "UUP Dump ISO-skapare", + "tail": " — generera en Windows ISO om du behöver en för en ny installation." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Kommandon för lagring och diskar", + "tail": " — referens för qm importdisk och qemu-img convert." + }, + { + "href": "/docs/disk-manager", + "label": "Disk Manager översikt", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/disk-manager/import-disk-lxc.json b/web/messages/sv/docs/disk-manager/import-disk-lxc.json new file mode 100644 index 00000000..e093ed96 --- /dev/null +++ b/web/messages/sv/docs/disk-manager/import-disk-lxc.json @@ -0,0 +1,115 @@ +{ + "meta": { + "title": "Importera disk till LXC | ProxMenux Dokumentation", + "description": "Bifoga en fysisk disk till en befintlig LXC-behållare på Proxmox VE med ProxMenux. Hantera filsystemdetektering / formatering, monteringspunkt, oprivilegierade → privilegierad omvandling och ihållande enhetsvägar.", + "ogTitle": "Importera disk till LXC | ProxMenux Dokumentation", + "ogDescription": "Bifoga en fysisk disk till en befintlig LXC-behållare. Hantera filsystem, monteringspunkt och oprivilegierad → privilegierad omvandling." + }, + "header": { + "title": "Importera disk till LXC", + "description": "Anslut en fysisk disk till en befintlig LXC-container på Proxmox-värden. ProxMenux hittar lediga diskar, erbjuder formatering med ett filsystem som stöds och ansluter partitionen till en monteringspunkt i containern via beständiga enhetssökvägar.", + "section": "Diskhanterare · LXC" + }, + "intro": { + "title": "VM passthrough vs LXC genomgång", + "body": "Den här LXC-passthroughen ger ingen rå blockenhet. Containern får en monteringspunkt, alltså en katalog på den partition du väljer på värden. Till skillnad från en VM använder gästen värdens kärna, så filsystemet (ext4/xfs/btrfs) läses och hanteras av Proxmox-värden och görs sedan tillgängligt i containern." + }, + "howRuns": { + "heading": "Så körs skriptet", + "body": "Flödet har två faser med tydlig åtskillnad mellan \"samla information och beslut\" och \"faktiskt ändra containerkonfig\". Fram till den slutliga bekräftelsen monteras ingenting i CT.", + "summary": "ProxMenux filtrerar bort rotdisken, monterade diskar och diskar som refereras i VM/LXC-konfigurationer. Aktiva ZFS/LVM/RAID-medlemmar döljs; gamla signaturer märks med ⚠ så att de kan raderas före formatering." + }, + "prereqs": { + "heading": "Förutsättningar", + "items": [ + "Minst en LXC-container definierad på värden.", + "Containern är privilegierad, eller så accepterar du skriptets erbjudande att konvertera den.", + "Minst en fysisk disk som inte används av värden eller någon annan gäst." + ], + "warnTitle": "Privilegierad container krävs", + "warnBody": "Det här skriptet kräver en privilegierad container för direkt diskanslutning. Om det hittar unprivileged: 1 erbjuds ändring av /etc/pve/lxc/<CTID>.conf på plats. Det ändrar säkerhetsmodellen men mappar inte om befintliga filägare. Säkerhetskopiera containern och kontrollera ägarskapet innan du accepterar, eller återskapa den som privilegierad." + }, + "steps": { + "heading": "Steg-för-steg", + "stepLabel": "Steg", + "list": [ + { + "title": "Välj målcontainer", + "img": "/disk/select-container.png", + "caption": "Meny för containerval", + "bodyRich": "ProxMenux listar varje LXC-container på värden (pct list). Välj den som får disken. Om containern är oprivilegierad erbjuds du att konvertera den nu." + }, + { + "title": "Välj den fysiska disken", + "img": "/disk/disk-selection-ct.png", + "caption": "Lediga diskar på värden, med ⚠ för gamla metadata", + "bodyRich": "Bara säkra kandidater visas. Till skillnad från VM-flödet ansluter skriptet en disk per körning. Kör det igen för varje ytterligare disk." + }, + { + "title": "Formatera eller återanvänd", + "intro": "Skriptet inspekterar disken:", + "items": [ + "Om disken redan har ett filsystem som stöds (ext4/xfs/btrfs) kan det återanvändas som det är; befintliga filer bevaras.", + "Om disken saknar ett filsystem som stöds erbjuds formatering. Välj ext4/xfs/btrfs." + ] + }, + { + "title": "Välj monteringspunkten", + "bodyRich": "Ange sökvägen där containern ska se disken, exempelvis /mnt/data eller /mnt/disk_passthrough. Det är sökvägen inne i containern; värden ser redan partitionen under /dev/disk/by-id/…." + }, + { + "title": "Anslut och verifiera", + "img": "/disk/assignment-ct.png", + "caption": "Tilldelning till CT", + "bodyRich": "ProxMenux lägger till en ny mpN:-post i containerkonfigurationen, hoppar över upptagna index och läser konfigurationen igen för att bekräfta. Om containern körs tillämpas monteringen direkt; annars vid nästa start.", + "extraImg": "/disk/result-point.png", + "extraAlt": "Monteringspunkten skapades", + "extraCaption": "Monteringspunkt skapad och verifierad" + } + ] + }, + "manual": { + "heading": "Manuell motsvarighet", + "body": "Skriptet använder pct set. Ett direkt anrop för en enda disk ser ut så här:" + }, + "important": { + "heading": "Viktiga överväganden", + "items": [ + "En disk per körning. Kör skriptet igen för varje ytterligare disk.", + "Anslut inte samma partition till flera containrar som kan montera den samtidigt; samtidiga skrivningar skadar filsystemet.", + "Gamla metadata (RAID/ZFS/LVM-signaturer) måste rensas manuellt innan skriptet tillåter formatering, annars vägrar mkfs att skriva över. Använd Formatera eller radera fysisk disk." + ] + }, + "troubleshoot": { + "heading": "Felsökning", + "unprivTitle": "\"Kan inte fortsätta med en oprivilegierad container\"", + "unprivBody": "Du avböjde konverteringen. Flaggan i /etc/pve/lxc/<CTID>.conf ändras från unprivileged: 1 till unprivileged: 0, men det omvandlar inte befintligt UID/GID-ägarskap. Säkerhetskopiera och hantera ägarmappningen före en konvertering på plats, eller återläs eller återskapa containern som privilegierad.", + "permsTitle": "Behörigheter inne i containern är fel", + "permsBody": "Befintliga filägare behålls när en partition monteras i en privilegierad container; ett nyformaterat filsystem ägs ofta av root:root. Om tjänsten körs som en annan användare, exempelvis www-data för Nextcloud, kontrollera UID/GID och justera berörda filer med chown/chmod. Ändringarna påverkar även den underliggande disken." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "href": "/docs/disk-manager/import-disk-vm", + "label": "Importera disk till VM", + "tail": " - motsvarande flöde för VM." + }, + { + "href": "/docs/storage-share/lxc-mount-points", + "label": "LXC-monteringspunkter (värd ↔ CT)", + "tail": " - dela värdkataloger med en CT istället för att fästa en hel disk." + }, + { + "href": "/docs/help-info/vm-ct-commands", + "label": "Kommandon för VM- och CT-hantering", + "tail": " — pct config / push / pull referens." + }, + { + "href": "/docs/disk-manager", + "label": "Disk Manager översikt", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/disk-manager/import-disk-vm.json b/web/messages/sv/docs/disk-manager/import-disk-vm.json new file mode 100644 index 00000000..036725ac --- /dev/null +++ b/web/messages/sv/docs/disk-manager/import-disk-vm.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Importera disk till VM | ProxMenux Dokumentation", + "description": "Bifoga en fysisk disk till en befintlig Proxmox VM med ProxMenux. Säker diskdetektering (exkluderar system, monterad, in-use, ZFS / RAID / LVM), ihållande /dev/disk/by-id vägar och SATA / SCSI / VirtIO / IDE gränssnitt.", + "ogTitle": "Importera disk till VM | ProxMenux Dokumentation", + "ogDescription": "Bifoga en fysisk disk till en befintlig Proxmox VM. Använder ihållande /dev/disk/by-id vägar och stöder SATA / SCSI / VirtIO / IDE." + }, + "header": { + "title": "Importera disk till VM", + "description": "Anslut en fysisk disk på Proxmox-värden till en befintlig virtuell maskin. ProxMenux hittar lediga diskar, låter dig välja mål-VM och busstyp (SATA/SCSI/VirtIO/IDE) och använder beständiga /dev/disk/by-id-sökvägar. Tilldelningen består då efter omstarter och ändrad enhetsordning.", + "section": "Diskhanterare · VM" + }, + "intro": { + "title": "Vad detta gör", + "body": "En fysisk disk ansluts som underlag för ett virtuellt diskgränssnitt. Gästen får inte automatiskt inbyggda SMART-data eller den fysiska styrenhetens funktioner; använd PCI-passthrough av styrenheten om dessa behövs. Disken ansluts via /dev/disk/by-id/…, inte /dev/sdX, så ändrad enhetsordning vid start bryter inte tilldelningen." + }, + "howRuns": { + "heading": "Så körs skriptet", + "body": "Flödet har två faser med tydlig åtskillnad mellan \"samla information och beslut\" och \"faktiskt fästa diskar till VM\". Fram till den slutliga bekräftelsen är VM-konfig orörd.", + "summary": "ProxMenux filtrerar bort osäkra kandidater: rotdisken, diskar monterade på värden, aktiva ZFS/LVM/RAID-medlemmar och diskar som refereras i VM/LXC-konfigurationer. Diskar med gamla, oanvända ZFS/RAID/LVM-signaturer märks med ⚠ men blockeras inte." + }, + "prereqs": { + "heading": "Förutsättningar", + "items": [ + "Minst en VM definierad på värden (skriptet skickar direkt till qm list).", + "Mål-VM:n är avstängd. Om den körs avbryts skriptet med ett meddelande; tillägg av diskar under drift ingår inte i det här flödet.", + "Minst en fysisk disk på värden som inte används av värden eller någon annan gäst." + ] + }, + "steps": { + "heading": "Steg-för-steg", + "stepLabel": "Steg", + "list": [ + { + "title": "Välj mål-VM", + "bodyRich": "ProxMenux listar alla VM:ar på värden via qm list. Välj den som ska få disken. Om den körs avbryts skriptet och ber dig stänga av den först." + }, + { + "title": "Välj fysiska diskar att ansluta", + "img": "/disk/disk-selection.png", + "caption": "Lediga diskar på värden, med ⚠ för gamla metadata", + "body": "Skriptet granskar värdens diskar och visar bara sådana som kan anslutas utan konflikt. Du kan välja flera samtidigt. Diskar med gamla ZFS/LVM/RAID-signaturer visas fortfarande med ⚠ för att ange att signaturerna behöver raderas innan gästen formaterar dem." + }, + { + "title": "Välj bussgränssnittet", + "img": "/disk/disk-assigment.png", + "caption": "Val av bussgränssnitt", + "intro": "Välj hur gästen ska se skivan:", + "items": [ + "SCSI moderna standard för Linux och Windows med VirtIOSCSI-drivrutiner installerade.", + "SATA bred kompatibilitet, fungerar ur lådan på praktiskt taget alla gäster.", + "VirtIO: effektiv paravirtualiserad blockenhet; kräver drivrutiner i gästen.", + "IDE: för äldre gäster som saknar ovanstående drivrutiner." + ] + }, + { + "title": "Anslut och verifiera", + "bodyRich": "ProxMenux fäster varje vald disk med sin bästa /dev/disk/by-id/-väg, hoppar över slotindex som redan används i VM-konfig (scsi0, sata0, ...) och läser om konfigen för att bekräfta uppdraget. En sammanfattning trycks i slutet." + } + ] + }, + "manual": { + "heading": "Manuell motsvarighet", + "body": "Manuset är en wrapper runt qm set. Det exakta kommandot för en enda disk ser ut så här:", + "migrationTitle": "Live migration är inte möjligt", + "migrationBody": "En VM med en direktansluten fysisk disk är knuten till värden som tillhandahåller disken. En annan nod saknar normalt både samma /dev/disk/by-id/…-sökväg och diskdata. Säkerhetskopiera och överför data separat, eller använd hanterade virtuella diskar på delad lagring eller med replikering som stöds. Utgå inte från att Proxmox lagringsreplikering omfattar enheten.", + "shareTitle": "Dela inte en fysisk disk mellan VM", + "shareBody": "Att fästa samma fysiska disk till två VM samtidigt kommer att korrumpera data på nästa skriv. ProxMenux upptäcker denna situation och blockerar den, men om du kringgår manuset (direkt qm set), se till att endast en gäst någonsin monterar disken." + }, + "troubleshoot": { + "heading": "Felsökning", + "noDisksTitle": "Inga diskar tillgängliga för denna VM", + "noDisksIntro": "Manuset hittade skivor, men varje kandidat filtrerades ut. Vanliga skäl:", + "noDisksItems": [ + "Varje återstående disk refereras redan i målet VM-konfig.", + "Varje återstående disk monteras på värden eller är en del av en aktiv ZFS / LVM / RAID.", + "Värden har bara rotskivan installerad." + ], + "noDisksOutro": "Kör lsblk -f på värden för att granska tillståndet för varje disk.", + "noVisibleTitle": "VM ser inte disken efter start", + "noVisibleBody": "Med SCSI eller VirtIO behöver gästen rätt drivrutin. Linux har den i kärnan; i Windows installerar du den från VirtIO-ISO:n (se Skapa VM: Windows). Att byta till SATA på VM:ns maskinvaruflik är ett snabbt test av diskens tilldelning." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "href": "/docs/disk-manager/import-disk-image-vm", + "label": "Importera diskavbildning till virtuell dator", + "tail": " — samma flöde för diskavbildningsfiler (qcow2 / vmdk / raw / img)." + }, + { + "href": "/docs/disk-manager/import-disk-lxc", + "label": "Importera disk till LXC", + "tail": " - motsvarande flöde för LXC containrar." + }, + { + "href": "/docs/disk-manager/add-controller-nvme-vm", + "label": "Lägg till styrenhet eller NVMe i en VM", + "tail": " — när du behöver fullständig PCIe/NVMe-passthrough i stället för diskanslutning." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Kommandon för lagring och diskar", + "tail": " — referens för qm importdisk och relaterade skalkommandon." + }, + { + "href": "/docs/disk-manager", + "label": "Disk Manager översikt", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/disk-manager/index.json b/web/messages/sv/docs/disk-manager/index.json new file mode 100644 index 00000000..b78eefe9 --- /dev/null +++ b/web/messages/sv/docs/disk-manager/index.json @@ -0,0 +1,135 @@ +{ + "meta": { + "title": "Proxmox diskhanterare: VM/LXC, SMART-test och radering | ProxMenux", + "description": "Hantera fysiska diskar på en Proxmox VE-värd med ProxMenux: anslut diskar till VM eller LXC (qm set scsi/sata/virtio, pct mp), importera img/qcow2/vmdk/raw-avbildningar, tilldela hela HBA:er eller NVMe-styrenheter, radera med säkerhetskontroller och kör SMART-självtester.", + "ogTitle": "Proxmox diskhanterare: VM/LXC, SMART-test och radering", + "ogDescription": "Anslut diskar till VM/LXC, importera avbildningar, använd PCI-passthrough för styrenheter, radera med säkerhetskontroller och kör SMART-test på Proxmox VE.", + "twitterTitle": "Proxmox diskhanterare | ProxMenux", + "twitterDescription": "Anslut diskar till VM/LXC, importera avbildningar, PCI-passthrough, radering med säkerhetskontroller och SMART-test." + }, + "header": { + "title": "Diskhanteraren", + "description": "Menyn Diskhanterare samlar ProxMenux-verktyg för värdens fysiska diskar: anslutning till VM och LXC, import av diskavbildningar, passthrough av en hel styrenhet eller NVMe-enhet, radering med säkerhetskontroller och SMART-test.", + "section": "Diskhanteraren" + }, + "intro": { + "title": "Vad denna meny är för", + "body": "Verktygen arbetar med fysiska diskar som värden ser och avbildningsfiler lagrade på den. Menyn har tre grupper: VM (anslut diskar eller importera avbildningar), LXC (anslut diskar till containrar) och Verktyg (formatering och SMART-status). Anslutning och radering döljer eller blockerar systemdiskar och använda diskar; SMART-kontroller kan granska dem utan att radera dem." + }, + "opening": { + "heading": "Öppna menyn", + "body": "Från ProxMenux huvudmenyn väljer du Disk Manager. Du kommer att se detta:", + "imageAlt": "Disk Manager-menyn med VM, LXC och Utilities block" + }, + "groups": { + "heading": "Tre verktygsgrupper", + "intro": "Disk Manager-menyn är organiserad i tre grupper - VM, LXC och Utilities. Klicka på ett kort för att hoppa direkt till verktygen i den gruppen.", + "vmTitle": "VM", + "vmBody": "Verktyg för befintliga virtuella maskiner. VM:n måste vara avstängd; ProxMenux kontrollerar detta innan konfigurationen ändras.", + "vmItems": [ + "Importera disk till VM", + "Importera diskavbildning till virtuell dator", + "Lägg till styrenhet eller NVMe i en VM" + ], + "lxcTitle": "LXC", + "lxcBody": "Verktyg för befintliga LXC-containrar. Skriptet kräver en privilegierad container och erbjuder att ändra flaggan vid behov. Läs först informationen om konvertering och filägarskap på verktygets sida.", + "lxcItems": [ + "Importera disk till LXC" + ], + "utilitiesTitle": "Verktyg", + "utilitiesBody": "Värdsida verktyg som fungerar på diskarna själva, oberoende av någon VM eller container.", + "utilitiesItems": [ + "Formatera / radera fysisk disk", + "SMART-status och disktest" + ] + }, + "vm": { + "heading": "VM", + "intro": "Verktyg för befintliga virtuella maskiner. VM:n måste vara avstängd; ProxMenux kontrollerar detta innan konfigurationen ändras.", + "options": [ + { + "icon": "HardDrive", + "href": "/docs/disk-manager/import-disk-vm", + "title": "Importera disk till VM", + "description": "Bifoga en otilldelad fysisk disk till en befintlig VM. Stöder SATA / SCSI / VirtIO / IDE, använder ihållande /dev/disk/by-id vägar." + }, + { + "icon": "FileDown", + "href": "/docs/disk-manager/import-disk-image-vm", + "title": "Importera diskavbildning till virtuell dator", + "description": "Importera diskavbildningar (.img / .qcow2 / .vmdk / .raw) till en befintlig VM. Två faser med qm importdisk i bakgrunden." + }, + { + "icon": "Cpu", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "title": "Lägg till styrenhet eller NVMe i en VM", + "description": "PCI-passthrough av en hel SATA/SAS-HBA eller NVMe-enhet till en VM. Hanterar aktivering av IOMMU och konfliktkontroll." + } + ] + }, + "lxc": { + "heading": "LXC", + "intro": "Verktyg för befintliga LXC-containrar. Skriptet kräver en privilegierad container och erbjuder att ändra flaggan vid behov. Läs först informationen om konvertering och filägarskap på verktygets sida.", + "options": [ + { + "icon": "Boxes", + "href": "/docs/disk-manager/import-disk-lxc", + "title": "Importera disk till LXC", + "description": "Bifoga en otilldelad fysisk disk till en befintlig LXC-behållare som fästpunkt. Hantera filsystemdetektering / format och privilegierad omvandling." + } + ] + }, + "utilities": { + "heading": "Verktyg", + "intro": "Värdsida verktyg som fungerar på diskarna själva, oberoende av någon VM eller container.", + "options": [ + { + "icon": "Eraser", + "href": "/docs/disk-manager/format-disk", + "title": "Formatera eller radera fysisk disk (med säkerhetskontroller)", + "description": "Radera diskar med strikta säkerhetskontroller: bara helt lediga diskar visas och dubbel bekräftelse krävs alltid." + }, + { + "icon": "Activity", + "href": "/docs/disk-manager/smart-disk-test", + "title": "SMART-status och disktest", + "description": "Kör SMART hälsokontroller och kort / långa självtester på SATA, SAS och NVMe-enheter. Exporterar JSON för monitorn." + } + ] + }, + "safety": { + "title": "Säkerhetsregler för diskanslutning och radering", + "intro": "Anslutning och radering filtrerar bort enheter som kan skada värden:", + "items": [ + "Systemdisken, rotpoolen, swap och aktiva ZFS/LVM/RAID-medlemmar döljs alltid.", + "Diskar som är monterade någonstans på värden döljs eller blockeras vid körningen.", + "Diskar som refereras av en körande VM eller LXC kan inte tilldelas om eller raderas.", + "Åtgärder som ändrar värdens tillstånd, exempelvis aktivering av IOMMU eller radering, kräver uttrycklig bekräftelse." + ] + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "href": "/docs/storage-share", + "label": "Lagrings- och delningshanterare", + "tail": " - registrera lagring i Proxmox själv (NFS / Samba / iSCSI / lokal) och dela mappar mellan värd och CT." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Kommandon för lagring och diskar", + "tail": " - blockenheter, LVM, pvesm, SMART referens." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Kommandon för ZFS-hantering", + "tail": " — för ZFS pooler och datamängder." + }, + { + "href": "/docs/hardware/gpu-vm-passthrough", + "label": "Lägg till GPU till VM (Passthrough)", + "tail": " - samma IOMMU / VFIO-koncept som tillämpas på GPU." + } + ] + } +} diff --git a/web/messages/sv/docs/disk-manager/smart-disk-test.json b/web/messages/sv/docs/disk-manager/smart-disk-test.json new file mode 100644 index 00000000..2d862f81 --- /dev/null +++ b/web/messages/sv/docs/disk-manager/smart-disk-test.json @@ -0,0 +1,146 @@ +{ + "meta": { + "title": "SMART-status och disktest | ProxMenux-dokumentation", + "description": "Kör SMART hälsokontroller och disktester på Proxmox VE med ProxMenux. Stöder SATA / SAS (smartmontools) och NVMe (nvme-cli). Korta och långa självtester, JSON export för ProxMenux Monitor integration.", + "ogTitle": "SMART-status och disktest | ProxMenux-dokumentation", + "ogDescription": "SMART hälsokontroller och självtest för SATA / SAS och NVMe-enheter på Proxmox. JSON export för Monitor." + }, + "header": { + "title": "SMART-status och disktest", + "description": "Läs SMART-data och starta självtester på värdens fysiska diskar. ProxMenux installerar smartmontools för SATA/SAS och nvme-cli för NVMe, startar testet i diskens firmware (långa tester fortsätter när terminalen stängs) och exporterar JSON-resultat för ProxMenux Monitor.", + "section": "Diskhanterare · Verktyg" + }, + "intro": { + "title": "Vad detta är för", + "body": "SMART (Self-Monitoring, Analysis and Reporting Technology) låter disken rapportera sitt tillstånd och köra självtester. Verktyget visar data utan att du behöver minnas rätt smartctl- eller nvme-anrop och sparar utdata som JSON så att Monitor kan visa trender över tid." + }, + "howRuns": { + "heading": "Så körs skriptet", + "body": "Alla åtgärder är icke-destruktiva: SMART läser firmware-räknare och självtester körs inne i disken. Ingen fasindelning behövs. Flödet är: beroendekontroll → diskval → åtgärdsval → anrop av smartctl eller nvme-cli beroende på disktyp → visad utdata och JSON-export för Monitor." + }, + "deps": { + "heading": "Beroenden", + "body": "Verktyget installerar automatiskt vad det behöver på första körningen. SATA / SAS-enheter är beroende av smartmontools; NVMe-enheter är beroende av nvme-cli. Båda:" + }, + "actions": { + "heading": "Tillgängliga åtgärder", + "headerAction": "Handling", + "headerWhat": "Vad som läses eller körs", + "headerDur": "Varaktighet", + "rows": [ + { + "action": "Snabb hälsostatus", + "whatRich": "Totalt PASSED/FAILED + nyckelattribut.
smartctl -H + -A (SATA/SAS) eller nvme smart-log (NVMe).", + "dur": "Omedelbart" + }, + { + "action": "Fullständig rapport", + "whatRich": "Komplett SMART data, rullbar. smartctl -x för SATA/SAS eller nvme smart-log + id-ctrl för NVMe.", + "dur": "Omedelbart" + }, + { + "action": "Kort test", + "what": "Grundläggande kontroll av lagringsytan och elektroniken i diskens firmware.", + "dur": "~2 minuter" + }, + { + "action": "Långt test", + "what": "Full skanning av hela ytan. Körs på hårdvaran - kvarstår även om du stänger terminalen.", + "dur": "Timmar (diskstorlek beroende)" + }, + { + "action": "Kontrollera testförlopp", + "what": "Status för det aktiva eller senaste självtestet.", + "dur": "Omedelbart" + } + ], + "tipTitle": "Långa tester fortsätter när terminalen stängs", + "tipBody": "Ett långt test körs inne i disken och kräver inte att ProxMenux-processen fortsätter. Du kan stänga terminalen och återkomma till Kontrollera testförlopp. Omstart av värden, återställning av styrenheten eller strömavbrott kan avbryta testet och resultatinsamlingen; utgå inte från att de återupptas automatiskt." + }, + "json": { + "heading": "JSON export för Monitor", + "intro": "Status-, korttest- och förloppsåtgärder skriver en tidsstämplad JSON-fil till /usr/local/share/proxmenux/smart/<disk>/; långa testers resultat samlas i bakgrunden. Den fullständiga rapporten visas bara. Strukturen är:", + "outro": "ProxMenux Monitor plockar upp dessa för att göra hälsotrender per disk; gamla filer roteras automatiskt när lagringsgränsen nås." + }, + "steps": { + "heading": "Steg-för-steg", + "stepLabel": "Steg", + "list": [ + { + "title": "Välj en disk", + "body": "ProxMenux listar varje fysisk disk på värden med sin modell och storlek. Till skillnad från Format-verktyget filtreras inte den här listan av säkerhet - läs SMART är en icke-destruktiv operation.", + "img": "/disk/smart/disk-selection.png", + "alt": "SMART diskval meny", + "caption": "SMART diskval meny" + }, + { + "title": "Välj en åtgärd", + "body": "Välj snabb status, fullständig rapport, kort test, långt test eller kontroll av testförlopp. Menyn hålls öppen efter varje åtgärd så att du kan göra flera förfrågningar mot samma disk.", + "img": "/disk/smart/action-menu.png", + "alt": "SMART åtgärdsmenyn", + "caption": "SMART åtgärdsmenyn (5 åtgärder + avbryta)" + }, + { + "title": "(Endast långt test) Bekräfta bakgrundskörning", + "body": "ProxMenux informerar om att testet fortsätter när terminalen stängs och visar var JSON-resultatet sparas. Bekräfta för att starta testet.", + "img": "/disk/smart/long-test-warning.png", + "alt": "Lång testbekräftelsedialog", + "caption": "Lång testbekräftelse - körs i bakgrunden, vilket sparas till JSON" + }, + { + "title": "Granska resultat", + "bodyRich": "Status och rapporter visas i terminalen; JSON exporteras för åtgärderna ovan, inte för Fullständig rapport. För långa tester återkommer du till Kontrollera testförlopp på samma disk.", + "img": "/disk/smart/quick-status.png", + "alt": "Utdata från snabb statuskontroll", + "caption": "Snabb hälsostatusutgång (SATA - smartctl -H + -A)" + } + ] + }, + "manual": { + "heading": "Manuella motsvarigheter", + "nvmeWarnTitle": "NVMe-självtester beror på diskens firmware", + "nvmeWarnBody": "Inte varje NVMe-enhet stöder det korta / långa självtestkommandot. Om en enhet vägrar testet är SMART-loggen och ID-kontrolldata (nvme smart-log + id-ctrl) fortfarande den mest tillförlitliga hälsosignalen." + }, + "troubleshoot": { + "heading": "Felsökning", + "noSmartTitle": "\"Kan inte läsa SMART data från /dev/sdX\"", + "noSmartBody": "Disken sitter troligen bakom en RAID/SAS-styrenhet som inte vidarebefordrar SMART. För megaraid-kort kan du prova smartctl -d megaraid,N /dev/sdX. För HBA:er i IT-läge fungerar det direkta anropet.", + "longTitle": "Långt test slutför aldrig", + "longBody": "Testet körs i diskens firmware och hög I/O-belastning kan fördröja det. Prova en lugn period, exempelvis över natten. För SATA/SAS visar smartctl -c återstående procent; självtestloggen visar slutstatus och eventuella felaktiga LBA:er. Läsfel behöver undersökas; långsamt förlopp bevisar inte i sig en dålig sektor." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "href": "/docs/disk-manager/format-disk", + "label": "Formatera / radera fysisk disk", + "tail": " — Återanvänd en disk efter att ha bekräftat att den är frisk." + }, + { + "href": "/docs/help-info/storage-commands", + "label": "Kommandon för lagring och diskar → SMART-status", + "tail": " — referens för smartctl/nvme med kommandon att kopiera." + }, + { + "href": "/docs/help-info/zfs-commands", + "label": "Kommandon för ZFS-hantering", + "tail": " — zpool scrub verifierar ZFS-datas kontrollsummor och kompletterar hårdvarans SMART-test." + }, + { + "href": "/docs/monitor/dashboard/storage", + "label": "ProxMenux Monitor - Lagringsflik", + "tail": " — detaljerad diskvy som använder exporterad JSON: fullständig SMART-tabell, historik och PDF-rapport." + }, + { + "href": "/docs/monitor/dashboard/hardware", + "label": "ProxMenux Monitor — maskinvarufliken", + "tail": " - Lagring Sammanfattning med modell, kapacitet och förhandlad länkhastighet (nuvarande vs maximum på NVMe)." + }, + { + "href": "/docs/disk-manager", + "label": "Disk Manager översikt", + "tail": "." + } + ] + } +} From ea6f6dbf6e736758d23a4119ef08c6b8287e799a Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:08:53 +0200 Subject: [PATCH 18/73] docs: review backup and restore documentation in all seven translations --- .github/workflows/test-i18n.yml | 10 + .../docs/backup-restore/creating-backups.json | 220 ++++++++++++++ .../de/docs/backup-restore/cross-kernel.json | 170 +++++++++++ .../backup-restore/destinations/borg.json | 234 +++++++++++++++ .../backup-restore/destinations/index.json | 110 +++++++ .../backup-restore/destinations/local.json | 75 +++++ .../docs/backup-restore/destinations/pbs.json | 113 +++++++ .../de/docs/backup-restore/glossary.json | 230 ++++++++++++++ .../de/docs/backup-restore/how-it-works.json | 205 +++++++++++++ .../de/docs/backup-restore/index.json | 93 ++++++ .../de/docs/backup-restore/restoring.json | 282 ++++++++++++++++++ .../docs/backup-restore/scheduled-jobs.json | 152 ++++++++++ .../en/docs/backup-restore/cross-kernel.json | 126 ++++++-- .../backup-restore/destinations/borg.json | 144 +++++++-- .../backup-restore/destinations/index.json | 6 +- .../docs/backup-restore/destinations/pbs.json | 6 +- .../en/docs/backup-restore/glossary.json | 4 +- .../en/docs/backup-restore/how-it-works.json | 6 +- .../en/docs/backup-restore/restoring.json | 20 +- .../docs/backup-restore/scheduled-jobs.json | 103 +++++-- .../docs/backup-restore/creating-backups.json | 44 +-- .../es/docs/backup-restore/cross-kernel.json | 132 ++++++-- .../backup-restore/destinations/borg.json | 22 +- .../backup-restore/destinations/index.json | 14 +- .../backup-restore/destinations/local.json | 12 +- .../docs/backup-restore/destinations/pbs.json | 22 +- .../es/docs/backup-restore/glossary.json | 26 +- .../es/docs/backup-restore/how-it-works.json | 12 +- .../es/docs/backup-restore/index.json | 24 +- .../es/docs/backup-restore/restoring.json | 34 +-- .../docs/backup-restore/scheduled-jobs.json | 22 +- .../docs/backup-restore/creating-backups.json | 220 ++++++++++++++ .../fr/docs/backup-restore/cross-kernel.json | 170 +++++++++++ .../backup-restore/destinations/borg.json | 234 +++++++++++++++ .../backup-restore/destinations/index.json | 110 +++++++ .../backup-restore/destinations/local.json | 75 +++++ .../docs/backup-restore/destinations/pbs.json | 113 +++++++ .../fr/docs/backup-restore/glossary.json | 230 ++++++++++++++ .../fr/docs/backup-restore/how-it-works.json | 205 +++++++++++++ .../fr/docs/backup-restore/index.json | 93 ++++++ .../fr/docs/backup-restore/restoring.json | 282 ++++++++++++++++++ .../docs/backup-restore/scheduled-jobs.json | 152 ++++++++++ .../docs/backup-restore/creating-backups.json | 220 ++++++++++++++ .../it/docs/backup-restore/cross-kernel.json | 170 +++++++++++ .../backup-restore/destinations/borg.json | 234 +++++++++++++++ .../backup-restore/destinations/index.json | 110 +++++++ .../backup-restore/destinations/local.json | 75 +++++ .../docs/backup-restore/destinations/pbs.json | 113 +++++++ .../it/docs/backup-restore/glossary.json | 230 ++++++++++++++ .../it/docs/backup-restore/how-it-works.json | 205 +++++++++++++ .../it/docs/backup-restore/index.json | 93 ++++++ .../it/docs/backup-restore/restoring.json | 282 ++++++++++++++++++ .../docs/backup-restore/scheduled-jobs.json | 152 ++++++++++ .../docs/backup-restore/creating-backups.json | 220 ++++++++++++++ .../pt/docs/backup-restore/cross-kernel.json | 170 +++++++++++ .../backup-restore/destinations/borg.json | 234 +++++++++++++++ .../backup-restore/destinations/index.json | 110 +++++++ .../backup-restore/destinations/local.json | 75 +++++ .../docs/backup-restore/destinations/pbs.json | 113 +++++++ .../pt/docs/backup-restore/glossary.json | 230 ++++++++++++++ .../pt/docs/backup-restore/how-it-works.json | 205 +++++++++++++ .../pt/docs/backup-restore/index.json | 93 ++++++ .../pt/docs/backup-restore/restoring.json | 282 ++++++++++++++++++ .../docs/backup-restore/scheduled-jobs.json | 152 ++++++++++ .../docs/backup-restore/creating-backups.json | 220 ++++++++++++++ .../sk/docs/backup-restore/cross-kernel.json | 170 +++++++++++ .../backup-restore/destinations/borg.json | 234 +++++++++++++++ .../backup-restore/destinations/index.json | 110 +++++++ .../backup-restore/destinations/local.json | 75 +++++ .../docs/backup-restore/destinations/pbs.json | 113 +++++++ .../sk/docs/backup-restore/glossary.json | 230 ++++++++++++++ .../sk/docs/backup-restore/how-it-works.json | 205 +++++++++++++ .../sk/docs/backup-restore/index.json | 93 ++++++ .../sk/docs/backup-restore/restoring.json | 282 ++++++++++++++++++ .../docs/backup-restore/scheduled-jobs.json | 152 ++++++++++ .../docs/backup-restore/creating-backups.json | 220 ++++++++++++++ .../sv/docs/backup-restore/cross-kernel.json | 170 +++++++++++ .../backup-restore/destinations/borg.json | 234 +++++++++++++++ .../backup-restore/destinations/index.json | 110 +++++++ .../backup-restore/destinations/local.json | 75 +++++ .../docs/backup-restore/destinations/pbs.json | 113 +++++++ .../sv/docs/backup-restore/glossary.json | 230 ++++++++++++++ .../sv/docs/backup-restore/how-it-works.json | 205 +++++++++++++ .../sv/docs/backup-restore/index.json | 93 ++++++ .../sv/docs/backup-restore/restoring.json | 282 ++++++++++++++++++ .../docs/backup-restore/scheduled-jobs.json | 152 ++++++++++ 86 files changed, 11849 insertions(+), 244 deletions(-) create mode 100644 web/messages/de/docs/backup-restore/creating-backups.json create mode 100644 web/messages/de/docs/backup-restore/cross-kernel.json create mode 100644 web/messages/de/docs/backup-restore/destinations/borg.json create mode 100644 web/messages/de/docs/backup-restore/destinations/index.json create mode 100644 web/messages/de/docs/backup-restore/destinations/local.json create mode 100644 web/messages/de/docs/backup-restore/destinations/pbs.json create mode 100644 web/messages/de/docs/backup-restore/glossary.json create mode 100644 web/messages/de/docs/backup-restore/how-it-works.json create mode 100644 web/messages/de/docs/backup-restore/index.json create mode 100644 web/messages/de/docs/backup-restore/restoring.json create mode 100644 web/messages/de/docs/backup-restore/scheduled-jobs.json create mode 100644 web/messages/fr/docs/backup-restore/creating-backups.json create mode 100644 web/messages/fr/docs/backup-restore/cross-kernel.json create mode 100644 web/messages/fr/docs/backup-restore/destinations/borg.json create mode 100644 web/messages/fr/docs/backup-restore/destinations/index.json create mode 100644 web/messages/fr/docs/backup-restore/destinations/local.json create mode 100644 web/messages/fr/docs/backup-restore/destinations/pbs.json create mode 100644 web/messages/fr/docs/backup-restore/glossary.json create mode 100644 web/messages/fr/docs/backup-restore/how-it-works.json create mode 100644 web/messages/fr/docs/backup-restore/index.json create mode 100644 web/messages/fr/docs/backup-restore/restoring.json create mode 100644 web/messages/fr/docs/backup-restore/scheduled-jobs.json create mode 100644 web/messages/it/docs/backup-restore/creating-backups.json create mode 100644 web/messages/it/docs/backup-restore/cross-kernel.json create mode 100644 web/messages/it/docs/backup-restore/destinations/borg.json create mode 100644 web/messages/it/docs/backup-restore/destinations/index.json create mode 100644 web/messages/it/docs/backup-restore/destinations/local.json create mode 100644 web/messages/it/docs/backup-restore/destinations/pbs.json create mode 100644 web/messages/it/docs/backup-restore/glossary.json create mode 100644 web/messages/it/docs/backup-restore/how-it-works.json create mode 100644 web/messages/it/docs/backup-restore/index.json create mode 100644 web/messages/it/docs/backup-restore/restoring.json create mode 100644 web/messages/it/docs/backup-restore/scheduled-jobs.json create mode 100644 web/messages/pt/docs/backup-restore/creating-backups.json create mode 100644 web/messages/pt/docs/backup-restore/cross-kernel.json create mode 100644 web/messages/pt/docs/backup-restore/destinations/borg.json create mode 100644 web/messages/pt/docs/backup-restore/destinations/index.json create mode 100644 web/messages/pt/docs/backup-restore/destinations/local.json create mode 100644 web/messages/pt/docs/backup-restore/destinations/pbs.json create mode 100644 web/messages/pt/docs/backup-restore/glossary.json create mode 100644 web/messages/pt/docs/backup-restore/how-it-works.json create mode 100644 web/messages/pt/docs/backup-restore/index.json create mode 100644 web/messages/pt/docs/backup-restore/restoring.json create mode 100644 web/messages/pt/docs/backup-restore/scheduled-jobs.json create mode 100644 web/messages/sk/docs/backup-restore/creating-backups.json create mode 100644 web/messages/sk/docs/backup-restore/cross-kernel.json create mode 100644 web/messages/sk/docs/backup-restore/destinations/borg.json create mode 100644 web/messages/sk/docs/backup-restore/destinations/index.json create mode 100644 web/messages/sk/docs/backup-restore/destinations/local.json create mode 100644 web/messages/sk/docs/backup-restore/destinations/pbs.json create mode 100644 web/messages/sk/docs/backup-restore/glossary.json create mode 100644 web/messages/sk/docs/backup-restore/how-it-works.json create mode 100644 web/messages/sk/docs/backup-restore/index.json create mode 100644 web/messages/sk/docs/backup-restore/restoring.json create mode 100644 web/messages/sk/docs/backup-restore/scheduled-jobs.json create mode 100644 web/messages/sv/docs/backup-restore/creating-backups.json create mode 100644 web/messages/sv/docs/backup-restore/cross-kernel.json create mode 100644 web/messages/sv/docs/backup-restore/destinations/borg.json create mode 100644 web/messages/sv/docs/backup-restore/destinations/index.json create mode 100644 web/messages/sv/docs/backup-restore/destinations/local.json create mode 100644 web/messages/sv/docs/backup-restore/destinations/pbs.json create mode 100644 web/messages/sv/docs/backup-restore/glossary.json create mode 100644 web/messages/sv/docs/backup-restore/how-it-works.json create mode 100644 web/messages/sv/docs/backup-restore/index.json create mode 100644 web/messages/sv/docs/backup-restore/restoring.json create mode 100644 web/messages/sv/docs/backup-restore/scheduled-jobs.json diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 2b3e4685..7f4dfb51 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -9,15 +9,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' push: branches: [main, develop] paths: @@ -27,15 +32,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' workflow_dispatch: permissions: diff --git a/web/messages/de/docs/backup-restore/creating-backups.json b/web/messages/de/docs/backup-restore/creating-backups.json new file mode 100644 index 00000000..b33b1a24 --- /dev/null +++ b/web/messages/de/docs/backup-restore/creating-backups.json @@ -0,0 +1,220 @@ +{ + "meta": { + "title": "Backups erstellen – interaktiver Backup-Flow | ProxMenux", + "description": "Der interaktive Backup-Ablauf in ProxMenux: zwei Einstiegspunkte (das TUI-Menü von Scripts und die Weboberfläche von Monitor), drei Ziele, zwei Profilmodi, ein gemeinsamer Vorbereitungsschritt und ein Bestätigungsdialog. Beschrieben werden die Matrix mit sechs Optionen, das Standardprofil und das benutzerdefinierte Profil sowie die Schritte von der Auswahl eines Backups bis zum Speichern des Archivs am Ziel.", + "ogTitle": "ProxMenux Backup — Erstellen von Backups", + "ogDescription": "Der interaktive Backup-Flow mit drei Destinationen, zwei Profilen und einem gemeinsamen Staging-Schritt.", + "twitterTitle": "Backups erstellen | ProxMenux", + "twitterDescription": "Interaktiver Backup-Flow mit drei Zielen und zwei Profilmodi." + }, + "header": { + "title": "Backups erstellen", + "description": "Der interaktive Backup-Ablauf: Wählen Sie ein Ziel und ein Profil, prüfen Sie die Zusammenfassung und verfolgen Sie, wie das Archiv gespeichert wird. Beide Einstiegspunkte verwenden dasselbe Backend und erzeugen identische Archive.", + "section": "Sicherung und Wiederherstellung" + }, + "intro": { + "title": "Zwei Einstiegspunkte, identische Funktionalität", + "body": "Die TUI von Scripts und die Weboberfläche von Monitor bieten genau dieselben Funktionen. Jedes Backup — manuell oder geplant — durchläuft dieselbe Auswahlmatrix (drei Ziele × zwei Profile) und ruft pro Zelle dieselbe Backend-Funktion auf (_bk_pbs, _bk_borg oder _bk_local). Die über beide Einstiegspunkte erzeugten Archive sind nicht zu unterscheiden. Die Wahl ist Geschmackssache: Die TUI eignet sich für SSH und Skripte; Monitor bietet Mausbedienung sowie Ansichten für Benachrichtigungen und laufende Protokollausgaben." + }, + "entryPoints": { + "heading": "Die beiden Eingangspunkte", + "rows": [ + { + "entry": "ProxMenux Scripts (TUI)", + "path": "menu → Utilities → Host Config Backup", + "detail": "Dialogbasierter Flow, SSH-freundlich. Das Hauptmenü präsentiert die sechs Optionen direkt. Verwendet backup_menu in backup_host.sh." + }, + { + "entry": "ProxMenux Monitor (Weboberfläche)", + "path": "Backups tab → Create backup", + "detail": "Assistentengestützter Ablauf. Dieselben sechs Optionen erscheinen als zweistufiges Formular (Ziel → Profil). Über die Flask-API werden dieselben Backend-Funktionen aufgerufen." + } + ] + }, + "modes": { + "heading": "Manuelle vs. geplante Backups", + "body": "Backups können in zwei Modi erstellt werden: manuell (der interaktive Fluss, den diese Seite dokumentiert - der Benutzer wählt ein Ziel und ein Profil aus einem Menü aus und verfolgt das Speichern des Archivs) oder geplant (ein unbeaufsichtigter Job, der auf einem Cron-Timer läuft und die für den Job konfigurierte Aufbewahrung anwendet). Beide Modi unterstützen die gleichen drei Ziele und die gleichen zwei Profile, und beide sind von beiden Einstiegspunkten verfügbar - dem Scripts TUI-Menü und der Registerkarte Monitor-Backups. Geplante Jobs verwenden die gleichen Backend-Funktionen wie der manuelle Ablauf durch run_scheduled_backup.sh; die produzierten Archive sind nicht zu unterscheiden.", + "seeAlso": "Die Seite mit geplanten Aufträgen deckt den gesamten Ablauf ab, einschließlich der Art und Weise, wie Sie einen Auftrag erstellen, ihn an einen vorhandenen PVE vzdump-Timer anhängen und die Retentionswerte konfigurieren.", + "monitorAlt": "ProxMenux Monitor Backups Registerkarte zeigt den Neuen geplanten Backup-Dialog mit Ziel, Profil, Zeitplan und Aufbewahrungsfelder.", + "monitorCaption": "Geplantes Backup — ProxMenux Monitor. Derselbe Wizard-Dialog, der ein manuelles Backup erstellt, trägt die Zeitplan- und Aufbewahrungsfelder unten für den unbeaufsichtigten Pfad." + }, + "matrix": { + "heading": "Die Matrix mit sechs Optionen", + "intro": "Die Auswahl bestimmt sowohl das ausgeführte Backend als auch die Strategie zur Pfadauswahl. Die zielspezifischen Seiten erläutern die Konfiguration jeder Zelle.", + "rows": [ + { + "combo": "1", + "destination": "PBS", + "profile": "Standard", + "action": "Lädt das Standardprofil plus persistente Extras in ein konfiguriertes PBS-Repository hoch." + }, + { + "combo": "2", + "destination": "Borg", + "profile": "Standard", + "action": "Erstellt ein Archiv mit dem Standardprofil plus persistenten Extras im ausgewählten Borg-Repository." + }, + { + "combo": "3", + "destination": "Lokal", + "profile": "Standard", + "action": "Schreibt ein .tar.zst-Archiv mit dem Standardprofil plus persistenten Extras an das konfigurierte lokale Ziel." + }, + { + "combo": "4", + "destination": "PBS", + "profile": "Benutzerdefiniert", + "action": "Öffnet vor dem PBS-Upload die Pfadauswahl; der Benutzer markiert die gewünschten Pfade und kann neue hinzufügen." + }, + { + "combo": "5", + "destination": "Borg", + "profile": "Benutzerdefiniert", + "action": "Öffnet den Pfadwähler, bevor das Borg-Archiv erstellt wird." + }, + { + "combo": "6", + "destination": "Lokal", + "profile": "Benutzerdefiniert", + "action": "Öffnet den Pfadwähler vor dem Schreiben des lokalen .tar.zst." + } + ] + }, + "profiles": { + "heading": "Standardprofil und benutzerdefiniertes Profil", + "defaultTitle": "Standardprofil", + "defaultBody": "Das Standardprofil ist die kuratierte Liste aus hb_default_profile_paths (dokumentiert in Funktionsweise unter Pfadkategorien) sowie jeder Eintrag in der persistenten Extras-Datei /usr/local/share/proxmenux/backup-extra-paths.txt. Der Benutzer bestätigt die Ziel- und Verschlüsselungsoptionen und das Backup verläuft ohne weitere Pfadauswahl.", + "customTitle": "Benutzerdefiniertes Profil", + "customBody": "Das benutzerdefinierte Profil öffnet eine Checkliste mit allen Pfaden des Standardprofils (nicht markiert) und allen persistenten Extras (vormarkiert, mit dem Präfix [+]). Der Benutzer markiert die Pfade für diesen Durchlauf und kann über Benutzerdefinierten Pfad hinzufügen einen neuen absoluten Pfad ergänzen. Jeder dabei hinzugefügte Pfad wird in backup-extra-paths.txt gespeichert, damit künftige Backups ihn automatisch berücksichtigen. Das Abwählen eines persistenten Extras gilt nur für diesen Durchlauf und löscht es nicht aus der Datei — dafür gibt es außerhalb des Backup-Ablaufs die separate Aktion Benutzerdefinierte Pfade verwalten.", + "customPickerAlt": "Benutzerdefinierte Profil-Checkliste mit den Standard-Profilpfaden (nicht markiert) und persistenten Extras (vormarkiert mit einem [+]-Präfix) sowie Schaltflächen, um einen neuen Pfad hinzuzufügen oder die Auswahl zu bestätigen.", + "customPickerCaption": "Benutzerdefiniertes Profil — die Pfadauswahl. Die Pfade des Standardprofils sind nicht markiert; persistente Extras sind mit dem Präfix [+] vormarkiert. Der Benutzer markiert die Pfade für diesen Durchlauf.", + "manageCustomAlt": "Menü zur Verwaltung benutzerdefinierter Pfade mit der Liste persistenter Extras und Optionen zum Hinzufügen, Entfernen und Bearbeiten.", + "manageCustomCaption": "Benutzerdefinierte Pfade verwalten - der Einstiegspunkt, an dem persistente Extras hinzugefügt oder entfernt werden. Jeder hier aufgeführte Pfad wird automatisch in Backups im Standardmodus aufgenommen, ohne dass die benutzerdefinierte Pfadauswahl geöffnet werden muss." + }, + "commonPipeline": { + "heading": "Was läuft unabhängig vom Ziel", + "intro": "Nachdem das Profil aufgelöst wurde, führt jedes Backend die gleiche Staging-Pipeline aus, bevor es in seinen eigenen Upload-Pfad divergiert. hb_prepare_staging stellt den Archivbaum in /tmp/proxmenux-DESTINATION-stage.XXXXXX zusammen und füllt jede der drei Nutzlasten aus.", + "steps": [ + { + "step": "1", + "name": "rootfs zusammenstellen", + "detail": "Führt rsync -a für jeden ausgewählten Pfad in staging_root/rootfs/ aus. Die pmxcfs-Datenbank bei /var/lib/pve-cluster/config.db wird separat über sqlite3 .backup erfasst, um einen konsistenten Snapshot zu erstellen, ohne den Cluster zu stoppen, und die .db-wal / .db-shm Sidecars sind vom rsync ausgeschlossen; Wenn sqlite3 nicht verfügbar ist, wird stattdessen eine Datei config.db.raw-fallback abgelegt, die bei der Wiederherstellung während des Imports als Datenbank übernommen wird. Flüchtige Subpfade (Bash-Historie, Caches, Trash) sind von /root/ ausgeschlossen. Pfade, die in der Quelle fehlen, werden in metadata/missing_paths.txt aufgezeichnet, ohne das Backup zu stoppen." + }, + { + "step": "2", + "name": "Manifest erstellen", + "detail": "build_manifest.sh steuert die sechs Datensammler und schreibt manifest.json in das Hauptverzeichnis des Staging-Bereichs. Fällt ein Datensammler aus, erhält der betroffene Abschnitt einen dokumentierten leeren Standardwert; das Manifest bleibt gültig." + }, + { + "step": "3", + "name": "Paketbestand", + "detail": "apt-mark showmanual wird wortwörtlich in metadata/packages.manual.list erfasst. Der Komponentenzustand befindet sich bereits innerhalb der wiederhergestellten Rootfs (components_status.json), da /usr/local/share/proxmenux/ Teil des Standardprofils ist." + }, + { + "step": "4", + "name": "Informationen zum Durchlauf", + "detail": "metadata/run_info.env zeichnet die Backup-Laufidentität (Hostname, Zeitstempel, Kernelversion) auf, die von der Kompatibilitätsprüfung der Wiederherstellung zur Bestimmung der kernübergreifenden Richtung verwendet wird." + }, + { + "step": "5", + "name": "Mitteilung (Beginn)", + "detail": "hb_notify_lifecycle \"start\" wird ausgelöst. Sind im Monitor Benachrichtigungen konfiguriert, wird das Ereignis Host-Backup gestartet für den Benutzer ausgegeben. Ohne konfigurierte Kanäle erfolgt keine Benachrichtigung." + } + ] + }, + "included": { + "heading": "Was reingeht und was draußen bleibt", + "intro": "Jeder Pfad im aufgelösten Profil (Standard + persistente Extras + Custom-Mode-Auswahl) wird mit rsync -aAXH --numeric-ids kopiert. Eine gemeinsame Ausschlussliste gilt für jeden Pfad, und zwei Verzeichnisse tragen zusätzliche pfadspezifische Ausschlüsse.", + "globalTitle": "Globale Ausschlüsse (auf jeden Pfad angewendet)", + "globalItems": [ + "images/ — Image Dumps.", + "dump/ — Ausgaben von vzdump.", + "tmp/ — temporäre Dateien.", + "*.log — Protokolldateien." + ], + "rootTitle": "/root/ Ausschlüsse", + "rootBody": "/root/ ist Teil des Standardprofils, sodass Benutzerskripte und Konfigurationen im Archiv landen. Flüchtige Subpfade werden fallen gelassen:", + "rootItems": [ + ".bash_history", + ".cache/", + "tmp/", + ".local/share/Trash/" + ], + "proxmenuxTitle": "/usr/local/share/proxmenux/ Ausschlüsse", + "proxmenuxBody": "Dieses Verzeichnis liefert nur Benutzerstatus - components_status.json, Einstellungen, Cache nach der Installation. Code, den das Ziel bereits von seiner eigenen ProxMenux-Installation haben wird, ist ausgeschlossen, so dass eine Wiederherstellung die aktuellen Binärdateien des Ziels nicht mit älteren überschreibt:", + "proxmenuxItems": [ + "restore-pending/, scripts/, web/", + "monitor-app/, monitor-app.*/, AppImage/", + "images/, json/", + "utils.sh, helpers_cache.json", + "ProxMenux-Monitor.AppImage*, install_proxmenux*.sh" + ], + "notInProfileTitle": "Pfade außerhalb des Profils", + "notInProfileBody": "Alles, was nicht in hb_default_profile_paths aufgeführt ist und nicht als benutzerdefiniertes oder persistentes Extra hinzugefügt wurde, ist nicht Teil des Backups. Bemerkenswerte Beispiele:", + "notInProfileItems": [ + "VM und LXC Festplatten — werden von vzdump behandelt, nicht von dieser Funktion. Gastkonfigurationsdateien unter /etc/pve/nodes/*/qemu-server/*.conf und lxc/*.conf werden erfasst (sie leben unter /etc/pve), so dass die Wiederherstellung das Inventar reproduziert; die Festplatten selbst werden von einem vorhandenen vzdump / PBS-Backup neu angehängt.", + "/boot und /boot/efi — Kernel-Binärdateien, Initramfs und die UEFI-ESP-Partition werden nach der Wiederherstellung durch die eigenen update-initramfs, update-grub oder proxmox-boot-tool refresh des Ziels regeneriert. Der Bootloader wird niemals wörtlich kopiert.", + "Kernel und Systemlaufzeit-Dateisysteme — /proc, /sys, /dev und /run sind Pseudo-Dateisysteme, die vom Kernel und von udev erzeugt werden; sie werden nirgendwo persistent.", + "Paket-Binärdateien unter /usr/bin, /usr/lib, /lib, /sbin — vom APT des Ziels aus packages.manual.list neu installiert.", + "/var/log/, /var/tmp/, /var/cache/ — Laufzeitzustand pro Host, nicht wiederhergestellt.", + "/home/USER — nicht im Standardprofil. Fügen Sie es als benutzerdefinierten Pfad hinzu, wenn ein System Heimverzeichnisse des Benutzers trägt, die eine Wiederherstellung überleben müssen." + ], + "customPathsTitle": "Wie benutzerdefinierte Pfade gehandhabt werden", + "customPathsBody": "Ein benutzerdefinierter Pfad, der im benutzerdefinierten Modus hinzugefügt wurde oder in backup-extra-paths.txt persistiert wurde, durchläuft dieselbe rsync-Pipeline wie Standardprofilpfade. Globale Ausschlüsse gelten. Wenn der benutzerdefinierte Pfad unter /root/ oder /usr/local/share/proxmenux/ liegt, gelten die oben genannten pfadspezifischen Ausschlüsse weiterhin. Jeder archivierte Pfad – standardmäßig oder benutzerdefiniert – wird in metadata/paths_archived.txt aufgezeichnet. Pfade, die in der Quelle nicht vorhanden sind, werden in metadata/missing_paths.txt aufgezeichnet, ohne das Backup zu stoppen." + }, + "archiveStructure": { + "heading": "Archivstruktur", + "intro": "Das von jedem Backend erstellte Staging-Verzeichnis folgt unabhängig vom Ziel dem gleichen Layout. Das Tarball-, PBS .pxar oder Borg-Archiv speichert diesen Baum wortwörtlich.", + "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│ ├── paths_archived.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": "Bestätigungszusammenfassung", + "body": "Bevor das Backend etwas an das Ziel schreibt, zeigt ProxMenux einen zusammenfassenden Dialog mit dem Ziel, der Backup-ID oder dem Archivnamen, dem Verschlüsselungsstatus und der Liste der zu kopierenden Pfade an. Das Abbrechen hier bricht das Backup sauber ab - das Staging-Verzeichnis wird durch den trap-Hook entfernt, der auf der Backend-Funktion eingestellt ist, und keine Teildaten erreichen das Ziel." + }, + "writing": { + "heading": "Schreiben an den Bestimmungsort", + "intro": "Sobald der Benutzer bestätigt, führt jedes Backend seinen eigenen Schreibschritt aus. Die Mechanik wird auf den Zielseiten behandelt; die gemeinsame Oberfläche ist das Protokoll, das Sidecar und die Abschlussbenachrichtigung.", + "rows": [ + { + "topic": "Protokolldatei", + "detail": "Jedes Backend schreibt seine vollständige Ausgabe in /tmp/proxmenux-DESTINATION-backup-YYYYMMDD_HHMMSS.log und bietet bei Ausfall an, sie in einem scrollbaren Dialog zu öffnen. Der Protokollpfad wird in der Abschlusszusammenfassung nur dann gedruckt, wenn die Datei Inhalt hat." + }, + { + "topic": "Begleitdatei (nur lokal)", + "detail": "hb_write_archive_sidecar legt einen *.proxmenux.json neben das lokale Archiv, so dass der Monitor ihn als ProxMenux-Host-Backup auch nach Umzügen oder Umbenennungen identifiziert." + }, + { + "topic": "Benachrichtigung (Abschluss/Fehler)", + "detail": "hb_notify_lifecycle \"complete\" oder \"fail\" wird mit Dauer, Archivgröße und — bei Fehlern — der letzten nach einem Fehler aussehenden Protokollzeile ausgelöst." + } + ] + }, + "finishedScreens": { + "heading": "Wie ein fertiges Backup aussieht", + "intro": "Das gleiche Abschlussereignis wird an beiden Einstiegspunkten angezeigt. Die TUI schreibt einen Zusammenfassungsblock in das Terminal; die Registerkarte Backups des Monitors zeigt den Ablauf in der Archivliste mit Größe, Dauer und Statusabzeichen an.", + "scriptsAlt": "ProxMenux Scripts TUI zeigt ein fertiges Host-Backup an - Ziel, Backup-ID, Snapshot-Pfad, Datengröße, Dauer und Verschlüsselungszustand.", + "scriptsCaption": "Abgeschlossenes Backup — ProxMenux Scripts (TUI). Der Vervollständigungsblock druckt das Ziel, die Backup-ID, den resultierenden Snapshot- oder Archivnamen, die Datengröße, die Dauer und den Verschlüsselungszustand.", + "monitorAlt": "Die Registerkarte ProxMenux Monitor Backups zeigt einen fertigen Host-Backup-Eintrag mit Größe, Dauer, Methodenabzeichen und Verschlüsselungsindikator.", + "monitorCaption": "Abgeschlossenes Backup — ProxMenux Monitor Backups Registerkarte. Das neue Backup erscheint in der Archivliste mit dem Zielmethode-Badge, der Größe, der Dauer und gegebenenfalls dem Verschlüsselungssperrindikator." + }, + "whereNext": { + "heading": "Wohin Sie als nächstes gehen", + "items": [ + { + "label": "Ziele", + "href": "/docs/backup-restore/destinations", + "tail": "— Konfigurationsdetails für Local, PBS und Borg." + }, + { + "label": "Geplante Aufträge", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "- das gleiche Backup unbeaufsichtigt nach einem Zeitplan anstatt interaktiv auszuführen." + }, + { + "label": "Wiederherstellung", + "href": "/docs/backup-restore/restoring", + "tail": "— der Fluss, der verbraucht, was diese Seite produziert." + } + ] + } +} diff --git a/web/messages/de/docs/backup-restore/cross-kernel.json b/web/messages/de/docs/backup-restore/cross-kernel.json new file mode 100644 index 00000000..fb78e27e --- /dev/null +++ b/web/messages/de/docs/backup-restore/cross-kernel.json @@ -0,0 +1,170 @@ +{ + "meta": { + "title": "Wiederherstellung zwischen Kernel-Versionen — Richtungserkennung, Sicherheitsfilter und Ergänzung | ProxMenux", + "description": "Wie ProxMenux ein Host-Backup auf einem Ziel mit einer anderen Hauptkernelversion wiederherstellt. Dokumentiert, wie die Richtung der Fehlanpassung erkannt wird, den Safe-Subset-Filter, der bootkritische Pfade überspringt, wenn das Ziel einen neueren Kernel als das Backup ausführt, und die vierphasige Kernel-agnostische Hydratation, die Benutzertuning wie IOMMU, VFIO IDs und benutzerdefinierte Cmdline-Token erneut anwendet, ohne Kernel-gebundene Dateien wörtlich zu kopieren.", + "ogTitle": "ProxMenux Backup — kernübergreifende Wiederherstellung und Hydratation", + "ogDescription": "Wiederherstellung zwischen Kernel-Versionen mit Richtungserkennung, sicherer Pfadauswahl und kernelunabhängiger Ergänzung.", + "twitterTitle": "Cross-Kernel-Wiederherstellung | ProxMenux", + "twitterDescription": "Wie ProxMenux eine Wiederherstellung durchführt, wenn sich der Zielkernel vom Backup unterscheidet." + }, + "header": { + "title": "Kernübergreifende Wiederherstellung", + "description": "Wie ProxMenux eine Wiederherstellung durchführt, wenn der Zielhost einen anderen Kernel als den im Backup aufgezeichneten ausführt - insbesondere wenn das Ziel einen neueren Kernel ausführt. Dokumentiert, wie der Unterschied erkannt wird, wie bootkritische Pfade, die das Ziel unterbrechen könnten, gefiltert werden und wie die eigene Konfiguration des Benutzers erneut angewendet wird, ohne Kernel-gebundene Dateien wörtlich zu kopieren.", + "section": "Sicherung und Wiederherstellung" + }, + "intro": { + "title": "Jeder Kernelsprung wird anders gehandhabt", + "body": "Der Kernel eines Proxmox-Hosts wird durch eine Versionszeichenfolge wie 6.17.13-2-pve identifiziert. Die ersten beiden Zahlen (6.17 in diesem Beispiel) definieren die Hauptversion: Wenn sie sich ändern, sind einige Konfigurationsdateien, die für den vorherigen Kernel geschrieben wurden, möglicherweise nicht für den neuen gültig. Wenn die Wiederherstellung erkennt, dass das Backup und das Ziel unterschiedliche Hauptkernelversionen haben, verzweigt sich der Fluss basierend auf der Richtung des Sprungs - ob das Backup älter oder neuer als das Ziel ist - weil die beiden Fälle entgegengesetzte Fehlermodi haben. Backups, die neuer sind als das Ziel, stellen sauber wieder her, wie sie sind (bench-verifiziert über mehrere Kernelsprünge). Backups, die älter als das Ziel sind, benötigen einen Filter, um zu vermeiden, dass der Boot des Ziels mit einer Konfiguration unterbrochen wird, die für einen Kernel geschrieben wurde, der sich seitdem geändert hat." + }, + "directionCheck": { + "heading": "Die Richtungskontrolle", + "intro": "Während der Kompatibilitätsprüfung vergleicht hb_compat_check den im Backup-Manifest aufgezeichneten Kernel mit dem aktuellen Kernel des Ziels (uname -r) und klassifiziert die Wiederherstellung in einen von drei Fällen, die in der internen Variable HB_COMPAT_KERNEL_DIRECTION gespeichert sind:", + "rows": [ + { + "direction": "same", + "condition": "Die Hauptkernelversion stimmt zwischen Backup und Target überein.", + "behavior": "Der vollständige Restaurationsfluss läuft unverändert. Kein extra Filter, keine Hydratation, kein besonderer Hinweis in der UI." + }, + { + "direction": "bk_newer", + "condition": "Der Backup-Kernel ist NEUER als der des Ziels (zum Beispiel: Das Backup wurde auf dem Kernel 7.0 erstellt und das Ziel führt den Kernel 6.17 aus).", + "behavior": "Der vollständige Wiederherstellungsfluss läuft unverändert, genau wie same. Es wird kein Filter angewendet. Empirisch verifiziert: Treiber werden automatisch gegen den Zielkernel neu installiert, IOMMU config wird sauber angewendet, VMs mit GPU-Durchgang kommen ohne Probleme auf." + }, + { + "direction": "bk_older", + "condition": "Der Backup-Kernel ist älter als der des Ziels (zum Beispiel: Das Backup wurde auf dem Kernel 6.17 erstellt und das Ziel führt den Kernel 7.0 aus).", + "behavior": "Der Safe-Subset-Filter und die folgende vierphasige Hydratation werden aktiviert. Die Wiederherstellung geht weiter - das Ziel reproduziert die Quelle, aber bootkritische Dateien werden nicht wörtlich kopiert." + } + ] + }, + "whyBkNewerIsSafe": { + "heading": "Warum ein Backup mit einem neueren Kernel als das Ziel unverändert wiederherstellt", + "body": "Wenn die Wiederherstellung gegen ein Ziel mit einem älteren-Kernel als dem im Backup aufgezeichneten läuft, ist jeder Mechanismus, von dem die Wiederherstellung abhängt, unabhängig von der Kernelversion. GPU-Treiberinstallateure und andere PCI-Geräteinstallateure erkennen den laufenden Kernel mit uname -r und kompilieren DKMS mit dem, was das Ziel hat. Die APT-Paketinstallation zieht Binärdateien, die für die Verteilung des Ziels erstellt wurden. IOMMU-Cmdline-Token wie intel_iommu=on sind in den wichtigsten Kernelversionen stabil. Das Backup trägt Pfade, die unter einem neueren Kernel geschrieben wurden, aber diese Pfade (Module Blacklists, GRUB Defaults, Initramfs Config) sind immer noch gültige Syntax auf dem älteren - Kernel ignorieren Token, die sie nicht erkennen, anstatt zu scheitern. Dieser Fall entspricht in der Praxis einer Wiederherstellung des gleichen Kerns, und ProxMenux behandelt ihn als solchen." + }, + "safeSubsetFilter": { + "heading": "Der Safe-Subset-Filter (nur wenn der Zielkernel neuer ist)", + "intro": "Wenn der Zielkernel neuer ist als das Backup, fügt die Kompatibilitätsprüfung 16 bootkritische Pfade von hb_unsafe_paths_cross_version zu RS_SKIP_PATHS hinzu. Diese Pfade sind von der Wiederherstellung ausgeschlossen, da das Schreiben einer Version von ihnen aus einem älteren Kernel über ein Ziel mit einem neueren Kernelpanik in Bench-Tests verursacht hat. Die Pfade umfassen fünf Kategorien:", + "categoryRows": [ + { + "category": "Bootloader", + "paths": "/etc/default/grub, /etc/kernel", + "reason": "GRUB-Standards, die an die vorherige Kernel-Order gebunden sind, und proxmox-boot-tool-Status (cmdline, ESP-UUIDs, Hooks), der auf Pfade und Identifikatoren aus der älteren Installation verweist." + }, + { + "category": "Kernelmodule und Bootartefakte", + "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", + "reason": "Autoload-Listen, die möglicherweise auf Module verweisen, die zwischen Kernel-Majors umbenannt wurden, Moduloptionen, die möglicherweise nicht gelten, Initramfs-Hooks, die für den älteren Kernel geschrieben wurden." + }, + { + "category": "Storage Stack und Filesystem Identität", + "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", + "reason": "UUIDs, die in dieser Installation möglicherweise nicht vorhanden sind, Multipath-Treiber, die zwischen Kerneln wechseln, iSCSI-Parameter, die sich entwickeln, udev-Regeln, die an nicht vorhandene Subsysteme binden können, ZFS-Zustand (zpool.cache + hostid), der den Pool als fremd sperren kann." + }, + { + "category": "APT-Quellen", + "paths": "/etc/apt", + "reason": "APT-Source-Suiten können beim nächsten Upgrade ein Downgrade kritischer Pakete auslösen." + }, + { + "category": "systemd", + "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", + "reason": "Unit overrides und .wants, die an den älteren systemd Major gebunden sind; Konfigurationsschlüssel, die möglicherweise nicht auf einem neueren systemd analysiert werden." + } + ], + "outroBody": "Der Filter läuft VOR dem Bestätigungsdialog, so dass der Benutzer die genaue Liste der Pfade sieht, die nach dem Grund kategorisiert übersprungen werden. Die Wiederherstellung geht weiter - alles andere (VM-/LXC-Konfiguration, Netzwerk, /etc/pve, Benutzer, cron, ProxMenux-Zustand, Pakete, Treiber, /root) wird normal wiederhergestellt." + }, + "hydration": { + "heading": "Kern-agnostische Hydratation", + "intro": "Der Filter überspringt bootkritische Dateien; die Ergänzung übernimmt ausgewählte Benutzereinstellungen wie IOMMU-Parameter, VFIO-IDs, eigenes GRUB_TIMEOUT und nvidia-Sperrlisten. Sie läuft bei neuerem Zielkernel. Cmdline-Schlüssel des Ziels bleiben erhalten und fehlende Module werden ergänzt. Freigegebene GRUB-Werte und Benutzerdateien können abweichende Zielinhalte ersetzen. Gleiche Eingaben sind bei Wiederholung idempotent.", + "phaseRows": [ + { + "phase": "1a — GRUB-Trasse", + "detail": "Für Hosts mit GRUB (ext4/lvm-Installationen). _rs_hyd_grub führt jedes Token aus dem manifest.kernel_params.cmdline_extra des Backups in das GRUB_CMDLINE_LINUX_DEFAULT des Ziels ein und überspringt Token, deren Schlüssel das Ziel bereits trägt. Dann werden die GRUB_*-Schlüssel auf der weißen Liste (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) aus dem /etc/default/grub des Backups zusammengeführt, wenn sie sich von denen des Ziels unterscheiden." + }, + { + "phase": "1b — systemd-boot / ZFS", + "detail": "Für Hosts mit systemd-Boot (normalerweise ZFS-on-root). _rs_hyd_kernel_cmdline verschmilzt Benutzer-Token von cmdline_extra in /etc/kernel/cmdline des Ziels, wobei die eigene root=, boot= und rootflags= Boilerplate des Ziels intakt bleibt." + }, + { + "phase": "2 — /etc/modules-Merge", + "detail": "_rs_hyd_modules fügt Module aus manifest.kernel_params.modules_loaded_at_boot hinzu, die sich in der Whitelist befinden (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) UND nicht bereits im /etc/modules des Ziels vorhanden sind." + }, + { + "phase": "3 — Kopie von Dateien auf der weißen Liste", + "detail": "_rs_hyd_files kopiert vom Benutzer verfasste Dateien von den Staging-Rootfs zum Live-Ziel, wenn sich der Inhalt unterscheidet. Whitelist umfasst VFIO/nvidia / Blacklist-Dateien unter /etc/modprobe.d, /etc/modules-load.d und die ProxMenux VFIO Binderegel + nvidia udev Regeln unter /etc/udev/rules.d. Distro-eigene Dateien (pve-blacklist.conf, mdadm.conf, nvme.conf) werden absichtlich ausgeschlossen - ihre Inhalte entwickeln sich zwischen den Releases." + }, + { + "phase": "4 — Neubildung nach dem Booten erzwingen", + "detail": "Die vier Phasen schreiben direkt an das Live-Ziel außerhalb der normalen Wiederherstellungspipeline. Damit die zusammengeführten Token/Module/Dateien beim nächsten Booten wirksam werden, breitet sich HB_HYDRATION_APPLIED=1 durch plan.env bis apply_pending_restore.sh aus, was NEEDS_INITRAMFS=1 und NEEDS_GRUB=1 unabhängig davon erzwingt, was in der Anwendungsliste war. Der Post-Boot-Dispatcher regeneriert dann Initramfs und aktualisiert den Bootloader." + } + ] + }, + "planCommit": { + "heading": "Plan vs Commit - der Benutzer sieht zuerst eine Vorschau", + "body": "Die Hydratation läuft in zwei Modi. Vor dem Bestätigungsdialog führt ProxMenux _rs_apply_bk_older_hydration im plan-Modus aus: Es berechnet genau, was zusammengeführt werden würde, füllt RS_HYDRATION_SUMMARY mit einem grünen Block, der jede Aktion auflistet, und gibt ohne zu schreiben zurück. Der Bestätigungsdialog zeigt den grünen Block neben der gelben Liste der durch den Sicherheitsfilter übersprungenen Pfade an, sodass der Benutzer VORAB sieht, was automatisch erneut angewendet wird. Nachdem der Benutzer bestätigt hat, führt ProxMenux den gleichen Helfer im commit-Modus erneut aus - gleiche Phasen, gleiche Logik, aber dieses Mal schreibt jede Phase an das Live-Ziel. Das Abbrechen des Bestätigungsdialogs lässt das Ziel unberührt." + }, + "flowDiagram": { + "heading": "Der Flow, wenn der Zielkernel neuer ist als das Backup", + "intro": "Die Schritte, die hinzugefügt werden, wenn der Zielkernel neuer ist, befinden sich innerhalb des normalen Wiederherstellungsflusses. Alles andere - heißes Aufbringen, ausstehende Vorbereitung, Paketinstallation, Post-Boot-Dispatcher - läuft identisch mit einer Wiederherstellung mit dem gleichen Kern.", + "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": "Konkrete Beispiele", + "intro": "Der Hydratationspass ist nicht abstrakt - er erzeugt beobachtbare, korrekte Ergebnisse für gängige Szenarien. Zwei Beispiele, die Hydratation automatisch handhaben:", + "rows": [ + { + "scenario": "GPU-Durchgang (VFIO)", + "detail": "Quelle hatte intel_iommu=on iommu=pt in der cmdline, vfio/vfio_pci/vfio_iommu_type1 in /etc/modules, ein /etc/modprobe.d/vfio.conf mit options vfio-pci ids=10de:2216 und ein /etc/modprobe.d/blacklist-nvidia.conf. Hydration führt die Cmdline-Token in die GRUB- oder Kernel-Cmdline des Ziels ein, fügt die vfio-Module an /etc/modules an und kopiert die beiden vom Benutzer verfassten Modprobe-Dateien. Beim nächsten Booten ist IOMMU aktiv, VFIO-Module laden, der GPU ist an vfio-pci gebunden und der VM hat Passthrough-Funktionen." + }, + { + "scenario": "Custom GRUB-Standards", + "detail": "Quelle hatte GRUB_TIMEOUT=1 und GRUB_DISABLE_OS_PROBER=true. Hydration liest beide Schlüssel aus dem /etc/default/grub des Backups und sieht, dass sie sich von den Standardeinstellungen der Neuinstallation unterscheiden, und schreibt diese beiden Zeilen in der Zieldatei um (alles andere, einschließlich GRUB_DISTRIBUTOR, bleibt unberührt)." + } + ] + }, + "callout": { + "warningTitle": "Was bei neuerem Zielkernel nicht erneut angewendet wird", + "warningBody": "Hydration wendet nur die Konfiguration ProxMenux an, von der bekannt ist, dass sie in Kernelversionen sicher ist: IOMMU-Token, VFIO-IDs, GRUB-Schlüssel auf der weißen Liste und Module aus einer festen Liste (vfio*, nvidia*, i915, xe, kvm*). Alles außerhalb dieses Sets - benutzerdefinierte Initramfs-Hooks unter /etc/initramfs-tools/hooks/, nicht auf der weißen Liste stehende Dateien unter /etc/modprobe.d/, vom Benutzer verfasste systemd-Unit-Overrides - bleibt ausgeschlossen. Der Grund dafür ist konkret: Diese Dateien können Kernel-interne Schnittstellen (Modul-APIs, /sys-Layout, udev-Hooks) aufrufen, die zwischen den Hauptversionen wechseln, und ihre wörtliche Anwendung auf den neueren Kernel kann das Booten des Ziels verhindern. Wenn eine exakte Reproduktion der Bootkette erforderlich ist, muss die Wiederherstellung auf einem Host mit der gleichen Hauptkernelversion wie das Backup ausgeführt werden." + }, + "codeReference": { + "heading": "Wo die Mechanismen leben", + "intro": "Für Entwickler, die das Cross-Kernel-Verhalten verfolgen oder erweitern möchten:", + "rows": [ + { + "component": "Richtungserkennung", + "location": "hb_compat_check in lib_host_backup_common.sh. Setzt HB_COMPAT_KERNEL_DIRECTION." + }, + { + "component": "Liste sicherer Teilstrecken", + "location": "hb_unsafe_paths_cross_version in lib_host_backup_common.sh. Sendet path\\treason-Linien aus, die sowohl vom CLI-Filter als auch vom Web-Endpunkt /api/host-backups/restore/prepare verwendet werden." + }, + { + "component": "Hydratationsphasen", + "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files in backup_host.sh. Orchestriert von _rs_apply_bk_older_hydration." + }, + { + "component": "Neubildung nach dem Booten erzwingen", + "location": "apply_pending_restore.sh liest HB_HYDRATION_APPLIED von plan.env und zwingt NEEDS_INITRAMFS=1/NEEDS_GRUB=1." + }, + { + "component": "Web Preview", + "location": "/api/host-backups/restore/prepare in flask_server.py. Lädt die Hilfsbibliothek, führt _rs_apply_bk_older_hydration im Planmodus aus und gibt die Aktionen an den Webmodal zurück." + } + ] + }, + "whereNext": { + "heading": "Wohin Sie als nächstes gehen", + "items": [ + { + "label": "Wiederherstellung", + "href": "/docs/backup-restore/restoring", + "tail": "— die vollständige Wiederherstellungspipeline der Mechanismen dieser Seite." + }, + { + "label": "Wie es funktioniert", + "href": "/docs/backup-restore/how-it-works", + "tail": " — Manifest und Erfassungsroutinen, die den von der Ergänzung gelesenen Block kernel_params erzeugen." + } + ] + } +} diff --git a/web/messages/de/docs/backup-restore/destinations/borg.json b/web/messages/de/docs/backup-restore/destinations/borg.json new file mode 100644 index 00000000..6b523e64 --- /dev/null +++ b/web/messages/de/docs/backup-restore/destinations/borg.json @@ -0,0 +1,234 @@ +{ + "meta": { + "title": "Borg-Ziel — Repository-Typen, SSH-Authentifizierung, Verschlüsselung | ProxMenux", + "description": "Das Borg-Ziel speichert ProxMenux-Host-Backups in einem Borg-Repository: lokal, auf einem eingehängten externen Datenträger oder auf einem per SSH erreichbaren Server. Beschrieben werden die Suche nach der ausführbaren borg-Datei, die vier anfänglichen SSH-Schlüsseloptionen, repokey-Verschlüsselung, gespeicherte Ziele und Aufbewahrungsregeln je geplantem Auftrag.", + "ogTitle": "ProxMenux Backup — Zielort Borg", + "ogDescription": "So speichert ProxMenux Host-Backups in Borg-Repositories mit SSH-Authentifizierung und repokey-Verschlüsselung.", + "twitterTitle": "Borg Backup Ziel | ProxMenux", + "twitterDescription": "Lokale, USB- und SSH-gestützte Borg-Repositories für Host-Backups." + }, + "header": { + "title": "Borg", + "description": "Das Borg-Ziel schreibt Host-Backups in ein Borg-Repository. Es werden drei Repository-Typen unterstützt: lokaler Dateisystempfad, eingehängte externe Festplatte oder Remote-Server über SSH. Chunk-Level-Deduplizierung über alle Archive im Repository und optionale Repokey-Verschlüsselung.", + "section": "Sicherung und Wiederherstellung" + }, + "aboutBorg": { + "heading": "Was Borg ist", + "body": "Borg (auch BorgBackup geschrieben) ist ein Open-Source-Deduplizierungs-Backup-Tool, das von der Borg Backup-Community verwaltet wird. Es speichert jedes Archiv als eine Reihe von Blöcken variabler Länge in einem Repository; Blöcke werden über Archive hinweg geteilt, so dass das erneute Sichern unveränderter Daten nahezu Null Speicherkosten verursacht. Borg ist nicht an Proxmox gebunden - es ist ein universelles Backup-Tool, das in vielen Umgebungen verwendet wird. ProxMenux verwendet es als eines der drei Ziele für Host-Backups; jeder auf dieser Seite beschriebene Borg-spezifische Mechanismus (Repository-Typen, borg-serve über SSH, Repokey-Verschlüsselung, prune) ist Standard-Borg-Verhalten." + }, + "intro": { + "title": "Chunk-basierte Deduplizierung mit lokalen oder SSH-servierten Repositorys", + "body": "Ein Borg-Repository speichert Brocken, die in jedem enthaltenen Archiv geteilt werden, so dass das erneute Sichern einer unveränderten Datei nichts Neues überträgt und speichert. ProxMenux ruft borg create zum Backup-Zeitpunkt und borg extract zum Wiederherstellungszeitpunkt gegen ein Repository auf. Das Repository kann auf demselben Dateisystem wie die Quelle, auf einer montierten externen Festplatte oder auf einem Remote-Host, auf den über SSH zugegriffen wird, leben." + }, + "binarySourcing": { + "heading": "Die ausführbare borg-Datei", + "intro": "Borg ist keine Basisabhängigkeit des ProxMenux-Installationsprogramms. Wenn ein Backup ausgeführt wird, löst hb_ensure_borg die Binärdatei in der Reihenfolge aus vier Quellen auf und gibt die erste zurück, die funktioniert:", + "rows": [ + { + "priority": "1", + "source": "Systemweites borg", + "detail": "Wenn der Host bereits borg über APT installiert hat (which borg löst auf), wird diese Binärdatei verwendet." + }, + { + "priority": "2", + "source": "State-Dir-Cache", + "detail": "/usr/local/share/proxmenux/borg — aus einem früheren GitHub-Download auf diesem Host aufbewahrt." + }, + { + "priority": "3", + "source": "AppImage-Paket des Monitors", + "detail": "/usr/local/share/proxmenux/monitor-app/usr/bin/borg — der AppImage bündelt einen signierten borg-linux64. Dies ist der offline-sichere Pfad: Ein Host ohne Internet hat immer noch einen funktionierenden borg." + }, + { + "priority": "4", + "source": "GitHub Download", + "detail": "wget gegen die angepinnte borg-linux64-URL unter github.com/borgbackup/borg/releases/, verifiziert gegen eine Konstante SHA-256 in lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). Bei Checksummenfehlanpassung wird die Binärdatei verworfen und das Backup abgebrochen. Die heruntergeladene Datei wird im State Dir zwischengespeichert, so dass nachfolgende Backups den Pfad 2 verwenden." + } + ] + }, + "repoTypes": { + "heading": "Repository-Typen", + "intro": "Der Repository-Typ wird ausgewählt, wenn ein Ziel hinzugefügt wird. Jeder Typ löst sich in einer anderen Repository-URL auf, die Borg versteht.", + "rows": [ + { + "type": "remote", + "url": "ssh://USER@HOST/RPATH", + "detail": "Repository lebt auf einem Remote-Server, auf dem borg serve ausgeführt wird. Erfordert eine SSH-Verbindung zu diesem Server." + }, + { + "type": "usb", + "url": "/mnt/MOUNTPOINT/borgbackup", + "detail": "Repository lebt auf einer montierten externen Festplatte (normalerweise USB). Die Mount wird über hb_prompt_mounted_path aufgelöst, das USB-Partitionen nach Bedarf erkennt, einhängt oder formatiert." + }, + { + "type": "local", + "url": "/backup/borgbackup (any absolute path)", + "detail": "Repository lebt in einem lokalen Verzeichnis. Bedeutsam nur, wenn sich das Zielverzeichnis auf einer separaten physischen Festplatte befindet – ein Repository auf derselben Festplatte wie die Quelle schützt vor Operatorfehlern, aber nicht vor Festplattenausfällen." + } + ] + }, + "serverSetup": { + "heading": "Vorbereitung des Borg-Servers (Serverseite)", + "intro": "Der Repository-Typ remote setzt einen funktionierenden, per SSH erreichbaren Borg-Server voraus. ProxMenux richtet den Server nicht selbst ein; es autorisiert nur einen Schlüssel für ein vorhandenes Konto. Dieser Abschnitt beschreibt, was der Server vor der Verbindung benötigt.", + "hostChoicesTitle": "Wo der Server leben kann", + "hostChoicesBody": "Jeder Linux-Host mit SSH-Zugang ist qualifiziert. Gemeinsame Setups:", + "hostChoicesItems": [ + "Eine dedizierte NAS- oder Backup-Box (Debian, Ubuntu, TrueNAS SCALE mit einer Shell).", + "Ein LXC Container in einem Proxmox Knoten. Kleiner Footprint, isoliert vom Host, der die Backups ausführt.", + "Ein anderer Proxmox-Host im selben LAN oder ein VM, der über SSH erreichbar ist." + ], + "lxcWarningTitle": "LXC als Borg-Server", + "lxcWarningBody": "Läuft der Borg-Server in einem LXC, benötigt generate-auto zur Schlüsselinstallation ein Konto, das SSH-Passwortanmeldung erlaubt. Ist diese nicht verfügbar, verwenden Sie die manuelle Installation oder generate-pct über den PVE-Host.", + "requirementsTitle": "Anforderungen an den Server", + "requirementsRows": [ + { + "requirement": "Ausführbare borg-Datei unter /usr/bin/borg", + "detail": "Die Zeile command=\"/usr/bin/borg serve ...\", die ProxMenux in authorized_keys einträgt, verwendet diesen festen Pfad. APT (apt install borgbackup) installiert das Programm dort. Für eine separat installierte Binärdatei ist ein symbolischer Link unter /usr/bin/borg nötig." + }, + { + "requirement": "Ein dediziertes Benutzerkonto (normalerweise borg)", + "detail": "Besitzt das Repository-Verzeichnis und empfängt eingehende SSH-Verbindungen. Benötigt keinen sudo- oder shell-zugriff - die authorized_keys-linie deaktiviert interaktive shells sowieso." + }, + { + "requirement": "Ein beschreibbares Repository Verzeichnis", + "detail": "Der vom Betreiber angegebene Pfad ProxMenux (z. B. /backup/borgbackup) muss auf dem Server vorhanden sein und im Besitz des borg-Benutzers sein." + }, + { + "requirement": "SSH Daemon akzeptiert den Borg-Benutzer", + "detail": "PubkeyAuthentication yes (Standard). Die Passwort-Authentifizierung wird nur für den One-Shot generate-auto-Flow benötigt – nachdem der Schlüssel installiert wurde, kann der Server das Passwort auth vollständig deaktivieren." + } + ], + "minimalSetupTitle": "Minimale Server-Einrichtung", + "minimalSetupBody": "Auf einem Debian- oder Ubuntu-Borg-Server besteht eine Arbeitsbasislinie aus vier Befehlen als root:", + "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", + "minimalSetupNote": "Sind Server und SSH-Passwortanmeldung vorbereitet, installiert generate-auto den Schlüssel über ein Konto mit Schreibzugriff auf die authorized_keys-Datei des borg-Benutzers. Spätere Backups verwenden diesen auf borg serve am konfigurierten Pfad beschränkten Schlüssel. Ohne Passwortanmeldung wird er manuell oder über den PVE-Host installiert." + }, + "sshAuth": { + "heading": "SSH-Authentifizierung (Clientseite)", + "intro": "Remote-Borg-Repositories sind über SSH zugänglich. Die Verbindung läuft vom ProxMenux-Host zu einem Benutzerkonto auf dem Borg-Server, auf dem borg serve ausgeführt wird. Dieser Benutzer heißt normalerweise borg, NICHT der Admin / Root-Benutzer des Servers - die Befehlszeile borg-serve sperrt die Verbindung zu diesem spezifischen Repository-Pfad (siehe die wichtigsten Strategien unten).", + "strategiesTitle": "SSH-Schlüsselstrategien", + "strategiesIntro": "Beim Hinzufügen eines entfernten Ziels fragt ProxMenux nach SSH-Benutzer, Host und entferntem Pfad und bietet vier Anmeldeoptionen. Wird die Passwortanmeldung abgewiesen, steht zusätzlich generate-pct zur Wahl. Die Modi sind unten beschrieben:", + "strategyRows": [ + { + "mode": "generate-auto", + "label": "Empfohlen", + "detail": "ProxMenux erzeugt oder verwendet ein ed25519-Schlüsselpaar unter ~/.ssh/borg_proxmenux_HOST_ed25519. Mit sshpass prüft es die Anmeldung und installiert den öffentlichen Schlüssel in ~borg/.ssh/authorized_keys. Das Passwort gehört zu einem Konto mit Schreibzugriff auf diese Datei, meist root oder borg. Es wird nur bei der Einrichtung verwendet und nicht gespeichert." + }, + { + "mode": "generate-manual", + "label": "Kein Admin-Passwort auf diesem Host", + "detail": "ProxMenux generiert das Keypair wie oben, zeigt aber die vollständige authorized_keys-Zeile an, die der Betreiber manuell in den Server einfügen kann. Das Admin-Passwort verlässt niemals den ProxMenux-Host, weil es nie angefordert wird." + }, + { + "mode": "generate-pct", + "label": "Borg Server ist ein PVE LXC", + "detail": "Der Borg-Server läuft innerhalb eines LXC auf einem PVE-Knoten. ProxMenux autorisiert den Schlüssel über pct exec vom PVE-Host - root auf dem PVE-Host schreibt in den ~borg/.ssh/authorized_keys des LXC, ohne dass SSH selbst in den LXC benötigt wird." + }, + { + "mode": "existing", + "label": "Verwenden Sie einen vorhandenen Schlüssel", + "detail": "ProxMenux scannt /root/.ssh/ und $HOME/.ssh/ nach Parseable ed25519/RSA Private Keys und listet diese auf. Der Bediener wählt einen oder durchsucht manuell einen nicht standardmäßigen Pfad." + }, + { + "mode": "none", + "label": "Standard SSH-Konfiguration", + "detail": "Kein benutzerdefinierter Schlüssel - Borg stützt sich auf die standardmäßige SSH-Konfiguration des Hosts (normalerweise ~/.ssh/id_rsa oder ein SSH-Agent)." + } + ], + "restrictTitle": "Die authorized_keys Linie", + "restrictBody": "Für jeden erzeugten Schlüssel beschränkt die von ProxMenux auf dem Server eingetragene authorized_keys-Zeile den Zugriff auf den folgenden borg-serve-Aufruf für den konfigurierten Repository-Pfad:", + "restrictLine": "command=\"/usr/bin/borg serve --restrict-to-path RPATH\",restrict PUBKEY", + "restrictNote": "Der command= zwingt jede SSH-Sitzung mit diesem Schlüssel, nur den Befehl borg-serve auszuführen; restrict deaktiviert die Portweiterleitung, die Agentenweiterleitung, die X11-Weiterleitung und die PTY-Zuweisung. Der Schlüssel kann nicht verwendet werden, um eine interaktive Shell auf dem Server zu öffnen oder auf einen anderen Repository-Pfad zuzugreifen, selbst wenn das Konto über breitere Privilegien verfügt." + }, + "savedTargets": { + "heading": "Gespeicherte Ziele", + "intro": "Ein gespeichertes Ziel hält die Repository-Konfiguration unter einem verständlichen Namen fest, damit die Angaben nicht erneut eingegeben werden müssen. Dateien im ProxMenux-Zustandsverzeichnis:", + "rows": [ + { + "file": "borg-targets.txt", + "content": "Eine Zeile je Ziel: NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE. hb_collect_borg_configs liest sie ein, um das Zielauswahlmenü zu füllen." + }, + { + "file": "borg-pass-NAME.txt", + "content": "Passphrase des oben mit NAME benannten Ziels (chmod 600). Nur bei gewählter repokey-Verschlüsselung vorhanden." + } + ], + "outro": "Das Speichern des Ziels ist optional. Bei Ablehnung wird keine benannte Zielkonfiguration gespeichert; ein erzeugter SSH-Schlüssel wird jedoch nicht entfernt. Bei repokey-Verschlüsselung ohne gespeichertes Ziel legt ProxMenux die Passphrase weiterhin in der älteren Datei borg-pass.txt ab." + }, + "encryption": { + "heading": "Verschlüsselung", + "body": "Repositories werden mit einem Verschlüsselungsmodus über hb_borg_init_if_needed initialisiert: das moderne borg repo-create -e MODE, wenn verfügbar, oder das alte borg init --encryption=MODE. ProxMenux zeigt zwei Modi: repokey (Standard) und none. Im repokey-Modus speichert Borg den Verschlüsselungsschlüssel im Repository selbst; der Zugriff erfordert eine Passphrase, die ProxMenux zweimal mit Übereinstimmungsvalidierung anfordert und für gespeicherte Ziele unter borg-pass-NAME.txt speichert, sonst in der oben beschriebenen älteren Datei. Ein obligatorischer Bestätigungsdialog wird angezeigt, nachdem die Passphrase gespeichert wurde: Die Passphrase ist die einzige Möglichkeit, auf die verschlüsselten Archive zuzugreifen, und wenn sie verloren geht, ist jedes Archiv im Repository nicht wiederherstellbar." + }, + "runtimeEnv": { + "heading": "Laufzeitumgebung", + "intro": "ProxMenux exportiert die folgenden Umgebungsvariablen, bevor borg aufgerufen wird. Sie konfigurieren die Verbindung und entsperren das Repository, ohne Geheimnisse in die Kommandozeile einzubetten.", + "rows": [ + { + "var": "BORG_RSH", + "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", + "purpose": "Remote-Shell-Befehl für Borg-Repositories über SSH. Ein gewählter Schlüssel ergänzt die Identitätsoptionen, ein abweichender Port ergänzt -p PORT. Ohne eigenen Schlüssel und mit Standardport bleibt die Variable ungesetzt; Borg nutzt dann die SSH-Vorgaben des Hosts." + }, + { + "var": "BORG_PASSPHRASE", + "value": "(Passphrase von borg-pass-NAME.txt)", + "purpose": "Entsperrt den Repokey. Setzen Sie nur, wenn das Ziel repokey-Verschlüsselung verwendet. Erscheint nie in der Prozessargumentenliste." + }, + { + "var": "BORG_ENCRYPT_MODE", + "value": "repokey | none", + "purpose": "Wird von hb_borg_init_if_needed bei der Initialisierung eines noch nicht vorhandenen Repositorys verwendet. Ignoriert von borg create auf bestehenden Repositories." + }, + { + "var": "BORG_RELOCATED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Unterdrückt die interaktive Eingabeaufforderung, die Borg aufruft, wenn die Repository-URL von der URL abweicht, von der sie ursprünglich erreicht wurde (üblich nach einem Rename für einen Mount-Point oder SSH-Host, der über eine neue Adresse erreichbar ist)." + }, + { + "var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Unterdrückt die interaktive Eingabeaufforderung, die Borg beim ersten Zugriff auf ein unverschlüsseltes Repository von einem neuen Client aus erstellt." + } + ] + }, + "archiveFormat": { + "heading": "Bezeichnung und Aufbewahrung des Archivs", + "intro": "Jedes Backup erstellt ein neues Archiv im Repository.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS", + "retentionBody": "Für geplante Aufträge führt run_scheduled_backup.sh borg prune nach jedem erfolgreichen Backup mit den für den Auftrag konfigurierten Retentionswerten (--keep-last, --keep-daily, --keep-weekly) gegen das Repository aus. Interaktive Backups beschneiden nicht." + }, + "restoreAccess": { + "heading": "Abruf auf der Wiederherstellungsseite", + "body": "Die Wiederherstellung listet Archive mit borg list REPO auf und entpackt das gewählte Archiv mit borg extract REPO::ARCHIVE-NAME in ein Vorbereitungsverzeichnis. _rs_check_layout übergibt dieses an den normalen Wiederherstellungsablauf. Dieselben Befehle funktionieren auch manuell außerhalb von ProxMenux. Der entpackte Verzeichnisbaum entspricht der in So funktioniert es beschriebenen Struktur aus drei Datenblöcken." + }, + "references": { + "heading": "Referenzen", + "intro": "Offizielle Borg-Dokumentation zu den Komponenten, auf die ProxMenux aufbaut.", + "items": [ + { + "label": "Borg-Dokumentation", + "href": "https://borgbackup.readthedocs.io/", + "tail": "— Haupteinstiegspunkt für Konzepte, Bereitstellung, Schnellstart und jeden Befehl." + }, + { + "label": "borg create", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/create.html", + "tail": " — der Befehl, den ProxMenux für jedes Backup aufruft, mit allen unterstützten Optionen." + }, + { + "label": "Datenspeicherverschlüsselung", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/init.html#encryption-mode", + "tail": "- die Verschlüsselungsmodi, die Borg unterstützt, einschließlich Repokey, den ProxMenux standardmäßig verwendet." + }, + { + "label": "borg serve und Bereitstellung über SSH", + "href": "https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html", + "tail": " - wie man einen zentralen Borg-Server einrichtet, auf den über SSH zugegriffen wird, einschließlich des borg-serve-Befehls und des restrict-to-path-Flags ProxMenux schreibt in authorized_keys." + }, + { + "label": "borg prune", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/prune.html", + "tail": "— das Retentionsmodell hinter --keep-last / --keep-daily / --keep-weekly, das ProxMenux pro geplantem Auftrag anwendet." + } + ] + } +} diff --git a/web/messages/de/docs/backup-restore/destinations/index.json b/web/messages/de/docs/backup-restore/destinations/index.json new file mode 100644 index 00000000..1654efab --- /dev/null +++ b/web/messages/de/docs/backup-restore/destinations/index.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Backup-Ziele — Lokal, Proxmox Backup Server, Borg | ProxMenux", + "description": "Drei Storage-Backends erhalten die gleiche ProxMenux Backup-Nutzlast: ein lokales .tar.zst-Archiv auf jedem beschreibbaren Dateisystem, ein PBS-Backup in einem Proxmox Backup Server-Datenspeicher oder ein Borg-Archiv in einem lokalen oder entfernten Borg-Repository. Jedes Backend hat seine eigenen Kompressions-, Deduplizierungs-, Verschlüsselungs- und Netzwerkeigenschaften.", + "ogTitle": "ProxMenux Backup-Ziele", + "ogDescription": "Local, Proxmox Backup Server und Borg – drei Storage-Backends für die gleiche Host-Backup-Nutzlast.", + "twitterTitle": "ProxMenux Backup Ziele | ProxMenux", + "twitterDescription": "Lokales Archiv, Proxmox Backup Server und Borg Backends für Host-Backups." + }, + "header": { + "title": "Ziele", + "description": "Drei Storage Backends, die von ProxMenux Backup unterstützt werden: lokales Archiv, Proxmox Backup Server (empfohlen) und Borg. Jeder erhält das gleiche Drei-Nutzlast-Archiv; sie unterscheiden sich in Speicherformat, Deduplizierung, Verschlüsselungsmodell und Netzwerkanforderungen.", + "section": "Sicherung und Wiederherstellung" + }, + "intro": { + "title": "Gleiche Nutzlast, drei Backends", + "body": "Jedes Backup erzeugt die gleichen drei Nutzlasten (Rootfs, Manifest, Anwendungen). Was sich zwischen Zielen ändert, ist, wie diese Nutzlasten gespeichert werden und wie der Betreiber sie für eine Wiederherstellung abruft. Jedes Backend wird als separate Funktion in backup_host.sh - _bk_local, _bk_pbs, _bk_borg - implementiert, aber alle drei haben den gleichen Staging-Schritt (hb_prepare_staging) und den gleichen Wiederherstellungscodepfad. Die Wahl des Ziels betrifft nur das Schreiben und den Abruf; es ändert nicht, was eine Wiederherstellung tut oder wie sie das Archiv verbraucht." + }, + "comparison": { + "heading": "Merkmalsvergleich", + "intro": "Die folgende Tabelle listet die konkreten Unterschiede zwischen den drei Backends auf, wie sie sich heute in ProxMenux verhalten. Alle Werte beschreiben das beobachtete Verhalten des Backends selbst, nicht redaktionelle Empfehlungen.", + "rows": [ + { + "feature": "Speicherformat", + "local": "Einzelne .tar.zst-Datei (oder .tar.gz, wenn zstd fehlt).", + "pbs": "PBS Backup (.pxar Chunks im Datenspeicher).", + "borg": "Borg-Archiv in einem Borg-Repository (Segmentdateien)." + }, + { + "feature": "Kompression", + "local": "zstd (Standardstufe) über tar --zstd. gzip Fallback.", + "pbs": "Von proxmox-backup-client verwaltet. ProxMenux überschreibt die Kompressionseinstellungen nicht.", + "borg": "In Borg integrierte Kompression. ProxMenux ruft borg create auf, ohne die Kompressionseinstellungen zu überschreiben." + }, + { + "feature": "Deduplizierung", + "local": "Keine. Jedes Backup ist ein vollständiges unabhängiges Archiv.", + "pbs": "Vollständige Chunk-Level-Deduplizierung über alle Backups im Datenspeicher.", + "borg": "Vollständige Chunk-Level-Deduplizierung über alle Archive im Repository." + }, + { + "feature": "Verschlüsselung im Ruhezustand", + "local": "Keine (Verlässt sich auf den Schutz auf Dateisystemebene).", + "pbs": "Optionale clientseitige Keyfile-Verschlüsselung. Recovery-Blob als separate Backup-Gruppe hochgeladen, wenn aktiviert.", + "borg": "Optionale Repokey-Verschlüsselung (Schlüssel im Repo gespeichert, durch eine Passphrase freigeschaltet)." + }, + { + "feature": "Aufbewahrung / Bereinigung", + "local": "Wird pro geplantem Auftrag über KEEP_LAST angewendet. Alte Archive werden zusammen mit ihren Begleitdateien und Ausführungsprotokollen gelöscht. Interaktive Backups führen keine Bereinigung aus.", + "pbs": "Angewendet pro geplanten Auftrag über proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly. Interaktive Backups führen keine Bereinigung aus.", + "borg": "Angewendet pro geplanten Auftrag über borg prune --keep-last / --keep-daily / --keep-weekly. Interaktive Backups führen keine Bereinigung aus." + }, + { + "feature": "Netzwerk", + "local": "Keine. Schreibt auf einen lokalen Einhängepunkt (normalerweise eine interne Festplatte oder ein USB-Laufwerk).", + "pbs": "TCP auf den PBS-Server (Standardport 8007). Erfordert PBS Anmeldeinformationen + Fingerabdruck.", + "borg": "Lokaler Dateisystempfad oder SSH Tunnel zu einem entfernten Borg-Host." + }, + { + "feature": "Abhängigkeiten", + "local": "tar, zstd (standardmäßig auf Proxmox vorhanden).", + "pbs": "proxmox-backup-client Paket (gebündelt mit Proxmox VE 8+).", + "borg": "borg binär. Automatische Bereitstellung durch ProxMenux aus dem Monitor AppImage-Bundle, wenn es fehlt." + }, + { + "feature": "Zugriff für die Wiederherstellung", + "local": "Jeder Host mit tar+zstd kann das Archiv extrahieren. Keine PBS/Borg erforderlich.", + "pbs": "Erfordert proxmox-backup-client + PBS Anmeldeinformationen + die Schlüsseldatei (falls verschlüsselt).", + "borg": "Erfordert borg + den Repository-Pfad + die Passphrase (falls verschlüsselt)." + } + ], + "captionCode": "feature", + "captionLocal": "Lokal", + "captionPbs": "Proxmox Backup Server (empfohlen)", + "captionBorg": "Borg" + }, + "sameArchive": { + "heading": "Das Archivlayout ändert sich nicht mit dem Ziel", + "body": "Innerhalb eines der drei Ziele ist das gleiche rootfs/ + metadata/ + manifest.json Layout vorhanden, das in Funktionsweise beschrieben wird. Ein aus einem lokalen Archiv extrahierter .tar.zst, ein aus PBS wiederhergestellter .pxar und ein mit borg extract extrahiertes Borg-Archiv ergeben alle einen identischen Verzeichnisbaum. Der Wiederherstellungscodepfad (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) liest die gleichen drei Nutzlasten, ohne zu wissen, von welchem Ziel sie kamen." + }, + "extractStandalone": { + "heading": "Extrahieren eines Backups außerhalb von ProxMenux", + "intro": "Jedes der drei Archivformate kann mit Standardtools gelesen werden, ohne dass ProxMenux auf dem Lesehost installiert ist. Die folgenden Befehle erzeugen den gleichen Verzeichnisbaum, den eine Wiederherstellung intern verbraucht.", + "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": "# Aus einem Borg-Archiv (benötigt borg und bei verschlüsselten Repositories die Passphrase):\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# Bei einem über SSH erreichbaren entfernten Repository:\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME", + "note": "Der extrahierte Baum kann dann manuell inspiziert oder einer manuellen Wiederherstellung zugeführt werden. Sehen Sie sich die einzelnen Zielseiten für den genauen Abruffluss an, den ProxMenux unter der Haube verwendet." + }, + "whereNext": { + "heading": "Details je Ziel", + "intro": "Jedes Ziel hat eine eigene Seite, die den Konfigurationsfluss, das On-Disk-Format und den von der Wiederherstellung verwendeten Abrufbefehl abdeckt.", + "items": [ + { + "label": "Lokales Archiv", + "href": "/docs/backup-restore/destinations/local", + "tail": " — Vorkonfiguration eines lokalen Ziels, Einhängen von USB-Laufwerken, Schutz vor dem Einschließen des Archivs in sich selbst und die JSON-Begleitdatei zur Erkennung im Monitor." + }, + { + "label": "Proxmox Backup Server (empfohlen)", + "href": "/docs/backup-restore/destinations/pbs", + "tail": "Datenspeicherauswahl, Anmeldeinformationen und Fingerabdruck, Verschlüsselungs-Keyfile-Lebenszyklus, Recovery-Passphrase, Hochladen des Recovery-Blobs zu PBS für die Wiederherstellung mit frischer Installation." + }, + { + "label": "Borg", + "href": "/docs/backup-restore/destinations/borg", + "tail": " — lokale und über SSH erreichbare Repositories, Bezugsquellen der Borg-Binärdatei (System / Cache / Monitor-AppImage-Bundle / GitHub-Download), Repository-Initialisierung, Umgang mit Passphrasen und SSH-Schlüssel für entfernte Repositories." + } + ] + } +} diff --git a/web/messages/de/docs/backup-restore/destinations/local.json b/web/messages/de/docs/backup-restore/destinations/local.json new file mode 100644 index 00000000..eff0a73d --- /dev/null +++ b/web/messages/de/docs/backup-restore/destinations/local.json @@ -0,0 +1,75 @@ +{ + "meta": { + "title": "Lokales Archivziel — tar.zst auf einem Dateisystem oder USB-Laufwerk | ProxMenux", + "description": "Das lokale Sicherungsziel schreibt ein einzelnes .tar.zst-Archiv in ein beliebiges beschreibbares Verzeichnis: auf eine interne Festplatte, einen Proxmox-Mountpoint, eine NFS-Freigabe oder ein USB-Laufwerk. Diese Seite beschreibt die Einrichtung, das Erkennen und Einbinden von USB-Laufwerken, den Schutz vor dem Speichern des Archivs in einem selbst gesicherten Pfad und die zugehörige JSON-Datei zur Identifizierung der Sicherung.", + "ogTitle": "ProxMenux Backup — Ziel des lokalen Archivs", + "ogDescription": "Wie ProxMenux lokale Backups als .tar.zst-Archive schreibt und wie man das Zielverzeichnis oder das USB-Laufwerk konfiguriert.", + "twitterTitle": "Lokales Backup-Ziel | ProxMenux", + "twitterDescription": "Wie ProxMenux lokale Backups als .tar.zst-Archive auf ein Dateisystem oder USB-Laufwerk schreibt." + }, + "header": { + "title": "Lokales Archiv", + "description": "Das lokale Sicherungsziel schreibt ein einzelnes komprimiertes tar-Archiv in ein beliebiges beschreibbares Verzeichnis auf dem Host: auf eine interne Festplatte, einen NFS- oder SMB-Mount oder ein USB-Laufwerk.", + "section": "Sicherung und Wiederherstellung" + }, + "intro": { + "title": "Eine Datei, in sich geschlossen", + "body": "Ein lokales Backup erzeugt eine einzelne hostcfg-HOST-TIMESTAMP.tar.zst-Datei (oder .tar.gz, wenn zstd fehlt). Die Datei enthält den gesamten Archivbaum manifest.json, metadata/ und rootfs/ und kann auf jedem Proxmox-Host mit dem ProxMenux-Wiederherstellungsfluss wiederhergestellt oder manuell mit tar --zstd -xf auf jedem Linux-System extrahiert werden. Kein Server, kein Repository init, keine externe Abhängigkeit. Dies ist das Ziel mit dem kürzesten Wiederherstellungspfad, wenn weder PBS noch Borg verfügbar sind." + }, + "targetConfig": { + "heading": "Konfiguration des Zielverzeichnisses", + "intro": "Das lokale Ziel ist ein einziges dauerhaft gespeichertes Zielverzeichnis – keine Liste. ProxMenux speichert die Auswahl des Betreibers bei /usr/local/share/proxmenux/local-target.conf und liest sie bei jedem Backup. Wenn kein Ziel konfiguriert wurde, wird der Standard-HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump verwendet (das gleiche Verzeichnis, das Proxmox für seine eigenen vzdump-Ausgänge verwendet). Das Ziel wird unter Backup-Ziele konfigurieren → Lokale Ziele konfiguriert:", + "options": [ + "Standard verwenden (/var/lib/vz/dump). Der lokale Proxmox-Speicher. Bei jeder Proxmox-Installation vorhanden; das Archiv befindet sich neben den vzdump-Ausgaben und wird automatisch von der Registerkarte Backups des Monitors aufgenommen.", + "Benutzerdefinierten Pfad eingeben. Jeder absolute Dateisystempfad kann verwendet werden: ein NFS-Mount, eine über fstab eingebundene SMB-Freigabe, ein eigenes ZFS-Dataset oder eine zweite interne Festplatte. ProxMenux prüft vor dem Speichern, ob der Pfad existiert und ein Verzeichnis ist.", + "Wählen Sie ein USB-Laufwerk. Öffnet das USB-Untermenü (unten), das Wechselgeräte erkennt und ein Gerät montieren oder formatieren kann." + ] + }, + "usbFlow": { + "heading": "USB-Laufwerkerkennung und -montage", + "intro": "Das USB-Untermenü listet Partitionen auf Wechselgeräten auf, die von lsblk gemeldet werden. Jede Partition wird mit ihrer Größe, Dateisystem-Beschriftung und aktuellem Zustand dargestellt. Der Zustand bestimmt die Aktion, die ProxMenux anbietet.", + "statesTitle": "Die drei Gerätezustände", + "stateRows": [ + { + "state": "eingehängt", + "shown": "Größe · Etikett · [fstype] · → /mount/point", + "action": "Die Partition ist bereits irgendwo montiert. Bei der Auswahl wird der aktuelle Einhängepunkt als lokales Ziel gespeichert. Es wird kein neuer Mount ausgeführt." + }, + { + "state": "nicht montiert", + "shown": "Größe · Etikett · [fstype] · (nicht montiert — wird montiert)", + "action": "Ein Dateisystem ist vorhanden, aber nicht montiert. Bei Bestätigung führt ProxMenux hb_mount_usb_partition aus: erstellt /mnt/backup-LABEL (oder einen UUID-basierten Pfad, wenn kein Label vorhanden ist), mountet die Partition und speichert den Einhängepunkt als lokales Ziel." + }, + { + "state": "leer", + "shown": "Größe · unformatierter USB-Datenträger — kein Dateisystem (wird FORMATIERT)", + "action": "Das Gerät hat kein Dateisystem. Dieser destruktive Vorgang ist durch zwei Bestätigungen geschützt. Zuerst erklärt ein Ja/Nein-Dialog, dass der Datenträger gelöscht wird. Anschließend muss der Benutzer in einem Eingabefeld den exakten Gerätepfad eingeben (z. B. /dev/sdb), bevor ProxMenux eine neue GPT mit ext4-Partition erstellt und diese einhängt." + } + ], + "notMountedFallback": "Wenn kein USB-Gerät erkannt wird, fällt das Untermenü auf eine einfache Eingabebox zurück. Der Bediener kann einen beliebigen Einhängepunktpfad eingeben; wenn der Pfad kein registrierter Einhängepunkt ist, warnt ein Bestätigungsdialog, bevor er fortfährt." + }, + "safetyCheck": { + "heading": "Sicherheitsprüfung — Ziel innerhalb eines gesicherten Pfads", + "body": "Vor dem Schreiben des Archivs überprüft _bk_local, dass das Zielverzeichnis nicht ein Unterpfad eines zu sichernden Verzeichnisses ist. Ein häufiger Fehler wäre das Hinzufügen von /root zum Profil und die Auswahl von /root/backups als Ziel – das Archiv würde sich dann selbst einschließen und entweder ein beschädigtes Archiv erzeugen oder unbegrenzt wachsen, bis die Festplatte voll ist. Die Prüfung löst beide Pfade mit readlink -m auf, vergleicht sie und bricht bei einem Konflikt die Sicherung mit einem Dialogfeld ab, das den in Konflikt stehenden Pfad benennt und drei Möglichkeiten zur Lösung auflistet: Wählen Sie ein Ziel außerhalb des in Konflikt stehenden Pfads, entfernen Sie den benutzerdefinierten Eintrag, der das Ziel enthält, oder deaktivieren Sie den in Konflikt stehenden Pfad für diesen Lauf im benutzerdefinierten Modus." + }, + "archiveFormat": { + "heading": "Archivformat und Komprimierung", + "intro": "Der Ausgabedateiname bettet den Quellhostnamen und den Backup-Zeitstempel ein, so dass ein Verzeichnis mit mehreren Archiven chronologisch sortiert und jede Datei sich selbst identifiziert.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS.tar.zst", + "compressionTitle": "Kompression", + "compressionBody": "Der primäre Pfad verwendet tar --zstd -cf - eine Single-Command-Pipeline, die auf dem Standardniveau von zstd komprimiert wird. Wenn zstd nicht in der Quelle vorhanden ist (selten bei Proxmox, aber bei minimalen Installationen möglich), fällt ProxMenux auf gzip zurück. Im Fallback-Pfad wird, wenn pv verfügbar ist, ein Fortschrittsbalken zur Pipeline hinzugefügt, so dass der Betreiber die Archivgröße in Echtzeit wachsen sieht; ohne pv wird tar -czf still verwendet.", + "sourceTitle": "Was geht ins Archiv", + "sourceBody": "Der tar-Befehl wird mit -C \"$staging_root\" . aufgerufen und archiviert dadurch das gesamte Staging-Hauptverzeichnis: rootfs/, metadata/ und manifest.json. Alle drei Datenblöcke liegen nebeneinander auf der obersten Ebene des tar-Archivs. Beim Entpacken entsteht genau der Baum, den der Wiederherstellungscode verwendet." + }, + "sidecar": { + "heading": "Die JSON-Begleitdatei", + "intro": "Jedes erfolgreiche lokale Backup erzeugt eine Begleitdatei: HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, geschrieben neben dem Archiv von hb_write_archive_sidecar. Diese kleine JSON-Datei ermöglicht es dem ProxMenux Monitor, das Archiv als ProxMenux-Host-Backup zu identifizieren, auch wenn es später an anderer Stelle verschoben, umbenannt oder archiviert wird.", + "contentTitle": "Inhalt der Begleitdatei", + "contentBody": "Das Sidecar speichert die Schemaversion, ob das Backup von einem interaktiven Lauf oder einem geplanten Job (kind) stammt, die Job-ID für geplante Läufe, den verwendeten Profilmodus (default oder custom), den Quellhostnamen, den ursprünglichen Archivbasisnamen, einen ISO-8601-Erstellungszeitstempel und die Archivgröße in Bytes.", + "whyBody": "Die Registerkarte Backups des Monitors scannt konfigurierte lokale Verzeichnisse für *.proxmenux.json-Begleitdateien - nicht für *.tar.zst-Dateien -, da ein .tar.zst ohne Sidecar möglicherweise überhaupt kein ProxMenux-Backup ist. Der Scan ist schnell (JSON-Dateien sind winzig) und die Paarung ist stabil bei Umbenennungen des Archivs, solange das Sidecar entsprechend umbenannt wird." + }, + "restoreAccess": { + "heading": "Wiederherstellen aus einem lokalen Archiv", + "body": "Der ProxMenux-Wiederherstellungsfluss entdeckt lokale Archive, indem er das konfigurierte lokale Ziel nach Begleitdateien durchsucht und in der Archivliste anzeigt. Die Auswahl eines Archivs löst _rs_check_layout aus, der den Tarball in ein Staging-Verzeichnis extrahiert und das Layout mit drei Nutzlasten bestätigt, bevor er fortfährt. Für die manuelle Extraktion außerhalb von ProxMenux liefert tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg den gleichen Baum, den der Wiederherstellungscode verbraucht." + } +} diff --git a/web/messages/de/docs/backup-restore/destinations/pbs.json b/web/messages/de/docs/backup-restore/destinations/pbs.json new file mode 100644 index 00000000..2beffaef --- /dev/null +++ b/web/messages/de/docs/backup-restore/destinations/pbs.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Proxmox Backup Server Zielort — Repository, Verschlüsselung, Wiederherstellung | ProxMenux", + "description": "Das PBS-Ziel speichert ProxMenux-Host-Backups als PBS-Backups. Beschrieben werden die Repository-Erkennung aus /etc/pve/storage.cfg, die manuelle PBS-Konfiguration, der .pxar-Upload, die clientseitige Verschlüsselung mit einer Schlüsseldatei samt optionaler passphrasengeschützter Sicherungskopie sowie die Schlüsselwiederherstellung aus mehreren Quellen auf einem neu installierten Host.", + "ogTitle": "ProxMenux Backup — Bestimmungsort Proxmox Backup Server", + "ogDescription": "So speichert ProxMenux Host-Backups auf Proxmox Backup Server mit clientseitiger Schlüsseldateiverschlüsselung und einer hinterlegten Wiederherstellungskopie.", + "twitterTitle": "PBS Backup Ziel | ProxMenux", + "twitterDescription": "Proxmox Backup Server als Ziel mit Schlüsseldateiverschlüsselung und passphrasengeschützter Wiederherstellungskopie." + }, + "header": { + "title": "Proxmox Backup Server", + "description": "Das PBS-Ziel lädt das gesamte Vorbereitungsverzeichnis als ein einzelnes .pxar-Backup in einen Proxmox-Backup-Server-Datenspeicher hoch. Optional wird es clientseitig mit einer Schlüsseldatei verschlüsselt; zusätzlich kann neben jedem Backup eine passphrasengeschützte Wiederherstellungskopie der Schlüsseldatei hinterlegt werden.", + "section": "Sicherung und Wiederherstellung" + }, + "recommendedBadge": "Empfohlenes Ziel", + "aboutPbs": { + "heading": "Was Proxmox Backup Server ist", + "body": "Proxmox Backup Server (PBS) ist das eigene Backup-Server-Produkt von Proxmox, das von dem gleichen Team entwickelt und gewartet wird, das auch Proxmox VE entwickelt hat. Es ist ein dedizierter Backup-Server, der entwickelt wurde, um Backups von Proxmox VE-Hosts (VMs, LXCs und - über proxmox-backup-client - beliebige Host-Verzeichnisse) mit chunkbasierter Deduplizierung, clientseitiger Verschlüsselung und serverseitig angewendeten Aufbewahrungsrichtlinien zu erhalten. ProxMenux verwendet PBS als eines der drei Ziele für Host-Backups; jeder auf dieser Seite beschriebene PBS-spezifische Mechanismus (Backup-Gruppen, .pxar-Archive, --backup-id, Keyfile-Verschlüsselung) ist Standard-PBS-Verhalten." + }, + "intro": { + "title": "Ein Backup pro Lauf, Chunk-Level-Dedup", + "body": "Ein PBS-Backup erzeugt einen einzelnen Backup-Eintrag im Datenspeicher, der unter der Backup-ID host/hostcfg-HOSTNAME/BACKUP-TIME gruppiert ist. Die Nutzlast ist ein .pxar-Archiv, das das gleiche dreiblockige Layout enthält, das in How it works beschrieben ist. PBS dedupliziert auf der Chunk-Ebene über alle Backups im Datenspeicher, so dass nachfolgende Backups desselben Hosts nur die geänderten Chunks übertragen und speichern. Die Retention wird von ProxMenux selbst für geplante Aufträge angewendet — run_scheduled_backup.sh führt proxmox-backup-client prune mit --keep-last / --keep-daily / --keep-weekly nach jedem erfolgreichen Lauf mit den für den Auftrag konfigurierten Werten aus." + }, + "repoSelection": { + "heading": "Repository-Auswahl", + "intro": "ProxMenux entdeckt PBS-Repositories aus zwei Quellen in jedem Backup. Der Bediener wählt einen aus einem einheitlichen Menü aus; die Auswahl bestimmt HB_PBS_REPOSITORY, HB_PBS_SECRET und HB_PBS_FINGERPRINT für den Lauf.", + "sourceRows": [ + { + "source": "Proxmox storage.cfg (automatisch erkannt)", + "path": "/etc/pve/storage.cfg + /etc/pve/priv/storage/NAME.pw", + "content": "Jede pbs: Strophe in der eigenen Speicherkonfiguration von Proxmox wird automatisch abgeholt. Server, Datenspeicher, Benutzername und Fingerabdruck stammen aus der Strophe. Das Passwort wird aus dem eigenen Anmeldeverzeichnis von Proxmox gelesen. Auf der ProxMenux-Seite ist kein erneuter Eintrag erforderlich – das Repository ist verfügbar, sobald es in Proxmox konfiguriert ist." + }, + { + "source": "ProxMenux manuelle Konfiguration", + "path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt", + "content": "Zusätzlich von Backup-Ziele konfigurieren → PBS Ziele → PBS hinzufügen. Prompts für einen Namen, Benutzernamen (root@pam oder user@pbs!token), Host oder IP, Datenspeicher und Passwort. Das Passwort wird bei leeren Eingaben erneut angezeigt - ein leeres Speichern würde ansonsten still bleiben und jedes nachfolgende Backup würde mit einem undurchsichtigen Authentifizierungsfehler fehlschlagen. Dieser Pfad wird verwendet, wenn das Ziel PBS nicht als Proxmox-Speicher registriert ist." + } + ], + "menuTitle": "Auswahlmenü", + "menuBody": "Beide Quellen werden in einem einzigen Menü angezeigt, wobei jede Zeile mit ihrem Ursprung markiert ist ([proxmox] oder [manual]). Einträge, deren Passwort nicht aufgelöst werden konnte, werden mit einer ⚠ no password-Warnung versehen – die Auswahl einer löst einen erneuten Passworteintrag aus, bevor das Backup startet. Der Fingerabdruck wird über die PBS_FINGERPRINT-Umgebungsvariable an proxmox-backup-client übergeben; bei Abwesenheit fordert der Client den Betreiber auf, das Serverzertifikat beim ersten Backup interaktiv zu akzeptieren." + }, + "backupCommand": { + "heading": "Der Backup-Befehl", + "intro": "Der Upload erfolgt mit einem einzigen Aufruf von proxmox-backup-client backup. ProxMenux übergibt Passwort, Verschlüsselungspasswort und Fingerabdruck mit env als Umgebungsvariablen an den Client.", + "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": "Backup-ID-Bezeichnung", + "backupIdBody": "Die Standard-Backup-ID ist hostcfg-HOSTNAME. Vor dem Upload wird sie bestätigt oder bearbeitet. Zeichen außerhalb von [A-Za-z0-9_-] sowie abschließende Bindestriche werden entfernt. Die Wiederverwendung derselben ID bei weiteren Läufen ist beabsichtigt: PBS behandelt die ID als Gruppe. Jedes weitere Backup erscheint als neuer Eintrag in dieser Gruppe und nutzt die Deduplizierung mit früheren Backups.", + "pxarTitle": "Warum die Quelle die vollständige Staging-Wurzel ist", + "pxarBody": "Die .pxar-Quelle ist die gesamte staging_root - rootfs/, metadata/ und manifest.json zusammen. Frühere Versionen bestanden $staging_root/rootfs als Quelle; Das ließ metadata/ aus dem Archiv und die Kompatibilitätsprüfung der Wiederherstellung hatte nichts zu lesen, was selbst bei Wiederherstellungen des gleichen Hosts zu Cross-Host-Warnungen führte. Alte Backups, die mit der Rootfs-only-Quelle erstellt wurden, werden immer noch korrekt über den _rs_check_layout-Fall-3-Zweig wiederhergestellt, der einen flachen etc/var/root/usr-Baum zurück in eine rootfs/-Hierarchie wickelt." + }, + "encryption": { + "heading": "Clientseitige Verschlüsselung", + "glossaryHint": "Dieser Abschnitt verwendet die Begriffe Schlüsseldatei, Passphrase und Wiederherstellungshülle. Das Glossar erklärt die Unterschiede mit einem Satz pro Begriff.", + "intro": "Die clientseitige PBS-Verschlüsselung mit einer Schlüsseldatei verschlüsselt die Blöcke vor dem Upload auf dem Quellhost. In ProxMenux ist die Verschlüsselung optional. Wird sie aktiviert, entscheidet der Betreiber bei der Einrichtung ausdrücklich mit Ja oder Nein, ob zusätzlich eine passphrasengeschützte Wiederherstellungskopie der Schlüsseldatei auf PBS hinterlegt wird; diese Wahl lässt sich später im Monitor ändern. Die Schlüsseldatei selbst liegt immer unter dem kanonischen Pfad /usr/local/share/proxmenux/pbs-key.conf und wird für alle weiteren verschlüsselten Backups ohne erneute Nachfrage verwendet.", + "keyfileTitle": "Einrichten der Keyfile", + "keyfileBody": "Der Verschlüsselungsdialog erscheint beim ersten verschlüsselten Backup des Hosts. Zunächst wird gefragt, ob das Backup verschlüsselt werden soll: Nein fährt ohne Verschlüsselung fort, Ja führt zum zweiten Schritt. Dieser hängt davon ab, ob bereits eine Schlüsseldatei unter /usr/local/share/proxmenux/pbs-key.conf installiert ist. Falls ja, wird sie ohne Nachfrage wiederverwendet und das Backup fortgesetzt; auch spätere Backups fragen nicht erneut. Andernfalls bietet ein Menü zwei Möglichkeiten. Neue Schlüsseldatei erzeugen führt proxmox-backup-client key create --kdf none aus. Vorhandene Schlüsseldatei verwenden erkennt eine von PVE verwaltete Datei automatisch: Ist das gewählte PBS-Repository in Proxmox mit einem Verschlüsselungsschlüssel unter /etc/pve/priv/storage/<NAME>.enc registriert, wird diese Datei ohne Nachfrage an den kanonischen ProxMenux-Pfad kopiert. Gibt es keine passende PVE-Datei, wird nach dem absoluten Pfad gefragt, unter dem der Betreiber die Schlüsseldatei bereits auf diesem Host abgelegt hat. In beiden Fällen liegt sie danach am kanonischen Pfad mit chmod 600.", + "modesTitle": "Schlüsseldatei je Host oder gemeinsam nutzen", + "modesIntro": "Beide Betriebsmodelle werden unterstützt und keines wird durchgesetzt - die Wahl liegt beim Betreiber, je nachdem, wie seine Flotte organisiert ist.", + "modesPerHostTitle": "Eigene Schlüsseldatei je Host (Standard)", + "modesPerHostBody": "Jeder Host generiert seine eigene Schlüsseldatei, wenn er zum ersten Mal die PBS-Verschlüsselung aktiviert. Die Isolation ist maximal: Durch die Kompromittierung der Schlüsseldatei eines Hosts werden die Backups anderer Hosts nicht offengelegt. Empfohlen für Produktionsflotten und für Umgebungen, in denen Hosts unterschiedliche Eigentümer oder Compliance-Grenzen haben.", + "modesSharedTitle": "Gemeinsame Keyfile (Import auf jedem Host)", + "modesSharedBody": "Eine Hauptschlüsseldatei wird einmal generiert und auf jedem Host über die Option Vorhandene Schlüsseldatei verwenden installiert. Die Verwaltung ist einfacher: Ein einziges Geheimnis muss geschützt werden, und jeder Host kann die Archive jedes anderen entschlüsseln (nützlich für Konsolidierung, hostübergreifende Wiederherstellungsübungen oder zentralisierte Backup-Verifizierung). Der Nachteil besteht darin, dass ein Leck der gemeinsam genutzten Schlüsseldatei jeden Host auf einmal offenlegt. Empfohlen für Homelabs und Flotten, bei denen alle Hosts denselben Eigentümer und dieselbe Vertrauensgrenze haben.", + "recoveryTitle": "Schlüssel auf PBS hinterlegen — der Betreiber entscheidet", + "recoveryBody": "Direkt nach Auswahl der Schlüsseldatei fragt ProxMenux ausdrücklich Schlüssel auf PBS hochladen? und bietet zwei Antworten. Erst wenn der Betreiber Ja wählt, wird ein Wiederherstellungsartefakt auf PBS hochgeladen. Vorgabe ist Nein, nur lokal behalten: Die Schlüsseldatei bleibt am kanonischen lokalen Pfad, ProxMenux lädt kein Wiederherstellungsartefakt auf PBS hoch und der Betreiber sorgt selbst für eine externe Kopie. Die Schaltfläche Schlüsseldatei herunterladen in der PBS-Zielzeile des Monitors stellt sie bei Bedarf bereit. Bei Ja, hochladen wird zweimal eine Wiederherstellungspassphrase abgefragt und auf Übereinstimmung geprüft. ProxMenux schützt die Schlüsseldatei damit mittels AES-256-CBC und PBKDF2 (600.000 Iterationen, zufälliges Salt) und erzeugt pbs-key.recovery.enc. Jedes weitere verschlüsselte Backup lädt diese Hülle als zugehörige Backup-Gruppe auf PBS hoch. Dabei werden weder die Passphrase noch die Schlüsseldatei im Klartext an PBS gesendet. Die Entscheidung lässt sich jederzeit im Monitor ändern: Der Schalter in der PBS-Zielzeile wählt Ja oder Nein und übernimmt je nach Zustand sofort Upload starten, Upload stoppen oder Passphrase aktualisieren.", + "blobUploadTitle": "Gepaarte Backup-Gruppe auf PBS", + "blobUploadBody1": "Ist die Hinterlegung auf Ja, hochladen gesetzt, lädt ProxMenux nach jedem verschlüsselten Backup die Wiederherstellungshülle als zweite, zugehörige Backup-Gruppe auf PBS hoch. Sie heißt wie die Host-Gruppe, ergänzt um -keyrecovery. Beide Gruppen stehen in der Datenspeicherliste nebeneinander: eine für Host-Backups, eine für Wiederherstellungshüllen. Die Hülle verlässt den Host niemals im Klartext: Noch vor der Übertragung verschlüsselt der Host sie mit AES-256-CBC und PBKDF2 (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS erhält ausschließlich die bereits verschlüsselte Hülle.", + "envelopeSecurityTitle": "Ist das Hochladen der keyrecovery-Datei in PBS ein Sicherheitsrisiko?", + "envelopeSecurityBody": "Die keyrecovery-datei ist verschlüsselt in transit und in ruhe. Die Wiederherstellungspassphrase verlässt den Host nie: Verschlüsselung geschieht lokal vor dem Upload, und PBS sieht immer nur das bereits verschlüsselte Ergebnis. Ein PBS-Administrator - oder jeder, der Zugriff auf den Datenspeicher hat - kann die KeyRecovery-Datei herunterladen, aber ohne die Wiederherstellungspassphrase können sie die Keyfile nicht lesen: Es ist undurchsichtiger Geheimtext. Das Rekonstruieren der Keyfile erfordert beide Teile gleichzeitig, die KeyRecovery-Datei und die Passphrase, und nur der Operator hält beide.", + "blobUploadConstraintTitle": "Warum zwei Gruppen statt einer einzigen verschlüsselten", + "blobUploadConstraintBody": "Ein einzelner Aufruf von proxmox-backup-client backup verschlüsselt entweder alle enthaltenen Archive mit derselben Schlüsseldatei oder keines davon. Das Host-Backup muss mit der Host-Schlüsseldatei verschlüsselt werden. Die Wiederherstellungshülle darf aber nicht im selben Upload liegen, sonst würde sie mit genau der Schlüsseldatei verschlüsselt, die sie enthält. Auf einem neu installierten Host ließe sie sich nicht öffnen: Zum Entschlüsseln der Schlüsseldatei wäre diese selbst nötig. Deshalb werden die beiden Artefakte unabhängig hochgeladen und erscheinen als zwei Gruppen. Der PBS-Client verschlüsselt das Host-Backup mit der Schlüsseldatei; ProxMenux verschlüsselt die Wiederherstellungshülle vor dem Upload mit der Passphrase. Zwei verschiedene Verschlüsselungsschichten schützen zwei unterschiedliche Inhalte.", + "blobUploadImageAlt": "PBS Benutzeroberfläche zeigt die Backup-Gruppen hostcfg-HOSTNAME und hostcfg-HOSTNAME-keyrecovery angrenzend im Datenspeicher.", + "blobUploadImageCaption": "PBS UI — die gepaarten Backup-Gruppen. Die Hauptgruppe hält die Host-Backups; die -keyrecovery-Gruppe hält die passphrase-verpackte Schlüsseldatei.", + "recoverTitle": "Wiederherstellung auf einem neu installierten Host", + "recoverBody": "Fehlt die lokale Schlüsseldatei am kanonischen Pfad, etwa nach einer Neuinstallation oder ausdrücklichem Löschen, versucht die Wiederherstellung drei Quellen der Reihe nach und stoppt bei der ersten brauchbaren Schlüsseldatei. Erstens wird eine zum gewählten PBS-Repository passende, von PVE verwaltete Datei unter /etc/pve/priv/storage/<NAME>.enc ohne Nachfrage an den kanonischen Pfad kopiert. Zweitens wird, falls auf PBS eine Gruppe -keyrecovery vorhanden ist, deren neuester Snapshot heruntergeladen und die Wiederherstellungspassphrase zum Entschlüsseln abgefragt. Funktioniert beides nicht oder lehnt der Betreiber die Optionen ab, fragt der dritte Schritt nach dem absoluten Pfad der Schlüsseldatei auf diesem Host und kopiert sie an den kanonischen Pfad. Der Monitor bietet denselben Importablauf im Backup-Detaildialog. Oben erscheint ein gelbes Feld, wenn Wiederherstellen, Herunterladen oder Inhalt anzeigen eine nicht installierte Schlüsseldatei benötigen. Ist eine Datei installiert, passt aber nicht zum Backup, meldet PBS wrong key — manifest's key XX does not match provided key YY. Dieselben drei Aktionen zeigen dann ein strukturiertes gelbes Feld mit dem erforderlichen Manifest-Fingerabdruck an, damit der Betreiber die passende Schlüsseldatei für dieses Backup erkennen und importieren kann.", + "monitorManagementTitle": "Schlüsseldatei im Monitor verwalten", + "monitorManagementBody": "Der Monitor zeigt die Schlüsseldatei-Steuerung direkt in jeder PBS-Zielzeile der Backup-Konfigurationsseite. Es gibt drei Aktionen: Herunterladen exportiert die aktuelle Datei in den Browser des Betreibers; Hochladen ersetzt die installierte Datei durch eine bereitgestellte Datei, wobei die bisherige erst nach erfolgreicher Installation der neuen am kanonischen Pfad überschrieben wird; Löschen entfernt die Datei vom Host. Daneben befindet sich die Steuerung der Wiederherstellungskopie: eine Ja/Nein-Auswahl für Schlüssel auf PBS hochladen?, bei Ja ein Passphrase-Feld und eine passende Übernehmen-Schaltfläche mit Upload starten, Upload stoppen oder Passphrase aktualisieren. Jede Aktion nutzt dieselben Flask-Endpunkte wie die Terminaloberfläche. Die Wirkung auf Dateien und den PBS-Zustand ist deshalb bei beiden Oberflächen identisch." + }, + "restoreAccess": { + "heading": "Abruf auf der Wiederherstellungsseite", + "body": "Der Wiederherstellungsfluss erkennt ProxMenux Host-Backups auf PBS, indem er Backup-Gruppen unter dem konfigurierten Repository auflistet und nach Backup-ID-Muster filtert. Die Registerkarte Backups des Monitors stellt dieselbe Liste dar. Durch das Auswählen eines Backups wird proxmox-backup-client restore mit demselben Repository + Passwort + Fingerabdruck (und --keyfile, als das Backup verschlüsselt wurde) ausgelöst, wodurch das .pxar in ein Staging-Verzeichnis extrahiert wird, das _rs_check_layout dann der Standardwiederherstellungspipeline zuführt. Für das manuelle Abrufen außerhalb von ProxMenux extrahiert derselbe Befehl das Archiv auf einen beliebigen Pfad - der resultierende Baum kann inspiziert oder einer handgesteuerten Wiederherstellung zugeführt werden." + }, + "references": { + "heading": "Referenzen", + "intro": "Offizielle Dokumentation von Proxmox Backup Server zu den Komponenten, auf die ProxMenux aufbaut.", + "items": [ + { + "label": "Proxmox Backup Server Dokumentation", + "href": "https://pbs.proxmox.com/docs/", + "tail": "— Haupteinstiegspunkt für Installation, Verwaltung, Speicherung, Benutzer und Rollen." + }, + { + "label": "proxmox-backup-client", + "href": "https://pbs.proxmox.com/docs/backup-client.html", + "tail": " — das Befehlszeilenwerkzeug, das ProxMenux für jedes Backup und jede Wiederherstellung aufruft. Beschreibt Backup-IDs, Backup-Typen, Archive, Repository-Syntax und Umgebungsvariablen." + }, + { + "label": "Clientseitige Verschlüsselung", + "href": "https://pbs.proxmox.com/docs/backup-client.html#encryption", + "tail": " — Erzeugung der Schlüsseldatei, --kdf-Modi und das Verschlüsselungsmodell, das ProxMenux um eine passphrasengeschützte Wiederherstellungskopie erweitert." + }, + { + "label": "Datenspeicherverwaltung", + "href": "https://pbs.proxmox.com/docs/storage.html", + "tail": "Erstellen und Verwalten der Datenspeicher, die Host-Backups erhalten, einschließlich Chunk-Store-Layout und Berechtigungen." + }, + { + "label": "Aufbewahrungsregeln und Garbage Collection", + "href": "https://pbs.proxmox.com/docs/maintenance.html#pruning", + "tail": " — das Aufbewahrungsmodell hinter --keep-last / --keep-daily / --keep-weekly, das ProxMenux je geplantem Auftrag anwendet, sowie die Freigabe ungenutzter Blöcke durch PBS nach der Bereinigung." + } + ] + } +} diff --git a/web/messages/de/docs/backup-restore/glossary.json b/web/messages/de/docs/backup-restore/glossary.json new file mode 100644 index 00000000..321c6e68 --- /dev/null +++ b/web/messages/de/docs/backup-restore/glossary.json @@ -0,0 +1,230 @@ +{ + "meta": { + "title": "Glossar - Backup & Restore | ProxMenux", + "description": "Begriffe des ProxMenux-Sicherungs- und Wiederherstellungssystems: Verschlüsselung, Schlüsseldatei, Passphrase, Wiederherstellungsumschlag, PBS, Chunks, rootfs, Manifest, Ausführungsprozess und Ergänzung zwischen Kernel-Versionen.", + "ogTitle": "Backup & Restore Glossar | ProxMenux", + "ogDescription": "Klare Definitionen für das Vokabular, das in der ProxMenux-Backup- und Wiederherstellungsdokumentation verwendet wird.", + "twitterTitle": "Backup & Restore Glossar | ProxMenux", + "twitterDescription": "Passphrase, Keyfile, Recovery-Umschlag, Rootfs, Manifest, PBS, Brocken — alle an einer Stelle definiert." + }, + "header": { + "title": "Glossar", + "description": "Begriffe, die in der Backup- und Wiederherstellungsdokumentation mit ihrer Definition verwendet werden.", + "section": "Sicherung und Wiederherstellung" + }, + "intro": { + "body": "Begriffe werden nach Themen gruppiert. Jeder Eintrag gibt den Begriff und eine kurze Definition." + }, + "groups": [ + { + "title": "Verschlüsselung und Key Recovery", + "intro": "Vokabular für den PBS-Verschlüsselungsblock. Es beinhaltet zwei verschiedene Geheimnisse: eine binäre Schlüsseldatei und eine geschriebene Passphrase.", + "entries": [ + { + "id": "passphrase-recuperacion", + "term": "Wiederherstellungspassphrase", + "def": "Textkennwort, das der Benutzer auswählt, um den Wiederherstellungsumschlag zu schützen. Es wird zweimal mit einer Übereinstimmungsprüfung aufgefordert und wird nur verwendet, um den Umschlag zu verschlüsseln und zu entschlüsseln, wenn die Schlüsseldatei jemals wiederhergestellt werden muss. Es ist nicht die Passphrase, die die Schlüsseldatei selbst entsperrt und wird niemals an PBS gesendet. Während eines normalen Backups verlässt es niemals den Host." + }, + { + "id": "clave-cifrado", + "term": "Keyfile (Verschlüsselungsschlüssel)", + "def": "Schlüsseldatei, mit der proxmox-backup-client die Chunks vor dem Hochladen zu PBS verschlüsselt. Ohne passenden Schlüssel sind verschlüsselte Daten nicht lesbar. ProxMenux speichert sie unter /usr/local/share/proxmenux/pbs-key.conf mit Modus 600. Schützen Sie sie; der Wiederherstellungsumschlag dient ihrer Wiederherstellung bei Verlust." + }, + { + "id": "contrasena-keyfile", + "term": "Keyfile Passphrase (KDF Passphrase)", + "def": "Optionale Passphrase, die die Keyfile selbst tragen kann, im Unterschied zur Recovery Passphrase. Es existiert nur, wenn die Keyfile mit --kdf scrypt erstellt wurde (normalerweise eine importierte Keyfile). Ohne sie kann die Keyfile nicht für die Verwendung entsperrt werden. ProxMenux behält es in verschlüsselter Form auf dem Host, so dass geplante Backups ohne interaktive Eingabeaufforderung ausgeführt werden können." + }, + { + "id": "sobre-recuperacion", + "term": "Wiederherstellungsumschlag", + "def": "Das keyfile ist in eine zusätzliche Schicht eingewickelt: Es ist mit der Wiederherstellungspassphrase unter Verwendung von AES-256-CBC und PBKDF2 verschlüsselt, bevor es den Host verlässt. Es wird auf PBS als -keyrecovery-Gruppe hochgeladen. Ohne die Passphrase ist der Umschlag undurchsichtig: Wenn Sie ihn von PBS herunterladen, wird die Schlüsseldatei nicht angezeigt." + }, + { + "id": "cifrado-cliente", + "term": "Clientseitige Verschlüsselung", + "def": "Verschlüsselungsmodell, bei dem Daten auf dem Quellhost verschlüsselt werden, bevor sie hochgeladen werden. PBS empfängt und speichert immer nur Geheimtext; nicht einmal ein PBS-Administrator mit Datenspeicherzugriff kann ihn ohne die Schlüsseldatei lesen. ProxMenux baut auf diesem Modell auf und fügt den Wiederherstellungsumschlag hinzu." + }, + { + "id": "kdf-none", + "term": "--kdf none", + "def": "Option auf proxmox-backup-client key create, die eine Schlüsseldatei ohne angehängte Passphrase erzeugt. Die Keyfile kann direkt ohne Aufforderung verwendet werden, was für geplante Aufträge, die unbeaufsichtigt ausgeführt werden, unerlässlich ist. Dies ist, was ProxMenux standardmäßig verwendet, wenn eine neue Keyfile erzeugt wird." + }, + { + "id": "kdf-scrypt", + "term": "--kdf scrypt", + "def": "Option auf proxmox-backup-client key create, die eine Schlüsseldatei erzeugt, die durch eine keyfile-Passphrase geschützt ist. Jede Verwendung der Keyfile erfordert das Entsperren mit dieser Passphrase. ProxMenux akzeptiert diese Art von Keyfile beim Import und speichert die Passphrase verschlüsselt, so dass geplante Backups immer noch unbeaufsichtigt ausgeführt werden können." + }, + { + "id": "aes-256-cbc", + "term": "AES-256-CBC", + "def": "Standardsymmetrische Chiffre. ProxMenux verwendet es (über openssl enc -aes-256-cbc), um die Schlüsseldatei mit der Wiederherstellungspassphrase zu wickeln und die Umschlag zu produzieren." + }, + { + "id": "pbkdf2", + "term": "PBKDF2", + "def": "Kryptografische Funktion, die eine vom Menschen typisierte Passphrase in einen für die Verschlüsselung geeigneten binären Schlüssel verwandelt. Es verlangsamt Brute-Force-Versuche, indem es viele Iterationen anwendet. ProxMenux verwendet es mit 600 000 Iterationen und einem Zufallssalz bei der Verschlüsselung des Recovery-Umschlags." + } + ] + }, + { + "title": "Backup-Struktur", + "intro": "Begriffe, die beschreiben, was sich in einem Backup befindet, unabhängig vom Zielort.", + "entries": [ + { + "id": "rootfs", + "term": "rootfs / Root-Dateisystem", + "def": "Dateibasierte Kopie des Dateisystems des Quellhosts, erstellt mit rsync nach dem Standardprofil und zusätzlichen eigenen Pfaden. Kein vollständiges Datenträgerabbild: Kopiert werden nur Pfade mit Konfiguration oder Zustand, die Proxmox nicht selbst wiederherstellen kann." + }, + { + "id": "manifiesto", + "term": "Manifest (manifest.json)", + "def": "Strukturiertes JSON-Dokument zur Beschreibung des Quell-Hosts zum Backup-Zeitpunkt: Hardware, Storage, Kernel, ProxMenux-installierte Komponenten und Inventar von VMs und LXCs. Es wird von sechs unabhängigen Erfassungsroutinen produziert. Der Wiederherstellungsfluss verwendet ihn, um Quelle und Ziel zu vergleichen." + }, + { + "id": "staging", + "term": "Stagingverzeichnis", + "def": "Temporäres Verzeichnis, in dem ProxMenux die drei Blöcke (rootfs, Metadaten und Manifest) zusammenstellt, bevor sie verpackt und zum Zielort hochgeladen werden. Es wird automatisch entfernt, wenn das Backup beendet ist, auch bei Abbruch." + }, + { + "id": "perfil-defecto", + "term": "Standardprofil", + "def": "Kuratierte Reihe von Pfaden, die ProxMenux standardmäßig in jedem Backup kopiert. Umfasst PVE-Konfiguration, Netzwerk, SSH, Kernel, apt, ProxMenux Tools und mehr. Es ist im Code definiert und auf der Seite Wie es funktioniert dokumentiert." + }, + { + "id": "rutas-personalizadas", + "term": "Benutzerdefinierte Pfade", + "def": "Zusätzliche Pfade, die der Benutzer zusätzlich zum default-Profil hinzufügt. Entweder persistent (gespeichert in backup-extra-paths.txt) oder per Run (im Custom-Modus ausgewählt)." + } + ] + }, + { + "title": "Ziele und Speicher", + "intro": "Begriffe, die an den Ort gebunden sind, an dem das Backup landet - PBS-Server, lokales Archiv oder Borg-Repository - und wie PBS die Daten organisiert.", + "entries": [ + { + "id": "repositorio-pbs", + "term": "PBS-Repository", + "def": "Kombination von Proxmox Backup Server + datastore + Benutzer, der das Backup erhält. Identifiziert durch den String user@realm@host:datastore. Ein einzelner PBS-Server kann mehrere Repositories hosten." + }, + { + "id": "datastore", + "term": "Datenspeicher", + "def": "Konkreter Datenspeicher auf einem PBS-Server für Sicherungen und ihre Chunks. Er liegt auf einem Dateisystem des PBS-Servers und besitzt eigene Berechtigungen und Richtlinien." + }, + { + "id": "chunk", + "term": "Chunk/Chunk-Deduplizierung", + "def": "PBS teilt jedes Backup in Blöcke variabler Größe auf, identifiziert jedes Stück durch seinen Hash und speichert jedes Stück nur einmal, auch wenn es in vielen verschiedenen Backups erscheint. Dies bedeutet, dass aufeinanderfolgende Backups desselben Hosts - oder über ähnliche Hosts - sehr wenig zusätzlichen Speicherplatz benötigen." + }, + { + "id": "fingerprint", + "term": "Fingerabdruck", + "def": "Kryptografischer Fingerabdruck des PBS-Servers TLS Zertifikat. Der Client kann überprüfen, ob er mit dem vorgesehenen Server spricht, ohne sich auf eine öffentliche Zertifizierungsstelle zu verlassen. ProxMenux leitet sie über die Umgebungsvariable PBS_FINGERPRINT an proxmox-backup-client weiter." + }, + { + "id": "grupo-copia", + "term": "Backup-Gruppe", + "def": "Logischer Container innerhalb von PBS, unter dem sich aufeinanderfolgende Backups desselben Assets ansammeln. Jedes neue Backup teilt die Deduplizierung mit früheren in derselben Gruppe. ProxMenux verwendet zwei Gruppen pro Host, wenn die Verschlüsselung aktiviert ist: eine für das Host-Backup und eine mit einem -keyrecovery-Suffix für den Wiederherstellungsumschlag." + }, + { + "id": "backup-id", + "term": "Backup-ID", + "def": "Name der backup-Gruppe. ProxMenux ist standardmäßig hostcfg-HOSTNAME und lässt den Benutzer es vor dem Hochladen bearbeiten; nicht unterstützte Zeichen werden automatisch entfernt." + }, + { + "id": "pxar", + "term": ".pxar", + "def": "PBS-natives Archivformat für Verzeichnisse. Es verhält sich wie ein für die Chunk-Deduplizierung optimierter tar-Archiv: Anstatt eine undurchsichtige Datei zu speichern, zerlegt PBS seinen Inhalt in wiederverwendbare Chunks." + } + ] + }, + { + "title": "Ausführung und Terminplanung", + "intro": "Begriffe, die vom ProxMenux-Planed-Jobs-System verwendet werden.", + "entries": [ + { + "id": "runner", + "term": "Ausführungsprozess", + "def": "Das run_scheduled_backup.sh-Script, das ein geplantes Backup ausführt. Es liest die Job-Konfiguration, startet das passende Backend (Local, PBS oder Borg), wendet nach Erfolg die Aufbewahrungsregeln an und sendet die konfigurierten Benachrichtigungen." + }, + { + "id": "trabajo-programado", + "term": "Geplanter Auftrag", + "def": "Beharrliche Konfiguration eines wiederkehrenden Backups. Behält Ziel, Anmeldeinformationen, Verschlüsselung, Zeitplan und Aufbewahrung. Lebt bei /var/lib/proxmenux/backup-jobs/<id>.env." + }, + { + "id": "modo-adjunto", + "term": "Anhängemodus", + "def": "Auftrag ohne eigenen Timer. Ein job-end-Hook von PVE-vzdump startet ihn nach Gastsicherungen bei passendem Zielspeicher. Der gewählte Elternauftrag liefert Speicher und anfängliche Aufbewahrung; der Hook vergleicht aber Speicher statt Auftrags-ID. Auch andere Aufgaben desselben Speichers können ihn auslösen. Nur Local und PBS." + }, + { + "id": "timer-systemd", + "term": "Systemd Timer", + "def": "Standard-systemd-Mechanismus, der einen Befehl in einem Kalender auslöst. ProxMenux erstellt einen Timer pro unabhängigem geplanten Job; attach-mode Jobs verwenden keinen Timer, sie laufen über den PVE-Skript-Hook." + }, + { + "id": "retencion", + "term": "Aufbewahrung (keep-last, keep-daily…)", + "def": "Richtlinie, die entscheidet, welche älteren Backups aufbewahrt und welche beschnitten werden sollen. Definiert pro Auftrag mit Parametern wie keep-last, keep-daily, keep-weekly, keep-monthly. Wird vom Ausführungsprozess nach jedem erfolgreichen Backup angewendet." + } + ] + }, + { + "title": "Wiederherstellen", + "intro": "Terme aus dem Wiederherstellungsfluss.", + "entries": [ + { + "id": "restauracion-universal", + "term": "Universale Wiederherstellung", + "def": "Der ProxMenux-Wiederherstellungsfluss extrahiert nicht nur das Dateisystem: Er liest das Manifest, um Unterschiede zwischen Quelle und Ziel zu erkennen, reproduziert die Systemkonfiguration und führt die Installateure für die ProxMenux-verwalteten Komponenten erneut aus. Ziel ist es, den Quellhost zu reproduzieren, nicht nur das Archiv." + }, + { + "id": "hidratacion", + "term": "Ergänzung zwischen Kernel-Versionen (Hydration)", + "def": "Wiederherstellungsschritt, der die eigene Quellkonfiguration (IOMMU-Parameter, VFIO-Geräte-IDs, eigene Anpassungen und GRUB-Schlüssel) in die frische Boot-Konfiguration des Ziels übernimmt, ohne kernelgebundene Quelldateien unverändert zu kopieren. Läuft, wenn der Zielkernel neuer als der der Sicherung ist." + }, + { + "id": "cross-kernel", + "term": "Kernübergreifende Wiederherstellung", + "def": "Wiederherstellung, bei der der Zielkernel vom Quellkernel abweicht und meist neuer ist. Der Ergänzungsschritt verhindert die Übernahme von Dateien, die mit dem Zielkernel inkompatibel sind." + }, + { + "id": "instalador-postboot", + "term": "Installateur nach dem Booten", + "def": "Komponenten, die nach dem ersten Booten des wiederhergestellten Hosts neu installiert wurden (NVIDIA-Treiber, Coral TPU-Treiber, AMD GPU-Tools, Intel GPU-Tools). Jeder Installer läuft gegen den Kernel des Ziels, so dass der wiederhergestellte Host nicht davon abhängt, ob der Kernel der Quelle vorhanden ist." + }, + { + "id": "compatibility-check", + "term": "Kompatibilitätsprüfung", + "def": "Vergleich zwischen dem Quellenmanifest und dem Zustand des Ziels, den ProxMenux zu Beginn der Wiederherstellung durchführt. Es entscheidet, welche Teile wortwörtlich kopiert werden, welche Hydratation benötigen und welche von einem Installateur neu erstellt werden." + }, + { + "id": "equipo-recien-instalado", + "term": "Frische Installation", + "def": "Host nur von Grund auf neu installiert, ohne lokale Schlüsseldatei. Um ein verschlüsseltes Backup wiederherzustellen, muss zunächst die Schlüsseldatei aus der Wiederherstellungsumschlag, die auf PBS gespeichert ist, mit der Wiederherstellungspassphrase wiederhergestellt werden." + } + ] + } + ], + "whereNext": { + "heading": "Wo als nächstes", + "items": [ + { + "label": "Wie es funktioniert", + "href": "/docs/backup-restore/how-it-works", + "tail": "- wo das Rootfs-, Manifest- und Anwendungsinventar in ein Backup passt." + }, + { + "label": "Proxmox-Backup-Server-Ziel", + "href": "/docs/backup-restore/destinations/pbs", + "tail": "- wobei clientseitige Verschlüsselung, Keyfile, Recovery-Passphrase und Envelope ausführlich dokumentiert sind." + }, + { + "label": "Wiederherstellung", + "href": "/docs/backup-restore/restoring", + "tail": " — Wiederherstellungsablauf und Verwendung des Manifests." + } + ] + } +} diff --git a/web/messages/de/docs/backup-restore/how-it-works.json b/web/messages/de/docs/backup-restore/how-it-works.json new file mode 100644 index 00000000..6a8320b1 --- /dev/null +++ b/web/messages/de/docs/backup-restore/how-it-works.json @@ -0,0 +1,205 @@ +{ + "meta": { + "title": "Wie ProxMenux Backup intern funktioniert – Rootfs, Manifest, Anwendungen", + "description": "Detaillierte Aufschlüsselung dessen, was ein ProxMenux-Backup enthält: die Rootfs, die von rsync des Standardpfadprofils erzeugt werden, das strukturierte Manifest, das von sechs unabhängigen Sammlern erstellt wird, und das Anwendungsinventar, das die automatische Neuinstallation von Paketen und Komponenten nach einer Wiederherstellung steuert.", + "ogTitle": "Wie ProxMenux Backup intern funktioniert", + "ogDescription": "Die drei Nutzlasten eines ProxMenux-Backups wurden erklärt: Rootfs, Manifest und Anwendungen.", + "twitterTitle": "Wie ProxMenux Backup funktioniert | ProxMenux", + "twitterDescription": "Die drei Nutzlasten eines ProxMenux-Backups und wie die Wiederherstellung den Quellhost von ihnen reproduziert." + }, + "header": { + "title": "Wie es funktioniert", + "description": "Die interne Aufschlüsselung eines ProxMenux-Backups - Dateisystem, Manifest und Anwendungsinventar - und wie die Wiederherstellung alle drei verbraucht, um den Quellhost auf einem Ziel zu reproduzieren, das möglicherweise nicht den gleichen Kernel teilt.", + "section": "Sicherung und Wiederherstellung" + }, + "intro": { + "title": "Ein Archiv, drei Nutzlasten", + "body": "Jedes Backup erzeugt drei klar getrennte Datenblöcke unter einem gemeinsamen Vorbereitungsverzeichnis. Das hochgeladene Archiv (lokales .tar.zst, PBS-Backup oder Borg-Archiv) enthält genau diese Struktur. Die Wiederherstellung nutzt alle drei: Das Manifest wird vor Änderungen ausgewertet, um Abweichungen zu erkennen und Ausschlüsse festzulegen; rootfs liefert die Konfigurationsdateien, die direkt oder nach einem Neustart angewendet werden; das Anwendungsinventar steuert die Paketinstallation und die Neuinstallation der Komponenten nach dem Start. Jeder Block lässt sich unabhängig untersuchen oder entpacken." + }, + "layout": { + "heading": "Archivlayout", + "intro": "Jedes Archiv folgt dem gleichen Baumlayout, unabhängig vom Zielort. Das metadata/-Unterverzeichnis enthält die strukturierten Nutzlasten; das rootfs/-Unterverzeichnis enthält die Dateisystemkopie.", + "treeCaption": "Das beim Backup angelegte Vorbereitungsverzeichnis. Alle Ziele erhalten denselben Verzeichnisbaum in ihrem nativen Format: tar bei lokalen Zielen, PBS-Blöcke bei PBS und Borg-Segmente bei 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│ ├── paths_archived.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": "Die Rootfs Nutzlast", + "intro": "Der Verzeichnisbaum rootfs/ ist eine einfache Dateisystemkopie, die rsync vom Quellhost erstellt. Er enthält ein ausgewähltes Standardprofil der für eine Proxmox-Wiederherstellung wichtigen Pfade sowie eigene Pfade, die der Benutzer zum Backup-Auftrag oder zur interaktiven Sitzung hinzufügt. Die Auswahl ist bewusst eng: nur Pfade, die Konfiguration enthalten oder Zustand speichern, den Proxmox nicht selbst wiederherstellen kann.", + "defaultProfileTitle": "Das Standardprofil", + "defaultProfileBody": "Das Standardprofil wird durch hb_default_profile_paths in lib_host_backup_common.sh definiert. Es umfasst acht feste Kategorien und bei Bedarf den ZFS-Zustand, die zusammen einen funktionierenden Proxmox-Host beschreiben:", + "categoriesTitle": "Pfadkategorien", + "categoryRows": [ + { + "category": "PVE-Kern", + "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", + "why": "Cluster-Dateisysteminhalte und vzdump-Standards. Die pmxcfs-Datenbank (config.db) wird als konsistenter Snapshot über sqlite3 .backup erfasst, ohne den Cluster zu stoppen, und die .db-wal / .db-shm Sidecars sind vom rsync ausgeschlossen. Wenn sqlite3 nicht verfügbar ist, wird stattdessen config.db.raw-fallback erstellt und bei der Wiederherstellung automatisch als Datenbank übernommen." + }, + { + "category": "Host-Identität und Netzwerk", + "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", + "why": "Alles, was der Host für den Netzwerkstart mit derselben Identität benötigt. Die .link-Dateien unter /etc/systemd/network ordnen Netzwerkkartennamen ihren MAC-Adressen zu, damit Neuinstallationen und Hardwareänderungen die Schnittstellen nicht umbenennen." + }, + { + "category": "Zugriff und Authentifizierung", + "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", + "why": "SSH Schlüssel, Sudo Regeln und PAM Konfiguration. Wenn Sie diese verlieren, wird der Benutzer aus dem wiederhergestellten Host ausgeschlossen." + }, + { + "category": "Kernel und Boot", + "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-Token, Modul-Blacklists, VFIO-Geräte-IDs, Mount-Tabelle, Storage-Stack-Konfiguration." + }, + { + "category": "Shell und Gebietsschema", + "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", + "why": "Systemweite Shell-Einrichtung, Umgebungsvariablen und Konfiguration der Gebietsschema-Erzeugung." + }, + { + "category": "Paketverwaltung und 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-Quellen für konsistente Paketauflösung, geplante Aufgaben, die vom Benutzer definiert werden." + }, + { + "category": "ProxMenux Zustand & Werkzeuge", + "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": "Optionale, aber übliche Proxmox-Werkzeuge. Fehlende Pfade werden in metadata/missing_paths.txt vermerkt, ohne das Backup zu stoppen." + }, + { + "category": "ProxMenux Binärdateien und root", + "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (ausgenommen flüchtige Subdir)", + "why": "ProxMenux-installierte Binärdateien und Konfiguration pro Benutzer unter /root. Flüchtige Pfade (.bash_history, .cache/, tmp/, .local/share/Trash/) sind von der Kopie ausgeschlossen. /var/lib/proxmenux hält die geplanten Backup-Jobs und den Host-Status, der von ProxMenux beibehalten wird; das Wiederherstellungsstaging, die Rollback-Kopien und die Post-Restore-Marker sind ausgeschlossen, da sie zu dem Host gehören, der eine Wiederherstellung ausführt." + }, + { + "category": "ZFS-Zustand (bedingter Zustand)", + "paths": "/etc/zfs", + "why": "Nur enthalten, wenn der Quellhost ZFS ausführt. Enthält zpool.cache und hostid." + } + ], + "customTitle": "Erweiterung des Profils mit benutzerdefinierten Pfaden", + "customBody": "Neben dem Standardprofil bietet ProxMenux zwei Möglichkeiten, zusätzliche Pfade in ein Backup aufzunehmen. Sie komponieren ohne Konflikte und gelten beide für interaktive Backups und geplante Jobs.", + "customExtrasTitle": "1. Persistente Extras (Pro-Host-Datei)", + "customExtrasBody": "Eine Textdatei bei /usr/local/share/proxmenux/backup-extra-paths.txt enthält eine Liste absoluter Pfade, die der Benutzer auf diesem Host als \"immer einschließen\" markiert hat. Wenn ein Backup im Default-Modus ausgeführt wird, fügt ProxMenux diese Pfade automatisch an das Standardprofil an, ohne zu fragen. Die Datei wird von der Benutzeroberfläche aus bearbeitet - keine manuelle Bearbeitung erforderlich - und bleibt bei Neustarts und Updates bestehen. Ein absoluter Pfad pro Zeile; #-Kommentare sind zulässig.", + "customModeTitle": "2. Benutzerdefinierter Modus (per Lauf)", + "customModeBody": "Das Starten eines Backups im Custom-Modus ersetzt die automatische Anwendung des Standardprofils durch eine Checkliste, die jeden Pfad anzeigt: die Standardprofileinträge und die persistenten Extras (vorangestellt mit [+] und bereits ausgewählt). Der Benutzer aktiviert oder deaktiviert Einträge für diesen bestimmten Lauf und kann auch Eigenen Pfad hinzufügen drücken, um einen neuen Pfad einzugeben - der dann für zukünftige Backups auf der Extras-Datei verbleibt.", + "customMissingTitle": "Aus der Quelle fehlende Pfade", + "customMissingBody": "Jeder Pfad aus dem Profil (Standard oder hinzugefügt), der auf dem Quellhost nicht vorhanden ist, wird in metadata/missing_paths.txt im Archiv aufgezeichnet. Das Backup schlägt nicht fehl und stoppt nicht – der Benutzer sieht am Ende eine Zusammenfassung der archivierten Pfade und fehlenden Pfade. In der Praxis geschieht dies bei optionalen Werkzeugpfaden wie /etc/wireguard oder /etc/prometheus, wenn diese Werkzeuge nicht installiert sind." + }, + "manifest": { + "heading": "Der Manifest-Datenblock", + "intro": "manifest.json ist ein strukturiertes JSON-Dokument, das den Quellhost zum Zeitpunkt des Backups beschreibt. Es wird von sechs unabhängigen Erfassungsskripten orchestriert von build_manifest.sh produziert. Jeder Kollektor ist schreibgeschützt, erzeugt ein gut definiertes JSON-Fragment und fällt bei einem Ausfall auf einen sicheren leeren Standard zurück - das Manifest ist immer noch verwendbar, wenn ein Abschnitt unvollständig ist.", + "orchestratorCaption": "Die sechs Sammler verfassen das Manifest. Jeder Kollektor läuft in seinem eigenen Subprozess; ein Fehler in einem fällt auf einen dokumentierten sicheren Standard zurück und warnt, bricht aber das Backup nicht ab.", + "collectorRows": [ + { + "collector": "collect_source_host.sh", + "produces": "source_host", + "content": "Hostname, PVE-Version (pveversion), PBS-Version, wenn der Host die Backup-Server-Rolle ausführt, Kernel (uname -r), Boot-Modus (efi/bios), Root-Dateisystemtyp, CPU-Modell + Architektur, Speicher in KB." + }, + { + "collector": "collect_hardware.sh", + "produces": "hardware_inventory", + "content": "GPUs (mit Hersteller- und ProxMenux-Installationsprogramm), TPUs (Coral USB + M.2 mit lsusb/lspci-Erkennung), NICs (mit MAC-, PCI-Slot- und Bridge-Mitgliedschaft), drahtlose Geräte. GPU-Einträge tragen eine passthrough_eligible-Heuristik." + }, + { + "collector": "collect_storage.sh", + "produces": "storage_inventory", + "content": "ZFS-Pools (mit Pooltyp + Mitglieds-Festplatten, die nach /dev/disk/by-id/*, /dev/disk/by-partuuid/* oder rohen /dev/sdX-Pfaden aufgelöst wurden, je nachdem, wie jeder Pool ursprünglich erstellt wurde), LVM-Volumengruppen + dünne Pools, physische Festplatten mit SMART-Fähigkeit, PVE storage.cfg-Einträge, externe Mounts." + }, + { + "collector": "collect_kernel.sh", + "produces": "kernel_params", + "content": "Vom Betreiber hinzugefügte Parameter aus /proc/cmdline, ohne übliche Standardwerte wie BOOT_IMAGE=, root=, ro/rw, quiet und splash; beim Start geladene Module aus /etc/modules; sowie Pfade der Dateien /etc/modprobe.d/*.conf mit tatsächlichen Direktiven (options, blacklist, install, alias, softdep)." + }, + { + "collector": "collect_proxmenux_state.sh", + "produces": "proxmenux_installed_components", + "content": "Lesen Sie /usr/local/share/proxmenux/managed_installs.json (Registrierung von allem, was ProxMenux installiert hat) und installed_tools.json. Jeder Eintrag behält den Installationspfad (menu_script) bei, so dass die Wiederherstellung genau den gleichen Installationsfluss auslösen kann." + }, + { + "collector": "collect_guests.sh", + "produces": "vms_lxcs_at_backup", + "content": "Zählt VMs (qm list) und LXCs (pct list) auf, die zum Backup-Zeitpunkt vorhanden sind — VMID, Name, aktueller Status. Nur das Inventar: Die eigentlichen Gästedaten liegen in der Verantwortung von vzdump / PBS." + } + ], + "schemaTitle": "Validierung des Schemas", + "schemaBody": "Das Manifest bestätigt gegen scripts/backup_restore/schema/manifest.schema.json. Das Ausführen von build_manifest.sh --validate löst eine Python-seitige JSON-Schemavalidierung aus (erfordert python3 + jsonschema). Wenn das Modul nicht vorhanden ist, wird die Überprüfung still übersprungen - die Validierung ist in erster Linie eine Entwicklerhilfe, keine Laufzeitabhängigkeit." + }, + "applications": { + "heading": "Das Anwendungsinventar", + "intro": "Zwei Inventare erfassen die zusätzlich zu den Proxmox-VE-Basispaketen installierte Software: die Paketliste unter metadata/ und das Komponentenverzeichnis im rootfs, beide unten beschrieben. Die Wiederherstellung installiert die Benutzersoftware je nach ursprünglichem Installationsweg mit APT oder den ProxMenux-Installationsskripten neu.", + "packagesTitle": "packages.manual.list", + "packagesBody": "Eine alphabetisch sortierte Textliste aus apt-mark showmanual mit allen auf dem Quellhost ausdrücklich installierten APT-Paketen. Als Abhängigkeiten des Proxmox-VE-Basissystems installierte Pakete fehlen darin; APT auf dem Ziel zieht sie selbst nach. Bei der Wiederherstellung liest _rs_run_complete_extras die Liste und wendet einen dreistufigen Filter gegen Kaskadenentfernung an: dpkg -s erkennt bereits installierte Pakete, für Bibliotheken werden vorhandene andere Hauptversionen erkannt und apt-get install --simulate prüft das Risiko von Folgeentfernungen. Danach folgt apt-get install -y.", + "componentsTitle": "components_status.json (Teil des rootfs)", + "componentsBody": "Ein JSON-Verzeichnis unter /usr/local/share/proxmenux/ erfasst jede von ProxMenux installierte Komponente mit ihrem genauen Zustand: Version und ProxMenux-spezifische Merkmale (bei NVIDIA der boolesche Wert patched, bei Coral die DKMS-Version). Die Datei liegt im rootfs und nicht unter metadata/, weil sie erst gelesen wird, nachdem das rootfs auf das Ziel kopiert wurde. Der nach dem Start ausgeführte Dispatcher (apply_cluster_postboot.sh) geht alle Einträge durch und ruft den --auto-reinstall-Hook der jeweiligen Komponente auf. Dieser liest den gespeicherten Zustand und stellt die Installation für den aktuellen Kernel des Zielsystems wieder her.", + "componentInstallersTitle": "Installationsskripte für Komponenten", + "componentInstallersBody": "Vier ProxMenux-Installateure stellen derzeit einen --auto-reinstall-Einstiegspunkt frei:", + "installerRows": [ + { + "component": "nvidia_driver", + "installer": "gpu_tpu/nvidia_installer.sh", + "action": "Lesen Sie version + patched. Downloads der exakt gleichen NVIDIA-Runfile, baut DKMS-Module gegen den Kernel des Ziels und wendet den ProxMenux-Patch erneut an, wenn die Quelle ihn hatte." + }, + { + "component": "coral_driver", + "installer": "gpu_tpu/install_coral.sh", + "action": "Lesen Sie die Coral Driver Version. Kompiliert das DKMS-Modul gegen den Kernel des Ziels." + }, + { + "component": "amdgpu_top", + "installer": "gpu_tpu/amd_gpu_tools.sh", + "action": "Lesen Sie die aufgezeichnete Version. Laden Sie die genaue .deb aus dem GitHub-Release erneut herunter." + }, + { + "component": "intel_gpu_tools", + "installer": "gpu_tpu/intel_gpu_tools.sh", + "action": "APT installiert das Paket. Idempotent, wenn bereits vorhanden von packages.manual.list." + } + ] + }, + "restoreFlow": { + "heading": "Wie die Wiederherstellung die drei Nutzlasten verbraucht", + "intro": "Die Wiederherstellung ist eine sechsstufige Pipeline. Jede Stufe liest eine bestimmte Untergruppe des Archivs und aktualisiert den Zielhost. Keine Stufe erfordert, dass der Quellhost erreichbar ist - das Archiv ist vollständig in sich geschlossen.", + "stagesCaption": "Stufe 1 wertet das Manifest aus und legt fest, was geändert werden darf. Stufe 2 kopiert rootfs-Pfade, die auf dem laufenden System angewendet werden können. Stufe 3 bereitet riskante Pfade für den nächsten Start vor. Stufe 3b importiert ZFS-Datenpools ohne Root-Dateisystem, deren Datenträger vollständig vorhanden sind. Stufe 4 installiert Pakete. Stufe 5 installiert nach dem Neustart Komponenten für den Kernel des Ziels neu.", + "stageRows": [ + { + "stage": "1", + "name": "Kompatibilitätsprüfung", + "reads": "manifest.json", + "action": "Läuft hb_compat_check aus. Vergleicht Quelle und Zielhardware (NICs, Storage IDs), PVE-Version und Hauptkernel-Version. Setzt HB_COMPAT_KERNEL_DIRECTION (same, bk_newer oder bk_older) ein und füllt RS_SKIP_PATHS mit Hardware-Drift- und Cross-Kernel-Ausschlüssen." + }, + { + "stage": "2", + "name": "Anwenden im laufenden Betrieb", + "reads": "rootfs/ (nur sichere Pfade)", + "action": "_rs_apply … hot kopiert hb_classify_path=hot-Einträge direkt auf das Live-Ziel. Alles, was unter /etc/pve, /etc/network oder als reboot/dangerous klassifiziert ist, wird verschoben." + }, + { + "stage": "3", + "name": "Ausstehende Vorbereitung", + "reads": "rootfs/ (Reboot + gefährliche Pfade)", + "action": "_rs_prepare_pending_restore bereitet riskante Pfade unter /var/lib/proxmenux/pending-restore/ vor, schreibt plan.env, apply-on-boot.list und rs-skip-paths.txt und aktiviert proxmenux-restore-onboot.service für den nächsten Start." + }, + { + "stage": "3b", + "name": "Import von Datenpools", + "reads": "manifest.storage_inventory + ZFS-Zustand des Ziels", + "action": "_rs_import_data_pools importiert jeden Nicht-Root-ZFS-Pool, dessen vollständiger Satz von Festplatten auf dem Ziel vorhanden ist. Pools mit einem fremden Hostid werden mit zpool import -f getestet. Pools, denen eine Festplatte fehlt, werden mit einer Warnung übersprungen. Das Ergebnis pro Pool wird in /var/log/proxmenux/restore-datapools-<timestamp>.log aufgezeichnet." + }, + { + "stage": "4", + "name": "Paketinstallation", + "reads": "metadata/packages.manual.list", + "action": "_rs_run_complete_extras führt den kaskadensicheren Filter aus und ruft apt-get install -y mit der Paketliste auf. Die volle Ausgabe geht an /var/log/proxmenux/restore-apt-*.log." + }, + { + "stage": "5", + "name": "Postboot", + "reads": "rootfs (bereits angewendet) + components_status.json", + "action": "Nach dem Neustart spielt apply_pending_restore.sh die zurückgestellten Pfade ab und apply_cluster_postboot.sh läuft update-initramfs, update-grub (oder proxmox-boot-tool refresh) und iteriert über components_status.json und feuert den --auto-reinstall-Hook jeder Komponente." + } + ] + }, + "whyItWorks": { + "heading": "Warum der Drei-Payload-Split verwendet wird", + "body": "Die Aufteilung richtet sich nach dem Lebenszyklus der Daten. Dateisysteminhalte werden mit rsync übertragen: schnell, nachvollziehbar und atomar je Datei. Der vor Änderungen auszuwertende Konfigurationszustand liegt als strukturiertes JSON vor: unabhängig lesbar, per Schema versionierbar und maschinell mit dem Zielzustand vergleichbar. Neu zu installierende Software wird als Inventar mit Namen und Versionen erfasst. Der Paketmanager des Ziels und die ProxMenux-Installationsskripte wählen die passenden Binärdateien. Jeder Datenblock erfüllt seine eigene Aufgabe. Zusammen ermöglichen sie eine auf konsistente Wiederherstellung ausgerichtete, fehlertolerante Verarbeitung: Bei beschädigtem Manifest bleibt rootfs wiederherstellbar; ein fehlendes Paket verhindert die Komponenteninstallation nicht; scheitert ein Komponenteninstallationsskript an einem Eintrag, wird der nächste trotzdem bearbeitet." + } +} diff --git a/web/messages/de/docs/backup-restore/index.json b/web/messages/de/docs/backup-restore/index.json new file mode 100644 index 00000000..fa7bac95 --- /dev/null +++ b/web/messages/de/docs/backup-restore/index.json @@ -0,0 +1,93 @@ +{ + "meta": { + "title": "ProxMenux Sichern und Wiederherstellen – Übersicht | Vollständige Hostsicherung und -wiederherstellung für Proxmox VE", + "description": "ProxMenux Backup & Restore erfasst den vollständigen Zustand eines Proxmox-Hosts – Dateisystem, strukturiertes Konfigurationsmanifest und installierte Pakete/Komponenten – und reproduziert ihn auf demselben oder einem anderen Host. Das Backup und die Wiederherstellung sind in sich geschlossen: keine externen Abhängigkeiten und Kernel-übergreifende Wiederherstellungen werden durch einen richtungsbewussten Safe-Subset-Filter und eine Kernel-agnostische Hydratation unterstützt.", + "ogTitle": "ProxMenux Sicherung und Wiederherstellung – Übersicht", + "ogDescription": "Vollständige Hostsicherung und -wiederherstellung für Proxmox VE mit strukturiertem Manifest, Paketliste und Neuinstallationsprogrammen für Komponenten.", + "twitterTitle": "ProxMenux Sichern und Wiederherstellen | ProxMenux", + "twitterDescription": "Vollständige Hostsicherung und -wiederherstellung für Proxmox VE mit strukturiertem Manifest, Paketliste und Komponenten-Neuinstallationsprogrammen." + }, + "header": { + "title": "Sichern und Wiederherstellen", + "description": "Vollständige Hostsicherung und -wiederherstellung für Proxmox VE. Erfasst Dateisystem, Konfiguration und installierte Komponenten in einem einzigen Archiv und reproduziert den Host auf derselben oder einer anderen Proxmox-Installation ohne externe Abhängigkeiten.", + "section": "Sichern und Wiederherstellen" + }, + "intro": { + "title": "Was es ist, in einem Absatz", + "body": "Eine ProxMenux-Sicherung erfasst den vollständigen Zustand eines Proxmox-Hosts: das Dateisystem mit den relevanten Verzeichnissen unter /etc, /root und /var/lib/pve-cluster sowie optionalen eigenen Pfaden; ein strukturiertes Manifest im JSON-Format mit erkannter Hardware, Kernel-Parametern, Netzwerkkonfiguration, ZFS-Zustand, Benutzern und Cron-Einträgen; und ein Anwendungsinventar mit allen von APT als manuell installiert markierten Paketen und den von ProxMenux installierten Komponenten samt exakten Versionen. Alle drei unterstützten Ziele – lokales Archiv, Proxmox Backup Server (empfohlen) und Borg – erhalten denselben eigenständigen Datenbestand. Mit jedem davon lässt sich der Zielhost wiederherstellen, ohne dass der Quellhost während der Wiederherstellung erreichbar sein muss." + }, + "video": { + "heading": "Videoanleitung", + "intro": "Beobachten Sie Backup & Restore lieber in Aktion, bevor Sie es konfigurieren? Diese exemplarische Vorgehensweise umfasst eine vollständige End-to-End-Demo der Funktion in ProxMenux.", + "title": "ProxMenux – Anleitung zum Sichern und Wiederherstellen", + "caption": "Externes Video auf YouTube. Spielt im erweiterten Datenschutzmodus (keine Cookies, bis Sie auf „Play“ drücken)." + }, + "whatItIsNot": { + "heading": "Was es nicht ist", + "intro": "Dieser Abschnitt beschreibt Sicherung und Wiederherstellung auf Host-Ebene: die Proxmox-Installation selbst, nicht die darauf ausgeführten Anwendungen und Gastsysteme.", + "items": [ + "Dies ist kein Sicherungswerkzeug für VMs oder CTs. Gastfestplatten und RAM-Zustand werden nicht erfasst; dafür ist vzdump zuständig. Die Konfigurationsdateien der Gäste (/etc/pve/nodes/<node>/qemu-server/*.conf und lxc/*.conf) werden jedoch gesichert. Nach der Wiederherstellung erscheint das Gastinventar erneut, und die Festplatten können aus einer vorhandenen PBS- oder lokalen Sicherung wiederhergestellt und zugeordnet werden.", + "Dies ist kein clusterweiter Vorgang. Jeder Knoten sichert sich selbst. Die Clusterzugehörigkeit wird mit /etc/pve erfasst, sodass ein wiederhergestellter Knoten erneut aufgenommen werden kann. Die Wiederherstellung eines ganzen Clusters erfordert jedoch die Abstimmung zwischen den einzelnen Knoten.", + "Dies ist kein vollständiges Festplattenabbild. Kernel-Binärdateien, initramfs und Boot-Partition werden nicht gesichert. Bei der Wiederherstellung nutzt ProxMenux die Boot-Dateien des Zielhosts, die mit update-initramfs und dem Bootloader-Werkzeug automatisch neu erzeugt werden, und installiert passende Treiber für den dort laufenden Kernel." + ] + }, + "threePillars": { + "heading": "Die drei Säulen eines Backups", + "intro": "Ein ProxMenux-Archiv ist um drei in sich geschlossene Nutzdaten herum strukturiert. Bei der Wiederherstellung werden alle drei zusammen verwendet, um den Quellhost auf einem Ziel zu reproduzieren, auf dem möglicherweise nicht einmal derselbe Kernel installiert ist.", + "diagramCaption": "Jedes Backup versendet unabhängig vom Ziel dieselben drei Payloads. Die Wiederherstellung verbraucht alle drei: rootfs zum Ablegen von Dateien, Manifest zum Erkennen von Abweichungen und Kernel-übergreifenden Unterschieden und Anwendungsinventar zum Neuinstallieren von Paketen und Komponenten im eigenen Kernel des Ziels.", + "pillar1Label": "Dateisystem", + "pillar1Detail": "rootfs/\n(rsync von /etc,\n/etc/systemd/network,\n/root sowie ein\nsqlite3-Snapshot\nvon /var/lib/pve-cluster,\n+ optionale Pfade)", + "pillar2Label": "Manifest", + "pillar2Detail": "manifest.json\n(Hardware, Kernel-\nParameter, Netzwerk,\nZFS, Benutzer, Cron,\nZFS-Pools, Speicher)", + "pillar3Label": "Anwendungen", + "pillar3Detail": "packages.manual.list\n+ components_status.json\n(manuelle APT-Pakete + ProxMenux-\nInstaller mit Versionen)" + }, + "restoreIsUniversal": { + "heading": "Die Wiederherstellung reproduziert den Quellhost, nicht das Archiv", + "body": "Beim Wiederherstellen eines ProxMenux-Backups wird nicht nur das Dateisystem extrahiert. Der Wiederherstellungsfluss liest das Manifest, um Abweichungen zwischen der Quelle und dem Ziel zu erkennen (Hardwareunterschiede, NIC-Umbenennungen, Kernelversion, ZFS-Pool-Identität), spielt das Dateisystem erneut ab und löst dann das richtige Komponenteninstallationsprogramm für jeden Dienst aus, der auf der Quelle installiert wurde (NVIDIA-Treiber, Coral TPU, AMD GPU-Tools, Intel-GPU-Tools). Jedes Installationsprogramm wird für den aktuellen Kernel des Ziels ausgeführt, sodass der wiederhergestellte Host nicht davon abhängt, dass der Kernel der Quelle vorhanden ist. Wenn der Kernel des Ziels neuer ist als der des Backups, führt ein Kernel-unabhängiger Hydration-Durchgang die eigene Optimierung des Benutzers (IOMMU-Tokens, VFIO-Geräte-IDs, benutzerdefinierte Sonderanpassungen, GRUB-Schlüssel) in die neue Startkonfiguration des Ziels ein, ohne Kernel-gebundene Dateien wörtlich zu kopieren." + }, + "twoInterfaces": { + "heading": "Zwei Schnittstellen, ein Backend", + "intro": "Alle Schritte der Sicherung und Wiederherstellung sind über zwei Oberflächen erreichbar. Beide rufen dieselbe Shell-Bibliothek auf, erstellen identische Archive und verwenden dasselbe Auftragsverzeichnis.", + "cliLabel": "ProxMenux Scripts (TUI)", + "cliDetail": "Menü → Dienstprogramme →\nHost-Sicherung/Wiederherstellung\n\nDialogbasierter Ablauf,\nSSH-freundlich, skriptfähig\nzur unbeaufsichtigten Nutzung.", + "webLabel": "ProxMenux Monitor (Web UI)", + "webDetail": "Registerkarte Backups in der\nWeboberfläche von Monitor.\n\nWiederherstellung mit einem Klick,\nlaufende Protokollanzeige, integriert\nmit Benachrichtigungen und der\nAnzeige von Rollback-Differenzen." + }, + "whereNext": { + "heading": "Wohin geht es von hier aus?", + "intro": "Jeder Unterabschnitt unten behandelt einen Aspekt des Arbeitsablaufs ausführlich. Beginnen Sie mit Wie es funktioniert, wenn das Ziel darin besteht, zu verstehen, was das Archiv enthält und warum. Wechseln Sie zu Ziele, um das Ziel für die Kopie zu konfigurieren. Lesen Sie Wiederherstellung und Cross-Kernel-Wiederherstellung für die Wiederherstellungsseite.", + "items": [ + { + "label": "So funktioniert es", + "href": "/docs/backup-restore/how-it-works", + "tail": "– die drei Payloads (rootfs, Manifest, Anwendungen) im Detail, mit den Collectors, die sie erzeugen, und dem Format jeder Datei." + }, + { + "label": "Ziele", + "href": "/docs/backup-restore/destinations", + "tail": "– Vergleich von lokal, Proxmox Backup Server (empfohlen) und Borg und wie man sie jeweils konfiguriert." + }, + { + "label": "Backups erstellen", + "href": "/docs/backup-restore/creating-backups", + "tail": "– einmalige Sicherungen, das Standardpfadprofil, Hinzufügen benutzerdefinierter Pfade, Verschlüsselung für PBS." + }, + { + "label": "Geplante Jobs", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "– neue Jobs im Vergleich zum Anhängen an einen vorhandenen PVE-vzdump-Job, Planungsformate, das Jobdetail-Modal." + }, + { + "label": "Wiederherstellen", + "href": "/docs/backup-restore/restoring", + "tail": "– die drei Aktionen für ein Archiv (Anzeigen, Herunterladen, Wiederherstellen), vollständige vs. benutzerdefinierte Wiederherstellung, der Post-Boot-Dispatcher und warum die letzten zehn Minuten wichtig sind." + }, + { + "label": "Kernelübergreifende Wiederherstellung", + "href": "/docs/backup-restore/cross-kernel", + "tail": " — vom Versionswechsel abhängiges Verhalten bei unterschiedlichen Quell- und Zielkerneln, der Filter für eine sichere Teilmenge und die vier Hydratationsphasen." + } + ] + } +} diff --git a/web/messages/de/docs/backup-restore/restoring.json b/web/messages/de/docs/backup-restore/restoring.json new file mode 100644 index 00000000..d7e11a92 --- /dev/null +++ b/web/messages/de/docs/backup-restore/restoring.json @@ -0,0 +1,282 @@ +{ + "meta": { + "title": "Wiederherstellen eines Backups – vollständige und benutzerdefinierte Abläufe | ProxMenux", + "description": "Der komplette Wiederherstellungsworkflow. Dokumentiert die drei Aktionen, die für jedes Backup verfügbar sind (Ansicht, Download, Wiederherstellung), die Kompatibilitätsprüfung und ihre Ergebnisse, die vollständigen und benutzerdefinierten Wiederherstellungsmodi, die Pfadklassifizierung, die entscheidet, was live gilt und was auf den nächsten Start wartet, den On-Boot-Dispatcher und den Post-Boot-Komponentenneuinstallationspass.", + "ogTitle": "ProxMenux Backup — Wiederherstellung", + "ogDescription": "Vollständige und benutzerdefinierte Wiederherstellungsflüsse mit Kompatibilitätsprüfung, Pfadklassifizierung, On-Boot-Dispatcher und Post-Boot-Neuinstallation.", + "twitterTitle": "Wiederherstellen eines Backups | ProxMenux", + "twitterDescription": "Wie ein ProxMenux-Host-Backup wieder in einen funktionierenden Proxmox-Host umgewandelt wird." + }, + "header": { + "title": "Wiederherstellen eines Backups", + "description": "Der vollständige Wiederherstellungsworkflow: vom Auswählen eines Archivs bis zum Arbeitshost. Dokumentiert die Kompatibilitätsprüfung, die beiden Wiederherstellungsmodi, den On-Boot-Dispatcher, den Post-Boot-Reinstallationspass und die Mechanismen, die Cross-Host- und Cross-Kernel-Wiederherstellungen vorhersehbar machen.", + "section": "Sicherung und Wiederherstellung" + }, + "intro": { + "title": "Die Wiederherstellung reproduziert die Quelle, nicht nur die Dateien", + "body": "Ein ProxMenux-Backup wiederherzustellen umfasst mehr als das Entpacken von Dateien. Vor Änderungen wertet die Wiederherstellung das Manifest aus, erkennt Unterschiede zwischen Quelle und Ziel, schließt möglicherweise startgefährdende Pfade aus und passt Benutzereinstellungen an, die nicht unverändert kopiert werden können. Nach dem erforderlichen Neustart versucht sie, die erfassten unterstützten Komponenten (NVIDIA-Treiber, Coral-TPU und GPU-Werkzeuge) für den laufenden Zielkernel neu zu installieren. Ein ausgewähltes Archiv steuert Kompatibilitätsprüfung, Pfadklassifizierung und die Arbeiten beim und nach dem Start. Prüfen Sie die Komponentenergebnisse und Protokolle." + }, + "threeActions": { + "heading": "Drei Aktionen auf einem Backup", + "intro": "Durch Auswählen eines Backups aus der Liste wird ein Menü mit drei Aktionen geöffnet.", + "actionRows": [ + { + "action": "Ansicht", + "detail": "Öffnet eine schreibgeschützte Ansicht des Archivs: manifest.json-Inhalte (Quellhostname, PVE-Version, Kernel, Hardware, installierte Komponenten), die Liste der Pfade innerhalb von rootfs/ und ein Vergleich dessen, was sich auf dem aktuellen Host ändern würde, wenn das Backup angewendet würde." + }, + { + "action": "Herunterladen", + "detail": "Exportiert das Archiv als tragbare .tar.zst-Datei (tar komprimiert mit zstd). Es kann auf jedem Linux-System mit tar --zstd -xf FILE.tar.zst extrahiert werden, oder auf macOS / Windows mit jedem Tool, das zstd unterstützt (7-Zip, PeaZip, Keka ...). Der extrahierte Baum enthält manifest.json, metadata/ und rootfs/ - genau das gleiche Layout, das die Wiederherstellung verbraucht. Nützlich für die Offline-Inspektion oder für die Wiederherstellung auf einem Host ohne Zugriff auf das ursprüngliche Ziel (PBS, Borg)." + }, + { + "action": "Wiederherstellen", + "detail": "Der Schreibpfad. Extrahiert das Archiv in ein Staging-Verzeichnis, führt die Kompatibilitätsprüfung aus und präsentiert den Moduswähler (Full oder Custom)." + } + ] + }, + "compatibilityCheck": { + "heading": "Die Vereinbarkeitsprüfung", + "intro": "Bevor eine Datei geschrieben wird, vergleicht hb_compat_check den im Manifest beschriebenen Zustand mit dem Zielhost. Der Check läuft schreibgeschützt und erzeugt vier unabhängige Ausgänge, die den Rest der Wiederherstellung steuern.", + "outputRows": [ + { + "output": "Kernel-Richtungskennzeichen", + "detail": "HB_COMPAT_KERNEL_DIRECTION — eines von same, bk_newer oder bk_older. Vergleicht die Hauptkernelversion des Backups mit der des Ziels. Steuert den Cross-Kernel-Safe-Subset-Filter (feuert nur auf bk_older) und den Hydratationspass, der auf der Cross-Kernel-Seite dokumentiert ist." + }, + { + "output": "Liste der Skip Paths", + "detail": "RS_SKIP_PATHS - jeder Pfad, den die Wiederherstellung NICHT anwenden darf. Bevölkert durch zwei Mechanismen: Hardware-Drift (fehlende NIC, fehlende Speicher-ID, ausländischer ZFS-Pool) und - wenn die Richtung bk_older ist - die kernübergreifende Liste der unsicheren Pfade." + }, + { + "output": "NIC-Remapplan", + "detail": "Wenn ein NIC auf dem Ziel den gleichen MAC wie auf der Quelle, aber einen anderen Namen hat (typischerweise nach einem Motherboard-Swap), registriert die Kompatibilitätsprüfung einen Umbenennungsplan (HB_NIC_REMAP), der /etc/network/interfaces während der Wiederherstellung umschreibt." + }, + { + "output": "Rollback-Plan", + "detail": "Berechnet durch compute_rollback_plan.sh. Listet VMs, LXCs und Komponenten auf, die auf dem Ziel, aber nicht im Backup vorhanden sind. Im Bestätigungsdialog kann das Entfernen zusätzlicher Gäste vor dem Neustart gewählt werden. Komponenten müssen manuell entfernt werden; auch das Löschen von Gästen kann scheitern. Eine exakte Übereinstimmung wird daher nicht garantiert." + } + ], + "reportBody": "Der Check sendet auch einen strukturierten Bericht (HB_COMPAT_RESULTS) aus, der als PASS / INFO / WARN / FAIL kategorisiert ist. WARN- und FAIL-Einträge tauchen im Pre-Restore-Bereich auf; die Wiederherstellung weigert sich, nur dann fortzufahren, wenn ein FAIL vorhanden ist, den der Benutzer nicht durch Klicken auf Weiter beheben kann." + }, + "twoModes": { + "heading": "Vollständige Wiederherstellung vs Custom Wiederherstellung", + "intro": "Nach der Kompatibilitätsprüfung erscheint die Modusauswahl. Sie bestimmt, was angewendet wird und nicht, wie: Beide Modi verwenden denselben Ablauf.", + "modeRows": [ + { + "mode": "Vollständige Wiederherstellung", + "detail": "Wendet jeden Pfad im Archiv an, der die Drift- und Kreuzkernfilter überlebt. Führt auch die Paketinstallation und den automatischen Komponentenneuinstallationspass aus. Dies ist der Standard und die empfohlene Wahl - das Ziel ist es, die Quelle zu reproduzieren, nicht Stücke auszuwählen." + }, + { + "mode": "Benutzerdefinierte Wiederherstellung", + "detail": "Öffnet eine Checkliste, die jeden Pfad zeigt, den das Archiv führt. Der Benutzer tickt eine Teilmenge. Durch den Kreuzkernfilter blockierte Pfade erscheinen ausgegraut und können nicht ausgewählt werden. Paketinstallation und automatische Neuinstallation von Komponenten werden standardmäßig im benutzerdefinierten Modus übersprungen - der Benutzer signalisiert, dass er eine teilweise Anwendung und keine vollständige Reproduktion wünscht." + } + ] + }, + "pathClassification": { + "heading": "Wie Pfade klassifiziert werden", + "intro": "Jeder für die Wiederherstellung ausgewählte Pfad wird von hb_classify_path in eine von drei Kategorien eingestuft. Die Kategorie bestimmt, wann der Pfad auf das System angewendet wird und warum.", + "rows": [ + { + "class": "hot", + "detail": "Pfade angewendet sofort auf das laufende System. Der Dienst, der sie verbraucht, nimmt die Änderung selbst oder beim nächsten Neuladen auf - kein Neustart erforderlich. Dies ist der Hauptteil eines Backups: /etc/ssh, /etc/apt, /etc/cron.*, /root, /usr/local/bin, allgemeine Servicekonfigurationsdateien usw." + }, + { + "class": "reboot", + "detail": "Pfade, die dieser Ablauf für den nächsten Start zurückstellt, statt sie sofort anzuwenden. Sie betreffen die Startkonfiguration: Die Bootloader-Erzeugung liest /etc/default/grub, das Einhängen nutzt /etc/fstab und das Laden von Modulen /etc/modules. Nach dem Neustart werden die vorgemerkten Dateien angewendet und die nötigen Startartefakte neu erzeugt. Beispiele: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + }, + { + "class": "dangerous", + "detail": "Pfade, die NICHT im laufenden System wiederhergestellt werden: Ein Schreibzugriff könnte dort den Zustand beschädigen oder die aktive Verbindung unterbrechen. Sie werden vorgemerkt und nach dem Neustart vom Post-Boot-Dispatcher geschrieben, wenn der Cluster verfügbar ist, das System aber noch nicht vollständig genutzt wird. Beispiele sind /etc/pve (pmxcfs ist ein aktiver FUSE-Mount mit laufender Clusterkonfiguration), /var/lib/pve-cluster (aktive Clusterdaten) und /etc/network (könnte die für die SSH-Verbindung verwendete Schnittstelle neu konfigurieren und dadurch die Sitzung trennen)." + } + ] + }, + "fullFlow": { + "heading": "Der vollständige Wiederherstellungsworkflow", + "intro": "Die komplette Pipeline von der Archivauswahl bis zu einem funktionierenden wiederhergestellten Host. Jede Stufe füttert die nächste; der von früheren Stufen geschriebene Zustand wird von späteren verbraucht.", + "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" + }, + "pendingMachinery": { + "heading": "Die Mechanik der vorgemerkten Wiederherstellung", + "intro": "Pfade, die als reboot oder dangerous klassifiziert sind, und Hydratationsschreiben, werden für den nächsten Boot inszeniert, anstatt live angewendet zu werden. Dies geschieht durch einen kleinen, in sich geschlossenen Satz von Dateien unter /var/lib/proxmenux/pending-restore/:", + "rows": [ + { + "file": "apply-on-boot.list", + "content": "Ein relativer Pfad je Zeile: die genauen Pfade, die apply_pending_restore.sh aus dem vorbereiteten rootfs anwendet. Diese Datei zeigt, was beim nächsten Start geändert wird." + }, + { + "file": "plan.env", + "content": "Umgebungsvariablen, die über das On-Boot-Skript bezogen werden: Wiederherstellungs-ID, Kompatibilitätskennzeichen (HB_COMPAT_CROSS_VERSION, HB_COMPAT_KERNEL_DIRECTION, HB_HYDRATION_APPLIED), Rollback-Opt-in-Flag, Clusteroptionen." + }, + { + "file": "rs-skip-paths.txt", + "content": "Die endgültige RS_SKIP_PATHS-Liste blieb bestehen, so dass apply_pending_restore.sh nach dem Neustart die gleichen Ausschlüsse anwendet, die während des interaktiven Schritts berechnet wurden. Verhindert, dass driftbeeinflusste oder kernübergreifend unsichere Pfade beim Booten wiederhergestellt werden." + }, + { + "file": "rootfs/", + "content": "Die inszenierten Dateien selbst - die genauen Bytes, die festgelegt werden. Behielt auf dem gleichen Dateisystem wie /, so dass der On-Boot rsync schnell ist und nicht davon abhängt, dass externer Speicher beim Booten noch erreichbar ist." + } + ], + "unitBody": "Die systemd-Einheit proxmenux-restore-onboot.service wird am Ende des interaktiven Schritts aktiviert. Der einmalige Dienst startet früh beim nächsten Boot, ruft apply_pending_restore.sh auf und deaktiviert sich anschließend. Die Bedingung ConditionPathExists=/var/lib/proxmenux/pending-restore/state sorgt dafür, dass er bei Starts ohne vorgemerkte Wiederherstellung nichts ausführt." + }, + "postbootDispatcher": { + "heading": "Der Postboot-Dispatcher — apply_cluster_postboot.sh", + "intro": "Wo der interaktive Schritt endet und wo die eigentliche Host-Reproduktion stattfindet. apply_cluster_postboot.sh wird als zweites One-Shot-systemd-Dienst (proxmenux-apply-cluster-postboot.service) installiert, dessen After=/Wants=-Ziele sicherstellen, dass es nur nach dem Ausführen von Pve-Cluster und Netzwerk-Online ausgeführt wird. Hier landen die host-visiblen Wiederherstellungsaktionen.", + "tasks": [ + { + "task": "Anwendung von /etc/pve", + "detail": "/etc/pve ist ein Live-Pmxcfs FUSE-Mount - es kann nicht beim frühen Booten geschrieben werden. Der Dispatcher kopiert Dateien von den ausstehenden Rootfs in das Live-/etc/pve, sobald das Cluster-Dateisystem aktiviert ist, eine Datei nach der anderen, ohne den pve-Cluster neu zu starten. Das erfasste /var/lib/pve-cluster/config.db aus dem Backup (oder das geförderte config.db.raw-fallback) wird mit dem systemctl stop pve-cluster → Atomdateikopie → systemctl start pve-cluster Muster materialisiert, so dass pmxcfs den wiederhergestellten Zustand auf dem Weg zurück nach oben erneut liest." + }, + { + "task": "Rebuild Initramfs und Bootloader", + "detail": "Führt update-initramfs -u -k all über jeden installierten Kernel aus, dann entweder update-grub (GRUB-Installationen) oder proxmox-boot-tool refresh (systemd-Boot / ZFS-Installationen). Überspringt, wenn der interaktive Schritt feststellte, dass sich nichts an den Pfaden geändert hat, die sich auf diese Werkzeuge auswirken." + }, + { + "task": "Auto-Reinstallation der Komponente", + "detail": "Liest die wiederhergestellte components_status.json und durchläuft die unterstützten Installationsskripte (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Jedes ausgewählte Skript läuft mit --auto-reinstall, liest den erfassten Zustand und installiert für die Zielumgebung neu, einschließlich nötiger Kernelmodule. Dies erfolgt nach dem Neustart, damit der dann laufende Zielkernel verwendet wird. Einzelfehler werden protokolliert und stoppen die nächste Komponente nicht." + }, + { + "task": "Prüfung der Startkonfiguration", + "detail": "Bevor Sie die Abschlussbenachrichtigung starten, überprüfen Sie, ob proxmox-boot-tool status ein konfiguriertes ESP anzeigt, jedes /boot/vmlinuz-* ein passendes /lib/modules/<ver>-Verzeichnis hat und /vmlinuz auflöst. Jede inkonsistenz wird in der benachrichtigung aufgetaucht, anstatt versteckt zu werden." + }, + { + "task": "Abschlussmeldung", + "detail": "Sendet das Host restore finished-Event über hb_notify_lifecycle. Enthält die Gesamtdauer, die Anzahl der angewandten Pfade, gegebenenfalls Warnungen vor der Sanitätsprüfung und einen Link zum Protokoll bei /var/log/proxmenux/proxmenux-cluster-postboot-*.log. Wenn Benachrichtigungen nicht konfiguriert sind, ist das Ereignis still – das Protokoll zeichnet immer noch alles auf." + } + ] + }, + "liveProgress": { + "heading": "Live-Fortschritt auf der Registerkarte Backups des Monitors", + "body": "Nach dem Neustart wird auf der Registerkarte Backups von ProxMenux Monitor eine Live-Post-Restore-Karte angezeigt, die den Status von proxmenux-apply-cluster-postboot.service während der Ausführung widerspiegelt. Die Karte wird von /var/lib/proxmenux/restore-state.json gesteuert, die der Dispatcher bei jedem Meilenstein aktualisiert (Cluster-Konfiguration anwenden, Initramfs neu erstellen, Bootloader aktualisieren, pro Komponente neu installieren, Boot-Sanity-Check, finalisieren).", + "fields": [ + { + "name": "Statusabzeichen", + "detail": "Einer der Zustände Wiederherstellung läuft, Wiederherstellung abgeschlossen oder Wiederherstellung fehlgeschlagen. Die Karte fragt die Statusdatei während der Ausführung alle 2 Sekunden und danach alle 30 Sekunden ab." + }, + { + "name": "Fortschrittsbalken + Schrittzähler", + "detail": "Zeigt N/M steps mit dem Label des aktuellen Schritts an. Während die Wiederherstellung ausgeführt wird, wird eine geschätzte Zeit aus abgeschlossenen Schritten und verstrichener Zeit abgeleitet." + }, + { + "name": "Komponentenliste", + "detail": "Eine Zeile pro Treiber wird neu installiert (NVIDIA, Intel GPU tools, AMD tools, Coral TPU) mit installing / ok / failed plus einem Link zum Pro-Komponenten-Log bei /var/log/proxmenux/component-*.log." + }, + { + "name": "Import von Datenpools", + "detail": "Der Block data_pools_import zeigt fünf farbige Zeilen: Importiert, Erzwungen (mit -f wegen fremdem hostid), Unvollständig übersprungen (nur einige Datenträger vorhanden), Fehlend übersprungen (keine Datenträger vorhanden) und Fehlgeschlagen. Der Zustand liegt in /var/lib/proxmenux/restore-state.json, das vollständige Laufprotokoll in /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "name": "Warnungen zur Boot-Sicherheit", + "detail": "Der Dispatcher prüft auf fehlende /lib/modules/<kernel>, fehlende ESP-Konfiguration und baumelnde /vmlinuz-Symlinks. Jede Warnung taucht hier als farbiges Banner auf." + }, + { + "name": "Rollback-Delta", + "detail": "Listen Sie VMs, LXCs und Komponenten auf, die auf dem Ziel vorhanden sind, aber nicht im wiederhergestellten Backup waren - die gleichen Einträge tauchten im destruktiven Rollback-Dialog vor der Wiederherstellung auf. Jede Zeile trägt den manuellen Bereinigungsbefehl." + }, + { + "name": "Letzte Protokollzeilen", + "detail": "Die letzten 600-Zeilen von proxmenux-cluster-postboot-<ts>.log, mit einem Nur Probleme Filter, der nur Zeilen hält, die mit error, warning, failed, ✗ oder traceback übereinstimmen." + } + ], + "dismissBody": "Ist die Wiederherstellung abgeschlossen oder fehlgeschlagen, klappt Ausblenden die Karte zu. Die Statusdatei bleibt erhalten; Verlauf öffnet sie und frühere Wiederherstellungen erneut. Die letzten 20 Läufe liegen unter /var/lib/proxmenux/restore-history/.", + "imageAlt": "Detaildialog des Wiederherstellungsfortschritts im ProxMenux Monitor während einer laufenden Wiederherstellung: blaues Statuszeichen, aktueller Schritt „Initramfs neu erstellen“, geschätzte Restzeit, teilweise gefüllter Fortschrittsbalken und aktuelle Protokollzeilen.", + "imageCaption": "Die Details modal, während der Post-Boot-Dispatcher noch läuft - Abzeichen, aktueller Schritt, verbleibende Zeit und Live-Log-Tail.", + "detailsImageAlt": "Die gleichen Details modal, nachdem die Wiederherstellung abgeschlossen ist, mit dem grünen Wiederherstellungsabzeichen, der Gesamtlaufdauer (0m53s), einem vollständig gefüllten 6 / 6-Fortschrittsbalken, dem leeren Rollback-Delta und dem archivierten Postboot-Protokoll.", + "detailsImageCaption": "Das gleiche Modal, wenn der Lauf beendet ist - Abzeichen, Gesamtdauer, gefüllter Fortschrittsbalken und das archivierte Postboot-Protokoll." + }, + "postbootExample": { + "heading": "Wie der Post-Boot auf der Konsole aussieht", + "body": "Auf der physischen Host-Konsole endet ein erfolgreich beendeter Dispatcher-Prozess mit [ OK ] Finished proxmenux-apply-cluster-postboot.service, oft neben den OK-Meldungen für multi-user.target und graphical.target. Dies markiert das Prozessende. Einzelne Komponentenfehler oder Startwarnungen können trotzdem vorliegen. Prüfen Sie daher Komponentenstatus und Protokolle im Monitor, bevor Sie den Host als vollständig wiederhergestellt betrachten.", + "imageAlt": "Physische Proxmox-Konsole mit '[ OK ] Finished proxmenux-apply-cluster-postboot.service - ProxMenux Apply Cluster Configs (post-boot).', gefolgt von OK für multi-user.target und graphical.target; darüber die Host-Anmeldeaufforderung.", + "imageCaption": "Physische Konsole nach Prozessende. 'Finished proxmenux-apply-cluster-postboot.service' markiert den Abschluss, den auch 'Host restore finished' im Monitor meldet. Komponentenergebnisse und Warnungen müssen weiterhin geprüft werden." + }, + "tenMinutes": { + "heading": "Warum die letzten zehn Minuten wichtig sind", + "intro": "Der Neustart selbst dauert Sekunden, aber der Post-Boot-Dispatcher verbringt etwa zehn Minuten damit, die Wiederherstellung abzuschließen. Während dieses Fensters ist der Host erreichbar und die Anmeldung funktioniert, aber einige Dienste (hauptsächlich von GPU-Treibern abhängige) sind noch nicht verfügbar. Zeitaufschlüsselung für einen typischen Proxmox-Host mit NVIDIA + Coral installiert:", + "rows": [ + { + "stage": "Boot + pve-Cluster bereit", + "time": "~30 s", + "detail": "Standard Proxmox Boot. SSH, Web-UI und Login sind am Ende dieser Phase verfügbar." + }, + { + "stage": "/etc/pve auf pmxcfs anwenden", + "time": "~10 s", + "detail": "Schnell – kleine Konfigurationsdateien, die nacheinander in das Live-Cluster-Dateisystem kopiert wurden." + }, + { + "stage": "Initramfs über Kernel hinweg neu aufbauen", + "time": "3–5 min", + "detail": "update-initramfs -u -k all stellt pro installiertem Kernel ein Initramfs-Image wieder her. Masse des Wartens." + }, + { + "stage": "Neuaufbau der Bootloader-Konfiguration", + "time": "10–30 s", + "detail": "update-grub oder proxmox-boot-tool refresh. Schnell sogar auf ZFS." + }, + { + "stage": "NVIDIA-Treiber neu installieren (falls zutreffend)", + "time": "5–10 min", + "detail": "Laden Sie die aufgezeichnete Treiberversion herunter, kompilieren Sie die DKMS-Module mit dem aktuellen Kernel und wenden Sie den ProxMenux-Patch an, wenn die Quelle ihn hatte. Längste Einzelaufgabe." + }, + { + "stage": "Neuinstallation von Coral und anderen Komponenten", + "time": "3–5 min", + "detail": "DKMS-Kompilierung für Coral, apt install für intel-gpu-tools und .deb-Download mit Installation für amdgpu_top." + }, + { + "stage": "Startprüfung und Benachrichtigung", + "time": "~2 s", + "detail": "Geringer Aufwand. Die Benachrichtigung meldet dem Benutzer unmittelbar den Abschluss des Laufs." + } + ], + "outroBody": "Während dieser Zeit können nach der Anmeldung Werkzeuge fehlen (nvidia-smi nicht gefunden, coral nicht erkannt), weil die Neuinstallation im Hintergrund läuft. Die Abschlussmeldung markiert ihr Ende. Prüfen Sie Komponentenergebnisse, Warnungen und Protokolle auf einzelne Fehler." + }, + "destructiveRollback": { + "heading": "Der optionale destruktive Rollback", + "body": "Die Wiederherstellung ist standardmäßig additiv: Zusätzliche VMs, LXCs und Komponenten bleiben erhalten. Bei Unterschieden bietet der Dialog Destruktiven Rollback ausführen? mit Nein als Vorgabe an. Zustimmung ruft vor dem Neustart _rs_execute_rollback auf, um die aufgelisteten zusätzlichen VMs und LXCs zu löschen. Komponenten werden zur manuellen Deinstallation markiert, da automatische Deinstallation nicht implementiert ist. Fehler beim Löschen von Gästen werden gemeldet; die Verarbeitung läuft weiter. Eine exakte Übereinstimmung mit dem Backup wird nicht garantiert. Prüfen Sie vor dieser destruktiven Wahl Namen und VMIDs/CTIDs." + }, + "logs": { + "heading": "Speicherorte der Protokolle", + "rows": [ + { + "log": "/var/log/proxmenux/restore-YYYYMMDD_HHMMSS.log", + "detail": "Vom interaktiven Schritt geschrieben. Enthält Kompatibilitätsergebnisse, Filter für Abweichungen, Anpassungsplan, Ausgabe der direkten Anwendung und Vorbereitung vorgemerkter Änderungen sowie Paketinstallation." + }, + { + "log": "/var/log/proxmenux/apply-pending-YYYYMMDD_HHMMSS.log", + "detail": "Von apply_pending_restore.sh beim frühen Start geschrieben. Enthält das Einlesen von plan.env, das Abarbeiten von apply-on-boot und die Pfadausschlüsse." + }, + { + "log": "/var/log/proxmenux/proxmenux-cluster-postboot-YYYYMMDD_HHMMSS.log", + "detail": "Geschrieben von apply_cluster_postboot.sh. Enthält: pve-cluster apply, Initramfs und Bootloader-Ausgabe, Ausgabe pro Komponente Installateur, Sanity-Check, Benachrichtigung Nutzlast." + }, + { + "log": "/var/log/proxmenux/component--YYYYMMDD_HHMMSS.log", + "detail": "Ein Protokoll pro Komponenteninstallationsprogramm (nvidia, coral usw.), das im Post-Boot-Durchlauf ausgeführt wurde. Nützlich, wenn die Neuinstallation einer bestimmten Komponente fehlgeschlagen ist und der Benutzer die eigene Ausgabe des Tools benötigt." + }, + { + "log": "/var/log/proxmenux/restore-datapools-YYYYMMDD_HHMMSS.log", + "detail": "Geschrieben von _rs_import_data_pools. Enthält: Aufzählung von Nicht-Root-Pools aus dem Manifest, Pro-Pool-Ergebnis (sauber importiert, mit -f für ausländische Hostids importiert, aufgrund fehlender Festplatten übersprungen oder fehlgeschlagen) und die Rohausgabe jedes zpool import-Aufrufs." + } + ] + }, + "whereNext": { + "heading": "Wohin Sie als nächstes gehen", + "items": [ + { + "label": "Kernübergreifende Wiederherstellung", + "href": "/docs/backup-restore/cross-kernel", + "tail": "- der richtungsbewusste Safe-Subset-Filter und der Hydratationspass, der aufgerufen wird, wenn sich der Zielkernel vom Backup unterscheidet." + }, + { + "label": "Wie es funktioniert", + "href": "/docs/backup-restore/how-it-works", + "tail": "- das Archivlayout, Manifest und Anwendungsinventar, das die Wiederherstellung verbraucht." + }, + { + "label": "Geplante Aufträge", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "— der unbeaufsichtigte Fluss, der die Archive produziert, die diese Seite verbraucht." + } + ] + } +} diff --git a/web/messages/de/docs/backup-restore/scheduled-jobs.json b/web/messages/de/docs/backup-restore/scheduled-jobs.json new file mode 100644 index 00000000..dbe92ef5 --- /dev/null +++ b/web/messages/de/docs/backup-restore/scheduled-jobs.json @@ -0,0 +1,152 @@ +{ + "meta": { + "title": "Geplante Aufträge — Timer, Attachment-Modus, Retention | ProxMenux", + "description": "Geplante ProxMenux Host-Backup-Jobs. Zwei Erstellungsmodi (eigener systemd-Timer oder Attachment zu einem vorhandenen PVE vzdump-Job), Retentionswerte, die pro Job über proxmox-backup-client/borg/local prune angewendet werden, Storage-Layout unter /var/lib/proxmenux/backup-jobs und das Runner-Script, das Archive erzeugt, die mit dem interaktiven Fluss identisch sind.", + "ogTitle": "ProxMenux Backup — geplante Aufträge", + "ogDescription": "Unbeaufsichtigte geplante Host-Backups mit Attachment-Modus, Retention und den gleichen drei Zielen wie der interaktive Fluss.", + "twitterTitle": "Geplante Jobs | ProxMenux", + "twitterDescription": "Unbeaufsichtigte geplante Host-Backup-Jobs mit Attach-Modus und Retention." + }, + "header": { + "title": "Geplante Aufträge", + "description": "Unbeaufsichtigte Host-Backup-Jobs. Zwei Erstellungsmodelle: ein neuer unabhängiger Job mit einem eigenen Zeitplan oder ein Job, der an eine bestehende PVE vzdump-Aufgabe angehängt ist, die den Zeitplan und die Aufbewahrung dieser Aufgabe erbt. Beide produzieren Archive, die mit dem interaktiven Fluss identisch sind.", + "section": "Sicherung und Wiederherstellung" + }, + "intro": { + "title": "Die beiden planmäßigen Job-Modelle", + "body": "Ein geplanter Job kann nach einem von zwei Modellen erstellt werden:", + "modelsList": [ + "Neuer unabhängiger job — ProxMenux definiert den Jobplan selbst mit einem eigenen systemd-Timer, unabhängig von anderen Aufgaben auf dem Host. Kompatibel mit allen drei Destinationen: Local, PBS und Borg.", + "An eine bestehende PVE vzdump-Task anhängen – der Job hat keinen eigenen Zeitplan; er wird automatisch ausgeführt, wenn die übergeordnete PVE vzdump-Task, die bereits die VMs und LXCs auf diesem Host sichert, ausgelöst wird. Erbt den Zeitplan und die Beibehaltung von der übergeordneten Aufgabe. Kompatibel mit Local und PBS (Borg wird nicht unterstützt, da PVE keinen nativen Scheduler für Borg hat)." + ] + }, + "attachBadge": { + "title": "Attach-Modus — empfohlen, wenn bereits eine PVE vzdump-Task existiert", + "body": "Wenn bereits ein PVE-vzdump-Auftrag für die VMs und LXCs dieses Knotens eingerichtet ist, wird das angehängte Host-Backup nach dem Gast-Backup im selben Sicherungszyklus ausgeführt. Bei der Wiederherstellung stammen die Gastkonfigurationen aus dem Host-Backup (unter /etc/pve) und die Gastfestplatten aus den vzdump-Backups dieses Zyklus. Dies erleichtert eine koordinierte Wiederherstellung des gesamten Knotens, ist aber kein atomarer Snapshot: Änderungen während des Zyklus können Unterschiede zwischen Hostkonfiguration und Gastfestplattenzustand hinterlassen." + }, + "frequencyBadge": { + "title": "Empfohlene Häufigkeit", + "body": "Um die Kompatibilität zwischen einem Host-Backup und seiner zukünftigen Wiederherstellung zu maximieren, führen Sie häufig Host-Backups aus. Je näher das Backup dem aktuellen Zustand des Hosts ist, desto weniger Konfigurations-, Paket- und Komponentendrift muss die Wiederherstellung in Einklang bringen." + }, + "modes": { + "heading": "Die beiden Modi", + "rows": [ + { + "mode": "Neuer geplanter Auftrag", + "backends": "Lokal, PBS, Borg", + "schedule": "Eigener OnCalendar-Ausdruck (systemd-Kalendersyntax, z. B. daily oder Mon..Fri 03:00).", + "retention": "Separat abgefragt: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. Wird vom Ausführungsskript nach jedem erfolgreichen Backup angewendet." + }, + { + "mode": "Anhängen an einen PVE vzdump Job", + "backends": "Lokal, PBS (Borg hat keinen PVE-seitigen Scheduler)", + "schedule": "Vererbt vom Eltern-PVE-Job. Auf der ProxMenux-Seite ist kein systemd-Timer installiert.", + "retention": "Aus der prune-backups-Konfiguration des übergeordneten Auftrags übernommen (über hb_pve_prune_to_keep_env eins zu eins den KEEP_*-Variablen des Ausführungsskripts zugeordnet)." + } + ] + }, + "attachDetail": { + "heading": "Wie Attach Mode funktioniert", + "intro": "PVE speichert vzdump-Aufträge in /etc/pve/jobs.cfg — einen Abschnitt pro Auftrag mit dem Speicherziel für VM- und LXC-Backups. Der Attach-Modus erfordert ein von ProxMenux unterstütztes Backend (Lokal oder PBS). Das Host-Backup wird nach Abschluss des Gast-Backups über den job-end-Hook ausgeführt.", + "steps": [ + { + "step": "1", + "detail": "Während der Auftragserstellung listet ProxMenux kompatible übergeordnete PVE-Aufgaben über hb_pve_list_vzdump_jobs_for_backend auf. Der Benutzer wählt einen aus." + }, + { + "step": "2", + "detail": "Der .env des Jobs wird mit PVE_PARENT_JOB, PVE_STORAGE und den geerbten KEEP_*-Werten geschrieben; es wird kein systemd-Timer erstellt." + }, + { + "step": "3", + "detail": "hb_install_vzdump_hook registriert einen Skript-Hook in /etc/vzdump.conf. In der job-end-Phase jedes vzdump-Auftrags vergleicht er den übergebenen $STOREID mit PVE_STORAGE aller aktivierten angehängten Aufträge und startet das Ausführungsskript bei Übereinstimmung. Der Abgleich erfolgt nach Speicher, nicht nach der ID des gewählten übergeordneten Auftrags." + }, + { + "step": "4", + "detail": "Das Archiv landet im selben Speicher, den die vzdump-Dumps gerade geschrieben haben: path/dump/ für Local oder das PBS-Repository, das auf dem PVE-Speichereintrag konfiguriert ist." + } + ], + "outroBody": "Der Attach-Modus hat keinen eigenen Timer. Das Deaktivieren oder Löschen des gewählten übergeordneten PVE-Auftrags stoppt dessen Auslösung; andere vzdump-Aufträge mit demselben Speicher können das Host-Backup weiterhin auslösen. Deaktivieren oder löschen Sie den ProxMenux-Auftrag selbst, um dies zu verhindern. Beim Deaktivieren bleibt der Eintrag auf der Festplatte und kann später erneut aktiviert oder angehängt werden." + }, + "storageLayout": { + "heading": "Dateien, die einen Job ausmachen", + "intro": "Jeder geplante Job wird vollständig durch drei oder vier Dateien auf der Festplatte beschrieben. Das Lesen gibt die vollständige Konfiguration des Jobs, ohne sich auf die Benutzeroberfläche zu verlassen.", + "rows": [ + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env", + "content": "Backend, Backup-ID oder Ziel, Zeitplan (Neuer Auftrag) oder übergeordneter PVE-Auftrag (Attach-Modus), Aktivierungsstatus, Aufbewahrungswerte KEEP_* und Verweise auf Zugangsdaten." + }, + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths", + "content": "Ein absoluter Pfad pro Zeile - die eingefrorene Auswahl wurde zum Zeitpunkt der Joberstellung aus dem Profil aufgelöst. Das Bearbeiten der Datei führt den Job mit der neuen Auswahl beim nächsten Auslösen des Timers erneut aus." + }, + { + "path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service", + "content": "Nur neuer Modus. Der Dienst ruft run_scheduled_backup.sh JOB_ID auf. Der Timer plant es mit Persistent=true (verpasste Ausführungen werden beim nächsten Boot nachgeholt) und einem kleinen RandomizedDelaySec=120, um die Last zu verteilen, wenn mehrere Jobs den gleichen OnCalendar-Ausdruck teilen." + }, + { + "path": "/etc/vzdump.conf script-hook", + "content": "Nur Attach-Modus. Einmal durch hb_install_vzdump_hook installiert; vergleicht PVE_STORAGE jedes angehängten Auftrags mit $STOREID, das PVE dem Hook-Skript übergibt." + } + ] + }, + "runner": { + "heading": "Was beim Start eines Auftrags geschieht", + "intro": "Jeder Job - ob New-Model oder Attachment - führt die gleiche dreistufige Sequenz aus:", + "steps": [ + "Backup vorbereiten. Liest die Job-Konfiguration (Ziel, Profil, Pfade) und stellt den Archivbaum genau so zusammen, wie es der interaktive Fluss tut. Das Ergebnis ist das gleiche Archiv, das ein manuelles Backup mit diesen Einstellungen erzeugen würde.", + "An das Ziel schreiben. Überträgt oder schreibt das Archiv in das konfigurierte Ziel – eine lokale .tar.zst-Datei, ein PBS-Backup oder ein Borg-Archiv – mit genau den gleichen Tools und Anmeldeinformationen, die ein manuelles Backup für dasselbe Ziel verwenden würde.", + "Aufbewahrungsregeln anwenden. Entfernt alte Backups vom Zielort, wobei die Anzahl der keep-last / keep-daily / keep-weekly für den Auftrag konfiguriert bleibt. Das Beschneiden wird vom Zielort selbst durchgeführt: PBS wendet seine eigene Aufbewahrung an, Borg führt borg prune aus und bei Lokal löscht ProxMenux die Dateien, die außerhalb des keep-last-Fensters liegen." + ] + }, + "management": { + "heading": "Aufträge verwalten", + "intro": "Das Scheduler-Menü (Scripts TUI) und die Registerkarte Monitor Backups zeigen die gleichen Aktionen bei jedem Job.", + "rows": [ + { + "action": "Jetzt ausführen", + "detail": "Ruft das Ausführungsskript sofort auf und umgeht Timer bzw. vzdump-Hook. Damit lässt sich die Auftragskonfiguration prüfen, ohne auf die nächste geplante Ausführung zu warten." + }, + { + "action": "Aktivieren/Deaktivieren", + "detail": "Neuer Modus: systemctl enable/disable --now der Timer. Attach-Modus: Dreht das ENABLED-Flag im Job Env um — das Hook-Skript berücksichtigt es beim nächsten PVE-Aufruf." + }, + { + "action": "Bearbeiten", + "detail": "Öffnet Ziel, Zeitplan, Profil und Aufbewahrungsaufforderungen neu und schreibt die Jobdateien neu. Bewahrt die Job ID auf." + }, + { + "action": "Löschen", + "detail": "Entfernt die Job env, Pfaddatei, systemd Timer + Service (Neuer Modus) und deaktiviert die Hakenbindung (Attach-Modus). Berührt keine Archive bereits am Zielort." + }, + { + "action": "Protokoll anzeigen", + "detail": "Zeigt laufend an: /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log – eine Protokolldatei pro Lauf. Der Runner gibt außerdem eine kompakte Statuszeile an journald unter dem Dienst systemd aus." + } + ] + }, + "notifications": { + "heading": "Benachrichtigungen", + "body": "Jeder geplante Lauf feuert die gleichen hb_notify_lifecycle-Ereignisse ab wie der interaktive Fluss (start, complete, fail). Wenn Benachrichtigungskanäle im Monitor konfiguriert sind, tauchen unbeaufsichtigte Jobs auf die gleiche Weise wie manuelle Backups auf - ein Benutzer muss das Protokoll nicht überprüfen, um zu wissen, ob ein Job erfolgreich war." + }, + "whereNext": { + "heading": "Wohin Sie als nächstes gehen", + "items": [ + { + "label": "Backups erstellen", + "href": "/docs/backup-restore/creating-backups", + "tail": "- der interaktive Fluss, der das Backend mit dem Scheduler teilt." + }, + { + "label": "Ziele", + "href": "/docs/backup-restore/destinations", + "tail": "Per-Backend-Konfiguration, die sowohl vom interaktiven Flow als auch vom Scheduler verwendet wird." + }, + { + "label": "Wiederherstellung", + "href": "/docs/backup-restore/restoring", + "tail": " — der Ablauf zur Wiederherstellung der von den Aufträgen erzeugten Backups." + } + ] + } +} diff --git a/web/messages/en/docs/backup-restore/cross-kernel.json b/web/messages/en/docs/backup-restore/cross-kernel.json index e774df5e..7d003ddd 100644 --- a/web/messages/en/docs/backup-restore/cross-kernel.json +++ b/web/messages/en/docs/backup-restore/cross-kernel.json @@ -20,9 +20,21 @@ "heading": "The direction check", "intro": "During the compatibility check, hb_compat_check compares the kernel recorded in the backup's manifest against the target's current kernel (uname -r) and classifies the restore into one of three cases, stored in the internal variable HB_COMPAT_KERNEL_DIRECTION:", "rows": [ - { "direction": "same", "condition": "The major kernel version matches between backup and target.", "behavior": "The full restore flow runs unchanged. No extra filter, no hydration, no special notice in the UI." }, - { "direction": "bk_newer", "condition": "Backup kernel is NEWER than the target's (for example: the backup was made on kernel 7.0 and the target runs kernel 6.17).", "behavior": "The full restore flow runs unchanged, exactly like same. No filter is applied. Verified empirically: drivers auto-reinstall against the target's kernel, IOMMU config applies cleanly, VMs with GPU passthrough come up without issue." }, - { "direction": "bk_older", "condition": "Backup kernel is OLDER than the target's (for example: the backup was made on kernel 6.17 and the target runs kernel 7.0).", "behavior": "The safe-subset filter and the four-phase hydration below are activated. The restore proceeds — the target reproduces the source, but boot-critical files are not copied verbatim." } + { + "direction": "same", + "condition": "The major kernel version matches between backup and target.", + "behavior": "The full restore flow runs unchanged. No extra filter, no hydration, no special notice in the UI." + }, + { + "direction": "bk_newer", + "condition": "Backup kernel is NEWER than the target's (for example: the backup was made on kernel 7.0 and the target runs kernel 6.17).", + "behavior": "The full restore flow runs unchanged, exactly like same. No filter is applied. Verified empirically: drivers auto-reinstall against the target's kernel, IOMMU config applies cleanly, VMs with GPU passthrough come up without issue." + }, + { + "direction": "bk_older", + "condition": "Backup kernel is OLDER than the target's (for example: the backup was made on kernel 6.17 and the target runs kernel 7.0).", + "behavior": "The safe-subset filter and the four-phase hydration below are activated. The restore proceeds — the target reproduces the source, but boot-critical files are not copied verbatim." + } ] }, "whyBkNewerIsSafe": { @@ -31,25 +43,60 @@ }, "safeSubsetFilter": { "heading": "The safe-subset filter (only when the target kernel is newer)", - "intro": "When the target kernel is newer than the backup's, the compatibility check adds 16 boot-critical paths from hb_unsafe_paths_cross_version to RS_SKIP_PATHS. These paths are excluded from the restore because writing a version of them from an older kernel over a target running a newer one has caused kernel panics in bench tests. The paths cover four categories:", + "intro": "When the target kernel is newer than the backup's, the compatibility check adds 16 boot-critical paths from hb_unsafe_paths_cross_version to RS_SKIP_PATHS. These paths are excluded from the restore because writing a version of them from an older kernel over a target running a newer one has caused kernel panics in bench tests. The paths cover five categories:", "categoryRows": [ - { "category": "Bootloader", "paths": "/etc/default/grub, /etc/kernel", "reason": "GRUB defaults tied to the prior kernel order, and proxmox-boot-tool state (cmdline, ESP UUIDs, hooks) that references paths and identifiers from the older install." }, - { "category": "Kernel modules and boot artifacts", "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", "reason": "Autoload lists that may reference modules renamed between kernel majors, module options that may not apply, initramfs hooks written for the older kernel." }, - { "category": "Storage stack and filesystem identity", "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", "reason": "UUIDs that may not exist on this install, multipath drivers that change between kernels, iSCSI parameters that evolve, udev rules that may bind to nonexistent subsystems, ZFS state (zpool.cache + hostid) that can lock the pool as foreign." }, - { "category": "APT sources", "paths": "/etc/apt", "reason": "APT source suites may trigger a downgrade of critical packages on the next upgrade." }, - { "category": "systemd", "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", "reason": "Unit overrides and .wants tied to the older systemd major; configuration keys that may not parse on a newer systemd." } + { + "category": "Bootloader", + "paths": "/etc/default/grub, /etc/kernel", + "reason": "GRUB defaults tied to the prior kernel order, and proxmox-boot-tool state (cmdline, ESP UUIDs, hooks) that references paths and identifiers from the older install." + }, + { + "category": "Kernel modules and boot artifacts", + "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", + "reason": "Autoload lists that may reference modules renamed between kernel majors, module options that may not apply, initramfs hooks written for the older kernel." + }, + { + "category": "Storage stack and filesystem identity", + "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", + "reason": "UUIDs that may not exist on this install, multipath drivers that change between kernels, iSCSI parameters that evolve, udev rules that may bind to nonexistent subsystems, ZFS state (zpool.cache + hostid) that can lock the pool as foreign." + }, + { + "category": "APT sources", + "paths": "/etc/apt", + "reason": "APT source suites may trigger a downgrade of critical packages on the next upgrade." + }, + { + "category": "systemd", + "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", + "reason": "Unit overrides and .wants tied to the older systemd major; configuration keys that may not parse on a newer systemd." + } ], - "outroBody": "The filter runs BEFORE the confirmation dialog so the user sees the exact list of paths that will be skipped, categorised by reason. The restore still proceeds — everything else (VMs, LXCs, network, /etc/pve, users, cron, ProxMenux state, packages, drivers, /root) is restored normally." + "outroBody": "The filter runs BEFORE the confirmation dialog so the user sees the exact list of paths that will be skipped, categorised by reason. The restore still proceeds — everything else (VM/LXC configuration, network, /etc/pve, users, cron, ProxMenux state, packages, drivers, /root) is restored normally." }, "hydration": { "heading": "Kernel-agnostic hydration", - "intro": "The safe-subset filter alone would leave the target without the tuning the user had inside those boot-critical files: IOMMU cmdline for GPU passthrough, VFIO device IDs, custom GRUB_TIMEOUT, nvidia blacklists. The hydration pass re-applies those bits kernel-agnostically. Four phases run when the target kernel is newer than the backup's, each additive (never overwrites a value the target already carries) and idempotent (running twice is a no-op).", + "intro": "The filter omits boot-critical files, so hydration reapplies selected user tuning: IOMMU cmdline, VFIO IDs, custom GRUB_TIMEOUT and nvidia blacklists. It runs when the target kernel is newer. Cmdline merges preserve existing target keys and module merges append missing entries. Whitelisted GRUB values and user files may replace differing target content. Repeating the same input is idempotent.", "phaseRows": [ - { "phase": "1a — GRUB path", "detail": "For hosts using GRUB (ext4/lvm installs). _rs_hyd_grub merges every token from the backup's manifest.kernel_params.cmdline_extra into the target's live GRUB_CMDLINE_LINUX_DEFAULT, skipping tokens whose key the target already carries. Then merges whitelisted GRUB_* keys (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) from the backup's /etc/default/grub if they differ from the target's." }, - { "phase": "1b — systemd-boot / ZFS path", "detail": "For hosts using systemd-boot (typically ZFS-on-root). _rs_hyd_kernel_cmdline merges user tokens from cmdline_extra into the target's /etc/kernel/cmdline, keeping the target's own root=, boot= and rootflags= boilerplate intact." }, - { "phase": "2 — /etc/modules merge", "detail": "_rs_hyd_modules appends modules from manifest.kernel_params.modules_loaded_at_boot that are in the whitelist (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) AND not already present in the target's /etc/modules." }, - { "phase": "3 — Whitelisted files copy", "detail": "_rs_hyd_files copies user-authored files from the staging rootfs to the live target when the content differs. Whitelist covers VFIO/nvidia/blacklist files under /etc/modprobe.d, /etc/modules-load.d, and the ProxMenux VFIO bind rule + nvidia udev rules under /etc/udev/rules.d. Distro-owned files (pve-blacklist.conf, mdadm.conf, nvme.conf) are intentionally excluded — their contents evolve between releases." }, - { "phase": "4 — Force post-boot reflows", "detail": "The four phases write directly to the live target OUTSIDE the normal restore pipeline. To make the merged tokens/modules/files take effect on the next boot, HB_HYDRATION_APPLIED=1 propagates through plan.env to apply_pending_restore.sh, which forces NEEDS_INITRAMFS=1 and NEEDS_GRUB=1 regardless of what was in the apply list. The post-boot dispatcher then regenerates initramfs and refreshes the bootloader." } + { + "phase": "1a — GRUB path", + "detail": "For hosts using GRUB (ext4/lvm installs). _rs_hyd_grub merges every token from the backup's manifest.kernel_params.cmdline_extra into the target's live GRUB_CMDLINE_LINUX_DEFAULT, skipping tokens whose key the target already carries. Then merges whitelisted GRUB_* keys (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) from the backup's /etc/default/grub if they differ from the target's." + }, + { + "phase": "1b — systemd-boot / ZFS path", + "detail": "For hosts using systemd-boot (typically ZFS-on-root). _rs_hyd_kernel_cmdline merges user tokens from cmdline_extra into the target's /etc/kernel/cmdline, keeping the target's own root=, boot= and rootflags= boilerplate intact." + }, + { + "phase": "2 — /etc/modules merge", + "detail": "_rs_hyd_modules appends modules from manifest.kernel_params.modules_loaded_at_boot that are in the whitelist (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) AND not already present in the target's /etc/modules." + }, + { + "phase": "3 — Whitelisted files copy", + "detail": "_rs_hyd_files copies user-authored files from the staging rootfs to the live target when the content differs. Whitelist covers VFIO/nvidia/blacklist files under /etc/modprobe.d, /etc/modules-load.d, and the ProxMenux VFIO bind rule + nvidia udev rules under /etc/udev/rules.d. Distro-owned files (pve-blacklist.conf, mdadm.conf, nvme.conf) are intentionally excluded — their contents evolve between releases." + }, + { + "phase": "4 — Force post-boot reflows", + "detail": "The four phases write directly to the live target OUTSIDE the normal restore pipeline. To make the merged tokens/modules/files take effect on the next boot, HB_HYDRATION_APPLIED=1 propagates through plan.env to apply_pending_restore.sh, which forces NEEDS_INITRAMFS=1 and NEEDS_GRUB=1 regardless of what was in the apply list. The post-boot dispatcher then regenerates initramfs and refreshes the bootloader." + } ] }, "planCommit": { @@ -65,8 +112,14 @@ "heading": "Concrete examples", "intro": "The hydration pass is not abstract — it produces observable, correct outcomes for common scenarios. Two examples that hydration handles automatically:", "rows": [ - { "scenario": "GPU passthrough (VFIO)", "detail": "Source had intel_iommu=on iommu=pt in the cmdline, vfio/vfio_pci/vfio_iommu_type1 in /etc/modules, an /etc/modprobe.d/vfio.conf with options vfio-pci ids=10de:2216, and a /etc/modprobe.d/blacklist-nvidia.conf. Hydration merges the cmdline tokens into the target's GRUB or kernel cmdline, appends the vfio modules to /etc/modules, and copies the two user-authored modprobe files. On the next boot, IOMMU is active, VFIO modules load, the GPU is bound to vfio-pci and the VM comes up with passthrough working." }, - { "scenario": "Custom GRUB defaults", "detail": "Source had GRUB_TIMEOUT=1 and GRUB_DISABLE_OS_PROBER=true. Hydration reads both keys from the backup's /etc/default/grub, sees they differ from the fresh install's defaults, and rewrites those two lines in the target's file (leaving everything else, including GRUB_DISTRIBUTOR, untouched)." } + { + "scenario": "GPU passthrough (VFIO)", + "detail": "Source had intel_iommu=on iommu=pt in the cmdline, vfio/vfio_pci/vfio_iommu_type1 in /etc/modules, an /etc/modprobe.d/vfio.conf with options vfio-pci ids=10de:2216, and a /etc/modprobe.d/blacklist-nvidia.conf. Hydration merges the cmdline tokens into the target's GRUB or kernel cmdline, appends the vfio modules to /etc/modules, and copies the two user-authored modprobe files. On the next boot, IOMMU is active, VFIO modules load, the GPU is bound to vfio-pci and the VM comes up with passthrough working." + }, + { + "scenario": "Custom GRUB defaults", + "detail": "Source had GRUB_TIMEOUT=1 and GRUB_DISABLE_OS_PROBER=true. Hydration reads both keys from the backup's /etc/default/grub, sees they differ from the fresh install's defaults, and rewrites those two lines in the target's file (leaving everything else, including GRUB_DISTRIBUTOR, untouched)." + } ] }, "callout": { @@ -77,18 +130,41 @@ "heading": "Where the mechanisms live", "intro": "For developers looking to trace or extend the cross-kernel behaviour:", "rows": [ - { "component": "Direction detection", "location": "hb_compat_check in lib_host_backup_common.sh. Sets HB_COMPAT_KERNEL_DIRECTION." }, - { "component": "Safe-subset path list", "location": "hb_unsafe_paths_cross_version in lib_host_backup_common.sh. Emits path\\treason lines used by both the CLI filter and the Web endpoint /api/host-backups/restore/prepare." }, - { "component": "Hydration phases", "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files in backup_host.sh. Orchestrated by _rs_apply_bk_older_hydration." }, - { "component": "Post-boot reflow forcing", "location": "apply_pending_restore.sh reads HB_HYDRATION_APPLIED from plan.env and forces NEEDS_INITRAMFS=1/NEEDS_GRUB=1." }, - { "component": "Web preview", "location": "/api/host-backups/restore/prepare in flask_server.py. Sources the helper library, runs _rs_apply_bk_older_hydration in plan mode, returns the actions to the Web modal." } + { + "component": "Direction detection", + "location": "hb_compat_check in lib_host_backup_common.sh. Sets HB_COMPAT_KERNEL_DIRECTION." + }, + { + "component": "Safe-subset path list", + "location": "hb_unsafe_paths_cross_version in lib_host_backup_common.sh. Emits path\\treason lines used by both the CLI filter and the Web endpoint /api/host-backups/restore/prepare." + }, + { + "component": "Hydration phases", + "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files in backup_host.sh. Orchestrated by _rs_apply_bk_older_hydration." + }, + { + "component": "Post-boot reflow forcing", + "location": "apply_pending_restore.sh reads HB_HYDRATION_APPLIED from plan.env and forces NEEDS_INITRAMFS=1/NEEDS_GRUB=1." + }, + { + "component": "Web preview", + "location": "/api/host-backups/restore/prepare in flask_server.py. Sources the helper library, runs _rs_apply_bk_older_hydration in plan mode, returns the actions to the Web modal." + } ] }, "whereNext": { "heading": "Where to go next", "items": [ - { "label": "Restoring", "href": "/docs/backup-restore/restoring", "tail": " — the full restore pipeline this page's mechanisms plug into." }, - { "label": "How it works", "href": "/docs/backup-restore/how-it-works", "tail": " — the manifest and collectors that produce the kernel_params block hydration reads from." } + { + "label": "Restoring", + "href": "/docs/backup-restore/restoring", + "tail": " — the full restore pipeline this page's mechanisms plug into." + }, + { + "label": "How it works", + "href": "/docs/backup-restore/how-it-works", + "tail": " — the manifest and collectors that produce the kernel_params block hydration reads from." + } ] } } diff --git a/web/messages/en/docs/backup-restore/destinations/borg.json b/web/messages/en/docs/backup-restore/destinations/borg.json index 78d5a3ec..bb2a1e0e 100644 --- a/web/messages/en/docs/backup-restore/destinations/borg.json +++ b/web/messages/en/docs/backup-restore/destinations/borg.json @@ -24,19 +24,47 @@ "heading": "The borg binary", "intro": "Borg is not a base dependency of the ProxMenux installer. When a backup runs, hb_ensure_borg resolves the binary from four sources in order and returns the first that works:", "rows": [ - { "priority": "1", "source": "System borg", "detail": "If the host already has borg installed via APT (which borg resolves), that binary is used." }, - { "priority": "2", "source": "State-dir cache", "detail": "/usr/local/share/proxmenux/borg — kept from a prior GitHub download on this host." }, - { "priority": "3", "source": "Monitor AppImage bundle", "detail": "/usr/local/share/proxmenux/monitor-app/usr/bin/borg — the AppImage bundles a signed borg-linux64. This is the offline-safe path: a host with no internet still has a working borg." }, - { "priority": "4", "source": "GitHub download", "detail": "wget against the pinned borg-linux64 URL under github.com/borgbackup/borg/releases/, verified against a constant SHA-256 in lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). On checksum mismatch the binary is discarded and the backup aborts. The downloaded file is cached in the state dir so subsequent backups use path 2." } + { + "priority": "1", + "source": "System borg", + "detail": "If the host already has borg installed via APT (which borg resolves), that binary is used." + }, + { + "priority": "2", + "source": "State-dir cache", + "detail": "/usr/local/share/proxmenux/borg — kept from a prior GitHub download on this host." + }, + { + "priority": "3", + "source": "Monitor AppImage bundle", + "detail": "/usr/local/share/proxmenux/monitor-app/usr/bin/borg — the AppImage bundles a signed borg-linux64. This is the offline-safe path: a host with no internet still has a working borg." + }, + { + "priority": "4", + "source": "GitHub download", + "detail": "wget against the pinned borg-linux64 URL under github.com/borgbackup/borg/releases/, verified against a constant SHA-256 in lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). On checksum mismatch the binary is discarded and the backup aborts. The downloaded file is cached in the state dir so subsequent backups use path 2." + } ] }, "repoTypes": { "heading": "Repository types", "intro": "The repository type is chosen when a target is added. Each type resolves to a different repository URL that Borg understands.", "rows": [ - { "type": "remote", "url": "ssh://USER@HOST/RPATH", "detail": "Repository lives on a remote server that runs borg serve. Requires an SSH connection to that server." }, - { "type": "usb", "url": "/mnt/MOUNTPOINT/borgbackup", "detail": "Repository lives on a mounted external disk (typically USB). The mount is resolved via hb_prompt_mounted_path, which detects, mounts or formats USB partitions as needed." }, - { "type": "local", "url": "/backup/borgbackup (any absolute path)", "detail": "Repository lives on a local directory. Meaningful only when the target directory is on a separate physical disk — a repository on the same disk as the source protects against operator error but not against disk failure." } + { + "type": "remote", + "url": "ssh://USER@HOST/RPATH", + "detail": "Repository lives on a remote server that runs borg serve. Requires an SSH connection to that server." + }, + { + "type": "usb", + "url": "/mnt/MOUNTPOINT/borgbackup", + "detail": "Repository lives on a mounted external disk (typically USB). The mount is resolved via hb_prompt_mounted_path, which detects, mounts or formats USB partitions as needed." + }, + { + "type": "local", + "url": "/backup/borgbackup (any absolute path)", + "detail": "Repository lives on a local directory. Meaningful only when the target directory is on a separate physical disk — a repository on the same disk as the source protects against operator error but not against disk failure." + } ] }, "serverSetup": { @@ -50,30 +78,62 @@ "Another Proxmox host on the same LAN, or a VM anywhere reachable over SSH." ], "lxcWarningTitle": "LXC as Borg server", - "lxcWarningBody": "If the Borg server runs inside an LXC, the container must have a user account with a password.", + "lxcWarningBody": "If the Borg server runs inside an LXC, generate-auto requires an account that accepts SSH password authentication during key installation. If password login is unavailable, use manual key installation or the generate-pct alternative through the PVE host.", "requirementsTitle": "Requirements on the server", "requirementsRows": [ - { "requirement": "borg binary at /usr/bin/borg", "detail": "The command=\"/usr/bin/borg serve ...\" line ProxMenux writes into authorized_keys hard-codes that path. Installing via APT (apt install borgbackup) puts it there. A standalone binary must be symlinked to /usr/bin/borg." }, - { "requirement": "A dedicated user account (typically borg)", "detail": "Owns the repository directory and receives incoming SSH connections. Does not need sudo or shell access — the authorized_keys line disables interactive shells anyway." }, - { "requirement": "A writable repository directory", "detail": "The path the operator gives ProxMenux (for example /backup/borgbackup) must exist on the server and be owned by the borg user." }, - { "requirement": "SSH daemon accepting the borg user", "detail": "PubkeyAuthentication yes (default). Password authentication is only needed for the one-shot generate-auto flow — after the key is installed, the server can disable password auth entirely." } + { + "requirement": "borg binary at /usr/bin/borg", + "detail": "The command=\"/usr/bin/borg serve ...\" line ProxMenux writes into authorized_keys hard-codes that path. Installing via APT (apt install borgbackup) puts it there. A standalone binary must be symlinked to /usr/bin/borg." + }, + { + "requirement": "A dedicated user account (typically borg)", + "detail": "Owns the repository directory and receives incoming SSH connections. Does not need sudo or shell access — the authorized_keys line disables interactive shells anyway." + }, + { + "requirement": "A writable repository directory", + "detail": "The path the operator gives ProxMenux (for example /backup/borgbackup) must exist on the server and be owned by the borg user." + }, + { + "requirement": "SSH daemon accepting the borg user", + "detail": "PubkeyAuthentication yes (default). Password authentication is only needed for the one-shot generate-auto flow — after the key is installed, the server can disable password auth entirely." + } ], "minimalSetupTitle": "Minimal server setup", "minimalSetupBody": "On a Debian or Ubuntu Borg server, a working baseline is four commands as root:", "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", - "minimalSetupNote": "After this, ProxMenux's generate-auto mode can connect using the borg user's password once, install its own SSH key, and every subsequent backup uses that key. No further server-side configuration is needed — the key restricts itself to borg serve on that path." + "minimalSetupNote": "With the server prepared and SSH password authentication available, ProxMenux’s generate-auto mode can install its SSH key using an account permitted to write the borg user’s authorized_keys file. Subsequent backups use that key, restricted to borg serve on the configured path. Without password login, install the key manually or use the PVE-host alternative." }, "sshAuth": { "heading": "SSH authentication (client side)", "intro": "Remote Borg repositories are accessed over SSH. The connection runs from the ProxMenux host to a user account on the Borg server that runs borg serve. This user is typically named borg, NOT the admin/root user of the server — the borg-serve command line locks the connection to that specific repository path (see the key strategies below).", - "strategiesTitle": "The four key strategies", - "strategiesIntro": "When a remote target is added, ProxMenux prompts for the SSH user, host and remote path, then asks how to authenticate. Four modes:", + "strategiesTitle": "SSH key strategies", + "strategiesIntro": "When a remote target is added, ProxMenux asks for the SSH user, host and remote path, then offers four authentication choices. The additional generate-pct path is offered when password authentication is refused. The modes are described below:", "strategyRows": [ - { "mode": "generate-auto", "label": "Recommended", "detail": "ProxMenux generates a new ed25519 keypair at ~/.ssh/borg_proxmenux_HOST_ed25519, then uses sshpass to log in ONCE to the server with the admin password and append the public key to ~borg/.ssh/authorized_keys. The admin password is only used for this one call — it is never stored." }, - { "mode": "generate-manual", "label": "No admin password on this host", "detail": "ProxMenux generates the keypair as above but displays the full authorized_keys line for the operator to paste manually into the server. The admin password never leaves the ProxMenux host because it is never asked for." }, - { "mode": "generate-pct", "label": "Borg server is a PVE LXC", "detail": "The Borg server runs inside an LXC on a PVE node. ProxMenux authorises the key via pct exec from the PVE host — root on the PVE host writes into the LXC's ~borg/.ssh/authorized_keys without needing SSH into the LXC itself." }, - { "mode": "existing", "label": "Use an existing key", "detail": "ProxMenux scans /root/.ssh/ and $HOME/.ssh/ for parseable ed25519/RSA private keys and lists them. The operator picks one or browses manually to a non-standard path." }, - { "mode": "none", "label": "Default SSH config", "detail": "No custom key — Borg relies on the host's default SSH configuration (typically ~/.ssh/id_rsa or an SSH agent)." } + { + "mode": "generate-auto", + "label": "Recommended", + "detail": "ProxMenux generates or reuses an ed25519 keypair at ~/.ssh/borg_proxmenux_HOST_ed25519, then uses sshpass for a login probe and installation of the public key in ~borg/.ssh/authorized_keys. The password belongs to an account allowed to write that file, usually root or the borg user. It is used during setup and is not saved." + }, + { + "mode": "generate-manual", + "label": "No admin password on this host", + "detail": "ProxMenux generates the keypair as above but displays the full authorized_keys line for the operator to paste manually into the server. The admin password never leaves the ProxMenux host because it is never asked for." + }, + { + "mode": "generate-pct", + "label": "Borg server is a PVE LXC", + "detail": "The Borg server runs inside an LXC on a PVE node. ProxMenux authorises the key via pct exec from the PVE host — root on the PVE host writes into the LXC's ~borg/.ssh/authorized_keys without needing SSH into the LXC itself." + }, + { + "mode": "existing", + "label": "Use an existing key", + "detail": "ProxMenux scans /root/.ssh/ and $HOME/.ssh/ for parseable ed25519/RSA private keys and lists them. The operator picks one or browses manually to a non-standard path." + }, + { + "mode": "none", + "label": "Default SSH config", + "detail": "No custom key — Borg relies on the host's default SSH configuration (typically ~/.ssh/id_rsa or an SSH agent)." + } ], "restrictTitle": "The authorized_keys line", "restrictBody": "For every generated key, the authorized_keys line ProxMenux writes on the server locks the key to a single borg-serve invocation against the configured repository path:", @@ -84,24 +144,50 @@ "heading": "Saved targets", "intro": "A saved target persists the repository configuration under a friendly name so the details do not have to be re-entered. Storage layout in the ProxMenux state directory:", "rows": [ - { "file": "borg-targets.txt", "content": "One line per target: NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE. Read by hb_collect_borg_configs to populate the target-selection menu." }, - { "file": "borg-pass-NAME.txt", "content": "Passphrase for the target NAMEd above (chmod 600). Only present when the operator chose repokey encryption." } + { + "file": "borg-targets.txt", + "content": "One line per target: NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE. Read by hb_collect_borg_configs to populate the target-selection menu." + }, + { + "file": "borg-pass-NAME.txt", + "content": "Passphrase for the target NAMEd above (chmod 600). Only present when the operator chose repokey encryption." + } ], - "outro": "Saving is optional — the operator can decline the save prompt for a one-shot backup that leaves no credentials on the host." + "outro": "Saving the target is optional. Declining the save prompt omits the named target configuration, but does not remove a generated SSH key. If repokey encryption is enabled without a saved target, ProxMenux still saves the passphrase in the legacy borg-pass.txt file." }, "encryption": { "heading": "Encryption", - "body": "Repositories are initialised with an encryption mode via hb_borg_init_if_needed: the modern borg repo-create -e MODE when available, or the legacy borg init --encryption=MODE. ProxMenux exposes two modes: repokey (default) and none. In repokey mode Borg stores the encryption key inside the repository itself; access requires a passphrase, which ProxMenux prompts for twice with match validation and stores at borg-pass-NAME.txt. A mandatory acknowledgement dialog is shown after the passphrase is saved: the passphrase is the only way to access the encrypted archives, and losing it makes every archive in the repository unrecoverable." + "body": "Repositories are initialised with an encryption mode via hb_borg_init_if_needed: the modern borg repo-create -e MODE when available, or the legacy borg init --encryption=MODE. ProxMenux exposes two modes: repokey (default) and none. In repokey mode Borg stores the encryption key inside the repository itself; access requires a passphrase, which ProxMenux prompts for twice with match validation and stores at borg-pass-NAME.txt for saved targets (or in the legacy file described above). A mandatory acknowledgement dialog is shown after the passphrase is saved: the passphrase is the only way to access the encrypted archives, and losing it makes every archive in the repository unrecoverable." }, "runtimeEnv": { "heading": "Runtime environment", "intro": "ProxMenux exports the following environment variables before invoking borg. They configure the connection and unlock the repository without embedding secrets in the command line.", "rows": [ - { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o StrictHostKeyChecking=accept-new", "purpose": "The remote-shell command Borg uses for SSH-served repositories. Set only when a custom key was selected; otherwise unset so Borg uses the default SSH configuration." }, - { "var": "BORG_PASSPHRASE", "value": "(passphrase from borg-pass-NAME.txt)", "purpose": "Unlocks the repokey. Set only when the target uses repokey encryption. Never appears in the process argument list." }, - { "var": "BORG_ENCRYPT_MODE", "value": "repokey | none", "purpose": "Used by hb_borg_init_if_needed when initialising a repository that does not yet exist. Ignored by borg create on existing repositories." }, - { "var": "BORG_RELOCATED_REPO_ACCESS_IS_OK", "value": "yes", "purpose": "Suppresses the interactive prompt Borg raises when the repository URL differs from the URL it was originally reached from (common after a mount-point rename or SSH-host reachable via new address)." }, - { "var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", "value": "yes", "purpose": "Suppresses the interactive prompt Borg raises the first time an unencrypted repository is accessed from a new client." } + { + "var": "BORG_RSH", + "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", + "purpose": "The remote-shell command Borg uses for SSH repositories. A selected key adds the identity options; a non-default port adds -p PORT. With no custom key and the default port, the variable is unset so Borg uses the host’s default SSH configuration." + }, + { + "var": "BORG_PASSPHRASE", + "value": "(passphrase from borg-pass-NAME.txt)", + "purpose": "Unlocks the repokey. Set only when the target uses repokey encryption. Never appears in the process argument list." + }, + { + "var": "BORG_ENCRYPT_MODE", + "value": "repokey | none", + "purpose": "Used by hb_borg_init_if_needed when initialising a repository that does not yet exist. Ignored by borg create on existing repositories." + }, + { + "var": "BORG_RELOCATED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Suppresses the interactive prompt Borg raises when the repository URL differs from the URL it was originally reached from (common after a mount-point rename or SSH-host reachable via new address)." + }, + { + "var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Suppresses the interactive prompt Borg raises the first time an unencrypted repository is accessed from a new client." + } ] }, "archiveFormat": { diff --git a/web/messages/en/docs/backup-restore/destinations/index.json b/web/messages/en/docs/backup-restore/destinations/index.json index a1d262a2..5f0f8ff2 100644 --- a/web/messages/en/docs/backup-restore/destinations/index.json +++ b/web/messages/en/docs/backup-restore/destinations/index.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Same payload, three backends", - "body": "Every backup produces the same three payloads (rootfs, manifest, applications). What changes between destinations is how those payloads are stored and how the operator retrieves them for a restore. Each backend is implemented as a separate function in backup_host.sh — _bk_local, _bk_pbs, _bk_borg — but all four share the same staging step (hb_prepare_staging) and the same restore code path. The choice of destination only affects the write and the retrieval; it does not change what a restore does or how it consumes the archive." + "body": "Every backup produces the same three payloads (rootfs, manifest, applications). What changes between destinations is how those payloads are stored and how the operator retrieves them for a restore. Each backend is implemented as a separate function in backup_host.sh — _bk_local, _bk_pbs, _bk_borg — but all three share the same staging step (hb_prepare_staging) and the same restore code path. The choice of destination only affects the write and the retrieval; it does not change what a restore does or how it consumes the archive." }, "comparison": { "heading": "Feature comparison", @@ -29,8 +29,8 @@ { "feature": "Compression", "local": "zstd (default level) via tar --zstd. gzip fallback.", - "pbs": "PBS-managed. The client streams uncompressed; the server chunks + compresses.", - "borg": "Borg's built-in (lz4 default). Configurable at repo init." + "pbs": "Managed by proxmox-backup-client. ProxMenux does not override compression settings.", + "borg": "Borg’s built-in compression. ProxMenux invokes borg create without overriding compression settings." }, { "feature": "Deduplication", diff --git a/web/messages/en/docs/backup-restore/destinations/pbs.json b/web/messages/en/docs/backup-restore/destinations/pbs.json index 270f1b02..e5aac4e6 100644 --- a/web/messages/en/docs/backup-restore/destinations/pbs.json +++ b/web/messages/en/docs/backup-restore/destinations/pbs.json @@ -41,7 +41,7 @@ }, "backupCommand": { "heading": "The backup command", - "intro": "The upload is a single invocation of proxmox-backup-client backup. ProxMenux runs it inside an env wrapper so credentials never appear in the process argument list.", + "intro": "The upload is a single invocation of proxmox-backup-client backup. ProxMenux uses env to pass the password, encryption password and fingerprint to the client as environment variables.", "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": "Backup ID naming", "backupIdBody": "The default backup ID is hostcfg-HOSTNAME. The operator is asked to confirm or edit it before the upload; any characters outside [A-Za-z0-9_-] are stripped and trailing dashes are trimmed. Reusing the same ID across runs is intentional — PBS treats the ID as a group, and every subsequent backup appears as a new backup inside that group, sharing dedup with prior runs.", @@ -61,13 +61,13 @@ "modesSharedTitle": "Shared keyfile (import on every host)", "modesSharedBody": "One master keyfile generated once and installed on every host via the Use an existing keyfile option. Management is simpler: a single secret to safeguard, and any host can decrypt the archives of any other (useful for consolidation, cross-host restore drills or centralised backup verification). The trade-off is that a leak of the shared keyfile exposes every host at once. Recommended for homelabs and for fleets where all hosts have the same owner and trust boundary.", "recoveryTitle": "Upload key to PBS — the operator decides", - "recoveryBody": "Right after the keyfile is chosen, ProxMenux asks a single explicit question — Upload key to PBS? — with two answers. Nothing gets uploaded to PBS until the operator answers Yes. The default is No, keep local only: the keyfile stays only at the canonical local path, ProxMenux never touches PBS with any recovery artefact, and the operator handles the offsite copy themselves (the Monitor's Download keyfile button in the PBS destination row provides one on demand). Choosing Yes, upload prompts for a recovery passphrase — twice, with match validation — and ProxMenux wraps the keyfile with that passphrase using AES-256-CBC and PBKDF2 (600 000 iterations, random salt) to produce pbs-key.recovery.enc. Every subsequent encrypted backup uploads that envelope to PBS as a paired backup group. Neither the passphrase nor a plaintext copy of the keyfile ever leaves the host. The choice can be changed later from the Monitor at any time — the escrow toggle inline in the PBS destination row flips Yes/No and applies immediately (Start uploading, Stop uploading, or Update passphrase, matching the current state).", + "recoveryBody": "Right after the keyfile is chosen, ProxMenux asks a single explicit question — Upload key to PBS? — with two answers. No recovery artifact is uploaded to PBS until the operator answers Yes. The default is No, keep local only: the keyfile stays at the canonical local path, ProxMenux uploads no recovery artifact to PBS, and the operator handles the offsite copy themselves (the Monitor’s Download keyfile button in the PBS destination row provides one on demand). Choosing Yes, upload prompts for a recovery passphrase — twice, with match validation — and ProxMenux wraps the keyfile with that passphrase using AES-256-CBC and PBKDF2 (600 000 iterations, random salt) to produce pbs-key.recovery.enc. Every subsequent encrypted backup uploads that envelope to PBS as a paired backup group. Neither the passphrase nor a plaintext copy of the keyfile is sent to PBS during these uploads. The choice can be changed later from the Monitor at any time — the escrow toggle inline in the PBS destination row flips Yes/No and applies immediately (Start uploading, Stop uploading, or Update passphrase, matching the current state).", "blobUploadTitle": "Paired backup group on PBS", "blobUploadBody1": "When the escrow mode is Yes, upload, ProxMenux uploads the recovery envelope to PBS after every encrypted backup as a second, paired backup group with the same name as the host group but ending in -keyrecovery. The two groups sit next to each other in the datastore listing — one for host backups, one for recovery envelopes. The envelope never leaves the host in plaintext: encryption happens on the host itself with AES-256-CBC and PBKDF2 before any bytes go on the wire (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS receives only the already-encrypted envelope.", "envelopeSecurityTitle": "Is uploading the keyrecovery file to PBS a security risk?", "envelopeSecurityBody": "The keyrecovery file is encrypted in transit and at rest. The recovery passphrase never leaves the host: encryption happens locally before the upload, and PBS only ever sees the already-encrypted result. A PBS administrator — or anyone with access to the datastore — can download the keyrecovery file, but without the recovery passphrase they cannot read the keyfile inside: it is opaque ciphertext. Reconstructing the keyfile requires both pieces at once, the keyrecovery file and the passphrase, and only the operator holds both.", "blobUploadConstraintTitle": "Why two groups instead of a single encrypted one", - "blobUploadConstraintBody": "A single proxmox-backup-client backup invocation encrypts every one of its archives with the same keyfile, or none at all — there is no in-between. The host backup has to be encrypted with the host keyfile, but the recovery envelope cannot ride along in that same upload, because it would end up encrypted with the very keyfile it contains: on a freshly reinstalled host there would be no way to open it (you would need the keyfile to decrypt the keyfile). That is why the two artefacts are uploaded independently and appear as two separate groups: the host backup is encrypted by PBS with the keyfile, and the recovery envelope is encrypted by ProxMenux with the passphrase before upload. Two different encryption layers protecting two different assets.", + "blobUploadConstraintBody": "A single proxmox-backup-client backup invocation encrypts every one of its archives with the same keyfile, or none at all — there is no in-between. The host backup has to be encrypted with the host keyfile, but the recovery envelope cannot ride along in that same upload, because it would end up encrypted with the very keyfile it contains: on a freshly reinstalled host there would be no way to open it (you would need the keyfile to decrypt the keyfile). That is why the two artefacts are uploaded independently and appear as two separate groups: the host backup is encrypted by the PBS client with the keyfile, and the recovery envelope is encrypted by ProxMenux with the passphrase before upload. Two different encryption layers protecting two different assets.", "blobUploadImageAlt": "PBS UI showing the hostcfg-HOSTNAME and hostcfg-HOSTNAME-keyrecovery backup groups adjacent in the datastore listing.", "blobUploadImageCaption": "PBS UI — the paired backup groups. The main group holds the host backups; the -keyrecovery group holds the passphrase-wrapped keyfile.", "recoverTitle": "Recovery on a fresh host", diff --git a/web/messages/en/docs/backup-restore/glossary.json b/web/messages/en/docs/backup-restore/glossary.json index e750271d..aca09d0a 100644 --- a/web/messages/en/docs/backup-restore/glossary.json +++ b/web/messages/en/docs/backup-restore/glossary.json @@ -28,7 +28,7 @@ { "id": "clave-cifrado", "term": "Keyfile (encryption key)", - "def": "Binary file that Proxmox Backup Server uses to encrypt the chunks of each backup before uploading them. Without this file, no encrypted backup can be read. ProxMenux stores it at /usr/local/share/proxmenux/pbs-key.conf with mode 600. This is the asset that has to be protected; the recovery envelope exists precisely so that this file can be rescued if it is lost." + "def": "Key file used by proxmox-backup-client to encrypt the chunks before uploading them to PBS. Without the matching key, encrypted backup data cannot be read. ProxMenux stores the file at /usr/local/share/proxmenux/pbs-key.conf with mode 600. Protect it: the recovery envelope is designed to recover this file if it is lost." }, { "id": "contrasena-keyfile", @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Attach mode", - "def": "Scheduled job with no schedule of its own; it fires automatically whenever an existing PVE vzdump task runs. It inherits the schedule and retention from that parent task. Supported for Local and PBS destinations only." + "def": "Job without its own timer. A PVE vzdump job-end hook triggers it after guest backups when the destination storage matches. The selected parent supplies storage and initial retention, but the hook matches storage rather than parent job ID; another task using that storage may also trigger it. Supported for Local and PBS only." }, { "id": "timer-systemd", diff --git a/web/messages/en/docs/backup-restore/how-it-works.json b/web/messages/en/docs/backup-restore/how-it-works.json index dc68cee6..5651f7ef 100644 --- a/web/messages/en/docs/backup-restore/how-it-works.json +++ b/web/messages/en/docs/backup-restore/how-it-works.json @@ -14,7 +14,7 @@ }, "intro": { "title": "One archive, three payloads", - "body": "Every backup produces a directory layout with three well-defined payloads under a single staging root. The archive uploaded to the destination (local .tar.zst, PBS backup or Borg archive) contains this exact layout. The restore reads the three payloads independently, in a specific order that guarantees correctness: rootfs is copied first to lay down configuration, the manifest is consulted to detect drift and decide what to skip, and the application inventory drives the post-boot reinstall pass. No cross-payload dependencies — each one can be inspected or extracted independently." + "body": "Every backup produces a directory layout with three well-defined payloads under a single staging root. The archive uploaded to the destination (local .tar.zst, PBS backup or Borg archive) contains this exact layout. The restore uses all three: the manifest is consulted before applying changes to detect drift and decide what to skip; rootfs supplies the configuration files, applied live or deferred until reboot; and the application inventory drives package installation and the post-boot component reinstall. Each payload can be inspected or extracted independently." }, "layout": { "heading": "Archive layout", @@ -26,7 +26,7 @@ "heading": "The rootfs payload", "intro": "The rootfs/ tree is a plain filesystem copy produced by rsync from the source host. It contains a curated default profile of paths that matter for a Proxmox restore, plus any custom paths added by the user to the backup job or interactive session. The set is deliberately narrow: only paths that either hold configuration or hold state that Proxmox cannot regenerate on its own.", "defaultProfileTitle": "The default profile", - "defaultProfileBody": "The default profile is defined by hb_default_profile_paths in lib_host_backup_common.sh. It covers eight categories that together describe a working Proxmox host:", + "defaultProfileBody": "The default profile is defined by hb_default_profile_paths in lib_host_backup_common.sh. It covers eight fixed categories, plus conditional ZFS state, that together describe a working Proxmox host:", "categoriesTitle": "Path categories", "categoryRows": [ { @@ -125,7 +125,7 @@ }, "applications": { "heading": "The application inventory", - "intro": "Two files under metadata/ catalogue everything installed on the source that is not part of the base Proxmox VE package set. The restore uses them to reproduce the exact set of user-installed software on the target, using either APT or ProxMenux's own installers depending on how the software was originally installed.", + "intro": "Two inventories catalogue the software installed on the source beyond the base Proxmox VE package set: the package list under metadata/ and the component registry inside rootfs, detailed below. The restore uses them to reproduce user-installed software with APT or ProxMenux’s own installers, depending on how it was originally installed.", "packagesTitle": "packages.manual.list", "packagesBody": "A plain-text list produced by apt-mark showmanual: every APT package that was explicitly installed on the source host, sorted alphabetically. This excludes packages installed as dependencies of the base Proxmox VE ISO (they are re-pulled automatically by the target's own APT). Read by _rs_run_complete_extras during restore, filtered through a three-pass cascade-safe filter (dpkg -s for already-installed, sibling-major detection for library packages, apt-get install --simulate for cascade-remove risk), then installed with apt-get install -y.", "componentsTitle": "components_status.json (part of the rootfs)", diff --git a/web/messages/en/docs/backup-restore/restoring.json b/web/messages/en/docs/backup-restore/restoring.json index 51c2ce22..c64b6652 100644 --- a/web/messages/en/docs/backup-restore/restoring.json +++ b/web/messages/en/docs/backup-restore/restoring.json @@ -14,7 +14,7 @@ }, "intro": { "title": "The restore reproduces the source, not just the files", - "body": "Restoring a ProxMenux backup is not an extraction. Files are only the first step: after the filesystem is in place, the restore reads the manifest to detect differences between source and target, filters paths that would break the target's boot, hydrates user-authored tuning that cannot be copied verbatim, and — after the mandatory reboot — reinstalls every component the source had (NVIDIA driver, Coral TPU, GPU tools) against the target's own kernel. What the user picks from the menu is a single archive; what actually happens involves the compatibility check, the path classification, the on-boot dispatcher and the post-boot pass working together to produce a host that behaves like the source." + "body": "Restoring a ProxMenux backup involves more than extracting files. Before applying changes, the restore reads the manifest to detect differences between source and target, filters paths that could break the target’s boot and adapts user-authored tuning that cannot be copied verbatim. After the required reboot, it attempts to reinstall the recorded supported components (NVIDIA driver, Coral TPU, GPU tools) for the target’s running kernel. A single selected archive drives the compatibility check, path classification, on-boot dispatcher and post-boot work. Review the per-component results and logs to confirm the outcome." }, "threeActions": { "heading": "Three actions on a backup", @@ -52,7 +52,7 @@ }, { "output": "Rollback plan", - "detail": "Computed by compute_rollback_plan.sh. Lists VMs, LXCs and components present on the target but not in the backup. The user opts in during the confirmation dialog to have these removed as part of the restore, so the target ends up matching the backup exactly." + "detail": "Computed by compute_rollback_plan.sh. Lists VMs, LXCs and components present on the target but absent from the backup. The confirmation dialog offers optional removal of the extra guests before reboot. Component removal remains manual, and guest deletion can fail, so this does not guarantee an exact match with the backup." } ], "reportBody": "The check also emits a structured report (HB_COMPAT_RESULTS) categorised as PASS / INFO / WARN / FAIL. WARN and FAIL entries surface in the pre-restore panel; the restore refuses to proceed only when a FAIL is present that the user cannot resolve by clicking Continue." @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Paths applied immediately as well, but whose actual effect only kicks in on the next boot: the kernel only reads /etc/default/grub when the bootloader starts, /etc/fstab when filesystems are mounted at boot, /etc/modules when modules are loaded, etc. The file is in place the moment it is applied but the system has to reboot to consume it. Examples: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Paths deferred to the next boot, rather than applied immediately by this restore flow. They affect boot-time configuration: bootloader generation reads /etc/default/grub, filesystem mounting uses /etc/fstab, and module loading uses /etc/modules. The pending files are applied after reboot and the required boot artifacts are then regenerated. Examples: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." }, { "class": "dangerous", - "detail": "Paths that are NOT applied on the running system — a live write could corrupt state or drop the active connection. These are staged in the pending set and written by the post-boot dispatcher after the reboot, when the cluster is up but the system is not yet fully in use. Examples: /etc/pve (pmxcfs is a live FUSE mount; writing directly to it bypasses it), /var/lib/pve-cluster (live cluster data), /etc/network (could reconfigure the very interface the user is connected on over SSH and drop the session)." + "detail": "Paths that are NOT applied on the running system — a live write could corrupt state or drop the active connection. These are staged in the pending set and written by the post-boot dispatcher after the reboot, when the cluster is up but the system is not yet fully in use. Examples: /etc/pve (pmxcfs is a live FUSE mount holding active cluster configuration), /var/lib/pve-cluster (live cluster data), /etc/network (could reconfigure the very interface the user is connected on over SSH and drop the session)." } ] }, @@ -131,7 +131,7 @@ }, { "task": "Component auto-reinstall", - "detail": "Reads the restored components_status.json and iterates over the registered installers (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Each installer runs in --auto-reinstall mode, reads its previously-recorded version from the state file, and rebuilds against the target's current kernel. The interactive flow does not do this — reinstalling drivers against a kernel that has not yet booted is meaningless." + "detail": "Reads the restored components_status.json and iterates over the registered supported installers (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Each selected installer runs in --auto-reinstall mode, reads its recorded state and reinstalls for the target’s environment, rebuilding kernel modules when applicable. This is deferred until after reboot so the installers use the kernel then running on the target. Individual failures are recorded and do not stop the next component." }, { "task": "Boot sanity check", @@ -145,7 +145,7 @@ }, "liveProgress": { "heading": "Live progress in the Monitor's Backups tab", - "body": "After the reboot the Backups tab of ProxMenux Monitor renders a live post-restore card that reflects the state of apply_cluster_postboot.service as it runs. The card is driven by /var/lib/proxmenux/restore-state.json, which the dispatcher updates at every milestone (apply cluster config, rebuild initramfs, update bootloader, per-component reinstall, boot sanity check, finalize).", + "body": "After the reboot the Backups tab of ProxMenux Monitor renders a live post-restore card that reflects the state of proxmenux-apply-cluster-postboot.service as it runs. The card is driven by /var/lib/proxmenux/restore-state.json, which the dispatcher updates at every milestone (apply cluster config, rebuild initramfs, update bootloader, per-component reinstall, boot sanity check, finalize).", "fields": [ { "name": "Status badge", @@ -184,9 +184,9 @@ }, "postbootExample": { "heading": "What the post-boot looks like on the console", - "body": "On the host's physical console, a successful dispatcher run ends with a [ OK ] Finished proxmenux-apply-cluster-postboot.service line. When that line appears — usually alongside the OKs for multi-user.target and graphical.target — the restore is completely finished: components reinstalled, boot artifacts regenerated, cluster reconciled.", + "body": "On the host’s physical console, a dispatcher run that exits successfully ends with [ OK ] Finished proxmenux-apply-cluster-postboot.service, often near the OKs for multi-user.target and graphical.target. This marks the end of the dispatcher process. Individual component failures or boot warnings can still have been recorded; check the Monitor’s component states and logs before treating the host as fully restored.", "imageAlt": "Proxmox physical console showing '[ OK ] Finished proxmenux-apply-cluster-postboot.service - ProxMenux Apply Cluster Configs (post-boot).' followed by the OK for multi-user.target and graphical.target, with the host login prompt above.", - "imageCaption": "Physical console after a successful post-boot. The 'Finished proxmenux-apply-cluster-postboot.service' line is the signal that the restore flow is fully complete — the same event the 'Host restore finished' notification surfaces in the Monitor." + "imageCaption": "Physical console after the dispatcher process finishes. 'Finished proxmenux-apply-cluster-postboot.service' marks process completion, also reported by 'Host restore finished' in the Monitor. Component results and warnings still need review." }, "tenMinutes": { "heading": "Why the last ten minutes matter", @@ -228,11 +228,11 @@ "detail": "Cheap. The user learns the run completed the moment the notification fires." } ], - "outroBody": "The window matters because the user can log in during this time and see missing tools (nvidia-smi not found, coral not detected). This is expected — the reinstall is still running in the background. The completion notification signals when everything is ready." + "outroBody": "During this window a login may show missing tools (nvidia-smi not found, coral not detected) because reinstall work is still running in the background. The completion notification marks the end of that work; check component results, warnings and logs to distinguish success from individual failures." }, "destructiveRollback": { "heading": "The optional destructive rollback", - "body": "A restore is additive by default: if the target has VMs, LXCs or components that are not in the backup, they survive. This preserves work but can leave stale hostpci entries, orphan components or VMs the user no longer wants. When drift is detected between target and backup, the confirmation dialog offers a second yes/no: Execute destructive rollback?. Accepting it triggers _rs_execute_rollback, which deletes the VMs, LXCs and components that exist on the target but not in the backup. The rollback runs BEFORE the reboot so that the pending restore machinery sees a clean state. This is opt-in — the default is No, and the user sees exactly what would be removed listed by name (VMID and CTID) before deciding." + "body": "A restore is additive by default: extra VMs, LXCs and components on the target remain. When differences are detected, the confirmation dialog offers Execute destructive rollback?, defaulting to No. Accepting calls _rs_execute_rollback before reboot to attempt deletion of listed extra VMs and LXCs. Components are flagged for manual uninstall because automatic uninstall is not implemented. Guest deletion failures are reported and processing continues, so an exact match with the backup is not guaranteed. Review the listed names and VMIDs/CTIDs before choosing this destructive option." }, "logs": { "heading": "Where the logs live", diff --git a/web/messages/en/docs/backup-restore/scheduled-jobs.json b/web/messages/en/docs/backup-restore/scheduled-jobs.json index 5357ec6a..b5a3acf2 100644 --- a/web/messages/en/docs/backup-restore/scheduled-jobs.json +++ b/web/messages/en/docs/backup-restore/scheduled-jobs.json @@ -22,7 +22,7 @@ }, "attachBadge": { "title": "Attach mode — recommended when a PVE vzdump task already exists", - "body": "When a PVE vzdump backup task is already configured for the VMs and LXCs on this node, attaching the host backup to that task guarantees the host configuration is captured in the same window as the guests. On restore, the guest configs come from the host backup (they live under /etc/pve), and the guest disks come from the vzdump backup taken alongside — both sets are consistent with each other, so a full-node recovery can reproduce the host and re-attach every guest without version drift." + "body": "When a PVE vzdump backup task is already configured for the VMs and LXCs on this node, attaching the host backup runs it after the guest backup job, in the same backup cycle. On restore, guest configurations come from the host backup (under /etc/pve) and guest disks come from the vzdump backups taken in that cycle. This helps coordinate a full-node recovery, but is not an atomic snapshot: changes made during the backup cycle can leave differences between host configuration and guest disk state." }, "frequencyBadge": { "title": "Recommended frequency", @@ -31,29 +31,63 @@ "modes": { "heading": "The two modes", "rows": [ - { "mode": "New scheduled job", "backends": "Local, PBS, Borg", "schedule": "Own OnCalendar expression (systemd calendar syntax — e.g. daily, Mon..Fri 03:00).", "retention": "Prompted separately: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. Applied by the runner after each successful backup." }, - { "mode": "Attach to a PVE vzdump job", "backends": "Local, PBS (Borg has no PVE-side scheduler)", "schedule": "Inherited from the parent PVE job. No systemd timer is installed on the ProxMenux side.", "retention": "Inherited from the parent's prune-backups configuration (mapped one-to-one to the runner's KEEP_* variables via hb_pve_prune_to_keep_env)." } + { + "mode": "New scheduled job", + "backends": "Local, PBS, Borg", + "schedule": "Own OnCalendar expression (systemd calendar syntax — e.g. daily, Mon..Fri 03:00).", + "retention": "Prompted separately: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. Applied by the runner after each successful backup." + }, + { + "mode": "Attach to a PVE vzdump job", + "backends": "Local, PBS (Borg has no PVE-side scheduler)", + "schedule": "Inherited from the parent PVE job. No systemd timer is installed on the ProxMenux side.", + "retention": "Inherited from the parent's prune-backups configuration (mapped one-to-one to the runner's KEEP_* variables via hb_pve_prune_to_keep_env)." + } ] }, "attachDetail": { "heading": "How attach mode works", - "intro": "PVE writes vzdump tasks to /etc/pve/jobs.cfg — one stanza per task, each pointing at a storage where the VM and LXC dumps land. Attach mode requires that storage to be a backend ProxMenux understands (Local or PBS); when the task fires, ProxMenux runs alongside it.", + "intro": "PVE writes vzdump tasks to /etc/pve/jobs.cfg — one stanza per task, each pointing at a storage where the VM and LXC dumps land. Attach mode requires a backend ProxMenux understands (Local or PBS). The host backup runs from the job-end hook after the guest backup job finishes.", "steps": [ - { "step": "1", "detail": "During job creation, ProxMenux lists compatible parent PVE tasks via hb_pve_list_vzdump_jobs_for_backend. The user picks one." }, - { "step": "2", "detail": "The job's .env is written with PVE_PARENT_JOB, PVE_STORAGE and the inherited KEEP_* values; no systemd timer is created." }, - { "step": "3", "detail": "hb_install_vzdump_hook registers a script-hook in /etc/vzdump.conf. When PVE runs any vzdump task, the hook script fires; if the $STOREID passed to it matches an attached job's PVE_STORAGE, the runner is invoked for that job." }, - { "step": "4", "detail": "The archive lands in the same storage the vzdump dumps just wrote to: path/dump/ for Local, or the PBS repository configured on the PVE storage entry." } + { + "step": "1", + "detail": "During job creation, ProxMenux lists compatible parent PVE tasks via hb_pve_list_vzdump_jobs_for_backend. The user picks one." + }, + { + "step": "2", + "detail": "The job's .env is written with PVE_PARENT_JOB, PVE_STORAGE and the inherited KEEP_* values; no systemd timer is created." + }, + { + "step": "3", + "detail": "hb_install_vzdump_hook registers a script-hook in /etc/vzdump.conf. In the job-end phase of any vzdump task, it compares the supplied $STOREID with each enabled attached job’s PVE_STORAGE and invokes the runner for matching jobs. The match is by storage, not by the selected parent job ID." + }, + { + "step": "4", + "detail": "The archive lands in the same storage the vzdump dumps just wrote to: path/dump/ for Local, or the PBS repository configured on the PVE storage entry." + } ], - "outroBody": "Attach mode has one operational implication: disabling or deleting the parent PVE task also disables the host backup — there is no timer of its own to fall back on. The job entry stays on disk so it can be re-attached later." + "outroBody": "Attach mode has no timer of its own. Disabling or deleting the selected parent PVE task stops that task’s trigger, but another vzdump task using the same storage can still trigger the attached host backup. Disable or delete the ProxMenux job itself to prevent that. The job entry remains on disk when disabled and can be re-enabled or re-attached later." }, "storageLayout": { "heading": "Files that make up a job", "intro": "Every scheduled job is fully described by three or four files on disk. Reading them gives the full configuration of the job without relying on the interface.", "rows": [ - { "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env", "content": "Backend, backup ID or destination, schedule (New mode) or PVE parent (Attach mode), enabled flag, retention KEEP_* values, credentials pointers." }, - { "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths", "content": "One absolute path per line — the frozen selection resolved from the profile at job-creation time. Editing the file re-runs the job with the new selection on the next timer fire." }, - { "path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service", "content": "New mode only. The service invokes run_scheduled_backup.sh JOB_ID. The timer schedules it with Persistent=true (missed fires run at next boot) and a small RandomizedDelaySec=120 to spread load when multiple jobs share the same OnCalendar expression." }, - { "path": "/etc/vzdump.conf script-hook", "content": "Attach mode only. Installed once by hb_install_vzdump_hook; matches every attached job's PVE_STORAGE against the $STOREID PVE passes to the hook script." } + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env", + "content": "Backend, backup ID or destination, schedule (New mode) or PVE parent (Attach mode), enabled flag, retention KEEP_* values, credentials pointers." + }, + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths", + "content": "One absolute path per line — the frozen selection resolved from the profile at job-creation time. Editing the file re-runs the job with the new selection on the next timer fire." + }, + { + "path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service", + "content": "New mode only. The service invokes run_scheduled_backup.sh JOB_ID. The timer schedules it with Persistent=true (missed fires run at next boot) and a small RandomizedDelaySec=120 to spread load when multiple jobs share the same OnCalendar expression." + }, + { + "path": "/etc/vzdump.conf script-hook", + "content": "Attach mode only. Installed once by hb_install_vzdump_hook; matches every attached job's PVE_STORAGE against the $STOREID PVE passes to the hook script." + } ] }, "runner": { @@ -69,11 +103,26 @@ "heading": "Managing jobs", "intro": "The scheduler menu (Scripts TUI) and the Monitor Backups tab expose the same actions on any job.", "rows": [ - { "action": "Run now", "detail": "Invokes the runner immediately, bypassing the timer / vzdump hook. Useful to verify a job configuration without waiting for the next scheduled fire." }, - { "action": "Enable / Disable", "detail": "New mode: systemctl enable/disable --now the timer. Attach mode: flips the ENABLED flag in the job env — the hook script honours it on the next PVE fire." }, - { "action": "Edit", "detail": "Reopens the destination, schedule, profile and retention prompts and rewrites the job files. Preserves the job ID." }, - { "action": "Delete", "detail": "Removes the job env, paths file, systemd timer + service (New mode), and disables the hook binding (Attach mode). Does not touch archives already on the destination." }, - { "action": "View log", "detail": "Streams /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log — one log file per run. The runner also emits a compact status line to journald under the systemd service." } + { + "action": "Run now", + "detail": "Invokes the runner immediately, bypassing the timer / vzdump hook. Useful to verify a job configuration without waiting for the next scheduled fire." + }, + { + "action": "Enable / Disable", + "detail": "New mode: systemctl enable/disable --now the timer. Attach mode: flips the ENABLED flag in the job env — the hook script honours it on the next PVE fire." + }, + { + "action": "Edit", + "detail": "Reopens the destination, schedule, profile and retention prompts and rewrites the job files. Preserves the job ID." + }, + { + "action": "Delete", + "detail": "Removes the job env, paths file, systemd timer + service (New mode), and disables the hook binding (Attach mode). Does not touch archives already on the destination." + }, + { + "action": "View log", + "detail": "Streams /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log — one log file per run. The runner also emits a compact status line to journald under the systemd service." + } ] }, "notifications": { @@ -83,9 +132,21 @@ "whereNext": { "heading": "Where to go next", "items": [ - { "label": "Creating backups", "href": "/docs/backup-restore/creating-backups", "tail": " — the interactive flow that shares the backend with the scheduler." }, - { "label": "Destinations", "href": "/docs/backup-restore/destinations", "tail": " — per-backend configuration used by both the interactive flow and the scheduler." }, - { "label": "Restoring", "href": "/docs/backup-restore/restoring", "tail": " — the flow that consumes what jobs produce." } + { + "label": "Creating backups", + "href": "/docs/backup-restore/creating-backups", + "tail": " — the interactive flow that shares the backend with the scheduler." + }, + { + "label": "Destinations", + "href": "/docs/backup-restore/destinations", + "tail": " — per-backend configuration used by both the interactive flow and the scheduler." + }, + { + "label": "Restoring", + "href": "/docs/backup-restore/restoring", + "tail": " — the flow that consumes what jobs produce." + } ] } } diff --git a/web/messages/es/docs/backup-restore/creating-backups.json b/web/messages/es/docs/backup-restore/creating-backups.json index f4b2188f..71d2d5ab 100644 --- a/web/messages/es/docs/backup-restore/creating-backups.json +++ b/web/messages/es/docs/backup-restore/creating-backups.json @@ -1,7 +1,7 @@ { "meta": { "title": "Crear copias — flujo interactivo de copia | ProxMenux", - "description": "El flujo interactivo de copia en ProxMenux. Dos puntos de entrada (menú TUI de Scripts y UI Web del Monitor), tres destinos, dos modos de perfil, un paso común de staging y un diálogo de confirmación. Documenta la matriz de seis opciones, los perfiles Default y Custom, y qué ve el usuario entre seleccionar una copia y ver el archivo aterrizando en el destino.", + "description": "El flujo interactivo de copia de seguridad en ProxMenux. Dos puntos de entrada (el menú TUI de Scripts y la interfaz web de Monitor), tres destinos, dos modos de perfil, un paso de preparación temporal y un diálogo de confirmación. Documenta la matriz de seis opciones, los perfiles predeterminado y personalizado, y lo que ve el usuario desde que selecciona una copia hasta que el archivo se guarda en el destino.", "ogTitle": "ProxMenux Backup — crear copias", "ogDescription": "El flujo interactivo de copia con tres destinos, dos perfiles y un paso común de staging.", "twitterTitle": "Crear copias | ProxMenux", @@ -9,12 +9,12 @@ }, "header": { "title": "Crear copias", - "description": "El flujo interactivo de copia: elegir un destino y un perfil, revisar el resumen de confirmación, y ver el archivo aterrizando. Dos puntos de entrada comparten el mismo backend y producen archivos idénticos.", - "section": "Backup & Restore" + "description": "El flujo interactivo de copia de seguridad: elige un destino y un perfil, revisa el resumen de confirmación y observa cómo se guarda el archivo. Los dos puntos de entrada comparten el mismo backend y producen archivos idénticos.", + "section": "Copias de seguridad y restauración" }, "intro": { "title": "Dos puntos de entrada, funcionalidad idéntica", - "body": "El TUI de Scripts y la UI Web del Monitor exponen exactamente la misma funcionalidad. Cada copia — manual o programada — pasa por la misma matriz de elección (tres destinos × dos perfiles) e invoca la misma función backend por celda (_bk_pbs, _bk_borg o _bk_local). Los archivos producidos desde uno u otro punto de entrada son indistinguibles. Cuál usar es una cuestión de preferencia: el TUI es amigable por SSH y admite scripting; el Monitor ofrece click-y-elegir y convive con las vistas de notificaciones y de tail del log." + "body": "El TUI de Scripts y la interfaz web de Monitor ofrecen exactamente las mismas funciones. Cada copia —manual o programada— pasa por la misma matriz de opciones (tres destinos × dos perfiles) y llama a la misma función del backend en cada celda (_bk_pbs, _bk_borg o _bk_local). Los archivos generados desde cualquiera de los dos puntos de entrada son indistinguibles. La elección depende de tus preferencias: el TUI se puede usar por SSH y mediante scripts; Monitor permite trabajar con clics y reúne las vistas de notificaciones y seguimiento del registro." }, "entryPoints": { "heading": "Los dos puntos de entrada", @@ -26,14 +26,14 @@ }, { "entry": "ProxMenux Monitor (UI Web)", - "path": "Pestaña Backups → Create backup", + "path": "Backups tab → Create backup", "detail": "Flujo en estilo asistente. Las mismas seis opciones presentadas como formulario de dos pasos (destino → perfil). Se invocan las mismas funciones backend por la API Flask." } ] }, "modes": { "heading": "Copias manuales vs programadas", - "body": "Las copias se pueden producir en dos modos: manuales (el flujo interactivo que documenta esta página — el usuario elige un destino y un perfil desde un menú y ve el archivo aterrizando) o programadas (un trabajo desatendido que se ejecuta en un timer estilo cron y aplica la retención configurada en el trabajo). Ambos modos soportan los mismos tres destinos y los mismos dos perfiles, y ambos están disponibles desde los dos puntos de entrada — el menú TUI de Scripts y la pestaña Backups del Monitor. Los trabajos programados usan las mismas funciones backend que el flujo manual a través de run_scheduled_backup.sh; los archivos producidos son indistinguibles.", + "body": "Las copias se pueden producir en dos modos: manuales (el flujo interactivo que documenta esta página — el usuario elige un destino y un perfil desde un menú y ve cómo se guarda el archivo) o programadas (un trabajo desatendido que se ejecuta en un timer estilo cron y aplica la retención configurada en el trabajo). Ambos modos soportan los mismos tres destinos y los mismos dos perfiles, y ambos están disponibles desde los dos puntos de entrada — el menú TUI de Scripts y la pestaña Backups del Monitor. Los trabajos programados usan las mismas funciones backend que el flujo manual a través de run_scheduled_backup.sh; los archivos producidos son indistinguibles.", "seeAlso": "La página de trabajos programados cubre el flujo completo, incluyendo cómo crear un trabajo, adjuntarlo a un timer vzdump de PVE existente, y configurar los valores de retención.", "monitorAlt": "Pestaña Backups del Monitor de ProxMenux mostrando el diálogo New scheduled backup con los campos de destino, perfil, horario y retención.", "monitorCaption": "Copia programada — Monitor de ProxMenux. El mismo diálogo estilo asistente que crea una copia manual lleva los campos de horario y retención al final para la ruta desatendida." @@ -45,46 +45,46 @@ { "combo": "1", "destination": "PBS", - "profile": "Default", + "profile": "Por defecto", "action": "Sube el perfil por defecto más los extras persistentes a un repositorio PBS configurado." }, { "combo": "2", "destination": "Borg", - "profile": "Default", + "profile": "Por defecto", "action": "Crea un archivo con el perfil por defecto más los extras persistentes en el repositorio Borg seleccionado." }, { "combo": "3", "destination": "Local", - "profile": "Default", + "profile": "Por defecto", "action": "Escribe un archivo .tar.zst con el perfil por defecto más los extras persistentes en el destino local configurado." }, { "combo": "4", "destination": "PBS", - "profile": "Custom", - "action": "Abre el path picker antes de la subida a PBS; el usuario marca rutas y puede añadir nuevas." + "profile": "Personalizado", + "action": "Abre el selector de rutas antes de la subida a PBS; el usuario marca las rutas y puede añadir otras nuevas." }, { "combo": "5", "destination": "Borg", - "profile": "Custom", - "action": "Abre el path picker antes de crear el archivo Borg." + "profile": "Personalizado", + "action": "Abre el selector de rutas antes de crear el archivo Borg." }, { "combo": "6", "destination": "Local", - "profile": "Custom", - "action": "Abre el path picker antes de escribir el .tar.zst local." + "profile": "Personalizado", + "action": "Abre el selector de rutas antes de escribir el .tar.zst local." } ] }, "profiles": { - "heading": "Perfil Default vs Custom", - "defaultTitle": "Perfil Default", + "heading": "Perfil predeterminado y personalizado", + "defaultTitle": "Perfil predeterminado", "defaultBody": "El perfil por defecto es la lista curada de hb_default_profile_paths (documentada en Cómo funciona bajo Categorías de rutas) más cada entrada del fichero de extras persistentes /usr/local/share/proxmenux/backup-extra-paths.txt. El usuario confirma el destino y las opciones de cifrado y la copia continúa sin más selección de rutas.", - "customTitle": "Perfil Custom", + "customTitle": "Perfil personalizado", "customBody": "El perfil Custom abre un checklist mostrando cada ruta del perfil por defecto (sin marcar) y cada extra persistente (premarcado, prefijado con [+]). El usuario marca el conjunto para esa ejecución y puede pulsar Add custom path para añadir una nueva ruta absoluta. Cualquier ruta añadida en línea se persiste en backup-extra-paths.txt para que futuras copias la recojan automáticamente sin volver a añadirla. Quitar la marca a un extra persistente lo desmarca para esa ejecución pero no lo elimina del fichero — la eliminación es una acción Manage custom paths separada, fuera del flujo de copia.", "customPickerAlt": "Checklist del perfil Custom mostrando las rutas del perfil por defecto (sin marcar) y los extras persistentes (premarcados con prefijo [+]), más botones para añadir una ruta nueva o confirmar la selección.", "customPickerCaption": "Perfil Custom — el path picker. Las rutas del perfil por defecto aparecen sin marcar; los extras persistentes aparecen premarcados con prefijo [+]. El usuario marca el conjunto para esa ejecución.", @@ -118,7 +118,7 @@ { "step": "5", "name": "Notificación (start)", - "detail": "Se dispara hb_notify_lifecycle \"start\". Si las notificaciones están configuradas en el Monitor, se emite un evento usuario-facing Host backup started. Silencioso si no hay canales configurados." + "detail": "Se ejecuta hb_notify_lifecycle \"start\". Si las notificaciones están configuradas en Monitor, se emite un evento Copia de seguridad del host iniciada para el usuario. No se envía nada si no hay canales configurados." } ] }, @@ -157,7 +157,7 @@ "Filesystems runtime del kernel y sistema — /proc, /sys, /dev y /run son pseudo-filesystems que produce el kernel y udev; no se persisten en ningún sitio.", "Binarios de paquetes bajo /usr/bin, /usr/lib, /lib, /sbin — los reinstala el APT del destino a partir de packages.manual.list.", "/var/log/, /var/tmp/, /var/cache/ — estado runtime por host, no se restaura.", - "/home/USUARIO — no está en el perfil por defecto. Añadirlo como ruta custom cuando un sistema tenga directorios home de usuario que deban sobrevivir a una restauración." + "/home/USER — no está en el perfil por defecto. Añadirlo como ruta custom cuando un sistema tenga directorios home de usuario que deban sobrevivir a una restauración." ], "customPathsTitle": "Cómo se tratan las rutas custom", "customPathsBody": "Una ruta custom añadida en línea en modo Custom o persistida en backup-extra-paths.txt pasa por el mismo pipeline de rsync que las rutas del perfil por defecto. Se aplican las exclusiones globales. Si la ruta custom está bajo /root/ o /usr/local/share/proxmenux/, siguen aplicando las exclusiones específicas de arriba. Cada ruta archivada — default o custom — queda registrada en metadata/paths_archived.txt. Las rutas que no existen en el origen se registran en metadata/missing_paths.txt sin detener la copia." @@ -165,7 +165,7 @@ "archiveStructure": { "heading": "Estructura del archivo", "intro": "El directorio de staging que produce cada backend sigue el mismo layout con independencia del destino. El tarball, el .pxar de PBS o el archivo Borg almacenan este árbol verbatim.", - "tree": "backup-[timestamp]/\n├── manifest.json # estado estructurado del host (kernel_params, hardware, storage, guests, components, source_host)\n├── metadata/\n│ ├── packages.manual.list # salida de apt-mark showmanual\n│ ├── run_info.env # hostname, timestamp, versión del kernel, método pmxcfs\n│ ├── paths_archived.txt # lista exacta de rutas que llegaron a rootfs/\n│ └── missing_paths.txt # rutas del perfil ausentes en el origen\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, /etc/apt, ...\n ├── root/ # /root sin subpaths volátiles\n ├── usr/local/ # /usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux (sólo estado)\n └── var/ # /var/lib/pve-cluster (config.db vía sqlite3 .backup), /var/spool/cron/crontabs" + "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│ ├── paths_archived.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": "Resumen de confirmación", @@ -184,7 +184,7 @@ "detail": "hb_write_archive_sidecar deposita un *.proxmenux.json junto al archivo local para que el Monitor lo identifique como copia de host de ProxMenux incluso tras movimientos o renombrados." }, { - "topic": "Notificación (complete/fail)", + "topic": "Notificación (éxito o fallo)", "detail": "Se dispara hb_notify_lifecycle \"complete\" o \"fail\" con duración, tamaño del archivo y — en fallos — la última línea del log que parezca un error." } ] diff --git a/web/messages/es/docs/backup-restore/cross-kernel.json b/web/messages/es/docs/backup-restore/cross-kernel.json index 407a7f53..33c6acca 100644 --- a/web/messages/es/docs/backup-restore/cross-kernel.json +++ b/web/messages/es/docs/backup-restore/cross-kernel.json @@ -10,19 +10,31 @@ "header": { "title": "Restauración cross-kernel", "description": "Cómo maneja ProxMenux una restauración cuando el kernel del host de destino es distinto al kernel que había en el momento de la copia — especialmente cuando el destino ejecuta un kernel más reciente. Documenta cómo se detecta la diferencia, cómo se filtran las rutas críticas del arranque que podrían romper el destino, y cómo se reaplica la configuración propia del usuario sin copiar verbatim los ficheros ligados al kernel.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "intro": { "title": "Cada salto de kernel se maneja de forma distinta", - "body": "Cuando la restauración detecta que la copia y el destino tienen versiones mayores distintas de kernel, el flujo se ramifica en función de la dirección del salto — si la copia es más antigua o más reciente que el destino — porque los dos casos tienen modos de fallo opuestos. Las copias más recientes que el destino se restauran limpiamente tal cual (verificado empíricamente en múltiples pruebas de banco). Las copias más antiguas que el destino necesitan un filtro para evitar romper el arranque del destino con configuración escrita para un kernel que desde entonces ha cambiado." + "body": "El kernel de un host Proxmox se identifica mediante una versión como 6.17.13-2-pve. Los dos primeros números (6.17 en este ejemplo) definen la versión principal: cuando cambian, algunos archivos de configuración del kernel anterior podrían no ser válidos para el nuevo. Si la restauración detecta versiones principales distintas en la copia y en el destino, el proceso toma un camino u otro según la dirección del salto: si el kernel de la copia es anterior o posterior al del destino. Los dos casos presentan riesgos opuestos. Las copias con un kernel más reciente que el del destino se restauran tal cual, sin problemas según las pruebas realizadas con varios saltos de kernel. Las copias con un kernel anterior al del destino necesitan un filtro para evitar que una configuración del kernel antiguo impida arrancar el sistema de destino." }, "directionCheck": { "heading": "La comprobación de dirección", "intro": "Durante la comprobación de compatibilidad, hb_compat_check compara el kernel registrado en el manifiesto de la copia contra el kernel actual del destino (uname -r) y clasifica la restauración en uno de tres casos, guardado en la variable interna HB_COMPAT_KERNEL_DIRECTION:", "rows": [ - { "direction": "same", "condition": "La versión mayor del kernel coincide entre la copia y el destino.", "behavior": "El flujo de restauración completo corre sin cambios. Sin filtro adicional, sin hidratación, sin aviso especial en la interfaz." }, - { "direction": "bk_newer", "condition": "El kernel de la copia es más RECIENTE que el del destino (por ejemplo: la copia se hizo con kernel 7.0 y el destino corre kernel 6.17).", "behavior": "El flujo de restauración completo corre sin cambios, exactamente igual que en same. No se aplica ningún filtro. Verificado empíricamente: los controladores se reinstalan contra el kernel del destino, la configuración IOMMU se aplica limpia, las VMs con passthrough GPU arrancan sin problemas." }, - { "direction": "bk_older", "condition": "El kernel de la copia es más ANTIGUO que el del destino (por ejemplo: la copia se hizo con kernel 6.17 y el destino corre kernel 7.0).", "behavior": "Se activan el filtro de subconjunto seguro y la hidratación de cuatro fases descritos más abajo. La restauración procede — el destino reproduce el origen, pero los ficheros críticos del arranque no se copian verbatim." } + { + "direction": "same", + "condition": "La versión mayor del kernel coincide entre la copia y el destino.", + "behavior": "El flujo de restauración completo corre sin cambios. Sin filtro adicional, sin hidratación, sin aviso especial en la interfaz." + }, + { + "direction": "bk_newer", + "condition": "El kernel de la copia es más RECIENTE que el del destino (por ejemplo: la copia se hizo con kernel 7.0 y el destino corre kernel 6.17).", + "behavior": "El flujo de restauración completo corre sin cambios, exactamente igual que en same. No se aplica ningún filtro. Verificado empíricamente: los controladores se reinstalan contra el kernel del destino, la configuración IOMMU se aplica limpia, las VMs con passthrough GPU arrancan sin problemas." + }, + { + "direction": "bk_older", + "condition": "El kernel de la copia es más ANTIGUO que el del destino (por ejemplo: la copia se hizo con kernel 6.17 y el destino corre kernel 7.0).", + "behavior": "Se activan el filtro de subconjunto seguro y la hidratación de cuatro fases descritos más abajo. La restauración procede — el destino reproduce el origen, pero los ficheros críticos del arranque no se copian verbatim." + } ] }, "whyBkNewerIsSafe": { @@ -31,25 +43,60 @@ }, "safeSubsetFilter": { "heading": "El filtro de subconjunto seguro (sólo cuando el kernel del destino es más reciente)", - "intro": "Cuando el kernel del destino es más reciente que el de la copia, la comprobación de compatibilidad añade 16 rutas críticas del arranque de hb_unsafe_paths_cross_version a RS_SKIP_PATHS. Estas rutas se excluyen de la restauración porque escribir una versión suya de un kernel más antiguo sobre un destino que corre uno más reciente ha causado kernel panics en pruebas de banco. Las rutas cubren cuatro categorías:", + "intro": "Cuando el kernel del destino es más reciente que el de la copia, la comprobación de compatibilidad añade 16 rutas críticas del arranque de hb_unsafe_paths_cross_version a RS_SKIP_PATHS. Estas rutas se excluyen de la restauración porque escribir una versión suya de un kernel más antiguo sobre un destino que corre uno más reciente ha causado kernel panics en pruebas de banco. Las rutas cubren cinco categorías:", "categoryRows": [ - { "category": "Bootloader", "paths": "/etc/default/grub, /etc/kernel", "reason": "Defaults de GRUB atados al orden previo de kernels, y estado de proxmox-boot-tool (cmdline, UUIDs de ESP, hooks) que referencia rutas e identificadores de la instalación más antigua." }, - { "category": "Módulos del kernel y artefactos de arranque", "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", "reason": "Listas de autocarga que pueden referenciar módulos renombrados entre majors del kernel, opciones de módulo que pueden no aplicar, hooks de initramfs escritos para el kernel más antiguo." }, - { "category": "Stack de almacenamiento e identidad de filesystem", "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", "reason": "UUIDs que pueden no existir en esta instalación, drivers de multipath que cambian entre kernels, parámetros iSCSI que evolucionan, reglas udev que pueden atarse a subsistemas inexistentes, estado ZFS (zpool.cache + hostid) que puede bloquear el pool como si no perteneciera al host." }, - { "category": "Fuentes APT", "paths": "/etc/apt", "reason": "Las suites de fuentes APT pueden disparar un downgrade de paquetes críticos en la próxima actualización." }, - { "category": "systemd", "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", "reason": "Overrides de unit y .wants ligados al major de systemd más antiguo; claves de configuración que pueden no parsearse en un systemd más reciente." } + { + "category": "Cargador de arranque", + "paths": "/etc/default/grub, /etc/kernel", + "reason": "Defaults de GRUB atados al orden previo de kernels, y estado de proxmox-boot-tool (cmdline, UUIDs de ESP, hooks) que referencia rutas e identificadores de la instalación más antigua." + }, + { + "category": "Módulos del kernel y artefactos de arranque", + "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", + "reason": "Listas de autocarga que pueden referenciar módulos renombrados entre majors del kernel, opciones de módulo que pueden no aplicar, hooks de initramfs escritos para el kernel más antiguo." + }, + { + "category": "Stack de almacenamiento e identidad de filesystem", + "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", + "reason": "UUIDs que pueden no existir en esta instalación, drivers de multipath que cambian entre kernels, parámetros iSCSI que evolucionan, reglas udev que pueden atarse a subsistemas inexistentes, estado ZFS (zpool.cache + hostid) que puede bloquear el pool como si no perteneciera al host." + }, + { + "category": "Fuentes APT", + "paths": "/etc/apt", + "reason": "Las suites de fuentes APT pueden disparar un downgrade de paquetes críticos en la próxima actualización." + }, + { + "category": "systemd", + "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", + "reason": "Overrides de unit y .wants ligados al major de systemd más antiguo; claves de configuración que pueden no parsearse en un systemd más reciente." + } ], - "outroBody": "El filtro corre ANTES del diálogo de confirmación para que el usuario vea la lista exacta de rutas que se saltarán, categorizadas por motivo. La restauración procede igualmente — todo lo demás (VMs, LXCs, red, /etc/pve, usuarios, cron, estado de ProxMenux, paquetes, drivers, /root) se restaura con normalidad." + "outroBody": "El filtro corre ANTES del diálogo de confirmación para que el usuario vea la lista exacta de rutas que se saltarán, categorizadas por motivo. La restauración procede igualmente — todo lo demás (configuración de VM/LXC, red, /etc/pve, usuarios, cron, estado de ProxMenux, paquetes, drivers, /root) se restaura con normalidad." }, "hydration": { "heading": "Hidratación independiente del kernel", - "intro": "El filtro de subconjunto seguro por sí solo dejaría al destino sin la configuración que el usuario había puesto dentro de esos ficheros críticos del arranque: cmdline IOMMU para passthrough GPU, IDs de dispositivo VFIO, GRUB_TIMEOUT custom, blacklists de nvidia. La pasada de hidratación reaplica esas piezas de forma independiente de la versión del kernel. Corren cuatro fases cuando el kernel del destino es más reciente que el de la copia, cada una aditiva (nunca sobrescribe un valor que el destino ya lleva) e idempotente (correr dos veces es un no-op).", + "intro": "El filtro omite archivos críticos del arranque; la hidratación reaplica ajustes seleccionados: cmdline IOMMU, IDs VFIO, GRUB_TIMEOUT personalizado y listas de bloqueo nvidia. Se ejecuta con un kernel destino más reciente. La fusión de cmdline conserva las claves del destino y añade módulos que faltan. Los valores GRUB y archivos permitidos pueden reemplazar contenido distinto del destino. Repetir la misma entrada es idempotente.", "phaseRows": [ - { "phase": "1a — Ruta GRUB", "detail": "Para hosts que usan GRUB (instalaciones ext4/lvm). _rs_hyd_grub mergea cada token de manifest.kernel_params.cmdline_extra de la copia en el GRUB_CMDLINE_LINUX_DEFAULT vivo del destino, saltando los tokens cuya clave el destino ya lleva. Después mergea claves whitelisted GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) del /etc/default/grub de la copia si difieren de las del destino." }, - { "phase": "1b — Ruta systemd-boot / ZFS", "detail": "Para hosts que usan systemd-boot (típicamente ZFS-on-root). _rs_hyd_kernel_cmdline mergea los tokens del usuario de cmdline_extra en el /etc/kernel/cmdline del destino, manteniendo intacto el boilerplate propio del destino: root=, boot= y rootflags=." }, - { "phase": "2 — Merge en /etc/modules", "detail": "_rs_hyd_modules añade los módulos de manifest.kernel_params.modules_loaded_at_boot que estén en la whitelist (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) Y que aún no estén presentes en /etc/modules del destino." }, - { "phase": "3 — Copia de ficheros whitelisted", "detail": "_rs_hyd_files copia ficheros escritos por el usuario del staging rootfs al destino en vivo cuando el contenido difiere. La whitelist cubre ficheros VFIO/nvidia/blacklist bajo /etc/modprobe.d, /etc/modules-load.d, y la regla VFIO bind + reglas udev de nvidia de ProxMenux bajo /etc/udev/rules.d. Los ficheros propiedad de la distro (pve-blacklist.conf, mdadm.conf, nvme.conf) se excluyen intencionadamente — sus contenidos evolucionan entre releases." }, - { "phase": "4 — Forzar reflows post-arranque", "detail": "Las cuatro fases escriben directamente en el destino vivo FUERA del pipeline normal de restauración. Para que los tokens/módulos/ficheros mergeados tengan efecto en el siguiente arranque, HB_HYDRATION_APPLIED=1 se propaga a través de plan.env a apply_pending_restore.sh, que fuerza NEEDS_INITRAMFS=1 y NEEDS_GRUB=1 con independencia de lo que hubiera en la lista de apply. El dispatcher post-arranque después regenera el initramfs y refresca el bootloader." } + { + "phase": "1a — Ruta GRUB", + "detail": "Para hosts que usan GRUB (instalaciones ext4/lvm). _rs_hyd_grub mergea cada token de manifest.kernel_params.cmdline_extra de la copia en el GRUB_CMDLINE_LINUX_DEFAULT vivo del destino, saltando los tokens cuya clave el destino ya lleva. Después mergea claves whitelisted GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) del /etc/default/grub de la copia si difieren de las del destino." + }, + { + "phase": "1b — Ruta systemd-boot / ZFS", + "detail": "Para hosts que usan systemd-boot (típicamente ZFS-on-root). _rs_hyd_kernel_cmdline mergea los tokens del usuario de cmdline_extra en el /etc/kernel/cmdline del destino, manteniendo intacto el boilerplate propio del destino: root=, boot= y rootflags=." + }, + { + "phase": "2 — Merge en /etc/modules", + "detail": "_rs_hyd_modules añade los módulos de manifest.kernel_params.modules_loaded_at_boot que estén en la whitelist (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) Y que aún no estén presentes en /etc/modules del destino." + }, + { + "phase": "3 — Copia de ficheros whitelisted", + "detail": "_rs_hyd_files copia ficheros escritos por el usuario del staging rootfs al destino en vivo cuando el contenido difiere. La whitelist cubre ficheros VFIO/nvidia/blacklist bajo /etc/modprobe.d, /etc/modules-load.d, y la regla VFIO bind + reglas udev de nvidia de ProxMenux bajo /etc/udev/rules.d. Los ficheros propiedad de la distro (pve-blacklist.conf, mdadm.conf, nvme.conf) se excluyen intencionadamente — sus contenidos evolucionan entre releases." + }, + { + "phase": "4 — Forzar reflows post-arranque", + "detail": "Las cuatro fases escriben directamente en el destino vivo FUERA del pipeline normal de restauración. Para que los tokens/módulos/ficheros mergeados tengan efecto en el siguiente arranque, HB_HYDRATION_APPLIED=1 se propaga a través de plan.env a apply_pending_restore.sh, que fuerza NEEDS_INITRAMFS=1 y NEEDS_GRUB=1 con independencia de lo que hubiera en la lista de apply. El dispatcher post-arranque después regenera el initramfs y refresca el bootloader." + } ] }, "planCommit": { @@ -59,14 +106,20 @@ "flowDiagram": { "heading": "El flujo cuando el kernel del destino es más reciente que el de la copia", "intro": "Los pasos específicos que se añaden cuando el kernel del destino es más reciente se insertan dentro del flujo normal de restauración. Todo lo demás — hot apply, prepare pending, instalación de paquetes, dispatcher post-arranque — corre idéntico a una restauración con el mismo kernel.", - "diagram": " ┌────────────────────────────────────────────────────────────┐\n │ hb_compat_check │\n │ HB_COMPAT_KERNEL_DIRECTION = bk_older │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Añade 16 rutas críticas del arranque a 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 │ Calcula qué se mergearía │\n │ Rellena RS_HYDRATION_SUMMARY (bloque verde) │\n │ Sin escrituras │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Diálogo de confirmación │\n │ Ámbar: rutas saltadas por el filtro de subconjunto seguro │\n │ Verde: tokens/ficheros reaplicados por la hidratación │\n │ El usuario acepta o cancela │\n └───────────────────────────┬────────────────────────────────┘\n │ (aceptado)\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ _rs_apply_bk_older_hydration \"commit\" │\n │ Fase 1a/1b: mergea tokens del cmdline + claves GRUB │\n │ Fase 2: añade módulos a /etc/modules │\n │ Fase 3: copia ficheros whitelisted vfio/nvidia │\n │ Fija HB_HYDRATION_APPLIED=1 │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ El resto de la restauración corre normalmente │\n │ _rs_apply hot (salta RS_SKIP_PATHS) │\n │ _rs_prepare_pending_restore (escribe plan.env con │\n │ HB_HYDRATION_APPLIED=1) │\n │ packages.manual.list install │\n │ Reinicio │\n │ apply_pending_restore.sh (fuerza NEEDS_INITRAMFS=1, │\n │ NEEDS_GRUB=1 por el flag de hidratación) │\n │ apply_cluster_postboot.sh │\n │ update-initramfs -u -k all │\n │ update-grub / proxmox-boot-tool refresh │\n │ component --auto-reinstall │\n └────────────────────────────────────────────────────────────┘" + "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": "Ejemplos concretos", "intro": "La pasada de hidratación no es abstracta — produce resultados observables y correctos en escenarios habituales. Dos ejemplos que la hidratación resuelve automáticamente:", "rows": [ - { "scenario": "GPU passthrough (VFIO)", "detail": "El origen tenía intel_iommu=on iommu=pt en el cmdline, vfio/vfio_pci/vfio_iommu_type1 en /etc/modules, un /etc/modprobe.d/vfio.conf con options vfio-pci ids=10de:2216, y un /etc/modprobe.d/blacklist-nvidia.conf. La hidratación mergea los tokens del cmdline en el GRUB o kernel cmdline del destino, añade los módulos vfio a /etc/modules, y copia los dos ficheros modprobe escritos por el usuario. En el siguiente arranque, IOMMU está activo, los módulos VFIO cargan, la GPU queda ligada a vfio-pci y la VM arranca con el passthrough funcionando." }, - { "scenario": "Defaults custom de GRUB", "detail": "El origen tenía GRUB_TIMEOUT=1 y GRUB_DISABLE_OS_PROBER=true. La hidratación lee ambas claves del /etc/default/grub de la copia, ve que difieren de los defaults de la instalación fresca, y reescribe esas dos líneas en el fichero del destino (dejando todo lo demás, incluido GRUB_DISTRIBUTOR, intacto)." } + { + "scenario": "Paso GPU (VFIO)", + "detail": "El origen tenía intel_iommu=on iommu=pt en el cmdline, vfio/vfio_pci/vfio_iommu_type1 en /etc/modules, un /etc/modprobe.d/vfio.conf con options vfio-pci ids=10de:2216, y un /etc/modprobe.d/blacklist-nvidia.conf. La hidratación mergea los tokens del cmdline en el GRUB o kernel cmdline del destino, añade los módulos vfio a /etc/modules, y copia los dos ficheros modprobe escritos por el usuario. En el siguiente arranque, IOMMU está activo, los módulos VFIO cargan, la GPU queda ligada a vfio-pci y la VM arranca con el passthrough funcionando." + }, + { + "scenario": "Defaults custom de GRUB", + "detail": "El origen tenía GRUB_TIMEOUT=1 y GRUB_DISABLE_OS_PROBER=true. La hidratación lee ambas claves del /etc/default/grub de la copia, ve que difieren de los defaults de la instalación fresca, y reescribe esas dos líneas en el fichero del destino (dejando todo lo demás, incluido GRUB_DISTRIBUTOR, intacto)." + } ] }, "callout": { @@ -77,18 +130,41 @@ "heading": "Dónde viven los mecanismos", "intro": "Para desarrolladores que quieran trazar o extender el comportamiento cross-kernel:", "rows": [ - { "component": "Detección de dirección", "location": "hb_compat_check en lib_host_backup_common.sh. Fija HB_COMPAT_KERNEL_DIRECTION." }, - { "component": "Lista de rutas del subconjunto seguro", "location": "hb_unsafe_paths_cross_version en lib_host_backup_common.sh. Emite líneas path\\tmotivo usadas tanto por el filtro CLI como por el endpoint Web /api/host-backups/restore/prepare." }, - { "component": "Fases de hidratación", "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files en backup_host.sh. Orquestados por _rs_apply_bk_older_hydration." }, - { "component": "Forzado de reflow post-arranque", "location": "apply_pending_restore.sh lee HB_HYDRATION_APPLIED de plan.env y fuerza NEEDS_INITRAMFS=1/NEEDS_GRUB=1." }, - { "component": "Preview Web", "location": "/api/host-backups/restore/prepare en flask_server.py. Fuentea la librería helper, ejecuta _rs_apply_bk_older_hydration en modo plan, devuelve las acciones al modal Web." } + { + "component": "Detección de dirección", + "location": "hb_compat_check en lib_host_backup_common.sh. Fija HB_COMPAT_KERNEL_DIRECTION." + }, + { + "component": "Lista de rutas del subconjunto seguro", + "location": "hb_unsafe_paths_cross_version en lib_host_backup_common.sh. Emite líneas path\\treason usadas tanto por el filtro CLI como por el endpoint Web /api/host-backups/restore/prepare." + }, + { + "component": "Fases de hidratación", + "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files en backup_host.sh. Orquestados por _rs_apply_bk_older_hydration." + }, + { + "component": "Forzado de reflow post-arranque", + "location": "apply_pending_restore.sh lee HB_HYDRATION_APPLIED de plan.env y fuerza NEEDS_INITRAMFS=1/NEEDS_GRUB=1." + }, + { + "component": "Preview Web", + "location": "/api/host-backups/restore/prepare en flask_server.py. Fuentea la librería helper, ejecuta _rs_apply_bk_older_hydration en modo plan, devuelve las acciones al modal Web." + } ] }, "whereNext": { "heading": "A dónde seguir", "items": [ - { "label": "Restaurar", "href": "/docs/backup-restore/restoring", "tail": " — el pipeline completo de restauración en el que se enchufan los mecanismos de esta página." }, - { "label": "Cómo funciona", "href": "/docs/backup-restore/how-it-works", "tail": " — el manifiesto y los colectores que producen el bloque kernel_params del que lee la hidratación." } + { + "label": "Restaurar", + "href": "/docs/backup-restore/restoring", + "tail": " — el pipeline completo de restauración en el que se enchufan los mecanismos de esta página." + }, + { + "label": "Cómo funciona", + "href": "/docs/backup-restore/how-it-works", + "tail": " — el manifiesto y los colectores que producen el bloque kernel_params del que lee la hidratación." + } ] } } diff --git a/web/messages/es/docs/backup-restore/destinations/borg.json b/web/messages/es/docs/backup-restore/destinations/borg.json index 860788e8..ffa24433 100644 --- a/web/messages/es/docs/backup-restore/destinations/borg.json +++ b/web/messages/es/docs/backup-restore/destinations/borg.json @@ -10,7 +10,7 @@ "header": { "title": "Borg", "description": "El destino Borg escribe las copias del host en un repositorio Borg. Se soportan tres tipos de repositorio: ruta local de sistema de ficheros, disco externo montado o servidor remoto vía SSH. Deduplicación a nivel de chunk entre todos los archivos del repositorio y cifrado opcional repokey.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "aboutBorg": { "heading": "Qué es Borg", @@ -62,7 +62,7 @@ }, { "type": "local", - "url": "/backup/borgbackup (cualquier ruta absoluta)", + "url": "/backup/borgbackup (any absolute path)", "detail": "El repositorio vive en un directorio local. Sólo tiene sentido cuando el directorio está en un disco físico distinto — un repositorio en el mismo disco que el origen protege contra error humano pero no contra fallo de disco." } ] @@ -78,7 +78,7 @@ "Otro host Proxmox en la misma LAN, o una VM en cualquier lugar alcanzable por SSH." ], "lxcWarningTitle": "LXC como servidor Borg", - "lxcWarningBody": "Si el servidor Borg se ejecuta dentro de un LXC, el contenedor debe tener una cuenta de usuario con contraseña.", + "lxcWarningBody": "Si el servidor Borg está en un LXC, generate-auto necesita una cuenta que acepte autenticación SSH por contraseña durante la instalación de la clave. Si no está disponible, utiliza la instalación manual de la clave o la alternativa generate-pct a través del host PVE.", "requirementsTitle": "Requisitos en el servidor", "requirementsRows": [ { @@ -101,18 +101,18 @@ "minimalSetupTitle": "Setup mínimo del servidor", "minimalSetupBody": "En un servidor Borg Debian o Ubuntu, un baseline funcional son cuatro comandos como root:", "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", - "minimalSetupNote": "Tras esto, el modo generate-auto de ProxMenux puede conectarse usando la contraseña del usuario borg una vez, instalar su propia clave SSH, y cada copia posterior usa esa clave. No hace falta más configuración en el servidor — la clave se restringe a sí misma a borg serve sobre esa ruta." + "minimalSetupNote": "Con el servidor preparado y la autenticación SSH por contraseña disponible, generate-auto instala la clave mediante una cuenta que pueda escribir en authorized_keys del usuario borg. Las copias posteriores usan esa clave, restringida a borg serve en la ruta configurada. Si no hay acceso por contraseña, instala la clave manualmente o usa la alternativa a través del host PVE." }, "sshAuth": { "heading": "Autenticación SSH (lado cliente)", "intro": "Los repositorios Borg remotos se acceden vía SSH. La conexión va desde el host ProxMenux a una cuenta de usuario en el servidor Borg que ejecuta borg serve. Ese usuario se llama típicamente borg, NO el usuario admin/root del servidor — la línea de comando de borg-serve bloquea la conexión a esa ruta concreta del repositorio (ver las estrategias de clave más abajo).", - "strategiesTitle": "Las cuatro estrategias de clave", - "strategiesIntro": "Al añadir un destino remoto, ProxMenux pregunta por el usuario SSH, host y ruta remota, y a continuación pregunta cómo autenticar. Cuatro modos:", + "strategiesTitle": "Estrategias de clave SSH", + "strategiesIntro": "Al añadir un destino remoto, ProxMenux pide el usuario SSH, el host y la ruta remota, y ofrece cuatro opciones de autenticación. Si se rechaza la autenticación por contraseña, también ofrece generate-pct. Los modos se describen a continuación:", "strategyRows": [ { "mode": "generate-auto", "label": "Recomendado", - "detail": "ProxMenux genera una nueva keypair ed25519 en ~/.ssh/borg_proxmenux_HOST_ed25519, y a continuación usa sshpass para hacer login UNA VEZ en el servidor con la contraseña de admin y añadir la clave pública a ~borg/.ssh/authorized_keys. La contraseña de admin se usa sólo para esa única llamada — nunca se almacena." + "detail": "ProxMenux genera o reutiliza un par de claves ed25519 en ~/.ssh/borg_proxmenux_HOST_ed25519 y usa sshpass para probar el acceso e instalar la clave pública en ~borg/.ssh/authorized_keys. La contraseña es de una cuenta que pueda escribir ese archivo, normalmente root o el usuario borg. Se utiliza durante la configuración y no se guarda." }, { "mode": "generate-manual", @@ -153,11 +153,11 @@ "content": "Passphrase del destino con el NAME dado arriba (chmod 600). Sólo está presente si el usuario eligió cifrado repokey." } ], - "outro": "Guardar es opcional — el usuario puede rechazar el prompt de guardado para una copia puntual que no deje credenciales en el host." + "outro": "Guardar el destino es opcional. Si se rechaza, no se guarda la configuración del destino con nombre, pero no se elimina una clave SSH generada. Si se activa repokey sin guardar el destino, ProxMenux guarda igualmente la frase de contraseña en el archivo heredado borg-pass.txt." }, "encryption": { "heading": "Cifrado", - "body": "Los repositorios se inicializan con un modo de cifrado vía hb_borg_init_if_needed: borg repo-create -e MODE en versiones modernas, o el legacy borg init --encryption=MODE. ProxMenux expone dos modos: repokey (por defecto) y none. En modo repokey, Borg almacena la clave de cifrado dentro del propio repositorio; el acceso requiere una passphrase, que ProxMenux pregunta dos veces con validación de coincidencia y guarda en borg-pass-NAME.txt. Un diálogo de reconocimiento obligatorio se muestra tras guardar la passphrase: la passphrase es la única manera de acceder a los archivos cifrados, y perderla hace irrecuperable todo archivo del repositorio." + "body": "Los repositorios se inicializan con un modo de cifrado vía hb_borg_init_if_needed: borg repo-create -e MODE en versiones modernas, o el legacy borg init --encryption=MODE. ProxMenux expone dos modos: repokey (por defecto) y none. En modo repokey, Borg almacena la clave de cifrado dentro del propio repositorio; el acceso requiere una passphrase, que ProxMenux pregunta dos veces con validación de coincidencia y guarda en borg-pass-NAME.txt para destinos guardados, o en el archivo heredado descrito antes. Un diálogo de reconocimiento obligatorio se muestra tras guardar la passphrase: la passphrase es la única manera de acceder a los archivos cifrados, y perderla hace irrecuperable todo archivo del repositorio." }, "runtimeEnv": { "heading": "Entorno de ejecución", @@ -165,8 +165,8 @@ "rows": [ { "var": "BORG_RSH", - "value": "ssh -i SSH_KEY_PATH -o StrictHostKeyChecking=accept-new", - "purpose": "El comando de shell remoto que Borg usa para repositorios servidos por SSH. Se fija sólo cuando se seleccionó una clave personalizada; en caso contrario queda sin definir para que Borg use la configuración SSH por defecto." + "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", + "purpose": "Comando de shell remoto que Borg utiliza para repositorios SSH. Elegir una clave añade las opciones de identidad; un puerto distinto del predeterminado añade -p PORT. Sin clave personalizada y con el puerto predeterminado, la variable queda sin definir y Borg usa la configuración SSH del host." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/es/docs/backup-restore/destinations/index.json b/web/messages/es/docs/backup-restore/destinations/index.json index 1965649f..1b4d14c6 100644 --- a/web/messages/es/docs/backup-restore/destinations/index.json +++ b/web/messages/es/docs/backup-restore/destinations/index.json @@ -10,7 +10,7 @@ "header": { "title": "Destinos", "description": "Los tres backends de almacenamiento soportados por ProxMenux Backup: archivo local, Proxmox Backup Server (recomendado) y Borg. Cada uno recibe el mismo archivo de tres bloques; se diferencian en formato de almacenamiento, deduplicación, modelo de cifrado y requisitos de red.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "intro": { "title": "El mismo contenido, tres backends", @@ -29,8 +29,8 @@ { "feature": "Compresión", "local": "zstd (nivel por defecto) mediante tar --zstd. Fallback a gzip.", - "pbs": "Gestionada por PBS. El cliente envía sin comprimir; el servidor chunkiza + comprime.", - "borg": "La integrada de Borg (lz4 por defecto). Configurable al inicializar el repo." + "pbs": "La gestiona proxmox-backup-client. ProxMenux no modifica las opciones de compresión.", + "borg": "La compresión integrada de Borg. ProxMenux ejecuta borg create sin modificar las opciones de compresión." }, { "feature": "Deduplicación", @@ -69,20 +69,20 @@ "borg": "Requiere borg + la ruta del repositorio + la passphrase (si está cifrado)." } ], - "captionCode": "Característica", + "captionCode": "feature", "captionLocal": "Local", "captionPbs": "Proxmox Backup Server (recomendado)", "captionBorg": "Borg" }, "sameArchive": { "heading": "El contenido interno de la copia es el mismo en cualquier destino", - "body": "Con independencia de dónde se guarde la copia, dentro siempre están los mismos tres bloques descritos en Cómo funciona: el sistema de ficheros (rootfs/), los metadatos (metadata/) y el manifiesto (manifest.json). Al extraer una copia local .tar.zst, restaurar un archivo .pxar desde PBS o descomprimir un archivo Borg, el árbol de directorios resultante es idéntico en los tres casos. Esto significa que el proceso de restauración lee siempre los mismos ficheros y no le importa desde qué destino provenga la copia." + "body": "Los tres destinos contienen la misma estructura rootfs/ + metadata/ + manifest.json descrita en Cómo funciona. Extraer un .tar.zst de un archivo local, restaurar un .pxar desde PBS o extraer un archivo de Borg con borg extract produce el mismo árbol de directorios. El proceso de restauración (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) lee los mismos tres componentes sin necesitar saber de qué destino proceden." }, "extractStandalone": { "heading": "Extraer una copia fuera de ProxMenux", "intro": "Cualquiera de los tres formatos de archivo se puede leer con herramientas estándar sin tener ProxMenux instalado en el host de lectura. Los comandos siguientes producen el mismo árbol de directorios que consume internamente una restauración.", - "localCmd": "# Desde un archivo local .tar.zst:\ntar --zstd -xf hostcfg-HOST-TIMESTAMP.tar.zst\n\n# Desde el fallback .tar.gz:\ntar -xzf hostcfg-HOST-TIMESTAMP.tar.gz", - "pbsCmd": "# Desde un backup PBS (requiere 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# Añadir --keyfile KEY-PATH cuando el backup está cifrado.", + "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": "# Desde un archivo Borg (requiere el binario borg + passphrase si hay cifrado):\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# Sobre un repo servido por SSH:\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME", "note": "El árbol extraído puede inspeccionarse manualmente o alimentar una restauración manual. Consulta las páginas de cada destino para conocer el flujo exacto de recuperación que ProxMenux utiliza por dentro." }, diff --git a/web/messages/es/docs/backup-restore/destinations/local.json b/web/messages/es/docs/backup-restore/destinations/local.json index e99f5190..c53790cc 100644 --- a/web/messages/es/docs/backup-restore/destinations/local.json +++ b/web/messages/es/docs/backup-restore/destinations/local.json @@ -10,7 +10,7 @@ "header": { "title": "Archivo local", "description": "El destino local escribe un único archivo tar comprimido en cualquier directorio escribible del host: un disco interno, un montaje NFS o SMB, o una unidad USB.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "intro": { "title": "Un solo fichero, autocontenido", @@ -31,17 +31,17 @@ "statesTitle": "Los tres estados del dispositivo", "stateRows": [ { - "state": "mounted", - "shown": "Tamaño · label · [fstype] · → /punto/de/montaje", + "state": "montado", + "shown": "Tamaño · etiqueta · [fstype] · → /mount/point", "action": "La partición ya está montada en algún sitio. Seleccionarla persiste ese punto de montaje como destino local. No se realiza ningún montaje." }, { - "state": "unmounted", + "state": "sin montar", "shown": "Tamaño · label · [fstype] · (no montada — se montará)", "action": "Hay un filesystem pero no está montado. Al confirmar, ProxMenux ejecuta hb_mount_usb_partition: crea /mnt/backup-LABEL (o una ruta basada en UUID si no hay label), monta la partición y persiste el punto de montaje como destino local." }, { - "state": "empty", + "state": "vacía", "shown": "Tamaño · disco USB en crudo — sin filesystem (se FORMATEARÁ)", "action": "El dispositivo no tiene filesystem. Camino destructivo — protegido por dos confirmaciones. Primero un diálogo Yes/No explica que la operación borrará el disco. Después una caja de entrada obliga al usuario a escribir la ruta exacta del dispositivo (por ejemplo /dev/sdb) antes de que ProxMenux cree una partición GPT + ext4 fresca y la monte." } @@ -50,7 +50,7 @@ }, "safetyCheck": { "heading": "Chequeo de seguridad — destino dentro de una ruta copiada", - "body": "Antes de escribir el archivo, _bk_local verifica que el directorio de destino no sea un subcamino de ninguno de los directorios que se están copiando. Un footgun habitual sería añadir /root al perfil y elegir /root/backups como destino — el archivo se incluiría a sí mismo, produciendo o bien un archivo corrupto o bien crecimiento sin límite hasta llenar el disco. El chequeo resuelve ambos caminos con readlink -m, los compara y, si hay conflicto, aborta la copia con un diálogo que nombra la ruta en conflicto y lista tres formas de resolverlo: elegir un destino fuera de la ruta en conflicto, eliminar la entrada personalizada que contiene el destino, o usar modo Custom para desmarcar la ruta en conflicto en esa ejecución." + "body": "Antes de escribir el archivo, _bk_local verifica que el directorio de destino no sea un subcamino de ninguno de los directorios que se están copiando. Un error habitual sería añadir /root al perfil y elegir /root/backups como destino — el archivo se incluiría a sí mismo, produciendo o bien un archivo corrupto o bien crecimiento sin límite hasta llenar el disco. El chequeo resuelve ambos caminos con readlink -m, los compara y, si hay conflicto, aborta la copia con un diálogo que nombra la ruta en conflicto y lista tres formas de resolverlo: elegir un destino fuera de la ruta en conflicto, eliminar la entrada personalizada que contiene el destino, o usar modo Custom para desmarcar la ruta en conflicto en esa ejecución." }, "archiveFormat": { "heading": "Formato de archivo y compresión", diff --git a/web/messages/es/docs/backup-restore/destinations/pbs.json b/web/messages/es/docs/backup-restore/destinations/pbs.json index 917cc76d..18686262 100644 --- a/web/messages/es/docs/backup-restore/destinations/pbs.json +++ b/web/messages/es/docs/backup-restore/destinations/pbs.json @@ -1,7 +1,7 @@ { "meta": { "title": "Destino Proxmox Backup Server — repositorio, cifrado, recuperación | ProxMenux", - "description": "El destino PBS escribe las copias de host de ProxMenux como backups PBS. Documenta la auto-detección del repositorio desde /etc/pve/storage.cfg, la configuración manual de PBS, el comando de subida .pxar, el modelo de cifrado por keyfile del lado del cliente, el blob de escrow con passphrase de recuperación, y la recuperación del keyfile desde PBS en instalaciones frescas.", + "description": "El destino PBS guarda las copias del host de ProxMenux como copias PBS. Explica la detección de repositorios desde /etc/pve/storage.cfg, la configuración manual, la subida de .pxar, el cifrado con archivo de clave en el cliente y su custodia opcional protegida por una frase de contraseña, y la recuperación de la clave desde varias fuentes en un host recién instalado.", "ogTitle": "ProxMenux Backup — destino Proxmox Backup Server", "ogDescription": "Cómo escribe ProxMenux las copias de host en Proxmox Backup Server con cifrado por keyfile del lado del cliente y escrow de recuperación.", "twitterTitle": "Destino PBS de copia | ProxMenux", @@ -9,8 +9,8 @@ }, "header": { "title": "Proxmox Backup Server", - "description": "El destino PBS sube la raíz de staging como un único backup .pxar a un datastore de Proxmox Backup Server, con cifrado opcional por keyfile del lado del cliente y escrow automático de una passphrase de recuperación para recuperación tras reinstalación.", - "section": "Backup & Restore" + "description": "El destino PBS sube todo el directorio de preparación como una única copia .pxar a un datastore de Proxmox Backup Server. Permite cifrarla en el cliente con un archivo de clave y, de forma opcional, subir junto a cada copia una copia de la clave protegida por una frase de contraseña para recuperarla después.", + "section": "Copias de seguridad y restauración" }, "recommendedBadge": "Destino recomendado", "aboutPbs": { @@ -23,7 +23,7 @@ }, "repoSelection": { "heading": "Selección del repositorio", - "intro": "ProxMenux descubre repositorios PBS desde dos fuentes en cada copia. El usuario elige uno desde un menú unificado; esa elección determina, para esa ejecución concreta, contra qué servidor y datastore se envía la copia, con qué contraseña se autentica y con qué huella (fingerprint) valida el certificado.", + "intro": "ProxMenux descubre los repositorios de PBS a partir de dos fuentes en cada copia de seguridad. El usuario elige uno en un menú unificado; esa elección determina los valores de HB_PBS_REPOSITORY, HB_PBS_SECRET y HB_PBS_FINGERPRINT para esa ejecución.", "sourceRows": [ { "source": "storage.cfg de Proxmox (auto-descubierto)", @@ -41,12 +41,12 @@ }, "backupCommand": { "heading": "El comando de copia", - "intro": "La subida es una única invocación de proxmox-backup-client backup. ProxMenux la ejecuta dentro de un envoltorio env para que las credenciales nunca aparezcan en la lista de argumentos del proceso.", + "intro": "La subida se realiza con una única invocación de proxmox-backup-client backup. ProxMenux utiliza env para pasar al cliente la contraseña, la contraseña de cifrado y el fingerprint como variables de entorno.", "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": "Nombrado del backup ID", "backupIdBody": "El backup ID por defecto es hostcfg-HOSTNAME. Se pide al usuario que lo confirme o edite antes de la subida; cualquier carácter fuera de [A-Za-z0-9_-] se elimina y los guiones finales se recortan. Reutilizar el mismo ID entre ejecuciones es intencional — PBS trata el ID como un grupo, y cada copia posterior aparece como un nuevo backup dentro de ese grupo, compartiendo dedup con las ejecuciones previas.", "pxarTitle": "Qué se incluye dentro del archivo .pxar", - "pxarBody": "Al construir el archivo .pxar se empaqueta el directorio de trabajo completo: el sistema de ficheros del host (rootfs/), los metadatos (metadata/) y el manifiesto (manifest.json). Al restaurar, ProxMenux compara la información del manifiesto con la del host destino para detectar si son equivalentes, si cambia el hardware o si se trata de un equipo distinto, y ajustar el proceso en consecuencia. Las copias antiguas —hechas con versiones anteriores de ProxMenux que empaquetaban solo el sistema de ficheros— siguen restaurándose sin problema: el flujo de restauración detecta ese formato heredado y lo reorganiza automáticamente." + "pxarBody": "El origen del .pxar es todo el directorio staging_root, con rootfs/, metadata/ y manifest.json juntos. Las versiones anteriores utilizaban $staging_root/rootfs como origen; esto dejaba metadata/ fuera del archivo y la comprobación de compatibilidad de la restauración no tenía datos que leer, por lo que mostraba advertencias de restauración entre hosts incluso al restaurar en el mismo host. Las copias antiguas creadas solo a partir de rootfs siguen restaurándose correctamente mediante la rama del caso 3 de _rs_check_layout, que vuelve a colocar el árbol plano etc/var/root/usr dentro de una estructura rootfs/." }, "encryption": { "heading": "Cifrado del lado del cliente", @@ -61,19 +61,19 @@ "modesSharedTitle": "Clave compartida (importar la misma en cada host)", "modesSharedBody": "Se genera una única clave y se importa en todos los hosts mediante la opción Usar una clave existente. La gestión es más sencilla: hay un solo secreto que proteger, y cualquier host puede leer las copias de cualquier otro (útil para verificación centralizada, ejercicios de restauración cruzada o consolidación). A cambio, si la clave compartida se filtra queda expuesto todo el conjunto de hosts a la vez. Recomendado para laboratorios personales y entornos donde todos los hosts pertenecen al mismo responsable y comparten el mismo nivel de confianza.", "recoveryTitle": "¿Subir la clave a PBS? — el usuario decide", - "recoveryBody": "Justo después de elegir la clave, ProxMenux pregunta si se quiere subir una copia de esa clave a PBS como red de seguridad, con dos opciones. No (por defecto) mantiene la clave solo en el host; ProxMenux no toca PBS con nada relacionado con la recuperación y el usuario gestiona por su cuenta la copia externa (desde el Monitor, la acción Descargar en la fila del destino PBS la exporta en el acto). Sí pide una passphrase de recuperación —dos veces, para comprobar que coincidan—; con esa passphrase, la clave se envuelve localmente con AES-256-CBC y PBKDF2 (600 000 iteraciones, sal aleatoria) en un fichero pbs-key.recovery.enc. A partir de ese momento, cada copia cifrada sube también ese fichero envuelto a PBS. Ni la passphrase ni la clave en claro salen del host. La respuesta se puede cambiar después desde el Monitor en cualquier momento; el interruptor está inline en la fila del destino PBS y el botón que aparece se adapta al estado (empezar a subir, dejar de subir, o cambiar la passphrase).", + "recoveryBody": "Justo después de elegir la clave, ProxMenux pregunta ¿Subir la clave a PBS?, con dos respuestas. No se sube ningún artefacto de recuperación a PBS hasta que el usuario responde Sí. Por defecto se elige No, mantener solo en local: la clave queda en su ruta canónica, ProxMenux no sube artefactos de recuperación a PBS y el usuario se encarga de guardarla fuera del host. El botón Descargar archivo de clave del Monitor, en la fila del destino PBS, permite obtenerla cuando se necesite. Al elegir Sí, subir, se pide dos veces una frase de contraseña de recuperación y se comprueba que coincidan. ProxMenux protege la clave con AES-256-CBC y PBKDF2 (600.000 iteraciones y sal aleatoria) para generar pbs-key.recovery.enc. Cada copia cifrada posterior sube esa envoltura a PBS como un grupo de copias asociado. En estas subidas no se envían a PBS ni la frase de contraseña ni la clave en texto claro. La elección puede cambiarse en cualquier momento desde el Monitor: el control de custodia de la fila del destino permite elegir Sí o No y aplicar inmediatamente Iniciar subida, Detener subida o Actualizar frase de contraseña, según el estado.", "blobUploadTitle": "Grupo emparejado en PBS", - "blobUploadBody1": "Cuando el usuario ha respondido Sí, ProxMenux sube el sobre de recuperación a PBS después de cada copia cifrada como un segundo grupo emparejado, con el mismo nombre que el del host pero terminado en -keyrecovery. Los dos grupos aparecen juntos en el listado del datastore: uno con las copias del host, otro con los sobres. El sobre nunca sale del host en claro: se cifra en el host con AES-256-CBC y PBKDF2 antes de enviar un solo byte (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS solo recibe el sobre ya cifrado.", + "blobUploadBody1": "Cuando la custodia está configurada como Sí, subir, ProxMenux sube el archivo de recuperación protegido a PBS después de cada copia cifrada. Lo guarda en un segundo grupo de copia asociado, con el mismo nombre que el grupo del host y el sufijo -keyrecovery. Los dos grupos aparecen juntos en la lista del almacén de datos: uno para las copias del host y otro para los archivos de recuperación. El archivo de recuperación nunca sale del host en texto plano: se cifra en el propio host con AES-256-CBC y PBKDF2 antes de enviar ningún dato (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS solo recibe el archivo ya cifrado.", "envelopeSecurityTitle": "¿No es un riesgo subir el archivo keyrecovery a PBS?", "envelopeSecurityBody": "El sobre viaja y se guarda cifrado en todo momento. La passphrase de recuperación no sale nunca del host: el cifrado ocurre en local antes de la subida y PBS solo recibe el resultado ya cifrado. Un administrador de PBS —o cualquiera con acceso al datastore— puede descargar el sobre, pero sin la passphrase no puede leer la clave que contiene: son solo bytes cifrados. Para reconstruir la clave hacen falta las dos cosas a la vez, el sobre y la passphrase, y solo el usuario tiene ambas.", "blobUploadConstraintTitle": "Por qué dos grupos y no uno solo cifrado", - "blobUploadConstraintBody": "Cada subida de proxmox-backup-client backup cifra todos sus archivos con la misma clave —o ninguno—. No hay opción intermedia. La copia del host tiene que ir cifrada con la clave. El sobre de recuperación no puede viajar en esa misma subida: quedaría cifrado con la clave que precisamente contiene, y en un equipo recién reinstalado no habría manera de abrirlo (haría falta la clave para descifrar la clave). Por eso salen dos subidas independientes y aparecen dos grupos separados: la copia del host la cifra PBS con la clave, y el sobre lo cifra ProxMenux con la passphrase antes de subirlo. Dos capas de cifrado distintas para dos cosas distintas.", + "blobUploadConstraintBody": "Una invocación de proxmox-backup-client backup cifra todos sus archivos con la misma clave o no cifra ninguno; no permite mezclar ambos casos. La copia del host se cifra con su archivo de clave, pero la envoltura de recuperación no puede acompañarla en la misma subida porque acabaría cifrada con la propia clave que contiene. En un host recién reinstalado sería imposible abrirla: haría falta la clave para descifrar esa misma clave. Por eso los dos artefactos se suben por separado y aparecen en dos grupos: el cliente PBS cifra la copia del host con el archivo de clave y ProxMenux cifra la envoltura con la frase de contraseña antes de subirla. Dos capas de cifrado distintas protegen dos elementos diferentes.", "blobUploadImageAlt": "Interfaz de PBS mostrando los grupos hostcfg-HOSTNAME y hostcfg-HOSTNAME-keyrecovery adyacentes en el listado del datastore.", "blobUploadImageCaption": "Interfaz de PBS — los grupos de copia emparejados. El grupo principal contiene las copias del host; el grupo -keyrecovery contiene la clave envuelta con la passphrase.", "recoverTitle": "Recuperación en un equipo recién instalado", "recoverBody": "Cuando la clave no está en su sitio —tras reinstalar el host desde cero o después de eliminarla a propósito— el flujo de restauración prueba tres fuentes en orden y se queda con la primera que produce una clave usable. Primero, si el repositorio PBS elegido tiene una clave gestionada por PVE en /etc/pve/priv/storage/<NAME>.enc, se copia sola a la ruta canónica. Segundo, si en PBS hay un grupo -keyrecovery, se descarga la copia más reciente y se pide la passphrase de recuperación para abrirla. Tercero, si ninguna de las dos anteriores funciona o el usuario las descarta, el diálogo pide la ruta absoluta donde ha dejado la clave en este host, y se copia a la ruta canónica. El Monitor expone el mismo flujo dentro del modal de la copia. Si al Restaurar, Descargar o Ver contenido falta la clave, aparece un panel ámbar arriba del modal con las mismas tres vías de importación. Si la clave está instalada pero no es la correcta para esa copia, PBS devuelve un error de tipo wrong key — manifest's key XX does not match provided key YY y el modal muestra un panel estructurado con el fingerprint que PBS espera (el que quedó grabado en el manifest de la copia), para que el usuario sepa qué clave concreta necesita importar.", "monitorManagementTitle": "Gestionar la clave desde el Monitor", - "monitorManagementBody": "En la página de configuración de copias, la fila de cada destino PBS incluye los controles de la clave. Tres acciones directas: Descargar exporta la clave actual al navegador. Subir reemplaza la clave instalada por otra que aporta el usuario (la anterior solo se sobrescribe cuando la nueva ha llegado correctamente a su sitio). Eliminar retira la clave del host. Justo al lado está el interruptor del sobre de recuperación: un Sí/No para subir o no la clave a PBS, un campo de passphrase que aparece al elegir Sí, y un botón que se adapta al estado actual (empezar a subir, dejar de subir, o cambiar la passphrase). Los controles del Monitor y el diálogo del shell hacen lo mismo por dentro, así que el resultado en disco y en PBS es idéntico se use la que se use." + "monitorManagementBody": "El Monitor muestra los controles del archivo de clave en cada fila de destino PBS de la página de configuración de copias. Hay tres acciones: Descargar envía el archivo de clave actual al navegador del usuario; Subir sustituye el archivo de clave instalado por uno proporcionado por el usuario (el anterior solo se sobrescribe cuando el nuevo se ha guardado correctamente en la ruta canónica); y Eliminar borra el archivo de clave del host. Junto a estas acciones hay un único control de custodia para la recuperación: las opciones Sí y No de ¿Subir la clave a PBS?, un campo para la frase de contraseña al elegir Sí y un botón contextual para aplicar el cambio, con el texto Iniciar subida, Detener subida o Actualizar frase de contraseña según el estado actual. Todas las acciones utilizan los mismos endpoints de Flask que el menú de terminal, por lo que el resultado en disco y el estado en PBS son idénticos desde ambas interfaces." }, "restoreAccess": { "heading": "Recuperación del lado de la restauración", @@ -96,7 +96,7 @@ { "label": "Cifrado del lado del cliente", "href": "https://pbs.proxmox.com/docs/backup-client.html#encryption", - "tail": " — creación del keyfile, modos --kdf, el modelo de cifrado que ProxMenux extiende con un escrow de passphrase." + "tail": " — creación del archivo de clave, modos --kdf y modelo de cifrado que ProxMenux amplía con una copia de recuperación protegida por frase de contraseña." }, { "label": "Gestión de datastores", diff --git a/web/messages/es/docs/backup-restore/glossary.json b/web/messages/es/docs/backup-restore/glossary.json index c96e29a7..ce517b0d 100644 --- a/web/messages/es/docs/backup-restore/glossary.json +++ b/web/messages/es/docs/backup-restore/glossary.json @@ -10,7 +10,7 @@ "header": { "title": "Glosario", "description": "Términos que aparecen a lo largo de la documentación de copia y restauración, con su definición.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "intro": { "body": "Los términos están agrupados por temas. Cada entrada incluye una definición breve." @@ -23,43 +23,36 @@ { "id": "passphrase-recuperacion", "term": "Passphrase de recuperación", - "also": "recovery passphrase", "def": "Contraseña de texto que elige el usuario para proteger el sobre de recuperación. Se pide dos veces con validación de coincidencia y solo se usa para cifrar el sobre y para descifrarlo si algún día hay que recuperar la clave. No sirve para desbloquear la clave del keyfile ni se envía nunca a PBS. Nunca sale del host durante una copia normal." }, { "id": "clave-cifrado", "term": "Clave de cifrado (keyfile)", - "also": "keyfile, PBS encryption key", - "def": "Fichero binario que Proxmox Backup Server utiliza para cifrar los chunks de la copia antes de subirlos. Sin ese fichero, ninguna copia cifrada puede leerse. ProxMenux lo guarda en /usr/local/share/proxmenux/pbs-key.conf con permisos 600. Es el activo que hay que proteger; el sobre de recuperación existe precisamente para poder rescatar este fichero si se pierde." + "def": "Archivo de clave que proxmox-backup-client usa para cifrar los chunks antes de subirlos a PBS. Sin la clave correspondiente no se leen los datos cifrados. ProxMenux lo guarda en /usr/local/share/proxmenux/pbs-key.conf con modo 600. Protégelo: el sobre de recuperación permite recuperarlo si se pierde." }, { "id": "contrasena-keyfile", "term": "Contraseña de la clave (KDF passphrase)", - "also": "keyfile passphrase, scrypt passphrase", "def": "Contraseña opcional que puede llevar la propia clave, distinta de la passphrase de recuperación. Solo aparece si la clave se creó con --kdf scrypt (una clave importada de otro sitio, por ejemplo). Sin ella, la clave no se puede desbloquear en cada uso. ProxMenux la persiste cifrada en el host para que las copias programadas puedan ejecutarse sin diálogo interactivo." }, { "id": "sobre-recuperacion", "term": "Sobre de recuperación", - "also": "recovery envelope, escrow blob, pbs-key.recovery.enc", "def": "La propia clave de cifrado envuelta en una capa adicional: se cifra con la passphrase de recuperación mediante AES-256-CBC y PBKDF2 antes de salir del host. Es lo que se sube a PBS en el grupo -keyrecovery. Sin la passphrase, el sobre es opaco: descargarlo desde PBS no revela la clave." }, { "id": "cifrado-cliente", "term": "Cifrado del lado del cliente", - "also": "client-side encryption", "def": "Modelo en el que los datos se cifran en el host de origen antes de subirse. PBS solo recibe y almacena datos cifrados; ni siquiera un administrador de PBS con acceso al datastore puede leerlos sin la clave. ProxMenux se apoya en este modelo y añade el sobre de recuperación encima." }, { "id": "kdf-none", "term": "--kdf none", - "also": "clave sin contraseña", "def": "Opción de proxmox-backup-client key create que genera una clave sin contraseña asociada. La clave se puede usar directamente sin ningún diálogo, lo que es imprescindible para que los trabajos programados corran de forma desatendida. Es lo que ProxMenux usa por defecto al generar una clave nueva." }, { "id": "kdf-scrypt", "term": "--kdf scrypt", - "also": "clave con contraseña", "def": "Opción de proxmox-backup-client key create que genera una clave protegida con una contraseña de la clave. Cada vez que se usa la clave hay que desbloquearla con esa contraseña. ProxMenux acepta este tipo de claves al importarlas y guarda la contraseña cifrada para que las copias programadas puedan correr sin intervención." }, { @@ -112,11 +105,11 @@ { "id": "repositorio-pbs", "term": "Repositorio PBS", - "def": "Combinación de servidor Proxmox Backup Server + datastore + usuario al que se suben las copias. Se identifica con el formato usuario@realm@host:datastore. Un mismo servidor PBS puede alojar varios repositorios." + "def": "Combinación de servidor Proxmox Backup Server + datastore + usuario al que se suben las copias. Se identifica con el formato user@realm@host:datastore. Un mismo servidor PBS puede alojar varios repositorios." }, { "id": "datastore", - "term": "Datastore", + "term": "almacén de datos", "def": "Almacén concreto dentro de un servidor PBS donde se guardan las copias y sus chunks. Cada datastore vive sobre un sistema de ficheros del servidor PBS y tiene sus propios permisos y políticas." }, { @@ -136,7 +129,7 @@ }, { "id": "backup-id", - "term": "Backup ID", + "term": "ID del backup", "def": "Nombre del grupo de copia. ProxMenux propone por defecto hostcfg-HOSTNAME y permite editarlo antes de la subida; los caracteres no admitidos se limpian automáticamente." }, { @@ -152,8 +145,8 @@ "entries": [ { "id": "runner", - "term": "Runner", - "def": "Script run_scheduled_backup.sh que ejecuta una copia programada. Lee la configuración del trabajo, lanza el backend correspondiente (Local, PBS o Borg), aplica la retención al terminar y envía las notificaciones configuradas." + "term": "Ejecutor", + "def": "Script run_scheduled_backup.sh que ejecuta una copia programada. Lee la configuración del trabajo, lanza el backend correspondiente (Local, PBS o Borg), aplica la retención tras completarse con éxito y envía las notificaciones configuradas." }, { "id": "trabajo-programado", @@ -163,7 +156,7 @@ { "id": "modo-adjunto", "term": "Modo adjunto (attach mode)", - "def": "Trabajo programado que no lleva horario propio; se dispara automáticamente cada vez que una tarea vzdump de PVE existente se ejecuta. Hereda el horario y la retención de esa tarea padre. Solo compatible con destinos Local y PBS." + "def": "Trabajo sin timer propio. Un hook job-end de vzdump lo ejecuta después de las copias de invitados cuando coincide el almacenamiento. El padre seleccionado aporta destino y retención inicial, pero el hook compara almacenamiento, no ID de tarea padre; otra tarea con el mismo destino también puede activarlo. Solo para Local y PBS." }, { "id": "timer-systemd", @@ -203,13 +196,12 @@ }, { "id": "compatibility-check", - "term": "Compatibility check", + "term": "Verificación de compatibilidad", "def": "Comparación entre el manifiesto del origen y el estado del destino que ProxMenux realiza al principio de la restauración. Decide qué partes se copian verbatim, cuáles necesitan hidratación y cuáles se recrean desde el instalador." }, { "id": "equipo-recien-instalado", "term": "Equipo recién instalado", - "also": "fresh install", "def": "Host acabado de reinstalar desde cero, sin la clave de cifrado local. Para restaurar copias cifradas hace falta primero recuperar la clave desde el sobre almacenado en PBS, con la passphrase de recuperación." } ] diff --git a/web/messages/es/docs/backup-restore/how-it-works.json b/web/messages/es/docs/backup-restore/how-it-works.json index 0c5ec8c7..877fbaa4 100644 --- a/web/messages/es/docs/backup-restore/how-it-works.json +++ b/web/messages/es/docs/backup-restore/how-it-works.json @@ -10,23 +10,23 @@ "header": { "title": "Cómo funciona", "description": "Desglose interno de una copia de seguridad creada con ProxMenux — sistema de ficheros, manifiesto e inventario de aplicaciones — y cómo la restauración consume los tres para reproducir el host de origen sobre un destino que puede no compartir el mismo kernel.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "intro": { "title": "Un archivo, tres bloques", - "body": "Cada copia produce un layout de directorio con tres bloques bien definidos bajo una única raíz de staging. El archivo que se sube al destino (archivo local .tar.zst, backup PBS o archivo Borg) contiene ese layout exacto. La restauración lee los tres bloques de forma independiente, en un orden concreto que garantiza la corrección: primero se copia el rootfs —el sistema de archivos raíz del host— para colocar la configuración, después se consulta el manifiesto para detectar drift y decidir qué omitir, y finalmente el inventario de aplicaciones dirige la pasada de reinstalación post-arranque. No hay dependencias entre bloques — cada uno puede inspeccionarse o extraerse de forma independiente." + "body": "Cada copia produce una estructura con tres bloques definidos bajo un único directorio de preparación. El archivo subido al destino (.tar.zst local, copia PBS o archivo Borg) contiene esa misma estructura. La restauración utiliza los tres: consulta el manifiesto antes de aplicar cambios para detectar diferencias y decidir qué omitir; rootfs aporta los archivos de configuración, que se aplican en vivo o tras el reinicio; y el inventario de aplicaciones dirige la instalación de paquetes y la reinstalación de componentes después del arranque. Cada bloque puede inspeccionarse o extraerse de forma independiente." }, "layout": { "heading": "Layout del archivo", "intro": "Cada archivo respeta el mismo layout con independencia del destino. El subdirectorio metadata/ contiene los bloques estructurados; el subdirectorio rootfs/ contiene la copia del sistema de ficheros.", "treeCaption": "El directorio de staging generado durante una copia. Todos los destinos reciben el mismo árbol (adaptado a su formato nativo: tar para local, chunks PBS para PBS, segmentos borg para Borg).", - "tree": "backup-[timestamp]/\n├── manifest.json # estado estructurado del host\n├── metadata/\n│ ├── packages.manual.list # apt-mark showmanual\n│ ├── run_info.env # identidad de la ejecución + versión del kernel + método pmxcfs\n│ ├── paths_archived.txt # lista exacta de rutas que llegaron a rootfs/\n│ └── missing_paths.txt # rutas del perfil ausentes en el origen\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, …\n ├── root/ # /root (con subdirs volátiles excluidos)\n ├── usr/local/ # /usr/local/bin, /usr/local/share/proxmenux, …\n └── var/ # /var/lib/pve-cluster (config.db vía sqlite3 .backup), /var/spool/cron/…" + "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│ ├── paths_archived.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": "El bloque rootfs", "intro": "El árbol rootfs/ es una copia plana del sistema de ficheros producida por rsync desde el host de origen. Contiene un perfil por defecto curado de rutas que importan para una restauración de Proxmox, más cualquier ruta personalizada añadida por el usuario al trabajo de copia o a la sesión interactiva. El conjunto es intencionadamente estrecho: solamente rutas que contienen configuración o contienen estado que Proxmox no puede regenerar por sí solo.", "defaultProfileTitle": "El perfil por defecto", - "defaultProfileBody": "El perfil por defecto está definido por hb_default_profile_paths en lib_host_backup_common.sh. Cubre ocho categorías que en conjunto describen un host Proxmox operativo:", + "defaultProfileBody": "El perfil por defecto se define en hb_default_profile_paths de lib_host_backup_common.sh. Incluye ocho categorías fijas y, si corresponde, el estado ZFS, que juntas describen un host Proxmox operativo:", "categoriesTitle": "Categorías de rutas", "categoryRows": [ { @@ -121,11 +121,11 @@ } ], "schemaTitle": "Validación por esquema", - "schemaBody": "ProxMenux incluye una plantilla que describe qué campos debe contener el manifiesto y qué forma tiene cada uno. Cuando se genera una copia se puede comprobar automáticamente que el manifiesto respeta esa plantilla, de modo que si un colector produjera un JSON malformado o con un campo mal escrito se detectaría en el momento. Es una comprobación destinada al desarrollo del propio ProxMenux: si el sistema no la tiene instalada, la copia sigue funcionando con normalidad y el manifiesto se genera igual." + "schemaBody": "El manifiesto se valida con scripts/backup_restore/schema/manifest.schema.json. Ejecutar build_manifest.sh --validate activa una validación JSON Schema en Python (requiere python3 y jsonschema). Si el módulo no está instalado, se omite la comprobación sin mostrar ningún aviso: esta validación es principalmente una ayuda para el desarrollo, no una dependencia necesaria durante la ejecución." }, "applications": { "heading": "El inventario de aplicaciones", - "intro": "Dos ficheros bajo metadata/ catalogan todo lo instalado en el origen que no forma parte del conjunto de paquetes base de Proxmox VE. La restauración los utiliza para reproducir el conjunto exacto de software instalado por el usuario en el destino, usando APT o los instaladores propios de ProxMenux según cómo se instalara originalmente el software.", + "intro": "Dos inventarios registran el software añadido al conjunto base de Proxmox VE: la lista de paquetes en metadata/ y el registro de componentes dentro de rootfs, detallados a continuación. La restauración los usa para reproducir el software del usuario con APT o los instaladores de ProxMenux, según cómo se instalara originalmente.", "packagesTitle": "packages.manual.list", "packagesBody": "Una lista de texto plano producida por apt-mark showmanual: todos los paquetes APT que fueron instalados explícitamente en el host de origen, ordenados alfabéticamente. Esto excluye los paquetes instalados como dependencias del ISO base de Proxmox VE (que APT del destino vuelve a traer automáticamente). Es leída por _rs_run_complete_extras durante la restauración, filtrada por un filtro cascade-safe de tres pases (dpkg -s para lo ya instalado, detección de sibling-major para librerías, apt-get install --simulate para riesgo de cascade-remove) y después instalada con apt-get install -y.", "componentsTitle": "components_status.json (parte del rootfs)", diff --git a/web/messages/es/docs/backup-restore/index.json b/web/messages/es/docs/backup-restore/index.json index 7625af0c..81520dd6 100644 --- a/web/messages/es/docs/backup-restore/index.json +++ b/web/messages/es/docs/backup-restore/index.json @@ -4,17 +4,17 @@ "description": "ProxMenux Backup & Restore captura el estado completo de un host Proxmox — sistema de ficheros, manifiesto estructurado de configuración y paquetes/componentes instalados — y lo reproduce en el mismo host o en uno distinto. La copia y la restauración son autocontenidas: sin dependencias externas, y con soporte para restauraciones cross-kernel mediante un filtro direccional de subconjunto seguro y una hidratación kernel-agnóstica.", "ogTitle": "ProxMenux Backup & Restore — Descripción general", "ogDescription": "Copia y restauración completa del host Proxmox VE con manifiesto estructurado, lista de paquetes y reinstaladores de componentes.", - "twitterTitle": "ProxMenux Backup & Restore | ProxMenux", + "twitterTitle": "Copia de seguridad y restauración de ProxMenux | ProxMenux", "twitterDescription": "Copia y restauración completa del host Proxmox VE con manifiesto estructurado, lista de paquetes y reinstaladores de componentes." }, "header": { - "title": "Backup & Restore", + "title": "Copias de seguridad y restauración", "description": "Copia y restauración a nivel de host para Proxmox VE. Captura el sistema de ficheros, la configuración y los componentes instalados en un único archivo y reproduce el host sobre la misma instalación de Proxmox o sobre una distinta, sin dependencias externas.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "intro": { "title": "Qué es, en un párrafo", - "body": "Una copia de ProxMenux captura el estado completo de un host Proxmox: el sistema de ficheros (directorios relevantes bajo /etc, /root, /var/lib/pve-cluster, más rutas personalizadas opcionales), un manifiesto estructurado (JSON con el hardware detectado, los parámetros del kernel, la topología de red, el estado de ZFS, los usuarios y las entradas de cron) y un inventario de aplicaciones (todos los paquetes marcados como instalados manualmente por APT, más la lista de componentes instalados por ProxMenux con sus versiones exactas). Cualquiera de los tres destinos soportados — archivo local, Proxmox Backup Server (recomendado) o Borg — recibe el mismo contenido autocontenido, y cualquiera de ellos puede hidratar el host de destino sin depender de que el origen esté accesible en el momento de la restauración." + "body": "Una copia de ProxMenux recoge el estado completo de un host Proxmox: el sistema de archivos (los directorios pertinentes de /etc, /root y /var/lib/pve-cluster, además de las rutas personalizadas opcionales), un manifiesto estructurado (JSON con el hardware detectado, los parámetros del kernel, la configuración de red, el estado de ZFS, los usuarios y las entradas de cron) y un inventario de aplicaciones (los paquetes que APT marca como instalados manualmente y los componentes instalados por ProxMenux, con sus versiones exactas). Los tres destinos admitidos —archivo local, Proxmox Backup Server (recomendado) y Borg— reciben el mismo contenido autónomo. Cualquiera de ellos permite reconstruir el host de destino sin que el host de origen tenga que estar accesible durante la restauración." }, "video": { "heading": "Vídeo demostración", @@ -24,23 +24,23 @@ }, "whatItIsNot": { "heading": "Qué no es", - "intro": "La sección cubre copia y restauración a nivel de host: la instalación de Proxmox en sí, no las cargas de trabajo que se ejecutan sobre ella.", + "intro": "Esta sección trata de la copia y restauración del host: la instalación de Proxmox, no las aplicaciones y máquinas que se ejecutan sobre ella.", "items": [ - "No es una herramienta de copia de VMs/CTs. Los discos de los invitados y su estado de RAM no se capturan en esta función; para eso está vzdump. Los ficheros de configuración de los invitados (/etc/pve/nodes/<node>/qemu-server/*.conf y lxc/*.conf) sí se capturan, de modo que tras la restauración el inventario de invitados reaparece y sus discos pueden re-adjuntarse desde una copia existente de PBS o local.", - "No es una operación a nivel de clúster. Cada nodo se copia a sí mismo. La pertenencia al clúster se captura como parte de /etc/pve para que un nodo restaurado pueda re-incorporarse al clúster, pero restaurar un clúster completo requiere coordinación por nodo.", - "No es una imagen completa del disco. Los binarios del kernel, el initramfs y la partición de arranque no se capturan. En la restauración, ProxMenux utiliza los artefactos de arranque propios del host de destino (regenerados automáticamente por update-initramfs y la herramienta de bootloader) e instala los controladores adecuados contra el kernel que el destino tenga en ejecución." + "No es una herramienta de copia de VM/CT. Esta función no guarda los discos ni el estado de la RAM de los invitados; para eso está vzdump. Los archivos de configuración de los invitados (/etc/pve/nodes/<node>/qemu-server/*.conf y lxc/*.conf) sí se guardan. Tras restaurar, reaparece su inventario y los discos se pueden recuperar o volver a asociar a partir de una copia existente en PBS o en almacenamiento local.", + "No es una operación sobre todo el clúster. Cada nodo guarda su propia copia. La pertenencia al clúster se incluye en /etc/pve para poder volver a incorporar un nodo restaurado, pero recuperar todo el clúster requiere coordinar la restauración de sus nodos.", + "No es una imagen completa del disco. No se guardan los binarios del kernel, el initramfs ni la partición de arranque. Al restaurar, ProxMenux utiliza los archivos de arranque del host de destino, regenerados automáticamente con update-initramfs y la herramienta del gestor de arranque, e instala los controladores compatibles con el kernel que está ejecutando el destino." ] }, "threePillars": { "heading": "Los tres pilares de una copia", "intro": "Un archivo de ProxMenux se estructura en torno a tres cargas útiles autocontenidas. La restauración utiliza las tres en conjunto para reproducir el host de origen sobre un destino que puede no tener siquiera el mismo kernel instalado.", "diagramCaption": "Cada copia contiene los mismos tres bloques con independencia del destino. La restauración los consume todos: rootfs para colocar los ficheros, manifiesto para detectar drift y diferencias cross-kernel, e inventario de aplicaciones para reinstalar paquetes y componentes contra el kernel del propio destino.", - "pillar1Label": "Sistema de ficheros", + "pillar1Label": "Sistema de archivos", "pillar1Detail": "rootfs/\n(rsync de /etc,\n/etc/systemd/network,\n/root, más snapshot\nsqlite3 de\n/var/lib/pve-cluster,\n+ rutas opcionales)", "pillar2Label": "Manifiesto", - "pillar2Detail": "manifest.json\n(hardware, params\ndel kernel, red,\nZFS, usuarios, cron,\npools ZFS, storage)", + "pillar2Detail": "manifest.json\n(hardware, parámetros\ndel kernel, red,\nZFS, usuarios, cron,\npools ZFS, almacenamiento)", "pillar3Label": "Aplicaciones", - "pillar3Detail": "packages.manual.list\n+ components_status.json\n(APT manual + instaladores\nProxMenux con versiones)" + "pillar3Detail": "packages.manual.list\n+ components_status.json\n(paquetes APT manuales + instaladores\nProxMenux con versiones)" }, "restoreIsUniversal": { "heading": "La restauración reproduce el host de origen, no el archivo", @@ -51,7 +51,7 @@ "intro": "Cada paso del flujo de copia y restauración está disponible desde dos puntos de entrada. Ambos invocan la misma librería de shell, producen archivos idénticos y leen el mismo registro de trabajos.", "cliLabel": "ProxMenux Scripts (TUI)", "cliDetail": "menu → Utilities →\nHost Backup / Restore\n\nFlujo basado en diálogos,\namigable por SSH, admite\nejecución desatendida\ndesde scripts.", - "webLabel": "ProxMenux Monitor (Web UI)", + "webLabel": "ProxMenux Monitor (UI Web)", "webDetail": "Pestaña Backups en la\ninterfaz Web del Monitor.\n\nRestauración con un clic,\nlog en vivo, integrado con\nlas notificaciones y con\nel visor de rollback." }, "whereNext": { diff --git a/web/messages/es/docs/backup-restore/restoring.json b/web/messages/es/docs/backup-restore/restoring.json index 44689048..6809e382 100644 --- a/web/messages/es/docs/backup-restore/restoring.json +++ b/web/messages/es/docs/backup-restore/restoring.json @@ -10,11 +10,11 @@ "header": { "title": "Restaurar una copia", "description": "El flujo completo de restauración: desde elegir una copia hasta un host operativo. Documenta la comprobación de compatibilidad, los dos modos de restauración, el dispatcher post-arranque, la pasada de reinstalación de componentes, y los mecanismos que hacen predecibles las restauraciones cross-host y cross-kernel.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "intro": { "title": "La restauración reproduce el origen, no sólo los ficheros", - "body": "Restaurar una copia de ProxMenux no es una extracción. Los ficheros son sólo el primer paso: una vez colocado el sistema de ficheros, la restauración lee el manifiesto para detectar diferencias entre origen y destino, filtra rutas que romperían el arranque del destino, hidrata configuración propia del usuario que no puede copiarse verbatim, y — tras el reinicio obligatorio — reinstala cada componente que tuviera el origen (controlador NVIDIA, Coral TPU, herramientas GPU) contra el kernel actual del destino. Lo que el usuario elige del menú es una única copia; lo que realmente sucede involucra a la comprobación de compatibilidad, la clasificación de rutas, el dispatcher post-arranque y la pasada de reinstalación trabajando juntos para producir un host que se comporta como el origen." + "body": "Restaurar una copia de ProxMenux requiere más que extraer archivos. Antes de aplicar cambios, se consulta el manifiesto para detectar diferencias entre origen y destino, se filtran rutas que podrían impedir el arranque y se adapta la configuración del usuario que no puede copiarse literalmente. Tras el reinicio necesario, se intenta reinstalar los componentes compatibles registrados (controlador NVIDIA, Coral TPU y herramientas GPU) para el kernel que ejecuta el destino. Una única copia dirige la comprobación de compatibilidad, la clasificación de rutas y los procesos de arranque y posteriores. Revisa los resultados de cada componente y los logs para confirmar el resultado." }, "threeActions": { "heading": "Tres acciones sobre una copia", @@ -26,7 +26,7 @@ }, { "action": "Descargar", - "detail": "Exporta el archivo como un fichero portable .tar.zst (tar comprimido con zstd). Se puede extraer en cualquier sistema Linux con tar --zstd -xf FICHERO.tar.zst, o desde macOS/Windows con herramientas que soporten zstd (7-Zip, PeaZip, Keka…). El árbol extraído contiene manifest.json, metadata/ y rootfs/, exactamente el mismo layout que consume la restauración. Es útil para inspección offline o para restaurar en un host que no tiene acceso al destino original (PBS, Borg)." + "detail": "Exporta el archivo como un fichero portable .tar.zst (tar comprimido con zstd). Se puede extraer en cualquier sistema Linux con tar --zstd -xf FILE.tar.zst, o desde macOS/Windows con herramientas que soporten zstd (7-Zip, PeaZip, Keka…). El árbol extraído contiene manifest.json, metadata/ y rootfs/, exactamente el mismo layout que consume la restauración. Es útil para inspección offline o para restaurar en un host que no tiene acceso al destino original (PBS, Borg)." }, { "action": "Restaurar", @@ -52,7 +52,7 @@ }, { "output": "Plan de rollback", - "detail": "Lo calcula compute_rollback_plan.sh. Lista las VMs, LXCs y componentes presentes en el destino pero no en la copia. El usuario puede optar durante el diálogo de confirmación por eliminarlos como parte de la restauración, de modo que el destino termine casando exactamente con la copia." + "detail": "Lo calcula compute_rollback_plan.sh. Lista las VMs, LXCs y componentes presentes en el destino pero ausentes de la copia. La confirmación permite optar por eliminar los invitados adicionales antes del reinicio. Los componentes deben desinstalarse manualmente y la eliminación de invitados puede fallar; no garantiza que el destino coincida exactamente con la copia." } ], "reportBody": "La comprobación también emite un informe estructurado (HB_COMPAT_RESULTS) categorizado como PASS / INFO / WARN / FAIL. Las entradas WARN y FAIL aparecen en el panel previo a la restauración; la restauración se niega a continuar sólo cuando hay un FAIL que el usuario no puede resolver pulsando Continuar." @@ -81,18 +81,18 @@ }, { "class": "reboot", - "detail": "Rutas que se aplican de inmediato también, pero cuyo efecto real sólo se manifiesta en el siguiente arranque: el kernel sólo lee /etc/default/grub al iniciar el bootloader, /etc/fstab al montar los filesystems, /etc/modules al cargar módulos, etc. El fichero está en su sitio nada más aplicarse, pero el sistema tiene que reiniciar para consumirlo. Ejemplos: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Rutas que este flujo difiere al siguiente arranque en lugar de aplicar de inmediato. Afectan a la configuración de arranque: la generación del bootloader lee /etc/default/grub, los montajes usan /etc/fstab y la carga de módulos usa /etc/modules. Los archivos pendientes se aplican tras reiniciar y después se regeneran los artefactos de arranque necesarios. Ejemplos: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." }, { "class": "dangerous", - "detail": "Rutas que NO se aplican en el sistema en ejecución — la escritura viva podría corromper estado o cortar la conexión activa. Estas rutas se preparan en el conjunto pendiente y las escribe el dispatcher post-arranque después del reinicio, cuando el clúster está arriba pero antes de que el sistema esté completamente en uso. Ejemplos: /etc/pve (pmxcfs es un FUSE vivo; escribir directo en él lo saltea), /var/lib/pve-cluster (datos vivos del clúster), /etc/network (podría reconfigurar la misma interfaz por la que el usuario está conectado por SSH y cortar la sesión)." + "detail": "Rutas que NO se aplican en el sistema en ejecución — la escritura viva podría corromper estado o cortar la conexión activa. Estas rutas se preparan en el conjunto pendiente y las escribe el dispatcher post-arranque después del reinicio, cuando el clúster está arriba pero antes de que el sistema esté completamente en uso. Ejemplos: /etc/pve (pmxcfs es un montaje FUSE con configuración activa del clúster), /var/lib/pve-cluster (datos vivos del clúster), /etc/network (podría reconfigurar la misma interfaz por la que el usuario está conectado por SSH y cortar la sesión)." } ] }, "fullFlow": { "heading": "El flujo completo de restauración", "intro": "El pipeline completo desde la selección del archivo hasta un host restaurado y operativo. Cada etapa alimenta a la siguiente; el estado escrito por etapas anteriores lo consumen las posteriores.", - "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archivo → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · drift de hardware → RS_SKIP_PATHS │\n │ · dirección kernel → same / bk_newer / bk_older │\n │ · plan de remapeo NIC │\n │ · plan de hidratación (sólo bk_older) │\n │ · plan de rollback │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Diálogo de confirmación │\n │ Muestra: rutas hot, rutas pending, drift, │\n │ hidratación, remapeo NIC, nota cross-kernel, │\n │ preview de reinstalaciones │\n └──────────────────────────────┬──────────────────────────┘\n │ (aceptado)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Aplicar rutas hot → EN VIVO │\n │ _rs_apply rsyncea cada ruta hot │\n │ desde staging_root/rootfs a / │\n │ (salta rutas en RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (rutas diferidas) │\n │ Habilita proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Importa pools ZFS no-raíz cuyos discos │\n │ están todos presentes; retry con -f en │\n │ foreign hostid; skip con warning si faltan discos. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → filtro cascade-safe │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REINICIO │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (arranque temprano) │\n │ Lee plan.env │\n │ Aplica apply-on-boot.list (filtrado) │\n │ Instala la unit systemd de postboot │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutos) │\n │ Corre cuando pve-cluster está arriba │\n │ · Aplica entradas de /etc/pve a pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Comprobación de sanidad de arranque │\n │ · Notificación: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" + "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" }, "pendingMachinery": { "heading": "La maquinaria del pending-restore", @@ -131,10 +131,10 @@ }, { "task": "Reinstalación de componentes", - "detail": "Lee el components_status.json restaurado e itera sobre los instaladores registrados (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Cada instalador corre en modo --auto-reinstall, lee su versión previamente registrada del state file, y recompila contra el kernel actual del destino. El flujo interactivo no hace esto — reinstalar drivers contra un kernel que aún no ha arrancado carece de sentido." + "detail": "Lee el components_status.json restaurado y recorre los instaladores compatibles registrados (nvidia_driver, coral_driver, amdgpu_top e intel_gpu_tools). Cada uno se ejecuta en modo --auto-reinstall, lee su estado guardado y reinstala para el entorno del destino, recompilando módulos cuando corresponde. Se difiere hasta después del reinicio para utilizar el kernel que ejecute entonces el destino. Los fallos individuales se registran y no detienen el siguiente componente." }, { - "task": "Comprobación de sanidad del arranque", + "task": "Comprobación del arranque", "detail": "Antes de emitir la notificación de finalización, verifica que proxmox-boot-tool status muestra un ESP configurado, que cada /boot/vmlinuz-* tiene su directorio /lib/modules/<ver> correspondiente, y que /vmlinuz resuelve. Cualquier inconsistencia aparece en la notificación en lugar de quedar oculta." }, { @@ -145,7 +145,7 @@ }, "liveProgress": { "heading": "Progreso en vivo en la pestaña Backups del Monitor", - "body": "Tras el reboot, la pestaña Backups del Monitor de ProxMenux muestra una tarjeta de progreso en vivo que refleja el estado de apply_cluster_postboot.service a medida que avanza. La tarjeta lee /var/lib/proxmenux/restore-state.json, que el dispatcher actualiza en cada hito (aplicar configuración del cluster, reconstruir initramfs, actualizar bootloader, reinstalación por componente, verificación de arranque, finalización).", + "body": "Tras el reboot, la pestaña Backups del Monitor de ProxMenux muestra una tarjeta de progreso en vivo que refleja el estado de proxmenux-apply-cluster-postboot.service a medida que avanza. La tarjeta lee /var/lib/proxmenux/restore-state.json, que el dispatcher actualiza en cada hito (aplicar configuración del cluster, reconstruir initramfs, actualizar bootloader, reinstalación por componente, verificación de arranque, finalización).", "fields": [ { "name": "Insignia de estado", @@ -173,7 +173,7 @@ }, { "name": "Tail del log", - "detail": "Las últimas 600 líneas de proxmenux-cluster-postboot-<ts>.log, con un filtro Issues only que deja solo las líneas con error, warning, failed, ✗ o traceback." + "detail": "Las últimas 600 líneas de proxmenux-cluster-postboot-<ts>.log, con un filtro Solo incidencias que deja solo las líneas con error, warning, failed, ✗ o traceback." } ], "dismissBody": "Cuando la restauración termina como complete o failed, el botón Dismiss colapsa la tarjeta. El fichero de estado se conserva y el botón History la reabre junto con cualquier restauración anterior (se archivan las últimas 20 en /var/lib/proxmenux/restore-history/).", @@ -184,9 +184,9 @@ }, "postbootExample": { "heading": "Cómo se ve el post-boot en la consola", - "body": "En la consola física del host la ejecución exitosa del dispatcher termina con una línea [ OK ] Finished proxmenux-apply-cluster-postboot.service. Cuando esa línea aparece — normalmente acompañada de los OK del multi-user.target y del graphical.target — la restauración ha terminado por completo: componentes reinstalados, boot artifacts regenerados, cluster reconciliado.", + "body": "En la consola física del host, una ejecución del dispatcher que termina correctamente muestra [ OK ] Finished proxmenux-apply-cluster-postboot.service, a menudo junto a los OK de multi-user.target y graphical.target. Esto señala el final del proceso. Puede haber fallos individuales o avisos de arranque registrados; comprueba los estados de componentes y los logs del Monitor antes de dar el host por totalmente restaurado.", "imageAlt": "Consola física de Proxmox mostrando el mensaje '[ OK ] Finished proxmenux-apply-cluster-postboot.service - ProxMenux Apply Cluster Configs (post-boot).' seguido del OK de multi-user.target y graphical.target, con el prompt de login del host encima.", - "imageCaption": "Consola física tras un post-boot exitoso. La línea 'Finished proxmenux-apply-cluster-postboot.service' es la señal de que el flujo de restauración ha terminado por completo — el mismo evento que la notificación 'Host restore finished' expone en el Monitor." + "imageCaption": "Consola física al terminar el proceso. 'Finished proxmenux-apply-cluster-postboot.service' señala su finalización, que también comunica 'Host restore finished' en el Monitor. Hay que revisar los resultados de componentes y los avisos." }, "tenMinutes": { "heading": "Por qué importan los últimos diez minutos", @@ -218,21 +218,21 @@ "detail": "Descarga la versión registrada del driver, compila los módulos DKMS contra el kernel actual, aplica el parche de ProxMenux si el origen lo tenía. La tarea individual más larga." }, { - "stage": "Reinstalación de otros componentes", + "stage": "Reinstalación de Coral y otros componentes", "time": "3–5 min", "detail": "Compilaciones DKMS de Coral, apt install para intel-gpu-tools, descarga + install del .deb para amdgpu_top." }, { - "stage": "Comprobación de sanidad + notificación", + "stage": "Comprobación del arranque y notificación", "time": "~2 s", "detail": "Barata. El usuario se entera de que la ejecución ha terminado en el momento en que dispara la notificación." } ], - "outroBody": "La ventana importa porque el usuario puede hacer login durante este tiempo y ver herramientas ausentes (nvidia-smi no encontrado, coral no detectado). Es esperado — la reinstalación sigue corriendo en background. La notificación de finalización señala cuando todo está listo." + "outroBody": "Durante este intervalo puede que falten herramientas al iniciar sesión (nvidia-smi no encontrado, coral no detectado) porque la reinstalación sigue en segundo plano. La notificación marca el final del proceso; revisa los resultados de componentes, avisos y logs para distinguir los éxitos de los fallos individuales." }, "destructiveRollback": { "heading": "El rollback destructivo opcional", - "body": "Una restauración es aditiva por defecto: si el destino tiene VMs, LXCs o componentes que no están en la copia, sobreviven. Esto preserva el trabajo pero puede dejar entradas hostpci obsoletas, componentes huérfanos o VMs que el usuario ya no quiere. Cuando se detecta drift entre destino y copia, el diálogo de confirmación ofrece un segundo yes/no: ¿Ejecutar rollback destructivo?. Aceptar dispara _rs_execute_rollback, que elimina las VMs, LXCs y componentes que existen en el destino pero no en la copia. El rollback corre ANTES del reinicio para que la maquinaria de pending-restore vea un estado limpio. Es opt-in — el default es No, y el usuario ve exactamente qué se eliminaría listado por nombre (VMID y CTID) antes de decidir." + "body": "La restauración es aditiva por defecto: se conservan las VMs, LXCs y componentes adicionales del destino. Si hay diferencias, la confirmación ofrece ¿Ejecutar rollback destructivo?, con No por defecto. Aceptar llama a _rs_execute_rollback antes del reinicio para intentar eliminar las VMs y LXCs adicionales indicados. Los componentes se señalan para desinstalación manual porque la automática no está implementada. Los fallos al eliminar invitados se registran y el proceso continúa; no se garantiza una coincidencia exacta con la copia. Revisa nombres y VMID/CTID antes de elegir esta opción destructiva." }, "logs": { "heading": "Dónde viven los logs", diff --git a/web/messages/es/docs/backup-restore/scheduled-jobs.json b/web/messages/es/docs/backup-restore/scheduled-jobs.json index d38ef39e..ce6cd7d4 100644 --- a/web/messages/es/docs/backup-restore/scheduled-jobs.json +++ b/web/messages/es/docs/backup-restore/scheduled-jobs.json @@ -10,7 +10,7 @@ "header": { "title": "Trabajos programados", "description": "Trabajos de copia de host desatendidos. Dos modelos de creación: un trabajo nuevo e independiente con su propio horario, o un trabajo adjuntado a una tarea vzdump de PVE existente que hereda el horario y la retención de esa tarea. Ambos producen archivos idénticos al flujo interactivo.", - "section": "Backup & Restore" + "section": "Copias de seguridad y restauración" }, "intro": { "title": "Los dos modelos de trabajo programado", @@ -22,7 +22,7 @@ }, "attachBadge": { "title": "Modo adjunto — recomendado cuando ya existe una tarea vzdump de PVE", - "body": "Cuando ya hay una tarea de copia vzdump de PVE configurada para las VMs y los LXCs de este nodo, adjuntar la copia de host a esa tarea garantiza que la configuración del host se captura en la misma ventana que los invitados. En la restauración, las configuraciones de los invitados vienen de la copia de host (viven bajo /etc/pve), y los discos de los invitados vienen de la copia vzdump tomada al mismo tiempo — ambos conjuntos son consistentes entre sí, por lo que una recuperación completa del nodo puede reproducir el host y re-adjuntar cada invitado sin drift de versiones." + "body": "Si ya existe una tarea vzdump de PVE para las VM y los LXC de este nodo, adjuntar la copia del host hace que se ejecute después de la copia de los invitados, en el mismo ciclo de copia. Al restaurar, las configuraciones de los invitados proceden de la copia del host (bajo /etc/pve) y sus discos de las copias vzdump de ese ciclo. Esto facilita coordinar la recuperación de todo el nodo, pero no es una instantánea atómica: los cambios durante el ciclo pueden dejar diferencias entre la configuración del host y el estado de los discos de los invitados." }, "frequencyBadge": { "title": "Frecuencia recomendada", @@ -47,7 +47,7 @@ }, "attachDetail": { "heading": "Cómo funciona el modo adjunto", - "intro": "PVE escribe las tareas vzdump en /etc/pve/jobs.cfg — una entrada por tarea, cada una apuntando a un storage donde caen los dumps de VMs y LXCs. El modo adjunto requiere que ese storage sea un backend que ProxMenux entienda (Local o PBS); cuando la tarea dispara, ProxMenux se ejecuta al mismo tiempo.", + "intro": "PVE guarda las tareas vzdump en /etc/pve/jobs.cfg: una sección por tarea, con el almacenamiento de las copias de VM y LXC. El modo adjunto requiere un backend compatible con ProxMenux (Local o PBS). La copia del host se ejecuta desde el hook job-end cuando termina la tarea de copia de los invitados.", "steps": [ { "step": "1", @@ -59,14 +59,14 @@ }, { "step": "3", - "detail": "hb_install_vzdump_hook registra un script-hook en /etc/vzdump.conf. Cuando PVE ejecuta cualquier tarea vzdump, el script-hook dispara; si el $STOREID que se le pasa coincide con el PVE_STORAGE de un trabajo adjuntado, el runner se invoca para ese trabajo." + "detail": "hb_install_vzdump_hook registra un hook en /etc/vzdump.conf. En la fase job-end de cualquier tarea vzdump, compara el $STOREID recibido con el PVE_STORAGE de cada trabajo adjunto habilitado y ejecuta el script correspondiente si coincide. La asociación se basa en el almacenamiento, no en el ID de la tarea padre seleccionada." }, { "step": "4", "detail": "El archivo aterriza en el mismo storage donde los dumps de vzdump acaban de escribirse: path/dump/ para Local, o el repositorio PBS configurado en la entrada de storage de PVE." } ], - "outroBody": "El modo adjunto tiene una implicación operativa: desactivar o eliminar la tarea padre de PVE también desactiva la copia de host — no hay timer propio al que recurrir. La entrada del trabajo permanece en disco para poder re-adjuntarla más tarde." + "outroBody": "El modo adjunto no tiene temporizador propio. Desactivar o eliminar la tarea padre seleccionada detiene ese disparador, pero otra tarea vzdump con el mismo almacenamiento aún puede activar la copia del host. Para impedirlo, desactiva o elimina el propio trabajo de ProxMenux. Al desactivarlo, su entrada sigue en disco para poder reactivarla o volver a adjuntarla." }, "storageLayout": { "heading": "Ficheros que componen un trabajo", @@ -85,7 +85,7 @@ "content": "Sólo modo Nuevo. El service invoca run_scheduled_backup.sh JOB_ID. El timer lo programa con Persistent=true (los disparos perdidos se ejecutan al siguiente arranque) y un pequeño RandomizedDelaySec=120 para repartir carga cuando varios trabajos comparten la misma expresión OnCalendar." }, { - "path": "script-hook de /etc/vzdump.conf", + "path": "/etc/vzdump.conf script-hook", "content": "Sólo modo adjunto. Lo instala una vez hb_install_vzdump_hook; casa el PVE_STORAGE de cada trabajo adjuntado contra el $STOREID que PVE pasa al script-hook." } ] @@ -104,23 +104,23 @@ "intro": "El menú del scheduler (TUI de Scripts) y la pestaña Backups del Monitor exponen las mismas acciones sobre cualquier trabajo.", "rows": [ { - "action": "Run now", + "action": "Ejecutar ahora", "detail": "Invoca el runner de inmediato, saltándose el timer / hook de vzdump. Útil para verificar una configuración de trabajo sin esperar al siguiente disparo programado." }, { - "action": "Enable / Disable", + "action": "Activar / Desactivar", "detail": "Modo Nuevo: systemctl enable/disable --now sobre el timer. Modo adjunto: cambia el flag ENABLED en el env del trabajo — el script-hook lo respeta en el siguiente disparo de PVE." }, { - "action": "Edit", + "action": "Editar", "detail": "Reabre los prompts de destino, horario, perfil y retención y reescribe los ficheros del trabajo. Preserva el ID del trabajo." }, { - "action": "Delete", + "action": "Eliminar", "detail": "Elimina el env del trabajo, el fichero de rutas, el timer + service systemd (modo Nuevo) y desactiva el binding del hook (modo adjunto). No toca los archivos ya presentes en el destino." }, { - "action": "View log", + "action": "Ver log", "detail": "Muestra en streaming /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log — un fichero de log por ejecución. El runner también emite una línea de estado compacta a journald bajo el service systemd." } ] diff --git a/web/messages/fr/docs/backup-restore/creating-backups.json b/web/messages/fr/docs/backup-restore/creating-backups.json new file mode 100644 index 00000000..8fcdb1fe --- /dev/null +++ b/web/messages/fr/docs/backup-restore/creating-backups.json @@ -0,0 +1,220 @@ +{ + "meta": { + "title": "Création de sauvegardes — flux de sauvegarde interactif ProxMenux", + "description": "Le processus de sauvegarde interactif de ProxMenux : deux points d’entrée (le menu TUI de Scripts et l’interface web de Monitor), trois destinations, deux modes de profil, une étape de préparation temporaire et une boîte de dialogue de confirmation. Cette page décrit la matrice de six options, les profils par défaut et personnalisé, et ce que voit l’utilisateur entre le choix d’une sauvegarde et l’enregistrement de l’archive à destination.", + "ogTitle": "Sauvegarde ProxMenux — création de sauvegardes", + "ogDescription": "Le processus de sauvegarde interactif avec trois destinations, deux profils et une étape commune de préparation temporaire.", + "twitterTitle": "Création de sauvegardes ProxMenux", + "twitterDescription": "Flux de sauvegarde interactif avec trois destinations et deux modes de profil." + }, + "header": { + "title": "Création de sauvegardes", + "description": "Le processus de sauvegarde interactif : choisissez une destination et un profil, vérifiez le récapitulatif de confirmation et suivez l’enregistrement de l’archive. Les deux points d’entrée partagent le même backend et produisent des archives identiques.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "title": "Deux points d'entrée, fonctionnalité identique", + "body": "La TUI de Scripts et l’interface web de Monitor offrent exactement les mêmes fonctions. Chaque sauvegarde — manuelle ou programmée — utilise la même matrice de choix (trois destinations × deux profils) et appelle la même fonction backend par cellule (_bk_pbs, _bk_borg ou _bk_local). Les archives produites depuis les deux points d’entrée sont identiques. Le choix dépend des préférences : la TUI se prête à SSH et aux scripts ; Monitor permet une utilisation à la souris et regroupe les vues des notifications et du suivi des journaux." + }, + "entryPoints": { + "heading": "Les deux points d'entrée", + "rows": [ + { + "entry": "ProxMenux Scripts (TUI)", + "path": "menu → Utilities → Host Config Backup", + "detail": "Processus fondé sur des boîtes de dialogue, adapté à SSH. Le menu principal présente directement les six options. Utilise backup_menu dans backup_host.sh." + }, + { + "entry": "ProxMenux Monitor (interface utilisateur Web)", + "path": "Backups tab → Create backup", + "detail": "Processus guidé par un assistant. Les six mêmes options sont présentées dans un formulaire en deux étapes (destination → profil). Les mêmes fonctions backend sont appelées via l’API Flask." + } + ] + }, + "modes": { + "heading": "Sauvegardes manuelles ou programmées", + "body": "Les sauvegardes peuvent être produites en deux modes : manuel (le processus interactif décrit sur cette page — l'utilisateur choisit une destination et un profil à partir d'un menu et suit l’enregistrement de l’archive) ou programmé (un travail sans surveillance qui fonctionne sur un minuteur de style cron et applique la rétention configurée sur le travail). Les deux modes supportent les mêmes trois destinations et les mêmes deux profils, et les deux sont disponibles à partir des deux points d'entrée — le menu Scripts TUI et l'onglet Sauvegardes Monitor. Les tâches programmées utilisent les mêmes fonctions de backend que le flux manuel à travers run_scheduled_backup.sh ; les archives produites sont indistinguables.", + "seeAlso": "La page des tâches programmées décrit tout le processus, notamment la création d’une tâche, son association à un minuteur vzdump PVE existant et la configuration des valeurs de rétention.", + "monitorAlt": "L'onglet Sauvegardes ProxMenux Monitor affiche la boîte de dialogue Nouvelle sauvegarde programmée avec les champs destination, profil, calendrier et conservation.", + "monitorCaption": "Sauvegarde programmée — ProxMenux Monitor. La même boîte de dialogue de style assistant qui crée une sauvegarde manuelle porte les champs de planning et de rétention en bas pour le chemin sans surveillance." + }, + "matrix": { + "heading": "La matrice de six options", + "intro": "Le choix détermine le backend exécuté et la stratégie de sélection des chemins. Consultez les pages de chaque destination pour connaître les détails de configuration de chaque cellule.", + "rows": [ + { + "combo": "1", + "destination": "PBS", + "profile": "Par défaut", + "action": "Envoie le profil par défaut et les ajouts persistants vers un dépôt PBS configuré." + }, + { + "combo": "2", + "destination": "Borg", + "profile": "Par défaut", + "action": "Crée une archive avec le profil par défaut plus des extras persistants dans le dépôt Borg sélectionné." + }, + { + "combo": "3", + "destination": "Locale", + "profile": "Par défaut", + "action": "Écrit une archive .tar.zst avec le profil par défaut et des suppléments persistants à la cible locale configurée." + }, + { + "combo": "4", + "destination": "PBS", + "profile": "Personnalisé", + "action": "Ouvre le sélecteur de chemins avant l’envoi vers PBS ; l’utilisateur coche les chemins et peut en ajouter." + }, + { + "combo": "5", + "destination": "Borg", + "profile": "Personnalisé", + "action": "Ouvre le sélecteur de chemin avant la création de l'archive Borg." + }, + { + "combo": "6", + "destination": "Locale", + "profile": "Personnalisé", + "action": "Ouvre le sélecteur de chemin avant d'écrire le .tar.zst local." + } + ] + }, + "profiles": { + "heading": "Profil par défaut vs personnalisé", + "defaultTitle": "Profil par défaut", + "defaultBody": "Le profil par défaut est la liste prédéfinie de hb_default_profile_paths (documentée dans Comment ça marche sous Catégories de chemins) plus chaque entrée dans le fichier supplémentaire persistant /usr/local/share/proxmenux/backup-extra-paths.txt. L'utilisateur confirme les options de destination et de chiffrement et la sauvegarde se déroule sans autre sélection de chemin.", + "customTitle": "Profil personnalisé", + "customBody": "Le profil personnalisé ouvre une liste à cocher avec tous les chemins du profil par défaut (décochés) et tous les ajouts persistants (précochés, avec le préfixe [+]). L’utilisateur coche les chemins pour cette exécution et peut cliquer sur Ajouter un chemin personnalisé pour ajouter un chemin absolu. Tout chemin ainsi ajouté est enregistré dans backup-extra-paths.txt afin que les sauvegardes suivantes l’incluent automatiquement. Décocher un ajout persistant l’exclut de cette exécution sans le supprimer du fichier — la suppression se fait séparément par Gérer les chemins personnalisés, en dehors du processus de sauvegarde.", + "customPickerAlt": "Liste de contrôle de profil personnalisé montrant les chemins de profil par défaut (non coché) et les extras persistants (pré coché avec un préfixe [+]), ainsi que des boutons pour ajouter un nouveau chemin ou confirmer la sélection.", + "customPickerCaption": "Profil personnalisé — le sélecteur de chemins. Les chemins du profil par défaut sont décochés ; les ajouts persistants sont précochés avec le préfixe [+]. L’utilisateur coche les chemins pour cette exécution.", + "manageCustomAlt": "Menu de gestion des chemins personnalisés montrant les ajouts persistants et les options pour les ajouter, les supprimer ou les modifier.", + "manageCustomCaption": "Gérer les chemins personnalisés — le point d'entrée où des extras persistants sont ajoutés ou supprimés. Chaque chemin listé ici est automatiquement inclus dans les sauvegardes en mode Défaut sans avoir à ouvrir le sélecteur personnalisé." + }, + "commonPipeline": { + "heading": "Ce qui s’exécute quelle que soit la destination", + "intro": "Une fois le profil défini, chaque backend suit le même processus de préparation temporaire avant de passer à sa propre méthode d’envoi. hb_prepare_staging assemble l’arborescence de l’archive dans /tmp/proxmenux-DESTINATION-stage.XXXXXX et remplit chacun des trois blocs de données.", + "steps": [ + { + "step": "1", + "name": "Assemblage du rootfs", + "detail": "Exécute rsync -a pour chaque chemin sélectionné dans staging_root/rootfs/. La base de données pmxcfs de /var/lib/pve-cluster/config.db est capturée séparément via sqlite3 .backup pour produire un instantané cohérent sans arrêter le cluster, et les sidecars .db-wal / .db-shm sont exclus du rsync; lorsque sqlite3 n'est pas disponible, un fichier config.db.raw-fallback est créé puis utilisé comme base de données lors de l’importation. Les sous-chemins volatils (historique bash, caches, poubelles) sont exclus du /root/. Les chemins absents de la source sont enregistrés dans metadata/missing_paths.txt sans arrêter la sauvegarde." + }, + { + "step": "2", + "name": "Génération de manifestes", + "detail": "build_manifest.sh coordonne les six collecteurs et écrit manifest.json à la racine du répertoire temporaire. Si un collecteur échoue, la section concernée reçoit une valeur vide par défaut documentée ; le manifeste reste valide." + }, + { + "step": "3", + "name": "Inventaire des paquets", + "detail": "apt-mark showmanual est capté mot à mot dans metadata/packages.manual.list. L'état des composants est déjà à l'intérieur des rootfs restauré (components_status.json) car /usr/local/share/proxmenux/ fait partie du profil par défaut." + }, + { + "step": "4", + "name": "Informations sur l’exécution", + "detail": "metadata/run_info.env enregistre l'identité d'exécution de sauvegarde — nom d'hôte, horodatage, version du noyau — utilisée par la vérification de compatibilité de la restauration pour déterminer la direction du cross-kernel." + }, + { + "step": "5", + "name": "Notification (démarrage)", + "detail": "hb_notify_lifecycle \"start\" est déclenché. Si les notifications sont configurées dans Monitor, un événement Sauvegarde de l’hôte démarrée est envoyé à l’utilisateur. Aucun envoi si aucun canal n’est configuré." + } + ] + }, + "included": { + "heading": "Ce qui entre et ce qui reste en dehors", + "intro": "Chaque chemin dans le profil résolu (par défaut + suppléments persistants + sélection en mode personnalisé) est copié avec rsync -aAXH --numeric-ids. Une liste d'exclusion partagée s'applique à chaque chemin, et deux répertoires comportent d'autres exclusions spécifiques au chemin.", + "globalTitle": "Les exclusions globales (appliquées à chaque voie)", + "globalItems": [ + "images/ — images de disque exportées.", + "dump/ — sorties vzdump.", + "tmp/ — fichiers temporaires.", + "*.log — fichiers journaux." + ], + "rootTitle": "Exclusions de /root/", + "rootBody": "/root/ fait partie du profil par défaut, de sorte que les scripts utilisateur et la configuration se trouvent dans l'archive. Les sous-chemins volatils sont abandonnés:", + "rootItems": [ + ".bash_history", + ".cache/", + "tmp/", + ".local/share/Trash/" + ], + "proxmenuxTitle": "Exclusions de /usr/local/share/proxmenux/", + "proxmenuxBody": "Ce répertoire ne livre que l'état utilisateur — components_status.json, préférences, cache post-installation. Code que la destination aura déjà de sa propre installation ProxMenux est exclu de sorte qu'une restauration n'écrase pas les binaires actuels de la cible avec les plus anciens:", + "proxmenuxItems": [ + "restore-pending/, scripts/, web/", + "monitor-app/, monitor-app.*/, AppImage/", + "images/, json/", + "utils.sh, helpers_cache.json", + "ProxMenux-Monitor.AppImage*, install_proxmenux*.sh" + ], + "notInProfileTitle": "Chemins en dehors du profil", + "notInProfileBody": "Tout ce qui n'est pas listé dans hb_default_profile_paths et qui n'est pas ajouté en tant qu'extra personnalisé ou persistant ne fait pas partie de la sauvegarde. Exemples notables:", + "notInProfileItems": [ + "Disques des VM et des LXC — manipulés par vzdump, pas par cette fonctionnalité. Les fichiers de configuration invités sous /etc/pve/nodes/*/qemu-server/*.conf et lxc/*.conf sont capturés (ils vivent sous /etc/pve) de sorte que la restauration reproduit l'inventaire; les disques eux-mêmes sont ré-attachés à partir d'une sauvegarde existante vzdump/PBS.", + "/boot et /boot/efi — les binaires du noyau, les initramfs et la partition ESP UEFI sont régénérés par les propres update-initramfs, update-grub ou proxmox-boot-tool refresh après la restauration. Le chargeur de démarrage n’est jamais recopié à l’identique.", + "Les systèmes de fichiers de noyau et d'exécution du système — /proc, /sys, /dev et /run sont des pseudo-systèmes de fichiers produits par le noyau et l'udev; ils ne persistent nulle part.", + "Binaires des paquets sous /usr/bin, /usr/lib, /lib, /sbin — réinstallés par APT sur la cible à partir de packages.manual.list.", + "/var/log/, /var/tmp/, /var/cache/ — état d'exécution par hôte, non restauré.", + "/home/USER — pas dans le profil par défaut. Ajoutez-le comme un chemin personnalisé lorsqu'un système transporte des répertoires d'utilisateur qui doivent survivre à une restauration." + ], + "customPathsTitle": "Comment les chemins personnalisés sont gérés", + "customPathsBody": "Un chemin personnalisé ajouté en ligne en mode personnalisé ou maintenu dans backup-extra-paths.txt passe par le même pipeline rsync que les chemins de profil par défaut. Les exclusions globales s'appliquent. Si le chemin personnalisé se trouve sous /root/ ou /usr/local/share/proxmenux/, les exclusions spécifiques au chemin ci-dessus s'appliquent toujours. Chaque chemin archivé — par défaut ou personnalisé — est enregistré dans metadata/paths_archived.txt. Les chemins qui n'existent pas sur la source sont enregistrés dans metadata/missing_paths.txt sans arrêter la sauvegarde." + }, + "archiveStructure": { + "heading": "Structure des archives", + "intro": "Le répertoire de préparation temporaire produit par chaque moteur suit la même disposition quelle que soit la destination. L'archive tarball, PBS .pxar ou Borg stocke cet arbre dans son intégralité.", + "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│ ├── paths_archived.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": "Résumé de la confirmation", + "body": "Avant que le moteur n'écrive quoi que ce soit à la destination, ProxMenux affiche une boîte de dialogue de résumé avec la destination, l’identifiant de sauvegarde ou le nom de l’archive, l'état de chiffrement et la liste des chemins copiés. Annuler ici avorte la sauvegarde proprement — le répertoire temporaire est supprimé par le gestionnaire trap défini dans la fonction backend et aucune donnée partielle n'arrive à destination." + }, + "writing": { + "heading": "Écrire à la destination", + "intro": "Après confirmation, chaque backend exécute sa propre étape d’écriture. Les pages des destinations en décrivent le fonctionnement ; les éléments communs sont le journal, le fichier annexe et la notification de fin.", + "rows": [ + { + "topic": "Fichier journal", + "detail": "Chaque moteur écrit sa sortie complète sur /tmp/proxmenux-DESTINATION-backup-YYYYMMDD_HHMMSS.log et, en cas d'échec, propose de l'ouvrir dans une boîte de dialogue défilante. Le chemin du journal n'est imprimé dans le résumé d'achèvement que lorsque le fichier contient du contenu." + }, + { + "topic": "Sidecar (local seulement)", + "detail": "hb_write_archive_sidecar dépose un *.proxmenux.json à côté de l'archive locale afin que le moniteur l'identifie comme une sauvegarde d'hôte ProxMenux même après des déplacements ou des renoms." + }, + { + "topic": "Notification (réussite/échec)", + "detail": "hb_notify_lifecycle \"complete\" ou \"fail\" est déclenché avec la durée, la taille de l’archive et — en cas d’échec — la dernière ligne du journal qui ressemble à une erreur." + } + ] + }, + "finishedScreens": { + "heading": "A quoi ressemble une sauvegarde terminée", + "intro": "Le même événement d'achèvement est présenté par les deux points d'entrée. Le TUI écrit un bloc de résumé au terminal; l'onglet Sauvegardes de Monitor affiche l'exécution dans la liste des archives avec la taille, la durée et les badges d'état.", + "scriptsAlt": "ProxMenux Scripts TUI montrant une sauvegarde d'hôte terminée — destination, ID de sauvegarde, chemin instantané, taille des données, durée et état de chiffrement.", + "scriptsCaption": "Sauvegarde terminée — ProxMenux Scripts (TUI). Le bloc d'achèvement imprime la destination, l'ID de sauvegarde, le nom d'instantané ou d'archive, la taille des données, la durée et l'état de chiffrement.", + "monitorAlt": "Onglet de sauvegarde ProxMenux Monitor montrant une entrée de sauvegarde d'hôte terminée avec taille, durée, badge de méthode et indicateur de chiffrement.", + "monitorCaption": "Sauvegarde terminée — onglet Sauvegardes ProxMenux Monitor. La nouvelle sauvegarde apparaît dans la liste des archives avec le badge de la méthode de destination, la taille, la durée et, le cas échéant, l'indicateur de verrouillage de chiffrement." + }, + "whereNext": { + "heading": "Où aller ensuite?", + "items": [ + { + "label": "Destinations", + "href": "/docs/backup-restore/destinations", + "tail": "— détails de configuration pour Local, PBS et Borg." + }, + { + "label": "Tâches programmées", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " — exécuter la même sauvegarde sans intervention selon un calendrier, plutôt que de façon interactive." + }, + { + "label": "Restauration", + "href": "/docs/backup-restore/restoring", + "tail": "— le flux qui consomme ce que cette page produit." + } + ] + } +} diff --git a/web/messages/fr/docs/backup-restore/cross-kernel.json b/web/messages/fr/docs/backup-restore/cross-kernel.json new file mode 100644 index 00000000..135e0424 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/cross-kernel.json @@ -0,0 +1,170 @@ +{ + "meta": { + "title": "Restauration entre noyaux différents — détection, filtrage et adaptation | ProxMenux", + "description": "Comment ProxMenux restaure une sauvegarde d’hôte sur une version principale différente du noyau. Détection du sens de l’écart, filtre des chemins critiques si la cible utilise un noyau plus récent et adaptation en quatre phases pour réappliquer IOMMU, ID VFIO et paramètres de ligne de commande sans recopier tels quels les fichiers liés au noyau.", + "ogTitle": "ProxMenux Backup — restauration entre versions du noyau et adaptation", + "ogDescription": "Restauration entre versions du noyau tenant compte du sens du changement, avec filtrage sûr et adaptation indépendante du noyau.", + "twitterTitle": "Restauration entre noyaux différents | ProxMenux", + "twitterDescription": "Comment ProxMenux gère une restauration lorsque le noyau cible diffère de celui de la sauvegarde." + }, + "header": { + "title": "Restauration entre versions du noyau", + "description": "Comment ProxMenux gère une restauration lorsque l'hôte cible exécute un noyau différent de celui enregistré dans la sauvegarde, surtout lorsque la cible exécute un noyau plus récent. Explique comment la différence est détectée, comment les chemins critiques de démarrage qui pourraient briser la cible sont filtrés, et comment la configuration propre de l'utilisateur est réappliquée sans copier les fichiers liés au noyau mot pour mot.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "title": "Chaque saut du noyau est géré différemment", + "body": "Le noyau d'un hôte Proxmox est identifié par une chaîne de version comme 6.17.13-2-pve. Les deux premiers nombres (6.17 dans cet exemple) définissent la version principale : lorsqu'ils changent, certains fichiers de configuration écrits pour le noyau précédent peuvent ne pas être valides sur le nouveau. Lorsque la restauration détecte que la sauvegarde et la cible ont différentes versions majeures du noyau, les branches de flux basées sur la direction du saut — que la sauvegarde soit plus ancienne ou plus récente que la cible — parce que les deux cas ont des modes de défaillance opposés. Les sauvegardes plus récentes que la cible restaurent proprement comme-est (vérifiées sur plusieurs sauts du noyau). Les sauvegardes plus anciennes que la cible ont besoin d'un filtre pour éviter de casser le démarrage de la cible avec une configuration écrite pour un noyau qui a depuis changé." + }, + "directionCheck": { + "heading": "Le contrôle de direction", + "intro": "Lors de la vérification de compatibilité, hb_compat_check compare le noyau enregistré dans le manifeste de sauvegarde au noyau courant de la cible (uname -r) et classifie la restauration dans l'un des trois cas, stockés dans la variable interne HB_COMPAT_KERNEL_DIRECTION:", + "rows": [ + { + "direction": "same", + "condition": "La version principale du noyau correspond entre la sauvegarde et la cible.", + "behavior": "Le flux complet de restauration est inchangé. Pas de filtre supplémentaire, pas d'hydratation, pas de notice spéciale dans l'interface utilisateur." + }, + { + "direction": "bk_newer", + "condition": "Le noyau de la sauvegarde est PLUS RÉCENT que celui de la cible (exemple : sauvegarde sous 7.0, cible sous 6.17).", + "behavior": "Le processus complet reste inchangé, comme pour same, sans filtre. Les essais rapportés ont montré la réinstallation des pilotes pour le noyau cible, l’application de la configuration IOMMU et le démarrage des VM avec passthrough GPU." + }, + { + "direction": "bk_older", + "condition": "Le noyau de la sauvegarde est PLUS ANCIEN que celui de la cible (exemple : sauvegarde sous 6.17, cible sous 7.0).", + "behavior": "Le filtre sous-ensemble et l'hydratation en quatre phases ci-dessous sont activés. Le processus de restauration — la cible reproduit la source, mais les fichiers critiques de démarrage ne sont pas copiés mot à mot." + } + ] + }, + "whyBkNewerIsSafe": { + "heading": "Pourquoi une sauvegarde avec un noyau plus récent que la cible restaure inchangé", + "body": "Lorsque la restauration s'exécute contre une cible avec un noyau plus ancien que celui enregistré dans la sauvegarde, chaque mécanisme dont dépend la restauration est indépendant de la version du noyau. Les installateurs de pilotes GPU et d'autres installateurs PCI détectent le noyau en cours d'exécution avec uname -r et compilent DKMS contre tout ce que la cible a. Le paquet APT installe tire des binaires construits pour la distribution de la cible. Les jetons IOMMU cmdline comme intel_iommu=on sont stables dans les principales versions du noyau. La sauvegarde porte des chemins écrits sous un noyau plus récent, mais ces chemins (module blacklists, GRUB par défaut, initramfs config) sont toujours valides sur l'ancien — les noyaux ignorent les jetons qu'ils ne reconnaissent pas au lieu d'échouer. Ce cas est équivalent en pratique à une restauration du même noyau, et ProxMenux le traite comme tel." + }, + "safeSubsetFilter": { + "heading": "Le filtre de sous-ensemble de sécurité (uniquement lorsque le noyau cible est plus récent)", + "intro": "Lorsque le noyau cible est plus récent que celui de la sauvegarde, la vérification de compatibilité ajoute des chemins critiques de démarrage 16 de hb_unsafe_paths_cross_version à RS_SKIP_PATHS. Ces chemins sont exclus de la restauration parce que l'écriture d'une version d'un noyau plus ancien sur une cible en cours d'exécution d'un nouveau a causé des paniques du noyau dans les tests de banc. Les chemins couvrent cinq catégories:", + "categoryRows": [ + { + "category": "Chargeur d'amorçage", + "paths": "/etc/default/grub, /etc/kernel", + "reason": "GRUB est lié à l'ordre du noyau précédent, et à l'état proxmox-boot-tool (cmdline, ESP UUIDs, crochets) qui fait référence aux chemins et aux identifiants de l'ancienne installation." + }, + { + "category": "Modules de noyau et artefacts de démarrage", + "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", + "reason": "Autoload listes qui peuvent renvoyer des modules rebaptisés entre les majors du noyau, options de module qui peuvent ne pas s'appliquer, initramfs crochets écrits pour l'ancien noyau." + }, + { + "category": "Empilement de stockage et identité du système de fichiers", + "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", + "reason": "UUID qui peuvent ne pas exister sur cette installation, pilotes multipath qui changent entre les noyaux, paramètres iSCSI qui évoluent, règles udev qui peuvent se lier à des sous-systèmes inexistants, état ZFS (zpool.cache + hostid) qui peuvent verrouiller le pool comme étranger." + }, + { + "category": "Sources APT", + "paths": "/etc/apt", + "reason": "Les suites sources APT peuvent déclencher une dégradation des paquets critiques lors de la prochaine mise à jour." + }, + { + "category": "systemd", + "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", + "reason": "Surcharges d’unités et liens .wants liés à une ancienne version majeure de systemd ; clés de configuration pouvant être invalides pour une version plus récente." + } + ], + "outroBody": "Le filtre fonctionne AVANT la boîte de dialogue de confirmation afin que l'utilisateur voit la liste exacte des chemins qui seront ignorés, catégorisé par la raison. La restauration continue — tout le reste (configuration VM/LXC, réseau, /etc/pve, utilisateurs, cron, état ProxMenux, paquets, pilotes, /root) est restauré normalement." + }, + "hydration": { + "heading": "Hydratation du noyau-agnostique", + "intro": "Le filtre omet les fichiers critiques ; l’adaptation réapplique certains réglages : paramètres IOMMU, ID VFIO, GRUB_TIMEOUT personnalisé et listes de blocage nvidia. Elle s’exécute si le noyau cible est plus récent. La fusion cmdline conserve les clés de la cible et ajoute les modules manquants. Les valeurs GRUB et fichiers autorisés peuvent remplacer un contenu cible différent. Répéter les mêmes entrées est idempotent.", + "phaseRows": [ + { + "phase": "1a — Voie GRUB", + "detail": "Pour les hôtes GRUB (installations ext4/lvm). _rs_hyd_grub fusionne les paramètres de manifest.kernel_params.cmdline_extra de la sauvegarde dans GRUB_CMDLINE_LINUX_DEFAULT de la cible, en ignorant les clés déjà présentes. Il reprend ensuite les clés autorisées GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) depuis /etc/default/grub de la sauvegarde si leurs valeurs diffèrent de la cible." + }, + { + "phase": "1b — systemd-boot / ZFS", + "detail": "Pour systemd-boot (souvent ZFS à la racine). _rs_hyd_kernel_cmdline fusionne les paramètres utilisateur de cmdline_extra dans /etc/kernel/cmdline de la cible tout en préservant ses paramètres de démarrage root=, boot= et rootflags=." + }, + { + "phase": "2 — Fusion /etc/modules", + "detail": "_rs_hyd_modules ajoute des modules de manifest.kernel_params.modules_loaded_at_boot qui sont dans la liste blanche (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) ET n'est pas déjà présent dans la cible /etc/modules." + }, + { + "phase": "3 — Copie des fichiers figurant sur la liste blanche", + "detail": "_rs_hyd_files copie les fichiers rédigés par l’utilisateur depuis les rootfs jusqu'à la cible en direct lorsque le contenu diffère. La liste blanche couvre les fichiers VFIO/nvidia/blacklist sous /etc/modprobe.d, /etc/modules-load.d, et la règle de liaison ProxMenux VFIO + règles nvidia udev sous /etc/udev/rules.d. Les fichiers appartenant à des Distro (pve-blacklist.conf, mdadm.conf, nvme.conf) sont délibérément exclus — leur contenu évolue entre les versions." + }, + { + "phase": "4 — Forcer la régénération après démarrage", + "detail": "Les quatre phases écrivent directement à la cible en direct EN DEHORS DE le pipeline normal de restauration. Pour que les paramètres/modules/fichiers fusionnés prennent effet sur le prochain boot, HB_HYDRATION_APPLIED=1 se propage via plan.env vers apply_pending_restore.sh, ce qui force NEEDS_INITRAMFS=1 et NEEDS_GRUB=1 indépendamment de ce qui était dans la liste d'application. Le répartiteur post-démarrage régénère ensuite les initramfs et rafraîchit le chargeur." + } + ] + }, + "planCommit": { + "heading": "Plan vs commit — l'utilisateur voit d'abord un aperçu", + "body": "L'hydratation fonctionne en deux modes. Avant la boîte de dialogue de confirmation, ProxMenux exécute _rs_apply_bk_older_hydration en mode plan : il calcule exactement ce qui serait fusionné, peuple RS_HYDRATION_SUMMARY avec un bloc vert listant chaque action, et retourne sans écrire. La boîte de dialogue de confirmation montre que le bloc vert à côté de la liste orange des chemins exclus, de sorte que l'utilisateur voit À L’AVANCE ce qui sera ré-appliqué automatiquement. Après que l'utilisateur ait confirmé, ProxMenux réexécute le même helper en mode commit — mêmes phases, même logique, mais cette fois chaque phase écrit à la cible en direct. L'annulation de la boîte de dialogue de confirmation laisse la cible intacte." + }, + "flowDiagram": { + "heading": "Le flux lorsque le noyau cible est plus récent que celui de la sauvegarde", + "intro": "Les étapes ajoutées lorsque le noyau cible est plus récent s'assoient à l'intérieur du flux normal de restauration. Tout le reste — application chaude, préparation en attente, installation de paquets, répartiteur post-démarrage — fonctionne identiquement à une restauration du même noyau.", + "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": "Exemples concrets", + "intro": "Le passe d'hydratation n'est pas abstrait — il produit des résultats observables et corrects pour des scénarios communs. Deux exemples que l'hydratation gère automatiquement :", + "rows": [ + { + "scenario": "Passage de GPU (VFIO)", + "detail": "La source avait le intel_iommu=on iommu=pt dans la ligne cmd, le vfio/vfio_pci/vfio_iommu_type1 dans le /etc/modules, un /etc/modprobe.d/vfio.conf avec le options vfio-pci ids=10de:2216 et un /etc/modprobe.d/blacklist-nvidia.conf. L'hydratation fusionne les jetons cmdline dans le GRUB de la cible ou le noyau cmdline, ajoute les modules vfio au /etc/modules, et copie les deux fichiers modprobe rédigés par l’utilisateur. Sur le prochain démarrage, IOMMU est actif, les modules VFIO chargent, le GPU est lié à vfio-pci et le VM est livré avec le travail de passage." + }, + { + "scenario": "Par défaut du GRUB personnalisé", + "detail": "Source : GRUB_TIMEOUT=1 et GRUB_DISABLE_OS_PROBER=true. L'hydratation lit les deux clés de la sauvegarde /etc/default/grub, voit qu'elles diffèrent des valeurs par défaut de la nouvelle installation, et réécrit ces deux lignes dans le fichier de la cible (en laissant tout le reste, y compris GRUB_DISTRIBUTOR, intact)." + } + ] + }, + "callout": { + "warningTitle": "Ce que l'hydratation ne réapplique pas lorsque le noyau cible est plus récent", + "warningBody": "L'hydratation ne réapplique que la configuration ProxMenux sait être sûre dans toutes les versions du noyau : jetons IOMMU, ID VFIO, clés GRUB sur liste blanche et modules d'une liste fixe (vfio*, nvidia*, i915, xe, kvm*). Tout ce qui se trouve à l'extérieur de cet ensemble — les crochets initramfs personnalisés sous /etc/initramfs-tools/hooks/, les fichiers non inscrits sur la liste blanche sous /etc/modprobe.d/, les surcharges d’unités systemd rédigées par l’utilisateur — reste exclu. La raison en est concrète : ces fichiers peuvent appeler des interfaces internes au noyau (API modulaires, mise en page /sys, crochets udev) qui changent entre les versions principales, et les appliquer mot à mot sur le nouveau noyau peut empêcher la cible de démarrer. Lorsque la reproduction exacte de la chaîne de démarrage est requise, la restauration doit être exécutée sur un hôte avec la même version principale du noyau que la sauvegarde." + }, + "codeReference": { + "heading": "Où vivent les mécanismes", + "intro": "Pour les développeurs qui cherchent à tracer ou à étendre le comportement du cross-kernel:", + "rows": [ + { + "component": "Détection de la direction", + "location": "hb_compat_check dans lib_host_backup_common.sh. Définit HB_COMPAT_KERNEL_DIRECTION." + }, + { + "component": "Liste des chemins de sous-ensembles sécurisés", + "location": "hb_unsafe_paths_cross_version dans lib_host_backup_common.sh. Émet path\\treason lignes utilisées à la fois par le filtre CLI et le point de terminaison Web /api/host-backups/restore/prepare." + }, + { + "component": "Phases d'hydratation", + "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files dans backup_host.sh. Ordonné par _rs_apply_bk_older_hydration." + }, + { + "component": "Régénération forcée après démarrage", + "location": "apply_pending_restore.sh lit HB_HYDRATION_APPLIED de plan.env et force NEEDS_INITRAMFS=1/NEEDS_GRUB=1." + }, + { + "component": "Aperçu du Web", + "location": "/api/host-backups/restore/prepare dans flask_server.py. Charge la bibliothèque d'aide, exécute _rs_apply_bk_older_hydration en mode plan, renvoie les actions au mode Web." + } + ] + }, + "whereNext": { + "heading": "Où aller ensuite?", + "items": [ + { + "label": "Restauration", + "href": "/docs/backup-restore/restoring", + "tail": " — le processus complet de restauration qui intègre les mécanismes de cette page." + }, + { + "label": "Comment ça marche", + "href": "/docs/backup-restore/how-it-works", + "tail": " — le manifeste et les collecteurs qui produisent le bloc kernel_params lu par l’adaptation." + } + ] + } +} diff --git a/web/messages/fr/docs/backup-restore/destinations/borg.json b/web/messages/fr/docs/backup-restore/destinations/borg.json new file mode 100644 index 00000000..f3aa0fc0 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/destinations/borg.json @@ -0,0 +1,234 @@ +{ + "meta": { + "title": "Destination Borg — types de dépôts, authentification SSH, chiffrement | ProxMenux", + "description": "La destination Borg enregistre les sauvegardes d’hôte ProxMenux dans un dépôt local, sur un disque externe monté ou sur un serveur distant via SSH. Cette page décrit la recherche de l’exécutable borg, les quatre options initiales de clé SSH, le chiffrement repokey, la configuration des destinations enregistrées et la rétention par tâche planifiée.", + "ogTitle": "Sauvegarde ProxMenux — Destination borg", + "ogDescription": "Comment ProxMenux enregistre les sauvegardes d’hôte dans des dépôts Borg avec authentification SSH et chiffrement repokey.", + "twitterTitle": "Destination de sauvegarde Borg: ProxMenux", + "twitterDescription": "Dépôts Borg locaux, USB et SSH pour les sauvegardes hôtes." + }, + "header": { + "title": "Borg", + "description": "La destination Borg écrit des sauvegardes d'hôte dans un dépôt Borg. Trois types de dépôt sont pris en charge : chemin du système de fichiers local, disque externe monté ou serveur distant via SSH. Déduplication au niveau du chunk dans toutes les archives du dépôt et cryptage facultatif des repokey.", + "section": "Sauvegarde et restauration" + }, + "aboutBorg": { + "heading": "Ce que Borg est", + "body": "Borg, aussi appelé BorgBackup, est un outil de sauvegarde libre avec déduplication, maintenu par la communauté Borg Backup. Il stocke chaque archive sous forme de blocs de longueur variable dans un dépôt. Les blocs sont partagés entre archives : sauvegarder à nouveau des données inchangées ne consomme presque aucun espace supplémentaire. Borg est indépendant de Proxmox et sert dans de nombreux environnements. ProxMenux l’utilise comme l’une des trois destinations de sauvegarde d’hôte ; les mécanismes décrits ici (types de dépôts, borg-serve via SSH, chiffrement repokey, prune) sont ceux de Borg." + }, + "intro": { + "title": "Déduplication par blocs avec dépôts locaux ou accessibles via SSH", + "body": "Un dépôt Borg stocke des blocs partagés entre toutes ses archives. Sauvegarder à nouveau un fichier inchangé ne transfère ni ne stocke de nouvelles données. ProxMenux utilise borg create pour sauvegarder et borg extract pour restaurer. Le dépôt peut se trouver sur le même système de fichiers que la source, sur un disque externe monté ou sur un hôte distant accessible via SSH." + }, + "binarySourcing": { + "heading": "Le binaire borg", + "intro": "Borg n'est pas une dépendance de base de l'installateur ProxMenux. Lorsqu'une sauvegarde s'exécute, hb_ensure_borg résout le binaire à partir de quatre sources dans l'ordre et retourne le premier qui fonctionne :", + "rows": [ + { + "priority": "1", + "source": "Système borg", + "detail": "Si l'hôte a déjà borg installé via APT (which borg résout), ce binaire est utilisé." + }, + { + "priority": "2", + "source": "Cache du répertoire d’état", + "detail": "/usr/local/share/proxmenux/borg — conservé d'un téléchargement préalable de GitHub sur cet hôte." + }, + { + "priority": "3", + "source": "Paquet AppImage du moniteur", + "detail": "/usr/local/share/proxmenux/monitor-app/usr/bin/borg — le AppImage regroupe un borg-linux64 signé. C'est le chemin hors ligne sécurisé : un hôte sans internet a toujours un borg fonctionnant." + }, + { + "priority": "4", + "source": "Téléchargement GitHub", + "detail": "wget contre l'URL borg-linux64 épinglée sous github.com/borgbackup/borg/releases/, vérifiée contre une constante SHA-256 dans lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). En cas de somme de contrôle incorrecte, le binaire est rejeté et la sauvegarde avorte. Le fichier téléchargé est mis en cache dans l'état dir afin que les sauvegardes suivantes utilisent le chemin 2." + } + ] + }, + "repoTypes": { + "heading": "Types de dépôts", + "intro": "Le type de dépôt est choisi lorsqu'une cible est ajoutée. Chaque type résout une URL de dépôt différente que Borg comprend.", + "rows": [ + { + "type": "remote", + "url": "ssh://USER@HOST/RPATH", + "detail": "Le dépôt vit sur un serveur distant qui exécute borg serve. Nécessite une connexion SSH à ce serveur." + }, + { + "type": "usb", + "url": "/mnt/MOUNTPOINT/borgbackup", + "detail": "Le dépôt vit sur un disque externe monté (habituellement USB). Le montage est résolu via hb_prompt_mounted_path, qui détecte, monte ou formate les partitions USB au besoin." + }, + { + "type": "local", + "url": "/backup/borgbackup (any absolute path)", + "detail": "Le dépôt vit dans un répertoire local. Signifiant seulement lorsque le répertoire cible est sur un disque physique séparé — un dépôt sur le même disque que la source protège contre l'erreur de l'opérateur mais pas contre la défaillance du disque." + } + ] + }, + "serverSetup": { + "heading": "Préparation du serveur Borg (côté serveur)", + "intro": "Le type de dépôt remote nécessite un serveur Borg fonctionnel accessible via SSH. ProxMenux ne configure pas le serveur lui-même : il autorise seulement une clé sur un compte existant. Cette section décrit les prérequis du serveur.", + "hostChoicesTitle": "Où le serveur peut vivre", + "hostChoicesBody": "Tout hôte Linux avec accès SSH se qualifie. Configurations communes :", + "hostChoicesItems": [ + "Un NAS dédié ou une boîte de sauvegarde (Debian, Ubuntu, TrueNAS SCALE avec un shell).", + "Un conteneur LXC à l'intérieur d'un nœud Proxmox. Petite empreinte, isolée de l'hôte exécutant les sauvegardes.", + "Un autre hôte Proxmox sur le même LAN, ou un VM n'importe où accessible sur SSH." + ], + "lxcWarningTitle": "LXC comme serveur Borg", + "lxcWarningBody": "Si le serveur Borg est dans un LXC, generate-auto nécessite un compte acceptant l’authentification SSH par mot de passe pour installer la clé. Sinon, utilisez l’installation manuelle ou l’alternative generate-pct via l’hôte PVE.", + "requirementsTitle": "Exigences sur le serveur", + "requirementsRows": [ + { + "requirement": "Exécutable borg dans /usr/bin/borg", + "detail": "La ligne command=\"/usr/bin/borg serve ...\" écrite par ProxMenux dans authorized_keys utilise ce chemin fixe. L’installation APT (apt install borgbackup) y place l’exécutable. Pour un binaire autonome, créez un lien symbolique à /usr/bin/borg." + }, + { + "requirement": "Un compte utilisateur dédié (généralement borg)", + "detail": "Possède le répertoire du dépôt et reçoit les connexions SSH entrantes. N'a pas besoin d'accès sudo ou shell — la ligne authorized_keys désactive de toute façon les shells interactifs." + }, + { + "requirement": "Un répertoire de dépôt en écriture", + "detail": "Le chemin que l'opérateur donne à ProxMenux (par exemple /backup/borgbackup) doit exister sur le serveur et être la propriété de l'utilisateur borg." + }, + { + "requirement": "SSH démon acceptant l'utilisateur borg", + "detail": "PubkeyAuthentication yes (par défaut). L'authentification par mot de passe n'est nécessaire que pour le flux generate-auto, une fois la clé installée, le serveur peut désactiver complètement le mot de passe auth." + } + ], + "minimalSetupTitle": "Configuration minimale du serveur", + "minimalSetupBody": "Sur un serveur Debian ou Ubuntu Borg, une référence de travail est quatre commandes comme root:", + "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", + "minimalSetupNote": "Une fois le serveur préparé et l’authentification SSH par mot de passe disponible, generate-auto installe la clé via un compte pouvant écrire dans authorized_keys de l’utilisateur borg. Les sauvegardes suivantes utilisent cette clé, limitée à borg serve au chemin configuré. Sans connexion par mot de passe, installez-la manuellement ou via l’hôte PVE." + }, + "sshAuth": { + "heading": "authentification SSH (côté client)", + "intro": "Les dépôts distants Borg sont accessibles sur SSH. La connexion passe de l'hôte ProxMenux à un compte utilisateur sur le serveur Borg qui exécute borg serve. Cet utilisateur s'appelle généralement borg, PAS l'utilisateur admin/root du serveur — la ligne de commande borg-serve verrouille la connexion à ce chemin de dépôt spécifique (voir les stratégies clés ci-dessous).", + "strategiesTitle": "Stratégies de clé SSH", + "strategiesIntro": "Lors de l’ajout d’une destination distante, ProxMenux demande l’utilisateur SSH, l’hôte et le chemin distant, puis propose quatre choix d’authentification. L’alternative generate-pct est proposée si l’authentification par mot de passe est refusée. Voici les modes :", + "strategyRows": [ + { + "mode": "generate-auto", + "label": "Recommandé", + "detail": "ProxMenux crée ou réutilise une paire de clés ed25519 dans ~/.ssh/borg_proxmenux_HOST_ed25519, puis utilise sshpass pour tester la connexion et installer la clé publique dans ~borg/.ssh/authorized_keys. Le mot de passe est celui d’un compte autorisé à écrire ce fichier, généralement root ou borg. Il sert pendant la configuration et n’est pas enregistré." + }, + { + "mode": "generate-manual", + "label": "Pas de mot de passe admin sur cet hôte", + "detail": "ProxMenux génère la paire de clés comme ci-dessus, mais affiche la ligne complète authorized_keys pour que l'opérateur colle manuellement dans le serveur. Le mot de passe administrateur ne quitte jamais l'hôte ProxMenux car il n'est jamais demandé." + }, + { + "mode": "generate-pct", + "label": "Le serveur Borg est un PVE LXC", + "detail": "Le serveur Borg fonctionne à l'intérieur d'un LXC sur un nœud PVE. ProxMenux autorise la clé via pct exec de l'hôte PVE — root sur l'hôte PVE écrit dans le LXC de ~borg/.ssh/authorized_keys sans avoir besoin de SSH dans le LXC lui-même." + }, + { + "mode": "existing", + "label": "Utiliser une clé existante", + "detail": "ProxMenux recherche dans /root/.ssh/ et $HOME/.ssh/ les clés privées ed25519/RSA qu’il peut lire, puis les liste. L’opérateur en choisit une ou indique manuellement un chemin non standard." + }, + { + "mode": "none", + "label": "Config par défaut SSH", + "detail": "Aucune clé personnalisée — Borg s'appuie sur la configuration par défaut de l'hôte SSH (généralement ~/.ssh/id_rsa ou un agent SSH)." + } + ], + "restrictTitle": "La ligne authorized_keys", + "restrictBody": "Pour chaque clé générée, la ligne authorized_keys écrite par ProxMenux sur le serveur limite la clé à cet appel borg-serve sur le chemin configuré du dépôt :", + "restrictLine": "command=\"/usr/bin/borg serve --restrict-to-path RPATH\",restrict PUBKEY", + "restrictNote": "Le command= force chaque session SSH en utilisant cette clé pour exécuter seulement la commande borg-serve; restrict désactive le renvoi de port, le renvoi d'agent, le renvoi de X11 et l'allocation de PTY. La clé ne peut pas être utilisée pour ouvrir un shell interactif sur le serveur ou pour accéder à tout autre chemin de dépôt, même si le compte a des privilèges plus larges." + }, + "savedTargets": { + "heading": "Objectifs enregistrés", + "intro": "Une destination enregistrée conserve la configuration du dépôt sous un nom lisible pour éviter de ressaisir les détails. Fichiers dans le répertoire d’état ProxMenux :", + "rows": [ + { + "file": "borg-targets.txt", + "content": "Une ligne par destination : NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE. hb_collect_borg_configs la lit pour remplir le menu de sélection des destinations." + }, + { + "file": "borg-pass-NAME.txt", + "content": "Phrase secrète de la destination nommée NAME ci-dessus (chmod 600). Présente uniquement si le chiffrement repokey a été choisi." + } + ], + "outro": "Enregistrer la destination est facultatif. Refuser omet la configuration nommée, mais ne supprime pas une clé SSH générée. Si le chiffrement repokey est activé sans destination enregistrée, ProxMenux conserve tout de même la phrase secrète dans l’ancien fichier borg-pass.txt." + }, + "encryption": { + "heading": "Cryptage", + "body": "Les dépôts sont initialisés avec un mode de chiffrement via hb_borg_init_if_needed: le borg repo-create -e MODE moderne quand disponible, ou le borg init --encryption=MODE hérité. ProxMenux expose deux modes : repokey (par défaut) et none. En mode repokey Borg stocke la clé de cryptage à l'intérieur du dépôt lui-même ; l'accès nécessite une phrase de passe, que ProxMenux invite pour deux fois avec vérification de concordance et enregistre dans borg-pass-NAME.txt pour une destination enregistrée, sinon dans l’ancien fichier décrit plus haut. Une boîte de dialogue de reconnaissance obligatoire s'affiche après l'enregistrement de la phrase de passe : la phrase de passe est la seule façon d'accéder aux archives chiffrées, et la perdre rend chaque archive du dépôt inrécupérable." + }, + "runtimeEnv": { + "heading": "Environnement d'exécution", + "intro": "ProxMenux exporte les variables d'environnement suivantes avant d'invoquer borg. Ils configurent la connexion et déverrouillent le dépôt sans intégrer de secrets dans la ligne de commande.", + "rows": [ + { + "var": "BORG_RSH", + "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", + "purpose": "Commande distante utilisée par Borg pour les dépôts SSH. Une clé sélectionnée ajoute les options d’identité ; un port non standard ajoute -p PORT. Sans clé personnalisée et avec le port par défaut, la variable reste non définie et Borg utilise la configuration SSH de l’hôte." + }, + { + "var": "BORG_PASSPHRASE", + "value": "(Passphrase de borg-pass-NAME.txt)", + "purpose": "Débloque le repokey. Définir uniquement lorsque la cible utilise le chiffrement repokey. N'apparaît jamais dans la liste des arguments du processus." + }, + { + "var": "BORG_ENCRYPT_MODE", + "value": "repokey | none", + "purpose": "Utilisé par hb_borg_init_if_needed lors de l'initialisation d'un dépôt qui n'existe pas encore. Ignoré par borg create sur les dépôts existants." + }, + { + "var": "BORG_RELOCATED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Supprime la confirmation interactive demandée par Borg lorsque l’URL du dépôt diffère de celle utilisée initialement, par exemple après avoir renommé un point de montage ou changé l’adresse du serveur SSH." + }, + { + "var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Supprime l'invite interactive Borg soulève la première fois qu'un dépôt non chiffré est accessible depuis un nouveau client." + } + ] + }, + "archiveFormat": { + "heading": "Nom et conservation des archives", + "intro": "Chaque sauvegarde crée une nouvelle archive dans le dépôt.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS", + "retentionBody": "Pour les tâches programmées, run_scheduled_backup.sh exécute borg prune contre le dépôt après chaque sauvegarde réussie avec les valeurs de conservation configurées sur le travail (--keep-last, --keep-daily, --keep-weekly). Les sauvegardes interactives ne se prunent pas." + }, + "restoreAccess": { + "heading": "Récupération du côté restauration", + "body": "Le flux de restauration liste les archives avec borg list REPO et extrait celui sélectionné avec borg extract REPO::ARCHIVE-NAME dans un répertoire de mise en scène que _rs_check_layout alimente dans le pipeline de restauration standard. Pour la récupération manuelle à l'extérieur de ProxMenux les mêmes commandes fonctionnent; l'arborescence extraite est la mise en page standard à trois payload décrite dans Comment ça marche." + }, + "references": { + "heading": "Références", + "intro": "Documentation officielle de Borg pour les composants utilisés par ProxMenux.", + "items": [ + { + "label": "Documentation borg", + "href": "https://borgbackup.readthedocs.io/", + "tail": "— point d'entrée principal couvrant les concepts, le déploiement, le démarrage rapide et chaque commande." + }, + { + "label": "borg create", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/create.html", + "tail": " — la commande utilisée par ProxMenux pour chaque sauvegarde, avec toutes les options prises en charge." + }, + { + "label": "Chiffrement des dépôts", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/init.html#encryption-mode", + "tail": "— les modes de cryptage pris en charge par Borg, y compris la repokey que ProxMenux utilise par défaut." + }, + { + "label": "borg serve et déploiement via SSH", + "href": "https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html", + "tail": " — configuration d’un serveur Borg central accessible via SSH, avec la commande borg-serve et l’option restrict-to-path inscrites par ProxMenux dans authorized_keys." + }, + { + "label": "borg prune", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/prune.html", + "tail": " — le modèle de rétention de --keep-last / --keep-daily / --keep-weekly appliqué par ProxMenux à chaque tâche planifiée." + } + ] + } +} diff --git a/web/messages/fr/docs/backup-restore/destinations/index.json b/web/messages/fr/docs/backup-restore/destinations/index.json new file mode 100644 index 00000000..ff0d8970 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/destinations/index.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Destinations des sauvegardes — archive locale, Proxmox Backup Server et Borg | ProxMenux", + "description": "Trois moteurs de stockage reçoivent la même charge utile de sauvegarde ProxMenux : une archive locale .tar.zst sur tout système de fichiers accessible en écriture, une sauvegarde PBS dans un datastore Proxmox Backup Server ou une archive Borg dans un dépôt Borg local ou distant. Chaque moteur a ses propres caractéristiques de compression, de déduplication, de chiffrement et de réseau.", + "ogTitle": "Destinations de sauvegarde ProxMenux", + "ogDescription": "Local, Proxmox Backup Server et Borg — trois moteurs de stockage pour la même charge utile de sauvegarde d'hôte.", + "twitterTitle": "Destinations de sauvegarde ProxMenux | ProxMenux", + "twitterDescription": "Archives locales, moteurs Proxmox Backup Server et Borg pour les sauvegardes d'hôte." + }, + "header": { + "title": "Destinations", + "description": "Trois backends de stockage pris en charge par ProxMenux Backup: archive locale, Proxmox Backup Server (recommandé) et Borg. Chacun reçoit la même archive à trois charges; ils diffèrent en format de stockage, déduplication, modèle de chiffrement et exigences du réseau.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "title": "Même charge utile, trois moteurs", + "body": "Chaque sauvegarde produit les mêmes trois charges utiles (rootfs, manifeste, applications). Ce qui change entre les destinations, c'est comment ces charges sont stockées et comment l'opérateur les récupère pour une restauration. Chaque moteur est implémenté comme une fonction séparée dans backup_host.sh — _bk_local, _bk_pbs, _bk_borg — mais les trois partagent la même étape de préparation temporaire (hb_prepare_staging) et le même chemin de code de restauration. Le choix de la destination n'affecte que l'écriture et la récupération ; il ne change pas ce qu'une restauration fait ou comment elle consomme l'archive." + }, + "comparison": { + "heading": "Comparaison des caractéristiques", + "intro": "Le tableau suivant répertorie les différences concrètes entre les trois backends tels qu'ils se comportent dans ProxMenux aujourd'hui. Toutes les valeurs décrivent le comportement observé du backend lui-même, et non des recommandations éditoriales.", + "rows": [ + { + "feature": "Format de stockage", + "local": "Un seul fichier .tar.zst (ou .tar.gz si zstd est absent).", + "pbs": "Sauvegarde PBS (blocs .pxar dans le datastore).", + "borg": "Archive Borg à l'intérieur d'un dépôt Borg (fichiers de segments)." + }, + { + "feature": "Compression", + "local": "zstd (niveau par défaut) via tar --zstd. Repli sur gzip.", + "pbs": "Gérée par proxmox-backup-client. ProxMenux ne modifie pas les paramètres de compression.", + "borg": "Compression intégrée à Borg. ProxMenux appelle borg create sans modifier les paramètres de compression." + }, + { + "feature": "Déduplication", + "local": "Aucune. Chaque sauvegarde est une archive indépendante complète.", + "pbs": "Déduplication complète de niveau chunk sur toutes les sauvegardes dans le datastore.", + "borg": "Déduplication complète au niveau des blocs entre toutes les archives du dépôt." + }, + { + "feature": "Chiffrement au repos", + "local": "Aucun (dépend de la protection au niveau du système de fichiers).", + "pbs": "Chiffrement facultatif côté client avec un fichier de clé. Si activé, le blob de récupération est envoyé dans un groupe de sauvegarde distinct.", + "borg": "Chiffrement facultatif des repokey (clé stockée dans la repo, déverrouillée par une phrase de passe)." + }, + { + "feature": "Rétention / purge", + "local": "Appliquée par tâche programmée via KEEP_LAST. Les anciennes archives sont supprimées avec leurs fichiers annexes et journaux d’exécution. Les sauvegardes interactives ne font pas de purge.", + "pbs": "Appliquée par tâche programmée via proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly. Les sauvegardes interactives ne font pas de purge.", + "borg": "Appliquée par tâche programmée via borg prune --keep-last / --keep-daily / --keep-weekly. Les sauvegardes interactives ne font pas de purge." + }, + { + "feature": "Réseau", + "local": "Aucune. Écrit à un point de montage local (généralement un disque interne ou un lecteur USB).", + "pbs": "TCP vers le serveur PBS (port par défaut 8007). Nécessite des identifiants PBS + empreinte du certificat.", + "borg": "Chemin du système de fichiers local ou tunnel SSH vers un hôte Borg distant." + }, + { + "feature": "Dépendances", + "local": "tar, zstd (présent sur Proxmox par défaut).", + "pbs": "Paquet proxmox-backup-client (fourni avec Proxmox VE 8+).", + "borg": "borg binaire. Auto-provisionné par ProxMenux à partir du paquet Moniteur AppImage quand il manque." + }, + { + "feature": "Accès pour restaurer", + "local": "Tout hôte avec tar+zstd peut extraire l'archive. Pas de PBS/Borg nécessaire.", + "pbs": "Nécessite proxmox-backup-client, les identifiants PBS et le fichier de clé (si la sauvegarde est chiffrée).", + "borg": "Nécessite borg + le chemin du dépôt + la phrase de passe (si chiffrée)." + } + ], + "captionCode": "feature", + "captionLocal": "Locale", + "captionPbs": "Proxmox Backup Server (recommandé)", + "captionBorg": "Borg" + }, + "sameArchive": { + "heading": "La disposition des archives ne change pas avec la destination", + "body": "A l'intérieur de l'une des trois destinations, la même disposition rootfs/ + metadata/ + manifest.json décrite dans Comment ça marche est présente. Un .tar.zst extrait d'une archive locale, un .pxar restauré de PBS et une archive Borg extraite de borg extract donnent tous un arbre de répertoire identique. Le chemin du code de restauration (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) lit les mêmes trois charges utiles sans savoir de quelle destination elles proviennent." + }, + "extractStandalone": { + "heading": "Extraire une sauvegarde à l'extérieur de ProxMenux", + "intro": "N'importe lequel des trois formats d'archive peut être lu avec des outils standard sans ProxMenux installé sur l'hôte de lecture. Les commandes ci-dessous produisent le même arbre de répertoire qu'une restauration consomme en interne.", + "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": "# Depuis une archive Borg (nécessite borg et la phrase de passe des dépôts chiffrés) :\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# Sur un dépôt distant accessible par SSH :\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME", + "note": "L'arbre extrait peut ensuite être inspecté manuellement ou alimenté à une restauration manuelle. Consultez les pages de destination individuelles pour connaître le processus de récupération exact que ProxMenux utilise sous le capot." + }, + "whereNext": { + "heading": "Détails par destination", + "intro": "Chaque destination a sa propre page couvrant le flux de configuration, le format sur disque et la commande de récupération utilisée par la restauration.", + "items": [ + { + "label": "Archives locales", + "href": "/docs/backup-restore/destinations/local", + "tail": "— pré-configuration d'une cible locale, montage d'un lecteur USB, vérification de sécurité contre l'écriture de l'archive en soi, le sidecar JSON qui permet au moniteur d'identifier le fichier." + }, + { + "label": "Proxmox Backup Server (recommandé)", + "href": "/docs/backup-restore/destinations/pbs", + "tail": " — choix du datastore, identifiants et empreinte du certificat, cycle de vie du fichier de clé, phrase de passe de récupération et envoi du blob de récupération à PBS pour restaurer après une nouvelle installation." + }, + { + "label": "Borg", + "href": "/docs/backup-restore/destinations/borg", + "tail": " — dépôts locaux ou accessibles par SSH, provenance du binaire Borg (système / cache / paquet AppImage de Monitor / téléchargement GitHub), initialisation du dépôt, gestion des phrases de passe et configuration des clés SSH pour les dépôts distants." + } + ] + } +} diff --git a/web/messages/fr/docs/backup-restore/destinations/local.json b/web/messages/fr/docs/backup-restore/destinations/local.json new file mode 100644 index 00000000..0a89acf8 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/destinations/local.json @@ -0,0 +1,75 @@ +{ + "meta": { + "title": "Destination d'archive locale — tar.zst sur un système de fichiers ou un lecteur USB ProxMenux", + "description": "La destination de sauvegarde locale écrit une seule archive .tar.zst dans n'importe quel répertoire accessible en écriture : un disque interne, un point de montage Proxmox, un partage NFS ou un lecteur USB. Cette page décrit le processus de configuration, la détection USB et la logique de montage, le contrôle de sécurité contre l'écriture de l'archive dans un chemin en cours de sauvegarde, et le sidecar JSON qui identifie le fichier.", + "ogTitle": "Sauvegarde ProxMenux — Destination des archives locales", + "ogDescription": "Comment ProxMenux écrit des sauvegardes locales comme archives .tar.zst et comment configurer le répertoire de destination ou le lecteur USB.", + "twitterTitle": "Destination de sauvegarde locale ProxMenux", + "twitterDescription": "Comment ProxMenux écrit des sauvegardes locales comme des archives .tar.zst sur un système de fichiers ou un lecteur USB." + }, + "header": { + "title": "Archives locales", + "description": "La destination locale écrit une seule archive tar compressée dans n'importe quel répertoire accessible en écriture sur l'hôte : un disque interne, un montage NFS ou SMB ou un lecteur USB.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "title": "Un fichier autonome", + "body": "Une sauvegarde locale produit un seul fichier hostcfg-HOST-TIMESTAMP.tar.zst (ou .tar.gz lorsque zstd est absent). Le fichier contient l'arborescence entière de l'archive — manifest.json, metadata/ et rootfs/ — et peut être restauré sur n'importe quel hôte Proxmox avec le flux de restauration ProxMenux ou extrait manuellement avec tar --zstd -xf sur n'importe quel système Linux. Pas de serveur, pas d’initialisation de dépôt, pas de dépendance externe. C'est la destination avec le chemin de récupération le plus court lorsque ni PBS ni Borg n'est disponible." + }, + "targetConfig": { + "heading": "Configuration du répertoire cible", + "intro": "La destination locale est un unique répertoire cible enregistré durablement — pas une liste. ProxMenux stocke le choix de l'opérateur chez /usr/local/share/proxmenux/local-target.conf et le lit sur chaque sauvegarde. Lorsqu'aucune cible n'a été configurée, le HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump par défaut est utilisé (le même répertoire que Proxmox utilise pour ses propres sorties vzdump). La cible est configurée à partir de Configurer les destinations de sauvegarde → Destinations locales:", + "options": [ + "Utilisez par défaut (/var/lib/vz/dump). Le stockage local Proxmox. Présent sur chaque install Proxmox ; l'archive se trouve à côté des sorties vzdump et est captée automatiquement par l'onglet Sauvegardes du moniteur.", + "Entrez un chemin personnalisé. Tout chemin absolu du système de fichiers peut être utilisé : un montage NFS, un partage SMB monté via fstab, un jeu de données ZFS dédié, un deuxième disque interne. ProxMenux valide que le chemin existe et est un répertoire avant de l’enregistrer.", + "Choisissez un lecteur USB. Ouvre le sous-menu USB (ci-dessous), qui détecte les appareils amovibles et propose de monter ou de formater un périphérique." + ] + }, + "usbFlow": { + "heading": "Détection et montage du lecteur USB", + "intro": "Le sous-menu USB énumère les partitions sur les périphériques amovibles signalées par lsblk. Chaque partition est présentée avec sa taille, l'étiquette du système de fichiers et l'état actuel. L'état détermine l'action ProxMenux offre.", + "statesTitle": "Les trois états de l'appareil", + "stateRows": [ + { + "state": "monté", + "shown": "Taille · étiquette · [fstype] · → /mount/point", + "action": "La partition est déjà montée quelque part. La sélection enregistre le point de montage actuel en tant que cible locale. Aucun montage n'est effectué." + }, + { + "state": "non monté", + "shown": "Taille · étiquette · [fstype] · (non monté — sera monté)", + "action": "Un système de fichiers est présent mais n'est pas monté. Lors de la confirmation, ProxMenux exécute hb_mount_usb_partition : crée /mnt/backup-LABEL (ou un chemin basé sur UUID s'il n'y a pas d'étiquette), monte la partition et persiste le point de montage comme cible locale." + }, + { + "state": "vide", + "shown": "Taille · disque USB brut — aucun système de fichiers (sera FORMATÉ)", + "action": "Le périphérique n’a pas de système de fichiers. Cette opération destructive est protégée par deux confirmations. Une boîte de dialogue Oui/Non avertit d’abord que le disque sera effacé. Ensuite, un champ exige de saisir le chemin exact du périphérique (par exemple /dev/sdb) avant que ProxMenux crée une nouvelle table GPT avec une partition ext4 et la monte." + } + ], + "notMountedFallback": "Lorsqu'aucun périphérique USB n'est détecté, le sous-menu revient à une boîte d'entrée simple. L'opérateur peut entrer un chemin de point de montage arbitraire ; si le chemin n'est pas un point de montage enregistré, une boîte de dialogue de confirmation avertit avant de procéder." + }, + "safetyCheck": { + "heading": "Contrôle de sécurité — destination dans un chemin de sauvegarde", + "body": "Avant d'écrire l'archive, _bk_local vérifie que le répertoire de destination n'est pas un sous-chemin d'un répertoire en cours de sauvegarde. Une erreur courante consisterait à ajouter /root au profil et à choisir /root/backups comme destination — l'archive s'inclurait alors elle-même, produisant soit une archive corrompue, soit s'agrandissant sans limite jusqu'à ce que le disque se remplisse. La vérification résout les deux chemins avec readlink -m, les compare et, en cas de conflit, abandonne la sauvegarde avec une boîte de dialogue qui nomme le chemin en conflit et répertorie trois façons de le résoudre : choisissez une destination en dehors du chemin en conflit, supprimez l'entrée personnalisée qui contient la destination ou utilisez le mode personnalisé pour décocher le chemin en conflit pour cette exécution." + }, + "archiveFormat": { + "heading": "Format d'archives et compression", + "intro": "Le nom du fichier contient le nom d’hôte source et l’horodatage de la sauvegarde, afin de permettre un tri chronologique dans un répertoire contenant plusieurs archives et d’identifier chaque fichier.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS.tar.zst", + "compressionTitle": "Compression", + "compressionBody": "Le chemin primaire utilise tar --zstd -cf — un pipeline à commande unique qui compresse au niveau par défaut de zstd. Lorsque zstd n'est pas présent sur la source (rare sur Proxmox mais possible sur des installations minimales), ProxMenux revient à gzip. Dans le chemin de repli, si pv est disponible, une barre de progression est ajoutée au pipeline afin que l'opérateur voit la taille des archives croître en temps réel; sans pv, tar -czf est utilisé en silence.", + "sourceTitle": "Ce qui va dans l'archive", + "sourceBody": "La commande tar est appelée avec -C \"$staging_root\" ., ce qui archive toute la racine du répertoire temporaire : rootfs/, metadata/ et manifest.json. Les trois blocs de données se trouvent côte à côte à la racine de l’archive tar. L’extraction produit exactement l’arborescence utilisée par le code de restauration." + }, + "sidecar": { + "heading": "Le sidecar JSON", + "intro": "Chaque sauvegarde locale réussie produit un fichier compagnon : HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, écrit à côté de l'archive par hb_write_archive_sidecar. Ce petit fichier JSON permet au ProxMenux Monitor d'identifier l'archive comme une sauvegarde d'hôte ProxMenux même s'il est déplacé, rebaptisé ou archivé ailleurs.", + "contentTitle": "Contenu du sidecar", + "contentBody": "Le sidecar stocke la version du schéma, que la sauvegarde soit issue d'une opération interactive ou d'un travail programmé (kind), l'ID de travail pour les opérations programmées, le mode de profil utilisé (default ou custom), le nom d'hôte source, le nom de base d'archive original, un horodatage de création ISO-8601 et la taille des archives en octets.", + "whyBody": "L'onglet Sauvegardes du moniteur scanne les répertoires locaux configurés pour les sidecars *.proxmenux.json — pas pour les fichiers *.tar.zst — parce qu'un .tar.zst sans sidecar pourrait ne pas être une sauvegarde ProxMenux du tout. Le scan est rapide (les fichiers JSON sont minuscules) et l'appariement est stable à travers les renoms de l'archive aussi longtemps que le sidecar est renommé pour correspondre." + }, + "restoreAccess": { + "heading": "Restauration à partir d'une archive locale", + "body": "Le flux de restauration ProxMenux découvre les archives locales en scannant la cible locale configurée pour les sidecars et en les affichant dans la liste des archives. La sélection d’une archive déclenche _rs_check_layout, qui extrait le tarball dans un répertoire de préparation temporaire et confirme la mise en page à trois payload avant de procéder. Pour l'extraction manuelle à l'extérieur de ProxMenux, tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg donne le même arbre que le code de restauration consommé." + } +} diff --git a/web/messages/fr/docs/backup-restore/destinations/pbs.json b/web/messages/fr/docs/backup-restore/destinations/pbs.json new file mode 100644 index 00000000..ef0daf61 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/destinations/pbs.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Proxmox Backup Server destination — dépôt, chiffrement, récupération ProxMenux", + "description": "La destination PBS enregistre les sauvegardes d’hôte ProxMenux au format PBS. Cette page décrit la détection des dépôts dans /etc/pve/storage.cfg, la configuration manuelle, l’envoi des archives .pxar, le chiffrement côté client avec un fichier clé et sa copie de secours facultative protégée par une phrase secrète, ainsi que sa récupération depuis plusieurs sources sur un hôte réinstallé.", + "ogTitle": "ProxMenux Sauvegarde — Proxmox Backup Server destination", + "ogDescription": "Comment ProxMenux écrit des sauvegardes d'hôte à Proxmox Backup Server avec le cryptage de fichier clé côté client et la récupération séquestre.", + "twitterTitle": "PBS destination de sauvegarde ProxMenux", + "twitterDescription": "Destination Proxmox Backup Server avec chiffrement par fichier clé et copie de récupération protégée par une phrase secrète." + }, + "header": { + "title": "Proxmox Backup Server", + "description": "La destination PBS envoie tout le répertoire de préparation sous forme d’une seule sauvegarde .pxar vers un datastore Proxmox Backup Server. Le chiffrement côté client avec un fichier clé est facultatif, tout comme l’envoi, à côté de chaque sauvegarde, d’une copie de récupération de la clé protégée par une phrase secrète.", + "section": "Sauvegarde et restauration" + }, + "recommendedBadge": "Destination recommandée", + "aboutPbs": { + "heading": "Qu'est-ce que Proxmox Backup Server", + "body": "Proxmox Backup Server (PBS) est le propre produit serveur de sauvegarde de Proxmox, développé et entretenu par la même équipe que les auteurs Proxmox VE. Il s'agit d'un serveur de sauvegarde dédié conçu pour recevoir des sauvegardes des hôtes Proxmox VE (VMs, LXCs et — via proxmox-backup-client — répertoires d'hôtes arbitraires) avec déduplication basée sur le chunk, chiffrement côté client et politiques de rétention appliquées côté serveur. ProxMenux utilise le PBS comme l'une des trois destinations pour les sauvegardes d'hôtes; chaque mécanisme spécifique au PBS décrit sur cette page (groupes de sauvegarde, archives .pxar, --backup-id, cryptage de fichiers clés) est le comportement standard du PBS." + }, + "intro": { + "title": "Une sauvegarde par exécution, déduplication par blocs", + "body": "Une sauvegarde PBS crée une seule entrée dans le datastore, sous l’identifiant host/hostcfg-HOSTNAME/BACKUP-TIME. Les données sont une archive .pxar contenant la même structure en trois blocs que celle décrite dans Fonctionnement. PBS déduplique les blocs entre toutes les sauvegardes du datastore : les suivantes ne transfèrent et ne stockent que les blocs modifiés de cet hôte. Pour les tâches planifiées, ProxMenux applique lui-même la rétention : après chaque exécution réussie, run_scheduled_backup.sh lance proxmox-backup-client prune avec --keep-last / --keep-daily / --keep-weekly et les valeurs configurées pour la tâche." + }, + "repoSelection": { + "heading": "Sélection du dépôt", + "intro": "ProxMenux découvre des dépôts PBS de deux sources sur chaque sauvegarde. L'opérateur en choisit un dans un menu unifié; le choix détermine HB_PBS_REPOSITORY, HB_PBS_SECRET et HB_PBS_FINGERPRINT pour l'exécution.", + "sourceRows": [ + { + "source": "storage.cfg de Proxmox (détection automatique)", + "path": "/etc/pve/storage.cfg + /etc/pve/priv/storage/NAME.pw", + "content": "Toute stanza pbs: dans la configuration de stockage propre de Proxmox est captée automatiquement. Serveur, datastore, nom d'utilisateur et empreinte digitale viennent de la stanza. Le mot de passe est lu dans le propre répertoire d'identification de Proxmox. Aucune réentrée nécessaire du côté ProxMenux — le dépôt est disponible dès qu'il est configuré dans Proxmox." + }, + { + "source": "Configuration manuelle ProxMenux", + "path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt", + "content": "Ajouté de Configurer les destinations de sauvegarde → PBS destinations → Ajouter PBS. Prompts pour un nom, nom d'utilisateur (root@pam ou user@pbs!token), hôte ou IP, datastore et mot de passe. Le mot de passe reprend sur l'entrée vide — une sauvegarde vide persisterait silencieusement et chaque sauvegarde ultérieure échouerait avec une erreur d'authentification opaque. Ce chemin est utilisé lorsque la cible PBS n'est pas enregistrée comme stockage Proxmox." + } + ], + "menuTitle": "Menu de sélection", + "menuBody": "Les deux sources sont affichées dans un menu unique, chaque ligne marquée avec son origine ([proxmox] ou [manual]). Les entrées dont le mot de passe n'a pas pu être résolu sont marquées d'un avertissement ⚠ no password – la sélection d'une entrée déclenche une réentrée de mot de passe avant le début de la sauvegarde. L'empreinte digitale est transmise à proxmox-backup-client via la variable d'environnement PBS_FINGERPRINT; en cas d'absence, le client demande à l'opérateur d'accepter le certificat serveur de manière interactive lors de la première sauvegarde." + }, + "backupCommand": { + "heading": "La commande de sauvegarde", + "intro": "L’envoi se fait en un seul appel à proxmox-backup-client backup. ProxMenux utilise env pour transmettre au client le mot de passe, le mot de passe de chiffrement et l’empreinte sous forme de variables d’environnement.", + "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": "Nom de l'ID de sauvegarde", + "backupIdBody": "L’identifiant de sauvegarde par défaut est hostcfg-HOSTNAME. L’opérateur doit le confirmer ou le modifier avant l’envoi ; les caractères hors de [A-Za-z0-9_-] et les tirets finaux sont supprimés. Réutiliser le même identifiant est volontaire : PBS le considère comme un groupe. Chaque sauvegarde suivante devient une nouvelle entrée du groupe et partage la déduplication avec les précédentes.", + "pxarTitle": "Pourquoi la source est la racine de mise en scène complète", + "pxarBody": "La source .pxar est la totalité du staging_root — rootfs/, metadata/ et manifest.json ensemble. Les versions antérieures ont passé le $staging_root/rootfs comme source; cela a laissé le metadata/ hors de l'archive et la vérification de compatibilité de la restauration n'avait rien à lire, dégradant aux avertissements cross-host même sur les restaurations même-host. Les anciennes sauvegardes créées avec la source rootfs-only restaure toujours correctement via la branche case-_rs_check_layout de 3, qui enveloppe un arbre plat etc/var/root/usr dans une hiérarchie rootfs/." + }, + "encryption": { + "heading": "Chiffrement côté client", + "glossaryHint": "Cette section emploie les termes fichier clé, phrase secrète et enveloppe de récupération. Le glossaire résume leurs différences en une phrase par terme.", + "intro": "Le chiffrement PBS côté client avec un fichier clé chiffre les blocs sur l’hôte source avant leur envoi. Dans ProxMenux, il est facultatif. Une fois activé, l’opérateur choisit explicitement, par oui ou non lors de la configuration, s’il faut aussi déposer sur PBS une copie de récupération du fichier clé protégée par une phrase secrète ; ce choix reste modifiable dans le moniteur. Le fichier clé se trouve toujours au chemin canonique /usr/local/share/proxmenux/pbs-key.conf et est réutilisé sans nouvelle demande pour chaque sauvegarde chiffrée suivante.", + "keyfileTitle": "Configuration du fichier de clés", + "keyfileBody": "Le dialogue de chiffrement apparaît lors de la première sauvegarde chiffrée de l’hôte. Il demande d’abord s’il faut chiffrer la sauvegarde : Non poursuit sans chiffrement, Oui passe à la deuxième étape. Celle-ci dépend de la présence d’un fichier clé dans /usr/local/share/proxmenux/pbs-key.conf. S’il existe, il est réutilisé sans nouvelle demande et la sauvegarde continue ; les suivantes ne reposent pas la question. Sinon, un menu propose deux options. Générer un nouveau fichier clé exécute proxmox-backup-client key create --kdf none. Utiliser un fichier clé existant détecte automatiquement une clé gérée par PVE : si le dépôt PBS choisi est enregistré dans Proxmox avec une clé de chiffrement dans /etc/pve/priv/storage/<NAME>.enc, ce fichier est copié sans demande au chemin canonique ProxMenux. Si aucune clé PVE ne correspond au dépôt, le dialogue demande le chemin absolu où l’opérateur a déjà placé le fichier clé sur cet hôte. Dans les deux cas, le fichier est installé au chemin canonique avec chmod 600.", + "modesTitle": "Fichier clé par hôte ou partagé", + "modesIntro": "Les deux modes sont pris en charge, sans en imposer un : l’opérateur choisit selon l’organisation de son parc.", + "modesPerHostTitle": "Fichier de clés par hôte (par défaut)", + "modesPerHostBody": "Chaque hôte génère son propre fichier de clé la première fois qu'il permet le cryptage PBS. L'isolement est maximal : compromettre le fichier clé d'un hôte n'expose les sauvegardes d'aucun autre. Recommandé pour les flottes de production et pour les environnements où les hôtes ont différents propriétaires ou limites de conformité.", + "modesSharedTitle": "Fichier de clés partagé (import sur chaque hôte)", + "modesSharedBody": "Un fichier clé principal généré une fois et installé sur chaque hôte via l’option Utiliser un fichier clé existant. La gestion est plus simple: un seul secret à sauvegarder, et tout hôte peut déchiffrer les archives de n'importe quel autre (utile pour la consolidation, les exercices de restauration cross-host ou la vérification centralisée de sauvegarde). Le compromis est qu'une fuite du fichier de clés partagé expose chaque hôte à la fois. Recommandé pour les labos et les flottes où tous les hôtes ont le même propriétaire et la même limite de confiance.", + "recoveryTitle": "Déposer la clé sur PBS : l’opérateur décide", + "recoveryBody": "Juste après le choix du fichier clé, ProxMenux pose une question explicite, Déposer la clé sur PBS ?, avec deux réponses. Aucun élément de récupération n’est envoyé à PBS tant que l’opérateur n’a pas répondu Oui. Le choix par défaut est Non, conserver uniquement en local : le fichier clé reste au chemin canonique local, ProxMenux n’envoie aucun élément de récupération à PBS et l’opérateur gère lui-même la copie hors site. Le bouton Télécharger le fichier clé du moniteur, dans la ligne du dépôt PBS, permet de l’obtenir à la demande. Choisir Oui, envoyer demande deux saisies identiques d’une phrase secrète de récupération. ProxMenux protège le fichier clé avec cette phrase par AES-256-CBC et PBKDF2 (600 000 itérations, sel aléatoire), produisant pbs-key.recovery.enc. Chaque sauvegarde chiffrée suivante envoie cette enveloppe à PBS dans un groupe de sauvegarde associé. Ces envois ne transmettent à PBS ni la phrase secrète ni le fichier clé en clair. Le choix reste modifiable à tout moment dans le moniteur : le contrôle de la ligne PBS permet Oui ou Non et applique immédiatement Démarrer l’envoi, Arrêter l’envoi ou Modifier la phrase secrète selon l’état courant.", + "blobUploadTitle": "Groupe de sauvegarde associé sur PBS", + "blobUploadBody1": "Lorsque le mode de dépôt est Oui, envoyer, ProxMenux envoie l’enveloppe de récupération à PBS après chaque sauvegarde chiffrée, dans un second groupe associé. Son nom reprend celui du groupe de l’hôte avec le suffixe -keyrecovery. Les deux groupes se trouvent côte à côte dans le datastore : l’un pour les sauvegardes de l’hôte, l’autre pour les enveloppes de récupération. L’enveloppe ne quitte jamais l’hôte en clair : le chiffrement se fait sur l’hôte avec AES-256-CBC et PBKDF2 avant toute transmission (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS ne reçoit que l’enveloppe déjà chiffrée.", + "envelopeSecurityTitle": "Le téléchargement du fichier de récupération de clé vers PBS est-il un risque de sécurité?", + "envelopeSecurityBody": "Le fichier de récupération des clés est chiffré en transit et au repos. Le mot de passe de récupération ne quitte jamais l'hôte : le chiffrement se produit localement avant le téléchargement, et PBS ne voit que le résultat déjà chiffré. Un administrateur PBS — ou toute personne ayant accès à la datastore — peut télécharger le fichier de récupération de clé, mais sans la phrase de récupération, ils ne peuvent pas lire le fichier de clé à l'intérieur : c'est un chiffrement opaque. Reconstruire le fichier de clés nécessite les deux pièces à la fois, le fichier de récupération de clés et la phrase de passe, et seul l'opérateur détient les deux.", + "blobUploadConstraintTitle": "Pourquoi deux groupes au lieu d'un seul crypté", + "blobUploadConstraintBody": "Un seul appel à proxmox-backup-client backup chiffre toutes ses archives avec le même fichier clé, ou aucune : il ne permet pas de mélanger les deux. La sauvegarde de l’hôte doit être chiffrée avec sa clé, mais l’enveloppe de récupération ne peut pas être envoyée dans le même appel : elle serait alors chiffrée avec le fichier clé qu’elle contient. Sur un hôte réinstallé, il serait impossible de l’ouvrir, puisqu’il faudrait la clé pour déchiffrer cette même clé. Les deux éléments sont donc envoyés indépendamment et apparaissent dans deux groupes. Le client PBS chiffre la sauvegarde de l’hôte avec le fichier clé ; ProxMenux chiffre l’enveloppe avec la phrase secrète avant son envoi. Deux couches de chiffrement distinctes protègent deux éléments différents.", + "blobUploadImageAlt": "PBS UI montrant les groupes de sauvegarde hostcfg-HOSTNAME et hostcfg-HOSTNAME-keyrecovery adjacents à la liste datastore.", + "blobUploadImageCaption": "PBS UI — les groupes de sauvegarde appariés. Le groupe principal détient les sauvegardes de l'hôte; le groupe -keyrecovery détient le fichier de clés enveloppé de la phrase de passe.", + "recoverTitle": "Récupération sur un hôte frais", + "recoverBody": "Lorsque le fichier clé manque au chemin canonique, après une réinstallation ou une suppression explicite, la restauration essaie trois sources dans l’ordre et retient la première clé utilisable. D’abord, si une clé gérée par PVE correspond au dépôt PBS choisi dans /etc/pve/priv/storage/<NAME>.enc, elle est copiée sans demande au chemin canonique. Ensuite, si un groupe -keyrecovery existe sur PBS, son instantané le plus récent est téléchargé et la phrase secrète de récupération est demandée pour le déchiffrer. Enfin, si les deux options échouent ou sont refusées, le dialogue demande le chemin absolu du fichier clé sur cet hôte et le copie au chemin canonique. Le moniteur propose le même import dans la fenêtre de détail de la sauvegarde. Un panneau ambre apparaît en haut lorsque Restaurer, Télécharger ou Voir le contenu nécessite une clé absente. Si une clé est installée mais ne correspond pas à celle du chiffrement, PBS renvoie wrong key — manifest's key XX does not match provided key YY. Les mêmes trois actions affichent alors un panneau structuré mettant en évidence l’empreinte exigée par le manifeste, afin de déterminer quelle clé importer pour ouvrir cette sauvegarde.", + "monitorManagementTitle": "Gestion du fichier clé depuis le moniteur", + "monitorManagementBody": "Le moniteur affiche les commandes du fichier clé directement dans chaque ligne de destination PBS de la page de configuration des sauvegardes. Trois actions sont proposées : Télécharger exporte le fichier actuel vers le navigateur ; Envoyer remplace le fichier installé par celui fourni par l’opérateur, l’ancien n’étant écrasé qu’après l’installation réussie du nouveau au chemin canonique ; Supprimer retire le fichier de l’hôte. À côté figure le contrôle du dépôt de récupération : un choix Oui/Non pour Déposer la clé sur PBS ?, un champ de phrase secrète si Oui est choisi et un bouton d’application contextuel indiquant Démarrer l’envoi, Arrêter l’envoi ou Modifier la phrase secrète. Chaque action utilise les mêmes points d’accès Flask que l’interface de terminal : l’effet sur disque et l’état sur PBS sont donc identiques depuis les deux interfaces." + }, + "restoreAccess": { + "heading": "Récupération du côté restauration", + "body": "La restauration repère les sauvegardes d’hôte ProxMenux sur PBS en listant les groupes du dépôt configuré puis en filtrant leur identifiant. L’onglet Sauvegardes du moniteur affiche la même liste. Choisir une sauvegarde lance proxmox-backup-client restore avec le même dépôt, mot de passe et empreinte, ainsi que --keyfile si elle est chiffrée. L’archive .pxar est extraite dans un répertoire de préparation que _rs_check_layout transmet au processus de restauration standard. Hors de ProxMenux, la même commande extrait l’archive à l’emplacement souhaité pour examiner l’arborescence ou effectuer une restauration manuelle." + }, + "references": { + "heading": "Références", + "intro": "Documentation officielle de Proxmox Backup Server pour les composants utilisés par ProxMenux.", + "items": [ + { + "label": "Documentation Proxmox Backup Server", + "href": "https://pbs.proxmox.com/docs/", + "tail": "— point d'entrée principal couvrant l'installation, l'administration, le stockage, les utilisateurs et les rôles." + }, + { + "label": "proxmox-backup-client", + "href": "https://pbs.proxmox.com/docs/backup-client.html", + "tail": " — l’outil en ligne de commande appelé par ProxMenux pour chaque sauvegarde et restauration. Décrit les identifiants et types de sauvegarde, les archives, la syntaxe des dépôts et les variables d’environnement." + }, + { + "label": "Chiffrement côté client", + "href": "https://pbs.proxmox.com/docs/backup-client.html#encryption", + "tail": " — création du fichier clé, modes --kdf et modèle de chiffrement que ProxMenux complète par une copie de récupération protégée par une phrase secrète." + }, + { + "label": "Gestion des Datastore", + "href": "https://pbs.proxmox.com/docs/storage.html", + "tail": " — création et gestion des datastores qui reçoivent les sauvegardes d’hôte, avec la structure du stockage des blocs et les permissions." + }, + { + "label": "Élagage des sauvegardes et récupération d’espace", + "href": "https://pbs.proxmox.com/docs/maintenance.html#pruning", + "tail": " — le modèle de rétention de --keep-last / --keep-daily / --keep-weekly que ProxMenux applique par tâche planifiée, et la récupération des blocs inutilisés par PBS après l’élagage." + } + ] + } +} diff --git a/web/messages/fr/docs/backup-restore/glossary.json b/web/messages/fr/docs/backup-restore/glossary.json new file mode 100644 index 00000000..2e709947 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/glossary.json @@ -0,0 +1,230 @@ +{ + "meta": { + "title": "Glossaire — Sauvegarde et restauration ProxMenux", + "description": "Glossaire des termes et définitions de la pile de sauvegarde et de restauration ProxMenux: chiffrement, fichier de clés, mots de passe, enveloppe de récupération, PBS, morceaux, rootfs, manifeste, hydratation coureur et cross-kernel.", + "ogTitle": "Glossaire de la sauvegarde et de la restauration | ProxMenux", + "ogDescription": "Définitions claires des termes utilisés dans la documentation de sauvegarde et de restauration ProxMenux.", + "twitterTitle": "Glossaire de la sauvegarde et de la restauration | ProxMenux", + "twitterDescription": "Phrase de passe, fichier clé, enveloppe de récupération, rootfs, manifeste, PBS, morceaux — tous définis en un seul endroit." + }, + "header": { + "title": "Glossaire", + "description": "Termes utilisés dans la documentation de sauvegarde et de restauration, avec leur définition.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "body": "Les termes sont regroupés par thème. Chaque entrée donne le terme et une courte définition." + }, + "groups": [ + { + "title": "Chiffrement et récupération des clés", + "intro": "Vocabulaire pour le bloc de chiffrement PBS. Il implique deux secrets distincts: un fichier de clés binaires et une phrase de passe écrite.", + "entries": [ + { + "id": "passphrase-recuperacion", + "term": "Phrase secrète de récupération", + "def": "Mot de passe texte choisi par l'utilisateur pour protéger l’enveloppe de récupération. Il est demandé deux fois avec une vérification de correspondance, et n'est utilisé que pour chiffrer l'enveloppe et la déchiffrer si le fichier clé a besoin d'être récupéré. Ce n'est pas la phrase de passe qui déverrouille le fichier clé lui-même, et il n'est jamais envoyé à PBS. Pendant une sauvegarde normale, il ne quitte jamais l'hôte." + }, + { + "id": "clave-cifrado", + "term": "Fichier-clé (clé de chiffrement)", + "def": "Fichier de clé utilisé par proxmox-backup-client pour chiffrer les blocs avant leur envoi à PBS. Sans la clé correspondante, les données chiffrées sont illisibles. ProxMenux le stocke dans /usr/local/share/proxmenux/pbs-key.conf avec le mode 600. Protégez-le : l’enveloppe de récupération permet de le récupérer en cas de perte." + }, + { + "id": "contrasena-keyfile", + "term": "Phrase de passe du fichier clé (phrase de passe KDF)", + "def": "Phrase de passe optionnelle que le fichier clé lui-même peut porter, distincte de la phrase de passe de récupération. Il n'existe que lorsque le fichier clé a été créé avec --kdf scrypt (généralement un fichier clé importé). Sans cela, le fichier clé ne peut pas être déverrouillé pour utilisation. ProxMenux le maintient sous forme chiffrée sur l'hôte afin que les sauvegardes programmées puissent fonctionner sans une demande interactive." + }, + { + "id": "sobre-recuperacion", + "term": "Enveloppe de récupération", + "def": "Le fichier keyfile enveloppé dans une couche supplémentaire: il est crypté avec la phrase de passe de récupération utilisant AES-256-CBC et PBKDF2 avant de quitter l'hôte. C'est ce qui est téléchargé sur PBS en tant que groupe -keyrecovery. Sans la phrase de passe, l'enveloppe est opaque : le téléchargement de PBS ne révèle pas le fichier de clés." + }, + { + "id": "cifrado-cliente", + "term": "Chiffrement côté client", + "def": "Modèle de chiffrement dans lequel les données sont chiffrées sur l'hôte source avant d'être téléchargées. PBS ne reçoit et stocke que du texte codé; même un administrateur PBS avec accès datastore ne peut pas le lire sans le fichier clé. ProxMenux s'appuie sur ce modèle et ajoute l’enveloppe de récupération sur le dessus." + }, + { + "id": "kdf-none", + "term": "--kdf none", + "def": "Option de proxmox-backup-client key create qui produit un fichier de clés sans phrase de passe jointe. Le fichier de clés peut être utilisé directement sans une prompte, ce qui est essentiel pour les travaux programmés qui ne sont pas surveillés. C'est ce que ProxMenux utilise par défaut lors de la génération d'un nouveau fichier clé." + }, + { + "id": "kdf-scrypt", + "term": "--kdf scrypt", + "def": "Option pour proxmox-backup-client key create qui produit un fichier clé protégé par une phrase de passe du fichier de clé. Chaque utilisation du fichier clé nécessite de le déverrouiller avec cette phrase de passe. ProxMenux accepte ce style de keyfile sur l'importation et stocke la phrase de passe cryptée afin que les sauvegardes programmées puissent toujours fonctionner sans surveillance." + }, + { + "id": "aes-256-cbc", + "term": "AES-256-CBC", + "def": "Chiffrement symétrique standard. ProxMenux l’utilise via openssl enc -aes-256-cbc pour protéger le fichier de clé avec la phrase de passe de récupération et produire l’enveloppe." + }, + { + "id": "pbkdf2", + "term": "PBKDF2", + "def": "Fonction cryptographique qui transforme une phrase de passe de type humain en une clé binaire adaptée au chiffrement. Il ralentit les tentatives de force brute en appliquant de nombreuses itérations. ProxMenux l'utilise avec des itérations 600 000 et un sel aléatoire lors du chiffrement de l'enveloppe de récupération." + } + ] + }, + { + "title": "Structure de sauvegarde", + "intro": "Termes décrivant ce qui vit dans une sauvegarde, quelle que soit la destination.", + "entries": [ + { + "id": "rootfs", + "term": "rootfs / système de fichiers racine", + "def": "Copie des fichiers de l’hôte source réalisée par rsync selon le profil par défaut et les chemins personnalisés. Ce n’est pas une image de disque complet : seuls sont copiés les chemins contenant la configuration ou l’état que Proxmox ne peut pas recréer seul." + }, + { + "id": "manifiesto", + "term": "Manifeste (manifest.json)", + "def": "Document structuré JSON décrivant l'hôte source au moment de la sauvegarde : matériel, stockage, noyau, composants installés par ProxMenux et inventaire des VM et des LXC. Il est produit par six collecteurs indépendants. Le flux de restauration l'utilise pour comparer la source et la cible." + }, + { + "id": "staging", + "term": "Répertoire de préparation", + "def": "Répertoire temporaire où ProxMenux assemble les trois blocs (rootfs, métadonnées et manifeste) avant de les emballer et de les télécharger vers la destination. Il est supprimé automatiquement lorsque la sauvegarde se termine, même sur avorter." + }, + { + "id": "perfil-defecto", + "term": "Profil par défaut", + "def": "Ensemble sélectionné de chemins copiés par défaut dans chaque sauvegarde : configuration PVE, réseau, SSH, noyau, apt, outils ProxMenux et plus encore. Défini dans le code et documenté sur la page Comment ça marche." + }, + { + "id": "rutas-personalizadas", + "term": "Chemins personnalisés", + "def": "Les chemins supplémentaires que l'utilisateur ajoute au dessus du profil par défaut. Soit persistante (conservée en backup-extra-paths.txt) soit per-run (en mode personnalisé)." + } + ] + }, + { + "title": "Destinations et stockage", + "intro": "Termes liés à l'emplacement de la sauvegarde — serveur PBS, archive locale ou dépôt Borg — et comment PBS organise les données.", + "entries": [ + { + "id": "repositorio-pbs", + "term": "Dépôt PBS", + "def": "Combinaison de Proxmox Backup Server + datastore + utilisateur qui reçoit la sauvegarde. Identifié par la chaîne user@realm@host:datastore. Un seul serveur PBS peut héberger plusieurs dépôts." + }, + { + "id": "datastore", + "term": "Banque de données", + "def": "Espace de stockage précis dans un serveur PBS contenant les sauvegardes et leurs blocs. Chaque datastore repose sur un système de fichiers du serveur PBS avec ses propres permissions et politiques." + }, + { + "id": "chunk", + "term": "Bloc (chunk) / déduplication par blocs", + "def": "PBS divise chaque sauvegarde en morceaux de taille variable, identifie chaque morceau par son hachage et ne stocke chaque morceau qu'une seule fois, même s'il apparaît dans de nombreuses sauvegardes différentes. Cela signifie que les sauvegardes successives d'un même hôte — ou d'un hôte similaire — prennent très peu d'espace supplémentaire." + }, + { + "id": "fingerprint", + "term": "Empreinte", + "def": "Empreinte cryptographique du certificat du serveur PBS TLS Il permet au client de vérifier qu'il parle au serveur prévu sans compter sur une autorité de certification publique. ProxMenux le transmet à proxmox-backup-client via la variable d'environnement PBS_FINGERPRINT." + }, + { + "id": "grupo-copia", + "term": "Groupe de sauvegarde", + "def": "Conteneur logique à l'intérieur de PBS sous lequel les sauvegardes successives du même actif s'accumulent. Chaque nouvelle sauvegarde partage la déduplication avec les précédentes dans le même groupe. ProxMenux utilise deux groupes par hôte lorsque le chiffrement est activé : un pour la sauvegarde de l'hôte et un avec un suffixe -keyrecovery pour l’enveloppe de récupération." + }, + { + "id": "backup-id", + "term": "ID de sauvegarde", + "def": "Nom du groupe backup. ProxMenux par défaut sur hostcfg-HOSTNAME et permet à l'utilisateur de l'éditer avant le téléchargement; les caractères non pris en charge sont supprimés automatiquement." + }, + { + "id": "pxar", + "term": ".pxar", + "def": "Format d'archive native PBS pour les répertoires. Il se comporte comme un tar optimisé pour la déduplication des morceaux : au lieu de stocker un fichier opaque, PBS brise son contenu en morceaux réutilisables." + } + ] + }, + { + "title": "Exécution et calendrier", + "intro": "Termes utilisés par le système ProxMenux emploi programmé.", + "entries": [ + { + "id": "runner", + "term": "Processus d'exécution", + "def": "Le script run_scheduled_backup.sh qui exécute une sauvegarde programmée. Il lit la configuration du travail, lance le moteur correspondant (Local, PBS ou Borg), applique la conservation sur le succès et envoie les notifications configurées." + }, + { + "id": "trabajo-programado", + "term": "Tâche planifiée", + "def": "Configuration permanente d'une sauvegarde récurrente. Tient destination, identifiants, chiffrement, calendrier et conservation. Vit à /var/lib/proxmenux/backup-jobs/<id>.env." + }, + { + "id": "modo-adjunto", + "term": "Mode rattaché", + "def": "Tâche sans timer propre. Un hook job-end de PVE vzdump la déclenche après les sauvegardes des invités si le stockage correspond. La tâche parent fournit destination et conservation initiale, mais le hook compare le stockage, pas l’ID parent. Une autre tâche sur ce stockage peut aussi la déclencher. Uniquement Local et PBS." + }, + { + "id": "timer-systemd", + "term": "Systemd minuterie", + "def": "Mécanisme standard systemd qui déclenche une commande sur un calendrier. ProxMenux crée une minuterie par indépendant emploi programmé; mode rattaché emplois n'utilisent pas de minuterie, ils fonctionnent via le script PVE-hook." + }, + { + "id": "retencion", + "term": "Conservation (keep-last, keep-daily…)", + "def": "Politique qui décide quelles sauvegardes plus anciennes à conserver et à pruner. Défini par travail avec des paramètres comme keep-last, keep-daily, keep-weekly, keep-monthly. Appliquée par le processus d’exécution après chaque sauvegarde réussie." + } + ] + }, + { + "title": "Restaurer", + "intro": "Termes du flux de restauration.", + "entries": [ + { + "id": "restauracion-universal", + "term": "Restauration universelle", + "def": "Le flux de restauration ProxMenux n'extrait pas seulement le système de fichiers : il lit le manifeste pour repérer les différences entre la source et la cible, reproduit la configuration du système et réexécute les installateurs des composants gérés par ProxMenux. Le but est de reproduire l'hôte source, pas seulement l'archive." + }, + { + "id": "hidratacion", + "term": "Hydratation entre versions du noyau", + "def": "Étape de restauration qui fusionne les réglages de l’utilisateur depuis la source (paramètres IOMMU, ID VFIO, particularités et clés GRUB) avec la configuration de démarrage neuve de la cible, sans recopier tels quels les fichiers liés au noyau source. S’exécute si le noyau cible est plus récent que celui de la sauvegarde." + }, + { + "id": "cross-kernel", + "term": "Restaurer le cross-kernel", + "def": "Restaurer où le noyau de la cible diffère de (habituellement est plus récent que) celui de la source. Nécessite le passage hydration pour éviter de traîner le long de fichiers incompatibles avec le noyau de la cible." + }, + { + "id": "instalador-postboot", + "term": "Installation après démarrage", + "def": "Composants réinstallés après le premier démarrage de l'hôte restauré (drivers NVIDIA, drivers Coral TPU, outils AMD GPU, outils Intel GPU). Chaque installateur fonctionne contre le noyau de la cible, de sorte que l'hôte restauré ne dépend pas de la présence du noyau de la source." + }, + { + "id": "compatibility-check", + "term": "Vérification de compatibilité", + "def": "Comparaison entre le manifeste source et l'état de la cible que ProxMenux effectue au début de la restauration. Il décide quelles parties sont copiées mot à mot, qui ont besoin d'hydratation et qui sont recréées par un installateur." + }, + { + "id": "equipo-recien-instalado", + "term": "Installation fraîche", + "def": "Hôte juste réinstallé à partir de zéro, sans fichier local key. La restauration d'une sauvegarde chiffrée nécessite d'abord la récupération du fichier clé à partir de l’enveloppe stockée sur PBS, en utilisant la phrase de passe de récupération." + } + ] + } + ], + "whereNext": { + "heading": "Où après", + "items": [ + { + "label": "Comment ça marche", + "href": "/docs/backup-restore/how-it-works", + "tail": " — où se placent rootfs, le manifeste et l’inventaire des applications dans une sauvegarde." + }, + { + "label": "Destination Proxmox Backup Server", + "href": "/docs/backup-restore/destinations/pbs", + "tail": "— où le cryptage côté client, le fichier clé, la phrase de récupération et l'enveloppe sont documentés en profondeur." + }, + { + "label": "Restauration", + "href": "/docs/backup-restore/restoring", + "tail": " — procédure de restauration et utilisation du manifeste." + } + ] + } +} diff --git a/web/messages/fr/docs/backup-restore/how-it-works.json b/web/messages/fr/docs/backup-restore/how-it-works.json new file mode 100644 index 00000000..aba3a5f8 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/how-it-works.json @@ -0,0 +1,205 @@ +{ + "meta": { + "title": "Comment ProxMenux Sauvegarde fonctionne en interne — rootfs, manifeste, applications", + "description": "Description détaillée de ce qu'une sauvegarde ProxMenux contient : les rootfs produits par rsync du profil de chemin par défaut, le manifeste structuré construit par six collecteurs indépendants, et l'inventaire d'applications qui entraîne la réinstallation automatique des paquets et des composants après une restauration.", + "ogTitle": "Comment la sauvegarde ProxMenux fonctionne en interne", + "ogDescription": "Les trois parties d’une sauvegarde ProxMenux : rootfs, manifeste et applications.", + "twitterTitle": "Fonctionnement des sauvegardes ProxMenux | ProxMenux", + "twitterDescription": "Les trois charges utiles d'une sauvegarde ProxMenux et comment la restauration reproduit l'hôte source à partir d'eux." + }, + "header": { + "title": "Comment ça marche", + "description": "La structure interne d’une sauvegarde ProxMenux — système de fichiers, manifeste et inventaire des applications — et leur utilisation pour recréer l’hôte source sur une destination dont le noyau peut être différent.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "title": "Une archive, trois charges utiles", + "body": "Chaque sauvegarde crée trois parties bien définies dans un même répertoire de préparation. L’archive envoyée à la destination (.tar.zst local, sauvegarde PBS ou archive Borg) conserve cette structure. La restauration utilise les trois : le manifeste est consulté avant toute modification pour détecter les différences et déterminer les exclusions ; rootfs fournit les fichiers de configuration, appliqués à chaud ou après redémarrage ; l’inventaire des applications guide l’installation des paquets et la réinstallation des composants après démarrage. Chaque partie peut être examinée ou extraite indépendamment." + }, + "layout": { + "heading": "Mise en page des archives", + "intro": "Chaque archive suit la même disposition de l'arbre, quelle que soit la destination. Le sous-répertoire metadata/ détient les charges utiles structurées; le sous-répertoire rootfs/ détient la copie du système de fichiers.", + "treeCaption": "Le répertoire de mise en scène a été établi lors d'une sauvegarde. Chaque destination reçoit le même arbre (adapté à son format natif: tar pour local, PBS morceaux pour PBS, segments borg pour 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│ ├── paths_archived.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": "La partie rootfs", + "intro": "L’arborescence rootfs/ est une simple copie du système de fichiers, créée par rsync depuis l’hôte source. Elle contient un profil par défaut sélectionnant les chemins nécessaires à une restauration Proxmox, ainsi que les chemins personnalisés ajoutés à la tâche ou à la session interactive. La sélection est volontairement limitée aux chemins qui contiennent de la configuration ou conservent un état que Proxmox ne peut pas recréer seul.", + "defaultProfileTitle": "Le profil par défaut", + "defaultProfileBody": "Le profil par défaut est défini par hb_default_profile_paths dans lib_host_backup_common.sh. Il couvre huit catégories fixes, plus l’état ZFS si nécessaire, qui décrivent ensemble un hôte Proxmox fonctionnel :", + "categoriesTitle": "Catégories de chemins", + "categoryRows": [ + { + "category": "Noyau PVE", + "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", + "why": "Contenus du système de fichiers cluster et vzdump par défaut. La base de données pmxcfs (config.db) est capturée comme un instantané cohérent via sqlite3 .backup sans arrêter le cluster, et les sidecars .db-wal / .db-shm sont exclus du rsync. Lorsque sqlite3 n'est pas disponible, un fichier config.db.raw-fallback est créé puis utilisé automatiquement comme base lors de la restauration." + }, + { + "category": "Identité de l'hôte & réseau", + "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", + "why": "Les éléments nécessaires pour retrouver le réseau avec la même identité. Les fichiers .link dans /etc/systemd/network associent le nom des interfaces à leur adresse MAC, afin de conserver les noms lors des réinstallations et des changements matériels." + }, + { + "category": "Accès et authentification", + "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", + "why": "Clés SSH, règles sudo et configuration PAM. Les perdre peut empêcher l’utilisateur d’accéder à l’hôte restauré." + }, + { + "category": "Noyau et démarrage", + "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 jetons, listes noires de module, ID de périphérique VFIO, table de montage, configuration de la pile de stockage." + }, + { + "category": "Shell et paramètres régionaux", + "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", + "why": "Configuration shell à l'échelle du système, variables d'environnement, configuration de génération locale." + }, + { + "category": "Gestion des paquets et cron", + "paths": "/etc/apt, /etc/cron.d, /etc/cron.{daily,hourly,weekly,monthly}, /etc/cron.allow, /etc/cron.deny, /var/spool/cron/crontabs", + "why": "Sources APT pour une résolution de paquets cohérente, tâches programmées définies par l'utilisateur." + }, + { + "category": "État et outils 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": "Outillage facultatif mais courant Proxmox. Les chemins manquants sont notés dans metadata/missing_paths.txt sans arrêter la sauvegarde." + }, + { + "category": "Exécutables ProxMenux et compte root", + "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (sous-dirs volatils exclus)", + "why": "Les binaires installés par ProxMenux et la configuration par utilisateur sous /root. Les chemins volatils (.bash_history, .cache/, tmp/, .local/share/Trash/) sont exclus de la copie. /var/lib/proxmenux détient les tâches de sauvegarde programmées et l'état de l'hôte conservé par ProxMenux; la mise en scène de restauration, les copies de retour et les marqueurs post-restauration sont exclus, parce qu'ils appartiennent à l'hôte qui exécute une restauration." + }, + { + "category": "État ZFS (conditionnel)", + "paths": "/etc/zfs", + "why": "Seulement inclus lorsque l'hôte source exécute ZFS. Contient zpool.cache et hostid." + } + ], + "customTitle": "Extension du profil avec des chemins personnalisés", + "customBody": "Au-delà du profil par défaut, ProxMenux offre deux façons d'inclure des chemins supplémentaires dans une sauvegarde. Ils composent sans conflit et s'appliquent à la fois aux sauvegardes interactives et aux emplois programmés.", + "customExtrasTitle": "1. Extras persistants (fichier par hôte)", + "customExtrasBody": "Un fichier texte à /usr/local/share/proxmenux/backup-extra-paths.txt contient une liste de chemins absolus que l'utilisateur a marqués comme « toujours inclure » sur cet hôte. Lorsqu'une sauvegarde fonctionne en mode Default, ProxMenux ajoute ces chemins au profil par défaut automatiquement sans demander. Le fichier est édité à partir de l'interface — pas d'édition manuelle nécessaire — et persiste à travers les reboots et les mises à jour. Un chemin absolu par ligne ; les commentaires # sont autorisés.", + "customModeTitle": "2. Mode personnalisé (par exécution)", + "customModeBody": "Lancer une sauvegarde en mode Custom remplace l'application automatique du profil par défaut par une liste de contrôle montrant chaque chemin : les entrées par défaut du profil et les extras persistants (préfixés avec [+] et pré-cochés). L'utilisateur coche ou désactive les entrées pour cette exécution spécifique, et peut également appuyer sur Ajouter un chemin personnalisé pour entrer un nouveau chemin — qui est ensuite maintenu dans le fichier extras pour les futures sauvegardes.", + "customMissingTitle": "Voies absentes de la source", + "customMissingBody": "Tout chemin du profil (par défaut ou ajouté) qui n'existe pas sur l'hôte source est enregistré dans metadata/missing_paths.txt à l'intérieur de l'archive. La sauvegarde n’échoue ni ne s'arrête — l'utilisateur voit un résumé des chemins archivés et des chemins manquants à la fin. En pratique, cela se produit pour les chemins optionnels d'outillage comme /etc/wireguard ou /etc/prometheus lorsque ces outils ne sont pas installés." + }, + "manifest": { + "heading": "La partie manifeste", + "intro": "manifest.json est un document structuré JSON qui décrit l'hôte source au moment de la sauvegarde. Il est produit par six modules de collecte indépendants orchestrés par build_manifest.sh. Chaque collecteur est en lecture seule, produit un fragment JSON bien défini, et revient à une valeur par défaut vide s'il échoue – le manifeste est toujours utilisable si une section est incomplète.", + "orchestratorCaption": "Les six modules de collecte composent le manifeste. Chaque collecteur fonctionne dans son propre sous-processus; une défaillance d'un seul tombe à un défaut de sécurité documenté et avertit mais n'interrompt pas la sauvegarde.", + "collectorRows": [ + { + "collector": "collect_source_host.sh", + "produces": "source_host", + "content": "Nom d'hôte, version PVE (pveversion), version PBS si l'hôte exécute le rôle de serveur de sauvegarde, noyau (uname -r), mode de démarrage (efi/bios), type de système de fichiers racine, modèle CPU + architecture, mémoire en KB." + }, + { + "collector": "collect_hardware.sh", + "produces": "hardware_inventory", + "content": "GPU avec fabricant et correspondance avec l’installateur ProxMenux ; TPU Coral USB et M.2 détectés par lsusb/lspci ; interfaces réseau avec MAC, emplacement PCI et appartenance à un pont ; périphériques sans fil. Les entrées GPU comprennent l’heuristique passthrough_eligible." + }, + { + "collector": "collect_storage.sh", + "produces": "storage_inventory", + "content": "ZFS pools (avec pool type + disques membres résolus à /dev/disk/by-id/*, /dev/disk/by-partuuid/* ou crus /dev/sdX chemins en fonction de la façon dont chaque pool a été créé à l'origine), LVM Groupes de volume + mince pools, disques physiques avec SMART capacité, PVE storage.cfg entrées, montages externes." + }, + { + "collector": "collect_kernel.sh", + "produces": "kernel_params", + "content": "Paramètres ajoutés par l’opérateur dans /proc/cmdline, sans les éléments standard comme BOOT_IMAGE=, root=, ro/rw, quiet et splash ; modules chargés au démarrage depuis /etc/modules ; chemins des fichiers /etc/modprobe.d/*.conf contenant des directives effectives (options, blacklist, install, alias, softdep)." + }, + { + "collector": "collect_proxmenux_state.sh", + "produces": "proxmenux_installed_components", + "content": "Lire /usr/local/share/proxmenux/managed_installs.json (enregistrement de tout ce que ProxMenux a installé) et installed_tools.json. Chaque entrée conserve le chemin d'installation (menu_script) afin que la restauration puisse déclencher le même flux d'installation." + }, + { + "collector": "collect_guests.sh", + "produces": "vms_lxcs_at_backup", + "content": "Énumère les VM (qm list) et les LXC (pct list) présents au moment de la sauvegarde — VMID, nom, état actuel. Seul l'inventaire : les données des invités sont sous la responsabilité de vzdump / PBS." + } + ], + "schemaTitle": "Validation du schéma", + "schemaBody": "Le manifeste valide contre scripts/backup_restore/schema/manifest.schema.json. L'exécution du build_manifest.sh --validate déclenche une validation de schéma côté Python JSON (exige python3 + jsonschema). Si le module n'est pas présent, la vérification est ignorée silencieusement — la validation est principalement une aide au développeur, et non une dépendance à l'exécution." + }, + "applications": { + "heading": "L'inventaire des applications", + "intro": "Deux inventaires recensent les logiciels ajoutés aux paquets de base Proxmox VE : la liste des paquets dans metadata/ et le registre des composants dans rootfs, détaillés ci-dessous. La restauration les utilise pour réinstaller les logiciels de l’utilisateur avec APT ou les installateurs ProxMenux selon leur mode d’installation initial.", + "packagesTitle": "packages.manual.list", + "packagesBody": "Une liste alphabétique en texte brut produite par apt-mark showmanual, avec les paquets APT explicitement installés sur l’hôte source. Les dépendances du système Proxmox VE de base sont exclues ; APT les réinstalle automatiquement sur la destination. Lors de la restauration, _rs_run_complete_extras lit la liste et applique un filtre contre les suppressions en cascade en trois passes : dpkg -s repère les paquets déjà installés, la détection des autres versions majeures vise les bibliothèques, et apt-get install --simulate vérifie le risque de suppression en cascade. Les paquets retenus sont installés avec apt-get install -y.", + "componentsTitle": "components_status.json (dans rootfs)", + "componentsBody": "Un registre JSON sous /usr/local/share/proxmenux/ qui enregistre chaque composant ProxMenux a installé avec son état exact : version, drapeaux spécifiques ProxMenux (pour NVIDIA : patched booléen ; pour Coral : DKMS version). Ce fichier vit à l'intérieur des rootfs — pas dans metadata/ — parce que c'est lu après la copie de rootfs vers la cible. Le répartiteur post-démarrage (apply_cluster_postboot.sh) itère ses entrées et exécute le crochet --auto-reinstall de chaque composant, qui lit l'état enregistré et reproduit l'installation contre le noyau courant de la cible.", + "componentInstallersTitle": "Installateurs de composants", + "componentInstallersBody": "Quatre installateurs ProxMenux exposent actuellement un point d'entrée --auto-reinstall :", + "installerRows": [ + { + "component": "nvidia_driver", + "installer": "gpu_tpu/nvidia_installer.sh", + "action": "Lire version + patched. Télécharge exactement le même fichier d'exécution NVIDIA, construit des modules DKMS contre le noyau de la cible, réapplique le patch ProxMenux si la source l'avait." + }, + { + "component": "coral_driver", + "installer": "gpu_tpu/install_coral.sh", + "action": "Lire la version du pilote Coral. Compile le module DKMS contre le noyau de la cible." + }, + { + "component": "amdgpu_top", + "installer": "gpu_tpu/amd_gpu_tools.sh", + "action": "Lis la version enregistrée. Re-télécharge le .deb exact de la version GitHub." + }, + { + "component": "intel_gpu_tools", + "installer": "gpu_tpu/intel_gpu_tools.sh", + "action": "APT-installe le paquet. Idépotent si déjà présent à partir de packages.manual.list." + } + ] + }, + "restoreFlow": { + "heading": "Comment la restauration consomme les trois charges utiles", + "intro": "La restauration est un pipeline en six étapes. Chaque étape lit un sous-ensemble spécifique de l'archive et met à jour l'hôte cible. Aucune étape n'exige que l'hôte source soit accessible — l'archive est entièrement autonome.", + "stagesCaption": "L’étape 1 consulte le manifeste pour déterminer les modifications possibles. L’étape 2 copie les chemins rootfs applicables à chaud. L’étape 3 prépare les chemins à risque pour le prochain démarrage. L’étape 3b importe les pools ZFS de données ne contenant pas la racine et dont tous les disques sont présents. L’étape 4 installe les paquets. L’étape 5 réinstalle les composants après redémarrage pour le noyau de la destination.", + "stageRows": [ + { + "stage": "1", + "name": "Vérification de compatibilité", + "reads": "manifest.json", + "action": "Exécute hb_compat_check. Comparer le matériel source par rapport au matériel cible (NIC, ID de stockage), la version PVE et la version principale du noyau. Ensembles HB_COMPAT_KERNEL_DIRECTION (same, bk_newer ou bk_older) et peuple RS_SKIP_PATHS avec des exclusions à la dérive matérielle et aux différences de noyau." + }, + { + "stage": "2", + "name": "Appliquer à chaud", + "reads": "rootfs/ (chemins sûrs seulement)", + "action": "_rs_apply … hot copie les entrées de hb_classify_path=hot directement à la cible en direct. Tout ce qui est sous /etc/pve, /etc/network ou des chemins classés comme reboot/dangerous est reporté." + }, + { + "stage": "3", + "name": "En attente de préparation", + "reads": "rootfs/ (redémarrage + chemins dangereux)", + "action": "_rs_prepare_pending_restore prépare les chemins à risque dans /var/lib/proxmenux/pending-restore/, écrit plan.env, apply-on-boot.list et rs-skip-paths.txt, puis active proxmenux-restore-onboot.service pour le prochain démarrage." + }, + { + "stage": "3b", + "name": "Importation des pools de données", + "reads": "manifest.storage_inventory + état ZFS de la destination", + "action": "_rs_import_data_pools tente d’importer chaque pool ZFS ne contenant pas la racine et dont tous les disques sont présents sur la destination. Avec un hostid étranger, l’importation est retentée avec zpool import -f. Si un disque manque, le pool est ignoré avec un avertissement. Le résultat par pool est enregistré dans /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "stage": "4", + "name": "Installation du paquet", + "reads": "metadata/packages.manual.list", + "action": "_rs_run_complete_extras exécute le filtre sans risque de cascade et appelle apt-get install -y avec la liste des paquets survivants. La sortie complète va à /var/log/proxmenux/restore-apt-*.log." + }, + { + "stage": "5", + "name": "Après le démarrage", + "reads": "rootfs (déjà appliqué) + components_status.json", + "action": "Après le redémarrage, apply_pending_restore.sh rejoue les chemins différés et apply_cluster_postboot.sh exécute update-initramfs, update-grub (ou proxmox-boot-tool refresh) et itère sur components_status.json en tirant le crochet --auto-reinstall de chaque composant." + } + ] + }, + "whyItWorks": { + "heading": "Pourquoi séparer la sauvegarde en trois parties", + "body": "La séparation suit le cycle de vie des données. Le système de fichiers est transféré avec rsync : rapidement, de façon transparente et atomique par fichier. L’état de configuration à interpréter avant toute modification est du JSON structuré, lisible indépendamment, versionnable par schéma et comparable automatiquement à l’état de la destination. Les logiciels à réinstaller sont décrits dans un inventaire de noms et versions ; le gestionnaire de paquets et les installateurs ProxMenux choisissent les binaires adaptés. Chaque partie répond à son besoin. Leur combinaison vise une restauration cohérente tout en tolérant les échecs : un manifeste corrompu laisse rootfs récupérable, un paquet manquant n’empêche pas l’installation des composants et l’échec d’un installateur sur une entrée n’arrête pas la suivante." + } +} diff --git a/web/messages/fr/docs/backup-restore/index.json b/web/messages/fr/docs/backup-restore/index.json new file mode 100644 index 00000000..2b40cfc2 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/index.json @@ -0,0 +1,93 @@ +{ + "meta": { + "title": "ProxMenux Sauvegarde et restauration — Présentation | Sauvegarde et restauration complètes de l'hôte pour Proxmox VE", + "description": "La fonction de sauvegarde et de restauration de ProxMenux capture l'état complet d'un hôte Proxmox (système de fichiers, manifeste de configuration structuré et paquets/composants installés) et le reproduisent sur le même hôte ou sur un hôte différent. La sauvegarde et la restauration sont autonomes : aucune dépendance externe et les restaurations inter-noyaux sont prises en charge via un filtre de sous-ensemble sécurisé sensible à la direction et une hydratation indépendante du noyau.", + "ogTitle": "ProxMenux Sauvegarde et restauration – Présentation", + "ogDescription": "Sauvegarde et restauration complètes de l'hôte pour Proxmox VE avec manifeste structuré, liste de packages et réinstallateurs de composants.", + "twitterTitle": "ProxMenux Sauvegarde et restauration | ProxMenux", + "twitterDescription": "Sauvegarde et restauration complètes de l'hôte pour Proxmox VE avec manifeste structuré, liste de packages et réinstallateurs de composants." + }, + "header": { + "title": "Sauvegarde et restauration", + "description": "Sauvegarde et restauration de l'hôte complet pour Proxmox VE. Capture le système de fichiers, la configuration et les composants installés dans une seule archive, et reproduit l'hôte sur la même installation Proxmox ou sur une autre installation Proxmox sans dépendances externes.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "title": "Qu'est-ce que c'est, en un seul paragraphe", + "body": "Une sauvegarde ProxMenux capture l’état complet d’un hôte Proxmox : le système de fichiers, avec les répertoires pertinents sous /etc, /root et /var/lib/pve-cluster, ainsi que les chemins personnalisés facultatifs ; un manifeste structuré en JSON décrivant le matériel détecté, les paramètres du noyau, la configuration réseau, l’état de ZFS, les utilisateurs et les entrées cron ; et un inventaire des applications, avec les paquets marqués comme installés manuellement par APT et les composants installés par ProxMenux, accompagnés de leurs versions exactes. Les trois destinations prises en charge — archive locale, Proxmox Backup Server (recommandé) et Borg — reçoivent le même contenu autonome. Chacune permet de reconstruire l’hôte cible sans que l’hôte source soit accessible pendant la restauration." + }, + "video": { + "heading": "Présentation vidéo", + "intro": "Vous préférez regarder la sauvegarde et la restauration en action avant de la configurer ? Cette procédure pas à pas couvre une démonstration complète de bout en bout de la fonctionnalité dans ProxMenux.", + "title": "ProxMenux — Procédure pas à pas de sauvegarde et de restauration", + "caption": "Vidéo externe sur YouTube. Lecture en mode de confidentialité amélioré (pas de cookies jusqu'à ce que vous appuyiez sur play)." + }, + "whatItIsNot": { + "heading": "Ce que ce n'est pas", + "intro": "Cette section couvre la sauvegarde et la restauration de l’hôte : l’installation Proxmox elle-même, et non les applications ou systèmes invités qui y fonctionnent.", + "items": [ + "Ce n’est pas un outil de sauvegarde des VM/CT. Cette fonction ne capture ni les disques ni l’état de la RAM des invités ; c’est le rôle de vzdump. Les fichiers de configuration des invités (/etc/pve/nodes/<node>/qemu-server/*.conf et lxc/*.conf) sont bien sauvegardés. Après restauration, l’inventaire réapparaît et les disques peuvent être restaurés ou rattachés à partir d’une sauvegarde existante sur PBS ou en local.", + "Ce n’est pas une opération à l’échelle du cluster. Chaque nœud se sauvegarde lui-même. L’appartenance au cluster est enregistrée dans /etc/pve afin de pouvoir réintégrer un nœud restauré, mais la restauration de tout le cluster nécessite de coordonner les différents nœuds.", + "Ce n’est pas une image complète du disque. Les binaires du noyau, l’initramfs et la partition de démarrage ne sont pas sauvegardés. Lors de la restauration, ProxMenux utilise les fichiers de démarrage de l’hôte cible, régénérés automatiquement par update-initramfs et l’outil du chargeur d’amorçage, puis installe les pilotes adaptés au noyau en cours d’exécution sur la cible." + ] + }, + "threePillars": { + "heading": "Les trois piliers d'une sauvegarde", + "intro": "Une archive ProxMenux est structurée autour de trois charges utiles autonomes. La restauration utilise les trois ensemble pour reproduire l'hôte source sur une cible sur laquelle le même noyau n'est peut-être même pas installé.", + "diagramCaption": "Chaque sauvegarde expédie les trois mêmes charges utiles, quelle que soit la destination. La restauration consomme les trois : rootfs pour déposer les fichiers, le manifeste pour détecter les dérives et les différences entre les noyaux, et l'inventaire des applications pour réinstaller les packages et les composants sur le propre noyau de la cible.", + "pillar1Label": "Système de fichiers", + "pillar1Detail": "rootfs/\n(rsync de /etc,\n/etc/systemd/network,\n/root, plus un\ninstantané sqlite3\nde /var/lib/pve-cluster,\n+ chemins facultatifs)", + "pillar2Label": "Manifeste", + "pillar2Detail": "manifest.json\n(matériel, paramètres\ndu noyau, réseau,\nZFS, utilisateurs, cron,\npools ZFS, stockage)", + "pillar3Label": "Applications", + "pillar3Detail": "packages.manual.list\n+ components_status.json\n(paquets APT manuels + installateurs\nProxMenux avec versions)" + }, + "restoreIsUniversal": { + "heading": "La restauration reproduit l'hôte source, pas l'archive", + "body": "La restauration d'une sauvegarde ProxMenux ne se contente pas d'extraire le système de fichiers. Le flux de restauration lit le manifeste pour détecter la dérive entre la source et la cible (différences matérielles, renommages des cartes réseau, version du noyau, identité du pool ZFS), restaure le système de fichiers, puis déclenche le programme d'installation de composant correct pour chaque service installé sur la source (pilote NVIDIA, Coral TPU, outils GPU AMD, outils Intel GPU). Chaque programme d'installation s'exécute sur le noyau actuel de la cible, de sorte que l'hôte restauré ne dépend pas de la présence du noyau de la source. Lorsque le noyau de la cible est plus récent que celui de la sauvegarde, une passe d'hydratation indépendante du noyau fusionne les propres réglages de l'utilisateur (jetons IOMMU, ID de périphérique VFIO, adaptations particulières, clés GRUB) dans la nouvelle configuration de démarrage de la cible sans copier textuellement les fichiers liés au noyau." + }, + "twoInterfaces": { + "heading": "Deux interfaces, un backend", + "intro": "Chaque étape du workflow de sauvegarde et de restauration est disponible à partir de deux points d'entrée. Les deux appellent la même bibliothèque shell, produisent des archives identiques et lisent le même registre de tâches.", + "cliLabel": "ProxMenux Scripts (TUI)", + "cliDetail": "menu → Utilitaires →\nSauvegarde / Restauration de l'hôte\n\nFlux basé sur le dialogue,\nCompatible avec SSH, scriptable\npour une utilisation sans surveillance.", + "webLabel": "ProxMenux Monitor (Web UI)", + "webDetail": "Onglet Sauvegardes dans\nl’interface web de Monitor.\n\nRestauration en un clic, suivi\ndes journaux en direct, intégré\naux notifications et à la vue\ndes différences de retour arrière." + }, + "whereNext": { + "heading": "Où aller à partir d'ici", + "intro": "Chaque sous-section ci-dessous couvre en profondeur un aspect du flux de travail. Commencez par Comment ça marche si l'objectif est de comprendre ce que contient l'archive et pourquoi. Accédez à Destinations pour configurer la cible de la copie. Lisez Restauration et Restauration inter-noyaux pour le côté récupération.", + "items": [ + { + "label": "Comment ça marche", + "href": "/docs/backup-restore/how-it-works", + "tail": "— les trois charges utiles (rootfs, manifeste, applications) en détail, avec les collecteurs qui les produisent et le format de chaque fichier." + }, + { + "label": "Destinations", + "href": "/docs/backup-restore/destinations", + "tail": "— comparaison de local, Proxmox Backup Server (recommandé) et Borg, et comment configurer chacun d'eux." + }, + { + "label": "Création de sauvegardes", + "href": "/docs/backup-restore/creating-backups", + "tail": "— sauvegardes ponctuelles, profil de chemin par défaut, ajout de chemins personnalisés, chiffrement pour PBS." + }, + { + "label": "Tâches planifiées", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "— nouvelles tâches ou attachement à une tâche vzdump PVE existante, formats de planification, modal de détail de la tâche." + }, + { + "label": "Restauration", + "href": "/docs/backup-restore/restoring", + "tail": "— les trois actions sur une archive (afficher, télécharger, restaurer), la restauration complète ou personnalisée, le répartiteur post-démarrage et pourquoi les dix dernières minutes sont importantes." + }, + { + "label": "Restauration inter-noyaux", + "href": "/docs/backup-restore/cross-kernel", + "tail": " — comportement tenant compte du sens du changement de version lorsque le noyau cible diffère de celui de la sauvegarde, filtre de sous-ensemble sûr et quatre phases d’hydratation." + } + ] + } +} diff --git a/web/messages/fr/docs/backup-restore/restoring.json b/web/messages/fr/docs/backup-restore/restoring.json new file mode 100644 index 00000000..91b43de7 --- /dev/null +++ b/web/messages/fr/docs/backup-restore/restoring.json @@ -0,0 +1,282 @@ +{ + "meta": { + "title": "Restaurer une sauvegarde — flux complets et personnalisés ProxMenux", + "description": "Le processus complet de restauration : consulter, télécharger ou restaurer une sauvegarde, vérifier la compatibilité, choisir le mode complet ou personnalisé, classer les chemins appliqués à chaud ou après redémarrage, puis réinstaller les composants après le démarrage.", + "ogTitle": "Sauvegarde ProxMenux — restauration", + "ogDescription": "Restauration complète ou personnalisée avec contrôle de compatibilité, classification des chemins, traitement au démarrage et réinstallation après démarrage.", + "twitterTitle": "Restaurer une sauvegarde ProxMenux", + "twitterDescription": "Comment une sauvegarde d'hôte ProxMenux est transformée en un hôte Proxmox fonctionnant." + }, + "header": { + "title": "Restaurer une sauvegarde", + "description": "Le workflow complet de restauration : de la sélection d'une archive à un hôte de travail. Documente la vérification de compatibilité, les deux modes de restauration, le répartiteur sur le démarrage, le passe de réinstallation post-démarrage, et les mécanismes qui rendent prévisible la restauration cross-host et cross-kernel.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "title": "La restauration reproduit la source, pas seulement les fichiers", + "body": "Restaurer une sauvegarde ProxMenux va au-delà de l’extraction des fichiers. Avant les modifications, la restauration consulte le manifeste pour détecter les différences, écarte les chemins pouvant compromettre le démarrage et adapte les réglages de l’utilisateur qui ne peuvent pas être copiés tels quels. Après le redémarrage nécessaire, elle tente de réinstaller les composants pris en charge enregistrés (pilote NVIDIA, Coral TPU, outils GPU) pour le noyau actif de la destination. Une seule archive pilote le contrôle de compatibilité, la classification des chemins et les traitements au démarrage puis après démarrage. Consultez les résultats par composant et les journaux pour vérifier le résultat." + }, + "threeActions": { + "heading": "Trois actions sur une sauvegarde", + "intro": "La sélection d'une sauvegarde dans la liste ouvre un menu avec trois actions.", + "actionRows": [ + { + "action": "Affichage", + "detail": "Ouvre une vue en lecture seule de l'archive : le contenu de manifest.json (nom d'hôte source, version PVE, noyau, matériel, composants installés), la liste des chemins à l'intérieur de rootfs/, et un diff de ce qui changerait sur l'hôte actuel si la sauvegarde était appliquée." + }, + { + "action": "Télécharger", + "detail": "Exporte l'archive comme un fichier portable .tar.zst (tar compressé avec zstd). Il peut être extrait sur n'importe quel système Linux avec tar --zstd -xf FILE.tar.zst, ou sur macOS/Windows avec n'importe quel outil qui supporte zstd (7-Zip, PeaZip, Keka...). L'arbre extrait contient manifest.json, metadata/ et rootfs/ — exactement la même disposition que la restauration consomme. Utile pour une inspection hors ligne ou pour la restauration sur un hôte sans accès à la destination originale (PBS, Borg)." + }, + { + "action": "Restaurer", + "detail": "Le chemin de l'écriture. Extrait l'archive dans un répertoire de mise en scène, effectue la vérification de compatibilité et présente le mode de sélection (complète ou personnalisée)." + } + ] + }, + "compatibilityCheck": { + "heading": "Le contrôle de compatibilité", + "intro": "Avant d'écrire un fichier, hb_compat_check compare l'état décrit dans le manifeste avec l'hôte cible. La vérification fonctionne en lecture seule et produit quatre sorties indépendantes qui conduisent le reste de la restauration.", + "outputRows": [ + { + "output": "Drapeau de direction", + "detail": "HB_COMPAT_KERNEL_DIRECTION vaut same, bk_newer ou bk_older selon la comparaison des versions majeures du noyau de la sauvegarde et de la destination. Il pilote le filtre de chemins compatibles entre noyaux, actif uniquement pour bk_older, et l’adaptation des réglages décrite sur la page correspondante." + }, + { + "output": "Liste des chemins exclus", + "detail": "RS_SKIP_PATHS — chaque chemin de restauration ne doit PAS s'appliquer. Populé par deux mécanismes : la dérive matérielle (manque de NIC, défaut d'identification de stockage, pool étranger ZFS) et — lorsque la direction est bk_older — la liste des sentiers dangereux à travers le noyau." + }, + { + "output": "Plan de réaffectation des interfaces réseau", + "detail": "Lorsqu'un NIC sur la cible a le même MAC que celui sur la source mais un nom différent (typique après un swap de carte mère), la vérification de compatibilité enregistre un plan de renommer (HB_NIC_REMAP) qui réécrirea /etc/network/interfaces pendant la restauration." + }, + { + "output": "Plan de restauration", + "detail": "Calculé par compute_rollback_plan.sh. Liste les VM, LXC et composants présents sur la destination mais absents de la sauvegarde. Le dialogue propose de supprimer les invités supplémentaires avant redémarrage. La suppression des composants reste manuelle et celle des invités peut échouer ; une correspondance exacte n’est donc pas garantie." + } + ], + "reportBody": "Le contrôle émet également un rapport structuré (HB_COMPAT_RESULTS) classé PASS / INFO / WARN / FAIL. Les entrées WARN et FAIL sont présentes dans le panneau pré-restauration ; la restauration refuse de procéder seulement lorsqu'une FAIL est présente et que l'utilisateur ne peut pas résoudre en cliquant sur Continuer." + }, + "twoModes": { + "heading": "Restauration complète vs restauration personnalisée", + "intro": "Après le contrôle de compatibilité, le menu de mode apparaît. Le choix détermine ce qui est appliqué, pas comment : les deux modes utilisent le même processus.", + "modeRows": [ + { + "mode": "Restauration complète", + "detail": "Applique tous les chemins de l'archive qui survivent à la dérive et aux filtres de cross-kernel. Exécute également l'installation du paquet et le passe de réinstallation automatique du composant. C'est le choix par défaut et le choix recommandé — le but est de reproduire la source, pas de choisir des morceaux." + }, + { + "mode": "Restauration personnalisée", + "detail": "Ouvre une liste de contrôle montrant chaque chemin que porte l'archive. L'utilisateur coche un sous-ensemble. Les chemins bloqués par le filtre croisé apparaissent grisés et ne peuvent être sélectionnés. L'installation du paquet et l'auto-réinstallation du composant sont ignorées par défaut en mode Custom — l'utilisateur indique qu'il veut une application partielle, pas une reproduction complète." + } + ] + }, + "pathClassification": { + "heading": "Comment les chemins sont classés", + "intro": "Chaque chemin sélectionné pour la restauration est classé par hb_classify_path dans l'une des trois catégories. La catégorie détermine quand le chemin est appliqué au système et pourquoi.", + "rows": [ + { + "class": "hot", + "detail": "Voies appliquées immédiatement au système d'exécution. Le service qui les consomme ramasse le changement seul ou au prochain rechargement — aucun redémarrage n'est nécessaire. Ce sont l'essentiel d'une sauvegarde: /etc/ssh, /etc/apt, /etc/cron.*, /root, /usr/local/bin, fichiers de configuration de service général, etc." + }, + { + "class": "reboot", + "detail": "Chemins reportés au prochain démarrage, au lieu d’être appliqués immédiatement par ce processus. Ils concernent la configuration de démarrage : la génération du chargeur lit /etc/default/grub, les montages utilisent /etc/fstab et le chargement des modules utilise /etc/modules. Les fichiers en attente sont appliqués après redémarrage, puis les éléments de démarrage nécessaires sont régénérés. Exemples : /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + }, + { + "class": "dangerous", + "detail": "Les chemins qui sont NON appliqués sur le système en cours d'exécution — une écriture en direct pourrait corrompre l'état ou abandonner la connexion active. Ceux-ci sont mis en scène dans le jeu en attente et écrits par le répartiteur post-démarrage après le redémarrage, lorsque le cluster est en place mais le système n'est pas encore pleinement utilisé. Exemples : /etc/pve (pmxcfs est un montage FUSE contenant la configuration active du cluster), /var/lib/pve-cluster (données de cluster en direct), /etc/network (pourrait reconfigurer l'interface même que l'utilisateur est connecté sur SSH et laisser tomber la session)." + } + ] + }, + "fullFlow": { + "heading": "Le workflow complet de restauration", + "intro": "Le pipeline complet de la sélection des archives à un hôte opérationnel restauré. Chaque étape alimente la suivante; l'état écrit par les étapes précédentes est consommé par les suivantes.", + "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" + }, + "pendingMachinery": { + "heading": "Mécanisme de restauration différée", + "intro": "Les chemins classés comme reboot ou dangerous, et l'hydratation écrit, sont mis en scène pour le prochain démarrage au lieu d'être appliqués en direct. Cela se fait par le biais d'un petit ensemble autonome de fichiers sous /var/lib/proxmenux/pending-restore/ :", + "rows": [ + { + "file": "apply-on-boot.list", + "content": "Un chemin relatif par ligne : les chemins exacts que apply_pending_restore.sh appliquera depuis rootfs préparé. Le fichier permet de voir les changements prévus au prochain démarrage." + }, + { + "file": "plan.env", + "content": "Variables d’environnement chargées par le script de démarrage : identifiant de restauration, indicateurs de compatibilité (HB_COMPAT_CROSS_VERSION, HB_COMPAT_KERNEL_DIRECTION, HB_HYDRATION_APPLIED), accord pour le rollback et options du cluster." + }, + { + "file": "rs-skip-paths.txt", + "content": "La liste finale RS_SKIP_PATHS, enregistrée pour que apply_pending_restore.sh conserve après redémarrage les exclusions calculées lors de l’étape interactive. Elle empêche de restaurer au démarrage les chemins incompatibles avec le matériel ou le noyau." + }, + { + "file": "rootfs/", + "content": "Les fichiers mis en scène eux-mêmes — les octets exacts qui seront établis. Conservé sur le même système de fichiers que / de sorte que le rsync on-boot est rapide et ne dépend pas du stockage externe encore accessible au démarrage." + } + ], + "unitBody": "L’unité systemd proxmenux-restore-onboot.service est activée à la fin de l’étape interactive. Ce service ponctuel démarre tôt au prochain démarrage, appelle apply_pending_restore.sh puis se désactive. La condition ConditionPathExists=/var/lib/proxmenux/pending-restore/state empêche toute exécution lorsqu’aucune restauration n’est en attente." + }, + "postbootDispatcher": { + "heading": "Le répartiteur après démarrage — apply_cluster_postboot.sh", + "intro": "Où l'étape interactive se termine et où se produit la reproduction réelle de l'hôte. apply_cluster_postboot.sh est installé sous la forme d'une seconde unité systemd (proxmenux-apply-cluster-postboot.service) dont les cibles After=/Wants= s'assurent qu'elle ne fonctionne qu'après la mise en place du pve-cluster et de network-online. C'est là que les actions de restauration visible de l'hôte atterrissent.", + "tasks": [ + { + "task": "Appliquer /etc/pve", + "detail": "/etc/pve est un montage en direct pmxcfs FUSE — il ne peut pas être écrit sur le démarrage précoce. Le répartiteur copie les fichiers des rootfs en attente vers le /etc/pve en direct une fois le système de fichiers cluster mis en place, un fichier à la fois, sans redémarrer pve-cluster. Le /var/lib/pve-cluster/config.db capturé de la sauvegarde (ou le config.db.raw-fallback) promu est matérialisé avec le systemctl stop pve-cluster → copie de fichier atomique → modèle systemctl start pve-cluster, de sorte que pmxcfs relise l'état restauré sur le chemin du retour." + }, + { + "task": "Reconstruction initramfs et bootloader", + "detail": "Exécute update-initramfs -u -k all dans chaque noyau installé, puis soit update-grub (installations GRUB) soit proxmox-boot-tool refresh (installations systemd-boot / ZFS). Passé si l'étape interactive n'a rien déterminé dans les chemins qui affectent ces outils." + }, + { + "task": "Réinstallation automatique du composant", + "detail": "Lit components_status.json restauré et parcourt les installateurs pris en charge (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Chacun est lancé en mode --auto-reinstall, lit l’état enregistré et réinstalle pour l’environnement de destination, en recompilant les modules si nécessaire. L’opération attend le redémarrage pour utiliser le noyau alors actif. Les échecs individuels sont enregistrés sans arrêter le composant suivant." + }, + { + "task": "Vérification du démarrage", + "detail": "Avant de lancer la notification d'achèvement, vérifie que proxmox-boot-tool status affiche un ESP configuré, chaque /boot/vmlinuz-* possède un répertoire /lib/modules/<ver> correspondant, et /vmlinuz résout. Toute incohérence apparaît dans la notification au lieu d'être cachée." + }, + { + "task": "Avis d'achèvement", + "detail": "Envoie l'événement Host restore finished via hb_notify_lifecycle. Comprend la durée totale, le nombre de chemins appliqués, les avertissements de vérification de la santé, le cas échéant, et un lien vers le journal à /var/log/proxmenux/proxmenux-cluster-postboot-*.log. Si les notifications ne sont pas configurées, l'événement est silencieux — le journal enregistre toujours tout." + } + ] + }, + "liveProgress": { + "heading": "Progrès en direct dans l'onglet Sauvegardes du moniteur", + "body": "Après le redémarrage, l’onglet Sauvegardes de ProxMenux Monitor affiche une carte de progression reflétant l’état de proxmenux-apply-cluster-postboot.service. Elle lit /var/lib/proxmenux/restore-state.json, mis à jour à chaque étape : configuration du cluster, initramfs, chargeur de démarrage, réinstallation de chaque composant, contrôle du démarrage et finalisation.", + "fields": [ + { + "name": "Insigne d'état", + "detail": "Un des Restaurer en cours, Restaurer complet ou Restaurer échoué. La carte permet de vérifier le fichier d'état toutes les 2 secondes en cours d'exécution et toutes les 30 secondes après la fin." + }, + { + "name": "Barre de progression + compteur de pas", + "detail": "Affiche N/M steps avec l'étiquette de l'étape actuelle. Pendant que la restauration exécute un temps estimé est dérivé des étapes terminées et du temps écoulé." + }, + { + "name": "Liste des composants", + "detail": "Une ligne par pilote étant réinstallée (NVIDIA, outils Intel GPU, outils AMD, Coral TPU) avec installing / ok / failed plus un lien vers le journal par composant à /var/log/proxmenux/component-*.log." + }, + { + "name": "Importation des pools de données", + "detail": "Le bloc data_pools_import montre cinq lignes colorées : Importés, Forcés (avec -f pour un hostid étranger), Ignorés, disques partiels (seuls certains disques sont présents), Ignorés, disques absents (aucun disque présent) et Échecs. L’état est conservé dans /var/lib/proxmenux/restore-state.json et le journal brut de l’exécution dans /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "name": "Avertissements relatifs au bon fonctionnement du démarrage", + "detail": "Le traitement vérifie les répertoires /lib/modules/<kernel> manquants, l’absence de configuration ESP et les liens symboliques /vmlinuz pointant vers une cible absente. Les avertissements apparaissent ici dans une bannière colorée." + }, + { + "name": "Delta de restauration", + "detail": "Listes VMs, LXCs et composants qui existent sur la cible mais n'étaient pas dans la sauvegarde restaurée — les mêmes entrées sont apparues dans la boîte de dialogue de rappel destructive pré-restauration. Chaque ligne porte la commande de nettoyage manuel." + }, + { + "name": "Fin du journal", + "detail": "Les dernières lignes 600 de proxmenux-cluster-postboot-<ts>.log, avec un filtre Problèmes uniquement qui maintient juste des lignes correspondant à error, warning, failed, ✗ ou traceback." + } + ], + "dismissBody": "Une fois la restauration terminée ou en échec, le bouton Masquer replie la carte. Le fichier d’état est conservé ; Historique rouvre cette restauration et les précédentes. Les 20 dernières exécutions sont archivées dans /var/lib/proxmenux/restore-history/.", + "imageAlt": "Fenêtre Détails du suivi de restauration dans ProxMenux Monitor pendant l’exécution : badge bleu, étape « Reconstruction initramfs », temps restant estimé, barre partiellement remplie et dernières lignes du journal en direct.", + "imageCaption": "Le mode Détails pendant que le répartiteur post-démarrage est toujours en marche — badge, étape actuelle, temps restant et queue de log en direct.", + "detailsImageAlt": "Le même détail modal après la restauration a terminé, avec le badge vert Restore complet, la durée totale d'exécution (0m53s), une barre de progression 6/6, le delta Rollback vide et le journal de post-démarrage archivé.", + "detailsImageCaption": "Le même modal une fois la exécution terminée — badge, durée totale, barre de progression remplie et le journal de post-démarrage archivé." + }, + "postbootExample": { + "heading": "A quoi ressemble le post-boot sur la console", + "body": "Sur la console physique, un traitement qui se termine sans erreur de processus affiche [ OK ] Finished proxmenux-apply-cluster-postboot.service, souvent près des OK de multi-user.target et graphical.target. Cela marque la fin du processus. Des échecs de composants ou avertissements de démarrage peuvent néanmoins avoir été enregistrés ; vérifiez leurs états et les journaux du moniteur avant de considérer l’hôte comme entièrement restauré.", + "imageAlt": "Console physique Proxmox affichant '[ OK ] Finished proxmenux-apply-cluster-postboot.service - ProxMenux Apply Cluster Configs (post-boot).', puis OK pour multi-user.target et graphical.target, avec l’invite de connexion au-dessus.", + "imageCaption": "Console physique à la fin du processus. 'Finished proxmenux-apply-cluster-postboot.service' marque sa fin, également signalée par 'Host restore finished' dans le moniteur. Les résultats des composants et les avertissements restent à vérifier." + }, + "tenMinutes": { + "heading": "Pourquoi les dix dernières minutes comptent", + "intro": "Le redémarrage lui-même prend des secondes, mais le répartiteur post-démarrage passe environ dix minutes à terminer la restauration. Pendant cette fenêtre, l'hôte est accessible et la connexion fonctionne, mais certains services (principalement dépendants des pilotes GPU) ne sont pas encore disponibles. Répartition du temps d'un hôte Proxmox typique avec NVIDIA + Coral installé:", + "rows": [ + { + "stage": "Boot + pve-cluster prêt", + "time": "~30 s", + "detail": "Démarrage standard de Proxmox. SSH, interface web et connexion sont disponibles à la fin de cette étape." + }, + { + "stage": "Appliquer /etc/pve à pmxcfs", + "time": "~10 s", + "detail": "Rapide — petits fichiers de configuration copiés un par un dans le système de fichiers cluster live." + }, + { + "stage": "Reconstruire les initramfs à travers les noyaux", + "time": "3–5 min", + "detail": "update-initramfs -u -k all reconstruit une image initramfs par noyau installé. Le gros de l'attente." + }, + { + "stage": "Reconstruire la configuration du chargeur de démarrage", + "time": "10–30 s", + "detail": "update-grub ou proxmox-boot-tool refresh. Rapide même sur ZFS." + }, + { + "stage": "Réinstallation du pilote NVIDIA (le cas échéant)", + "time": "5–10 min", + "detail": "Télécharger la version du pilote enregistrée, compiler les modules DKMS contre le noyau actuel, applique le correctif ProxMenux si la source l'avait. La tâche la plus longue." + }, + { + "stage": "Réinstallation de Coral et des autres composants", + "time": "3–5 min", + "detail": "DKMS compile pour Coral, apt install pour intel-gpu-tools, .deb download + install pour amdgpu_top." + }, + { + "stage": "Vérification du démarrage et notification", + "time": "~2 s", + "detail": "Très rapide. La notification informe l’utilisateur dès la fin de l’exécution." + } + ], + "outroBody": "Pendant cette période, certains outils peuvent manquer après connexion (nvidia-smi introuvable, coral non détecté), car la réinstallation continue en arrière-plan. La notification marque la fin du traitement ; vérifiez résultats des composants, avertissements et journaux pour distinguer succès et échecs individuels." + }, + "destructiveRollback": { + "heading": "Le renversement destructeur facultatif", + "body": "La restauration est additive par défaut : VM, LXC et composants supplémentaires restent présents. En cas de différences, le dialogue propose Exécuter le rollback destructif ?, avec Non par défaut. Accepter appelle _rs_execute_rollback avant redémarrage pour tenter de supprimer les VM et LXC supplémentaires listés. Les composants sont signalés pour désinstallation manuelle, faute de désinstallation automatique. Les échecs de suppression sont rapportés sans arrêter la suite ; une correspondance exacte n’est pas garantie. Vérifiez noms et VMID/CTID avant ce choix destructif." + }, + "logs": { + "heading": "Emplacement des journaux", + "rows": [ + { + "log": "/var/log/proxmenux/restore-YYYYMMDD_HHMMSS.log", + "detail": "Écrit lors de l’étape interactive : résultats de compatibilité, filtre des différences, plan d’adaptation, sorties de l’application à chaud et de la préparation différée, installation des paquets." + }, + { + "log": "/var/log/proxmenux/apply-pending-YYYYMMDD_HHMMSS.log", + "detail": "Écrit par apply_pending_restore.sh au début du démarrage : chargement de plan.env, parcours de apply-on-boot et filtrage des chemins exclus." + }, + { + "log": "/var/log/proxmenux/proxmenux-cluster-postboot-YYYYMMDD_HHMMSS.log", + "detail": "Écrit par apply_cluster_postboot.sh. Contient: pve-cluster appliquer, initramfs et sortie de chargeur d'amorçage, sortie d'installation par composant, vérification de la santé, charge utile de notification." + }, + { + "log": "/var/log/proxmenux/component--YYYYMMDD_HHMMSS.log", + "detail": "Un journal par programme d'installation de composant (nvidia, coral, etc.) exécuté lors de la passe post-démarrage. Utile lorsque la réinstallation d'un composant spécifique a échoué et que l'utilisateur a besoin de la propre sortie de l'outil." + }, + { + "log": "/var/log/proxmenux/restore-datapools-YYYYMMDD_HHMMSS.log", + "detail": "Écrit par _rs_import_data_pools. Contient : le dénombrement de pools non-racines à partir du manifeste, le résultat par pool (importé proprement, importé avec -f pour un hôte étranger, ignoré en raison de disques absents, ou échoué), et la sortie brute de chaque appel zpool import." + } + ] + }, + "whereNext": { + "heading": "Où aller ensuite?", + "items": [ + { + "label": "Restauration entre versions du noyau", + "href": "/docs/backup-restore/cross-kernel", + "tail": " — le filtre de chemins sûrs tenant compte du sens du changement de noyau et l’adaptation des réglages lorsque le noyau de destination diffère de celui de la sauvegarde." + }, + { + "label": "Comment ça marche", + "href": "/docs/backup-restore/how-it-works", + "tail": "— la mise en page des archives, le manifeste et l'inventaire des applications que la restauration consomme." + }, + { + "label": "Tâches planifiées", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "— le flux sans surveillance qui produit les archives que cette page consomme." + } + ] + } +} diff --git a/web/messages/fr/docs/backup-restore/scheduled-jobs.json b/web/messages/fr/docs/backup-restore/scheduled-jobs.json new file mode 100644 index 00000000..8f8ac95c --- /dev/null +++ b/web/messages/fr/docs/backup-restore/scheduled-jobs.json @@ -0,0 +1,152 @@ +{ + "meta": { + "title": "Tâches planifiées — temporisateurs, mode attach et rétention | ProxMenux", + "description": "Tâches de sauvegarde d’hôte ProxMenux programmées. Deux modes de création (minuteur systemd propre ou association à une tâche vzdump PVE existante), règles de rétention appliquées par tâche avec proxmox-backup-client, Borg ou le nettoyage local, fichiers sous /var/lib/proxmenux/backup-jobs et script d’exécution produisant les mêmes archives que le processus interactif.", + "ogTitle": "Sauvegarde ProxMenux — tâches programmées", + "ogDescription": "Sauvegardes d'hôte programmées non surveillées avec mode de fixation, conservation, et les mêmes trois destinations que le flux interactif.", + "twitterTitle": "Tâches planifiées | ProxMenux", + "twitterDescription": "Tâches programmées de sauvegarde d’hôte sans intervention, avec mode d’association et rétention." + }, + "header": { + "title": "Tâches programmées", + "description": "Tâches de sauvegarde d’hôte sans intervention. Deux modèles de création : une nouvelle tâche indépendante avec son propre calendrier, ou une tâche associée à une tâche vzdump PVE existante, dont elle reprend le calendrier et la rétention. Les deux produisent les mêmes archives que le processus interactif.", + "section": "Sauvegarde et restauration" + }, + "intro": { + "title": "Les deux modèles de tâches programmées", + "body": "Une tâche programmée peut être créé selon l'un des deux modèles suivants :", + "modelsList": [ + "Nouveau travail indépendant — ProxMenux définit lui-même l'horaire de travail avec sa propre minuterie systemd, indépendamment de toute autre tâche sur l'hôte. Compatible avec les trois destinations : Local, PBS et Borg.", + "Associer à une tâche vzdump PVE existante — la tâche n’a pas de calendrier propre ; elle s’exécute automatiquement quand la tâche vzdump parente sauvegarde les VM et LXC de cet hôte. Elle reprend son calendrier et sa rétention. Compatible avec les destinations locale et PBS (Borg n’est pas pris en charge, car PVE n’a pas de planificateur natif pour Borg)." + ] + }, + "attachBadge": { + "title": "Mode d’association — recommandé si une tâche vzdump PVE existe déjà", + "body": "Lorsqu’une tâche de sauvegarde vzdump PVE est déjà configurée pour les VM et LXC du nœud, l’association de la sauvegarde hôte la fait exécuter après celle des invités, dans le même cycle de sauvegarde. À la restauration, les configurations des invités viennent de la sauvegarde hôte (sous /etc/pve) et leurs disques des sauvegardes vzdump du même cycle. Cela facilite la récupération coordonnée du nœud, sans constituer un instantané atomique : des modifications pendant le cycle peuvent créer des écarts entre la configuration hôte et l’état des disques des invités." + }, + "frequencyBadge": { + "title": "Fréquence recommandée", + "body": "Pour maximiser la compatibilité entre une sauvegarde hôte et sa future restauration, sauvegardez fréquemment l’hôte. Plus la copie est proche de son état actuel, moins la restauration doit réconcilier d’écarts de configuration, de paquets et de composants." + }, + "modes": { + "heading": "Les deux modes", + "rows": [ + { + "mode": "Nouveau travail planifié", + "backends": "Local, PBS, Borg", + "schedule": "Propre expression OnCalendar (syntaxe du calendrier systemd — par exemple daily, Mon..Fri 03:00).", + "retention": "Demandée séparément: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. Appliquée par le script d’exécution après chaque sauvegarde réussie." + }, + { + "mode": "Associer à une tâche vzdump PVE", + "backends": "Local, PBS (Borg n'a pas de planificateur côté PVE)", + "schedule": "Hérité de la tâche PVE parente. Aucun minuteur systemd n’est installé côté ProxMenux.", + "retention": "Héritée de la configuration prune-backups de la tâche parente (associée une à une aux variables KEEP_* du script d’exécution via hb_pve_prune_to_keep_env)." + } + ] + }, + "attachDetail": { + "heading": "Comment fonctionne le mode de fixation", + "intro": "PVE écrit les tâches vzdump dans /etc/pve/jobs.cfg, avec une section par tâche indiquant le stockage des sauvegardes VM et LXC. Le mode d’association exige un backend compris par ProxMenux (local ou PBS). La sauvegarde hôte s’exécute via le hook job-end après la fin de la tâche de sauvegarde des invités.", + "steps": [ + { + "step": "1", + "detail": "Lors de la création de tâches, ProxMenux liste les tâches parent PVE compatibles via hb_pve_list_vzdump_jobs_for_backend. L'utilisateur en choisit un." + }, + { + "step": "2", + "detail": "Le .env de l'emploi est écrit avec PVE_PARENT_JOB, PVE_STORAGE et les valeurs de KEEP_* héritées; aucun minuteur systemd n'est créé." + }, + { + "step": "3", + "detail": "hb_install_vzdump_hook enregistre un hook dans /etc/vzdump.conf. À la phase job-end de toute tâche vzdump, il compare le $STOREID reçu au PVE_STORAGE de chaque tâche associée activée et appelle le script d’exécution en cas de correspondance. L’association se fait par stockage, et non par identifiant de la tâche parente choisie." + }, + { + "step": "4", + "detail": "L’archive est enregistrée dans le même stockage que les sauvegardes vzdump : path/dump/ pour la destination locale ou le dépôt PBS configuré dans l’entrée de stockage PVE." + } + ], + "outroBody": "Le mode d’association n’a pas de minuteur propre. Désactiver ou supprimer la tâche PVE parente choisie arrête son déclenchement, mais une autre tâche vzdump utilisant le même stockage peut encore lancer la sauvegarde hôte. Désactivez ou supprimez la tâche ProxMenux elle-même pour l’empêcher. Lors d’une désactivation, son entrée reste sur disque pour permettre une réactivation ou une nouvelle association." + }, + "storageLayout": { + "heading": "Fichiers qui constituent un travail", + "intro": "Chaque travail programmé est entièrement décrit par trois ou quatre fichiers sur disque. Les lire donne la configuration complète du travail sans compter sur l'interface.", + "rows": [ + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env", + "content": "Backend, identifiant de sauvegarde ou destination, calendrier (nouvelle tâche) ou tâche PVE parente (association), indicateur d’activation, valeurs de rétention KEEP_* et références aux identifiants." + }, + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths", + "content": "Un chemin absolu par ligne : la sélection figée à partir du profil lors de la création de la tâche. Modifier le fichier utilise la nouvelle sélection à la prochaine exécution du minuteur." + }, + { + "path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service", + "content": "Nouveau mode seulement. Le service invoque run_scheduled_backup.sh JOB_ID. Le minuteur le planifie avec Persistent=true (exécutions manquées rattrapées au prochain démarrage) et un petit RandomizedDelaySec=120 pour répartir la charge lorsque plusieurs tâches partagent la même expression OnCalendar." + }, + { + "path": "/etc/vzdump.conf script-hook", + "content": "Mode d’association uniquement. Installé une fois par hb_install_vzdump_hook ; compare le PVE_STORAGE de chaque tâche associée au $STOREID transmis par PVE au hook." + } + ] + }, + "runner": { + "heading": "Ce que fait une tâche à son déclenchement", + "intro": "Chaque travail — qu’il s’agisse d’une nouvelle tâche indépendante ou d’une tâche associée — comporte la même séquence en trois étapes:", + "steps": [ + "Prépare la sauvegarde. Lit la configuration de travail (destination, profil, chemins) et assemble l'arborescence des archives exactement comme le flux interactif. Le résultat est la même archive qu'une sauvegarde manuelle avec ces paramètres produirait.", + "Écrire à la destination. Charge ou écrit l'archive vers la destination configurée — un fichier local .tar.zst, une sauvegarde PBS ou une archive Borg — en utilisant exactement les mêmes outils et identifiants qu’une sauvegarde manuelle vers la même destination.", + "Appliquer la rétention. Supprime les anciennes sauvegardes de la destination, en maintenant les nombres keep-last / keep-daily / keep-weekly configurés sur le travail. La purge est effectuée par la destination elle-même: PBS applique sa propre conservation, Borg exécute borg prune, et pour Local ProxMenux supprime les fichiers qui tombent en dehors de la fenêtre keep-last." + ] + }, + "management": { + "heading": "Gestion des tâches", + "intro": "Le menu planificateur (Scripts TUI) et l'onglet Sauvegardes Monitor exposent les mêmes actions sur n'importe quel travail.", + "rows": [ + { + "action": "Exécuter maintenant", + "detail": "Appelle immédiatement le script d’exécution, sans attendre le minuteur ou le hook vzdump. Utile pour vérifier la configuration sans attendre le prochain déclenchement." + }, + { + "action": "Activer / Désactiver", + "detail": "Nouveau mode : systemctl enable/disable --now la minuterie. Attache le mode : retourne le drapeau ENABLED dans le travail env — le script hook l'honore au prochain déclenchement PVE." + }, + { + "action": "Modifier", + "detail": "Rouvre les champs de destination, calendrier, profil et rétention et réécrit les fichiers de la tâche. Conserve son identifiant." + }, + { + "action": "Supprimer", + "detail": "Supprime le fichier env, la liste des chemins et le minuteur et service systemd (nouvelle tâche), et désactive l’association au hook (mode d’association). Les archives déjà présentes à destination restent intactes." + }, + { + "action": "Voir le journal", + "detail": "Affiche en continu /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log : un fichier journal par exécution. Le programme d'exécution émet également une ligne d'état compacte à journald sous le service systemd." + } + ] + }, + "notifications": { + "heading": "Notifications", + "body": "Chaque exécution programmée déclenche les mêmes événements hb_notify_lifecycle que le flux interactif (start, complete, fail). Si les canaux de notification sont configurés dans le moniteur, les tâches non surveillées présentent leurs résultats de la même manière que les sauvegardes manuelles, un utilisateur n'a pas besoin de vérifier le journal pour savoir si une tâche a réussi." + }, + "whereNext": { + "heading": "Où aller ensuite?", + "items": [ + { + "label": "Création de sauvegardes", + "href": "/docs/backup-restore/creating-backups", + "tail": "— le flux interactif qui partage le moteur avec le planificateur." + }, + { + "label": "Destinations", + "href": "/docs/backup-restore/destinations", + "tail": "— configuration par moteur utilisée à la fois par le flux interactif et le planificateur." + }, + { + "label": "Restauration", + "href": "/docs/backup-restore/restoring", + "tail": " — le processus qui utilise les sauvegardes produites par les tâches." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/creating-backups.json b/web/messages/it/docs/backup-restore/creating-backups.json new file mode 100644 index 00000000..a7fd47c4 --- /dev/null +++ b/web/messages/it/docs/backup-restore/creating-backups.json @@ -0,0 +1,220 @@ +{ + "meta": { + "title": "Creazione di backup — flusso di backup interattivo | ProxMenux", + "description": "Il flusso di backup interattivo di ProxMenux: due punti di accesso (il menu TUI di Scripts e l’interfaccia web di Monitor), tre destinazioni, due modalità di profilo, una fase di preparazione temporanea e una finestra di conferma. La pagina descrive la matrice con sei opzioni, i profili predefinito e personalizzato e ciò che vede l’utente dalla scelta del backup fino al salvataggio dell’archivio a destinazione.", + "ogTitle": "ProxMenux Backup — creazione di backup", + "ogDescription": "Il flusso di backup interattivo con tre destinazioni, due profili e una fase di staging comune.", + "twitterTitle": "Creazione di backup | ProxMenux", + "twitterDescription": "Flusso di backup interattivo con tre destinazioni e due modalità di profilo." + }, + "header": { + "title": "Creazione di backup", + "description": "Il flusso di backup interattivo: scegli una destinazione e un profilo, controlla il riepilogo di conferma e segui il salvataggio dell’archivio. I due punti di accesso condividono lo stesso backend e producono archivi identici.", + "section": "Backup e ripristino" + }, + "intro": { + "title": "Due punti di ingresso, funzionalità identiche", + "body": "La TUI di Scripts e l’interfaccia web di Monitor offrono esattamente le stesse funzionalità. Ogni backup — manuale o pianificato — usa la stessa matrice di scelta (tre destinazioni × due profili) e richiama la stessa funzione backend per ogni cella (_bk_pbs, _bk_borg o _bk_local). Gli archivi prodotti dai due punti di accesso sono indistinguibili. La scelta dipende dalle preferenze: la TUI è adatta a SSH e agli script; Monitor offre il controllo con il mouse insieme alle viste delle notifiche e del monitoraggio dei log." + }, + "entryPoints": { + "heading": "I due punti di ingresso", + "rows": [ + { + "entry": "ProxMenux Scripts (TUI)", + "path": "menu → Utilities → Host Config Backup", + "detail": "Flusso basato sul dialogo, SSH-friendly. Il menu principale presenta le sei opzioni direttamente. Utilizza backup_menu in backup_host.sh." + }, + { + "entry": "ProxMenux Monitor (interfaccia web)", + "path": "Backups tab → Create backup", + "detail": "Flusso guidato da una procedura assistita. Le stesse sei opzioni sono presentate in un modulo in due passaggi (destinazione → profilo). Le stesse funzioni backend vengono richiamate tramite l’API Flask." + } + ] + }, + "modes": { + "heading": "Backup manuali e pianificati", + "body": "I backup possono essere prodotti in due modi: manuale (il flusso interattivo descritto in questa pagina - l'utente sceglie una destinazione e un profilo da un menu e segue il salvataggio dell’archivio) o pianificato (un lavoro non assistito che funziona su un timer in stile cron e applica la ritenzione configurata sul lavoro). Entrambe le modalità supportano le stesse tre destinazioni e gli stessi due profili, ed entrambe sono disponibili da entrambi i punti di ingresso — il menu Script TUI e la scheda Monitor Backups. I lavori programmati utilizzano le stesse funzioni backend del flusso manuale attraverso run_scheduled_backup.sh; gli archivi prodotti sono indistinguibili.", + "seeAlso": "La pagina dei lavori programmati copre il flusso completo, incluso come creare un lavoro, collegarlo a un timer PVE vzdump esistente e configurare i valori di ritenzione.", + "monitorAlt": "Scheda di backup ProxMenux Monitor che mostra la Nuova finestra di dialogo di backup programmata con i campi di destinazione, profilo, pianificazione e ritenzione.", + "monitorCaption": "Backup pianificato — ProxMenux Monitor. La stessa finestra guidata che crea un backup manuale contiene in basso i campi di pianificazione e conservazione per l’esecuzione senza intervento." + }, + "matrix": { + "heading": "La matrice con sei opzioni", + "intro": "La scelta determina sia il backend eseguito sia la strategia di selezione dei percorsi. Consulta le pagine delle singole destinazioni per i dettagli di configurazione di ogni cella.", + "rows": [ + { + "combo": "1", + "destination": "PBS", + "profile": "Predefinito", + "action": "Carica il profilo predefinito e gli extra persistenti su un repository PBS configurato." + }, + { + "combo": "2", + "destination": "Borg", + "profile": "Predefinito", + "action": "Crea un archivio con il profilo predefinito più extra persistenti nel repository Borg selezionato." + }, + { + "combo": "3", + "destination": "Locale", + "profile": "Predefinito", + "action": "Scrive un archivio .tar.zst con il profilo predefinito più extra persistenti al target locale configurato." + }, + { + "combo": "4", + "destination": "PBS", + "profile": "Personalizzato", + "action": "Apre il selettore dei percorsi prima del caricamento su PBS; l’utente seleziona i percorsi e può aggiungerne di nuovi." + }, + { + "combo": "5", + "destination": "Borg", + "profile": "Personalizzato", + "action": "Apre il selettore dei percorsi prima di creare l’archivio Borg." + }, + { + "combo": "6", + "destination": "Locale", + "profile": "Personalizzato", + "action": "Apre il selettore dei percorsi prima di scrivere il file .tar.zst locale." + } + ] + }, + "profiles": { + "heading": "Profilo predefinito e personalizzato", + "defaultTitle": "Profilo predefinito", + "defaultBody": "Il profilo predefinito è l'elenco curato da hb_default_profile_paths (documentato in Come funziona sotto Categorie di percorsi) più ogni voce nel file extra persistente /usr/local/share/proxmenux/backup-extra-paths.txt. L'utente conferma le opzioni di destinazione e crittografia e il backup procede senza ulteriori selezioni dei percorsi.", + "customTitle": "Profilo personalizzato", + "customBody": "Il profilo personalizzato apre un elenco con tutti i percorsi del profilo predefinito (non selezionati) e tutti gli extra persistenti (già selezionati, con il prefisso [+]). L’utente seleziona i percorsi per questa esecuzione e può premere Aggiungi percorso personalizzato per aggiungere un nuovo percorso assoluto. I percorsi aggiunti vengono salvati in backup-extra-paths.txt, così i backup futuri li includono automaticamente senza doverli aggiungere di nuovo. Deselezionare un extra persistente lo esclude da questa esecuzione ma non lo elimina dal file — l’eliminazione avviene con l’azione separata Gestisci percorsi personalizzati, al di fuori del flusso di backup.", + "customPickerAlt": "Elenco di controllo del profilo personalizzato che mostra i percorsi di predefinito (non selezionati) e gli extra persistenti (già selezionati con un prefisso [+]), più pulsanti per aggiungere un nuovo percorso o confermare la selezione.", + "customPickerCaption": "Profilo personalizzato — il selettore dei percorsi. I percorsi del profilo predefinito non sono selezionati; gli extra persistenti sono già selezionati con il prefisso [+]. L’utente seleziona i percorsi per questa esecuzione.", + "manageCustomAlt": "Menu di gestione dei percorsi personalizzati con l’elenco degli extra persistenti e le opzioni per aggiungerli, rimuoverli o modificarli.", + "manageCustomCaption": "Gestisci percorsi personalizzati — il punto di ingresso dove vengono aggiunti o rimossi gli extra persistenti. Ogni percorso elencato qui è incluso automaticamente nei backup in modalità predefinita senza dover aprire il selettore personalizzato." + }, + "commonPipeline": { + "heading": "Cosa funziona indipendentemente dalla destinazione", + "intro": "Una volta definito il profilo, ogni backend esegue la stessa procedura di preparazione temporanea prima di passare al proprio metodo di caricamento. hb_prepare_staging assembla l’albero dell’archivio in /tmp/proxmenux-DESTINATION-stage.XXXXXX e compila ciascuno dei tre blocchi di dati.", + "steps": [ + { + "step": "1", + "name": "Assemblaggio del rootfs", + "detail": "Esegue rsync -a per ogni percorso selezionato verso staging_root/rootfs/. Il database pmxcfs in /var/lib/pve-cluster/config.db viene acquisito separatamente tramite sqlite3 .backup per ottenere un’istantanea coerente senza arrestare il cluster; i file ausiliari .db-wal / .db-shm sono esclusi da rsync. Se sqlite3 non è disponibile, viene invece salvato un file config.db.raw-fallback, che il ripristino adotta come database durante l’importazione. Da /root/ sono esclusi i sottopercorsi volatili (cronologia bash, cache, cestino). I percorsi assenti nell’origine vengono registrati in metadata/missing_paths.txt senza interrompere il backup." + }, + { + "step": "2", + "name": "Generazione manifesto", + "detail": "build_manifest.sh coordina i sei moduli di raccolta e scrive manifest.json nella radice della directory temporanea. Se un modulo non riesce, la sezione interessata assume un valore predefinito vuoto documentato; il manifest resta valido." + }, + { + "step": "3", + "name": "Inventario dei pacchetti", + "detail": "apt-mark showmanual viene catturato verbatim in metadata/packages.manual.list. Lo stato dei componenti è già all'interno del rootfs ripristinato (components_status.json) perché /usr/local/share/proxmenux/ fa parte del profilo predefinito." + }, + { + "step": "4", + "name": "Informazioni sull’esecuzione", + "detail": "metadata/run_info.env registra l'identità di esecuzione di backup — hostname, timestamp, versione del kernel — utilizzata dal controllo di compatibilità del ripristino per determinare la direzione del cross-kernel." + }, + { + "step": "5", + "name": "Notifica (start)", + "detail": "Viene eseguito hb_notify_lifecycle \"start\". Se le notifiche sono configurate in Monitor, viene inviato all’utente l’evento Backup dell’host avviato. Non viene inviato nulla se non sono configurati canali." + } + ] + }, + "included": { + "heading": "Cosa entra e cosa rimane fuori", + "intro": "Ogni percorso nel profilo risolto (predefinito + extra persistenti + selezione personalizzata) viene copiato con rsync -aAXH --numeric-ids. Un elenco di esclusione condiviso si applica a ogni percorso, e due directory portano ulteriori esclusioni specifiche del percorso.", + "globalTitle": "Esclusioni globali (applicate ad ogni percorso)", + "globalItems": [ + "images/ — dump immagine.", + "dump/ — output di vzdump.", + "tmp/ — file temporanei.", + "*.log — file di registro." + ], + "rootTitle": "/root/ esclusioni", + "rootBody": "/root/ fa parte del profilo predefinito per includere nell’archivio gli script e la configurazione dell’utente. Sono esclusi i sottopercorsi volatili:", + "rootItems": [ + ".bash_history", + ".cache/", + "tmp/", + ".local/share/Trash/" + ], + "proxmenuxTitle": "/usr/local/share/proxmenux/ esclusioni", + "proxmenuxBody": "Questa directory spedisce solo stato utente — components_status.json, preferenze, cache post-installazione. Codice che la destinazione avrà già dalla propria installazione ProxMenux è escluso quindi un ripristino non sovrascrive i binari attuali dell'obiettivo con quelli più vecchi:", + "proxmenuxItems": [ + "restore-pending/, scripts/, web/", + "monitor-app/, monitor-app.*/, AppImage/", + "images/, json/", + "utils.sh, helpers_cache.json", + "ProxMenux-Monitor.AppImage*, install_proxmenux*.sh" + ], + "notInProfileTitle": "Percorsi fuori dal profilo", + "notInProfileBody": "Qualsiasi cosa non elencata in hb_default_profile_paths e non aggiunta come un extra personalizzato o persistente non fa parte del backup. Esempi notevoli:", + "notInProfileItems": [ + "VM e dischi LXC — gestiti da vzdump, non da questa funzione. I file di configurazione degli ospiti sotto /etc/pve/nodes/*/qemu-server/*.conf e lxc/*.conf vengono catturati (vivono sotto /etc/pve) in modo che il ripristino riproduca l'inventario; i dischi stessi vengono riattaccati da un backup vzdump/PBS esistente.", + "/boot e /boot/efi — binari del kernel, initramfs e la partizione UEFI ESP sono rigenerati dal proprio update-initramfs, update-grub o proxmox-boot-tool refresh dopo il ripristino. Il bootloader non è mai copiato verbatim.", + "Filesystem del kernel e dello stato di esecuzione del sistema — /proc, /sys, /dev e /run sono pseudo-filesystem generati dal kernel e da udev; non vengono salvati in modo persistente.", + "Binari dei pacchetti in /usr/bin, /usr/lib, /lib, /sbin — reinstallati da APT sul sistema di destinazione a partire da packages.manual.list.", + "/var/log/, /var/tmp/, /var/cache/ — stato runtime per host, non restaurato.", + "/home/USER — non nel profilo predefinito. Aggiungilo come un percorso personalizzato quando un sistema porta directory home degli utenti che devono sopravvivere a un ripristino." + ], + "customPathsTitle": "Come vengono gestiti i percorsi personalizzati", + "customPathsBody": "Un percorso personalizzato aggiunto in linea in modalità personalizzata o persistito in backup-extra-paths.txt passa attraverso la stessa pipeline rsync come percorsi di default-profile. Si applicano esclusioni globali. Se il percorso personalizzato avviene sotto /root/ o /usr/local/share/proxmenux/, si applicano ancora le esclusioni specifiche del percorso. Ogni percorso archiviato — predefinito o personalizzato — viene registrato in metadata/paths_archived.txt. I percorsi che non esistono sulla sorgente sono registrati in metadata/missing_paths.txt senza interrompere il backup." + }, + "archiveStructure": { + "heading": "Struttura dell'archivio", + "intro": "La directory di staging prodotta da ogni backend segue lo stesso layout indipendentemente dalla destinazione. Il tarball, PBS .pxar o Borg archivio memorizza questo albero verbatim.", + "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│ ├── paths_archived.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": "Riepilogo conferma", + "body": "Prima che il backend scriva qualcosa alla destinazione, ProxMenux mostra una finestra di dialogo sommaria con la destinazione, l'ID di backup o il nome dell'archivio, lo stato di crittografia e l'elenco dei percorsi da copiare. Cancellando qui interrompe il backup in modo pulito — la directory di staging viene rimossa dal gancio trap impostato sulla funzione backend e nessun dato parziale raggiunge la destinazione." + }, + "writing": { + "heading": "Scrivere alla destinazione", + "intro": "Dopo la conferma, ogni backend esegue la propria fase di scrittura. Le pagine delle destinazioni ne descrivono il funzionamento; gli elementi comuni sono il log, il file ausiliario e la notifica di completamento.", + "rows": [ + { + "topic": "File di registro", + "detail": "Ogni backend scrive il suo output completo a /tmp/proxmenux-DESTINATION-backup-YYYYMMDD_HHMMSS.log e, in caso di guasto, offre di aprirlo in una finestra di dialogo scorrevole. Il percorso di log è stampato nel sommario di completamento solo quando il file ha contenuto." + }, + { + "topic": "Sidecar (solo locale)", + "detail": "hb_write_archive_sidecar scrive un *.proxmenux.json accanto all'archivio locale, quindi il Monitor lo identifica come backup host ProxMenux anche dopo mosse o rinominazioni." + }, + { + "topic": "Notifica (completamento/errore)", + "detail": "Viene eseguito hb_notify_lifecycle \"complete\" o \"fail\" con durata, dimensione dell’archivio e — in caso di errore — l’ultima riga del log che sembra indicare un errore." + } + ] + }, + "finishedScreens": { + "heading": "Che aspetto ha un backup finito", + "intro": "Lo stesso evento di completamento viene mostrato da entrambi i punti di accesso. La TUI scrive un riepilogo nel terminale; la scheda Backups di Monitor mostra l’esecuzione nell’elenco degli archivi con dimensione, durata e indicatori di stato.", + "scriptsAlt": "ProxMenux Scripts TUI che mostra un backup host finito — destinazione, ID di backup, percorso snapshot, dimensione dei dati, durata e stato di crittografia.", + "scriptsCaption": "Backup finito — ProxMenux Scripts (TUI). Il blocco di completamento stampa la destinazione, l'ID di backup, il nome dell'istantanea o dell'archivio risultante, la dimensione dei dati, la durata e lo stato di crittografia.", + "monitorAlt": "Scheda di backup ProxMenux Monitor che mostra una voce di backup host finita con dimensioni, durata, indicatore del metodo e indicatore di crittografia.", + "monitorCaption": "Backup finito — scheda di backup ProxMenux Monitor. Il nuovo backup appare nell'elenco di archivio con il badge metodo di destinazione, dimensione, durata e - quando applicabile - l'indicatore di blocco di crittografia." + }, + "whereNext": { + "heading": "Dove andare dopo", + "items": [ + { + "label": "Destinazioni", + "href": "/docs/backup-restore/destinations", + "tail": "— dettagli di configurazione per Local, PBS e Borg." + }, + { + "label": "Lavori programmati", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "— eseguire lo stesso backup incustodito su un programma invece di interattivamente." + }, + { + "label": "Ripristino", + "href": "/docs/backup-restore/restoring", + "tail": "— il flusso che consuma ciò che questa pagina produce." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/cross-kernel.json b/web/messages/it/docs/backup-restore/cross-kernel.json new file mode 100644 index 00000000..b784fc2f --- /dev/null +++ b/web/messages/it/docs/backup-restore/cross-kernel.json @@ -0,0 +1,170 @@ +{ + "meta": { + "title": "Ripristino tra versioni del kernel — direzione, filtro sicuro e idratazione | ProxMenux", + "description": "Come ProxMenux ripristina un backup host con una versione principale diversa del kernel. Rileva la direzione della differenza, esclude percorsi critici per l’avvio se il kernel di destinazione è più recente e riapplica in quattro fasi IOMMU, ID VFIO e parametri personalizzati senza ricopiare i file legati al kernel.", + "ogTitle": "ProxMenux Backup — ripristino tra versioni del kernel e idratazione", + "ogDescription": "Ripristino tra versioni del kernel che considera la direzione del cambiamento, con filtro sicuro e idratazione indipendente dal kernel.", + "twitterTitle": "Ripristino tra versioni del kernel | ProxMenux", + "twitterDescription": "Come ProxMenux gestisce un ripristino quando il kernel di destinazione differisce dal backup." + }, + "header": { + "title": "Ripristino tra versioni del kernel", + "description": "Come ProxMenux gestisce un ripristino quando l'host di destinazione esegue un kernel diverso da quello registrato nel backup — soprattutto quando il target esegue un kernel più recente. Spiega come viene rilevata la differenza, come i percorsi boot-critical che potrebbero rompere il bersaglio sono filtrati e come la configurazione dell'utente viene riapplicata senza copiare i file legati al kernel verbatim.", + "section": "Backup e ripristino" + }, + "intro": { + "title": "Ogni salto del kernel viene gestito in modo diverso", + "body": "Il kernel di un host Proxmox è identificato da una stringa di versione come 6.17.13-2-pve. I primi due numeri (6.17 in questo esempio) definiscono la versione principale: quando cambiano, alcuni file di configurazione scritti per il kernel precedente potrebbero non essere validi sul nuovo. Quando il ripristino rileva che il backup e l'obiettivo hanno diverse versioni principali del kernel, i rami di flusso in base alla direzione del salto — se il backup è più vecchio o più recente del bersaglio — perché i due casi hanno modalità di guasto opposte. I backup più recenti rispetto al target ripristinano in modo pulito come-è (bench-verified attraverso salti multipli del kernel). I backup più vecchi del target hanno bisogno di un filtro per evitare di rompere il boot del target con la configurazione scritta per un kernel che è cambiato da allora." + }, + "directionCheck": { + "heading": "Il controllo della direzione", + "intro": "Durante la verifica della compatibilità, hb_compat_check confronta il kernel registrato nel manifesto del backup contro il kernel corrente dell'obiettivo (uname -r) e classifica il ripristino in uno dei tre casi, memorizzato nella variabile interna HB_COMPAT_KERNEL_DIRECTION:", + "rows": [ + { + "direction": "same", + "condition": "La versione principale del kernel corrisponde tra backup e target.", + "behavior": "Il flusso di ripristino completo scorre invariato. Nessun filtro extra, nessuna idratazione, nessun avviso speciale nell'interfaccia utente." + }, + { + "direction": "bk_newer", + "condition": "Il kernel del backup è PIÙ RECENTE di quello di destinazione (ad esempio: backup su 7.0, destinazione su 6.17).", + "behavior": "Il flusso di ripristino completo scorre invariato, esattamente come same. Nessun filtro viene applicato. Verificato empiricamente: i driver auto-reinstallano contro il kernel del target, IOMMU config si applica in modo pulito, le VM con passthrough GPU arrivano senza problemi." + }, + { + "direction": "bk_older", + "condition": "Il kernel del backup è PIÙ VECCHIO di quello di destinazione (ad esempio: backup su 6.17, destinazione su 7.0).", + "behavior": "Il filtro sicuro-sottoset e l'idratazione di quattro fasi qui sotto sono attivati. Il ripristino prosegue — il bersaglio riproduce la fonte, ma i file boot-critical non sono copiati verbatim." + } + ] + }, + "whyBkNewerIsSafe": { + "heading": "Perché un backup con un kernel più recente rispetto al target ripristina invariato", + "body": "Quando il ripristino viene eseguito contro un obiettivo con un kernel più vecchio rispetto a quello registrato nel backup, ogni meccanismo che il ripristino dipende è indipendente dalla versione del kernel. Gli installatori di driver GPU e altri installatori PCI-device rilevano il kernel in esecuzione con uname -r e compilano DKMS contro qualunque sia l'obiettivo. Il pacchetto APT install tira binari costruiti per la distribuzione del bersaglio. I gettoni cmdline IOMMU come intel_iommu=on sono stabili nelle principali versioni del kernel. Il backup trasporta i percorsi scritti sotto un kernel più recente, ma quei percorsi (module blacklists, GRUB defaults, initramfs config) sono ancora validi sintassi sul vecchio — i kernel ignorano i token che non riconoscono invece di fallire. Questo caso è equivalente in pratica a un ripristino dello stesso kernel, e ProxMenux lo tratta come tale." + }, + "safeSubsetFilter": { + "heading": "Il filtro safe-subset (solo quando il kernel di destinazione è più recente)", + "intro": "Quando il kernel di destinazione è più recente di quello del backup, il controllo di compatibilità aggiunge percorsi critici di avvio 16 da hb_unsafe_paths_cross_version a RS_SKIP_PATHS. Questi percorsi sono esclusi dal ripristino perché la scrittura di una versione di loro da un kernel più vecchio su un obiettivo che esegue un nuovo ha causato il panico del kernel nei test di panca. I percorsi coprono cinque categorie:", + "categoryRows": [ + { + "category": "Caricatore di avvio", + "paths": "/etc/default/grub, /etc/kernel", + "reason": "GRUB default legati all'ordine del kernel precedente e allo stato proxmox-boot-tool (cmdline, UUID ESP, ganci) che richiama i percorsi e gli identificatori dall'installazione precedente." + }, + { + "category": "Moduli del kernel e artefatti del boot", + "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", + "reason": "Le liste di carico automatico che possono riferire i moduli rinominati tra le major del kernel, le opzioni del modulo che potrebbero non essere applicate, initramfs hooks scritto per il kernel più vecchio." + }, + { + "category": "Identità dello stack di stoccaggio e del filesystem", + "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", + "reason": "UUID che potrebbero non esistere su questa installazione, driver multipath che cambiano tra i kernel, iSCSI parametri che si evolvono, regole udev che possono legare a sottosistemi non esistenti, ZFS Stato (zpool.cache + hostid) che può bloccare pool come straniero." + }, + { + "category": "Fonti APT", + "paths": "/etc/apt", + "reason": "Le suite sorgente APT possono attivare un downgrade di pacchetti critici sul prossimo aggiornamento." + }, + { + "category": "systemd", + "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", + "reason": "Override delle unità e collegamenti .wants legati alla precedente versione principale di systemd; chiavi di configurazione che potrebbero non essere valide in una versione più recente." + } + ], + "outroBody": "Il filtro viene eseguito PRIMA della finestra di dialogo di conferma in modo che l'utente veda l'elenco esatto dei percorsi che verranno saltati, categorizzati per ragione. Il ripristino continua — tutto il resto (configurazione VM/LXC, rete, /etc/pve, utenti, cron, stato ProxMenux, pacchetti, driver, /root) viene ripristinato normalmente." + }, + "hydration": { + "heading": "Idratazione Kernel-agnostic", + "intro": "Il filtro omette file critici; l’idratazione riapplica impostazioni selezionate: cmdline IOMMU, ID VFIO, GRUB_TIMEOUT personalizzato e blacklist nvidia. Si esegue se il kernel di destinazione è più recente. La fusione cmdline conserva le chiavi di destinazione e i moduli mancanti vengono aggiunti. Valori GRUB e file consentiti possono sostituire contenuti diversi sul target. Ripetere gli stessi input è idempotente.", + "phaseRows": [ + { + "phase": "1a — Via GRUB", + "detail": "Per host GRUB (installazioni ext4/lvm). _rs_hyd_grub unisce i parametri di manifest.kernel_params.cmdline_extra del backup in GRUB_CMDLINE_LINUX_DEFAULT del target, saltando le chiavi già presenti. Ripristina poi le chiavi consentite GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) da /etc/default/grub del backup se i valori differiscono dal target." + }, + { + "phase": "1b — systemd-boot / ZFS", + "detail": "Per systemd-boot (tipicamente ZFS alla radice). _rs_hyd_kernel_cmdline unisce i parametri utente di cmdline_extra in /etc/kernel/cmdline del target, mantenendo intatti i parametri di avvio root=, boot= e rootflags= del target." + }, + { + "phase": "2 — fusione /etc/modules", + "detail": "_rs_hyd_modules aggiunge moduli da manifest.kernel_params.modules_loaded_at_boot che sono nella lista bianca (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) E non già presente nell'obiettivo /etc/modules." + }, + { + "phase": "3 — Copia di file whitelist", + "detail": "_rs_hyd_files copia i file scritti dall’utente dai rootf di staging al target live quando il contenuto differisce. La whitelist copre i file VFIO/nvidia/blacklist sotto le regole /etc/modprobe.d, /etc/modules-load.d, e la regola di legatura ProxMenux VFIO + le regole nvidia udev sotto le regole /etc/udev/rules.d. I file distribuiti (pve-blacklist.conf, mdadm.conf, nvme.conf) sono intenzionalmente esclusi: i loro contenuti si evolvono tra le versioni." + }, + { + "phase": "4 — Forza rigenerazione dopo l’avvio", + "detail": "Le quattro fasi scrivono direttamente sul target attivo AL DI FUORI DEL il normale processo di ripristino. Per rendere i gettoni/moduli/file fusi effetto sul prossimo avvio, HB_HYDRATION_APPLIED=1 si propaga attraverso plan.env a apply_pending_restore.sh, che forza NEEDS_INITRAMFS=1 e NEEDS_GRUB=1 indipendentemente da quello che era nell'elenco di applicazione. Il dispatcher post-avvio poi rigenera initramfs e rinfresca il bootloader." + } + ] + }, + "planCommit": { + "heading": "Plan vs commit — l'utente vede prima un'anteprima", + "body": "L'idratazione scorre in due modi. Prima della finestra di dialogo di conferma, ProxMenux funziona _rs_apply_bk_older_hydration in modalità plan: calcola esattamente ciò che sarebbe stato unito, popola RS_HYDRATION_SUMMARY con un blocco verde che elenca ogni azione, e restituisce senza scrivere. La finestra di dialogo di conferma mostra che il blocco verde accanto all'elenco arancione dei percorsi esclusi, così l'utente vede IN ANTICIPO ciò che verrà riapplicato automaticamente. Dopo la conferma dell'utente, ProxMenux replica lo stesso helper in modalità commit — stesse fasi, stessa logica, ma questa volta ogni fase scrive al target live. Cancellare la finestra di dialogo di conferma lascia il bersaglio intatto." + }, + "flowDiagram": { + "heading": "Il flusso quando il kernel di destinazione è più recente di quello del backup", + "intro": "I passaggi aggiunti quando il kernel di destinazione è più recente siedono all'interno del normale flusso di ripristino. Tutto il resto — caldo applicare, in attesa di preparare, pacchetto di installazione, post-boot speditore — funziona identicamente a un ripristino dello stesso-kernel.", + "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": "Esempi concreti", + "intro": "Il passaggio di idratazione non è astratto — produce risultati osservabili, corretti per scenari comuni. Due esempi che l'idratazione gestisce automaticamente:", + "rows": [ + { + "scenario": "GPU passante (VFIO)", + "detail": "Fonte aveva intel_iommu=on iommu=pt nel cmdline, vfio/vfio_pci/vfio_iommu_type1 in /etc/modules, un /etc/modprobe.d/vfio.conf con options vfio-pci ids=10de:2216, e un /etc/modprobe.d/blacklist-nvidia.conf. L'idratazione fonde i token cmdline nel GRUB o nella cmdline del kernel, aggiunge i moduli vfio a /etc/modules e copia i due file modprobe scritti dall’utente. Sul prossimo avvio, IOMMU è attivo, modulo VFIO carico, il GPU è legato a vfio-pci e il VM viene fornito con il funzionamento passante." + }, + { + "scenario": "Predefinizioni personalizzate GRUB", + "detail": "Fonte aveva GRUB_TIMEOUT=1 e GRUB_DISABLE_OS_PROBER=true. Hydration legge entrambe le chiavi del backup /etc/default/grub, vede che differiscono dalle impostazioni di installazione fresche, e riscrive quelle due linee nel file del bersaglio (lasciando tutto il resto, incluso GRUB_DISTRIBUTOR, intatto)." + } + ] + }, + "callout": { + "warningTitle": "Ciò che l'idratazione non riapplica quando il kernel di destinazione è più recente", + "warningBody": "L'idratazione si applica solo alla configurazione ProxMenux sa essere sicura nelle versioni del kernel: IOMMU tokens, VFIO IDs, whitelist GRUB chiavi, e moduli da un elenco fisso (vfio*, nvidia*, i915, xe, kvm*). Qualsiasi cosa al di fuori di quel set — initramfs personalizzato ganci sotto /etc/initramfs-tools/hooks/, file non whitelist sotto /etc/modprobe.d/, override unità systemd scritte dall’utente — rimane esclusa. Il motivo è concreto: questi file possono chiamare interfacce kernel-internal (module APIs, /sys layout, udev hooks) che cambiano tra le principali versioni, e applicandoli verbatim sopra il kernel più recente può impedire al bersaglio di avviare. Quando è richiesta la riproduzione esatta della catena di avvio, il ripristino deve essere eseguito su un host con la stessa versione del kernel principale del backup." + }, + "codeReference": { + "heading": "Dove vivono i meccanismi", + "intro": "Per gli sviluppatori che cercano di tracciare o estendere il comportamento cross-kernel:", + "rows": [ + { + "component": "Rilevamento della direzione", + "location": "hb_compat_check in lib_host_backup_common.sh. Imposta HB_COMPAT_KERNEL_DIRECTION." + }, + { + "component": "Elenco dei percorsi Safe-subset", + "location": "hb_unsafe_paths_cross_version in lib_host_backup_common.sh. Emette linee path\\treason utilizzate sia dal filtro CLI che dal endpoint Web /api/host-backups/restore/prepare." + }, + { + "component": "Fasi di idratazione", + "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files in backup_host.sh. Orchestrata da _rs_apply_bk_older_hydration." + }, + { + "component": "Rigenerazione forzata dopo l’avvio", + "location": "apply_pending_restore.sh legge HB_HYDRATION_APPLIED da plan.env e forza NEEDS_INITRAMFS=1/NEEDS_GRUB=1." + }, + { + "component": "Anteprima web", + "location": "/api/host-backups/restore/prepare in flask_server.py. Carica la libreria helper, esegue _rs_apply_bk_older_hydration in modalità piano, restituisce le azioni al Web modal." + } + ] + }, + "whereNext": { + "heading": "Dove andare dopo", + "items": [ + { + "label": "Ripristino", + "href": "/docs/backup-restore/restoring", + "tail": " — il processo completo di ripristino che integra i meccanismi di questa pagina." + }, + { + "label": "Come funziona", + "href": "/docs/backup-restore/how-it-works", + "tail": " — manifesto e raccoglitori che producono il blocco kernel_params letto dall’idratazione." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/destinations/borg.json b/web/messages/it/docs/backup-restore/destinations/borg.json new file mode 100644 index 00000000..fe33bf03 --- /dev/null +++ b/web/messages/it/docs/backup-restore/destinations/borg.json @@ -0,0 +1,234 @@ +{ + "meta": { + "title": "Destinazione Borg — tipi di repository, autenticazione SSH, crittografia | ProxMenux", + "description": "La destinazione Borg salva i backup host ProxMenux in un repository locale, su un disco esterno montato o su un server remoto via SSH. Descrive la ricerca dell’eseguibile borg, le quattro opzioni iniziali per le chiavi SSH, la crittografia repokey, le destinazioni salvate e la conservazione per attività pianificata.", + "ogTitle": "ProxMenux Backup — Destinazione Borg", + "ogDescription": "Come ProxMenux salva i backup host nei repository Borg con autenticazione SSH e crittografia repokey.", + "twitterTitle": "Destinazione di backup Borg | ProxMenux", + "twitterDescription": "Repository Borg locali, su USB e accessibili via SSH per i backup host." + }, + "header": { + "title": "Borg", + "description": "La destinazione Borg scrive i backup host a un repository Borg. Sono supportati tre tipi di repository: percorso filesystem locale, disco esterno montato o server remoto tramite SSH. Deduplicazione a livello di Chunk in tutti gli archivi del repository e crittografia repokey opzionale.", + "section": "Backup e ripristino" + }, + "aboutBorg": { + "heading": "Quello che Borg è", + "body": "Borg (anche scritto BorgBackup) è uno strumento di backup deduplicante open source mantenuto dalla comunità di Borg Backup. Memorizza ogni archivio come un insieme di blocchi di lunghezza variabile all'interno di un repository; i pezzi sono condivisi in archivi in modo da ri-back up dati invariati ha un costo di archiviazione quasi zero. Borg non è legato a Proxmox — è uno strumento di backup generale utilizzato in molti ambienti. ProxMenux lo utilizza come una delle tre destinazioni per i backup host; ogni meccanismo specifico Borg descritto in questa pagina (tipo di repository, borg-serve su SSH, crittografia di repokey, prune) è il comportamento standard Borg." + }, + "intro": { + "title": "Deduplicazione per blocchi con repository locali o accessibili via SSH", + "body": "Un repository Borg conserva blocchi condivisi tra tutti i suoi archivi: ripetere il backup di un file invariato non trasferisce né memorizza nuovi dati. ProxMenux usa borg create per il backup e borg extract per il ripristino. Il repository può trovarsi sullo stesso filesystem dell’origine, su un disco esterno montato o su un host remoto accessibile via SSH." + }, + "binarySourcing": { + "heading": "Il binario di borg", + "intro": "Borg non è una dipendenza di base dell'installatore ProxMenux. Quando un backup viene eseguito, hb_ensure_borg risolve il binario da quattro fonti in ordine e restituisce il primo che funziona:", + "rows": [ + { + "priority": "1", + "source": "Sistema borg", + "detail": "Se l'host ha già installato borg tramite APT (which borg risolve), questo binario viene utilizzato." + }, + { + "priority": "2", + "source": "cache di stato", + "detail": "/usr/local/share/proxmenux/borg — tenuto da un precedente download GitHub su questo host." + }, + { + "priority": "3", + "source": "Pacchetto AppImage del Monitor", + "detail": "/usr/local/share/proxmenux/monitor-app/usr/bin/borg — il AppImage fa un borg-linux64 firmato. Questo è il percorso offline: un host senza internet ha ancora un borg funzionante." + }, + { + "priority": "4", + "source": "Scarica GitHub", + "detail": "wget contro l'URL pinned borg-linux64 sotto github.com/borgbackup/borg/releases/, verificatosi contro una costante SHA-256 in lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). Su checksum sbagliato il binario viene scartato e il backup si interrompe. Il file scaricato viene memorizzato nella cache dello stato, quindi i backup successivi utilizzano il percorso 2." + } + ] + }, + "repoTypes": { + "heading": "Tipi di repository", + "intro": "Il tipo di repository viene scelto quando viene aggiunto un obiettivo. Ogni tipo si risolve in un altro URL di repository che Borg capisce.", + "rows": [ + { + "type": "remote", + "url": "ssh://USER@HOST/RPATH", + "detail": "Repository vive su un server remoto che esegue borg serve. Richiede una connessione SSH a quel server." + }, + { + "type": "usb", + "url": "/mnt/MOUNTPOINT/borgbackup", + "detail": "Il repository vive su un disco esterno montato (tipicamente USB). Il montaggio viene risolto tramite hb_prompt_mounted_path, che rileva, monta o formatta le partizioni USB come necessario." + }, + { + "type": "local", + "url": "/backup/borgbackup (any absolute path)", + "detail": "Repository vive su una directory locale. Significativo solo quando la directory di destinazione è su un disco fisico separato — un repository sullo stesso disco della fonte protegge dall'errore dell'operatore, ma non dall'errore del disco." + } + ] + }, + "serverSetup": { + "heading": "Preparazione del server Borg (lato server)", + "intro": "Il tipo di repository remote richiede un server Borg funzionante e accessibile via SSH. ProxMenux non configura il server: autorizza soltanto una chiave per un account esistente. Questa sezione descrive i requisiti del server prima della connessione.", + "hostChoicesTitle": "Dove il server può vivere", + "hostChoicesBody": "Qualsiasi host Linux con accesso SSH si qualifica. Configurazioni comuni:", + "hostChoicesItems": [ + "Un NAS dedicato o una scatola di backup (Debian, Ubuntu, TrueNAS SCALE con una shell).", + "Un contenitore LXC all'interno di un nodo Proxmox. Piccola impronta, isolata dall'host che esegue i backup.", + "Un altro host Proxmox sulla stessa LAN, o un VM ovunque raggiungibile tramite SSH." + ], + "lxcWarningTitle": "LXC come server Borg", + "lxcWarningBody": "Se il server Borg è in un LXC, generate-auto richiede un account che accetti l’autenticazione SSH con password per installare la chiave. In alternativa, usa l’installazione manuale o generate-pct tramite l’host PVE.", + "requirementsTitle": "Requisiti sul server", + "requirementsRows": [ + { + "requirement": "Eseguibile borg in /usr/bin/borg", + "detail": "La riga command=\"/usr/bin/borg serve ...\" scritta da ProxMenux in authorized_keys usa questo percorso fisso. APT (apt install borgbackup) installa lì l’eseguibile. Per un binario autonomo occorre un collegamento simbolico in /usr/bin/borg." + }, + { + "requirement": "Un account utente dedicato (tipicamente borg)", + "detail": "Possiede la directory del repository e riceve connessioni SSH in arrivo. Non ha bisogno di sudo o di accesso alla shell — la linea authorized_keys disabilita comunque le shell interattive." + }, + { + "requirement": "Una directory di repository writable", + "detail": "Il percorso che l'operatore dà a ProxMenux (ad esempio /backup/borgbackup) deve esistere sul server ed essere di proprietà dell'utente borg." + }, + { + "requirement": "SSH daemon accetta l'utente borg", + "detail": "PubkeyAuthentication yes (default). L'autenticazione della password è necessaria solo per il flusso generate-auto di un colpo — dopo l'installazione della chiave, il server può disabilitare completamente la password." + } + ], + "minimalSetupTitle": "Configurazione server Minimal", + "minimalSetupBody": "Su un server Debian o Ubuntu Borg, una linea base di lavoro è quattro comandi come root:", + "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", + "minimalSetupNote": "Con il server pronto e l’autenticazione SSH con password disponibile, generate-auto installa la chiave tramite un account che possa scrivere in authorized_keys dell’utente borg. I backup successivi usano questa chiave, limitata a borg serve sul percorso configurato. Senza accesso con password, installala manualmente o tramite l’host PVE." + }, + "sshAuth": { + "heading": "Autenticazione SSH (lato cliente)", + "intro": "I repository Borg remoti sono accessibili su SSH. La connessione viene eseguita dall'host ProxMenux a un account utente sul server Borg che esegue borg serve. Questo utente è tipicamente chiamato borg, NON l'utente admin/root del server — la linea di comando borg-serve blocca la connessione a quel percorso di repository specifico (vedere le strategie chiave qui sotto).", + "strategiesTitle": "Strategie per le chiavi SSH", + "strategiesIntro": "Aggiungendo una destinazione remota, ProxMenux chiede utente SSH, host e percorso remoto, poi offre quattro opzioni di autenticazione. Se l’accesso con password viene rifiutato, propone anche generate-pct. Le modalità sono descritte di seguito:", + "strategyRows": [ + { + "mode": "generate-auto", + "label": "Consigliato", + "detail": "ProxMenux genera o riutilizza una coppia di chiavi ed25519 in ~/.ssh/borg_proxmenux_HOST_ed25519, poi usa sshpass per verificare l’accesso e installare la chiave pubblica in ~borg/.ssh/authorized_keys. La password appartiene a un account che possa scrivere il file, solitamente root o borg. Serve durante la configurazione e non viene salvata." + }, + { + "mode": "generate-manual", + "label": "Nessuna password di amministratore su questo host", + "detail": "ProxMenux genera il keypair come sopra ma visualizza la linea completa authorized_keys per l'operatore di incollare manualmente nel server. La password di amministratore non lascia mai l'host ProxMenux perché non viene mai chiesto." + }, + { + "mode": "generate-pct", + "label": "Il server Borg è un PVE LXC", + "detail": "Il server Borg viene eseguito all'interno di un LXC su un nodo PVE. ProxMenux autorizza la chiave tramite pct exec dall'host PVE — root sull'host PVE scrive nel LXC ~borg/.ssh/authorized_keys senza bisogno di SSH nel LXC stesso." + }, + { + "mode": "existing", + "label": "Utilizzare una chiave esistente", + "detail": "ProxMenux scansiona /root/.ssh/ e $HOME/.ssh/ per le chiavi private parseable ed25519/RSA e le elenca. L'operatore sceglie uno o naviga manualmente su un percorso non standard." + }, + { + "mode": "none", + "label": "Configurazione predefinita SSH", + "detail": "Nessuna chiave personalizzata — Borg si basa sulla configurazione predefinita SSH dell'host (tipicamente ~/.ssh/id_rsa o un agente SSH)." + } + ], + "restrictTitle": "La linea authorized_keys", + "restrictBody": "Per ogni chiave generata, la riga authorized_keys scritta da ProxMenux sul server limita la chiave a questa invocazione di borg-serve sul percorso configurato del repository:", + "restrictLine": "command=\"/usr/bin/borg serve --restrict-to-path RPATH\",restrict PUBKEY", + "restrictNote": "Il command= costringe ogni sessione SSH utilizzando questa chiave per eseguire solo il comando borg-serve; restrict disabilita l'inoltro della porta, l'inoltro dell'agente, l'inoltro di X11 e l'allocazione di PTY. La chiave non può essere utilizzata per aprire una shell interattiva sul server o per accedere a qualsiasi altro percorso di repository, anche se l'account ha privilegi più ampi." + }, + "savedTargets": { + "heading": "Obiettivi salvati", + "intro": "Una destinazione salvata conserva la configurazione del repository con un nome riconoscibile, evitando di reinserire i dati. File nella directory di stato di ProxMenux:", + "rows": [ + { + "file": "borg-targets.txt", + "content": "Una riga per destinazione: NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE. hb_collect_borg_configs la legge per compilare il menu di selezione delle destinazioni." + }, + { + "file": "borg-pass-NAME.txt", + "content": "Passphrase della destinazione indicata sopra come NAME (chmod 600). Presente soltanto se è stata scelta la crittografia repokey." + } + ], + "outro": "Salvare la destinazione è facoltativo. Rifiutando non si salva la configurazione con nome, ma una chiave SSH generata non viene eliminata. Se si attiva repokey senza salvare la destinazione, ProxMenux conserva comunque la passphrase nel file preesistente borg-pass.txt." + }, + "encryption": { + "heading": "Crittografia", + "body": "I repository sono inizializzati con una modalità di crittografia tramite hb_borg_init_if_needed: il moderno borg repo-create -e MODE quando disponibile, o il borg init --encryption=MODE legacy. ProxMenux espone due modalità: repokey (default) e none. In modalità repokey Borg memorizza la chiave di cifratura all'interno del repository stesso; l'accesso richiede una passphrase, che ProxMenux richiede due volte con verifica della corrispondenza e salva in borg-pass-NAME.txt per le destinazioni salvate, altrimenti nel file precedente descritto sopra. Una finestra di dialogo di riconoscimento obbligatoria viene mostrata dopo che il passphrase viene salvato: il passphrase è l'unico modo per accedere agli archivi crittografati, e perderlo rende ogni archivio nel repository non recuperabile." + }, + "runtimeEnv": { + "heading": "Ambiente runtime", + "intro": "ProxMenux esporta le seguenti variabili ambientali prima di invocare borg. Configurano la connessione e sbloccano il repository senza inserire segreti nella riga di comando.", + "rows": [ + { + "var": "BORG_RSH", + "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", + "purpose": "Comando remoto usato da Borg per i repository SSH. Una chiave selezionata aggiunge le opzioni di identità; una porta non standard aggiunge -p PORT. Senza chiave personalizzata e con la porta predefinita, la variabile resta non impostata e Borg usa la configurazione SSH dell’host." + }, + { + "var": "BORG_PASSPHRASE", + "value": "(passphrase da borg-pass-NAME.txt)", + "purpose": "Sblocca il repokey. Impostare solo quando il target utilizza la crittografia repokey. Non compare mai nell'elenco degli argomenti di processo." + }, + { + "var": "BORG_ENCRYPT_MODE", + "value": "repokey | none", + "purpose": "Utilizzato da hb_borg_init_if_needed quando inizializza un repository che non esiste ancora. Ignorato da borg create su repository esistenti." + }, + { + "var": "BORG_RELOCATED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Supprime il prompt interattivo Borg solleva quando l'URL del repository differisce dall'URL che originariamente è stato raggiunto da (comune dopo un rinominamento del punto di montaggio o SSH-host raggiungibile tramite nuovo indirizzo)." + }, + { + "var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Suppresse il prompt interattivo Borg solleva la prima volta che un repository non crittografato è accessibile da un nuovo client." + } + ] + }, + "archiveFormat": { + "heading": "Archivio denominazione e ritenzione", + "intro": "Ogni backup crea un nuovo archivio all'interno del repository.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS", + "retentionBody": "Per i lavori programmati, run_scheduled_backup.sh esegue borg prune contro il repository dopo ogni backup di successo con i valori di ritenzione configurati sul lavoro (--keep-last, --keep-daily, --keep-weekly). I backup interattivi non eliminano le vecchie copie." + }, + "restoreAccess": { + "heading": "Recuperare sul lato del ripristino", + "body": "Il flusso di ripristino elenca gli archivi con borg list REPO ed estrae quello selezionato con borg extract REPO::ARCHIVE-NAME in una directory di staging che _rs_check_layout si alimenta alla pipeline di ripristino standard. Per il recupero manuale al di fuori di ProxMenux gli stessi comandi funzionano; l'albero estratto è il layout standard a tre payload descritto in Come funziona ." + }, + "references": { + "heading": "Referenze", + "intro": "Documentazione ufficiale di Borg per i componenti usati da ProxMenux.", + "items": [ + { + "label": "Documentazione del Borg", + "href": "https://borgbackup.readthedocs.io/", + "tail": "— punto di ingresso principale che copre concetti, distribuzione, avvio rapido e ogni comando." + }, + { + "label": "borg create", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/create.html", + "tail": " — il comando usato da ProxMenux per ogni backup, con tutte le opzioni supportate." + }, + { + "label": "Crittografia del repository", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/init.html#encryption-mode", + "tail": "— le modalità di crittografia Borg supporta, incluso il repokey che ProxMenux utilizza per impostazione predefinita." + }, + { + "label": "borg serve e configurazione tramite SSH", + "href": "https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html", + "tail": " — configurazione di un server Borg centrale accessibile via SSH, con il comando borg-serve e l’opzione restrict-to-path che ProxMenux scrive in authorized_keys." + }, + { + "label": "borg prune", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/prune.html", + "tail": " — il modello di conservazione di --keep-last / --keep-daily / --keep-weekly che ProxMenux applica a ogni attività pianificata." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/destinations/index.json b/web/messages/it/docs/backup-restore/destinations/index.json new file mode 100644 index 00000000..3e80c055 --- /dev/null +++ b/web/messages/it/docs/backup-restore/destinations/index.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Destinazioni di backup — Locale, Proxmox Backup Server, Borg | ProxMenux", + "description": "Tre backend di storage ricevono lo stesso payload di backup ProxMenux: un archivio locale .tar.zst su qualsiasi filesystem scrivibile, un backup PBS in un datastore Proxmox Backup Server o un archivio Borg in un repository Borg locale o remoto. Ogni backend ha le proprie caratteristiche di compressione, deduplicazione, crittografia e rete.", + "ogTitle": "Destinazioni di backup ProxMenux", + "ogDescription": "Locale, Proxmox Backup Server e Borg — tre backend di archiviazione per lo stesso carico di backup host.", + "twitterTitle": "Destinazioni di backup ProxMenux | ProxMenux", + "twitterDescription": "Archivio locale, backend Proxmox Backup Server e Borg per i backup host." + }, + "header": { + "title": "Destinazioni", + "description": "Tre backend di storage supportati da ProxMenux Backup: archivio locale, Proxmox Backup Server (consigliato) e Borg. Ognuno riceve lo stesso archivio con tre blocchi di dati; differiscono in formato di archiviazione, deduplicazione, modello di crittografia e requisiti di rete.", + "section": "Backup e ripristino" + }, + "intro": { + "title": "Stesso contenuto, tre backend", + "body": "Ogni backup produce gli stessi tre payload (rootfs, manifest, applicazioni). Ciò che cambia tra le destinazioni è il modo in cui questi carichi sono memorizzati e come l'operatore li recupera per un ripristino. Ogni backend viene implementato come funzione separata in backup_host.sh — _bk_local, _bk_pbs, _bk_borg — ma tutti e tre condividono lo stesso passo di staging (hb_prepare_staging) e lo stesso percorso del codice di ripristino. La scelta della destinazione colpisce solo la scrittura e il recupero; non cambia ciò che un ripristino fa o come consuma l'archivio." + }, + "comparison": { + "heading": "Confronto delle caratteristiche", + "intro": "La tabella seguente elenca le differenze concrete tra i tre backend come si comportano oggi in ProxMenux. Tutti i valori descrivono il comportamento osservato del backend stesso, non raccomandazioni editoriali.", + "rows": [ + { + "feature": "Formato di archiviazione", + "local": "File .tar.zst singolo (o .tar.gz se zstd è assente).", + "pbs": "Backup PBS (blocchi .pxar nel datastore).", + "borg": "Archivio Borg all'interno di un repository Borg (file di segmento)." + }, + { + "feature": "Compressione", + "local": "zstd (livello predefinito) tramite tar --zstd. gzip fallback.", + "pbs": "Gestita da proxmox-backup-client. ProxMenux non modifica le impostazioni di compressione.", + "borg": "Compressione integrata di Borg. ProxMenux richiama borg create senza modificare le impostazioni di compressione." + }, + { + "feature": "Deduplicazione", + "local": "Nessuno. Ogni backup è un archivio completamente indipendente.", + "pbs": "Deduplicazione completa a livello di blocchi tra tutti i backup nel datastore.", + "borg": "Deduplicazione completa a livello di blocchi tra tutti gli archivi del repository." + }, + { + "feature": "Crittografia a riposo", + "local": "Nessuno (si basa sulla protezione a livello di filesystem).", + "pbs": "Crittografia opzionale lato client mediante un file di chiave. Se abilitata, il blob di recupero viene caricato in un gruppo di backup separato.", + "borg": "Crittografia repokey opzionale (chiave memorizzata nel repo, sbloccata da una passphrase)." + }, + { + "feature": "Conservazione / eliminazione delle vecchie copie", + "local": "Applicata a ogni attività pianificata tramite KEEP_LAST. I vecchi archivi vengono eliminati insieme ai file ausiliari e ai log di esecuzione. I backup interattivi non eliminano le vecchie copie.", + "pbs": "Applicato per lavoro programmato tramite proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly. I backup interattivi non eliminano le vecchie copie.", + "borg": "Applicato per lavoro programmato tramite borg prune --keep-last / --keep-daily / --keep-weekly. I backup interattivi non eliminano le vecchie copie." + }, + { + "feature": "Rete", + "local": "Nessuno. Scrive a un punto di montaggio locale (tipicamente un disco interno o un'unità USB).", + "pbs": "TCP al server PBS (porta di default 8007). Richiede credenziali PBS + impronta digitale.", + "borg": "percorso filesystem locale o tunnel SSH a un host Borg remoto." + }, + { + "feature": "Dipendenze", + "local": "tar, zstd (presente su Proxmox per impostazione predefinita).", + "pbs": "Pacchetto proxmox-backup-client (incluso in Proxmox VE 8+).", + "borg": "binario borg. Auto-provisionato da ProxMenux dal pacchetto Monitor AppImage quando manca." + }, + { + "feature": "Accesso per il ripristino", + "local": "Qualsiasi host con tar+zstd può estrarre l'archivio. Non è necessario PBS/Borg.", + "pbs": "Richiede proxmox-backup-client, le credenziali PBS e il file di chiave (se il backup è crittografato).", + "borg": "Richiede borg + il percorso del repository + la passphrase (se crittografato)." + } + ], + "captionCode": "feature", + "captionLocal": "Locale", + "captionPbs": "Proxmox Backup Server (consigliato)", + "captionBorg": "Borg" + }, + "sameArchive": { + "heading": "Il layout dell'archivio non cambia con la destinazione", + "body": "All'interno di una delle tre destinazioni, lo stesso layout rootfs/ + metadata/ + manifest.json descritto in Come funziona è presente. Un .tar.zst estratto da un archivio locale, un .pxar restaurato da PBS, e un archivio Borg estratto con borg extract producono tutti un albero di directory identico. Il percorso del codice di ripristino (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) legge gli stessi tre blocchi di dati senza sapere da quale destinazione provenivano." + }, + "extractStandalone": { + "heading": "Estrazione di un backup al di fuori di ProxMenux", + "intro": "Tutti i tre formati di archivio possono essere letti con strumenti standard senza ProxMenux installati sull'host di lettura. I comandi sottostanti producono lo stesso albero di directory che un ripristino consuma internamente.", + "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": "# Da un archivio Borg (richiede borg e la passphrase per i repository crittografati):\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# Su un repository remoto accessibile via SSH:\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME", + "note": "L'albero estratto può quindi essere ispezionato manualmente o alimentato a un ripristino manuale. Vedere le singole pagine di destinazione per l'esatto flusso di recupero ProxMenux utilizza sotto il cofano." + }, + "whereNext": { + "heading": "Dettagli per destinazione", + "intro": "Ogni destinazione ha una propria pagina che copre il flusso di configurazione, il formato on-disk e il comando di recupero utilizzato dal ripristino.", + "items": [ + { + "label": "Archivio locale", + "href": "/docs/backup-restore/destinations/local", + "tail": "— preconfigurazione di un target locale, montaggio dell'unità USB, controllo di sicurezza contro la scrittura dell'archivio in sé, la sidecar JSON che consente al Monitor di identificare il file." + }, + { + "label": "Proxmox Backup Server (consigliato)", + "href": "/docs/backup-restore/destinations/pbs", + "tail": "— selezione di datastore, credenziali e impronte digitali, ciclo di vita del keyfile di crittografia, passphrase di recupero, caricando il blob di recupero a PBS per il recupero di installazione fresca." + }, + { + "label": "Borg", + "href": "/docs/backup-restore/destinations/borg", + "tail": " — repository locali o accessibili via SSH, provenienza del binario Borg (sistema / cache / pacchetto AppImage di Monitor / download GitHub), inizializzazione del repository, gestione delle passphrase e configurazione delle chiavi SSH per i repository remoti." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/destinations/local.json b/web/messages/it/docs/backup-restore/destinations/local.json new file mode 100644 index 00000000..0bf1d672 --- /dev/null +++ b/web/messages/it/docs/backup-restore/destinations/local.json @@ -0,0 +1,75 @@ +{ + "meta": { + "title": "Destinazione dell'archivio locale — tar.zst su un filesystem o unità USB | ProxMenux", + "description": "La destinazione di backup locale scrive un singolo archivio .tar.zst a qualsiasi directory scrivibile: un disco interno, un punto di montaggio Proxmox, una condivisione NFS o un'unità USB. Documenta il flusso di configurazione, la logica di rilevamento e montaggio USB, il controllo di sicurezza contro la scrittura dell'archivio in un percorso incluso nel backup, e il file ausiliario JSON che identifica il file.", + "ogTitle": "ProxMenux Backup — Destinazione dell'archivio locale", + "ogDescription": "Come ProxMenux scrive i backup locali come archivi .tar.zst e come configurare la directory di destinazione o unità USB.", + "twitterTitle": "Destinazione di backup locale | ProxMenux", + "twitterDescription": "Come ProxMenux scrive i backup locali come archivi .tar.zst su un filesystem o unità USB." + }, + "header": { + "title": "Archivio locale", + "description": "La destinazione locale scrive un unico archivio tar compresso in una directory scrivibile sull’host: su un disco interno, un filesystem NFS o SMB montato oppure un’unità USB.", + "section": "Backup e ripristino" + }, + "intro": { + "title": "Un file, autocontenuto", + "body": "Un backup locale produce un singolo file hostcfg-HOST-TIMESTAMP.tar.zst (o .tar.gz quando zstd è assente). Il file contiene l'intero albero di archivio — manifest.json, metadata/ e rootfs/ — e può essere ripristinato su qualsiasi host Proxmox con il flusso di ripristino ProxMenux o estratto manualmente con tar --zstd -xf su qualsiasi sistema Linux. Nessun server, nessuna inizializzazione del repository, nessuna dipendenza esterna. Questa è la destinazione con il percorso di recupero più breve quando non è disponibile né PBS né Borg." + }, + "targetConfig": { + "heading": "Configurazione della directory target", + "intro": "La destinazione locale è una unica directory di destinazione salvata in modo persistente — non un elenco. ProxMenux memorizza la scelta dell'operatore su /usr/local/share/proxmenux/local-target.conf e la legge su ogni backup. Quando non è stato configurato alcun obiettivo, viene utilizzato il HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump predefinito (la stessa directory Proxmox utilizza per le proprie uscite vzdump). L'obiettivo è configurato da Configura destinazioni di backup → Destinazioni locali:", + "options": [ + "Utilizzo predefinito (/var/lib/vz/dump). Lo storage locale Proxmox. Presente su ogni installazione Proxmox; l'archivio si trova accanto alle uscite vzdump e viene ritirato dalla scheda Monitor Backups automaticamente.", + "Inserisci un percorso personalizzato. Puoi usare qualsiasi percorso assoluto del filesystem: un montaggio NFS, una condivisione SMB montata tramite fstab, un dataset ZFS dedicato o un secondo disco interno. Prima di salvarlo, ProxMenux verifica che il percorso esista e sia una directory.", + "Scegli un’unità USB. Apre il sottomenu USB (sotto), che rileva dispositivi rimovibili e offre di montare o formattarne uno." + ] + }, + "usbFlow": { + "heading": "Rilevamento dell'unità USB e montaggio", + "intro": "Il sottomenu USB elenca le partizioni su dispositivi rimovibili segnalate da lsblk. Ogni partizione è presentata con la sua dimensione, l'etichetta del filesystem e lo stato corrente. Lo stato determina l’azione proposta da ProxMenux.", + "statesTitle": "I tre stati del dispositivo", + "stateRows": [ + { + "state": "montato", + "shown": "Dimensione · etichetta · [fstype] · → /mount/point", + "action": "La partizione è già montata da qualche parte. La selezione salva il punto di montaggio corrente come obiettivo locale. Nessun montaggio viene eseguito." + }, + { + "state": "non montato", + "shown": "Dimensione · etichetta · [fstype] · (non montato — sarà montato)", + "action": "Un filesystem è presente ma non montato. A conferma, ProxMenux gestisce hb_mount_usb_partition: crea /mnt/backup-LABEL (o un percorso basato su UUID se non c'è etichetta), monta la partizione e persiste il punto di montaggio come obiettivo locale." + }, + { + "state": "vuoto", + "shown": "Dimensione · disco USB grezzo — nessun filesystem (verrà FORMATTATO)", + "action": "Il dispositivo non ha un filesystem. Questa operazione distruttiva è protetta da due conferme. Prima una finestra Sì/No spiega che il disco verrà cancellato. Poi una casella di input richiede di digitare il percorso esatto del dispositivo (ad esempio /dev/sdb) prima che ProxMenux crei una nuova tabella GPT con una partizione ext4 e la monti." + } + ], + "notMountedFallback": "Quando non viene rilevato alcun dispositivo USB, il submenu rientra in una semplice casella di input. L'operatore può immettere un percorso di mount point arbitrario; se il percorso non è un punto di montaggio registrato, una finestra di dialogo di conferma avvisa prima di procedere." + }, + "safetyCheck": { + "heading": "Controllo di sicurezza — destinazione all'interno di un percorso di backup", + "body": "Prima di scrivere l'archivio, _bk_local verifica che la directory di destinazione sia non un sottopercorso di qualsiasi directory di cui viene eseguito il backup. Un errore comune sarebbe aggiungere /root al profilo e scegliere /root/backups come destinazione: l'archivio quindi includerebbe se stesso, producendo un archivio corrotto o crescendo senza limiti finché il disco non si riempie. Il controllo risolve entrambi i percorsi con readlink -m, li confronta e, in caso di conflitto, interrompe il backup con una finestra di dialogo che nomina il percorso in conflitto ed elenca tre modi per risolverlo: scegliere una destinazione al di fuori del percorso in conflitto, rimuovere la voce personalizzata che contiene la destinazione o utilizzare la modalità personalizzata per deselezionare il percorso in conflitto per questa esecuzione." + }, + "archiveFormat": { + "heading": "Formato archivio e compressione", + "intro": "Il nome del file di output include il nome host di origine e la data e ora del backup, per consentire l’ordinamento cronologico delle varie copie nella directory e identificare ogni file.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS.tar.zst", + "compressionTitle": "Compressione", + "compressionBody": "Il metodo principale usa tar --zstd -cf: un singolo comando che comprime al livello predefinito di zstd. Se zstd non è presente sull’origine (raro su Proxmox, ma possibile nelle installazioni minime), ProxMenux ripiega su gzip. In questo caso, se pv è disponibile, viene aggiunta una barra di avanzamento per mostrare la crescita dell’archivio in tempo reale; senza pv, viene usato il semplice tar -czf senza output di avanzamento.", + "sourceTitle": "Cosa viene incluso nell’archivio", + "sourceBody": "Il comando tar viene richiamato con -C \"$staging_root\" . e archivia l’intera radice della directory temporanea: rootfs/, metadata/ e manifest.json. I tre blocchi di dati si trovano affiancati al livello superiore dell’archivio tar. L’estrazione produce esattamente lo stesso albero utilizzato dal codice di ripristino." + }, + "sidecar": { + "heading": "Il sidecar JSON", + "intro": "Ogni backup locale di successo produce un file compagno: HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, scritto accanto all'archivio da hb_write_archive_sidecar. Questo piccolo file JSON consente a ProxMenux Monitor di identificare l'archivio come ProxMenux backup host anche se in seguito viene spostato, rinominato o archiviato altrove.", + "contentTitle": "Contenuto del sidecar", + "contentBody": "Il sidecar memorizza la versione schema, se il backup proveniva da un run interattivo o da un lavoro programmato (kind), l'ID di lavoro per le esecuzioni pianificate, la modalità profilo utilizzata (default o custom), il nome host sorgente, il nome base originale dell'archivio, un timestamp di creazione ISO-8601 e la dimensione dell'archivio in byte.", + "whyBody": "La scheda Backups di Monitor cerca i file ausiliari *.proxmenux.json nelle directory locali configurate, non i file *.tar.zst, perché un .tar.zst senza file ausiliario potrebbe non essere un backup ProxMenux. La scansione è veloce (i file JSON sono piccoli) e l’associazione resta valida quando l’archivio viene rinominato, purché anche il file ausiliario venga rinominato di conseguenza." + }, + "restoreAccess": { + "heading": "Ripristino da un archivio locale", + "body": "Il flusso di ripristino ProxMenux scopre gli archivi locali scansionando l'obiettivo locale configurato per sidecars e visualizzandoli nell'elenco Archivi. Selezionando uno si attiva _rs_check_layout, che estrae il tarball in una directory di staging e conferma il layout a tre payload prima di procedere. Per estrazione manuale al di fuori di ProxMenux, tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg produce lo stesso albero che il codice di ripristino consuma." + } +} diff --git a/web/messages/it/docs/backup-restore/destinations/pbs.json b/web/messages/it/docs/backup-restore/destinations/pbs.json new file mode 100644 index 00000000..6cc1e51e --- /dev/null +++ b/web/messages/it/docs/backup-restore/destinations/pbs.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "destinazione Proxmox Backup Server — repository, crittografia, ripristino | ProxMenux", + "description": "La destinazione PBS salva i backup host di ProxMenux come backup PBS. Descrive il rilevamento dei repository da /etc/pve/storage.cfg, la configurazione manuale, il caricamento .pxar, la crittografia lato client con file di chiave e la sua copia di recupero facoltativa protetta da passphrase, e il recupero della chiave da più fonti su un host appena installato.", + "ogTitle": "ProxMenux Backup — destinazione Proxmox Backup Server", + "ogDescription": "Come ProxMenux scrive i backup host a Proxmox Backup Server con la crittografia del keyfile lato client e l'escrow di recupero.", + "twitterTitle": "Destinazione di backup PBS | ProxMenux", + "twitterDescription": "Destinazione Proxmox Backup Server con crittografia tramite file di chiave e copia di recupero protetta da passphrase." + }, + "header": { + "title": "Proxmox Backup Server", + "description": "La destinazione PBS carica l’intera directory di preparazione come un unico backup .pxar in un datastore Proxmox Backup Server, con crittografia facoltativa lato client tramite file di chiave. Facoltativamente, accanto a ogni backup viene caricata anche una copia della chiave protetta da passphrase per il recupero.", + "section": "Backup e ripristino" + }, + "recommendedBadge": "Destinazione consigliata", + "aboutPbs": { + "heading": "Ciò che Proxmox Backup Server è", + "body": "Proxmox Backup Server (PBS) è il prodotto server di backup di Proxmox, sviluppato e mantenuto dallo stesso team che gli autori Proxmox VE. È un server di backup dedicato progettato per ricevere i backup da host Proxmox VE (VMs, LXCs e - via proxmox-backup-client - directory host arbitrari) con deduplicazione basata su blocchi, crittografia lato client e politiche di conservazione applicate lato server. ProxMenux utilizza PBS come una delle tre destinazioni per i backup host; ogni meccanismo specifico PBS descritto in questa pagina (gruppi di backup, archivi .pxar, --backup-id, crittografia keyfile) è un comportamento standard PBS." + }, + "intro": { + "title": "Un backup per esecuzione, deduplicazione a livello di blocchi", + "body": "Un backup PBS crea una sola voce nel datastore, sotto l’ID host/hostcfg-HOSTNAME/BACKUP-TIME. I dati sono un archivio .pxar con la stessa struttura in tre blocchi descritta in Come funziona. PBS deduplica i blocchi tra tutti i backup del datastore: i backup successivi dello stesso host trasferiscono e memorizzano soltanto i blocchi modificati. Per le attività pianificate, ProxMenux applica direttamente la conservazione: dopo ogni esecuzione riuscita, run_scheduled_backup.sh esegue proxmox-backup-client prune con --keep-last / --keep-daily / --keep-weekly usando i valori configurati nell’attività." + }, + "repoSelection": { + "heading": "Selezione dei repository", + "intro": "ProxMenux scopre i repository PBS da due fonti su ogni backup. L'operatore sceglie uno da un menu unificato; la scelta determina HB_PBS_REPOSITORY, HB_PBS_SECRET e HB_PBS_FINGERPRINT per l'esecuzione.", + "sourceRows": [ + { + "source": "storage.cfg di Proxmox (rilevamento automatico)", + "path": "/etc/pve/storage.cfg + /etc/pve/priv/storage/NAME.pw", + "content": "Ogni strofa pbs: nella configurazione di storage di Proxmox viene rilevata automaticamente. Server, datastore, nome utente e impronta digitale provengono dalla stanza. La password viene letta dalla directory delle credenziali di Proxmox. Nessun rientro necessario sul lato ProxMenux — il repository è disponibile non appena è configurato in Proxmox." + }, + { + "source": "Configurazione manuale ProxMenux", + "path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt", + "content": "Aggiunto da Configure destinazioni di backup → PBS destinazioni → Aggiungi PBS. Prompts per un nome, nome utente (root@pam o user@pbs!token), host o IP, datastore e password. I re-prompt password su input vuoto — un salvataggio vuoto altrimenti persisterebbe silenziosamente e ogni backup successivo fallirebbe con un errore di autenticazione opaco. Questo percorso viene utilizzato quando il target PBS non è registrato come storage Proxmox." + } + ], + "menuTitle": "Menu di selezione", + "menuBody": "Entrambe le fonti sono mostrate in un unico menu, ciascuna riga contrassegnata con la sua origine ([proxmox] o [manual]). Le voci di cui la password non poteva essere risolta sono contrassegnate con un avviso ⚠ no password — selezionando uno attiva un rientro password prima dell'avvio del backup. L'impronta digitale viene passata a proxmox-backup-client tramite la variabile di ambiente PBS_FINGERPRINT; quando assente, il client chiede all'operatore di accettare il certificato del server in modo interattivo sul primo backup." + }, + "backupCommand": { + "heading": "Il comando di backup", + "intro": "Il caricamento avviene con una sola invocazione di proxmox-backup-client backup. ProxMenux usa env per passare al client password, password di crittografia e impronta digitale come variabili d’ambiente.", + "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": "Nome ID di backup", + "backupIdBody": "L’ID di backup predefinito è hostcfg-HOSTNAME. Prima del caricamento, l’operatore lo conferma o modifica; vengono eliminati i caratteri non compresi in [A-Za-z0-9_-] e i trattini finali. Riutilizzare lo stesso ID è intenzionale: PBS lo tratta come un gruppo e ogni backup successivo compare come nuova voce al suo interno, condividendo la deduplicazione con i precedenti.", + "pxarTitle": "Perché la fonte è la radice di staging completa", + "pxarBody": "La sorgente .pxar è l'intero staging_root — rootfs/, metadata/ e manifest.json insieme. Le versioni precedenti hanno superato $staging_root/rootfs come fonte; che ha lasciato metadata/ fuori dall'archivio e il controllo di compatibilità del ripristino non aveva nulla da leggere, degradando a avvisi cross-host anche su ristabilimenti dello stesso host. I vecchi backup creati con la fonte rootfs-solo ripristinano ancora correttamente tramite il ramo case-_rs_check_layout di 3, che avvolge un albero etc/var/root/usr piatto di nuovo in una gerarchia rootfs/." + }, + "encryption": { + "heading": "Crittografia lato cliente", + "glossaryHint": "Questa sezione usa i termini file di chiave, passphrase e involucro di recupero. Il glossario ne riassume le differenze con una frase per termine.", + "intro": "La crittografia PBS lato client con file di chiave cifra i blocchi sull’host di origine prima del caricamento. In ProxMenux è facoltativa. Se attivata, durante la configurazione l’operatore sceglie esplicitamente sì o no se caricare su PBS anche una copia di recupero del file di chiave protetta da passphrase; la scelta è modificabile in seguito dal Monitor. Il file di chiave risiede sempre nel percorso canonico /usr/local/share/proxmenux/pbs-key.conf e viene riutilizzato senza nuove richieste per ogni backup crittografato successivo.", + "keyfileTitle": "Impostazione del keyfile", + "keyfileBody": "Il dialogo di crittografia compare al primo backup crittografato dell’host. Prima chiede se crittografare il backup: No prosegue senza crittografia, Sì passa alla seconda fase. Questa dipende dalla presenza di un file di chiave in /usr/local/share/proxmenux/pbs-key.conf. Se esiste, viene riutilizzato senza altre domande e il backup prosegue; i backup successivi non lo chiedono più. Altrimenti, un menu offre due opzioni. Genera un nuovo file di chiave esegue proxmox-backup-client key create --kdf none. Usa un file di chiave esistente rileva automaticamente una chiave gestita da PVE: se il repository PBS scelto è registrato in Proxmox con una chiave di crittografia in /etc/pve/priv/storage/<NAME>.enc, il file viene copiato senza altre domande nel percorso canonico di ProxMenux. Se nessuna chiave PVE corrisponde al repository, viene richiesto il percorso assoluto dove l’operatore ha già collocato il file sull’host. In entrambi i casi, il file viene installato nel percorso canonico con chmod 600.", + "modesTitle": "Per-host o keyfile condiviso", + "modesIntro": "Entrambi i modelli sono supportati e nessuno è obbligatorio: l’operatore sceglie in base all’organizzazione dei propri host.", + "modesPerHostTitle": "File di chiave per host (predefinito)", + "modesPerHostBody": "Ogni host genera un proprio keyfile la prima volta che consente la crittografia PBS. L'isolamento è il massimo: compromettere il keyfile di un host non espone i backup di qualsiasi altro. Consigliato per flotte di produzione e per ambienti in cui gli host hanno diversi proprietari o confini di conformità.", + "modesSharedTitle": "Keyfile condiviso (importa su ogni host)", + "modesSharedBody": "Un master keyfile generato una volta e installato su ogni host tramite l’opzione Usa un file di chiave esistente. La gestione è più semplice: un singolo segreto per salvaguardare, e qualsiasi host può decifrare gli archivi di qualsiasi altro (utile per il consolidamento, le esercitazioni di ripristino cross-host o la verifica centralizzata di backup). Il trade-off è che una perdita del keyfile condiviso espone ogni host contemporaneamente. Raccomandato per homelabs e per flotte dove tutti gli host hanno lo stesso proprietario e il limite di fiducia.", + "recoveryTitle": "Caricare la chiave su PBS: decide l’operatore", + "recoveryBody": "Subito dopo la scelta del file di chiave, ProxMenux pone la domanda esplicita Caricare la chiave su PBS?, con due risposte. Nessun artefatto di recupero viene caricato su PBS finché l’operatore non risponde Sì. L’opzione predefinita è No, conserva solo in locale: la chiave resta nel percorso canonico locale, ProxMenux non carica artefatti di recupero su PBS e l’operatore gestisce personalmente la copia esterna. Il pulsante Scarica il file di chiave del Monitor, nella riga della destinazione PBS, la fornisce su richiesta. Scegliendo Sì, carica, viene chiesta due volte una passphrase di recupero, verificandone la corrispondenza. ProxMenux protegge il file con AES-256-CBC e PBKDF2 (600.000 iterazioni, salt casuale), producendo pbs-key.recovery.enc. Ogni backup crittografato successivo carica questo involucro su PBS in un gruppo di backup associato. Questi caricamenti non inviano a PBS né la passphrase né il file di chiave in chiaro. La scelta può essere modificata in qualsiasi momento nel Monitor: il controllo nella riga PBS permette Sì o No e applica subito Avvia caricamento, Interrompi caricamento o Aggiorna passphrase in base allo stato corrente.", + "blobUploadTitle": "Gruppo di backup abbinato su PBS", + "blobUploadBody1": "Quando la modalità escrow è Sì, carica, ProxMenux carica la busta di recupero a PBS dopo ogni backup crittografato come secondo, gruppo di backup abbinato con lo stesso nome del gruppo host ma terminando in -keyrecovery. I due gruppi siedono l'uno accanto all'altro nella lista datastore — uno per i backup host, uno per le buste di recupero. La busta non lascia mai l'host in plaintext: la crittografia avviene sull'host stesso con AES-256-CBC e PBKDF2 prima che i byte vadano sul filo (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS riceve solo la busta già crittografata.", + "envelopeSecurityTitle": "Caricare il file keyrecovery a PBS è un rischio di sicurezza?", + "envelopeSecurityBody": "Il file keyrecovery è crittografato in transito e a riposo. Il passphrase di recupero non lascia mai l'host: la crittografia avviene localmente prima del caricamento, e PBS vede solo il risultato già crittografato. Un amministratore PBS — o chiunque abbia accesso al datastore — può scaricare il file di keyrecovery, ma senza la passphrase di recupero non può leggere il keyfile all'interno: è un codice opaco. Ricostruire il keyfile richiede entrambi i pezzi contemporaneamente, il file keyrecovery e la passphrase, e solo l'operatore tiene entrambi.", + "blobUploadConstraintTitle": "Perché servono due gruppi anziché un unico gruppo crittografato", + "blobUploadConstraintBody": "Una singola invocazione di proxmox-backup-client backup cifra tutti i suoi archivi con lo stesso file di chiave oppure nessuno: non è possibile mescolare i due casi. Il backup host deve essere cifrato con la chiave dell’host, ma l’involucro di recupero non può accompagnarlo nello stesso caricamento, perché verrebbe cifrato con la chiave che contiene. Su un host appena reinstallato non sarebbe possibile aprirlo: servirebbe la chiave per decifrare la chiave stessa. Per questo i due elementi vengono caricati indipendentemente e appaiono in due gruppi. Il client PBS cifra il backup host con il file di chiave, mentre ProxMenux cifra l’involucro con la passphrase prima del caricamento. Due livelli di crittografia diversi proteggono due elementi distinti.", + "blobUploadImageAlt": "PBS UI che mostra i gruppi di backup hostcfg-HOSTNAME e hostcfg-HOSTNAME-keyrecovery adiacenti nell'elenco dei datastore.", + "blobUploadImageCaption": "PBS UI — i gruppi di backup accoppiati. Il gruppo principale contiene i backup host; il gruppo -keyrecovery detiene il keyfile passphrase-wrapped.", + "recoverTitle": "Recupero su un host fresco", + "recoverBody": "Quando il file di chiave manca nel percorso canonico, dopo una reinstallazione o una rimozione esplicita, il ripristino prova tre fonti in ordine e si ferma alla prima che fornisce una chiave utilizzabile. Prima, se il repository PBS selezionato ha una chiave corrispondente gestita da PVE in /etc/pve/priv/storage/<NAME>.enc, questa viene copiata senza domande nel percorso canonico. Poi, se su PBS esiste un gruppo -keyrecovery, viene scaricata la sua istantanea più recente e viene chiesta la passphrase di recupero per decifrarla. Infine, se le prime due opzioni non funzionano o vengono rifiutate, il dialogo chiede il percorso assoluto del file di chiave sull’host e lo copia nel percorso canonico. Il Monitor offre lo stesso flusso di importazione nella finestra dei dettagli del backup. In alto compare un pannello ambra quando Ripristina, Scarica o Visualizza contenuto richiede una chiave assente. Se la chiave installata non corrisponde a quella usata per cifrare il backup, PBS restituisce wrong key — manifest's key XX does not match provided key YY. Le stesse tre azioni mostrano allora un pannello strutturato con l’impronta richiesta dal manifesto in evidenza, per identificare quale chiave importare per aprire quel backup.", + "monitorManagementTitle": "Gestione del keyfile dal Monitor", + "monitorManagementBody": "Il Monitor mostra i controlli del file di chiave direttamente in ogni riga di destinazione PBS nella configurazione dei backup. Sono disponibili tre azioni: Scarica esporta il file attuale nel browser; Carica sostituisce il file installato con quello fornito dall’operatore, sovrascrivendo il precedente solo dopo l’installazione riuscita del nuovo nel percorso canonico; Elimina rimuove il file dall’host. Accanto si trova il controllo della copia di recupero: una scelta Sì/No per Caricare la chiave su PBS?, un campo passphrase se si sceglie Sì e un pulsante di applicazione contestuale con Avvia caricamento, Interrompi caricamento o Aggiorna passphrase. Ogni azione usa gli stessi endpoint Flask dell’interfaccia di terminale, quindi gli effetti su disco e lo stato su PBS sono identici dalle due interfacce." + }, + "restoreAccess": { + "heading": "Recuperare sul lato del ripristino", + "body": "Il ripristino individua i backup host ProxMenux su PBS elencando i gruppi del repository configurato e filtrandoli per modello dell’ID. La scheda Backup del Monitor mostra lo stesso elenco. Scegliere un backup esegue proxmox-backup-client restore con gli stessi repository, password e impronta, oltre a --keyfile se il backup è crittografato. L’archivio .pxar viene estratto in una directory di preparazione che _rs_check_layout passa al normale processo di ripristino. Fuori da ProxMenux, lo stesso comando estrae l’archivio nel percorso desiderato per esaminare l’albero o procedere a un ripristino manuale." + }, + "references": { + "heading": "Referenze", + "intro": "Documentazione ufficiale di Proxmox Backup Server per i componenti usati da ProxMenux.", + "items": [ + { + "label": "Documentazione Proxmox Backup Server", + "href": "https://pbs.proxmox.com/docs/", + "tail": "— punto di ingresso principale che copre l'installazione, l'amministrazione, lo stoccaggio, gli utenti e i ruoli." + }, + { + "label": "proxmox-backup-client", + "href": "https://pbs.proxmox.com/docs/backup-client.html", + "tail": " — lo strumento da riga di comando che ProxMenux usa per ogni backup e ripristino. Descrive ID e tipi di backup, archivi, sintassi dei repository e variabili d’ambiente." + }, + { + "label": "Crittografia lato cliente", + "href": "https://pbs.proxmox.com/docs/backup-client.html#encryption", + "tail": " — creazione del file di chiave, modalità --kdf e modello di crittografia che ProxMenux estende con una copia di recupero protetta da passphrase." + }, + { + "label": "Gestione dei datastore", + "href": "https://pbs.proxmox.com/docs/storage.html", + "tail": "— la creazione e la gestione dei datastores che ricevono i backup degli host, incluso il layout di chunk-store e le autorizzazioni." + }, + { + "label": "Eliminazione delle vecchie copie e garbage collection", + "href": "https://pbs.proxmox.com/docs/maintenance.html#pruning", + "tail": " — il modello di conservazione di --keep-last / --keep-daily / --keep-weekly che ProxMenux applica a ogni attività pianificata, e il recupero dei blocchi inutilizzati da parte di PBS dopo l’eliminazione delle vecchie copie." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/glossary.json b/web/messages/it/docs/backup-restore/glossary.json new file mode 100644 index 00000000..c32a3636 --- /dev/null +++ b/web/messages/it/docs/backup-restore/glossary.json @@ -0,0 +1,230 @@ +{ + "meta": { + "title": "Glossario — Backup & Ripristino | ProxMenux", + "description": "Glossario di termini e definizioni per lo stack di backup e ripristino ProxMenux: crittografia, keyfile, passphrase, busta di recupero, PBS, chunks, rootfs, manifesto, runner e cross-kernel idratazione.", + "ogTitle": "Backup & ripristino glossario | ProxMenux", + "ogDescription": "Definizioni chiare per il vocabolario utilizzato attraverso la documentazione di backup e ripristino ProxMenux.", + "twitterTitle": "Backup & ripristino glossario | ProxMenux", + "twitterDescription": "Passphrase, keyfile, busta di recupero, rootfs, manifesto, PBS, chunks — tutto definito in un unico luogo." + }, + "header": { + "title": "Glossario", + "description": "Termini utilizzati attraverso la documentazione di backup e ripristino, con la loro definizione.", + "section": "Backup e ripristino" + }, + "intro": { + "body": "I termini sono raggruppati per tema. Ogni voce dà il termine e una breve definizione." + }, + "groups": [ + { + "title": "Crittografia e recupero chiave", + "intro": "Vocabolario per il blocco di crittografia PBS. Si tratta di due segreti distinti: un keyfile binario e un passphrase scritto.", + "entries": [ + { + "id": "passphrase-recuperacion", + "term": "Passphrase di ripristino", + "def": "Password di testo che l'utente sceglie per proteggere la busta di recupero. Viene richiesto due volte con un controllo match, ed è utilizzato solo per crittografare la busta e decifrarla se il keyfile ha bisogno di essere recuperato. Non è la passphrase che sblocca il keyfile stesso, e non viene mai inviata a PBS. Durante un backup normale non lascia mai l'host." + }, + { + "id": "clave-cifrado", + "term": "Keyfile (chiave di crittografia)", + "def": "File di chiave usato da proxmox-backup-client per cifrare i blocchi prima dell’invio a PBS. Senza la chiave corrispondente i dati cifrati non sono leggibili. ProxMenux lo salva in /usr/local/share/proxmenux/pbs-key.conf con modalità 600. Proteggilo: la busta di recupero serve a recuperarlo in caso di perdita." + }, + { + "id": "contrasena-keyfile", + "term": "Passphrase Keyfile (KDF passphrase)", + "def": "Passphrase opzionale che il keyfile stesso può trasportare, distinto dal passphrase di recupero. Esiste solo quando il keyfile è stato creato con --kdf scrypt (tipicamente un keyfile importato). Senza di esso, il keyfile non può essere sbloccato per l'uso. ProxMenux persiste in forma crittografata sull'host in modo che i backup programmati possano funzionare senza un prompt interattivo." + }, + { + "id": "sobre-recuperacion", + "term": "Busta di recupero", + "def": "Il keyfile avvolto in uno strato aggiuntivo: viene crittografato con il passphrase di recupero utilizzando AES-256-CBC e PBKDF2 prima che lasci l'host. È ciò che viene caricato su PBS come gruppo -keyrecovery. Senza la passphrase, la busta è opaca: scaricarla da PBS non rivela il keyfile." + }, + { + "id": "cifrado-cliente", + "term": "Crittografia lato cliente", + "def": "Modello di crittografia in cui i dati vengono crittografati sull'host sorgente prima di essere caricati. PBS riceve solo e memorizza il testo cifrario; nemmeno un amministratore PBS con accesso al datastore può leggerlo senza il keyfile. ProxMenux si basa su questo modello e aggiunge la busta di recupero in cima." + }, + { + "id": "kdf-none", + "term": "--kdf none", + "def": "Opzione a proxmox-backup-client key create che produce un keyfile senza passphrase allegato. Il keyfile può essere utilizzato direttamente senza un prompt, che è essenziale per i lavori programmati in esecuzione incustodito. Questo è ciò che ProxMenux utilizza per impostazione predefinita quando si genera un nuovo keyfile." + }, + { + "id": "kdf-scrypt", + "term": "--kdf scrypt", + "def": "Opzione a proxmox-backup-client key create che produce un keyfile protetto da un passphrase del file di chiave. Ogni utilizzo del keyfile richiede di sbloccarlo con quel passphrase. ProxMenux accetta questo stile di keyfile sull'importazione e memorizza il passphrase crittografato in modo che i backup programmati possano ancora essere eseguiti incustoditi." + }, + { + "id": "aes-256-cbc", + "term": "AES-256-CBC", + "def": "Cifra simmetrica standard. ProxMenux lo utilizza (tramite openssl enc -aes-256-cbc) per avvolgere il keyfile con il passphrase di recupero e produrre il busta." + }, + { + "id": "pbkdf2", + "term": "PBKDF2", + "def": "Funzione crittografica che trasforma un passphrase di tipo umano in una chiave binaria adatta alla crittografia. Rallenta i tentativi di forza bruta applicando molte iterazioni. ProxMenux lo utilizza con iterazioni 600 000 e un sale casuale durante la crittografia della busta di recupero." + } + ] + }, + { + "title": "Struttura di backup", + "intro": "Termini che descrivono cosa vive all'interno di un backup, indipendentemente dalla destinazione.", + "entries": [ + { + "id": "rootfs", + "term": "rootfs / filesystem radice", + "def": "Copia dei file dell’host sorgente prodotta da rsync secondo il profilo predefinito e i percorsi personalizzati. Non è un’immagine dell’intero disco: vengono copiati solo percorsi con configurazione o stato che Proxmox non può rigenerare da sé." + }, + { + "id": "manifiesto", + "term": "Manifesto (manifest.json)", + "def": "Documento strutturato JSON che descrive l'host sorgente in tempo di backup: hardware, storage, kernel, componenti ProxMenux installati e inventario di VM e LXC. È prodotto da sei raccoglitori di dati indipendenti. Il flusso di ripristino lo utilizza per confrontare sorgente e obiettivo." + }, + { + "id": "staging", + "term": "Directory di preparazione", + "def": "directory temporanea in cui ProxMenux assembla i tre blocchi (rootfs, metadati e manifest) prima di imballarli e caricare alla destinazione. Viene rimosso automaticamente quando il backup termina, anche abortito." + }, + { + "id": "perfil-defecto", + "term": "Profilo predefinito", + "def": "Set di percorsi che ProxMenux copia per impostazione predefinita in ogni backup. Copre PVE config, rete, SSH, kernel, apt, strumenti ProxMenux e altro ancora. È definito in codice e documentato sul Come funziona pagina." + }, + { + "id": "rutas-personalizadas", + "term": "Percorsi personalizzati", + "def": "Percorsi extra l'utente aggiunge in cima al profilo default. O persistente (conservato in backup-extra-paths.txt) o per-run (in modalità personalizzata)." + } + ] + }, + { + "title": "Destinazioni e stoccaggio", + "intro": "Termini legati a dove il backup atterra — server PBS, archivio locale o repository Borg — e come PBS organizza i dati.", + "entries": [ + { + "id": "repositorio-pbs", + "term": "Repository PBS", + "def": "Combinazione di Proxmox Backup Server + datastore + utente che riceve il backup. Identificata dalla stringa user@realm@host:datastore. Un singolo server PBS può ospitare diversi repository." + }, + { + "id": "datastore", + "term": "Datastore", + "def": "Spazio di archiviazione specifico su un server PBS che contiene backup e relativi blocchi. Ogni datastore risiede su un file system del server PBS con propri permessi e criteri." + }, + { + "id": "chunk", + "term": "Blocco (chunk) / deduplicazione dei blocchi", + "def": "PBS divide ogni backup in blocchi di dimensioni variabili, identifica ogni pezzo dal suo hash e memorizza ogni pezzo solo una volta, anche se appare in molti backup diversi. Ciò significa backup successivi dello stesso host — o attraverso host simili — prendere molto poco spazio aggiuntivo." + }, + { + "id": "fingerprint", + "term": "Impronta digitale", + "def": "Impronte crittografica del certificato PBS del server TLS. Consente al client di verificare che stia parlando con il server previsto senza affidarsi a un'autorità di certificazione pubblica. ProxMenux passa a proxmox-backup-client tramite la variabile ambiente PBS_FINGERPRINT." + }, + { + "id": "grupo-copia", + "term": "Gruppo backup", + "def": "Contenitore logico all'interno di PBS in cui si accumulano backup successivi dello stesso asset. Ogni nuovo backup condivide la deduplica con quelli precedenti nello stesso gruppo. ProxMenux utilizza due gruppi per host quando la crittografia è abilitata: uno per il backup host e uno con un suffisso -keyrecovery per la busta di recupero." + }, + { + "id": "backup-id", + "term": "ID backup", + "def": "Nome del gruppo backup. ProxMenux predefinisce hostcfg-HOSTNAME e consente all'utente di modificarlo prima del caricamento; i caratteri non supportati vengono rimossi automaticamente." + }, + { + "id": "pxar", + "term": ".pxar", + "def": "Formato di archivio nativo di PBS per directory. Si comporta come un archivio tar ottimizzato per la deduplicazione del pezzo: piuttosto che memorizzare un file opaco, PBS rompe il suo contenuto in pezzi riutilizzabili." + } + ] + }, + { + "title": "Esecuzione e pianificazione", + "intro": "Termini utilizzati dal sistema di lavoro programmato ProxMenux.", + "entries": [ + { + "id": "runner", + "term": "Processo di esecuzione", + "def": "Lo script run_scheduled_backup.sh che esegue un backup programmato. Legge la configurazione del lavoro, lancia il backend corrispondente (Local, PBS o Borg), applica la ritenzione sul successo e invia le notifiche configurate." + }, + { + "id": "trabajo-programado", + "term": "Lavoro programmato", + "def": "Configurazione persistente di un backup ricorrente. Contiene destinazione, credenziali, crittografia, pianificazione e conservazione. È salvata in /var/lib/proxmenux/backup-jobs/<id>.env." + }, + { + "id": "modo-adjunto", + "term": "Modalità allegato", + "def": "Processo senza timer proprio. Un hook job-end PVE di vzdump lo avvia dopo i backup dei guest se lo storage corrisponde. Il processo padre fornisce destinazione e conservazione iniziale, ma il hook confronta lo storage, non l’ID padre. Anche un altro processo sullo stesso storage può attivarlo. Solo Local e PBS." + }, + { + "id": "timer-systemd", + "term": "Timer di systemd", + "def": "Meccanismo standard systemd che accende un comando su un calendario. ProxMenux crea un timer per indipendente lavoro programmato; attach-mode posti di lavoro non utilizzano timer, vengono eseguiti tramite lo script-hook PVE." + }, + { + "id": "retencion", + "term": "Retenzione (keep-last, keep-daily...)", + "def": "Politica che decide quali backup più vecchi mantenere e quali prune. Definito per lavoro con parametri come keep-last, keep-daily, keep-weekly, keep-monthly. Applicato dal processo di esecuzione dopo ogni backup di successo." + } + ] + }, + { + "title": "Ripristina", + "intro": "Termini dal flusso di ripristino.", + "entries": [ + { + "id": "restauracion-universal", + "term": "Ripristino universale", + "def": "Il flusso di ripristino ProxMenux non si limita a estrarre il filesystem: legge il manifesto per individuare le differenze tra sorgente e obiettivo, riproduce la configurazione del sistema e riattiva gli installatori per i componenti gestiti da ProxMenux. L'obiettivo è quello di riprodurre l'host sorgente, non solo l'archivio." + }, + { + "id": "hidratacion", + "term": "Idratazione (cross-kernel)", + "def": "Passo di ripristino che fonde la propria configurazione dell'utente dalla sorgente (token IOMMU, ID dispositivo VFIO, quirk personalizzati, chiavi GRUB) in cima alla configurazione di avvio fresco del bersaglio, senza copiare i file legati al kernel della fonte verbatim. Esegue quando il kernel di destinazione è più nuovo di quello del backup." + }, + { + "id": "cross-kernel", + "term": "Ripristino tra versioni del kernel", + "def": "Ripristino in cui il kernel di destinazione è diverso, di solito più recente, da quello sorgente. Il passaggio di idratazione evita di trascinare file incompatibili con il kernel di destinazione." + }, + { + "id": "instalador-postboot", + "term": "Installatore post-boot", + "def": "Componenti reinstallati dopo il primo avvio dell'host ripristinato ( driver NVIDIA, driver Coral TPU, strumenti AMD GPU, strumenti Intel GPU). Ogni installatore viene eseguito contro il kernel del bersaglio, quindi l'host ripristinato non dipende dal kernel della sorgente presente." + }, + { + "id": "compatibility-check", + "term": "Controllo di compatibilità", + "def": "Confronto tra il manifesto sorgente e lo stato del bersaglio che ProxMenux esegue all'inizio del ripristino. Decide quali parti sono copiate verbatim, che hanno bisogno di idratazione e che sono ricreati da un installatore." + }, + { + "id": "equipo-recien-instalado", + "term": "Installazione da zero", + "def": "Host appena reinstallato da zero, senza keyfile locale. Ripristino di un backup crittografato richiede prima di recuperare il file chiave dal busta memorizzato su PBS, utilizzando il passphrase di recupero." + } + ] + } + ], + "whereNext": { + "heading": "Dove proseguire", + "items": [ + { + "label": "Come funziona", + "href": "/docs/backup-restore/how-it-works", + "tail": " — come rootfs, manifesto e inventario applicazioni si inseriscono nel backup." + }, + { + "label": "Destinazione Proxmox Backup Server", + "href": "/docs/backup-restore/destinations/pbs", + "tail": "— in cui la crittografia lato client, keyfile, passphrase di recupero e busta sono documentati in profondità." + }, + { + "label": "Ripristino", + "href": "/docs/backup-restore/restoring", + "tail": " — procedura di ripristino e uso del manifesto." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/how-it-works.json b/web/messages/it/docs/backup-restore/how-it-works.json new file mode 100644 index 00000000..78a4d54c --- /dev/null +++ b/web/messages/it/docs/backup-restore/how-it-works.json @@ -0,0 +1,205 @@ +{ + "meta": { + "title": "Come funziona il backup ProxMenux internamente — rootfs, manifesto, applicazioni", + "description": "Contenuto dettagliato di un backup ProxMenux: il rootfs copiato con rsync secondo il profilo di percorsi predefinito, il manifesto strutturato creato da sei moduli di raccolta indipendenti e l’inventario delle applicazioni che guida la reinstallazione automatica di pacchetti e componenti dopo il ripristino.", + "ogTitle": "Come funziona ProxMenux Backup internamente", + "ogDescription": "Le tre parti di un backup ProxMenux: rootfs, manifesto e applicazioni.", + "twitterTitle": "Come funziona ProxMenux Backup | ProxMenux", + "twitterDescription": "I tre payload di un backup ProxMenux e come il ripristino riproduce l'host sorgente da loro." + }, + "header": { + "title": "Come funziona", + "description": "La ripartizione interna di un backup ProxMenux — filesystem, inventario manifesto e di applicazione — e come il ripristino consuma tutti e tre per riprodurre l'host sorgente su un obiettivo che potrebbe non condividere lo stesso kernel.", + "section": "Backup e ripristino" + }, + "intro": { + "title": "Un archivio, tre parti", + "body": "Ogni backup crea tre parti definite sotto un’unica directory di preparazione. L’archivio caricato sulla destinazione (.tar.zst locale, backup PBS o archivio Borg) conserva questa struttura. Il ripristino usa tutte e tre: il manifesto viene consultato prima delle modifiche per rilevare differenze e decidere cosa escludere; rootfs fornisce i file di configurazione, applicati subito o dopo il riavvio; l’inventario delle applicazioni guida l’installazione dei pacchetti e la reinstallazione dei componenti dopo l’avvio. Ogni parte può essere esaminata o estratta indipendentemente." + }, + "layout": { + "heading": "Disposizione dell'archivio", + "intro": "Ogni archivio segue lo stesso layout albero indipendentemente dalla destinazione. La sottodirectory metadata/ contiene i dati strutturati; la sottodirectory rootfs/ contiene la copia del filesystem.", + "treeCaption": "La directory di preparazione creata durante il backup. Tutte le destinazioni ricevono lo stesso albero nel proprio formato nativo: tar per i backup locali, blocchi PBS per PBS e segmenti Borg per 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│ ├── paths_archived.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": "La parte rootfs", + "intro": "L’albero rootfs/ è una semplice copia del filesystem prodotta da rsync dall’host di origine. Contiene un profilo predefinito di percorsi scelti per il ripristino Proxmox e gli eventuali percorsi personalizzati aggiunti all’attività o alla sessione interattiva. La selezione è volutamente limitata ai percorsi che contengono configurazione o conservano uno stato che Proxmox non può rigenerare da solo.", + "defaultProfileTitle": "Il profilo predefinito", + "defaultProfileBody": "Il profilo predefinito è definito da hb_default_profile_paths in lib_host_backup_common.sh. Copre otto categorie fisse e, se necessario, lo stato ZFS, che insieme descrivono un host Proxmox operativo:", + "categoriesTitle": "Categorie dei percorsi", + "categoryRows": [ + { + "category": "Nucleo PVE", + "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", + "why": "Contenuto del filesystem Cluster e default vzdump. Il database PMxcfs (config.db) viene catturato come un'istantanea coerente tramite sqlite3 .backup senza interrompere il cluster, e i sidecar .db-wal / .db-shm sono esclusi dal rsync. Quando sqlite3 non è disponibile, viene creato config.db.raw-fallback, che il ripristino usa automaticamente come database." + }, + { + "category": "Identità e rete host", + "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", + "why": "Tutto ciò che serve all’host per tornare in rete con la stessa identità. I file .link in /etc/systemd/network associano i nomi delle schede alle rispettive MAC, mantenendo i nomi durante reinstallazioni e modifiche hardware." + }, + { + "category": "Accesso e autenticazione", + "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", + "why": "Chiavi SSH, regole sudo e configurazione PAM. Perderle impedisce all’utente di accedere all’host ripristinato." + }, + { + "category": "Kernel e avvio", + "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": "Parametri IOMMU, blacklist dei moduli, ID dei dispositivi VFIO, tabella dei montaggi e configurazione dello stack di archiviazione." + }, + { + "category": "Shell e impostazioni locali", + "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", + "why": "Configurazione di shell a livello di sistema, variabili di ambiente, configurazione di generazione locale." + }, + { + "category": "Gestione pacchetti e cron", + "paths": "/etc/apt, /etc/cron.d, /etc/cron.{daily,hourly,weekly,monthly}, /etc/cron.allow, /etc/cron.deny, /var/spool/cron/crontabs", + "why": "Fonti APT per una risoluzione coerente dei pacchetti, attività pianificate definite dall'utente." + }, + { + "category": "ProxMenux stati e strumenti", + "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": "Utensili Proxmox opzionali ma comuni. I percorsi mancanti sono segnalati in metadata/missing_paths.txt senza interrompere il backup." + }, + { + "category": "ProxMenux binari e root", + "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (sottodiri volatili esclusi)", + "why": "File binari ProxMenux e configurazione per utente sotto /root. I percorsi volatili (.bash_history, .cache/, tmp/, .local/share/Trash/) sono esclusi dalla copia. /var/lib/proxmenux detiene i lavori di backup programmati e lo stato dell’host tenuto da ProxMenux; la messa in scena di ripristino, le copie rollback e i marcatori post-restore sono esclusi, perché appartengono all'host che gestisce un ripristino." + }, + { + "category": "Stato ZFS (condizionato)", + "paths": "/etc/zfs", + "why": "Solo incluso quando l'host sorgente esegue ZFS. Contiene zpool.cache e hostid." + } + ], + "customTitle": "Estendere il profilo con percorsi personalizzati", + "customBody": "Oltre al profilo predefinito, ProxMenux offre due modi per includere ulteriori percorsi in un backup. Si compone senza conflitti ed entrambi si applicano a backup interattivi e lavori programmati.", + "customExtrasTitle": "1. Extra persistenti (file per host)", + "customExtrasBody": "Un file di testo a /usr/local/share/proxmenux/backup-extra-paths.txt contiene un elenco di percorsi assoluti che l'utente ha contrassegnato come \"sempre includere\" su questo host. Quando un backup viene eseguito in modalità Default, ProxMenux aggiunge questi percorsi al profilo predefinito automaticamente senza chiedere. Il file viene modificato dall'interfaccia — nessuna modifica manuale necessaria — e persiste attraverso riavvimenti e aggiornamenti. Un percorso assoluto per linea; sono consentiti commenti #.", + "customModeTitle": "2. Modalità personalizzata (per-run)", + "customModeBody": "Avviare un backup in modalità Custom sostituisce l'applicazione automatica del profilo predefinito con una lista di controllo che mostra ogni percorso: le voci del profilo predefinito e gli extra persistenti (prefissati con [+] e già selezionati). L'utente seleziona o deseleziona le voci per tale esecuzione specifica, e può anche premere Aggiungi percorso personalizzato per inserire un nuovo percorso — che viene poi persistito al file extra per i backup futuri.", + "customMissingTitle": "Sentieri assenti dalla fonte", + "customMissingBody": "Qualsiasi percorso dal profilo (default o aggiunto) che non esiste sull'host sorgente viene registrato in metadata/missing_paths.txt all'interno dell'archivio. Il backup non fallisce né si ferma — l'utente vede un riassunto di percorsi archiviati e percorsi mancanti alla fine. In pratica questo accade per percorsi di utensile opzionali come /etc/wireguard o /etc/prometheus quando questi strumenti non sono installati." + }, + "manifest": { + "heading": "La parte manifesto", + "intro": "manifest.json è un documento strutturato JSON che descrive l'host sorgente al momento del backup. È prodotto da sei moduli di raccolta indipendenti orchestrati da build_manifest.sh. Ogni collettore è in sola lettura, produce un frammento JSON ben definito, e rientra in un default vuoto sicuro se non riesce — il manifesto è ancora utilizzabile se una sezione è incompleta.", + "orchestratorCaption": "I sei moduli di raccolta compongono il manifesto. Ogni collettore funziona nel proprio sottoprocesso; un guasto in uno rientra in un documento di default sicuro e avverte ma non interrompe il backup.", + "collectorRows": [ + { + "collector": "collect_source_host.sh", + "produces": "source_host", + "content": "Hostname, versione PVE (pveversion), versione PBS se l'host esegue il ruolo di backup-server, kernel (uname -r), modalità boot (efi/bios), tipo filesystem root, modello CPU + architettura, memoria in KB." + }, + { + "collector": "collect_hardware.sh", + "produces": "hardware_inventory", + "content": "GPU (con il fornitore e la mappatura dell'installatore ProxMenux), TPU (Coral USB + M.2 con il rilevamento di lsusb/lspci), NIC (con MAC, slot PCI e ponti), dispositivi wireless. Le voci GPU portano un'euristica passthrough_eligible." + }, + { + "collector": "collect_storage.sh", + "produces": "storage_inventory", + "content": "Pool ZFS con relativo tipo e dischi membri identificati tramite /dev/disk/by-id/*, /dev/disk/by-partuuid/* o percorsi diretti /dev/sdX, a seconda di come il pool è stato creato; gruppi di volumi e thin pool LVM; dischi fisici con supporto SMART; voci PVE di storage.cfg; montaggi esterni." + }, + { + "collector": "collect_kernel.sh", + "produces": "kernel_params", + "content": "Parametri aggiunti dall’operatore in /proc/cmdline, esclusi quelli standard come BOOT_IMAGE=, root=, ro/rw, quiet e splash; moduli caricati all’avvio da /etc/modules; percorsi dei file /etc/modprobe.d/*.conf con direttive effettive (options, blacklist, install, alias, softdep)." + }, + { + "collector": "collect_proxmenux_state.sh", + "produces": "proxmenux_installed_components", + "content": "Leggi /usr/local/share/proxmenux/managed_installs.json (registry di tutto ciò che ProxMenux ha installato) e installed_tools.json. Ogni voce mantiene il percorso di installazione (menu_script) in modo che il ripristino possa attivare lo stesso flusso di installazione." + }, + { + "collector": "collect_guests.sh", + "produces": "vms_lxcs_at_backup", + "content": "Elenca le VM (qm list) e i container LXC (pct list) presenti al momento del backup: VMID, nome e stato. È soltanto l’inventario; il backup dei dati effettivi dei guest spetta a vzdump / PBS." + } + ], + "schemaTitle": "Validazione schema", + "schemaBody": "Il manifesto convalida contro scripts/backup_restore/schema/manifest.schema.json. L'esecuzione di build_manifest.sh --validate attiva una validazione dello schema JSON (richiede python3 + jsonschema). Se il modulo non è presente, il controllo è saltato silenziosamente — la validazione è principalmente un aiuto sviluppatore, non una dipendenza runtime." + }, + "applications": { + "heading": "inventario delle applicazioni", + "intro": "Due inventari elencano il software aggiunto ai pacchetti base di Proxmox VE: la lista dei pacchetti in metadata/ e il registro dei componenti in rootfs, descritti di seguito. Il ripristino usa APT o gli installatori ProxMenux per riprodurre il software dell’utente secondo il metodo originale di installazione.", + "packagesTitle": "packages.manual.list", + "packagesBody": "Una lista alfabetica in testo semplice prodotta da apt-mark showmanual con tutti i pacchetti APT installati esplicitamente sull’host di origine. Sono escluse le dipendenze del sistema Proxmox VE di base, che APT installa automaticamente sul destinatario. Durante il ripristino, _rs_run_complete_extras legge la lista e applica un filtro contro le rimozioni a cascata in tre passaggi: dpkg -s rileva i pacchetti già installati, vengono rilevate altre versioni principali delle librerie e apt-get install --simulate verifica il rischio di rimozioni a cascata. Infine usa apt-get install -y per i pacchetti rimasti.", + "componentsTitle": "components_status.json (parte di rootfs)", + "componentsBody": "Un registro JSON sotto /usr/local/share/proxmenux/ che registra ogni componente ProxMenux installato con il suo stato esatto: versione, bandiere ProxMenux-specifiche (per NVIDIA: patched boolean; per Coral: versione DKMS). Questo file vive all'interno dei rootfs — non in metadata/ — perché è letto dopo la copia di rootfs al bersaglio. Il distaccatore post-boot (apply_cluster_postboot.sh) itera sulle sue voci ed esegue il gancio --auto-reinstall di ciascun componente, che legge lo stato registrato e riproduce l'installazione contro il kernel corrente dell'obiettivo.", + "componentInstallersTitle": "Installatori di componenti", + "componentInstallersBody": "Quattro installatori ProxMenux attualmente espongono un punto di ingresso --auto-reinstall:", + "installerRows": [ + { + "component": "nvidia_driver", + "installer": "gpu_tpu/nvidia_installer.sh", + "action": "Leggi version + patched. Scarica lo stesso runfile NVIDIA, costruisce moduli DKMS contro il kernel dell'obiettivo, riapplica la patch ProxMenux se la sorgente lo avesse." + }, + { + "component": "coral_driver", + "installer": "gpu_tpu/install_coral.sh", + "action": "Legge la versione del driver Coral. Compili il modulo DKMS contro il kernel dell'obiettivo." + }, + { + "component": "amdgpu_top", + "installer": "gpu_tpu/amd_gpu_tools.sh", + "action": "Legge la versione registrata. Ricarica l'esatta .deb dalla versione GitHub." + }, + { + "component": "intel_gpu_tools", + "installer": "gpu_tpu/intel_gpu_tools.sh", + "action": "APT-installa il pacchetto. Idemponte se già presente da packages.manual.list." + } + ] + }, + "restoreFlow": { + "heading": "Come il ripristino usa le tre parti", + "intro": "Il restauro e' una pipeline di sei stadi. Ogni fase legge un sottoinsieme specifico dell'archivio e aggiorna l'host di destinazione. Nessuna fase richiede che l'host sorgente sia raggiungibile — l'archivio è completamente autonomo.", + "stagesCaption": "La fase 1 usa il manifesto per decidere cosa modificare. La fase 2 copia i percorsi rootfs applicabili al sistema in esecuzione. La fase 3 prepara quelli rischiosi per il prossimo avvio. La fase 3b importa i pool ZFS di dati che non contengono la radice e hanno tutti i dischi presenti. La fase 4 gestisce i pacchetti. La fase 5 reinstalla i componenti dopo il riavvio per il kernel di destinazione.", + "stageRows": [ + { + "stage": "1", + "name": "Controllo di compatibilità", + "reads": "manifest.json", + "action": "Esegue hb_compat_check. Confronta sorgente vs. hardware target (NIC, ID di archiviazione), versione PVE e versione kernel principale. Imposta HB_COMPAT_KERNEL_DIRECTION (same, bk_newer o bk_older) e popola RS_SKIP_PATHS con esclusione hardware-drift e cross-kernel." + }, + { + "stage": "2", + "name": "Applicazione a sistema avviato", + "reads": "rootfs/ (solo percorsi sicuri)", + "action": "_rs_apply … hot copia le voci hb_classify_path=hot direttamente al target live. Qualsiasi cosa sotto /etc/pve, /etc/network o percorsi classificati come reboot/dangerous è differita." + }, + { + "stage": "3", + "name": "Preparazione delle modifiche differite", + "reads": "rootfs/ (riavvio + percorsi pericolosi)", + "action": "_rs_prepare_pending_restore prepara i percorsi rischiosi in /var/lib/proxmenux/pending-restore/, scrive plan.env, apply-on-boot.list e rs-skip-paths.txt e abilita proxmenux-restore-onboot.service per il prossimo avvio." + }, + { + "stage": "3b", + "name": "Importazione dei pool di dati", + "reads": "manifest.storage_inventory + target ZFS stato", + "action": "_rs_import_data_pools tenta di importare ogni pool ZFS che non contiene la radice e ha tutti i dischi presenti sul destinatario. Se il pool ha un hostid estraneo, riprova con zpool import -f. Se manca un disco, il pool viene saltato con un avviso. Il risultato per pool è registrato in /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "stage": "4", + "name": "Installazione del pacchetto", + "reads": "metadata/packages.manual.list", + "action": "_rs_run_complete_extras gestisce il filtro a cascata e chiama apt-get install -y con l'elenco dei pacchetti sopravvissuti. L'uscita completa va a /var/log/proxmenux/restore-apt-*.log." + }, + { + "stage": "5", + "name": "Dopo l'avvio", + "reads": "rootfs (già applicato) + components_status.json", + "action": "Dopo il riavvio, apply_pending_restore.sh riprende i percorsi differiti e apply_cluster_postboot.sh corre update-initramfs, update-grub (o proxmox-boot-tool refresh) e itera oltre components_status.json sparando il gancio --auto-reinstall di ogni componente." + } + ] + }, + "whyItWorks": { + "heading": "Perché suddividere il backup in tre parti", + "body": "La suddivisione segue il ciclo di vita dei dati. Il filesystem viene trasferito con rsync: rapidamente, in modo trasparente e atomico per file. Lo stato di configurazione da interpretare prima delle modifiche è JSON strutturato, leggibile separatamente, versionabile tramite schema e confrontabile automaticamente con lo stato di destinazione. Il software da reinstallare è descritto in un inventario di nomi e versioni; il gestore dei pacchetti e gli installatori ProxMenux scelgono i binari adatti. Ogni parte svolge il proprio compito. Insieme mirano a un ripristino coerente ma tollerante agli errori: un manifesto corrotto lascia rootfs ripristinabile, un pacchetto mancante non impedisce l’installazione dei componenti e un errore su una voce non ferma l’installazione della successiva." + } +} diff --git a/web/messages/it/docs/backup-restore/index.json b/web/messages/it/docs/backup-restore/index.json new file mode 100644 index 00000000..0e1015af --- /dev/null +++ b/web/messages/it/docs/backup-restore/index.json @@ -0,0 +1,93 @@ +{ + "meta": { + "title": "ProxMenux Backup e ripristino — Panoramica | Backup e ripristino completo dell'host per Proxmox VE", + "description": "ProxMenux Backup e ripristino acquisisce lo stato completo di un host Proxmox (file system, manifest di configurazione strutturata e pacchetti/componenti installati) e lo riproduce sullo stesso host o su un host diverso. Il backup e il ripristino sono autonomi: nessuna dipendenza esterna e i ripristini tra kernel sono supportati tramite un filtro di sottoinsieme sicuro sensibile alla direzione e un'idratazione indipendente dal kernel.", + "ogTitle": "ProxMenux Backup e ripristino - Panoramica", + "ogDescription": "Backup e ripristino completo dell'host per Proxmox VE con manifest strutturato, elenco di pacchetti e programmi di reinstallazione dei componenti.", + "twitterTitle": "ProxMenux Backup e ripristino | ProxMenux", + "twitterDescription": "Backup e ripristino completo dell'host per Proxmox VE con manifest strutturato, elenco di pacchetti e programmi di reinstallazione dei componenti." + }, + "header": { + "title": "Backup e ripristino", + "description": "Backup e ripristino dell'intero host per Proxmox VE. Cattura filesystem, configurazione e componenti installati in un unico archivio e riproduce l'host sulla stessa o su una diversa installazione Proxmox senza dipendenze esterne.", + "section": "Backup e ripristino" + }, + "intro": { + "title": "Che cos'è, in un paragrafo", + "body": "Un backup di ProxMenux acquisisce lo stato completo di un host Proxmox: il filesystem, con le directory pertinenti in /etc, /root e /var/lib/pve-cluster e gli eventuali percorsi personalizzati; un manifesto strutturato in JSON con hardware rilevato, parametri del kernel, configurazione di rete, stato di ZFS, utenti e voci cron; e un inventario delle applicazioni, con i pacchetti contrassegnati da APT come installati manualmente e i componenti installati da ProxMenux, completi delle versioni esatte. Le tre destinazioni supportate — archivio locale, Proxmox Backup Server (consigliato) e Borg — ricevono lo stesso contenuto autonomo. Ognuna consente di ricostruire l’host di destinazione senza che l’host di origine debba essere raggiungibile durante il ripristino." + }, + "video": { + "heading": "Video tutorial", + "intro": "Preferisci guardare Backup e ripristino in azione prima di configurarlo? Questa procedura dettagliata copre una demo completa end-to-end della funzionalità in ProxMenux.", + "title": "ProxMenux — Procedura dettagliata di backup e ripristino", + "caption": "Video esterno su YouTube. Riproduce in modalità di privacy avanzata (nessun cookie finché non premi Riproduci)." + }, + "whatItIsNot": { + "heading": "Cosa non è", + "intro": "Questa sezione riguarda il backup e il ripristino dell’host: l’installazione di Proxmox, non le applicazioni e i sistemi guest che vi vengono eseguiti.", + "items": [ + "Non è uno strumento di backup delle VM/CT. Questa funzione non acquisisce i dischi o lo stato della RAM dei guest: a questo serve vzdump. I file di configurazione dei guest (/etc/pve/nodes/<node>/qemu-server/*.conf e lxc/*.conf) vengono invece salvati. Dopo il ripristino ricompare l’inventario e i dischi possono essere ripristinati o ricollegati da un backup esistente su PBS o in locale.", + "Non è un’operazione sull’intero cluster. Ogni nodo salva il proprio backup. L’appartenenza al cluster è inclusa in /etc/pve, così un nodo ripristinato può esservi reintegrato; il ripristino di tutto il cluster richiede però il coordinamento dei singoli nodi.", + "Non è un’immagine completa del disco. Non vengono salvati i binari del kernel, l’initramfs o la partizione di avvio. Durante il ripristino ProxMenux usa i file di avvio dell’host di destinazione, rigenerati automaticamente da update-initramfs e dallo strumento del bootloader, e installa i driver compatibili con il kernel in esecuzione sulla destinazione." + ] + }, + "threePillars": { + "heading": "I tre pilastri di un backup", + "intro": "Un archivio ProxMenux è strutturato attorno a tre payload autonomi. Il ripristino li utilizza tutti e tre insieme per riprodurre l'host di origine su una destinazione che potrebbe non avere nemmeno lo stesso kernel installato.", + "diagramCaption": "Ogni backup spedisce gli stessi tre payload indipendentemente dalla destinazione. Il ripristino utilizza tutti e tre: rootfs per depositare i file, manifest per rilevare deviazioni e differenze tra kernel e inventario delle applicazioni per reinstallare pacchetti e componenti sul kernel della destinazione.", + "pillar1Label": "Filesystem", + "pillar1Detail": "rootfs/\n(rsync di /etc,\n/etc/systemd/network,\n/root, più uno\nsnapshot sqlite3\ndi /var/lib/pve-cluster,\n+ percorsi opzionali)", + "pillar2Label": "Manifesto", + "pillar2Detail": "manifest.json\n(hardware, parametri\ndel kernel, rete,\nZFS, utenti, cron,\npool ZFS, archiviazione)", + "pillar3Label": "Applicazioni", + "pillar3Detail": "packages.manual.list\n+ components_status.json\n(pacchetti APT manuali + programmi\ndi installazione ProxMenux con versioni)" + }, + "restoreIsUniversal": { + "heading": "Il ripristino riproduce l'host di origine, non l'archivio", + "body": "Il ripristino di un backup ProxMenux non si limita ad estrarre il filesystem. Il flusso di ripristino legge il manifest per rilevare la deviazione tra l'origine e la destinazione (differenze hardware, rinomina della scheda NIC, versione del kernel, identità del pool ZFS), riproduce il file system, quindi attiva il programma di installazione del componente corretto per ogni servizio installato sull'origine (driver NVIDIA, Coral TPU, strumenti GPU AMD, strumenti Intel GPU). Ogni programma di installazione viene eseguito sul kernel corrente della destinazione, quindi l'host ripristinato non dipende dalla presenza del kernel di origine. Quando il kernel della destinazione è più recente di quello del backup, un passaggio di idratazione indipendente dal kernel unisce l'ottimizzazione dell'utente (token IOMMU, ID dispositivo VFIO, quirk personalizzati, chiavi GRUB) nella nuova configurazione di avvio della destinazione senza copiare testualmente i file legati al kernel." + }, + "twoInterfaces": { + "heading": "Due interfacce, un backend", + "intro": "Ogni fase del flusso di lavoro di backup e ripristino è disponibile da due punti di ingresso. Entrambi chiamano la stessa libreria di shell, producono archivi identici e leggono lo stesso registro dei lavori.", + "cliLabel": "ProxMenux Scripts (TUI)", + "cliDetail": "menu → Utilità →\nBackup/Ripristino dell'host\n\nFlusso basato su dialoghi,\nSSH-friendly, scriptabile\nper uso non presidiato.", + "webLabel": "ProxMenux Monitor (Web UI)", + "webDetail": "Scheda Backups\nnell’interfaccia web di Monitor.\n\nRipristino con un clic, log\nin tempo reale, integrazione con\nle notifiche e il visualizzatore\ndelle differenze di rollback." + }, + "whereNext": { + "heading": "Dove andare da qui", + "intro": "Ogni sottosezione seguente copre in modo approfondito un aspetto del flusso di lavoro. Inizia con Come funziona se l'obiettivo è capire cosa contiene l'archivio e perché. Vai a Destinazioni per configurare la destinazione per la copia. Leggi Ripristino e Ripristino cross-kernel per la parte di ripristino.", + "items": [ + { + "label": "Come funziona", + "href": "/docs/backup-restore/how-it-works", + "tail": "— i tre payload (rootfs, manifest, applicazioni) in dettaglio, con i raccoglitori che li producono e il formato di ciascun file." + }, + { + "label": "Destinazioni", + "href": "/docs/backup-restore/destinations", + "tail": " — confronto tra locale, Proxmox Backup Server (consigliato) e Borg e come configurarli." + }, + { + "label": "Creazione di backup", + "href": "/docs/backup-restore/creating-backups", + "tail": " — backup una tantum, profilo di percorso predefinito, aggiunta di percorsi personalizzati, crittografia per PBS." + }, + { + "label": "Lavori pianificati", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " — nuovi lavori rispetto al collegamento a un lavoro vzdump PVE esistente, formati di pianificazione, finestra dei dettagli del lavoro." + }, + { + "label": "Ripristino", + "href": "/docs/backup-restore/restoring", + "tail": " — le tre azioni su un archivio (visualizzazione, download, ripristino), ripristino completo e personalizzato, il dispatcher post-avvio e perché gli ultimi dieci minuti sono importanti." + }, + { + "label": "Ripristino tra kernel", + "href": "/docs/backup-restore/cross-kernel", + "tail": " — comportamento che tiene conto della direzione del cambio di versione quando il kernel di destinazione è diverso da quello del backup, filtro del sottoinsieme sicuro e quattro fasi di idratazione." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/restoring.json b/web/messages/it/docs/backup-restore/restoring.json new file mode 100644 index 00000000..d75549b1 --- /dev/null +++ b/web/messages/it/docs/backup-restore/restoring.json @@ -0,0 +1,282 @@ +{ + "meta": { + "title": "Ripristino di un backup — flussi completi e personalizzati | ProxMenux", + "description": "Il flusso di lavoro completo di ripristino. Documenta le tre azioni disponibili su qualsiasi backup (visualizzazione, download, ripristino), il controllo di compatibilità e i suoi risultati, le modalità di ripristino completo e personalizzato, la classificazione del percorso che decide cosa si applica dal vivo e cosa aspetta per il prossimo avvio, il dispacciatore di avvio, e il passaggio di reinstallazione del componente post-boot.", + "ogTitle": "ProxMenux Backup — ripristino", + "ogDescription": "Flussi di ripristino completi e personalizzati con il controllo di compatibilità, la classificazione del percorso, il dispacciatore on-boot e la reinstallazione post-boot.", + "twitterTitle": "Ripristino di un backup | ProxMenux", + "twitterDescription": "Come un backup host ProxMenux viene trasformato in un host Proxmox funzionante." + }, + "header": { + "title": "Ripristino di un backup", + "description": "L’intero ripristino, dalla scelta dell’archivio a un host operativo: controllo della compatibilità, due modalità di ripristino, elaborazione all’avvio e reinstallazione dei componenti dopo l’avvio, con i meccanismi per ripristinare su host e kernel diversi.", + "section": "Backup e ripristino" + }, + "intro": { + "title": "Il ripristino riproduce la fonte, non solo i file", + "body": "Ripristinare un backup ProxMenux richiede più della semplice estrazione. Prima delle modifiche, il manifesto rileva le differenze tra origine e destinazione, vengono esclusi i percorsi che potrebbero impedire l’avvio e adattate le impostazioni dell’utente non copiabili alla lettera. Dopo il riavvio necessario, viene tentata la reinstallazione dei componenti supportati registrati (driver NVIDIA, Coral TPU, strumenti GPU) per il kernel attivo della destinazione. Un solo archivio guida controllo della compatibilità, classificazione dei percorsi e operazioni all’avvio e successive. Verifica risultati dei componenti e log per confermare l’esito." + }, + "threeActions": { + "heading": "Tre azioni su un backup", + "intro": "Selezionando un backup dall'elenco si apre un menu con tre azioni.", + "actionRows": [ + { + "action": "Vista", + "detail": "Consente di visualizzare in sola lettura l'archivio: contenuti manifest.json (nome host sorgente, versione PVE, kernel, hardware, componenti installati), l'elenco dei percorsi all'interno di rootfs/ e un diff di ciò che cambierebbe sull'host corrente se il backup fosse applicato." + }, + { + "action": "Scarica", + "detail": "Esporta l'archivio come file portatile .tar.zst (tar compresso con zstd). Può essere estratto su qualsiasi sistema Linux con tar --zstd -xf FILE.tar.zst, o su macOS/Windows con qualsiasi strumento che supporta zstd (7-Zip, PeaZip, Keka...). L'albero estratto contiene manifest.json, metadata/ e rootfs/ — esattamente lo stesso layout che il ripristino consuma. Utile per l'ispezione offline o per il ripristino su un host senza accesso alla destinazione originale (PBS, Borg)." + }, + { + "action": "Ripristina", + "detail": "Il percorso di scrittura. Estrae l'archivio in una directory di staging, esegue il controllo di compatibilità e presenta il raccoglitore di modalità (Full o Custom)." + } + ] + }, + "compatibilityCheck": { + "heading": "Il controllo della compatibilità", + "intro": "Prima che qualsiasi file sia scritto, hb_compat_check confronta lo stato descritto nel manifesto contro l'host di destinazione. Il controllo viene eseguito in sola lettura e produce quattro uscite indipendenti che guidano il resto del ripristino.", + "outputRows": [ + { + "output": "Indicatore della direzione", + "detail": "HB_COMPAT_KERNEL_DIRECTION vale same, bk_newer o bk_older in base al confronto delle versioni principali del kernel del backup e della destinazione. Guida il filtro dei percorsi compatibili, attivo solo per bk_older, e l’adattamento delle impostazioni descritto nella pagina sul ripristino tra kernel diversi." + }, + { + "output": "Elenco dei percorsi Skip-paths", + "detail": "RS_SKIP_PATHS — ogni percorso che il ripristino non deve applicarsi. Populate da due meccanismi: deriva dell'hardware (mancando NIC, ID di archiviazione mancante, straniero ZFS pool) e — quando la direzione è bk_older — l'elenco dei percorsi non sicuri per il cross-kernel." + }, + { + "output": "Piano di rimappatura delle schede di rete", + "detail": "Quando un NIC sul bersaglio ha lo stesso MAC come uno sulla fonte ma un nome diverso (tipico dopo uno scambio di schede madri), il controllo di compatibilità registra un piano di rinomina (HB_NIC_REMAP) che riscriverà /etc/network/interfaces durante il ripristino." + }, + { + "output": "Piano di rollback", + "detail": "Calcolato da compute_rollback_plan.sh. Elenca VM, LXC e componenti presenti sulla destinazione ma assenti dal backup. La conferma offre la rimozione facoltativa dei guest aggiuntivi prima del riavvio. I componenti vanno rimossi manualmente e l’eliminazione dei guest può fallire: non è garantita una corrispondenza esatta." + } + ], + "reportBody": "Il controllo emette anche un rapporto strutturato (HB_COMPAT_RESULTS) classificato come PASS / INFO / WARN / FAIL. Le voci WARN e FAIL sono di superficie nel pannello pre-restore; il ripristino si rifiuta di procedere solo quando un FAIL è presente che l'utente non può risolvere facendo clic su Continua." + }, + "twoModes": { + "heading": "Ripristino completo vs ripristino personalizzato", + "intro": "Dopo il controllo della compatibilità compare la scelta della modalità. Determina cosa applicare e non come: entrambe usano lo stesso processo.", + "modeRows": [ + { + "mode": "Ripristino completo", + "detail": "Applica ogni percorso dell'archivio che sopravvive alla deriva e ai filtri cross-kernel. Esegue anche il pacchetto di installazione e il componente auto-reinstall pass. Questa è la scelta predefinita e raccomandata — l'obiettivo è quello di riprodurre la fonte, non selezionare i pezzi." + }, + { + "mode": "Ripristino personalizzato", + "detail": "Apre una lista di controllo che mostra ogni percorso che l'archivio porta. L'utente segna un sottoinsieme. I percorsi bloccati dal filtro cross-kernel appaiono grigiati e non possono essere selezionati. L'installazione del pacchetto e la reinstallazione automatica del componente sono saltati per impostazione predefinita in modalità personalizzata — l'utente sta segnalando che vogliono applicazione parziale, non una riproduzione completa." + } + ] + }, + "pathClassification": { + "heading": "Come si classificano i percorsi", + "intro": "Ogni percorso selezionato per il ripristino è classificato da hb_classify_path in una delle tre categorie. La categoria determina quando il percorso viene applicato al sistema e perché.", + "rows": [ + { + "class": "hot", + "detail": "Percorsi applicati immediatamente al sistema di esecuzione. Il servizio che li consuma raccoglie il cambiamento da solo o al successivo ricarico — nessun riavvio richiesto. Queste sono la maggior parte di un backup: /etc/ssh, /etc/apt, /etc/cron.*, /root, /usr/local/bin, file di configurazione di servizio generale, ecc." + }, + { + "class": "reboot", + "detail": "Percorsi rimandati al prossimo avvio anziché applicati immediatamente da questo processo. Riguardano la configurazione di avvio: la generazione del bootloader legge /etc/default/grub, i montaggi usano /etc/fstab e il caricamento dei moduli usa /etc/modules. I file differiti vengono applicati dopo il riavvio, poi vengono rigenerati gli elementi di avvio necessari. Esempi: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + }, + { + "class": "dangerous", + "detail": "Percorsi che sono NON applicati sul sistema in esecuzione — una scrittura in diretta potrebbe corrompere o rilasciare la connessione attiva. Questi sono messi in scena nel set in sospeso e scritti dal dispacciatore post-boot dopo il riavvio, quando il cluster è in funzione, ma il sistema non è ancora completamente in uso. Esempi: /etc/pve (pmxcfs è un montaggio FUSE con la configurazione attiva del cluster), /var/lib/pve-cluster (dati live cluster), /etc/network (potrebbe riconfigurare l'interfaccia stessa che l'utente è collegato su oltre SSH e rilasciare la sessione)." + } + ] + }, + "fullFlow": { + "heading": "Il flusso di lavoro di ripristino completo", + "intro": "La pipeline completa dalla selezione di archivi a un host restaurato funzionante. Ogni fase alimenta il successivo; lo stato scritto da fasi precedenti è consumato da quelli successivi.", + "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" + }, + "pendingMachinery": { + "heading": "Il meccanismo di ripristino differito", + "intro": "I percorsi classificati come reboot o dangerous, e le scritture di idratazione, sono in scena per il prossimo avvio invece di essere applicati in diretta. Questo viene fatto attraverso un piccolo set autocontenuto di file sotto /var/lib/proxmenux/pending-restore/:", + "rows": [ + { + "file": "apply-on-boot.list", + "content": "Un percorso relativo per linea — l'esatto insieme di percorsi apply_pending_restore.sh si applicherà dai rootfs in fase. Leggere questo file dice all'utente esattamente ciò che cambierà sul boot successivo." + }, + { + "file": "plan.env", + "content": "Variabili d’ambiente caricate dallo script di avvio: ID del ripristino, indicatori di compatibilità (HB_COMPAT_CROSS_VERSION, HB_COMPAT_KERNEL_DIRECTION, HB_HYDRATION_APPLIED), consenso al rollback e opzioni del cluster." + }, + { + "file": "rs-skip-paths.txt", + "content": "La lista finale RS_SKIP_PATHS, salvata affinché apply_pending_restore.sh mantenga dopo il riavvio le esclusioni calcolate nella fase interattiva. Impedisce di ripristinare all’avvio percorsi incompatibili con l’hardware o il kernel." + }, + { + "file": "rootfs/", + "content": "I file in scena stessi — i byte esatti che saranno stabiliti. Tenuto sullo stesso filesystem di / così il rsync on-boot è veloce e non dipende dallo storage esterno ancora raggiungibile al boot." + } + ], + "unitBody": "L’unità systemd proxmenux-restore-onboot.service viene abilitata alla fine della fase interattiva. Il servizio viene eseguito una sola volta, all’inizio del prossimo avvio, richiama apply_pending_restore.sh e poi si disabilita. La condizione ConditionPathExists=/var/lib/proxmenux/pending-restore/state evita l’esecuzione quando non esiste un ripristino in sospeso." + }, + "postbootDispatcher": { + "heading": "Il processo dopo l’avvio — apply_cluster_postboot.sh", + "intro": "Dove finisce il passo interattivo e dove avviene la riproduzione reale dell'ospite. apply_cluster_postboot.sh è installato come una seconda unità systemd (proxmenux-apply-cluster-postboot.service) la cui destinazione After=/Wants= assicura che funzioni solo dopo l'apertura di pve-cluster e network-online. Questo è dove le azioni di ripristino visibile dell'ospite atterrare.", + "tasks": [ + { + "task": "Applicare /etc/pve", + "detail": "/etc/pve è un live pmxcfs FUSE mount — non può essere scritto su avvio precoce. Il dispacciatore copia i file dai rootf in sospeso al live /etc/pve una volta che il filesystem del cluster è in funzione, un file alla volta, senza riavviare pve-cluster. Il /var/lib/pve-cluster/config.db catturato dal backup (o il config.db.raw-fallback) promosso è materializzato con il systemctl stop pve-cluster → copia di file atomico → modello systemctl start pve-cluster, quindi pmxcfs rilegge lo stato ripristinato sulla via del ritorno." + }, + { + "task": "Ricostruire initramfs e bootloader", + "detail": "Esegue update-initramfs -u -k all per tutti i kernel installati, poi update-grub per GRUB oppure proxmox-boot-tool refresh per systemd-boot/ZFS. Il passaggio viene saltato se la fase interattiva ha rilevato che nessun percorso pertinente è cambiato." + }, + { + "task": "Reinstallazione automatica dei componenti", + "detail": "Legge components_status.json ripristinato e scorre gli installatori supportati (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Ogni installatore selezionato usa --auto-reinstall, legge lo stato registrato e reinstalla per l’ambiente di destinazione, ricompilando i moduli se necessario. Attende il riavvio per usare il kernel allora attivo. Gli errori individuali vengono registrati senza fermare il componente successivo." + }, + { + "task": "Controllo preliminare dell'avvio", + "detail": "Prima di eseguire la notifica di completamento, verifica che proxmox-boot-tool status mostra un ESP configurato, ogni /boot/vmlinuz-* ha una directory corrispondente /lib/modules/<ver> e risolve /vmlinuz. Qualsiasi incoerenza viene visualizzata nella notifica invece di essere nascosta." + }, + { + "task": "Notifica di completamento", + "detail": "Invia l'evento Host restore finished tramite hb_notify_lifecycle. Include la durata totale, il conteggio del percorso applicato, le avvertenze di controllo della sanità se presenti, e un collegamento al registro a /var/log/proxmenux/proxmenux-cluster-postboot-*.log. Se le notifiche non sono configurate, l'evento è silenzioso — il registro registra tutto." + } + ] + }, + "liveProgress": { + "heading": "Avanzamento in tempo reale nella scheda Backup del Monitor", + "body": "Dopo il riavvio, la scheda Backup di ProxMenux Monitor mostra l’avanzamento di proxmenux-apply-cluster-postboot.service. Legge /var/lib/proxmenux/restore-state.json, aggiornato a ogni fase: configurazione del cluster, initramfs, bootloader, reinstallazione di ciascun componente, verifica dell’avvio e conclusione.", + "fields": [ + { + "name": "Indicatore di stato", + "detail": "Uno degli stati Ripristino in corso, Ripristino completato o Ripristino non riuscito. La scheda legge lo stato ogni 2 secondi durante l’esecuzione e ogni 30 secondi dopo la fine." + }, + { + "name": "Barra di avanzamento e contatore dei passaggi", + "detail": "Mostra N/M steps e il nome della fase corrente. Durante il ripristino, il tempo stimato viene calcolato dai passaggi completati e dal tempo trascorso." + }, + { + "name": "Elenco dei componenti", + "detail": "Viene reinstallata una riga per driver (NVIDIA, strumenti Intel GPU, strumenti AMD, Coral TPU) con installing / ok / failed più un collegamento al log per-component a /var/log/proxmenux/component-*.log." + }, + { + "name": "Importazione dei pool di dati", + "detail": "Il blocco data_pools_import mostra cinque righe colorate: Importati, Forzati (con -f per un hostid estraneo), Saltati, dischi parziali (solo alcuni dischi presenti), Saltati, dischi assenti (nessun disco presente) ed Errori. Lo stato è salvato in /var/lib/proxmenux/restore-state.json e il log completo dell’esecuzione in /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "name": "Avvisi controllo avvio", + "detail": "Il processo controlla le directory /lib/modules/<kernel> mancanti, la configurazione ESP assente e i collegamenti simbolici /vmlinuz senza destinazione. Gli avvisi appaiono qui in un riquadro colorato." + }, + { + "name": "Delta di rollback", + "detail": "Elenca VM, LXC e componenti che esistono sul bersaglio, ma non sono stati nel backup ripristinato — le stesse voci sono emerse nella finestra di dialogo di rollback distruttivo pre-restore. Ogni riga porta il comando di pulizia manuale." + }, + { + "name": "coda di log", + "detail": "Le ultime linee 600 di proxmenux-cluster-postboot-<ts>.log, con un filtro Solo problemi che mantiene solo le linee corrispondenti a error, warning, failed, ✗ o traceback." + } + ], + "dismissBody": "Quando il ripristino è completato o non riuscito, il pulsante Nascondi chiude la scheda. Il file di stato resta disponibile e Cronologia riapre questo ripristino e quelli precedenti. Le ultime 20 esecuzioni sono archiviate in /var/lib/proxmenux/restore-history/.", + "imageAlt": "Finestra Dettagli del ripristino in ProxMenux Monitor durante l’esecuzione: indicatore blu, fase Ricostruzione initramfs, tempo residuo stimato, barra parzialmente piena e ultime righe del log in tempo reale.", + "imageCaption": "Finestra Dettagli mentre il processo dopo l’avvio è ancora attivo: stato, fase corrente, tempo residuo e ultime righe del log in tempo reale.", + "detailsImageAlt": "La stessa finestra Dettagli al termine del ripristino, con indicatore verde Ripristino completato, durata totale 0m53s, barra piena 6/6, sezione delle differenze di rollback vuota e log dopo l’avvio archiviato.", + "detailsImageCaption": "Lo stesso modale una volta che l’esecuzione è terminata — il distintivo, la durata totale, la barra di avanzamento riempita e il registro postboot archiviato." + }, + "postbootExample": { + "heading": "Che aspetto ha il post-boot sulla console", + "body": "Sulla console fisica, un processo terminato correttamente mostra [ OK ] Finished proxmenux-apply-cluster-postboot.service, spesso vicino agli OK di multi-user.target e graphical.target. La riga indica la fine del processo. Possono comunque essere stati registrati errori di singoli componenti o avvisi di avvio: verifica stati e log nel Monitor prima di considerare l’host completamente ripristinato.", + "imageAlt": "Console fisica Proxmox con '[ OK ] Finished proxmenux-apply-cluster-postboot.service - ProxMenux Apply Cluster Configs (post-boot).', seguito da OK per multi-user.target e graphical.target e dal prompt di accesso in alto.", + "imageCaption": "Console fisica al termine del processo. 'Finished proxmenux-apply-cluster-postboot.service' ne indica la conclusione, segnalata anche da 'Host restore finished' nel Monitor. Occorre comunque verificare risultati dei componenti e avvisi." + }, + "tenMinutes": { + "heading": "Perché gli ultimi dieci minuti sono importanti", + "intro": "Il riavvio stesso richiede secondi, ma il processo dopo l’avvio passa circa dieci minuti terminando il ripristino. Durante questa finestra l'host è raggiungibile e funziona di login, ma alcuni servizi (principalmente GPU-driver-dipendenti) non sono ancora disponibili. Ripartizione del tempo per un tipico host Proxmox con NVIDIA + Coral installato:", + "rows": [ + { + "stage": "Boot + pve-cluster pronto", + "time": "~30 s", + "detail": "Avvio standard di Proxmox. SSH, interfaccia web e accesso sono disponibili al termine della fase." + }, + { + "stage": "Applicare /etc/pve a PMxcfs", + "time": "~10 s", + "detail": "Veloce — piccoli file di configurazione copiati uno per uno al filesystem live cluster." + }, + { + "stage": "Ricostruire initramfs attraverso i kernel", + "time": "3–5 min", + "detail": "update-initramfs -u -k all ricostruisce un'immagine initramfs per kernel installato. La maggior parte dell’attesa." + }, + { + "stage": "Ricostruisci la configurazione del bootloader", + "time": "10–30 s", + "detail": "update-grub o proxmox-boot-tool refresh. Veloce anche su ZFS." + }, + { + "stage": "Reinstallazione del driver NVIDIA (se applicabile)", + "time": "5–10 min", + "detail": "Scarica la versione del driver registrato, compila i moduli DKMS contro il kernel corrente, applica la patch ProxMenux se la sorgente lo avesse. Il compito più lungo." + }, + { + "stage": "Reinstallazione di Coral e degli altri componenti", + "time": "3–5 min", + "detail": "Compilazioni DKMS per Coral, apt install per intel-gpu-tools, .deb download + install per amdgpu_top." + }, + { + "stage": "Controllo di sicurezza + notifica", + "time": "~2 s", + "detail": "Richiede poche risorse. La notifica informa l’utente appena l’esecuzione termina." + } + ], + "outroBody": "In questo intervallo possono mancare strumenti dopo l’accesso (nvidia-smi non trovato, coral non rilevato), perché la reinstallazione continua in background. La notifica segna la fine del processo: controlla risultati dei componenti, avvisi e log per distinguere successi ed errori individuali." + }, + "destructiveRollback": { + "heading": "Il rollback distruttivo opzionale", + "body": "Il ripristino è additivo per impostazione predefinita: VM, LXC e componenti aggiuntivi restano presenti. In caso di differenze, il dialogo offre Eseguire il rollback distruttivo?, con No predefinito. Accettare richiama _rs_execute_rollback prima del riavvio per tentare di eliminare le VM e gli LXC aggiuntivi elencati. I componenti vengono segnalati per la disinstallazione manuale, perché quella automatica non è implementata. Gli errori di eliminazione vengono riportati e il processo continua: non è garantita una corrispondenza esatta. Verifica nomi e VMID/CTID prima di questa scelta distruttiva." + }, + "logs": { + "heading": "Dove vivono i registri", + "rows": [ + { + "log": "/var/log/proxmenux/restore-YYYYMMDD_HHMMSS.log", + "detail": "Scritto nella fase interattiva: risultati di compatibilità, filtro delle differenze, piano di adattamento, output dell’applicazione diretta e della preparazione differita, installazione dei pacchetti." + }, + { + "log": "/var/log/proxmenux/apply-pending-YYYYMMDD_HHMMSS.log", + "detail": "Scritto da apply_pending_restore.sh all’inizio dell’avvio: caricamento di plan.env, elaborazione di apply-on-boot e filtro dei percorsi esclusi." + }, + { + "log": "/var/log/proxmenux/proxmenux-cluster-postboot-YYYYMMDD_HHMMSS.log", + "detail": "Scritto da apply_cluster_postboot.sh: applicazione della configurazione pve-cluster, output di initramfs e bootloader, output degli installatori dei componenti, verifica dell’avvio e contenuto della notifica." + }, + { + "log": "/var/log/proxmenux/component--YYYYMMDD_HHMMSS.log", + "detail": "Un log per componente installer (nvidia, coral, ecc.) che ha eseguito nel passaggio post-boot. Utile quando la reinstallazione di un componente specifico è fallita e l'utente ha bisogno dell'output dello strumento." + }, + { + "log": "/var/log/proxmenux/restore-datapools-YYYYMMDD_HHMMSS.log", + "detail": "Scritto da _rs_import_data_pools. Contiene: enumerazione di non-root pools dal manifesto, per-pool esito (importato in modo pulito, importato con -f per hostid straniero, saltato a causa di dischi mancanti, o fallito), e l'uscita grezza di ogni zpool import Chiama." + } + ] + }, + "whereNext": { + "heading": "Dove andare dopo", + "items": [ + { + "label": "Ripristino tra kernel diversi", + "href": "/docs/backup-restore/cross-kernel", + "tail": "— il filtro safe-subset direzionale e il passaggio di idratazione invocato quando il kernel di destinazione differisce dal backup." + }, + { + "label": "Come funziona", + "href": "/docs/backup-restore/how-it-works", + "tail": "— il layout dell'archivio, l'inventario manifesto e dell'applicazione che il ripristino consuma." + }, + { + "label": "Lavori programmati", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " — il processo automatico che produce gli archivi usati da questo ripristino." + } + ] + } +} diff --git a/web/messages/it/docs/backup-restore/scheduled-jobs.json b/web/messages/it/docs/backup-restore/scheduled-jobs.json new file mode 100644 index 00000000..6a851dc3 --- /dev/null +++ b/web/messages/it/docs/backup-restore/scheduled-jobs.json @@ -0,0 +1,152 @@ +{ + "meta": { + "title": "Attività pianificate — timer, modalità di collegamento, conservazione | ProxMenux", + "description": "Attività pianificate di backup dell’host ProxMenux. Due modalità di creazione (timer systemd dedicato o collegamento a un’attività vzdump PVE esistente), regole di conservazione applicate per attività tramite proxmox-backup-client, Borg o pulizia locale, file in /var/lib/proxmenux/backup-jobs e script di esecuzione che produce gli stessi archivi del flusso interattivo.", + "ogTitle": "ProxMenux Backup — lavori programmati", + "ogDescription": "Backup host programmati non presidiati con modalità di aggancio, ritenzione e le stesse tre destinazioni del flusso interattivo.", + "twitterTitle": "Lavori programmati | ProxMenux", + "twitterDescription": "Attività pianificate di backup dell’host senza intervento, con modalità di collegamento e conservazione." + }, + "header": { + "title": "Lavori programmati", + "description": "Lavori di backup incustoditi. Due modelli di creazione: un nuovo lavoro indipendente con il proprio programma, o un lavoro collegato ad un'attività PVE vzdump esistente che eredita il programma e la ritenzione di tale attività. Entrambi producono archivi identici al flusso interattivo.", + "section": "Backup e ripristino" + }, + "intro": { + "title": "I due modelli di lavoro programmati", + "body": "Un lavoro programmato può essere creato seguendo uno dei due modelli:", + "modelsList": [ + "Nuovo lavoro indipendente — ProxMenux definisce il programma di lavoro stesso con il proprio timer systemd, indipendente da qualsiasi altra attività sull'host. Compatibile con tutte e tre le destinazioni: Locale, PBS e Borg.", + "Collega a un’attività vzdump PVE esistente — l’attività non ha una pianificazione propria; viene eseguita automaticamente quando si attiva l’attività vzdump PVE principale che già esegue il backup di VM e LXC sull’host. Ne eredita pianificazione e conservazione. Compatibile con Locale e PBS (Borg non è supportato perché PVE non ha un pianificatore nativo per Borg)." + ] + }, + "attachBadge": { + "title": "Modalità di aggancio — consigliato quando esiste già un compito PVE vzdump", + "body": "Se esiste già un’attività vzdump PVE per VM e LXC del nodo, collegare il backup dell’host lo fa eseguire dopo il backup dei guest, nello stesso ciclo di backup. Nel ripristino, le configurazioni dei guest provengono dal backup dell’host (in /etc/pve) e i dischi dai backup vzdump dello stesso ciclo. Questo aiuta a coordinare il recupero dell’intero nodo, ma non è uno snapshot atomico: modifiche durante il ciclo possono lasciare differenze tra configurazione dell’host e stato dei dischi dei guest." + }, + "frequencyBadge": { + "title": "Frequenza raccomandata", + "body": "Per massimizzare la compatibilità tra backup dell’host e ripristino futuro, esegui backup frequenti. Più la copia è vicina allo stato attuale dell’host, meno differenze di configurazione, pacchetti e componenti dovrà riconciliare il ripristino." + }, + "modes": { + "heading": "Le due modalità", + "rows": [ + { + "mode": "Nuova attività pianificata", + "backends": "Locale, PBS, Borg", + "schedule": "Espressione OnCalendar propria (sintassi del calendario systemd, ad esempio daily o Mon..Fri 03:00).", + "retention": "Richiesti separatamente: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. Applicato dallo script di esecuzione dopo ogni backup di successo." + }, + { + "mode": "Attaccare a un lavoro PVE vzdump", + "backends": "Locale, PBS (Borg non ha pianificatore lato PVE)", + "schedule": "Ereditata dall’attività PVE principale. Non viene installato alcun timer systemd sul lato ProxMenux.", + "retention": "Ereditata dalla configurazione prune-backups dell’attività principale (mappata uno a uno alle variabili KEEP_* dello script di esecuzione tramite hb_pve_prune_to_keep_env)." + } + ] + }, + "attachDetail": { + "heading": "Come funziona la modalità di collegamento", + "intro": "PVE scrive le attività vzdump in /etc/pve/jobs.cfg, con una sezione per attività che indica lo storage dei backup VM e LXC. La modalità di collegamento richiede un backend supportato da ProxMenux (Locale o PBS). Il backup dell’host parte dall’hook job-end dopo il completamento dell’attività di backup dei guest.", + "steps": [ + { + "step": "1", + "detail": "Durante la creazione dell’attività, ProxMenux elenca le attività PVE genitoriali compatibili tramite hb_pve_list_vzdump_jobs_for_backend. L'utente ne sceglie uno." + }, + { + "step": "2", + "detail": "Il file .env dell’attività è scritto con PVE_PARENT_JOB, PVE_STORAGE e i valori ereditati KEEP_*; non viene creato alcun timer systemd." + }, + { + "step": "3", + "detail": "hb_install_vzdump_hook registra un hook in /etc/vzdump.conf. Nella fase job-end di qualsiasi attività vzdump confronta il $STOREID ricevuto con il PVE_STORAGE di ogni attività collegata e abilitata, avviando lo script di esecuzione per quelle corrispondenti. Il confronto usa lo storage, non l’ID dell’attività principale selezionata." + }, + { + "step": "4", + "detail": "L’archivio viene salvato nello stesso storage dei backup vzdump: path/dump/ per Locale oppure il repository PBS configurato nella voce di storage PVE." + } + ], + "outroBody": "La modalità di collegamento non ha un timer proprio. Disabilitare o eliminare l’attività PVE principale selezionata ferma quel trigger, ma un’altra attività vzdump sullo stesso storage può ancora avviare il backup dell’host. Per impedirlo, disabilita o elimina l’attività ProxMenux stessa. Se disabilitata, la voce resta su disco e può essere riabilitata o ricollegata." + }, + "storageLayout": { + "heading": "File che compongono un lavoro", + "intro": "Ogni lavoro programmato è completamente descritto da tre o quattro file sul disco. Leggerli dà la configurazione completa del lavoro senza fare affidamento sull'interfaccia.", + "rows": [ + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env", + "content": "Backend, ID di backup o destinazione, pianificazione (Nuova modalità) o genitore PVE (Modalità allegato), abilitato flag, ritenzione valori KEEP_*, puntatori di credenziali." + }, + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths", + "content": "Un percorso assoluto per riga: la selezione ricavata dal profilo e fissata alla creazione dell’attività. Modificare il file fa usare la nuova selezione alla successiva attivazione del timer." + }, + { + "path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service", + "content": "Solo modalità nuova attività. Il servizio invoca run_scheduled_backup.sh JOB_ID. Il timer lo programma con Persistent=true (esecuzioni saltate recuperate al prossimo avvio) e un piccolo RandomizedDelaySec=120 per diffondere il carico quando più attività condividono la stessa espressione OnCalendar." + }, + { + "path": "/etc/vzdump.conf script-hook", + "content": "Solo modalità di collegamento. Installato una volta da hb_install_vzdump_hook; confronta PVE_STORAGE di ogni attività collegata con $STOREID, passato da PVE allo script hook." + } + ] + }, + "runner": { + "heading": "Cosa fa un’attività quando si avvia", + "intro": "Ogni lavoro — se nuovo modello o allegato — esegue la stessa sequenza a tre fasi:", + "steps": [ + "Prepara il backup. Legge la configurazione del lavoro (destinazione, profilo, percorsi) e assembla l'albero dell'archivio esattamente come fa il flusso interattivo. Il risultato è lo stesso archivio un backup manuale con quelle impostazioni produrrebbe.", + "Scrivi nella destinazione. Carica o scrive l'archivio alla destinazione configurata — un file .tar.zst locale, un backup PBS o un archivio Borg — utilizzando esattamente gli stessi strumenti e le credenziali che un backup manuale alla stessa destinazione avrebbe utilizzato.", + "Applica la conservazione. Rimuove i vecchi backup dalla destinazione, mantenendo i conti keep-last / keep-daily / keep-weekly configurati sul lavoro. La potatura viene eseguita dalla destinazione stessa: PBS applica la propria ritenzione, Borg esegue borg prune, e per Local ProxMenux elimina i file che cadono fuori dalla finestra keep-last." + ] + }, + "management": { + "heading": "Gestione dei lavori", + "intro": "Il menu scheduler (Script TUI) e la scheda Monitor Backups espongono le stesse azioni su qualsiasi lavoro.", + "rows": [ + { + "action": "Esegui ora", + "detail": "Richiama subito lo script di esecuzione, senza attendere il timer o l’hook vzdump. Utile per verificare la configurazione senza aspettare la prossima esecuzione pianificata." + }, + { + "action": "Attivare / disattivare", + "detail": "Nuova modalità: systemctl enable/disable --now il timer. Modalità di aggancio: cambia il flag ENABLED nel job env — lo script gancio lo onora alla prossima esecuzione PVE." + }, + { + "action": "Modifica", + "detail": "Riapre le richieste di destinazione, pianificazione, profilo e ritenzione e riscrive i file di lavoro. Conserva l'ID del lavoro." + }, + { + "action": "Elimina", + "detail": "Rimuove il job env, il file dei percorsi, il timer + servizio systemd (Nuova modalità), e disabilita il binding del gancio (Modalità allegato). Non tocca archivi già sulla destinazione." + }, + { + "action": "Visualizza log", + "detail": "Mostra in tempo reale /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log: un file di registro per esecuzione. Lo script di esecuzione emette anche una riga di stato compatta a journald sotto il servizio systemd." + } + ] + }, + "notifications": { + "heading": "Notifiche", + "body": "Ogni esecuzione programmata genera gli stessi eventi hb_notify_lifecycle del flusso interattivo (start, complete, fail). Se i canali di notifica sono configurati nel Monitor, i lavori incustoditi mostrano i risultati come fanno i backup manuali — un utente non ha bisogno di controllare il registro per sapere se un lavoro è riuscito." + }, + "whereNext": { + "heading": "Dove andare dopo", + "items": [ + { + "label": "Creazione di backup", + "href": "/docs/backup-restore/creating-backups", + "tail": "— il flusso interattivo che condivide il backend con il pianificatore." + }, + { + "label": "Destinazioni", + "href": "/docs/backup-restore/destinations", + "tail": "— configurazione per-backend utilizzata sia dal flusso interattivo che dal pianificatore." + }, + { + "label": "Ripristino", + "href": "/docs/backup-restore/restoring", + "tail": " — il flusso che utilizza i backup prodotti dalle attività." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/creating-backups.json b/web/messages/pt/docs/backup-restore/creating-backups.json new file mode 100644 index 00000000..99ed48c1 --- /dev/null +++ b/web/messages/pt/docs/backup-restore/creating-backups.json @@ -0,0 +1,220 @@ +{ + "meta": { + "title": "Criação de backups — fluxo de backup interativo ProxMenux", + "description": "O fluxo de backup interativo do ProxMenux: dois pontos de entrada (o menu TUI do Scripts e a interface web do Monitor), três destinos, dois modos de perfil, uma etapa de preparação temporária e uma janela de confirmação. A página descreve a matriz de seis opções, os perfis padrão e personalizado e o que o usuário vê desde a seleção do backup até o arquivo ser salvo no destino.", + "ogTitle": "Backup ProxMenux — criando backups", + "ogDescription": "O fluxo de backup interativo com três destinos, dois perfis e uma etapa comum de preparação temporária.", + "twitterTitle": "Criando backups ProxMenux", + "twitterDescription": "Fluxo de backup interativo com três destinos e dois modos de perfil." + }, + "header": { + "title": "Criando backups", + "description": "O fluxo de backup interativo: escolha um destino e um perfil, confira o resumo de confirmação e acompanhe o salvamento do arquivo. Os dois pontos de entrada compartilham o mesmo backend e produzem arquivos idênticos.", + "section": "Cópias de segurança e restauro" + }, + "intro": { + "title": "Dois pontos de entrada, funcionalidade idêntica", + "body": "A TUI do Scripts e a interface web do Monitor oferecem exatamente as mesmas funções. Cada backup — manual ou agendado — passa pela mesma matriz de escolha (três destinos × dois perfis) e chama a mesma função do backend em cada célula (_bk_pbs, _bk_borg ou _bk_local). Os arquivos produzidos pelos dois pontos de entrada são indistinguíveis. A escolha depende da preferência: a TUI é adequada para SSH e scripts; o Monitor oferece controle por cliques junto às visualizações de notificações e acompanhamento dos logs." + }, + "entryPoints": { + "heading": "Os dois pontos de entrada", + "rows": [ + { + "entry": "ProxMenux Scripts (TUI)", + "path": "menu → Utilities → Host Config Backup", + "detail": "Fluxo baseado em diálogo, SSH-friendly. O menu principal apresenta as seis opções diretamente. Utiliza backup_menu em backup_host.sh." + }, + { + "entry": "ProxMenux Monitor (UI Web)", + "path": "Backups tab → Create backup", + "detail": "Fluxo guiado por um assistente. As mesmas seis opções são apresentadas em um formulário de duas etapas (destino → perfil). As mesmas funções do backend são chamadas pela API Flask." + } + ] + }, + "modes": { + "heading": "Cópias de segurança manuais vs agendadas", + "body": "Os backups podem ser produzidos em dois modos: manual (o fluxo interativo descrito nesta página — o usuário escolhe um destino e um perfil de um menu e acompanha o salvamento do arquivo) ou agendado (um trabalho sem acompanhamento que roda em um temporizador no estilo cron e aplica a retenção configurada no trabalho). Ambos os modos suportam os mesmos três destinos e os mesmos dois perfis, e ambos estão disponíveis em ambos os pontos de entrada — o menu Scripts TUI e a aba Monitor Backups. Trabalhos agendados usam as mesmas funções de infraestrutura que o fluxo manual através do run_scheduled_backup.sh; os arquivos produzidos são indistinguíveis.", + "seeAlso": "A página de trabalhos agendados cobre o fluxo completo, incluindo como criar um trabalho, anexá-lo a um temporizador existente PVE vzdump e configurar os valores de retenção.", + "monitorAlt": "Página de backups do ProxMenux Monitor que mostra a nova janela de backup agendada com os campos de destino, perfil, agenda e retenção.", + "monitorCaption": "Backup agendado — ProxMenux Monitor. A mesma janela do assistente usada para criar um backup manual inclui, na parte inferior, os campos de agendamento e retenção para execução sem acompanhamento." + }, + "matrix": { + "heading": "A matriz de seis opções", + "intro": "A escolha determina tanto o backend executado quanto a estratégia de seleção de caminhos. Consulte as páginas de cada destino para os detalhes de configuração de cada célula.", + "rows": [ + { + "combo": "1", + "destination": "PBS", + "profile": "Padrão", + "action": "Envia o perfil padrão mais extras persistentes para um repositório PBS configurado." + }, + { + "combo": "2", + "destination": "Borg", + "profile": "Padrão", + "action": "Cria um arquivo com o perfil padrão mais extras persistentes no repositório Borg selecionado." + }, + { + "combo": "3", + "destination": "Local", + "profile": "Padrão", + "action": "Escreve um arquivo .tar.zst com o perfil padrão mais extras persistentes para o alvo local configurado." + }, + { + "combo": "4", + "destination": "PBS", + "profile": "Personalizado", + "action": "Abre o seletor de caminhos antes do envio ao PBS; o usuário marca os caminhos e pode adicionar novos." + }, + { + "combo": "5", + "destination": "Borg", + "profile": "Personalizado", + "action": "Abre o seletor de caminhos antes de criar o arquivo Borg." + }, + { + "combo": "6", + "destination": "Local", + "profile": "Personalizado", + "action": "Abre o selecionador de caminho antes de escrever o .tar.zst local." + } + ] + }, + "profiles": { + "heading": "Perfil padrão vs personalizado", + "defaultTitle": "Perfil padrão", + "defaultBody": "O perfil padrão é a lista com curadoria de hb_default_profile_paths (documentada em Como funciona sob Categorias de caminho) além de cada entrada no arquivo de extras persistente /usr/local/share/proxmenux/backup-extra-paths.txt. O usuário confirma as opções de destino e criptografia e o backup prossegue sem mais seleção de caminho.", + "customTitle": "Perfil personalizado", + "customBody": "O perfil personalizado abre uma lista com todos os caminhos do perfil padrão (desmarcados) e todos os extras persistentes (pré-marcados, com o prefixo [+]). O usuário marca os caminhos para esta execução e pode pressionar Adicionar caminho personalizado para incluir um novo caminho absoluto. Todo caminho adicionado durante esse processo é salvo em backup-extra-paths.txt, para que os próximos backups o incluam automaticamente. Desmarcar um extra persistente o exclui apenas desta execução, sem removê-lo do arquivo — a remoção é feita pela ação separada Gerenciar caminhos personalizados, fora do fluxo de backup.", + "customPickerAlt": "Lista de verificação de perfil personalizada que mostra os caminhos de perfil padrão (desmarcados) e extras persistentes (pré-marcados com um prefixo [+]), além de botões para adicionar um novo caminho ou confirmar a seleção.", + "customPickerCaption": "Perfil personalizado — o seletor de caminhos. Os caminhos do perfil padrão estão desmarcados; os extras persistentes aparecem pré-marcados com o prefixo [+]. O usuário marca os caminhos para esta execução.", + "manageCustomAlt": "Menu de gerenciamento de caminhos personalizados com a lista de extras persistentes e opções para adicionar, remover ou editar.", + "manageCustomCaption": "Gerencie caminhos personalizados — o ponto de entrada onde extras persistentes são adicionados ou removidos. Cada caminho listado aqui é incluído automaticamente em backups de modo padrão sem precisar abrir o seletor Personalizado." + }, + "commonPipeline": { + "heading": "O que é executado independentemente do destino", + "intro": "Depois de definir o perfil, cada backend executa o mesmo processo de preparação temporária antes de seguir para seu próprio método de envio. hb_prepare_staging monta a árvore do arquivo em /tmp/proxmenux-DESTINATION-stage.XXXXXX e preenche cada um dos três blocos de dados.", + "steps": [ + { + "step": "1", + "name": "Montagem do rootfs", + "detail": "Executa rsync -a para cada caminho selecionado em staging_root/rootfs/. O banco de dados pmxcfs em /var/lib/pve-cluster/config.db é capturado separadamente via sqlite3 .backup para produzir um instantâneo consistente sem parar o cluster, e os sidecars .db-wal / .db-shm são excluídos do rsync; quando o sqlite3 não está disponível é salvo um arquivo config.db.raw-fallback, que a restauração adota como banco de dados durante a importação. Os subcaminhos voláteis (histórico do bash, caches, lixo) são excluídos do /root/. Caminhos ausentes da fonte são registrados em metadata/missing_paths.txt sem parar o backup." + }, + { + "step": "2", + "name": "Geração do manifesto", + "detail": "build_manifest.sh coordena os seis coletores e grava manifest.json na raiz da área de preparação temporária. Se um coletor falhar, a seção afetada usa um valor padrão vazio documentado; o manifesto continua válido." + }, + { + "step": "3", + "name": "Inventário de pacotes", + "detail": "apt-mark showmanual é capturada literalmente em metadata/packages.manual.list. O estado do componente já está dentro do rootfs restaurado (components_status.json) porque o /usr/local/share/proxmenux/ faz parte do perfil padrão." + }, + { + "step": "4", + "name": "Informações da execução", + "detail": "metadata/run_info.env registra a identidade de execução de backup — hostname, timestamp, versão do kernel — usada pela verificação de compatibilidade da restauração para determinar a direção do cross-kernel." + }, + { + "step": "5", + "name": "Notificação (início)", + "detail": "hb_notify_lifecycle \"start\" é acionado. Se as notificações estiverem configuradas no Monitor, um evento Backup do host iniciado é enviado ao usuário. Nada é enviado se não houver canais configurados." + } + ] + }, + "included": { + "heading": "O que entra e o que fica fora", + "intro": "Cada caminho no perfil resolvido (padrão + extras persistentes + seleção de modo personalizado) é copiado com rsync -aAXH --numeric-ids. Uma lista de exclusão compartilhada aplica-se a cada caminho, e dois diretórios carregam exclusões adicionais específicas do caminho.", + "globalTitle": "Exclusões globais (aplicadas a cada caminho)", + "globalItems": [ + "images/ — dumps de imagens.", + "dump/ — saídas vzdump.", + "tmp/ — ficheiros temporários.", + "*.log — ficheiros de registo." + ], + "rootTitle": "Exclusões /root/", + "rootBody": "/root/ faz parte do perfil padrão para incluir os scripts e a configuração do usuário no arquivo. Os subcaminhos voláteis são excluídos:", + "rootItems": [ + ".bash_history", + ".cache/", + "tmp/", + ".local/share/Trash/" + ], + "proxmenuxTitle": "Exclusões /usr/local/share/proxmenux/", + "proxmenuxBody": "Este diretório envia apenas o estado do usuário — components_status.json, preferências, cache pós-instalação. O código que o destino já terá a partir de sua própria instalação ProxMenux está excluído para que uma restauração não sobrescreva os binários atuais do alvo com os mais antigos:", + "proxmenuxItems": [ + "restore-pending/, scripts/, web/", + "monitor-app/, monitor-app.*/, AppImage/", + "images/, json/", + "utils.sh, helpers_cache.json", + "ProxMenux-Monitor.AppImage*, install_proxmenux*.sh" + ], + "notInProfileTitle": "Caminhos fora do perfil", + "notInProfileBody": "Qualquer coisa não listada no hb_default_profile_paths e não adicionada como um extra personalizado ou persistente não faz parte do backup. Exemplos notáveis:", + "notInProfileItems": [ + "Discos de VMs e LXC — manipulado por vzdump, não por esta característica. Os arquivos de configuração de hóspedes sob /etc/pve/nodes/*/qemu-server/*.conf e lxc/*.conf são capturados (eles vivem sob /etc/pve) para que a restauração reproduza o inventário; os próprios discos são re-anexados a partir de um backup existente vzdump/PBS.", + "/boot e /boot/efi — binários do kernel, initramfs e a partição UEFI ESP são regeneradas pelo próprio alvo update-initramfs, update-grub ou proxmox-boot-tool refresh após a restauração. O carregador de arranque nunca é copiado na íntegra.", + "Sistemas de arquivos de tempo de execução e sistema — /proc, /sys, /dev e /run são pseudo-sistemas de arquivos produzidos pelo kernel e udev; eles não são persistidos em nenhum lugar.", + "Binários dos pacotes em /usr/bin, /usr/lib, /lib, /sbin — reinstalados pelo APT do destino a partir de packages.manual.list.", + "/var/log/, /var/tmp/, /var/cache/ — estado de execução por host, não restaurado.", + "/home/USER — não no perfil padrão. Adicione-o como um caminho personalizado quando um sistema carrega diretórios domésticos do usuário que devem sobreviver a uma restauração." + ], + "customPathsTitle": "Como os caminhos personalizados são tratados", + "customPathsBody": "Um caminho personalizado adicionado inline em modo Personalizado ou persistido em backup-extra-paths.txt passa pelo mesmo pipeline rsync como caminhos de perfil padrão. Exclusões globais aplicam-se. Se o caminho personalizado estiver sob /root/ ou /usr/local/share/proxmenux/, as exclusões específicas do caminho acima ainda se aplicam. Cada caminho arquivado — padrão ou personalizado — é gravado em metadata/paths_archived.txt. Caminhos que não existem na fonte são gravados em metadata/missing_paths.txt sem parar o backup." + }, + "archiveStructure": { + "heading": "Estrutura do arquivo", + "intro": "O diretório de preparação temporária produzido por cada infraestrutura segue o mesmo layout, independentemente do destino. O tarball, PBS .pxar ou arquivo Borg armazena esta árvore sem alterações.", + "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│ ├── paths_archived.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": "Resumo da confirmação", + "body": "Antes da infra- estrutura escrever qualquer coisa para o destino, o ProxMenux mostra uma janela sumária com o nome do destino, ID de backup ou arquivo, estado de criptografia e a lista de caminhos copiados. Cancelar aqui aborta o backup de forma limpa — o diretório de preparação temporária é removido pelo gancho trap definido na função de infraestrutura e nenhum dado parcial atinge o destino." + }, + "writing": { + "heading": "Gravando para o destino", + "intro": "Após a confirmação, cada backend executa sua própria etapa de gravação. As páginas dos destinos descrevem o funcionamento; os elementos comuns são o log, o arquivo auxiliar e a notificação de conclusão.", + "rows": [ + { + "topic": "Arquivo de registro", + "detail": "Cada infra- estrutura escreve sua saída completa para /tmp/proxmenux-DESTINATION-backup-YYYYMMDD_HHMMSS.log e, em caso de falha, oferece abri-la em uma janela de rolagem. O caminho do log é impresso no resumo de conclusão somente quando o arquivo tem conteúdo." + }, + { + "topic": "Sidecar (apenas local)", + "detail": "hb_write_archive_sidecar solta um *.proxmenux.json ao lado do arquivo local para que o monitor o identifique como um backup de host ProxMenux mesmo depois de mover ou renomear." + }, + { + "topic": "Notificação (conclusão/falha)", + "detail": "hb_notify_lifecycle \"complete\" ou \"fail\" é acionado com a duração, o tamanho do arquivo e — em caso de falha — a última linha do log que parece indicar um erro." + } + ] + }, + "finishedScreens": { + "heading": "Como é uma cópia de segurança terminada", + "intro": "O mesmo evento de conclusão é exibido pelos dois pontos de entrada. O TUI escreve um bloco de resumo para o terminal; a aba Backups do Monitor mostra a execução na lista de arquivos com o tamanho, a duração e os crachás de status.", + "scriptsAlt": "ProxMenux Scripts TUI mostrando um backup final do host — destino, ID de backup, caminho de instantâneo, tamanho de dados, duração e estado de criptografia.", + "scriptsCaption": "Cópia de segurança terminada — ProxMenux Scripts (TUI). O bloco de conclusão imprime o destino, backup ID, instantâneo resultante ou nome do arquivo, tamanho dos dados, duração e estado de criptografia.", + "monitorAlt": "Página de backups ProxMenux Monitor mostrando uma entrada de backup de host terminada com tamanho, duração, crachá de método e indicador de criptografia.", + "monitorCaption": "Backup concluído — aba Backups do ProxMenux Monitor. O novo backup aparece na lista de arquivos com o indicador do método de destino, tamanho, duração e — quando aplicável — o ícone de cadeado da criptografia." + }, + "whereNext": { + "heading": "Para onde ir a seguir", + "items": [ + { + "label": "Destinos", + "href": "/docs/backup-restore/destinations", + "tail": " — detalhes de configuração para Local, PBS e Borg." + }, + { + "label": "Trabalhos agendados", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " — executar o mesmo backup sem acompanhamento em um cronograma em vez de interativamente." + }, + { + "label": "Restauração", + "href": "/docs/backup-restore/restoring", + "tail": " — o fluxo que consome o que esta página produz." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/cross-kernel.json b/web/messages/pt/docs/backup-restore/cross-kernel.json new file mode 100644 index 00000000..e20f608e --- /dev/null +++ b/web/messages/pt/docs/backup-restore/cross-kernel.json @@ -0,0 +1,170 @@ +{ + "meta": { + "title": "Restauro entre kernels diferentes — deteção, filtragem segura e adaptação | ProxMenux", + "description": "Como ProxMenux restaura um backup de host em um alvo executando uma versão diferente do kernel principal. Documenta como a direção do descompasso é detectada, o filtro seguro-subset que salta caminhos de inicialização-críticos quando o alvo executa um kernel mais novo do que o backup, e a hidratação quatro fases do kernel-agnóstico que reaplica a sintonia do usuário como IOMMU, IDs VFIO e tokens personalizados cmdline sem copiar arquivos de kernel-ligados verbatim.", + "ogTitle": "ProxMenux Backup – restauração e hidratação do kernel cruzado", + "ogDescription": "Restauração entre versões do kernel que considera a direção da mudança, com filtro seguro e hidratação independente do kernel.", + "twitterTitle": "Restauro entre kernels diferentes | ProxMenux", + "twitterDescription": "Como ProxMenux lida com uma restauração quando o kernel alvo difere do backup." + }, + "header": { + "title": "Restauração do kernel cruzado", + "description": "Como o ProxMenux lida com uma restauração quando o host alvo executa um kernel diferente daquele gravado no backup — especialmente quando o alvo executa um kernel mais recente. Documenta como a diferença é detectada, como caminhos críticos de inicialização que podem quebrar o alvo são filtrados, e como a configuração do próprio usuário é reaplicada sem copiar arquivos ligados ao kernel verbatim.", + "section": "Cópias de segurança e restauro" + }, + "intro": { + "title": "Cada salto do kernel é tratado de forma diferente", + "body": "O kernel de um host Proxmox é identificado por uma string de versão como 6.17.13-2-pve. Os dois primeiros números (6.17 neste exemplo) definem a versão principal: quando eles mudam, alguns arquivos de configuração escritos para o kernel anterior podem não ser válidos no novo. Quando a restauração detecta que o backup e o alvo têm diferentes versões principais do kernel, os ramos de fluxo baseados na direção do salto — se o backup é mais antigo ou mais recente do que o alvo — porque os dois casos têm modos de falha opostos. Backups mais recentes do que o destino restaurar limpamente como-is (bench-verified em vários saltos do kernel). Backups mais antigos do que o alvo precisam de um filtro para evitar quebrar a inicialização do alvo com configuração escrita para um kernel que desde então mudou." + }, + "directionCheck": { + "heading": "Verificação da direcção", + "intro": "Durante a verificação de compatibilidade, hb_compat_check compara o kernel registrado no manifesto do backup com o kernel atual do alvo (uname -r) e classifica a restauração em um dos três casos, armazenados na variável interna HB_COMPAT_KERNEL_DIRECTION:", + "rows": [ + { + "direction": "same", + "condition": "A versão principal do kernel corresponde entre backup e alvo.", + "behavior": "O fluxo total de restauração corre inalterado. Sem filtro extra, sem hidratação, sem aviso especial na UI." + }, + { + "direction": "bk_newer", + "condition": "O kernel de backup é mais novo do que o do alvo (por exemplo: o backup foi feito no kernel 7.0 e o alvo executa o kernel 6.17).", + "behavior": "O fluxo completo permanece inalterado, como em same, sem filtro. Nos testes relatados, os drivers foram reinstalados para o kernel de destino, a configuração IOMMU foi aplicada e as VMs iniciaram com passthrough de GPU." + }, + { + "direction": "bk_older", + "condition": "O kernel do backup é MAIS ANTIGO que o de destino (por exemplo: backup no 6.17, destino no 7.0).", + "behavior": "O filtro seguro e a hidratação em quatro fases abaixo são ativados. A restauração prossegue — o alvo reproduz a fonte, mas os arquivos de inicialização críticos não são copiados literalmente." + } + ] + }, + "whyBkNewerIsSafe": { + "heading": "Por que um backup com um kernel mais novo do que o alvo restaura inalterado", + "body": "Quando a restauração corre contra um alvo com um kernel mais antigo do que o registrado no backup, cada mecanismo que a restauração depende é independente da versão do kernel. Os instaladores de driver GPU e outros instaladores de dispositivos PCI detectam o kernel em execução com uname -r e compilam DKMS contra qualquer que seja o alvo. O pacote APT install puxa binários construídos para a distribuição do alvo. Os tokens cmdline IOMMU como intel_iommu=on são estáveis nas principais versões do kernel. O backup carrega caminhos escritos sob um kernel mais recente, mas esses caminhos (listas-negra de módulos, padrões GRUB, configuração initramfs) ainda são sintaxe válida no antigo - kernels ignoram tokens que não reconhecem em vez de falhar. Este caso é, na prática, equivalente a uma restauração do mesmo núcleo, e o ProxMenux trata-o como tal." + }, + "safeSubsetFilter": { + "heading": "O filtro de segurança (apenas quando o kernel alvo é mais novo)", + "intro": "Quando o kernel alvo é mais novo do que o backup, a verificação de compatibilidade adiciona 16 Caminhos críticos de arranque de hb_unsafe_paths_cross_version para RS_SKIP_PATHS. Estes caminhos são excluídos da restauração porque escrever uma versão deles de um kernel mais antigo sobre um alvo executando um mais recente causou pânico do kernel em testes de banco. Os caminhos abrangem cinco categorias:", + "categoryRows": [ + { + "category": "Gestor de arranque", + "paths": "/etc/default/grub, /etc/kernel", + "reason": "GRUB predefinições ligadas à ordem anterior do kernel, e estado proxmox-boot-tool (cmdline, ESP UUIDs, ganchos) que referencia caminhos e identificadores da instalação mais antiga." + }, + { + "category": "Módulos de kernel e artefatos de inicialização", + "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", + "reason": "Listas de autocarregamento que podem referenciar módulos renomeados entre majors de kernel, opções de módulo que podem não se aplicar, ganchos initramfs escritos para o kernel antigo." + }, + { + "category": "Stack de armazenamento e identidade do sistema de arquivos", + "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", + "reason": "UUIDs que podem não existir nesta instalação, drivers multicaminho que mudam entre kernels, parâmetros iSCSI que evoluem, regras udev que podem se ligar a subsistemas inexistentes, estado ZFS (zpool.cache + hostid) que podem bloquear o pool como estrangeiro." + }, + { + "category": "Fontes APT", + "paths": "/etc/apt", + "reason": "As suítes de código fonte APT podem desencadear uma redução de pacotes críticos na próxima atualização." + }, + { + "category": "systemd", + "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", + "reason": "Sobrescritas de unidades e links .wants ligados à versão principal antiga do systemd; chaves de configuração que podem não ser válidas na versão nova." + } + ], + "outroBody": "O filtro é executado ANTES da janela de confirmação para que o utilizador veja a lista exacta dos caminhos que serão ignorados, categorizados pela razão. A restauração continua — tudo o resto (configuração VM/LXC, rede, /etc/pve, usuários, cron, ProxMenux estado, pacotes, drivers, /root) é restaurado normalmente." + }, + "hydration": { + "heading": "Hidratação independente do kernel", + "intro": "O filtro omite arquivos críticos; a hidratação reaplica ajustes selecionados: cmdline IOMMU, IDs VFIO, GRUB_TIMEOUT personalizado e listas de bloqueio nvidia. Executa se o kernel de destino for mais novo. A mesclagem cmdline preserva chaves do destino e adiciona módulos ausentes. Valores GRUB e arquivos permitidos podem substituir conteúdo diferente no destino. Repetir as mesmas entradas é idempotente.", + "phaseRows": [ + { + "phase": "1a — Via GRUB", + "detail": "Para hosts GRUB (instalações ext4/lvm). _rs_hyd_grub mescla os parâmetros de manifest.kernel_params.cmdline_extra do backup em GRUB_CMDLINE_LINUX_DEFAULT do destino, ignorando chaves já presentes. Depois restaura as chaves permitidas GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) de /etc/default/grub do backup se seus valores diferirem do destino." + }, + { + "phase": "1b — systemd-boot / ZFS", + "detail": "Para systemd-boot (normalmente ZFS na raiz). _rs_hyd_kernel_cmdline mescla parâmetros do usuário de cmdline_extra em /etc/kernel/cmdline do destino, preservando os parâmetros de inicialização root=, boot= e rootflags= do destino." + }, + { + "phase": "2 — fusão /etc/modules", + "detail": "_rs_hyd_modules adiciona os módulos de manifest.kernel_params.modules_loaded_at_boot que estão na lista branca (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) E ainda não está presente no objectivo /etc/modules." + }, + { + "phase": "3 — Cópia de ficheiros na lista branca", + "detail": "_rs_hyd_files copia arquivos criados pelo usuário dos rootfs de estadiamento para o alvo ao vivo quando o conteúdo difere. A lista branca abrange arquivos VFIO/nvidia/blacklist sob /etc/modprobe.d, /etc/modules-load.d, e a regra de ligação ProxMenux VFIO + nvidia regras udev sob /etc/udev/rules.d. Arquivos distro-proprietários (pve-blacklist.conf, mdadm.conf, nvme.conf) são intencionalmente excluídos — seu conteúdo evolui entre lançamentos." + }, + { + "phase": "4 — Forçar regeneração após a inicialização", + "detail": "As quatro fases escrevem diretamente para o alvo vivo fora do processo de restauração normal. Para fazer com que os tokens/módulos/arquivos fundidos façam efeito na próxima inicialização, o HB_HYDRATION_APPLIED=1 propaga-se através do plan.env ao apply_pending_restore.sh, que força o NEEDS_INITRAMFS=1 e o NEEDS_GRUB=1 independentemente do que estava na lista de aplicações. O expedidor pós-boot regenera initramfs e atualiza o carregador de boot." + } + ] + }, + "planCommit": { + "heading": "Plano vs commit — o utilizador vê uma antevisão primeiro", + "body": "A hidratação funciona em dois modos. Antes da janela de confirmação, o ProxMenux executa o _rs_apply_bk_older_hydration no modo plan: calcula exatamente o que seria mesclado, povoa o RS_HYDRATION_SUMMARY com um bloco verde listando cada ação e retorna sem escrever. O diálogo de confirmação mostra que o bloco verde ao lado da lista amarela dos caminhos excluídos, para que o usuário veja ANTES o que será reaplicado automaticamente. Depois que o usuário confirma, o ProxMenux executa novamente o mesmo helper no modo commit — as mesmas fases, a mesma lógica, mas desta vez cada fase escreve para o alvo ao vivo. Cancelar a janela de confirmação deixa o alvo intocado." + }, + "flowDiagram": { + "heading": "O fluxo quando o kernel alvo é mais novo do que o backup", + "intro": "Os passos adicionados quando o kernel alvo é mais novo sentam-se dentro do fluxo de restauração normal. Tudo o resto — aplicar, preparar, instalar o pacote, enviar pós-boot — é executado de forma idêntica a uma restauração do mesmo kernel.", + "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": "Exemplos concretos", + "intro": "O passe de hidratação não é abstrato — produz resultados observáveis e corretos para cenários comuns. Dois exemplos que a hidratação manuseia automaticamente:", + "rows": [ + { + "scenario": "Passagem GPU (VFIO)", + "detail": "Fonte: intel_iommu=on iommu=pt no cmdline, vfio/vfio_pci/vfio_iommu_type1 no /etc/modules, um /etc/modprobe.d/vfio.conf com options vfio-pci ids=10de:2216, e um /etc/modprobe.d/blacklist-nvidia.conf. A hidração funde os tokens cmdline com o GRUB ou o kernel cmdline do alvo, adiciona os módulos vfio ao /etc/modules e copia os dois arquivos modprobe do usuário. Na próxima inicialização, o IOMMU está ativo, os módulos VFIO são carregados, o GPU está ligado ao vfio-pci e o VM vem com o trabalho de passagem." + }, + { + "scenario": "Por omissão personalizada do GRUB", + "detail": "Fonte: GRUB_TIMEOUT=1 e GRUB_DISABLE_OS_PROBER=true. Hydration lê ambas as chaves do /etc/default/grub, vê que elas diferem dos padrões da instalação recente, e reescreve essas duas linhas no arquivo do alvo (deixando tudo, incluindo o GRUB_DISTRIBUTOR, intocado)." + } + ] + }, + "callout": { + "warningTitle": "O que a hidratação não reaplica quando o kernel alvo é mais novo", + "warningBody": "A hidratação reaplica apenas a configuração ProxMenux sabe ser segura em todas as versões do kernel: tokens IOMMU, IDs VFIO, chaves GRUB permitidas e módulos de uma lista fixa (vfio*, nvidia*, i915, xe, kvm*). Qualquer coisa fora desse conjunto — ganchos de initramfs personalizados sob /etc/initramfs-tools/hooks/, arquivos não listados em /etc/modprobe.d/, sobreposições de unidades systemd criadas pelo usuário — permanece excluída. A razão é concreta: esses arquivos podem chamar de interfaces internas do kernel (a APIs de módulo, layout /sys, ganchos udev) que mudam entre as versões principais, e aplicá-las literalmente sobre o kernel mais novo pode impedir que o alvo arranque. Quando a reprodução exata da cadeia de inicialização é necessária, a restauração deve ser executada em um host com a mesma versão principal do kernel que o backup." + }, + "codeReference": { + "heading": "Onde vivem os mecanismos", + "intro": "Para os desenvolvedores que procuram rastrear ou estender o comportamento do cross-kernel:", + "rows": [ + { + "component": "Detecção da direcção", + "location": "hb_compat_check em lib_host_backup_common.sh. Define HB_COMPAT_KERNEL_DIRECTION." + }, + { + "component": "Lista de caminhos do filtro seguro", + "location": "hb_unsafe_paths_cross_version em lib_host_backup_common.sh. Emite path\\treason linhas usadas tanto pelo filtro CLI como pelo endpoint da Web /api/host-backups/restore/prepare." + }, + { + "component": "Fases de hidratação", + "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files em backup_host.sh. Orquestrado por _rs_apply_bk_older_hydration." + }, + { + "component": "Regeneração forçada após a inicialização", + "location": "apply_pending_restore.sh lê HB_HYDRATION_APPLIED de plan.env e força NEEDS_INITRAMFS=1/NEEDS_GRUB=1." + }, + { + "component": "Visualização da Web", + "location": "/api/host-backups/restore/prepare em flask_server.py. Carrega a biblioteca auxiliar, executa _rs_apply_bk_older_hydration no modo plano, retorna as ações para o modal Web." + } + ] + }, + "whereNext": { + "heading": "Para onde ir a seguir", + "items": [ + { + "label": "Restauração", + "href": "/docs/backup-restore/restoring", + "tail": " — o fluxo completo de restauração que integra os mecanismos desta página." + }, + { + "label": "Como funciona", + "href": "/docs/backup-restore/how-it-works", + "tail": " — manifesto e coletores que produzem o bloco kernel_params lido pela hidratação." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/destinations/borg.json b/web/messages/pt/docs/backup-restore/destinations/borg.json new file mode 100644 index 00000000..f73d9e2b --- /dev/null +++ b/web/messages/pt/docs/backup-restore/destinations/borg.json @@ -0,0 +1,234 @@ +{ + "meta": { + "title": "Destino Borg — tipos de repositório, autenticação SSH, criptografia | ProxMenux", + "description": "O destino Borg grava backups do host ProxMenux em um repositório local, em disco externo montado ou em servidor remoto via SSH. Descreve a busca pelo executável borg, as quatro opções iniciais de chave SSH, a criptografia repokey, os destinos salvos e a retenção por tarefa agendada.", + "ogTitle": "Cópia de segurança do ProxMenux — destino Borg", + "ogDescription": "Como ProxMenux escreve backups de host para repositórios Borg, com estratégias de autenticação SSH e criptografia repokey.", + "twitterTitle": "Destino de backup Borg | ProxMenux", + "twitterDescription": "Repositórios Borg locais, USB e SSH para backups de host." + }, + "header": { + "title": "Borg", + "description": "O destino Borg escreve backups de host para um repositório Borg. Três tipos de repositório são suportados: caminho local do sistema de arquivos, disco externo montado, ou servidor remoto via SSH. Deduplicação de nível de chunk em todos os arquivos no repositório e criptografia opcional repokey.", + "section": "Cópias de segurança e restauro" + }, + "aboutBorg": { + "heading": "O que é Borg", + "body": "Borg (também escrito BorgBackup) é uma ferramenta de backup de desduplicação de código aberto mantida pela comunidade Borg Backup. Ele armazena todos os arquivos como um conjunto de blocos de comprimento variável dentro de um repositório; blocos são compartilhados entre os arquivos, então fazer o backup de dados inalterados tem custo de armazenamento quase zero. Borg não está ligado ao Proxmox — é uma ferramenta de backup de propósito geral usada em muitos ambientes. ProxMenux usa-o como um dos três destinos para backups de host; cada mecanismo Borg-específico descrito nesta página (tipos de repositório, borg-serve sobre SSH, criptografia repokey, prune) é o comportamento padrão Borg." + }, + "intro": { + "title": "Deduplicação por blocos com repositórios locais ou acessíveis via SSH", + "body": "Um repositório Borg armazena blocos compartilhados entre todos os seus arquivos de backup. Repetir o backup de um arquivo inalterado não transfere nem armazena novos dados. O ProxMenux usa borg create para o backup e borg extract para a restauração. O repositório pode estar no mesmo sistema de arquivos da origem, em disco externo montado ou em host remoto acessível via SSH." + }, + "binarySourcing": { + "heading": "O binário borg", + "intro": "Borg não é uma dependência de base do instalador ProxMenux. Quando um backup é executado, o hb_ensure_borg resolve o binário de quatro fontes em ordem e retorna o primeiro que funciona:", + "rows": [ + { + "priority": "1", + "source": "Sistema borg", + "detail": "Se o host já tem borg instalado via APT (which borg resolve), esse binário é usado." + }, + { + "priority": "2", + "source": "Cache 'State-dir'", + "detail": "/usr/local/share/proxmenux/borg — mantido de um anterior download GitHub neste host." + }, + { + "priority": "3", + "source": "Pacote AppImage do Monitor", + "detail": "/usr/local/share/proxmenux/monitor-app/usr/bin/borg — o AppImage agrupa um borg-linux64 assinado. Este é o caminho offline: um host sem internet ainda tem um borg funcionando." + }, + { + "priority": "4", + "source": "Transferência do GitHub", + "detail": "wget contra a URL borg-linux64 fixada em github.com/borgbackup/borg/releases/, verificada contra uma constante SHA-256 em lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). No checksum descompasso o binário é descartado e o backup aborta. O arquivo baixado é armazenado em cache na dir estado para backups subsequentes usar caminho 2." + } + ] + }, + "repoTypes": { + "heading": "Tipos de repositório", + "intro": "O tipo de repositório é escolhido quando um alvo é adicionado. Cada tipo resolve para um URL de repositório diferente que Borg entende.", + "rows": [ + { + "type": "remote", + "url": "ssh://USER@HOST/RPATH", + "detail": "O repositório vive em um servidor remoto que executa borg serve. Requer uma conexão SSH para esse servidor." + }, + { + "type": "usb", + "url": "/mnt/MOUNTPOINT/borgbackup", + "detail": "O repositório vive em um disco externo montado (tipicamente USB). A montagem é resolvida via hb_prompt_mounted_path, que detecta, monta ou formata partições USB conforme necessário." + }, + { + "type": "local", + "url": "/backup/borgbackup (any absolute path)", + "detail": "O repositório vive numa pasta local. Significativo apenas quando o diretório alvo está em um disco físico separado — um repositório no mesmo disco que a fonte protege contra o erro do operador, mas não contra a falha do disco." + } + ] + }, + "serverSetup": { + "heading": "Preparando o servidor Borg (lado do servidor)", + "intro": "O tipo de repositório remote exige um servidor Borg funcional acessível via SSH. O ProxMenux não configura o servidor; apenas autoriza uma chave em uma conta existente. Esta seção descreve os requisitos antes da conexão.", + "hostChoicesTitle": "Onde o servidor pode viver", + "hostChoicesBody": "Qualquer host Linux com acesso SSH se qualifica. Configuração comum:", + "hostChoicesItems": [ + "Um NAS dedicado ou caixa de backup (Debian, Ubuntu, TrueNAS SCALE com uma shell).", + "Um recipiente LXC dentro de um nó Proxmox. Pegada pequena, isolada do hospedeiro a executar os backups.", + "Outro host Proxmox na mesma LAN, ou um VM em qualquer lugar acessível sobre SSH." + ], + "lxcWarningTitle": "LXC como servidor Borg", + "lxcWarningBody": "Se o servidor Borg estiver em um LXC, generate-auto exige uma conta que aceite autenticação SSH por senha para instalar a chave. Caso contrário, use a instalação manual ou a alternativa generate-pct pelo host PVE.", + "requirementsTitle": "Requisitos no servidor", + "requirementsRows": [ + { + "requirement": "Executável borg em /usr/bin/borg", + "detail": "A linha command=\"/usr/bin/borg serve ...\" gravada pelo ProxMenux em authorized_keys usa esse caminho fixo. A instalação via APT (apt install borgbackup) coloca o executável ali. Um binário independente precisa de um link simbólico em /usr/bin/borg." + }, + { + "requirement": "Uma conta de usuário dedicada (tipicamente borg)", + "detail": "Possui o diretório do repositório e recebe conexões SSH recebidas. Não precisa de acesso sudo ou shell — a linha authorized_keys desativa shells interativos de qualquer maneira." + }, + { + "requirement": "Um diretório de repositório com escrita", + "detail": "O caminho que o operador dá ProxMenux (por exemplo /backup/borgbackup) deve existir no servidor e ser propriedade do usuário borg." + }, + { + "requirement": "O servidor SSH aceita o usuário borg", + "detail": "PubkeyAuthentication yes (padrão). A autenticação por senha só é necessária para instalar a chave pelo fluxo generate-auto. Depois disso, o servidor pode desativar completamente a autenticação por senha." + } + ], + "minimalSetupTitle": "Configuração mínima do servidor", + "minimalSetupBody": "Em um servidor Debian ou Ubuntu Borg, uma linha de base de trabalho é quatro comandos como root:", + "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", + "minimalSetupNote": "Com o servidor preparado e a autenticação SSH por senha disponível, generate-auto instala a chave por uma conta que possa gravar em authorized_keys do usuário borg. Os backups seguintes usam essa chave, restrita a borg serve no caminho configurado. Sem acesso por senha, instale-a manualmente ou pelo host PVE." + }, + "sshAuth": { + "heading": "Autenticação SSH (lado cliente)", + "intro": "Repositórios Borg remotos são acessados sobre SSH. A conexão é executada do host ProxMenux para uma conta de usuário no servidor Borg que executa o borg serve. Este usuário é tipicamente chamado borg, NÃO o administrador/root usuário do servidor — a linha de comando borg-serve bloqueia a conexão com esse caminho específico do repositório (veja as estratégias chave abaixo).", + "strategiesTitle": "Estratégias de chave SSH", + "strategiesIntro": "Ao adicionar um destino remoto, o ProxMenux pede usuário SSH, host e caminho remoto e oferece quatro opções de autenticação. A alternativa generate-pct é oferecida quando o acesso por senha é recusado. Os modos são descritos abaixo:", + "strategyRows": [ + { + "mode": "generate-auto", + "label": "Recomendado", + "detail": "O ProxMenux gera ou reutiliza um par de chaves ed25519 em ~/.ssh/borg_proxmenux_HOST_ed25519 e usa sshpass para testar o acesso e instalar a chave pública em ~borg/.ssh/authorized_keys. A senha pertence a uma conta com permissão para gravar esse arquivo, normalmente root ou borg. Ela é usada durante a configuração e não é salva." + }, + { + "mode": "generate-manual", + "label": "Sem senha de administração nesta máquina", + "detail": "ProxMenux gera o keypair como acima, mas exibe a linha authorized_keys completa para o operador colar manualmente no servidor. A senha de administrador nunca deixa o host ProxMenux porque nunca é solicitado." + }, + { + "mode": "generate-pct", + "label": "O servidor Borg é um PVE LXC", + "detail": "O servidor Borg é executado dentro de um LXC em um nó PVE. ProxMenux autoriza a chave via pct exec do host PVE — root no host PVE escreve no LXC ~borg/.ssh/authorized_keys sem precisar de SSH no próprio LXC." + }, + { + "mode": "existing", + "label": "Usar uma chave existente", + "detail": "O ProxMenux procura em /root/.ssh/ e $HOME/.ssh/ chaves privadas ed25519/RSA que consiga interpretar e as lista. O operador escolhe uma ou indica manualmente um caminho não padrão." + }, + { + "mode": "none", + "label": "Configuração padrão do SSH", + "detail": "Nenhuma chave personalizada — Borg depende da configuração padrão SSH da máquina (tipicamente ~/.ssh/id_rsa ou um agente SSH)." + } + ], + "restrictTitle": "A linha authorized_keys", + "restrictBody": "Para cada chave gerada, a linha authorized_keys gravada pelo ProxMenux no servidor restringe a chave a esta chamada de borg-serve no caminho configurado do repositório:", + "restrictLine": "command=\"/usr/bin/borg serve --restrict-to-path RPATH\",restrict PUBKEY", + "restrictNote": "O command= força cada sessão de SSH usando esta chave para executar apenas o comando borg-serve; restrict desativa o encaminhamento de portas, o encaminhamento de agentes, o encaminhamento de X11 e a alocação de PTY. A chave não pode ser usada para abrir uma shell interativa no servidor ou para acessar qualquer outro caminho do repositório, mesmo que a conta tenha privilégios mais amplos." + }, + "savedTargets": { + "heading": "Alvos salvos", + "intro": "Um destino salvo mantém a configuração do repositório com um nome reconhecível, evitando digitar os dados novamente. Arquivos no diretório de estado do ProxMenux:", + "rows": [ + { + "file": "borg-targets.txt", + "content": "Uma linha por destino: NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE. hb_collect_borg_configs lê o arquivo para preencher o menu de seleção de destinos." + }, + { + "file": "borg-pass-NAME.txt", + "content": "Frase secreta do destino identificado acima por NAME (chmod 600). Presente somente quando se escolhe criptografia repokey." + } + ], + "outro": "Salvar o destino é opcional. Recusar não grava a configuração com nome, mas não remove uma chave SSH gerada. Se repokey for ativado sem destino salvo, o ProxMenux ainda guarda a frase secreta no arquivo legado borg-pass.txt." + }, + "encryption": { + "heading": "Criptografia", + "body": "Os repositórios são inicializados com um modo de criptografia via hb_borg_init_if_needed: o moderno borg repo-create -e MODE quando disponível, ou o legado borg init --encryption=MODE. ProxMenux expõe dois modos: repokey (padrão) e none. No modo repokey Borg armazena a chave de criptografia dentro do próprio repositório; o acesso requer uma frase-passe, que ProxMenux pede duas vezes com validação de correspondência e armazena em borg-pass-NAME.txt para destinos salvos, ou no arquivo legado descrito acima. Uma janela de reconhecimento obrigatória é mostrada após a frase- senha ser salva: a frase- senha é a única maneira de acessar os arquivos criptografados, e perdê- la torna cada arquivo no repositório irrecuperável." + }, + "runtimeEnv": { + "heading": "Ambiente de execução", + "intro": "ProxMenux exporta as seguintes variáveis de ambiente antes de invocar borg. Eles configuram a conexão e desbloqueiam o repositório sem incorporar segredos na linha de comando.", + "rows": [ + { + "var": "BORG_RSH", + "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", + "purpose": "Comando remoto usado pelo Borg para repositórios SSH. Uma chave selecionada acrescenta as opções de identidade; uma porta diferente da padrão acrescenta -p PORT. Sem chave personalizada e com a porta padrão, a variável fica indefinida e o Borg usa a configuração SSH do host." + }, + { + "var": "BORG_PASSPHRASE", + "value": "(passfrase de borg-pass-NAME.txt)", + "purpose": "Desbloqueia a chave repokey. Configure apenas quando o alvo usar criptografia repokey. Nunca aparece na lista de argumentos do processo." + }, + { + "var": "BORG_ENCRYPT_MODE", + "value": "repokey | none", + "purpose": "Usado pelo hb_borg_init_if_needed ao inicializar um repositório que ainda não existe. Ignorado pelo borg create nos repositórios existentes." + }, + { + "var": "BORG_RELOCATED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Suprime o prompt interativo que Borg levanta quando o URL do repositório difere do URL que foi originalmente alcançado (comum após um renomeamento de ponto de montagem ou SSH-host acessível via novo endereço)." + }, + { + "var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Suprime o prompt interativo Borg levanta a primeira vez que um repositório não criptografado é acessado de um novo cliente." + } + ] + }, + "archiveFormat": { + "heading": "Nome e retenção do arquivo", + "intro": "Cada backup cria um novo arquivo dentro do repositório.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS", + "retentionBody": "Para trabalhos agendados, o run_scheduled_backup.sh executa borg prune contra o repositório após cada backup bem sucedido com os valores de retenção configurados no trabalho (--keep-last, --keep-daily, --keep-weekly). Os backups interativos não removem backups antigos." + }, + "restoreAccess": { + "heading": "Obtenção no lado da restauração", + "body": "A restauração lista os arquivos com borg list REPO e extrai o selecionado com borg extract REPO::ARCHIVE-NAME em um diretório de preparação. _rs_check_layout o encaminha ao processo padrão de restauração. Os mesmos comandos funcionam manualmente fora do ProxMenux; a árvore extraída tem a estrutura de três blocos descrita em Como funciona." + }, + "references": { + "heading": "Referências", + "intro": "Documentação oficial do Borg para os componentes usados pelo ProxMenux.", + "items": [ + { + "label": "Documentação Borg", + "href": "https://borgbackup.readthedocs.io/", + "tail": " — ponto de entrada principal que abrange conceitos, implantação, arranque rápido e todos os comandos." + }, + { + "label": "borg create", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/create.html", + "tail": " — o comando usado pelo ProxMenux em cada backup, com todas as opções aceitas." + }, + { + "label": "Criptografia do repositório", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/init.html#encryption-mode", + "tail": " — os modos de criptografia aceitos pelo Borg, incluindo repokey, usado por padrão pelo ProxMenux." + }, + { + "label": "borg serve e implantação via SSH", + "href": "https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html", + "tail": " — configuração de um servidor Borg central acessível via SSH, incluindo o comando borg-serve e a opção restrict-to-path que o ProxMenux grava em authorized_keys." + }, + { + "label": "borg prune", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/prune.html", + "tail": " — o modelo de retenção de --keep-last / --keep-daily / --keep-weekly aplicado pelo ProxMenux em cada tarefa agendada." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/destinations/index.json b/web/messages/pt/docs/backup-restore/destinations/index.json new file mode 100644 index 00000000..0f92be36 --- /dev/null +++ b/web/messages/pt/docs/backup-restore/destinations/index.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Destinos das cópias de segurança — arquivo local, Proxmox Backup Server e Borg | ProxMenux", + "description": "Três backends de armazenamento recebem a mesma carga útil de backup ProxMenux: um arquivo .tar.zst local em qualquer sistema de arquivos com permissão de gravação, um backup PBS em uma datastore Proxmox Backup Server, ou um arquivo Borg em um repositório Borg local ou remoto. Cada infra-estrutura tem suas próprias características de compressão, desduplicação, criptografia e rede.", + "ogTitle": "Destinos de backup do ProxMenux", + "ogDescription": "Local, Proxmox Backup Server e Borg — três backends de armazenamento para a mesma carga útil de backup do host.", + "twitterTitle": "Destinos de backup do ProxMenux | ProxMenux", + "twitterDescription": "Arquivos locais, infraestruturas Proxmox Backup Server e Borg para backups de host." + }, + "header": { + "title": "Destinos", + "description": "Três backends de armazenamento suportados pelo ProxMenux Backup: arquivo local, Proxmox Backup Server (recomendado) e Borg. Cada um recebe o mesmo arquivo de três blocos de dados; eles diferem em formato de armazenamento, deduplicação, modelo de criptografia e requisitos de rede.", + "section": "Cópias de segurança e restauro" + }, + "intro": { + "title": "Mesmo conteúdo, três backends", + "body": "Cada backup produz as mesmas três cargas (rootfs, manifesto, aplicações). O que muda entre destinos é como essas cargas são armazenadas e como o operador as recupera para uma restauração. Cada infra-estrutura é implementada como uma função separada em backup_host.sh — _bk_local, _bk_pbs, _bk_borg — mas todos os três compartilham a mesma etapa de preparação temporária (hb_prepare_staging) e o mesmo caminho de restauração de código. A escolha de destino apenas afeta a escrita e a recuperação; ela não altera o que uma restauração faz ou como consome o arquivo." + }, + "comparison": { + "heading": "Comparação de características", + "intro": "A tabela a seguir lista as diferenças concretas entre as três infra-estruturas como se comportam hoje em ProxMenux. Todos os valores descrevem o comportamento observado da própria infra-estrutura, não as recomendações editoriais.", + "rows": [ + { + "feature": "Formato de armazenamento", + "local": "Um ficheiro .tar.zst (ou .tar.gz se o zstd estiver ausente).", + "pbs": "Backup PBS (blocos .pxar no datastore).", + "borg": "Arquivo Borg dentro de um repositório Borg (arquivos de segmentos)." + }, + { + "feature": "Compressão", + "local": "zstd (nível padrão) via tar --zstd. gzip fallback.", + "pbs": "Gerenciada pelo proxmox-backup-client. O ProxMenux não altera as configurações de compressão.", + "borg": "Compressão integrada do Borg. O ProxMenux chama borg create sem alterar as configurações de compressão." + }, + { + "feature": "Desduplicação", + "local": "Nenhuma. Cada backup é um arquivo independente completo.", + "pbs": "Deduplicação completa por blocos entre todos os backups no datastore.", + "borg": "Deduplicação completa por blocos entre todos os arquivos do repositório." + }, + { + "feature": "Criptografia em repouso", + "local": "Nenhum (depende da proteção do sistema de arquivos).", + "pbs": "Criptografia opcional do lado do cliente com um arquivo de chave. Quando ativada, o blob de recuperação é enviado em um grupo de backup separado.", + "borg": "Criptografia opcional repokey (chave armazenada no repo, desbloqueada por uma frase- senha)." + }, + { + "feature": "Retenção / limpeza", + "local": "Aplicada por trabalho agendado via KEEP_LAST. Os arquivos antigos são removidos junto com seus arquivos auxiliares e logs de execução. Os backups interativos não fazem limpeza.", + "pbs": "Aplicado por trabalho programado via proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly. Os backups interativos não fazem limpeza.", + "borg": "Aplicado por trabalho programado via borg prune --keep-last / --keep-daily / --keep-weekly. Os backups interativos não fazem limpeza." + }, + { + "feature": "Rede", + "local": "Nenhuma. Escreve para um ponto de montagem local (tipicamente um disco interno ou uma unidade USB).", + "pbs": "TCP para o servidor PBS (porta padrão 8007). Requer credenciais PBS + impressão digital.", + "borg": "Localização local do sistema de ficheiros ou túnel SSH para uma máquina Borg remota." + }, + { + "feature": "Dependências", + "local": "tar, zstd (presente no Proxmox por padrão).", + "pbs": "Pacote proxmox-backup-client (incluído no Proxmox VE 8+).", + "borg": "binário borg. Auto-fornecido por ProxMenux do pacote Monitor AppImage quando faltando." + }, + { + "feature": "Acesso para restauração", + "local": "Qualquer máquina com tar+zstd pode extrair o arquivo. Não é necessário PBS/Borg.", + "pbs": "Requer proxmox-backup-client, credenciais PBS e o arquivo de chave (se o backup estiver criptografado).", + "borg": "Requer borg + o caminho do repositório + a senha (se criptografada)." + } + ], + "captionCode": "feature", + "captionLocal": "Local", + "captionPbs": "Proxmox Backup Server (recomendado)", + "captionBorg": "Borg" + }, + "sameArchive": { + "heading": "A disposição do arquivo não muda com o destino", + "body": "Dentro de qualquer um dos três destinos, o mesmo rootfs/ + metadata/ + manifest.json layout descrito em Como funciona está presente. Um .tar.zst extraído de um arquivo local, um .pxar restaurado de PBS, e um arquivo Borg extraído com borg extract todos produzem uma árvore de diretórios idêntica. O caminho do código de restauração (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) lê as mesmas três cargas úteis sem saber de que destino vieram." + }, + "extractStandalone": { + "heading": "Extraindo um backup fora de ProxMenux", + "intro": "Qualquer um dos três formatos de arquivo pode ser lido com ferramentas padrão sem ProxMenux instalado no host de leitura. Os comandos abaixo produzem a mesma árvore de diretórios que uma restauração consome internamente.", + "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": "# De um arquivo Borg (requer borg e a senha dos repositórios criptografados):\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# Em um repositório remoto acessível por SSH:\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME", + "note": "A árvore extraída pode então ser inspecionada manualmente ou alimentada a uma restauração manual. Veja as páginas de destino individuais para o fluxo de recuperação exato que o ProxMenux usa sob o capô." + }, + "whereNext": { + "heading": "Detalhes por destino", + "intro": "Cada destino tem sua própria página cobrindo o fluxo de configuração, o formato on-disk e o comando de recuperação usado pela restauração.", + "items": [ + { + "label": "Arquivo local", + "href": "/docs/backup-restore/destinations/local", + "tail": " — pré-configurando um alvo local, montagem da unidade USB, a verificação de segurança contra a gravação do arquivo em si, o sidecar JSON que permite ao Monitor identificar o arquivo." + }, + { + "label": "Proxmox Backup Server (recomendado)", + "href": "/docs/backup-restore/destinations/pbs", + "tail": " — seleção de datastore, credenciais e impressão digital, ciclo de vida do arquivo de chave de criptografia, senha de recuperação, carregando o blob de recuperação para PBS para recuperação de nova instalação." + }, + { + "label": "Borg", + "href": "/docs/backup-restore/destinations/borg", + "tail": " — repositórios locais ou acessíveis por SSH, origem do binário Borg (sistema / cache / pacote AppImage do Monitor / download do GitHub), inicialização do repositório, gerenciamento da senha e configuração da chave SSH para repositórios remotos." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/destinations/local.json b/web/messages/pt/docs/backup-restore/destinations/local.json new file mode 100644 index 00000000..01c392f8 --- /dev/null +++ b/web/messages/pt/docs/backup-restore/destinations/local.json @@ -0,0 +1,75 @@ +{ + "meta": { + "title": "Destino de arquivo local — tar.zst em um sistema de arquivos ou unidade USB | ProxMenux", + "description": "O destino de backup local escreve um único arquivo .tar.zst para qualquer diretório com permissão de gravação: um disco interno, um ponto de montagem Proxmox, uma partilha NFS, ou uma unidade USB. Documenta o fluxo de configuração, a lógica de detecção e montagem USB, a verificação de segurança contra a gravação do arquivo em um caminho que está sendo feito backup, e o sidecar JSON que identifica o arquivo.", + "ogTitle": "Cópia de segurança do ProxMenux — Destino do arquivo local", + "ogDescription": "Como ProxMenux escreve backups locais como arquivos .tar.zst e como configurar o diretório de destino ou unidade USB.", + "twitterTitle": "Destino de backup local | ProxMenux", + "twitterDescription": "Como ProxMenux escreve backups locais como arquivos .tar.zst em um sistema de arquivos ou unidade USB." + }, + "header": { + "title": "Arquivo local", + "description": "O destino local escreve um único arquivo de tar comprimido para qualquer diretório com permissão de gravação no host: um disco interno, uma montagem NFS ou SMB, ou uma unidade USB.", + "section": "Cópias de segurança e restauro" + }, + "intro": { + "title": "Um arquivo, auto-suficiente", + "body": "Um backup local produz um único arquivo hostcfg-HOST-TIMESTAMP.tar.zst (ou .tar.gz quando zstd está ausente). O arquivo contém toda a árvore de arquivos — manifest.json, metadata/ e rootfs/ — e pode ser restaurado em qualquer host Proxmox com o fluxo de restauração ProxMenux, ou extraído manualmente com tar --zstd -xf em qualquer sistema Linux. Nenhum servidor, nenhuma inicialização de repositório, nenhuma dependência externa. Este é o destino com o caminho de recuperação mais curto quando nem PBS nem Borg está disponível." + }, + "targetConfig": { + "heading": "Configurando o diretório alvo", + "intro": "O destino local é um único diretório de destino salvo de forma persistente — não uma lista. ProxMenux armazena a escolha do operador em /usr/local/share/proxmenux/local-target.conf e lê essa escolha em cada backup. Quando nenhum alvo foi configurado, o HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump padrão é usado (o mesmo diretório que o Proxmox usa para suas próprias saídas vzdump). O alvo está configurado a partir de Configure destinos de backup → Destinos locais:", + "options": [ + "Use o padrão (/var/lib/vz/dump). O armazenamento local Proxmox. Presente em cada instalação do Proxmox; o arquivo fica ao lado das saídas vzdump e é captado automaticamente pela aba Backups do Monitor.", + "Insira um caminho personalizado. Qualquer caminho absoluto do sistema de arquivos pode ser usado: uma montagem NFS, uma partilha SMB montada via fstab, um conjunto de dados dedicado ZFS, um segundo disco interno. ProxMenux valida que o caminho existe e é um diretório antes de persisti-lo.", + "Escolha uma unidade USB. Abre o submenu USB (abaixo), que detecta dispositivos removíveis e oferece para montar ou formatar um." + ] + }, + "usbFlow": { + "heading": "Detecção e montagem de unidades USB", + "intro": "O submenu USB lista partições em dispositivos removíveis relatados pelo lsblk. Cada partição é apresentada com seu tamanho, etiqueta do sistema de arquivos e estado atual. O estado determina a ação que o ProxMenux oferece.", + "statesTitle": "Os três estados do dispositivo", + "stateRows": [ + { + "state": "montado", + "shown": "Tamanho · etiqueta · [fstype] · → /mount/point", + "action": "A partição já está montada em algum lugar. Selecioná-la salva o ponto de montagem atual como alvo local. Nenhuma montagem é realizada." + }, + { + "state": "desmontado", + "shown": "Tamanho · etiqueta · [fstype] · (não montado — será montado)", + "action": "Um sistema de ficheiros está presente mas não está montado. Na confirmação, o ProxMenux executa o hb_mount_usb_partition: cria o /mnt/backup-LABEL (ou um caminho baseado em UUID, se não houver rótulo), monta a partição e persiste o ponto de montagem como alvo local." + }, + { + "state": "vazia", + "shown": "Tamanho · disco USB bruto — sem sistema de arquivos (será FORMATADO)", + "action": "O dispositivo não tem sistema de arquivos. Essa operação destrutiva exige duas confirmações. Primeiro, uma janela Sim/Não explica que o disco será apagado. Depois, um campo exige que o usuário digite o caminho exato do dispositivo (por exemplo /dev/sdb) antes de o ProxMenux criar uma nova tabela GPT com uma partição ext4 e montá-la." + } + ], + "notMountedFallback": "Quando nenhum dispositivo USB é detectado, o submenu cai de volta para uma caixa de entrada simples. O operador pode indicar uma localização arbitrária do ponto de montagem; se a localização não for um ponto de montagem registado, uma janela de confirmação avisa antes de prosseguir." + }, + "safetyCheck": { + "heading": "Verificação de segurança — destino dentro de um caminho de backup", + "body": "Antes de gravar o arquivo, _bk_local verifica se o diretório de destino não é um subcaminho de qualquer diretório cujo backup está sendo feito. Um erro comum seria adicionar /root ao perfil e escolher /root/backups como destino - o arquivo então se incluiria, produzindo um arquivo corrompido ou crescendo sem limites até que o disco ficasse cheio. A verificação resolve ambos os caminhos com readlink -m, compara-os e, em caso de conflito, aborta o backup com uma caixa de diálogo que nomeia o caminho conflitante e lista três maneiras de resolvê-lo: escolha um destino fora do caminho conflitante, remova a entrada personalizada que contém o destino ou use o modo Personalizado para desmarcar o caminho conflitante para esta execução." + }, + "archiveFormat": { + "heading": "Formato de arquivo e compressão", + "intro": "O nome do arquivo de saída inclui o nome do host de origem e a data e hora do backup, permitindo ordenar as cópias cronologicamente no diretório e identificar cada arquivo.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS.tar.zst", + "compressionTitle": "Compressão", + "compressionBody": "O caminho primário usa tar --zstd -cf — um pipeline de um único comando que comprime ao nível padrão do zstd. Quando zstd não está presente na fonte (raro em Proxmox, mas possível em instalações mínimas), ProxMenux cai de volta para gzip. No caminho de retorno, se o pv estiver disponível, uma barra de progresso é adicionada ao pipeline para que o operador veja o tamanho do arquivo crescer em tempo real; sem o pv, o tar -czf simples é usado silenciosamente.", + "sourceTitle": "O que vai para o arquivo", + "sourceBody": "O comando tar é chamado com -C \"$staging_root\" ., incluindo toda a raiz da área de preparação: rootfs/, metadata/ e manifest.json. Os três blocos de dados ficam lado a lado na raiz do arquivo tar. A extração produz exatamente a árvore usada pelo código de restauração." + }, + "sidecar": { + "heading": "O arquivo auxiliar JSON", + "intro": "Cada backup local bem sucedido produz um arquivo companheiro: HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, escrito ao lado do arquivo por hb_write_archive_sidecar. Este pequeno arquivo JSON permite que o ProxMenux Monitor identifique o arquivo como um backup de host ProxMenux mesmo que mais tarde seja movido, renomeado ou arquivado em outro lugar.", + "contentTitle": "Conteúdo do sidecar", + "contentBody": "O sidecar armazena a versão do esquema, se o backup veio de uma execução interativa ou de uma tarefa agendada (kind), o ID do trabalho para as execuções agendadas, o modo de perfil usado (default ou custom), o nome de máquina de origem, o nome de base do arquivo original, um timestamp de criação ISO-8601 e o tamanho do arquivo em bytes.", + "whyBody": "A aba Backups do Monitor procura arquivos auxiliares *.proxmenux.json nos diretórios locais configurados, e não arquivos *.tar.zst, pois um .tar.zst sem arquivo auxiliar pode não ser um backup ProxMenux. A busca é rápida (os arquivos JSON são pequenos) e a associação permanece válida após renomear o arquivo, desde que o auxiliar seja renomeado de forma correspondente." + }, + "restoreAccess": { + "heading": "Restaurando de um arquivo local", + "body": "O fluxo de restauração ProxMenux descobre arquivos locais digitalizando o alvo local configurado para sidecars e exibindo-os na lista Arquivos. A seleção de um arquivo aciona _rs_check_layout, que extrai o tarball em um diretório de preparação temporária e confirma o layout de três cargas antes de prosseguir. Para extração manual fora de ProxMenux, tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg produz a mesma árvore que o código de restauração consome." + } +} diff --git a/web/messages/pt/docs/backup-restore/destinations/pbs.json b/web/messages/pt/docs/backup-restore/destinations/pbs.json new file mode 100644 index 00000000..1164a2ae --- /dev/null +++ b/web/messages/pt/docs/backup-restore/destinations/pbs.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Proxmox Backup Server destino — repositório, encriptação, recuperação ProxMenux", + "description": "O destino PBS grava os backups do host ProxMenux como backups PBS. Documenta a descoberta de repositórios em /etc/pve/storage.cfg, a configuração manual, o envio de .pxar, a criptografia no cliente com arquivo de chave e sua cópia de recuperação opcional protegida por frase secreta, e a recuperação da chave por várias fontes em um host recém-instalado.", + "ogTitle": "Cópia de segurança ProxMenux — destino Proxmox Backup Server", + "ogDescription": "Como o ProxMenux grava backups do host no Proxmox Backup Server com criptografia por arquivo de chave no cliente e uma cópia da chave para recuperação.", + "twitterTitle": "PBS destino de backup □ ProxMenux", + "twitterDescription": "Destino Proxmox Backup Server com criptografia por arquivo de chave e cópia de recuperação protegida por frase secreta." + }, + "header": { + "title": "Proxmox Backup Server", + "description": "O destino PBS envia todo o diretório de preparação como um único backup .pxar para um datastore Proxmox Backup Server. A criptografia no cliente com arquivo de chave é opcional, assim como o envio, junto a cada backup, de uma cópia da chave protegida por frase secreta para recuperação.", + "section": "Cópias de segurança e restauro" + }, + "recommendedBadge": "Destino recomendado", + "aboutPbs": { + "heading": "O que é Proxmox Backup Server", + "body": "Proxmox Backup Server (PBS) é o próprio produto do servidor de backup da Proxmox, desenvolvido e mantido pela mesma equipe que o autor Proxmox VE. É um servidor de backup dedicado projetado para receber backups de hosts Proxmox VE (VMs, LXCs e — via proxmox-backup-client — diretórios host arbitrários) com deduplicação baseada em blocos, criptografia do lado do cliente e políticas de retenção aplicadas lado servidor. ProxMenux usa PBS como um dos três destinos para backups de host; cada mecanismo específico PBS descrito nesta página (grupos de backup, arquivos .pxar, criptografia de arquivos de chaves --backup-id) é o comportamento padrão PBS." + }, + "intro": { + "title": "Um backup por execução, dedup de nível de blocos", + "body": "Um backup PBS cria uma única entrada no datastore, sob o ID host/hostcfg-HOSTNAME/BACKUP-TIME. Os dados formam um arquivo .pxar com a estrutura de três blocos descrita em Como funciona. O PBS deduplica blocos entre todos os backups do datastore, de modo que backups posteriores do mesmo host transferem e armazenam apenas os blocos alterados. Nas tarefas agendadas, o próprio ProxMenux aplica a retenção: após cada execução bem-sucedida, run_scheduled_backup.sh executa proxmox-backup-client prune com --keep-last / --keep-daily / --keep-weekly e os valores configurados na tarefa." + }, + "repoSelection": { + "heading": "Selecção do repositório", + "intro": "ProxMenux descobre repositórios PBS de duas fontes em cada backup. O operador escolhe um de um menu unificado; a escolha determina HB_PBS_REPOSITORY, HB_PBS_SECRET e HB_PBS_FINGERPRINT para a execução.", + "sourceRows": [ + { + "source": "storage.cfg do Proxmox (deteção automática)", + "path": "/etc/pve/storage.cfg + /etc/pve/priv/storage/NAME.pw", + "content": "Qualquer estrofe pbs: na própria configuração de armazenamento do Proxmox é captada automaticamente. Servidor, datastore, nome de usuário e impressão digital vêm da estrofe. A senha é lida no diretório de credenciais do Proxmox. Nenhuma reentrada necessária no lado ProxMenux — o repositório está disponível assim que estiver configurado no Proxmox." + }, + { + "source": "Configuração manual do ProxMenux", + "path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt", + "content": "Adicionado de Configure destinos de backup → destinos de PBS → Adicione PBS. Pede um nome, nome de usuário (root@pam ou user@pbs!token), host ou IP, datastore e senha. A senha re-prompts na entrada vazia — uma gravação vazia persistiria silenciosamente e cada backup subsequente falharia com um erro de autenticação opaco. Este caminho é usado quando o PBS alvo não é registrado como armazenamento Proxmox." + } + ], + "menuTitle": "Menu de seleção", + "menuBody": "Ambas as fontes são mostradas em um único menu, cada linha marcada com sua origem ([proxmox] ou [manual]). As entradas cuja senha não pôde ser resolvida são marcadas com um aviso ⚠ no password — selecionando-se um aciona uma reentrada de senha antes do backup começar. A impressão digital é passada para proxmox-backup-client através da variável de ambiente PBS_FINGERPRINT; quando ausente, o cliente pede ao operador para aceitar o certificado do servidor de forma interativa no primeiro backup." + }, + "backupCommand": { + "heading": "O comando de backup", + "intro": "O envio usa uma única chamada de proxmox-backup-client backup. O ProxMenux usa env para passar ao cliente a senha, a senha de criptografia e a impressão digital como variáveis de ambiente.", + "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": "Nome do ID de backup", + "backupIdBody": "O ID de backup padrão é hostcfg-HOSTNAME. Pede-se ao operador que o confirme ou edite antes do envio; quaisquer caracteres fora do [A-Za-z0-9_-] são despojados e os traços são aparados. Reutilizar o mesmo ID entre as execuções é intencional — o PBS trata o ID como um group, e cada backup subsequente aparece como um novo backup dentro desse grupo, compartilhando dedup com execuções anteriores.", + "pxarTitle": "Por que a fonte é a raiz de estadiamento completa", + "pxarBody": "A origem do arquivo .pxar é todo o staging_root: rootfs/, metadata/ e manifest.json em conjunto. Versões anteriores usavam $staging_root/rootfs como origem, deixando metadata/ fora do arquivo. Sem esses dados, a verificação de compatibilidade emitia avisos de mudança de host mesmo ao restaurar no mesmo host. As cópias antigas continuam a ser restauradas pelo caso 3 de _rs_check_layout, que volta a colocar a árvore simples etc/var/root/usr dentro de uma hierarquia rootfs/." + }, + "encryption": { + "heading": "Criptografia do lado do cliente", + "glossaryHint": "Esta seção usa os termos arquivo de chave, frase secreta e envelope de recuperação. O glossário resume as diferenças em uma frase por termo.", + "intro": "A criptografia PBS no cliente com arquivo de chave cifra os blocos no host de origem antes do envio. No ProxMenux ela é opcional. Ao ativá-la, o operador escolhe explicitamente sim ou não durante a configuração se deseja enviar ao PBS também uma cópia de recuperação do arquivo de chave protegida por frase secreta; a escolha pode ser alterada depois no Monitor. O arquivo fica sempre no caminho canônico /usr/local/share/proxmenux/pbs-key.conf e é reutilizado sem novas perguntas em todos os backups criptografados posteriores.", + "keyfileTitle": "Configurar o arquivo de chaves", + "keyfileBody": "O diálogo de criptografia aparece no primeiro backup criptografado do host. Primeiro pergunta se deseja criptografar o backup: Não continua sem criptografia, e Sim passa à segunda etapa. Esta depende da existência de um arquivo de chave em /usr/local/share/proxmenux/pbs-key.conf. Se existir, ele é reutilizado sem novas perguntas e o backup continua; os backups posteriores também não perguntam novamente. Caso contrário, um menu oferece duas opções. Gerar um novo arquivo de chave executa proxmox-backup-client key create --kdf none. Usar um arquivo de chave existente detecta automaticamente uma chave gerenciada pelo PVE: se o repositório PBS selecionado estiver registrado no Proxmox com uma chave de criptografia em /etc/pve/priv/storage/<NAME>.enc, o arquivo será copiado sem perguntas para o caminho canônico do ProxMenux. Se nenhuma chave PVE corresponder ao repositório, será solicitado o caminho absoluto onde o operador já colocou o arquivo neste host. Nos dois casos, o arquivo fica no caminho canônico com chmod 600.", + "modesTitle": "Arquivo de chave por host ou compartilhado", + "modesIntro": "Os dois modelos são aceitos e nenhum é obrigatório: o operador escolhe conforme a organização dos seus hosts.", + "modesPerHostTitle": "Arquivo de chave por host (padrão)", + "modesPerHostBody": "Cada host gera seu próprio arquivo de chaves na primeira vez que ele permite criptografia PBS. O isolamento é máximo: comprometer o arquivo de chaves de um host não expõe os backups de nenhum outro. Recomendado para frotas de produção e ambientes onde hospedeiros têm diferentes proprietários ou limites de conformidade.", + "modesSharedTitle": "Arquivo de chaves compartilhado (importação em cada máquina)", + "modesSharedBody": "Um arquivo-chave mestre gerado uma vez e instalado em cada host por meio da opção Usar um arquivo-chave existente. O gerenciamento é mais simples: um único segredo para proteger e qualquer host pode descriptografar os arquivos de qualquer outro (útil para consolidação, exercícios de restauração entre hosts ou verificação de backup centralizada). A desvantagem é que um vazamento do arquivo-chave compartilhado expõe todos os hosts de uma só vez. Recomendado para homelabs e frotas onde todos os hosts têm o mesmo proprietário e limite de confiança.", + "recoveryTitle": "Chave de envio para PBS — o operador decide", + "recoveryBody": "Logo após escolher o arquivo de chave, o ProxMenux pergunta explicitamente Enviar a chave para o PBS?, com duas respostas. Nenhum artefato de recuperação é enviado ao PBS até o operador responder Sim. O padrão é Não, manter apenas localmente: a chave fica no caminho canônico local, o ProxMenux não envia artefatos de recuperação ao PBS e o operador cuida da cópia externa. O botão Baixar arquivo de chave do Monitor, na linha do destino PBS, fornece essa cópia quando necessário. Ao escolher Sim, enviar, é solicitada duas vezes uma frase secreta de recuperação, verificando se as duas entradas coincidem. O ProxMenux protege o arquivo com AES-256-CBC e PBKDF2 (600.000 iterações, salt aleatório), produzindo pbs-key.recovery.enc. Cada backup criptografado posterior envia esse envelope ao PBS como um grupo de backup associado. Esses envios não transmitem ao PBS a frase secreta nem o arquivo de chave em texto claro. A escolha pode ser alterada a qualquer momento no Monitor: o controle na linha PBS permite Sim ou Não e aplica imediatamente Iniciar envio, Parar envio ou Atualizar frase secreta, conforme o estado atual.", + "blobUploadTitle": "Grupo de backup emparelhado no PBS", + "blobUploadBody1": "Quando o modo de garantia é Sim, fazer upload, ProxMenux carrega o envelope de recuperação para PBS após cada backup criptografado como um segundo grupo de backup emparelhado com o mesmo nome do grupo host, mas terminando em -keyrecovery. Os dois grupos ficam próximos um do outro na listagem do armazenamento de dados – um para backups de host e outro para envelopes de recuperação. O envelope nunca sai do host em texto simples: a criptografia acontece no próprio host com AES-256-CBC e PBKDF2 antes que qualquer byte seja transmitido (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS recebe apenas o envelope já criptografado.", + "envelopeSecurityTitle": "Carregar o arquivo de recuperação de chaves para PBS é um risco de segurança?", + "envelopeSecurityBody": "O arquivo de recuperação de chaves está criptografado em trânsito e em repouso. A senha de recuperação nunca deixa o host: criptografia acontece localmente antes do upload, e PBS só vê o resultado já criptografado. Um administrador PBS — ou qualquer pessoa com acesso ao datastore — pode baixar o arquivo keyrecovery, mas sem a frase-passe de recuperação eles não podem ler o arquivo de chave dentro: é cifrar opaco. Reconstruir o arquivo de chaves requer ambas as peças ao mesmo tempo, o arquivo de recuperação de chaves e a frase-passe, e apenas o operador detém ambas.", + "blobUploadConstraintTitle": "Por que dois grupos em vez de um único criptografado", + "blobUploadConstraintBody": "Uma única chamada de proxmox-backup-client backup criptografa todos os seus arquivos com a mesma chave ou não criptografa nenhum; não permite misturar os dois casos. O backup do host precisa ser criptografado com a chave do host, mas o envelope de recuperação não pode acompanhá-lo no mesmo envio, pois acabaria criptografado com a própria chave que contém. Em um host recém-instalado, seria impossível abri-lo: seria necessária a chave para descriptografar a própria chave. Por isso os dois artefatos são enviados separadamente e aparecem em dois grupos. O cliente PBS criptografa o backup do host com o arquivo de chave, e o ProxMenux criptografa o envelope com a frase secreta antes do envio. Duas camadas de criptografia diferentes protegem dois elementos distintos.", + "blobUploadImageAlt": "PBS UI mostrando os grupos de backup hostcfg-HOSTNAME e hostcfg-HOSTNAME-keyrecovery adjacentes na listagem de datastore.", + "blobUploadImageCaption": "Interface PBS — os grupos de backup associados. O grupo principal contém os backups do host; o grupo -keyrecovery contém o arquivo de chave protegido por frase secreta.", + "recoverTitle": "Recuperação num novo hospedeiro", + "recoverBody": "Quando o arquivo de chave falta no caminho canônico, após reinstalar o host ou removê-lo explicitamente, a restauração tenta três fontes em ordem e para na primeira que fornece uma chave utilizável. Primeiro, se houver uma chave gerenciada pelo PVE correspondente ao repositório PBS selecionado em /etc/pve/priv/storage/<NAME>.enc, ela será copiada sem perguntas para o caminho canônico. Segundo, se houver um grupo -keyrecovery no PBS, será baixado o instantâneo mais recente e solicitada a frase secreta de recuperação para descriptografá-lo. Terceiro, se as opções anteriores falharem ou forem recusadas, o diálogo pedirá o caminho absoluto do arquivo de chave neste host e o copiará para o caminho canônico. O Monitor oferece o mesmo fluxo de importação na janela de detalhes do backup. Um painel âmbar aparece no topo quando Restaurar, Baixar ou Ver conteúdo exige uma chave ausente. Se a chave instalada não corresponde à usada no backup, o PBS retorna wrong key — manifest's key XX does not match provided key YY. As mesmas três ações exibem então um painel estruturado com a impressão digital exigida pelo manifesto em destaque, permitindo identificar qual chave importar para abrir o backup.", + "monitorManagementTitle": "Gerenciando o arquivo de chaves do Monitor", + "monitorManagementBody": "O Monitor mostra os controles do arquivo de chave diretamente em cada linha de destino PBS na configuração dos backups. Há três ações: Baixar exporta o arquivo atual para o navegador; Enviar substitui o arquivo instalado pelo fornecido pelo operador, sobrescrevendo o anterior somente após a instalação bem-sucedida do novo no caminho canônico; Excluir remove o arquivo do host. Ao lado fica o controle da cópia de recuperação: uma opção Sim/Não para Enviar a chave para o PBS?, um campo de frase secreta quando Sim é escolhido e um botão contextual para aplicar Iniciar envio, Parar envio ou Atualizar frase secreta. Todas as ações usam os mesmos endpoints Flask da interface de terminal; portanto, o efeito em disco e o estado no PBS são idênticos nas duas interfaces." + }, + "restoreAccess": { + "heading": "Obtenção no lado da restauração", + "body": "A restauração localiza os backups do host ProxMenux no PBS listando os grupos do repositório configurado e filtrando pelo padrão do ID. A aba Backups do Monitor exibe a mesma lista. Escolher um backup executa proxmox-backup-client restore com os mesmos repositório, senha e impressão digital, além de --keyfile se estiver criptografado. O arquivo .pxar é extraído em um diretório de preparação que _rs_check_layout encaminha ao processo normal de restauração. Fora do ProxMenux, o mesmo comando extrai o arquivo no caminho desejado para inspecionar a árvore ou realizar uma restauração manual." + }, + "references": { + "heading": "Referências", + "intro": "Documentação oficial do Proxmox Backup Server para os componentes usados pelo ProxMenux.", + "items": [ + { + "label": "Documentação Proxmox Backup Server", + "href": "https://pbs.proxmox.com/docs/", + "tail": " — o ponto de entrada principal que abrange a instalação, administração, armazenagem, utilizadores e funções." + }, + { + "label": "proxmox-backup-client", + "href": "https://pbs.proxmox.com/docs/backup-client.html", + "tail": " — a ferramenta de linha de comando que o ProxMenux usa em cada backup e restauração. Descreve IDs e tipos de backup, arquivos, sintaxe dos repositórios e variáveis de ambiente." + }, + { + "label": "Criptografia do lado do cliente", + "href": "https://pbs.proxmox.com/docs/backup-client.html#encryption", + "tail": " — criação do arquivo de chave, modos --kdf e modelo de criptografia que o ProxMenux amplia com uma cópia de recuperação protegida por frase secreta." + }, + { + "label": "Gestão de armazenamento de dados", + "href": "https://pbs.proxmox.com/docs/storage.html", + "tail": " — criação e gerenciamento dos datastores que recebem backups do host, incluindo a estrutura do armazenamento de blocos e as permissões." + }, + { + "label": "Poda e coleta de lixo", + "href": "https://pbs.proxmox.com/docs/maintenance.html#pruning", + "tail": " — o modelo de retenção de --keep-last / --keep-daily / --keep-weekly aplicado pelo ProxMenux em cada tarefa agendada e como o PBS libera blocos não usados após a remoção de backups antigos." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/glossary.json b/web/messages/pt/docs/backup-restore/glossary.json new file mode 100644 index 00000000..93a79f4e --- /dev/null +++ b/web/messages/pt/docs/backup-restore/glossary.json @@ -0,0 +1,230 @@ +{ + "meta": { + "title": "Glossário — Cópia de segurança e restauração ProxMenux", + "description": "Termos do sistema de backup e restauração ProxMenux: criptografia, arquivo de chaves, frase-senha, envelope de recuperação, PBS, blocos, rootfs, manifesto, executor e hidratação entre versões do kernel.", + "ogTitle": "Glossário das cópias de segurança e do restauro | ProxMenux", + "ogDescription": "Definições claras dos termos usados na documentação de backup e restauração ProxMenux.", + "twitterTitle": "Glossário das cópias de segurança e do restauro | ProxMenux", + "twitterDescription": "Senha, arquivo de chaves, envelope de recuperação, rootfs, manifesto, PBS, blocos — todos definidos em um só lugar." + }, + "header": { + "title": "Glossário", + "description": "Termos usados através da documentação de backup e restauração, com sua definição.", + "section": "Cópias de segurança e restauro" + }, + "intro": { + "body": "Os termos são agrupados por tema. Cada entrada dá o termo e uma definição curta." + }, + "groups": [ + { + "title": "Criptografia e recuperação de chaves", + "intro": "Vocabulário para o bloco de criptografia PBS. Envolve dois segredos distintos: um arquivo binário e uma frase-passe escrita.", + "entries": [ + { + "id": "passphrase-recuperacion", + "term": "Senha de recuperação", + "def": "Senha de texto que o usuário escolhe para proteger o envelope de recuperação. Ele é solicitado duas vezes com uma verificação de correspondência, e só é usado para criptografar o envelope e para decifrá-lo se o arquivo de chaves alguma vez precisa ser recuperado. Não é a frase-passe que desbloqueia o próprio arquivo de chaves, e nunca é enviado para PBS. Durante um backup normal, ele nunca deixa o hospedeiro." + }, + { + "id": "clave-cifrado", + "term": "Arquivo de chaves (chave de criptografia)", + "def": "Arquivo de chave usado por proxmox-backup-client para criptografar os blocos antes do envio ao PBS. Sem a chave correspondente, os dados criptografados não podem ser lidos. O ProxMenux o salva em /usr/local/share/proxmenux/pbs-key.conf com modo 600. Proteja-o: o envelope de recuperação permite recuperá-lo se for perdido." + }, + { + "id": "contrasena-keyfile", + "term": "Frase- senha do ficheiro de chaves (frase- senha do KDF)", + "def": "Senha opcional que o próprio arquivo de chaves pode carregar, distinta da frase-passe de recuperação. Ele só existe quando o arquivo de chaves foi criado com --kdf scrypt (normalmente um arquivo de chaves importadas). Sem ele, o arquivo de chaves não pode ser desbloqueado para uso. ProxMenux persiste em forma criptografada no host para que os backups agendados possam ser executados sem um prompt interativo." + }, + { + "id": "sobre-recuperacion", + "term": "Envelope de recuperação", + "def": "O ficheiro de chaves protegido por uma camada adicional: é encriptado com a frase-passe de recuperação através de AES-256-CBC e PBKDF2 antes de sair do host. É esta versão protegida que é enviada para o PBS no grupo -keyrecovery. Sem a frase-passe, o conteúdo permanece inacessível: descarregá-lo do PBS não revela o ficheiro de chaves." + }, + { + "id": "cifrado-cliente", + "term": "Criptografia do lado do cliente", + "def": "Modelo de criptografia em que os dados são criptografados na máquina de origem antes de serem enviados. O PBS só recebe e armazena texto cifrado; nem mesmo um administrador PBS com acesso a datastore pode lê-lo sem o arquivo de chaves. O ProxMenux baseia-se neste modelo e adiciona o envelope de recuperação no topo." + }, + { + "id": "kdf-none", + "term": "--kdf none", + "def": "Opção para proxmox-backup-client key create que produz um arquivo de chaves sem senha anexada. O arquivo de chaves pode ser usado diretamente sem um prompt, o que é essencial para trabalhos agendados sem acompanhamento. Isto é o que o ProxMenux usa por padrão ao gerar um novo arquivo de chaves." + }, + { + "id": "kdf-scrypt", + "term": "--kdf scrypt", + "def": "Opção para proxmox-backup-client key create que produz um arquivo de chaves protegido por uma frase-senha do arquivo de chave. Cada uso do arquivo de chaves requer desbloqueá-lo com essa frase-passe. O ProxMenux aceita este estilo de arquivo de chaves na importação e armazena a frase-passe criptografada para que os backups agendados ainda possam ser executados sem acompanhamento." + }, + { + "id": "aes-256-cbc", + "term": "AES-256-CBC", + "def": "Cifra simétrica padrão. ProxMenux usa-o (via openssl enc -aes-256-cbc) para embrulhar o keyfile com a frase-senha de recuperação e produzir o envelope." + }, + { + "id": "pbkdf2", + "term": "PBKDF2", + "def": "Função criptográfica que transforma uma frase-passe tipo humano em uma chave binária adequada para criptografia. Atrasa as tentativas de força bruta aplicando muitas iterações. ProxMenux usa-o com iterações 600 000 e um sal aleatório ao criptografar o envelope de recuperação." + } + ] + }, + { + "title": "Estrutura de backup", + "intro": "Termos que descrevem o que vive dentro de um backup, independentemente do destino.", + "entries": [ + { + "id": "rootfs", + "term": "rootfs / sistema de ficheiros root", + "def": "Uma cópia plana do sistema de arquivos do host fonte, produzido pela rsync sobre o perfil default mais qualquer caminho custom. Não é uma imagem de disco inteiro: apenas caminhos que contêm configuração ou estado Proxmox não pode regenerar por conta própria são copiados." + }, + { + "id": "manifiesto", + "term": "Manifesto (manifest.json)", + "def": "Documento estruturado JSON descrevendo o host fonte no momento do backup: hardware, armazenamento, kernel, componentes instalados ProxMenux e inventário de VMs e LXCs. É produzido por seis coletores de dados independentes. O fluxo de restauração usa-o para comparar fonte e alvo." + }, + { + "id": "staging", + "term": "Diretório de preparação", + "def": "Diretório temporário onde ProxMenux monta os três blocos (rootfs, metadados e manifestos) antes de embalá-los e enviar para o destino. É removido automaticamente quando o backup termina, mesmo ao abortar." + }, + { + "id": "perfil-defecto", + "term": "Perfil padrão", + "def": "Conjunto selecionado de caminhos copiados por padrão em cada backup: configuração PVE, rede, SSH, kernel, apt, ferramentas ProxMenux e outros. É definido no código e documentado na página Como funciona." + }, + { + "id": "rutas-personalizadas", + "term": "Caminhos personalizados", + "def": "Caminhos extras que o usuário adiciona no topo do perfil default. Persistente (armazenada em backup-extra-paths.txt) ou por execução (escolhida em modo Personalizado)." + } + ] + }, + { + "title": "Destinos e armazenagem", + "intro": "Termos ligados ao local onde o backup chega — servidor PBS, arquivo local ou repositório Borg — e como o PBS organiza os dados.", + "entries": [ + { + "id": "repositorio-pbs", + "term": "Repositório PBS", + "def": "Combinação de Proxmox Backup Server + datastore + usuário que recebe o backup. Identificado pela string user@realm@host:datastore. Um único servidor PBS pode hospedar vários repositórios." + }, + { + "id": "datastore", + "term": "Armazenamento de dados", + "def": "Armazenamento específico em um servidor PBS para backups e seus blocos. Cada datastore fica em um sistema de arquivos do servidor PBS e tem permissões e políticas próprias." + }, + { + "id": "chunk", + "term": "Bloco (chunk) / desduplicação de blocos", + "def": "PBS divide cada backup em blocos de tamanho variável, identifica cada pedaço pelo seu hash e armazena cada pedaço apenas uma vez, mesmo que apareça em muitos backups diferentes. Isto significa que os backups sucessivos da mesma máquina — ou através de hosts semelhantes — ocupam muito pouco espaço adicional." + }, + { + "id": "fingerprint", + "term": "Impressão digital", + "def": "Impressões digitais criptográficas do certificado PBS do servidor TLS. Permite ao cliente verificar se está a falar com o servidor pretendido sem depender de uma autoridade pública de certificação. ProxMenux passa para proxmox-backup-client através da variável de ambiente PBS_FINGERPRINT." + }, + { + "id": "grupo-copia", + "term": "Grupo de backup", + "def": "Container lógico dentro do PBS sob o qual se acumulam sucessivos backups do mesmo ativo. Cada novo backup compartilha deduplicação com os anteriores no mesmo grupo. ProxMenux usa dois grupos por host quando a criptografia está habilitada: um para o backup do host e outro com um sufixo -keyrecovery para o envelope de recuperação." + }, + { + "id": "backup-id", + "term": "ID de backup", + "def": "Nome do grupo de backup. ProxMenux padrão para hostcfg-HOSTNAME e permite que o usuário editá-lo antes do upload; caracteres não suportados são despojados automaticamente." + }, + { + "id": "pxar", + "term": ".pxar", + "def": "Formato de arquivo PBS-native para diretórios. Ele se comporta como um arquivo tar otimizado para desduplicação de blocos: ao invés de armazenar um arquivo opaco, PBS quebra seu conteúdo em pedaços reutilizáveis." + } + ] + }, + { + "title": "Execução e agendamento", + "intro": "Termos usados pelo sistema ProxMenux-jobs programados.", + "entries": [ + { + "id": "runner", + "term": "Executor", + "def": "O script run_scheduled_backup.sh que executa um backup agendado. Ele lê a configuração do trabalho, lança o backend correspondente (Local, PBS ou Borg), aplica retenção no sucesso e envia as notificações configuradas." + }, + { + "id": "trabajo-programado", + "term": "Trabalho agendado", + "def": "Configuração persistente de uma cópia de segurança recorrente. Mantém o destino, credenciais, criptografia, programação e retenção. Vive em /var/lib/proxmenux/backup-jobs/<id>.env." + }, + { + "id": "modo-adjunto", + "term": "Anexar modo", + "def": "Tarefa sem temporizador próprio. Um hook job-end PVE de vzdump a executa após os backups dos convidados quando o armazenamento coincide. A tarefa pai fornece destino e retenção inicial, mas o hook compara armazenamento, não ID pai. Outra tarefa no mesmo armazenamento também pode acioná-la. Somente Local e PBS." + }, + { + "id": "timer-systemd", + "term": "Temporizador Systemd", + "def": "Mecanismo systemd padrão que dispara um comando em um calendário. ProxMenux cria um temporizador por independente trabalho programado; attach-mode trabalhos não usam temporizador, eles rodam através do script-hook PVE." + }, + { + "id": "retencion", + "term": "Retenção (keep-last, keep-daily…)", + "def": "Política que decide quais backups mais antigos manter e qual podar. Definido por trabalho com parâmetros como keep-last, keep-daily, keep-weekly, keep-monthly. Aplicado pelo executor após cada backup bem sucedido." + } + ] + }, + { + "title": "Restaurar", + "intro": "Termos do fluxo de restauração.", + "entries": [ + { + "id": "restauracion-universal", + "term": "Restauração universal", + "def": "O fluxo de restauração ProxMenux não apenas extrai o sistema de arquivos: ele lê o manifesto para detectar diferenças entre fonte e alvo, reproduz a configuração do sistema e executa novamente os instaladores para os componentes gerenciados ProxMenux. O objetivo é reproduzir o host de origem, não apenas o arquivo." + }, + { + "id": "hidratacion", + "term": "Hidratação entre versões do kernel", + "def": "Etapa de restauração que combina as configurações do usuário na origem (parâmetros IOMMU, IDs VFIO, ajustes específicos e chaves GRUB) com a configuração nova de inicialização do destino, sem copiar literalmente arquivos ligados ao kernel de origem. Executa quando o kernel de destino é mais novo que o do backup." + }, + { + "id": "cross-kernel", + "term": "Restauração do kernel cruzado", + "def": "Restaurar onde o kernel do alvo difere (normalmente é mais novo do que) da fonte. Requer o passe hydration para evitar arrastar arquivos incompatíveis com o kernel do alvo." + }, + { + "id": "instalador-postboot", + "term": "Instalador pós-inicial", + "def": "Componentes reinstalados após a primeira inicialização do host restaurado ( drivers NVIDIA, drivers Coral TPU, ferramentas AMD GPU, ferramentas Intel GPU). Cada instalador corre contra o kernel do alvo, então o host restaurado não depende do kernel da fonte estar presente." + }, + { + "id": "compatibility-check", + "term": "Verificação de compatibilidade", + "def": "Comparação entre o manifesto da fonte e o estado do alvo que o ProxMenux realiza no início da restauração. Ele decide quais partes são copiadas verbatim, que precisam de hidratação e que são recriadas por um instalador." + }, + { + "id": "equipo-recien-instalado", + "term": "Instalação fresca", + "def": "Host recém-reinstalado do zero, sem arquivo de chave local. Para restaurar um backup criptografado, primeiro recupere a chave do envelope armazenado no PBS usando a frase-senha de recuperação." + } + ] + } + ], + "whereNext": { + "heading": "Onde se segue", + "items": [ + { + "label": "Como funciona", + "href": "/docs/backup-restore/how-it-works", + "tail": " — quando o rootfs, o manifesto e o inventário da aplicação se encaixam num backup." + }, + { + "label": "Destino Proxmox Backup Server", + "href": "/docs/backup-restore/destinations/pbs", + "tail": " — quando a criptografia do lado do cliente, o arquivo de chaves, a frase-passe de recuperação e o envelope são documentados em profundidade." + }, + { + "label": "Restauração", + "href": "/docs/backup-restore/restoring", + "tail": " — fluxo de restauração e uso do manifesto." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/how-it-works.json b/web/messages/pt/docs/backup-restore/how-it-works.json new file mode 100644 index 00000000..8f8f7845 --- /dev/null +++ b/web/messages/pt/docs/backup-restore/how-it-works.json @@ -0,0 +1,205 @@ +{ + "meta": { + "title": "Como o backup ProxMenux funciona internamente — rootfs, manifestos, aplicativos", + "description": "Descrição detalhada do que um backup ProxMenux contém: os rootfs produzidos pelo rsync do perfil de caminho padrão, o manifesto estruturado construído por seis coletores independentes e o inventário de aplicativos que impulsiona a reinstalação automática de pacotes e componentes após uma restauração.", + "ogTitle": "Como o backup ProxMenux funciona internamente", + "ogDescription": "Os três blocos de um backup ProxMenux: rootfs, manifesto e aplicativos.", + "twitterTitle": "Como funcionam as cópias de segurança ProxMenux | ProxMenux", + "twitterDescription": "As três cargas de um backup ProxMenux e como a restauração reproduz o host fonte deles." + }, + "header": { + "title": "Como funciona", + "description": "A estrutura interna de um backup ProxMenux — sistema de arquivos, manifesto e inventário de aplicativos — e como a restauração usa os três para reproduzir o host de origem em um destino que pode ter outro kernel.", + "section": "Cópias de segurança e restauro" + }, + "intro": { + "title": "Um arquivo, três blocos", + "body": "Cada backup cria três blocos bem definidos em um único diretório de preparação. O arquivo enviado ao destino (.tar.zst local, backup PBS ou arquivo Borg) mantém essa estrutura. A restauração usa os três: o manifesto é consultado antes das alterações para detectar diferenças e decidir o que excluir; rootfs fornece os arquivos de configuração, aplicados em execução ou após reiniciar; o inventário de aplicativos orienta a instalação de pacotes e a reinstalação de componentes após o boot. Cada bloco pode ser inspecionado ou extraído separadamente." + }, + "layout": { + "heading": "Disposição do arquivo", + "intro": "Cada arquivo segue o mesmo layout de árvore, independentemente do destino. O subdiretório metadata/ contém as cargas estruturadas; o subdiretório rootfs/ contém a cópia do sistema de arquivos.", + "treeCaption": "O diretório de preparação criado durante o backup. Todos os destinos recebem a mesma árvore no formato nativo: tar para backups locais, blocos PBS para PBS e segmentos Borg para 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│ ├── paths_archived.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": "A carga útil do rootfs", + "intro": "A árvore rootfs/ é uma cópia simples do sistema de arquivos criada pelo rsync a partir do host de origem. Contém um perfil padrão de caminhos selecionados para restaurar o Proxmox e os caminhos personalizados adicionados à tarefa ou sessão interativa. A seleção é intencionalmente restrita a caminhos que guardam configuração ou guardam um estado que o Proxmox não consegue recriar sozinho.", + "defaultProfileTitle": "O perfil por omissão", + "defaultProfileBody": "O perfil padrão é definido por hb_default_profile_paths em lib_host_backup_common.sh. Abrange oito categorias fixas e, quando necessário, o estado ZFS, que juntas descrevem um host Proxmox funcional:", + "categoriesTitle": "Categorias de localização", + "categoryRows": [ + { + "category": "Núcleo PVE", + "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", + "why": "Conteúdo do sistema de ficheiros de cluster e valores por omissão do vzdump. O banco de dados pmxcfs (config.db) é capturado como um instantâneo consistente via sqlite3 .backup sem parar o cluster, e os sidecars .db-wal / .db-shm são excluídos do rsync. Quando o sqlite3 não está disponível, é criado config.db.raw-fallback, que a restauração usa automaticamente como banco de dados." + }, + { + "category": "Identidade do host e rede", + "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", + "why": "Tudo que o host precisa para entrar na rede com a mesma identidade. Os arquivos .link em /etc/systemd/network fixam nomes de NIC em seus MAC, portanto, reinstalações e alterações de hardware não renomeiam interfaces." + }, + { + "category": "Acesso e autenticação", + "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", + "why": "SSH chaves, regras de sudo e configuração PAM. Perder estas trava o usuário fora da máquina restaurada." + }, + { + "category": "Kernel e inicialização", + "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": "Tokens IOMMU, lista negra do módulo, IDs do dispositivo VFIO, tabela de montagem, configuração da pilha de armazenamento." + }, + { + "category": "Shell e definições regionais", + "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", + "why": "Configuração do shell, variáveis de ambiente, configuração de geração local." + }, + { + "category": "Gerenciamento de pacotes e cron", + "paths": "/etc/apt, /etc/cron.d, /etc/cron.{daily,hourly,weekly,monthly}, /etc/cron.allow, /etc/cron.deny, /var/spool/cron/crontabs", + "why": "Fontes APT para resolução consistente de pacotes, tarefas agendadas definidas pelo usuário." + }, + { + "category": "Estado e ferramentas do 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": "Ferramentas opcionais, mas comuns Proxmox. Caminhos ausentes são observados em metadata/missing_paths.txt sem parar o backup." + }, + { + "category": "Binários & root do ProxMenux", + "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (subdires voláteis excluídos)", + "why": "Binários instalados em ProxMenux e configuração por usuário sob /root. Os caminhos voláteis (.bash_history, .cache/, tmp/, .local/share/Trash/) são excluídos da cópia. O /var/lib/proxmenux mantém as tarefas de backup programadas e o estado de host mantido pelo ProxMenux; o estadiamento da restauração, as cópias de rollback e os marcadores pós-restore são excluídos, porque pertencem ao host que executa uma restauração." + }, + { + "category": "Estado ZFS (condicional)", + "paths": "/etc/zfs", + "why": "Apenas incluído quando o host de origem roda ZFS. Contém zpool.cache e hostid." + } + ], + "customTitle": "Estendendo o perfil com caminhos personalizados", + "customBody": "Além do perfil padrão, o ProxMenux oferece duas maneiras de incluir caminhos adicionais em um backup. Eles compõem sem conflito e ambos se aplicam a backups interativos e trabalhos agendados.", + "customExtrasTitle": "1. Extras persistentes (por máquina)", + "customExtrasBody": "Um arquivo de texto no /usr/local/share/proxmenux/backup-extra-paths.txt contém uma lista de caminhos absolutos que o usuário marcou como \"incluir sempre\" nesta máquina. Quando um backup é executado no modo Default, o ProxMenux adiciona esses caminhos ao perfil padrão automaticamente sem perguntar. O arquivo é editado a partir da interface — nenhuma edição manual necessária — e persiste através de reiniciais e atualizações. Um caminho absoluto por linha; # comentários são permitidos.", + "customModeTitle": "2. Modo personalizado (por execução)", + "customModeBody": "O lançamento de um backup no modo Custom substitui a aplicação automática do perfil padrão por uma lista de verificação mostrando todos os caminhos: as entradas de perfil padrão e os extras persistentes (prefixados com [+] e pré-selecionados). O usuário seleciona ou desmarca entradas para essa execução específica, e também pode pressionar Adicionar caminho personalizado para inserir um novo caminho — que é então persistido para o arquivo extras para backups futuros.", + "customMissingTitle": "Caminhos ausentes da fonte", + "customMissingBody": "Qualquer caminho do perfil (padrão ou adicionado) que não exista no host fonte é gravado em metadata/missing_paths.txt dentro do arquivo. O backup não falha nem para — o usuário vê um resumo de caminhos arquivados e caminhos faltando no final. Na prática, isso acontece para caminhos de ferramentas opcionais como /etc/wireguard ou /etc/prometheus quando essas ferramentas não estão instaladas." + }, + "manifest": { + "heading": "O bloco do manifesto", + "intro": "manifest.json é um documento JSON estruturado que descreve o host de origem no momento do backup. É produzido por seis coletores independentes orquestrados por build_manifest.sh. Cada coletor é somente leitura, produz um fragmento JSON bem definido, e cai de volta para um padrão vazio seguro se falhar — o manifesto ainda é utilizável se uma seção estiver incompleta.", + "orchestratorCaption": "Os seis coletores compõem o manifesto. Cada colecionador corre em seu próprio subprocesso; uma falha em um cai de volta para um padrão seguro documentado e avisa, mas não aborta o backup.", + "collectorRows": [ + { + "collector": "collect_source_host.sh", + "produces": "source_host", + "content": "Hostname, versão PVE (pveversion), versão PBS se o host executar o papel do servidor de backup, kernel (uname -r), modo de inicialização (efi/bios), tipo de sistema de arquivos raiz, modelo CPU + arquitetura, memória em KB." + }, + { + "collector": "collect_hardware.sh", + "produces": "hardware_inventory", + "content": "GPUs (com o mapeamento do instalador do fornecedor e ProxMenux), TPUs (Coral USB + M.2 com detecção de lsusb/lspci), NICs (com a associação MAC, slot PCI e ponte), dispositivos sem fio. As entradas GPU têm uma heurística passthrough_eligible." + }, + { + "collector": "collect_storage.sh", + "produces": "storage_inventory", + "content": "ZFS pools (com pool disco do tipo + membro resolvido para /dev/disk/by-id/*, /dev/disk/by-partuuid/* ou em bruto /dev/sdX caminhos dependendo de como cada pool foi originalmente criado), LVM grupos de volume + finos pools, discos físicos com SMART capacidade, PVE storage.cfg entradas, montagens externas." + }, + { + "collector": "collect_kernel.sh", + "produces": "kernel_params", + "content": "Parâmetros adicionados pelo operador em /proc/cmdline, sem os itens padrão como BOOT_IMAGE=, root=, ro/rw, quiet e splash; módulos carregados na inicialização de /etc/modules; caminhos dos arquivos /etc/modprobe.d/*.conf com diretivas efetivas (options, blacklist, install, alias, softdep)." + }, + { + "collector": "collect_proxmenux_state.sh", + "produces": "proxmenux_installed_components", + "content": "Lê /usr/local/share/proxmenux/managed_installs.json (registo de tudo que ProxMenux instalou) e installed_tools.json. Cada entrada mantém o caminho do instalador (menu_script) para que a restauração possa desencadear o mesmo fluxo de instalação." + }, + { + "collector": "collect_guests.sh", + "produces": "vms_lxcs_at_backup", + "content": "Enumera VMs (qm list) e LXCs (pct list) presentes na hora de backup — VMID, nome, estado atual. Apenas o inventário: os dados reais dos hóspedes são da responsabilidade do vzdump / PBS." + } + ], + "schemaTitle": "Validação do esquema", + "schemaBody": "O manifesto valida contra scripts/backup_restore/schema/manifest.schema.json. Executar o build_manifest.sh --validate desencadeia uma validação do esquema JSON do lado Python (exige o python3 + jsonschema). Se o módulo não estiver presente, a verificação é ignorada silenciosamente — a validação é principalmente um auxílio ao desenvolvedor, não uma dependência de execução." + }, + "applications": { + "heading": "O inventário de aplicativos", + "intro": "Dois inventários catalogam o software acrescentado aos pacotes básicos do Proxmox VE: a lista de pacotes em metadata/ e o registro de componentes em rootfs, detalhados abaixo. A restauração usa APT ou os instaladores do ProxMenux para reproduzir o software do usuário conforme o método original de instalação.", + "packagesTitle": "packages.manual.list", + "packagesBody": "Uma lista alfabética em texto simples produzida por apt-mark showmanual com os pacotes APT instalados explicitamente no host de origem. As dependências do sistema Proxmox VE básico são excluídas; o APT do destino as instala automaticamente. Durante a restauração, _rs_run_complete_extras lê a lista e aplica um filtro contra remoções em cascata em três etapas: dpkg -s identifica pacotes já instalados, outras versões principais de bibliotecas são detectadas e apt-get install --simulate verifica o risco de remoções em cascata. Os pacotes restantes são instalados com apt-get install -y.", + "componentsTitle": "components_status.json (parte dos rootfs)", + "componentsBody": "Um registro JSON sob /usr/local/share/proxmenux/ que registra cada componente ProxMenux instalou com seu estado exato: versão, bandeiras ProxMenux específicas (para NVIDIA: patched booleano; para Coral: versão DKMS). Este arquivo vive dentro dos rootfs — não em metadata/ — porque é lido depois que rootfs foi copiado para o alvo. O expedidor pós-boot (apply_cluster_postboot.sh) itera sobre suas entradas e executa o gancho --auto-reinstall de cada componente, que lê o estado gravado e reproduz a instalação contra o kernel atual do alvo.", + "componentInstallersTitle": "Instaladores de componentes", + "componentInstallersBody": "Quatro instaladores ProxMenux atualmente expõem um ponto de entrada --auto-reinstall:", + "installerRows": [ + { + "component": "nvidia_driver", + "installer": "gpu_tpu/nvidia_installer.sh", + "action": "Lê-se version + patched. Transfere exatamente o mesmo arquivo de execução NVIDIA, constrói módulos DKMS contra o kernel do alvo, reaplica o patch ProxMenux se a fonte o tiver." + }, + { + "component": "coral_driver", + "installer": "gpu_tpu/install_coral.sh", + "action": "Lê a versão do driver Coral. Compila o módulo DKMS contra o kernel do alvo." + }, + { + "component": "amdgpu_top", + "installer": "gpu_tpu/amd_gpu_tools.sh", + "action": "Lê a versão gravada. Baixa novamente o .deb exato da versão GitHub." + }, + { + "component": "intel_gpu_tools", + "installer": "gpu_tpu/intel_gpu_tools.sh", + "action": "O APT instala o pacote. Idempotente se já presente de packages.manual.list." + } + ] + }, + "restoreFlow": { + "heading": "Como a restauração consome as três cargas", + "intro": "A restauração é um processo de seis etapas. Cada etapa lê um subconjunto específico do arquivo e atualiza o host alvo. Nenhuma etapa requer que o host de origem seja acessível — o arquivo é totalmente auto-suficiente.", + "stagesCaption": "Estágio 1 usa o manifesto para decidir o que tocar. Estágio 2 copia rootfs caminhos que são seguros para aplicar em um sistema em execução. O estágio 3 encena os caminhos arriscados para a próxima inicialização. Fase 3b importa conjuntos de dados ZFS não-root cujos discos estão todos presentes. Estágio 4 lida com pacotes. O estágio 5 é executado após a reinicialização e reinstala componentes contra o kernel do alvo.", + "stageRows": [ + { + "stage": "1", + "name": "Verificação de compatibilidade", + "reads": "manifest.json", + "action": "Corre hb_compat_check. Compara hardware fonte vs. alvo (NICs, IDs de armazenamento), versão PVE e versão principal do kernel. Define HB_COMPAT_KERNEL_DIRECTION (same, bk_newer ou bk_older) e povoa RS_SKIP_PATHS com exclusões de hardware-drift e cross-kernel." + }, + { + "stage": "2", + "name": "Aplicação em execução", + "reads": "rootfs/ (somente caminhos seguros)", + "action": "_rs_apply … hot copia entradas hb_classify_path=hot diretamente para o alvo ao vivo. Qualquer coisa sob /etc/pve, /etc/network ou caminhos classificados como reboot/dangerous é adiada." + }, + { + "stage": "3", + "name": "Preparações pendentes", + "reads": "rootfs/ (reboot + caminhos perigosos)", + "action": "_rs_prepare_pending_restore prepara os caminhos de risco em /var/lib/proxmenux/pending-restore/, grava plan.env, apply-on-boot.list e rs-skip-paths.txt e ativa proxmenux-restore-onboot.service para a próxima inicialização." + }, + { + "stage": "3b", + "name": "Importação de pools de dados", + "reads": "manifest.storage_inventory + estado ZFS do destino", + "action": "_rs_import_data_pools tenta importar cada pool ZFS que não contém a raiz e tem todos os discos presentes no destino. Com hostid de outro host, tenta novamente com zpool import -f. Se faltar um disco, o pool é ignorado com aviso. O resultado por pool é registrado em /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "stage": "4", + "name": "Instalar pacote", + "reads": "metadata/packages.manual.list", + "action": "_rs_run_complete_extras executa o filtro de segurança em cascata e chama apt-get install -y com a lista de pacotes sobreviventes. Saída completa vai para /var/log/proxmenux/restore-apt-*.log." + }, + { + "stage": "5", + "name": "Após o arranque", + "reads": "rootfs (já aplicado) + components_status.json", + "action": "Após reiniciar, apply_pending_restore.sh reproduz os caminhos diferidos e apply_cluster_postboot.sh executa update-initramfs, update-grub (ou proxmox-boot-tool refresh) e itera sobre components_status.json disparando o gancho --auto-reinstall de cada componente." + } + ] + }, + "whyItWorks": { + "heading": "Por que dividir o backup em três blocos", + "body": "A divisão segue o ciclo de vida dos dados. O sistema de arquivos é transferido com rsync: rápido, transparente e atômico por arquivo. O estado de configuração a interpretar antes das alterações é JSON estruturado, legível separadamente, versionável por esquema e comparável automaticamente com o estado do destino. O software a reinstalar é descrito em um inventário de nomes e versões; o gerenciador de pacotes e os instaladores do ProxMenux escolhem os binários adequados. Cada bloco atende ao próprio objetivo. Juntos, buscam uma restauração coerente com tolerância a falhas: um manifesto corrompido deixa rootfs recuperável, um pacote ausente não impede instalar componentes e uma falha em uma entrada não interrompe a seguinte." + } +} diff --git a/web/messages/pt/docs/backup-restore/index.json b/web/messages/pt/docs/backup-restore/index.json new file mode 100644 index 00000000..950b34e2 --- /dev/null +++ b/web/messages/pt/docs/backup-restore/index.json @@ -0,0 +1,93 @@ +{ + "meta": { + "title": "ProxMenux Backup e restauração — Visão geral | Backup e restauração completos do host para Proxmox VE", + "description": "ProxMenux Backup & Restore captura o estado completo de um host Proxmox – sistema de arquivos, manifesto de configuração estruturado e pacotes/componentes instalados – e o reproduz no mesmo host ou em um host diferente. O backup e a restauração são independentes: não há dependências externas e as restaurações entre kernels são suportadas por meio de um filtro de subconjunto seguro com reconhecimento de direção e hidratação independente do kernel.", + "ogTitle": "ProxMenux Backup e restauração — Visão geral", + "ogDescription": "Backup e restauração completos do host para Proxmox VE com manifesto estruturado, lista de pacotes e reinstaladores de componentes.", + "twitterTitle": "ProxMenux Backup e restauração | ProxMenux", + "twitterDescription": "Backup e restauração completos do host para Proxmox VE com manifesto estruturado, lista de pacotes e reinstaladores de componentes." + }, + "header": { + "title": "Backup e restauração", + "description": "Backup e restauração de host completo para Proxmox VE. Captura o sistema de arquivos, a configuração e os componentes instalados em um único arquivo e reproduz o host na mesma instalação do Proxmox ou em uma instalação diferente, sem dependências externas.", + "section": "Backup e restauração" + }, + "intro": { + "title": "O que é, em um parágrafo", + "body": "Uma cópia do ProxMenux guarda o estado completo de um host Proxmox: o sistema de ficheiros, com os diretórios relevantes em /etc, /root e /var/lib/pve-cluster e os caminhos personalizados opcionais; um manifesto estruturado em JSON com o hardware detetado, parâmetros do kernel, configuração de rede, estado do ZFS, utilizadores e entradas cron; e um inventário de aplicações, com os pacotes que o APT marca como instalados manualmente e os componentes instalados pelo ProxMenux, incluindo as versões exatas. Os três destinos suportados — arquivo local, Proxmox Backup Server (recomendado) e Borg — recebem o mesmo conteúdo autónomo. Qualquer um permite reconstruir o host de destino sem que o host de origem tenha de estar acessível durante o restauro." + }, + "video": { + "heading": "Vídeo passo a passo", + "intro": "Prefere assistir o Backup e Restauração em ação antes de configurá-lo? Este passo a passo abrange uma demonstração completa do recurso em ProxMenux.", + "title": "ProxMenux — Passo a passo sobre backup e restauração", + "caption": "Vídeo externo em YouTube. Reproduz no modo de privacidade aprimorada (sem cookies até você apertar play)." + }, + "whatItIsNot": { + "heading": "O que não é", + "intro": "Esta secção abrange a cópia de segurança e o restauro do host: a instalação do Proxmox, não as aplicações e os sistemas convidados que nela são executados.", + "items": [ + "Não é uma ferramenta de backup de VM/CT. Esta funcionalidade não guarda os discos nem o estado da RAM dos sistemas convidados; essa é a função do vzdump. Os ficheiros de configuração dos convidados (/etc/pve/nodes/<node>/qemu-server/*.conf e lxc/*.conf) são guardados. Após o restauro, o inventário reaparece e os discos podem ser restaurados ou associados a partir de um backup existente no PBS ou em armazenamento local.", + "Não é uma operação sobre todo o cluster. Cada nó cria a sua própria cópia. A pertença ao cluster é guardada em /etc/pve para permitir reintegrar um nó restaurado, mas recuperar todo o cluster exige coordenar o restauro dos vários nós.", + "Não é uma imagem completa do disco. Os binários do kernel, o initramfs e a partição de arranque não são guardados. Durante o restauro, o ProxMenux utiliza os ficheiros de arranque do host de destino, regenerados automaticamente por update-initramfs e pela ferramenta do gestor de arranque, e instala os controladores adequados ao kernel em execução no destino." + ] + }, + "threePillars": { + "heading": "Os três pilares de um backup", + "intro": "Um arquivo ProxMenux é estruturado em torno de três cargas independentes. A restauração usa as três em conjunto para reproduzir o host de origem em um destino que pode nem ter o mesmo kernel instalado.", + "diagramCaption": "Cada backup envia as mesmas três cargas, independentemente do destino. A restauração consome todos os três: rootfs para estabelecer arquivos, manifesto para detectar desvios e diferenças entre kernels e inventário de aplicativos para reinstalar pacotes e componentes no próprio kernel do destino.", + "pillar1Label": "Sistema de ficheiros", + "pillar1Detail": "rootfs/\n(rsync de /etc,\n/etc/systemd/network,\n/root, mais um\ninstantâneo sqlite3\nde /var/lib/pve-cluster,\n+ caminhos opcionais)", + "pillar2Label": "Manifesto", + "pillar2Detail": "manifest.json\n(hardware, parâmetros\ndo kernel, rede,\nZFS, usuários, cron,\npools ZFS, armazenamento)", + "pillar3Label": "Aplicativos", + "pillar3Detail": "packages.manual.list\n+ components_status.json\n(pacotes APT manuais + instaladores\nProxMenux com versões)" + }, + "restoreIsUniversal": { + "heading": "A restauração reproduz o host de origem, não o arquivo", + "body": "A restauração de um backup ProxMenux não extrai apenas o sistema de arquivos. O fluxo de restauração lê o manifesto para detectar desvios entre a origem e o destino (diferenças de hardware, renomeações de NIC, versão do kernel, identidade do pool ZFS), reproduz o sistema de arquivos e aciona o instalador de componente correto para cada serviço que foi instalado na origem (driver NVIDIA, Coral TPU, ferramentas de GPU AMD, ferramentas Intel GPU). Cada instalador é executado no kernel atual do destino, portanto, o host restaurado não depende da presença do kernel da origem. Quando o kernel do destino é mais recente que o do backup, um passo de hidratação independente do kernel mescla o próprio ajuste do usuário (tokens IOMMU, IDs de dispositivos VFIO, peculiaridades personalizadas, chaves GRUB) na nova configuração de inicialização do destino sem copiar arquivos vinculados ao kernel literalmente." + }, + "twoInterfaces": { + "heading": "Duas interfaces, um back-end", + "intro": "Cada etapa do fluxo de trabalho de backup e restauração está disponível em dois pontos de entrada. Ambos chamam a mesma biblioteca shell, produzem arquivos idênticos e leem o mesmo registro de tarefas.", + "cliLabel": "ProxMenux Scripts (TUI)", + "cliDetail": "menu → Utilitários →\nBackup/restauração de host\n\nFluxo baseado em diálogo,\nSSH amigável, programável\npara uso não supervisionado.", + "webLabel": "ProxMenux Monitor (Web UI)", + "webDetail": "Aba Backups na\ninterface web do Monitor.\n\nRestauração com um clique,\nacompanhamento dos logs ao vivo,\nintegração com notificações e o\nvisualizador de diferenças da reversão." + }, + "whereNext": { + "heading": "Para onde ir a partir daqui", + "intro": "Cada subseção abaixo aborda detalhadamente um aspecto do fluxo de trabalho. Comece com Como funciona se o objetivo é entender o que o arquivo contém e por quê. Vá para Destinos para configurar o destino da cópia. Leia Restauração e Restauração entre kernels para o lado da recuperação.", + "items": [ + { + "label": "Como funciona", + "href": "/docs/backup-restore/how-it-works", + "tail": "— os três payloads (rootfs, manifesto, aplicações) em detalhes, com os coletores que os produzem e o formato de cada arquivo." + }, + { + "label": "Destinos", + "href": "/docs/backup-restore/destinations", + "tail": "— comparação entre local, Proxmox Backup Server (recomendado) e Borg, e como configurar cada um." + }, + { + "label": "Criando backups", + "href": "/docs/backup-restore/creating-backups", + "tail": "— backups únicos, perfil de caminho padrão, adição de caminhos personalizados, criptografia para PBS." + }, + { + "label": "Trabalhos agendados", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "— novos trabalhos versus anexação a um trabalho PVE vzdump existente, formatos de agendamento, modal de detalhes do trabalho." + }, + { + "label": "Restauração", + "href": "/docs/backup-restore/restoring", + "tail": "— as três ações em um arquivo (visualizar, baixar, restaurar), restauração completa versus restauração personalizada, o despachante pós-inicialização e por que os últimos dez minutos são importantes." + }, + { + "label": "Restauração entre kernels", + "href": "/docs/backup-restore/cross-kernel", + "tail": " — comportamento que considera a direção da mudança de versão quando o kernel do destino difere do kernel do backup, filtro de subconjunto seguro e quatro fases de hidratação." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/restoring.json b/web/messages/pt/docs/backup-restore/restoring.json new file mode 100644 index 00000000..b58c5d7e --- /dev/null +++ b/web/messages/pt/docs/backup-restore/restoring.json @@ -0,0 +1,282 @@ +{ + "meta": { + "title": "Restaurando um backup — fluxos completos e personalizados ProxMenux", + "description": "O fluxo de trabalho completo de restauração. Documenta as três ações disponíveis em qualquer backup (ver, baixar, restaurar), a verificação de compatibilidade e seus resultados, os modos de restauração Full e Custom, a classificação do caminho que decide o que se aplica ao vivo e o que espera pela próxima inicialização, o expedidor on-boot e o passe de reinstalação do componente pós-boot.", + "ogTitle": "Cópia de segurança ProxMenux — restauração", + "ogDescription": "Fluxos de restauração completos e personalizados com a verificação de compatibilidade, classificação de caminho, despacho on-boot e reinstalação pós-boot.", + "twitterTitle": "Restaurando uma cópia de segurança de ProxMenux", + "twitterDescription": "Como um backup de host ProxMenux é transformado de volta em um host Proxmox funcionando." + }, + "header": { + "title": "Restaurar uma cópia de segurança", + "description": "O fluxo de trabalho completo de restauração: de escolher um arquivo para uma máquina de trabalho. Documenta a verificação de compatibilidade, os dois modos de restauração, o expedidor on-boot, o passe de reinstalação pós-boot, e os mecanismos que tornam previsível o cross-host e o cross-kernel.", + "section": "Cópias de segurança e restauro" + }, + "intro": { + "title": "A restauração reproduz a fonte, não apenas os arquivos", + "body": "Restaurar um backup ProxMenux exige mais que extrair arquivos. Antes das alterações, o manifesto é consultado para detectar diferenças entre origem e destino, caminhos que poderiam impedir o boot são excluídos e ajustes do usuário que não podem ser copiados literalmente são adaptados. Após a reinicialização necessária, tenta-se reinstalar os componentes compatíveis registrados (driver NVIDIA, Coral TPU e ferramentas GPU) para o kernel em execução no destino. Um único arquivo orienta a compatibilidade, a classificação dos caminhos e o trabalho durante e após o boot. Verifique os resultados dos componentes e os logs para confirmar o resultado." + }, + "threeActions": { + "heading": "Três ações em um backup", + "intro": "A seleção de uma cópia de segurança da lista abre um menu com três ações.", + "actionRows": [ + { + "action": "Ver", + "detail": "Abre uma visão somente de leitura do arquivo: conteúdo manifest.json (nome do host de origem, versão PVE, kernel, hardware, componentes instalados), a lista de caminhos dentro do rootfs/, e uma diff do que mudaria no host atual se o backup fosse aplicado." + }, + { + "action": "Transferir", + "detail": "Exporta o arquivo como um arquivo portátil .tar.zst (tar comprimido com zstd). Pode ser extraído em qualquer sistema Linux com tar --zstd -xf FILE.tar.zst, ou em macOS/Windows com qualquer ferramenta que suporte zstd (7-Zip, PeaZip, Keka...). A árvore extraída contém manifest.json, metadata/ e rootfs/ — exatamente o mesmo layout que a restauração consome. Útil para inspeção offline ou para restauração em um host sem acesso ao destino original (PBS, Borg)." + }, + { + "action": "Restaurar", + "detail": "O caminho de escrita. Extrai o arquivo em um diretório de encenação, executa a verificação de compatibilidade e apresenta o seletor de modo (Full ou Custom)." + } + ] + }, + "compatibilityCheck": { + "heading": "Verificação da compatibilidade", + "intro": "Antes de qualquer arquivo ser escrito, hb_compat_check compara o estado descrito no manifesto contra o host alvo. A verificação executa somente leitura e produz quatro saídas independentes que impulsionam o resto da restauração.", + "outputRows": [ + { + "output": "Marca da direcção", + "detail": "HB_COMPAT_KERNEL_DIRECTION assume same, bk_newer ou bk_older ao comparar as versões principais do kernel do backup e do destino. Orienta o filtro de caminhos seguros entre kernels, ativo apenas em bk_older, e a adaptação de ajustes descrita na página correspondente." + }, + { + "output": "Lista de caminhos excluídos", + "detail": "RS_SKIP_PATHS — cada caminho que a restauração não deve aplicar-se. Populado por dois mecanismos: deriva de hardware (falta de NIC, falta de ID de armazenamento, estrangeiro ZFS pool) e — quando a direcção é bk_older — a lista dos caminhos insegura." + }, + { + "output": "Plano de remapeamento da NIC", + "detail": "Quando um NIC no alvo tem o mesmo MAC que um na fonte, mas um nome diferente (típico após uma troca de placa-mãe), a verificação de compatibilidade registra um plano de renome (HB_NIC_REMAP) que irá reescrever /etc/network/interfaces durante a restauração." + }, + { + "output": "Plano de reversão", + "detail": "Calculado por compute_rollback_plan.sh. Lista VMs, LXCs e componentes presentes no destino e ausentes do backup. A confirmação permite remover os hóspedes adicionais antes de reiniciar. A remoção dos componentes continua manual e a exclusão dos hóspedes pode falhar, sem garantia de correspondência exata." + } + ], + "reportBody": "A verificação também emite um relatório estruturado (HB_COMPAT_RESULTS) classificado como PASS / INFO / WARN / FAIL. AVISO e entradas de FAIL superfície no painel pré-restaurar; a restauração se recusa a prosseguir apenas quando um FAIL está presente que o usuário não pode resolver clicando em Continuar." + }, + "twoModes": { + "heading": "Restauração completa vs Restauração personalizada", + "intro": "Após a verificação de compatibilidade, aparece a escolha do modo. Ela determina o que aplicar e não como: os dois modos usam o mesmo processo.", + "modeRows": [ + { + "mode": "Restauração completa", + "detail": "Aplica cada caminho no arquivo que sobrevive aos filtros de deriva e cross-kernel. Também executa a instalação do pacote e o componente auto-reinstalar passe. Este é o padrão e a escolha recomendada — o objetivo é reproduzir a fonte, não pegar peças." + }, + { + "mode": "Restauração personalizada", + "detail": "Abre uma lista de verificação mostrando cada caminho que o arquivo carrega. O usuário marca um subconjunto. Os caminhos bloqueados pelo filtro do kernel cruzado aparecem acinzentados e não podem ser selecionados. A instalação do pacote e a auto-reinstalação do componente são ignoradas por padrão no modo Personalizado — o usuário está sinalizando que deseja uma aplicação parcial, não uma reprodução completa." + } + ] + }, + "pathClassification": { + "heading": "Como os caminhos são classificados", + "intro": "Cada caminho selecionado para a restauração é classificado por hb_classify_path em uma das três categorias. A categoria determina quando o caminho é aplicado ao sistema e porquê.", + "rows": [ + { + "class": "hot", + "detail": "Caminhos aplicados imediatamente para o sistema de execução. O serviço que os consome capta a mudança por conta própria ou na próxima recarga — não é necessário reiniciar. Estes são a maior parte de um backup: /etc/ssh, /etc/apt, /etc/cron.*, /root, /usr/local/bin, arquivos de configuração de serviço geral, etc." + }, + { + "class": "reboot", + "detail": "Caminhos adiados para a próxima inicialização, em vez de aplicados imediatamente por este processo. Afetam a configuração de boot: a geração do carregador lê /etc/default/grub, as montagens usam /etc/fstab e a carga de módulos usa /etc/modules. Os arquivos pendentes são aplicados após reiniciar e os artefatos de boot necessários são então regenerados. Exemplos: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + }, + { + "class": "dangerous", + "detail": "Caminhos que são NÃO aplicados no sistema em execução — uma gravação ao vivo pode corromper o estado ou soltar a conexão ativa. Estes são encenados no conjunto pendente e escritos pelo expedidor pós-boot após a reinicialização, quando o cluster está acima, mas o sistema ainda não está totalmente em uso. Exemplos: /etc/pve (pmxcfs é uma montagem FUSE com a configuração ativa do cluster), /var/lib/pve-cluster (dados de cluster ao vivo), /etc/network (poderia reconfigurar a própria interface que o usuário está conectado sobre SSH e soltar a sessão)." + } + ] + }, + "fullFlow": { + "heading": "O fluxo de trabalho completo de restauração", + "intro": "O pipeline completo da seleção de arquivos para uma máquina de trabalho restaurada. Cada etapa alimenta a seguinte; o estado escrito por fases anteriores é consumido por fases posteriores.", + "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" + }, + "pendingMachinery": { + "heading": "A máquina de restauro pendente", + "intro": "Os caminhos classificados como reboot ou dangerous, e a hidratação escreve, são encenados para o próximo boot em vez de serem aplicados ao vivo. Isto é feito através de um pequeno conjunto de arquivos auto-suficientes sob /var/lib/proxmenux/pending-restore/:", + "rows": [ + { + "file": "apply-on-boot.list", + "content": "Um caminho relativo por linha — o conjunto exato de caminhos apply_pending_restore.sh será aplicado a partir dos rootfs encenados. A leitura deste ficheiro diz ao utilizador exactamente o que irá mudar na próxima inicialização." + }, + { + "file": "plan.env", + "content": "Variáveis de ambiente carregadas pelo script de inicialização: ID da restauração, indicadores de compatibilidade (HB_COMPAT_CROSS_VERSION, HB_COMPAT_KERNEL_DIRECTION, HB_HYDRATION_APPLIED), consentimento para reversão e opções do cluster." + }, + { + "file": "rs-skip-paths.txt", + "content": "A lista final RS_SKIP_PATHS, persistiu assim que apply_pending_restore.sh aplica as mesmas exclusões após reinicialização que foram computadas durante a etapa interativa. Impedi que caminhos inseguros sejam restaurados no momento do arranque." + }, + { + "file": "rootfs/", + "content": "Os próprios arquivos encenados — os bytes exatos que serão estabelecidos. Mantido no mesmo sistema de arquivos que / para que o rsync on-boot é rápido e não depende de armazenamento externo ainda sendo acessível no arranque." + } + ], + "unitBody": "A unidade systemd proxmenux-restore-onboot.service é ativada ao fim da etapa interativa. Esse serviço executa uma vez no início do próximo boot, chama apply_pending_restore.sh e depois se desativa. A condição ConditionPathExists=/var/lib/proxmenux/pending-restore/state impede qualquer ação quando não há restauração pendente." + }, + "postbootDispatcher": { + "heading": "O expedidor pós-boot — apply_cluster_postboot.sh", + "intro": "Onde termina o passo interativo e onde acontece a reprodução real do hospedeiro. O apply_cluster_postboot.sh é instalado como uma segunda unidade systemd de um tiro (proxmenux-apply-cluster-postboot.service) cujos alvos After=/Wants= garantem que ele seja executado apenas após pve-cluster e network-online estão em cima. Aqui é onde o hospedeiro-visível restaurar ações terra.", + "tasks": [ + { + "task": "Aplicar /etc/pve", + "detail": "/etc/pve é uma montagem FUSE ao vivo pmxcfs — não pode ser escrita no arranque inicial. O expedidor copia arquivos dos rootfs pendentes para o /etc/pve ao vivo uma vez que o sistema de arquivos de cluster está acima, um arquivo de cada vez, sem reiniciar pve-cluster. O /var/lib/pve-cluster/config.db capturado do backup (ou o config.db.raw-fallback) é materializado com o systemctl stop pve-cluster → cópia de arquivo atômico → systemctl start pve-cluster padrão, então pmxcfs re-ler o estado restaurado no caminho de volta." + }, + { + "task": "Reconstruir initramfs e bootloader", + "detail": "Executa update-initramfs -u -k all através de cada kernel instalado, em seguida, update-grub (GRUB instala) ou proxmox-boot-tool refresh (systemd-boot / ZFS instala). Pulou se o passo interativo determinou que nada mudou nos caminhos que afetam essas ferramentas." + }, + { + "task": "Reinstalar automaticamente o componente", + "detail": "Lê components_status.json restaurado e percorre os instaladores compatíveis (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Cada instalador selecionado usa --auto-reinstall, lê o estado registrado e reinstala para o ambiente de destino, recompilando módulos quando necessário. A operação espera o reboot para usar o kernel então ativo. Falhas individuais são registradas e não interrompem o próximo componente." + }, + { + "task": "Verificação da inicialização", + "detail": "Antes de iniciar a notificação de conclusão, verifica que proxmox-boot-tool status mostra um ESP configurado, cada /boot/vmlinuz-* tem um diretório /lib/modules/<ver> correspondente, e /vmlinuz resolve. Qualquer inconsistência aparece na notificação em vez de ser escondida." + }, + { + "task": "Notificação de conclusão", + "detail": "Envia o evento Host restore finished através de hb_notify_lifecycle. Inclui duração total, contagem de caminhos aplicados, avisos de verificação de sanidade, se houver, e um link para o log em /var/log/proxmenux/proxmenux-cluster-postboot-*.log. Se as notificações não forem configuradas, o evento é silencioso — o registro ainda registra tudo." + } + ] + }, + "liveProgress": { + "heading": "Progresso ao vivo na aba Backups do Monitor", + "body": "Após a reinicialização da guia Backups do ProxMenux Monitor, um cartão pós-restore ao vivo reflete o estado do proxmenux-apply-cluster-postboot.service enquanto ele é executado. O cartão é conduzido pelo /var/lib/proxmenux/restore-state.json, que o expedidor atualiza em cada marco (aplicar configuração de cluster, reconstruir initramfs, atualizar carregador de boot, reinstalar por componente, verificar sanidade de inicialização, finalizar).", + "fields": [ + { + "name": "Emblema de estado", + "detail": "Um dos estados Restauração em andamento, Restauração concluída ou Restauração falhou. O cartão consulta o arquivo a cada 2 segundos durante a execução e a cada 30 segundos depois." + }, + { + "name": "Barra de progresso + contador de passos", + "detail": "Mostra N/M steps e o nome da etapa atual. Durante a restauração, o tempo estimado é calculado com base nas etapas concluídas e no tempo decorrido." + }, + { + "name": "Lista de componentes", + "detail": "Uma linha por driver sendo reinstalado (NVIDIA, ferramentas Intel GPU, ferramentas AMD, Coral TPU) com installing / ok / failed mais um link para o log por componente em /var/log/proxmenux/component-*.log." + }, + { + "name": "Importação de pools de dados", + "detail": "O bloco data_pools_import mostra cinco linhas coloridas: Importados, Forçados (com -f por hostid de outro host), Ignorados, discos parciais (apenas alguns discos presentes), Ignorados, discos ausentes (nenhum disco presente) e Falhas. O estado fica em /var/lib/proxmenux/restore-state.json e o log bruto da execução em /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "name": "Avisos de integridade de inicialização", + "detail": "O processo verifica diretórios /lib/modules/<kernel> ausentes, falta de configuração ESP e links simbólicos /vmlinuz com destino inexistente. Os avisos aparecem em uma faixa colorida." + }, + { + "name": "Delta de reversão", + "detail": "Lista VMs, LXCs e componentes que existem no alvo, mas não estavam na cópia de segurança restaurada — as mesmas entradas surgiram na janela de rollback destrutivo pré-restore. Cada linha carrega o comando de limpeza manual." + }, + { + "name": "Cauda de log", + "detail": "A última 600 linhas de proxmenux-cluster-postboot-<ts>.log, com Apenas questões filtro que mantém apenas linhas correspondentes error, warning, failed, ✗ ou traceback." + } + ], + "dismissBody": "Uma vez que a restauração é completo ou falhado, um botão de Dispensa colapsa o cartão. O arquivo de estado está preservado e o botão Histórico reabre-o mais qualquer restauração anterior (as últimas execuções 20 são arquivadas sob /var/lib/proxmenux/restore-history/).", + "imageAlt": "Janela Detalhes do progresso da restauração no ProxMenux Monitor durante a execução: indicador azul, etapa Reconstruindo initramfs, tempo restante estimado, barra parcialmente preenchida e últimas linhas do log em tempo real.", + "imageCaption": "O modal Detalhes enquanto o expedidor pós-boot ainda está em execução — emblema, passo atual, tempo restante e cauda de log ao vivo.", + "detailsImageAlt": "O mesmo modo Detalhes após a restauração ter terminado, com o emblema verde Restaurar completo, a duração total de execução (0m53s), uma barra de progresso 6/6, o delta de Rollback vazio e o log de postboot arquivado.", + "detailsImageCaption": "O mesmo modal uma vez que a execução tenha terminado — emblema, duração total, barra de progresso preenchida e o log de postboot arquivado." + }, + "postbootExample": { + "heading": "Como é o post-boot na consola", + "body": "No console físico, um processo encerrado com sucesso mostra [ OK ] Finished proxmenux-apply-cluster-postboot.service, geralmente perto dos OK de multi-user.target e graphical.target. Isso marca o fim do processo. Ainda podem existir falhas de componentes ou avisos de boot registrados; confira os estados e logs no Monitor antes de considerar o host totalmente restaurado.", + "imageAlt": "Console físico Proxmox com '[ OK ] Finished proxmenux-apply-cluster-postboot.service - ProxMenux Apply Cluster Configs (post-boot).', seguido de OK para multi-user.target e graphical.target, com a solicitação de login acima.", + "imageCaption": "Console físico ao fim do processo. 'Finished proxmenux-apply-cluster-postboot.service' marca a conclusão, também indicada por 'Host restore finished' no Monitor. Os resultados dos componentes e os avisos ainda precisam ser verificados." + }, + "tenMinutes": { + "heading": "Por que os últimos dez minutos importam", + "intro": "A reinicialização em si leva segundos, mas o expedidor pós-boot passa cerca de dez minutos terminando a restauração. Durante esta janela, o host é acessível e o login funciona, mas alguns serviços (principalmente GPU-driver-dependentes) ainda não estão disponíveis. Discriminação de tempo para um host Proxmox típico com NVIDIA + Coral instalado:", + "rows": [ + { + "stage": "Boot + pve-cluster pronto", + "time": "~30 s", + "detail": "Inicialização padrão do Proxmox. SSH, interface web e login ficam disponíveis ao fim desta etapa." + }, + { + "stage": "Aplicar /etc/pve aos pmxcfs", + "time": "~10 s", + "detail": "Rápido — pequenos arquivos de configuração copiados um por um para o sistema de arquivos de cluster ao vivo." + }, + { + "stage": "Reconstruir initramfs entre kernels", + "time": "3–5 min", + "detail": "update-initramfs -u -k all reconstrói uma imagem initramfs por kernel instalado. O volume da espera." + }, + { + "stage": "Reconstruir a configuração do carregador de arranque", + "time": "10–30 s", + "detail": "update-grub ou proxmox-boot-tool refresh. Rápido mesmo em ZFS." + }, + { + "stage": "Reinstalação do controlador NVIDIA (se aplicável)", + "time": "5–10 min", + "detail": "Baixa a versão gravada do driver, compila os módulos DKMS contra o kernel atual, aplica o patch ProxMenux se a fonte o tiver. Uma tarefa mais longa." + }, + { + "stage": "Reinstalação do Coral e de outros componentes", + "time": "3–5 min", + "detail": "Compilação DKMS para Coral, apt install para intel-gpu-tools e download e instalação do .deb para amdgpu_top." + }, + { + "stage": "Verificação de inicialização e notificação", + "time": "~2 s", + "detail": "Exige poucos recursos. A notificação informa o usuário assim que a execução termina." + } + ], + "outroBody": "Nesse intervalo, ferramentas podem faltar após o login (nvidia-smi não encontrado, coral não detectado) porque a reinstalação continua em segundo plano. A notificação marca o fim do processo; confira resultados dos componentes, avisos e logs para distinguir sucessos de falhas individuais." + }, + "destructiveRollback": { + "heading": "O retrocesso destrutivo opcional", + "body": "A restauração é aditiva por padrão: VMs, LXCs e componentes adicionais permanecem. Se houver diferenças, a confirmação oferece Executar reversão destrutiva?, com Não por padrão. Aceitar chama _rs_execute_rollback antes do reboot para tentar excluir as VMs e os LXCs adicionais listados. Componentes são indicados para desinstalação manual, pois a automática não foi implementada. Falhas de exclusão são informadas e o processo continua, sem garantia de correspondência exata. Confira nomes e VMIDs/CTIDs antes dessa opção destrutiva." + }, + "logs": { + "heading": "Onde ficam os logs", + "rows": [ + { + "log": "/var/log/proxmenux/restore-YYYYMMDD_HHMMSS.log", + "detail": "Gravado na etapa interativa: resultados de compatibilidade, filtro de diferenças, plano de adaptação, saídas da aplicação em execução e da preparação pendente, instalação de pacotes." + }, + { + "log": "/var/log/proxmenux/apply-pending-YYYYMMDD_HHMMSS.log", + "detail": "Gravado por apply_pending_restore.sh no início do boot: carregamento de plan.env, processamento de apply-on-boot e filtro dos caminhos excluídos." + }, + { + "log": "/var/log/proxmenux/proxmenux-cluster-postboot-YYYYMMDD_HHMMSS.log", + "detail": "Escrito por apply_cluster_postboot.sh. Contém: pve-cluster aplicar, initramfs e saída bootloader, por componente saída instalador, verificação de sanidade, carga útil de notificação." + }, + { + "log": "/var/log/proxmenux/component--YYYYMMDD_HHMMSS.log", + "detail": "Um log por componente instalador (nvidia, coral, etc.) que correu na passagem pós-boot. Útil quando a reinstalação de um componente específico falhou e o usuário precisa da própria saída da ferramenta." + }, + { + "log": "/var/log/proxmenux/restore-datapools-YYYYMMDD_HHMMSS.log", + "detail": "Escrito por _rs_import_data_pools. Contém: enumeração de pools não-root do manifesto, resultado por pool (importado de forma limpa, importado com -f para hostida estrangeira, ignorado devido à falta de discos, ou falhou), e a saída bruta de cada chamada zpool import." + } + ] + }, + "whereNext": { + "heading": "Para onde ir a seguir", + "items": [ + { + "label": "Restauração do kernel cruzado", + "href": "/docs/backup-restore/cross-kernel", + "tail": " — o filtro seguro de direcção e o passe de hidratação invocado quando o núcleo alvo difere do do backup." + }, + { + "label": "Como funciona", + "href": "/docs/backup-restore/how-it-works", + "tail": " — a estrutura do arquivo, o manifesto e o inventário de aplicativos usados pela restauração." + }, + { + "label": "Trabalhos agendados", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " — o fluxo não acompanhado que produz os arquivos que esta página consome." + } + ] + } +} diff --git a/web/messages/pt/docs/backup-restore/scheduled-jobs.json b/web/messages/pt/docs/backup-restore/scheduled-jobs.json new file mode 100644 index 00000000..44f8fe5a --- /dev/null +++ b/web/messages/pt/docs/backup-restore/scheduled-jobs.json @@ -0,0 +1,152 @@ +{ + "meta": { + "title": "Trabalhos agendados — temporizadores, modo de anexação, retenção ProxMenux", + "description": "Trabalhos de backup programados do host ProxMenux. Dois modos de criação (horário systemd próprio ou anexar a um trabalho existente PVE vzdump), valores de retenção aplicados por trabalho via proxmox-backup-client/borg/local prune, layout de armazenamento sob /var/lib/proxmenux/backup-jobs, e o script de execução que produz arquivos idênticos ao fluxo interativo.", + "ogTitle": "Cópia de segurança ProxMenux — tarefas agendadas", + "ogDescription": "Backups de host agendados não vigiados com modo de anexação, retenção e os mesmos três destinos do fluxo interativo.", + "twitterTitle": "Trabalhos agendados | ProxMenux", + "twitterDescription": "Trabalhos de backup agendados sem acompanhamento com modo de anexação e retenção." + }, + "header": { + "title": "Trabalhos agendados", + "description": "Trabalhos de backup da máquina não vigiados. Dois modelos de criação: um novo trabalho independente com sua própria programação, ou um trabalho anexado a uma tarefa existente PVE vzdump que herda o cronograma e retenção dessa tarefa. Ambos produzem arquivos idênticos ao fluxo interativo.", + "section": "Cópias de segurança e restauro" + }, + "intro": { + "title": "Os dois modelos de trabalho programados", + "body": "Um trabalho programado pode ser criado seguindo um dos dois modelos:", + "modelsList": [ + "Novo trabalho independente — ProxMenux define o horário de trabalho com seu próprio temporizador systemd, independente de qualquer outra tarefa no host. Compatível com os três destinos: Local, PBS e Borg.", + "Anexar a uma tarefa existente PVE vzdump — o trabalho não tem agendamento próprio; ele é executado automaticamente sempre que a tarefa pai PVE vzdump que já faz backup das VMs e LXCs nesta máquina dispara. Herda a programação e a retenção da tarefa dos pais. Compatível com Local e PBS (Borg não é suportado porque PVE não tem agendador nativo para Borg)." + ] + }, + "attachBadge": { + "title": "Modo de anexação — recomendado quando já existe uma tarefa PVE vzdump", + "body": "Se já existe uma tarefa vzdump PVE para as VMs e LXCs do nó, anexar o backup do host faz com que ele seja executado depois do backup dos convidados, no mesmo ciclo de backup. Na restauração, as configurações dos convidados vêm do backup do host (em /etc/pve) e os discos vêm dos backups vzdump desse ciclo. Isso ajuda a coordenar a recuperação do nó inteiro, mas não é um snapshot atômico: alterações durante o ciclo podem deixar diferenças entre a configuração do host e o estado dos discos dos convidados." + }, + "frequencyBadge": { + "title": "Frequência recomendada", + "body": "Para maximizar a compatibilidade entre um backup do host e sua restauração futura, faça backups frequentes. Quanto mais próxima a cópia estiver do estado atual do host, menos diferenças de configuração, pacotes e componentes a restauração precisará conciliar." + }, + "modes": { + "heading": "Os dois modos", + "rows": [ + { + "mode": "Novo trabalho agendado", + "backends": "Local, PBS, Borg", + "schedule": "Expressão OnCalendar própria (sintaxe de calendário systemd, por exemplo daily ou Mon..Fri 03:00).", + "retention": "Solicitado separadamente: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. Aplicado pelo script de execução após cada backup bem sucedido." + }, + { + "mode": "Anexar a uma tarefa PVE vzdump", + "backends": "Local, PBS (Borg não tem agendador do lado PVE)", + "schedule": "Herdado da tarefa PVE principal. Nenhum temporizador systemd é instalado no lado do ProxMenux.", + "retention": "Herdada da configuração prune-backups da tarefa principal (mapeada um a um para as variáveis KEEP_* do script de execução via hb_pve_prune_to_keep_env)." + } + ] + }, + "attachDetail": { + "heading": "Como funciona o modo de anexação", + "intro": "O PVE grava as tarefas vzdump em /etc/pve/jobs.cfg, com uma seção por tarefa indicando o armazenamento dos backups de VM e LXC. O modo de anexação exige um backend suportado pelo ProxMenux (Local ou PBS). O backup do host é executado pelo hook job-end após o fim da tarefa de backup dos convidados.", + "steps": [ + { + "step": "1", + "detail": "Durante a criação do trabalho, ProxMenux lista tarefas PVE pai compatíveis via hb_pve_list_vzdump_jobs_for_backend. O utilizador escolhe uma." + }, + { + "step": "2", + "detail": "O .env do trabalho é escrito com PVE_PARENT_JOB, PVE_STORAGE e os valores herdados KEEP_*; nenhum temporizador systemd é criado." + }, + { + "step": "3", + "detail": "hb_install_vzdump_hook registra um hook em /etc/vzdump.conf. Na fase job-end de qualquer tarefa vzdump, compara o $STOREID recebido com o PVE_STORAGE de cada trabalho anexado e habilitado, chamando o script de execução para as correspondências. A associação é feita pelo armazenamento, não pelo ID da tarefa principal selecionada." + }, + { + "step": "4", + "detail": "O arquivo é salvo no mesmo armazenamento dos backups vzdump: path/dump/ para Local ou o repositório PBS configurado na entrada de armazenamento PVE." + } + ], + "outroBody": "O modo de anexação não tem temporizador próprio. Desabilitar ou excluir a tarefa PVE principal selecionada interrompe esse disparo, mas outra tarefa vzdump usando o mesmo armazenamento ainda pode acionar o backup do host. Desabilite ou exclua o próprio trabalho ProxMenux para impedir isso. Ao ser desabilitada, a entrada permanece no disco e pode ser reativada ou anexada novamente." + }, + "storageLayout": { + "heading": "Arquivos que compõem um trabalho", + "intro": "Cada trabalho agendado é totalmente descrito por três ou quatro arquivos no disco. Lendo-os dá a configuração completa do trabalho sem depender da interface.", + "rows": [ + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env", + "content": "Infraestrutura, ID de backup ou destino, agenda (novo modo) ou pai PVE (modo de Attach), sinalizador habilitado, valores de retenção KEEP_*, ponteiros de credenciais." + }, + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths", + "content": "Um caminho absoluto por linha — a seleção congelada resolvido a partir do perfil no tempo de criação de emprego. A edição do ficheiro volta a executar o trabalho com a nova selecção no próximo temporizador." + }, + { + "path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service", + "content": "Apenas modo novo. O serviço invoca o run_scheduled_backup.sh JOB_ID. O timer agenda-o com Persistent=true (execuções perdidas recuperadas na próxima inicialização) e um pequeno RandomizedDelaySec=120 para espalhar carga quando vários trabalhos compartilham a mesma expressão OnCalendar." + }, + { + "path": "/etc/vzdump.conf script-hook", + "content": "Somente modo de anexação. Instalado uma vez por hb_install_vzdump_hook; compara PVE_STORAGE de cada trabalho anexado com $STOREID, passado pelo PVE ao hook." + } + ] + }, + "runner": { + "heading": "O que um trabalho faz quando dispara", + "intro": "Cada trabalho — novo ou anexado — executa a mesma sequência de três passos:", + "steps": [ + "Prepare o backup. Lê a configuração do trabalho (destino, perfil, caminhos) e monta a árvore de arquivos exatamente da mesma forma que o fluxo interativo faz. O resultado é o mesmo arquivo que um backup manual com essas configurações produziria.", + "Escreva o destino. Envia ou escreve o arquivo para o destino configurado — um arquivo .tar.zst local, um backup PBS, ou um arquivo Borg — usando exatamente as mesmas ferramentas e credenciais que um backup manual para o mesmo destino usaria.", + "Aplicar retenção. Remove backups antigos do destino, mantendo as contagens keep-last / keep-daily / keep-weekly configuradas no trabalho. A poda é realizada pelo próprio destino: PBS aplica sua própria retenção, Borg executa borg prune, e para ProxMenux Local apaga os arquivos que caem fora da janela keep-last." + ] + }, + "management": { + "heading": "Gestão de tarefas", + "intro": "O menu de agendamento (Scripts TUI) e a aba Monitor Backups expõem as mesmas ações em qualquer trabalho.", + "rows": [ + { + "action": "Executar agora", + "detail": "Chama imediatamente o script de execução, sem esperar o temporizador ou o hook vzdump. Útil para verificar a configuração sem aguardar a próxima execução agendada." + }, + { + "action": "Activar / Desactivar", + "detail": "Novo modo: systemctl enable/disable --now o temporizador. Modo Anexar: altera o sinalizador ENABLED no env de trabalho — o script gancho honra-o na próxima execução PVE." + }, + { + "action": "Editar", + "detail": "Abre novamente o destino, agenda, perfil e avisos de retenção e reescreve os arquivos de trabalho. Preserva a identificação do trabalho." + }, + { + "action": "Excluir", + "detail": "Remove o env do trabalho, o arquivo de caminhos, o temporizador e o serviço systemd (modo novo) e desativa a associação ao hook (modo de anexação). Não altera os arquivos já existentes no destino." + }, + { + "action": "Ver registo", + "detail": "Mostra em tempo real /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log — um arquivo de log por execução. O executor também emite uma linha de status compacta para journald no serviço systemd." + } + ] + }, + "notifications": { + "heading": "Notificações", + "body": "Cada execução programada dispara os mesmos eventos hb_notify_lifecycle que o fluxo interativo (start, complete, fail). Se os canais de notificação estiverem configurados no Monitor, os trabalhos não vigiados mostram seus resultados da mesma forma que backups manuais – um usuário não precisa verificar o log para saber se um trabalho foi bem sucedido." + }, + "whereNext": { + "heading": "Para onde ir a seguir", + "items": [ + { + "label": "Criando backups", + "href": "/docs/backup-restore/creating-backups", + "tail": " — o fluxo interactivo que partilha a infra-estrutura com o agendador." + }, + { + "label": "Destinos", + "href": "/docs/backup-restore/destinations", + "tail": " — a configuração por infra-estrutura utilizada tanto pelo fluxo interactivo como pelo agendador." + }, + { + "label": "Restauração", + "href": "/docs/backup-restore/restoring", + "tail": " — o fluxo que utiliza os backups produzidos pelos trabalhos." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/creating-backups.json b/web/messages/sk/docs/backup-restore/creating-backups.json new file mode 100644 index 00000000..3fc89c76 --- /dev/null +++ b/web/messages/sk/docs/backup-restore/creating-backups.json @@ -0,0 +1,220 @@ +{ + "meta": { + "title": "Vytváranie záloh — interaktívny postup zálohovania | ProxMenux", + "description": "Interaktívny postup zálohovania v ProxMenux: dva vstupné body (ponuka TUI nástroja Scripts a webové rozhranie Monitor), tri ciele, dva režimy profilu, jeden krok dočasnej prípravy a jeden potvrdzovací dialóg. Stránka opisuje maticu šiestich možností, predvolený a vlastný profil a to, čo používateľ vidí od výberu zálohy až po uloženie archívu do cieľa.", + "ogTitle": "Zálohovanie ProxMenux — vytváranie záloh", + "ogDescription": "Interaktívny postup zálohovania s tromi cieľmi, dvoma profilmi a spoločným krokom dočasnej prípravy.", + "twitterTitle": "Vytváranie záloh | ProxMenux", + "twitterDescription": "Interaktívny postup zálohovania s tromi cieľmi a dvoma režimami profilu." + }, + "header": { + "title": "Vytváranie záloh", + "description": "Interaktívny postup zálohovania: vyberte cieľ a profil, skontrolujte súhrn v potvrdzovacom dialógu a sledujte uloženie archívu. Oba vstupné body používajú rovnaký backend a vytvárajú zhodné archívy.", + "section": "Záloha a obnova" + }, + "intro": { + "title": "Dva vstupné body, rovnaká funkčnosť", + "body": "TUI nástroja Scripts a webové rozhranie Monitor ponúkajú presne rovnaké funkcie. Každá záloha — manuálna aj plánovaná — prechádza rovnakou maticou výberu (tri ciele × dva profily) a pre každú bunku volá rovnakú funkciu backendu (_bk_pbs, _bk_borg alebo _bk_local). Archívy vytvorené cez oba vstupné body sú nerozoznateľné. Výber závisí od preferencií: TUI je vhodné pre SSH a skripty; Monitor umožňuje ovládanie myšou a obsahuje aj zobrazenia upozornení a priebežného výpisu záznamov." + }, + "entryPoints": { + "heading": "Dva vstupné body", + "rows": [ + { + "entry": "ProxMenux Scripts (TUI)", + "path": "menu → Utilities → Host Config Backup", + "detail": "Dialógový tok, SSH-priateľský. Hlavné menu predstavuje šesť možností priamo. Používa backup_menu v backup_host.sh." + }, + { + "entry": "ProxMenux Monitor (webové rozhranie)", + "path": "Backups tab → Create backup", + "detail": "Postup vedený sprievodcom. Rovnakých šesť možností je zobrazených v dvojkrokovom formulári (cieľ → profil). Cez rozhranie Flask API sa volajú rovnaké funkcie backendu." + } + ] + }, + "modes": { + "heading": "Manuálne vs plánované zálohy", + "body": "Zálohy možno vytvárať v dvoch režimoch: manuálne (interaktívny postup opísaný na tejto stránke — používateľ vyberie cieľ a profil z ponuky a sleduje uloženie archívu) alebo plánovane (úloha bez obsluhy, ktorá sa spúšťa časovačom v štýle cron a používa pravidlá uchovávania nastavené pre danú úlohu). Oba režimy podporujú rovnaké tri ciele a dva profily a sú dostupné cez oba vstupné body — ponuku TUI nástroja Scripts a kartu Backups v Monitore. Plánované úlohy používajú cez run_scheduled_backup.sh rovnaké funkcie backendu ako manuálny postup; vytvorené archívy sú nerozoznateľné.", + "seeAlso": "Stránka plánovaných úloh opisuje celý postup vrátane vytvorenia úlohy, jej pripojenia k existujúcemu časovaču vzdump v PVE a nastavenia hodnôt uchovávania.", + "monitorAlt": "ProxMenux Monitor Zálohy zobrazí nový plánovaný dialóg zálohovania s cieľovým, profilom, harmonogramom a retenčnými poľami.", + "monitorCaption": "Plánovaná záloha — ProxMenux Monitor. Rovnaký dialóg sprievodcu ako pri manuálnej zálohe má v dolnej časti polia plánu a uchovávania pre spúšťanie bez obsluhy." + }, + "matrix": { + "heading": "Matica šiestich možností", + "intro": "Výber určuje spustený backend aj použitú stratégiu výberu ciest. Podrobnosti o konfigurácii každej bunky nájdete na stránkach jednotlivých cieľov.", + "rows": [ + { + "combo": "1", + "destination": "PBS", + "profile": "Štandardné", + "action": "Uploaduje štandardný profil plus trvalé doplnky do nakonfigurovaného PBS úložiska." + }, + { + "combo": "2", + "destination": "Borg", + "profile": "Štandardné", + "action": "Vytvorí archív so štandardným profilom plus trvalé doplnky vo vybranom úložisku Borg." + }, + { + "combo": "3", + "destination": "Lokálne", + "profile": "Štandardné", + "action": "Napíše archív .tar.zst so štandardným profilom plus trvalé doplnky k nakonfigurovanému lokálnemu cieľu." + }, + { + "combo": "4", + "destination": "PBS", + "profile": "Vlastné", + "action": "Pred odoslaním do PBS otvorí výber ciest; používateľ zaškrtne požadované cesty a môže pridať nové." + }, + { + "combo": "5", + "destination": "Borg", + "profile": "Vlastné", + "action": "Pred vytvorením archívu Borg otvorí výber ciest." + }, + { + "combo": "6", + "destination": "Lokálne", + "profile": "Vlastné", + "action": "Pred zápisom lokálneho súboru .tar.zst otvorí výber ciest." + } + ] + }, + "profiles": { + "heading": "Štandardný vs vlastný profil", + "defaultTitle": "Predvolený profil", + "defaultBody": "Predvolený profil je pripravený zoznam z hb_default_profile_paths (opísaný v časti Ako to funguje pod nadpisom Kategórie ciest) spolu so všetkými položkami zo súboru trvalých doplnkov /usr/local/share/proxmenux/backup-extra-paths.txt. Používateľ potvrdí cieľ a možnosti šifrovania a záloha pokračuje bez ďalšieho výberu ciest.", + "customTitle": "Vlastný profil", + "customBody": "Vlastný profil otvorí zoznam so všetkými cestami predvoleného profilu (nezaškrtnuté) a všetkými trvalými doplnkami (vopred zaškrtnuté, s predponou [+]). Používateľ zaškrtne cesty pre toto spustenie a cez Pridať vlastnú cestu môže doplniť novú absolútnu cestu. Takto pridaná cesta sa uloží do backup-extra-paths.txt, aby ju budúce zálohy zahrnuli automaticky bez opätovného pridávania. Odškrtnutie trvalého doplnku ho vynechá len pri tomto spustení, ale neodstráni ho zo súboru — na odstránenie slúži samostatná akcia Spravovať vlastné cesty mimo postupu zálohovania.", + "customPickerAlt": "Vlastný kontrolný zoznam profilu zobrazujúci predvolené cesty profilu (nezaškrtnuté) a trvalé doplnky (vopred zaškrtnuté s predponou [+]) plus tlačidlá na pridanie novej cesty alebo potvrdenie výberu.", + "customPickerCaption": "Vlastný profil — výber ciest. Cesty predvoleného profilu nie sú zaškrtnuté; trvalé doplnky sú vopred zaškrtnuté s predponou [+]. Používateľ zaškrtne cesty pre toto spustenie.", + "manageCustomAlt": "Ponuka správy vlastných ciest so zoznamom trvalých doplnkov a možnosťami pridávania, odstraňovania a úprav.", + "manageCustomCaption": "Spravovať vlastné cesty — miesto, kde sa pridávajú alebo odstraňujú trvalé doplnky. Každá tu uvedená cesta sa automaticky zahrnie do záloh v predvolenom režime bez potreby otvárať výber ciest vlastného profilu." + }, + "commonPipeline": { + "heading": "Čo beží bez ohľadu na cieľ", + "intro": "Po určení profilu každý backend vykoná rovnaký postup dočasnej prípravy a potom pokračuje vlastným spôsobom odosielania. hb_prepare_staging zostaví strom archívu v /tmp/proxmenux-DESTINATION-stage.XXXXXX a naplní každý z troch blokov údajov.", + "steps": [ + { + "step": "1", + "name": "Zostava rootfs", + "detail": "Pre každú vybranú cestu spustí rsync -a do staging_root/rootfs/. Databáza pmxcfs v /var/lib/pve-cluster/config.db sa zachytí samostatne cez sqlite3 .backup, aby vznikla konzistentná snímka bez zastavenia klastra; pomocné súbory .db-wal / .db-shm sa z rsync vylúčia. Ak sqlite3 nie je dostupné, uloží sa namiesto toho súbor config.db.raw-fallback, ktorý obnova pri importe prevezme ako databázu. Z /root/ sa vylúčia dočasné podcesty (história bash, vyrovnávacie pamäte, kôš). Cesty chýbajúce v zdroji sa zapíšu do metadata/missing_paths.txt bez zastavenia zálohy." + }, + { + "step": "2", + "name": "Vytvorenie manifestu", + "detail": "build_manifest.sh koordinuje šesť zberných modulov a zapíše manifest.json do koreňa dočasného adresára. Pri zlyhaní modulu sa pre príslušnú sekciu použije zdokumentovaná prázdna predvolená hodnota; manifest zostane platný." + }, + { + "step": "3", + "name": "Zoznam balíkov", + "detail": "apt-mark showmanual je zachytený doslovne do metadata/packages.manual.list. Stav komponentu je už vnútri obnovených rootfs (components_status.json), pretože /usr/local/share/proxmenux/ je súčasťou štandardného profilu." + }, + { + "step": "4", + "name": "Informácie o spustení", + "detail": "metadata/run_info.env zaznamenáva identitu spustenia zálohy – názov hostiteľa, časovú pečiatku, verziu jadra – používanú pri kontrole kompatibility obnovy na určenie smeru medzi jadrami." + }, + { + "step": "5", + "name": "Oznámenie (začiatok)", + "detail": "Spustí sa hb_notify_lifecycle \"start\". Ak sú v Monitore nastavené upozornenia, používateľ dostane udalosť Zálohovanie hostiteľa sa začalo. Bez nakonfigurovaných kanálov sa upozornenie neodošle." + } + ] + }, + "included": { + "heading": "Čo ide dnu a čo zostane vonku", + "intro": "Každá cesta v určenom profile (predvolené + trvalé doplnky + výber vo vlastnom režime) je skopírovaná s rsync -aAXH --numeric-ids. Spoločný zoznam vylúčení sa vzťahuje na každú cestu a dva adresáre majú dodatočné výnimky špecifické pre jednotlivé trasy.", + "globalTitle": "Globálne vylúčenia (uplatnené na každú cestu)", + "globalItems": [ + "images/ — výpisy obrazov.", + "dump/ — výstupy vzdump.", + "tmp/ - dočasné súbory.", + "*.log — súbory záznamov." + ], + "rootTitle": "Výnimky /root/", + "rootBody": "/root/ je súčasťou predvoleného profilu, aby sa do archívu zahrnuli používateľské skripty a konfigurácia. Dočasné podcesty sa vynechajú:", + "rootItems": [ + ".bash_history", + ".cache/", + "tmp/", + ".local/share/Trash/" + ], + "proxmenuxTitle": "Výnimky /usr/local/share/proxmenux/", + "proxmenuxBody": "Tento adresár obsahuje iba používateľský stav — components_status.json, predvoľby a vyrovnávaciu pamäť po inštalácii. Kód, ktorý už cieľ má z vlastnej inštalácie ProxMenux, sa vylúči, aby obnova neprepísala aktuálne binárne súbory cieľa staršími:", + "proxmenuxItems": [ + "restore-pending/, scripts/, web/", + "monitor-app/, monitor-app.*/, AppImage/", + "images/, json/", + "utils.sh, helpers_cache.json", + "ProxMenux-Monitor.AppImage*, install_proxmenux*.sh" + ], + "notInProfileTitle": "Cesty mimo profilu", + "notInProfileBody": "Všetko, čo nie je uvedené v hb_default_profile_paths a nepridal ako vlastné alebo trvalé extra nie je súčasťou zálohy. Pozoruhodné príklady:", + "notInProfileItems": [ + "Disky VM a LXC — zálohuje ich vzdump, nie táto funkcia. Konfiguračné súbory hostí v /etc/pve/nodes/*/qemu-server/*.conf a lxc/*.conf sa zachytia (nachádzajú sa v /etc/pve), aby obnova obnovila inventár; samotné disky sa znovu pripoja z existujúcej zálohy vzdump/PBS.", + "/boot a /boot/efi — binárne súbory jadra, initramfs a oddiel UEFI ESP po obnove znova vytvorí cieľový systém pomocou update-initramfs, update-grub alebo proxmox-boot-tool refresh. Zavádzač sa nikdy nekopíruje doslova.", + "Súborové systémy jadra a behu systému — /proc, /sys, /dev a /run sú pseudosúborové systémy vytvárané jadrom a udev; nikde sa trvalo neukladajú.", + "Binárne súbory balíkov v /usr/bin, /usr/lib, /lib, /sbin — APT na cieľovom systéme ich znova nainštaluje podľa packages.manual.list.", + "/var/log/, /var/tmp/, /var/cache/ — priebežný stav konkrétneho hostiteľa, ktorý sa neobnovuje.", + "/home/USER Nie v štandardnom profile. Pridať ako vlastnú cestu, keď systém nesie užívateľské domovské adresáre, ktoré musia prežiť obnovenie." + ], + "customPathsTitle": "Ako sa spracúvajú vlastné cesty", + "customPathsBody": "Vlastná cesta pridaná priamo vo vlastnom režime alebo uložená v backup-extra-paths.txt prechádza rovnakým postupom rsync ako cesty predvoleného profilu. Platia globálne vylúčenia. Ak sa vlastná cesta nachádza pod /root/ alebo /usr/local/share/proxmenux/, naďalej platia aj uvedené vylúčenia pre konkrétnu cestu. Každá archivovaná cesta — predvolená aj vlastná — sa zaznamená v metadata/paths_archived.txt. Cesty, ktoré v zdroji neexistujú, sa zapíšu do metadata/missing_paths.txt bez zastavenia zálohy." + }, + "archiveStructure": { + "heading": "Štruktúra archívu", + "intro": "Dočasný prípravný adresár vytvorený každým backendom má rovnaké usporiadanie bez ohľadu na miesto určenia. Archív tarball, PBS .pxar alebo Borg uchováva tento strom doslovne.", + "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│ ├── paths_archived.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": "Zhrnutie potvrdenia", + "body": "Pred zápisom akýchkoľvek údajov do cieľa ProxMenux zobrazí súhrnný dialóg s cieľom, ID zálohy alebo názvom archívu, stavom šifrovania a zoznamom kopírovaných ciest. Zrušenie v tomto bode zálohovanie bezpečne ukončí — obslužný mechanizmus trap nastavený vo funkcii backendu odstráni dočasný prípravný adresár a do cieľa sa nedostanú žiadne čiastočné údaje." + }, + "writing": { + "heading": "Písanie na miesto určenia", + "intro": "Po potvrdení každý backend vykoná vlastný krok zápisu. Podrobnosti opisujú stránky jednotlivých cieľov; spoločnými prvkami sú záznam, sprievodný súbor a upozornenie o dokončení.", + "rows": [ + { + "topic": "Súbor záznamu", + "detail": "Každý backend napíše celý svoj výstup do /tmp/proxmenux-DESTINATION-backup-YYYYMMDD_HHMMSS.log a pri zlyhaní ponúkne jeho otvorenie v rolovacom dialógu. Cesta záznamu je vytlačená v súhrne dokončenia iba vtedy, keď má súbor obsah." + }, + { + "topic": "Sprievodný súbor (iba lokálne)", + "detail": "hb_write_archive_sidecar vytvorí *.proxmenux.json vedľa lokálneho archívu, takže Monitor ho identifikuje ako zálohu hostiteľa ProxMenux aj po presunutí alebo premenovaní." + }, + { + "topic": "Upozornenie (dokončenie/zlyhanie)", + "detail": "Spustí sa hb_notify_lifecycle \"complete\" alebo \"fail\" s trvaním, veľkosťou archívu a — pri zlyhaní — posledným riadkom záznamu, ktorý vyzerá ako chyba." + } + ] + }, + "finishedScreens": { + "heading": "Ako vyzerá dokončená záloha", + "intro": "Rovnaká udalosť dokončenia sa zobrazí cez oba vstupné body. TUI vypíše súhrn do terminálu; karta Backups v Monitore zobrazí spustenie v zozname archívov s veľkosťou, trvaním a indikátormi stavu.", + "scriptsAlt": "ProxMenux Scripts TUI zobrazujúce dokončenú zálohu hostiteľa – cieľ, ID zálohy, cestu snapshot, veľkosť údajov, trvanie a stav šifrovania.", + "scriptsCaption": "Dokončená záloha — ProxMenux Scripts (TUI). Súhrn dokončenia vypíše cieľ, ID zálohy, názov výslednej snímky alebo archívu, veľkosť údajov, trvanie a stav šifrovania.", + "monitorAlt": "ProxMenux Monitor s kartou Backups znázorňujúcou dokončenú zálohovaciu položku hostiteľa s veľkosťou, trvaním, indikátorom metódy a indikátorom šifrovania.", + "monitorCaption": "Dokončená záloha — karta Backups v ProxMenux Monitor. Nová záloha sa objaví v zozname archívov s indikátorom cieľovej metódy, veľkosťou, trvaním a — ak je to relevantné — ikonou zámku šifrovania." + }, + "whereNext": { + "heading": "Kam ísť ďalej", + "items": [ + { + "label": "Ciele", + "href": "/docs/backup-restore/destinations", + "tail": " — Detaily konfigurácie pre Local, PBS a Borg." + }, + { + "label": "Plánované úlohy", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " — spúšťanie rovnakej zálohy bez obsluhy podľa plánu namiesto interaktívneho spúšťania." + }, + { + "label": "Obnovenie", + "href": "/docs/backup-restore/restoring", + "tail": " — postup, ktorý používa zálohy vytvorené podľa tejto stránky." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/cross-kernel.json b/web/messages/sk/docs/backup-restore/cross-kernel.json new file mode 100644 index 00000000..266aa51c --- /dev/null +++ b/web/messages/sk/docs/backup-restore/cross-kernel.json @@ -0,0 +1,170 @@ +{ + "meta": { + "title": "Obnova medzi rôznymi jadrami — rozpoznanie smeru, bezpečný výber a prispôsobenie | ProxMenux", + "description": "Ako ProxMenux obnoví zálohu hostiteľa na cieľ s inou hlavnou verziou jadra. Vysvetľuje rozpoznanie smeru rozdielu, bezpečný filter vynechávajúci kritické cesty pri novšom cieľovom jadre a štvorfázové doplnenie nastavení IOMMU, ID VFIO a vlastných parametrov bez doslovného kopírovania súborov viazaných na jadro.", + "ogTitle": "ProxMenux Backup — obnova medzi verziami jadra a doplnenie nastavení", + "ogDescription": "Obnova medzi verziami jadra podľa smeru zmeny s bezpečným filtrom a doplnením nastavení nezávislým od jadra.", + "twitterTitle": "Obnova medzi rôznymi jadrami | ProxMenux", + "twitterDescription": "Ako ProxMenux spracováva obnovenie, keď sa cieľové jadro líši od zálohy." + }, + "header": { + "title": "Obnova medzi kernelmi", + "description": "Ako ProxMenux zvláda obnovenie, keď cieľový hostiteľ spustí iné jadro od toho, ktoré je zaznamenané v zálohe, najmä keď cieľ spustí novšie jadro. Opisuje, ako sa rozdiel detekuje, ako sa prefiltrujú cesty kritické z hľadiska zavádzania, ktoré by mohli porušiť cieľ, a ako sa užívateľská konfigurácia znovu dodáva bez kopírovania súborov viazaných na jadro doslova.", + "section": "Záloha a obnova" + }, + "intro": { + "title": "Každý skok do jadra je riadený inak", + "body": "Jadro hostiteľa Proxmox má verziu ako 6.17.13-2-pve. Prvé dve čísla (6.17) označujú hlavnú verziu; po ich zmene nemusia byť staršie konfiguračné súbory platné. Pri odlišnej verzii jadra v zálohe a cieli sa postup vetví podľa smeru zmeny, pretože obe situácie majú odlišné riziká. Zálohy s novším jadrom než cieľ sa obnovujú bez filtra, podľa zaznamenaných testov cez viac verzií. Zálohy so starším jadrom potrebujú filter, aby staré nastavenia nebránili štartu novšieho cieľa." + }, + "directionCheck": { + "heading": "Kontrola smeru", + "intro": "Počas kontroly kompatibility hb_compat_check porovnáva jadro zaznamenané v manifeste zálohy s aktuálnym jadrom cieľa (uname -r) a klasifikuje obnovenie do jedného z troch prípadov, uložené vo vnútornej premennej HB_COMPAT_KERNEL_DIRECTION:", + "rows": [ + { + "direction": "same", + "condition": "Hlavná verzia jadra sa zhoduje medzi zálohou a cieľom.", + "behavior": "Úplné obnovenie toku beží nezmenený. Žiadny ďalší filter, žiadna hydratácia, žiadne špeciálne upozornenie v UI." + }, + { + "direction": "bk_newer", + "condition": "Jadro zálohy je NOVŠIE než cieľové (napríklad záloha z jadra 7.0 a cieľ s jadrom 6.17).", + "behavior": "Úplný postup obnovy zostáva nezmenený, ako pri same, bez filtra. Uvedené testy overili reinštaláciu ovládačov pre cieľové jadro, nastavenie IOMMU a spustenie VM s odovzdanou GPU." + }, + { + "direction": "bk_older", + "condition": "Jadro zálohy je STARŠIE než cieľové (napríklad záloha z jadra 6.17 a cieľ s jadrom 7.0).", + "behavior": "Filter bezpečnej podskupiny a štvorfázová hydratácia nižšie sú aktivované. Obnova pokračuje – cieľ reprodukuje zdroj, ale súbory kritické pri zavádzaní sa neskopírujú doslovne." + } + ] + }, + "whyBkNewerIsSafe": { + "heading": "Prečo záloha s novším jadrom ako cieľ obnoví nezmenený", + "body": "Pri cieli so starším jadrom než v zálohe používa obnova mechanizmy nezávislé od verzie jadra. Inštalátory ovládačov GPU a PCI zistia bežiace jadro cez uname -r a zostavia DKMS pre cieľ. APT použije binárne balíky cieľovej distribúcie. Parametre IOMMU, napríklad intel_iommu=on, zostávajú stabilné medzi hlavnými verziami. Podľa tohto návrhu sú zoznamy zakázaných modulov, nastavenia GRUB a initramfs zo zálohy syntakticky použiteľné aj na staršom jadre; neznáme parametre jadro ignoruje. ProxMenux preto tento smer spracúva rovnako ako obnovu s rovnakým jadrom." + }, + "safeSubsetFilter": { + "heading": "Bezpečný subsetový filter (iba ak je cieľové jadro novšie)", + "intro": "Keď je cieľové jadro novšie ako záložné, kontrola kompatibility pridáva 16 ciest kritických pre štart z hb_unsafe_paths_cross_version do RS_SKIP_PATHS. Tieto cesty sú vylúčené z obnovy, pretože písanie ich verzie zo staršieho jadra nad cieľom spusteným novším spôsobilo paniku jadra pri testovaní. Trasy pokrývajú päť kategórií:", + "categoryRows": [ + { + "category": "Zavádzač", + "paths": "/etc/default/grub, /etc/kernel", + "reason": "GRUB defaults viazaná na predchádzajúce poradie jadier a stav proxmox-boot-tool (cmdline, ESP UUIDs, háčiky), ktorý odkazuje na cesty a identifikátory zo staršej inštalácie." + }, + { + "category": "Kernelové moduly a štartovacie artefakty", + "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", + "reason": "Zoznamy automaticky načítaných modulov premenovaných medzi hlavnými verziami jadra, neplatné voľby modulov a hooky initramfs napísané pre staršie jadro." + }, + { + "category": "Úložný systém a identita súborového systému", + "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", + "reason": "UUID, ktoré v tejto inštalácii nemusia existovať, viaccestné ovládače, ktoré sa menia medzi jadrami, iSCSI parametre, ktoré sa vyvíjajú, pravidlá udev, ktoré sa môžu viazať na neexistujúce podsystémy, stav ZFS (zpool.cache + hostid), ktoré môžu uzamknúť pool ako cudzie." + }, + { + "category": "APT zdroje", + "paths": "/etc/apt", + "reason": "Vydania v zdrojoch APT môžu pri ďalšej aktualizácii spôsobiť zníženie verzií kritických balíkov." + }, + { + "category": "systemd", + "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", + "reason": "Vlastné úpravy jednotiek a odkazy .wants viazané na staršiu hlavnú verziu systemd; konfiguračné kľúče, ktoré novší systemd nemusí rozpoznať." + } + ], + "outroBody": "Filter beží PRED konfirmačným dialógom, takže užívateľ vidí presný zoznam ciest, ktoré budú preskočené, kategorizované z dôvodu. Obnovenie stále pokračuje všetko ostatné (konfigurácia VM/LXC, sieť, /etc/pve, užívatelia, cron, ProxMenux stav, balíčky, ovládače, /root) je obnovená normálne." + }, + "hydration": { + "heading": "Kernel-agnostická hydratácia", + "intro": "Filter vynechá kritické súbory, preto doplnenie znovu použije vybrané nastavenia: parametre IOMMU, ID VFIO, vlastný GRUB_TIMEOUT a zoznamy blokovaných modulov nvidia. Beží pri novšom cieľovom jadre. Zlúčenie cmdline zachová kľúče cieľa a doplní chýbajúce moduly. Povolené hodnoty GRUB a používateľské súbory môžu nahradiť odlišný obsah cieľa. Opakovanie rovnakých vstupov je idempotentné.", + "phaseRows": [ + { + "phase": "1a GRUB cesta", + "detail": "Pre hostiteľov s GRUB (ext4/lvm). _rs_hyd_grub zlúči parametre z manifest.kernel_params.cmdline_extra zálohy do GRUB_CMDLINE_LINUX_DEFAULT cieľa a preskočí existujúce kľúče. Potom obnoví povolené kľúče GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) zo súboru /etc/default/grub zálohy, ak sa ich hodnoty líšia od cieľa." + }, + { + "phase": "1b — systemd-boot / ZFS", + "detail": "Pre systemd-boot (zvyčajne ZFS ako koreňový systém). _rs_hyd_kernel_cmdline zlúči používateľské parametre z cmdline_extra do cieľového /etc/kernel/cmdline, pričom zachová jeho vlastné parametre štartu root=, boot= a rootflags=." + }, + { + "phase": "2 — /etc/modules zlúčenie", + "detail": "_rs_hyd_modules dopĺňa moduly z manifest.kernel_params.modules_loaded_at_boot, ktoré sú na bielom zozname (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) a ešte nie sú prítomné v cieľovom /etc/modules." + }, + { + "phase": "3 — Kopírovanie povolených súborov", + "detail": "_rs_hyd_files skopíruje súbory vytvorené používateľom z prípravného rootfs na živý cieľ, keď sa obsah líši. Whitelist pokrýva súbory VFIO/nvidia/blacklist podľa pravidiel /etc/modprobe.d, /etc/modules-load.d a ProxMenux VFIO sa viaže na pravidlo + nvidia udev podľa pravidiel /etc/udev/rules.d. Distro-vlastnené súbory (pve-blacklist.conf, mdadm.conf, nvme.conf) sú zámerne vylúčené, pretože sa ich obsah mení medzi vydaniami." + }, + { + "phase": "4 — Vynútenie obnovy po štarte", + "detail": "Štyri fázy píšu priamo na živý cieľ mimo bežného postupu obnovy. Aby zlúčené žetóny/moduly/súbory nadobudli účinnosť na ďalšom štarte, HB_HYDRATION_APPLIED=1 sa šíri cez plan.env na apply_pending_restore.sh, čo núti NEEDS_INITRAMFS=1 a NEEDS_GRUB=1 bez ohľadu na to, čo bolo v zozname. Post-boot dispečer potom regeneruje initramfs a osvieži bootloader." + } + ] + }, + "planCommit": { + "heading": "Plánovanie a vykonanie — používateľ najprv vidí náhľad", + "body": "Doplnenie má dva režimy. Pred potvrdením ProxMenux spustí _rs_apply_bk_older_hydration v režime plan: vypočíta zmeny, naplní RS_HYDRATION_SUMMARY zeleným zoznamom akcií a nič nezapíše. Dialóg ho zobrazí vedľa žltého zoznamu vynechaných ciest, aby používateľ vopred poznal zmeny. Po potvrdení spustí rovnakú funkciu v režime commit: tie isté fázy a logika, teraz so zápisom do cieľa. Zrušenie ponechá cieľ nedotknutý." + }, + "flowDiagram": { + "heading": "Tok, keď je cieľové jadro novšie ako záložné", + "intro": "Kroky pridané, keď je cieľové jadro novšie, sú v rámci normálneho toku obnovy. Všetko ostatné – horúce použitie, čakajúca príprava, inštalácia balíka, dispečer po spustení – beží identicky ako pri obnove rovnakého jadra.", + "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": "Konkrétne príklady", + "intro": "Doplnenie nastavení má pri bežných scenároch pozorovateľné výsledky. Dva príklady automaticky spracovaných prípadov:", + "rows": [ + { + "scenario": "GPU priechod (VFIO)", + "detail": "Zdroj mal intel_iommu=on iommu=pt v cmdline, vfio/vfio_pci/vfio_iommu_type1 v /etc/modules, /etc/modprobe.d/vfio.conf s options vfio-pci ids=10de:2216, a /etc/modprobe.d/blacklist-nvidia.conf. Hydratácia zlučuje žetóny cmdline do cieľovej GRUB alebo jadra cmdline, pridá vfio moduly do /etc/modules, a skopíruje dva používateľom vytvorené modprobe súbory. Pri ďalšom štarte je IOMMU aktívna, moduly VFIO sa načítajú, GPU je viazaný na vfio-pci a VM sa spustí s funkčným odovzdaním GPU." + }, + { + "scenario": "Vlastné GRUB predvolené", + "detail": "Zdroj mal GRUB_TIMEOUT=1 a GRUB_DISABLE_OS_PROBER=true. Hydratácia číta oba kľúče z /etc/default/grub zálohy, vidí, že sa líšia od čerstvých predvolených inštalácií, a prepíše tieto dva riadky v cieľovom súbore (uloženie všetko ostatné, vrátane GRUB_DISTRIBUTOR, nedotknuté)." + } + ] + }, + "callout": { + "warningTitle": "Čo sa pri novšom cieľovom jadre neobnovuje", + "warningBody": "Doplnenie obnoví iba vybrané nastavenia považované za prenosné medzi jadrami: parametre IOMMU, ID VFIO, povolené kľúče GRUB a moduly z pevného zoznamu (vfio*, nvidia*, i915, xe, kvm*). Ostatné položky, ako vlastné hooky initramfs v /etc/initramfs-tools/hooks/, nepovolené súbory v /etc/modprobe.d/ a vlastné úpravy jednotiek systemd, zostanú vynechané. Môžu používať rozhrania jadra, rozloženie /sys a hooky udev, ktoré sa medzi hlavnými verziami menia a môžu zabrániť štartu. Na presné obnovenie štartovacieho reťazca použite rovnakú hlavnú verziu jadra ako v zálohe." + }, + "codeReference": { + "heading": "Kde mechanizmy žijú", + "intro": "Pre vývojárov, ktorí chcú sledovať alebo rozšíriť správanie obnovy medzi verziami jadra:", + "rows": [ + { + "component": "Smerové zistenie", + "location": "hb_compat_check v lib_host_backup_common.sh. Nastaví HB_COMPAT_KERNEL_DIRECTION." + }, + { + "component": "Zoznam ciest bezpečného filtra", + "location": "hb_unsafe_paths_cross_version v lib_host_backup_common.sh. Vypíše path\\treason riadky používané ako CLI filter a webový koncový ukazovateľ /api/host-backups/restore/prepare." + }, + { + "component": "Hydratačné fázy", + "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files v backup_host.sh. Orchestrovaný _rs_apply_bk_older_hydration." + }, + { + "component": "Vynútenie obnovy po štarte", + "location": "apply_pending_restore.sh prečíta HB_HYDRATION_APPLIED z plan.env a vynúti NEEDS_INITRAMFS=1/NEEDS_GRUB=1." + }, + { + "component": "Webový náhľad", + "location": "/api/host-backups/restore/prepare v flask_server.py. Načíta pomocnú knižnicu, spustí _rs_apply_bk_older_hydration v režime plánu, vráti akcie na Web modus." + } + ] + }, + "whereNext": { + "heading": "Kam ísť ďalej", + "items": [ + { + "label": "Obnovenie", + "href": "/docs/backup-restore/restoring", + "tail": " — úplný postup obnovy, do ktorého sa tieto mechanizmy zapájajú." + }, + { + "label": "Ako to funguje", + "href": "/docs/backup-restore/how-it-works", + "tail": " — manifest a zberné funkcie vytvárajúce blok kernel_params, z ktorého doplnenie číta." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/destinations/borg.json b/web/messages/sk/docs/backup-restore/destinations/borg.json new file mode 100644 index 00000000..0e28267a --- /dev/null +++ b/web/messages/sk/docs/backup-restore/destinations/borg.json @@ -0,0 +1,234 @@ +{ + "meta": { + "title": "Cieľ Borg — typy repozitárov, overenie SSH a šifrovanie | ProxMenux", + "description": "Cieľ Borg ukladá zálohy hostiteľa ProxMenux do lokálneho úložiska, na pripojený externý disk alebo na vzdialený server cez SSH. Opisuje vyhľadanie spustiteľného súboru borg, štyri úvodné možnosti kľúča SSH, šifrovanie repokey, uloženú konfiguráciu cieľa a uchovávanie podľa plánovanej úlohy.", + "ogTitle": "ProxMenux Backup — cieľ Borg", + "ogDescription": "Ako ProxMenux ukladá zálohy hostiteľa do úložísk Borg s overením SSH a šifrovaním repokey.", + "twitterTitle": "Cieľ záloh Borg | ProxMenux", + "twitterDescription": "Lokálne úložiská Borg, úložiská na USB a dostupné cez SSH pre zálohy hostiteľa." + }, + "header": { + "title": "Borg", + "description": "Cieľ Borg píše zálohy hostiteľa do úložiska Borg. Podporujú sa tri typy úložiska: cesta k lokálnemu súborovému systému, namontovaný externý disk alebo vzdialený server cez SSH. Deduplikácia po blokoch vo všetkých archívoch v úložisku a voliteľné šifrovanie repokey.", + "section": "Záloha a obnova" + }, + "aboutBorg": { + "heading": "Čo je Borg?", + "body": "Borg, známy aj ako BorgBackup, je otvorený zálohovací nástroj s deduplikáciou, ktorý udržiava komunita Borg Backup. Každý archív ukladá ako bloky premenlivej dĺžky v úložisku. Bloky sa zdieľajú medzi archívmi, takže opakovaná záloha nezmenených údajov spotrebuje takmer nulové dodatočné miesto. Borg nie je viazaný na Proxmox: je to univerzálny nástroj používaný v mnohých prostrediach. ProxMenux ho používa ako jeden z troch cieľov záloh hostiteľa. Všetky tu opísané mechanizmy (typy úložísk, borg-serve cez SSH, šifrovanie repokey a prune) sú štandardným správaním Borgu." + }, + "intro": { + "title": "Deduplikácia po blokoch s lokálnymi úložiskami alebo úložiskami cez SSH", + "body": "Úložisko Borg ukladá bloky zdieľané medzi všetkými svojimi archívmi. Opakovaná záloha nezmeneného súboru preto neprenáša ani neukladá nové údaje. ProxMenux používa pri zálohovaní borg create a pri obnove borg extract. Úložisko môže byť na rovnakom súborovom systéme ako zdroj, na pripojenom externom disku alebo na vzdialenom hostiteľovi cez SSH." + }, + "binarySourcing": { + "heading": "Spustiteľný súbor borg", + "intro": "Borg nie je základnou závislosťou inštalátora ProxMenux. Keď beží záloha, hb_ensure_borg vyrieši binárny zo štyroch zdrojov v poradí a vráti prvý, ktorý funguje:", + "rows": [ + { + "priority": "1", + "source": "Systém borg", + "detail": "Ak má hostiteľ už borg nainštalovaný cez APT (which borg), použije sa tento binárny kód." + }, + { + "priority": "2", + "source": "Vyrovnávacia pamäť stavového adresára", + "detail": "/usr/local/share/proxmenux/borg — súbor uchovaný po predchádzajúcom stiahnutí z GitHubu na tomto hostiteľovi." + }, + { + "priority": "3", + "source": "Balík AppImage Monitora", + "detail": "/usr/local/share/proxmenux/monitor-app/usr/bin/borg — AppImage obsahuje podpísaný borg-linux64. Táto možnosť funguje aj bez internetu: hostiteľ má stále použiteľný borg." + }, + { + "priority": "4", + "source": "GitHub stiahnuť", + "detail": "Stiahnutie pomocou wget z pevne určenej URL súboru borg-linux64 v github.com/borgbackup/borg/releases/, overené oproti konštante SHA-256 v lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). Pri nesúlade kontrolného súčtu sa binárny súbor odstráni a zálohovanie sa preruší. Stiahnutý súbor sa uchová v stavovom adresári, takže ďalšie zálohovania použijú postup 2." + } + ] + }, + "repoTypes": { + "heading": "Typy úložísk", + "intro": "Typ úložiska je vybraný pri pridaní cieľa. Každý typ rieši inú URL úložiska, ktorému Borg rozumie.", + "rows": [ + { + "type": "remote", + "url": "ssh://USER@HOST/RPATH", + "detail": "Úložisko žije na vzdialenom serveri, ktorý prevádzkuje borg serve. Vyžaduje pripojenie SSH k tomu serveru." + }, + { + "type": "usb", + "url": "/mnt/MOUNTPOINT/borgbackup", + "detail": "Repozitár žije na pripojenom externom disku (zvyčajne USB). Pripojenie je riešené pomocou hb_prompt_mounted_path, ktorý detekuje, pripojí alebo formáty USB partícií podľa potreby." + }, + { + "type": "local", + "url": "/backup/borgbackup (any absolute path)", + "detail": "Úložisko žije v lokálnom adresári. Zmysluplné iba vtedy, keď je cieľový adresár na samostatnom fyzickom disku – úložisko na rovnakom disku ako zdroj chráni pred chybou operátora, ale nie pred zlyhaním disku." + } + ] + }, + "serverSetup": { + "heading": "Príprava servera Borg (strana servera)", + "intro": "Typ úložiska remote vyžaduje funkčný server Borg dostupný cez SSH. ProxMenux server sám nenastavuje; iba autorizuje kľúč pre existujúci účet. Táto časť opisuje požiadavky pred pripojením.", + "hostChoicesTitle": "Kde môže server žiť", + "hostChoicesBody": "Každý host Linux s prístupom SSH spĺňa požiadavky. Spoločné nastavenia:", + "hostChoicesItems": [ + "Dedikovaný NAS alebo záložný box (Debian, Ubuntu, TrueNAS SCALE so shellom).", + "Kontajner LXC vnútri uzol Proxmox. Malá stopa, izolovaná od hostiteľa, ktorý riadi zálohy.", + "Ďalší hostiteľ Proxmox v rovnakej sieti LAN alebo VM kdekoľvek dosiahnuteľný cez SSH." + ], + "lxcWarningTitle": "LXC ako server Borg", + "lxcWarningBody": "Ak server Borg beží v LXC, generate-auto vyžaduje pri inštalácii kľúča účet povoľujúci overenie SSH heslom. Ak nie je dostupný, použite ručnú inštaláciu kľúča alebo alternatívu generate-pct cez hostiteľa PVE.", + "requirementsTitle": "Požiadavky na server", + "requirementsRows": [ + { + "requirement": "Spustiteľný súbor borg na ceste /usr/bin/borg", + "detail": "Riadok command=\"/usr/bin/borg serve ...\", ktorý ProxMenux zapíše do authorized_keys, používa túto pevnú cestu. APT (apt install borgbackup) sem program nainštaluje. Samostatný binárny súbor musí mať symbolický odkaz na ceste /usr/bin/borg." + }, + { + "requirement": "Dedikovaný užívateľský účet (zvyčajne borg)", + "detail": "Vlastní adresár úložiska a prijíma prichádzajúce SSH spojenie. Nepotrebuje sudo alebo shell prístup authorized_keys linka aj tak znemožňuje interaktívne shelly." + }, + { + "requirement": "Zapisovateľný adresár úložiska", + "detail": "Cesta, ktorú operátor poskytuje ProxMenux (napríklad /backup/borgbackup) musí existovať na serveri a musí byť vo vlastníctve používateľa borg." + }, + { + "requirement": "SSH démon akceptujúci používateľa borg", + "detail": "PubkeyAuthentication yes (predvolené). Overenie heslom je potrebné iba pri inštalácii kľúča cez generate-auto. Po nainštalovaní kľúča môže server overenie heslom úplne vypnúť." + } + ], + "minimalSetupTitle": "Nastavenie minimálneho servera", + "minimalSetupBody": "Na serveri Borg so systémom Debian alebo Ubuntu tvoria základ konfigurácie štyri príkazy spustené ako root:", + "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", + "minimalSetupNote": "Keď je server pripravený a povoľuje overenie SSH heslom, režim generate-auto nainštaluje kľúč cez účet s právom zapisovať do authorized_keys používateľa borg. Ďalšie zálohy používajú tento kľúč obmedzený na borg serve v nastavenej ceste. Bez prihlásenia heslom ho nainštalujte ručne alebo cez hostiteľa PVE." + }, + "sshAuth": { + "heading": "Overenie SSH (klientská strana)", + "intro": "Remote Borg archívy sú prístupné cez SSH. Spojenie beží od ProxMenux host na užívateľský účet na serveri Borg, ktorý beží borg serve. Tento užívateľ je zvyčajne pomenovaný borg, NIE je admin / root užívateľa servera borg-serve príkazový riadok zablokuje pripojenie k tejto konkrétnej trase úložiska (pozri nižšie kľúčové stratégie).", + "strategiesTitle": "Možnosti kľúča SSH", + "strategiesIntro": "Pri pridaní vzdialeného cieľa vyžiada ProxMenux používateľa SSH, hostiteľa a vzdialenú cestu a ponúkne štyri možnosti overenia. Ak je overenie heslom odmietnuté, ponúkne aj alternatívu generate-pct. Režimy sú opísané nižšie:", + "strategyRows": [ + { + "mode": "generate-auto", + "label": "Odporúčané", + "detail": "ProxMenux vygeneruje alebo znovu použije pár kľúčov ed25519 na ceste ~/.ssh/borg_proxmenux_HOST_ed25519. Pomocou sshpass otestuje prihlásenie a nainštaluje verejný kľúč do ~borg/.ssh/authorized_keys. Heslo patrí účtu, ktorý môže do súboru zapisovať, zvyčajne root alebo borg. Používa sa pri nastavení a neukladá sa." + }, + { + "mode": "generate-manual", + "label": "Žiadne admin heslo na tomto hostiteľovi", + "detail": "ProxMenux generuje pár kľúčov, ako je uvedené vyššie, ale zobrazuje plnú linku authorized_keys pre operátora na manuálne vkladanie do servera. Admin heslo nikdy neopustí ProxMenux hostiteľa, pretože to nie je nikdy žiadané." + }, + { + "mode": "generate-pct", + "label": "Borg server je PVE LXC", + "detail": "Server Borg beží vo vnútri LXC na uzle PVE. ProxMenux povoľuje kľúč cez pct exec z PVE hostiteľa a root na hostiteľovi PVE píše do LXC's ~borg/.ssh/authorized_keys bez potreby SSH do LXC sama o sebe." + }, + { + "mode": "existing", + "label": "Použiť existujúci kľúč", + "detail": "ProxMenux skenuje /root/.ssh/ a $HOME/.ssh/ na analyzovateľné súkromné ​​kľúče ed25519/RSA a uvádza ich. Operátor vyberie jednu alebo manuálne prejde na neštandardnú cestu." + }, + { + "mode": "none", + "label": "Štandardná konfigurácia SSH", + "detail": "Bez vlastného kľúča: Borg používa predvolenú konfiguráciu SSH hostiteľa, zvyčajne ~/.ssh/id_rsa alebo agenta SSH." + } + ], + "restrictTitle": "Čiara authorized_keys", + "restrictBody": "Pre každý vygenerovaný kľúč obmedzí riadok authorized_keys zapísaný na serveri použitie kľúča na toto volanie borg-serve pre nastavenú cestu úložiska:", + "restrictLine": "command=\"/usr/bin/borg serve --restrict-to-path RPATH\",restrict PUBKEY", + "restrictNote": "command= núti každé SSH sedenie pomocou tohto kľúča spustiť len to borg-serve príkaz; restrict vypne port forwarding, agent forwarding, X11 forwarding a PTY alokácie. Kľúč nemožno použiť na otvorenie interaktívneho shellu na serveri alebo na prístup k akejkoľvek inej ceste úložiska, aj keď má účet širšie práva." + }, + "savedTargets": { + "heading": "Uložené ciele", + "intro": "Uložený cieľ uchová konfiguráciu úložiska pod zrozumiteľným názvom, aby údaje nebolo potrebné zadávať znova. Súbory v stavovom adresári ProxMenux:", + "rows": [ + { + "file": "borg-targets.txt", + "content": "Jeden riadok pre každý cieľ: NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE. Funkcia hb_collect_borg_configs ho načíta pri zostavovaní ponuky cieľov." + }, + { + "file": "borg-pass-NAME.txt", + "content": "Passfráza pre cieľ uvedený vyššie (chmod 600). Prítomný len vtedy, keď si operátor vybral kódovanie repokey." + } + ], + "outro": "Uloženie cieľa je voliteľné. Odmietnutím sa neuloží pomenovaná konfigurácia, ale vygenerovaný kľúč SSH sa neodstráni. Ak je šifrovanie repokey zapnuté bez uloženého cieľa, ProxMenux aj tak uloží prístupovú frázu do staršieho súboru borg-pass.txt." + }, + "encryption": { + "heading": "Šifrovanie", + "body": "Repozitáre sa inicializujú so zvoleným režimom šifrovania cez hb_borg_init_if_needed: ak je dostupný novší príkaz borg repo-create -e MODE, použije sa ten, inak starší borg init --encryption=MODE. ProxMenux ponúka dva režimy: repokey (predvolený) a none. V režime repokey Borg ukladá šifrovací kľúč priamo do repozitára. Prístup vyžaduje heslovú frázu, ktorú ProxMenux žiada zadať dvakrát, overí zhodu a pri uloženom cieli ju uloží do borg-pass-NAME.txt, inak do staršieho súboru opísaného vyššie. Po uložení sa zobrazí povinné potvrdenie: heslová fráza je jedinou cestou k zašifrovaným archívom a jej strata znemožní obnovu všetkých archívov v repozitári." + }, + "runtimeEnv": { + "heading": "Runtime prostredie", + "intro": "ProxMenux exportuje nasledujúce premenné prostredia pred vyvolaním borg. Konfigurujú pripojenie a odomykajú úložisko bez vloženia tajomstiev do príkazového riadku.", + "rows": [ + { + "var": "BORG_RSH", + "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", + "purpose": "Príkaz vzdialeného shellu pre úložiská Borg cez SSH. Vybraný kľúč pridá voľby identity; neštandardný port pridá -p PORT. Bez vlastného kľúča a s predvoleným portom zostane premenná nenastavená a Borg používa konfiguráciu SSH hostiteľa." + }, + { + "var": "BORG_PASSPHRASE", + "value": "(passfráza z borg-pass-NAME.txt)", + "purpose": "Odomkne repokey. Nastaviť iba vtedy, keď cieľ používa šifrovanie repokey. Nikdy sa neobjaví v zozname procesných argumentov." + }, + { + "var": "BORG_ENCRYPT_MODE", + "value": "repokey | none", + "purpose": "Použité hb_borg_init_if_needed pri inicializácii úložiska, ktoré ešte neexistuje. Ignorované borg create na existujúcich archívoch." + }, + { + "var": "BORG_RELOCATED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Potlačí interaktívnu otázku Borgu, keď sa URL úložiska líši od pôvodnej adresy, napríklad po premenovaní bodu pripojenia alebo zmene adresy hostiteľa SSH." + }, + { + "var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Potlačí interaktívnu výzvu, ktorú Borg vyvolá pri prvom prístupe k nezašifrovanému úložisku z nového klienta." + } + ] + }, + "archiveFormat": { + "heading": "Archive pomenovanie a uchovávanie", + "intro": "Každá záloha vytvorí nový archív vo vnútri úložiska.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS", + "retentionBody": "Pre plánované úlohy, run_scheduled_backup.sh beží borg prune proti úložisku po každom úspešnom zálohovaní s retenčnými hodnotami nastavenými na úlohu (--keep-last, --keep-daily, --keep-weekly). Interaktívne zálohy neprerezávajú." + }, + "restoreAccess": { + "heading": "Získavanie na strane obnovy", + "body": "Obnova vypíše archívy pomocou borg list REPO a vybraný archív rozbalí príkazom borg extract REPO::ARCHIVE-NAME do prípravného adresára. Funkcia _rs_check_layout ho odovzdá štandardnému procesu obnovy. Rovnaké príkazy fungujú aj ručne mimo ProxMenux. Rozbalený strom má trojblokovú štruktúru opísanú v časti Ako to funguje." + }, + "references": { + "heading": "Odkazy", + "intro": "Oficiálna dokumentácia Borg ku komponentom, ktoré ProxMenux používa.", + "items": [ + { + "label": "Dokumentácia Borg", + "href": "https://borgbackup.readthedocs.io/", + "tail": " — hlavný rozcestník pre pojmy, nasadenie, rýchly začiatok a všetky príkazy." + }, + { + "label": "borg create", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/create.html", + "tail": " — príkaz, ktorý ProxMenux používa pri každej zálohe, so všetkými podporovanými voľbami." + }, + { + "label": "Šifrovanie úložiska", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/init.html#encryption-mode", + "tail": " — režimy šifrovania podporované Borgom vrátane repokey, ktorý ProxMenux používa predvolene." + }, + { + "label": "borg serve a nasadenie cez SSH", + "href": "https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html", + "tail": " — nastavenie centrálneho servera Borg dostupného cez SSH vrátane príkazu borg-serve a voľby restrict-to-path, ktoré ProxMenux zapisuje do authorized_keys." + }, + { + "label": "borg prune", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/prune.html", + "tail": " — model uchovávania pre --keep-last / --keep-daily / --keep-weekly, ktorý ProxMenux uplatňuje pri každej plánovanej úlohe." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/destinations/index.json b/web/messages/sk/docs/backup-restore/destinations/index.json new file mode 100644 index 00000000..6a89082e --- /dev/null +++ b/web/messages/sk/docs/backup-restore/destinations/index.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Ciele záloh — lokálny archív, Proxmox Backup Server a Borg | ProxMenux", + "description": "Tri úložné backendy prijímajú rovnaký obsah zálohy ProxMenux: lokálny archív .tar.zst na ľubovoľnom zapisovateľnom súborovom systéme, zálohu PBS v dátovom úložisku Proxmox Backup Server alebo archív Borg v lokálnom či vzdialenom repozitári Borg. Každý backend má vlastné vlastnosti kompresie, deduplikácie, šifrovania a sieťovej komunikácie.", + "ogTitle": "Ciele záloh ProxMenux", + "ogDescription": "Lokálny archív, Proxmox Backup Server a Borg — tri úložné backendy pre rovnaký obsah zálohy hostiteľa.", + "twitterTitle": "Ciele záloh ProxMenux | ProxMenux", + "twitterDescription": "Miestny archív, Proxmox Backup Server a Borg backendy pre zálohovanie hostiteľov." + }, + "header": { + "title": "Ciele", + "description": "Tri úložné backendy podporované funkciou ProxMenux Backup: lokálny archív, Proxmox Backup Server (odporúčaný) a Borg. Každý prijíma rovnaký archív s tromi blokmi údajov; líšia sa formátom úložiska, deduplikáciou, modelom šifrovania a sieťovými požiadavkami.", + "section": "Záloha a obnova" + }, + "intro": { + "title": "Rovnaký obsah, tri backendy", + "body": "Každá záloha vytvorí rovnaké tri bloky údajov (rootfs, manifest, aplikácie). Jednotlivé ciele sa líšia spôsobom uloženia týchto údajov a ich získania na obnovu. Každý backend je samostatná funkcia v backup_host.sh — _bk_local, _bk_pbs, _bk_borg — všetky tri však zdieľajú rovnaký krok dočasnej prípravy (hb_prepare_staging) a rovnakú vetvu kódu obnovy. Voľba cieľa ovplyvňuje iba zápis a získanie údajov; nemení priebeh obnovy ani spôsob použitia archívu." + }, + "comparison": { + "heading": "Porovnanie funkcií", + "intro": "Nasledujúca tabuľka uvádza konkrétne rozdiely medzi tromi backendmi, ako sa správajú v ProxMenux dnes. Všetky hodnoty opisujú pozorované správanie samotného backendu, nie redakčné odporúčania.", + "rows": [ + { + "feature": "Formát úložiska", + "local": "Jeden súbor .tar.zst (alebo .tar.gz, ak zstd chýba).", + "pbs": "Záloha PBS (bloky .pxar v dátovom úložisku).", + "borg": "Borg archív vnútri úložiska Borg (segment súbory)." + }, + { + "feature": "Kompresia", + "local": "zstd (štandardná úroveň) cez tar --zstd. gzip fallback.", + "pbs": "Spravuje ju proxmox-backup-client. ProxMenux nemení nastavenia kompresie.", + "borg": "Vstavaná kompresia Borg. ProxMenux volá borg create bez zmeny nastavení kompresie." + }, + { + "feature": "Deduplikácia", + "local": "Žiadne. Každá záloha je úplne nezávislý archív.", + "pbs": "Úplná deduplikácia na úrovni blokov medzi všetkými zálohami v dátovom úložisku.", + "borg": "Úplná deduplikácia na úrovni blokov medzi všetkými archívmi v repozitári." + }, + { + "feature": "Šifrovanie v pokoji", + "local": "Žiadne (podliehajú ochrane súborového systému).", + "pbs": "Voliteľné šifrovanie na strane klienta pomocou súboru kľúča. Po zapnutí sa objekt obnovy odošle ako samostatná skupina záloh.", + "borg": "Voliteľné šifrovanie repokey (kľúč uložený v repo, odomknutý heslom)." + }, + { + "feature": "Uchovávanie / čistenie", + "local": "Použije sa pre každú plánovanú úlohu cez KEEP_LAST. Staré archívy sa odstránia spolu so sprievodnými súbormi a záznamami spúšťacieho skriptu. Interaktívne zálohy nevykonávajú čistenie.", + "pbs": "Použité pre každú plánovanú úlohu cez proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly. Interaktívne zálohy nevykonávajú čistenie.", + "borg": "Použité pre každú plánovanú úlohu cez borg prune --keep-last / --keep-daily / --keep-weekly. Interaktívne zálohy nevykonávajú čistenie." + }, + { + "feature": "Sieť", + "local": "Žiadne. Píše do lokálneho bodu pripojenia (obvykle interný disk alebo USB disk).", + "pbs": "TCP na server PBS (predvolený port 8007). Požaduje prihlasovacie údaje PBS + odtlačok certifikátu.", + "borg": "Lokálna cesta súborového systému alebo tunel SSH k vzdialenému Borg hostiteľovi." + }, + { + "feature": "Závislosti", + "local": "tar, zstd (predvolene prítomné na Proxmoxe).", + "pbs": "Balík proxmox-backup-client (dodávaný s Proxmox VE 8+).", + "borg": "Binárny borg. Automatické poskytovanie ProxMenux z balíka Monitor AppImage v prípade, že chýba." + }, + { + "feature": "Prístup potrebný na obnovu", + "local": "Akýkoľvek hostiteľ s tar+zstd môže extrahovať archív. Nie je potrebné PBS/Borg.", + "pbs": "Vyžaduje proxmox-backup-client, prihlasovacie údaje PBS a súbor kľúča (pri šifrovanej zálohe).", + "borg": "Vyžaduje borg + cestu k úložisku + heslo (ak je zašifrované)." + } + ], + "captionCode": "feature", + "captionLocal": "Lokálne", + "captionPbs": "Proxmox Backup Server (odporúčané)", + "captionBorg": "Borg" + }, + "sameArchive": { + "heading": "Rozloženie archívu sa nemení s destináciou", + "body": "V každom z troch cieľov sa nachádza rovnaká štruktúra rootfs/ + metadata/ + manifest.json opísaná v časti Ako to funguje. Rozbalenie lokálneho archívu .tar.zst, obnova .pxar z PBS aj rozbalenie archívu Borg cez borg extract vytvoria rovnaký adresárový strom. Vetva kódu obnovy (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) číta rovnaké tri bloky údajov bez potreby vedieť, z ktorého cieľa pochádzajú." + }, + "extractStandalone": { + "heading": "Rozbalenie zálohy mimo ProxMenux", + "intro": "Akýkoľvek z troch formátov archívu je možné čítať pomocou štandardných nástrojov bez nainštalovaného ProxMenux na počítači. Nižšie uvedené príkazy vytvárajú rovnaký adresárový strom, ktorý obnova používa interne.", + "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": "# Z archívu Borg (vyžaduje borg a heslo pre šifrované repozitáre):\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# Zo vzdialeného repozitára dostupného cez SSH:\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME", + "note": "Rozbalený strom možno ručne skontrolovať alebo použiť na manuálnu obnovu. Presný postup získania údajov, ktorý ProxMenux používa na pozadí, opisujú stránky jednotlivých cieľov." + }, + "whereNext": { + "heading": "Podrobnosti jednotlivých cieľov", + "intro": "Každá destinácia má svoju vlastnú stránku pokrývajúcu konfiguračný tok, formát on-disku a príkaz na získanie údajov použitý pri obnove.", + "items": [ + { + "label": "Lokálny archív", + "href": "/docs/backup-restore/destinations/local", + "tail": " — prednastavenie lokálneho cieľa, pripojenie USB disku, ochrana pred uložením archívu do jeho vlastného zdroja a sprievodný súbor JSON, pomocou ktorého Monitor rozpozná zálohu." + }, + { + "label": "Proxmox Backup Server (odporúčané)", + "href": "/docs/backup-restore/destinations/pbs", + "tail": " — výber dátového úložiska, prihlasovacie údaje a odtlačok certifikátu, životný cyklus súboru šifrovacieho kľúča, prístupová fráza na obnovu a odoslanie objektu obnovy do PBS na obnovu po čistej inštalácii." + }, + { + "label": "Borg", + "href": "/docs/backup-restore/destinations/borg", + "tail": " — lokálne repozitáre a repozitáre dostupné cez SSH, zdroje binárneho súboru Borg (systém / vyrovnávacia pamäť / balík AppImage nástroja Monitor / stiahnutie z GitHubu), inicializácia repozitára, správa prístupových fráz a nastavenie kľúča SSH pre vzdialené repozitáre." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/destinations/local.json b/web/messages/sk/docs/backup-restore/destinations/local.json new file mode 100644 index 00000000..14df7a05 --- /dev/null +++ b/web/messages/sk/docs/backup-restore/destinations/local.json @@ -0,0 +1,75 @@ +{ + "meta": { + "title": "Lokálny archív — tar.zst na súborovom systéme alebo USB disku | ProxMenux", + "description": "Lokálny cieľ zálohy vytvorí jediný archív .tar.zst v ľubovoľnom zapisovateľnom adresári: na internom disku, v bode pripojenia Proxmoxu, na zdieľaní NFS alebo na USB disku. Stránka opisuje nastavenie, rozpoznanie a pripojenie USB diskov, ochranu pred uložením archívu do zálohovanej cesty a sprievodný súbor JSON, ktorý zálohu identifikuje.", + "ogTitle": "ProxMenux Backup — lokálny cieľ archívu", + "ogDescription": "Ako ProxMenux píše lokálne zálohy ako .tar.zst archívy a ako nastaviť cieľový adresár alebo USB disk.", + "twitterTitle": "Lokálny cieľ zálohy | ProxMenux", + "twitterDescription": "Ako ProxMenux píše lokálne zálohy ako .tar.zst archívy na súborovom systéme alebo USB disku." + }, + "header": { + "title": "Lokálny archív", + "description": "Lokálny cieľ zapisuje jeden komprimovaný archív tar do ľubovoľného zapisovateľného adresára na hostiteľovi: na interný disk, pripojenie NFS alebo SMB či USB disk.", + "section": "Záloha a obnova" + }, + "intro": { + "title": "Jeden súbor, samostatný", + "body": "Lokálna záloha vytvorí jediný súbor hostcfg-HOST-TIMESTAMP.tar.zst (alebo .tar.gz, ak zstd nie je dostupné). Súbor obsahuje celý strom archívu — manifest.json, metadata/ a rootfs/ — a možno ho obnoviť na ľubovoľnom hostiteľovi Proxmox postupom obnovy ProxMenux alebo ručne rozbaliť cez tar --zstd -xf na ľubovoľnom systéme Linux. Netreba server, inicializáciu repozitára ani externú závislosť. Ak nie sú dostupné PBS ani Borg, tento cieľ ponúka najkratšiu cestu obnovy." + }, + "targetConfig": { + "heading": "Nastavenie cieľového adresára", + "intro": "Miestny cieľ je jeden trvalý cieľový adresár — nie zoznam. ProxMenux ukladá voľbu operátora na /usr/local/share/proxmenux/local-target.conf a číta ju pri každej zálohe. Ak nie je nakonfigurovaný žiadny cieľ, použije sa predvolený HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump (rovnaký adresár, ktorý Proxmox používa pre svoje vlastné výstupy vzdump). Cieľ sa konfiguruje z Konfigurovať ciele zálohovania → Lokálne ciele:", + "options": [ + "Použiť predvolené (/var/lib/vz/dump). Lokálne úložisko Proxmox. Prítomný pri každej inštalácii Proxmox; archív sa nachádza vedľa výstupov vzdump a automaticky ho preberá karta Zálohy monitora.", + "Zadajte vlastnú cestu. Môžete použiť akúkoľvek absolútnu cestu súborového systému: pripojenie NFS, zdieľanie SMB pripojené cez fstab, vyhradený súbor údajov ZFS, druhý interný disk. ProxMenux overí, že cesta existuje a je adresárom, pred jej uložením.", + "Vyberte jednotku USB. Otvorí podponuku USB (nižšie), ktorá detekuje vymeniteľné zariadenia a ponúka pripojenie alebo formátovanie." + ] + }, + "usbFlow": { + "heading": "Rozpoznanie a pripojenie USB disku", + "intro": "Podponuka USB uvádza oddiely na vymeniteľných zariadeniach hlásených nástrojom lsblk. Každý oddiel sa zobrazí s veľkosťou, menovkou súborového systému a aktuálnym stavom. Stav určuje ponúkanú akciu ProxMenux.", + "statesTitle": "Tri stavy zariadenia", + "stateRows": [ + { + "state": "pripojené", + "shown": "Veľkosť · štítok · [fstype] · → /mount/point", + "action": "Oddiel je už pripojený. Jeho výber uloží aktuálny bod pripojenia ako lokálny cieľ zálohy. Žiadne nové pripojenie sa nevykoná." + }, + { + "state": "odmontované", + "shown": "Veľkosť · menovka · [fstype] · (nepripojený — bude pripojený)", + "action": "Súborový systém je prítomný, ale nie je namontovaný. Po potvrdení, ProxMenux spustí hb_mount_usb_partition: vytvorí /mnt/backup-LABEL (alebo cestu založenú na UUID, ak nie je označenie), pripojí partíciu a uloží bod pripojenia ako miestny cieľ." + }, + { + "state": "prázdny", + "shown": "Veľkosť · surový USB disk — bez súborového systému (bude NAFORMÁTOVANÝ)", + "action": "Zariadenie nemá súborový systém. Tento deštruktívny postup chráni dvojité potvrdenie. Najprv dialóg Áno/Nie upozorní, že operácia vymaže disk. Potom musí používateľ do vstupného poľa zadať presnú cestu zariadenia (napr. /dev/sdb), až následne ProxMenux vytvorí novú tabuľku GPT s oddielom ext4 a pripojí ho." + } + ], + "notMountedFallback": "Ak nie je detekované žiadne USB zariadenie, podmenu spadne späť do jednoduchého vstupného poľa. Operátor môže zadať ľubovoľnú cestu k bodu pripojenia; ak cesta nie je registrovaným bodom pripojenia, dialóg s potvrdením varuje pred pokračovaním." + }, + "safetyCheck": { + "heading": "Bezpečnostná kontrola - cieľ vnútri záložnej cesty", + "body": "Pred zapísaním archívu _bk_local overí, že cieľový adresár nie je podcestou žiadneho zálohovaného adresára. Bežnou chybou by bolo pridanie /root do profilu a výber /root/backups ako cieľ — archív by potom zahrnul sám seba, buď by vytvoril poškodený archív, alebo by rástol bez obmedzenia, kým sa disk nezaplní. Kontrola vyrieši obe cesty pomocou readlink -m, porovná ich a v prípade konfliktu preruší zálohovanie pomocou dialógového okna, ktoré pomenuje konfliktnú cestu a uvedie tri spôsoby, ako to vyriešiť: vybrať cieľ mimo konfliktnej cesty, odstrániť vlastnú položku, ktorá obsahuje cieľ, alebo použiť vlastný režim na zrušenie začiarknutia konfliktnej cesty pre toto spustenie." + }, + "archiveFormat": { + "heading": "Formát archívu a kompresia", + "intro": "Výstupné meno súboru vloží zdrojové meno hostiteľa a záložnú časovú pečiatku tak, že adresár, v ktorom je niekoľko archívov, sa chronologicky triedi a každý súbor je sebaidentifikačný.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS.tar.zst", + "compressionTitle": "Kompresia", + "compressionBody": "Hlavný postup používa tar --zstd -cf — jediný príkaz komprimujúci na predvolenej úrovni zstd. Ak zstd v zdroji nie je dostupné (na Proxmoxe zriedkavé, ale možné pri minimálnych inštaláciách), ProxMenux použije gzip. V tomto náhradnom postupe sa pri dostupnom pv pridá ukazovateľ priebehu, takže používateľ vidí rast veľkosti archívu v reálnom čase; bez pv sa použije obyčajné tar -czf bez priebežného výpisu.", + "sourceTitle": "Čo ide do archívu", + "sourceBody": "Príkaz tar sa spustí s -C \"$staging_root\" ., čím archivuje celý koreň dočasného prípravného adresára: rootfs/, metadata/ a manifest.json. Všetky tri bloky údajov ležia vedľa seba na najvyššej úrovni archívu tar. Rozbalením vznikne presne ten strom, ktorý používa kód obnovy." + }, + "sidecar": { + "heading": "Sprievodný súbor JSON", + "intro": "Každá úspešná lokálna záloha produkuje sesterský súbor: HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, zapísaný vedľa archívu funkciou hb_write_archive_sidecar. Tento malý súbor JSON umožňuje ProxMenux Monitor identifikovať archív ako zálohu ProxMenux hostiteľa, aj keď je neskôr presunutý, premenovaný alebo archivovaný inde.", + "contentTitle": "Obsah sprievodného súboru", + "contentBody": "Sprievodný súbor obsahuje verziu schémy, údaj o tom, či záloha vznikla interaktívne alebo plánovanou úlohou (kind), ID úlohy pri plánovaných spusteniach, použitý režim profilu (default alebo custom), názov zdrojového hostiteľa, pôvodný názov súboru archívu, časovú pečiatku vytvorenia ISO-8601 a veľkosť archívu v bajtoch.", + "whyBody": "Karta Backups v Monitore prehľadáva nakonfigurované lokálne adresáre a hľadá sprievodné súbory *.proxmenux.json, nie súbory *.tar.zst, pretože .tar.zst bez sprievodného súboru nemusí byť zálohou ProxMenux. Hľadanie je rýchle (súbory JSON sú malé) a párovanie zostane platné aj po premenovaní archívu, ak sa zodpovedajúco premenuje aj sprievodný súbor." + }, + "restoreAccess": { + "heading": "Obnova z miestneho archívu", + "body": "Postup obnovy ProxMenux nájde lokálne archívy vyhľadaním sprievodných súborov v nastavenom lokálnom cieli a zobrazí ich v zozname archívov. Výber archívu spustí _rs_check_layout, ktorý rozbalí archív tar do dočasného prípravného adresára a pred pokračovaním overí štruktúru troch blokov údajov. Pri ručnom rozbalení mimo ProxMenux príkaz tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg vytvorí rovnaký strom, ktorý používa kód obnovy." + } +} diff --git a/web/messages/sk/docs/backup-restore/destinations/pbs.json b/web/messages/sk/docs/backup-restore/destinations/pbs.json new file mode 100644 index 00000000..8df7ad4d --- /dev/null +++ b/web/messages/sk/docs/backup-restore/destinations/pbs.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Cieľ Proxmox Backup Server — repozitár, šifrovanie a obnova | ProxMenux", + "description": "Cieľ PBS ukladá zálohy hostiteľa ProxMenux ako zálohy PBS. Stránka opisuje zisťovanie úložísk z /etc/pve/storage.cfg, ručnú konfiguráciu PBS, odoslanie .pxar, šifrovanie na strane klienta so súborom kľúča a voliteľnou obnovovacou kópiou chránenou prístupovou frázou aj obnovu kľúča z viacerých zdrojov na novo nainštalovanom hostiteľovi.", + "ogTitle": "Zálohovanie ProxMenux — cieľ Proxmox Backup Server", + "ogDescription": "Ako ProxMenux ukladá zálohy hostiteľa na Proxmox Backup Server so šifrovaním súborom kľúča na strane klienta a uloženou kópiou na obnovu.", + "twitterTitle": "PBS Záložné miesto ProxMenux", + "twitterDescription": "Cieľ Proxmox Backup Server so šifrovaním súborom kľúča a obnovovacou kópiou chránenou prístupovou frázou." + }, + "header": { + "title": "Proxmox Backup Server", + "description": "Cieľ PBS odosiela celý prípravný adresár ako jednu zálohu .pxar do dátového úložiska Proxmox Backup Server. Voliteľne ju šifruje na strane klienta súborom kľúča a vedľa každej zálohy môže uložiť aj obnovovaciu kópiu kľúča chránenú prístupovou frázou.", + "section": "Záloha a obnova" + }, + "recommendedBadge": "Odporúčané miesto určenia", + "aboutPbs": { + "heading": "Čo je Proxmox Backup Server", + "body": "Proxmox Backup Server (PBS) je zálohovací server spoločnosti Proxmox, ktorý vyvíja a udržiava rovnaký tím ako Proxmox VE. Prijíma zálohy z hostiteľov Proxmox VE (VM, kontajnerov LXC a cez proxmox-backup-client aj ľubovoľných adresárov hostiteľa), podporuje deduplikáciu po blokoch, šifrovanie na strane klienta a pravidlá uchovávania na serveri. ProxMenux používa PBS ako jeden z troch cieľov záloh hostiteľa. Všetky tu opísané mechanizmy PBS (skupiny záloh, archívy .pxar, --backup-id a šifrovanie súborom kľúča) patria k štandardnému správaniu PBS." + }, + "intro": { + "title": "Jedna záloha pri každom spustení, deduplikácia po blokoch", + "body": "Záloha PBS vytvorí v dátovom úložisku jednu položku pod identifikátorom host/hostcfg-HOSTNAME/BACKUP-TIME. Obsah tvorí archív .pxar s rovnakou trojblokovou štruktúrou ako v časti Ako to funguje. PBS deduplikuje bloky medzi všetkými zálohami v úložisku, takže ďalšie zálohy toho istého hostiteľa prenášajú a ukladajú iba zmenené bloky. Uchovávanie pri plánovaných úlohách riadi samotný ProxMenux: po každom úspešnom spustení vykoná run_scheduled_backup.sh príkaz proxmox-backup-client prune s voľbami --keep-last / --keep-daily / --keep-weekly podľa hodnôt nastavených v úlohe." + }, + "repoSelection": { + "heading": "Výber úložiska", + "intro": "ProxMenux objavuje archív PBS z dvoch zdrojov na každej zálohe. Operátor vyberie jeden z jednotného menu; voľba určuje HB_PBS_REPOSITORY, HB_PBS_SECRET a HB_PBS_FINGERPRINT pre spustenie.", + "sourceRows": [ + { + "source": "Proxmox storage.cfg (automaticky zistené)", + "path": "/etc/pve/storage.cfg + /etc/pve/priv/storage/NAME.pw", + "content": "Každá sekcia pbs: v konfigurácii úložísk Proxmoxu sa zistí automaticky. Server, dátové úložisko, používateľské meno a odtlačok certifikátu sa prevezmú z tejto sekcie. Heslo sa načíta z adresára prihlasovacích údajov Proxmoxu. V ProxMenux ho netreba zadávať znova: úložisko je dostupné hneď po konfigurácii v Proxmoxe." + }, + { + "source": "ProxMenux manuálna konfigurácia", + "path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt", + "content": "Pridáva sa cez Nastaviť ciele záloh → Ciele PBS → Pridať PBS. Zadáva sa názov, používateľské meno (root@pam alebo user@pbs!token), hostiteľ alebo IP adresa, dátové úložisko a heslo. Pri prázdnom hesle sa výzva zopakuje: inak by sa prázdna hodnota potichu uložila a každá ďalšia záloha by zlyhala s nejasnou chybou overenia. Táto možnosť slúži pre PBS, ktorý nie je zaregistrovaný ako úložisko Proxmoxu." + } + ], + "menuTitle": "Výberové menu", + "menuBody": "Oba zdroje sú v jednej ponuke a každý riadok označuje pôvod ([proxmox] alebo [manual]). Položky bez zisteného hesla majú upozornenie ⚠ no password; pri ich výbere treba heslo zadať pred spustením zálohy. Odtlačok sa odovzdáva nástroju proxmox-backup-client cez premennú prostredia PBS_FINGERPRINT. Ak odtlačok chýba, klient pri prvej zálohe interaktívne požiada operátora o prijatie certifikátu servera." + }, + "backupCommand": { + "heading": "Záložný príkaz", + "intro": "Odoslanie používa jediné volanie proxmox-backup-client backup. ProxMenux pomocou env odovzdáva klientovi heslo, šifrovacie heslo a odtlačok ako premenné prostredia.", + "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": "Identifikačné meno zálohy", + "backupIdBody": "Predvolený identifikátor zálohy je hostcfg-HOSTNAME. Pred odoslaním ho operátor potvrdí alebo upraví. Znaky mimo [A-Za-z0-9_-] aj pomlčky na konci sa odstránia. Opakované použitie rovnakého ID je zámerné: PBS ho chápe ako skupinu a každá ďalšia záloha pribudne do tejto skupiny ako nová položka so spoločnou deduplikáciou s predchádzajúcimi zálohami.", + "pxarTitle": "Prečo je zdrojom celý prípravný adresár", + "pxarBody": "Zdrojom archívu .pxar je celý staging_root: spolu rootfs/, metadata/ aj manifest.json. Staršie verzie používali ako zdroj $staging_root/rootfs, takže v archíve chýbal adresár metadata/. Kontrola kompatibility pri obnove nemala čo čítať a zobrazovala upozornenia na iného hostiteľa aj pri obnove na pôvodnom hostiteľovi. Staré zálohy obsahujúce iba rootfs sa stále obnovujú správne pomocou tretej vetvy _rs_check_layout, ktorá plochý strom etc/var/root/usr zabalí do hierarchie rootfs/." + }, + "encryption": { + "heading": "Šifrovanie na strane klienta", + "glossaryHint": "Táto časť používa pojmy súbor kľúča, prístupová fráza a obnovovacia obálka. Slovník pojmov vysvetľuje ich rozdiely jednou vetou pre každý pojem.", + "intro": "Šifrovanie PBS na strane klienta šifruje bloky súborom kľúča na zdrojovom hostiteľovi ešte pred odoslaním. V ProxMenux je voliteľné. Ak sa zapne, operátor pri nastavení výslovne zvolí áno alebo nie, či sa má na PBS uložiť aj obnovovacia kópia súboru kľúča chránená prístupovou frázou. Voľbu môže neskôr zmeniť v Monitore. Súbor kľúča je vždy na kanonickej ceste /usr/local/share/proxmenux/pbs-key.conf a pri každej ďalšej šifrovanej zálohe sa použije bez ďalších otázok.", + "keyfileTitle": "Nastavenie súboru kľúčov", + "keyfileBody": "Dialóg šifrovania sa zobrazí pri prvej šifrovanej zálohe hostiteľa. Najprv sa opýta, či sa má záloha šifrovať: Nie pokračuje bez šifrovania, Áno prejde na druhý krok. Ten závisí od toho, či je na ceste /usr/local/share/proxmenux/pbs-key.conf už nainštalovaný súbor kľúča. Ak áno, použije sa bez otázok a zálohovanie pokračuje; ani pri ďalších zálohách sa otázka neopakuje. Ak nie, ponuka poskytne dve možnosti. Vygenerovať nový súbor kľúča spustí proxmox-backup-client key create --kdf none. Použiť existujúci súbor kľúča automaticky zistí kľúč spravovaný PVE: ak je vybrané úložisko PBS v Proxmoxe zaregistrované so šifrovacím kľúčom na ceste /etc/pve/priv/storage/<NAME>.enc, súbor sa bez otázok skopíruje na kanonickú cestu ProxMenux. Ak sa nenájde zodpovedajúci kľúč PVE, dialóg vyžiada absolútnu cestu, kam operátor už súbor kľúča na hostiteľovi umiestnil. V oboch prípadoch sa uloží na kanonickú cestu s chmod 600.", + "modesTitle": "Súbor kľúča pre každý hostiteľ alebo spoločný súbor", + "modesIntro": "Oba modely sú podporované a ani jeden nie je povinný. Operátor si vyberie podľa organizácie svojich hostiteľov.", + "modesPerHostTitle": "Vlastný súbor kľúča pre každý hostiteľ (predvolené)", + "modesPerHostBody": "Každý hostiteľ generuje svoj vlastný súbor kľúčov prvýkrát, čo umožňuje šifrovanie PBS. Izolácia je maximálna: ohrozenie súboru kľúčov jedného hostiteľa nevystavuje zálohy žiadneho iného hostiteľa. Odporúčané pre produkčné prostredia a pre prostredia, v ktorých majú hostitelia rôznych vlastníkov alebo hranice súladu.", + "modesSharedTitle": "Zdieľaný súbor kľúča (import na každom hostiteľovi)", + "modesSharedBody": "Jeden súbor hlavného kľúča vygenerovaný raz a nainštalovaný na každom hostiteľovi pomocou možnosti Použiť existujúci súbor kľúča. Správa je jednoduchšia: jediné tajomstvo na ochranu a ktorýkoľvek hostiteľ môže dešifrovať archívy akéhokoľvek iného (užitočné na konsolidáciu, nácvik obnovy medzi hostiteľmi alebo centralizované overenie zálohy). Kompromisom je, že únik zdieľaného súboru kľúča odhalí každého hostiteľa naraz. Odporúča sa pre domáce laboratóriá a pre flotily, kde majú všetci hostitelia rovnakého vlastníka a hranice dôvery.", + "recoveryTitle": "Odoslanie kľúča na PBS — rozhoduje operátor", + "recoveryBody": "Hneď po výbere súboru kľúča položí ProxMenux výslovnú otázku Odoslať kľúč na PBS? s dvoma odpoveďami. Kým operátor nezvolí Áno, na PBS sa neodošle žiadny obnovovací artefakt. Predvolená voľba je Nie, ponechať iba lokálne: kľúč zostane na kanonickej miestnej ceste, ProxMenux neodosiela na PBS žiadne obnovovacie artefakty a externú kópiu zabezpečí operátor. Tlačidlo Stiahnuť súbor kľúča v riadku cieľa PBS v Monitore ju poskytne na požiadanie. Voľba Áno, odoslať vyžiada dvakrát prístupovú frázu na obnovu a overí zhodu. ProxMenux ňou zašifruje súbor kľúča pomocou AES-256-CBC a PBKDF2 (600 000 iterácií, náhodná soľ) a vytvorí pbs-key.recovery.enc. Každá ďalšia šifrovaná záloha odošle túto obálku na PBS ako priradenú skupinu záloh. Pri týchto odoslaniach sa na PBS neposiela prístupová fráza ani súbor kľúča v otvorenom tvare. Voľbu možno kedykoľvek zmeniť v Monitore: ovládací prvok v riadku PBS prepína Áno/Nie a okamžite použije Spustiť odosielanie, Zastaviť odosielanie alebo Aktualizovať prístupovú frázu podľa aktuálneho stavu.", + "blobUploadTitle": "Párovaná záložná skupina na PBS", + "blobUploadBody1": "Keď je režim úschovy Áno, nahrať, ProxMenux odošle obálku na obnovenie do PBS po každej zašifrovanej zálohe ako druhá, spárovaná skupina záloh s rovnakým názvom ako hostiteľská skupina, ale končiaca na -keyrecovery. Tieto dve skupiny sedia vedľa seba v zozname dátového skladu – jedna pre zálohy hostiteľa, druhá pre obálky na obnovenie. Obálka nikdy neopustí hostiteľa v obyčajnom texte: šifrovanie prebieha na samotnom hostiteľovi pomocou AES-256-CBC a PBKDF2 predtým, ako prejdú akékoľvek bajty na drôt (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS prijíma iba už zašifrovanú obálku.", + "envelopeSecurityTitle": "Predstavuje odoslanie obnovovacieho súboru na PBS bezpečnostné riziko?", + "envelopeSecurityBody": "Obnovovací súbor je šifrovaný pri prenose aj pri uložení. Prístupová fráza na obnovu neopúšťa hostiteľa: šifrovanie prebehne lokálne pred odoslaním a PBS dostane iba zašifrovaný výsledok. Správca PBS alebo ktokoľvek s prístupom k dátovému úložisku môže obnovovací súbor stiahnuť, ale bez prístupovej frázy nedokáže prečítať súbor kľúča vnútri; ide o nečitateľný šifrovaný text. Na získanie súboru kľúča treba obe časti súčasne: obnovovací súbor aj prístupovú frázu. Obe má iba operátor.", + "blobUploadConstraintTitle": "Prečo dve skupiny namiesto jedného zašifrovaného", + "blobUploadConstraintBody": "Jediné volanie proxmox-backup-client backup zašifruje všetky svoje archívy rovnakým súborom kľúča alebo nezašifruje žiadny; kombinácia nie je možná. Záloha hostiteľa sa musí zašifrovať jeho kľúčom, ale obnovovacia obálka sa nesmie odoslať v tom istom volaní. Bola by zašifrovaná práve kľúčom, ktorý obsahuje. Na novo nainštalovanom hostiteľovi by ju nebolo možné otvoriť: na dešifrovanie kľúča by bol potrebný ten istý kľúč. Preto sa oba artefakty odosielajú nezávisle a zobrazujú sa ako dve skupiny. Klient PBS šifruje zálohu hostiteľa súborom kľúča a ProxMenux pred odoslaním šifruje obnovovaciu obálku prístupovou frázou. Dve odlišné šifrovacie vrstvy chránia dva odlišné objekty.", + "blobUploadImageAlt": "Rozhranie PBS zobrazuje skupiny záloh hostcfg-HOSTNAME a hostcfg-HOSTNAME-keyrecovery vedľa seba v zozname dátového úložiska.", + "blobUploadImageCaption": "Rozhranie PBS — priradené skupiny záloh. Hlavná skupina obsahuje zálohy hostiteľa; skupina -keyrecovery obsahuje súbor kľúča chránený prístupovou frázou.", + "recoverTitle": "Obnovenie nového hostiteľa", + "recoverBody": "Ak miestny súbor kľúča chýba na kanonickej ceste, napríklad po preinštalovaní hostiteľa alebo úmyselnom odstránení, obnova vyskúša tri zdroje v poradí a skončí pri prvom použiteľnom kľúči. Najprv sa bez otázok skopíruje zodpovedajúci kľúč spravovaný PVE z /etc/pve/priv/storage/<NAME>.enc na kanonickú cestu, ak existuje pre vybrané úložisko PBS. Ak je na PBS dostupná skupina -keyrecovery, druhý krok stiahne jej najnovšiu snímku a vyžiada prístupovú frázu na dešifrovanie. Ak ani jedna možnosť nefunguje alebo ich operátor odmietne, tretí krok vyžiada absolútnu cestu k súboru kľúča na tomto hostiteľovi a skopíruje ho na kanonickú cestu. Monitor poskytuje rovnaký import v okne podrobností zálohy. Ak Obnoviť, Stiahnuť alebo Zobraziť obsah potrebuje chýbajúci kľúč, hore sa zobrazí jantárový panel. Ak je kľúč nainštalovaný, ale nezodpovedá šifrovaniu zálohy, PBS vráti chybu wrong key — manifest's key XX does not match provided key YY. Rovnaké tri akcie potom zobrazia štruktúrovaný panel so zvýrazneným odtlačkom kľúča požadovaným manifestom, aby operátor vedel, ktorý kľúč má pre túto zálohu importovať.", + "monitorManagementTitle": "Správa súboru kľúčov z monitora", + "monitorManagementBody": "Monitor zobrazuje ovládanie súboru kľúča priamo v každom riadku cieľa PBS na stránke konfigurácie záloh. Sú tam tri akcie: Stiahnuť exportuje aktuálny súbor do prehliadača operátora; Nahrať nahradí nainštalovaný súbor dodaným súborom, pričom pôvodný prepíše až po úspešnom uložení nového na kanonickú cestu; Odstrániť zmaže súbor z hostiteľa. Vedľa je ovládanie obnovovacej kópie: výber Áno/Nie pre Odoslať kľúč na PBS?, pole prístupovej frázy pri voľbe Áno a kontextové tlačidlo na použitie voľby Spustiť odosielanie, Zastaviť odosielanie alebo Aktualizovať prístupovú frázu. Všetky akcie používajú rovnaké koncové body Flask ako terminálové rozhranie, takže účinok na disku a stav na PBS sú z oboch rozhraní rovnaké." + }, + "restoreAccess": { + "heading": "Získavanie na strane obnovy", + "body": "Obnova zisťuje zálohy hostiteľa ProxMenux na PBS zoznamom skupín v nakonfigurovanom úložisku a filtrovaním podľa vzoru identifikátora zálohy. Karta Zálohy v Monitore zobrazuje rovnaký zoznam. Výber zálohy spustí proxmox-backup-client restore s rovnakým úložiskom, heslom a odtlačkom, prípadne aj s --keyfile, ak bola záloha šifrovaná. Archív .pxar sa rozbalí do prípravného adresára, ktorý _rs_check_layout odovzdá štandardnému procesu obnovy. Pri ručnom získaní mimo ProxMenux rozbalí ten istý príkaz archív na ľubovoľnú cestu; výsledný strom možno skontrolovať alebo použiť pri ručnej obnove." + }, + "references": { + "heading": "Odkazy", + "intro": "Oficiálna dokumentácia Proxmox Backup Server ku komponentom, ktoré ProxMenux používa.", + "items": [ + { + "label": "Dokumentácia Proxmox Backup Server", + "href": "https://pbs.proxmox.com/docs/", + "tail": " — hlavný rozcestník pre inštaláciu, správu, úložiská, používateľov a roly." + }, + { + "label": "proxmox-backup-client", + "href": "https://pbs.proxmox.com/docs/backup-client.html", + "tail": " — nástroj príkazového riadka, ktorý ProxMenux používa pri každej zálohe a obnove. Opisuje identifikátory a typy záloh, archívy, syntax úložísk a premenné prostredia." + }, + { + "label": "Šifrovanie na strane klienta", + "href": "https://pbs.proxmox.com/docs/backup-client.html#encryption", + "tail": " — vytvorenie súboru kľúča, režimy --kdf a model šifrovania, ktorý ProxMenux rozširuje o obnovovaciu kópiu chránenú prístupovou frázou." + }, + { + "label": "Správa dátových úložísk", + "href": "https://pbs.proxmox.com/docs/storage.html", + "tail": "— vytváranie a správa dátových úložísk, ktoré prijímajú zálohy hostiteľa, vrátane rozloženia chunk-store a povolení." + }, + { + "label": "Prerezávanie a zber odpadu", + "href": "https://pbs.proxmox.com/docs/maintenance.html#pruning", + "tail": " — model uchovávania pre --keep-last / --keep-daily / --keep-weekly, ktorý ProxMenux uplatňuje pre každú plánovanú úlohu, aj spôsob, akým PBS uvoľňuje nepoužívané bloky po odstránení starých záloh." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/glossary.json b/web/messages/sk/docs/backup-restore/glossary.json new file mode 100644 index 00000000..c8b41233 --- /dev/null +++ b/web/messages/sk/docs/backup-restore/glossary.json @@ -0,0 +1,230 @@ +{ + "meta": { + "title": "Slovník — zálohovanie a obnova | ProxMenux", + "description": "Slovník systému zálohovania a obnovy ProxMenux: šifrovanie, súbor kľúčov, prístupová fráza, obálka obnovy, PBS, bloky, rootfs, manifest, vykonávací proces a doplnenie medzi verziami jadra.", + "ogTitle": "Slovník zálohovania a obnovy | ProxMenux", + "ogDescription": "Jasné definície slovnej zásoby použitej cez zálohovanie a obnovenie dokumentácie ProxMenux.", + "twitterTitle": "Slovník zálohovania a obnovy | ProxMenux", + "twitterDescription": "Prístupová fráza, súbor kľúčov, obálka obnovy, rootfs, manifest, PBS a bloky — všetko vysvetlené na jednom mieste." + }, + "header": { + "title": "Slovník pojmov", + "description": "Pojmy z dokumentácie zálohovania a obnovy spolu s definíciami.", + "section": "Záloha a obnova" + }, + "intro": { + "body": "Pojmy sú zoskupené podľa témy. Každý záznam dáva termín a krátku definíciu." + }, + "groups": [ + { + "title": "Šifrovanie a obnovenie kľúča", + "intro": "Slovník pre šifrovací blok PBS. Zahŕňa dve odlišné tajomstvá: binárny súbor kľúčov a písomné heslo.", + "entries": [ + { + "id": "passphrase-recuperacion", + "term": "Prístupová fráza na obnovu", + "def": "Textové heslo, ktoré užívateľ vyberá na ochranu obálky obnovenie . Vyžaduje sa dvakrát s kontrolou zhody a používa sa len na šifrovanie obálky a dešifrovanie súboru, ak je niekedy potrebné obnoviť súbor kľúčov. Nie je to heslo, ktoré odomkne samotný súbor kľúčov a nikdy sa nepošle PBS. Počas normálnej zálohy nikdy neopustí hostiteľa." + }, + { + "id": "clave-cifrado", + "term": "Súbor kľúčov (šifrovací kľúč)", + "def": "Súbor kľúča používaný proxmox-backup-client na šifrovanie blokov pred odoslaním do PBS. Bez príslušného kľúča sa šifrované dáta nedajú čítať. ProxMenux ho uloží do /usr/local/share/proxmenux/pbs-key.conf s režimom 600. Chráňte ho; obálka obnovy slúži na jeho získanie pri strate." + }, + { + "id": "contrasena-keyfile", + "term": "Heslo súboru kľúčov (KDF heslo)", + "def": "Voliteľné heslo, ktoré môže byť prenášané samotným súborom kľúčov, odlišné od prístupovej frázy na obnovu. Existuje len vtedy, keď bol súbor s kľúčom vytvorený --kdf scrypt (zvyčajne importovaný súbor kľúčov). Bez neho nie je možné súbor kľúčov odomknúť pre použitie. ProxMenux pretrváva v zašifrovanej forme na hostiteľa, takže plánované zálohy môžu bežať bez interaktívneho promptu." + }, + { + "id": "sobre-recuperacion", + "term": "Obálka obnovy", + "def": "Súbor súbor kľúčov zabalený do ďalšej vrstvy: je zašifrovaný prístupovou frázou na obnovu použitie AES-256-CBC a PBKDF2 predtým, než opustí hostiteľa. Nahrá sa do PBS ako -keyrecovery skupina. Bez passfrázy je obálka nepriehľadná: sťahovanie z PBS neodhaľuje súbor kľúčov." + }, + { + "id": "cifrado-cliente", + "term": "Šifrovanie na strane klienta", + "def": "Model šifrovania, pri ktorom sa dáta zašifrujú na zdrojovom hostiteľovi pred odoslaním. PBS prijíma a ukladá iba šifrované dáta; bez súboru kľúča ich neprečíta ani správca PBS s prístupom k dátovému úložisku. ProxMenux na tomto modeli stavia a pridáva obálku obnovy." + }, + { + "id": "kdf-none", + "term": "--kdf none", + "def": "Možnosť proxmox-backup-client key create, ktorá vytvára súbor kľúčov bez pripojenej pasovej frázy. Súbor kľúčov možno použiť priamo bez promptu, ktorý je nevyhnutný pre plánované pracovné miesta bez dozoru. Toto ProxMenux používa štandardne pri generovaní nového súboru kľúčov." + }, + { + "id": "kdf-scrypt", + "term": "--kdf scrypt", + "def": "Možnosť proxmox-backup-client key create, ktorá vytvára súbor kľúčov chránený pomocou prístupovej frázy súboru kľúča. Každé použitie súboru kľúčov si vyžaduje odomknutie s touto passfrázou. ProxMenux akceptuje tento štýl súboru kľúčov pri importe a ukladá heslo šifrované, takže plánované zálohy môžu spustiť bez dozoru." + }, + { + "id": "aes-256-cbc", + "term": "AES-256-CBC", + "def": "Štandardné symetrické šifrovanie. ProxMenux ju používa (prostredníctvom openssl enc -aes-256-cbc) na zabalenie súboru kľúča s prístupovou frázou na obnovu a výrobu obálky." + }, + { + "id": "pbkdf2", + "term": "PBKDF2", + "def": "Kryptografická funkcia, ktorá z prístupovej frázy zadanej človekom odvodí binárny šifrovací kľúč. Mnohými iteráciami spomaľuje útoky hrubou silou. Pri šifrovaní obálky obnovy ju ProxMenux používa so 600 000 iteráciami a náhodnou soľou." + } + ] + }, + { + "title": "Štruktúra zálohy", + "intro": "Pojmy popisujúce, čo žije v zálohe, bez ohľadu na cieľ.", + "entries": [ + { + "id": "rootfs", + "term": "rootfs / koreňový súborový systém", + "def": "Súborová kópia systému zdrojového hostiteľa vytvorená pomocou rsync podľa predvoleného profilu a vlastných ciest. Nie je to obraz celého disku: kopírujú sa iba cesty s konfiguráciou alebo stavom, ktoré Proxmox nedokáže sám obnoviť." + }, + { + "id": "manifiesto", + "term": "Manifest (manifest.json)", + "def": "Štruktúrovaný dokument JSON opisujúci zdrojový hostiteľ v čase zálohovania: hardvér, úložisko, jadro, ProxMenux-inštalované komponenty a inventár VM a LXC. Vyrába ho šesť nezávislých zberateľov. Obnoviteľný tok ho využíva na porovnanie zdroja a cieľa." + }, + { + "id": "staging", + "term": "Staging adresár", + "def": "Dočasný adresár, kde ProxMenux zhromažďuje tri bloky (rootfs, metaúdaje a manifest) pred ich zabalením a nahrávanie do cieľa. Po dokončení zálohy sa automaticky odstráni, a to aj po prerušení." + }, + { + "id": "perfil-defecto", + "term": "Predvolený profil", + "def": "Vybraná sada ciest, ktoré ProxMenux predvolene kopíruje v každej zálohe. Zahŕňa konfiguráciu PVE, sieť, SSH, jadro, apt, nástroje ProxMenux a ďalšie. Je definovaná v kóde a opísaná na stránke Ako to funguje." + }, + { + "id": "rutas-personalizadas", + "term": "Vlastné cesty", + "def": "Extra cesty, ktoré užívateľ pridáva na vrchol predvoleného profilu. Buď perzistentné (uložené v backup-extra-paths.txt) alebo iba pre dané spustenie (vybrané vo vlastnom režime)." + } + ] + }, + { + "title": "Miesta určenia a skladovanie", + "intro": "Pojmy súvisiace s cieľom zálohy — server PBS, lokálny archív alebo repozitár Borg — a usporiadaním dát v PBS.", + "entries": [ + { + "id": "repositorio-pbs", + "term": "PBS repozitár", + "def": "Kombinácia Proxmox Backup Server + úložisko údajov + používateľ, ktorý prijíma zálohu. Identifikované podľa reťazca user@realm@host:datastore. Jeden PBS server môže hostiť niekoľko úložísk." + }, + { + "id": "datastore", + "term": "Dátové úložisko", + "def": "Konkrétne dátové úložisko na serveri PBS so zálohami a ich blokmi. Každé je na súborovom systéme servera PBS a má vlastné oprávnenia a pravidlá." + }, + { + "id": "chunk", + "term": "Chunk / chunk deduplikácia", + "def": "PBS rozdelí zálohu na bloky premenlivej veľkosti, každý identifikuje hashom a uloží ho iba raz, aj keď sa vyskytuje vo viacerých zálohách. Následné zálohy rovnakého alebo podobných hostiteľov tak vyžadujú málo ďalšieho miesta." + }, + { + "id": "fingerprint", + "term": "Odtlačok prsta", + "def": "Kryptografický odtlačok certifikátu PBS servera TLS. Umožňuje klientovi overiť, či sa rozpráva s plánovaným serverom bez toho, aby sa spoliehal na verejný certifikačný orgán. ProxMenux ho prenáša na proxmox-backup-client prostredníctvom premennej prostredia PBS_FINGERPRINT." + }, + { + "id": "grupo-copia", + "term": "Skupina zálohy", + "def": "Logická skupina v PBS pre postupné zálohy toho istého zdroja. Nové zálohy využívajú deduplikáciu s predchádzajúcimi. Pri zapnutom šifrovaní používa ProxMenux dve skupiny na hostiteľa: jednu pre jeho zálohu a druhú s príponou -keyrecovery pre obálku obnovy." + }, + { + "id": "backup-id", + "term": "ID zálohy", + "def": "Názov skupiny backup. ProxMenux predvolený hostcfg-HOSTNAME a umožňuje užívateľovi upraviť pred nahrávaním; nepodporované znaky sú automaticky odstránené." + }, + { + "id": "pxar", + "term": ".pxar", + "def": "PBS-native archív formát pre adresáre. Správa sa ako archív tar optimalizovaný pre deduplikáciu kúskov: PBS namiesto ukladania nepriehľadného súboru rozbije svoj obsah na opakovane použiteľné kúsky." + } + ] + }, + { + "title": "Vykonávanie a plánovanie", + "intro": "Pojmy systému plánovaných úloh ProxMenux.", + "entries": [ + { + "id": "runner", + "term": "Vykonávací proces", + "def": "Skript run_scheduled_backup.sh vykonávajúci plánovanú zálohu. Prečíta konfiguráciu úlohy, spustí príslušný backend (Local, PBS alebo Borg), po úspechu uplatní pravidlá uchovávania a odošle nastavené oznámenia." + }, + { + "id": "trabajo-programado", + "term": "Plánovaná úloha", + "def": "Pretrvávajúca konfigurácia opakovaného zálohovania. Drží cieľ, poverovacie listiny, šifrovanie, harmonogram a uchovávanie. Žije na /var/lib/proxmenux/backup-jobs/<id>.env." + }, + { + "id": "modo-adjunto", + "term": "Pripojený režim", + "def": "Úloha bez vlastného časovača. Hook job-end PVE vzdump ju spustí po zálohách hostí pri zhodnom úložisku. Vybraná nadradená úloha poskytne cieľ a počiatočné uchovávanie, ale hook porovnáva úložisko, nie ID nadradenej úlohy. Spustiť ju môže aj iná úloha s tým istým úložiskom. Iba Local a PBS." + }, + { + "id": "timer-systemd", + "term": "Časovač Systemd", + "def": "Štandardný mechanizmus systemd, ktorý spúšťa príkaz podľa kalendára. ProxMenux vytvára časovač pre každú nezávislú plánovanú úlohu. Úlohy v pripojenom režime časovač nemajú; spúšťa ich hook PVE." + }, + { + "id": "retencion", + "term": "Uchovávanie (keep-last, keep-daily…)", + "def": "Politika, ktorá rozhodne, ktoré staršie zálohy udržať a ktoré prerezávať. Definované podľa úloh s parametrami ako keep-last, keep-daily, keep-weekly, keep-monthly. Aplikuje vykonávací proces po každej úspešnej zálohe." + } + ] + }, + { + "title": "Obnoviť", + "intro": "Pojmy z postupu obnovy.", + "entries": [ + { + "id": "restauracion-universal", + "term": "Všeobecná obnova", + "def": "Tok obnovy ProxMenux neextrahuje iba súborový systém: prečíta manifest, aby zistil rozdiely medzi zdrojom a cieľom, reprodukuje konfiguráciu systému a znova spustí inštalačné programy pre komponenty spravované ProxMenux. Cieľom je reprodukovať hostiteľa zdroja, nielen archív." + }, + { + "id": "hidratacion", + "term": "Hydratácia (cross-kernel)", + "def": "Krok obnovy, ktorý zlúči používateľské nastavenia zo zdroja (parametre IOMMU, ID zariadení VFIO, vlastné úpravy a kľúče GRUB) s novou konfiguráciou štartu cieľa bez doslovného kopírovania súborov viazaných na zdrojové jadro. Beží, ak je jadro cieľa novšie než v zálohe." + }, + { + "id": "cross-kernel", + "term": "Obnova medzi kernelmi", + "def": "Obnovte tam, kde sa jadro cieľa líši od jadra zdroja (zvyčajne je novšie). Vyžaduje sa prechod hydratácia, aby sa predišlo presúvaniu súborov nekompatibilných s jadrom cieľa." + }, + { + "id": "instalador-postboot", + "term": "Inštalátor post-boot", + "def": "Komponenty reinštalované po prvom štarte obnoveného hostiteľa (ovládače NVIDIA, ovládače Coral TPU, nástroje AMD GPU, nástroje Intel GPU). Každý inštalátor beží proti jadru cieľa, takže obnovený hostiteľ nezávisí od prítomnosti jadra zdroja." + }, + { + "id": "compatibility-check", + "term": "Kontrola kompatibility", + "def": "Porovnanie medzi zdrojovým manifestom a cieľovým stavom, ktorý ProxMenux vykonáva na začiatku obnovy. Rozhoduje, ktoré časti sú skopírované doslovne, ktoré potrebujú hydratáciu a ktoré sú znovu vytvorené inštalátorom." + }, + { + "id": "equipo-recien-instalado", + "term": "Čerstvá inštalácia", + "def": "Hostiteľ preinštalovaný od nuly bez lokálneho súboru kľúča. Obnova šifrovanej zálohy vyžaduje najprv získať kľúč z obálky uloženej v PBS pomocou prístupovej frázy na obnovu." + } + ] + } + ], + "whereNext": { + "heading": "Kde ďalej", + "items": [ + { + "label": "Ako to funguje", + "href": "/docs/backup-restore/how-it-works", + "tail": " — kde sa v zálohe nachádza rootfs, manifest a inventár aplikácií." + }, + { + "label": "Cieľ Proxmox Backup Server", + "href": "/docs/backup-restore/destinations/pbs", + "tail": "— kde sú do hĺbky zdokumentované šifrovanie na strane klienta, súbor kľúčov, prístupová fráza na obnovenie a obálka." + }, + { + "label": "Obnovenie", + "href": "/docs/backup-restore/restoring", + "tail": " — postup obnovy a použitie manifestu." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/how-it-works.json b/web/messages/sk/docs/backup-restore/how-it-works.json new file mode 100644 index 00000000..76f3c680 --- /dev/null +++ b/web/messages/sk/docs/backup-restore/how-it-works.json @@ -0,0 +1,205 @@ +{ + "meta": { + "title": "Ako ProxMenux Backup funguje interne — rootfs, manifest a aplikácie", + "description": "Podrobný obsah zálohy ProxMenux: rootfs skopírovaný pomocou rsync podľa predvoleného profilu ciest, štruktúrovaný manifest vytvorený šiestimi nezávislými zbernými skriptmi a inventár aplikácií, ktorý riadi automatickú reinštaláciu balíkov a komponentov po obnove.", + "ogTitle": "Ako ProxMenux Backup funguje interne", + "ogDescription": "Tri časti zálohy ProxMenux: rootfs, manifest a aplikácie.", + "twitterTitle": "Ako funguje zálohovanie ProxMenux | ProxMenux", + "twitterDescription": "Tri časti zálohy ProxMenux a spôsob, akým z nich obnova znovu vytvorí zdrojového hostiteľa." + }, + "header": { + "title": "Ako to funguje", + "description": "Vnútorná štruktúra zálohy ProxMenux — súborový systém, manifest a inventár aplikácií — a spôsob, akým ich obnova používa na vytvorenie pôvodného hostiteľa na cieli, ktorý môže mať iné jadro.", + "section": "Záloha a obnova" + }, + "intro": { + "title": "Jeden archív, tri časti", + "body": "Každá záloha vytvorí tri jasne oddelené časti v spoločnom prípravnom adresári. Archív odoslaný do cieľa (lokálny .tar.zst, záloha PBS alebo archív Borg) obsahuje túto istú štruktúru. Obnova používa všetky tri: manifest pred zmenami určí rozdiely a výnimky; rootfs poskytne konfiguračné súbory, ktoré sa použijú za behu alebo po reštarte; inventár aplikácií riadi inštaláciu balíkov a reinštaláciu komponentov po štarte. Každú časť možno skontrolovať alebo rozbaliť samostatne." + }, + "layout": { + "heading": "Rozloženie archívu", + "intro": "Každý archív sleduje rovnaké rozloženie stromov bez ohľadu na cieľ. Podadresár metadata/ má štruktúrované užitočné zaťaženie; podadresár rootfs/ má kópiu súborového systému.", + "treeCaption": "Prípravný adresár vytvorený pri zálohe. Každý cieľ dostane rovnaký strom vo svojom formáte: tar pri lokálnom cieli, bloky PBS pri PBS a segmenty Borg pri Borgu.", + "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│ ├── paths_archived.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": "Časť rootfs", + "intro": "Strom rootfs/ je obyčajná kópia súborového systému vytvorená pomocou rsync zo zdrojového hostiteľa. Obsahuje vybraný predvolený profil ciest dôležitých pre obnovu Proxmoxu a vlastné cesty, ktoré používateľ pridal do úlohy alebo interaktívnej relácie. Výber je zámerne úzky: iba cesty, ktoré obsahujú konfiguráciu alebo uchovávajú stav, ktorý Proxmox nedokáže sám znovu vytvoriť.", + "defaultProfileTitle": "Štandardný profil", + "defaultProfileBody": "Predvolený profil definuje hb_default_profile_paths v lib_host_backup_common.sh. Zahŕňa osem pevných kategórií a prípadne stav ZFS, ktoré spolu opisujú funkčného hostiteľa Proxmox:", + "categoriesTitle": "Kategórie ciest", + "categoryRows": [ + { + "category": "Jadro PVE", + "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", + "why": "Obsah klastrového súborového systému a predvolené nastavenia vzdump. Databáza pmxcfs (config.db) sa zachytí ako konzistentná snímka cez sqlite3 .backup bez zastavenia klastra. Sprievodné súbory .db-wal / .db-shm sa z rsync vylúčia. Ak sqlite3 nie je dostupný, vytvorí sa config.db.raw-fallback, ktorý obnova automaticky použije ako databázu." + }, + { + "category": "Identita hostiteľa & sieť", + "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", + "why": "Všetko potrebné na spustenie hostiteľa v sieti s rovnakou identitou. Súbory .link v /etc/systemd/network priraďujú názvy sieťových kariet k ich MAC adresám, aby sa názvy zachovali pri reinštalácii a zmenách hardvéru." + }, + { + "category": "Prístup a overovanie", + "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", + "why": "Kľúče SSH, pravidlá sudo a konfigurácia PAM. Ich strata môže používateľovi znemožniť prístup k obnovenému hostiteľovi." + }, + { + "category": "Jadro a štart systému", + "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": "Parametre IOMMU, zoznamy zakázaných modulov, ID zariadení VFIO, tabuľka pripojení a konfigurácia úložísk." + }, + { + "category": "Shell a miestne nastavenia", + "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", + "why": "Systémová konfigurácia shellu, premenné prostredia a nastavenie generovania miestnych nastavení." + }, + { + "category": "Správa balíkov a 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 zdroje pre konzistentné riešenie balíkov, plánované úlohy definované užívateľom." + }, + { + "category": "Stav a nástroje 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": "Voliteľné, ale bežné náradie Proxmox. Chýbajúce cesty sú zaznamenané v metadata/missing_paths.txt bez zastavenia zálohy." + }, + { + "category": "Spustiteľné súbory ProxMenux a účet root", + "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (bez dočasných podadresárov)", + "why": "Binárne systémy nainštalované ProxMenux a konfigurácia na užívateľa podľa /root. Prchavé cesty (.bash_history, .cache/, tmp/, .local/share/Trash/) sú z kópie vylúčené. /var/lib/proxmenux drží plánované záložné úlohy a stav hostiteľa udržiava ProxMenux; obnovenie inscenácie, rollback kópie a post-restore markery sú vylúčené, pretože patria k hostiteľovi, ktorý prevádzkuje obnovenie." + }, + { + "category": "Stav ZFS (podmienený)", + "paths": "/etc/zfs", + "why": "Zahrnuté iba vtedy, keď zdroj spustí ZFS. Obsahuje zpool.cache a hostid." + } + ], + "customTitle": "Rozšírenie profilu vlastnými cestami", + "customBody": "Okrem predvoleného profilu, ProxMenux ponúka dva spôsoby, ako zahrnúť ďalšie cesty do zálohy. Skladajú sa bez konfliktu a obe sa vzťahujú na interaktívne zálohy a plánované pracovné miesta.", + "customExtrasTitle": "1. Trvalé doplnky (na-host súbor)", + "customExtrasBody": "Textový súbor /usr/local/share/proxmenux/backup-extra-paths.txt obsahuje absolútne cesty, ktoré používateľ na tomto hostiteľovi označil ako „vždy zahrnúť“. Pri zálohe v režime Predvolené sa automaticky pridajú do predvoleného profilu bez otázok. Súbor sa upravuje cez rozhranie, bez ručnej úpravy, a pretrváva medzi reštartmi aj aktualizáciami. Každý riadok obsahuje jednu absolútnu cestu; komentáre s # sú povolené.", + "customModeTitle": "2. Vlastný režim (na beh)", + "customModeBody": "Spustenie zálohy v režime Vlastný nahradí automatickú aplikáciu predvoleného profilu kontrolným zoznamom zobrazujúcim každú cestu: položky predvoleného profilu a trvalé doplnky (s predponou [+] a vopred začiarknuté). Používateľ začiarkne alebo odznačí položky pre daný konkrétny chod a môže tiež stlačiť Pridať vlastnú cestu na zadanie novej cesty – ktorá sa potom uloží do extra súboru pre budúce zálohy.", + "customMissingTitle": "Cesta neprítomná zo zdroja", + "customMissingBody": "Akákoľvek cesta z profilu (predvolená alebo pridaná), ktorá neexistuje na zdrojovom hostiteľovi, sa zaznamenáva v metadata/missing_paths.txt vo vnútri archívu. Zálohovanie nezlyhá, ani sa nezastaví. Užívateľ vidí súhrn archivovaných ciest a chýbajúce cesty na konci. V praxi sa to stane pre voliteľné cesty nástrojov, ako je /etc/wireguard alebo /etc/prometheus, ak tieto nástroje nie sú nainštalované." + }, + "manifest": { + "heading": "Časť s manifestom", + "intro": "manifest.json je štruktúrovaný dokument JSON opisujúci zdrojového hostiteľa v čase zálohy. Vytvára ho šesť nezávislých zberných skriptov riadených skriptom build_manifest.sh. Každý iba číta údaje a vytvorí presne definovanú časť JSON. Pri zlyhaní použije bezpečnú prázdnu predvolenú hodnotu, takže manifest zostáva použiteľný aj s neúplnou časťou.", + "orchestratorCaption": "Manifest tvorí šesť zberných skriptov. Každý beží vo vlastnom podprocese. Pri zlyhaní jednej časti sa použije zdokumentovaná bezpečná predvolená hodnota a zobrazí upozornenie, ale záloha sa nepreruší.", + "collectorRows": [ + { + "collector": "collect_source_host.sh", + "produces": "source_host", + "content": "Názov hostiteľa, verzia PVE (pveversion), verzia PBS, ak hostiteľ plní úlohu zálohovacieho servera, jadro (uname -r), režim zavádzania (efi/bios), typ koreňového súborového systému, model a architektúra CPU, pamäť v KB." + }, + { + "collector": "collect_hardware.sh", + "produces": "hardware_inventory", + "content": "GPU s výrobcom a priradeným inštalátorom ProxMenux; TPU Coral USB a M.2 zistené pomocou lsusb/lspci; sieťové karty s MAC adresou, PCI slotom a priradením k mostu; bezdrôtové zariadenia. Záznamy GPU obsahujú heuristiku passthrough_eligible." + }, + { + "collector": "collect_storage.sh", + "produces": "storage_inventory", + "content": "ZFS pools (s pool typ + členské disky vyriešené na /dev/disk/by-id/*, /dev/disk/by-partuuid/* alebo surové /dev/sdX cesty v závislosti od toho, ako každý pool bol pôvodne vytvorený), LVM objemové skupiny + thin pools, fyzické disky s SMART schopnosť, PVE storage.cfg vstupy, externé pripojenia." + }, + { + "collector": "collect_kernel.sh", + "produces": "kernel_params", + "content": "Parametre pridané správcom do /proc/cmdline bez bežných predvolených položiek, ako sú BOOT_IMAGE=, root=, ro/rw, quiet a splash; moduly načítavané pri štarte z /etc/modules; a cesty súborov /etc/modprobe.d/*.conf, ktoré obsahujú skutočné direktívy (options, blacklist, install, alias, softdep)." + }, + { + "collector": "collect_proxmenux_state.sh", + "produces": "proxmenux_installed_components", + "content": "Číta /usr/local/share/proxmenux/managed_installs.json (registrácia všetkého, čo ProxMenux nainštaloval) a installed_tools.json. Každý záznam udržuje inštalačnú dráhu (menu_script), takže obnovenie môže spustiť presne rovnaký inštalačný tok." + }, + { + "collector": "collect_guests.sh", + "produces": "vms_lxcs_at_backup", + "content": "Vypíše VM (qm list) a kontajnery LXC (pct list) prítomné v čase zálohy: VMID, názov a aktuálny stav. Ide iba o inventár; samotné údaje hostí zálohujú vzdump / PBS." + } + ], + "schemaTitle": "Potvrdenie schémy", + "schemaBody": "Manifest sa overuje podľa scripts/backup_restore/schema/manifest.schema.json. Príkaz build_manifest.sh --validate spustí validáciu JSON Schema v Pythone, ktorá vyžaduje python3 a jsonschema. Ak modul chýba, kontrola sa bez upozornenia preskočí. Validácia slúži najmä vývojárom, nie je závislosťou potrebnou pri bežnom behu." + }, + "applications": { + "heading": "Inventár aplikácií", + "intro": "Dva inventáre evidujú softvér pridaný k základným balíkom Proxmox VE: zoznam balíkov v metadata/ a register komponentov v rootfs, podrobne opísané nižšie. Obnova podľa pôvodného spôsobu inštalácie používa APT alebo inštalátory ProxMenux na opätovnú inštaláciu používateľského softvéru.", + "packagesTitle": "packages.manual.list", + "packagesBody": "Abecedný textový zoznam z apt-mark showmanual obsahuje všetky balíky APT výslovne nainštalované na zdrojovom hostiteľovi. Nezahŕňa závislosti základného systému Proxmox VE, ktoré APT cieľa nainštaluje automaticky. Pri obnove ho číta _rs_run_complete_extras a použije trojstupňový filter proti kaskádovému odstraňovaniu: dpkg -s zistí už nainštalované balíky, pri knižniciach sa zistia iné hlavné verzie a apt-get install --simulate overí riziko následného odstraňovania. Zvyšné balíky sa nainštalujú cez apt-get install -y.", + "componentsTitle": "components_status.json (súčasť rootfs)", + "componentsBody": "Register JSON v /usr/local/share/proxmenux/ eviduje každý komponent nainštalovaný cez ProxMenux s presným stavom: verziou a osobitnými príznakmi (pri NVIDIA logická hodnota patched, pri Coral verzia DKMS). Súbor je v rootfs, nie v metadata/, pretože sa číta až po skopírovaní rootfs na cieľ. Dispečer po štarte (apply_cluster_postboot.sh) prejde záznamy a spustí pre každý komponent jeho --auto-reinstall hook. Ten prečíta uložený stav a zopakuje inštaláciu pre aktuálne jadro cieľa.", + "componentInstallersTitle": "Inštalátory komponentov", + "componentInstallersBody": "Štyri inštalátory ProxMenux v súčasnosti vystavujú vstupný bod --auto-reinstall:", + "installerRows": [ + { + "component": "nvidia_driver", + "installer": "gpu_tpu/nvidia_installer.sh", + "action": "Číta version a patched. Stiahne ten istý inštalačný súbor NVIDIA, zostaví moduly DKMS pre jadro cieľa a znovu použije opravu ProxMenux, ak bola na zdroji zapnutá." + }, + { + "component": "coral_driver", + "installer": "gpu_tpu/install_coral.sh", + "action": "Číta verziu Coral ovládač. Kompiluje modul DKMS s jadrom cieľa." + }, + { + "component": "amdgpu_top", + "installer": "gpu_tpu/amd_gpu_tools.sh", + "action": "Číta nahranú verziu. Znovu stiahne presný .deb z GitHub vydania." + }, + { + "component": "intel_gpu_tools", + "installer": "gpu_tpu/intel_gpu_tools.sh", + "action": "APT inštaluje balík. Idempotentné, ak už prítomný z packages.manual.list." + } + ] + }, + "restoreFlow": { + "heading": "Ako obnova používa tri časti", + "intro": "Obnova má šesť fáz. Každá číta konkrétnu časť archívu a aktualizuje cieľového hostiteľa. Žiadna nevyžaduje dostupnosť zdrojového hostiteľa: archív obsahuje všetky potrebné zálohované údaje.", + "stagesCaption": "Fáza 1 podľa manifestu rozhodne, čo upraviť. Fáza 2 skopíruje cesty rootfs použiteľné za behu. Fáza 3 pripraví rizikové cesty na ďalší štart. Fáza 3b importuje dátové pooly ZFS bez koreňového systému, ktorých disky sú všetky prítomné. Fáza 4 rieši balíky. Fáza 5 po reštarte preinštaluje komponenty pre jadro cieľa.", + "stageRows": [ + { + "stage": "1", + "name": "Kontrola kompatibility", + "reads": "manifest.json", + "action": "Spúšťa hb_compat_check. Porovnáva zdrojový a cieľový hardvér (NIC, identifikátory úložísk), verziu PVE a hlavnú verziu jadra. Nastavuje HB_COMPAT_KERNEL_DIRECTION (same, bk_newer alebo bk_older) a zaľudňuje RS_SKIP_PATHS s hardware-drift a cross-kernel s výnimkou." + }, + { + "stage": "2", + "name": "Použitie za tepla", + "reads": "rootfs/ (len bezpečné cesty)", + "action": "_rs_apply … hot kopíruje hb_classify_path=hot položky priamo do živého cieľa. Všetko pod /etc/pve, /etc/network alebo cesty klasifikované ako reboot/dangerous je odložený." + }, + { + "stage": "3", + "name": "Príprava odložených zmien", + "reads": "rootfs/ (reboot + nebezpečné cesty)", + "action": "_rs_prepare_pending_restore pripraví rizikové cesty v /var/lib/proxmenux/pending-restore/, zapíše plan.env, apply-on-boot.list a rs-skip-paths.txt a povolí spustenie proxmenux-restore-onboot.service pri ďalšom štarte." + }, + { + "stage": "3b", + "name": "Import dátových poolov", + "reads": "manifest.storage_inventory + cieľový ZFS stav", + "action": "_rs_import_data_pools importuje každého ZFS pool každého iného typu než root, ktorého úplná sada diskov sa nachádza v cieli. Pools nesúci cudzí hostid sa zopakuje s zpool import -f. Pools chýbajúce disky sú preskočené s varovaním. Výsledok per-pool je zaznamenaný v /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "stage": "4", + "name": "Inštalácia balíka", + "reads": "metadata/packages.manual.list", + "action": "_rs_run_complete_extras spustí kaskádovo bezpečný filter a zavolá apt-get install -y so zoznamom prežitých balíkov. Celý výstup ide do /var/log/proxmenux/restore-apt-*.log." + }, + { + "stage": "5", + "name": "Po štarte systému", + "reads": "rootfs (už použité) + components_status.json", + "action": "Po reštarte apply_pending_restore.sh použije odložené cesty a apply_cluster_postboot.sh spustí update-initramfs, update-grub alebo proxmox-boot-tool refresh. Potom prejde components_status.json a pre každý komponent spustí jeho --auto-reinstall hook." + } + ] + }, + "whyItWorks": { + "heading": "Prečo je záloha rozdelená na tri časti", + "body": "Rozdelenie sleduje životný cyklus údajov. Súborový systém sa prenáša cez rsync: rýchlo, prehľadne a atómovo po súboroch. Konfiguračný stav, ktorý treba vyhodnotiť pred zmenami, je štruktúrovaný JSON, samostatne čitateľný, verzovateľný schémou a strojovo porovnateľný so stavom cieľa. Softvér na reinštaláciu opisuje inventár názvov a verzií; správca balíkov a inštalátory ProxMenux vyberú vhodné binárne súbory. Každá časť plní vlastnú úlohu. Spolu smerujú ku konzistentnej obnove odolnej voči chybám: poškodený manifest ponecháva rootfs obnoviteľný, chýbajúci balík nebráni inštalácii komponentov a zlyhanie pri jednej položke nezastaví ďalšiu." + } +} diff --git a/web/messages/sk/docs/backup-restore/index.json b/web/messages/sk/docs/backup-restore/index.json new file mode 100644 index 00000000..0ec15d1c --- /dev/null +++ b/web/messages/sk/docs/backup-restore/index.json @@ -0,0 +1,93 @@ +{ + "meta": { + "title": "ProxMenux Zálohovanie a obnovenie — Prehľad | Úplné zálohovanie a obnovenie hostiteľa pre Proxmox VE", + "description": "ProxMenux Backup & Restore zachytáva úplný stav hostiteľa Proxmox – súborový systém, štruktúrovaný konfiguračný manifest a nainštalované balíky/komponenty – a reprodukuje ho na rovnakom alebo inom hostiteľovi. Zálohovanie a obnova sú samostatné: žiadne externé závislosti a obnovy medzi jadrami sú podporované prostredníctvom filtra bezpečnej podmnožiny zohľadňujúceho smer zmeny verzie a hydratácie nezávislej od jadra.", + "ogTitle": "ProxMenux Zálohovanie a obnovenie — Prehľad", + "ogDescription": "Úplné zálohovanie a obnovenie hostiteľa pre Proxmox VE so štruktúrovaným manifestom, zoznamom balíkov a preinštalátormi komponentov.", + "twitterTitle": "ProxMenux Zálohovanie a obnovenie | ProxMenux", + "twitterDescription": "Úplné zálohovanie a obnovenie hostiteľa pre Proxmox VE so štruktúrovaným manifestom, zoznamom balíkov a preinštalátormi komponentov." + }, + "header": { + "title": "Zálohovanie a obnovenie", + "description": "Zálohovanie a obnovenie úplného hostiteľa pre Proxmox VE. Zachytáva súborový systém, konfiguráciu a nainštalované komponenty do jedného archívu a reprodukuje hostiteľa v rovnakej alebo inej inštalácii Proxmox bez externých závislostí.", + "section": "Zálohovanie a obnovenie" + }, + "intro": { + "title": "Čo to je, v jednom odseku", + "body": "Záloha ProxMenux zachytáva úplný stav hostiteľa Proxmox: súborový systém, teda príslušné adresáre v /etc, /root a /var/lib/pve-cluster spolu s voliteľnými vlastnými cestami; štruktúrovaný manifest vo formáte JSON s detegovaným hardvérom, parametrami jadra, konfiguráciou siete, stavom ZFS, používateľmi a záznamami cron; a inventár aplikácií s balíkmi označenými v APT ako manuálne nainštalované a komponentmi nainštalovanými cez ProxMenux vrátane presných verzií. Všetky tri podporované ciele – lokálny archív, Proxmox Backup Server (odporúčaný) a Borg – dostávajú rovnaký samostatný obsah. Z každého možno obnoviť cieľového hostiteľa bez toho, aby bol zdrojový hostiteľ počas obnovy dostupný." + }, + "video": { + "heading": "Videonávod", + "intro": "Uprednostňujete sledovanie zálohovania a obnovenia v akcii pred jeho konfiguráciou? Tento návod obsahuje úplné demo funkcie v ProxMenux.", + "title": "ProxMenux — Návod na zálohovanie a obnovenie", + "caption": "Externé video na YouTube. Prehráva sa v režime ochrany osobných údajov (žiadne súbory cookie, kým nestlačíte tlačidlo prehrávania)." + }, + "whatItIsNot": { + "heading": "Čo to nie je", + "intro": "Táto časť sa venuje zálohovaniu a obnove hostiteľa: samotnej inštalácie Proxmoxu, nie aplikácií a virtuálnych systémov, ktoré na nej bežia.", + "items": [ + "Nejde o nástroj na zálohovanie VM/CT. Táto funkcia nezachytáva disky ani stav RAM virtuálnych systémov; na to slúži vzdump. Ich konfiguračné súbory (/etc/pve/nodes/<node>/qemu-server/*.conf a lxc/*.conf) sa však zálohujú. Po obnove sa inventár znovu zobrazí a disky možno obnoviť alebo pripojiť z existujúcej zálohy v PBS či na lokálnom úložisku.", + "Nejde o operáciu pre celý klaster. Každý uzol zálohuje sám seba. Členstvo v klastri sa zachytáva v /etc/pve, aby sa obnovený uzol mohol opäť pridať do klastra. Obnova celého klastra však vyžaduje koordináciu jednotlivých uzlov.", + "Nejde o úplný obraz disku. Binárne súbory jadra, initramfs ani zavádzacia partícia sa nezálohujú. Pri obnove ProxMenux využíva zavádzacie súbory cieľového hostiteľa, automaticky vytvorené pomocou update-initramfs a nástroja zavádzača, a inštaluje ovládače zodpovedajúce jadru spustenému na cieľovom hostiteľovi." + ] + }, + "threePillars": { + "heading": "Tri piliere zálohovania", + "intro": "Archív ProxMenux je štruktúrovaný okolo troch samostatných blokov údajov. Obnova používa všetky tri spolu na reprodukciu zdrojového hostiteľa na cieli, ktorý nemusí mať dokonca nainštalované rovnaké jadro.", + "diagramCaption": "Každá záloha obsahuje rovnaké tri bloky údajov bez ohľadu na cieľ. Obnova používa všetky tri: rootfs na uloženie súborov, manifest na zistenie odchýlok a rozdielov medzi verziami jadra a inventár aplikácií na opätovnú inštaláciu balíkov a komponentov pre vlastné jadro cieľa.", + "pillar1Label": "Súborový systém", + "pillar1Detail": "rootfs/\n(rsync z /etc,\n/etc/systemd/network,\n/root, plus\nsnímka sqlite3\nz /var/lib/pve-cluster,\n+ voliteľné cesty)", + "pillar2Label": "Manifest", + "pillar2Detail": "manifest.json\n(hardvér, parametre\njadra, sieť,\nZFS, používatelia, cron,\npooly ZFS, úložisko)", + "pillar3Label": "Aplikácie", + "pillar3Detail": "packages.manual.list\n+ components_status.json\n(manuálne balíky APT + inštalátory\nProxMenux s verziami)" + }, + "restoreIsUniversal": { + "heading": "Obnova reprodukuje hostiteľa zdroja, nie archív", + "body": "Obnova zálohy ProxMenux neznamená len rozbalenie súborového systému. Postup obnovy prečíta manifest, aby zistil rozdiely medzi zdrojom a cieľom (hardvér, premenovanie sieťových kariet, verziu jadra, identitu poolu ZFS), obnoví súborový systém a potom spustí príslušný inštalátor komponentu pre každú službu nainštalovanú v zdroji (ovládač NVIDIA, Coral TPU, nástroje GPU AMD a Intel). Každý inštalátor sa spúšťa pre aktuálne jadro cieľa, takže obnovený hostiteľ nezávisí od prítomnosti zdrojového jadra. Ak je jadro cieľa novšie než jadro zálohy, fáza hydratácie nezávislá od jadra zlúči vlastné nastavenia používateľa (tokeny IOMMU, ID zariadení VFIO, osobitné úpravy, kľúče GRUB) s novou zavádzacou konfiguráciou cieľa bez doslovného kopírovania súborov viazaných na jadro." + }, + "twoInterfaces": { + "heading": "Dve rozhrania, jeden backend", + "intro": "Každý krok pracovného postupu zálohovania a obnovy je dostupný z dvoch vstupných bodov. Oba volajú rovnakú knižnicu shellu, vytvárajú identické archívy a čítajú rovnaký register úloh.", + "cliLabel": "ProxMenux Scripts (TUI)", + "cliDetail": "menu → Nástroje →\nZálohovanie / obnovenie hostiteľa\n\nDialógový tok,\nSSH priateľský, skriptovateľný\nna použitie bez dozoru.", + "webLabel": "ProxMenux Monitor (Web UI)", + "webDetail": "Karta Backups vo\nwebovom rozhraní Monitor.\n\nObnova jedným kliknutím,\npriebežný výpis záznamov,\nprepojenie s upozorneniami\na zobrazením rozdielov rollbacku." + }, + "whereNext": { + "heading": "Kam ísť odtiaľto", + "intro": "Každá podsekcia nižšie podrobne pokrýva jeden aspekt pracovného postupu. Začnite s Ako to funguje, ak je cieľom pochopiť, čo archív obsahuje a prečo. Prejdite na Ciele a nakonfigurujte cieľ pre kópiu. Prečítajte si Obnovovanie a Obnova medzi jadrami pre stranu obnovy.", + "items": [ + { + "label": "Ako to funguje", + "href": "/docs/backup-restore/how-it-works", + "tail": "— podrobne tri bloky údajov (rootfs, manifest, aplikácie) s kolektormi, ktoré ich vytvárajú, a formátom každého súboru." + }, + { + "label": "Destinácie", + "href": "/docs/backup-restore/destinations", + "tail": "— porovnanie lokálneho úložiska, Proxmox Backup Server (odporúča sa) a Borg a ako nakonfigurovať každý z nich." + }, + { + "label": "Vytváranie záloh", + "href": "/docs/backup-restore/creating-backups", + "tail": "— jednorazové zálohy, predvolený profil cesty, pridávanie vlastných ciest, šifrovanie pre PBS." + }, + { + "label": "Plánované úlohy", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "— nové úlohy verzus pripojenie k existujúcej úlohe PVE vzdump, formáty plánovania, modálny detail úlohy." + }, + { + "label": "Obnova", + "href": "/docs/backup-restore/restoring", + "tail": "– tri akcie s archívom (zobrazenie, stiahnutie, obnovenie), úplná a vlastná obnova, dispečer po spustení a prečo záleží na posledných desiatich minútach." + }, + { + "label": "Obnova medzi jadrami", + "href": "/docs/backup-restore/cross-kernel", + "tail": " — správanie zohľadňujúce smer zmeny verzie pri odlišnom jadre cieľa a zálohy, filter bezpečnej podmnožiny a štyri fázy hydratácie." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/restoring.json b/web/messages/sk/docs/backup-restore/restoring.json new file mode 100644 index 00000000..7d53b200 --- /dev/null +++ b/web/messages/sk/docs/backup-restore/restoring.json @@ -0,0 +1,282 @@ +{ + "meta": { + "title": "Obnovenie zálohy — úplný a vlastný postup | ProxMenux", + "description": "Úplný postup obnovy: tri akcie pri každej zálohe (zobraziť, stiahnuť, obnoviť), kontrola kompatibility a jej výsledky, úplný a vlastný režim, klasifikácia ciest na použitie za behu alebo po reštarte a dispečer so záverečnou reinštaláciou komponentov po štarte.", + "ogTitle": "ProxMenux Backup — obnova", + "ogDescription": "Úplná a vlastná obnova s kontrolou kompatibility, klasifikáciou ciest, dispečerom pri štarte a reinštaláciou po štarte.", + "twitterTitle": "Obnovenie zálohy ProxMenux", + "twitterDescription": "Ako ProxMenux zálohovanie hostiteľa je premenený späť do fungujúceho Proxmox hostiteľa." + }, + "header": { + "title": "Obnovenie zálohy", + "description": "Úplný postup od výberu archívu po funkčného hostiteľa. Opisuje kontrolu kompatibility, dva režimy obnovy, dispečer pri štarte, reinštaláciu po štarte a mechanizmy predvídateľnej obnovy medzi rôznymi hostiteľmi a jadrami.", + "section": "Záloha a obnova" + }, + "intro": { + "title": "Obnovenie reprodukuje zdroj, nielen súbory", + "body": "Obnova zálohy ProxMenux znamená viac než rozbalenie súborov. Pred zmenami prečíta manifest, zistí rozdiely medzi zdrojom a cieľom, vylúči cesty ohrozujúce štart a prispôsobí nastavenia používateľa, ktoré nemožno skopírovať doslova. Po potrebnom reštarte sa pokúsi preinštalovať zaznamenané podporované komponenty (ovládač NVIDIA, Coral TPU a nástroje GPU) pre bežiace jadro cieľa. Jeden archív riadi kontrolu kompatibility, klasifikáciu ciest a prácu pri štarte aj po ňom. Výsledok overte v stavoch jednotlivých komponentov a protokoloch." + }, + "threeActions": { + "heading": "Tri akcie na zálohe", + "intro": "Výberom zálohy zo zoznamu sa otvorí menu s tromi akciami.", + "actionRows": [ + { + "action": "Zobraziť", + "detail": "Otvorí zobrazenie archívu len na čítanie: obsah manifest.json (source hostname, PVE verzia, jadra, hardvér, nainštalované komponenty), zoznam ciest vnútri rootfs/ a rozlíšenie toho, čo by sa zmenilo na aktuálnom hostiteľovi, ak by bola použitá záloha." + }, + { + "action": "Stiahnuť", + "detail": "Exportuje archív ako prenosný súbor .tar.zst (tar skomprimovaný zstd). Je možné extrahovať na ľubovoľnom systéme Linux s tar --zstd -xf FILE.tar.zst, alebo na macOS/Windows s akýmkoľvek nástrojom, ktorý podporuje zstd (7-Zip, PeaZip, Keka...). Extrahovaný strom obsahuje manifest.json, metadata/ a rootfs/, teda rovnakú štruktúru, akú používa obnova. Užitočné pre offline kontrolu alebo obnovenie na hostiteľa bez prístupu k pôvodnému cieľu (PBS, Borg)." + }, + { + "action": "Obnoviť", + "detail": "Akcia zapisujúca do systému: rozbalí archív do prípravného adresára, spustí kontrolu kompatibility a ponúkne výber úplného alebo vlastného režimu." + } + ] + }, + "compatibilityCheck": { + "heading": "Kontrola zlučiteľnosti", + "intro": "Pred napísaním akéhokoľvek súboru hb_compat_check porovnáva stav opísaný v manifeste s cieľovým hostiteľom. Kontrola beží iba na čítanie a vytvára štyri nezávislé výstupy, ktoré poháňajú zvyšok obnovy.", + "outputRows": [ + { + "output": "Príznak smeru", + "detail": "HB_COMPAT_KERNEL_DIRECTION má hodnotu same, bk_newer alebo bk_older podľa porovnania hlavných verzií jadra zálohy a cieľa. Riadi filter bezpečných ciest medzi jadrami, ktorý sa zapne iba pri bk_older, a prispôsobenie nastavení opísané na príslušnej stránke." + }, + { + "output": "Zoznam preskočených ciest", + "detail": "RS_SKIP_PATHS obsahuje cesty, ktoré obnova NESMIE použiť. Plnia ho dva mechanizmy: rozdiely hardvéru (chýbajúca sieťová karta, ID úložiska alebo cudzí pool ZFS) a pri smere bk_older zoznam ciest nebezpečných medzi rôznymi jadrami." + }, + { + "output": "Plán premapovania sieťových kariet", + "detail": "Ak má sieťová karta na cieľovom hostiteľovi rovnakú MAC adresu ako na zdrojovom, ale iný názov (bežné po výmene základnej dosky), kontrola kompatibility zaznamená plán premenovania (HB_NIC_REMAP). Ten počas obnovy upraví /etc/network/interfaces." + }, + { + "output": "Plán vrátenia zmien", + "detail": "Vypočíta ho compute_rollback_plan.sh. Vypíše VM, LXC a komponenty, ktoré sú na cieli, ale nie v zálohe. Potvrdenie ponúkne voliteľné odstránenie dodatočných hostí pred reštartom. Komponenty treba odstrániť ručne a zmazanie hostí môže zlyhať, takže presná zhoda so zálohou nie je zaručená." + } + ], + "reportBody": "Kontrola tiež vydáva štruktúrované správy (HB_COMPAT_RESULTS) kategorizované ako PASS / INFO / WARN / FAIL. WARN a FAIL vstupy povrch v paneli pre-restore; obnovenie odmieta pokračovať len vtedy, keď je prítomný FAIL, že užívateľ nemôže vyriešiť kliknutím Pokračovať." + }, + "twoModes": { + "heading": "Úplné obnovenie vs Vlastné obnovenie", + "intro": "Po kontrole kompatibility sa zobrazí výber režimu. Určuje, čo sa použije, nie ako: oba režimy používajú rovnaký postup.", + "modeRows": [ + { + "mode": "Úplná obnova", + "detail": "Použije každú cestu v archíve, ktorá prežije filtre drift a cross-kernel. Tiež spustí inštaláciu balíka a automatickú reinštaláciu komponentov. Toto je predvolená a odporúčaná voľba – cieľom je reprodukovať zdroj, nie vyberať kúsky." + }, + { + "mode": "Vlastné obnovenie", + "detail": "Otvorí zoznam všetkých ciest v archíve, z ktorých používateľ vyberie požadovanú časť. Cesty blokované filtrom medzi jadrami sú sivé a nemožno ich vybrať. Vlastný režim predvolene preskočí inštaláciu balíkov a automatickú reinštaláciu komponentov: používateľ požaduje čiastočnú obnovu, nie úplné zopakovanie zdroja." + } + ] + }, + "pathClassification": { + "heading": "Ako sú cesty klasifikované", + "intro": "Každá cesta vybraná pre obnovenie je zaradená hb_classify_path do jednej z troch kategórií. Kategória určuje, kedy sa cesta aplikuje na systém a prečo.", + "rows": [ + { + "class": "hot", + "detail": "Cesta aplikovaná okamžite do bežiaceho systému. Služba, ktorá ich konzumuje, vyzdvihne zmenu na vlastnú päsť alebo na ďalšiu reload Jedná sa o väčšinu zálohy: /etc/ssh, /etc/apt, /etc/cron.*, /root, /usr/local/bin, všeobecné konfiguračné súbory služieb, atď." + }, + { + "class": "reboot", + "detail": "Cesty odložené na ďalší štart, nie použité okamžite týmto postupom. Ovplyvňujú konfiguráciu štartu: tvorba zavádzača číta /etc/default/grub, pripájanie systémov používa /etc/fstab a načítanie modulov /etc/modules. Odložené súbory sa použijú po reštarte a potom sa znovu vytvoria potrebné zavádzacie súbory. Príklady: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + }, + { + "class": "dangerous", + "detail": "Cesty, ktoré sa NEPOUŽÍVAJÚ na bežiacom systéme, pretože zápis by mohol poškodiť stav alebo prerušiť aktívne spojenie. Pripravia sa medzi odloženými súbormi a zapíšu sa po reštarte, keď je klaster spustený a systém ešte nie je plne používaný. Príklady: /etc/pve (pmxcfs je pripojenie FUSE s aktívnou konfiguráciou klastra), /var/lib/pve-cluster (aktívne údaje klastra) a /etc/network (zmena môže prekonfigurovať rozhranie používané na SSH a prerušiť reláciu)." + } + ] + }, + "fullFlow": { + "heading": "Úplné obnovenie pracovného postupu", + "intro": "Celý postup od výberu archívu po obnoveného funkčného hostiteľa. Každá fáza pripraví vstup ďalšej: stav zapísaný skoršími fázami používajú neskoršie.", + "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" + }, + "pendingMachinery": { + "heading": "Mechanizmus odloženej obnovy", + "intro": "Cesty klasifikované ako reboot alebo dangerous, a hydratačné zápisy, sú fázované pre ďalšie boot miesto aplikácie naživo. To sa vykonáva prostredníctvom malého, samostatného súboru súborov v /var/lib/proxmenux/pending-restore/:", + "rows": [ + { + "file": "apply-on-boot.list", + "content": "Jedna relatívna cesta na riadok: presná množina ciest, ktoré apply_pending_restore.sh použije z pripraveného rootfs. Súbor ukazuje, čo sa zmení pri ďalšom štarte." + }, + { + "file": "plan.env", + "content": "Premenné prostredia načítané skriptom pri štarte: ID obnovy, príznaky kompatibility (HB_COMPAT_CROSS_VERSION, HB_COMPAT_KERNEL_DIRECTION, HB_HYDRATION_APPLIED), súhlas s vrátením stavu a voľby klastra." + }, + { + "file": "rs-skip-paths.txt", + "content": "Konečný zoznam RS_SKIP_PATHS, uložený pre apply_pending_restore.sh, aby po reštarte zachoval výnimky vypočítané v interaktívnej fáze. Bráni obnoveniu ciest nevhodných pre hardvér alebo rozdielne jadro pri štarte." + }, + { + "file": "rootfs/", + "content": "Samotné pripravené súbory – presné bajty, ktoré sa zapíšu. Zostávajú na rovnakom súborovom systéme ako /, aby bol rsync pri štarte rýchly a nezávisel od dostupnosti externého úložiska počas štartu." + } + ], + "unitBody": "Jednotka systemd proxmenux-restore-onboot.service sa povolí na konci interaktívnej fázy. Táto jednorazová služba sa spustí na začiatku ďalšieho štartu, zavolá apply_pending_restore.sh a potom sa zakáže. Podmienka ConditionPathExists=/var/lib/proxmenux/pending-restore/state zabezpečí, že bez čakajúcej obnovy nevykoná nič." + }, + "postbootDispatcher": { + "heading": "Post-boot dispečer apply_cluster_postboot.sh", + "intro": "Kde sa končí interaktívny krok a kde dochádza k skutočnej reprodukcii hostiteľa. apply_cluster_postboot.sh je nainštalovaný ako druhá jednorázová jednotka systemd (proxmenux-apply-cluster-postboot.service), ktorej ciele After=/Wants= zabezpečujú, že beží až po pve-cluster a network-online sú hore. To je miesto, kde hostiteľ-viditeľné obnoviť akcie pozemky.", + "tasks": [ + { + "task": "Použiť /etc/pve", + "detail": "/etc/pve je aktívne pripojenie FUSE systému pmxcfs, do ktorého nemožno zapisovať v skorej fáze štartu. Dispečer po spustení klastrového systému kopíruje súbory z pripraveného rootfs do živého /etc/pve, po jednom a bez reštartu pve-cluster. Zachytený /var/lib/pve-cluster/config.db alebo náhradný config.db.raw-fallback sa obnoví postupom systemctl stop pve-cluster → atómové kopírovanie súboru → systemctl start pve-cluster, aby pmxcfs po spustení načítal obnovený stav." + }, + { + "task": "Znovu vytvoriť initramfs a zavádzač", + "detail": "Spustí update-initramfs -u -k all cez každé nainštalované jadro, potom buď update-grub (GRUB inštaluje) alebo proxmox-boot-tool refresh (systemd-boot / ZFS inštaluje). Preskočené, ak interaktívny krok určiť nič sa nezmenilo v chodníkoch, ktoré ovplyvňujú tieto nástroje." + }, + { + "task": "Automatická inštalácia komponentov", + "detail": "Číta obnovený components_status.json a prejde podporované inštalátory (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Každý vybraný inštalátor použije --auto-reinstall, načíta uložený stav a zopakuje inštaláciu pre cieľové prostredie, prípadne zostaví moduly jadra. Čaká sa na reštart, aby sa použilo potom bežiace jadro cieľa. Jednotlivé chyby sa zaznamenajú a nezastavia ďalší komponent." + }, + { + "task": "Kontrola štartu systému", + "detail": "Pred spustením oznámenia o dokončení overíte, či proxmox-boot-tool status zobrazuje nakonfigurovaný ESP, každý /boot/vmlinuz-* má zodpovedajúci /lib/modules/<ver> adresár a /vmlinuz rieši. Akýkoľvek nesúlad sa vynorí v oznámení namiesto toho, aby bol skrytý." + }, + { + "task": "Oznámenie o dokončení", + "detail": "Posiela udalosť Host restore finished prostredníctvom hb_notify_lifecycle. Zahŕňa celkovú dĺžku trvania, použitý počet ciest, prípadné upozornenia na kontrolu zdravotného stavu a odkaz na log pri /var/log/proxmenux/proxmenux-cluster-postboot-*.log. Ak notifikácie nie sú konfigurované, udalosť sa neodošle; protokol aj tak zaznamená všetko" + } + ] + }, + "liveProgress": { + "heading": "Živý priebeh na karte Zálohy v Monitore", + "body": "Po reštarte zobrazuje karta Zálohy v ProxMenux Monitor živý priebeh služby proxmenux-apply-cluster-postboot.service. Číta /var/lib/proxmenux/restore-state.json, ktorý sa aktualizuje pri každej fáze: konfigurácia klastra, initramfs, zavádzač, reinštalácia jednotlivých komponentov, kontrola štartu a dokončenie.", + "fields": [ + { + "name": "Označenie stavu", + "detail": "Jeden zo stavov Prebieha obnova, Obnova dokončená alebo Obnova zlyhala. Karta číta stavový súbor každé 2 sekundy počas behu a každých 30 sekúnd po skončení." + }, + { + "name": "Panel pokroku + počítadlo krokov", + "detail": "Zobrazí N/M steps a názov aktuálneho kroku. Počas obnovy sa odhadovaný čas vypočíta z dokončených krokov a uplynutého času." + }, + { + "name": "Zoznam komponentov", + "detail": "Jeden riadok na jedného ovládača, ktorý bol preinštalovaný (NVIDIA, nástroje Intel GPU, nástroje AMD, Coral TPU) s installing / ok / failed plus odkaz na jednotlivé komponenty pri /var/log/proxmenux/component-*.log." + }, + { + "name": "Import dátových poolov", + "detail": "Blok data_pools_import má päť farebných riadkov: Importované, Vynútené (s -f pre cudzí hostid), Preskočené, neúplné disky (prítomné iba niektoré disky), Preskočené, chýbajúce disky (žiadny disk prítomný) a Zlyhané. Stav sa ukladá do /var/lib/proxmenux/restore-state.json a úplný protokol behu do /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "name": "Upozornenia pri kontrole štartu", + "detail": "Dispečer kontroluje chýbajúce adresáre /lib/modules/<kernel>, chýbajúcu konfiguráciu ESP a symbolické odkazy /vmlinuz bez existujúceho cieľa. Upozornenia sa zobrazia vo farebnom paneli." + }, + { + "name": "Rozdiely po obnove", + "detail": "Vypíše VM, LXC a komponenty prítomné na cieli, ale nie v obnovenej zálohe: tie isté položky ako v dialógu deštruktívneho vrátenia stavu pred obnovou. Každý riadok obsahuje príkaz na ručné odstránenie." + }, + { + "name": "Koniec záznamu", + "detail": "Posledné línie 600 proxmenux-cluster-postboot-<ts>.log, s Iba problémy, ktorý udržuje len línie zodpovedajúce error, warning, failed, ✗ alebo traceback." + } + ], + "dismissBody": "Keď je obnova dokončená alebo zlyhá, tlačidlo Skryť zbalí kartu. Stavový súbor zostane uložený a História znovu otvorí túto aj predošlé obnovy. Posledných 20 behov je archivovaných v /var/lib/proxmenux/restore-history/.", + "imageAlt": "Okno Podrobnosti priebehu po obnove v ProxMenux Monitor otvorené počas obnovy. Zobrazuje modrý odznak Prebieha obnova, aktuálny krok Obnovenie initramfs, odhad zostávajúceho času, čiastočne vyplnený ukazovateľ priebehu a živý koniec záznamu po štarte systému.", + "imageCaption": "Okno Podrobnosti počas spracovania po štarte: stav, aktuálny krok, zostávajúci čas a živý výpis posledných riadkov protokolu.", + "detailsImageAlt": "Rovnaké okno Podrobnosti po skončení obnovy: zelený stav Obnova dokončená, celkový čas 0m53s, plný ukazovateľ 6/6, prázdna časť rozdielov vrátenia stavu a archivovaný protokol po štarte.", + "detailsImageCaption": "Rovnaké okno po skončení: stav, celkový čas, plný ukazovateľ priebehu a archivovaný protokol po štarte." + }, + "postbootExample": { + "heading": "Ako vyzerá post-boot na konzole", + "body": "Na fyzickej konzole skončí úspešne ukončený proces riadkom [ OK ] Finished proxmenux-apply-cluster-postboot.service, často pri hláseniach OK pre multi-user.target a graphical.target. Označuje koniec procesu. Napriek tomu môžu byť zaznamenané chyby komponentov alebo upozornenia na štart. Pred vyhlásením hostiteľa za úplne obnoveného skontrolujte stavy komponentov a protokoly v Monitore.", + "imageAlt": "Fyzická konzola Proxmox s hlásením '[ OK ] Finished proxmenux-apply-cluster-postboot.service - ProxMenux Apply Cluster Configs (post-boot).', za ktorým nasleduje OK pre multi-user.target a graphical.target; vyššie je výzva na prihlásenie.", + "imageCaption": "Fyzická konzola po skončení procesu. 'Finished proxmenux-apply-cluster-postboot.service' označuje jeho koniec, ktorý Monitor hlási aj ako 'Host restore finished'. Výsledky komponentov a upozornenia treba ešte skontrolovať." + }, + "tenMinutes": { + "heading": "Prečo na posledných 10 minútach záleží", + "intro": "Reštart sám trvá sekundy, ale post-boot dispečer strávi asi desať minút dokončenie obnovy. Počas tohto okna je hostiteľ dosiahnuteľný a prihlásenie funguje, ale niektoré služby (najmä služby závislé od ovládača GPU) ešte nie sú k dispozícii. Časový rozpis typického hostiteľa Proxmoxu s NVIDIA + nainštalovaným Coralom:", + "rows": [ + { + "stage": "Boot + pve-cluster pripravený", + "time": "~30 s", + "detail": "Standard Proxmox boot. SSH, web UI a login sú k dispozícii na konci tejto etapy." + }, + { + "stage": "Použiť /etc/pve na pmxcfs", + "time": "~10 s", + "detail": "Rýchle: malé konfiguračné súbory sa kopírujú po jednom do aktívneho klastrového súborového systému." + }, + { + "stage": "Znovu vytvoriť initramfs pre všetky jadrá", + "time": "3–5 min", + "detail": "update-initramfs -u -k all prestavuje jeden obrázok initramfs na nainštalované jadro. Veľa čakania." + }, + { + "stage": "Znovu vytvoriť bootloader konfigur", + "time": "10–30 s", + "detail": "update-grub alebo proxmox-boot-tool refresh. Rýchle aj na ZFS." + }, + { + "stage": "Preinštalovať ovládač NVIDIA (ak je to vhodné)", + "time": "5–10 min", + "detail": "Stiahne nahranú verziu ovládača, kompiluje moduly DKMS oproti aktuálnemu jadru, použije opravu ProxMenux ak ju mal zdroj. Najdlhšia jediná úloha." + }, + { + "stage": "Opätovná inštalácia Coral a ďalších komponentov", + "time": "3–5 min", + "detail": "Kompilácia DKMS pre Coral, apt install pre intel-gpu-tools a stiahnutie a inštalácia .deb pre amdgpu_top." + }, + { + "stage": "Kontrola štartu a oznámenie", + "time": "~2 s", + "detail": "Nenáročné. Oznámenie informuje používateľa hneď po skončení behu." + } + ], + "outroBody": "Počas tohto času môžu po prihlásení chýbať nástroje (nvidia-smi sa nenašiel, coral sa nezistil), pretože reinštalácia stále beží na pozadí. Oznámenie označuje jej koniec. Výsledky komponentov, upozornenia a protokoly odlíšia úspech od jednotlivých zlyhaní." + }, + "destructiveRollback": { + "heading": "Voliteľný deštruktívny spätný chod", + "body": "Obnova je predvolene aditívna: dodatočné VM, LXC a komponenty zostanú zachované. Pri rozdieloch ponúkne potvrdenie Vykonať deštruktívne vrátenie stavu? s predvoleným Nie. Súhlas pred reštartom zavolá _rs_execute_rollback a pokúsi sa odstrániť vypísané dodatočné VM a LXC. Komponenty sa označia na ručné odinštalovanie, pretože automatické nie je implementované. Chyby odstránenia sa oznámia a spracovanie pokračuje, takže presná zhoda nie je zaručená. Pred touto deštruktívnou voľbou skontrolujte názvy a VMID/CTID." + }, + "logs": { + "heading": "Kde záznamy žijú", + "rows": [ + { + "log": "/var/log/proxmenux/restore-YYYYMMDD_HHMMSS.log", + "detail": "Zapisuje sa v interaktívnej fáze: výsledky kompatibility, filter rozdielov, plán prispôsobenia, výstup použitia za behu a prípravy odložených zmien, inštalácia balíkov." + }, + { + "log": "/var/log/proxmenux/apply-pending-YYYYMMDD_HHMMSS.log", + "detail": "Zapisuje ho apply_pending_restore.sh na začiatku štartu: načítanie plan.env, spracovanie apply-on-boot a filtrovanie vylúčených ciest." + }, + { + "log": "/var/log/proxmenux/proxmenux-cluster-postboot-YYYYMMDD_HHMMSS.log", + "detail": "Zapisuje ho apply_cluster_postboot.sh: použitie konfigurácie pve-cluster, výstup initramfs a zavádzača, výstup inštalátorov komponentov, kontrola štartu a obsah oznámenia." + }, + { + "log": "/var/log/proxmenux/component--YYYYMMDD_HHMMSS.log", + "detail": "Jeden protokol na inštalačný program komponentu (nvidia, coral, atď.), ktorý bol spustený v prechode po spustení. Užitočné, keď preinštalovanie konkrétneho komponentu zlyhalo a používateľ potrebuje vlastný výstup nástroja." + }, + { + "log": "/var/log/proxmenux/restore-datapools-YYYYMMDD_HHMMSS.log", + "detail": "Napísal _rs_import_data_pools. Obsahuje: sčítanie nekoreňových poolov z manifestu, na-pool výsledok (dovážané čisto, importované s -f pre zahraničné hostid, preskočené kvôli chýbajúce disky, alebo zlyhal), a surový výstup každého zpool import hovoru." + } + ] + }, + "whereNext": { + "heading": "Kam ísť ďalej", + "items": [ + { + "label": "Obnova medzi kernelmi", + "href": "/docs/backup-restore/cross-kernel", + "tail": "— filter bezpečnej podmnožiny zohľadňujúci smer a prechod na hydratáciu vyvolaný, keď sa cieľové jadro líši od záložného." + }, + { + "label": "Ako to funguje", + "href": "/docs/backup-restore/how-it-works", + "tail": " — štruktúra archívu, manifest a inventár aplikácií, ktoré používa obnova." + }, + { + "label": "Plánované úlohy", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " — bezobslužný postup, ktorý vytvára archívy používané pri tejto obnove." + } + ] + } +} diff --git a/web/messages/sk/docs/backup-restore/scheduled-jobs.json b/web/messages/sk/docs/backup-restore/scheduled-jobs.json new file mode 100644 index 00000000..03e011e3 --- /dev/null +++ b/web/messages/sk/docs/backup-restore/scheduled-jobs.json @@ -0,0 +1,152 @@ +{ + "meta": { + "title": "Plánované úlohy — časovače, režim attach a uchovávanie záloh | ProxMenux", + "description": "Plánované úlohy zálohovania hostiteľa ProxMenux. Dva režimy vytvorenia (vlastný časovač systemd alebo pripojenie k existujúcej úlohe vzdump PVE), pravidlá uchovávania pre jednotlivé úlohy cez proxmox-backup-client, Borg alebo lokálne čistenie, súbory v /var/lib/proxmenux/backup-jobs a spúšťací skript vytvárajúci rovnaké archívy ako interaktívny postup.", + "ogTitle": "Zálohovanie ProxMenux — plánované úlohy", + "ogDescription": "Plánované zálohy hostiteľa bez obsluhy s režimom pripojenia, pravidlami uchovávania a rovnakými tromi cieľmi ako interaktívny postup.", + "twitterTitle": "Plánované úlohy | ProxMenux", + "twitterDescription": "Plánované úlohy zálohovania hostiteľa bez obsluhy s režimom pripojenia a uchovávaním." + }, + "header": { + "title": "Plánované úlohy", + "description": "Úlohy zálohovania hostiteľa bez obsluhy. Dva modely vytvorenia: nová nezávislá úloha s vlastným plánom alebo úloha pripojená k existujúcej úlohe vzdump PVE, z ktorej preberá plán a pravidlá uchovávania. Oba modely vytvárajú rovnaké archívy ako interaktívny postup.", + "section": "Záloha a obnova" + }, + "intro": { + "title": "Dva modely plánovaných úloh", + "body": "Plánovanú úlohu možno vytvoriť podľa jedného z dvoch modelov:", + "modelsList": [ + "Nová nezávislá úloha — ProxMenux nastaví vlastný plán pomocou samostatného časovača systemd, nezávisle od ostatných úloh na hostiteľovi. Podporuje všetky tri ciele: lokálny, PBS a Borg.", + "Pripojenie k existujúcej úlohe vzdump PVE — úloha nemá vlastný plán; spúšťa sa automaticky pri nadradenej úlohe vzdump PVE, ktorá už zálohuje VM a LXC na hostiteľovi. Preberá jej plán a pravidlá uchovávania. Podporuje lokálny cieľ a PBS (Borg nie je podporovaný, pretože PVE preň nemá natívny plánovač)." + ] + }, + "attachBadge": { + "title": "Režim pripojenia — odporúčaný, ak už existuje úloha vzdump PVE", + "body": "Ak už existuje úloha vzdump PVE pre VM a LXC na uzle, pripojená záloha hostiteľa sa vykoná po zálohe hostí v rovnakom zálohovacom cykle. Pri obnove pochádzajú konfigurácie hostí zo zálohy hostiteľa (v /etc/pve) a ich disky zo záloh vzdump daného cyklu. To pomáha koordinovať obnovu celého uzla, ale nejde o atómovú snímku: zmeny počas cyklu môžu zanechať rozdiely medzi konfiguráciou hostiteľa a stavom diskov hostí." + }, + "frequencyBadge": { + "title": "Odporúčaná frekvencia", + "body": "Ak chcete maximalizovať kompatibilitu zálohy hostiteľa s budúcou obnovou, zálohujte často. Čím bližšie je záloha aktuálnemu stavu hostiteľa, tým menej rozdielov v konfigurácii, balíkoch a komponentoch musí obnova zosúladiť." + }, + "modes": { + "heading": "Dva režimy", + "rows": [ + { + "mode": "Nová plánovaná úloha", + "backends": "Miestne, PBS, Borg", + "schedule": "Vlastný výraz OnCalendar (syntax kalendára systemd, napr. daily alebo Mon..Fri 03:00).", + "retention": "Zadáva sa samostatne: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. Použije spúšťací skript po každej úspešnej zálohe." + }, + { + "mode": "Pripojiť k úlohe vzdump PVE", + "backends": "Local, PBS (Borg nemá plánovač na strane PVE)", + "schedule": "Preberá sa z nadradenej úlohy PVE. Na strane ProxMenux sa neinštaluje žiadny časovač systemd.", + "retention": "Preberá sa z konfigurácie prune-backups nadradenej úlohy (pomocou hb_pve_prune_to_keep_env mapovanej jedna k jednej na premenné KEEP_* spúšťacieho skriptu)." + } + ] + }, + "attachDetail": { + "heading": "Ako funguje režim pripojenia", + "intro": "PVE zapisuje úlohy vzdump do /etc/pve/jobs.cfg — jednu sekciu pre každú úlohu s úložiskom záloh VM a LXC. Režim pripojenia vyžaduje backend podporovaný ProxMenux (lokálny alebo PBS). Záloha hostiteľa sa spustí cez hook job-end po dokončení úlohy zálohovania hostí.", + "steps": [ + { + "step": "1", + "detail": "Počas vytvárania úlohy ProxMenux uvádza kompatibilné rodičovské PVE úlohy prostredníctvom hb_pve_list_vzdump_jobs_for_backend. Užívateľ si vyberie jednu." + }, + { + "step": "2", + "detail": "Súbor .env úlohy sa zapíše s PVE_PARENT_JOB, PVE_STORAGE a prevzatými hodnotami KEEP_*; časovač systemd sa nevytvorí." + }, + { + "step": "3", + "detail": "hb_install_vzdump_hook zaregistruje hook v /etc/vzdump.conf. Vo fáze job-end ľubovoľnej úlohy vzdump porovná prijaté $STOREID s PVE_STORAGE každej povolenej pripojenej úlohy a pri zhode zavolá spúšťací skript. Zhoda sa určuje podľa úložiska, nie podľa ID vybranej nadradenej úlohy." + }, + { + "step": "4", + "detail": "Archív sa uloží do rovnakého úložiska ako zálohy vzdump: path/dump/ pri lokálnom cieli alebo repozitár PBS nastavený v úložisku PVE." + } + ], + "outroBody": "Režim pripojenia nemá vlastný časovač. Vypnutie alebo odstránenie vybranej nadradenej úlohy PVE zastaví jej spúšťanie, ale iná úloha vzdump s rovnakým úložiskom môže pripojenú zálohu hostiteľa stále spustiť. Ak tomu chcete zabrániť, vypnite alebo odstráňte samotnú úlohu ProxMenux. Pri vypnutí zostane záznam na disku a možno ho neskôr povoliť alebo znovu pripojiť." + }, + "storageLayout": { + "heading": "Súbory, ktoré tvoria prácu", + "intro": "Každá plánovaná úloha je plne popísaná tromi alebo štyrmi súbormi na disku. Čítanie im dáva plnú konfiguráciu úlohy bez spoliehania sa na rozhranie.", + "rows": [ + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env", + "content": "Backend, ID zálohy alebo cieľ, plán (nový režim) alebo nadradená úloha PVE (režim pripojenia), príznak povolenia, hodnoty uchovávania KEEP_* a odkazy na prihlasovacie údaje." + }, + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths", + "content": "Jedna absolútna cesta na riadok — výber odvodený z profilu a uložený pri vytvorení úlohy. Po úprave súboru sa pri ďalšom spustení časovačom použije nový výber." + }, + { + "path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service", + "content": "Iba nový režim. Služba vyvoláva run_scheduled_backup.sh JOB_ID. Časovač ho naplánuje s Persistent=true (zmeškané spustenia sa vykonajú pri ďalšom štarte) a malým RandomizedDelaySec=120 rozložiť zaťaženie, keď viaceré úlohy zdieľa rovnaký OnCalendar výraz." + }, + { + "path": "/etc/vzdump.conf script-hook", + "content": "Iba režim pripojenia. Raz ho nainštaluje hb_install_vzdump_hook; porovnáva PVE_STORAGE každej pripojenej úlohy s $STOREID, ktoré PVE odovzdáva hooku." + } + ] + }, + "runner": { + "heading": "Čo úloha vykoná pri spustení", + "intro": "Každá práca, či je nový model alebo pripojený, má rovnakú trojstupňovú sekvenciu:", + "steps": [ + "Pripraví zálohu. Načíta konfiguráciu úlohy (cieľ, profil, cesty) a zostaví strom archívu rovnako ako interaktívny postup. Výsledkom je rovnaký archív, aký by vytvorila manuálna záloha s týmito nastaveniami.", + "Zapíše do cieľa. Odošle alebo zapíše archív do nastaveného cieľa — lokálny súbor .tar.zst, záloha PBS alebo archív Borg — s presne rovnakými nástrojmi a prihlasovacími údajmi ako manuálna záloha do rovnakého cieľa.", + "Použije pravidlá uchovávania. Odstráni staré zálohy z cieľa a ponechá počty nastavené v úlohe cez keep-last / keep-daily / keep-weekly. Čistenie vykonáva príslušný backend: PBS používa svoje pravidlá uchovávania, Borg spustí borg prune a pri lokálnom cieli ProxMenux odstráni súbory mimo rozsahu keep-last." + ] + }, + "management": { + "heading": "Správa úloh", + "intro": "Menu rozvrhu (Scripts TUI) a záložka Monitor Backup odhaľujú rovnaké akcie na akejkoľvek práci.", + "rows": [ + { + "action": "Spustiť teraz", + "detail": "Okamžite zavolá spúšťací skript bez čakania na časovač alebo hook vzdump. Umožní overiť konfiguráciu úlohy bez čakania na ďalšie plánované spustenie." + }, + { + "action": "Povoliť / zakázať", + "detail": "Nový režim: časovač sa ovláda cez systemctl enable/disable --now. Režim pripojenia: zmení príznak ENABLED v súbore env úlohy — hook ho zohľadní pri ďalšom spustení PVE." + }, + { + "action": "Upraviť", + "detail": "Znovu otvorí destináciu, rozvrh, profil a retenčný postup a prepíše pracovné súbory. Zachováva ID práce." + }, + { + "action": "Odstrániť", + "detail": "Odstráni súbor env úlohy, súbor ciest, časovač a službu systemd (nový režim) a vypne pripojenie k hooku (režim pripojenia). Existujúce archívy v cieli nemení." + }, + { + "action": "Zobraziť záznam", + "detail": "Priebežne zobrazuje /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log — jeden protokolový súbor na beh. Spúšťací skript tiež vydáva kompaktný stavový riadok na journald pod systemd služby." + } + ] + }, + "notifications": { + "heading": "Oznámenia", + "body": "Každé plánované spustenie vyvolá rovnaké udalosti hb_notify_lifecycle ako interaktívny postup (start, complete, fail). Ak sú v Monitore nastavené kanály upozornení, úlohy bez obsluhy oznámia výsledky rovnako ako manuálne zálohy — používateľ nemusí kontrolovať záznam, aby zistil úspech úlohy." + }, + "whereNext": { + "heading": "Kam ísť ďalej", + "items": [ + { + "label": "Vytváranie záloh", + "href": "/docs/backup-restore/creating-backups", + "tail": " — interaktívny postup, ktorý zdieľa backend s plánovačom." + }, + { + "label": "Ciele", + "href": "/docs/backup-restore/destinations", + "tail": " — konfigurácia jednotlivých backendov používaná interaktívnym postupom aj plánovačom." + }, + { + "label": "Obnovenie", + "href": "/docs/backup-restore/restoring", + "tail": " — postup používajúci zálohy vytvorené úlohami." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/creating-backups.json b/web/messages/sv/docs/backup-restore/creating-backups.json new file mode 100644 index 00000000..f11c2a6d --- /dev/null +++ b/web/messages/sv/docs/backup-restore/creating-backups.json @@ -0,0 +1,220 @@ +{ + "meta": { + "title": "Skapa säkerhetskopior — interaktivt säkerhetskopieringsflöde | ProxMenux", + "description": "Det interaktiva säkerhetskopieringsflödet i ProxMenux: två ingångspunkter (Scripts TUI-meny och Monitors webbgränssnitt), tre destinationer, två profillägen, ett gemensamt steg för tillfällig förberedelse och en bekräftelsedialog. Sidan beskriver matrisen med sex alternativ, standardprofilen och den anpassade profilen samt vad användaren ser från valet av säkerhetskopia tills arkivet sparas på destinationen.", + "ogTitle": "ProxMenux Backup - skapa backup", + "ogDescription": "Det interaktiva säkerhetskopieringsflödet med tre destinationer, två profiler och ett gemensamt steg för tillfällig förberedelse.", + "twitterTitle": "Skapa backups | ProxMenux", + "twitterDescription": "Interaktivt backupflöde med tre destinationer och två profillägen." + }, + "header": { + "title": "Skapa backups", + "description": "Det interaktiva säkerhetskopieringsflödet: välj en destination och en profil, granska bekräftelsen och följ hur arkivet sparas. De två ingångspunkterna använder samma backend och skapar identiska arkiv.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "title": "Två ingångspunkter, identisk funktionalitet", + "body": "Scripts TUI och Monitors webbgränssnitt erbjuder exakt samma funktioner. Varje säkerhetskopia — manuell eller schemalagd — går genom samma valmatris (tre destinationer × två profiler) och anropar samma backendfunktion per cell (_bk_pbs, _bk_borg eller _bk_local). Arkiven som skapas via de två ingångspunkterna är identiska. Valet beror på vad man föredrar: TUI passar för SSH och skript; Monitor erbjuder musklick tillsammans med vyerna för aviseringar och löpande loggutdata." + }, + "entryPoints": { + "heading": "De två ingångspunkterna", + "rows": [ + { + "entry": "ProxMenux Scripts (TUI)", + "path": "menu → Utilities → Host Config Backup", + "detail": "Dialogbaserat flöde, SSH-vänligt. Huvudmenyn presenterar de sex alternativen direkt. Använder backup_menu i backup_host.sh." + }, + { + "entry": "ProxMenux Monitor (Webb UI)", + "path": "Backups tab → Create backup", + "detail": "Guidebaserat flöde. Samma sex alternativ visas i ett formulär med två steg (destination → profil). Samma backendfunktioner anropas via Flask-API:et." + } + ] + }, + "modes": { + "heading": "Manuella och schemalagda säkerhetskopior", + "body": "Säkerhetskopior kan produceras i två lägen: manuellt (det interaktiva flöde som beskrivs på denna sida - användaren plockar en destination och en profil från en meny och följer hur arkivet sparas) eller schemalagt (ett obevakat jobb som körs på en timer i cron-stil och tillämpar bevarandeinställningarna för jobbet). Båda lägena stöder samma tre destinationer och samma två profiler, och båda är tillgängliga från båda ingångspunkterna - Scripts TUI-meny och Monitors Backups-flik. Planerade jobb använder samma backendfunktioner som manuellt flöde genom run_scheduled_backup.sh; de arkiv som produceras är oskiljbara.", + "seeAlso": "Sidan schemalagda jobb täcker hela flödet, inklusive hur man skapar ett jobb, bifogar det till en befintlig PVE vzdump timer och konfigurerar retentionsvärdena.", + "monitorAlt": "ProxMenux Monitor Backups-fliken som visar den nya schemalagda backup-dialogen med destination, profil, schema och fält för bevarande.", + "monitorCaption": "Schemalagd säkerhetskopia — ProxMenux Monitor. Samma guidedialog som skapar en manuell säkerhetskopia har fält för schema och bevarande längst ner för obevakad körning." + }, + "matrix": { + "heading": "Matrisen med sex alternativ", + "intro": "Valet avgör både vilken backend som körs och vilken strategi för sökvägsval som används. Se sidorna för respektive destination för konfigurationsdetaljer om varje cell.", + "rows": [ + { + "combo": "1", + "destination": "PBS", + "profile": "Standard", + "action": "Laddar upp standardprofilen och de beständiga tilläggen till ett konfigurerat PBS-arkiv." + }, + { + "combo": "2", + "destination": "Borg", + "profile": "Standard", + "action": "Skapar ett arkiv med standardprofilen plus beständiga tillägg i det valda Borg-förvaret." + }, + { + "combo": "3", + "destination": "Lokal", + "profile": "Standard", + "action": "Skriver ett .tar.zst-arkiv med standardprofilen plus beständiga tillägg till det konfigurerade lokala målet." + }, + { + "combo": "4", + "destination": "PBS", + "profile": "Anpassad", + "action": "Öppnar sökvägsväljaren före uppladdningen till PBS; användaren markerar sökvägar och kan lägga till nya." + }, + { + "combo": "5", + "destination": "Borg", + "profile": "Anpassad", + "action": "Öppnar sökvägsväljaren innan Borg-arkivet skapas." + }, + { + "combo": "6", + "destination": "Lokal", + "profile": "Anpassad", + "action": "Öppnar sökvägsväljaren innan det lokala .tar.zst-arkivet skrivs." + } + ] + }, + "profiles": { + "heading": "Standard vs anpassad profil", + "defaultTitle": "Standardprofil", + "defaultBody": "Standardprofilen är den kurerade listan från hb_default_profile_paths (dokumenterad i Hur det fungerar under Sökvägskategorier) plus varje post i den filen med beständiga tillägg /usr/local/share/proxmenux/backup-extra-paths.txt. Användaren bekräftar destinationen och krypteringsalternativen och backupen fortsätter utan ytterligare sökvägsval.", + "customTitle": "Anpassad profil", + "customBody": "Den anpassade profilen öppnar en checklista med alla sökvägar i standardprofilen (omarkerade) och alla beständiga tillägg (förmarkerade, med prefixet [+]). Användaren markerar sökvägarna för denna körning och kan trycka på Lägg till anpassad sökväg för att lägga till en ny absolut sökväg. Sökvägar som läggs till här sparas i backup-extra-paths.txt så att framtida säkerhetskopior tar med dem automatiskt. Att avmarkera ett beständigt tillägg utesluter det från denna körning men tar inte bort det ur filen — borttagning görs separat via Hantera anpassade sökvägar, utanför säkerhetskopieringsflödet.", + "customPickerAlt": "Checklista för anpassad profil med standardprofilens sökvägar (omarkerade) och beständiga tillägg (förmarkerade med prefixet [+]), samt knappar för att lägga till en sökväg eller bekräfta valet.", + "customPickerCaption": "Anpassad profil — sökvägsväljaren. Standardprofilens sökvägar är omarkerade; beständiga tillägg är förmarkerade med prefixet [+]. Användaren markerar sökvägarna för denna körning.", + "manageCustomAlt": "Menyn för att hantera anpassade sökvägar med listan över beständiga tillägg och alternativ för att lägga till, ta bort eller redigera dem.", + "manageCustomCaption": "Hantera anpassade sökvägar — platsen där beständiga tillägg läggs till eller tas bort. Varje sökväg här ingår automatiskt i säkerhetskopior med standardprofilen utan att den anpassade sökvägsväljaren behöver öppnas." + }, + "commonPipeline": { + "heading": "Vad som går oavsett destination", + "intro": "När profilen har fastställts kör varje backend samma tillfälliga förberedelsesteg innan den går vidare till sin egen uppladdningsmetod. hb_prepare_staging bygger arkivträdet i /tmp/proxmenux-DESTINATION-stage.XXXXXX och fyller vart och ett av de tre datablocken.", + "steps": [ + { + "step": "1", + "name": "Sammanställning av rootfs", + "detail": "Kör rsync -a för varje vald sökväg till staging_root/rootfs/. Databasen pmxcfs i /var/lib/pve-cluster/config.db sparas separat via sqlite3 .backup för att få en konsekvent ögonblicksbild utan att stoppa klustret; hjälpfilerna .db-wal / .db-shm utesluts från rsync. Om sqlite3 saknas sparas i stället en fil config.db.raw-fallback, som återställningen använder som databas vid importen. Flyktiga undersökvägar (bash-historik, cache, papperskorg) utesluts från /root/. Sökvägar som saknas i källan registreras i metadata/missing_paths.txt utan att säkerhetskopieringen avbryts." + }, + { + "step": "2", + "name": "Manifestgenerering", + "detail": "build_manifest.sh samordnar de sex insamlingsmodulerna och skriver manifest.json i roten av den tillfälliga katalogen. Om en modul misslyckas får det berörda avsnittet ett dokumenterat tomt standardvärde; manifestet är fortfarande giltigt." + }, + { + "step": "3", + "name": "Paketinventering", + "detail": "apt-mark showmanual fångas verbatim i metadata/packages.manual.list. Komponentstatus är redan inne i det återställda rootfs (components_status.json) eftersom /usr/local/share/proxmenux/ är en del av standardprofilen." + }, + { + "step": "4", + "name": "Information om körningen", + "detail": "metadata/run_info.env registrerar säkerhetskopieringens identitet - värdnamn, tidsstämpel, kärnversion - som används av återställningens kompatibilitetskontroll för att bestämma riktningen mellan kärnversionerna." + }, + { + "step": "5", + "name": "Avisering (start)", + "detail": "hb_notify_lifecycle \"start\" utlöses. Om aviseringar är konfigurerade i Monitor skickas händelsen Säkerhetskopiering av värden startad till användaren. Inget skickas om inga kanaler har konfigurerats." + } + ] + }, + "included": { + "heading": "Vad går in och vad stannar ut", + "intro": "Varje sökväg i den fastställda profilen (standard + beständiga tillägg + val i anpassat läge) kopieras med rsync -aAXH --numeric-ids. En delad uteslutningslista gäller för varje sökväg, och två kataloger har ytterligare sökvägsspecifika uteslutningar.", + "globalTitle": "Globala uteslutningar (tillämpas varje väg)", + "globalItems": [ + "images/ - bilddumpar.", + "dump/ — utdata från vzdump.", + "tmp/ - tillfälliga filer.", + "*.log loggfiler." + ], + "rootTitle": "/root/-uteslutningar", + "rootBody": "/root/ ingår i standardprofilen så att användarens skript och konfiguration sparas i arkivet. Flyktiga undersökvägar utesluts:", + "rootItems": [ + ".bash_history", + ".cache/", + "tmp/", + ".local/share/Trash/" + ], + "proxmenuxTitle": "/usr/local/share/proxmenux/-uteslutningar", + "proxmenuxBody": "Denna katalog skickar användarstatus endast - components_status.json, preferenser, post-install cache. Kod som destinationen redan har från sin egen ProxMenux-installation utesluts så att en återställning inte överskriver målets nuvarande binärer med äldre:", + "proxmenuxItems": [ + "restore-pending/, scripts/, web/", + "monitor-app/, monitor-app.*/, AppImage/", + "images/, json/", + "utils.sh, helpers_cache.json", + "ProxMenux-Monitor.AppImage*, install_proxmenux*.sh" + ], + "notInProfileTitle": "Vägar utanför profilen", + "notInProfileBody": "Allt som inte anges i hb_default_profile_paths och inte läggs till som en anpassad eller ihållande extra är inte en del av backupen. Anmärkningsvärda exempel:", + "notInProfileItems": [ + "VM- och LXC-diskar - hanteras av vzdump, inte av denna funktion. Gästkonfigurationsfiler under /etc/pve/nodes/*/qemu-server/*.conf och lxc/*.conf fångas (de lever under /etc/pve) så återställningen reproducerar inventeringen; diskarna själva är återanslutna från en befintlig vzdump / PBS backup.", + "/boot och /boot/efi - kärnbinärer, initramfs och UEFI ESP-partitionen regenereras av målets egen update-initramfs, update-grub eller proxmox-boot-tool refresh efter återställningen. Starthanteraren kopieras aldrig ordagrant.", + "Filsystem för kärnan och systemets körning — /proc, /sys, /dev och /run är pseudofilsystem som skapas av kärnan och udev; de lagras inte beständigt någonstans.", + "Paketbinärer under /usr/bin, /usr/lib, /lib, /sbin - ominstallerad av målets APT från packages.manual.list.", + "/var/log/, /var/tmp/, /var/cache/ - per-värd runtime tillstånd, inte återställd.", + "/home/USER - inte i standardprofilen. Lägg till det som en anpassad väg när ett system bär hemkataloger som måste överleva en återställning." + ], + "customPathsTitle": "Hur anpassade vägar hanteras", + "customPathsBody": "En anpassad väg som läggs till i anpassat läge eller kvarstår i backup-extra-paths.txt går igenom samma rsync-pipeline som standardprofilvägar. Globala uteslutningar gäller. Om den anpassade vägen råkar vara under /root/ eller /usr/local/share/proxmenux/ gäller fortfarande de vägspecifika uteslutningarna ovan. Varje arkiverad väg - standard eller anpassad - registreras i metadata/paths_archived.txt. Sökvägar som inte finns på källan registreras i metadata/missing_paths.txt utan att stoppa backupen." + }, + "archiveStructure": { + "heading": "Arkivstruktur", + "intro": "Den tillfälliga katalog som varje backend skapar har samma struktur oavsett destination. Tar-arkivet, PBS-arkivet .pxar eller Borg-arkivet lagrar detta träd oförändrat.", + "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│ ├── paths_archived.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": "Sammanfattning för bekräftelse", + "body": "Innan backend skriver något till destinationen visar ProxMenux en sammanfattande dialog med destinationen, backup-ID eller arkivnamn, krypteringstillstånd och listan över vägar som kopieras. Avbokning här avbryter backupen rent - staging katalogen tas bort av trap kroken på backend funktionen och ingen partiell data når destinationen." + }, + "writing": { + "heading": "Skriva till destinationen", + "intro": "Efter bekräftelsen kör varje backend sitt eget skrivsteg. Sidorna för destinationerna beskriver hur det fungerar; de gemensamma delarna är loggen, sidofilen och aviseringen om slutförande.", + "rows": [ + { + "topic": "Loggfil", + "detail": "Varje backend skriver sin fullständiga utdata till /tmp/proxmenux-DESTINATION-backup-YYYYMMDD_HHMMSS.log och, på misslyckande, erbjuder att öppna den i en rullande dialog. Loggsökvägen visas i sammanfattningen endast när filen har innehåll." + }, + { + "topic": "Sidecar (endast lokal)", + "detail": "hb_write_archive_sidecar släpper en *.proxmenux.json bredvid det lokala arkivet så att Monitor identifierar det som en ProxMenux-värdbackup även efter flytt eller namnbyte." + }, + { + "topic": "Avisering (slutförd/misslyckad)", + "detail": "hb_notify_lifecycle \"complete\" eller \"fail\" utlöses med varaktighet, arkivstorlek och — vid fel — den sista loggraden som ser ut att beskriva ett fel." + } + ] + }, + "finishedScreens": { + "heading": "Vad en färdig backup ser ut", + "intro": "Samma slutförandehändelse uppträder av båda ingångspunkterna. TUI skriver ett sammanfattande block till terminalen; Monitor's Backups-fliken visar körningen i arkivlistan med storlek, varaktighet och statusmärken.", + "scriptsAlt": "ProxMenux Scripts TUI visar en färdig värd backup — destination, backup ID, snapshot väg, data storlek, varaktighet och kryptering tillstånd.", + "scriptsCaption": "Avslutad backup - ProxMenux Scripts (TUI). Slutförande blocket trycker destinationen, backup-ID, vilket resulterar i snapshot eller arkivnamn, datastorlek, varaktighet och krypteringstillstånd.", + "monitorAlt": "ProxMenux Monitor Backups-fliken som visar en färdig värdbackuppost med storlek, varaktighet, metodmärke och krypteringsindikator.", + "monitorCaption": "Avslutad backup - ProxMenux Monitor Backups-fliken. Den nya säkerhetskopian visas i arkivlistan med destinationsmetodens märke, storlek, varaktighet och - när det är tillämpligt - krypteringslåsindikatorn." + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "Destinationer", + "href": "/docs/backup-restore/destinations", + "tail": " - konfigurationsdetaljer för Local, PBS och Borg." + }, + { + "label": "Planerade jobb", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " - kör samma backup obevakad på ett schema istället för interaktivt." + }, + { + "label": "Återställande", + "href": "/docs/backup-restore/restoring", + "tail": " — flödet som förbrukar vad denna sida producerar." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/cross-kernel.json b/web/messages/sv/docs/backup-restore/cross-kernel.json new file mode 100644 index 00000000..2c7ade68 --- /dev/null +++ b/web/messages/sv/docs/backup-restore/cross-kernel.json @@ -0,0 +1,170 @@ +{ + "meta": { + "title": "Återställning mellan kärnversioner — riktning, säkert urval och komplettering | ProxMenux", + "description": "Hur ProxMenux återställer en värdbackup på ett mål som kör en annan stor kärnversion. Dokument hur riktningen av felmatchen detekteras, det säkra subsetfiltret som hoppar över boot-kritiska vägar när målet kör en nyare kärna än backupen, och den fyrfasiga kärnan-agnostiska hydrering som återanvänder användarjustering som IOMMU, VFIO IDs och anpassade cmdline tokens utan att kopiera kernel-tied filer verbatim.", + "ogTitle": "ProxMenux Backup - cross-kernel restaurering och hydrering", + "ogDescription": "Återställning mellan kärnversioner med riktningskontroll, säkert urval och kärnoberoende komplettering.", + "twitterTitle": "Cross-kernel återställning | ProxMenux", + "twitterDescription": "Hur ProxMenux hanterar en återställning när målkärnan skiljer sig från säkerhetskopiorna." + }, + "header": { + "title": "Återställning mellan kärnversioner", + "description": "Hur ProxMenux hanterar en återställning när målvärden kör en annan kärna från den som spelas in i backupen - särskilt när målet kör en nyare kärna. Dokument hur skillnaden upptäcks, hur startkritiska vägar som kan bryta målet filtreras, och hur användarens egen konfiguration återanvänds utan att kopiera kärnbundna filer verbatim.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "title": "Varje kärnhopp hanteras annorlunda", + "body": "En Proxmox värd kärna identifieras av en version sträng som 6.17.13-2-pve. De två första siffrorna (6.17 i det här exemplet) definierar den stora versionen: när de ändras kan vissa konfigurationsfiler skrivna för den tidigare kärnan inte vara giltiga på den nya. När återställningen upptäcker att backupen och målet har olika stora kärnversioner, flödesgrenarna baserat på hoppets riktning - oavsett om backupen är äldre eller nyare än målet - eftersom de två fallen har motsatta fellägen. Säkerhetskopior nyare än målet återställs rent as-is (bänk-verifierad över flera kärnhopp). Säkerhetskopior äldre än målet behöver ett filter för att undvika att bryta målets start med konfiguration skriven för en kärna som sedan dess har ändrats." + }, + "directionCheck": { + "heading": "Riktningskontroll", + "intro": "Under kompatibilitetskontrollen jämför hb_compat_check kärnan registrerad i backupens manifest mot målets nuvarande kärna (uname -r) och klassificerar återställningen i ett av tre fall, lagrad i den interna variabla HB_COMPAT_KERNEL_DIRECTION:", + "rows": [ + { + "direction": "same", + "condition": "Den stora kärnversionen matchar mellan backup och mål.", + "behavior": "Det fullständiga återställningsflödet går oförändrat. Inget extra filter, ingen hydrering, inget särskilt meddelande i UI." + }, + { + "direction": "bk_newer", + "condition": "Säkerhetskopians kärna är NYARE än målets (exempel: säkerhetskopian gjordes på 7.0 och målet kör 6.17).", + "behavior": "Hela återställningsflödet körs oförändrat som vid same, utan filter. Rapporterade tester visade ominstallation av drivrutiner för målkärnan, fungerande IOMMU-konfiguration och start av VM:ar med GPU-genomkoppling." + }, + { + "direction": "bk_older", + "condition": "Säkerhetskopians kärna är ÄLDRE än målets (exempel: säkerhetskopian gjordes på 6.17 och målet kör 7.0).", + "behavior": "Det säkra filtret och fyrfasens hydrering nedan aktiveras. Återställningen fortsätter - målet reproducerar källan, men startkritiska filer kopieras inte." + } + ] + }, + "whyBkNewerIsSafe": { + "heading": "Varför en backup med en nyare kärna än målet återställer oförändrad", + "body": "När återställningen går mot ett mål med en äldre-kärna än den som spelas in i backupen, är varje mekanism som återställningen beror på oberoende av kärnversionen. GPU-drivrutininstallatörer och andra PCI-enhetsinstallatörer upptäcker körkärnan med uname -r och sammanställer DKMS mot vad målet har. APT-paketet installerar binärer byggda för målets distribution. IOMMU cmdline tokens som intel_iommu=on är stabila över stora kärnversioner. Backupen bär vägar skrivna under en nyare kärna, men de vägar (modul svartlistor, GRUB standarder, initramfs config) är fortfarande giltig syntax på den äldre - kärnor ignorerar tokens de inte känner igen i stället för att misslyckas. Detta fall är likvärdigt i praktiken med en återställning av samma kärna, och ProxMenux behandlar det som sådant." + }, + "safeSubsetFilter": { + "heading": "Det säkra filtret (endast när målkärnan är nyare)", + "intro": "När målkärnan är nyare än backupen, tillägger kompatibilitetskontrollen 16 boot-kritiska vägar från hb_unsafe_paths_cross_version till RS_SKIP_PATHS. Dessa vägar är uteslutna från återställningen eftersom att skriva en version av dem från en äldre kärna över ett mål som kör en nyare har orsakat kärnpaniker i bänkprov. Vägarna täcker fem kategorier:", + "categoryRows": [ + { + "category": "Starthanterare", + "paths": "/etc/default/grub, /etc/kernel", + "reason": "GRUB standarder knutna till den tidigare kärnordern, och proxmox-boot-tool tillstånd (cmdline, ESP UUID, krokar) som refererar vägar och identifierare från den äldre installationen." + }, + { + "category": "Kernel moduler och boot artefakter", + "paths": "/etc/modules-load.d, /etc/modprobe.d, /etc/initramfs-tools", + "reason": "Autoload listor som kan referera moduler döpt mellan kärn majors, modulalternativ som kanske inte gäller, initramfs krokar skrivna för den äldre kärnan." + }, + { + "category": "Lagring stack och filsystem identitet", + "paths": "/etc/fstab, /etc/multipath, /etc/iscsi, /etc/udev/rules.d, /etc/zfs", + "reason": "UUID som kanske inte finns på denna installation, multipath drivrutiner som ändras mellan kärnor, iSCSI parametrar som utvecklas, udev regler som kan binda till icke-existerande delsystem, ZFS tillstånd (zpool.cache + hostid) som kan låsa poolen som främmande." + }, + { + "category": "APT-källor", + "paths": "/etc/apt", + "reason": "APT-källor kan utlösa en nedgradering av kritiska paket på nästa uppgradering." + }, + { + "category": "systemd", + "paths": "/etc/systemd/system, /etc/systemd/journald.conf, /etc/systemd/logind.conf, /etc/systemd/system.conf, /etc/systemd/user.conf", + "reason": "Enhetsåsidosättningar och .wants-länkar bundna till en äldre huvudversion av systemd samt inställningsnycklar som kanske inte kan tolkas av en nyare version." + } + ], + "outroBody": "Filtret kör FÖRE bekräftelsedialogen så att användaren ser den exakta listan över vägar som kommer att hoppas, kategoriseras av förnuftet. Återställningen fortsätter fortfarande - allt annat (VM-/LXC-konfiguration, nätverk, /etc/pve, användare, cron, ProxMenux tillstånd, paket, drivrutiner, /root) återställs normalt." + }, + "hydration": { + "heading": "Kernel-agnostisk hydrering", + "intro": "Filtret utelämnar startkritiska filer, så kompletteringen återställer utvalda inställningar: IOMMU-parametrar, VFIO-ID:n, eget GRUB_TIMEOUT och nvidia-spärrlistor. Den körs när målkärnan är nyare. Cmdline-nycklar på målet bevaras och saknade moduler läggs till. Tillåtna GRUB-värden och användarfiler kan ersätta avvikande målinnehåll. Upprepning med samma indata är idempotent.", + "phaseRows": [ + { + "phase": "1a - GRUB väg", + "detail": "För GRUB-värdar (ext4/lvm). _rs_hyd_grub sammanfogar parametrar från säkerhetskopians manifest.kernel_params.cmdline_extra i målets GRUB_CMDLINE_LINUX_DEFAULT och hoppar över nycklar som redan finns. Därefter återställs tillåtna GRUB_*-nycklar (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) från säkerhetskopians /etc/default/grub när värdena skiljer sig från målets." + }, + { + "phase": "1b — systemd-boot / ZFS", + "detail": "För systemd-boot (vanligen ZFS på roten). _rs_hyd_kernel_cmdline sammanfogar användarparametrar från cmdline_extra i målets /etc/kernel/cmdline och bevarar målets startparametrar root=, boot= och rootflags=." + }, + { + "phase": "2 — /etc/modules Sammanslagning", + "detail": "_rs_hyd_modules Lägger till moduler från manifest.kernel_params.modules_loaded_at_boot som finns i den vita listan (vfio, vfio_pci, vfio_iommu_type1, vfio_virqfd, kvm, kvm_intel, kvm_amd, nvidia, nvidia_drm, nvidia_modeset, nvidia_uvm, i915, xe) och inte redan närvarande i målets mål /etc/modules." + }, + { + "phase": "3 — Kopiera tillåtna filer", + "detail": "_rs_hyd_files kopierar användarskrivna filer från staging rootfs till det levande målet när innehållet skiljer sig. Whitelist täcker VFIO/nvidia/blacklist-filer under /etc/modprobe.d, /etc/modules-load.d och ProxMenux VFIO bind regel + nvidia udev regler under /etc/udev/rules.d. Distro-ägda filer (pve-blacklist.conf, mdadm.conf, nvme.conf) är avsiktligt uteslutna - deras innehåll utvecklas mellan releaser." + }, + { + "phase": "4 — Framtvinga ombyggnad efter uppstart", + "detail": "De fyra faserna skriver direkt till det levande målet UTANFÖR den normala återställningsledningen. För att göra de sammanslagna tokens/modulerna/filerna träder i kraft vid nästa start, HB_HYDRATION_APPLIED=1 förökar genom plan.env för att apply_pending_restore.sh, som tvingar NEEDS_INITRAMFS=1 och NEEDS_GRUB=1 Oavsett vad som fanns i appliceringslistan. Post-boot dispatcher regenererar sedan initramfs och uppdaterar bootloader." + } + ] + }, + "planCommit": { + "heading": "Plan och commit — användaren ser först en förhandsvisning", + "body": "Kompletteringen körs i två lägen. Innan bekräftelsedialogen kör ProxMenux _rs_apply_bk_older_hydration i plan-läge: det beräknar exakt vad som skulle slås samman, fyller RS_HYDRATION_SUMMARY med ett grönt block som listar varje åtgärd och returnerar utan att skriva. Bekräftelsedialogen visar att grönt block tillsammans med den gula listan över uteslutna sökvägar, så användaren ser I FÖRVÄG vad som kommer att återanvändas automatiskt. När användaren bekräftar, ProxMenux kör samma hjälpare i commit läge - samma faser, samma logik, men denna gång varje fas skriver till levande mål. Annullera bekräftelsedialogen lämnar målet orört." + }, + "flowDiagram": { + "heading": "Flödet när målkärnan är nyare än backupens", + "intro": "Stegen som läggs till när målkärnan är nyare sitter inuti det normala återställningsflödet. Allt annat - varmt applicera, i väntan på förberedelse, paketinstallation, post-boot dispatcher - körs identiskt till en same-kernel restaurering.", + "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": "Konkreta exempel", + "intro": "Kompletteringen är inte abstrakt - det ger observerbara, korrekta resultat för vanliga scenarier. Två exempel som hydrering hanterar automatiskt:", + "rows": [ + { + "scenario": "GPU-genomkoppling (VFIO)", + "detail": "Källan hade intel_iommu=on iommu=pt i cmdline, vfio/vfio_pci/vfio_iommu_type1 i /etc/modules, en /etc/modprobe.d/vfio.conf med options vfio-pci ids=10de:2216 och en /etc/modprobe.d/blacklist-nvidia.conf. Hydration sammanfogar cmdline-tokens i målets GRUB eller kernel cmdline, appends vfio-modulerna till /etc/modules och kopierar de två användarskrivna modprobe-filerna. På nästa start är IOMMU aktiv, VFIO-moduler laddas, GPU är bunden till vfio-pci och VM kommer upp med genomgående arbete." + }, + { + "scenario": "Anpassade GRUB standarder", + "detail": "Källan hade GRUB_TIMEOUT=1 och GRUB_DISABLE_OS_PROBER=true. Hydration läser båda nycklarna från säkerhetskopieringens /etc/default/grub, ser att de skiljer sig från den färska installationens standarder och skriver om de två linjerna i målets fil (som lämnar allt annat, inklusive GRUB_DISTRIBUTOR, orörd)." + } + ] + }, + "callout": { + "warningTitle": "Vad kompletteringen utelämnar när målkärnan är nyare", + "warningBody": "Hydration återanvänder endast konfigurationen ProxMenux vet att vara säker över kärnversioner: IOMMU-tokens, VFIO-ID, vitlistade GRUB-nycklar och moduler från en fast lista (vfio*, nvidia*, i915, xe, kvm*). Allt utanför den uppsättningen - anpassade initramfs krokar under /etc/initramfs-tools/hooks/, icke-vitlistade filer under /etc/modprobe.d/, användarskrivna systemd-enhetsåsidosättningar - förblir uteslutna. Anledningen är konkret: dessa filer kan ringa kärnintern gränssnitt (modul API, /sys layout, udev krokar) som ändras mellan stora versioner och tillämpar dem verbatim över den nyare kärnan kan förhindra att målet startar. När exakt reproduktion av startkedjan krävs måste återställningen köras på en värd med samma stora kärnversion som backup." + }, + "codeReference": { + "heading": "Där mekanismerna lever", + "intro": "För utvecklare som vill spåra eller förlänga cross-kernel beteende:", + "rows": [ + { + "component": "Direktionsdetektering", + "location": "hb_compat_check i lib_host_backup_common.sh. Sätter HB_COMPAT_KERNEL_DIRECTION." + }, + { + "component": "Sökvägslista för säkert urval", + "location": "hb_unsafe_paths_cross_version i lib_host_backup_common.sh. Ger path\\treason-linjer som används av både CLI-filtret och Web endpoint /api/host-backups/restore/prepare." + }, + { + "component": "Hydrationsfaser", + "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files i backup_host.sh. Orkestrerad av _rs_apply_bk_older_hydration." + }, + { + "component": "Framtvingad ombyggnad efter uppstart", + "location": "apply_pending_restore.sh läser HB_HYDRATION_APPLIED från plan.env och tvingar NEEDS_INITRAMFS=1/NEEDS_GRUB=1." + }, + { + "component": "Web Preview", + "location": "/api/host-backups/restore/prepare i flask_server.py. Läser in hjälpbiblioteket, kör _rs_apply_bk_older_hydration i planläge, returnerar åtgärderna till webbmodalen." + } + ] + }, + "whereNext": { + "heading": "Vart ska man gå nästa", + "items": [ + { + "label": "Återställande", + "href": "/docs/backup-restore/restoring", + "tail": " — Den fullständiga återställningspipeline denna sidas mekanismer ansluter till." + }, + { + "label": "Hur det fungerar", + "href": "/docs/backup-restore/how-it-works", + "tail": " — manifestet och insamlingsrutinerna som skapar blocket kernel_params som kompletteringen läser." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/destinations/borg.json b/web/messages/sv/docs/backup-restore/destinations/borg.json new file mode 100644 index 00000000..2ce2afc0 --- /dev/null +++ b/web/messages/sv/docs/backup-restore/destinations/borg.json @@ -0,0 +1,234 @@ +{ + "meta": { + "title": "Borg-mål — förvarstyper, SSH-autentisering, kryptering | ProxMenux", + "description": "Borg-målet lagrar ProxMenux värdsäkerhetskopior i ett lokalt förvar, på en monterad extern disk eller på en fjärrserver via SSH. Beskriver sökordningen för borg-programmet, de fyra inledande SSH-nyckelalternativen, repokey-kryptering, sparade mål och lagringsregler per schemalagt jobb.", + "ogTitle": "ProxMenux Backup - Borg destination", + "ogDescription": "Så lagrar ProxMenux värdsäkerhetskopior i Borg-förvar med SSH-autentisering och repokey-kryptering.", + "twitterTitle": "Borg som mål för säkerhetskopior | ProxMenux", + "twitterDescription": "Lokala, USB och SSH-serverade Borg repositorier för värdbackups." + }, + "header": { + "title": "Borg", + "description": "Borg-destinationen skriver värdbackups till ett Borg-förvar. Tre förvarstyper stöds: lokal filsystemväg, monterad extern disk eller fjärrserver via SSH. Chunk-nivå deduplicering över alla arkiv i förvaret och valfri repokey kryptering.", + "section": "Säkerhetskopiering och återställning" + }, + "aboutBorg": { + "heading": "Vad Borg är", + "body": "Borg (även stavat BorgBackup) är en öppen källkod som deduplicerar backupverktyg som upprätthålls av Borg Backup community. Det lagrar varje arkiv som en uppsättning av variabel-längd bitar inuti ett arkiv; bitar delas över arkiv så åter backa upp oförändrade data har nästan noll lagringskostnad. Borg är inte knuten till Proxmox - det är ett allmänt ändamål backupverktyg som används i många miljöer. ProxMenux använder den som en av de tre destinationerna för värdbackups; varje Borg-specifik mekanism som beskrivs på denna sida (förvarstyper, borg-serve över SSH, repokey kryptering, beskärning) är standard Borg beteende." + }, + "intro": { + "title": "Blockbaserad deduplicering med lokala förvar eller förvar via SSH", + "body": "Ett Borg-förvar lagrar block som delas mellan alla arkiv. Att säkerhetskopiera en oförändrad fil igen överför och lagrar därför inga nya data. ProxMenux kör borg create vid säkerhetskopiering och borg extract vid återställning. Förvaret kan ligga på samma filsystem som källan, på en monterad extern disk eller på en fjärrvärd via SSH." + }, + "binarySourcing": { + "heading": "Det körbara borg-programmet", + "intro": "Borg är inte en bas beroende av ProxMenux installer. När en backup körs, hb_ensure_borg löser binären från fyra källor i ordning och returnerar den första som fungerar:", + "rows": [ + { + "priority": "1", + "source": "Systemets borg", + "detail": "Om värden redan har borg installerat via APT (which borg löser), den binära används." + }, + { + "priority": "2", + "source": "Cache för tillståndskatalogen", + "detail": "/usr/local/share/proxmenux/borg — sparat från en tidigare GitHub-nedladdning på värden." + }, + { + "priority": "3", + "source": "Monitors AppImage-paket", + "detail": "/usr/local/share/proxmenux/monitor-app/usr/bin/borg - den AppImage buntar en signerad borg-linux64. Detta är offline-säker väg: en värd utan internet har fortfarande en fungerande borg." + }, + { + "priority": "4", + "source": "GitHub nedladdning", + "detail": "wget mot borg-linux64 URL under github.com/borgbackup/borg/releases/, verifierad mot en konstant SHA-256 i lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). På checksum missmatch binären kasseras och backupen aborter. Den nedladdade filen är cachad i tillståndskatalogen så efterföljande säkerhetskopior använder sökväg 2." + } + ] + }, + "repoTypes": { + "heading": "Förvarstyper", + "intro": "Förvarstypen väljs när ett mål läggs till. Varje typ löser sig till en annan adress som Borg förstår.", + "rows": [ + { + "type": "remote", + "url": "ssh://USER@HOST/RPATH", + "detail": "Repository bor på en fjärrserver som kör borg serve. Kräver en SSH-anslutning till den servern." + }, + { + "type": "usb", + "url": "/mnt/MOUNTPOINT/borgbackup", + "detail": "Repository bor på en monterad extern disk (typiskt USB). Monteringen löses via hb_prompt_mounted_path, som upptäcker, monterar eller formaterar USB-partitioner efter behov." + }, + { + "type": "local", + "url": "/backup/borgbackup (any absolute path)", + "detail": "Repository bor på en lokal katalog. Meningsfullt endast när målkatalogen är på en separat fysisk disk - ett förvar på samma disk som källan skyddar mot operatörsfel men inte mot diskfel." + } + ] + }, + "serverSetup": { + "heading": "Förbereda Borg-servern (server sida)", + "intro": "remote repository typ förväntar sig en fungerande Borg server tillgänglig över SSH. ProxMenux startar inte själva servern - den tillåter bara en nyckel mot ett befintligt konto på den. Det här avsnittet dokumenterar vad servern behöver innan ProxMenux kan ansluta.", + "hostChoicesTitle": "Där servern kan leva", + "hostChoicesBody": "Alla Linux värd med SSH åtkomst kvalificerar. Vanliga inställningar:", + "hostChoicesItems": [ + "En dedikerad NAS eller backup box (Debian, Ubuntu, TrueNAS SCALE med ett skal).", + "En LXC-behållare inuti en Proxmox-nod. Litet fotavtryck, isolerat från värden som kör säkerhetskopiorna.", + "En annan Proxmox värd på samma LAN, eller en VM var som helst nås över SSH." + ], + "lxcWarningTitle": "LXC som Borg server", + "lxcWarningBody": "Om Borg-servern körs i en LXC kräver generate-auto ett konto som tillåter SSH-inloggning med lösenord när nyckeln installeras. Annars används manuell nyckelinstallation eller alternativet generate-pct via PVE-värden.", + "requirementsTitle": "Krav på servern", + "requirementsRows": [ + { + "requirement": "Körbart borg-program på /usr/bin/borg", + "detail": "command=\"/usr/bin/borg serve ...\"-linjen ProxMenux skriver i authorized_keys hårdkoder som väg. Installera via APT (apt install borgbackup) sätter den där. En fristående binär måste symlinkeras till /usr/bin/borg." + }, + { + "requirement": "Ett dedikerat användarkonto (vanligtvis borg)", + "detail": "Äger förvarskatalogen och tar emot inkommande SSH-anslutningar. Behöver inte sudo eller skal åtkomst - authorized_keys-linjen inaktiverar interaktiva skal ändå." + }, + { + "requirement": "En skrivbar repository katalog", + "detail": "Den väg som operatören ger ProxMenux (till exempel /backup/borgbackup) måste finnas på servern och ägas av borganvändaren." + }, + { + "requirement": "SSH daemon accepterar borganvändaren", + "detail": "PubkeyAuthentication yes (standard). Lösenordsautentisering behövs endast för en-shot generate-auto-flödet - efter att nyckeln är installerad kan servern inaktivera lösenord auth helt." + } + ], + "minimalSetupTitle": "Minimal serverkonfiguration", + "minimalSetupBody": "På en Borg-server med Debian eller Ubuntu ger fyra kommandon som root en grundkonfiguration:", + "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", + "minimalSetupNote": "När servern är förberedd och SSH-lösenordsinloggning är tillgänglig kan generate-auto installera nyckeln via ett konto som får skriva i borg-användarens authorized_keys. Senare säkerhetskopior använder nyckeln, begränsad till borg serve på den konfigurerade sökvägen. Utan lösenordsinloggning installeras nyckeln manuellt eller via PVE-värden." + }, + "sshAuth": { + "heading": "SSH autentisering (klientsida)", + "intro": "Remote Borg repositorier är tillgängliga över SSH. Anslutningen går från ProxMenux-värden till ett användarkonto på Borg-servern som kör borg serve. Den här användaren heter vanligtvis borg, inte admin/root-användaren av servern - borg-serve-kommandoraden låser anslutningen till den specifika förvaringsbanan (se de viktigaste strategierna nedan).", + "strategiesTitle": "SSH-nyckelalternativ", + "strategiesIntro": "När ett fjärrmål läggs till frågar ProxMenux efter SSH-användare, värd och fjärrsökväg och erbjuder fyra autentiseringsval. Alternativet generate-pct erbjuds om lösenordsautentisering nekas. Lägena beskrivs nedan:", + "strategyRows": [ + { + "mode": "generate-auto", + "label": "Rekommenderas", + "detail": "ProxMenux skapar eller återanvänder ett ed25519-nyckelpar på ~/.ssh/borg_proxmenux_HOST_ed25519 och använder sshpass för att testa inloggningen och installera den offentliga nyckeln i ~borg/.ssh/authorized_keys. Lösenordet tillhör ett konto som får skriva i filen, oftast root eller borg. Det används under installationen och sparas inte." + }, + { + "mode": "generate-manual", + "label": "Inget admin lösenord på denna värd", + "detail": "ProxMenux genererar nyckelparet som ovan men visar hela authorized_keys-linjen för operatören att klistra in manuellt i servern. Admin lösenord lämnar aldrig ProxMenux värd eftersom det aldrig bett om." + }, + { + "mode": "generate-pct", + "label": "Borg server är en PVE LXC", + "detail": "Borg-servern körs inuti en LXC på en PVE-nod. ProxMenux tillåter nyckeln via pct exec från PVE-värden - root på PVE-värden skriver in i LXC ~borg/.ssh/authorized_keys utan att behöva SSH i LXC själv." + }, + { + "mode": "existing", + "label": "Använd en befintlig nyckel", + "detail": "ProxMenux skannar /root/.ssh/ och $HOME/.ssh/ för parseable ed25519/RSA privata nycklar och listar dem. Operatören väljer en eller bläddrar manuellt till en icke-standardväg." + }, + { + "mode": "none", + "label": "Standard SSH konfig", + "detail": "Ingen anpassad nyckel - Borg är beroende av värdens standard SSH-konfiguration (vanligtvis ~/.ssh/id_rsa eller en SSH-agent)." + } + ], + "restrictTitle": "authorized_keys-linjen", + "restrictBody": "För varje skapad nyckel begränsar raden authorized_keys som ProxMenux skriver på servern nyckeln till följande borg-serve-anrop för den konfigurerade förvarssökvägen:", + "restrictLine": "command=\"/usr/bin/borg serve --restrict-to-path RPATH\",restrict PUBKEY", + "restrictNote": "command= tvingar varje SSH-session med hjälp av den här nyckeln för att bara köra borg-serve-kommandot; restrict inaktiverar portöverföring, agentöverföring, X11-överföring och PTY-tilldelning. Nyckeln kan inte användas för att öppna ett interaktivt skal på servern eller för att komma åt någon annan förvaringsväg, även om kontot har bredare privilegier." + }, + "savedTargets": { + "heading": "Sparade mål", + "intro": "Ett sparat mål behåller förvarskonfigurationen under ett tydligt namn, så att uppgifterna inte behöver anges igen. Filer i ProxMenux tillståndskatalog:", + "rows": [ + { + "file": "borg-targets.txt", + "content": "En linje per mål: NAME|REPO|SSH_KEY_PATH|ENCRYPT_MODE. Läs av hb_collect_borg_configs för att befolka målvalsmenyn." + }, + { + "file": "borg-pass-NAME.txt", + "content": "Lösenfras för målet som anges som NAME ovan (chmod 600). Finns endast om repokey-kryptering har valts." + } + ], + "outro": "Det är valfritt att spara målet. Om frågan avböjs sparas ingen namngiven målkonfiguration, men en skapad SSH-nyckel tas inte bort. Om repokey aktiveras utan ett sparat mål lagrar ProxMenux ändå lösenfrasen i den äldre filen borg-pass.txt." + }, + "encryption": { + "heading": "Kryptering", + "body": "Repositorier inleds med ett krypteringsläge via hb_borg_init_if_needed: den moderna borg repo-create -e MODE när den är tillgänglig, eller arvet borg init --encryption=MODE. ProxMenux avslöjar två lägen: repokey (standard) och none. I repokey-läget lagrar Borg krypteringsnyckeln inuti själva förvaret; tillgång kräver en passfras, som ProxMenux uppmanar till två gånger med match validering och lagrar i borg-pass-NAME.txt för sparade mål, annars i den äldre fil som beskrivs ovan. En obligatorisk bekräftelsedialog visas efter passfrasen sparas: passfrasen är det enda sättet att komma åt krypterade arkiv och förlora det gör varje arkiv i förvaret oåterkallelig." + }, + "runtimeEnv": { + "heading": "Runtime miljö", + "intro": "ProxMenux exporterar följande miljövariabler innan borg. De konfigurerar anslutningen och låser upp förvaret utan att bädda in hemligheter i kommandoraden.", + "rows": [ + { + "var": "BORG_RSH", + "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", + "purpose": "Fjärrskalskommandot som Borg använder för SSH-förvar. En vald nyckel lägger till identitetsalternativen; en annan port än standard lägger till -p PORT. Utan egen nyckel och med standardport lämnas variabeln osatt och Borg använder värdens SSH-konfiguration." + }, + { + "var": "BORG_PASSPHRASE", + "value": "(passfras från borg-pass-NAME.txt)", + "purpose": "låser upp repokey. Ange endast när målet använder repokey-kryptering. Aldrig visas i processargumentlistan." + }, + { + "var": "BORG_ENCRYPT_MODE", + "value": "repokey | none", + "purpose": "Används av hb_borg_init_if_needed när du startar ett förvar som ännu inte existerar. Ignorerad av borg create på befintliga repositorier." + }, + { + "var": "BORG_RELOCATED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Undertrycker den interaktiva prompten Borg höjer när förvaringsadressen skiljer sig från webbadressen som den ursprungligen nåddes från (gemensamt efter ett monteringsnamn eller SSH-värd som nås via ny adress)." + }, + { + "var": "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK", + "value": "yes", + "purpose": "Undertrycker den interaktiva prompten Borg höjer första gången ett okrypterat förvar nås från en ny klient." + } + ] + }, + "archiveFormat": { + "heading": "Arkivnamn och retention", + "intro": "Varje backup skapar ett nytt arkiv inuti förvaret.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS", + "retentionBody": "För schemalagda jobb kör run_scheduled_backup.sh borg prune mot förvaret efter varje framgångsrik backup med lagringsvärdena konfigurerade på jobbet (--keep-last, --keep-daily, --keep-weekly). Interaktiva säkerhetskopior inte beskär." + }, + "restoreAccess": { + "heading": "Hämta vid återställning", + "body": "Återställningsflödet listar arkiv med borg list REPO och extraherar den valda med borg extract REPO::ARCHIVE-NAME i en staging katalog som _rs_check_layout matar till standardåterställning pipeline. För manuell hämtning utanför ProxMenux samma kommandon arbete; det extraherade trädet är den standard tre-payload layout som beskrivs i Hur det fungerar." + }, + "references": { + "heading": "Referenser", + "intro": "Officiell Borg-dokumentation för komponenterna ProxMenux är beroende av.", + "items": [ + { + "label": "Borg dokumentation", + "href": "https://borgbackup.readthedocs.io/", + "tail": " - huvudingångspunkt som täcker koncept, distribution, snabbstart och varje kommando." + }, + { + "label": "borg create", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/create.html", + "tail": " - kommandot ProxMenux åberopar varje backup, med alla stödda flaggor." + }, + { + "label": "Repository kryptering", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/init.html#encryption-mode", + "tail": " - krypteringslägen Borg stöder, inklusive repokey som ProxMenux använder som standard." + }, + { + "label": "borg serve och driftsättning via SSH", + "href": "https://borgbackup.readthedocs.io/en/stable/deployment/central-backup-server.html", + "tail": " - hur man ställer in en central Borg-server som nås över SSH, inklusive borg-serve-kommandot och restrict-to-path-flaggan ProxMenux skriver i authorized_keys." + }, + { + "label": "borg prune", + "href": "https://borgbackup.readthedocs.io/en/stable/usage/prune.html", + "tail": " — lagringsreglerna bakom --keep-last / --keep-daily / --keep-weekly som ProxMenux tillämpar per schemalagt jobb." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/destinations/index.json b/web/messages/sv/docs/backup-restore/destinations/index.json new file mode 100644 index 00000000..793321f9 --- /dev/null +++ b/web/messages/sv/docs/backup-restore/destinations/index.json @@ -0,0 +1,110 @@ +{ + "meta": { + "title": "Destinationer för säkerhetskopior — lokalt, Proxmox Backup Server, Borg | ProxMenux", + "description": "Tre lagringsbackender tar emot samma säkerhetskopieringsinnehåll från ProxMenux: ett lokalt .tar.zst-arkiv på ett skrivbart filsystem, en PBS-säkerhetskopia i en Proxmox Backup Server-datastore eller ett Borg-arkiv i ett lokalt eller fjärranslutet Borg-arkivlager. Varje backend har egna egenskaper för komprimering, deduplicering, kryptering och nätverk.", + "ogTitle": "ProxMenux mål för säkerhetskopior", + "ogDescription": "Lokal, Proxmox Backup Server och Borg - tre lagringsbackends för samma värdbackup payload.", + "twitterTitle": "Destinationer för ProxMenux-säkerhetskopior | ProxMenux", + "twitterDescription": "Lokal arkiv, Proxmox Backup Server och Borg backends för värdbackups." + }, + "header": { + "title": "Destinationer", + "description": "Tre lagringsbackends som stöds av ProxMenux Backup: lokal arkiv, Proxmox Backup Server (rekommenderas) och Borg. Varje får samma tre-payload arkiv; de skiljer sig i lagringsformat, deduplicering, krypteringsmodell och nätverkskrav.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "title": "Samma nyttolast, tre backends", + "body": "Varje säkerhetskopia skapar samma tre datablock (rootfs, manifest, program). Det som skiljer destinationerna åt är hur innehållet lagras och hämtas inför en återställning. Varje backend är en separat funktion i backup_host.sh — _bk_local, _bk_pbs, _bk_borg — men alla tre använder samma tillfälliga förberedelsesteg (hb_prepare_staging) och samma återställningskod. Valet av destination påverkar bara skrivning och hämtning; det ändrar inte hur återställningen fungerar eller använder arkivet." + }, + "comparison": { + "heading": "Funktionsjämförelse", + "intro": "Följande tabell listar de konkreta skillnaderna mellan de tre backends som de beter sig i ProxMenux idag. Alla värden beskriver observerat beteende av backend själv, inte redaktionella rekommendationer.", + "rows": [ + { + "feature": "Lagringsformat", + "local": "Enkel .tar.zst-fil (eller .tar.gz om zstd är frånvarande).", + "pbs": "PBS-säkerhetskopia (.pxar-block i datastoren).", + "borg": "Borg arkiv inuti ett Borg-förvar (segmentfiler)." + }, + { + "feature": "Kompression", + "local": "zstd (standardnivå) via tar --zstd. gzip fallback.", + "pbs": "Hanteras av proxmox-backup-client. ProxMenux åsidosätter inte komprimeringsinställningarna.", + "borg": "Borgs inbyggda komprimering. ProxMenux anropar borg create utan att åsidosätta komprimeringsinställningarna." + }, + { + "feature": "Deduplicering", + "local": "Ingen. Varje backup är ett fullt oberoende arkiv.", + "pbs": "Full chunk-nivå deduplicering över alla säkerhetskopior i databutiken.", + "borg": "Full chunk-nivå deduplicering över alla arkiv i förvaret." + }, + { + "feature": "Kryptering i vila", + "local": "Ingen (förlitar sig på skydd av filsystemnivå).", + "pbs": "Valfri kryptering på klientsidan med en nyckelfil. När den är aktiverad laddas återställningsbloben upp som en separat säkerhetskopieringsgrupp.", + "borg": "Valfri repokey kryptering (nyckel lagrad i repan, upplåst med en passfras)." + }, + { + "feature": "Bevarande / rensning", + "local": "Tillämpas per schemalagt jobb via KEEP_LAST. Gamla arkiv tas bort tillsammans med sina sidofiler och körningsloggar. Interaktiva säkerhetskopior utför ingen rensning.", + "pbs": "Tillämpas per schemalagt jobb via proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly. Interaktiva säkerhetskopior utför ingen rensning.", + "borg": "Tillämpas per schemalagt jobb via borg prune --keep-last / --keep-daily / --keep-weekly. Interaktiva säkerhetskopior utför ingen rensning." + }, + { + "feature": "Nätverk", + "local": "Ingen. Skriver till en lokal monteringspunkt (vanligtvis en intern disk eller en USB-enhet).", + "pbs": "TCP till PBS-servern (standardport 8007). Kräver PBS-uppgifter + fingeravtryck.", + "borg": "Lokal filsystemväg eller SSH tunnel till en avlägsen Borg värd." + }, + { + "feature": "Beroenden", + "local": "tar, zstd (på Proxmox som standard).", + "pbs": "Paketet proxmox-backup-client (medföljer Proxmox VE 8+).", + "borg": "borg binär. Autotillhandahållen av ProxMenux från Monitor AppImage-paketet när det saknas." + }, + { + "feature": "Åtkomst för återställning", + "local": "Alla värdar med tar+zstd kan extrahera arkivet. Inget PBS/Borg behövs.", + "pbs": "Kräver proxmox-backup-client, PBS-inloggningsuppgifter och nyckelfilen (om säkerhetskopian är krypterad).", + "borg": "Kräver borg + sökvägen till arkivlagret + passfrasen (om krypterad)." + } + ], + "captionCode": "feature", + "captionLocal": "Lokal", + "captionPbs": "Proxmox Backup Server (rekommenderas)", + "captionBorg": "Borg" + }, + "sameArchive": { + "heading": "Arkivlayouten ändras inte med destinationen", + "body": "Alla tre destinationerna innehåller samma struktur med rootfs/ + metadata/ + manifest.json som beskrivs i Så fungerar det. Ett uppackat lokalt .tar.zst-arkiv, ett .pxar-arkiv återställt från PBS och ett Borg-arkiv uppackat med borg extract ger samma katalogträd. Återställningskoden (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) läser samma tre datablock utan att behöva veta vilken destination de kommer från." + }, + "extractStandalone": { + "heading": "Extrahera en backup utanför ProxMenux", + "intro": "Alla tre arkivformat kan läsas med standardverktyg utan ProxMenux installerat på läsvärden. Kommandona nedan producerar samma katalogträd som en återställning konsumerar internt.", + "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": "# Från ett Borg-arkiv (kräver borg och passfrasen för krypterade arkivlager):\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# Från ett fjärranslutet arkivlager via SSH:\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME", + "note": "Det extraherade trädet kan sedan inspekteras manuellt eller matas till en manuell återställning. Se de enskilda destinationssidorna för det exakta hämtningsflödet ProxMenux använder under huven." + }, + "whereNext": { + "heading": "Detaljer per destination", + "intro": "Varje destination har sin egen sida som täcker konfigurationsflödet, on-disk-formatet och hämtningskommandot som används av återställningen.", + "items": [ + { + "label": "Lokalt arkiv", + "href": "/docs/backup-restore/destinations/local", + "tail": " — förkonfigurera ett lokalt mål, montera USB-enheter, skydd mot att arkivet inkluderar sig självt samt JSON-sidofilen som låter Monitor identifiera filen." + }, + { + "label": "Proxmox Backup Server (rekommenderas)", + "href": "/docs/backup-restore/destinations/pbs", + "tail": " — val av datastore, inloggningsuppgifter och certifikatets fingeravtryck, nyckelfilens livscykel, återställningspassfras samt uppladdning av återställningsbloben till PBS för återställning efter en nyinstallation." + }, + { + "label": "Borg", + "href": "/docs/backup-restore/destinations/borg", + "tail": " — lokala arkivlager och arkivlager via SSH, var Borg-binären hämtas (system / cache / Monitors AppImage-paket / GitHub), initiering av arkivlager, hantering av passfraser och SSH-nycklar för fjärranslutna arkivlager." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/destinations/local.json b/web/messages/sv/docs/backup-restore/destinations/local.json new file mode 100644 index 00000000..858d0b06 --- /dev/null +++ b/web/messages/sv/docs/backup-restore/destinations/local.json @@ -0,0 +1,75 @@ +{ + "meta": { + "title": "Lokalt arkivmål — tar.zst på ett filsystem eller en USB-enhet | ProxMenux", + "description": "Det lokala säkerhetskopieringsmålet skriver ett enda .tar.zst-arkiv till en skrivbar katalog: en intern disk, en Proxmox-monteringspunkt, en NFS-delning eller en USB-enhet. Sidan beskriver konfigurationen, hur USB-enheter upptäcks och monteras, skyddet mot att skriva arkivet till en sökväg som säkerhetskopieras samt JSON-sidofilen som identifierar arkivet.", + "ogTitle": "ProxMenux Backup - Lokal arkiv destination", + "ogDescription": "Hur ProxMenux skriver lokala säkerhetskopior som .tar.zst arkiv och hur man konfigurerar destinationskatalogen eller USB-enheten.", + "twitterTitle": "Lokal backup destination | ProxMenux", + "twitterDescription": "Hur ProxMenux skriver lokala säkerhetskopior som .tar.zst arkiv på ett filsystem eller USB-enhet." + }, + "header": { + "title": "Lokalt arkiv", + "description": "Det lokala målet skriver ett enda komprimerat tar-arkiv till en skrivbar katalog på värden: en intern disk, ett monterat NFS- eller SMB-filsystem eller en USB-enhet.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "title": "En fristående fil", + "body": "En lokal säkerhetskopia producerar en enda hostcfg-HOST-TIMESTAMP.tar.zst-fil (eller .tar.gz när zstd är frånvarande). Filen innehåller hela arkivträdet - manifest.json, metadata/ och rootfs/ - och kan återställas på någon Proxmox värd med ProxMenux återställningsflöde, eller extraheras manuellt med tar --zstd -xf på alla Linux-system. Ingen server, ingen initiering av arkivlager, inget externt beroende. Detta är destinationen med den kortaste återhämtningsvägen när varken PBS eller Borg är tillgänglig." + }, + "targetConfig": { + "heading": "Konfigurera målkatalogen", + "intro": "Det lokala målet är en enda sparad målkatalog — inte en lista. ProxMenux sparar användarens val i /usr/local/share/proxmenux/local-target.conf och läser det vid varje säkerhetskopiering. Om inget mål har konfigurerats används standardvärdet HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump (samma katalog som Proxmox använder för sina egna vzdump-utdata). Målet konfigureras via Konfigurera säkerhetskopieringsmål → Lokala mål:", + "options": [ + "Använd standard (/var/lib/vz/dump). Proxmox lokal lagring. Finns på varje Proxmox-installation; arkivet sitter bredvid vzdump-utdata och hämtas av fliken Monitor's Backups automatiskt.", + "Ange en anpassad sökväg. Alla absoluta filsystemsökvägar kan användas: en NFS-montering, en SMB-delning monterad via fstab, ett särskilt ZFS-dataset eller en andra intern disk. ProxMenux kontrollerar att sökvägen finns och är en katalog innan valet sparas.", + "Välj en USB-enhet. Öppnar USB-undermenyn (nedan), som upptäcker flyttbara enheter och erbjuder sig att montera eller formatera en." + ] + }, + "usbFlow": { + "heading": "USB-enhetsdetektering och montering", + "intro": "USB-undermenyn listar partitioner på flyttbara enheter som rapporteras av lsblk. Varje partition visas med storlek, filsystemets etikett och aktuellt tillstånd. Tillståndet avgör vilken åtgärd ProxMenux erbjuder.", + "statesTitle": "De tre enhetstillstånden", + "stateRows": [ + { + "state": "monterad", + "shown": "Storlek · etikett · [fstype] · → /mount/point", + "action": "Partitionen är redan monterad. Om den väljs sparas dess aktuella monteringspunkt som lokalt mål. Ingen ny montering utförs." + }, + { + "state": "ej monterad", + "shown": "Storlek · etikett · [fstype] · (ej monterad — kommer att monteras)", + "action": "Ett filsystem är närvarande men inte monterat. På bekräftelse kör ProxMenux hb_mount_usb_partition: skapar /mnt/backup-LABEL (eller en UUID-baserad väg om det inte finns någon etikett), monterar partitionen och sparar monteringspunkten som det lokala målet." + }, + { + "state": "tom", + "shown": "Storlek · rå USB-disk — inget filsystem (kommer att FORMATERAS)", + "action": "Enheten har inget filsystem. Denna destruktiva åtgärd skyddas av två bekräftelser. Först förklarar en Ja/Nej-dialog att disken raderas. Sedan måste användaren skriva den exakta enhetssökvägen (t.ex. /dev/sdb) innan ProxMenux skapar en ny GPT med en ext4-partition och monterar den." + } + ], + "notMountedFallback": "Om ingen USB-enhet upptäcks visar undermenyn ett vanligt inmatningsfält. Användaren kan ange valfri sökväg till en monteringspunkt; om sökvägen inte är en registrerad monteringspunkt visas en varning i en bekräftelsedialog innan processen fortsätter." + }, + "safetyCheck": { + "heading": "Säkerhetskontroll - destination inuti en backupbana", + "body": "Innan du skriver arkivet, verifierar _bk_local att destinationskatalogen inte är en undersökväg till någon katalog som säkerhetskopieras. Ett vanligt misstag skulle vara att lägga till /root till profilen och välja /root/backups som destination — arkivet skulle då inkludera sig självt, antingen producera ett korrupt arkiv eller växa utan gräns tills skivan fylls. Kontrollen löser båda sökvägarna med readlink -m, jämför dem och, vid konflikt, avbryter säkerhetskopieringen med en dialogruta som namnger den motstridiga sökvägen och listar tre sätt att lösa den: välj en destination utanför den motstridiga sökvägen, ta bort den anpassade posten som innehåller destinationen, eller använd anpassat läge för att avmarkera den motstridiga sökvägen för denna körning." + }, + "archiveFormat": { + "heading": "Arkivformat och komprimering", + "intro": "Utdatafilnamnet bäddar in källvärdnamnet och backup timestamp så att en katalog med flera arkiv sorterar kronologiskt och varje fil är självidentifierande.", + "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS.tar.zst", + "compressionTitle": "Kompression", + "compressionBody": "Huvudmetoden använder tar --zstd -cf — ett enda kommando som komprimerar med zstd:s standardnivå. Om zstd saknas på källan (ovanligt på Proxmox, men möjligt på minimala installationer) används gzip. Om pv finns vid denna reservmetod läggs en förloppsindikator till så att användaren ser arkivstorleken växa i realtid; utan pv används vanlig tar -czf utan förloppsutdata.", + "sourceTitle": "Vad går in i arkivet", + "sourceBody": "Kommandot tar anropas med -C \"$staging_root\" . och arkiverar därmed hela roten i den tillfälliga katalogen: rootfs/, metadata/ och manifest.json. Alla tre datablocken ligger bredvid varandra högst upp i tar-arkivet. Uppackningen ger exakt samma träd som återställningskoden använder." + }, + "sidecar": { + "heading": "JSON-sidofilen", + "intro": "Varje framgångsrik lokal backup producerar en följeslagare fil: HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, skriven bredvid arkivet av hb_write_archive_sidecar. Denna lilla JSON-fil låter ProxMenux Monitor identifiera arkivet som en ProxMenux-värdbackup även om det senare flyttas, bytas namn eller arkiveras någon annanstans.", + "contentTitle": "Sidofilens innehåll", + "contentBody": "Sidofilen lagrar schemaversionen, om säkerhetskopian kom från en interaktiv körning eller ett schemalagt jobb (kind), jobb-ID för schemalagda körningar, det profilläge som används (default eller custom), källvärdnamnet, den ursprungliga arkivbasnamnet, en tidsstämpel för skapandet i ISO-8601-format och arkivstorleken i byte.", + "whyBody": "Monitors Backups-flik söker igenom konfigurerade lokala kataloger efter *.proxmenux.json-sidofiler, inte efter *.tar.zst-filer, eftersom en .tar.zst utan sidofil kanske inte är en ProxMenux-säkerhetskopia. Sökningen är snabb (JSON-filer är små) och kopplingen fungerar även efter namnbyte om sidofilen får ett motsvarande nytt namn." + }, + "restoreAccess": { + "heading": "Återställande från ett lokalt arkiv", + "body": "ProxMenux återställningsflödet upptäcker lokala arkiv genom att skanna det konfigurerade lokala målet efter sidofiler och visa dem i arkivlistan. Valet av ett arkiv utlöser _rs_check_layout, som extraherar tarball i en staging katalog och bekräftar strukturen med tre datablock innan du fortsätter. För manuell utvinning utanför ProxMenux ger tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg samma träd som återställningskoden förbrukar." + } +} diff --git a/web/messages/sv/docs/backup-restore/destinations/pbs.json b/web/messages/sv/docs/backup-restore/destinations/pbs.json new file mode 100644 index 00000000..2fe4d02b --- /dev/null +++ b/web/messages/sv/docs/backup-restore/destinations/pbs.json @@ -0,0 +1,113 @@ +{ + "meta": { + "title": "Proxmox Backup Server destination - förvar, kryptering, återhämtning | ProxMenux", + "description": "PBS-målet lagrar ProxMenux värdsäkerhetskopior som PBS-säkerhetskopior. Sidan beskriver automatisk identifiering från /etc/pve/storage.cfg, manuell PBS-konfiguration, uppladdning av .pxar, klientkryptering med nyckelfil och en valfri återställningskopia skyddad med lösenfras samt återställning av nyckeln från flera källor på en nyinstallerad värd.", + "ogTitle": "ProxMenux Backup - Proxmox Backup Server destination", + "ogDescription": "Hur ProxMenux skriver värdbackups till Proxmox Backup Server med klient-side keyfile kryptering och återhämtning escrow.", + "twitterTitle": "PBS som mål för säkerhetskopior | ProxMenux", + "twitterDescription": "Proxmox Backup Server som mål med nyckelfilskryptering och en återställningskopia skyddad med lösenfras." + }, + "header": { + "title": "Proxmox Backup Server", + "description": "PBS-målet laddar upp hela förberedelsekatalogen som en enda .pxar-säkerhetskopia till ett Proxmox Backup Server-datalager. Klientkryptering med nyckelfil är valfri, liksom uppladdning av en återställningskopia av nyckelfilen, skyddad med lösenfras, bredvid varje säkerhetskopia.", + "section": "Säkerhetskopiering och återställning" + }, + "recommendedBadge": "Rekommenderad destination", + "aboutPbs": { + "heading": "Vad Proxmox Backup Server är", + "body": "Proxmox Backup Server (PBS) är Proxmox egen backup server produkt, utvecklad och underhålls av samma team som författare Proxmox VE. Det är en dedikerad säkerhetskopieringsserver utformad för att ta emot säkerhetskopior från Proxmox VE-värdar (VM, LXCs och - via proxmox-backup-client - godtyckliga värdkataloger) med chunk-baserad deduplicering, klient-side-kryptering och lagringspolicy tillämpad server-side. ProxMenux använder PBS som en av de tre destinationerna för värdbackups; varje PBS-specifik mekanism som beskrivs på denna sida (backupgrupper, .pxar arkiv, --backup-id, keyfile kryptering) är standard PBS beteende." + }, + "intro": { + "title": "En säkerhetskopia per körning, deduplicering på blocknivå", + "body": "En PBS-säkerhetskopia skapar en enda post i datalagret under säkerhetskopierings-ID:t host/hostcfg-HOSTNAME/BACKUP-TIME. Innehållet är ett .pxar-arkiv med samma struktur i tre delar som beskrivs i Så fungerar det. PBS deduplicerar block mellan alla säkerhetskopior i datalagret, så senare säkerhetskopior av samma värd överför och lagrar endast ändrade block. ProxMenux tillämpar själv lagringsreglerna för schemalagda jobb: efter varje lyckad körning kör run_scheduled_backup.sh kommandot proxmox-backup-client prune med --keep-last / --keep-daily / --keep-weekly och jobbets inställda värden." + }, + "repoSelection": { + "heading": "Repository urval", + "intro": "ProxMenux upptäcker PBS repositorier från två källor på varje backup. Operatören väljer en från en enhetlig meny; valet bestämmer HB_PBS_REPOSITORY, HB_PBS_SECRET och HB_PBS_FINGERPRINT för körningen.", + "sourceRows": [ + { + "source": "Proxmox storage.cfg (identifierad automatiskt)", + "path": "/etc/pve/storage.cfg + /etc/pve/priv/storage/NAME.pw", + "content": "Varje pbs:-avsnitt i Proxmox egen lagringskonfiguration identifieras automatiskt. Server, datalager, användarnamn och fingeravtryck hämtas från avsnittet. Lösenordet läses från Proxmox egen katalog för inloggningsuppgifter. Uppgifterna behöver inte anges på nytt i ProxMenux; förvaret är tillgängligt så snart det har konfigurerats i Proxmox." + }, + { + "source": "ProxMenux manuell konfig", + "path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt", + "content": "Läggs till via Konfigurera säkerhetskopieringsmål → PBS-mål → Lägg till PBS. Du anger namn, användarnamn (root@pam eller user@pbs!token), värd eller IP-adress, datalager och lösenord. Om lösenordet lämnas tomt visas frågan igen; annars skulle en tom uppgift sparas utan varning och alla senare säkerhetskopior misslyckas med ett otydligt autentiseringsfel. Detta används när PBS-målet inte är registrerat som Proxmox-lagring." + } + ], + "menuTitle": "Urvalsmenyn", + "menuBody": "Båda källorna visas i en enda meny, varje rad märkt med sitt ursprung ([proxmox] eller [manual]). Anteckningar vars lösenord inte kunde lösas är taggade med en ⚠ no password-varning - välja en utlöser ett lösenord återinträde innan backupen startar. Fingeravtrycket överförs till proxmox-backup-client via PBS_FINGERPRINT-miljövariabeln; när det saknas frågar klienten operatören att acceptera servercertifikatet interaktivt på den första säkerhetskopian." + }, + "backupCommand": { + "heading": "Backup kommandot", + "intro": "Uppladdningen sker med ett enda anrop till proxmox-backup-client backup. ProxMenux använder env för att överföra lösenord, krypteringslösenord och fingeravtryck till klienten som miljövariabler.", + "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": "Namnge säkerhetskopierings-ID", + "backupIdBody": "Standard-ID är hostcfg-HOSTNAME. Operatören bekräftar eller redigerar det före uppladdning; tecken utanför [A-Za-z0-9_-] och avslutande bindestreck tas bort. Att återanvända samma ID är avsiktligt: PBS behandlar ID:t som en grupp, och varje senare säkerhetskopia blir en ny post i gruppen med gemensam deduplicering med tidigare körningar.", + "pxarTitle": "Varför källan är hela staging roten", + "pxarBody": ".pxar-källan är hela staging_root - rootfs/, metadata/ och manifest.json tillsammans. Tidigare versioner passerade $staging_root/rootfs som källa; som lämnade metadata/ ur arkivet och återställningens kompatibilitetskontroll hade ingenting att läsa, försämrade att korsa värd varningar även på samma värd återställningar. Gamla säkerhetskopior som skapats med rootfs-bara källan återställs fortfarande korrekt via _rs_check_layout: s fall-3 gren, som lindrar en platt etc/var/root/usr träd tillbaka till en rootfs/ hierarki." + }, + "encryption": { + "heading": "Klient-side kryptering", + "glossaryHint": "Avsnittet använder termerna nyckelfil, lösenfras och återställningskuvert. Ordlistan sammanfattar skillnaderna med en mening per term.", + "intro": "PBS klientkryptering med nyckelfil krypterar blocken på källvärden före uppladdning. Kryptering är valfri i ProxMenux. När den aktiveras väljer operatören uttryckligen ja eller nej till att även lagra en återställningskopia av nyckelfilen, skyddad med lösenfras, på PBS. Valet kan ändras senare i Monitor. Själva nyckelfilen finns alltid på den kanoniska sökvägen /usr/local/share/proxmenux/pbs-key.conf och återanvänds utan nya frågor vid varje senare krypterad säkerhetskopiering.", + "keyfileTitle": "Ställ in nyckelfilen", + "keyfileBody": "Krypteringsdialogen visas vid värdens första krypterade säkerhetskopiering. Först frågar den om säkerhetskopian ska krypteras: Nej fortsätter utan kryptering och Ja går till steg två. Det steget beror på om en nyckelfil redan finns på /usr/local/share/proxmenux/pbs-key.conf. I så fall återanvänds den utan frågor och säkerhetskopieringen fortsätter; inte heller senare säkerhetskopieringar frågar igen. Annars visar en meny två alternativ. Skapa en ny nyckelfil kör proxmox-backup-client key create --kdf none. Använd en befintlig nyckelfil identifierar automatiskt en PVE-hanterad nyckel: om det valda PBS-förvaret är registrerat i Proxmox med en krypteringsnyckel på /etc/pve/priv/storage/<NAME>.enc, kopieras filen utan frågor till ProxMenux kanoniska sökväg. Om ingen PVE-hanterad nyckel matchar förvaret efterfrågas den absoluta sökväg där operatören redan har placerat nyckelfilen på värden. I båda fallen installeras filen på den kanoniska sökvägen med chmod 600.", + "modesTitle": "En nyckelfil per värd eller en gemensam nyckelfil", + "modesIntro": "Båda driftsmodellerna stöds och ingen är obligatorisk. Operatören väljer utifrån hur värdarna är organiserade.", + "modesPerHostTitle": "En nyckelfil per värd (standard)", + "modesPerHostBody": "Varje värd genererar sin egen nyckelfil första gången det möjliggör PBS-kryptering. Isolering är maximal: att kompromissa med nyckelfilen hos en värd exponerar inte någon annans säkerhetskopior. Rekommenderas för produktionsflottor och för miljöer där värdar har olika ägare eller överensstämmelse gränser.", + "modesSharedTitle": "Gemensam nyckelfil (importeras på varje värd)", + "modesSharedBody": "En huvudnyckelfil skapas en gång och installeras på varje värd via alternativet Använd en befintlig nyckelfil. Hanteringen blir enklare: en enda hemlighet att skydda, och varje värd kan dekryptera alla andra värdars arkiv. Det är användbart för konsolidering, återställningsövningar mellan värdar och central verifiering av säkerhetskopior. Nackdelen är att en läcka av den gemensamma nyckeln exponerar alla värdar samtidigt. Rekommenderas för hemlabb och miljöer där alla värdar har samma ägare och ingår i samma tillitsområde.", + "recoveryTitle": "Ladda upp nyckeln till PBS – operatören bestämmer", + "recoveryBody": "Direkt efter valet av nyckelfil ställer ProxMenux den uttryckliga frågan Ladda upp nyckeln till PBS? med två svar. Ingen återställningsfil laddas upp till PBS förrän operatören svarar Ja. Standardvalet är Nej, behåll endast lokalt: nyckelfilen ligger kvar på den kanoniska lokala sökvägen, ProxMenux laddar inte upp någon återställningsfil till PBS och operatören ansvarar själv för kopian utanför värden. Knappen Ladda ner nyckelfil på PBS-målets rad i Monitor ger en kopia vid behov. Valet Ja, ladda upp efterfrågar en återställningslösenfras två gånger och kontrollerar att svaren matchar. ProxMenux skyddar nyckelfilen med AES-256-CBC och PBKDF2 (600 000 iterationer, slumpmässigt salt) och skapar pbs-key.recovery.enc. Varje senare krypterad säkerhetskopia laddar upp detta kuvert till PBS som en tillhörande säkerhetskopieringsgrupp. Dessa uppladdningar skickar varken lösenfrasen eller nyckelfilen i klartext till PBS. Valet kan ändras när som helst i Monitor: kontrollen på PBS-målets rad växlar Ja/Nej och tillämpar omedelbart Börja ladda upp, Sluta ladda upp eller Uppdatera lösenfras beroende på aktuellt tillstånd.", + "blobUploadTitle": "Tillhörande säkerhetskopieringsgrupp på PBS", + "blobUploadBody1": "När läget är Ja, ladda upp laddar ProxMenux upp återställningskuvertet till PBS efter varje krypterad säkerhetskopiering, som en andra tillhörande grupp. Den har samma namn som värdens grupp med suffixet -keyrecovery. Grupperna visas bredvid varandra i datalagrets lista: en för värdsäkerhetskopior och en för återställningskuvert. Kuvertet lämnar aldrig värden i klartext: krypteringen sker på värden med AES-256-CBC och PBKDF2 innan några data överförs (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS tar endast emot det redan krypterade kuvertet.", + "envelopeSecurityTitle": "Överför nyckelåterhämtningsfilen till PBS en säkerhetsrisk?", + "envelopeSecurityBody": "Keyrecovery-filen krypteras i transit och i vila. Återhämtningspassfrasen lämnar aldrig värden: kryptering sker lokalt före uppladdningen, och PBS ser bara det redan krypterade resultatet. En PBS-administratör - eller någon med tillgång till databutiken - kan ladda ner nyckelrecovery-filen, men utan återställningspassfrasen kan de inte läsa nyckelfilen inuti: det är ogenomskinlig chiffertext. Rekonstruera nyckelfilen kräver båda bitarna samtidigt, nyckelrecovery-filen och passfrasen, och endast operatören håller båda.", + "blobUploadConstraintTitle": "Varför två grupper istället för en enda krypterad", + "blobUploadConstraintBody": "Ett enda anrop till proxmox-backup-client backup krypterar antingen alla sina arkiv med samma nyckelfil eller inget av dem. Värdsäkerhetskopian måste krypteras med värdens nyckelfil, men återställningskuvertet kan inte skickas med i samma uppladdning: då skulle det krypteras med just den nyckelfil som det innehåller. På en nyinstallerad värd skulle det inte gå att öppna, eftersom nyckelfilen skulle behövas för att dekryptera sig själv. Därför laddas de två filerna upp separat och visas som två grupper. PBS-klienten krypterar värdsäkerhetskopian med nyckelfilen, medan ProxMenux krypterar kuvertet med lösenfrasen före uppladdning. Två olika krypteringslager skyddar två olika innehåll.", + "blobUploadImageAlt": "PBS-gränssnittet visar säkerhetskopieringsgrupperna hostcfg-HOSTNAME och hostcfg-HOSTNAME-keyrecovery bredvid varandra i datalagrets lista.", + "blobUploadImageCaption": "PBS-gränssnittet — de tillhörande säkerhetskopieringsgrupperna. Huvudgruppen innehåller värdsäkerhetskopiorna; gruppen -keyrecovery innehåller nyckelfilen skyddad med lösenfras.", + "recoverTitle": "Återhämtning på en ny värd", + "recoverBody": "Om nyckelfilen saknas på den kanoniska sökvägen, efter en ominstallation eller uttrycklig borttagning, provar återställningen tre källor i ordning och stannar vid den första användbara nyckeln. Först kopieras en matchande PVE-hanterad nyckel från /etc/pve/priv/storage/<NAME>.enc utan frågor till den kanoniska sökvägen, om den finns för det valda PBS-förvaret. Om det finns en -keyrecovery-grupp på PBS laddas sedan den senaste ögonblicksbilden ner och operatören anger återställningslösenfrasen för att dekryptera den. Om båda alternativen misslyckas eller avböjs efterfrågas till sist den absoluta sökvägen till nyckelfilen på värden, och filen kopieras till den kanoniska sökvägen. Monitor visar samma importflöde i säkerhetskopians detaljdialog. En gul panel visas överst när Återställ, Ladda ner eller Visa innehåll behöver en nyckel som saknas. Om en installerad nyckel inte matchar säkerhetskopian returnerar PBS wrong key — manifest's key XX does not match provided key YY. Samma tre åtgärder visar då en strukturerad panel med manifestets nödvändiga nyckelfingeravtryck tydligt utmärkt, så att operatören kan identifiera rätt nyckelfil att importera för säkerhetskopian.", + "monitorManagementTitle": "Hantera nyckelfilen från Monitor", + "monitorManagementBody": "Monitor visar nyckelfilens kontroller direkt på varje PBS-målrad i säkerhetskopieringskonfigurationen. Tre åtgärder finns: Ladda ner exporterar den aktuella filen till webbläsaren; Ladda upp ersätter den installerade filen med operatörens fil, och den gamla skrivs över först när den nya har installerats på den kanoniska sökvägen; Ta bort tar bort filen från värden. Bredvid finns kontrollen för återställningskopian: ett Ja/Nej-val för Ladda upp nyckeln till PBS?, ett lösenfrasfält när Ja väljs och en knapp som beroende på tillstånd tillämpar Börja ladda upp, Sluta ladda upp eller Uppdatera lösenfras. Alla åtgärder använder samma Flask-slutpunkter som terminalgränssnittet, så effekten på disk och tillståndet på PBS blir identiska från båda gränssnitten." + }, + "restoreAccess": { + "heading": "Hämta vid återställning", + "body": "Återställningen hittar ProxMenux värdsäkerhetskopior på PBS genom att lista grupperna i det konfigurerade förvaret och filtrera efter ID-mönster. Fliken Säkerhetskopior i Monitor visar samma lista. När en säkerhetskopia väljs körs proxmox-backup-client restore med samma förvar, lösenord och fingeravtryck, samt --keyfile om kopian är krypterad. Arkivet .pxar packas upp i en förberedelsekatalog som _rs_check_layout lämnar vidare till den vanliga återställningen. Utanför ProxMenux kan samma kommando packa upp arkivet till valfri sökväg för att granska trädet eller återställa manuellt." + }, + "references": { + "heading": "Referenser", + "intro": "Officiell Proxmox Backup Server-dokumentation för komponenterna ProxMenux är beroende av.", + "items": [ + { + "label": "Proxmox Backup Server dokumentation", + "href": "https://pbs.proxmox.com/docs/", + "tail": " - huvudingångspunkt som täcker installation, administration, lagring, användare och roller." + }, + { + "label": "proxmox-backup-client", + "href": "https://pbs.proxmox.com/docs/backup-client.html", + "tail": " — kommandoradsverktyget som ProxMenux använder för varje säkerhetskopiering och återställning. Beskriver säkerhetskopierings-ID, typer, arkiv, förvarssyntax och miljövariabler." + }, + { + "label": "Kryptering på klientsidan", + "href": "https://pbs.proxmox.com/docs/backup-client.html#encryption", + "tail": " — skapa nyckelfiler, --kdf-lägen och krypteringsmodellen som ProxMenux utökar med en återställningskopia skyddad med lösenfras." + }, + { + "label": "Datalagerhantering", + "href": "https://pbs.proxmox.com/docs/storage.html", + "tail": " - skapa och hantera datastorer som tar emot värdbackups, inklusive chunk-store layout och behörigheter." + }, + { + "label": "Gallring och skräpinsamling", + "href": "https://pbs.proxmox.com/docs/maintenance.html#pruning", + "tail": " — lagringsreglerna bakom --keep-last / --keep-daily / --keep-weekly som ProxMenux tillämpar per schemalagt jobb, samt hur PBS frigör oanvända block efter gallring." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/glossary.json b/web/messages/sv/docs/backup-restore/glossary.json new file mode 100644 index 00000000..adfdbd7a --- /dev/null +++ b/web/messages/sv/docs/backup-restore/glossary.json @@ -0,0 +1,230 @@ +{ + "meta": { + "title": "Ordlista - Backup & Restore | ProxMenux", + "description": "Termer i ProxMenux system för säkerhetskopiering och återställning: kryptering, nyckelfil, passfras, återställningskuvert, PBS, datablock, rootfs, manifest, körprocess och komplettering mellan kärnversioner.", + "ogTitle": "Backup & Återställ ordlista | ProxMenux", + "ogDescription": "Tydliga definitioner för ordförråd som används över ProxMenux backup och återställa dokumentation.", + "twitterTitle": "Backup & Återställ ordlista | ProxMenux", + "twitterDescription": "Passfras, keyfile, återhämtningskuvert, rootfs, manifest, PBS, bitar - alla definierade på ett ställe." + }, + "header": { + "title": "Ordlista", + "description": "Termer i dokumentationen för säkerhetskopiering och återställning, med definitioner.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "body": "Termer grupperas efter tema. Varje post ger termen och en kort definition." + }, + "groups": [ + { + "title": "Kryptering och nyckelåterställning", + "intro": "Vocabulary för PBS kryptering block. Det handlar om två distinkta hemligheter: en binär nyckelfil och en skriftlig passfras.", + "entries": [ + { + "id": "passphrase-recuperacion", + "term": "Återställningslösenfras", + "def": "Text lösenord användaren väljer för att skydda återställningskuvertet. Det uppmanas två gånger med en matchkontroll, och används endast för att kryptera kuvertet och för att dekryptera det om nyckelfilen någonsin behöver återställas. Det är inte passfrasen som låser upp nyckelfilen själv, och det skickas aldrig till PBS. Under en normal backup lämnar den aldrig värden." + }, + { + "id": "clave-cifrado", + "term": "Keyfile (krypteringsnyckel)", + "def": "Nyckelfil som proxmox-backup-client använder för att kryptera datablock före uppladdning till PBS. Utan rätt nyckel kan krypterade data inte läsas. ProxMenux sparar filen på /usr/local/share/proxmenux/pbs-key.conf med läge 600. Skydda den: återställningskuvertet finns för att återställa filen om den förloras." + }, + { + "id": "contrasena-keyfile", + "term": "Keyfile passfras (KDF passfras)", + "def": "Valfri passfras som keyfilen själv kan bära, skiljer sig från återställningspassfrasen. Det finns bara när nyckelfilen skapades med --kdf scrypt (vanligtvis en importerad nyckelfil). Utan det kan nyckelfilen inte låsas upp för användning. ProxMenux sparar den i krypterad form på värden så att schemalagda säkerhetskopior kan köras utan en interaktiv prompt." + }, + { + "id": "sobre-recuperacion", + "term": "Återhämtningskuvert", + "def": "Nyckelfilen är insvept i ett extra lager: det är krypterat med Återhämtningspassfras Använda AES-256-CBC och PBKDF2 innan den någonsin lämnar värden. Det är det som laddas upp till PBS som den -keyrecovery grupp. Utan passfrasen är kuvertet ogenomskinligt: ladda ner det från PBS avslöjar inte keyfile." + }, + { + "id": "cifrado-cliente", + "term": "Klient-side kryptering", + "def": "Krypteringsmodell där data krypteras på källvärden innan de laddas upp. PBS får bara och lagrar chiffertext; inte ens en PBS-administratör med databutiksåtkomst kan läsa den utan nyckelfilen. ProxMenux bygger på denna modell och lägger till återställningskuvertet ovanpå." + }, + { + "id": "kdf-none", + "term": "--kdf none", + "def": "Alternativ till proxmox-backup-client key create som producerar en nyckelfil utan bifogad passfras. Nyckelfilen kan användas direkt utan en prompt, vilket är viktigt för schemalagda jobb som körs obevakad. Detta är vad ProxMenux använder som standard när man skapar en ny nyckelfil." + }, + { + "id": "kdf-scrypt", + "term": "--kdf scrypt", + "def": "Alternativ till proxmox-backup-client key create som producerar en nyckelfil skyddad av en nyckelfilspassfras. Varje användning av nyckelfilen kräver att låsa upp den med den passfrasen. ProxMenux accepterar denna typ av nyckelfil på import och lagrar passfrasen krypterad så schemalagda säkerhetskopior kan fortfarande köras obevakad." + }, + { + "id": "aes-256-cbc", + "term": "AES-256-CBC", + "def": "Standard symmetrisk chiffer. ProxMenux använder den (via openssl enc -aes-256-cbc) för att linda nyckelfilen med återställningspassfrasen och producera kuvertet." + }, + { + "id": "pbkdf2", + "term": "PBKDF2", + "def": "Kryptografisk funktion som förvandlar en mänskligt utformad passfras till en binär nyckel som är lämplig för kryptering. Det saktar ner brute-force försök genom att tillämpa många iterationer. ProxMenux använder den med 600 000 iterationer och ett slumpmässigt salt när man krypterar återhämtningskuvertet." + } + ] + }, + { + "title": "Backup struktur", + "intro": "Termer som beskriver vad som lever i en säkerhetskopia, oavsett destination.", + "entries": [ + { + "id": "rootfs", + "term": "rootfs / rotfilsystem", + "def": "Filbaserad kopia av källvärdens filsystem skapad med rsync enligt standardprofilen och egna sökvägar. Det är ingen hel diskavbildning: endast sökvägar med konfiguration eller tillstånd som Proxmox inte kan återskapa självt kopieras." + }, + { + "id": "manifiesto", + "term": "Manifest (manifest.json)", + "def": "Strukturerad JSON-dokument som beskriver källvärden vid backuptid: hårdvara, lagring, kärna, ProxMenux-installerade komponenter och inventering av VM och LXC. Den produceras av sex oberoende samlare. Återställningsflödet använder det för att jämföra källa och mål." + }, + { + "id": "staging", + "term": "Staging katalog", + "def": "Tillfällig katalog där ProxMenux monterar de tre blocken (rootfs, metadata och manifest) innan du packar dem och laddar upp till destinationen. Det tas bort automatiskt när backupen slutar, även på abort." + }, + { + "id": "perfil-defecto", + "term": "Standardprofil", + "def": "Utvalda sökvägar som ProxMenux kopierar som standard i varje säkerhetskopia. Omfattar PVE-konfiguration, nätverk, SSH, kärna, apt, ProxMenux-verktyg och mer. Definieras i koden och beskrivs på sidan Hur det fungerar." + }, + { + "id": "rutas-personalizadas", + "term": "Anpassade vägar", + "def": "Extra vägar som användaren lägger till ovanpå default profil. Antingen ihållande (lagras i backup-extra-paths.txt) eller per-run (plockad i anpassat läge)." + } + ] + }, + { + "title": "Destinationer och lagring", + "intro": "Villkor bundna till var backup landar - PBS server, lokal arkiv eller Borg repository - och hur PBS organiserar data.", + "entries": [ + { + "id": "repositorio-pbs", + "term": "PBS-arkivet", + "def": "Kombination av Proxmox Backup Server + datastore + användare som tar emot backupen. Identifierad av strängen user@realm@host:datastore. En enda PBS-server kan vara värd för flera förråd." + }, + { + "id": "datastore", + "term": "Datalager", + "def": "Ett visst lagringsutrymme på en PBS-server där säkerhetskopior och deras datablock finns. Varje datalager ligger på ett filsystem på PBS-servern och har egna behörigheter och regler." + }, + { + "id": "chunk", + "term": "Datablock / deduplicering av datablock", + "def": "PBS delar varje backup i varierande storlek bitar, identifierar varje bit av sin hash och lagrar varje bit bara en gång, även om det visas i många olika säkerhetskopior. Detta innebär successiva säkerhetskopior av samma värd - eller över liknande värdar - ta mycket lite extra utrymme." + }, + { + "id": "fingerprint", + "term": "Fingeravtryck", + "def": "Kryptografiskt fingeravtryck av PBS-serverns TLS-certifikat. Den låter kunden verifiera att den talar till den avsedda servern utan att förlita sig på en myndighet för offentlig certifikat. ProxMenux passerar den till proxmox-backup-client via PBS_FINGERPRINT miljövariabel." + }, + { + "id": "grupo-copia", + "term": "Säkerhetskopia grupp", + "def": "Logisk container inuti PBS under vilken successiva säkerhetskopior av samma tillgång ackumuleras. Varje ny backup delar deduplicering med tidigare i samma grupp. ProxMenux använder två grupper per värd när kryptering är aktiverad: en för värdbackupen och en med ett -keyrecovery-suffix för återställningskuvertet." + }, + { + "id": "backup-id", + "term": "Säkerhetskopierings-ID", + "def": "Namnet på backup grupp. ProxMenux standarder till hostcfg-HOSTNAME och låter användaren redigera det innan uppladdning; ostödda tecken tas bort automatiskt." + }, + { + "id": "pxar", + "term": ".pxar", + "def": "PBS-inhemska arkivformat för kataloger. Det beter sig som en tar-arkiv optimerad för chunk deduplicering: snarare än att lagra en ogenomskinlig fil bryter PBS innehållet i återanvändbara bitar." + } + ] + }, + { + "title": "Körning och schemaläggning", + "intro": "Termer i ProxMenux system för schemalagda jobb.", + "entries": [ + { + "id": "runner", + "term": "Körprocess", + "def": "run_scheduled_backup.sh-skriptet som utför en schemalagd säkerhetskopia. Den läser jobbkonfigen, lanserar matchande backend (Local, PBS eller Borg), tillämpar lagring på framgång och skickar konfigurerade meddelanden." + }, + { + "id": "trabajo-programado", + "term": "Schemalagt jobb", + "def": "Bestående konfiguration av en återkommande backup. Håller destination, referenser, kryptering, schema och lagring. Lever på /var/lib/proxmenux/backup-jobs/<id>.env." + }, + { + "id": "modo-adjunto", + "term": "Anslutet läge", + "def": "Jobb utan egen timer. En job-end-hook i PVE vzdump utlöser det efter gästsäkerhetskopior när mållagringen matchar. Det valda överordnade jobbet ger lagring och inledande lagringsregler, men hooken matchar lagring, inte jobb-ID. Även en annan uppgift med samma lagring kan utlösa det. Endast Local och PBS." + }, + { + "id": "timer-systemd", + "term": "systemd-timer", + "def": "Standard systemd-mekanism som skjuter ett kommando i en kalender. ProxMenux skapar en timer per oberoende schemalagt jobb; attach-mode jobb använder ingen timer, de körs via PVE script-hook." + }, + { + "id": "retencion", + "term": "Lagringsregler (keep-last, keep-daily…)", + "def": "Policy som bestämmer vilka äldre säkerhetskopior som ska hållas och vilka som ska beskäras. Definieras per jobb med parametrar som keep-last, keep-daily, keep-weekly, keep-monthly. Tillämpad av körprocessen efter varje framgångsrik backup." + } + ] + }, + { + "title": "Återställa", + "intro": "Termer från återställningsflödet.", + "entries": [ + { + "id": "restauracion-universal", + "term": "Universell återställning", + "def": "ProxMenux-återställningsflödet extraherar inte bara filsystemet: det läser manifestet för att upptäcka skillnader mellan källa och mål, reproducerar systemkonfigurationen och kör om installatörerna för ProxMenux-hanterade komponenter. Målet är att reproducera källvärden, inte bara arkivet." + }, + { + "id": "hidratacion", + "term": "Komplettering mellan kärnversioner", + "def": "Återställ pass som sammanfogar användarens egen konfiguration från källan (IOMMU-tokens, VFIO-enhets-ID, anpassade quirks, GRUB-nycklar) ovanpå målets färska startkonfiguration, utan att kopiera källans kärnbundna filer verbatim. Kör när målkärnan är nyare än backupen." + }, + { + "id": "cross-kernel", + "term": "Återställning mellan kärnversioner", + "def": "Återställ var målets kärna skiljer sig från (vanligtvis är nyare än) källan. Kräver hydration pass för att undvika att dra längs filer oförenliga med målets kärna." + }, + { + "id": "instalador-postboot", + "term": "Installerare efter uppstart", + "def": "Komponenter installerade efter den första starten av den restaurerade värden (NVIDIA drivrutiner, Coral TPU drivrutiner, AMD GPU verktyg, Intel GPU verktyg). Varje installatör körs mot målets kärna, så den restaurerade värden beror inte på att källans kärna är närvarande." + }, + { + "id": "compatibility-check", + "term": "Kompatibilitetskontroll", + "def": "Jämförelse mellan källans manifest och målets tillstånd som ProxMenux utför i början av återställningen. Det bestämmer vilka delar som kopieras verbatim, som behöver hydrering och som återskapas av en installatör." + }, + { + "id": "equipo-recien-instalado", + "term": "Färsk installation", + "def": "Värd bara ominstallerad från början, utan lokal nyckelfil. Återställa en krypterad säkerhetskopia kräver första återställning av nyckelfilen från återställningskuvertet lagrad på PBS, med hjälp av återställningspassfrasen." + } + ] + } + ], + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "Hur det fungerar", + "href": "/docs/backup-restore/how-it-works", + "tail": " — där rootfs, manifest och applikationsinventering passar in i en backup." + }, + { + "label": "Proxmox Backup Server-mål", + "href": "/docs/backup-restore/destinations/pbs", + "tail": " - där klient-side kryptering, keyfile, återställningspassfras och kuvert dokumenteras på djupet." + }, + { + "label": "Återställande", + "href": "/docs/backup-restore/restoring", + "tail": " — Återställande flöde och manifest användning." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/how-it-works.json b/web/messages/sv/docs/backup-restore/how-it-works.json new file mode 100644 index 00000000..b50bb742 --- /dev/null +++ b/web/messages/sv/docs/backup-restore/how-it-works.json @@ -0,0 +1,205 @@ +{ + "meta": { + "title": "Hur ProxMenux Backup fungerar internt - rootfs, manifest, applikationer", + "description": "Detaljerat innehåll i en ProxMenux-säkerhetskopia: rootfs kopierat med rsync enligt standardprofilens sökvägar, ett strukturerat manifest från sex oberoende insamlare och programinventeringen som styr automatisk ominstallation av paket och komponenter efter återställning.", + "ogTitle": "Hur ProxMenux Backup fungerar internt", + "ogDescription": "De tre nyttolasterna av en ProxMenux-backup förklarade: rootfs, manifest och applikationer.", + "twitterTitle": "Hur ProxMenux Backup fungerar | ProxMenux", + "twitterDescription": "De tre nyttolasterna av en ProxMenux-backup och hur återställningen reproducerar källvärden från dem." + }, + "header": { + "title": "Hur det fungerar", + "description": "Den interna nedbrytningen av en ProxMenux-backup - filsystem, manifest och applikationsinventering - och hur återställningen förbrukar alla tre för att reproducera källvärden på ett mål som kanske inte delar samma kärna.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "title": "Ett arkiv, tre delar", + "body": "Varje säkerhetskopia skapar tre tydliga delar under en gemensam förberedelsekatalog. Arkivet som laddas upp till målet (lokalt .tar.zst, PBS-säkerhetskopia eller Borg-arkiv) innehåller samma struktur. Återställningen använder alla tre: manifestet läses före ändringar för att upptäcka avvikelser och bestämma undantag; rootfs ger konfigurationsfiler som tillämpas direkt eller efter omstart; programinventeringen styr paketinstallation och ominstallation av komponenter efter start. Varje del kan granskas eller packas upp oberoende." + }, + "layout": { + "heading": "Arkivlayout", + "intro": "Varje arkiv följer samma trädlayout oavsett destination. metadata/ underkatalog håller de strukturerade nyttolasterna; rootfs/ underkatalog håller filsystemet kopiera.", + "treeCaption": "Förberedelsekatalogen som skapas vid säkerhetskopiering. Alla mål får samma träd i sitt eget format: tar för lokala mål, PBS-block för PBS och Borg-segment för 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│ ├── paths_archived.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": "Innehållet i rootfs", + "intro": "Trädet rootfs/ är en vanlig filsystemkopia som skapas med rsync från källvärden. Det innehåller en utvald standardprofil med sökvägar som behövs för Proxmox-återställning samt egna sökvägar som användaren lägger till i jobbet eller den interaktiva sessionen. Urvalet är avsiktligt begränsat till sökvägar som innehåller konfiguration eller lagrar tillstånd som Proxmox inte kan återskapa själv.", + "defaultProfileTitle": "Standardprofilen", + "defaultProfileBody": "Standardprofilen definieras av hb_default_profile_paths i lib_host_backup_common.sh. Den omfattar åtta fasta kategorier och vid behov ZFS-tillstånd, som tillsammans beskriver en fungerande Proxmox-värd:", + "categoriesTitle": "Sökvägskategorier", + "categoryRows": [ + { + "category": "PVE-kärna", + "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", + "why": "Cluster filsystem innehåll och vzdump standarder. Pmxcfs databas (config.db) fångas som en konsekvent ögonblicksbild via sqlite3 .backup utan att stoppa klustret, och .db-wal / .db-shm sidovagnar är uteslutna från rsync. När sqlite3 inte är tillgänglig, skapas i stället config.db.raw-fallback, som automatiskt används som databas vid återställning." + }, + { + "category": "Värd identitet och nätverk", + "paths": "/etc/hostname, /etc/hosts, /etc/timezone, /etc/resolv.conf, /etc/network, /etc/systemd/network", + "why": "Det värden behöver för att komma upp i nätverket med samma identitet. Filerna .link under /etc/systemd/network kopplar nätverkskortens namn till deras MAC-adresser, så att namnen bevaras vid ominstallation och hårdvaruändringar." + }, + { + "category": "Åtkomst och autentisering", + "paths": "/etc/ssh, /etc/sudoers, /etc/sudoers.d, /etc/pam.d, /etc/security", + "why": "SSH-nycklar, sudoregler och PAM-konfiguration. Att förlora dessa låser användaren ur den restaurerade värden." + }, + { + "category": "Kärna och uppstart", + "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-parametrar, svartlistor för moduler, VFIO-enhets-ID, monteringstabell och lagringskonfiguration." + }, + { + "category": "Skal och språkinställningar", + "paths": "/etc/environment, /etc/bash.bashrc, /etc/inputrc, /etc/profile, /etc/profile.d, /etc/locale.gen, /etc/locale.conf", + "why": "Systemgemensam skalkonfiguration, miljövariabler och inställningar för generering av språkmiljöer." + }, + { + "category": "Pakethantering och 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-källor för konsekvent paketlösning, schemalagda uppgifter som definieras av användaren." + }, + { + "category": "ProxMenux tillstånd och verktyg", + "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": "Valfri men vanlig Proxmox verktyg. Saknade vägar noteras i metadata/missing_paths.txt utan att stoppa backupen." + }, + { + "category": "ProxMenux-program och root-kontot", + "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (flyktiga subdirs exkluderade)", + "why": "ProxMenux-installerade binärer och per användare konfiguration under /root. Volatila vägar (.bash_history, .cache/, tmp/, .local/share/Trash/) utesluts från kopian. /var/lib/proxmenux håller de schemalagda backupjobben och värdens tillstånd som hålls av ProxMenux; återställningsstagningen, återställningskopiorna och efteråtsmarkörerna är uteslutna, eftersom de tillhör värden som kör en återställning." + }, + { + "category": "ZFS tillstånd (villkor)", + "paths": "/etc/zfs", + "why": "Det ingår endast när källvärden kör ZFS. innehåller zpool.cache och hostid." + } + ], + "customTitle": "Utöka profilen med anpassade vägar", + "customBody": "Utöver standardprofilen erbjuder ProxMenux två sätt att inkludera ytterligare vägar i en säkerhetskopia. De komponerar utan konflikt och gäller både interaktiva säkerhetskopior och schemalagda jobb.", + "customExtrasTitle": "1. Persistenta extrafunktioner (per-host-fil)", + "customExtrasBody": "En textfil på /usr/local/share/proxmenux/backup-extra-paths.txt innehåller en lista över absoluta vägar som användaren har markerat som \"alltid inkluderar\" på denna värd. När en säkerhetskopia körs i Default-läge, appenderar ProxMenux dessa vägar till standardprofilen automatiskt utan att fråga. Filen redigeras från gränssnittet - ingen manuell redigering behövs - och kvarstår över omstart och uppdateringar. En absolut väg per rad; # kommentarer är tillåtna.", + "customModeTitle": "2. Anpassat läge (per körning)", + "customModeBody": "Att starta en säkerhetskopia i Custom-läge ersätter den automatiska tillämpningen av standardprofilen med en checklista som visar varje väg: standardprofilerade poster och de ihållande extrafunktionerna (prefixed med [+] och förmarkerade). Användaren markerar eller avmarkerar poster för den specifika körningen, och kan också trycka på Lägg till anpassad sökväg för att ange en ny väg - som sedan kvarstår till extrafilen för framtida säkerhetskopior.", + "customMissingTitle": "Vägar frånvarande från källan", + "customMissingBody": "Varje väg från profilen (standard eller tillägg) som inte finns på källvärden registreras i metadata/missing_paths.txt inuti arkivet. Säkerhetskopieringen misslyckas varken eller slutar - användaren ser en sammanfattning av arkiverade vägar och saknade vägar i slutet. I praktiken sker detta för valfria verktygsvägar som /etc/wireguard eller /etc/prometheus när dessa verktyg inte är installerade." + }, + "manifest": { + "heading": "Manifestdelen", + "intro": "manifest.json är ett strukturerat JSON-dokument som beskriver källvärden vid backupen. Den produceras av sex oberoende insamlare orkestrerad av build_manifest.sh. Varje samlare läser endast data, producerar ett väldefinierat JSON-fragment och faller tillbaka till ett säkert tomt standard om det misslyckas - manifestet är fortfarande användbart om ett avsnitt är ofullständigt.", + "orchestratorCaption": "De sex samlarna komponerar manifestet. Varje samlare körs i sin egen underprocess; ett misslyckande i en faller tillbaka till en dokumenterad säker standard och varnar men inte avbryter backupen.", + "collectorRows": [ + { + "collector": "collect_source_host.sh", + "produces": "source_host", + "content": "Hostname, PVE version (pveversion), PBS version om värden kör backup-server roll, kärna (uname -r), startläge (efi/bios), root filsystem typ, CPU modell + arkitektur, minne i KB." + }, + { + "collector": "collect_hardware.sh", + "produces": "hardware_inventory", + "content": "GPU (med leverantör och ProxMenux installer mapping), TPUs (Coral USB + M.2 med lsusb / lspci detektering), NICs (med MAC, PCI slot och bro medlemskap), trådlösa enheter. GPU-poster bär en passthrough_eligible-heuristisk." + }, + { + "collector": "collect_storage.sh", + "produces": "storage_inventory", + "content": "ZFS-pooler (med pooltyp + medlemsdisker löste /dev/disk/by-id/*, /dev/disk/by-partuuid/* eller rå /dev/sdX-vägar beroende på hur varje pool ursprungligen skapades), LVM-volymgrupper + tunna pooler, fysiska diskar med SMART-kapacitet, PVE storage.cfg-poster, externa monteringar." + }, + { + "collector": "collect_kernel.sh", + "produces": "kernel_params", + "content": "Parametrar som operatören lagt till i /proc/cmdline, utan standardposter som BOOT_IMAGE=, root=, ro/rw, quiet och splash; moduler som laddas vid start från /etc/modules; sökvägar till /etc/modprobe.d/*.conf-filer med faktiska direktiv (options, blacklist, install, alias, softdep)." + }, + { + "collector": "collect_proxmenux_state.sh", + "produces": "proxmenux_installed_components", + "content": "Läser /usr/local/share/proxmenux/managed_installs.json (registret över allt ProxMenux har installerat) och installed_tools.json. Varje post håller installationsbanan (menu_script) så att återställningen kan utlösa exakt samma installationsflöde." + }, + { + "collector": "collect_guests.sh", + "produces": "vms_lxcs_at_backup", + "content": "Uppräknar VMs (qm list) och LXCs (pct list) närvarande vid backuptid - VMID, namn, aktuell status. Endast inventeringen: de faktiska gästdata är vzdump/PBS." + } + ], + "schemaTitle": "Schema validering", + "schemaBody": "manifestet validerar mot scripts/backup_restore/schema/manifest.schema.json. Kör build_manifest.sh --validate utlöser en Python-side JSON Schema validering (kräver python3 + jsonschema). Om modulen inte är närvarande, är kontrollen hoppad tyst - validering är i första hand ett utvecklarhjälp, inte ett drifttidsberoende." + }, + "applications": { + "heading": "Applikationsinventeringen", + "intro": "Två inventeringar listar programvara utöver Proxmox VE:s baspaket: paketlistan under metadata/ och komponentregistret i rootfs, som beskrivs nedan. Återställningen använder APT eller ProxMenux egna installationsprogram för att återskapa användarens programvara enligt det ursprungliga installationssättet.", + "packagesTitle": "packages.manual.list", + "packagesBody": "En alfabetisk textlista från apt-mark showmanual med alla APT-paket som uttryckligen installerats på källvärden. Beroenden till Proxmox VE:s bassystem ingår inte; målets APT installerar dem automatiskt. Under återställningen läser _rs_run_complete_extras listan och använder ett filter mot borttagning i kaskad i tre steg: dpkg -s hittar redan installerade paket, andra huvudversioner av bibliotek identifieras och apt-get install --simulate kontrollerar risken för följdborttagningar. Återstående paket installeras med apt-get install -y.", + "componentsTitle": "components_status.json (del av rootfs)", + "componentsBody": "En JSON registret under /usr/local/share/proxmenux/ som registrerar varje komponent ProxMenux har installerat med sitt exakta tillstånd: version, ProxMenux-specifika flaggor (för NVIDIA: patched boolean; för Coral: DKMS version). Denna fil lever i rootfs - inte i metadata/ - eftersom det är läses efter att rootfs har kopierats till målet. Post-boot dispatcher (apply_cluster_postboot.sh) itererar över sina poster och kör varje komponent --auto-reinstall krok, som läser det inspelade tillståndet och reproducerar installationen mot målets nuvarande kärna.", + "componentInstallersTitle": "Installationsprogram för komponenter", + "componentInstallersBody": "Fyra ProxMenux installatörer exponerar för närvarande en --auto-reinstall ingångspunkt:", + "installerRows": [ + { + "component": "nvidia_driver", + "installer": "gpu_tpu/nvidia_installer.sh", + "action": "Läser version + patched. Ladda ner exakt samma NVIDIA runfil, bygger DKMS-moduler mot målets kärna, applicerar ProxMenux-patchen om källan hade den." + }, + { + "component": "coral_driver", + "installer": "gpu_tpu/install_coral.sh", + "action": "Läser versionen av Coral-drivrutinen och kompilerar DKMS-modulen för målets kärna." + }, + { + "component": "amdgpu_top", + "installer": "gpu_tpu/amd_gpu_tools.sh", + "action": "Läser den inspelade versionen. Laddar ner exakt .deb från GitHub release." + }, + { + "component": "intel_gpu_tools", + "installer": "gpu_tpu/intel_gpu_tools.sh", + "action": "APT-installerar paketet. Idempotent om det redan finns från packages.manual.list." + } + ] + }, + "restoreFlow": { + "heading": "Hur återställningen förbrukar de tre nyttolasterna", + "intro": "Återställningen är en sexstegs pipeline. Varje steg läser en specifik delmängd av arkivet och uppdaterar målvärden. Inget stadium kräver att källvärden kan nås - arkivet är helt fristående.", + "stagesCaption": "Steg 1 använder manifestet för att bestämma vad du ska röra. Steg 2 kopierar rootfs vägar som är säkra att tillämpa på ett körsystem. Stadium 3 iscensätter de riskfyllda vägarna för nästa start. Steg 3b importerar icke-rot ZFS datapooler vars diskar är alla närvarande. Steg 4 hanterar paket. Stage 5 körs efter omstart och ominstallerar komponenter mot målets kärna.", + "stageRows": [ + { + "stage": "1", + "name": "Kompatibilitetskontroll", + "reads": "manifest.json", + "action": "Kör hb_compat_check. Jämför källa vs mål hårdvara (NIC, lagrings-ID), PVE-version och stor kärnversion. Set HB_COMPAT_KERNEL_DIRECTION (same, bk_newer eller bk_older) och befolkar RS_SKIP_PATHS med hårdvara-drift och cross-kernel uteslutningar." + }, + { + "stage": "2", + "name": "Tillämpning under drift", + "reads": "rootfs/ (endast säkra vägar)", + "action": "_rs_apply … hot kopierar hb_classify_path=hot-poster direkt till live-målet. Allt under /etc/pve, /etc/network eller vägar som klassificeras som reboot/dangerous uppskjuts." + }, + { + "stage": "3", + "name": "Förbered uppskjutna ändringar", + "reads": "rootfs/ (omstart + farliga vägar)", + "action": "_rs_prepare_pending_restore förbereder riskfyllda sökvägar under /var/lib/proxmenux/pending-restore/, skriver plan.env, apply-on-boot.list och rs-skip-paths.txt och aktiverar proxmenux-restore-onboot.service för nästa start." + }, + { + "stage": "3b", + "name": "Datapool import", + "reads": "manifest.storage_inventory + mål ZFS tillstånd", + "action": "_rs_import_data_pools försöker importera varje ZFS-pool utan rotfilsystem vars samtliga diskar finns på målet. Pooler med ett annat hostid provas igen med zpool import -f. Om någon disk saknas hoppas poolen över med en varning. Resultatet per pool loggas i /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "stage": "4", + "name": "Paketinstallation", + "reads": "metadata/packages.manual.list", + "action": "_rs_run_complete_extras kör kaskadsäkert filter och kallar apt-get install -y med den överlevande paketlistan. Fullständig utdata går till /var/log/proxmenux/restore-apt-*.log." + }, + { + "stage": "5", + "name": "Efter uppstart", + "reads": "rootfs (redan tillämpat) + components_status.json", + "action": "Efter omstart, apply_pending_restore.sh spelar tillbaka de uppskjutna banorna och apply_cluster_postboot.sh kör update-initramfs, update-grub (eller proxmox-boot-tool refresh) och itererar över components_status.json skjuter varje komponent --auto-reinstall krok." + } + ] + }, + "whyItWorks": { + "heading": "Varför säkerhetskopian delas i tre delar", + "body": "Uppdelningen följer uppgifternas livscykel. Filsystemet överförs med rsync: snabbt, öppet och atomärt per fil. Konfigurationstillstånd som måste tolkas före ändringar lagras som strukturerad JSON, läsbar för sig, versionshanterbar med schema och maskinellt jämförbar med målets tillstånd. Programvara som ska installeras om beskrivs i en inventering med namn och versioner; målets pakethanterare och ProxMenux installationsprogram väljer rätt binärer. Varje del fyller sin egen uppgift. Tillsammans eftersträvar de en sammanhängande återställning med feltolerans: ett skadat manifest lämnar rootfs återställbart, ett saknat paket hindrar inte komponentinstallation och ett fel för en post stoppar inte nästa." + } +} diff --git a/web/messages/sv/docs/backup-restore/index.json b/web/messages/sv/docs/backup-restore/index.json new file mode 100644 index 00000000..0c60947e --- /dev/null +++ b/web/messages/sv/docs/backup-restore/index.json @@ -0,0 +1,93 @@ +{ + "meta": { + "title": "ProxMenux Säkerhetskopiering och återställning — Översikt | Fullständig säkerhetskopiering och återställning av värd för Proxmox VE", + "description": "ProxMenux Backup & Restore fångar det fullständiga tillståndet för en Proxmox-värd – filsystem, strukturerat konfigurationsmanifest och installerade paket/komponenter – och återskapar det på samma eller en annan värd. Säkerhetskopieringen och återställningen är fristående: inga externa beroenden, och återställningar över kärnor stöds genom ett riktningsmedvetet filter för säker delmängd och kärnagnostisk hydrering.", + "ogTitle": "ProxMenux Säkerhetskopiering och återställning — Översikt", + "ogDescription": "Fullständig säkerhetskopiering och återställning av värd för Proxmox VE med strukturerat manifest, paketlista och ominstallerare av komponenter.", + "twitterTitle": "ProxMenux Säkerhetskopiering och återställning | ProxMenux", + "twitterDescription": "Fullständig säkerhetskopiering och återställning av värd för Proxmox VE med strukturerat manifest, paketlista och ominstallerare av komponenter." + }, + "header": { + "title": "Säkerhetskopiering och återställning", + "description": "Säkerhetskopiering av hela värden och återställning för Proxmox VE. Fångar filsystem, konfiguration och installerade komponenter i ett enda arkiv och återskapar värden på samma eller en annan Proxmox-installation utan externa beroenden.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "title": "Vad det är, i ett stycke", + "body": "En ProxMenux-säkerhetskopia sparar hela tillståndet för en Proxmox-värd: filsystemet, med relevanta kataloger under /etc, /root och /var/lib/pve-cluster samt valfria egna sökvägar; ett strukturerat manifest i JSON med upptäckt maskinvara, kärnparametrar, nätverkskonfiguration, ZFS-status, användare och cron-poster; och en programinventering med paket som APT markerar som manuellt installerade samt komponenter som ProxMenux installerat, med exakta versioner. Alla tre mål som stöds – lokalt arkiv, Proxmox Backup Server (rekommenderas) och Borg – får samma fristående innehåll. Vart och ett kan användas för att återskapa målvärden utan att källvärden behöver vara nåbar under återställningen." + }, + "video": { + "heading": "Videogenomgång", + "intro": "Föredrar du att titta på Backup & Restore i aktion innan du konfigurerar det? Den här genomgången täcker en fullständig demo av funktionen i ProxMenux.", + "title": "ProxMenux – genomgång för säkerhetskopiering och återställning", + "caption": "Extern video på YouTube. Spelas upp i integritetsförbättrat läge (inga cookies förrän du trycker på play)." + }, + "whatItIsNot": { + "heading": "Vad det inte är", + "intro": "Det här avsnittet gäller säkerhetskopiering och återställning av värden: själva Proxmox-installationen, inte de program och gästsystem som körs på den.", + "items": [ + "Det här är inget verktyg för säkerhetskopiering av VM:ar eller CT:er. Funktionen sparar varken gästernas diskar eller RAM-tillstånd; det sköts av vzdump. Gästernas konfigurationsfiler (/etc/pve/nodes/<node>/qemu-server/*.conf och lxc/*.conf) ingår däremot. Efter återställning visas inventeringen igen, och diskarna kan återställas eller anslutas från en befintlig PBS- eller lokal säkerhetskopia.", + "Det här är ingen åtgärd för hela klustret. Varje nod säkerhetskopierar sig själv. Klustertillhörigheten sparas i /etc/pve så att en återställd nod kan anslutas igen, men återställning av hela klustret kräver samordning mellan noderna.", + "Det här är ingen fullständig diskavbildning. Kärnans binärfiler, initramfs och startpartitionen ingår inte. Vid återställning använder ProxMenux målvärdens egna startfiler, som återskapas automatiskt av update-initramfs och starthanterarens verktyg, och installerar drivrutiner som passar målets körande kärna." + ] + }, + "threePillars": { + "heading": "De tre pelarna i en säkerhetskopia", + "intro": "Ett ProxMenux arkiv är uppbyggt kring tre fristående nyttolaster. Återställningen använder alla tre tillsammans för att reproducera källvärden på ett mål som kanske inte ens har samma kärna installerad.", + "diagramCaption": "Varje säkerhetskopia innehåller samma tre datablock oavsett destination. Återställningen använder alla tre: rootfs för att återställa filerna, manifestet för att upptäcka avvikelser och skillnader mellan kärnversioner samt programinventeringen för att installera om paket och komponenter för målets egen kärna.", + "pillar1Label": "Filsystem", + "pillar1Detail": "rootfs/\n(rsync av /etc,\n/etc/systemd/network,\n/root, samt en\nsqlite3-ögonblicksbild\nav /var/lib/pve-cluster,\n+ valfria sökvägar)", + "pillar2Label": "Manifest", + "pillar2Detail": "manifest.json\n(maskinvara, kärn-\nparametrar, nätverk,\nZFS, användare, cron,\nZFS-pooler, lagring)", + "pillar3Label": "Applikationer", + "pillar3Detail": "packages.manual.list\n+ components_status.json\n(manuella APT-paket + ProxMenux-\ninstallationsprogram med versioner)" + }, + "restoreIsUniversal": { + "heading": "Återställningen återger källvärden, inte arkivet", + "body": "En återställning av en ProxMenux-säkerhetskopia packar inte bara upp filsystemet. Återställningen läser manifestet för att upptäcka avvikelser mellan källa och mål (maskinvaruskillnader, namnbyten på nätverkskort, kärnversion och ZFS-poolens identitet), återställer filsystemet och startar sedan rätt komponentinstallerare för varje tjänst som fanns på källan (NVIDIA-drivrutin, Coral TPU samt GPU-verktyg för AMD och Intel). Varje installerare körs för målets aktuella kärna, så den återställda värden är inte beroende av att källans kärna finns kvar. När målets kärna är nyare än säkerhetskopians sammanfogar en kärnoberoende hydrering användarens egna inställningar (IOMMU-token, VFIO-enhets-ID:n, särskilda anpassningar och GRUB-nycklar) med målets nya startkonfiguration utan att kopiera kärnbundna filer ordagrant." + }, + "twoInterfaces": { + "heading": "Två gränssnitt, en backend", + "intro": "Varje steg i arbetsflödet för säkerhetskopiering och återställning är tillgängligt från två ingångspunkter. Båda anropar samma skalbibliotek, producerar identiska arkiv och läser samma jobbregister.", + "cliLabel": "ProxMenux Scripts (TUI)", + "cliDetail": "meny → Verktyg →\nVärdsäkerhetskopiering/återställning\n\nDialogbaserat flöde,\nSSH-vänlig, skriptbar\nför obevakad användning.", + "webLabel": "ProxMenux Monitor (Webb UI)", + "webDetail": "Backups-fliken i\nMonitors webbgränssnitt.\n\nÅterställning med ett klick,\nlöpande loggvisning, integrerat\nmed aviseringar och visning\nav skillnader vid återställning." + }, + "whereNext": { + "heading": "Vart ska man gå härifrån", + "intro": "Varje underavsnitt nedan täcker en aspekt av arbetsflödet på djupet. Börja med Hur det fungerar om målet är att förstå vad arkivet innehåller och varför. Hoppa till Destinationer för att konfigurera målet för kopian. Läs Återställning och Återställning mellan kärnversioner för återställningssidan.", + "items": [ + { + "label": "Så fungerar det", + "href": "/docs/backup-restore/how-it-works", + "tail": "— de tre nyttolasterna (rootfs, manifest, applikationer) i detalj, med de samlare som producerar dem och formatet för varje fil." + }, + { + "label": "Destinationer", + "href": "/docs/backup-restore/destinations", + "tail": "— jämförelse av lokal, Proxmox Backup Server (rekommenderas) och Borg, och hur man konfigurerar var och en." + }, + { + "label": "Skapa säkerhetskopior", + "href": "/docs/backup-restore/creating-backups", + "tail": "— engångssäkerhetskopior, standardsökvägsprofilen, lägga till anpassade sökvägar, kryptering för PBS." + }, + { + "label": "Schemalagda jobb", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": "— nya jobb kontra att koppla till ett befintligt PVE vzdump-jobb, schemaläggningsformat, jobbdetaljmodal." + }, + { + "label": "Återställning", + "href": "/docs/backup-restore/restoring", + "tail": "— de tre åtgärderna i ett arkiv (visa, ladda ner, återställ), Komplett vs. anpassad återställning, post-boot-dispatcher och varför de sista tio minuterna är viktiga." + }, + { + "label": "Återställning mellan kärnversioner", + "href": "/docs/backup-restore/cross-kernel", + "tail": " — beteende som tar hänsyn till riktningen på versionsbytet när målets kärna skiljer sig från säkerhetskopians, filtret för en säker delmängd och de fyra hydreringsfaserna." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/restoring.json b/web/messages/sv/docs/backup-restore/restoring.json new file mode 100644 index 00000000..071758a0 --- /dev/null +++ b/web/messages/sv/docs/backup-restore/restoring.json @@ -0,0 +1,282 @@ +{ + "meta": { + "title": "Återställ en backup - full och anpassade flöden | ProxMenux", + "description": "Hela återställningsflödet: visa, ladda ner eller återställa en säkerhetskopia, kompatibilitetskontroll och resultat, fullständigt eller anpassat läge, sökvägar som tillämpas direkt eller efter omstart samt startskriptet och ominstallation av komponenter efter start.", + "ogTitle": "ProxMenux Backup - återställande", + "ogDescription": "Fullständiga och anpassade återställningsflöden med kompatibilitetskontrollen, banklassificering, on-boot dispatcher och post-boot ominstallation.", + "twitterTitle": "Återställ en backup | ProxMenux", + "twitterDescription": "Hur en ProxMenux värd backup förvandlas tillbaka till en fungerande Proxmox värd." + }, + "header": { + "title": "Återställ en backup", + "description": "Det fullständiga återställningsflödet: från att välja ett arkiv till en fungerande värd. Dokument kompatibilitetskontrollen, de två återställningslägena, on-boot-avsändaren, post-boot-ominstallationspasset och de mekanismer som gör cross-host och cross-kernel-återställningar förutsägbara.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "title": "Återställningen reproducerar källan, inte bara filerna", + "body": "Att återställa en ProxMenux-säkerhetskopia innebär mer än att packa upp filer. Före ändringar läses manifestet för att hitta skillnader mellan källa och mål, sökvägar som kan hindra starten utesluts och användarinställningar som inte kan kopieras direkt anpassas. Efter den nödvändiga omstarten försöker processen installera om de registrerade komponenter som stöds (NVIDIA-drivrutin, Coral TPU och GPU-verktyg) för målets aktiva kärna. Ett enda arkiv styr kompatibilitetskontroll, sökvägsklassificering och arbetet under och efter start. Kontrollera resultaten per komponent och loggarna för att bekräfta utfallet." + }, + "threeActions": { + "heading": "Tre åtgärder på en backup", + "intro": "Välja en säkerhetskopia från listan öppnar en meny med tre åtgärder.", + "actionRows": [ + { + "action": "Visa", + "detail": "Öppnar en skrivskyddad vy av arkivet: manifest.json-innehåll (källvärdnamn, PVE-version, kärna, hårdvara, installerade komponenter), listan över vägar inuti rootfs/ och en diff av vad som skulle förändras på den aktuella värden om säkerhetskopieringen tillämpades." + }, + { + "action": "Ladda ner", + "detail": "Exporterar arkivet som en bärbar .tar.zst-fil (tar komprimerad med zstd). Det kan extraheras på alla Linux-system med tar --zstd -xf FILE.tar.zst, eller på macOS / Windows med något verktyg som stöder zstd (7-Zip, PeaZip, Keka ...). Det extraherade trädet innehåller manifest.json, metadata/ och rootfs/ - exakt samma layout som återställningen förbrukar. Användbar för offline inspektion eller för att återställa på en värd utan tillgång till den ursprungliga destinationen (PBS, Borg)." + }, + { + "action": "Återställa", + "detail": "Åtgärden som skriver till systemet. Packar upp arkivet i en förberedelsekatalog, kör kompatibilitetskontrollen och visar valet mellan fullständig och anpassad återställning." + } + ] + }, + "compatibilityCheck": { + "heading": "Kompatibilitetskontrollen", + "intro": "Innan någon fil skrivs jämför hb_compat_check det tillstånd som beskrivs i manifestet mot målvärden. Kontrollen läser endast data och producerar fyra oberoende utgångar som driver resten av återställningen.", + "outputRows": [ + { + "output": "Riktningsflaggan", + "detail": "HB_COMPAT_KERNEL_DIRECTION är same, bk_newer eller bk_older efter jämförelse av kärnans huvudversion i säkerhetskopian och på målet. Det styr filtret för säkra sökvägar mellan kärnor, som bara används vid bk_older, och anpassningen av inställningar som beskrivs på sidan om återställning mellan kärnversioner." + }, + { + "output": "Lista över undantagna sökvägar", + "detail": "RS_SKIP_PATHS varje väg som restaureringen inte får tillämpa. Befolkad av två mekanismer: hårdvarudrift (saknas NIC, saknas lagrings-ID, utländsk ZFS pool) och — när riktningen är bk_older - cross-kernel unsafe-paths lista." + }, + { + "output": "Plan för ommappning av nätverkskort", + "detail": "När en NIC på målet har samma MAC som en på källan men ett annat namn (typiskt efter en moderkortsbyte), registrerar kompatibilitetskontrollen en bytesplan (HB_NIC_REMAP) som kommer att skriva om /etc/network/interfaces under återställningen." + }, + { + "output": "Återställningsplan", + "detail": "Beräknas av compute_rollback_plan.sh. Listar VM, LXC och komponenter som finns på målet men saknas i säkerhetskopian. Bekräftelsen erbjuder valfri borttagning av extra gäster före omstart. Komponenter tas bort manuellt och gästborttagning kan misslyckas; en exakt matchning garanteras därför inte." + } + ], + "reportBody": "Kontrollen avger också en strukturerad rapport (HB_COMPAT_RESULTS) som kategoriseras som PASS / INFO / WARN / FAIL. WARN och FAIL-poster dyker upp i panelen före återställningen; återställningen vägrar att fortsätta först när en FAIL är närvarande att användaren inte kan lösa genom att klicka på Fortsätt." + }, + "twoModes": { + "heading": "Full återställning vs Anpassad återställning", + "intro": "Efter kompatibilitetskontrollen visas lägesvalet. Det avgör vad som tillämpas och inte hur: båda lägena använder samma process.", + "modeRows": [ + { + "mode": "Full återställning", + "detail": "Gäller varje väg i arkivet som överlever drift och cross-kernel filter. Kör också paketet installera och komponenten auto-reinstall pass. Detta är standarden och det rekommenderade valet - målet är att reproducera källan, inte plocka bitar." + }, + { + "mode": "Anpassad återställning", + "detail": "Öppnar en checklista med alla sökvägar i arkivet. Användaren väljer en delmängd. Sökvägar som blockeras av filtret mellan kärnor är grå och kan inte väljas. Paketinstallation och automatisk ominstallation av komponenter hoppas över som standard i anpassat läge, eftersom användaren begär en partiell återställning." + } + ] + }, + "pathClassification": { + "heading": "Hur vägar klassificeras", + "intro": "Varje väg som valts för återställningen klassificeras av hb_classify_path i en av tre kategorier. Kategorin bestämmer när vägen tillämpas på systemet och varför.", + "rows": [ + { + "class": "hot", + "detail": "Paths tillämpade omedelbart till körsystemet. Tjänsten som förbrukar dem plockar upp förändringen på egen hand eller vid nästa reload - ingen omstart krävs. Dessa är huvuddelen av en säkerhetskopia: /etc/ssh, /etc/apt, /etc/cron.*, /root, /usr/local/bin, allmänna servicekonfigurationsfiler etc." + }, + { + "class": "reboot", + "detail": "Sökvägar som skjuts upp till nästa start i stället för att tillämpas omedelbart av återställningen. De påverkar startkonfigurationen: genereringen av starthanteraren läser /etc/default/grub, monteringar använder /etc/fstab och modulladdning /etc/modules. De väntande filerna tillämpas efter omstart och nödvändiga startfiler genereras sedan om. Exempel: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + }, + { + "class": "dangerous", + "detail": "Paths som är INTE tillämpas på löpningssystem - en levande skriva kan korrumpera tillstånd eller släppa den aktiva anslutningen. Dessa är iscensatta i den väntande uppsättningen och skrivna av post-boot-sändaren efter omstarten, när klustret är upp men systemet är ännu inte helt i bruk. Exempel: /etc/pve (pmxcfs är en FUSE-montering med aktiv klusterkonfiguration), /var/lib/pve-cluster (levande klusterdata), /etc/network (kan omkonfigurera själva gränssnittet som användaren är ansluten på över SSH och släppa sessionen)." + } + ] + }, + "fullFlow": { + "heading": "Fullständig återställning arbetsflöde", + "intro": "Den kompletta pipeline från arkivval till en återställd arbetsvärd. Varje steg matar nästa, staten skriven av tidigare stadier konsumeras av senare.", + "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" + }, + "pendingMachinery": { + "heading": "Mekanismen för uppskjuten återställning", + "intro": "Paths som klassificeras som reboot eller dangerous, och hydrering skriver, iscensätts för nästa start istället för att appliceras live. Detta görs genom en liten, självinnehållen uppsättning filer under /var/lib/proxmenux/pending-restore/:", + "rows": [ + { + "file": "apply-on-boot.list", + "content": "En relativ sökväg per rad: exakt de sökvägar som apply_pending_restore.sh tillämpar från förberett rootfs. Filen visar vad som ändras vid nästa start." + }, + { + "file": "plan.env", + "content": "Miljövariabler som hämtats från on-boot script: restaurera ID, kompatibilitetsflaggor (HB_COMPAT_CROSS_VERSION, HB_COMPAT_KERNEL_DIRECTION, HB_HYDRATION_APPLIED), Rollback opt-in flagga, kluster alternativ." + }, + { + "file": "rs-skip-paths.txt", + "content": "Den slutliga RS_SKIP_PATHS-listan, kvarstår så apply_pending_restore.sh tillämpar samma uteslutningar efter omstart som beräknades under det interaktiva steget. Förhindrar driftdrabbade eller kors-kernel-osäkra vägar från att återställas vid starttid." + }, + { + "file": "rootfs/", + "content": "Själva förberedda filerna: exakt de byte som ska skrivas. De lagras på samma filsystem som / så att rsync vid start går snabbt och inte kräver åtkomst till extern lagring." + } + ], + "unitBody": "Systemd-enheten proxmenux-restore-onboot.service aktiveras i slutet av det interaktiva steget. Engångstjänsten körs tidigt vid nästa start, anropar apply_pending_restore.sh och inaktiverar sedan sig själv. Villkoret ConditionPathExists=/var/lib/proxmenux/pending-restore/state gör att inget körs vid starter utan väntande återställning." + }, + "postbootDispatcher": { + "heading": "Post-boot dispatcher - apply_cluster_postboot.sh", + "intro": "Där det interaktiva steget slutar och där den faktiska värdreproduktionen sker. apply_cluster_postboot.sh installeras som en andra one-shot systemd-enhet (proxmenux-apply-cluster-postboot.service) vars After=/Wants=-mål säkerställer att det körs först efter att pve-cluster och nätverk-online är uppe. Det är här värdsynliga återställningsåtgärder landar.", + "tasks": [ + { + "task": "Applicera /etc/pve", + "detail": "/etc/pve är ett levande pmxcfs FUSE-fäste - det kan inte skrivas till på tidig start. Dispatcher kopierar filer från de förberedda rootfs till live /etc/pve när klusterfilsystemet är upp, en fil i taget, utan att starta om pve-kluster. Den fångade /var/lib/pve-cluster/config.db från backupen (eller den befordrade config.db.raw-fallback) materialiseras med systemctl stop pve-cluster → atomfilkopia → systemctl start pve-cluster mönster, så pmxcfs återläser det återställda tillståndet på vägen tillbaka upp." + }, + { + "task": "Rebuild initramfs och bootloader", + "detail": "Kör update-initramfs -u -k all över varje installerad kärna, sedan antingen update-grub (GRUB-installationer) eller proxmox-boot-tool refresh (systemd-start / ZFS-installationer). Skippades om det interaktiva steget fastställde ingenting förändrades i de vägar som påverkar dessa verktyg." + }, + { + "task": "Komponent auto-reinstallation", + "detail": "Läser återställd components_status.json och går igenom de installationsprogram som stöds (nvidia_driver, coral_driver, amdgpu_top, intel_gpu_tools). Varje valt program körs med --auto-reinstall, läser registrerat tillstånd och installerar för målmiljön, med ombyggnad av kärnmoduler där det behövs. Arbetet väntar till efter omstart för att använda målets då aktiva kärna. Enskilda fel loggas och stoppar inte nästa komponent." + }, + { + "task": "Rimlighetskontroll vid uppstart", + "detail": "Innan du skjuter slutförandet av meddelandet, verifierar att proxmox-boot-tool status visar en konfigurerad ESP, har varje /boot/vmlinuz-* en matchande /lib/modules/<ver>-katalog och /vmlinuz löser. Varje inkonsistens dyker upp i meddelandet istället för att vara dold." + }, + { + "task": "Slutförande anmälan", + "detail": "Skickar Host restore finished-eventet genom hb_notify_lifecycle. Inkluderar total varaktighet, tillämpad vägräkning, sanity-check varningar om någon, och en länk till loggen på /var/log/proxmenux/proxmenux-cluster-postboot-*.log. Om meddelanden inte är konfigurerade är händelsen tyst - loggen registrerar fortfarande allt." + } + ] + }, + "liveProgress": { + "heading": "Aktuellt förlopp på fliken Säkerhetskopior i Monitor", + "body": "Efter omstarten av Backups-fliken ProxMenux Monitor gör ett live post-restore-kort som återspeglar tillståndet proxmenux-apply-cluster-postboot.service som det körs. Kortet drivs av /var/lib/proxmenux/restore-state.json, som avsändaren uppdaterar på varje milstolpe (tillämplig klusterkonfig, återuppbygga initramfs, uppdatera bootloader, per-component ominstallera, start sanity check, slutföra).", + "fields": [ + { + "name": "Statusmärke", + "detail": "Något av tillstånden Återställning pågår, Återställning klar eller Återställning misslyckades. Kortet läser tillståndsfilen varannan sekund under körning och var 30:e sekund efter avslut." + }, + { + "name": "Förloppsindikator och stegräknare", + "detail": "Visar N/M steps med namnet på det aktuella steget. Under återställningen beräknas en uppskattad tid från slutförda steg och förfluten tid." + }, + { + "name": "Komponentlista", + "detail": "En rad per drivrutin installeras om (NVIDIA, Intel GPU verktyg, AMD verktyg, Coral TPU) med installing / ok / failed plus en länk till per-komponent logga på /var/log/proxmenux/component-*.log." + }, + { + "name": "Datapool import", + "detail": "Blocket data_pools_import visar fem färgade rader: Importerade, Tvingade (med -f för ett annat hostid), Överhoppade, delvis närvarande (bara vissa diskar finns), Överhoppade, saknade (inga diskar finns) och Misslyckade. Tillståndet sparas i /var/lib/proxmenux/restore-state.json och hela körningsloggen i /var/log/proxmenux/restore-datapools-<timestamp>.log." + }, + { + "name": "Varningar om startkonfigurationen", + "detail": "Processen kontrollerar saknade /lib/modules/<kernel>-kataloger, saknad ESP-konfiguration och /vmlinuz-länkar utan giltigt mål. Varningar visas här i en färgad ruta." + }, + { + "name": "Återställningsdelta", + "detail": "Listor VMs, LXCs och komponenter som finns på målet men inte var i den återställda backupen - samma poster som uppstod i förväg destruktiv återgångsdialog. Varje rad bär manuell rensning kommandot." + }, + { + "name": "Loggens slut", + "detail": "De sista 600-linjerna i proxmenux-cluster-postboot-<ts>.log, med ett Endast problem-filter som håller bara linjer som matchar error, warning, failed, ✗ eller traceback." + } + ], + "dismissBody": "När återställningen är klar eller misslyckad fäller knappen Dölj ihop kortet. Tillståndsfilen bevaras och Historik öppnar denna och tidigare återställningar igen. De senaste 20 körningarna arkiveras under /var/lib/proxmenux/restore-history/.", + "imageAlt": "Detaljdialogen för återställning i ProxMenux Monitor under körning: blå statusmarkering, aktuellt steg Bygger om initramfs, uppskattad återstående tid, delvis fylld förloppsindikator och aktuella loggrader.", + "imageCaption": "Detaljerna modal medan post-boot-avsändaren fortfarande kör - emblem, aktuellt steg, tid kvar och levande loggsvans.", + "detailsImageAlt": "Samma detaljer modal efter återställningen har avslutats, med den gröna återställningen fullständiga märket, den totala löptiden (0m53s), en fullt fylld 6 / 6 framstegsfältet, den tomma Rollback delta och den arkiverade postboot log.", + "detailsImageCaption": "Samma modal när körningen har avslutats - emblem, total varaktighet, fylld progress bar och arkiverad postboot logg." + }, + "postbootExample": { + "heading": "Hur post-boot ser ut på konsolen", + "body": "På den fysiska konsolen avslutas en process som lyckas med [ OK ] Finished proxmenux-apply-cluster-postboot.service, ofta nära OK för multi-user.target och graphical.target. Detta markerar att processen har avslutats. Enskilda komponentfel eller startvarningar kan ändå ha registrerats. Kontrollera komponenternas tillstånd och loggarna i Monitor innan värden betraktas som helt återställd.", + "imageAlt": "Proxmox fysiska konsol med '[ OK ] Finished proxmenux-apply-cluster-postboot.service - ProxMenux Apply Cluster Configs (post-boot).', följt av OK för multi-user.target och graphical.target och med inloggningsraden ovanför.", + "imageCaption": "Fysisk konsol när processen avslutats. 'Finished proxmenux-apply-cluster-postboot.service' markerar slutet, vilket även 'Host restore finished' visar i Monitor. Komponentresultat och varningar behöver fortfarande granskas." + }, + "tenMinutes": { + "heading": "Varför de senaste tio minuterna är viktigt", + "intro": "Omstarten själv tar sekunder, men post-boot-avsändaren spenderar cirka tio minuter efter återställningen. Under detta fönster är värden nåbara och inloggningsarbeten, men vissa tjänster (främst GPU-drivrutinberoende) är ännu inte tillgängliga. Tidsuppdelning för en typisk Proxmox-värd med NVIDIA + Coral installerad:", + "rows": [ + { + "stage": "Boot + pve-cluster redo", + "time": "~30 s", + "detail": "Standard Proxmox boot. SSH, webb-UI och inloggning är tillgängliga i slutet av detta skede." + }, + { + "stage": "Applicera /etc/pve till pmxcfs", + "time": "~10 s", + "detail": "Snabba - små konfigfiler kopierade en efter en till live klusterfilsystemet." + }, + { + "stage": "Rebuild initramfs över kärnor", + "time": "3–5 min", + "detail": "update-initramfs -u -k all bygger en initramfs avbildning per installerad kärna. Större delen av väntetiden." + }, + { + "stage": "Bygg om starthanterarens konfiguration", + "time": "10–30 s", + "detail": "update-grub eller proxmox-boot-tool refresh. Snabbt även på ZFS." + }, + { + "stage": "NVIDIA ominstallation av drivrutin (om tillämpligt)", + "time": "5–10 min", + "detail": "Ladda ner den inspelade drivrutinsversionen, sammanställer DKMS-modulerna mot den nuvarande kärnan, tillämpar ProxMenux-patchen om källan hade den. Längsta enskilda uppgift." + }, + { + "stage": "Ominstallation av Coral och andra komponenter", + "time": "3–5 min", + "detail": "DKMS-kompilering för Coral, apt install för intel-gpu-tools samt nedladdning och installation av .deb för amdgpu_top." + }, + { + "stage": "Startkontroll och meddelande", + "time": "~2 s", + "detail": "Kräver få resurser. Meddelandet informerar användaren så snart körningen har avslutats." + } + ], + "outroBody": "Under denna tid kan verktyg saknas efter inloggning (nvidia-smi hittas inte, coral identifieras inte), eftersom ominstallationen fortfarande körs i bakgrunden. Slutmeddelandet markerar arbetets slut; kontrollera komponentresultat, varningar och loggar för att skilja lyckade åtgärder från enskilda fel." + }, + "destructiveRollback": { + "heading": "Den valfria destruktiva rollback", + "body": "Återställningen är additiv som standard: extra VM, LXC och komponenter blir kvar. Vid skillnader erbjuder bekräftelsen Kör destruktiv återställning?, med Nej som standard. Ja anropar _rs_execute_rollback före omstart för att försöka ta bort de listade extra VM:erna och LXC:erna. Komponenter markeras för manuell avinstallation eftersom automatisk avinstallation saknas. Fel vid borttagning rapporteras och processen fortsätter, så en exakt matchning garanteras inte. Granska namn och VMID/CTID före detta destruktiva val." + }, + "logs": { + "heading": "Var loggarna finns", + "rows": [ + { + "log": "/var/log/proxmenux/restore-YYYYMMDD_HHMMSS.log", + "detail": "Skrivs under det interaktiva steget: kompatibilitetsresultat, avvikelsefilter, anpassningsplan, utdata från direkt tillämpning och förberedelse av uppskjutna ändringar samt paketinstallation." + }, + { + "log": "/var/log/proxmenux/apply-pending-YYYYMMDD_HHMMSS.log", + "detail": "Skrivs av apply_pending_restore.sh tidigt vid start: inläsning av plan.env, genomgång av apply-on-boot och filtrering av undantagna sökvägar." + }, + { + "log": "/var/log/proxmenux/proxmenux-cluster-postboot-YYYYMMDD_HHMMSS.log", + "detail": "Skrivs av apply_cluster_postboot.sh: tillämpning av pve-cluster-konfiguration, utdata från initramfs och starthanterare, komponenternas installationsutdata, startkontroll och meddelandeinnehåll." + }, + { + "log": "/var/log/proxmenux/component--YYYYMMDD_HHMMSS.log", + "detail": "En logg per komponentinstallationsprogram (nvidia, coral, etc.) som kördes i post-boot-passet. Användbart när en specifik komponents ominstallation misslyckades och användaren behöver verktygets egen utdata." + }, + { + "log": "/var/log/proxmenux/restore-datapools-YYYYMMDD_HHMMSS.log", + "detail": "Skriven av _rs_import_data_pools. Innehåller: uppräkning av icke-rotpooler från det manifesterade, perpoolresultatet (importerad rent, importerad med -f för ett annat hostid, hoppad på grund av saknade diskar eller misslyckades), och råutdata av varje zpool import samtal." + } + ] + }, + "whereNext": { + "heading": "Vart ska man gå nästa", + "items": [ + { + "label": "Återställning mellan kärnversioner", + "href": "/docs/backup-restore/cross-kernel", + "tail": " - det riktningsmedvetna säkra filtret och det hydreringspass som åberopats när målkärnan skiljer sig från säkerhetskopieringen." + }, + { + "label": "Hur det fungerar", + "href": "/docs/backup-restore/how-it-works", + "tail": " - arkivlayouten, manifestet och appliceringsinventeringen som återställningen förbrukar." + }, + { + "label": "Planerade jobb", + "href": "/docs/backup-restore/scheduled-jobs", + "tail": " - det obevakade flödet som producerar arkiven denna sida förbrukar." + } + ] + } +} diff --git a/web/messages/sv/docs/backup-restore/scheduled-jobs.json b/web/messages/sv/docs/backup-restore/scheduled-jobs.json new file mode 100644 index 00000000..ae00c752 --- /dev/null +++ b/web/messages/sv/docs/backup-restore/scheduled-jobs.json @@ -0,0 +1,152 @@ +{ + "meta": { + "title": "Schemalagda jobb — timers, kopplingsläge, bevarande | ProxMenux", + "description": "Schemalagda ProxMenux-jobb för säkerhetskopiering av värden. Två sätt att skapa jobb (egen systemd-timer eller koppling till ett befintligt PVE vzdump-jobb), bevaranderegler per jobb via proxmox-backup-client, Borg eller lokal rensning, filer under /var/lib/proxmenux/backup-jobs och körningsskriptet som skapar samma arkiv som det interaktiva flödet.", + "ogTitle": "ProxMenux Backup - schemalagda jobb", + "ogDescription": "Obevakade schemalagda värdsäkerhetskopior med kopplingsläge, bevaranderegler och samma tre destinationer som det interaktiva flödet.", + "twitterTitle": "Planerade jobb | ProxMenux", + "twitterDescription": "Obevakade schemalagda värdsäkerhetskopieringsjobb med kopplingsläge och bevaranderegler." + }, + "header": { + "title": "Planerade jobb", + "description": "Obevakade jobb för säkerhetskopiering av värden. Två modeller: ett nytt oberoende jobb med eget schema eller ett jobb kopplat till ett befintligt PVE vzdump-jobb som ärver dess schema och bevaranderegler. Båda skapar samma arkiv som det interaktiva flödet.", + "section": "Säkerhetskopiering och återställning" + }, + "intro": { + "title": "De två modellerna för schemalagda jobb", + "body": "Ett schemalagt jobb kan skapas efter en av två modeller:", + "modelsList": [ + "Nytt oberoende jobb - ProxMenux definierar själva arbetsschemat med sin egen systemd timer, oberoende av någon annan uppgift på värden. Kompatibel med alla tre destinationer: Lokal, PBS och Borg.", + "Koppla till ett befintligt PVE vzdump-jobb — jobbet har inget eget schema; det körs automatiskt när det överordnade vzdump-jobbet säkerhetskopierar värdens VM:ar och LXC:er. Det ärver schemat och bevarandereglerna. Stöder lokalt mål och PBS (Borg stöds inte eftersom PVE saknar en inbyggd schemaläggare för Borg)." + ] + }, + "attachBadge": { + "title": "Kopplingsläge — rekommenderas när ett PVE vzdump-jobb redan finns", + "body": "Om ett PVE vzdump-jobb redan är konfigurerat för nodens VM:ar och LXC:er körs den kopplade värdsäkerhetskopieringen efter gästernas säkerhetskopiering, i samma säkerhetskopieringscykel. Vid återställning kommer gästkonfigurationerna från värdsäkerhetskopian (under /etc/pve) och gästdiskarna från cykelns vzdump-kopior. Detta underlättar samordnad återställning av hela noden men är ingen atomär ögonblicksbild: ändringar under cykeln kan ge skillnader mellan värdkonfiguration och gästernas disktillstånd." + }, + "frequencyBadge": { + "title": "Rekommenderad frekvens", + "body": "Säkerhetskopiera värden ofta för att maximera kompatibiliteten med en framtida återställning. Ju närmare säkerhetskopian ligger värdens aktuella tillstånd, desto färre avvikelser i konfiguration, paket och komponenter måste återställningen hantera." + }, + "modes": { + "heading": "De två lägena", + "rows": [ + { + "mode": "Nytt schemalagt jobb", + "backends": "Lokalt, PBS, Borg", + "schedule": "Egen OnCalendar uttryck (systemd kalendersyntax - t.ex. daily, Mon..Fri 03:00).", + "retention": "Efterfrågas separat: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. Tillämpad av körningsskriptet efter varje framgångsrik backup." + }, + { + "mode": "Bifoga till ett PVE vzdump jobb", + "backends": "Lokal, PBS (Borg har ingen PVE-sida schemaläggning)", + "schedule": "Ärvd från föräldern PVE jobb. Ingen systemd-timer installeras på ProxMenux-sidan.", + "retention": "Ärvd från förälderns prune-backups-konfiguration (mappade en-till-en till körningsskriptets KEEP_*-variabler via hb_pve_prune_to_keep_env)." + } + ] + }, + "attachDetail": { + "heading": "Så fungerar kopplingsläget", + "intro": "PVE skriver vzdump-jobb till /etc/pve/jobs.cfg, med ett avsnitt per jobb som anger lagringen för VM- och LXC-kopiorna. Kopplingsläget kräver en backend som ProxMenux stöder (lokalt eller PBS). Värdsäkerhetskopieringen körs via job-end-hooken efter att gästernas säkerhetskopieringsjobb avslutats.", + "steps": [ + { + "step": "1", + "detail": "Under jobbskapande listar ProxMenux kompatibla förälder PVE-uppgifter via hb_pve_list_vzdump_jobs_for_backend. Användaren väljer en." + }, + { + "step": "2", + "detail": "Jobbets .env är skrivet med PVE_PARENT_JOB, PVE_STORAGE och de ärvda KEEP_* värdena; ingen systemd timer skapas." + }, + { + "step": "3", + "detail": "hb_install_vzdump_hook registrerar en skripthook i /etc/vzdump.conf. I job-end-fasen för varje vzdump-jobb jämförs mottaget $STOREID med PVE_STORAGE för varje aktiverat kopplat jobb, och körningsskriptet startas för matchande jobb. Matchningen görs efter lagring, inte efter det valda överordnade jobbets ID." + }, + { + "step": "4", + "detail": "Arkivet sparas i samma lagring som vzdump-kopiorna: path/dump/ för lokalt mål eller PBS-arkivlagret som konfigurerats i PVE-lagringsposten." + } + ], + "outroBody": "Kopplingsläget har ingen egen timer. Om det valda överordnade PVE-jobbet inaktiveras eller tas bort stoppas dess utlösning, men ett annat vzdump-jobb med samma lagring kan fortfarande starta värdsäkerhetskopieringen. Inaktivera eller ta bort själva ProxMenux-jobbet för att förhindra det. Vid inaktivering ligger jobbposten kvar och kan senare aktiveras eller kopplas igen." + }, + "storageLayout": { + "heading": "Filer som utgör ett jobb", + "intro": "Varje schemalagt jobb beskrivs fullständigt av tre eller fyra filer på disken. Att läsa dem ger hela konfigurationen av jobbet utan att förlita sig på gränssnittet.", + "rows": [ + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.env", + "content": "Backend, backup-ID eller destination, schema (nyt läge) eller PVE-förälder (Attach-läge), aktiverad flagga, lagring KEEP_*-värden, referenspekare." + }, + { + "path": "/var/lib/proxmenux/backup-jobs/JOB_ID.paths", + "content": "En absolut sökväg per rad — valet från profilen fastställs när jobbet skapas. Om filen redigeras används det nya valet nästa gång timern löser ut." + }, + { + "path": "/etc/systemd/system/proxmenux-backup-JOB_ID.timer + .service", + "content": "Nytt läge bara. Tjänsten anropar run_scheduled_backup.sh JOB_ID. Timern schemalägger det med Persistent=true (missade körningar utförs vid nästa start) och en liten RandomizedDelaySec=120 att sprida belastning när flera jobb delar samma OnCalendar uttryck." + }, + { + "path": "/etc/vzdump.conf script-hook", + "content": "Fäst läge bara. Installerad en gång av hb_install_vzdump_hook; matchar varje bifogat jobb PVE_STORAGE mot $STOREID PVE passerar till krokskriptet." + } + ] + }, + "runner": { + "heading": "Vad ett jobb gör när det startar", + "intro": "Varje jobb – oavsett om det är nymodell eller bifogad – kör samma trestegssekvens:", + "steps": [ + "Förbered säkerhetskopian. Läser jobbkonfigurationen (destination, profil, vägar) och monterar arkivträdet exakt på samma sätt som det interaktiva flödet gör. Resultatet är samma arkiv som en manuell säkerhetskopia med dessa inställningar skulle producera.", + "Skriv till destinationen. Laddar eller skriver arkivet till den konfigurerade destinationen - en lokal .tar.zst fil, en PBS backup, eller ett Borg-arkiv - med exakt samma verktyg och referenser en manuell säkerhetskopia till samma destination skulle använda.", + "Tillämpa bevaranderegler. Ta bort gamla säkerhetskopior från destinationen, hålla keep-last / keep-daily / keep-weekly räknas konfigurerade på jobbet. Pruning utförs av själva destinationen: PBS tillämpar sina egna bevaranderegler, Borg kör borg prune, och för Local ProxMenux raderar filerna som faller utanför keep-last-fönstret." + ] + }, + "management": { + "heading": "Hantera jobb", + "intro": "Schemaläggarmenyn (Scripts TUI) och fliken Monitor Backups avslöjar samma åtgärder på något jobb.", + "rows": [ + { + "action": "Kör nu", + "detail": "Anropar körningsskriptet omedelbart utan att vänta på timern eller vzdump-hooken. Användbart för att verifiera konfigurationen utan att vänta till nästa schemalagda körning." + }, + { + "action": "Aktivera / Inaktivera", + "detail": "Nytt läge: systemctl enable/disable --now timern. Bifoga läge: vänder ENABLED flaggan i jobbenv - krokskriptet respekterar den vid nästa PVE-körning." + }, + { + "action": "Redigera", + "detail": "Öppnar åter dialogerna för destination, schema, profil och bevarande och skriver om jobbfilerna. Jobb-ID:t behålls." + }, + { + "action": "Ta bort", + "detail": "Tar bort jobbets env-fil, sökvägsfilen och systemd-timern med tjänsten (nytt läge) samt inaktiverar hookkopplingen (kopplingsläge). Arkiv som redan finns på destinationen påverkas inte." + }, + { + "action": "Visa logg", + "detail": "Strömmar /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log — en loggfil per körning. Körningsskriptet sänder också ut en kompakt statusrad till journald under tjänsten systemd." + } + ] + }, + "notifications": { + "heading": "Aviseringar", + "body": "Varje schemalagd körning utlöser samma hb_notify_lifecycle händelser som det interaktiva flödet (start, complete, fail). Om meddelandekanaler är konfigurerade i Monitor, obevakade jobb visar sina resultat på samma sätt manuella säkerhetskopior gör - en användare behöver inte kontrollera loggen för att veta om ett jobb lyckades." + }, + "whereNext": { + "heading": "Nästa steg", + "items": [ + { + "label": "Skapa backups", + "href": "/docs/backup-restore/creating-backups", + "tail": " - det interaktiva flödet som delar backend med schemaläggaren." + }, + { + "label": "Destinationer", + "href": "/docs/backup-restore/destinations", + "tail": " — per-backend konfiguration som används av både det interaktiva flödet och schemaläggaren." + }, + { + "label": "Återställande", + "href": "/docs/backup-restore/restoring", + "tail": " — flödet som använder de säkerhetskopior som jobben skapar." + } + ] + } +} From 11b1c895f4d587c8d91579e76a3bb77df8e2006c Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:08:53 +0200 Subject: [PATCH 19/73] docs: review post-install documentation in all seven translations --- .github/workflows/test-i18n.yml | 10 + .../docs/post-install/storage/page.tsx | 4 +- .../de/docs/post-install/automated.json | 172 +++++++++++ .../de/docs/post-install/basic-settings.json | 240 ++++++++++++++++ .../de/docs/post-install/customizable.json | 106 +++++++ .../de/docs/post-install/customization.json | 74 +++++ web/messages/de/docs/post-install/index.json | 106 +++++++ .../de/docs/post-install/monitoring.json | 56 ++++ .../de/docs/post-install/network.json | 128 +++++++++ .../de/docs/post-install/optional.json | 177 ++++++++++++ .../de/docs/post-install/performance.json | 61 ++++ .../de/docs/post-install/security.json | 57 ++++ .../de/docs/post-install/storage.json | 167 +++++++++++ web/messages/de/docs/post-install/system.json | 133 +++++++++ .../de/docs/post-install/uninstall.json | 271 ++++++++++++++++++ .../de/docs/post-install/updates.json | 112 ++++++++ .../de/docs/post-install/virtualization.json | 116 ++++++++ .../en/docs/post-install/automated.json | 10 +- .../en/docs/post-install/basic-settings.json | 4 +- .../en/docs/post-install/customizable.json | 10 +- .../en/docs/post-install/customization.json | 2 +- .../en/docs/post-install/monitoring.json | 4 +- .../en/docs/post-install/network.json | 6 +- .../en/docs/post-install/optional.json | 6 +- .../en/docs/post-install/performance.json | 2 +- .../en/docs/post-install/storage.json | 20 +- web/messages/en/docs/post-install/system.json | 10 +- .../en/docs/post-install/uninstall.json | 14 +- .../en/docs/post-install/updates.json | 8 +- .../es/docs/post-install/automated.json | 70 ++--- .../es/docs/post-install/basic-settings.json | 42 +-- .../es/docs/post-install/customizable.json | 54 ++-- .../es/docs/post-install/customization.json | 32 +-- web/messages/es/docs/post-install/index.json | 30 +- .../es/docs/post-install/monitoring.json | 18 +- .../es/docs/post-install/network.json | 36 +-- .../es/docs/post-install/optional.json | 38 +-- .../es/docs/post-install/performance.json | 16 +- .../es/docs/post-install/security.json | 12 +- .../es/docs/post-install/storage.json | 50 ++-- web/messages/es/docs/post-install/system.json | 22 +- .../es/docs/post-install/uninstall.json | 88 +++--- .../es/docs/post-install/updates.json | 42 +-- .../es/docs/post-install/virtualization.json | 24 +- .../fr/docs/post-install/automated.json | 172 +++++++++++ .../fr/docs/post-install/basic-settings.json | 240 ++++++++++++++++ .../fr/docs/post-install/customizable.json | 106 +++++++ .../fr/docs/post-install/customization.json | 74 +++++ web/messages/fr/docs/post-install/index.json | 106 +++++++ .../fr/docs/post-install/monitoring.json | 56 ++++ .../fr/docs/post-install/network.json | 128 +++++++++ .../fr/docs/post-install/optional.json | 177 ++++++++++++ .../fr/docs/post-install/performance.json | 61 ++++ .../fr/docs/post-install/security.json | 57 ++++ .../fr/docs/post-install/storage.json | 167 +++++++++++ web/messages/fr/docs/post-install/system.json | 133 +++++++++ .../fr/docs/post-install/uninstall.json | 271 ++++++++++++++++++ .../fr/docs/post-install/updates.json | 112 ++++++++ .../fr/docs/post-install/virtualization.json | 116 ++++++++ .../it/docs/post-install/automated.json | 172 +++++++++++ .../it/docs/post-install/basic-settings.json | 240 ++++++++++++++++ .../it/docs/post-install/customizable.json | 106 +++++++ .../it/docs/post-install/customization.json | 74 +++++ web/messages/it/docs/post-install/index.json | 106 +++++++ .../it/docs/post-install/monitoring.json | 56 ++++ .../it/docs/post-install/network.json | 128 +++++++++ .../it/docs/post-install/optional.json | 177 ++++++++++++ .../it/docs/post-install/performance.json | 61 ++++ .../it/docs/post-install/security.json | 57 ++++ .../it/docs/post-install/storage.json | 167 +++++++++++ web/messages/it/docs/post-install/system.json | 133 +++++++++ .../it/docs/post-install/uninstall.json | 271 ++++++++++++++++++ .../it/docs/post-install/updates.json | 112 ++++++++ .../it/docs/post-install/virtualization.json | 116 ++++++++ .../pt/docs/post-install/automated.json | 172 +++++++++++ .../pt/docs/post-install/basic-settings.json | 240 ++++++++++++++++ .../pt/docs/post-install/customizable.json | 106 +++++++ .../pt/docs/post-install/customization.json | 74 +++++ web/messages/pt/docs/post-install/index.json | 106 +++++++ .../pt/docs/post-install/monitoring.json | 56 ++++ .../pt/docs/post-install/network.json | 128 +++++++++ .../pt/docs/post-install/optional.json | 177 ++++++++++++ .../pt/docs/post-install/performance.json | 61 ++++ .../pt/docs/post-install/security.json | 57 ++++ .../pt/docs/post-install/storage.json | 167 +++++++++++ web/messages/pt/docs/post-install/system.json | 133 +++++++++ .../pt/docs/post-install/uninstall.json | 271 ++++++++++++++++++ .../pt/docs/post-install/updates.json | 112 ++++++++ .../pt/docs/post-install/virtualization.json | 116 ++++++++ .../sk/docs/post-install/automated.json | 172 +++++++++++ .../sk/docs/post-install/basic-settings.json | 240 ++++++++++++++++ .../sk/docs/post-install/customizable.json | 106 +++++++ .../sk/docs/post-install/customization.json | 74 +++++ web/messages/sk/docs/post-install/index.json | 106 +++++++ .../sk/docs/post-install/monitoring.json | 56 ++++ .../sk/docs/post-install/network.json | 128 +++++++++ .../sk/docs/post-install/optional.json | 177 ++++++++++++ .../sk/docs/post-install/performance.json | 61 ++++ .../sk/docs/post-install/security.json | 57 ++++ .../sk/docs/post-install/storage.json | 167 +++++++++++ web/messages/sk/docs/post-install/system.json | 133 +++++++++ .../sk/docs/post-install/uninstall.json | 271 ++++++++++++++++++ .../sk/docs/post-install/updates.json | 112 ++++++++ .../sk/docs/post-install/virtualization.json | 116 ++++++++ .../sv/docs/post-install/automated.json | 172 +++++++++++ .../sv/docs/post-install/basic-settings.json | 240 ++++++++++++++++ .../sv/docs/post-install/customizable.json | 106 +++++++ .../sv/docs/post-install/customization.json | 74 +++++ web/messages/sv/docs/post-install/index.json | 106 +++++++ .../sv/docs/post-install/monitoring.json | 56 ++++ .../sv/docs/post-install/network.json | 128 +++++++++ .../sv/docs/post-install/optional.json | 177 ++++++++++++ .../sv/docs/post-install/performance.json | 61 ++++ .../sv/docs/post-install/security.json | 57 ++++ .../sv/docs/post-install/storage.json | 167 +++++++++++ web/messages/sv/docs/post-install/system.json | 133 +++++++++ .../sv/docs/post-install/uninstall.json | 271 ++++++++++++++++++ .../sv/docs/post-install/updates.json | 112 ++++++++ .../sv/docs/post-install/virtualization.json | 116 ++++++++ 119 files changed, 12203 insertions(+), 337 deletions(-) create mode 100644 web/messages/de/docs/post-install/automated.json create mode 100644 web/messages/de/docs/post-install/basic-settings.json create mode 100644 web/messages/de/docs/post-install/customizable.json create mode 100644 web/messages/de/docs/post-install/customization.json create mode 100644 web/messages/de/docs/post-install/index.json create mode 100644 web/messages/de/docs/post-install/monitoring.json create mode 100644 web/messages/de/docs/post-install/network.json create mode 100644 web/messages/de/docs/post-install/optional.json create mode 100644 web/messages/de/docs/post-install/performance.json create mode 100644 web/messages/de/docs/post-install/security.json create mode 100644 web/messages/de/docs/post-install/storage.json create mode 100644 web/messages/de/docs/post-install/system.json create mode 100644 web/messages/de/docs/post-install/uninstall.json create mode 100644 web/messages/de/docs/post-install/updates.json create mode 100644 web/messages/de/docs/post-install/virtualization.json create mode 100644 web/messages/fr/docs/post-install/automated.json create mode 100644 web/messages/fr/docs/post-install/basic-settings.json create mode 100644 web/messages/fr/docs/post-install/customizable.json create mode 100644 web/messages/fr/docs/post-install/customization.json create mode 100644 web/messages/fr/docs/post-install/index.json create mode 100644 web/messages/fr/docs/post-install/monitoring.json create mode 100644 web/messages/fr/docs/post-install/network.json create mode 100644 web/messages/fr/docs/post-install/optional.json create mode 100644 web/messages/fr/docs/post-install/performance.json create mode 100644 web/messages/fr/docs/post-install/security.json create mode 100644 web/messages/fr/docs/post-install/storage.json create mode 100644 web/messages/fr/docs/post-install/system.json create mode 100644 web/messages/fr/docs/post-install/uninstall.json create mode 100644 web/messages/fr/docs/post-install/updates.json create mode 100644 web/messages/fr/docs/post-install/virtualization.json create mode 100644 web/messages/it/docs/post-install/automated.json create mode 100644 web/messages/it/docs/post-install/basic-settings.json create mode 100644 web/messages/it/docs/post-install/customizable.json create mode 100644 web/messages/it/docs/post-install/customization.json create mode 100644 web/messages/it/docs/post-install/index.json create mode 100644 web/messages/it/docs/post-install/monitoring.json create mode 100644 web/messages/it/docs/post-install/network.json create mode 100644 web/messages/it/docs/post-install/optional.json create mode 100644 web/messages/it/docs/post-install/performance.json create mode 100644 web/messages/it/docs/post-install/security.json create mode 100644 web/messages/it/docs/post-install/storage.json create mode 100644 web/messages/it/docs/post-install/system.json create mode 100644 web/messages/it/docs/post-install/uninstall.json create mode 100644 web/messages/it/docs/post-install/updates.json create mode 100644 web/messages/it/docs/post-install/virtualization.json create mode 100644 web/messages/pt/docs/post-install/automated.json create mode 100644 web/messages/pt/docs/post-install/basic-settings.json create mode 100644 web/messages/pt/docs/post-install/customizable.json create mode 100644 web/messages/pt/docs/post-install/customization.json create mode 100644 web/messages/pt/docs/post-install/index.json create mode 100644 web/messages/pt/docs/post-install/monitoring.json create mode 100644 web/messages/pt/docs/post-install/network.json create mode 100644 web/messages/pt/docs/post-install/optional.json create mode 100644 web/messages/pt/docs/post-install/performance.json create mode 100644 web/messages/pt/docs/post-install/security.json create mode 100644 web/messages/pt/docs/post-install/storage.json create mode 100644 web/messages/pt/docs/post-install/system.json create mode 100644 web/messages/pt/docs/post-install/uninstall.json create mode 100644 web/messages/pt/docs/post-install/updates.json create mode 100644 web/messages/pt/docs/post-install/virtualization.json create mode 100644 web/messages/sk/docs/post-install/automated.json create mode 100644 web/messages/sk/docs/post-install/basic-settings.json create mode 100644 web/messages/sk/docs/post-install/customizable.json create mode 100644 web/messages/sk/docs/post-install/customization.json create mode 100644 web/messages/sk/docs/post-install/index.json create mode 100644 web/messages/sk/docs/post-install/monitoring.json create mode 100644 web/messages/sk/docs/post-install/network.json create mode 100644 web/messages/sk/docs/post-install/optional.json create mode 100644 web/messages/sk/docs/post-install/performance.json create mode 100644 web/messages/sk/docs/post-install/security.json create mode 100644 web/messages/sk/docs/post-install/storage.json create mode 100644 web/messages/sk/docs/post-install/system.json create mode 100644 web/messages/sk/docs/post-install/uninstall.json create mode 100644 web/messages/sk/docs/post-install/updates.json create mode 100644 web/messages/sk/docs/post-install/virtualization.json create mode 100644 web/messages/sv/docs/post-install/automated.json create mode 100644 web/messages/sv/docs/post-install/basic-settings.json create mode 100644 web/messages/sv/docs/post-install/customizable.json create mode 100644 web/messages/sv/docs/post-install/customization.json create mode 100644 web/messages/sv/docs/post-install/index.json create mode 100644 web/messages/sv/docs/post-install/monitoring.json create mode 100644 web/messages/sv/docs/post-install/network.json create mode 100644 web/messages/sv/docs/post-install/optional.json create mode 100644 web/messages/sv/docs/post-install/performance.json create mode 100644 web/messages/sv/docs/post-install/security.json create mode 100644 web/messages/sv/docs/post-install/storage.json create mode 100644 web/messages/sv/docs/post-install/system.json create mode 100644 web/messages/sv/docs/post-install/uninstall.json create mode 100644 web/messages/sv/docs/post-install/updates.json create mode 100644 web/messages/sv/docs/post-install/virtualization.json diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 2b3e4685..7f4dfb51 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -9,15 +9,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' push: branches: [main, develop] paths: @@ -27,15 +32,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' workflow_dispatch: permissions: diff --git a/web/app/[locale]/docs/post-install/storage/page.tsx b/web/app/[locale]/docs/post-install/storage/page.tsx index 1e763441..61d629d1 100644 --- a/web/app/[locale]/docs/post-install/storage/page.tsx +++ b/web/app/[locale]/docs/post-install/storage/page.tsx @@ -282,8 +282,8 @@ done < /usr/local/share/proxmenux/zfs_autotrim_pools`}

{t("vzdump.changedTitle")}

diff --git a/web/messages/de/docs/post-install/automated.json b/web/messages/de/docs/post-install/automated.json new file mode 100644 index 00000000..afae9054 --- /dev/null +++ b/web/messages/de/docs/post-install/automated.json @@ -0,0 +1,172 @@ +{ + "meta": { + "title": "Automatisiertes Nachinstallationsskript | ProxMenux Dokumentation", + "description": "Das automatisierte Nachinstallationsskript von ProxMenux führt 14 festgelegte, hardwareabhängige Optimierungen auf einem neuen Proxmox-VE-Host aus. Es gibt keine Funktionsauswahlliste; Bannerentfernung, manche Log2RAM-Installationen und Neustart können jedoch eine Bestätigung verlangen. Rückgängig zu machende Konfigurationsänderungen werden erfasst.", + "ogTitle": "Automatisiertes Nachinstallationsskript | ProxMenux Dokumentation", + "ogDescription": "14 festgelegte, hardwareabhängige Optimierungen für einen neuen Proxmox-VE-Host, mit Bestätigungen für einige Aktionen und Erfassung rückgängig zu machender Änderungen." + }, + "header": { + "title": "Automatisiertes Post-Install-Skript", + "description": "ProxMenux führt 14 festgelegte Basisoptimierungen ohne Funktionsauswahlliste aus. Einige Aktionen verlangen eine Bestätigung. Rückgängig zu machende Konfigurationsänderungen werden für Optimierungen deinstallieren erfasst; Paket-Upgrades werden nicht als reversibel beschrieben.", + "section": "Post-Installation · Automatisiert" + }, + "intro": { + "title": "Wann automatisiert ausgewählt werden soll", + "body": "Führen Sie dies auf einem frisch installierten Proxmox-Host aus, wenn Sie eine sinnvolle Basislinie wünschen, ohne Entscheidungen treffen zu müssen. Das Skript ist idempotent – ​​es ist sicher, es zweimal auszuführen, es wendet lediglich dieselben Konfigurationen erneut an. Opt-in-Funktionen (Fastfetch, IOMMU, Ceph Repo, HA, AMD-Fixes…) sind absichtlich nicht Teil dieses Pfades; Wählen Sie sie bei Bedarf unter Anpassbar aus." + }, + "applies": { + "heading": "Was das Skript anwendet", + "intro": "Die Optimierungen werden genau in dieser Reihenfolge angewendet. Die Spalte Kategorie verlinkt auf die ausführliche Dokumentation jeder Änderung in der anpassbaren Nachinstallation.", + "headerNum": "#", + "headerTool": "Werkzeug", + "headerWhat": "Was es tut", + "headerCategory": "Kategorie" + }, + "optimizations": [ + { + "tool": "APT-Repositorys + vollständiges Upgrade", + "what": "Deaktiviert die Enterprise-Quellen pve-enterprise.sources und ceph.sources, erstellt eine passende No-Subscription-Quelle für den Debian-Codenamen des Hosts und führt apt update && apt full-upgrade -y aus (offizieller Proxmox-Upgrade-Befehl).", + "category": "Grundeinstellungen", + "categorySlug": "basic-settings" + }, + { + "tool": "Subskriptionsbanner entfernen", + "what": "Passt die Weboberfläche an, um den Hinweis „Kein gültiges Abonnement“ auszublenden. Fragt vorher nach Bestätigung; über Optimierungen deinstallieren rückgängig zu machen.", + "category": "Anpassung", + "categorySlug": "customization" + }, + { + "tool": "IPv4 erzwingen", + "what": "Schreibt /etc/apt/apt.conf.d/99-force-ipv4, damit apt nur IPv4 nutzt und instabile IPv6-Verbindungen zu Spiegelservern umgeht.", + "category": "Netzwerk", + "categorySlug": "network" + }, + { + "tool": "Sprachpakete überspringen", + "what": "Schreibt /etc/apt/apt.conf.d/99-disable-translations, um übersetzte Paketbeschreibungsindizes nicht mehr herunterzuladen und die Datenmenge bei apt-Updates zu verringern.", + "category": "Grundeinstellungen", + "categorySlug": "basic-settings" + }, + { + "tool": "Erhöhung der Systemgrenzen", + "what": "Erhöht inotify-Überwachungen, nofile/nproc-Grenzen, Kernel-Schlüsselbundgrenzen und fs.file-max über sysctl.d, limits.d, pam und systemd — ausreichend für Hosts mit vielen Containern.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Speicherabstimmung", + "what": "Setzt vm.swappiness=10, ausgewogene Anteile noch nicht geschriebener Speicherseiten, vm.max_map_count=262144 und bei Unterstützung proaktive Speicherkompaktierung. Die Overcommit-Richtlinie des Kernels bleibt auf dem Proxmox-Standard.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Verhalten bei Kernel-Panik", + "what": "Konfiguriert den Host so, dass er 10 Sekunden nach einer Panik / oops / Hardlockup neu startet, anstatt auf unbestimmte Zeit einzufrieren.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Netzwerk-Stack abstimmen", + "what": "TCP Buffer Sizing, IPv4-Härtung (redirects off, rp_filter=2, martian log off), lokaler Portbereich 1024-65535, TCP MTU-Probing, RFC 1337, plus ein Helfer bei /usr/local/sbin/proxmenux-fwbr-tune, der mit einer oneshot systemd-Einheit und einer udev-Regel verdrahtet ist, so dass rp_filter=0 / log_martians=0 jedes Mal wieder auf fwbr*/fwln*/fwpr*/tap*-Schnittstellen angewendet werden, wenn Proxmox sie bei VM Start / Stop, Neustart oder Live-Migration neu erstellt.", + "category": "Netzwerk", + "categorySlug": "network" + }, + { + "tool": "Bashrc-Anpassung (root)", + "what": "Farbige PS1, gebräuchliche Aliase (l/la/ll/ls/grep), Zeitstempel-Historie und Bash-Completion-Sourcing, alles in einem PMX_CORE_BASHRC eingezäunten Block, so dass es leicht zu entfernen ist.", + "category": "Anpassung", + "categorySlug": "customization" + }, + { + "tool": "Log2RAM (SSD-bewusst, auto)", + "what": "Reduziert SSD-/NVMe-Verschleiß durch Verschieben von /var/log in eine tmpfs-RAM-Disk mit regelmäßiger Synchronisierung auf Datenträger. Installation aus dem Upstream-Projekt bei SSD oder NVMe als Systemplatte. Die Größe richtet sich nach dem Host-RAM (128M / 256M / 512M). Ein Schutz leert alte Journale ab 80% Belegung und kürzt stark wachsende Logs ab 92% vor dem Schreiben. Regelmäßige Synchronisierung wird geplant und journald an den verfügbaren Platz angepasst. Details unter Log2RAM.", + "category": "Speicher", + "categorySlug": "storage" + }, + { + "tool": "ZFS Autotrim (nur SSD)", + "what": "Aktiviert zpool autotrim=on in jedem ZFS-Pool, dessen vdevs alle SSD/NVMe mit TRIM-Unterstützung sind (überprüft /sys/block/[dev]/queue/rotational und discard_granularity). Pools, die von HDDs unterstützt werden, werden automatisch übersprungen. Nur Pools, die tatsächlich von ProxMenux geändert wurden, werden zur Deinstallation aufgezeichnet - Pools, die Sie manuell autotrimieren, werden in Ruhe gelassen.", + "category": "Speicher", + "categorySlug": "storage" + }, + { + "tool": "Journald Größenbeschränkungen", + "what": "Erzwingt dauerhaften Speicher, begrenzt SystemMaxUse=64M / RuntimeMaxUse=60M und aktiviert Komprimierung sowie Info-Protokollierung für Monitor. Wird bei aktivem Log2RAM automatisch übersprungen, da dieses die Anpassung selbst übernimmt.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Logrotate abstimmen", + "what": "Setzt global daily und danach size 10M, behält 7 Rotationen und aktiviert Komprimierung sowie copytruncate. Das spätere Größenkriterium hat Vorrang; einzelne Logregeln können es überschreiben. Für Log2RAM geeignet, die Häufigkeit hängt aber von Regeln und Timer ab.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Persistente Schnittstellennamen", + "what": "Schreibt einen /etc/systemd/network/10-proxmenux-<iface>.link pro physischem NIC (jeder beginnt mit einem 'Managed by ProxMenux'-Header), der den MAC an den aktuellen Namen anheftet, so dass eth0 / enp… Namen über Neustarts und neue NIC-Ergänzungen stabil bleiben.", + "category": "Netzwerk", + "categorySlug": "network" + } + ], + "hardwareTitle": "Hardwareabhängige Standardwerte", + "hardwareBody": "Das Skript liest die Host-Hardware vor dem Anwenden von Einstellungen. Log2RAM ist standardmäßig nur auf SSD / NVMe Root-Festplatten installiert (es wird aufgefordert, wenn die Erkennung etwas anderes sagt). Die Ramdisk-Größe von Log2RAM wird aus der Gesamt-RAM (≤ 8 GB → 128M, ≤ 16 GB → 256M, '>' 16 GB → 512M) ausgewählt. Die Journald-Limits werden an die Ramdisk-Größe angepasst, wenn Log2RAM aktiv ist, um ein Ausfüllen zu vermeiden.", + "upgrade": { + "heading": "Paketlisten und System aktualisieren", + "intro": "Der erste Schritt der automatisierten Nachinstallation ist das Proxmox-Upgrade. Für einen laufenden Host innerhalb derselben Hauptversion empfiehlt Proxmox selbst:", + "after": "Diese Zeile ist der offizielle Befehl für aktuelle Proxmox-Versionen. Das automatisierte Skript führt genau das aus und ergänzt Repository-Bereinigung und Nacharbeiten gemäß Upgrade-Anleitung — dieselben Schritte wie das separate Werkzeug Proxmox-Systemaktualisierung:", + "items": [ + "Deaktiviert die Enterprise-Quellen pve-enterprise.sources / ceph.sources, entfernt alte Repository-Dateien und erstellt eine saubere No-Subscription-Quelle für den Codenamen des Hosts.", + "Führt das Upgrade nicht interaktiv mit DEBIAN_FRONTEND=noninteractive und --force-confdef --force-confold aus. Angepasste Konfigurationsdateien bleiben erhalten, auch wenn sie sich im Upstream geändert haben.", + "Installiert wichtige Proxmox-Pakete, wenn sie fehlen (zfsutils-linux, proxmox-backup-restore-image, chrony).", + "LVM Metadaten-Sanitätsprüfung, apt-get autoremove -y + apt-get autoclean -y und eine Neustartaufforderung nur, wenn der Kernel tatsächlich geändert wurde." + ], + "sameTitle": "Gleicher Updater, zwei Einstiegspunkte", + "sameBody": "Das automatisierte Paket und das eigenständige Proxmox System Update-Dienstprogramm teilen sich die gleichen zugrunde liegenden Skripte (update-pve8.sh / update-pve9_2.sh). Verwenden Sie das Dienstprogramm selbst, wenn Sie nur den Host aktualisieren möchten, ohne den Rest der Optimierungen anzuwenden." + }, + "endResult": { + "heading": "Erwartetes Endergebnis", + "body": "Am Ende sehen Sie eine Erfolgsmeldung mit Ausgaben der einzelnen Schritte und eine Neustartfrage, da einige Kerneleinstellungen einen Neustart benötigen. Sie können den Neustart verschieben; die Einstellungen gelten beim nächsten Start.", + "imageAlt": "Automatisiertes Nachinstallationsskript — abschließende Terminalausgabe mit erfolgreich angewendeten Optimierungen" + }, + "notDoes": { + "heading": "Was dieses Skript nicht tut", + "items": [ + "Automatische Zeitzonenerkennung (im Quellskript auskommentiert; bei Bedarf die anpassbare Nachinstallation verwenden).", + "Portmapper / rpcbind deaktivieren (siehe Sicherheit).", + "IOMMU / VFIO aktivieren (siehe Virtualisierung).", + "Fastfetch / Figurine / Ceph-Repository / HA / AMD-CPU-Korrekturen installieren (siehe Optional).", + "pigz installieren oder ZFS ARC abstimmen (siehe Leistung / Speicher)." + ] + }, + "xshokTitle": "xshok-proxmox-Erkennung", + "xshokBody": "Wenn der Host zuvor das xshok-proxmox-Skript ausgeführt hat, erkennt ProxMenux die Markierungsdatei und warnt Sie, bevor Sie fortfahren. Einige Tweaks können sich überschneiden. Das Begleitskript ist veraltet - wenn Sie sich entscheiden, trotzdem fortzufahren, überprüfen Sie die Übersicht für den Kontext.", + "revert": { + "heading": "Rückgängig machen", + "body": "Jedes Werkzeug der Tabelle wird in /usr/local/share/proxmenux/installed_tools.json erfasst. Unter Optimierungen deinstallieren können Sie einzelne Änderungen zurücksetzen. Sicherungen geänderter Konfigurationsdateien liegen mit der Endung .bak neben den Originalen." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — wählen Sie im selben Katalog genau die gewünschten Funktionen." + }, + { + "label": "Optimierungen deinstallieren", + "href": "/docs/post-install/uninstall", + "tail": " — einzelne hier angewendete Änderungen rückgängig machen." + }, + { + "label": "Nützliche Systembefehle", + "href": "/docs/help-info/system-commands", + "tail": " — Änderungen überprüfen (uptime, free, journalctl usw.)." + }, + { + "label": "Übersicht Post-Install", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/basic-settings.json b/web/messages/de/docs/post-install/basic-settings.json new file mode 100644 index 00000000..2d6605e0 --- /dev/null +++ b/web/messages/de/docs/post-install/basic-settings.json @@ -0,0 +1,240 @@ +{ + "meta": { + "title": "Post-Install: Grundeinstellungen | ProxMenux Dokumentation", + "description": "Grundlegende Optionen nach der Installation: Wechseln Sie zu kostenlosen Proxmox-Repositories und Upgraden, erkennen Sie automatisch die Zeitzone und aktivieren Sie NTP, überspringen Sie APT-Sprachdownloads und wählen Sie aus 25 gängigen System-Dienstprogrammen zur Installation." + }, + "header": { + "title": "Post-Install: Grundeinstellungen", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was diese Kategorie abdeckt", + "body": "Fünf Grundlagen für einen neuen Proxmox-Host: auf Community-Repositories ohne Abonnement umstellen, das System vollständig aktualisieren, Zeitzone und NTP automatisch konfigurieren, APT-Sprachdownloads zur Einsparung von Bandbreite und Speicherplatz abschalten und aus 25 gängigen Systemwerkzeugen wählen." + }, + "upgrade": { + "heading": "Paketlisten und System aktualisieren", + "intro": "Stellt APT auf das kostenlose Repository pve-no-subscription statt des abonnementpflichtigen Enterprise-Repositorys um und aktualisiert das gesamte System. Die Schritte hängen von der Proxmox-VE-Hauptversion ab; ProxMenux erkennt sie und startet das passende Skript.", + "headerVersion": "PVE-Version", + "headerScript": "Versionsabhängiges Startskript", + "headerCodename": "Debian-Codename", + "rows": [ + { + "version": "9.x", + "script": "update-pve9_2.sh", + "codename": "trixie" + }, + { + "version": "8.x", + "script": "update-pve8.sh", + "codename": "bookworm" + } + ], + "officialTitle": "Die offizielle Proxmox Empfehlung", + "officialBody": "Die offizielle Proxmox-Anleitung empfiehlt diese genaue Reihenfolge:", + "officialOutro": "Das ist der übliche Befehl für Updates innerhalb der installierten Proxmox-VE-Hauptversion. Prüfen Sie die Repositories und vorgeschlagenen Paketänderungen, bevor Sie fortfahren. Ein Hauptversionswechsel erfordert das offizielle Migrationsverfahren.", + "doesTitle": "Was die ProxMenux-Option tut - verifiziert gegen das Skript", + "doesIntro": "Das ProxMenux-Update wickelt die oben genannten exakten apt-Befehle ab und fügt eine Reihe von Pre-/Post-Schritten hinzu, die Sie sich sonst von Hand merken müssten. Jedes Element unten ist, was das Dispatcher-Skript tatsächlich tut (siehe Proxmox System Update für die vollständige Aufschlüsselung):", + "doesItems": [ + "Zuerst die Repositories bereinigen. Deaktiviert die Enterprise-Quellen pve-enterprise.sources / ceph.sources, entfernt alte Repository-Dateien früherer PVE-Versionen und erstellt eine saubere proxmox.sources für den kostenlosen Kanal pve-no-subscription, passend zum Debian-Codenamen: trixie für PVE 9, bookworm für PVE 8.", + "Debian-Repositories neu schreiben mit main / updates / security und non-free-firmware, damit die Firmwarewarnung beim Upgrade entfällt.", + "Führt das offizielle Upgrade aus. apt-get update gefolgt von apt full-upgrade -y (PVE 9) oder apt dist-upgrade -y (PVE 8), jeweils nicht interaktiv mit --force-confdef --force-confold, um angepasste Konfigurationsdateien zu erhalten.", + "Installiert fehlende wichtige Pakete: zfsutils-linux, proxmox-backup-restore-image, chrony.", + "LVM-Metadaten prüfen. Sucht nach VMs mit Festplatten-Passthrough, die veraltete Physical-Volume-Header auf Rohdatenträger geschrieben haben könnten. Warnt bei Auffälligkeiten, ohne sie automatisch zu beheben.", + "Bereinigt danach: apt-get autoremove -y + apt-get autoclean -y, dann Neustartabfrage bei Kernel-Update oder vorhandener Datei /var/run/reboot-required." + ], + "shortTitle": "Kurz gesagt", + "shortBody": "Die Option führt das empfohlene apt update && apt full-upgrade -y aus, ergänzt die im offiziellen Leitfaden genannte Repository- und Nachbereitung und fragt am Ende nach dem Neustart. Siehe Proxmox-Systemupdate mit vollständigem Ablaufdiagramm — derselbe Updater ist als eigenständiges Werkzeug im Hauptmenü verfügbar.", + "subTitle": "Nicht auf einen abonnierten Host anwenden", + "subBody": "Wenn Sie ein Proxmox-Abonnement haben und Enterprise-Repositories behalten möchten, überspringen Sie diese Option. Sie deaktiviert Enterprise und stellt auf den Community-Kanal um. Paketupgrade und Repository-Umschreibung lassen sich unter Optimierungen deinstallieren nicht zurücksetzen. Einen späteren Kanalwechsel müssen Sie gezielt über die Repository-Konfiguration vornehmen.", + "safetyTitle": "Sicherheitsüberprüfung nach der Aktualisierung", + "safetyBody": "Nach dem Upgrade prüft das Skript auf Festplatten mit veralteten PV-Metadaten (Physical Volume) - ein Edge Case, der auftreten kann, wenn ein VM mit Festplattendurchgang LVM-Header auf eine Rohplatte kritzelt. Wenn etwas Verdächtiges gefunden wird, sehen Sie eine Warnung, die pvs zur Inspektion vorschlägt. Es wird nicht automatisch gehandelt." + }, + "time": { + "heading": "Zeit automatisch synchronisieren", + "intro": "Erkennt die öffentliche IP des Servers über dig myip.opendns.com @resolver1.opendns.com, fragt dann ipapi.co/'{'ip'}'/timezone, um die passende IANA-Zeitzone nachzuschlagen, und wendet sie mit timedatectl set-timezone an. Endlich ermöglicht NTP mit timedatectl set-ntp true.", + "depTitle": "Abhängig von zwei externen Diensten", + "depBody": "Der Lookup basiert darauf, dass OpenDNS und ipapi.co erreichbar sind und ihre Antworten korrekt sind. Wenn Sie Proxmox hinter einem VPN oder einem VLAN ausführen, das aus einer anderen Region austritt, ist die automatisch erkannte Zeitzone möglicherweise falsch. In diesem Fall überspringen Sie diese Option und legen Sie die Zeitzone von Hand fest:", + "revertTitle": "Reversibel aus dem Menü Deinstallieren", + "revertBody": "Optimierungen deinstallieren setzt die Zeitzone auf UTC zurück, eine sichere Vorgabe. NTP bleibt aktiv; die Uhr synchronisiert sich weiter und zeigt UTC, bis Sie eine andere Zeitzone einstellen." + }, + "languages": { + "heading": "Das Herunterladen zusätzlicher Sprachen überspringen", + "intro": "Bei apt update kann APT übersetzte Paketbeschreibungen zusätzlich zu den Hauptmetadaten herunterladen. Die Option deaktiviert diese Downloads zur Einsparung von Bandbreite und Speicherplatz. Zuvor stellt ProxMenux sicher, dass die Locale des Hosts generiert ist: Es liest /etc/default/locale oder /etc/environment, ergänzt /etc/locale.gen bei Bedarf und führt locale-gen aus. Die Shell-Locale bleibt erhalten.", + "writtenTitle": "Was geschrieben wird", + "revertTitle": "Reversibel aus dem Menü Deinstallieren", + "revertBody": "Das Löschen von /etc/apt/apt.conf.d/99-disable-translations (manuell oder aus dem Menü Deinstallieren) stellt das Standardverhalten wieder her und APT lädt Sprachdateien erneut herunter." + }, + "utilities": { + "heading": "Allgemeine Systemdienstprogramme installieren", + "intro": "Öffnet eine gruppierte Auswahlliste mit 25 ausgewählten Werkzeugen. Wählen und bestätigen Sie; ProxMenux installiert sie über apt, überprüft das Ergebnis und zeigt eine Zusammenfassung.", + "imageAlt": "Auswahldialog für ProxMenux-Systemwerkzeuge: Leertaste zum Auswählen, Eingabetaste zum Bestätigen", + "reuseTitle": "Die gleiche Liste wird an anderer Stelle wiederverwendet", + "reuseBody": "Der Katalog mit 25 Werkzeugen ist zentral definiert: PROXMENUX_UTILS in scripts/global/utils-install-functions.sh. Unter Dienstprogramme und Werkzeuge → Systemwerkzeuge finden Sie dieselbe Liste für spätere Installationen ohne erneuten Nachinstallationslauf.", + "listTitle": "Was ist in der Liste", + "groups": [ + { + "group": "Systemüberwachung", + "items": [ + { + "pkg": "htop", + "desc": "Interaktiver Prozess-Viewer" + }, + { + "pkg": "btop", + "desc": "Moderner Ressourcenmonitor (CPU, RAM, Festplatten, Netz, Prozesse)" + }, + { + "pkg": "s-tui", + "desc": "Terminaloberfläche für CPU-Belastungstests und Überwachung" + }, + { + "pkg": "iftop", + "desc": "Live-Bandbreitennutzung pro Verbindung" + }, + { + "pkg": "iotop", + "desc": "Datenträger-I/O pro Prozess" + }, + { + "pkg": "iptraf-ng", + "desc": "Interaktiver IP-LAN-Monitor" + } + ] + }, + { + "group": "Netzwerk", + "items": [ + { + "pkg": "iperf3", + "desc": "Messen Sie die maximal erreichbare Bandbreite zwischen Hosts" + }, + { + "pkg": "net-tools", + "desc": "Legacy-Tools (ifconfig, netstat, route). Immer noch praktisch für schnelle Überprüfungen." + }, + { + "pkg": "ipset", + "desc": "Verwalten Sie große IP-Sets im Kernel – nützlich mit iptables/nftables-Regeln." + } + ] + }, + { + "group": "Download und Archiv", + "items": [ + { + "pkg": "axel", + "desc": "Leichter paralleler Download-Beschleuniger" + }, + { + "pkg": "aria2", + "desc": "Multi-Source-/Multi-Protokoll-Downloader (HTTP, FTP, BitTorrent, Metalink)" + }, + { + "pkg": "unzip", + "desc": "ZIP-Archive extrahieren" + }, + { + "pkg": "zip", + "desc": "ZIP-Archive erstellen" + }, + { + "pkg": "cabextract", + "desc": "Extrahieren von Microsoft CAB-Archiven (bei der Arbeit mit Windows ISOs praktisch)" + }, + { + "pkg": "wimtools", + "desc": "Windows-WIM-Abbilder bearbeiten (extrahieren, aufteilen, einbinden, anwenden)" + }, + { + "pkg": "genisoimage", + "desc": "ISO-9660-Abbilder aus einem Verzeichnis erstellen" + } + ] + }, + { + "group": "Text und Dateien", + "items": [ + { + "pkg": "dos2unix", + "desc": "CRLF-Zeilenenden (Windows) in LF-Zeilenenden (Unix) umwandeln" + }, + { + "pkg": "grc", + "desc": "Färbt Ausgaben von ping, traceroute, dig, tail usw. mit Syntaxhervorhebung ein" + }, + { + "pkg": "plocate", + "desc": "Schnelle Dateisuche (indexiert). Führen Sie `updatedb` nach der Installation aus, um den Index zu erstellen." + } + ] + }, + { + "group": "Remote und Sessions", + "items": [ + { + "pkg": "sshpass", + "desc": "Nicht interaktive SSH-Passwortauthentifizierung (für Skripte, nicht für den täglichen Gebrauch)" + }, + { + "pkg": "tmux", + "desc": "Terminal-Multiplexer: Sitzungen abkoppeln, Fenster teilen und Sitzungen bei Verbindungsabbrüchen erhalten" + } + ] + }, + { + "group": "Hardware und Low-Level", + "items": [ + { + "pkg": "msr-tools", + "desc": "CPU modellspezifische Register lesen/schreiben (rdmsr, wrmsr)" + }, + { + "pkg": "intel-gpu-tools", + "desc": "Intel GPU Diagnoseprogramme einschließlich `intel_gpu_top`" + } + ] + }, + { + "group": "Virtualisierung", + "items": [ + { + "pkg": "libguestfs-tools", + "desc": "VM-Festplattenabbilder untersuchen und ändern (virt-ls, virt-cat, guestmount…)" + }, + { + "pkg": "chntpw", + "desc": "Bearbeiten von Windows SAM - nützlich für die Passwortwiederherstellung auf Windows VMs, die Sie erben" + } + ] + } + ], + "actionTitle": "Einige davon in Aktion", + "noBulkTitle": "Nur von ProxMenux installierte Werkzeuge werden entfernt", + "noBulkBody": "ProxMenux erfasst nur ausgewählte Pakete, die noch nicht installiert waren. Optimierungen deinstallieren entfernt diese Pakete vollständig und lässt zuvor vorhandene Pakete bestehen. Für APT-Upgrades gibt es kein sicheres atomares Zurückrollen: Das Entfernen der Werkzeuge macht das System-Upgrade nicht rückgängig." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Proxmox-Systemupdate", + "href": "/docs/utils/system-update", + "tail": " — Führt den Zyklus apt update + dist-upgrade bei Bedarf erneut aus." + }, + { + "label": "Installationsprogramm für Systemdienstprogramme", + "href": "/docs/utils/system-utils", + "tail": "— Installation (oder Neuinstallation) von Dienstprogrammen einzeln nach der Nachinstallation." + }, + { + "label": "Befehle für Updates und Pakete", + "href": "/docs/help-info/update-commands", + "tail": " — APT-Referenz für die Shell." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/customizable.json b/web/messages/de/docs/post-install/customizable.json new file mode 100644 index 00000000..95cb063b --- /dev/null +++ b/web/messages/de/docs/post-install/customizable.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Anpassbares Post-Install-Script | ProxMenux Dokumentation", + "description": "Wählen Sie genau die Optimierungen aus, die ProxMenux auf Ihrem Proxmox-VE-Host anwenden soll. 10 Kategorien, etwa 35 einzelne Werkzeuge und eine Auswahl mit Kontrollkästchen. Enthält alle Funktionen des automatischen Skripts plus ausdrücklich wählbare Optionen wie IOMMU, Fastfetch, Figurine, Ceph, HA und AMD-Korrekturen.", + "ogTitle": "Anpassbares Post-Install-Script | ProxMenux Dokumentation", + "ogDescription": "10 Kategorien, ~35 individuelle Optimierungen. Wählen Sie genau das aus, was Sie auf einem Proxmox VE-Host wünschen. Reversible Veränderungen werden verfolgt." + }, + "header": { + "title": "Anpassbares Post-Install-Script", + "description": "Wählen Sie genau die Optimierungen für Ihren Proxmox-VE-Host. ProxMenux gruppiert etwa 35 Werkzeuge in 10 Kategorien in einem gemeinsamen Auswahldialog. Dieselbe Grundlage wie Automatisch, aber mit voller Kontrolle über die angewendeten Änderungen.", + "section": "Post-Installation · Anpassbar" + }, + "intro": { + "title": "Wann Sie Anpassbar wählen sollten", + "body": "Wählen Sie diesen Weg, wenn Sie die gewünschten oder unerwünschten Anpassungen bereits kennen. Eine nach Kategorien gruppierte Auswahlliste erlaubt das Vorwählen, Abwählen und Kombinieren von Optimierungen. Einträge können später erneut angewendet werden. Reversible Konfigurationsänderungen werden für Optimierungen deinstallieren erfasst; Paket-Upgrades gelten nicht als reversibel." + }, + "compare": { + "heading": "Vergleich mit Automatisch", + "body": "Anpassbar umfasst das gesamte automatische Skript: dieselben 14 Basisoptimierungen plus zahlreiche ausdrücklich wählbare Optionen, die Automatisch absichtlich auslässt. Diese sind nur für bestimmte Hardware (AMD-Korrekturen), Hostinganbieter (OVH RTM) oder Arbeitslasten nützlich (IOMMU/VFIO, Ceph-Repository, Hochverfügbarkeit, Fastfetch, Figurine, ZFS-ARC-Anpassung, pigz, automatische ZFS-Snapshots, vzdump-Geschwindigkeitsgrenzen, Open vSwitch, TCP BBR …)." + }, + "categoriesSection": { + "heading": "Die 10 Kategorien", + "body": "Das anpassbare Skript gruppiert die Optimierungen in 10 Kategorien in einem gemeinsamen Auswahldialog. Jede Kategorie hat eine eigene Dokumentationsseite. Öffnen Sie eine Karte für die Begründung, Vorgaben und Prüfschritte jeder Option." + }, + "categories": [ + { + "name": "Grundeinstellungen", + "description": "APT-Quellen bereinigen, das offizielle Proxmox-Upgrade ausführen und Zeitzone, Gebietsschema sowie häufig benötigte Werkzeuge einrichten. Die Grundlage aller anderen Gruppen." + }, + { + "name": "System", + "description": "Optimieren Sie das Protokollsubsystem und die Kernel-Grenzwerte für einen Host, der viele VMs und Container enthält. Behandelt journald, Logrotate, Sysctl (Speicher, Dateibeschränkungen), Kernel-Panic-Verhalten und schnelle Neustarts." + }, + { + "name": "Virtualisierung", + "description": "Bereitet den Host auf erweiterte Virtualisierung vor. Installiert den passenden Gastagenten, wenn Proxmox selbst in einer unterstützten VM läuft, und aktiviert IOMMU/VFIO für die PCI-Durchreichung von GPUs, Controllern und TPUs." + }, + { + "name": "Netzwerk", + "description": "Härtet und optimiert den Netzwerkstack des Hosts. Erzwingt IPv4 für APT, wendet sysctl-Härtung und TCP-Pufferanpassungen an, bietet Open vSwitch, TCP BBR und TCP Fast Open und bindet persistente Schnittstellennamen an MAC-Adressen." + }, + { + "name": "Speicher", + "description": "Richten Sie die gängigen Speicher-Subsysteme von Proxmox ein: ZFS ARC Sizing, ZFS auto-snapshot, ZFS autotrim für SSD/NVMe Pools und vzdump Geschwindigkeitsbegrenzungen, um eine Sättigung der Festplatte bei Backups zu vermeiden." + }, + { + "name": "Sicherheit", + "description": "Verringert die standardmäßig offene Angriffsfläche. Deaktiviert die RPC-Dienste portmapper/rpcbind, die Proxmox nicht benötigt, aber lauschen lässt." + }, + { + "name": "Anpassung", + "description": "Ändern Sie das visuelle und Shell-Erlebnis des Hosts: Farben und Aliase in bashrc, MOTD-Banner und Entfernen des Abonnementbescheids in der Web-Benutzeroberfläche." + }, + { + "name": "Überwachung", + "description": "Integriert den Host in OVH Real-Time Monitoring. Installiert RTM nur, wenn ProxMenux einen OVH-Server erkennt; auf anderen Hosts ändert die Option nichts." + }, + { + "name": "Leistung", + "description": "Beschleunigen Sie Kompressionsvorgänge (Backups, Transfers), indem Sie gzip durch sein paralleles Gegenstück pigz ersetzen." + }, + { + "name": "Fakultativ", + "description": "Nischenstücke, die nicht jeder Host braucht: AMD CPU Fixes, Fastfetch-Banner, Figurine 3D-Hostname, Indexaktualisierung des PVE Appliance Managers, Ceph Repository, High Availability Services, Log2RAM zur Reduzierung des SSD-Verschleisses und ein ZRAM-Swap-Profil." + } + ], + "mixTip": { + "title": "Automatisch und Anpassbar kombinieren", + "body": "Ein übliches Vorgehen: zuerst Automatisch für sinnvolle Grundeinstellungen, dann Anpassbar öffnen und nur benötigte Zusatzwerkzeuge wählen, etwa IOMMU für GPU-Passthrough. Änderungen werden unabhängig erfasst; Deinstallieren zeigt alle angewendeten Einträge unabhängig vom verwendeten Weg." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Automatische Nachinstallation", + "href": "/docs/post-install/automated", + "tail": " — sinnvolle Vorgaben ohne Rückfragen anwenden." + }, + { + "label": "Optimierungen deinstallieren", + "href": "/docs/post-install/uninstall", + "tail": " — jede Auswahl sauber rückgängig machen." + }, + { + "label": "Grundeinstellungen", + "href": "/docs/post-install/basic-settings", + "tail": "— Repos, Zeit, Sprache, Dienstprogramme." + }, + { + "label": "Virtualisierung", + "href": "/docs/post-install/virtualization", + "tail": "— IOMMU + VFIO für Passthrough." + }, + { + "label": "Sicherheit", + "href": "/docs/post-install/security", + "tailRich": " · Speicher · Netzwerk · Anpassung — weitere Kategorien." + }, + { + "label": "Übersicht nach der Installation", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/customization.json b/web/messages/de/docs/post-install/customization.json new file mode 100644 index 00000000..5fd29394 --- /dev/null +++ b/web/messages/de/docs/post-install/customization.json @@ -0,0 +1,74 @@ +{ + "meta": { + "title": "Nach der Installation: Anpassung | ProxMenux-Dokumentation", + "description": "Anpassungen im anpassbaren ProxMenux-Skript nach der Installation: farbige Bash-Eingabeaufforderung mit nützlichen Aliasen, ProxMenux-Banner in der MOTD und Entfernung des Abonnementhinweises aus der Proxmox-Weboberfläche." + }, + "header": { + "title": "Nach der Installation: Anpassung", + "description": "Optische und praktische Anpassungen für den Proxmox-Host. Sie machen die Shell angenehmer und blenden den Abonnementhinweis in der Weboberfläche aus. Bashrc, MOTD und Abonnementbanner werden erfasst und lassen sich über Deinstallieren zurücksetzen.", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was diese Kategorie abdeckt", + "body": "Drei kleine, unabhängige Optionen: eine farbige Bash-Eingabeaufforderung mit Aliasen für die root-Shell, ein einzeiliges MOTD-Banner bei SSH-Anmeldung und Entfernung des Popups „Kein gültiges Abonnement“, das Proxmox bei jeder Web-Anmeldung zeigt." + }, + "bashrc": { + "heading": "bashrc anpassen", + "intro": "Injiziert einen kuratierten Block in /root/.bashrc mit einer farbigen Eingabeaufforderung, Zeitstempel-Historie, Standard-ls/grep-Aliasen und einem source für die Bash-Vervollständigung. Macht das Arbeiten über SSH spürbar angenehmer und macht deutlich, auf welchem Host Sie sich befinden, wenn Sie viele Tabs geöffnet haben.", + "writesTitle": "Was ProxMenux zu .bashrc hinzufügt", + "writesOutro": "Der Block wird durch die PMX_CORE_BASHRC-Marker begrenzt. Das Ausführen des Skripts ersetzt den vorherigen Block, anstatt ihn zu duplizieren. Die ursprüngliche .bashrc wird einmal auf /root/.bashrc.bak gesichert, und eine source /root/.bashrc-Zeile wird an /root/.bash_profile angehängt, so dass die Aufforderung auch für Login-Shells gilt (z. B. nach su -).", + "rootTitle": "Gilt nur für root", + "rootBody": "Die Anpassung zielt auf die Shell des Root-Kontos ab. Andere Benutzer, die Sie auf dem Host erstellen, behalten ihre eigenen Standardeinstellungen. Wenn Sie Proxmox ausschließlich über die Web-Benutzeroberfläche verwalten und niemals die Shell verwenden, ist diese Option reine Ästhetik und Sie können sie überspringen." + }, + "motd": { + "heading": "Richten Sie ein benutzerdefiniertes MOTD-Banner ein", + "intro": "Stellt \"This system is optimised by: ProxMenux\" an den Anfang von /etc/motd, der Nachricht nach erfolgreicher SSH-Anmeldung oberhalb der Shell-Eingabeaufforderung und vor den update-motd-Skripten. Harmlos und rein informativ — als schnelle sichtbare Bestätigung, dass ProxMenux auf diesem Host angewendet wurde.", + "writesTitle": "Was ProxMenux schreibt", + "writesOutro": "Bei der ersten Anwendung erfasst ProxMenux, ob /etc/motd existierte und speichert seinen ursprünglichen Inhalt unter /usr/local/share/proxmenux. Die Operation ist idempotent: Wenn die Markierungslinie bereits vorhanden ist, wird nichts hinzugefügt. Ältere Anlagen mit einem vorhandenen /etc/motd.bak werden in den gleichen reversiblen Zustand migriert." + }, + "banner": { + "heading": "Abonnementbanner entfernen", + "intro": "Entfernt den Dialog „Sie haben kein gültiges Abonnement für diesen Server“, der bei jeder Anmeldung ohne Enterprise-Abonnement in der Proxmox-Weboberfläche erscheint. ProxMenux berücksichtigt die Version und startet das passende Skript für die unterschiedlichen UI-Pakete der Hauptversionen.", + "versionTitle": "Skriptauswahl nach Version", + "versionItems": [ + "PVE 9.x führt remove-banner-pve-v3.sh aus (patcht sowohl die Desktop-proxmoxlib.js als auch die neue Yew-basierte mobile Benutzeroberfläche).", + "PVE 8.x führt remove-banner-pve8.sh aus (nur auf dem Desktop)." + ], + "versionOutro": "Vor dem Patchen sichert ProxMenux die ursprünglichen JS/Template-Dateien mit einem Zeitstempel auf /usr/local/share/proxmenux/backups/. Der Deinstallationsfluss verwendet diese Backups, um die Originaldateien wiederherzustellen, und greift auf die Neuinstallation der Proxmox-Benutzeroberflächenpakete zurück, wenn das Backup fehlt oder beschädigt ist.", + "breakTitle": "Kann nach Proxmox Updates brechen", + "breakBody": "Proxmox-UI-Updates überschreiben regelmäßig proxmoxlib.js, wodurch der Hinweis zurückkehren kann. Sie können die Option danach erneut anwenden oder den Hinweis bis dahin hinnehmen. ProxMenux installiert außerdem einen APT-Hook zum automatischen erneuten Patchen bei Paket-Upgrades. Unter Optimierungen deinstallieren erfahren Sie, wie dieser Hook entfernt wird.", + "legalTitle": "Rechtliche Anmerkung (immer wiederholenswert)", + "legalBody": "Diese Option blendet nur den UI-Hinweis aus. Sie gewährt keinen Enterprise-Support oder Zugriff auf das Enterprise-Repository und ändert die Softwarelizenz nicht. Proxmox VE wird unter GNU AGPLv3 veröffentlicht. Ein Abonnement unterstützt das Projekt und ermöglicht den Enterprise-Updatekanal. Wählen Sie eine passende Supportstufe für Ihre Umgebung." + }, + "verify": { + "heading": "Verifizierung", + "intro": "Nach Anwendung aller drei:", + "reversibleTitle": "Alle drei Anpassungsänderungen werden verfolgt", + "reversibleBody": "Optimierungen deinstallieren stellt /root/.bashrc wieder her, gibt MOTD zu seinem genauen Pre-ProxMenux-Inhalt zurück (oder entfernt die Datei, wenn sie vorher nicht existierte) und stellt die gepatchten UI-Dateien aus dem Backup wieder her oder installiert die betroffenen Proxmox-Pakete bei Bedarf neu." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Fakultativ", + "href": "/docs/post-install/optional", + "tail": " — Fastfetch und Figurine, weitere visuelle Anpassungen." + }, + { + "label": "Versionsinformationen anzeigen", + "href": "/docs/settings/show-version-information", + "tail": " — bestätigt, dass die Anpassungen als installiert erfasst sind." + }, + { + "label": "Optimierungen deinstallieren", + "href": "/docs/post-install/uninstall", + "tail": " — bashrc, motd und Abonnementhinweis zurücksetzen." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/index.json b/web/messages/de/docs/post-install/index.json new file mode 100644 index 00000000..badbeab7 --- /dev/null +++ b/web/messages/de/docs/post-install/index.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Proxmox VE Post-Install-Script — Automatisiert und anpassbar | ProxMenux", + "description": "Überblick über die ProxMenux-Skripte nach der Installation von Proxmox VE. Das automatische Skript wendet sinnvolle Vorgaben ohne Rückfragen an. Mit dem anpassbaren Skript wählen Sie gezielt aus 10 Kategorien. Unter Optimierungen deinstallieren können unterstützte reversible Änderungen zurückgesetzt werden.", + "ogTitle": "Proxmox VE Post-Install-Script — Automatisiert und anpassbar", + "ogDescription": "Übliche Proxmox VE-Postinstallationsoptimierungen in 10-Kategorien anwenden - automatisiert oder à la carte mit reversiblen Optionen.", + "twitterTitle": "Proxmox VE Post-Install-Script | ProxMenux", + "twitterDescription": "Automatisierte und anpassbare Nachinstallationsoptimierungen für Proxmox VE – mit reversiblen Optionen." + }, + "header": { + "title": "Post-Install Skripte", + "description": "Konfigurieren Sie einen neuen Proxmox VE-Host mit den ProxMenux-Optimierungen nach der Installation. Wenden Sie die Baseline automatisch an, wählen Sie einzelne Optionen aus, aktualisieren Sie installierte Funktionen oder stellen Sie unterstützte reversible Änderungen wieder her. Paket-Upgrades werden nicht als reversibel dargestellt.", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Wozu dieses Menü dient", + "body": "Direkt nach der Installation von Proxmox VE machen Dutzende kleine Änderungen den Host schneller und leichter wartbar: Repositories ohne Abonnement, sinnvolle journald-Limits und TCP-Puffer, SSD-schonende Protokollspeicherung, bashrc-Verbesserungen und mehr. ProxMenux automatisiert sie und erfasst die unterstützten reversiblen Konfigurationsänderungen." + }, + "openingMenu": { + "heading": "Öffnen des Menüs", + "body": "Wählen Sie im Hauptmenü von ProxMenux Einstellungen nach der Installation von Proxmox. Folgendes wird angezeigt:", + "imageAlt": "Menü für Skripte nach der Installation: Automatisch, Anpassbar, der bedingte Eintrag Verfügbare Updates anwenden (nur bei ausstehenden Updates) und Deinstallieren, gefolgt von Community-Skripten" + }, + "threeWays": { + "heading": "Vier Möglichkeiten, Optimierungen anzuwenden", + "body": "Die vier ProxMenux-Einträge nutzen denselben Code und dasselbe Register installierter Werkzeuge, bieten aber unterschiedliche Kontrolle. Verfügbare Updates anwenden erscheint nur, wenn für mindestens eine installierte Optimierung eine neuere Version auf dem Datenträger liegt als die registrierte. Direkt nach der Einrichtung bleibt der Eintrag verborgen." + }, + "routes": [ + { + "title": "Automatisch", + "description": "Eine sorgfältig ausgewählte Gruppe von 14 sicheren, stets nützlichen Optimierungen, die nacheinander ohne Rückfragen angewendet werden. Eine gute Vorgabe für die meisten Benutzer.", + "bullets": [ + "Repositories ohne Abonnement + Systemupgrade", + "Speicher, Kernel, Netzwerk-Tuning", + "Log2RAM (automatisch auf SSD/NVMe erkannt)", + "Journald + Logrotate-Größenbeschränkungen", + "Persistente Schnittstellennamen" + ] + }, + { + "title": "Anpassbar", + "description": "Etwa 35 einzelne Optimierungen in 10 Kategorien. Sie wählen genau aus, welche angewendet werden. Dieselbe Grundlage wie Automatisch, aber mit voller Kontrolle.", + "bullets": [ + "Auswahllisten pro Kategorie", + "Enthält alle Funktionen von Automatisch plus ausdrücklich auswählbare Optionen (IOMMU, Fastfetch, Figurine, Ceph, HA, AMD-Korrekturen …)", + "Beliebig oft ausführbar — die Änderungen sind idempotent" + ] + }, + { + "title": "Verfügbare Updates anwenden", + "description": "Liegt eine Nachinstallationsoptimierung (Log2Ram, Speichereinstellungen, Logrotate …) auf dem Datenträger in einer neueren Version vor als der auf dem Host erfassten, zeigt dieser Menüpunkt nur die betroffenen Optimierungen an. Er führt die jeweilige Funktion erneut aus und aktualisiert den gespeicherten Versionsstand. Alles andere bleibt unverändert.", + "bullets": [ + "Jede Optimierung einzeln auswählen (nur geänderte)", + "Dieselbe Auswahl ist im Monitor-Dashboard verfügbar", + "Eine gemeinsame Benachrichtigung, wenn neue Updates verfügbar werden" + ] + }, + { + "title": "Optimierungen deinstallieren", + "description": "Unterstützte rückgängig machbare Änderungen werden in einer JSON-Datei erfasst und mit einer Wiederherstellungsfunktion verknüpft. Aktionen ohne sichere Rückkehrmöglichkeit, etwa ein vollständiges Paketupgrade, sind bewusst ausgeschlossen.", + "bullets": [ + "Erkennt zuvor angewendete Optimierungen automatisch", + "Wählt für jeden Eintrag den passenden Rückweg: aus einem vorhandenen .bak-Backup wiederherstellen, den sysctl.d-Konfigurationsausschnitt löschen, wenn keine Sicherung nötig war, oder das unveränderte Originalpaket mit --force-confnew neu installieren (z. B. beim Abonnementbanner)", + "Neustartabfrage bei Bedarf (VFIO, persistente Namen usw.)" + ] + } + ], + "whichTitle": "Welches sollten Sie wählen?", + "whichBody": "Bei einer neuen Proxmox-Installation mit sinnvollen Grundeinstellungen ohne Entscheidungen: Automatisch. Wenn Sie die gewünschten oder unerwünschten Anpassungen schon kennen: Anpassbar. Für eine bereits angewendete Optimierung, deren neuere Version auf dem Datenträger liegt: Verfügbare Updates anwenden. Zum sauberen Zurücksetzen früherer Änderungen: Optimierungen deinstallieren. Sie können kombinieren: zuerst Automatisch, dann unter Anpassbar Optionen wie Fastfetch oder IOMMU hinzufügen und später einzelne Einträge zurücksetzen.", + "mixing": { + "heading": "Mischen mit anderen Post-Installation-Scripts", + "stackTitle": "Stapeln Sie nicht mehrere Post-Installationsskripte", + "stackBody": "Das Ausführen mehrerer Post-Installationsskripte auf demselben Host kann doppelte Konfigurationsdateien, widersprüchliche sysctl-Einträge oder, schlimmer noch, defekte Netzwerke nach dem Neustart verursachen. Wenn Sie das Helper-Scripts Post Install bereits angewendet haben, können sich einige ProxMenux-Optimierungen mit dem bereits konfigurierten überschneiden. Bleiben Sie bei einem Post-Installations-Tool pro Host.", + "xshokTitle": "xshok-proxmox: veraltet", + "xshokBody": "Frühere Versionen von ProxMenux verwies auf xshok-proxmox als Begleitwerkzeug nach der Installation. Dieses Projekt ist jetzt veraltet und wird nicht mehr von ProxMenux angeboten. Wenn ein früherer Lauf von xshok-proxmox Markierungen auf dem Host hinterlassen hat, erkennt ProxMenux sie immer noch und wird Sie warnen - aber es ist nicht etwas, das Sie heute neben ProxMenux installieren sollten." + }, + "community": { + "heading": "Gemeinschaftsskripte", + "body": "Das Menü bietet zwei Drittanbieterskripte aus dem Projekt community-scripts: Proxmox VE Post Install und Proxmox VE Microcode. Die Wrapper laden die Originalskripte mit wget | bash herunter und führen sie aus. ProxMenux pflegt sie nicht. Lesen Sie vor der Ausführung Externe Repositories für Details und Hinweise zur Vertrauenswürdigkeit." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Proxmox-Systemupdate", + "href": "/docs/utils/system-update", + "tail": " — hält den Host nach der Ersteinrichtung aktuell." + }, + { + "label": "Sicherheit", + "href": "/docs/security", + "tail": "- Fail2Ban + Lynis oben auf der Nachinstallationshärtung." + }, + { + "label": "Versionsinformationen anzeigen", + "href": "/docs/settings/show-version-information", + "tail": " — zeigt, welche Komponenten nach der Installation als installiert erfasst sind." + }, + { + "label": "Befehle für Updates und Pakete", + "href": "/docs/help-info/update-commands", + "tail": " — Referenz für apt / pveupgrade." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/monitoring.json b/web/messages/de/docs/post-install/monitoring.json new file mode 100644 index 00000000..c8e67925 --- /dev/null +++ b/web/messages/de/docs/post-install/monitoring.json @@ -0,0 +1,56 @@ +{ + "meta": { + "title": "Nach der Installation: Überwachung | ProxMenux-Dokumentation", + "description": "Überwachungsoptionen im ProxMenux anpassbaren Post-Installationsskript. Derzeit eine einzige Option: OVH Real-Time Monitoring (RTM) installieren, das nur aktiviert wird, wenn der Host als OVH-Server erkannt wird." + }, + "header": { + "title": "Nach der Installation: Überwachung", + "description": "Überwachungsoptionen im anpassbaren Skript nach der Installation. Diese kleine, anbieterspezifische Kategorie installiert den OVH-Real-Time-Monitoring-Agenten auf dedizierten OVH-Servern und tut auf anderen Hosts nichts.", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Zweckgebundener enger Anwendungsbereich", + "body": "Die Überwachung nach der Installation beschränkt sich auf einen anbieterspezifischen Agenten. Allgemeine Überwachung mit Prometheus, Grafana oder node_exporter gehört nicht dazu, da Entscheidungen über einen separaten Host, Datenaufbewahrung und Alarmziele nicht in einen Ein-Klick-Schritt passen. Der mitgelieferte ProxMenux Monitor erfüllt den Großteil dieser Aufgabe ohne externen Agenten." + }, + "ovh": { + "heading": "Installation von OVH Real-Time Monitoring (RTM)", + "intro": "Wenn Ihr Proxmox-Host ein dedizierter Server ist, der von OVHcloud gemietet wird, können Sie RTM aktivieren, um Hardware-Telemetrie (CPU-Temperatur, PSU-Status, Festplatte SMART, RAID-Controller-Zustand usw.) dem OVH-Bedienfeld auszusetzen. Dies ist der gleiche Agent, den OVH für seine eigene \"Server Monitoring\" -Funktion verwendet.", + "decisionsTitle": "Wie ProxMenux entscheidet", + "decisionsItems": [ + "Ermittelt die öffentliche IP-Adresse des Hosts mit curl ipinfo.io/ip.", + "Sucht den besitzenden ISP mit einer whois-Abfrage zu v4.whois.cymru.com nach.", + "Wenn das Ergebnis OVH nennt, lädt es last-public-ovh-infra-yak.snap.mirrors.ovh.net/yak/archives/apply.sh herunter und leitet es mit dem Puppet-Manifest für RTM v2 an bash weiter.", + "Wenn im Ergebnis OVH nicht erwähnt wird, ist nichts installiert. Die Option ist eine No-Op." + ], + "remoteTitle": "Remote-Skript per Pipe an bash übergeben", + "remoteBody": "Die Installation läuft wget -qO - https://…apply.sh | bash. Wenn der OVH-Spiegel jemals kompromittiert wird, wird das Skript als root auf Ihrem Host ausgeführt. Bevor Sie diese Option aktivieren, entscheiden Sie, ob Sie der Spiegelkette von OVH mehr vertrauen als der Überwachung, die Sie erhalten. Für die meisten Heimlabor- oder Nicht-OVH-Benutzer sollte diese Option einfach ausgeschaltet bleiben.", + "noOpTitle": "Nur aktivieren, wenn der Host tatsächlich bei OVH ist", + "noOpBody": "Die Option ist ein No-Op auf Nicht-OVH-Servern, so dass das Ankreuzen auf einem Heimlabor Proxmox nichts kaputt macht. Auf einem Nicht-OVH-Host druckt das Skript \"Kein OVH-Server, überspringt die RTM-Installation\" und verlässt es sauber; es werden keine Pakete installiert.", + "runsTitle": "Was ProxMenux ausführt", + "verifyTitle": "Verifizierung", + "verifyBody": "Auf einem echten OVH-Host sollten Sie nach einem Neustart das RTM-Dashboard in Ihrem OVH-Manager sehen, das mit Live-Daten für den Host gefüllt ist. Auf der Proxmox-Seite ist der RTM-Sammler ein systemd-Service - überprüfen Sie es direkt:", + "troubleTitle": "Fehlerbehebung", + "revertTitle": "RTM über das Menü Deinstallieren entfernen", + "revertBody": "Ist RTM als installiert registriert, bietet Optimierungen deinstallieren einen Eintrag für OVH Real-Time Monitoring. Er führt apt-get purge -y ''ovh-rtm*'' ''rtm'' ''rtm-*'' aus, löscht /etc/rtm und markiert RTM als deinstalliert. Puppet-Reste müssen eventuell manuell bereinigt werden; prüfen Sie RTM-spezifische Manifeste unter /etc/puppet/. Auf einem Nicht-OVH-Host wurden keine RTM-Pakete installiert, daher ist nichts zu entfernen." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": "- lokales Web-Dashboard für den Host (funktioniert bei jedem Anbieter, nicht nur OVH)." + }, + { + "label": "Nützliche Systembefehle", + "href": "/docs/help-info/system-commands", + "tail": "– Referenz zur Überwachung des lokalen Hosts." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/network.json b/web/messages/de/docs/post-install/network.json new file mode 100644 index 00000000..30304efd --- /dev/null +++ b/web/messages/de/docs/post-install/network.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Post-Install: Netzwerk | ProxMenux Dokumentation", + "description": "Netzwerkoptionen im anpassbaren Nachinstallationsskript von ProxMenux: APT über IPv4 erzwingen, ein abgestimmtes sysctl-Profil anwenden, Open vSwitch installieren, TCP BBR + Fast Open aktivieren und Schnittstellennamen an MAC-Adressen binden." + }, + "header": { + "title": "Post-Install: Netzwerk", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was diese Kategorie abdeckt", + "body": "Fünf unabhängige Netzwerkoptionen: Zwei sind einfach (APT über IPv4, Open vSwitch installieren), zwei passen das TCP-Verhalten an (Netzwerk-sysctl-Profil, BBR + Fast Open). Eine behebt ein häufiges Betriebsproblem: Schnittstellennamen fest zuweisen, damit eine neue Netzwerkkarte oder ein BIOS-Update enp3s0 nicht in enp4s0 umbenennt und Ihre Bridges unterbricht." + }, + "ipv4": { + "heading": "Erzwingen Sie, dass APT IPv4 verwendet", + "intro": "Schreibt Acquire::ForceIPv4 \"true\"; in /etc/apt/apt.conf.d/99-force-ipv4. APT weigert sich dann, IPv6 für Paketdownloads zu verwenden, auch wenn der Host über IPv6-Konnektivität verfügt.", + "tipTitle": "Wer profitiert", + "tipBody": "Hilfreich bei instabilen oder gegenüber IPv4 langsameren IPv6-Verbindungen oder wenn der Debian-/Proxmox-Spiegel gelegentlich über IPv6 ausfällt. Auf Hosts ohne IPv6 unproblematisch. In einem funktionierenden Dual-Stack-Netz sorgt es für vorhersehbares Verhalten: apt überrascht Sie nicht mit einer IPv6-Zeitüberschreitung." + }, + "sysctl": { + "heading": "Netzwerkoptimierungen anwenden", + "intro": "Schreibt ein abgestimmtes sysctl-Profil nach /etc/sysctl.d/99-network.conf. Es umfasst Socket-Puffer des Kernels, ICMP-Härtung, grundlegenden Schutz vor Adressfälschung und TCP-Puffergrößen für einen Hypervisor mit vielen gleichzeitigen Datenströmen.", + "tunedTitle": "Was angepasst wird", + "headerArea": "Thema", + "headerSettings": "Schlüsseleinstellungen", + "rows": [ + { + "area": "Socket-Puffer des Kernels", + "settings": "netdev_max_backlog=8192, rmem_max=16M, wmem_max=16M, somaxconn=8192" + }, + { + "area": "ICMP-Härtung", + "settings": "icmp_echo_ignore_broadcasts=1, icmp_ignore_bogus_error_responses=1" + }, + { + "area": "Routing-Sicherheit", + "settings": "accept_redirects=0, accept_source_route=0, secure_redirects=0, send_redirects=0, log_martians=0" + }, + { + "area": "Rückwärtspfadfilter", + "settings": "rp_filter=2 (lockerer Modus, siehe Hinweis unten)" + }, + { + "area": "TCP", + "settings": "tcp_mtu_probing=1, tcp_rfc1337=1, tcp_sack=1, tcp_rmem=8K/87K/16M, tcp_wmem=8K/64K/16M" + }, + { + "area": "Ports", + "settings": "ip_local_port_range=1024 65535 (Bereich kurzlebiger Ports)" + }, + { + "area": "Unix-Sockets", + "settings": "net.unix.max_dgram_qlen=4096" + } + ], + "sourceOutro": "Es fügt auch source /etc/network/interfaces.d/* zu /etc/network/interfaces hinzu, wenn nicht bereits vorhanden - Standardpraxis, so dass Sie modulare Schnittstellensnippets ablegen können, ohne die Hauptdatei zu bearbeiten.", + "fwbrTitle": "Automatisches Tuning von virtuellen Firewall Bridges", + "fwbrBody": "Zusätzlich zum sysctl-Profil installiert ProxMenux das Hilfsskript /usr/local/sbin/proxmenux-fwbr-tune. Es setzt rp_filter=0 und log_martians=0 für die Schnittstellen fwbr* / fwln* / fwpr* / tap*, die Proxmox für VMs und Container erstellt. Die einmalig ausgeführte Unit proxmenux-fwbr-tune.service ruft es beim Booten auf, die Regel /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules bei jedem net add-Ereignis mit diesen Präfixen. So werden auch bei VM-Start/-Stopp, Neustart und Live-Migration neu erstellte Schnittstellen erfasst. Direkt nach der Installation verarbeitet das Skript zudem alle bereits vorhandenen Schnittstellen.", + "rpFilterTitle": "Warum rp_filter=2 (lose) statt 1 (streng)", + "rpFilterBody": "Strenge Rückwärtspfadfilterung verwirft Pakete, deren Quelladresse über eine andere Schnittstelle erreichbar wäre. Das ist ein sinnvoller Standard für Clients, kann aber auf einem Proxmox-Host Probleme verursachen: VM-Verkehr kommt häufig über eine Bridge an und geht bei asymmetrischem Routing über einen Uplink hinaus. rp_filter=2 (locker) verwirft nur Pakete mit tatsächlich nicht erreichbaren Quelladressen. Der Kompromiss: etwas geringere Erkennung lokaler IP-Adressfälschung, dafür ein funktionierendes VM-Netz." + }, + "ovs": { + "heading": "Open vSwitch installieren", + "intro": "Installiert openvswitch-switch + openvswitch-common. Damit steht OVS als Alternative zu den standardmäßigen Linux-Bridges von Proxmox bereit. Die Installation allein ändert keine Netzwerkkonfiguration; vorhandene vmbrX-Bridges funktionieren weiter. Wenn Sie eine neue Bridge erstellen, können Sie OVS im Typ-Auswahlmenü der Proxmox-Oberfläche wählen.", + "tipTitle": "Wenn OVS Sinn macht", + "tipBody": "Ziehen Sie OVS in Betracht, wenn Sie VLAN-Trunking mit nicht zusammenhängenden VLAN-IDs, LACP mit LLDP in bestimmten Modi, feingranulare Programmierung von Datenflüssen (OpenFlow) oder die Zusammenarbeit mit SDN-Controllern benötigen. Für ein Heimlabor mit wenigen VLANs und einem LACP-Uplink sind Linux-Bridges + vmbrX.VID einfacher und gut geeignet.", + "revertTitle": "Reversibel aus dem Menü Deinstallieren", + "revertBody": "OVS wird erfasst. Optimierungen deinstallieren führt apt purge für openvswitch-switch und openvswitch-common aus. Migrieren Sie OVS-Bridges vor der Deinstallation zu Linux-Bridges, sonst verlieren die VMs darauf beim nächsten Start die Netzwerkanbindung. Manuelles Äquivalent:" + }, + "bbr": { + "heading": "TCP BBR + TCP Fast Open aktivieren", + "intro": "Schreibt zwei sysctl-Dateien und lädt sie neu. BBR ersetzt CUBIC durch Googles bandbreitenbasierten Überlastungsalgorithmus, der Verbindungen mit hoher Kapazität und Latenz sowie verlustbehaftete Verbindungen besser verarbeitet. TCP Fast Open (TFO) spart bei wiederholten TCP-Verbindungen einen Umlauf, indem bereits der SYN Daten mitführt.", + "verifyTitle": "Verifizierung", + "impactTitle": "Die Wirkung hängt von der Arbeitslast ab", + "impactBody": "BBR ist bei hoher Latenz oder Paketverlust besonders hilfreich (kontinentübergreifende Replikation, VPN-Tunnel, mobile Clients). Im LAN zwischen zwei Rechnern am selben Switch liegt der Unterschied oft innerhalb der Messschwankungen. TFO hilft besonders bei kurzen, wiederholten HTTP-Verbindungen.", + "revertTitle": "Reversibel aus dem Menü Deinstallieren", + "revertBody": "BBR/TFO werden erfasst. Optimierungen deinstallieren entfernt die zwei sysctl-Dateien (/etc/sysctl.d/99-kernel-bbr.conf und 99-tcp-fastopen.conf) und lädt die übrige Konfiguration neu. Das Löschen setzt aktive Kernelwerte nicht automatisch zurück. Standards wie cubic und tcp_fastopen=1 gelten nach einem Neustart, sofern keine andere Konfiguration sie überschreibt. Manuelles Äquivalent:" + }, + "names": { + "heading": "Schnittstellennamen (persistent)", + "intro": "Durchläuft alle physischen Netzwerkkarten des Hosts (überspringt Loopback, Docker-veths, Bridges, TAP-Geräte, Bonds, Cilium, ZeroTier und WireGuard). Für jede schreibt es eine systemd-.link-Datei, die den aktuellen Namen an die aktuelle MAC-Adresse bindet. Damit hat die MAC-Zuordnung Vorrang vor der Namenslogik des Kernels.", + "whyTitle": "Warum das wichtig ist", + "whyItems": [ + "Das Hinzufügen oder Entfernen von PCIe-Geräten kann die Busnummerierung verschieben und enp3s0 in enp4s0 verwandeln. Wenn Ihr /etc/network/interfaces auf den alten Namen verweist, verschwindet die Brücke beim Neustart.", + "BIOS / Firmware-Updates ändern manchmal, wie Geräte aufgezählt werden, mit dem gleichen Effekt.", + "Das Hilfsskript weist physischen Netzwerkkarten feste Namen zu, auch den physischen Ports eines Bonds. Virtuelle Schnittstellen wie LXC-veth-Geräte und die Bond-Geräte selbst werden übersprungen. Namenskonflikte virtueller hotplug-NICs behebt es nicht." + ], + "writtenTitle": "Was geschrieben wird", + "writtenIntro": "Eine Datei pro physischem NIC, bei /etc/systemd/network/10-proxmenux-<iface>.link. Jede Datei beginnt mit dem Header # Managed by ProxMenux — do not edit, so dass ProxMenux seine eigenen Dateien von benutzer- oder paketgebundenen .link-Dateien unterscheiden kann.", + "writtenOutro": ".link-Dateien anderer Pakete oder des Benutzers bleiben erhalten; nur Dateien mit ProxMenux-Header werden verwaltet. Bei erneutem Ausführen gleicht die Funktion ihren Bestand ab: Sie liest MACAddress= aus jeder 10-proxmenux-*.link und entfernt Dateien, deren MAC unter /sys/class/net/ nicht mehr vorkommt. Dateien älterer ProxMenux-Versionen im Format 10-<iface>.link werden beim ersten Lauf automatisch migriert.", + "pveTitle": "PVE 9 vs PVE 8", + "pveBody": "Das Skript nutzt systemd-.link-Dateien für feste Namen. Auf Proxmox VE 9 lädt es danach zusätzlich udev-Regeln neu, damit neu hinzugefügte NICs sie ohne Neustart nutzen können. Prüfen Sie vorhandene Schnittstellen nach einem Neustart auf PVE 8 und PVE 9. Der Host bleibt bei ifupdown2. In beiden Fällen setzt das Skript das Neustart-Flag, damit die anpassbare Nachinstallation danach fragt.", + "reviewTitle": "Überprüfen Sie zuerst bestehende /etc/network/interfaces", + "reviewBody": "Verweist die ältere Konfiguration in /etc/network/interfaces auf automatisch vom Kernel erzeugte NIC-Namen, ist das Festschreiben der aktuellen Namen sinnvoll. Haben Sie die Konfiguration bereits manuell an bestimmte Namen angepasst, prüfen Sie vor dem Neustart sorgfältig, ob die festen Namen mit der interfaces-Datei übereinstimmen.", + "revertTitle": "Reversibel aus dem Menü Deinstallieren", + "revertBody": "Optimierungen deinstallieren löscht nur 10-proxmenux-*.link-Dateien mit ProxMenux-Header aus /etc/systemd/network/. Jede vom Benutzer oder anderen Paketen hinzugefügte .link-Datei bleibt erhalten. Beim nächsten Neustart gilt wieder das Standard-Namensverhalten von systemd." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Netzwerkmanagement", + "href": "/docs/network", + "tail": " — Diagnose, Bridge-Analyse und geführte Reparaturen." + }, + { + "label": "Persistente Schnittstellennamen", + "href": "/docs/network/persistent-names", + "tail": " — dieselbe Funktion später als eigener Menüpunkt; verwenden Sie eine der beiden Möglichkeiten." + }, + { + "label": "Referenz der Netzwerkbefehle", + "href": "/docs/help-info/network-commands", + "tail": " — ip, ss, ethtool, sysctl." + }, + { + "label": "Optimierungen deinstallieren", + "href": "/docs/post-install/uninstall", + "tail": " — diese Netzwerkänderungen rückgängig machen." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/optional.json b/web/messages/de/docs/post-install/optional.json new file mode 100644 index 00000000..ea729e99 --- /dev/null +++ b/web/messages/de/docs/post-install/optional.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Post-Install: Optionale Einstellungen", + "description": "Anleitung zu optionalen Einstellungen im ProxMenux-Skript nach der Installation für zusätzliche Proxmox VE-Funktionen und -Optimierungen.", + "ogTitle": "ProxMenux Post-Install: Optionale Einstellungen", + "ogDescription": "Anleitung zu optionalen Einstellungen im ProxMenux-Skript nach der Installation für zusätzliche Proxmox VE-Funktionen und -Optimierungen.", + "ogImageAlt": "ProxMenux Optionale Einstellungen nach der Installation" + }, + "title": "Optionale Einstellungen", + "intro": "Die Kategorie Optionale Einstellungen bietet zusätzliche Funktionen und Optimierungen für Ihre Proxmox-VE-Installation. Sie sind nicht unbedingt erforderlich, können aber in bestimmten Situationen die Fähigkeiten des Systems erweitern.", + "available": "Verfügbare optionale Funktionen", + "stepLabel": "Schritt", + "ceph": { + "title": "Aktuelle Ceph Unterstützung hinzufügen", + "intro": "Diese Option installiert die neueste Ceph-Speichersystemunterstützung für Proxmox VE. Ceph ist ein verteiltes Speichersystem, das hohe Leistung, Zuverlässigkeit und Skalierbarkeit bietet.", + "doesIntro": "Was sie tut:", + "doesItems": [ + "Fügt das Ceph-Repository zu Ihrem System hinzu", + "Paketlisten aktualisieren", + "Installiert Ceph-Pakete mit dem Befehl 'pveceph install'", + "Überprüft die Installation" + ], + "howUse": "Verwendung: Nach der Installation können Sie den Ceph-Speicher mit der Proxmox VE-Weboberfläche oder den Befehlszeilentools konfigurieren und verwalten.", + "automates": "Diese Anpassung automatisiert die folgenden Befehle:" + }, + "amd": { + "title": "AMD-CPU-Korrekturen anwenden", + "intro": "Diese Option wendet spezifische Korrekturen für AMD EPYC und Ryzen CPUs an, um die Stabilität und Kompatibilität zu verbessern.", + "doesIntro": "Was sie tut:", + "doesItems": [ + "Erkennen, ob ein AMD EPYC oder Ryzen CPU vorhanden ist", + "Wendet den Kernelparameter 'idle=nomwait' an, um zufällige Abstürze zu verhindern (über /etc/kernel/cmdline auf systemd-Boot-Hosts oder /etc/default/grub auf GRUB-Hosts — mit einem .bak des Originals)", + "Konfiguriert KVM, um bestimmte MSRs (Model Specific Registers) für eine bessere Windows-Gastkompatibilität zu ignorieren" + ], + "howUse": "Verwendung: Diese Fixes werden automatisch angewendet und erfordern einen Systemneustart.", + "automates": "Diese Anpassung automatisiert die folgenden Befehle:" + }, + "ha": { + "title": "Hochverfügbarkeitsdienste ermöglichen", + "intro": "Diese Option ermöglicht High Availability (HA)-Dienste in Proxmox VE und ermöglicht ein automatisches Failover von VMs und Containern im Falle eines Knotenausfalls.", + "doesIntro": "Was sie tut:", + "doesItems": [ + "Aktiviert und startet den Dienst pve-ha-lrm (Local Resource Manager)", + "Aktiviert und startet den pve-ha-crm (Cluster Resource Manager) Service", + "Aktiviert und startet den corosync-Dienst für die Clusterkommunikation" + ], + "howUse": "Verwendung: Nach Aktivierung dieser Dienste können Sie HA-Gruppen und -Ressourcen in der Proxmox VE-Weboberfläche konfigurieren.", + "automates": "Diese Anpassung automatisiert die folgenden Befehle:" + }, + "pveam": { + "title": "Proxmox VE Appliance Manager aktualisieren", + "intro": "Aktualisiert den lokalen Index der Containervorlagen, den pveam in der Proxmox-Oberfläche bereitstellt. So ist die Liste der verfügbaren Softwarevorlagen beim nächsten Erstellen eines LXC aktuell.", + "doesIntro": "Was sie tut:", + "doesItems": [ + "Führt pveam update gegen die Proxmox-Spiegelserver aus, um den aktuellen Katalog der Softwarevorlagen abzurufen", + "Füllt die Liste der Softwarevorlagen in der Weboberfläche beim Erstellen eines Containers" + ], + "howUse": "Verwendung: Einmal ausführen, wenn die Vorlagenliste in der Oberfläche veraltet wirkt oder Sie den Spiegelserver gewechselt haben. Es lädt nur den Katalogindex herunter, nicht die Vorlagen selbst.", + "automates": "Diese Anpassung automatisiert den folgenden Befehl:" + }, + "fastfetch": { + "title": "Installieren und Konfigurieren von Fastfetch", + "intro": "Diese Option installiert und konfiguriert leise Fastfetch, ein Systeminformationstool, das Systemspezifikationen und ein benutzerdefiniertes Logo beim Login anzeigt.", + "doesLabel": "Was sie tut:", + "doesItems": [ + "Lädt und installiert die neueste Fastfetch-Version ohne zusätzliche Rückfragen", + "Ermöglicht Ihnen die Auswahl eines benutzerdefinierten Logos (ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology oder ein benutzerdefiniertes).", + "Konfiguriert Fastfetch zur Anzeige von \"System optimiert durch ProxMenux\"", + "Richtet Fastfetch so ein, dass es automatisch bei der Konsolenanmeldung ausgeführt wird" + ], + "importantLabel": "Wichtig:", + "importantBody": "Wenn Sie sich über SSH mit Proxmox verbinden, sollten Sie das Proxmox-Logo auswählen oder ein benutzerdefiniertes mit jp2a oder img2txt erstellen. Die anderen Logos werden mit chafa generiert und werden in einer Standard-SSH-Sitzung möglicherweise nicht korrekt angezeigt.", + "customLabel": "Eigene Logos:", + "customBody1": "Um ein benutzerdefiniertes Logo zu verwenden, legen Sie Ihre ASCII-Kunsttextdatei in: /usr/local/share/fastfetch/logos/", + "customBody2": "Sie können benutzerdefinierte Logos mit Tools wie chafa, jp2a oder img2txt erstellen.", + "customBody3": "Für beste Ergebnisse:", + "customItems": [ + "Halten Sie die Logohöhe auf 35-Linien oder weniger, um Proportionen beizubehalten und in das Terminal zu passen", + "Verwenden Sie chafa für Farblogos (in SSH-Sitzungen möglicherweise nicht korrekt angezeigt)", + "Verwenden Sie jp2a oder img2txt für SSH-kompatible Logos" + ], + "examplesLabel": "Beispiel Logos:", + "logos": [ + { + "name": "ProxMenux", + "alt": "ProxMenux-Logo", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmenux.png" + }, + { + "name": "Proxmox", + "alt": "Proxmox-Logo", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmox.png" + }, + { + "name": "JC Channel", + "alt": "JC-Channel-Logo", + "src": "/fastfetch/jc-channel.png" + }, + { + "name": "Helper-Scripts", + "alt": "Helper-Scripts-Logo", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/helper-scripts.png" + }, + { + "name": "Home-Labs-Club", + "alt": "Home-Labs-Club-Logo", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/home-labs-club.png" + }, + { + "name": "Proxmology", + "alt": "Proxmology-Logo", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmology.png" + } + ], + "automates": "Diese Anpassung automatisiert die folgenden Befehle:" + }, + "figurine": { + "title": "Installieren und Konfigurieren von Figurine", + "intro": "Diese Option installiert und konfiguriert Figurine, ein Tool, das stilvolle ASCII-Textbanner für Ihr Terminal erstellt und Ihren Hostnamen in einem optisch ansprechenden 3D-Format anzeigt.", + "doesLabel": "Was sie tut:", + "doesItems": [ + "Lädt Figurine v2.1.1 von GitHub herunter und installiert die passende Version für die Host-Architektur (AMD64, ARM64 oder ARMv7)", + "Erstellen Sie eine Begrüßungsnachricht, die Ihren Hostnamen in 3D ASCII-Kunst anzeigt, wenn Sie sich anmelden", + "Aktualisiert eine vorhandene Figurine-Programmdatei erst nach erfolgreichem Download und Entpacken", + "Richtet die Willkommensnachricht so ein, dass sie automatisch beim Login ausgeführt wird" + ], + "practicalLabel": "Praktische Verwendung:", + "practicalBody": "Beim Verwalten mehrerer Proxmox-Knoten in einem Cluster bietet Figurine eine sofortige visuelle Anzeige, an welchem Knoten Sie gerade angemeldet sind. Dies verhindert versehentliche Befehle auf dem falschen Knoten und verbessert Ihren Workflow bei der Verwaltung mehrerer Server.", + "exampleLabel": "Beispielausgabe:", + "imageAlt": "Figurine Beispielausgabe", + "automates": "Diese Anpassung automatisiert den folgenden Prozess:", + "outro": "Nach der Installation wird Ihr Hostname bei jeder Anmeldung in 3D ASCII-Kunst angezeigt, wodurch sofort klar wird, an welchem Proxmox-Knoten Sie arbeiten." + }, + "log2ram": { + "title": "Log2RAM installieren (SSD/NVMe Verschleißreduzierung)", + "intro": "Log2RAM bindet /var/log als tmpfs-RAM-Disk ein und synchronisiert regelmäßig auf den Datenträger. Das Puffern häufiger journald-Schreibvorgänge im RAM kann SSD-Verschleiß und Datenträger-I/O verringern. Synchronisierung und sauberes Herunterfahren sichern die Logs; bei abruptem Stromausfall können Einträge seit der letzten Synchronisierung verloren gehen.", + "upstreamLabel": "Vorgelagertes Projekt:", + "upstreamUrl": "https://github.com/azlux/log2ram", + "upstreamLinkLabel": "azlux/log2ram auf GitHub", + "doesLabel": "Was ProxMenux tut:", + "doesItems": [ + "Erkennt anhand von /sys/block/<dev>/queue/rotational, ob die Systemplatte SSD/NVMe ist. Bei einer rotierenden Festplatte fragt die automatisierte Variante vor der Installation nach.", + "Klont das Originalprojekt (azlux/log2ram) nach /tmp/log2ram und passt install.sh an: rsync -aAXv wird durch rsync -aXv --no-acls ersetzt. Dadurch wird der Fehler set_acl: Operation not supported mit Exitcode 23 vermieden, der beim Verschieben von /var/log auf Dateisystemen ohne ACL-Unterstützung auftreten kann. Die systemd-Unit log2ram wird nach Installation aktiviert.", + "Größe der Ramdisk auf Basis des Hosts RAM: ≤ 8 GB → 128M, ≤ 16 GB → 256M, > 16 GB → 512M. Schreibt den Wert in SIZE= in /etc/log2ram.conf.", + "Plant eine regelmäßige Datenträgersynchronisierung über /etc/cron.d/log2ram: alle 1 / 3 / 6 Stunden entsprechend derselben RAM-Stufe.", + "Installiert den Schutz /usr/local/bin/log2ram-check.sh, der über /etc/cron.d/log2ram-auto-sync alle 10 Minuten läuft. Bei 80% Belegung von /var/log bereinigt er journald. Bei 92% führt er zunächst logrotate -f /etc/logrotate.d/proxmox-backup-api aus, falls die Datei existiert: Die PBS-API-Logs sind oft der größte Platzverbraucher auf einem PBS-Host. Danach kürzt er pveproxy access/error und pveam.log vor der Synchronisierung. log2ram write allein kopiert tmpfs auf Disk, verkleinert es aber nicht. Der Schutz hilft gegen PVE-Ausfälle mit No space left on device durch unkontrolliertes Logwachstum.", + "Erkennt den Dienst proxmox-backup-server auf dem Host. Falls vorhanden, erstellt es /etc/logrotate.d/proxmox-backup-api (20 MB × 3 Rotationen) und /etc/cron.hourly/proxmox-backup-logrotate, damit die häufig stark wachsenden PBS-API-Logs auch zwischen Log2RAM-Synchronisierungen begrenzt werden. Ohne PBS erfolgt keine Änderung.", + "Stellt systemd-journald-Grenzwerte (SystemMaxUse, RuntimeMaxUse) so ein, dass sie in die Ramdisk passen, so dass ein einzelner Burst sie nicht füllen kann.", + "Wird in installed_tools.json erfasst und kann über Optimierungen deinstallieren rückgängig gemacht werden." + ], + "howUseLabel": "Wie zu verwenden:", + "howUseBody": "Die automatisierte Variante installiert Log2RAM unbeaufsichtigt bei erkanntem SSD-/NVMe-Systemlaufwerk. Die anpassbare Variante fragt nach Größe, Intervall und Auto-Sync-Schutz. Die Abfrage nennt derzeit 90%, das erzeugte Skript nutzt jedoch 80% für Bereinigung und 92% für die oben beschriebene intensive Bereinigung.", + "verifyLabel": "Überprüfen und Verwalten aus der Shell:", + "verifyCode": "# Service state and configured timers\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Current ramdisk usage — /var/log IS the tmpfs itself\ndf -h /var/log\n\n# Force a sync now (tmpfs → disk); does NOT shrink the tmpfs\nlog2ram write\n\n# Trigger the auto-sync guard on demand (vacuum + sync when usage is high)\n/usr/local/bin/log2ram-check.sh\n\n# Current config: SIZE, mail settings, path\ncat /etc/log2ram.conf\n\n# ProxMenux-specific cron jobs\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Recent Log2RAM activity\njournalctl -u log2ram -n 50 --no-pager" + }, + "zram": { + "title": "ZRAM-Swap-Profil aktivieren", + "intro": "Erstellt das komprimierte Swap-Gerät /dev/zram0 im RAM mit systemd-zram-generator. Ausgelagerte Speicherseiten werden mit zstd komprimiert und im RAM gehalten, bevor Swap auf dem Datenträger genutzt wird.", + "doesLabel": "Was sie tut:", + "doesItems": [ + "Installiert systemd-zram-generator, wenn es fehlt, und zeichnet auf, ob ProxMenux es installiert hat.", + "Schreibt /etc/systemd/zram-generator.conf.d/90-proxmenux.conf: ein zram0-Gerät mit einem Zehntel des Host-RAMs, zstd-Komprimierung (zstd(level=9) mit systemd-zram-generator ab 1.2.0) und Swap-Priorität 32767.", + "Mit dieser Priorität füllt der Kernel zuerst ZRAM. Ein vorhandener Swap auf der Festplatte behält seine eigene Priorität und nimmt die Seiten, die nicht mehr in ZRAM passen.", + "Sucht vor Änderungen nach einer anderen ZRAM-Konfiguration: aktivem zram-Swap, zram-Eintrag in /etc/fstab, systemd-Unit oder anderer Generatordatei. Wird eine gefunden, bricht die Option ab und lässt sie unverändert.", + "Startet dev-zram0.swap und überprüft, ob das aktive Gerät mit dem Profil übereinstimmt. Wenn nicht, wird der vorherige Zustand wiederhergestellt.", + "Wird in installed_tools.json erfasst und kann über Optimierungen deinstallieren rückgängig gemacht werden." + ], + "howUseLabel": "Wie zu verwenden:", + "howUseBody": "Diese Option gibt es nur in der anpassbaren Variante; die automatisierte wendet sie nicht an. Das Gerät wird bei jedem Start neu erstellt. Solange es aktiv ist, zeigt die Karte „Arbeitsspeicher“ in ProxMenux Monitor Kapazität, belegten Swap, Algorithmus, Kompressionsverhältnis und tatsächlichen RAM-Verbrauch.", + "verifyLabel": "Überprüfen Sie von der Shell:", + "verifyCode": "# Active swap devices and their priority\nswapon --show\n\n# ZRAM device: algorithm, size and compressed data\nzramctl\n\n# Profile written by ProxMenux\ncat /etc/systemd/zram-generator.conf.d/90-proxmenux.conf\n\n# State of the swap unit\nsystemctl status dev-zram0.swap" + }, + "autoApplication": { + "title": "Automatische Anwendung", + "body": "Wählen Sie in der anpassbaren Variante die optionalen Funktionen nach Bedarf. Log2RAM gehört mit Hardwareerkennung auch zur automatisierten Variante; ZRAM bleibt ausschließlich anpassbar. Die Abschnitte erläutern Abfragen und Voraussetzungen." + } +} diff --git a/web/messages/de/docs/post-install/performance.json b/web/messages/de/docs/post-install/performance.json new file mode 100644 index 00000000..c891c190 --- /dev/null +++ b/web/messages/de/docs/post-install/performance.json @@ -0,0 +1,61 @@ +{ + "meta": { + "title": "Nach der Installation: Leistung | ProxMenux-Dokumentation", + "description": "Leistungsoptionen im anpassbaren ProxMenux-Skript nach der Installation. Ersetzt das einsträngige gzip durch pigz (paralleles gzip) für schnellere Backups und Komprimierung auf Hosts mit mehreren Kernen." + }, + "header": { + "title": "Nach der Installation: Leistung", + "description": "Leistungsoptionen innerhalb des anpassbaren Post-Installationsskripts. Derzeit enthält diese Kategorie eine einzige Optimierung: Ersetzen von gzip durch pigz, so dass Backups und Kompression jeden CPU-Kern anstelle von einem verwenden.", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was diese Kategorie abdeckt", + "body": "Die einzige Leistungsoption hier leitet das gzip des Systems auf eine parallele Implementierung um. Andere Leistungsanpassungen wie Speicheroptimierung, E/A-Scheduling, ZFS-ARC-Größe und Kernel-Limits finden Sie in ihren Kategorien (System, Speicher), da sie andere Subsysteme betreffen." + }, + "pigz": { + "heading": "Verwenden Sie pigz für eine schnellere GZIP-Komprimierung", + "intro": "Standard-gzip komprimiert Daten mit einem einzigen CPU-Kern. Auf modernen Proxmox-Hosts mit 8, 16 oder 32 Kernen ist das ein großer Engpass bei VM-/CT-Backups mit vzdump, Logrotation und allen Vorgängen über gzip. pigz ist ein direkt einsetzbarer paralleler Ersatz: dieselbe gzip-kompatible Ausgabe, aber auf alle Kerne verteilte Arbeit.", + "doesTitle": "Was ProxMenux tut", + "doesIntro": "Fünf Schritte, alle idempotent:", + "doesItems": [ + "Setzt pigz: 1 in /etc/vzdump.conf, so dass das Backup-Tool von Proxmox pigz nativ verwendet.", + "Installiert das Paket pigz apt, falls nicht bereits vorhanden.", + "Schreibt ein Wrapper-Script bei /bin/pigzwrapper, das jedes Argument an /usr/bin/pigz weiterleitet.", + "Registriert eine dpkg-Umleitung für das Systemprogramm gzip (/usr/bin/gzip bei Proxmox VE 9, /bin/gzip bei Proxmox VE 8). Die Originaldatei bleibt daneben als gzip.distrib erhalten und wird durch den Wrapper ersetzt. Danach verwendet alles, was gzip aufruft — logrotate, tar czf, Skripte und vzdump — transparent pigz.", + "Prüft, ob die als gzip.distrib gespeicherte Datei ein funktionierender Gzip ist, bevor der Wrapper installiert wird, und installiert das gzip-Paket zuerst neu, wenn dies nicht der Fall ist. Ein Host, der noch den früheren /bin/gzip.original-Swap hat, wird in die Umleitung verschoben, wenn die Option erneut angewendet wird." + ], + "replacesTitle": "Ersetzt ein Systemprogramm", + "replacesBody": "Ein Wrapper anstelle von gzip ist ungewöhnlich. Das ist sicher, da der Wrapper gzip-kompatible Ausgabe erzeugt. Skripte mit fest kodierten Pfaden, in restriktiven chroot-Umgebungen oder mit Prüfung von Binärdatei-Hashes können sich jedoch anders verhalten. Das Original bleibt als gzip.distrib erhalten. Durch die dpkg-Umleitung aktualisieren Updates des Pakets gzip und das Upgrade von Proxmox VE 8 auf 9 diese Datei, während der Wrapper erhalten bleibt.", + "revertTitle": "Reversibel aus dem Menü Deinstallieren", + "revertBody": "Diese Optimierung wird erfasst. Optimierungen deinstallieren kopiert das Original aus gzip.distrib über den Wrapper, entfernt die Umleitung und pigzwrapper, kommentiert die Zeile pigz in /etc/vzdump.conf aus und führt nach erfolgreicher gzip-Prüfung apt purge pigz aus. Manuelles Äquivalent für Proxmox VE 9:", + "verifyTitle": "Verifizierung", + "verifyBody": "Nach der Anwendung sollte gzip --version pigz erwähnen. Ein schneller Benchmark zeigt auch den Geschwindigkeitsunterschied auf einem Multi-Core-Host:", + "whenTitle": "Wenn das am wichtigsten ist", + "whenBody": "Der Nutzen wächst mit der Anzahl der CPU-Kerne und der Häufigkeit der Backups. Auf einem Heimlaborrechner mit 2 Kernen und einem täglichen vzdump ist der Vorteil gering. Auf einem Produktionshost mit 16 Kernen, der jede Nacht ein Dutzend VMs sichert, kann pigz das Backup-Zeitfenster auf einen Bruchteil der Zeit von einsträngigem gzip verkürzen." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Backup- und Wiederherstellungsbefehle", + "href": "/docs/help-info/backup-commands", + "tailRich": " — vzdump-CLI-Referenz einschließlich der Thread-Option --pigz." + }, + { + "label": "Speicher", + "href": "/docs/post-install/storage", + "tail": " — Geschwindigkeitsgrenzen für vzdump und ZFS-ARC-Anpassungen." + }, + { + "label": "System", + "href": "/docs/post-install/system", + "tail": " — Anpassung von Dateideskriptoren und Speicher." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/security.json b/web/messages/de/docs/post-install/security.json new file mode 100644 index 00000000..361346ab --- /dev/null +++ b/web/messages/de/docs/post-install/security.json @@ -0,0 +1,57 @@ +{ + "meta": { + "title": "Post-Install: Sicherheit | ProxMenux Dokumentation", + "description": "Sicherheitsoptionen im anpassbaren ProxMenux-Skript nach der Installation. Derzeit eine Option: den Dienst portmapper/rpcbind deaktivieren, um die Angriffsfläche des Hosts zu reduzieren." + }, + "header": { + "title": "Post-Install: Sicherheit", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was diese Kategorie abdeckt", + "body": "Die Sicherheit nach der Installation beschränkt sich auf Host-Härtung, die sicher unbeaufsichtigt angewendet werden kann: selten benötigte Dienste deaktivieren und dies über Deinstallieren wieder rückgängig machen. Aktive Sicherheitswerkzeuge wie Fail2Ban zur Einbruchsverhinderung und Lynis für Audits finden Sie unter Sicherheit im ProxMenux-Hauptmenü, außerhalb der Nachinstallation." + }, + "rpcbind": { + "heading": "Portmapper/rpcbind deaktivieren", + "intro": "rpcbind (früher portmap) ordnet RPC-Programmnummern Netzwerkports zu. NFS und einige ältere RPC-Werkzeuge sind davon abhängig. Auf einem typischen Proxmox-Host ohne NFS-Server nutzt es nichts; aktiviert bleibt Port 111/tcp auf allen Schnittstellen offen.", + "whyTitle": "Warum es sich lohnt zu deaktivieren", + "whyItems": [ + "Reduziert die Angriffsfläche des Hosts – ein Hördienst weniger, um den man sich Sorgen machen muss.", + "Historisch missbraucht als Reflexions- / Verstärkungsvektor in DDoS-Angriffen. Durch das Deaktivieren von rpcbind wird dieser Verstärkungsfaktor für Ihren Host entfernt.", + "Entfernt das Rauschen, das es in Protokollen und netstat / ss erzeugt, wodurch echte Aktivitäten leichter zu erkennen sind." + ], + "nfsTitle": "Deaktivieren Sie dies nicht, wenn Sie NFS verwenden", + "nfsBody": "NFS-Server und NFS-Client benötigen rpcbind zur Aushandlung der Ports für mountd, statd, lockd usw. Wenden Sie diese Option nicht an, wenn Ihr Proxmox-Host NFS-Freigaben exportiert oder NFS-Freigaben eines NAS einbindet. Das Einbinden schlägt sonst mit mount.nfs: rpc.statd is not running oder ähnlichen Fehlern fehl.", + "runsTitle": "Was ProxMenux ausführt", + "runsOutro": "Das Paket bleibt installiert. ProxMenux zeichnet den ursprünglichen aktivierten/aktiven Zustand von rpcbind.service und rpcbind.socket auf und deaktiviert und stoppt dann beide Einheiten, so dass die Socket-Aktivierung den Dienst nicht zurückbringen kann.", + "verifyTitle": "Verifizierung", + "verifyBody": "Bestätigen Sie nach der Anwendung, dass rpcbind deaktiviert ist und nichts auf Port 111 zuhört:", + "reversibleTitle": "Wiederherstellen des ursprünglichen Service-Status", + "reversibleBody": "Die Änderung wird in installed_tools.json erfasst. Optimierungen deinstallieren setzt jede rpcbind-Einheit auf den zuvor aufgezeichneten aktivierten/deaktivierten und aktiven/inaktiven Zustand zurück. Dabei wird nicht vorausgesetzt, dass rpcbind auf jedem Host aktiviert war." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Sicherheitsmenü", + "href": "/docs/security", + "tail": " — leistungsfähigere Werkzeuge: Fail2Ban (Einbruchsverhinderung) und Lynis (Audit)." + }, + { + "label": "Lynis", + "href": "/docs/security/lynis", + "tail": "– Überprüfen Sie den Host, um weitere Möglichkeiten zur Härtung zu finden." + }, + { + "label": "Nützliche Systembefehle", + "href": "/docs/help-info/system-commands", + "tail": " — Referenz für Dienststatus, journalctl und lynis audit." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/storage.json b/web/messages/de/docs/post-install/storage.json new file mode 100644 index 00000000..93085edd --- /dev/null +++ b/web/messages/de/docs/post-install/storage.json @@ -0,0 +1,167 @@ +{ + "meta": { + "title": "Nachinstallation: Speicher | ProxMenux Dokumentation", + "description": "Speicheroptimierungen im anpassbaren Nachinstallationsskript von ProxMenux: ZFS-ARC-Größe nach Host-RAM, regelmäßige Snapshots mit zfs-auto-snapshot und Entfernen der vzdump-Backup-Drosselung." + }, + "header": { + "title": "Post-Installation: Speicher", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was diese Kategorie abdeckt", + "body": "Vier Speicheroptimierungen: ZFS ARC auf einen sinnvollen Anteil des Host-RAMs abstimmen, automatische ZFS-Snapshots installieren und planen, ZFS autotrim auf SSD-/NVMe-Pools aktivieren und vzdump von Drosselungen befreien. Wählen Sie die unabhängigen Optionen passend zu Ihrem System. Als fünfte speichernahe Option reduziert Log2RAM SSD-/NVMe-Schreibvorgänge, indem es /var/log in eine RAM-Disk verschiebt. Es steht unter Optional, weil das anpassbare Menü es dort einordnet." + }, + "trackedTitle": "Alle vier werden im Deinstallationsmenü erfasst", + "trackedBody": "Jede Option registriert ein Werkzeug in installed_tools.json für Optimierungen deinstallieren. zfs_arc entfernt /etc/modprobe.d/99-zfsarc.conf und erstellt initramfs neu; zfs_auto_snapshot entfernt den Cron-Zeitplan und bietet die vollständige Paketentfernung an; zfs_autotrim setzt autotrim=off auf den zuvor aktivierten Pools; vzdump_speed stellt /etc/vzdump.conf aus der bei Installation erstellten .bak wieder her.", + "arc": { + "heading": "ZFS ARC-Größe optimieren", + "intro": "Der Adaptive Replacement Cache (ARC) ist der ZFS-Lesecache im RAM. Proxmox-VE-Installationen ab 8.1 setzen 10% RAM mit maximal 16 GiB; ältere oder aktualisierte Hosts können abweichen. Diese Option schreibt einen eigenen RAM-basierten Grenzwert. Prüfen Sie vorhandene Einstellungen und Arbeitslast; ein kleinerer Cache ist nicht immer schneller.", + "sizingTitle": "Größenregeln", + "headerRam": "Host-Arbeitsspeicher", + "headerMax": "ARC-Obergrenze", + "rows": [ + { + "ram": "Formel", + "max": "RAM / 10, höchstens 16 GiB und mindestens 64 MiB" + }, + { + "ram": "8 GB Host", + "max": "≈ 819 MiB (RAM/10)" + }, + { + "ram": "16 GB Host", + "max": "≈ 1.6 GiB (RAM/10)" + }, + { + "ram": "64 GB Host", + "max": "≈ 6.4 GiB (RAM/10)" + }, + { + "ram": "≥ 160 GB Host", + "max": "16 GiB (Obergrenze)" + } + ], + "after": "Die Datei /etc/modprobe.d/99-zfsarc.conf enthält nur options zfs zfs_arc_max=…. Andere ZFS-Parameter (zfs_arc_min, L2ARC-Vorablesen/Schreibbegrenzung, TXG-Zeitlimit) werden nicht abgestimmt. Vorher prüft ein Abgleich andere *.conf in /etc/modprobe.d/ auf zfs_arc_min / zfs_arc_max, sichert sie mit Manifest unter /usr/local/share/proxmenux/backups/zfs_arc/ und entfernt widersprüchliche Zeilen. Damit bleibt nur ProxMenuxs ARC-Datei aktiv. Anschließend werden update-initramfs -u -k all und gegebenenfalls proxmox-boot-tool refresh ausgeführt, damit der Grenzwert auch im initramfs für ZFS-Root-Systeme ankommt.", + "rebootTitle": "Erfordert einen Neustart, um wirksam zu werden", + "rebootBody": "ARC-Einstellungen werden beim Laden des Kernelmoduls zfs gelesen. Für ZFS-Root-Hosts erzeugt ProxMenux initramfs mit update-initramfs -u -k all neu und aktualisiert bei Bedarf den Bootloader mit proxmox-boot-tool refresh. Der neue Modulparameter wird erst nach Neustart genutzt; das entsprechende Flag wird automatisch gesetzt.", + "safeTitle": "Sicher auf Nicht-ZFS-Hosts", + "safeBody": "Die Funktion schreibt die Konfiguration nur, wenn zpool list mindestens einen importierten ZFS-Pool meldet. Auf ext4 / LVM-only Proxmox-Hosts oder auf Maschinen, auf denen die ZFS-Tools installiert sind, aber kein Pool importiert wird, ist das Ankreuzen dieser Option ein No-Op - nichts wird geschrieben.", + "verifyTitle": "Verifizierung und manuelles Rollback" + }, + "autoSnap": { + "heading": "ZFS-Auto-Snapshot installieren", + "intro": "Installiert zfs-auto-snapshot und schreibt die Cron-Zeitpläne für automatische Snapshots in mehreren Intervallen neu. Eine einfache zusätzliche Absicherung neben regulären vzdump-Backups.", + "cadenceTitle": "Von ProxMenux eingerichteter Snapshot-Zeitplan", + "headerLabel": "Etikett", + "headerRuns": "Ausführung", + "headerKept": "Snapshots behalten", + "rows": [ + { + "label": "häufig", + "runs": "jede 15 min", + "kept": "4" + }, + { + "label": "stündlich", + "runs": "jede Stunde", + "kept": "1" + }, + { + "label": "täglich", + "runs": "einmal täglich", + "kept": "1" + }, + { + "label": "wöchentlich", + "runs": "einmal pro Woche", + "kept": "1" + }, + { + "label": "monatlich", + "runs": "einmal im Monat", + "kept": "1" + } + ], + "conservativeTitle": "Zurückhaltende Aufbewahrungszahlen", + "conservativeBody": "ProxMenux wird mit konservativer Aufbewahrung ausgeliefert (nur 4 häufig + 1 jedes längeren Intervalls), sodass der ZFS snapshot-Speicher nicht überlastet wird. Wenn Sie eine längere Aufbewahrung wünschen, bearbeiten Sie die Zahlen in /etc/cron.d/zfs-auto-snapshot, /etc/cron.hourly/zfs-auto-snapshot usw., nachdem das Skript ausgeführt wird.", + "onlyZfsTitle": "Nur nützlich für ZFS Pools", + "onlyZfsBody": "Die Installation des Pakets auf einem Ext4-Host ist harmlos, aber sinnlos - es gibt keine ZFS-Datensätze, die es zum Schnappschuss verwenden kann. Überspringen Sie diese Option, wenn Sie ZFS nicht verwenden.", + "verifyTitle": "Verifizierung und manuelles Rollback" + }, + "autotrim": { + "heading": "ZFS-Autotrim aktivieren (SSD/NVMe-Pools)", + "intro": "Aktiviert autotrim auf ZFS-Pools ausschließlich mit TRIM-fähigen SSDs oder NVMe-Laufwerken. Pools mit rotierenden Laufwerken werden vorsorglich übersprungen. Vorhandenes autotrim=on bleibt unverändert.", + "trimTitle": "Was TRIM macht und warum es auf ZFS wichtig ist", + "trimBody1": "SSDs und NVMe-Laufwerke arbeiten intern mit Löschblöcken, die größer als die logischen Dateisystemsektoren sind. Nach dem Löschen einer Datei weiß das Laufwerk zunächst nicht, dass die Sektoren frei sind. Seine Speicherbereinigung kopiert daher eventuell unnötige Daten beim Freimachen weiterer Blöcke. TRIM meldet dem Laufwerk freie Sektoren, damit es sie vorab löschen kann.", + "trimBody2": "Ohne TRIM verschlechtert sich die SSD-Leistung im Laufe der Zeit, da das Laufwerk keine vorgelöschten Blöcke mehr hat und die Lösch-on-Write-Funktion ausführen muss, und die Schreibverstärkung steigt - beides verkürzt die Lebensdauer des Laufwerks. Wenn TRIM aktiviert ist, kann das Laufwerk einen gesunden Pool leerer Blöcke zum Schreiben bereithalten.", + "trimBody3": "Mit autotrim=on trimmt ZFS kürzlich freigegebenen Platz im Hintergrund und bündelt Bereiche. Regelmäßiges zpool trim <pool> ist eine Alternative. Autotrim spart einen eigenen Zeitplan, belastet Geräte aber unterschiedlich; regelmäßiges manuelles TRIM kann für einfachere Laufwerke besser sein.", + "practicalTitle": "Warum kann die Aktivierung nützlich sein?", + "practicalItems": [ + "Dauerhafte Schreibleistung. TRIM kann ungenutzte Blöcke effizient freigeben helfen. Nutzen und Latenzauswirkungen hängen von Gerät und Arbeitslast ab.", + "Laufwerkslebensdauer. Weniger unnötige interne Kopien können Schreibverstärkung und NAND-Verschleiß verringern. Eine bestimmte zusätzliche Lebensdauer ist nicht garantiert.", + "Kein geplanter Cron-Job zum Erinnern. Im Gegensatz zu einem periodischen zpool trim ist Autotrim Fire-and-Forget - der Pool erledigt es selbstständig." + ], + "whenTitle": "Wann ist das notwendig?", + "whenIntro1": "Erwägen Sie die Aktivierung auf ZFS-Pools nur mit TRIM-fähigen SSD-/NVMe-Geräten. Prüfen Sie Verhalten und Latenz; geplantes manuelles TRIM kann geeigneter sein.", + "whenIntro2": "Das Skript überspringt es automatisch auf:", + "whenSkipItems": [ + "Pools mit rotierenden HDD-vdevs — ein vorsichtiger Hardwarefilter dieses Skripts.", + "Laufwerke ohne in sysfs sichtbares discard_granularity — meist alte SSDs ohne TRIM oder Passthrough-Pfade, über die das Betriebssystem das zugrunde liegende Gerät nicht sieht.", + "Pools, in denen ZFS selbst die Eigenschaft nicht unterstützt meldet (selten; sehr alte Pools).", + "Pools bereits auf autotrim=on eingestellt (no-op)." + ], + "whenIntro3": "Nicht relevant für ext4-nur Hosts - es gibt nichts für ZFS zu trimmen. Die Funktion wird in diesem Fall mit einer freundlichen Nachricht beendet.", + "recordedTitle": "Warum nur von ProxMenux geänderte Pools erfasst werden", + "recordedBody": "Die Funktion schreibt einen Pool nur dann in seine interne Zustandsdatei (/usr/local/share/proxmenux/zfs_autotrim_pools), wenn er diesen Pool aktiv von off nach on umgedreht hat. Pools, die Sie vor dem Ausführen des Skripts auf Autotrim hatten, werden aus der Liste ausgeschlossen, so dass eine zukünftige Deinstallation die Einstellungen, die Sie selbst konfiguriert haben, nicht deaktiviert - nur die eigenen Änderungen von ProxMenux werden zurückgesetzt.", + "manualTitle": "Manuelles Äquivalent (auf Ihrem Server ausgeführt)", + "manualIntro": "Die vollständige Sequenz, die das Skript gegen jeden Pool läuft, ist von Hand replizierbar. Dies ist, was Sie eingeben würden, wenn Sie dasselbe in einem einzelnen Pool ohne ProxMenux tun möchten:", + "verifyTitle": "Verifizierung und manuelles Rollback", + "oneShotTitle": "Einmaliges TRIM statt Hintergrundaktivität?", + "oneShotBody": "Einige Betreiber bevorzugen eine manuelle Trimmung während Off-Peak-Stunden anstelle von kontinuierlichen Trimmaktivitäten. Deaktivieren Sie Autotrim und planen Sie einen Cron-Job, der zpool trim <pool> ausführt - gleiches Endziel, unterschiedliche Kadenz." + }, + "vzdump": { + "heading": "Erhöhen Sie die Backup-Geschwindigkeit von vzdump", + "intro": "Schreibt bwlimit: 0 und ionice: 5 in die globale vzdump-Konfiguration. Proxmox hat bereits standardmäßig kein Bandbreitenlimit; nur ein vorhandenes Limit wird entfernt. Gegenüber ionice: 7 erhöht 5 die Best-Effort-I/O-Priorität, sofern der Scheduler sie beachtet. Das kann Gäste beeinflussen und garantiert keine schnelleren Backups.", + "changedTitle": "Was sich in /etc/vzdump.conf ändert", + "backupTitle": "Erster Durchlauf erstellt ein .bak von vzdump.conf", + "backupBody": "Beim ersten Ausführen kopiert ProxMenux /etc/vzdump.conf vor Änderungen nach /etc/vzdump.conf.bak. Spätere Läufe überschreiben diese Sicherung nicht; frühere manuelle Einstellungen bleiben wiederherstellbar. bwlimit und ionice werden mit sed geändert, andere Optionen wie compress, pigz, tmpdir und exclude-path bleiben erhalten.", + "skipTitle": "Wann man das überspringt", + "skipBody": "Auf einem Host mit langsamem lokalem Speicher und VMs, die latenzempfindlich sind, kann das Entfernen der Bandbreitenobergrenze zu spürbaren Verlangsamungen bei Backups führen. Wenn Sie aus diesem Grund zuvor einen bestimmten bwlimit festgelegt haben, behalten Sie ihn bei - überspringen Sie diese Option.", + "verifyTitle": "Verifizierung und manuelles Rollback" + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "ZFS Verwaltungsbefehle", + "href": "/docs/help-info/zfs-commands", + "tail": "— zpool / zfs Referenz für ARC, Snapshots, Scrub." + }, + { + "label": "Speicher- und Festplattenbefehle", + "href": "/docs/help-info/storage-commands", + "tail": "generische Blockgeräte und Proxmox-Speicherreferenz." + }, + { + "label": "Backup- und Wiederherstellungsbefehle", + "href": "/docs/help-info/backup-commands", + "tail": " — vzdump-CLI-Referenz für Bandbreite und I/O-Priorität." + }, + { + "label": "Optimierungen deinstallieren", + "href": "/docs/post-install/uninstall", + "tail": " — Änderungen an ARC / vzdump rückgängig machen." + }, + { + "label": "Log2RAM", + "href": "/docs/post-install/optional#log2ram", + "tail": "- reduziert den Verschleiß von SSD/NVMe durch Ramdisk-Backing /var/log; dokumentiert unter Optional." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/system.json b/web/messages/de/docs/post-install/system.json new file mode 100644 index 00000000..95f06321 --- /dev/null +++ b/web/messages/de/docs/post-install/system.json @@ -0,0 +1,133 @@ +{ + "meta": { + "title": "Post-Install: System | ProxMenux Dokumentation", + "description": "Systemoptimierungen im anpassbaren Nachinstallationsskript von ProxMenux: Größenbegrenzungen für journald und logrotate, höhere Kernel- und Dateideskriptorgrenzen, ausgewogene Speicherabstimmung, schnelle Neustarts mit kexec und Wiederherstellung nach Kernel-Panik." + }, + "header": { + "title": "Nach der Installation: System", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was diese Kategorie abdeckt", + "body": "Sechs unabhängige Systemoptimierungen. Sie stimmen journald und logrotate ab, damit Logs nicht die Platte füllen, erhöhen Kernel- und Dateideskriptorgrenzen für Anwendungen mit vielen offenen Dateien, sorgen für ausgewogene Speichernutzung auf einem Virtualisierungshost, ergänzen kexec für Neustarts ohne BIOS und konfigurieren automatische Wiederherstellung bei Kernel-Panik. Alle sechs werden erfasst und sind über das Deinstallationsmenü rückgängig zu machen." + }, + "journald": { + "heading": "journald optimieren", + "intro": "Schreibt /etc/systemd/journald.conf mit sinnvollen Standardwerten neu, damit das systemd-Journal nicht nach und nach die Root-Partition füllt. Startet dann systemd-journald neu und bereinigt vorhandene Protokolle.", + "keyTitle": "Schlüsselwerte", + "keyItems": [ + "Storage=persistent — Protokolle auf der Festplatte über Neustarts halten.", + "SystemMaxUse=64M / RuntimeMaxUse=60M — Grenzen für die Datenträger- und Speichernutzung des Journals.", + "Compress=yes, Seal=no — Logs komprimieren, kryptografische Vorwärtssicherung durch Versiegelung auslassen (spart CPU).", + "MaxLevelStore=info — info und höhere Schweregrade speichern. Erforderlich für den Logbetrachter von ProxMenux Monitor und damit Fail2Ban fehlgeschlagene SSH-/Proxmox-Anmeldungen im Journal erkennt.", + "Ratenbegrenzung: 1000 events / 30 s, um eine Protokollflut zu vermeiden.", + "ForwardToSyslog=no, ForwardToWall=no - Duplizieren Sie keine Nachrichten in syslog oder senden Sie sie an Konsolen." + ], + "tipTitle": "Warum MaxLevelStore=info wichtig ist", + "tipBody": "Ein strengerer Schweregrad wie warning lässt ProxMenux Monitor in allen Zeiträumen fast dieselben Einträge zeigen, weil die meisten Aktivitäten auf Info-Ebene liegen. Fail2Ban kann dadurch fehlgeschlagene Anmeldungen übersehen. Begrenzen Sie die Menge stattdessen mit SystemMaxUse und RateLimitBurst, ohne die gespeicherten Schweregrade einzuschränken." + }, + "logrotate": { + "heading": "Logrotate optimieren", + "intro": "Schreibt /etc/logrotate.conf mit globalen Tages- und Größeneinstellungen, 7 aufbewahrten Rotationen, Komprimierung und copytruncate neu, damit Dienste ohne erneutes Öffnen der Logs weiterschreiben. Die spätere Größeneinstellung hat Vorrang vor täglich, sofern keine einzelne Logregel sie überschreibt. Original logrotate.conf wird beim ersten Anwenden nach .bak gesichert.", + "tipTitle": "Für Log2RAM geeignet", + "tipBody": "Die Anweisung size 10M hat Vorrang vor der vorherigen Tageseinstellung; es gilt nicht das zuerst eintretende Kriterium. Logrotate prüft den Grenzwert beim Ausführen, und einzelne Logregeln können globale Werte überschreiben. Für Log2RAMs RAM-basiertes /var/log sollten Regeln und Timerfrequenz geprüft werden, um die Belegung zu steuern." + }, + "limits": { + "heading": "Verschiedene Systemgrenzen erhöhen", + "intro": "Erhöht Kernel-, systemd- und PAM-Grenzen, deren Standardwerte für Hosts mit vielen VMs, Containern und Netzwerkdiensten zu niedrig sein können.", + "headerFile": "Datei", + "headerSets": "Was es setzt", + "rows": [ + { + "file": "/etc/sysctl.d/99-maxwatches.conf", + "sets": "fs.inotify.max_user_watches / max_user_instances / max_queued_events = 1048576" + }, + { + "file": "/etc/sysctl.d/99-maxkeys.conf", + "sets": "kernel.keys.maxkeys / root_maxkeys = 1000000" + }, + { + "file": "/etc/sysctl.d/99-swap.conf", + "sets": "vm.swappiness = 10, vm.vfs_cache_pressure = 100" + }, + { + "file": "/etc/sysctl.d/99-fs.conf", + "sets": "fs.nr_open / file-max = 2097152, fs.aio-max-nr = 1048576" + }, + { + "file": "/etc/security/limits.d/99-limits.conf", + "sets": "nofile und nproc bis 1,048,576 (unbegrenzt für root)" + }, + { + "file": "/etc/systemd/system.conf + user.conf", + "sets": "DefaultLimitNOFILE=1048576 für systemd-Dienste" + }, + { + "file": "/etc/pam.d/common-session + runuser-l", + "sets": "session required pam_limits.so, also gelten die oben genannten für Login-Shells" + }, + { + "file": "/root/.profile", + "sets": "ulimit -n 1048576 für die Root-Shell" + } + ], + "tipTitle": "Warum inotify wichtig ist", + "tipBody": "Docker, Syncthing, Node.js-Dateibeobachter und Plex-Bibliotheksscans können max_user_watches ausschöpfen. Der Standard hängt von Kernel und Host-RAM ab und ist nicht immer 8192. 1M erlaubt mehr Überwachungen, ohne sie vorab anzulegen. Aktive Überwachungen benötigen Kernel-Speicher; prüfen Sie die Nutzung auf speicherknappen Hosts." + }, + "memory": { + "heading": "Optimieren der Speichereinstellungen", + "intro": "Schreibt ein ausgewogenes sysctl-Profil in /etc/sysctl.d/99-memory.conf. Entwickelt für einen Hypervisor-Host - bevorzugt es, VM-Arbeitssets in RAM zu halten und Seiten proaktiv freizugeben, damit Zuweisungsbursts nicht zum Stillstand kommen.", + "warnTitle": "swappiness=10 auf Hosts mit wenig freiem Speicher", + "warnBody": "Auf einem Host mit 16 GB RAM, auf dem viele VMs ausgeführt werden, kann die Senkung der Swappiness den Kernel zu OOM-Kill-Prozessen anstelle von Swaping bringen. Wenn Sie routinemäßig OOM-Ereignisse sehen, erhöhen Sie die Swappiness nach dem Ausführen des Skripts in /etc/sysctl.d/99-memory.conf auf 30–60." + }, + "kexec": { + "heading": "Schnelle Neustarts ermöglichen (kexec)", + "intro": "Installiert kexec-tools und verkabelt es, so dass Sie den Host direkt in einen neuen Kernel neu starten können, ohne die BIOS/UEFI-Firmware zu durchlaufen. Auf großen Servern, auf denen POST 45 bis 90 Sekunden benötigt, verwandelt sich ein Neustart von einer Kaffeepause in einige Sekunden Ausfallzeit.", + "installsTitle": "Was ProxMenux installiert", + "installsItems": [ + "Paket kexec-tools (debconf mit kexec-tools/load_kexec boolean false vorbeantwortet, damit apt nicht nachfragt und automatisches Laden beim Herunterfahren deaktiviert bleibt).", + "Systemd-Einheit /etc/systemd/system/kexec-pve.service lädt den Proxmox-Kernel und initrd beim Booten in den Speicher, wobei die aktuelle cmdline wiederverwendet wird.", + "Ein Aliasname in /root/.bash_profile: reboot-quick → systemctl kexec." + ], + "usageIntro": "Nutzung nach dem nächsten Reboot (oder manuell systemctl start kexec-pve):", + "warnTitle": "Wann man Kexec nicht benutzt", + "warnBody": "kexec überspringt Firmware-Level Init. Wenn Sie sich auf BIOS/UEFI verlassen, um den Hardwarezustand zurückzusetzen - beispielsweise einen GPU, der Passthrough durchführt, der nur bei voller POST sauber zurückgesetzt wird, oder eine lästige HBA-Firmware - können Kexec-Neustarts diese Geräte in einem halbinitialisierten Zustand belassen. Verwenden Sie einen normalen reboot nach Kernel-Upgrades oder wenn Sie BIOS/UEFI Änderungen benötigen, um wirksam zu werden. reboot-quick ist für alltägliche Neustarts gedacht." + }, + "panic": { + "heading": "Neustart bei Kernel-Panic aktivieren", + "intro": "Lässt den Kernel automatisch neu starten, statt dauerhaft am Panikbildschirm zu hängen. Besonders wichtig für entfernte Proxmox-Hosts ohne lokale Konsole: Bei blockiertem Kernel bleiben alle VMs aus, bis Sie den Host aus- und wieder einschalten können.", + "tipTitle": "Verbinden Sie dies mit Remote-Konsolenzugriff", + "tipBody": "Der automatische Neustart dient der Wiederherstellung, nicht der Fehlersuche. Um eine Panik zu untersuchen, statt nur neu zu starten, nutzen Sie die kexec-Option oben zusammen mit Kernel-kdump-Unterstützung, die ProxMenux nicht einrichtet. Alternativ zeichnen Sie vor Aktivierung eine serielle Konsole auf einem anderen Host auf." + }, + "verify": { + "heading": "Verifizierung", + "intro": "Nach Anwendung der Systemoptimierungen:", + "tipTitle": "Wiederherstellung und Grenzen", + "tipBody": "Alle sechs Optionen werden in installed_tools.json erfasst und unter Optimierungen deinstallieren angeboten. Die Wiederherstellung entfernt Konfigurationsdateien, kexec-Unit und Alias und stellt journald/logrotate wieder her. Manche aktiven Grenzen brauchen eine neue Sitzung oder Neustart. Aus /root/.profile wird nur altes ulimit -n 256000 entfernt; aktuelles ulimit -n 1048576 kann bleiben und manuelle Entfernung erfordern." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Nützliche Systembefehle", + "href": "/docs/help-info/system-commands", + "tail": "— die Änderungen überprüfen (free -h, journalctl, ulimit -a)." + }, + { + "label": "Leistung", + "href": "/docs/post-install/performance", + "tail": " — zusätzliche Systemabstimmung (pigz)." + }, + { + "label": "Optimierungen deinstallieren", + "href": "/docs/post-install/uninstall", + "tail": " — diese Änderungen rückgängig machen." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/uninstall.json b/web/messages/de/docs/post-install/uninstall.json new file mode 100644 index 00000000..46255449 --- /dev/null +++ b/web/messages/de/docs/post-install/uninstall.json @@ -0,0 +1,271 @@ +{ + "meta": { + "title": "Optimierungen deinstallieren | ProxMenux Dokumentation", + "description": "Macht reversible Nachinstallationsänderungen von ProxMenux rückgängig. Registrierte Werkzeuge haben eigene Deinstallationsfunktionen, die den vorherigen Hostzustand nach Möglichkeit erhalten." + }, + "header": { + "title": "Optimierungen deinstallieren", + "description": "Stellen Sie reversible Änderungen wieder her, die durch die automatisierten oder anpassbaren Skripte nach der Installation vorgenommen wurden. ProxMenux registriert jede unterstützte Optimierung mit ihrer dedizierten Wiederherstellungsfunktion; Paket-Upgrades sind absichtlich ausgeschlossen.", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Warum es das gibt", + "body": "Jede unterstützte rückgängig zu machende Änderung wird erfasst in /usr/local/share/proxmenux/installed_tools.json. Dieses Verzeichnis steuert die Deinstallation: Es zeigt aktive Optimierungen und ruft deren Wiederherstellungsfunktion auf. Aktionen ohne sicheres Zurücksetzen, etwa vollständige Paket-Upgrades, werden nicht aufgenommen." + }, + "openMenu": { + "heading": "Wie man es öffnet", + "body": "Öffnen Sie im Hauptmenü Proxmox-Nachinstallationseinstellungen → Optimierungen deinstallieren. Die Liste zeigt aktuell angewendete Optimierungen; nicht angewendete Einträge fehlen.", + "imageAlt": "Auswahlliste „Optimierungen deinstallieren“ mit aktiven Änderungen und Kontrollkästchen zum Zurücksetzen" + }, + "howWorks": { + "heading": "Wie die Umkehrung funktioniert", + "steps": [ + { + "title": "Gespeicherte Einträge und automatische Erkennung", + "body1": "Beim ersten Lauf sucht ProxMenux nach Erkennungsmerkmalen auf dem Host, etwa /etc/sysctl.d/99-memory.conf, /etc/apt/apt.conf.d/99-force-ipv4, installiertem haveged oder aktivem Log2RAM-Dienst. Erkannte Änderungen werden als rückgängig zu machen erfasst, auch wenn eine ältere ProxMenux-Version ohne Register sie vorgenommen hat.", + "body2": "Diese Migration wird nur einmal ausgeführt. Anschließend aktualisiert jeder Anwenden- oder Rückgängig-Vorgang den gespeicherten Eintrag direkt." + }, + { + "title": "Änderungen zum Zurücksetzen auswählen", + "body1": "Die Checkliste zeigt pro Artikel ein menschenlesbares Label (z.B. Speichereinstellungen Optimierung, IOMMU/VFIO PCI-Durchgang, Log2RAM (SSD-Schutz)). Klicken Sie auf die, die Sie umkehren möchten. Nichts, was Sie nicht ankreuzen, wird berührt." + }, + { + "title": "Rückgängigmachen wird ausgeführt", + "body1": "Für jedes ausgewählte Element ruft ProxMenux seine passende Deinstallationsfunktion auf. Die meisten Umkehrungen folgen einem von drei Mustern:", + "items": [ + "Backup-basierte — Wiederherstellung eines .bak, das zum Zeitpunkt der Anwendung erfasst wurde (bashrc, logrotate.conf, journald.conf, GRUB/kernel cmdline).", + "Konfiguration löschen — ProxMenux-Dateien /etc/sysctl.d/99-*.conf, /etc/apt/apt.conf.d/99-* oder die systemd-Unit entfernen und neu laden.", + "Pakete neu installieren — bei UI-Änderungen wie dem Abonnementhinweis die Originalpakete mit --force-confnew neu installieren, um ausgelieferte Einstellungen wiederherzustellen." + ], + "body2": "Jede Umkehrung protokolliert ihren Fortschritt. Elemente, die einen Neustart erfordern (VFIO, persistente Schnittstellennamen), setzen ein Flag, das die Neustartaufforderung am Ende auslöst." + }, + { + "title": "Neustartabfrage am Ende", + "body1": "Nachdem die Umkehrung beendet ist, zeigt das Menü eine Neustartaufforderung an. Elemente, die Kernelparameter, Kernelmodule oder Netzwerknamen (VFIO, persistente Schnittstellennamen) geändert haben, benötigen den Neustart, um wirksam zu werden; andere Elemente nicht, und die Eingabeaufforderung ist ein Sicherheitsstandard und keine Per-Item-Überprüfung." + } + ] + }, + "reversible": { + "heading": "Was reversibel ist", + "intro": "Registrierte reversible Optimierungen und deren passende Deinstallateure werden hier nach Bereichen gruppiert:", + "groups": [ + { + "title": "Repositories und APT", + "items": [ + { + "tool": "Abonnementbanner entfernen", + "restores": "Zunächst wird versucht, die UI-Dateien aus ProxMenux-eigenen Backups wiederherzustellen (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* und, wenn die mobile UI gepatcht wird, index.html.tpl.backup.*). Nur wenn ein Backup fehlt oder beschädigt ist, greift man auf die Neuinstallation von pve-manager, proxmox-widget-toolkit, libjs-extjs und libpve-http-server-perl mit force-confnew zurück. Löscht auch zwischengespeicherte .js / .gz-Kopien." + }, + { + "tool": "APT-Sprachdateien überspringen", + "restores": "Entfernt /etc/apt/apt.conf.d/99-disable-translations, damit APT übersetzte Paketbeschreibungsindizes gemäß den übrigen Spracheinstellungen herunterladen kann." + }, + { + "tool": "IPv4 für APT erzwingen", + "restores": "Entfernen von /etc/apt/apt.conf.d/99-force-ipv4." + }, + { + "tool": "Systemwerkzeuge", + "restores": "Entfernt nur ausgewählte Werkzeugpakete vollständig, die ProxMenux als neu installiert erfasst hat. Zuvor vorhandene Pakete werden nie in diese Liste aufgenommen und bleiben unverändert." + } + ] + }, + { + "title": "Kernel, Speicher und Systemgrenzen", + "items": [ + { + "tool": "Speichereinstellungen", + "restores": "Entfernt /etc/sysctl.d/99-memory.conf und lädt sysctl neu." + }, + { + "tool": "Kernel Panic Konfiguration", + "restores": "Entfernen von /etc/sysctl.d/99-kernelpanic.conf." + }, + { + "tool": "Systemgrenzen erhöhen", + "restores": "Entfernt /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf und /etc/security/limits.d/99-limits.conf. Setzt PAM-Grenzen und systemd DefaultLimitNOFILE zurück. In /root/.profile entfernt es nur die alte Zeile ulimit -n 256000; ulimit -n 1048576 des aktuellen Installers kann bleiben und manuelle Entfernung erfordern." + }, + { + "tool": "ZRAM-Swapprofil", + "restores": "Deaktiviert den Swap auf /dev/zram0, stoppt dev-zram0.swap und entfernt /etc/systemd/zram-generator.conf.d/90-proxmenux.conf. Das systemd-zram-generator-Paket wird nur gelöscht, wenn ProxMenux es installiert hat und kein anderes ZRAM-Setup vorhanden ist. Wenn die Seiten in ZRAM nicht verschoben werden können, bleibt das Profil aktiv und es wird nichts entfernt." + } + ] + }, + { + "title": "Vernetzung", + "items": [ + { + "tool": "Netzwerkoptimierungen", + "restores": "Entfernt /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf und 98-proxmenux-rpf.conf sowie proxmenux-fwbr-tune.service, das Hilfsskript /usr/local/sbin/proxmenux-fwbr-tune und die udev-Regel /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules. Entfernt außerdem source /etc/network/interfaces.d/* aus /etc/network/interfaces. Lädt sysctl, systemd und udev-Regeln neu." + }, + { + "tool": "Open vSwitch", + "restores": "Führt apt purge für openvswitch-switch und openvswitch-common aus. Migrieren Sie OVS-Bridges vorher zu Linux-Bridges, sonst verlieren die VMs darauf beim nächsten Start die Netzwerkanbindung." + }, + { + "tool": "TCP BBR + TCP Fast Open", + "restores": "Entfernt /etc/sysctl.d/99-kernel-bbr.conf und 99-tcp-fastopen.conf und lädt übrige sysctl-Konfiguration neu. Das Löschen setzt aktive Werte nicht zurück; Standards wie cubic und tcp_fastopen=1 gelten nach Neustart, sofern keine andere Konfiguration sie überschreibt." + }, + { + "tool": "Persistente Schnittstellennamen", + "restores": "Entfernt nur die 10-proxmenux-*.link-Dateien mit dem ProxMenux-Header aus /etc/systemd/network/. Jede .link-Datei, die von einem anderen Paket bereitgestellt oder vom Benutzer geschrieben wurde, bleibt an Ort und Stelle. Schnittstellennamen kehren beim nächsten Neustart zum Standardverhalten von systemd zurück." + } + ] + }, + { + "title": "Protokollierung", + "items": [ + { + "tool": "journald-Optimierung", + "restores": "Schreibt /etc/systemd/journald.conf mit ursprünglichen Standardwerten neu und startet systemd-journald neu." + }, + { + "tool": "Logrotate-Optimierung", + "restores": "Stellt /etc/logrotate.conf aus der vor der Änderung erstellten .bak-Datei wieder her." + }, + { + "tool": "Log2RAM", + "restores": "Stoppt und deaktiviert Dienst und Timer. Entfernt Cron-Jobs, systemd-Units, Programmdateien, Konfiguration und /var/log.hdd. Entfernt auch das apt-Paket, falls darüber installiert." + }, + { + "tool": "Automatisches ZFS-TRIM", + "restores": "Liest /usr/local/share/proxmenux/zfs_autotrim_pools mit den tatsächlich geänderten Pools und führt jeweils zpool set autotrim=off aus. Bereits vor ProxMenux manuell aktivierter Autotrim bleibt bestehen." + } + ] + }, + { + "title": "Shell und Erscheinungsbild", + "items": [ + { + "tool": "Bashrc anpassen", + "restores": "Wiederherstellt /root/.bashrc aus dem .bak-Backup. Wenn kein Backup vorhanden ist, wird der PMX_CORE_BASHRC-Block durch Markierungen entfernt." + }, + { + "tool": "Eigenes MOTD-Banner", + "restores": "Stellen Sie den genauen ursprünglichen /etc/motd-Inhalt, der unter /usr/local/share/proxmenux gespeichert ist, wieder her, entfernen Sie die Datei, wenn sie vorher nicht vorhanden war, oder entfernen Sie den alten Marker sicher, wenn Sie eine ältere Installation migrieren." + }, + { + "tool": "Fastfetch", + "restores": "Entfernt Programmdatei, Konfigurationsverzeichnis, update-motd-Hook und den abgegrenzten Block BEGIN FASTFETCH / END FASTFETCH aus /root/.bashrc, ~/.profile, /etc/profile und /etc/profile.d/fastfetch.sh. Entfernt ein installiertes apt-Paket vollständig." + }, + { + "tool": "Figurine", + "restores": "Entfernt den Binär-, profile.d-Eintrag und den Alias-Block in bashrc/profile." + } + ] + }, + { + "title": "Hardware & Virtualisierung", + "items": [ + { + "tool": "IOMMU / VFIO", + "restores": "Entfernt vfio Module aus /etc/modules, die Nouveau / Radeon / nvidia Blacklist Einträge und intel_iommu=on / amd_iommu=on / iommu=pt / pcie_acs_override Parameter aus /etc/kernel/cmdline (ZFS) oder GRUB. Baut Initramfs wieder auf." + }, + { + "tool": "AMD-CPU-Korrekturen (Ryzen/EPYC)", + "restores": "Entfernt idle=nomwait aus Kernel cmdline (ZFS) oder GRUB und die ignore_msrs / report_ignored_msrs Optionen aus /etc/modprobe.d/kvm.conf." + }, + { + "tool": "Gast-Agent für einen virtualisierten Proxmox-Host", + "restores": "Liest /usr/local/share/proxmenux/guest_agent.pkg und entfernt das erfasste Hostpaket vollständig. Der Installer wählt qemu-guest-agent, open-vm-tools oder virtualbox-guest-utils nach Hypervisor. Ohne Eintrag versucht die Deinstallation diese drei Pakete. Betroffen ist der verschachtelte Proxmox-Host, nicht Gastvorlagen." + } + ] + }, + { + "title": "Speicher", + "items": [ + { + "tool": "ZFS-ARC-Größe anpassen", + "restores": "Entfernt /etc/modprobe.d/99-zfsarc.conf, stellt gesicherte widersprüchliche externe *.conf aus /usr/local/share/proxmenux/backups/zfs_arc/ wieder her, baut initramfs neu und führt proxmox-boot-tool refresh auf systemd-boot-Hosts aus." + }, + { + "tool": "Automatische ZFS-Snapshots", + "restores": "Entfernt die Cron-Einträge, die das Skript geschrieben hat, und bietet an, zfs-auto-snapshot zu bereinigen. Bestehende Snapshot-Datensätze in den Pools bleiben intakt - entfernen Sie sie separat, wenn Sie sie weghaben möchten." + }, + { + "tool": "vzdump-Geschwindigkeitsbegrenzung", + "restores": "Stellt /etc/vzdump.conf aus der Installationssicherung .bak wieder her und setzt bwlimit und ionice auf die Werte vor ProxMenux zurück." + } + ] + }, + { + "title": "Dienstleistungen & Extras", + "items": [ + { + "tool": "Zeitsynchronisation", + "restores": "Setzt die Zeitzone mit timedatectl auf UTC als sicheren Standard zurück." + }, + { + "tool": "Entropieerzeugung (haveged)", + "restores": "Stoppt und deaktiviert haveged und entfernt das Paket vollständig." + }, + { + "tool": "kexec (schnelle Neustarts)", + "restores": "Deaktiviert kexec-pve.service, entfernt die Unit-Datei und den Alias reboot-quick aus /root/.bash_profile und entfernt kexec-tools vollständig." + }, + { + "tool": "RPC / rpcbind deaktiviert", + "restores": "Stellt rpcbind.service und rpcbind.socket jeweils auf den zuvor erfassten Aktivierungs- und Laufzustand zurück: aktiviert/deaktiviert und aktiv/inaktiv." + }, + { + "tool": "pigz (paralleles gzip)", + "restores": "Kopiert den echten gzip von gzip.distrib zurück, entfernt die dpkg-Umleitung und /bin/pigzwrapper, kommentiert die pigz-Linie in /etc/vzdump.conf und löscht pigz, sobald gzip verifiziert ist." + }, + { + "tool": "Dienste mit hoher Verfügbarkeit", + "restores": "Stoppt und deaktiviert pve-ha-lrm, pve-ha-crm und corosync. Bestehende HA-Gruppen und Ressourcendefinitionen werden nicht gelöscht – entfernen Sie sie aus der Web-Benutzeroberfläche, wenn Sie sie nicht mehr benötigen." + }, + { + "tool": "Ceph-Repository", + "restores": "Bereinigt die mit dieser Option installierten Ceph-Pakete, entfernt die deb822 /etc/apt/sources.list.d/ceph.sources auf PVE 9 (oder die alte Ceph-Liste auf PVE 8) und aktualisiert den APT-Cache." + }, + { + "tool": "OVH RTM (Überwachung)", + "restores": "Entfernt Pakete passend zu ovh-rtm*, rtm und rtm-*, löscht /etc/rtm und entfernt den RTM-Registereintrag. Puppet-Reste unter /etc/puppet/ müssen eventuell manuell geprüft und bereinigt werden; das Verzeichnis wird nicht gelöscht. Auf Nicht-OVH-Hosts nimmt der Installer normalerweise keine Änderungen vor." + } + ] + } + ] + }, + "edge": { + "heading": "Sonderfälle und Einschränkungen", + "packageTitle": "Neuinstallation betrifft laufende Proxmox-Pakete", + "packageBody": "Können ProxMenux-Sicherungen Abonnementhinweis entfernen nicht zurücksetzen, installiert der Rückfallweg pve-manager, proxmox-widget-toolkit, libjs-extjs und libpve-http-server-perl mit --force-confnew neu. Das betrifft die laufende Weboberfläche: Browser neu laden und einige Sekunden zum Wiederverbinden abwarten. Nicht während Migrationen oder Klonvorgängen ausführen.", + "rebootTitle": "Persistente Namen und VFIO benötigen einen Neustart", + "rebootBody": "Das Entfernen der 10-proxmenux-*.link-Dateien (Persistente Schnittstellennamen) und Zurücksetzen von IOMMU/VFIO ändern den bereits gestarteten Zustand nicht; sie werden nach Neustart wirksam. ProxMenux setzt dafür automatisch das Neustart-Flag.", + "perItemTitle": "Sie können eine Sache rückgängig machen und den Rest behalten", + "perItemBody": "Der Deinstaller arbeitet per Item. Wenn Sie nur Log2RAM entfernen möchten, aber die Netzwerk-Tuning- und Bashrc-Änderungen beibehalten möchten, kreuzen Sie nur Log2RAM an. Nichts anderes wird berührt und die Registry wird entsprechend aktualisiert." + }, + "inspect": { + "heading": "Kontrolle des Registers manuell", + "intro": "Wenn Sie sehen möchten, was verfolgt wird, ohne das Menü zu öffnen:", + "outro": "Jeder \"tool\": true-Eintrag entspricht etwas ProxMenux angewendet und kann umgekehrt werden. Das manuelle Entfernen eines Eintrags wird nicht empfohlen - verwenden Sie immer das Menü, das auch die Umkehrfunktion ausführt, anstatt nur die Änderung zu vergessen.", + "reinstallTitle": "Neuinstallieren nach Deinstallieren", + "reinstallBody": "Eine zurückgesetzte Optimierung kann später erneut angewendet werden. Öffnen Sie das Nachinstallationsmenü und starten Sie Automatisiert oder Anpassbar; das Register erfasst den neuen Zustand." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "Automatisiertes Post-Install", + "href": "/docs/post-install/automated", + "tail": " — die sinnvolle Grundkonfiguration erneut anwenden." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — eine andere Auswahl treffen." + }, + { + "label": "Deinstallieren Sie ProxMenux", + "href": "/docs/settings/uninstall-proxmenux", + "tail": "- andere Operation: entfernt ProxMenux selbst, nicht seine angewandten Optimierungen." + }, + { + "label": "Übersicht Post-Install", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/de/docs/post-install/updates.json b/web/messages/de/docs/post-install/updates.json new file mode 100644 index 00000000..6dbd533e --- /dev/null +++ b/web/messages/de/docs/post-install/updates.json @@ -0,0 +1,112 @@ +{ + "meta": { + "title": "Verfügbare Updates anwenden — Optimierungen nach der Installation | ProxMenux Dokumentation", + "description": "Wie ProxMenux neue Versionen von Nachinstallationsoptimierungen wie Log2Ram, Speichereinstellungen, Systemlimits, Logrotate und Netzwerkanpassungen erkennt und wie Sie sie im Nachinstallationsmenü oder Monitor-Dashboard anwenden." + }, + "header": { + "title": "Verfügbare Updates anwenden", + "description": "Liegt eine Nachinstallationsoptimierung (Log2Ram, Speichereinstellungen, Systemlimits, Logrotate …) auf dem Datenträger in einer neueren Version vor als der auf dem Host erfassten, zeigt ProxMenux ein verfügbares Update an. Sie können es im Nachinstallationsmenü der Skriptoberfläche oder im Monitor-Dashboard anwenden. Beide Wege führen dieselbe Nachinstallationsfunktion erneut aus und aktualisieren den gespeicherten Versionsstand.", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was das ist", + "body": "ProxMenux-Nachinstallationsoptimierungen haben Versionsnummern, etwa Log2ram SSD Protection v1.2. Der Host erfasst aktive Optimierungen und ihre Versionen in /usr/local/share/proxmenux/installed_tools.json. Liefert eine neue ProxMenux-Version eine aktualisierte Optimierung, erkennt ProxMenux den Unterschied und bietet an, nur diese erneut anzuwenden, ohne die gesamte Nachinstallation zu wiederholen." + }, + "why": { + "heading": "Warum es das gibt", + "body": "Nachinstallationsoptimierungen erhalten Verbesserungen wie bessere sysctl-Einstellungen, strengere Logrotate-Limits, neue Log2RAM-Größenregeln oder Fehlerkorrekturen. Ohne Updateweg mussten Sie den ganzen Skriptlauf mit allen Optimierungen wiederholen oder auf die Verbesserung verzichten. Verfügbare Updates anwenden erlaubt die ausdrückliche Auswahl einzelner Optimierungen, deren Version sich geändert hat." + }, + "detection": { + "heading": "Wie Updates erkannt werden", + "steps": [ + { + "title": "Versionierte Skripte auf Disk", + "body": "Jede Funktion nach der Installation deklariert ihre Version innerhalb des Skripts (scripts/post_install/auto_post_install.sh und scripts/post_install/customizable_post_install.sh). Ein Scanner extrahiert diese Versionen aus der Quelle auf der Festplatte." + }, + { + "title": "Versioniertes Register auf dem Host", + "body": "Wenn der Operator jede Optimierung anwendete, schrieb der entsprechende register_tool-Aufruf die aktive Version in /usr/local/share/proxmenux/installed_tools.json. Diese Datei ist die Quelle der Wahrheit für \"was auf diesem Host gerade aktiv ist\"." + }, + { + "title": "Monitor vergleicht beide Seiten", + "body": "Beim Start und alle 24 Stunden vergleicht der Monitor Festplattenversionen mit Registrierungsversionen. Jede Inkongruenz führt zu einem Eintrag in /usr/local/share/proxmenux/updates_available.json. Diese Datei steuert sowohl den Post-Install-Menüeintrag als auch die Monitor-Dashboardkarte." + }, + { + "title": "Eine Benachrichtigung pro neuer Version", + "body": "Wenn mindestens eine Optimierung ein ausstehendes Update hat, sendet der Monitor eine einzelne gruppierte Benachrichtigung aus - zum Beispiel \"4 ProxMenux Optimierungsupdate(s) verfügbar\" - mit einer Zeile pro Tool im selben name (vX → vY)-Format, das für Proxmox-Paketupdates verwendet wird. Die Benachrichtigung ist Anti-Kaskade, so dass sie sich nicht Tag für Tag für denselben Satz wiederholt; nur eine neue Version (oder ein neues Tool, das in die Liste eintritt) löst sie erneut aus." + } + ] + }, + "pathA": { + "heading": "Pfad A — Aus dem Menü nach der Installation", + "intro": "Öffnen Sie im ProxMenux-Hauptmenü Einstellungen nach der Installation von Proxmox. Bei ausstehenden Updates erscheint Verfügbare Updates anwenden (N) direkt über Optimierungen deinstallieren. Die Zahl zeigt die Optimierungen mit neuerer Version auf dem Datenträger als im Register. Ist alles aktuell, bleibt der Eintrag verborgen.", + "menuAlt": "Das Menü Post-Install Scripts zeigt den bedingte Eintrag \"Verfügbare Updates anwenden (N)\" direkt über \"Optimierungen deinstallieren\" an, wobei das Zählabzeichen anzeigt, wie viele Optimierungen eine neuere Version auf der Festplatte haben", + "menuCaption": "Verfügbare Updates anwenden (N) erscheint nur, wenn mindestens eine Optimierung ein Update hat, und wird bei aktuellem Host ausgeblendet.", + "checklistBody": "Öffnet eine Auswahlliste aller ausstehenden Updates, jeweils im Format name (vX → vY). Alle Zeilen sind standardmäßig ausgewählt; wählen Sie die ab, die Sie diesmal nicht anwenden möchten.", + "checklistAlt": "Auswahldialog Verfügbare Updates anwenden mit einer Zeile pro Optimierung, ihrem Namen und Versionswechsel (aktuell → verfügbar). Alle Zeilen sind ausgewählt.", + "checklistCaption": "Jede Optimierung einzeln wählen: Entscheiden Sie, welche Versionen aktualisiert werden. Dieselbe Grundlage wie Automatisch und Anpassbar wendet die Funktionen im Hintergrund erneut an und aktualisiert ihre Registerversionen." + }, + "pathB": { + "heading": "Pfad B — Vom Monitor-Dashboard", + "intro": "Dieselben Updates erscheinen unter Einstellungen → ProxMenux-Optimierungen im Monitor. Bei ausstehenden Updates zeigt die Karte ein Update-Zählabzeichen, das die Auswahl einzelner Optimierungen öffnet. Jedes Werkzeug bietet auch eine eigene Updateaktion.", + "imageAlt": "Karte ProxMenux-Optimierungen in den Monitor-Einstellungen mit Zählabzeichen für ausstehende Updates zum Öffnen der Auswahl und Updateaktionen pro Werkzeug", + "imageCaption": "Die Optimierungskarte im Monitor bietet über ihr Zählabzeichen Zugriff auf Updates, sobald eine neuere Version auf dem Datenträger liegt, ohne Shell-Zugriff." + }, + "applying": { + "heading": "Was beim Anwenden passiert", + "steps": [ + { + "title": "Führt die Post-Installation-Funktion erneut aus", + "body": "Die Funktion der ausgewählten Optimierung wird gegen den Host erneut ausgeführt. Da jede Funktion nach der Installation idempotent ist, wird die Konfiguration nicht dupliziert - sie überschreibt die vorherige Version mit der neuen (Sysctl-Dateien, Drop-Ins, Serviceeinheiten usw.)." + }, + { + "title": "Aktualisieren des Registers", + "body": "Der register_tool-Aufruf innerhalb der Funktion schreibt die neue Version in installed_tools.json. Beim nächsten Scan wird keine Diskrepanz mehr festgestellt und der Updateeintrag verschwindet sowohl aus dem Menü als auch aus der Monitorkarte." + }, + { + "title": "Kein Neustart, es sei denn, die Funktion sagt es", + "body": "Die meisten Updates werden sofort wirksam. Updates, die Kernelmodule, persistente Schnittstellennamen oder VFIO berühren, zeigen die gleiche Neustartaufforderung wie eine Neuinstallation." + }, + { + "title": "Registrieraktualisierung an den Monitor gesendet", + "body": "Nach dem Durchlauf sendet das Menü eine POST-Anfrage an http://127.0.0.1:8008/api/updates/post-install/scan, um /usr/local/share/proxmenux/updates_available.json neu zu erstellen. Nach Anwendung aller Updates verschwinden das Update-Zählabzeichen und der bedingte Shell-Menüeintrag ohne Warten auf den nächsten Scan. Die Optimierungskarte bleibt verfügbar." + } + ], + "jqTitle": "jq ist erforderlich", + "jqBody": "Die Path-A-Checkliste basiert auf jq, um die ausstehenden Updates JSON zu analysieren. Wenn jq fehlt, verlässt der Fluss lautlos - Sie würden den Menüeintrag mit einer Zählung sehen, aber nach dem Auswählen von Zeilen würde nichts passieren. Auf jeder modernen Proxmox-Installation ist jq vorhanden; im Zweifelsfall führen Sie apt install -y jq aus." + }, + "differs": { + "heading": "Wie es sich von den anderen Pfaden unterscheidet", + "headerPath": "Path", + "headerScope": "Umfang", + "headerWhen": "Wenn es Sinn macht", + "rows": [ + { + "pathLabel": "Automatisch", + "pathHref": "/docs/post-install/automated", + "scope": "Wendet jede Optimierung des Pakets erneut an.", + "when": "Frischer Host oder vollständige Re-Baseline eines vollständig verwalteten Knotens." + }, + { + "pathLabel": "Anpassbar", + "pathHref": "/docs/post-install/customizable", + "scope": "Wählen Sie aus dem vollständigen Katalog.", + "when": "Gezielt auswählen, welche Optimierungen auf dem Host aktiv sind." + }, + { + "pathLabel": "Verfügbare Updates anwenden", + "pathHref": null, + "scope": "Nur Optimierungen mit neuerer Version auf dem Datenträger.", + "when": "Halten Sie bereits installierte Optimierungen aktuell, ohne den Rest zu berühren." + }, + { + "pathLabel": "Optimierungen deinstallieren", + "pathHref": "/docs/post-install/uninstall", + "scope": "Optimierung rückgängig machen und ihren Registereintrag entfernen.", + "when": "Rollen Sie eine bestimmte Änderung zurück." + } + ] + }, + "notifTitle": "Benachrichtigung steuern", + "notifBody": "Ausstehende Updates werden durch ProxMenux-Optimierungsupdates verfügbar angekündigt. Das Ereignis ist auf allen Kanälen standardmäßig aktiv und kann unter Einstellungen → Benachrichtigungen pro Kanal stummgeschaltet werden. Es wird nur einmal pro unterschiedlicher Updategruppe ausgelöst, nicht bei jedem 24-Stunden-Scan." +} diff --git a/web/messages/de/docs/post-install/virtualization.json b/web/messages/de/docs/post-install/virtualization.json new file mode 100644 index 00000000..f4f95199 --- /dev/null +++ b/web/messages/de/docs/post-install/virtualization.json @@ -0,0 +1,116 @@ +{ + "meta": { + "title": "Post-Install: Virtualisierung | ProxMenux Dokumentation", + "description": "Virtualisierungsoptionen im ProxMenux Anpassbares Post-Installationsskript: Installieren Sie automatisch den richtigen Gastagenten, wenn Proxmox in einem VM läuft, und aktivieren Sie IOMMU / VFIO, damit Sie PCI-Geräte (GPUs, NICs, HBAs) an Ihre eigenen VMs weitergeben können." + }, + "header": { + "title": "Post-Install: Virtualisierung", + "section": "Einstellungen nach der Installation von Proxmox" + }, + "intro": { + "title": "Was diese Kategorie abdeckt", + "body": "Zwei unabhängige Optionen. Passenden Gastagenten installieren hilft, wenn Proxmox selbst in einem anderen Hypervisor verschachtelt läuft. VFIO-IOMMU-Unterstützung aktivieren ist für die meisten Benutzer relevant: Es aktiviert die Kernelfunktionen zur direkten Zuweisung einer GPU, HBA oder Netzwerkkarte an eine VM mit nahezu nativer Leistung." + }, + "guestAgent": { + "heading": "Relevanten Gastagenten installieren", + "intro": "Erkennt die Virtualisierungsumgebung des Proxmox-Hosts mit systemd-detect-virt und dmidecode und installiert das passende Gastwerkzeugpaket für die Kommunikation mit dem äußeren Hypervisor: geordnetes Herunterfahren, Uhrzeitsynchronisierung, IP-Meldung usw.", + "headerDetected": "Erkannter Host", + "headerPackage": "Installiertes Paket", + "rows": [ + { + "detected": "QEMU / KVM", + "package": "qemu-guest-agent" + }, + { + "detected": "VMware (ESXi, Workstation)", + "package": "open-vm-tools" + }, + { + "detected": "VirtualBox", + "package": "virtualbox-guest-utils" + }, + { + "detected": "Direkt auf Hardware (keiner)", + "package": "— no-op, nichts installiert" + } + ], + "skipTitle": "Überspringen Sie dies auf Bare-Metal Proxmox", + "skipBody": "Wenn Proxmox direkt auf Hardware läuft (der übliche Fall), ist das Ankreuzen dieser Option ein No-Op - der Detektor gibt none zurück und das Skript wird ohne Änderungen beendet. Die Option ist nur für die Minderheit der Setups wichtig, die Proxmox als Gast für Tests oder Labors ausführen." + }, + "vfio": { + "heading": "VFIO IOMMU-Unterstützung aktivieren", + "intro": "Aktiviert IOMMU auf dem Host und lädt die Kernelmodule für PCI-Passthrough (vfio, vfio_iommu_type1, vfio_pci). Damit kann ein physisches Gerät direkt einer VM zugewiesen werden, deren Gast einen nahezu hardwaredirekten Zugriff erhält.", + "whoTitle": "Wer das braucht", + "whoItems": [ + "Sie möchten eine GPU an eine Windows-Gaming-VM oder macOS-VM durchreichen.", + "Sie haben eine dedizierte 10G NIC für eine Firewall / Router VM (OPNsense, pfSense).", + "Sie möchten einen HBA direkt an einen TrueNAS/Unraid VM für ZFS auf nackten Festplatten übergeben.", + "Sie planen, Coral TPU, eine Capture-Karte oder einen SDR-Dongle in einem VM zu verwenden." + ], + "whoOutro": "Trifft nichts davon zu, können Sie die Option sicher überspringen. Für die Geräteweitergabe an einen LXC-Container statt an eine VM ist IOMMU nicht erforderlich.", + "doesTitle": "Was ProxMenux tut", + "doesIntro": "Die Funktion ist bootloaderbewusst: Sie erkennt, ob Proxmox auf ZFS (systemd-boot) oder LVM/ext4 (GRUB) ist und schreibt in die richtige Datei. Es ist auch idempotent - wenn die Parameter bereits vorhanden sind, wird nichts hinzugefügt.", + "headerBoot": "Bootstyp", + "headerFile": "Geänderte Datei", + "headerPost": "Schritt nach der Aktualisierung", + "bootRows": [ + { + "boot": "systemd-boot (ZFS)", + "file": "/etc/kernel/cmdline", + "post": "proxmox-boot-tool refresh" + }, + { + "boot": "GRUB (LVM/ext4)", + "file": "/etc/default/grub", + "post": "update-grub" + } + ], + "kernelIntro": "Zusätzliche Kernelparameter:", + "modulesIntro": "Kernelmodule, die /etc/modules hinzugefügt wurden:", + "blacklistIntro": "Konfliktierende Treiber auf der schwarzen Liste in /etc/modprobe.d/blacklist.conf:", + "blacklistTitle": "GPU-Treibersperren verhindern die GPU-Nutzung auf dem Host", + "blacklistBody": "Die Sperrliste verhindert, dass der Host-Kernel irgendeinen GPU-Treiber bindet, damit VFIO die GPU übernehmen kann. Das ist für die Durchreichung an eine VM erwünscht, aber das Gegenteil dessen, was Sie zum Installieren von NVIDIA-Treibern auf dem Host benötigen, etwa für LXC-Transcodierung. Wählen Sie pro GPU einen Weg:", + "pathItems": [ + "GPU → VM: aktivieren VFIO/IOMMU hier, lassen Sie die GPU-Treiber auf der schwarzen Liste.", + "GPU → LXC (oder Host): überspringen Sie diese Option, installieren Sie NVIDIA auf dem Host und sperren Sie nvidia/nouveau nicht.", + "Zwei GPUs: Eine kann einer VM, die andere einem LXC zugeordnet werden. Dafür ist eine gezieltere Konfiguration nötig: Binden Sie nur eine Karte über ihre PCI-ID an vfio-pci. Die Standardsperrliste ist dafür zu umfassend; bearbeiten Sie danach blacklist.conf." + ], + "acsTitle": "Über pcie_acs_override - wissen, was Sie aktivieren", + "acsBody": "pcie_acs_override=downstream,multifunction entspannt den PCIe Access Control Services Check. Es ermöglicht dem Kernel, IOMMU-Gruppen aufzuteilen, die von der Firmware als monolithisch gemeldet werden, was manchmal die einzige Möglichkeit ist, ein Gerät einer Gruppe zu durchlaufen, ohne den Rest zu ziehen. Der Kompromiss ist reduzierte Isolation zwischen Geräten: ein bösartiger oder kompromittierter VM mit Durchgang hat eine größere Angriffsfläche über DMA. Gut für ein Heimlabor; Überlegen Sie zweimal, bevor Sie einen Host aktivieren, der nicht vertrauenswürdige Workloads ausführt. Wenn Sie es nicht benötigen, entfernen Sie dieses Token aus /etc/kernel/cmdline oder /etc/default/grub, nachdem das Skript ausgeführt wurde, und führen Sie den Schritt zur Aktualisierung des Bootloaders erneut aus.", + "rebootTitle": "Reboot erforderlich", + "rebootBody": "IOMMU, VFIO-Module und Sperrliste werden erst nach initramfs-Neuerstellung und Neustart wirksam. Das Skript führt update-initramfs -u -k all und die Bootloader-Aktualisierung aus und setzt „Neustart erforderlich“, sodass Anpassbar am Ende danach fragt.", + "verifyTitle": "Überprüfung nach dem Neustart", + "revertTitle": "Reversibel aus dem Menü Deinstallieren", + "revertBody": "Optimierungen deinstallieren macht alle Änderungen rückgängig: entfernt IOMMU-Parameter aus /etc/kernel/cmdline oder GRUB, VFIO-Module aus /etc/modules und die Treibersperren und erstellt initramfs neu. Erst ein Neustart wendet die Rücknahme an." + }, + "related": { + "heading": "Verwandte Themen", + "items": [ + { + "label": "GPU zu VM hinzufügen (Passthrough)", + "href": "/docs/hardware/gpu-vm-passthrough", + "tail": "— natürlicher nächster Schritt, sobald IOMMU + VFIO aktiviert sind." + }, + { + "label": "Controller oder NVMe zu VM hinzufügen", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "tail": " — dieselbe Passthrough-Infrastruktur für Speichercontroller." + }, + { + "label": "GPU-Passthrough-Befehle", + "href": "/docs/help-info/gpu-commands", + "tail": "Referenz der IOMMU-Prüfung." + }, + { + "label": "Optimierungen deinstallieren", + "href": "/docs/post-install/uninstall", + "tail": " — IOMMU/VFIO sauber rückgängig machen." + }, + { + "label": "Anpassbare Nachinstallation", + "href": "/docs/post-install/customizable", + "tail": " — zurück zum übergeordneten Menü." + } + ] + } +} diff --git a/web/messages/en/docs/post-install/automated.json b/web/messages/en/docs/post-install/automated.json index e501bf05..9d5eac6c 100644 --- a/web/messages/en/docs/post-install/automated.json +++ b/web/messages/en/docs/post-install/automated.json @@ -1,13 +1,13 @@ { "meta": { "title": "Automated Post-Install Script | ProxMenux Documentation", - "description": "The ProxMenux Automated post-install script applies a curated set of 14 safe, hardware-aware optimizations to a fresh Proxmox VE host with zero prompts. Reversible configuration changes are registered for later restoration.", + "description": "The ProxMenux Automated post-install script runs a fixed set of 14 hardware-aware optimizations on a fresh Proxmox VE host. It has no feature-selection checklist, but banner removal, some Log2RAM installations and rebooting can ask for confirmation. Reversible configuration changes are registered for later restoration.", "ogTitle": "Automated Post-Install Script | ProxMenux Documentation", - "ogDescription": "14 curated optimizations applied to a fresh Proxmox VE host with zero prompts. Hardware-aware, with reversible configuration changes tracked." + "ogDescription": "14 fixed, hardware-aware optimizations for a fresh Proxmox VE host, with confirmations for some actions and reversible configuration changes tracked." }, "header": { "title": "Automated Post-Install Script", - "description": "One click, zero prompts — ProxMenux applies a curated set of 14 safe optimizations that almost every Proxmox host benefits from. Reversible configuration changes are registered for Uninstall Optimizations; package upgrades are not described as reversible.", + "description": "ProxMenux runs a fixed set of 14 baseline optimizations without a feature-selection checklist. Some actions still ask for confirmation. Reversible configuration changes are registered for Uninstall Optimizations; package upgrades are not described as reversible.", "section": "Post-Install · Automated" }, "intro": { @@ -43,7 +43,7 @@ }, { "tool": "Skip language packages", - "what": "Writes /etc/apt/apt.conf.d/99-disable-translations to stop downloading locale-specific packages. Faster, lighter apt updates.", + "what": "Writes /etc/apt/apt.conf.d/99-disable-translations to stop downloading translated package-description indexes, reducing the data fetched by apt updates.", "category": "Basic Settings", "categorySlug": "basic-settings" }, @@ -97,7 +97,7 @@ }, { "tool": "Logrotate tuning", - "what": "Daily rotation with size cap 10M, 7 rotations, compression and copytruncate — Log2RAM-friendly.", + "what": "Sets daily and then size 10M globally, keeps 7 rotations, enables compression and copytruncate. The later size criterion takes precedence; per-log rules may override it. Suitable for Log2RAM, but rotation frequency depends on the rules and timer.", "category": "System", "categorySlug": "system" }, diff --git a/web/messages/en/docs/post-install/basic-settings.json b/web/messages/en/docs/post-install/basic-settings.json index 33d0343e..8c48cb99 100644 --- a/web/messages/en/docs/post-install/basic-settings.json +++ b/web/messages/en/docs/post-install/basic-settings.json @@ -31,7 +31,7 @@ ], "officialTitle": "The official Proxmox recommendation", "officialBody": "Proxmox's own upgrade guidance is to run, in this exact order:", - "officialOutro": "That single line is all you need on any current Proxmox release. The challenge isn't the command itself — it's making sure the repositories on the host are sane before running it.", + "officialOutro": "For routine updates within the installed Proxmox VE major version, this is the usual command. Check the host’s repositories and review the proposed package changes before proceeding. Upgrading to another major version requires the official migration procedure.", "doesTitle": "What the ProxMenux option does — verified against the script", "doesIntro": "The ProxMenux update wraps the exact apt commands above and adds a number of pre/post steps you would otherwise have to remember by hand. Every item below is what the dispatcher script actually does (see Proxmox System Update for the full breakdown):", "doesItems": [ @@ -59,7 +59,7 @@ }, "languages": { "heading": "Skip downloading additional languages", - "intro": "On every apt update, Debian by default pulls translation files for every locale it ships — a lot of traffic and disk space for something you'll rarely see. This option tells APT to only fetch the main metadata. Before disabling, ProxMenux makes sure the host's own locale is actually generated (reads /etc/default/locale or /etc/environment, appends to /etc/locale.gen if missing, and runs locale-gen). So you don't lose your shell locale as a side effect.", + "intro": "During apt update, APT can download translated package descriptions as well as the main metadata. This option disables those translation downloads to save bandwidth and disk space. Before disabling them, ProxMenux makes sure the host’s own locale is actually generated (reads /etc/default/locale or /etc/environment, appends to /etc/locale.gen if missing, and runs locale-gen). So you do not lose your shell locale as a side effect.", "writtenTitle": "What gets written", "revertTitle": "Reversible from the Uninstall menu", "revertBody": "Deleting /etc/apt/apt.conf.d/99-disable-translations (either manually or from the Uninstall menu) restores the default behaviour and APT downloads language files again." diff --git a/web/messages/en/docs/post-install/customizable.json b/web/messages/en/docs/post-install/customizable.json index 62fdd25e..ae1a2289 100644 --- a/web/messages/en/docs/post-install/customizable.json +++ b/web/messages/en/docs/post-install/customizable.json @@ -7,12 +7,12 @@ }, "header": { "title": "Customizable Post-Install Script", - "description": "Cherry-pick exactly which optimizations to apply to a Proxmox VE host. ProxMenux groups ~35 individual tools into 10 categories, each with its own checklist dialog. Same engine as Automated, but with full control over what gets applied.", + "description": "Cherry-pick exactly which optimizations to apply to a Proxmox VE host. ProxMenux groups ~35 individual tools into 10 categories in one checklist dialog. Same engine as Automated, but with full control over what gets applied.", "section": "Post-Install · Customizable" }, "intro": { "title": "When to pick Customizable", - "body": "Choose this path when you already know which tweaks you want on the host — or which you definitely do not want. The script presents a checklist per category so you can pre-select, deselect or mix-and-match optimizations. Items can be applied again later, and reversible configuration changes are tracked for Uninstall Optimizations. Package upgrades are not presented as reversible." + "body": "Choose this path when you already know which tweaks you want on the host — or which you definitely do not want. The script presents a checklist grouped by category so you can pre-select, deselect or mix-and-match optimizations. Items can be applied again later, and reversible configuration changes are tracked for Uninstall Optimizations. Package upgrades are not presented as reversible." }, "compare": { "heading": "How it compares to Automated", @@ -20,7 +20,7 @@ }, "categoriesSection": { "heading": "The 10 categories", - "body": "The Customizable script groups optimizations into 10 categories. Each category has its own checklist dialog and its own documentation page — open one of the cards below for the per-option rationale, defaults and verification steps." + "body": "The Customizable script groups optimizations into 10 categories in one checklist dialog. Each category has its own documentation page — open one of the cards below for the per-option rationale, defaults and verification steps." }, "categories": [ { @@ -33,7 +33,7 @@ }, { "name": "Virtualization", - "description": "Prepare the host for advanced virtualization. Auto-installs the guest agent on templates and enables IOMMU/VFIO for PCI passthrough of GPUs, controllers and TPUs." + "description": "Prepare the host for advanced virtualization. Installs a matching guest agent when Proxmox itself runs inside a supported VM, and enables IOMMU/VFIO for PCI passthrough of GPUs, controllers and TPUs." }, { "name": "Network", @@ -53,7 +53,7 @@ }, { "name": "Monitoring", - "description": "Integrate the host with OVH Real-Time Monitoring. Only appears when ProxMenux detects an OVH server." + "description": "Integrate the host with OVH Real-Time Monitoring. Installs RTM only when ProxMenux detects an OVH server; on other hosts the option makes no changes." }, { "name": "Performance", diff --git a/web/messages/en/docs/post-install/customization.json b/web/messages/en/docs/post-install/customization.json index eccbbba0..93344524 100644 --- a/web/messages/en/docs/post-install/customization.json +++ b/web/messages/en/docs/post-install/customization.json @@ -38,7 +38,7 @@ "breakTitle": "Can break after Proxmox updates", "breakBody": "Proxmox regularly ships UI updates that overwrite proxmoxlib.js. When that happens, the banner comes back. You can re-apply this option after every Proxmox update to re-patch the file, or just accept the nag until you reapply. ProxMenux also installs an APT hook that auto-re-patches on package upgrades — see Uninstall Optimizations for how that hook is reversed.", "legalTitle": "Legal note (always worth repeating)", - "legalBody": "This option only hides the UI nag. It does not grant you enterprise support, access to the enterprise repository, or any rights to ship Proxmox commercially without a subscription. If you run Proxmox in a revenue-generating environment, buy a subscription — it supports the project and gets you the stable enterprise channel." + "legalBody": "This option only hides the UI notice. It does not grant enterprise support or access to the enterprise repository, and it does not change the software license. Proxmox VE is released under the GNU AGPLv3. A subscription supports the project and provides access to the enterprise update channel; choose the appropriate support level for your environment." }, "verify": { "heading": "Verification", diff --git a/web/messages/en/docs/post-install/monitoring.json b/web/messages/en/docs/post-install/monitoring.json index b9fda635..82dcccb5 100644 --- a/web/messages/en/docs/post-install/monitoring.json +++ b/web/messages/en/docs/post-install/monitoring.json @@ -30,8 +30,8 @@ "verifyTitle": "Verification", "verifyBody": "On a real OVH host, after a reboot you should see the RTM dashboard in your OVH Manager populated with live data for the host. On the Proxmox side, the RTM collector is a systemd service — check it directly:", "troubleTitle": "Troubleshooting", - "revertTitle": "Not reversible from the Uninstall menu", - "revertBody": "There is no dedicated uninstall entry for RTM. On a real OVH host, remove the packages manually with apt purge ovh-* and delete any puppet manifests under /etc/puppet/ that RTM installed. On a non-OVH host, nothing was ever installed, so there's nothing to revert." + "revertTitle": "Remove RTM from the Uninstall menu", + "revertBody": "When RTM is registered as installed, Uninstall Optimizations offers an OVH Real-Time Monitoring entry. It runs apt-get purge -y ''ovh-rtm*'' ''rtm'' ''rtm-*'', removes /etc/rtm, and marks RTM as uninstalled. Puppet artefacts may still need manual cleanup; review any RTM-specific manifests under /etc/puppet/. On a non-OVH host, no RTM packages were installed, so there is nothing to remove." }, "related": { "heading": "Related", diff --git a/web/messages/en/docs/post-install/network.json b/web/messages/en/docs/post-install/network.json index 28f2a175..f9420fb8 100644 --- a/web/messages/en/docs/post-install/network.json +++ b/web/messages/en/docs/post-install/network.json @@ -74,7 +74,7 @@ "impactTitle": "Impact is workload-dependent", "impactBody": "BBR shines on high-latency or lossy links (cross-continent replication, VPN tunnels, mobile clients). On a LAN between two machines on the same switch, the difference is often within noise. TFO helps short, repeated HTTP connections the most.", "revertTitle": "Reversible from the Uninstall menu", - "revertBody": "BBR/TFO are tracked. Uninstall Optimizations removes the two sysctl files (/etc/sysctl.d/99-tcp-bbr.conf and 99-tcp-fastopen.conf) and reloads sysctl so the kernel returns to cubic and tcp_fastopen=1. Manual equivalent:" + "revertBody": "BBR/TFO are tracked. Uninstall Optimizations removes the two sysctl files (/etc/sysctl.d/99-kernel-bbr.conf and 99-tcp-fastopen.conf) and reloads the remaining sysctl configuration. Removing a file does not itself reset its live kernel values. Defaults such as cubic and tcp_fastopen=1 return after a reboot unless another configuration overrides them. Manual equivalent:" }, "names": { "heading": "Interface Names (persistent)", @@ -83,13 +83,13 @@ "whyItems": [ "Adding or removing PCIe devices can shift the bus numbering, turning enp3s0 into enp4s0. If your /etc/network/interfaces references the old name, the bridge vanishes on reboot.", "BIOS / firmware updates sometimes change how devices enumerate, with the same effect.", - "LXC containers with hotplug NICs and bonded links can race on boot and end up named inconsistently. Pinning fixes that." + "The helper pins physical NIC names, including physical ports used by bonds. It skips virtual interfaces such as LXC veth devices and the bond devices themselves; it does not fix naming races for virtual hotplug NICs." ], "writtenTitle": "What gets written", "writtenIntro": "One file per physical NIC, at /etc/systemd/network/10-proxmenux-<iface>.link. Each file starts with the header # Managed by ProxMenux — do not edit so ProxMenux can distinguish its own files from user- or package-provided .link files.", "writtenOutro": ".link files from other packages or hand-written by the user are left in place — only files carrying the ProxMenux header are managed. On re-run, the function reconciles its own set: it re-reads MACAddress= from every 10-proxmenux-*.link and drops any whose MAC no longer appears under /sys/class/net/. Files written by an earlier ProxMenux release in the old 10-<iface>.link format are migrated automatically the first time.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "On Proxmox VE 9 (systemd-networkd native), the script reloads udev rules after writing the .link files so new hotplug NICs pick up the correct name without a reboot. On PVE 8 (ifupdown2), interface naming is resolved at boot anyway — a reboot is required for the changes to take effect. The script sets the reboot flag either way so Customizable prompts you.", + "pveBody": "The script uses systemd .link files for persistent names. On Proxmox VE 9 it also reloads udev rules after writing them, so newly added NICs can use the rules without rebooting. Existing interfaces should be checked after a reboot on both PVE 8 and PVE 9. This does not switch the host away from ifupdown2. The script sets the reboot flag in either case so Customizable prompts you.", "reviewTitle": "Review existing /etc/network/interfaces first", "reviewBody": "If your host has legacy configuration in /etc/network/interfaces that references NIC names generated by the kernel's default scheme, pinning today's names is exactly what you want. But if you've already manually customised the config around specific names, double-check the pinning matches what the interfaces file expects before rebooting.", "revertTitle": "Reversible from the Uninstall menu", diff --git a/web/messages/en/docs/post-install/optional.json b/web/messages/en/docs/post-install/optional.json index dc3a1d04..e6aca71a 100644 --- a/web/messages/en/docs/post-install/optional.json +++ b/web/messages/en/docs/post-install/optional.json @@ -133,7 +133,7 @@ }, "log2ram": { "title": "Install Log2RAM (SSD/NVMe wear reduction)", - "intro": "Log2RAM mounts /var/log on a tmpfs ramdisk and periodically syncs the contents back to the underlying disk. On a hypervisor journald churn hits the root SSD every few seconds; moving the writes to RAM reduces wear and disk I/O without losing logs — the periodic sync flushes them to disk and a clean shutdown flushes them too.", + "intro": "Log2RAM mounts /var/log on a tmpfs ramdisk and periodically syncs it to the underlying disk. Buffering frequent journald writes in RAM can reduce root SSD wear and disk I/O. Periodic sync and a clean shutdown save logs to disk, but an abrupt power loss can lose entries written since the last sync.", "upstreamLabel": "Upstream project:", "upstreamUrl": "https://github.com/azlux/log2ram", "upstreamLinkLabel": "azlux/log2ram on GitHub", @@ -149,7 +149,7 @@ "Registers itself in installed_tools.json so it can be reverted from Uninstall Optimizations." ], "howUseLabel": "How to use:", - "howUseBody": "On the Automated flow Log2RAM applies unattended when an SSD/NVMe root is detected. On the Customizable flow the script prompts for size, sync interval and whether to enable the 90% auto-sync guard.", + "howUseBody": "On the Automated flow Log2RAM installs unattended when an SSD/NVMe root is detected. The Customizable flow asks for size, sync interval and whether to enable the auto-sync guard. Its prompt currently says 90%, but the generated guard uses the 80% cleanup and 92% aggressive thresholds described above.", "verifyLabel": "Verify and manage from the shell:", "verifyCode": "# Service state and configured timers\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Current ramdisk usage — /var/log IS the tmpfs itself\ndf -h /var/log\n\n# Force a sync now (tmpfs → disk); does NOT shrink the tmpfs\nlog2ram write\n\n# Trigger the auto-sync guard on demand (vacuum + sync when usage is high)\n/usr/local/bin/log2ram-check.sh\n\n# Current config: SIZE, mail settings, path\ncat /etc/log2ram.conf\n\n# ProxMenux-specific cron jobs\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Recent Log2RAM activity\njournalctl -u log2ram -n 50 --no-pager" }, @@ -172,6 +172,6 @@ }, "autoApplication": { "title": "Automatic Application", - "body": "These optional features are applied only when specifically selected during the post-install process. Each feature can be individually chosen based on your specific needs and preferences." + "body": "In the Customizable flow, select each optional feature according to your needs. Log2RAM is also part of the Automated flow with hardware detection; ZRAM remains Customizable-only. Review the individual sections for prompts and prerequisites." } } diff --git a/web/messages/en/docs/post-install/performance.json b/web/messages/en/docs/post-install/performance.json index d6fdd610..82ca4195 100644 --- a/web/messages/en/docs/post-install/performance.json +++ b/web/messages/en/docs/post-install/performance.json @@ -16,7 +16,7 @@ "heading": "Use pigz for faster gzip compression", "intro": "Standard gzip compresses data using a single CPU core. On modern Proxmox hosts with 8, 16 or 32 cores, that is a huge bottleneck during vzdump VM/CT backups, log rotation, and anything else that pipes through gzip. pigz is a drop-in parallel replacement: same gzip-compatible output, but it spreads the work across every core.", "doesTitle": "What ProxMenux does", - "doesIntro": "Four steps, all idempotent:", + "doesIntro": "Five steps, all idempotent:", "doesItems": [ "Sets pigz: 1 in /etc/vzdump.conf so Proxmox's backup tool uses pigz natively.", "Installs the pigz apt package if not already present.", diff --git a/web/messages/en/docs/post-install/storage.json b/web/messages/en/docs/post-install/storage.json index 3dfc9d40..888d021b 100644 --- a/web/messages/en/docs/post-install/storage.json +++ b/web/messages/en/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Each of these options registers a tool in installed_tools.json, so they appear in Uninstall Optimizations. Reverting zfs_arc removes /etc/modprobe.d/99-zfsarc.conf and rebuilds initramfs; zfs_auto_snapshot reverses the cron schedule and offers to purge the package; zfs_autotrim sets autotrim=off on the pools it enabled; vzdump_speed restores /etc/vzdump.conf from the .bak the install created.", "arc": { "heading": "Optimize ZFS ARC size", - "intro": "The Adaptive Replacement Cache (ARC) is ZFS's in-memory read cache. Without explicit tuning, ZFS happily grabs up to half the host RAM for itself, which is excessive on a Proxmox host that also needs memory for VMs and LXCs. This option caps ARC to a sane fraction of total RAM based on the size of the machine.", + "intro": "The Adaptive Replacement Cache (ARC) is ZFS’s in-memory read cache. Proxmox VE installations since 8.1 set a limit of 10% of RAM, capped at 16 GiB; older or upgraded hosts may differ. This option writes its own RAM-based ARC limit. Check existing settings and workload needs before changing it; a smaller cache is not always faster.", "sizingTitle": "Sizing rules", "headerRam": "Host RAM", "headerMax": "ARC cap", @@ -41,7 +41,7 @@ "max": "16 GiB (cap)" } ], - "after": "The file /etc/modprobe.d/99-zfsarc.conf contains a single directive — options zfs zfs_arc_max=…. Every other ZFS module parameter (zfs_arc_min, L2ARC prefetch/write throttle, TXG timeout) is left at its OpenZFS default. Before writing, a reconcile step scans any other *.conf in /etc/modprobe.d/ that sets zfs_arc_min / zfs_arc_max, backs them up to /usr/local/share/proxmenux/backups/zfs_arc/ with a manifest, and strips the conflicting lines so only ProxMenux's file is active. After writing the file, ProxMenux runs update-initramfs -u -k all and, when applicable, proxmox-boot-tool refresh, so the cap also lands in the initramfs used by ZFS-on-root setups.", + "after": "The file /etc/modprobe.d/99-zfsarc.conf contains a single directive — options zfs zfs_arc_max=…. This option does not tune other ZFS module parameters (zfs_arc_min, L2ARC prefetch/write throttle, TXG timeout). Before writing, a reconcile step scans other *.conf in /etc/modprobe.d/ that set zfs_arc_min / zfs_arc_max, backs them up to /usr/local/share/proxmenux/backups/zfs_arc/ with a manifest, and strips conflicting lines so only ProxMenux’s ARC file is active. After writing, it runs update-initramfs -u -k all and, when applicable, proxmox-boot-tool refresh, so the limit also reaches the initramfs used by ZFS-on-root setups.", "rebootTitle": "Requires a reboot to take effect", "rebootBody": "ARC settings are read when the zfs kernel module loads. To make the cap take effect on ZFS-on-root hosts, ProxMenux regenerates the initramfs with update-initramfs -u -k all and, when applicable, refreshes the boot loader with proxmox-boot-tool refresh. A reboot is still required to pick up the new module parameter; the \"reboot required\" flag is set automatically.", "safeTitle": "Safe on non-ZFS hosts", @@ -90,22 +90,22 @@ }, "autotrim": { "heading": "Enable ZFS autotrim (SSD/NVMe pools)", - "intro": "Enables the autotrim property on every ZFS pool that is backed exclusively by SSDs or NVMe drives with TRIM support. Pools that include a single HDD vdev are skipped automatically — TRIM on rotational drives is meaningless and ZFS will refuse it. Pools that were already set to autotrim=on are left as they are.", + "intro": "Enables the autotrim property on ZFS pools backed exclusively by SSDs or NVMe drives with TRIM support. The script conservatively skips pools containing a rotational device. Pools already set to autotrim=on are left unchanged.", "trimTitle": "What TRIM does, and why it matters on ZFS", "trimBody1": "SSDs / NVMe drives manage internal storage in fixed-size erase blocks that are much larger than the logical sectors the filesystem talks to. When a filesystem deletes a file, the drive doesn't know — it still thinks those sectors are in use, so its internal garbage collector keeps shuffling stale data around to free new erase blocks. TRIM is the standard command the OS uses to tell the drive \"these sectors are now free, you can erase them ahead of time\".", "trimBody2": "Without TRIM, SSD performance degrades over time as the drive runs out of pre-erased blocks and has to do erase-on-write, and write amplification increases — both shortening the drive's useful life. With TRIM enabled, the drive can keep a healthy pool of empty blocks ready to write into.", - "trimBody3": "On ZFS, autotrim=on is the modern equivalent of the periodic zpool trim <pool> command — instead of having to remember to run a trim manually (or schedule one), the pool issues TRIM commands automatically and continuously as blocks become free. It's low-overhead and the recommended setting for SSD-backed pools.", + "trimBody3": "With autotrim=on, ZFS trims recently freed space in the background, grouping ranges before issuing commands. A periodic zpool trim <pool> is another option. Autotrim avoids a separate schedule, but its performance impact depends on the devices; periodic manual trim may suit some lower-end drives better.", "practicalTitle": "Why is this practical to enable?", "practicalItems": [ - "Sustained write performance. SSDs that never see TRIM commands slow down measurably over months. Autotrim keeps the controller's job easier.", - "Drive longevity. Lower write amplification means fewer total NAND writes for the same amount of data — measurable in years of useful life for the disk.", + "Sustained write performance. TRIM can help a drive reclaim unused blocks efficiently. The benefit and any latency impact depend on the device and workload.", + "Drive longevity. Avoiding unnecessary internal copying can reduce write amplification and NAND wear. It does not guarantee a specific increase in drive lifespan.", "No scheduled cron job to remember. Unlike a periodic zpool trim, autotrim is fire-and-forget — the pool handles it on its own." ], "whenTitle": "When is this necessary?", - "whenIntro1": "You should enable it on any ZFS pool whose vdevs are all SSD or NVMe with TRIM support — the typical Proxmox install on consumer or enterprise SSDs.", + "whenIntro1": "Consider enabling it on ZFS pools made entirely of TRIM-capable SSD or NVMe devices. Check device behaviour and workload latency; a scheduled manual trim can be preferable on some hardware.", "whenIntro2": "The script skips it automatically on:", "whenSkipItems": [ - "Pools containing any HDD (rotational) vdev — TRIM is meaningless there.", + "Pools containing any HDD (rotational) vdev — a conservative hardware filter used by this script.", "Drives without discard_granularity exposed in sysfs — usually old SSDs without TRIM, or pass-through paths where the OS can't see the underlying device.", "Pools where ZFS itself reports the property unsupported (rare; very old pools).", "Pools already set to autotrim=on (no-op)." @@ -121,7 +121,7 @@ }, "vzdump": { "heading": "Increase vzdump backup speed", - "intro": "By default, Proxmox vzdump throttles backups to protect running VMs/CTs from IO starvation. On many setups that throttle is more conservative than needed. This option removes the bandwidth cap and lowers the I/O priority so vzdump can saturate the storage path during backup windows.", + "intro": "Writes bwlimit: 0 and ionice: 5 in the global vzdump configuration. Proxmox already defaults to no bandwidth limit, so this removes a cap only if one was configured. Compared with the default ionice: 7, the value 5 gives a higher best-effort I/O priority where the scheduler honours it. This can affect running guests and does not guarantee faster backups.", "changedTitle": "What gets changed in /etc/vzdump.conf", "backupTitle": "First run creates a .bak of vzdump.conf", "backupBody": "The first time this option runs, ProxMenux copies /etc/vzdump.conf to /etc/vzdump.conf.bak before touching it. Subsequent runs re-use that backup and won't overwrite it, so a hand-edited config from before the first apply stays recoverable. The changes to bwlimit and ionice are then made with sed, and any other options in the file (compress, pigz, tmpdir, exclude-path, etc.) are preserved.", @@ -145,7 +145,7 @@ { "label": "Backup and Restore commands", "href": "/docs/help-info/backup-commands", - "tail": " — vzdump CLI reference (now without the legacy bwlimit / ionice caps)." + "tail": " — vzdump CLI reference for bandwidth and I/O-priority settings." }, { "label": "Uninstall Optimizations", diff --git a/web/messages/en/docs/post-install/system.json b/web/messages/en/docs/post-install/system.json index 935a33f5..b2ff5383 100644 --- a/web/messages/en/docs/post-install/system.json +++ b/web/messages/en/docs/post-install/system.json @@ -28,9 +28,9 @@ }, "logrotate": { "heading": "Optimize logrotate", - "intro": "Rewrites /etc/logrotate.conf with a tighter policy suitable for a host that's also part of an SSD-protecting Log2RAM setup: daily rotation, 7-day retention, 10 MB size trigger, compression, and copytruncate so active services keep writing without reopening their log files. Original logrotate.conf is backed up to .bak on first apply.", + "intro": "Rewrites /etc/logrotate.conf with global daily and size settings, 7 retained rotations, compression and copytruncate, so active services can keep writing without reopening their log files. The size setting follows daily and takes precedence unless a per-log rule overrides it. Original logrotate.conf is backed up to .bak on first apply.", "tipTitle": "Log2RAM-friendly", - "tipBody": "The size 10M trigger means logs rotate on size or daily, whichever comes first. Combined with Log2RAM's RAM-backed /var/log, this keeps the working set small so flushes to disk stay cheap." + "tipBody": "The size 10M directive takes precedence over the earlier daily setting; it does not mean whichever comes first. Logrotate checks the threshold when it runs, and per-log rules may override the global settings. With Log2RAM’s RAM-backed /var/log, review both the rules and the timer frequency to control disk usage." }, "limits": { "heading": "Increase various system limits", @@ -72,7 +72,7 @@ } ], "tipTitle": "Why inotify matters", - "tipBody": "Applications like Docker, Syncthing, Node.js watchers, Plex's library scanner and many more hit max_user_watches quickly. Default on Debian is 8192 — a single running Plex can exhaust it. 1M is generous and costs ~1 KB of RAM per watch, which is negligible." + "tipBody": "Docker, Syncthing, Node.js file watchers and Plex library scans can exhaust max_user_watches. The default depends on the kernel and host memory; it is not always 8192. Raising the limit to 1M allows more watches, but does not preallocate them. Active watches consume kernel memory, so monitor actual usage on memory-constrained hosts." }, "memory": { "heading": "Optimize memory settings", @@ -102,8 +102,8 @@ "verify": { "heading": "Verification", "intro": "After applying the System optimizations:", - "tipTitle": "Fully reversible", - "tipBody": "All six options are tracked in installed_tools.json, so they appear in Uninstall Optimizations if you want to back any of them out. Reverts restore the sysctl files' defaults, drop the systemd unit and alias for kexec, and reset journald/logrotate to stock Debian configs." + "tipTitle": "Restoration and limitations", + "tipBody": "All six options are tracked in installed_tools.json and offered in Uninstall Optimizations. Restoration removes configuration files, the kexec unit and alias, and restores journald/logrotate configuration. Some live limits need a new session or reboot. The system-limits cleanup removes the legacy ulimit -n 256000 line from /root/.profile; the current ulimit -n 1048576 line can remain and may need manual removal." }, "related": { "heading": "Related", diff --git a/web/messages/en/docs/post-install/uninstall.json b/web/messages/en/docs/post-install/uninstall.json index 613ec0ac..f25407f2 100644 --- a/web/messages/en/docs/post-install/uninstall.json +++ b/web/messages/en/docs/post-install/uninstall.json @@ -58,7 +58,7 @@ }, { "tool": "APT Language Skip", - "restores": "Removes /etc/apt/apt.conf.d/99-disable-translations. APT will download language packages again." + "restores": "Removes /etc/apt/apt.conf.d/99-disable-translations, allowing APT to download translated package-description indexes according to its remaining language settings." }, { "tool": "APT IPv4 Force", @@ -83,7 +83,7 @@ }, { "tool": "System Limits Increase", - "restores": "Removes /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf and /etc/security/limits.d/99-limits.conf. Reverts PAM limits and systemd DefaultLimitNOFILE, and strips the ulimit -n 256000 line from /root/.profile." + "restores": "Removes /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf and /etc/security/limits.d/99-limits.conf. Reverts PAM limits and systemd DefaultLimitNOFILE. Its /root/.profile cleanup targets the legacy ulimit -n 256000 line; a ulimit -n 1048576 line from the current installer can remain and may need manual removal." }, { "tool": "ZRAM swap profile", @@ -104,7 +104,7 @@ }, { "tool": "TCP BBR + TCP Fast Open", - "restores": "Removes /etc/sysctl.d/99-tcp-bbr.conf and 99-tcp-fastopen.conf and reloads sysctl so the kernel returns to the cubic congestion control and to tcp_fastopen=1." + "restores": "Removes /etc/sysctl.d/99-kernel-bbr.conf and 99-tcp-fastopen.conf and reloads remaining sysctl configuration. File removal does not itself reset live values; defaults such as cubic and tcp_fastopen=1 return after reboot unless another configuration overrides them." }, { "tool": "Persistent Interface Names", @@ -166,8 +166,8 @@ "restores": "Removes idle=nomwait from kernel cmdline (ZFS) or GRUB, and the ignore_msrs / report_ignored_msrs options from /etc/modprobe.d/kvm.conf." }, { - "tool": "QEMU Guest Agent (templates)", - "restores": "Reads /usr/local/share/proxmenux/guest_agent.pkg (recorded at install time) and apt purges whichever package was installed (qemu-guest-agent for standard hosts, spice-vdagent when Spice mode is used)." + "tool": "Guest agent for a virtualized Proxmox host", + "restores": "Reads /usr/local/share/proxmenux/guest_agent.pkg and purges the recorded host package. The installer selects qemu-guest-agent, open-vm-tools or virtualbox-guest-utils according to the detected hypervisor. If the record is missing, the uninstaller tries those three packages. This acts on the nested Proxmox host, not guest templates." } ] }, @@ -221,7 +221,7 @@ }, { "tool": "OVH RTM (monitoring)", - "restores": "apt purges any ovh-* packages the RTM installer added and deletes the puppet manifests it dropped under /etc/puppet/. On non-OVH hosts nothing was ever installed, so nothing is removed." + "restores": "Purges packages matching ovh-rtm*, rtm and rtm-*, removes /etc/rtm and clears the RTM registry entry. Puppet artefacts under /etc/puppet/ may need manual inspection and cleanup; the uninstaller does not delete that directory. On non-OVH hosts the installer normally makes no changes." } ] } @@ -230,7 +230,7 @@ "edge": { "heading": "Edge cases and caveats", "packageTitle": "Package reinstall touches live Proxmox packages", - "packageBody": "Reverting Subscription Banner Removal reinstalls pve-manager, proxmox-widget-toolkit, libjs-extjs and libpve-http-server-perl with --force-confnew. This is generally safe but does touch the running web UI — refresh your browser afterwards, and expect a few seconds of reconnection. Don't run this in the middle of a migration or clone operation.", + "packageBody": "If ProxMenux’s own backups cannot restore Subscription Banner Removal, the fallback reinstalls pve-manager, proxmox-widget-toolkit, libjs-extjs and libpve-http-server-perl with --force-confnew. This touches the running web UI: refresh the browser afterwards and allow a few seconds to reconnect. Avoid doing it during a migration or clone operation.", "rebootTitle": "Persistent names and VFIO need a reboot", "rebootBody": "Removing ProxMenux's 10-proxmenux-*.link files (Persistent Interface Names) and reverting IOMMU/VFIO do not affect the running system — they only matter after a reboot. ProxMenux sets the reboot flag automatically for these.", "perItemTitle": "You can revert one thing and keep the rest", diff --git a/web/messages/en/docs/post-install/updates.json b/web/messages/en/docs/post-install/updates.json index 4ac308cb..482c4072 100644 --- a/web/messages/en/docs/post-install/updates.json +++ b/web/messages/en/docs/post-install/updates.json @@ -48,9 +48,9 @@ }, "pathB": { "heading": "Path B — From the Monitor dashboard", - "intro": "The same updates appear in the Monitor under Settings → ProxMenux Optimizations. When pending updates are detected the card shows an \"Updates available\" banner with the count and an Apply action that opens the same per-optimization picker.", - "imageAlt": "ProxMenux Optimizations card on the Monitor dashboard with an Updates available banner at the top showing the count of pending updates and an Apply button that opens the per-optimization picker", - "imageCaption": "The Optimizations card in the Monitor — when at least one optimization has a newer version on disk, the banner surfaces it without requiring shell access." + "intro": "The same updates appear in the Monitor under Settings → ProxMenux Optimizations. When pending updates are detected, the card shows an updates count badge that opens the per-optimization picker. Individual tools also provide their own update action.", + "imageAlt": "ProxMenux Optimizations card in Monitor settings, with a pending-updates count badge that opens the per-optimization picker and update actions on individual tools", + "imageCaption": "The Optimizations card in the Monitor — when at least one optimization has a newer version on disk, its count badge makes the updates accessible without shell access." }, "applying": { "heading": "What happens when you apply", @@ -69,7 +69,7 @@ }, { "title": "Registry refresh sent to the Monitor", - "body": "Once the batch finishes, the menu POSTs to http://127.0.0.1:8008/api/updates/post-install/scan to rebuild /usr/local/share/proxmenux/updates_available.json. That is what makes the Monitor's Optimizations card and the shell menu entry disappear immediately after the update, without waiting for the next scheduled scan." + "body": "Once the batch finishes, the menu POSTs to http://127.0.0.1:8008/api/updates/post-install/scan to rebuild /usr/local/share/proxmenux/updates_available.json. After all pending updates are applied, the update badge in the Monitor’s Optimizations card and the conditional shell menu entry disappear without waiting for the next scheduled scan. The Optimizations card itself remains available." } ], "jqTitle": "jq is required", diff --git a/web/messages/es/docs/post-install/automated.json b/web/messages/es/docs/post-install/automated.json index 4d3b127f..9fe719af 100644 --- a/web/messages/es/docs/post-install/automated.json +++ b/web/messages/es/docs/post-install/automated.json @@ -1,14 +1,14 @@ { "meta": { - "title": "Script Automatizado post-instalación | ProxMenux Documentation", - "description": "El script Automatizado post-instalación de ProxMenux aplica un conjunto seleccionado de 14 optimizaciones seguras y adaptadas al hardware a un host Proxmox VE recién instalado, sin preguntas. Los cambios de configuración reversibles quedan registrados para restaurarlos después.", - "ogTitle": "Script Automatizado post-instalación | ProxMenux Documentation", - "ogDescription": "14 optimizaciones aplicadas a un host Proxmox VE recién instalado sin preguntas. Adaptadas al hardware y con los cambios reversibles registrados." + "title": "Script automatizado post-instalación | Documentación de ProxMenux", + "description": "El script automatizado post-instalación de ProxMenux ejecuta un conjunto fijo de 14 optimizaciones adaptadas al hardware en un host Proxmox VE recién instalado. No ofrece una lista de funciones para elegir, pero puede pedir confirmación para ocultar el aviso de suscripción, instalar Log2RAM en ciertos casos y reiniciar. Los cambios reversibles se registran para restaurarlos después.", + "ogTitle": "Script automatizado post-instalación | Documentación de ProxMenux", + "ogDescription": "14 optimizaciones fijas adaptadas al hardware para un host Proxmox VE nuevo, con confirmaciones para algunas acciones y registro de cambios reversibles." }, "header": { "title": "Script Automatizado post-instalación", - "description": "Un clic, sin preguntas: ProxMenux aplica 14 optimizaciones seguras de las que se beneficia casi cualquier host Proxmox. Los cambios de configuración reversibles quedan registrados para Uninstall Optimizations; las actualizaciones de paquetes no se describen como reversibles.", - "section": "Post-Install · Automated" + "description": "ProxMenux ejecuta 14 optimizaciones de base sin lista de funciones para elegir. Algunas acciones piden confirmación. Los cambios reversibles se registran para Desinstalar optimizaciones; las actualizaciones de paquetes no se describen como reversibles.", + "section": "Post-instalación · Automatizada" }, "intro": { "title": "Cuándo elegir Automatizado", @@ -24,91 +24,91 @@ }, "optimizations": [ { - "tool": "Repositorios APT + full upgrade", + "tool": "Repositorios APT + actualización completa", "what": "Desactiva pve-enterprise.sources y ceph.sources enterprise, escribe una fuente limpia sin suscripción para el codename Debian del host, y luego ejecuta apt update && apt full-upgrade -y (el comando oficial de upgrade de Proxmox).", - "category": "Basic Settings", + "category": "Ajustes básicos", "categorySlug": "basic-settings" }, { "tool": "Eliminación del banner de suscripción", - "what": "Parchea la UI web para ocultar el banner 'No valid subscription'. Pide confirmación antes de aplicar; reversible desde Uninstall Optimizations.", - "category": "Customization", + "what": "Modifica la interfaz web para ocultar el aviso «No valid subscription». Pide confirmación antes de aplicarlo; reversible desde Desinstalar optimizaciones.", + "category": "Personalización", "categorySlug": "customization" }, { "tool": "Forzar IPv4", "what": "Escribe /etc/apt/apt.conf.d/99-force-ipv4 para que apt use solo IPv4 — esquiva setups de mirror IPv6 inestables.", - "category": "Network", + "category": "Red", "categorySlug": "network" }, { "tool": "Saltar paquetes de idioma", - "what": "Escribe /etc/apt/apt.conf.d/99-disable-translations para dejar de descargar paquetes específicos de locale. Updates de apt más rápidos y ligeros.", - "category": "Basic Settings", + "what": "Escribe /etc/apt/apt.conf.d/99-disable-translations para dejar de descargar índices de descripciones traducidas de paquetes y reducir los datos de las actualizaciones de apt.", + "category": "Ajustes básicos", "categorySlug": "basic-settings" }, { "tool": "Aumentar límites del sistema", "what": "Sube los inotify watches, los límites nofile/nproc, los límites del keyring del kernel y fs.file-max en sysctl.d, limits.d, pam y systemd — lo bastante altos para hosts con muchos contenedores.", - "category": "System", + "category": "Sistema", "categorySlug": "system" }, { - "tool": "Tuning de memoria", + "tool": "Ajuste de memoria", "what": "Establece vm.swappiness=10, dirty ratios balanceados, vm.max_map_count=262144 y compaction proactiveness cuando es soportado. La política de memory-overcommit del kernel se deja en el valor por defecto de Proxmox.", - "category": "System", + "category": "Sistema", "categorySlug": "system" }, { "tool": "Comportamiento ante kernel panic", "what": "Configura el host para reiniciar 10 segundos después de un panic / oops / hardlockup en lugar de quedarse congelado indefinidamente.", - "category": "System", + "category": "Sistema", "categorySlug": "system" }, { "tool": "Tuning del stack de red", "what": "Dimensionado de buffers TCP, hardening IPv4 (redirects off, rp_filter=2, martian log off), rango de puertos locales 1024-65535, TCP MTU probing, RFC 1337, más un helper en /usr/local/sbin/proxmenux-fwbr-tune conectado a una unit systemd oneshot y a una regla udev, de forma que rp_filter=0 / log_martians=0 se reapliquen a las interfaces fwbr*/fwln*/fwpr*/tap* cada vez que Proxmox las recrea al iniciar/parar VMs, en reinicios o en migraciones en vivo.", - "category": "Network", + "category": "Red", "categorySlug": "network" }, { "tool": "Customización de bashrc (root)", "what": "PS1 con colores, aliases comunes (l/la/ll/ls/grep), historial con marcas de tiempo y sourcing de bash-completion, todo dentro de un bloque PMX_CORE_BASHRC delimitado para que sea fácil de quitar.", - "category": "Customization", + "category": "Personalización", "categorySlug": "customization" }, { - "tool": "Log2RAM (consciente de SSD, automático)", + "tool": "Log2RAM (según el SSD, automático)", "what": "Reduce el desgaste del SSD/NVMe moviendo /var/log a una ramdisk tmpfs con sync periódico al disco. Se instala desde el proyecto oficial cuando el disco raíz es SSD o NVMe. Dimensiona la ramdisk según la RAM (128M / 256M / 512M), programa el sync periódico y un guardián de auto-sync que compacta al 80% y trunca los logs calientes al 92% antes de escribir. Ajusta los límites de journald para caber en la ramdisk. Detalle completo en Log2RAM.", - "category": "Storage", + "category": "Almacenamiento", "categorySlug": "storage" }, { "tool": "ZFS autotrim (solo SSD)", "what": "Activa zpool autotrim=on en cada pool ZFS cuyos vdevs sean todos SSD/NVMe con soporte TRIM (comprueba /sys/block/[dev]/queue/rotational y discard_granularity). Los pools respaldados por HDDs se saltan automáticamente. Solo los pools realmente cambiados por ProxMenux quedan registrados para el uninstall — los pools en los que activaste autotrim a mano se dejan en paz.", - "category": "Storage", + "category": "Almacenamiento", "categorySlug": "storage" }, { "tool": "Límites de tamaño de journald", - "what": "Fuerza almacenamiento persistente, capa SystemMaxUse=64M / RuntimeMaxUse=60M, activa compresión, logging a nivel info (requerido para el Monitor). Se salta automáticamente cuando Log2RAM está activo (hace su propio ajuste).", - "category": "System", + "what": "Fuerza almacenamiento persistente, limita SystemMaxUse=64M / RuntimeMaxUse=60M, activa compresión y registros de nivel info (necesarios para Monitor). Se omite cuando Log2RAM está activo, pues hace su propio ajuste.", + "category": "Sistema", "categorySlug": "system" }, { - "tool": "Tuning de logrotate", - "what": "Rotación diaria con tope de tamaño 10M, 7 rotaciones, compresión y copytruncate — amigable con Log2RAM.", - "category": "System", + "tool": "Ajuste de logrotate", + "what": "Configura globalmente daily y después size 10M, conserva 7 rotaciones y activa compresión y copytruncate. El criterio de tamaño posterior prevalece; las reglas particulares pueden cambiarlo. Adecuado para Log2RAM, pero la frecuencia depende de reglas y temporizador.", + "category": "Sistema", "categorySlug": "system" }, { "tool": "Nombres de interfaz persistentes", "what": "Escribe un /etc/systemd/network/10-proxmenux-<iface>.link por NIC física (cada uno comenzando con la cabecera 'Managed by ProxMenux') que fija el MAC al nombre actual, de forma que los nombres eth0 / enp… se mantengan estables tras reinicios y al añadir nuevas NICs.", - "category": "Network", + "category": "Red", "categorySlug": "network" } ], - "hardwareTitle": "Valores por defecto conscientes del hardware", + "hardwareTitle": "Valores predeterminados adaptados al hardware", "hardwareBody": "El script lee el hardware del host antes de aplicar los ajustes. Log2RAM solo se instala en discos raíz SSD / NVMe por defecto (pregunta si la detección dice lo contrario). El tamaño del ramdisk de Log2RAM se elige a partir de la RAM total (≤ 8 GB → 128M, ≤ 16 GB → 256M, '>' 16 GB → 512M). Los límites de journald se ajustan al tamaño del ramdisk cuando Log2RAM está activo, para no llenarlo.", "upgrade": { "heading": "Actualizar y hacer upgrade del sistema", @@ -118,9 +118,9 @@ "Desactiva enterprise pve-enterprise.sources / ceph.sources, elimina archivos de repos legacy, escribe una fuente limpia sin suscripción para el codename del host.", "Ejecuta el upgrade de forma no interactiva con DEBIAN_FRONTEND=noninteractive y --force-confdef --force-confold — los archivos de configuración que has customizado siguen siendo tuyos cuando upstream también ha cambiado.", "Instala paquetes esenciales de Proxmox si faltan (zfsutils-linux, proxmox-backup-restore-image, chrony).", - "Comprobación de cordura de metadatos LVM, apt-get autoremove -y + apt-get autoclean -y, y prompt de reinicio solo si el kernel realmente cambió." + "Comprobación de coherencia de metadatos LVM, apt-get autoremove -y + apt-get autoclean -y y solicitud de reinicio solo si cambió el núcleo." ], - "sameTitle": "Mismo updater, dos puntos de entrada", + "sameTitle": "Mismo actualizador, dos puntos de entrada", "sameBody": "El bundle Automatizado y la utilidad independiente Proxmox System Update comparten los mismos scripts subyacentes (update-pve8.sh / update-pve9_2.sh). Usa la utilidad por separado cuando solo quieras hacer upgrade del host sin aplicar el resto de las optimizaciones." }, "endResult": { @@ -142,18 +142,18 @@ "xshokBody": "Si el host ha ejecutado previamente el script xshok-proxmox, ProxMenux detecta el archivo marcador y te avisa antes de continuar. Algunos tweaks pueden solaparse. El script complementario está deprecado — si decides continuar de todos modos, revisa el resumen para contexto.", "revert": { "heading": "Revertir", - "body": "Cada herramienta de la tabla anterior se registra a sí misma en /usr/local/share/proxmenux/installed_tools.json. Abre Uninstall Optimizations para elegir items individuales que revertir. Los backups de los archivos de configuración modificados se dejan junto a los originales con sufijo .bak." + "body": "Cada herramienta de la tabla se registra en /usr/local/share/proxmenux/installed_tools.json. Abre Desinstalar optimizaciones para elegir los elementos que quieras revertir. Las copias de los archivos modificados se guardan junto a los originales con sufijo .bak." }, "related": { "heading": "Relacionado", "items": [ { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — elige exactamente qué quieres del mismo catálogo." }, { - "label": "Uninstall Optimizations", + "label": "Desinstalar optimizaciones", "href": "/docs/post-install/uninstall", "tail": " — revierte cualquier subconjunto de lo aplicado aquí." }, @@ -163,7 +163,7 @@ "tail": " — verifica los cambios (uptime, free, journalctl, etc.)." }, { - "label": "Resumen de Post-Install", + "label": "Resumen de post-instalación", "href": "/docs/post-install", "tail": "." } diff --git a/web/messages/es/docs/post-install/basic-settings.json b/web/messages/es/docs/post-install/basic-settings.json index 6c931685..a20194bd 100644 --- a/web/messages/es/docs/post-install/basic-settings.json +++ b/web/messages/es/docs/post-install/basic-settings.json @@ -1,11 +1,11 @@ { "meta": { - "title": "Post-instalación: Basic Settings | ProxMenux Documentation", + "title": "Post-instalación: Ajustes básicos | Documentación de ProxMenux", "description": "Opciones post-instalación fundamentales: cambiar a los repositorios sin suscripción de Proxmox y hacer upgrade, autodetectar la zona horaria y activar NTP, saltar la descarga de idiomas de APT, y elegir entre 25 utilidades de sistema comunes para instalar." }, "header": { - "title": "Post-instalación: Basic Settings", - "section": "Settings post-install Proxmox" + "title": "Post-instalación: Ajustes básicos", + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué cubre esta categoría", @@ -15,8 +15,8 @@ "heading": "Actualizar y hacer upgrade del sistema", "intro": "Reconfigura APT para usar el repositorio gratuito pve-no-subscription (en lugar del repo enterprise que requiere suscripción) y ejecuta un upgrade completo del sistema. Los pasos exactos dependen de la versión mayor de Proxmox VE: ProxMenux la detecta y despacha al script correcto.", "headerVersion": "Versión PVE", - "headerScript": "Script despachador", - "headerCodename": "Codename Debian", + "headerScript": "Script de selección por versión", + "headerCodename": "Nombre en clave de Debian", "rows": [ { "version": "9.x", @@ -31,7 +31,7 @@ ], "officialTitle": "La recomendación oficial de Proxmox", "officialBody": "La guía oficial de upgrade de Proxmox es ejecutar, exactamente en este orden:", - "officialOutro": "Esa única línea es todo lo que necesitas en cualquier release actual de Proxmox. El reto no es el comando en sí — es asegurarse de que los repositorios del host están sanos antes de ejecutarlo.", + "officialOutro": "Este es el comando habitual para actualizaciones dentro de la misma versión mayor de Proxmox VE. Comprueba los repositorios del host y revisa los cambios de paquetes propuestos antes de continuar. Cambiar de versión mayor requiere el procedimiento oficial de migración.", "doesTitle": "Qué hace la opción de ProxMenux — verificado contra el script", "doesIntro": "El update de ProxMenux envuelve los comandos apt exactos de arriba y añade una serie de pasos pre/post que tendrías que recordar tú a mano. Cada item de abajo es lo que el script despachador realmente hace (mira Proxmox System Update para el desglose completo):", "doesItems": [ @@ -39,37 +39,37 @@ "Repos Debian reescritos con main / updates / security, incluyendo non-free-firmware, para que la advertencia de firmware durante el upgrade desaparezca.", "Ejecuta el upgrade oficial. apt-get update seguido de apt full-upgrade -y (PVE 9) o apt dist-upgrade -y (PVE 8), ambos lanzados de forma no interactiva con --force-confdef --force-confold para que cualquier archivo de configuración que hayas customizado siga siendo tuyo.", "Instala paquetes esenciales si faltan: zfsutils-linux, proxmox-backup-restore-image, chrony.", - "Comprobación de cordura de metadatos LVM. Busca VMs con passthrough de disco que puedan haber garabateado cabeceras stale de physical-volume sobre discos en bruto; avisa si hay algo raro (no hay fix automático).", + "Comprueba los metadatos LVM. Busca VM con passthrough de disco que puedan haber dejado cabeceras antiguas de volúmenes físicos en discos en bruto; avisa si detecta anomalías, sin corregirlas automáticamente.", "Limpia al final: apt-get autoremove -y + apt-get autoclean -y, y luego pregunta por un reinicio si el kernel fue actualizado o si está presente /var/run/reboot-required." ], "shortTitle": "En resumen", "shortBody": "La opción ejecuta el exacto apt update && apt full-upgrade -y que Proxmox recomienda, lo envuelve con la limpieza de repos y la limpieza post-upgrade que la guía oficial también te dice que hagas, y pregunta por el reinicio al final. Mira Proxmox System Update — el mismo updater también está disponible como utilidad independiente en el menú principal, con el diagrama completo del proceso.", "subTitle": "No apliques esto a un host con suscripción", - "subBody": "Si tienes una suscripción de Proxmox y quieres seguir usando los repositorios enterprise, omite esta opción. Al ejecutarla se desactiva el repositorio enterprise y el host pasa al canal comunitario. La actualización de paquetes y la reescritura de repositorios no se presentan como reversibles en Uninstall Optimizations; restaura deliberadamente la configuración de repositorios si más adelante necesitas cambiar de canal.", + "subBody": "Si tienes una suscripción de Proxmox y quieres mantener los repositorios Enterprise, omite esta opción. Al ejecutarla, el host pasa al canal comunitario. La actualización de paquetes y la reescritura de repositorios no se pueden revertir desde Desinstalar optimizaciones; si quieres cambiar de canal después, debes configurar los repositorios expresamente.", "safetyTitle": "Comprobación de seguridad post-update", - "safetyBody": "Tras el upgrade, el script comprueba si hay discos con metadatos PV (Physical Volume) obsoletos — un caso límite que puede pasar cuando una VM con passthrough de disco garabatea cabeceras LVM sobre un disco en bruto. Si encuentra algo sospechoso verás un aviso sugiriendo pvs para inspeccionarlo. No se toma ninguna acción automáticamente." + "safetyBody": "Tras actualizar, el script busca discos con metadatos antiguos de volúmenes físicos (PV). Puede ocurrir si una VM con passthrough de disco escribe cabeceras LVM en un disco en bruto. Si encuentra algo sospechoso, avisa y sugiere inspeccionarlo con pvs. No modifica nada automáticamente." }, "time": { "heading": "Sincronizar la hora automáticamente", "intro": "Detecta la IP pública del servidor vía dig myip.opendns.com @resolver1.opendns.com, luego consulta ipapi.co/'{'ip'}'/timezone para buscar la zona horaria IANA correspondiente, y la aplica con timedatectl set-timezone. Finalmente activa NTP con timedatectl set-ntp true.", "depTitle": "Depende de dos servicios externos", "depBody": "El lookup depende de que OpenDNS e ipapi.co sean accesibles, y de que sus respuestas sean correctas. Si ejecutas Proxmox detrás de una VPN o en una VLAN que sale por una región distinta, la zona horaria autodetectada puede ser incorrecta. En ese caso sáltate esta opción y configura la zona horaria a mano:", - "revertTitle": "Reversible desde el menú Uninstall", - "revertBody": "Uninstall Optimizations resetea la zona horaria a UTC (un valor por defecto seguro). No desactiva NTP — tu reloj sigue sincronizándose, solo anclado a UTC hasta que pongas una nueva zona horaria manualmente." + "revertTitle": "Reversible desde el menú Desinstalar", + "revertBody": "Desinstalar optimizaciones restablece la zona horaria a UTC, un valor predeterminado seguro. No desactiva NTP: el reloj sigue sincronizándose y muestra UTC hasta que configures otra zona manualmente." }, "languages": { "heading": "Saltar la descarga de idiomas adicionales", - "intro": "En cada apt update, Debian por defecto descarga archivos de traducción para cada locale que distribuye — mucho tráfico y espacio en disco para algo que rara vez verás. Esta opción le dice a APT que solo descargue los metadatos principales. Antes de desactivarlo, ProxMenux se asegura de que el propio locale del host está realmente generado (lee /etc/default/locale o /etc/environment, lo añade a /etc/locale.gen si falta, y ejecuta locale-gen). Así no pierdes tu locale de shell como efecto colateral.", + "intro": "Durante apt update, APT puede descargar descripciones de paquetes traducidas además de los metadatos principales. Esta opción desactiva esas traducciones para ahorrar ancho de banda y disco. Antes, ProxMenux comprueba que la configuración regional del host está generada: lee /etc/default/locale o /etc/environment, la añade a /etc/locale.gen si falta y ejecuta locale-gen. Así se conserva la configuración regional de la shell.", "writtenTitle": "Qué se escribe", - "revertTitle": "Reversible desde el menú Uninstall", + "revertTitle": "Reversible desde el menú Desinstalar", "revertBody": "Borrar /etc/apt/apt.conf.d/99-disable-translations (manualmente o desde el menú Uninstall) restaura el comportamiento por defecto y APT vuelve a descargar los archivos de idioma." }, "utilities": { "heading": "Instalar utilidades de sistema comunes", - "intro": "Abre un checklist con 25 utilidades curadas organizadas en grupos. Elige las que quieras, confirma, y ProxMenux instala cada una vía apt, verificando que el paquete funcionó y mostrando un resumen al final.", - "imageAlt": "Diálogo de checklist mostrando la lista de utilidades de sistema de ProxMenux con espacio para seleccionar y enter para confirmar", + "intro": "Abre una lista con 25 utilidades seleccionadas organizadas en grupos. Elige las que quieras y confirma; ProxMenux las instala mediante apt, comprueba el resultado y muestra un resumen final.", + "imageAlt": "Diálogo de selección de utilidades de ProxMenux: Espacio selecciona y Entrar confirma", "reuseTitle": "La misma lista se reutiliza en otro sitio", - "reuseBody": "El catálogo de 25 utilidades vive en una única fuente de verdad (PROXMENUX_UTILS en scripts/global/utils-install-functions.sh). El menú Utilities and Tools → System Utilities del menú principal de ProxMenux expone la misma lista, así que puedes volver más tarde e instalar más sin volver a ejecutar la post-instalación.", + "reuseBody": "El catálogo de 25 utilidades tiene una única definición: PROXMENUX_UTILS en scripts/global/utils-install-functions.sh. El menú Utilidades y herramientas → Utilidades del sistema ofrece la misma lista para instalar más adelante sin repetir la post-instalación.", "listTitle": "Qué hay en la lista", "groups": [ { @@ -177,7 +177,7 @@ }, { "pkg": "tmux", - "desc": "Multiplexador de terminal — sesiones que se separan, paneles divididos, sobrevive a desconexiones" + "desc": "Multiplexador de terminal: separa sesiones, divide paneles y mantiene las sesiones tras desconectarte" } ] }, @@ -210,18 +210,18 @@ ], "actionTitle": "Algunas de ellas en acción", "noBulkTitle": "Solo se eliminan las utilidades instaladas por ProxMenux", - "noBulkBody": "ProxMenux registra únicamente los paquetes seleccionados que no estaban instalados antes de esta acción. Uninstall Optimizations puede purgar después esos paquetes, mientras que las utilidades que ya existían en el host permanecen intactas. La actualización general mediante APT no se registra como reversible porque los paquetes actualizados no disponen de una restauración atómica segura." + "noBulkBody": "ProxMenux registra únicamente los paquetes seleccionados que no estaban ya instalados. Al ejecutar Desinstalar optimizaciones, purga esos paquetes y conserva los que ya tenías. Las actualizaciones de APT no tienen una reversión atómica segura: desinstalar utilidades no deshace la actualización del sistema." }, "related": { "heading": "Relacionado", "items": [ { - "label": "Proxmox System Update", + "label": "Actualización del sistema Proxmox", "href": "/docs/utils/system-update", "tail": " — vuelve a ejecutar el ciclo apt update + dist-upgrade bajo demanda." }, { - "label": "System Utilities Installer", + "label": "Instalador de utilidades del sistema", "href": "/docs/utils/system-utils", "tail": " — instala (o reinstala) utilidades individualmente tras la post-instalación." }, @@ -231,7 +231,7 @@ "tail": " — referencia de apt." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/es/docs/post-install/customizable.json b/web/messages/es/docs/post-install/customizable.json index 602cdd31..6139064a 100644 --- a/web/messages/es/docs/post-install/customizable.json +++ b/web/messages/es/docs/post-install/customizable.json @@ -1,103 +1,103 @@ { "meta": { - "title": "Script Personalizable post-instalación | ProxMenux Documentation", + "title": "Script post-instalación personalizable | Documentación de ProxMenux", "description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE con ProxMenux. 10 categorías, ~35 herramientas individuales, UI de selección. Incluye todo lo que hace el script Automatizado, más funcionalidades opcionales (IOMMU, Fastfetch, Figurine, Ceph, HA, ajustes de AMD…).", - "ogTitle": "Script Personalizable post-instalación | ProxMenux Documentation", + "ogTitle": "Script post-instalación personalizable | Documentación de ProxMenux", "ogDescription": "10 categorías, ~35 optimizaciones individuales. Elige exactamente qué quieres en un host Proxmox VE. Los cambios reversibles quedan registrados." }, "header": { "title": "Script Personalizable post-instalación", - "description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE. ProxMenux agrupa ~35 herramientas individuales en 10 categorías, cada una con su propio diálogo de selección. Mismo motor que el Automatizado, pero con control total sobre qué se aplica.", - "section": "Post-Install · Customizable" + "description": "Elige exactamente qué optimizaciones aplicar a un host Proxmox VE. ProxMenux agrupa unas 35 herramientas en 10 categorías dentro de un único diálogo de selección. Usa el mismo motor que Automatizado, con control total sobre lo que se aplica.", + "section": "Post-instalación · Personalizable" }, "intro": { "title": "Cuándo elegir Personalizable", - "body": "Elige esta ruta cuando ya sabes qué ajustes quieres en el host — o cuáles definitivamente no quieres. El script presenta una selección por categoría para que puedas combinar optimizaciones. Las opciones se pueden volver a aplicar y los cambios de configuración reversibles quedan registrados para Uninstall Optimizations. Las actualizaciones de paquetes no se presentan como reversibles." + "body": "Elige esta opción si ya sabes qué ajustes quieres en el host o cuáles no quieres. El script muestra una lista con casillas agrupada por categorías para seleccionar, desmarcar y combinar optimizaciones. Puedes volver a aplicarlas después; los cambios reversibles se registran para Desinstalar optimizaciones. Las actualizaciones de paquetes no se presentan como reversibles." }, "compare": { "heading": "Comparación con el Automatizado", - "body": "Personalizable es un superset del script Automatizado. Cubre las mismas 14 optimizaciones de baseline más una larga lista de opt-ins que el Automatizado se salta a propósito — cosas que solo son útiles en hardware específico (fixes de AMD), hosting específico (OVH RTM), o cargas específicas (IOMMU/VFIO, repo de Ceph, High Availability, Fastfetch, Figurine, tuning del ARC de ZFS, pigz, ZFS auto-snapshot, límites de velocidad de vzdump, Open vSwitch, TCP BBR + TCP Fast Open, refresco del índice del PVE Appliance Manager…)." + "body": "Personalizable incluye todo el script Automatizado. Cubre las mismas 14 optimizaciones básicas y una larga lista de opciones que Automatizado omite deliberadamente, útiles para hardware específico (correcciones AMD), alojamiento específico (OVH RTM) o cargas concretas (IOMMU/VFIO, repositorio Ceph, alta disponibilidad, Fastfetch, Figurine, ajuste del ARC de ZFS, pigz, instantáneas automáticas ZFS, límites de velocidad vzdump, Open vSwitch, TCP BBR…)." }, "categoriesSection": { "heading": "Las 10 categorías", - "body": "El script Personalizable agrupa optimizaciones en 10 categorías. Cada categoría tiene su propio diálogo de selección y su propia página de documentación — abre una de las tarjetas para consultar el razonamiento, los valores predeterminados y los pasos de verificación." + "body": "El script Personalizable agrupa las optimizaciones en 10 categorías dentro de un único diálogo de selección. Cada categoría tiene su propia página de documentación; abre una tarjeta para consultar la justificación, los valores predeterminados y la verificación de cada opción." }, "categories": [ { - "name": "Basic Settings", + "name": "Ajustes básicos", "description": "Sanea las fuentes APT, ejecuta el upgrade oficial de Proxmox y fija zona horaria, locale y utilidades básicas. Es la base sobre la que apoyan todas las demás categorías." }, { - "name": "System", + "name": "Sistema", "description": "Ajusta el subsistema de logs y los límites del kernel para un host que aloja muchas VMs y contenedores. Cubre journald, logrotate, sysctl (memoria, límites de ficheros), comportamiento en panic y reinicios rápidos." }, { - "name": "Virtualization", - "description": "Prepara el host para virtualización avanzada. Auto-instala el guest agent en las plantillas y activa IOMMU/VFIO para passthrough de dispositivos PCI (GPU, controladoras, TPU)." + "name": "Virtualización", + "description": "Prepara el host para virtualización avanzada. Instala el agente invitado correspondiente si el propio Proxmox se ejecuta dentro de una VM compatible y activa IOMMU/VFIO para el passthrough PCI de GPU, controladoras y TPU." }, { - "name": "Network", + "name": "Red", "description": "Endurece y afina la pila de red del host. Fuerza APT sobre IPv4, aplica sysctl con hardening y tuning de buffers TCP, ofrece Open vSwitch, TCP BBR + TCP Fast Open, y fija nombres persistentes de interfaces por MAC." }, { - "name": "Storage", + "name": "Almacenamiento", "description": "Configura los subsistemas de almacenamiento habituales de Proxmox: ARC de ZFS, auto-snapshots, ZFS autotrim para pools SSD/NVMe y límites de velocidad de vzdump para evitar saturar el disco durante backups." }, { - "name": "Security", + "name": "Seguridad", "description": "Reduce la superficie de ataque expuesta por defecto. Desactiva los servicios RPC (portmapper/rpcbind) que Proxmox no necesita pero deja escuchando." }, { - "name": "Customization", + "name": "Personalización", "description": "Cambia la experiencia visual y de shell del host: colores y aliases en bashrc, banner MOTD y eliminación del aviso de suscripción del web UI." }, { - "name": "Monitoring", - "description": "Integra el host con Real-Time Monitoring de OVH. Sólo aparece cuando ProxMenux detecta un servidor OVH." + "name": "Monitorización", + "description": "Integra el host con OVH Real-Time Monitoring. Solo instala RTM cuando ProxMenux detecta un servidor OVH; en otros hosts no hace cambios." }, { - "name": "Performance", + "name": "Rendimiento", "description": "Acelera las operaciones de compresión (backups, transferencias) sustituyendo gzip por su versión paralela pigz." }, { - "name": "Optional", + "name": "Opcional", "description": "Opciones que no necesita todo host: ajustes de CPU AMD, banner Fastfetch, nombre 3D con Figurine, actualización del índice de PVE Appliance Manager, repositorio Ceph, servicios de alta disponibilidad, Log2RAM para reducir el desgaste del SSD y un perfil de swap con ZRAM." } ], "mixTip": { "title": "Mezcla Automatizado y Personalizable", - "body": "Un patrón común: ejecutar primero Automatizado para fijar el baseline sensato, luego abrir Personalizable y elegir solo las herramientas opt-in que te interesan (por ejemplo, IOMMU en un host que va a hacer passthrough de GPU). Los cambios se registran de forma independiente; el menú Uninstall muestra todo lo que has aplicado independientemente de qué ruta lo añadió." + "body": "Un uso habitual: ejecuta primero Automatizado para aplicar una base sensata, abre después Personalizable y elige solo las herramientas opcionales que necesitas, como IOMMU para passthrough de GPU. Los cambios se registran por separado; Desinstalar muestra lo aplicado con independencia de la opción que lo añadió." }, "related": { "heading": "Relacionado", "items": [ { - "label": "Automated Post-Install", + "label": "Post-instalación automatizada", "href": "/docs/post-install/automated", "tail": " — valores por defecto sensatos aplicados sin preguntas." }, { - "label": "Uninstall Optimizations", + "label": "Desinstalar optimizaciones", "href": "/docs/post-install/uninstall", "tail": " — revierte cualquier selección de forma limpia." }, { - "label": "Basic Settings", + "label": "Ajustes básicos", "href": "/docs/post-install/basic-settings", "tail": " — repos, hora, idioma, utilidades." }, { - "label": "Virtualization", + "label": "Virtualización", "href": "/docs/post-install/virtualization", "tail": " — IOMMU + VFIO para passthrough." }, { - "label": "Security", + "label": "Seguridad", "href": "/docs/post-install/security", - "tailRich": " · Storage · Network · Customization — otras categorías." + "tailRich": " · Almacenamiento · Red · Personalización — otras categorías." }, { - "label": "Resumen de Post-Install", + "label": "Resumen de post-instalación", "href": "/docs/post-install", "tail": "." } diff --git a/web/messages/es/docs/post-install/customization.json b/web/messages/es/docs/post-install/customization.json index 8bf427b7..cfb54007 100644 --- a/web/messages/es/docs/post-install/customization.json +++ b/web/messages/es/docs/post-install/customization.json @@ -1,24 +1,24 @@ { "meta": { - "title": "Post-instalación: Customización | ProxMenux Documentation", - "description": "Opciones de customización en el script post-instalación Customizable de ProxMenux: un prompt de bash con colores y aliases útiles, un banner de ProxMenux en el MOTD, y la opción de eliminar el aviso de suscripción de Proxmox de la interfaz web." + "title": "Post-instalación: Personalización | Documentación de ProxMenux", + "description": "Opciones de personalización en el script post-instalación Personalizable de ProxMenux: un prompt de bash con colores y alias útiles, un banner de ProxMenux en el MOTD y la opción de eliminar el aviso de suscripción de la interfaz web de Proxmox." }, "header": { - "title": "Post-instalación: Customización", - "description": "Ajustes estéticos y de comodidad para el host Proxmox. Hacen más agradable el uso de la consola y ocultan el aviso de suscripción de la interfaz web. Bashrc, MOTD y el banner de suscripción quedan registrados y son reversibles desde el menú Uninstall.", - "section": "Settings post-install Proxmox" + "title": "Post-instalación: Personalización", + "description": "Ajustes estéticos y de comodidad para el host Proxmox. Mejoran el uso de la shell y ocultan el aviso de suscripción de la interfaz web. Bashrc, MOTD y el banner de suscripción se registran y se pueden revertir desde Desinstalar.", + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué cubre esta categoría", "body": "Tres opciones pequeñas e independientes: un prompt de bash con colores + aliases para la shell de root, un banner MOTD de una línea visible al hacer login por SSH, y la eliminación del popup \"No valid subscription\" que Proxmox muestra en cada login a la UI web." }, "bashrc": { - "heading": "Customizar bashrc", + "heading": "Personalizar bashrc", "intro": "Inyecta un bloque curado en /root/.bashrc con un prompt con colores, historial con marcas de tiempo, aliases estándar de ls / grep y un source para autocompletado de bash. Hace que trabajar sobre SSH sea bastante más agradable y deja claro en qué host estás cuando tienes muchas pestañas abiertas.", "writesTitle": "Qué añade ProxMenux a .bashrc", "writesOutro": "El bloque está delimitado por los marcadores PMX_CORE_BASHRC. Ejecutar el script de nuevo reemplaza el bloque anterior en lugar de duplicarlo. El .bashrc original se respalda una vez en /root/.bashrc.bak, y se añade una línea source /root/.bashrc a /root/.bash_profile para que el prompt también se aplique en shells de login (p. ej. tras su -).", "rootTitle": "Solo se aplica a root", - "rootBody": "La customización apunta a la shell de la cuenta root. Otros usuarios que crees en el host conservan sus propios valores por defecto. Si administras Proxmox exclusivamente por la UI web y nunca usas la shell, esta opción es pura estética y puedes saltártela." + "rootBody": "La personalización afecta a la shell de la cuenta root. Otros usuarios del host conservan sus propios valores predeterminados. Si administras Proxmox exclusivamente desde la interfaz web y nunca usas la shell, puedes omitir esta opción estética." }, "motd": { "heading": "Configurar banner MOTD personalizado", @@ -29,43 +29,43 @@ "banner": { "heading": "Eliminar banner de suscripción", "intro": "Elimina el modal \"You do not have a valid subscription for this server\" que aparece cada vez que alguien entra en la UI web de Proxmox sin una suscripción enterprise. El parche es consciente de la versión: las distintas versiones mayores de Proxmox tienen distintos bundles de UI, así que ProxMenux despacha al script correcto.", - "versionTitle": "Despacho consciente de la versión", + "versionTitle": "Selección de script según la versión", "versionItems": [ "PVE 9.x → ejecuta remove-banner-pve-v3.sh (parchea tanto el proxmoxlib.js de escritorio como la nueva UI móvil basada en Yew).", "PVE 8.x → ejecuta remove-banner-pve8.sh (solo escritorio)." ], "versionOutro": "Antes de parchear, ProxMenux respalda los archivos JS/template originales en /usr/local/share/proxmenux/backups/ con una marca de tiempo. El flujo Uninstall usa esos backups para restaurar los archivos originales, y como fallback reinstala los paquetes de la UI de Proxmox si el backup falta o está corrupto.", "breakTitle": "Puede romperse tras actualizaciones de Proxmox", - "breakBody": "Proxmox publica regularmente actualizaciones de UI que sobrescriben proxmoxlib.js. Cuando eso pasa, el banner vuelve. Puedes reaplicar esta opción tras cada actualización de Proxmox para volver a parchear el archivo, o simplemente aceptar el aviso hasta que la vuelvas a aplicar. ProxMenux también instala un hook APT que vuelve a parchear automáticamente en los upgrades de paquetes — mira Uninstall Optimizations para ver cómo se revierte ese hook.", + "breakBody": "Las actualizaciones de la interfaz de Proxmox pueden sobrescribir proxmoxlib.js y hacer que vuelva el aviso. Puedes volver a aplicar esta opción para parchearlo o mantener el aviso hasta entonces. ProxMenux también instala un hook de APT para volver a parchear tras las actualizaciones de paquetes; consulta Desinstalar optimizaciones para saber cómo se elimina.", "legalTitle": "Nota legal (siempre conviene repetirla)", - "legalBody": "Esta opción solo oculta el aviso de la UI. No te concede soporte enterprise, acceso al repositorio enterprise, ni derecho alguno a distribuir Proxmox comercialmente sin suscripción. Si ejecutas Proxmox en un entorno que genera ingresos, compra una suscripción — apoya al proyecto y te da el canal enterprise estable." + "legalBody": "Esta opción solo oculta el aviso de la interfaz. No concede soporte Enterprise ni acceso al repositorio Enterprise, y no cambia la licencia del software. Proxmox VE se distribuye bajo GNU AGPLv3. Una suscripción apoya el proyecto y da acceso al canal de actualizaciones Enterprise; elige el nivel de soporte adecuado para tu entorno." }, "verify": { "heading": "Verificación", "intro": "Tras aplicar los tres:", "reversibleTitle": "Los tres cambios de personalización quedan registrados", - "reversibleBody": "Uninstall Optimizations restaura /root/.bashrc, devuelve MOTD exactamente al contenido anterior a ProxMenux (o elimina el archivo si antes no existía) y restaura los archivos parcheados de la interfaz desde sus copias o reinstala los paquetes de Proxmox afectados cuando sea necesario." + "reversibleBody": "Desinstalar optimizaciones restaura /root/.bashrc, devuelve MOTD al contenido exacto anterior a ProxMenux o elimina el archivo si antes no existía, y restaura los archivos de interfaz parcheados desde sus copias o reinstala los paquetes afectados cuando sea necesario." }, "related": { "heading": "Relacionado", "items": [ { - "label": "Optional", + "label": "Opcional", "href": "/docs/post-install/optional", - "tail": " — Fastfetch y Figurine (otras customizaciones visuales)." + "tail": " — Fastfetch y Figurine, otras personalizaciones visuales." }, { "label": "Mostrar información de versión", "href": "/docs/settings/show-version-information", - "tail": " — confirma que las customizaciones están registradas como instaladas." + "tail": " — confirma que las personalizaciones están registradas como instaladas." }, { - "label": "Uninstall Optimizations", + "label": "Desinstalar optimizaciones", "href": "/docs/post-install/uninstall", "tail": " — revierte bashrc, motd, aviso de suscripción." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/es/docs/post-install/index.json b/web/messages/es/docs/post-install/index.json index 05bd570f..21df0700 100644 --- a/web/messages/es/docs/post-install/index.json +++ b/web/messages/es/docs/post-install/index.json @@ -1,7 +1,7 @@ { "meta": { "title": "Script post-instalación de Proxmox VE — Automatizado y personalizable | ProxMenux", - "description": "Resumen de los scripts post-instalación de ProxMenux para Proxmox VE. Ejecuta el script Automatizado para aplicar valores recomendados sin preguntas, usa Personalizable para elegir entre 10 categorías o restaura los cambios reversibles compatibles mediante Uninstall Optimizations.", + "description": "Resumen de los scripts post-instalación de ProxMenux para Proxmox VE. Ejecuta el script Automatizado para aplicar valores recomendados sin preguntas, usa Personalizable para elegir exactamente lo que quieres entre 10 categorías o restaura los cambios reversibles compatibles mediante Desinstalar optimizaciones.", "ogTitle": "Script post-instalación de Proxmox VE — Automatizado y personalizable", "ogDescription": "Aplica optimizaciones comunes post-instalación de Proxmox VE en 10 categorías — automatizadas o a la carta, con opciones reversibles.", "twitterTitle": "Script post-instalación de Proxmox VE | ProxMenux", @@ -10,7 +10,7 @@ "header": { "title": "Scripts post-instalación", "description": "Configura un host de Proxmox VE recién instalado con las optimizaciones post-instalación de ProxMenux. Aplica la configuración base automáticamente, elige opciones individuales, actualiza funciones instaladas o restaura cambios reversibles compatibles. Las actualizaciones de paquetes no se presentan como reversibles.", - "section": "Settings post-install Proxmox" + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Para qué sirve este menú", @@ -18,8 +18,8 @@ }, "openingMenu": { "heading": "Abrir el menú", - "body": "Desde el menú principal de ProxMenux, selecciona Settings post-install Proxmox. Verás esto:", - "imageAlt": "Menú de scripts post-instalación — Automatizado, Personalizable, la entrada condicional Aplicar Actualizaciones Disponibles (solo cuando hay updates pendientes) y Uninstall, seguidos de la sección Community Scripts" + "body": "Desde el menú principal de ProxMenux, selecciona Configuración post instalación de Proxmox. Verás esto:", + "imageAlt": "Menú de scripts post-instalación: Automatizado, Personalizable, la entrada condicional Aplicar actualizaciones disponibles (solo cuando hay actualizaciones pendientes) y Desinstalar, seguidos de la sección Scripts de la comunidad" }, "threeWays": { "heading": "Cuatro formas de aplicar optimizaciones", @@ -34,29 +34,29 @@ "Tuning de memoria, kernel y red", "Log2RAM (autodetectado en SSD/NVMe)", "Límites de tamaño de journald + logrotate", - "Nombres de interfaz persistentes" + "Nombres persistentes de interfaz" ] }, { "title": "Personalizable", "description": "~35 optimizaciones individuales en 10 categorías. Eliges exactamente cuáles aplicar. Mismo motor que el Automatizado, pero con control total.", "bullets": [ - "UI de checklist por categoría", - "Incluye todo lo que hace el Automatizado, más opciones opt-in (IOMMU, Fastfetch, Figurine, Ceph, HA, fixes de AMD…)", + "Interfaz con casillas de selección por categoría", + "Incluye todo lo que hace Automatizado, más opciones que debes activar expresamente (IOMMU, Fastfetch, Figurine, Ceph, HA, correcciones de AMD…)", "Ejecuta tantas veces como quieras — los cambios son idempotentes" ] }, { - "title": "Apply Available Updates", - "description": "Cuando una optimización post-instalación (Log2Ram, Memory Settings, Logrotate…) tiene en disco una versión más nueva que la registrada en el host, esta entrada muestra solo las que se han movido. Re-ejecuta la función correspondiente y refresca el registro — no toca nada más.", + "title": "Aplicar actualizaciones disponibles", + "description": "Cuando una optimización post-instalación (Log2Ram, ajustes de memoria, Logrotate…) tiene en disco una versión más nueva que la registrada en el host, esta entrada muestra solo las optimizaciones que han cambiado. Vuelve a ejecutar la función correspondiente y actualiza el registro, sin tocar nada más.", "bullets": [ - "Opt-in por optimización (solo lo que ha cambiado)", + "Aceptación individual por optimización (solo lo que ha cambiado)", "Mismo selector disponible desde el panel del Monitor", "Una única notificación agrupada cuando llegan actualizaciones nuevas" ] }, { - "title": "Uninstall Optimizations", + "title": "Desinstalar optimizaciones", "description": "Los cambios reversibles compatibles quedan registrados en un JSON y asociados a una función de restauración. Las acciones sin reversión segura, como una actualización completa de paquetes, se excluyen deliberadamente.", "bullets": [ "Detecta automáticamente las optimizaciones aplicadas previamente", @@ -66,7 +66,7 @@ } ], "whichTitle": "¿Cuál deberías elegir?", - "whichBody": "Si es una instalación recién hecha de Proxmox y quieres el baseline sensato sin tener que decidir: Automatizado. Si ya sabes qué tweaks quieres (o cuáles definitivamente no quieres): Personalizable. Si algo que ya aplicaste tiene una versión más nueva en disco y solo quieres subir esa: Apply Available Updates. Si aplicaste algo antes y quieres revertirlo de forma limpia: Uninstall Optimizations. Puedes mezclarlas — aplicar primero Automatizado, luego abrir Personalizable para añadir opt-ins como Fastfetch o IOMMU, y revertir cualquier item individual más tarde.", + "whichBody": "Si acabas de instalar Proxmox y quieres una base sensata sin tomar decisiones: Automatizado. Si ya sabes qué ajustes quieres o cuáles no quieres: Personalizable. Si una optimización aplicada tiene una versión más nueva en disco y solo quieres actualizar esa: Aplicar actualizaciones disponibles. Para revertir algo aplicado anteriormente: Desinstalar optimizaciones. Puedes combinarlos: aplica primero Automatizado, abre después Personalizable para añadir opciones como Fastfetch o IOMMU y revierte cualquier elemento individual más adelante.", "mixing": { "heading": "Mezclar con otros scripts post-instalación", "stackTitle": "No apiles varios scripts post-instalación", @@ -75,14 +75,14 @@ "xshokBody": "Versiones anteriores de ProxMenux referenciaban xshok-proxmox como herramienta post-instalación complementaria. Ese proyecto ahora está deprecado y ya no se ofrece desde ProxMenux. Si una ejecución anterior de xshok-proxmox dejó marcadores en el host, ProxMenux todavía los detecta y te avisa — pero no es algo que debas instalar junto a ProxMenux hoy." }, "community": { - "heading": "Community scripts", - "body": "El menú también expone dos scripts de terceros del proyecto community-scripts: Proxmox VE Post Install y Proxmox VE Microcode. Son wrappers que hacen wget | bash de los scripts de los autores originales. No los mantiene ProxMenux. Mira External Repositories para detalles y consideraciones de confianza antes de ejecutarlos." + "heading": "Scripts de la comunidad", + "body": "El menú también ofrece dos scripts de terceros del proyecto community-scripts: Proxmox VE Post Install y Proxmox VE Microcode. Son envoltorios que descargan y ejecutan los scripts originales mediante wget | bash. ProxMenux no los mantiene. Consulta Repositorios externos para conocer los detalles y valorar la confianza antes de ejecutarlos." }, "related": { "heading": "Relacionado", "items": [ { - "label": "Proxmox System Update", + "label": "Actualización del sistema Proxmox", "href": "/docs/utils/system-update", "tail": " — mantiene el host actualizado una vez ya se ha hecho la post-instalación." }, diff --git a/web/messages/es/docs/post-install/monitoring.json b/web/messages/es/docs/post-install/monitoring.json index eee9ef79..f3f892a6 100644 --- a/web/messages/es/docs/post-install/monitoring.json +++ b/web/messages/es/docs/post-install/monitoring.json @@ -1,12 +1,12 @@ { "meta": { - "title": "Post-instalación: Monitorización | ProxMenux Documentation", - "description": "Opciones de monitorización en el script post-instalación Customizable de ProxMenux. Por ahora una sola opción: instalar OVH Real-Time Monitoring (RTM), que solo se activa si se detecta que el host es un servidor OVH." + "title": "Post-instalación: Monitorización | Documentación de ProxMenux", + "description": "Opciones de monitorización en el script post-instalación Personalizable de ProxMenux. Por ahora una sola opción: instalar OVH Real-Time Monitoring (RTM), que solo se activa si se detecta que el host es un servidor OVH." }, "header": { "title": "Post-instalación: Monitorización", - "description": "Opciones de monitorización dentro del script post-instalación Customizable. Esta categoría es pequeña y específica del proveedor — instala el agente OVH Real-Time Monitoring en servidores dedicados de OVH y no hace nada en cualquier otro sitio.", - "section": "Settings post-install Proxmox" + "description": "Opciones de monitorización del script post-instalación Personalizable. Esta categoría es pequeña y específica del proveedor: instala el agente OVH Real-Time Monitoring en servidores dedicados de OVH y no hace nada en otros servidores.", + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Alcance estrecho a propósito", @@ -23,15 +23,15 @@ "Si el resultado no menciona OVH, no se instala nada. La opción es un no-op." ], "remoteTitle": "Script remoto pasado por tubería a bash", - "remoteBody": "La instalación ejecuta wget -qO - https://…apply.sh | bash. Si el mirror de OVH se ve comprometido alguna vez, el script se ejecuta como root en tu host. Antes de activar esta opción, decide si confías más en la cadena de mirrors de OVH que en la monitorización que ganas. Para la mayoría de usuarios de home-lab o no-OVH esta opción debería quedarse simplemente apagada.", + "remoteBody": "La instalación ejecuta wget -qO - https://…apply.sh | bash. Si el servidor espejo de OVH se ve comprometido, el script se ejecutará como root en tu host. Antes de activar esta opción, valora la confianza en la cadena de servidores espejo de OVH frente al beneficio de monitorización. Para la mayoría de usuarios de laboratorios domésticos o servidores ajenos a OVH, la opción debe permanecer desactivada.", "noOpTitle": "Actívalo solo si el host está realmente en OVH", - "noOpBody": "La opción es un no-op en servidores no-OVH, así que marcarla en un Proxmox de home-lab no rompe nada. En un host no-OVH el script imprime \"Not an OVH server, skipping RTM installation\" y termina limpiamente; no se instala ningún paquete.", + "noOpBody": "La opción no hace cambios en servidores ajenos a OVH, así que marcarla en un Proxmox doméstico no rompe nada. El script muestra «No es un servidor OVH, se omite la instalación de RTM» y termina sin instalar paquetes.", "runsTitle": "Qué ejecuta ProxMenux", "verifyTitle": "Verificación", "verifyBody": "En un host OVH real, tras un reinicio deberías ver el panel de RTM en tu OVH Manager con datos en vivo del host. En el lado de Proxmox, el colector RTM es un servicio systemd — compruébalo directamente:", "troubleTitle": "Solución de problemas", - "revertTitle": "No reversible desde el menú Uninstall", - "revertBody": "No hay una entrada de uninstall dedicada para RTM. En un host OVH real, elimina los paquetes a mano con apt purge ovh-* y borra cualquier manifest puppet bajo /etc/puppet/ que RTM haya instalado. En un host no-OVH no se instaló nada, así que no hay nada que revertir." + "revertTitle": "Eliminar RTM desde el menú Desinstalar", + "revertBody": "Cuando RTM está registrado como instalado, Desinstalar optimizaciones ofrece una entrada OVH Real-Time Monitoring. Ejecuta apt-get purge -y ''ovh-rtm*'' ''rtm'' ''rtm-*'', elimina /etc/rtm y marca RTM como desinstalado. Los restos de Puppet pueden requerir limpieza manual; revisa los manifiestos específicos de RTM en /etc/puppet/. En un host ajeno a OVH no se instalaron paquetes RTM, así que no hay nada que eliminar." }, "related": { "heading": "Relacionado", @@ -47,7 +47,7 @@ "tail": " — referencia de monitorización del host local." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/es/docs/post-install/network.json b/web/messages/es/docs/post-install/network.json index 9e7c1664..023f89bd 100644 --- a/web/messages/es/docs/post-install/network.json +++ b/web/messages/es/docs/post-install/network.json @@ -1,11 +1,11 @@ { "meta": { - "title": "Post-instalación: Red | ProxMenux Documentation", - "description": "Optimizaciones relacionadas con la red en el script post-instalación Customizable de ProxMenux: forzar APT sobre IPv4, aplicar un perfil curado de tuning de sysctl, instalar Open vSwitch, activar TCP BBR + Fast Open, y fijar nombres de interfaz a sus direcciones MAC." + "title": "Post-instalación: Red | Documentación de ProxMenux", + "description": "Opciones de red de la post-instalación personalizable de ProxMenux: forzar APT sobre IPv4, aplicar un perfil sysctl seleccionado, instalar Open vSwitch, activar TCP BBR + Fast Open y vincular los nombres de interfaz a sus direcciones MAC." }, "header": { "title": "Post-instalación: Red", - "section": "Settings post-install Proxmox" + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué cubre esta categoría", @@ -19,13 +19,13 @@ }, "sysctl": { "heading": "Aplicar optimizaciones de red", - "intro": "Escribe un perfil sysctl curado en /etc/sysctl.d/99-network.conf que cubre buffers de socket core, hardening de ICMP, protección básica contra spoof y tamaños de buffer TCP que tienen sentido en un hipervisor con muchos flujos concurrentes.", - "tunedTitle": "Qué se tunea", + "intro": "Escribe un perfil sysctl seleccionado en /etc/sysctl.d/99-network.conf que ajusta los búferes de sockets del núcleo, refuerza ICMP, añade protección básica contra suplantación y configura búferes TCP adecuados para un hipervisor con muchos flujos simultáneos.", + "tunedTitle": "Qué se ajusta", "headerArea": "Área", "headerSettings": "Ajustes clave", "rows": [ { - "area": "Buffers de socket core", + "area": "Búferes de sockets del núcleo", "settings": "netdev_max_backlog=8192, rmem_max=16M, wmem_max=16M, somaxconn=8192" }, { @@ -37,7 +37,7 @@ "settings": "accept_redirects=0, accept_source_route=0, secure_redirects=0, send_redirects=0, log_martians=0" }, { - "area": "Reverse path filter", + "area": "Filtro de ruta inversa", "settings": "rp_filter=2 (modo loose, mira la nota abajo)" }, { @@ -64,17 +64,17 @@ "intro": "Instala openvswitch-switch + openvswitch-common. Estos paquetes añaden OVS como implementación alternativa de bridges a los bridges Linux estándar que Proxmox usa por defecto. La instalación por sí sola no cambia ninguna configuración de red — los bridges vmbrX existentes siguen funcionando. OVS pasa a estar disponible en la UI de Proxmox cuando creas un bridge nuevo y lo eliges del desplegable de tipo.", "tipTitle": "Cuándo tiene sentido OVS", "tipBody": "Considera OVS si necesitas trunking VLAN con IDs de VLAN no contiguos, LACP con LLDP en modos específicos, programación de flujos granular (OpenFlow), o interoperación con controladores SDN. Para un home lab con un par de VLANs y un único uplink LACP, los bridges Linux estándar + vmbrX.VID son más simples y van perfectamente bien.", - "revertTitle": "Reversible desde el menú Uninstall", - "revertBody": "OVS está registrado. Uninstall Optimizations ejecuta apt purge sobre openvswitch-switch y openvswitch-common. Migra cualquier bridge OVS de vuelta a bridges Linux antes de desinstalar, si no las VMs sobre esos bridges pierden red en el próximo arranque. Equivalente manual:" + "revertTitle": "Reversible desde el menú Desinstalar", + "revertBody": "OVS queda registrado. Desinstalar optimizaciones ejecuta apt purge sobre openvswitch-switch y openvswitch-common. Migra los bridges OVS a bridges Linux antes de desinstalar; de lo contrario, sus VM perderán la red en el próximo arranque. Equivalente manual:" }, "bbr": { "heading": "Activar TCP BBR + TCP Fast Open", - "intro": "Escribe dos archivos sysctl y los recarga. BBR sustituye el control de congestión por defecto CUBIC por el algoritmo basado en ancho de banda de Google, que maneja long-fat pipes y enlaces con pérdidas mucho mejor. TCP Fast Open (TFO) elimina un round trip en conexiones TCP repetidas al transportar datos en el SYN.", + "intro": "Escribe dos archivos sysctl y los recarga. BBR sustituye el control de congestión CUBIC por el algoritmo de Google basado en ancho de banda, que gestiona mejor los enlaces de gran capacidad y alta latencia y los enlaces con pérdidas. TCP Fast Open (TFO) elimina un intercambio de ida y vuelta en conexiones TCP repetidas enviando datos en el SYN.", "verifyTitle": "Verificación", "impactTitle": "El impacto depende de la carga", "impactBody": "BBR brilla en enlaces de alta latencia o con pérdidas (replicación intercontinental, túneles VPN, clientes móviles). En una LAN entre dos máquinas en el mismo switch, la diferencia a menudo está dentro del ruido. TFO ayuda más a conexiones HTTP cortas y repetidas.", - "revertTitle": "Reversible desde el menú Uninstall", - "revertBody": "BBR/TFO están registrados. Uninstall Optimizations elimina los dos ficheros sysctl (/etc/sysctl.d/99-tcp-bbr.conf y 99-tcp-fastopen.conf) y recarga sysctl para que el kernel vuelva a cubic y a tcp_fastopen=1. Equivalente manual:" + "revertTitle": "Reversible desde el menú Desinstalar", + "revertBody": "BBR/TFO quedan registrados. Desinstalar optimizaciones elimina los dos archivos sysctl (/etc/sysctl.d/99-kernel-bbr.conf y 99-tcp-fastopen.conf) y recarga la configuración restante. Borrar un archivo no restablece sus valores activos en el núcleo. Los valores predeterminados como cubic y tcp_fastopen=1 vuelven tras reiniciar, salvo que otra configuración los sobrescriba. Equivalente manual:" }, "names": { "heading": "Nombres de interfaz (persistentes)", @@ -83,17 +83,17 @@ "whyItems": [ "Añadir o quitar dispositivos PCIe puede desplazar la numeración del bus, convirtiendo enp3s0 en enp4s0. Si tu /etc/network/interfaces referencia el nombre antiguo, el bridge desaparece al reiniciar.", "Actualizaciones de BIOS / firmware a veces cambian cómo se enumeran los dispositivos, con el mismo efecto.", - "Contenedores LXC con NICs hotplug y enlaces bonded pueden hacer race en el arranque y acabar nombrados de forma inconsistente. Fijarlos lo soluciona." + "El auxiliar fija los nombres de las NIC físicas, incluidos los puertos físicos de los bonds. Omite interfaces virtuales como veth de LXC y los propios dispositivos bond; no corrige carreras de nombres de NIC virtuales hotplug." ], "writtenTitle": "Qué se escribe", "writtenIntro": "Un archivo por NIC física, en /etc/systemd/network/10-proxmenux-<iface>.link. Cada archivo comienza con la cabecera # Managed by ProxMenux — do not edit, marca que permite a ProxMenux distinguir sus propios archivos de los .link provistos por el usuario o por otros paquetes.", "writtenOutro": "Los archivos .link de otros paquetes o escritos a mano por el usuario se dejan intactos — solo se gestionan los archivos que llevan la cabecera de ProxMenux. En cada nueva ejecución la función reconcilia su propio conjunto: relee MACAddress= de cada 10-proxmenux-*.link y elimina los cuya MAC ya no aparece en /sys/class/net/. Los archivos escritos por una versión antigua de ProxMenux en el formato 10-<iface>.link se migran automáticamente en la primera ejecución.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "En Proxmox VE 9 (systemd-networkd nativo), el script recarga las reglas udev tras escribir los archivos .link para que las nuevas NICs hotplug cojan el nombre correcto sin reiniciar. En PVE 8 (ifupdown2), el naming de interfaz se resuelve en el arranque de todos modos — se requiere un reinicio para que los cambios surtan efecto. El script activa el flag de reinicio en cualquier caso para que Personalizable te lo pregunte.", + "pveBody": "El script utiliza archivos .link de systemd para los nombres persistentes. En Proxmox VE 9 también recarga las reglas udev al escribirlos, para que las NIC nuevas las apliquen sin reiniciar. Comprueba las interfaces existentes tras reiniciar tanto en PVE 8 como en PVE 9. Esto no sustituye ifupdown2 en el host. El script marca el reinicio como necesario en ambos casos para que la post-instalación personalizable lo solicite.", "reviewTitle": "Revisa antes el /etc/network/interfaces existente", "reviewBody": "Si tu host tiene configuración legacy en /etc/network/interfaces que referencia nombres de NIC generados por el esquema por defecto del kernel, fijar los nombres de hoy es exactamente lo que quieres. Pero si ya has customizado manualmente la configuración alrededor de nombres específicos, comprueba dos veces que el pinning coincide con lo que el archivo interfaces espera antes de reiniciar.", - "revertTitle": "Reversible desde el menú Uninstall", - "revertBody": "Uninstall Optimizations solo borra los archivos 10-proxmenux-*.link que llevan la cabecera de ProxMenux en /etc/systemd/network/. Cualquier archivo .link añadido por el usuario o por otro paquete se preserva. Los nombres de interfaz vuelven al comportamiento por defecto de systemd en el siguiente reinicio." + "revertTitle": "Reversible desde el menú Desinstalar", + "revertBody": "Desinstalar optimizaciones elimina solo los archivos 10-proxmenux-*.link con cabecera ProxMenux de /etc/systemd/network/. Conserva cualquier .link añadido por el usuario u otro paquete. Los nombres vuelven al comportamiento predeterminado de systemd al reiniciar." }, "related": { "heading": "Relacionado", @@ -114,12 +114,12 @@ "tail": " — ip, ss, ethtool, sysctl." }, { - "label": "Uninstall Optimizations", + "label": "Desinstalar optimizaciones", "href": "/docs/post-install/uninstall", "tail": " — revierte cualquiera de estos cambios de red." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/es/docs/post-install/optional.json b/web/messages/es/docs/post-install/optional.json index a2ab138a..1d7dc558 100644 --- a/web/messages/es/docs/post-install/optional.json +++ b/web/messages/es/docs/post-install/optional.json @@ -1,13 +1,13 @@ { "meta": { - "title": "ProxMenux Post-instalación: Optional Settings", - "description": "Guía de Optional Settings en el script post-instalación de ProxMenux para funcionalidades y optimizaciones adicionales de Proxmox VE.", - "ogTitle": "ProxMenux Post-instalación: Optional Settings", - "ogDescription": "Guía de Optional Settings en el script post-instalación de ProxMenux para funcionalidades y optimizaciones adicionales de Proxmox VE.", - "ogImageAlt": "ProxMenux Post-instalación Optional Settings" + "title": "Post-instalación de ProxMenux: Ajustes opcionales", + "description": "Guía de los ajustes opcionales del script post-instalación de ProxMenux para añadir funciones y optimizaciones a Proxmox VE.", + "ogTitle": "Post-instalación de ProxMenux: Ajustes opcionales", + "ogDescription": "Guía de los ajustes opcionales del script post-instalación de ProxMenux para añadir funciones y optimizaciones a Proxmox VE.", + "ogImageAlt": "Ajustes opcionales post-instalación de ProxMenux" }, - "title": "Optional Settings", - "intro": "La categoría Optional Settings ofrece funcionalidades y optimizaciones adicionales que puedes elegir aplicar a tu instalación de Proxmox VE. Estos ajustes no son esenciales pero pueden mejorar las capacidades de tu sistema en escenarios específicos.", + "title": "Ajustes opcionales", + "intro": "La categoría Ajustes opcionales ofrece funciones y optimizaciones adicionales para tu instalación de Proxmox VE. No son esenciales, pero pueden mejorar las capacidades del sistema en situaciones concretas.", "available": "Funcionalidades opcionales disponibles", "stepLabel": "Paso", "ceph": { @@ -24,7 +24,7 @@ "automates": "Este ajuste automatiza los siguientes comandos:" }, "amd": { - "title": "Aplicar fixes para CPUs AMD", + "title": "Aplicar correcciones para CPU AMD", "intro": "Esta opción aplica fixes específicos para CPUs AMD EPYC y Ryzen para mejorar la estabilidad y la compatibilidad.", "doesIntro": "Qué hace:", "doesItems": [ @@ -32,11 +32,11 @@ "Aplica el parámetro de kernel 'idle=nomwait' para prevenir crashes aleatorios (vía /etc/kernel/cmdline en hosts con systemd-boot, o /etc/default/grub en hosts con GRUB — con un .bak del original)", "Configura KVM para que ignore ciertos MSRs (Model Specific Registers) y mejorar la compatibilidad con guests Windows" ], - "howUse": "Cómo usarlo: Estos fixes se aplican automáticamente y requieren un reinicio del sistema para surtir efecto.", + "howUse": "Cómo usarlo: Estas correcciones se aplican automáticamente y requieren reiniciar el sistema para surtir efecto.", "automates": "Este ajuste automatiza los siguientes comandos:" }, "ha": { - "title": "Activar servicios High Availability", + "title": "Activar servicios de alta disponibilidad", "intro": "Esta opción activa los servicios High Availability (HA) en Proxmox VE, permitiendo failover automático de VMs y contenedores en caso de fallo de un nodo.", "doesIntro": "Qué hace:", "doesItems": [ @@ -64,8 +64,8 @@ "doesLabel": "Qué hace:", "doesItems": [ "Descarga e instala silenciosamente la última versión de Fastfetch", - "Te permite elegir un logo personalizado (ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology, o uno custom)", - "Configura Fastfetch para mostrar \"System optimised by ProxMenux\"", + "Permite elegir un logo (ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology o uno personalizado)", + "Configura Fastfetch para mostrar «Sistema optimizado por ProxMenux»", "Configura Fastfetch para que se ejecute automáticamente al hacer login en consola" ], "importantLabel": "Importante:", @@ -133,7 +133,7 @@ }, "log2ram": { "title": "Instalar Log2RAM (reducción de desgaste en SSD/NVMe)", - "intro": "Log2RAM monta /var/log sobre una ramdisk tmpfs y sincroniza periódicamente el contenido al disco subyacente. En un hipervisor el churn de journald golpea el SSD del sistema cada pocos segundos; mover las escrituras a RAM reduce el desgaste y la I/O de disco sin perder logs — la sincronización periódica los vuelca a disco y un apagado limpio también los vuelca.", + "intro": "Log2RAM monta /var/log en una ramdisk tmpfs y lo sincroniza periódicamente al disco. Almacenar temporalmente en RAM las escrituras frecuentes de journald puede reducir el desgaste del SSD y la E/S. La sincronización y un apagado limpio guardan los registros, pero un corte brusco puede perder las entradas posteriores a la última sincronización.", "upstreamLabel": "Proyecto oficial:", "upstreamUrl": "https://github.com/azlux/log2ram", "upstreamLinkLabel": "azlux/log2ram en GitHub", @@ -146,12 +146,12 @@ "Instala un guardián de auto-sync en /usr/local/bin/log2ram-check.sh, conectado a /etc/cron.d/log2ram-auto-sync para ejecutarse cada 10 minutos. Cuando /var/log alcanza el 80% del tamaño de la ramdisk el guardián compacta journald; al 92% primero ejecuta logrotate -f /etc/logrotate.d/proxmox-backup-api si ese archivo existe (para forzar la rotación de los logs del API de PBS, que suelen ser los que más crecen en un host con PBS) y a continuación trunca pveproxy access/error y pveam.log antes de sincronizar. El comando log2ram write por sí solo copia tmpfs a disco pero NO reduce la tmpfs, así que este guardián evita que PVE caiga con No space left on device cuando los logs crecen sin control.", "Detecta si proxmox-backup-server corre como servicio en el host. Cuando está presente, deposita /etc/logrotate.d/proxmox-backup-api (rotación de 20 MB × 3) y /etc/cron.hourly/proxmox-backup-logrotate, de forma que los logs del API de PBS — el origen habitual del crecimiento en un host con PBS — queden acotados incluso entre las sincronizaciones periódicas de Log2RAM. En hosts sin PBS este paso es un no-op.", "Ajusta los límites de systemd-journald (SystemMaxUse, RuntimeMaxUse) para que quepan en la ramdisk y así una ráfaga puntual no la llene.", - "Se registra en installed_tools.json para poder revertirlo desde Uninstall Optimizations." + "Se registra en installed_tools.json para poder revertirlo desde Desinstalar optimizaciones." ], "howUseLabel": "Cómo se usa:", - "howUseBody": "En el flujo Automatizado Log2RAM se aplica sin intervención cuando se detecta un disco raíz SSD/NVMe. En el flujo Personalizable el script pregunta por el tamaño, el intervalo de sincronización y si activar el guardián de auto-sync al 90%.", + "howUseBody": "En el flujo automatizado Log2RAM se instala sin intervención al detectar un disco raíz SSD/NVMe. El personalizable pregunta por tamaño, intervalo y activación del auxiliar de sincronización. El mensaje indica 90%, pero el auxiliar generado usa los umbrales de limpieza del 80% y actuación intensiva del 92% descritos arriba.", "verifyLabel": "Verificar y gestionar desde la shell:", - "verifyCode": "# Estado del servicio y timers configurados\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Uso actual de la ramdisk — /var/log ES la tmpfs\ndf -h /var/log\n\n# Forzar sincronización ahora (tmpfs → disco); NO reduce la tmpfs\nlog2ram write\n\n# Disparar el guardián de auto-sync manualmente (compacta + sincroniza si el uso es alto)\n/usr/local/bin/log2ram-check.sh\n\n# Configuración actual: SIZE, mail, path\ncat /etc/log2ram.conf\n\n# Crons específicos de ProxMenux\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Actividad reciente de Log2RAM\njournalctl -u log2ram -n 50 --no-pager" + "verifyCode": "# Service state and configured timers\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Current ramdisk usage — /var/log IS the tmpfs itself\ndf -h /var/log\n\n# Force a sync now (tmpfs → disk); does NOT shrink the tmpfs\nlog2ram write\n\n# Trigger the auto-sync guard on demand (vacuum + sync when usage is high)\n/usr/local/bin/log2ram-check.sh\n\n# Current config: SIZE, mail settings, path\ncat /etc/log2ram.conf\n\n# ProxMenux-specific cron jobs\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Recent Log2RAM activity\njournalctl -u log2ram -n 50 --no-pager" }, "zram": { "title": "Activar el perfil de swap con ZRAM", @@ -163,15 +163,15 @@ "Con esa prioridad el kernel llena primero ZRAM. Un swap en disco que ya exista conserva su prioridad y recibe las páginas que ya no caben en ZRAM.", "Antes de cambiar nada, busca otra configuración de ZRAM: un swap zram activo, una línea zram en /etc/fstab, una unidad de systemd u otro fichero del generador. Si encuentra una, la opción se detiene y la deja como está.", "Arranca dev-zram0.swap y comprueba que el dispositivo activo coincide con el perfil. Si no coincide, se restaura el estado anterior.", - "Se registra en installed_tools.json para poder revertirlo desde Uninstall Optimizations." + "Se registra en installed_tools.json para poder revertirlo desde Desinstalar optimizaciones." ], "howUseLabel": "Cómo se usa:", "howUseBody": "La opción solo forma parte del flujo Personalizable; el flujo Automatizado no la aplica. El dispositivo se crea de nuevo en cada arranque. Mientras está activo, la tarjeta de Memoria del ProxMenux Monitor muestra su capacidad, el swap usado, el algoritmo, la relación de compresión y la memoria física que ocupa.", "verifyLabel": "Verificar desde la shell:", - "verifyCode": "# Dispositivos de swap activos y su prioridad\nswapon --show\n\n# Dispositivo ZRAM: algoritmo, tamaño y datos comprimidos\nzramctl\n\n# Perfil escrito por ProxMenux\ncat /etc/systemd/zram-generator.conf.d/90-proxmenux.conf\n\n# Estado de la unidad de swap\nsystemctl status dev-zram0.swap" + "verifyCode": "# Active swap devices and their priority\nswapon --show\n\n# ZRAM device: algorithm, size and compressed data\nzramctl\n\n# Profile written by ProxMenux\ncat /etc/systemd/zram-generator.conf.d/90-proxmenux.conf\n\n# State of the swap unit\nsystemctl status dev-zram0.swap" }, "autoApplication": { "title": "Aplicación automática", - "body": "Estas funcionalidades opcionales solo se aplican cuando se seleccionan específicamente durante el proceso post-instalación. Cada funcionalidad puede elegirse individualmente según tus necesidades y preferencias específicas." + "body": "En el flujo personalizable, selecciona cada función opcional según tus necesidades. Log2RAM también forma parte del automatizado con detección de hardware; ZRAM es exclusivo del personalizable. Revisa cada sección para conocer las preguntas y requisitos." } } diff --git a/web/messages/es/docs/post-install/performance.json b/web/messages/es/docs/post-install/performance.json index d8042b1e..ce9022e7 100644 --- a/web/messages/es/docs/post-install/performance.json +++ b/web/messages/es/docs/post-install/performance.json @@ -1,12 +1,12 @@ { "meta": { - "title": "Post-instalación: Rendimiento | ProxMenux Documentation", - "description": "Opciones de rendimiento en el script post-instalación Customizable de ProxMenux. Sustituye gzip de un solo hilo por pigz (gzip paralelo) para backups y compresión más rápidos en hosts multinúcleo." + "title": "Post-instalación: Rendimiento | Documentación de ProxMenux", + "description": "Opciones de rendimiento en el script post-instalación Personalizable de ProxMenux. Sustituye gzip de un solo hilo por pigz (gzip paralelo) para copias de seguridad y compresión más rápidas en hosts multinúcleo." }, "header": { "title": "Post-instalación: Rendimiento", - "description": "Opciones de rendimiento dentro del script post-instalación Customizable. Por ahora esta categoría contiene una sola optimización: sustituir gzip por pigz para que los backups y la compresión usen todos los núcleos de la CPU en lugar de uno.", - "section": "Settings post-install Proxmox" + "description": "Opciones de rendimiento del script post-instalación Personalizable. Esta categoría contiene una sola optimización: sustituir gzip por pigz para que las copias de seguridad y la compresión usen todos los núcleos de la CPU en lugar de uno.", + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué cubre esta categoría", @@ -16,7 +16,7 @@ "heading": "Usar pigz para compresión gzip más rápida", "intro": "El gzip estándar comprime datos usando un solo núcleo de CPU. En hosts Proxmox modernos con 8, 16 o 32 núcleos, eso es un cuello de botella enorme durante backups vzdump de VM/CT, rotación de logs y cualquier otra cosa que pase por gzip. pigz es un reemplazo paralelo drop-in: misma salida compatible con gzip, pero reparte el trabajo entre todos los núcleos.", "doesTitle": "Qué hace ProxMenux", - "doesIntro": "Cuatro pasos, todos idempotentes:", + "doesIntro": "Cinco pasos, todos idempotentes:", "doesItems": [ "Establece pigz: 1 en /etc/vzdump.conf para que la herramienta de backup de Proxmox use pigz de forma nativa.", "Instala el paquete apt pigz si no está presente.", @@ -26,8 +26,8 @@ ], "replacesTitle": "Esto sustituye un binario del sistema", "replacesBody": "Colocar un wrapper en el lugar de gzip es inusual. Es seguro (el wrapper produce salida compatible con gzip), pero conviene saberlo: scripts que tengan paths hardcodeados, que se ejecuten dentro de chroots restrictivos o que verifiquen hashes de binarios pueden comportarse de forma distinta. El binario real se conserva como gzip.distrib y, al ser una desviación de dpkg, una actualización del paquete gzip — o la actualización de Proxmox VE 8 a 9 — actualiza ese fichero y deja el wrapper en su sitio.", - "revertTitle": "Reversible desde el menú Uninstall", - "revertBody": "Esta optimización está registrada. Uninstall Optimizations copia el binario real desde gzip.distrib sobre el wrapper, elimina la desviación y el pigzwrapper, comenta la línea pigz de /etc/vzdump.conf y ejecuta apt purge pigz una vez verificado que gzip funciona. Equivalente manual en Proxmox VE 9:", + "revertTitle": "Reversible desde el menú Desinstalar", + "revertBody": "Esta optimización está registrada. Desinstalar optimizaciones copia el binario real desde gzip.distrib sobre el wrapper, elimina la desviación y el pigzwrapper, comenta la línea pigz de /etc/vzdump.conf y ejecuta apt purge pigz tras verificar que gzip funciona. Equivalente manual en Proxmox VE 9:", "verifyTitle": "Verificación", "verifyBody": "Tras aplicar, gzip --version debería mencionar pigz. Un benchmark rápido también muestra la diferencia de velocidad en un host multinúcleo:", "whenTitle": "Cuándo importa más", @@ -52,7 +52,7 @@ "tail": " — tuning de descriptores de fichero y de memoria." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/es/docs/post-install/security.json b/web/messages/es/docs/post-install/security.json index 6cabdec2..a3fc60ab 100644 --- a/web/messages/es/docs/post-install/security.json +++ b/web/messages/es/docs/post-install/security.json @@ -1,15 +1,15 @@ { "meta": { - "title": "Post-instalación: Seguridad | ProxMenux Documentation", - "description": "Opciones de seguridad disponibles en el script post-instalación Customizable de ProxMenux. Por ahora una sola opción: desactivar el servicio portmapper/rpcbind para reducir la superficie de ataque del host." + "title": "Post-instalación: Seguridad | Documentación de ProxMenux", + "description": "Opciones de seguridad disponibles en el script post-instalación Personalizable de ProxMenux. Por ahora una sola opción: desactivar el servicio portmapper/rpcbind para reducir la superficie de ataque del host." }, "header": { "title": "Post-instalación: Seguridad", - "section": "Settings post-install Proxmox" + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué cubre esta categoría", - "body": "La seguridad post-instalación se limita al hardening del host que es seguro aplicar sin supervisión — cosas que desactivan servicios que casi nadie necesita y que se pueden deshacer desde el menú Uninstall. Las herramientas de seguridad activa (Fail2Ban para prevención de intrusiones, Lynis para auditoría) viven bajo la entrada dedicada Seguridad del menú principal de ProxMenux, no aquí en post-instalación." + "body": "La seguridad post-instalación se limita al refuerzo del host que se puede aplicar sin supervisión de forma segura: desactivar servicios que casi nadie necesita y poder revertirlo desde Desinstalar. Las herramientas de seguridad activa (Fail2Ban para prevenir intrusiones y Lynis para auditorías) están en la entrada Seguridad del menú principal de ProxMenux, fuera de la post-instalación." }, "rpcbind": { "heading": "Desactivar portmapper / rpcbind", @@ -27,7 +27,7 @@ "verifyTitle": "Verificación", "verifyBody": "Tras aplicar, confirma que rpcbind está apagado y que nada escucha en el puerto 111:", "reversibleTitle": "Restaura el estado original del servicio", - "reversibleBody": "El cambio queda registrado en installed_tools.json. Uninstall Optimizations devuelve cada unidad de rpcbind al estado habilitado o deshabilitado y activo o inactivo que tenía antes de aplicar ProxMenux; no presupone que rpcbind estuviera habilitado en todos los hosts." + "reversibleBody": "El cambio queda registrado en installed_tools.json. Desinstalar optimizaciones devuelve cada unidad de rpcbind al estado habilitado o deshabilitado y activo o inactivo que tenía antes de aplicar ProxMenux; no presupone que rpcbind estuviera habilitado en todos los hosts." }, "related": { "heading": "Relacionado", @@ -48,7 +48,7 @@ "tail": " — estado de servicios, journalctl, referencia de lynis audit." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/es/docs/post-install/storage.json b/web/messages/es/docs/post-install/storage.json index 1b9d4b29..32b7c491 100644 --- a/web/messages/es/docs/post-install/storage.json +++ b/web/messages/es/docs/post-install/storage.json @@ -1,24 +1,24 @@ { "meta": { - "title": "Post-instalación: Almacenamiento | ProxMenux Documentation", + "title": "Post-instalación: Almacenamiento | Documentación de ProxMenux", "description": "Optimizaciones de almacenamiento en el script post-instalación Customizable de ProxMenux: dimensionado del ARC de ZFS basado en la RAM del host, zfs-auto-snapshot para snapshots periódicas, y eliminación de los límites de velocidad de backups vzdump." }, "header": { "title": "Post-instalación: Almacenamiento", - "section": "Settings post-install Proxmox" + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué cubre esta categoría", "body": "Cuatro optimizaciones relacionadas con almacenamiento: tunear el tamaño de la caché ARC de ZFS a una fracción sensata de la RAM del host, instalar y programar auto-snapshots de ZFS, activar autotrim de ZFS en pools SSD/NVMe y eliminar throttles de vzdump para que los backups corran a máxima velocidad. Las cuatro son independientes — elige las que se ajusten a tu setup. Una quinta optimización cercana al almacenamiento, Log2RAM, reduce el desgaste del SSD/NVMe moviendo /var/log a una ramdisk — vive en la página Optional porque el menú Personalizable de ProxMenux la agrupa allí." }, - "trackedTitle": "Las cuatro están registradas en el menú Uninstall", + "trackedTitle": "Las cuatro se registran en el menú Desinstalar", "trackedBody": "Cada una de estas opciones registra un tool en installed_tools.json, así que aparecen en Uninstall Optimizations. Revertir zfs_arc elimina /etc/modprobe.d/99-zfsarc.conf y reconstruye initramfs; zfs_auto_snapshot revierte la programación cron y ofrece purgar el paquete; zfs_autotrim pone autotrim=off en los pools que activó; vzdump_speed restaura /etc/vzdump.conf desde el .bak que la instalación creó.", "arc": { "heading": "Optimizar el tamaño del ARC de ZFS", - "intro": "El Adaptive Replacement Cache (ARC) es la caché de lectura en memoria de ZFS. Sin tuning explícito, ZFS coge alegremente hasta la mitad de la RAM del host para sí mismo, lo que es excesivo en un host Proxmox que también necesita memoria para VMs y LXCs. Esta opción limita el ARC a una fracción sensata de la RAM total según el tamaño de la máquina.", + "intro": "La Adaptive Replacement Cache (ARC) es la caché de lectura en memoria de ZFS. Las instalaciones Proxmox VE desde 8.1 fijan un límite del 10% de RAM, con máximo 16 GiB; hosts antiguos o actualizados pueden diferir. Esta opción escribe su propio límite según la RAM. Revisa ajustes y carga: una caché menor no siempre es más rápida.", "sizingTitle": "Reglas de dimensionado", "headerRam": "RAM del host", - "headerMax": "Cap ARC", + "headerMax": "Límite del ARC", "rows": [ { "ram": "Fórmula", @@ -41,12 +41,12 @@ "max": "16 GiB (tope)" } ], - "after": "El archivo /etc/modprobe.d/99-zfsarc.conf contiene una única directiva — options zfs zfs_arc_max=…. El resto de parámetros del módulo (zfs_arc_min, prefetch/write throttle de L2ARC, timeout de TXG) se dejan en los valores por defecto de OpenZFS. Antes de escribir, un paso de reconciliación escanea otros *.conf en /etc/modprobe.d/ que definan zfs_arc_min / zfs_arc_max, los respalda a /usr/local/share/proxmenux/backups/zfs_arc/ con un manifest, y elimina las líneas en conflicto para que solo quede activo el fichero de ProxMenux. Tras escribir el archivo, ProxMenux ejecuta update-initramfs -u -k all y, cuando corresponde, proxmox-boot-tool refresh, para que el cap llegue también al initramfs que usan las instalaciones con ZFS-on-root.", + "after": "El archivo /etc/modprobe.d/99-zfsarc.conf contiene solo options zfs zfs_arc_max=…. Esta opción no ajusta otros parámetros ZFS (zfs_arc_min, lectura anticipada/límite de escritura L2ARC, tiempo de espera TXG). Antes busca otros *.conf en /etc/modprobe.d/ que definan zfs_arc_min / zfs_arc_max, los copia con un manifiesto a /usr/local/share/proxmenux/backups/zfs_arc/ y elimina las líneas en conflicto para que solo quede activo el archivo ARC de ProxMenux. Después ejecuta update-initramfs -u -k all y, si procede, proxmox-boot-tool refresh para incorporar el límite al initramfs de los sistemas con raíz ZFS.", "rebootTitle": "Requiere reinicio para surtir efecto", "rebootBody": "Los ajustes del ARC se leen cuando se carga el módulo del kernel zfs. Para que el cap se aplique en hosts ZFS-on-root, ProxMenux regenera el initramfs con update-initramfs -u -k all y, cuando corresponde, refresca el cargador de arranque con proxmox-boot-tool refresh. Un reinicio sigue siendo necesario para que el módulo relea el parámetro; el flag de \"se requiere reinicio\" se activa automáticamente.", "safeTitle": "Seguro en hosts sin ZFS", "safeBody": "La función solo escribe la configuración cuando zpool list reporta al menos un pool ZFS importado. En hosts Proxmox solo ext4 / LVM, o en máquinas con las utilidades ZFS instaladas pero sin ningún pool importado, marcar esta opción es un no-op — no se escribe nada.", - "verifyTitle": "Verificación y rollback manual" + "verifyTitle": "Verificación y reversión manual" }, "autoSnap": { "heading": "Instalar ZFS auto-snapshot", @@ -57,27 +57,27 @@ "headerKept": "Snapshots conservadas", "rows": [ { - "label": "frequent", + "label": "frecuentes", "runs": "cada 15 min", "kept": "4" }, { - "label": "hourly", + "label": "horaria", "runs": "cada hora", "kept": "1" }, { - "label": "daily", + "label": "diario", "runs": "una vez al día", "kept": "1" }, { - "label": "weekly", + "label": "semanales", "runs": "una vez por semana", "kept": "1" }, { - "label": "monthly", + "label": "mensual", "runs": "una vez al mes", "kept": "1" } @@ -86,26 +86,26 @@ "conservativeBody": "ProxMenux viene con una retención conservadora (solo 4 frequent + 1 de cada intervalo más largo) para que el almacenamiento de snapshots de ZFS no se infle. Si quieres una retención mayor, edita los números en /etc/cron.d/zfs-auto-snapshot, /etc/cron.hourly/zfs-auto-snapshot, etc. después de ejecutar el script.", "onlyZfsTitle": "Solo útil en pools ZFS", "onlyZfsBody": "Instalar el paquete en un host solo ext4 es inofensivo pero inútil — no hay datasets ZFS de los que tomar snapshot. Sáltate esta opción si no usas ZFS.", - "verifyTitle": "Verificación y rollback manual" + "verifyTitle": "Verificación y reversión manual" }, "autotrim": { "heading": "Activar ZFS autotrim (pools SSD/NVMe)", - "intro": "Activa la propiedad autotrim en cada pool ZFS que esté respaldado exclusivamente por SSDs o NVMe con soporte TRIM. Los pools que incluyen un solo vdev HDD se saltan automáticamente — TRIM en discos rotacionales no tiene sentido y ZFS lo rechazará. Los pools que ya estaban configurados con autotrim=on se dejan como están.", + "intro": "Activa autotrim en pools ZFS formados exclusivamente por SSD o NVMe compatibles con TRIM. El script omite por precaución los pools con algún dispositivo rotacional. Conserva los pools que ya tenían autotrim=on.", "trimTitle": "Qué hace TRIM, y por qué importa en ZFS", "trimBody1": "Las SSDs / NVMe gestionan el almacenamiento interno en erase blocks de tamaño fijo que son mucho mayores que los sectores lógicos con los que habla el sistema de archivos. Cuando un sistema de archivos borra un archivo, el disco no lo sabe — sigue pensando que esos sectores están en uso, así que su garbage collector interno sigue moviendo datos obsoletos para liberar nuevos erase blocks. TRIM es el comando estándar que el SO usa para decirle al disco \"estos sectores ya están libres, puedes borrarlos por adelantado\".", "trimBody2": "Sin TRIM, el rendimiento de la SSD se degrada con el tiempo a medida que el disco se queda sin bloques pre-borrados y tiene que hacer erase-on-write, y la amplificación de escritura aumenta — ambas cosas acortan la vida útil del disco. Con TRIM activado, el disco puede mantener un pool saludable de bloques vacíos listos para escribir.", - "trimBody3": "En ZFS, autotrim=on es el equivalente moderno del comando periódico zpool trim <pool> — en lugar de tener que acordarte de ejecutar un trim manualmente (o programar uno), el pool emite comandos TRIM automáticamente y de forma continua a medida que los bloques se liberan. Es de bajo overhead y es el ajuste recomendado para pools respaldados por SSD.", + "trimBody3": "Con autotrim=on, ZFS aplica TRIM en segundo plano al espacio liberado recientemente, agrupando rangos. Otra opción es zpool trim <pool> periódico. Autotrim evita otra programación, pero su impacto depende del dispositivo; el TRIM manual periódico puede ir mejor en algunas unidades modestas.", "practicalTitle": "¿Por qué es práctico activarlo?", "practicalItems": [ - "Rendimiento de escritura sostenido. Las SSDs que nunca ven comandos TRIM se ralentizan de forma medible con los meses. Autotrim le facilita el trabajo a la controladora.", - "Longevidad del disco. Menor amplificación de escritura significa menos escrituras NAND totales para la misma cantidad de datos — medible en años de vida útil del disco.", + "Rendimiento de escritura sostenido. TRIM puede ayudar al disco a recuperar bloques sin uso. El beneficio y el impacto en latencia dependen del dispositivo y la carga.", + "Vida útil del disco. Evitar copias internas innecesarias puede reducir la amplificación de escritura y el desgaste NAND. No garantiza una cantidad concreta de vida adicional.", "Sin cron programado que recordar. A diferencia de un zpool trim periódico, autotrim es fire-and-forget — el pool lo maneja por su cuenta." ], "whenTitle": "¿Cuándo es necesario?", - "whenIntro1": "Deberías activarlo en cualquier pool ZFS cuyos vdevs sean todos SSD o NVMe con soporte TRIM — la instalación típica de Proxmox sobre SSDs de consumo o enterprise.", + "whenIntro1": "Considera activarlo en pools ZFS solo con SSD/NVMe compatibles con TRIM. Comprueba el comportamiento y la latencia; algunos equipos funcionan mejor con TRIM manual programado.", "whenIntro2": "El script se lo salta automáticamente en:", "whenSkipItems": [ - "Pools que contienen cualquier vdev HDD (rotacional) — TRIM no tiene sentido allí.", + "Pools con algún vdev HDD rotacional: un filtro conservador de hardware del script.", "Discos sin discard_granularity expuesto en sysfs — normalmente SSDs viejas sin TRIM, o rutas pass-through donde el SO no puede ver el dispositivo subyacente.", "Pools donde ZFS mismo reporta la propiedad como no soportada (raro; pools muy antiguos).", "Pools ya configurados con autotrim=on (no-op)." @@ -115,19 +115,19 @@ "recordedBody": "La función solo escribe un pool en su archivo de estado interno (/usr/local/share/proxmenux/zfs_autotrim_pools) cuando ha cambiado activamente ese pool de off a on. Los pools que ya tenías con autotrim antes de ejecutar el script se dejan fuera de la lista, para que un futuro Uninstall no apague ajustes que tú mismo configuraste — solo se revierten los cambios propios de ProxMenux.", "manualTitle": "Equivalente manual (ejecuta en tu servidor)", "manualIntro": "La secuencia completa que el script ejecuta contra cada pool es replicable a mano. Esto es lo que escribirías si quisieras hacer lo mismo en un solo pool sin ProxMenux:", - "verifyTitle": "Verificación y rollback manual", + "verifyTitle": "Verificación y reversión manual", "oneShotTitle": "¿Necesitas un trim puntual en lugar de continuo?", "oneShotBody": "Algunos operadores prefieren un trim manual durante horas de baja carga en lugar de actividad de trim continua. Desactiva autotrim y programa un cron que ejecute zpool trim <pool> — mismo objetivo final, distinta cadencia." }, "vzdump": { "heading": "Aumentar la velocidad de backup de vzdump", - "intro": "Por defecto, vzdump de Proxmox throttlea los backups para proteger las VMs/CTs en ejecución de inanición de IO. En muchos setups ese throttle es más conservador de lo necesario. Esta opción quita el cap de ancho de banda y baja la prioridad de I/O para que vzdump pueda saturar el path de almacenamiento durante las ventanas de backup.", + "intro": "Escribe bwlimit: 0 e ionice: 5 en la configuración global de vzdump. Proxmox ya usa ancho de banda sin límite por defecto: solo elimina un límite si estaba configurado. Frente al ionice: 7 predeterminado, 5 da mayor prioridad de E/S de mejor esfuerzo cuando el planificador la respeta. Puede afectar a los huéspedes y no garantiza backups más rápidos.", "changedTitle": "Qué se cambia en /etc/vzdump.conf", "backupTitle": "La primera ejecución crea un .bak de vzdump.conf", "backupBody": "La primera vez que se ejecuta esta opción, ProxMenux copia /etc/vzdump.conf a /etc/vzdump.conf.bak antes de tocarlo. Las ejecuciones siguientes reutilizan ese backup y no lo sobrescriben, para que una configuración editada a mano previa a la primera aplicación se pueda recuperar. Los cambios sobre bwlimit y ionice se hacen con sed, y cualquier otra opción del fichero (compress, pigz, tmpdir, exclude-path, etc.) se preserva.", "skipTitle": "Cuándo saltárselo", "skipBody": "En un host con almacenamiento local lento y VMs sensibles a la latencia, quitar el cap de ancho de banda puede causar ralentizaciones notables durante los backups. Si previamente has puesto un bwlimit específico por esa razón, mantenlo — sáltate esta opción.", - "verifyTitle": "Verificación y rollback manual" + "verifyTitle": "Verificación y reversión manual" }, "related": { "heading": "Relacionado", @@ -145,10 +145,10 @@ { "label": "Comandos de backup y restauración", "href": "/docs/help-info/backup-commands", - "tail": " — referencia de la CLI de vzdump (ahora sin los caps legacy de bwlimit / ionice)." + "tail": " — referencia de la CLI de vzdump para ancho de banda y prioridad de E/S." }, { - "label": "Uninstall Optimizations", + "label": "Desinstalar optimizaciones", "href": "/docs/post-install/uninstall", "tail": " — revierte cambios de ARC / vzdump." }, @@ -158,7 +158,7 @@ "tail": " — reduce el desgaste del SSD/NVMe usando una ramdisk para /var/log; documentado en Optional." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/es/docs/post-install/system.json b/web/messages/es/docs/post-install/system.json index 0861d3b7..d260dc5a 100644 --- a/web/messages/es/docs/post-install/system.json +++ b/web/messages/es/docs/post-install/system.json @@ -1,11 +1,11 @@ { "meta": { - "title": "Post-instalación: Sistema | ProxMenux Documentation", + "title": "Post-instalación: Sistema | Documentación de ProxMenux", "description": "Optimizaciones a nivel de sistema en el script post-instalación Customizable de ProxMenux: límites de tamaño de journald y logrotate, límites de kernel y descriptores de fichero más altos, tuning de memoria balanceado, kexec para reinicios rápidos, y recuperación ante kernel panic." }, "header": { "title": "Post-instalación: Sistema", - "section": "Settings post-install Proxmox" + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué cubre esta categoría", @@ -17,10 +17,10 @@ "keyTitle": "Valores clave", "keyItems": [ "Storage=persistent — conservar logs en disco entre reinicios.", - "SystemMaxUse=64M / RuntimeMaxUse=60M — caps duros sobre el uso de disco/memoria del journal.", + "SystemMaxUse=64M / RuntimeMaxUse=60M — límites de uso de disco y memoria del journal.", "Compress=yes, Seal=no — comprimir logs, saltar el forward-secure sealing (ahorra CPU).", "MaxLevelStore=info — almacenar info y superiores (requerido para el visor de logs del ProxMenux Monitor y para que Fail2Ban detecte fallos de autenticación SSH/Proxmox desde el journal).", - "Rate-limits: 1000 eventos / 30 s para prevenir flooding de logs.", + "Límite de frecuencia: 1000 events / 30 s para evitar una avalancha de registros.", "ForwardToSyslog=no, ForwardToWall=no — no duplicar mensajes a syslog ni broadcastear a consolas." ], "tipTitle": "Por qué importa MaxLevelStore=info", @@ -28,9 +28,9 @@ }, "logrotate": { "heading": "Optimizar logrotate", - "intro": "Reescribe /etc/logrotate.conf con una política más estricta adecuada para un host que también forma parte de un setup Log2RAM de protección de SSD: rotación diaria, retención de 7 días, trigger de tamaño 10 MB, compresión, y copytruncate para que los servicios activos sigan escribiendo sin reabrir sus archivos de log. El logrotate.conf original se respalda en .bak en la primera aplicación.", + "intro": "Reescribe /etc/logrotate.conf con ajustes globales de frecuencia diaria y tamaño, 7 rotaciones conservadas, compresión y copytruncate para que los servicios sigan escribiendo sin reabrir los archivos. El tamaño aparece después de la frecuencia diaria y prevalece salvo que una regla particular lo cambie. El logrotate.conf original se copia a .bak la primera vez.", "tipTitle": "Amigable con Log2RAM", - "tipBody": "El trigger size 10M significa que los logs rotan por tamaño o diariamente, lo que ocurra primero. Combinado con el /var/log respaldado en RAM de Log2RAM, esto mantiene el working set pequeño para que los flushes a disco sean baratos." + "tipBody": "La directiva size 10M prevalece sobre el ajuste diario anterior; no significa lo que ocurra primero. Logrotate comprueba el umbral al ejecutarse y las reglas particulares pueden cambiar los valores globales. Con /var/log en la RAM de Log2RAM, revisa las reglas y la frecuencia del temporizador para controlar el espacio." }, "limits": { "heading": "Aumentar varios límites del sistema", @@ -72,7 +72,7 @@ } ], "tipTitle": "Por qué importa inotify", - "tipBody": "Aplicaciones como Docker, Syncthing, watchers de Node.js, el escáner de biblioteca de Plex y muchas más pegan rápido contra max_user_watches. El valor por defecto en Debian es 8192 — un solo Plex en ejecución puede agotarlo. 1M es generoso y cuesta ~1 KB de RAM por watch, lo que es despreciable." + "tipBody": "Docker, Syncthing, los observadores de archivos de Node.js y los análisis de bibliotecas de Plex pueden agotar max_user_watches. El valor predeterminado depende del núcleo y la memoria; no siempre es 8192. Subirlo a 1M permite más observadores, sin preasignarlos. Los observadores activos consumen memoria del núcleo: vigila el uso en hosts con poca RAM." }, "memory": { "heading": "Optimizar ajustes de memoria", @@ -102,8 +102,8 @@ "verify": { "heading": "Verificación", "intro": "Tras aplicar las optimizaciones de Sistema:", - "tipTitle": "Totalmente reversible", - "tipBody": "Las seis opciones están registradas en installed_tools.json, así que aparecen en Uninstall Optimizations si quieres revertir alguna. Las reversiones restauran los valores por defecto de los archivos sysctl, eliminan la unit systemd y el alias de kexec, y resetean journald/logrotate a las configuraciones stock de Debian." + "tipTitle": "Restauración y limitaciones", + "tipBody": "Las seis opciones se registran en installed_tools.json y aparecen en Desinstalar optimizaciones. La restauración elimina archivos de configuración, unidad y alias kexec, y restaura journald/logrotate. Algunos límites activos requieren otra sesión o reinicio. La limpieza de /root/.profile solo elimina el antiguo ulimit -n 256000; el actual ulimit -n 1048576 puede permanecer y requerir eliminación manual." }, "related": { "heading": "Relacionado", @@ -119,12 +119,12 @@ "tail": " — tuning adicional a nivel de sistema (pigz)." }, { - "label": "Uninstall Optimizations", + "label": "Desinstalar optimizaciones", "href": "/docs/post-install/uninstall", "tail": " — revierte cualquiera de estos cambios." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/es/docs/post-install/uninstall.json b/web/messages/es/docs/post-install/uninstall.json index 1b4defdc..52d2dfe4 100644 --- a/web/messages/es/docs/post-install/uninstall.json +++ b/web/messages/es/docs/post-install/uninstall.json @@ -1,12 +1,12 @@ { "meta": { - "title": "Uninstall Optimizations | ProxMenux Documentation", + "title": "Desinstalar optimizaciones | Documentación de ProxMenux", "description": "Restaura los cambios reversibles de post-instalación aplicados por ProxMenux. Las herramientas registradas usan desinstaladores específicos que conservan el estado anterior del host cuando es posible." }, "header": { - "title": "Uninstall Optimizations", + "title": "Desinstalar optimizaciones", "description": "Restaura los cambios reversibles realizados por los scripts de post-instalación Automatizado o Personalizable. ProxMenux registra cada optimización compatible con su función de restauración; las actualizaciones de paquetes quedan excluidas deliberadamente.", - "section": "Settings post-install Proxmox" + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Por qué existe", @@ -14,8 +14,8 @@ }, "openMenu": { "heading": "Cómo abrirlo", - "body": "Desde el menú principal de ProxMenux, Settings post-install Proxmox → Uninstall optimizations. Verás un checklist de optimizaciones actualmente aplicadas — los items que no has aplicado no aparecen.", - "imageAlt": "Checklist de Uninstall Optimizations mostrando los items actualmente aplicados en el host, con checkboxes para seleccionar cuáles revertir" + "body": "Desde el menú principal, abre Configuración post-instalación de Proxmox → Desinstalar optimizaciones. Verás una lista de optimizaciones actualmente aplicadas; las no aplicadas no aparecen.", + "imageAlt": "Lista de Desinstalar optimizaciones con las opciones activas del host y casillas para elegir cuáles revertir" }, "howWorks": { "heading": "Cómo funciona la reversión", @@ -40,7 +40,7 @@ "body2": "Cada reversión registra su progreso. Los items que requieren un reinicio (VFIO, nombres de interfaz persistentes) activan un flag que dispara el prompt de reinicio al final." }, { - "title": "Prompt de reinicio al final", + "title": "Solicitud de reinicio al final", "body1": "Al terminar la reversión el menú muestra un prompt de reinicio. Los items que cambiaron parámetros del kernel, módulos del kernel o naming de red (VFIO, nombres de interfaz persistentes) sí necesitan el reinicio para surtir efecto; otros no lo necesitan, y el prompt es un valor por defecto de seguridad más que una comprobación por item." } ] @@ -53,15 +53,15 @@ "title": "Repositorios y APT", "items": [ { - "tool": "Subscription Banner Removal", + "tool": "Eliminación del aviso de suscripción", "restores": "Primero intenta restaurar los archivos de la UI desde los backups propios de ProxMenux (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* y, cuando la UI móvil está parcheada, index.html.tpl.backup.*). Solo si un backup falta o está corrupto, cae al reinstalado de pve-manager, proxmox-widget-toolkit, libjs-extjs y libpve-http-server-perl con force-confnew. También limpia las copias .js / .gz cacheadas." }, { - "tool": "APT Language Skip", - "restores": "Elimina /etc/apt/apt.conf.d/99-disable-translations. APT volverá a descargar paquetes de idioma." + "tool": "Omitir idiomas de APT", + "restores": "Elimina /etc/apt/apt.conf.d/99-disable-translations para que APT pueda descargar índices de descripciones traducidas según el resto de ajustes de idioma." }, { - "tool": "APT IPv4 Force", + "tool": "Forzar IPv4 en APT", "restores": "Elimina /etc/apt/apt.conf.d/99-force-ipv4." }, { @@ -74,16 +74,16 @@ "title": "Kernel, memoria y límites del sistema", "items": [ { - "tool": "Memory Settings", + "tool": "Ajustes de memoria", "restores": "Elimina /etc/sysctl.d/99-memory.conf y recarga sysctl." }, { - "tool": "Kernel Panic Configuration", + "tool": "Configuración de kernel panic", "restores": "Elimina /etc/sysctl.d/99-kernelpanic.conf." }, { - "tool": "System Limits Increase", - "restores": "Elimina /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf y /etc/security/limits.d/99-limits.conf. Revierte los límites PAM y DefaultLimitNOFILE de systemd, y elimina la línea ulimit -n 256000 de /root/.profile." + "tool": "Aumento de los límites del sistema", + "restores": "Elimina /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf y /etc/security/limits.d/99-limits.conf. Revierte límites PAM y DefaultLimitNOFILE de systemd. En /root/.profile solo limpia la línea antigua ulimit -n 256000; la actual ulimit -n 1048576 puede permanecer y requerir eliminación manual." }, { "tool": "Perfil de swap con ZRAM", @@ -95,7 +95,7 @@ "title": "Red", "items": [ { - "tool": "Network Optimizations", + "tool": "Optimización de la red", "restores": "Elimina /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf y 98-proxmenux-rpf.conf junto con la unit proxmenux-fwbr-tune.service, el helper /usr/local/sbin/proxmenux-fwbr-tune y la regla /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules. También elimina la línea source /etc/network/interfaces.d/* de /etc/network/interfaces. Recarga sysctl, systemd y el conjunto de reglas udev." }, { @@ -104,23 +104,23 @@ }, { "tool": "TCP BBR + TCP Fast Open", - "restores": "Elimina /etc/sysctl.d/99-tcp-bbr.conf y 99-tcp-fastopen.conf y recarga sysctl para que el kernel vuelva al control de congestión cubic y a tcp_fastopen=1." + "restores": "Elimina /etc/sysctl.d/99-kernel-bbr.conf y 99-tcp-fastopen.conf y recarga el resto de sysctl. Borrar archivos no restablece valores activos; los predeterminados como cubic y tcp_fastopen=1 vuelven al reiniciar salvo otra configuración." }, { - "tool": "Persistent Interface Names", + "tool": "Nombres de la interfaz persistentes", "restores": "Elimina solo los archivos 10-proxmenux-*.link que llevan la cabecera de ProxMenux en /etc/systemd/network/. Cualquier archivo .link provisto por otro paquete o escrito por el usuario se mantiene intacto. Los nombres de interfaz vuelven al comportamiento por defecto de systemd en el siguiente reinicio." } ] }, { - "title": "Logging", + "title": "Registro", "items": [ { - "tool": "Journald Optimization", - "restores": "Reescribe /etc/systemd/journald.conf con los valores por defecto vanilla y reinicia systemd-journald." + "tool": "Optimización de journald", + "restores": "Reescribe /etc/systemd/journald.conf con valores estándar y reinicia systemd-journald." }, { - "tool": "Logrotate Optimization", + "tool": "Optimización de logrotate", "restores": "Restaura /etc/logrotate.conf desde el archivo .bak capturado antes del cambio." }, { @@ -128,7 +128,7 @@ "restores": "Para y desactiva el servicio y el timer. Purga cron jobs, units systemd, binarios, archivos de configuración y el directorio /var/log.hdd. También desinstala el paquete apt si se instaló por esa vía." }, { - "tool": "ZFS autotrim", + "tool": "TRIM automático de ZFS", "restores": "Lee /usr/local/share/proxmenux/zfs_autotrim_pools (la lista de pools que ProxMenux realmente cambió) y ejecuta zpool set autotrim=off en cada uno. Los pools en los que tú activaste autotrim manualmente antes de ejecutar ProxMenux no se tocan." } ] @@ -137,7 +137,7 @@ "title": "Shell y apariencia", "items": [ { - "tool": "Bashrc Customization", + "tool": "Personalización de Bashrc", "restores": "Restaura /root/.bashrc desde el backup .bak. Si no existe backup, elimina el bloque PMX_CORE_BASHRC por marcadores." }, { @@ -162,28 +162,28 @@ "restores": "Elimina los módulos vfio de /etc/modules, las entradas de blacklist nouveau / radeon / nvidia, y los parámetros intel_iommu=on / amd_iommu=on / iommu=pt / pcie_acs_override de /etc/kernel/cmdline (ZFS) o GRUB. Reconstruye initramfs." }, { - "tool": "AMD CPU fixes (Ryzen/EPYC)", + "tool": "Correcciones para CPU AMD (Ryzen/EPYC)", "restores": "Elimina idle=nomwait de la cmdline del kernel (ZFS) o GRUB, y las opciones ignore_msrs / report_ignored_msrs de /etc/modprobe.d/kvm.conf." }, { - "tool": "QEMU Guest Agent (templates)", - "restores": "Lee /usr/local/share/proxmenux/guest_agent.pkg (registrado en tiempo de instalación) y hace apt purge del paquete que se instaló (qemu-guest-agent en hosts estándar, spice-vdagent cuando se usa modo Spice)." + "tool": "Agente invitado para un host Proxmox virtualizado", + "restores": "Lee /usr/local/share/proxmenux/guest_agent.pkg y purga el paquete registrado del host. El instalador elige qemu-guest-agent, open-vm-tools o virtualbox-guest-utils según el hipervisor. Si falta el registro, el desinstalador prueba esos tres paquetes. Actúa en el host Proxmox anidado, no en plantillas de huéspedes." } ] }, { - "title": "Storage", + "title": "Almacenamiento", "items": [ { - "tool": "ZFS ARC sizing", + "tool": "Ajuste del tamaño de ARC de ZFS", "restores": "Elimina /etc/modprobe.d/99-zfsarc.conf, restaura cualquier *.conf externo en conflicto que se dejó apartado en /usr/local/share/proxmenux/backups/zfs_arc/, reconstruye initramfs y ejecuta proxmox-boot-tool refresh en hosts con systemd-boot." }, { - "tool": "ZFS auto-snapshot", + "tool": "Instantáneas automáticas de ZFS", "restores": "Elimina las entradas cron que el script escribió y ofrece hacer apt purge zfs-auto-snapshot. Los datasets de snapshots existentes en los pools se dejan intactos — bórralos por separado si los quieres fuera." }, { - "tool": "vzdump speed limits", + "tool": "Límites de velocidad de vzdump", "restores": "Restaura /etc/vzdump.conf desde el .bak que creó la instalación, devolviendo bwlimit e ionice a sus valores previos a ProxMenux." } ] @@ -192,15 +192,15 @@ "title": "Servicios y extras", "items": [ { - "tool": "Time Synchronization", + "tool": "Sincronización del tiempo", "restores": "Devuelve la zona horaria a UTC (valor por defecto seguro) vía timedatectl." }, { - "tool": "Entropy Generation (haveged)", + "tool": "Generación de entropía (haveged)", "restores": "Para, desactiva y purga el paquete haveged." }, { - "tool": "kexec (fast reboots)", + "tool": "kexec (reinicios rápidos)", "restores": "Desactiva kexec-pve.service, elimina el archivo de unit y el alias reboot-quick de /root/.bash_profile, purga kexec-tools." }, { @@ -212,16 +212,16 @@ "restores": "Copia el gzip real desde gzip.distrib, elimina la desviación de dpkg y /bin/pigzwrapper, comenta la línea pigz en /etc/vzdump.conf y hace apt purge pigz una vez verificado gzip." }, { - "tool": "High Availability services", + "tool": "Servicios de alta disponibilidad", "restores": "Para y desactiva pve-ha-lrm, pve-ha-crm y corosync. Los grupos HA y las definiciones de recursos existentes no se eliminan — quítalos desde la UI web si ya no los necesitas." }, { - "tool": "Ceph repository", + "tool": "Repositorio Ceph", "restores": "Purga los paquetes Ceph instalados por esta opción, elimina /etc/apt/sources.list.d/ceph.sources en PVE 9 (o la lista Ceph tradicional en PVE 8) y actualiza la caché de APT." }, { - "tool": "OVH RTM (monitoring)", - "restores": "Ejecuta apt purge sobre cualquier paquete ovh-* que el instalador RTM añadió y borra los manifests puppet que dejó bajo /etc/puppet/. En hosts no-OVH nunca se instaló nada, así que no se elimina nada." + "tool": "OVH RTM (monitorización)", + "restores": "Purga paquetes que coincidan con ovh-rtm*, rtm y rtm-*, elimina /etc/rtm y borra el registro de RTM. Los restos de Puppet en /etc/puppet/ pueden requerir revisión y limpieza manual; el desinstalador no elimina ese directorio. En hosts no OVH el instalador normalmente no hace cambios." } ] } @@ -229,10 +229,10 @@ }, "edge": { "heading": "Casos límite y matices", - "packageTitle": "La reinstalación de paquetes toca paquetes vivos de Proxmox", - "packageBody": "Revertir Subscription Banner Removal reinstala pve-manager, proxmox-widget-toolkit, libjs-extjs y libpve-http-server-perl con --force-confnew. Es generalmente seguro pero sí toca la UI web en ejecución — refresca tu navegador después, y espera unos segundos de reconexión. No lo ejecutes a mitad de una migración o una operación de clonado.", + "packageTitle": "La reinstalación afecta a paquetes de Proxmox en uso", + "packageBody": "Si las copias de ProxMenux no pueden revertir Eliminación del aviso de suscripción, la alternativa reinstala pve-manager, proxmox-widget-toolkit, libjs-extjs y libpve-http-server-perl con --force-confnew. Afecta a la interfaz web en uso: recarga el navegador y espera unos segundos de reconexión. Evítalo durante migraciones o clonados.", "rebootTitle": "Los nombres persistentes y VFIO necesitan reinicio", - "rebootBody": "Eliminar los archivos 10-proxmenux-*.link propios de ProxMenux (Persistent Interface Names) y revertir IOMMU/VFIO no afectan al sistema en ejecución — solo importan tras un reinicio. ProxMenux activa el flag de reinicio automáticamente para estos.", + "rebootBody": "Eliminar los archivos 10-proxmenux-*.link de ProxMenux (Nombres de interfaz persistentes) y revertir IOMMU/VFIO no cambia el sistema ya arrancado: los cambios se aplican tras reiniciar. ProxMenux marca el reinicio como necesario.", "perItemTitle": "Puedes revertir una cosa y mantener el resto", "perItemBody": "El uninstaller opera por item. Si solo quieres eliminar Log2RAM pero mantener el tuning de red y los cambios de bashrc, marca solo Log2RAM. Nada más se toca, y el registro se actualiza en consecuencia." }, @@ -240,19 +240,19 @@ "heading": "Inspeccionar el registro manualmente", "intro": "Si quieres ver qué está registrado sin abrir el menú:", "outro": "Cada entrada \"tool\": true se corresponde con algo que ProxMenux aplicó y puede revertir. Eliminar una entrada manualmente no se recomienda — usa siempre el menú, que también ejecuta la función de reversión en lugar de simplemente olvidarse del cambio.", - "reinstallTitle": "Reinstalación tras uninstall", + "reinstallTitle": "Reinstalar tras desinstalar", "reinstallBody": "Revertir una optimización no te impide volver a aplicarla más tarde. Abre el menú Post-Install de nuevo y ejecuta Automatizado o Personalizable — el registro recogerá el nuevo estado." }, "related": { "heading": "Relacionado", "items": [ { - "label": "Automated Post-Install", + "label": "Post-instalación automatizada", "href": "/docs/post-install/automated", "tail": " — vuelve a aplicar el baseline de valores por defecto sensatos." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — elige un subconjunto distinto." }, @@ -262,7 +262,7 @@ "tail": " — operación distinta: elimina el propio ProxMenux, no sus optimizaciones aplicadas." }, { - "label": "Resumen de Post-Install", + "label": "Resumen de post-instalación", "href": "/docs/post-install", "tail": "." } diff --git a/web/messages/es/docs/post-install/updates.json b/web/messages/es/docs/post-install/updates.json index 3b0b1618..1720b8be 100644 --- a/web/messages/es/docs/post-install/updates.json +++ b/web/messages/es/docs/post-install/updates.json @@ -1,12 +1,12 @@ { "meta": { - "title": "Apply Available Updates — Optimizaciones post-instalación | ProxMenux Documentation", - "description": "Cómo ProxMenux detecta cuándo una optimización post-instalación (Log2Ram, Memory Settings, System Limits, Logrotate, tuning de red…) se ha actualizado upstream, y cómo aplicar la nueva versión — desde el menú Post-Install o desde el panel del Monitor." + "title": "Aplicar actualizaciones disponibles — Optimizaciones post-instalación | Documentación de ProxMenux", + "description": "Cómo ProxMenux detecta las nuevas versiones de optimizaciones post-instalación (Log2Ram, ajustes de memoria, límites del sistema, Logrotate, red…) y cómo aplicarlas desde el menú post-instalación o el panel de Monitor." }, "header": { - "title": "Apply Available Updates", + "title": "Aplicar actualizaciones disponibles", "description": "Cuando una optimización post-instalación (Log2Ram, Memory Settings, System Limits, Logrotate…) tiene en disco una versión más nueva que la registrada actualmente en el host, ProxMenux la muestra como una actualización disponible. Puedes aplicarla desde el menú Post-Install (lado Scripts) o desde el panel del Monitor — ambas rutas vuelven a ejecutar la misma función post-instalación y refrescan el registro.", - "section": "Settings post-install Proxmox" + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué es esto", @@ -14,7 +14,7 @@ }, "why": { "heading": "Por qué existe", - "body": "Las optimizaciones post-instalación reciben mejoras de vez en cuando — un mejor tuning de sysctl, un límite de Logrotate más estricto, una nueva heurística de tamaño de Log2RAM, un fix para un caso límite reportado por un tester. Sin una ruta de actualización el operador solo tenía dos opciones: volver a ejecutar manualmente el script post-instalación (lo que reaplica cada optimización) o saltarse la mejora por completo. Apply Available Updates es el término medio: una re-ejecución opt-in por optimización que sube solo las versiones que realmente se han movido." + "body": "Las optimizaciones post-instalación reciben mejoras: ajustes de sysctl, límites Logrotate más estrictos, nuevas reglas para dimensionar Log2RAM o correcciones de casos límite. Sin esta vía había que repetir el script, que reaplica todas las optimizaciones, o renunciar a la mejora. Aplicar actualizaciones disponibles permite elegir individualmente solo las optimizaciones cuya versión ha cambiado." }, "detection": { "heading": "Cómo se detectan las actualizaciones", @@ -33,24 +33,24 @@ }, { "title": "Una notificación por versión nueva", - "body": "Cuando al menos una optimización tiene una actualización pendiente, el Monitor emite una única notificación agrupada — por ejemplo \"4 ProxMenux optimization update(s) available\" — con una línea por herramienta en el mismo formato name (vX → vY) que se usa para las actualizaciones de paquetes de Proxmox. La notificación es anti-cascada para que no se repita día tras día con el mismo conjunto; solo una versión nueva (o una herramienta nueva que entra en la lista) la vuelve a disparar." + "body": "Cuando hay al menos una actualización pendiente, Monitor envía una única notificación agrupada, por ejemplo «4 actualizaciones de optimizaciones de ProxMenux disponibles», con una línea por herramienta en formato name (vX → vY), igual que para los paquetes Proxmox. Evita repeticiones diarias del mismo conjunto: solo una versión nueva o una nueva herramienta en la lista vuelve a activarla." } ] }, "pathA": { - "heading": "Ruta A — Desde el menú Post-Install", - "intro": "Desde el menú principal de ProxMenux, abre Settings post-install Proxmox. Cuando hay actualizaciones pendientes, una entrada nueva Apply available updates (N) aparece justo encima de Uninstall optimizations. El número refleja cuántas optimizaciones tienen una versión más nueva en disco que la que el host tiene registrada actualmente. Cuando todo está al día la entrada simplemente no aparece, así el menú se mantiene limpio.", - "menuAlt": "Menú de Post-Install Scripts mostrando la entrada condicional 'Apply available updates (N)' posicionada justo encima de 'Uninstall optimizations', con el contador indicando cuántas optimizaciones tienen una versión más nueva en disco", - "menuCaption": "La entrada Apply available updates (N) solo se renderiza cuando al menos una optimización tiene una actualización pendiente — se oculta cuando el host está al día.", + "heading": "Ruta A — Desde el menú post-instalación", + "intro": "Desde el menú principal de ProxMenux, abre Configuración post instalación de Proxmox. Si hay actualizaciones pendientes, aparece Aplicar actualizaciones disponibles (N) justo encima de Desinstalar optimizaciones. El número indica cuántas optimizaciones tienen una versión en disco más reciente que la registrada. Si todo está al día, la entrada se oculta.", + "menuAlt": "Menú de scripts post-instalación con la entrada condicional Aplicar actualizaciones disponibles (N) encima de Desinstalar optimizaciones; el contador indica cuántas optimizaciones tienen una versión más nueva en disco", + "menuCaption": "La entrada Aplicar actualizaciones disponibles (N) solo aparece cuando al menos una optimización tiene una actualización pendiente; se oculta si el host está al día.", "checklistBody": "Seleccionar la entrada abre un checklist con cada actualización pendiente, cada fila formateada como name (vX → vY). Todas las filas están pre-marcadas por defecto; desmarca las que no quieras aplicar esta ronda.", - "checklistAlt": "Diálogo checklist Apply Available Updates con una fila por optimización pendiente, cada una etiquetada con el nombre de la optimización y la transición de versión (actual → disponible). Todas las filas pre-marcadas.", - "checklistCaption": "Opt-in por optimización: elige exactamente qué versiones subir. El mismo motor que alimenta Automatizado y Personalizable post-instalación se ejecuta en segundo plano para reaplicar cada función y refrescar su versión en el registro." + "checklistAlt": "Diálogo Aplicar actualizaciones disponibles con una fila por optimización pendiente, su nombre y el cambio de versión (actual → disponible). Todas las filas están seleccionadas.", + "checklistCaption": "Selección individual por optimización: elige qué versiones actualizar. El mismo motor de Automatizado y Personalizable vuelve a aplicar cada función en segundo plano y actualiza su versión en el registro." }, "pathB": { "heading": "Ruta B — Desde el panel del Monitor", - "intro": "Las mismas actualizaciones aparecen en el Monitor bajo Settings → ProxMenux Optimizations. Cuando se detectan actualizaciones pendientes la tarjeta muestra un banner \"Updates available\" con el contador y una acción Apply que abre el mismo selector por optimización.", - "imageAlt": "Tarjeta de ProxMenux Optimizations en el panel del Monitor con un banner Updates available arriba mostrando el contador de actualizaciones pendientes y un botón Apply que abre el selector por optimización", - "imageCaption": "La tarjeta Optimizations en el Monitor — cuando al menos una optimización tiene una versión más nueva en disco, el banner lo muestra sin necesidad de acceso por shell." + "intro": "Las mismas actualizaciones aparecen en Monitor, en Ajustes → Optimizaciones de ProxMenux. Si hay actualizaciones pendientes, la tarjeta muestra un contador de actualizaciones que abre el selector por optimización. Cada herramienta también ofrece su propia acción de actualización.", + "imageAlt": "Tarjeta Optimizaciones de ProxMenux en los ajustes de Monitor, con un contador de actualizaciones pendientes que abre el selector por optimización y acciones de actualización por herramienta", + "imageCaption": "La tarjeta Optimizaciones de Monitor permite acceder a las actualizaciones mediante su contador cuando hay una versión más nueva en disco, sin entrar en la shell." }, "applying": { "heading": "Qué pasa cuando aplicas", @@ -69,7 +69,7 @@ }, { "title": "Refresco del registro enviado al Monitor", - "body": "Al terminar el batch, el menú hace POST a http://127.0.0.1:8008/api/updates/post-install/scan para reconstruir /usr/local/share/proxmenux/updates_available.json. Eso hace que la tarjeta de Optimizations del Monitor y la entrada del menú de shell desaparezcan inmediatamente tras la actualización, sin esperar al siguiente escaneo programado." + "body": "Al terminar el lote, el menú envía una petición POST a http://127.0.0.1:8008/api/updates/post-install/scan para reconstruir /usr/local/share/proxmenux/updates_available.json. Tras aplicar todo lo pendiente, desaparecen el contador de actualizaciones de la tarjeta Optimizaciones y la entrada condicional de la shell, sin esperar al siguiente análisis. La tarjeta Optimizaciones sigue disponible." } ], "jqTitle": "jq es obligatorio", @@ -77,7 +77,7 @@ }, "differs": { "heading": "En qué se diferencia de las otras rutas", - "headerPath": "Ruta", + "headerPath": "Path", "headerScope": "Alcance", "headerWhen": "Cuándo tiene sentido", "rows": [ @@ -85,7 +85,7 @@ "pathLabel": "Automatizado", "pathHref": "/docs/post-install/automated", "scope": "Reaplica cada optimización del bundle.", - "when": "Host recién instalado, o re-baseline completo de un nodo totalmente gestionado." + "when": "Host recién instalado o reaplicación completa de la base de un nodo totalmente gestionado." }, { "pathLabel": "Personalizable", @@ -94,13 +94,13 @@ "when": "Selecciona qué optimizaciones están activas en el host." }, { - "pathLabel": "Apply available updates", + "pathLabel": "Aplicar actualizaciones disponibles", "pathHref": null, "scope": "Solo las optimizaciones cuya versión ha subido en disco.", "when": "Mantén las optimizaciones ya instaladas al día sin tocar el resto." }, { - "pathLabel": "Uninstall optimizations", + "pathLabel": "Desinstalar optimizaciones", "pathHref": "/docs/post-install/uninstall", "scope": "Revierte la optimización y elimina su entrada del registro.", "when": "Hacer rollback de un cambio específico." @@ -108,5 +108,5 @@ ] }, "notifTitle": "Filtro de notificación", - "notifBody": "La notificación que anuncia actualizaciones pendientes es el evento ProxMenux optimization updates available. Está activada por defecto en cada canal, se puede silenciar por canal desde Settings → Notifications, y es anti-cascada — se dispara una vez por conjunto distinto de actualizaciones pendientes, no en cada escaneo de 24h." + "notifBody": "El evento que anuncia las actualizaciones pendientes es Actualizaciones de optimizaciones de ProxMenux disponibles. Se activa por defecto en todos los canales y se puede silenciar por canal en Ajustes → Notificaciones. Evita repeticiones: se envía una vez por conjunto distinto de actualizaciones pendientes, no en cada análisis de 24 horas." } diff --git a/web/messages/es/docs/post-install/virtualization.json b/web/messages/es/docs/post-install/virtualization.json index e13450cc..bbb844c1 100644 --- a/web/messages/es/docs/post-install/virtualization.json +++ b/web/messages/es/docs/post-install/virtualization.json @@ -1,19 +1,19 @@ { "meta": { - "title": "Post-instalación: Virtualización | ProxMenux Documentation", - "description": "Opciones de virtualización en el script post-instalación Customizable de ProxMenux: auto-instalar el guest agent correcto si Proxmox corre dentro de una VM, y activar IOMMU / VFIO para que puedas pasar dispositivos PCI (GPUs, NICs, HBAs) directamente a tus propias VMs." + "title": "Post-instalación: Virtualización | Documentación de ProxMenux", + "description": "Opciones de virtualización del script post-instalación Personalizable de ProxMenux: instala automáticamente el agente invitado correcto si Proxmox se ejecuta dentro de una VM y activa IOMMU / VFIO para pasar dispositivos PCI (GPU, NIC, HBA) directamente a tus VM." }, "header": { "title": "Post-instalación: Virtualización", - "section": "Settings post-install Proxmox" + "section": "Configuración post instalación de Proxmox" }, "intro": { "title": "Qué cubre esta categoría", - "body": "Dos opciones independientes. Install relevant guest agent es una red de seguridad para cuando Proxmox mismo corre anidado dentro de otro hipervisor. Enable VFIO IOMMU support es la que le importa a la mayoría: activa las funcionalidades del kernel que necesitas para pasar una GPU, HBA o NIC directamente a una VM con rendimiento casi nativo." + "body": "Dos opciones independientes. Instalar el agente invitado correspondiente ayuda cuando el propio Proxmox se ejecuta anidado dentro de otro hipervisor. Activar soporte VFIO IOMMU es la opción que más usuarios necesitan: activa las funciones del kernel para asignar una GPU, HBA o NIC directamente a una VM con rendimiento casi nativo." }, "guestAgent": { - "heading": "Instalar guest agent relevante", - "intro": "Detecta el entorno de virtualización en el que corre el host Proxmox (usando systemd-detect-virt y dmidecode) e instala el paquete de guest-tools correspondiente para que el hipervisor exterior pueda comunicarse con Proxmox de forma limpia (shutdown elegante, sincronización de reloj, reporte de IP, etc.).", + "heading": "Instalar el agente invitado correspondiente", + "intro": "Detecta el entorno de virtualización del host Proxmox mediante systemd-detect-virt y dmidecode e instala el paquete de herramientas de invitado correspondiente para comunicarse correctamente con el hipervisor exterior: apagado ordenado, sincronización del reloj, información de IP, etc.", "headerDetected": "Host detectado", "headerPackage": "Paquete instalado", "rows": [ @@ -80,19 +80,19 @@ "rebootTitle": "Se requiere reinicio", "rebootBody": "IOMMU, los módulos VFIO y la blacklist solo surten efecto tras un reinicio + regeneración del initramfs. El script dispara update-initramfs -u -k all y el refresh del cargador de arranque, y activa el flag de \"se requiere reinicio\" para que Personalizable te lo pregunte al final.", "verifyTitle": "Verificación tras el reinicio", - "revertTitle": "Reversible desde el menú Uninstall", - "revertBody": "Uninstall Optimizations revierte todos los cambios: quita los tokens IOMMU de /etc/kernel/cmdline o GRUB, quita los módulos VFIO de /etc/modules, quita las entradas de blacklist de drivers y reconstruye el initramfs. Se requiere un reinicio para aplicar realmente la reversión." + "revertTitle": "Reversible desde el menú Desinstalar", + "revertBody": "Desinstalar optimizaciones revierte todos los cambios: elimina los parámetros IOMMU de /etc/kernel/cmdline o GRUB, quita los módulos VFIO de /etc/modules, elimina las entradas de bloqueo de controladores y reconstruye initramfs. Debes reiniciar para aplicar la reversión." }, "related": { "heading": "Relacionado", "items": [ { - "label": "Add GPU to VM (Passthrough)", + "label": "Añadir GPU a VM (Passthrough)", "href": "/docs/hardware/gpu-vm-passthrough", "tail": " — siguiente paso natural una vez IOMMU + VFIO están activos." }, { - "label": "Add Controller or NVMe to VM", + "label": "Añadir Controlador o NVMe a VM", "href": "/docs/disk-manager/add-controller-nvme-vm", "tail": " — misma infraestructura de passthrough para controladoras de almacenamiento." }, @@ -102,12 +102,12 @@ "tail": " — referencia de verificación de IOMMU." }, { - "label": "Uninstall Optimizations", + "label": "Desinstalar optimizaciones", "href": "/docs/post-install/uninstall", "tail": " — revierte IOMMU / VFIO de forma limpia." }, { - "label": "Customizable Post-Install", + "label": "Post-instalación personalizable", "href": "/docs/post-install/customizable", "tail": " — volver al menú padre." } diff --git a/web/messages/fr/docs/post-install/automated.json b/web/messages/fr/docs/post-install/automated.json new file mode 100644 index 00000000..e6f1511f --- /dev/null +++ b/web/messages/fr/docs/post-install/automated.json @@ -0,0 +1,172 @@ +{ + "meta": { + "title": "Script de post-installation automatisé | Documentation ProxMenux", + "description": "Le script de post-installation automatisé ProxMenux exécute 14 optimisations prédéfinies adaptées au matériel sur un nouvel hôte Proxmox VE. Il n’a pas de liste de fonctions à sélectionner, mais peut demander confirmation pour masquer l’avertissement d’abonnement, installer Log2RAM dans certains cas et redémarrer. Les changements réversibles sont enregistrés.", + "ogTitle": "Script de post-installation automatisé | Documentation ProxMenux", + "ogDescription": "14 optimisations prédéfinies adaptées au matériel pour un nouvel hôte Proxmox VE, avec confirmation de certaines actions et suivi des changements réversibles." + }, + "header": { + "title": "Script de post-installation automatisé", + "description": "ProxMenux exécute 14 optimisations de base prédéfinies sans liste de fonctions à sélectionner. Certaines actions demandent confirmation. Les changements réversibles sont enregistrés pour Désinstaller les optimisations ; les mises à niveau de paquets ne sont pas présentées comme réversibles.", + "section": "Post-installation · Automatisée" + }, + "intro": { + "title": "Quand choisir Automatisé", + "body": "Exécutez-le sur un hôte Proxmox fraîchement installé pour obtenir une configuration de base raisonnable sans choisir chaque fonction. Le script est idempotent : une deuxième exécution réapplique les mêmes paramètres. Les fonctions optionnelles (Fastfetch, IOMMU, dépôt Ceph, HA, correctifs AMD…) ne font volontairement pas partie de ce parcours ; choisissez-les dans Personnalisable au besoin." + }, + "applies": { + "heading": "Ce que le script applique", + "intro": "Les optimisations sont appliquées dans cet ordre exact. La colonne Catégorie permet de consulter la documentation détaillée de chaque changement dans la référence personnalisable.", + "headerNum": "#", + "headerTool": "Outil", + "headerWhat": "Ce qu'il fait", + "headerCategory": "Catégorie" + }, + "optimizations": [ + { + "tool": "Dépôts APT + mise à jour complète", + "what": "Désactive les dépôts Enterprise pve-enterprise.sources et ceph.sources, crée une source sans abonnement pour le nom de code Debian de l’hôte, puis lance apt update && apt full-upgrade -y (commande officielle de mise à niveau Proxmox).", + "category": "Paramètres de base", + "categorySlug": "basic-settings" + }, + { + "tool": "Suppression de la bannière d'abonnement", + "what": "Modifie l’interface web pour masquer l’avertissement « Aucun abonnement valide ». Demande confirmation avant application ; réversible via Désinstaller les optimisations.", + "category": "Personnalisation", + "categorySlug": "customization" + }, + { + "tool": "Forcer IPv4", + "what": "Écrit /etc/apt/apt.conf.d/99-force-ipv4 pour que apt utilise uniquement IPv4 et contourne les liaisons IPv6 instables vers les miroirs.", + "category": "Réseau", + "categorySlug": "network" + }, + { + "tool": "Sauter les paquets de langue", + "what": "Écrit /etc/apt/apt.conf.d/99-disable-translations pour ne plus télécharger les index de descriptions de paquets traduites et réduire les données des mises à jour apt.", + "category": "Paramètres de base", + "categorySlug": "basic-settings" + }, + { + "tool": "Augmentation des limites du système", + "what": "Augmente le nombre de surveillances inotify, les limites nofile/nproc, celles du trousseau du noyau et fs.file-max via sysctl.d, limits.d, pam et systemd, pour les hôtes avec de nombreux conteneurs.", + "category": "Système", + "categorySlug": "system" + }, + { + "tool": "Réglage de la mémoire", + "what": "Définit vm.swappiness=10, des ratios équilibrés de pages modifiées non écrites, vm.max_map_count=262144 et la proactivité du compactage si disponible. La politique de surallocation mémoire du noyau reste celle de Proxmox par défaut.", + "category": "Système", + "categorySlug": "system" + }, + { + "tool": "Comportement en cas de panique du noyau", + "what": "Configure l’hôte pour redémarrer 10 secondes après un panic / oops / hardlockup au lieu de rester bloqué indéfiniment.", + "category": "Système", + "categorySlug": "system" + }, + { + "tool": "Réglage de la pile réseau", + "what": "Taille des tampons TCP, durcissement IPv4 (redirections désactivées, rp_filter=2, journalisation martian désactivée), ports locaux 1024-65535, détection MTU TCP, RFC 1337 et script /usr/local/sbin/proxmenux-fwbr-tune lié à une unité systemd à exécution unique et une règle udev. Ainsi, rp_filter=0 / log_martians=0 sont réappliqués aux interfaces fwbr*/fwln*/fwpr*/tap* à chaque recréation par Proxmox au démarrage/arrêt des VM, au redémarrage ou à la migration à chaud.", + "category": "Réseau", + "categorySlug": "network" + }, + { + "tool": "Personnalisation du bashrc (root)", + "what": "PS1 coloré, alias courants (l/la/ll/ls/grep), historique horodaté et chargement de bash-completion, dans un bloc délimité PMX_CORE_BASHRC facile à retirer.", + "category": "Personnalisation", + "categorySlug": "customization" + }, + { + "tool": "Log2RAM (adapté aux SSD, automatique)", + "what": "Réduit l’usure SSD/NVMe en déplaçant /var/log dans un disque RAM tmpfs synchronisé régulièrement vers le disque. Installation depuis le projet amont si le disque racine est SSD ou NVMe. Taille selon la RAM de l’hôte (128M / 256M / 512M), synchronisation périodique et protection automatique qui purge les anciens journaux à 80% et tronque les journaux très actifs à 92% avant écriture. Adapte les limites journald au disque RAM. Détails dans Log2RAM.", + "category": "Stockage", + "categorySlug": "storage" + }, + { + "tool": "ZFS autotrim (SSD seulement)", + "what": "Active zpool autotrim=on sur chaque pool ZFS dont tous les vdevs sont des SSD ou NVMe compatibles TRIM, après vérification de /sys/block/[dev]/queue/rotational et discard_granularity. Les pools sur HDD sont ignorés. Seuls les pools effectivement modifiés par ProxMenux sont mémorisés pour la désinstallation ; ceux sur lesquels vous avez activé autotrim manuellement restent inchangés.", + "category": "Stockage", + "categorySlug": "storage" + }, + { + "tool": "Limites de taille de journald", + "what": "Force le stockage persistant, limite SystemMaxUse=64M / RuntimeMaxUse=60M, active la compression et les journaux de niveau info requis par Monitor. Ignoré si Log2RAM est actif, car il effectue son propre réglage.", + "category": "Système", + "categorySlug": "system" + }, + { + "tool": "Réglage du logrotate", + "what": "Définit globalement daily puis size 10M, conserve 7 rotations et active compression et copytruncate. Le critère de taille placé après prévaut ; les règles propres aux journaux peuvent le remplacer. Adapté à Log2RAM, mais la fréquence dépend des règles et du minuteur.", + "category": "Système", + "categorySlug": "system" + }, + { + "tool": "Noms d'interface persistants", + "what": "Écrit un /etc/systemd/network/10-proxmenux-<iface>.link par NIC physique (chacun commençant par un en-tête 'Managed by ProxMenux') qui épingle le MAC au nom courant, de sorte que les noms eth0 / enp… restent stables à travers les reboots et les nouveaux ajouts NIC.", + "category": "Réseau", + "categorySlug": "network" + } + ], + "hardwareTitle": "Valeurs par défaut adaptées au matériel", + "hardwareBody": "Le script examine le matériel avant de configurer l’hôte. Par défaut, Log2RAM s’installe uniquement si le disque racine est SSD ou NVMe ; il demande confirmation sinon. La taille du disque RAM dépend de la RAM totale (≤ 8 GB → 128M, ≤ 16 GB → 256M, '>' 16 GB → 512M). Quand Log2RAM est actif, les limites journald sont adaptées au disque RAM pour éviter de le remplir.", + "upgrade": { + "heading": "Mettre à jour les listes de paquets et le système", + "intro": "La première étape du parcours automatisé est la mise à niveau Proxmox. Pour un hôte en fonctionnement au sein de la même version majeure, Proxmox recommande :", + "after": "Cette ligne est la commande officielle des versions actuelles de Proxmox. Le script automatisé l’exécute exactement et ajoute le nettoyage des dépôts et les tâches après mise à niveau recommandés par le guide — comme l’utilitaire autonome Mise à jour du système Proxmox :", + "items": [ + "Désactive les sources Enterprise pve-enterprise.sources / ceph.sources, supprime les anciens fichiers de dépôts et crée une source sans abonnement pour le nom de code de l’hôte.", + "Exécute la mise à jour non interactive avec DEBIAN_FRONTEND=noninteractive et --force-confdef --force-confold — les fichiers de configuration que vous avez personnalisés restent les vôtres lorsque l'amont les a également modifiés.", + "Installe les paquets Proxmox essentiels s’ils manquent (zfsutils-linux, proxmox-backup-restore-image, chrony).", + "Vérification de cohérence des métadonnées LVM, apt-get autoremove -y + apt-get autoclean -y et demande de redémarrage seulement si le noyau a changé." + ], + "sameTitle": "Même mise à jour, deux points d'entrée", + "sameBody": "Le paquet automatisé et l'utilitaire autonome Proxmox System Update partagent les mêmes scripts sous-jacents (update-pve8.sh / update-pve9_2.sh). Utilisez l'utilitaire seul quand vous voulez seulement mettre à niveau l'hôte sans appliquer le reste des optimisations." + }, + "endResult": { + "heading": "Résultat final escompté", + "body": "À la fin, un message de réussite et les sorties de chaque étape s’affichent, avec une demande de redémarrage pour les paramètres du noyau qui en ont besoin. Vous pouvez le reporter ; ces paramètres s’appliqueront au prochain démarrage.", + "imageAlt": "script automatisé post-installation — sortie finale du terminal montrant chaque optimisation appliquée avec succès" + }, + "notDoes": { + "heading": "Ce que ce script ne fait PAS", + "items": [ + "Détection automatique par fuseau horaire (commenté en amont; utiliser Personnalisable si vous le souhaitez).", + "Désactiver portmapper / rpcbind (voir Sécurité).", + "Activer IOMMU / VFIO (voir Virtualisation).", + "Installer Fastfetch / Figurine / le dépôt Ceph / HA / les correctifs CPU AMD (voir Options).", + "Installer pigz ou ajuster ZFS ARC (voir Performances / Stockage)." + ] + }, + "xshokTitle": "détection xshok-proxmox", + "xshokBody": "Si l'hôte a déjà lancé le script xshok-proxmox, ProxMenux détecte le fichier marqueur et vous avertit avant de continuer. Certains changements peuvent se chevaucher. Le script compagnon est déprécié — si vous décidez de continuer de toute façon, consultez la vue d'ensemble pour le contexte.", + "revert": { + "heading": "Annuler les changements", + "body": "Chaque outil du tableau est enregistré dans /usr/local/share/proxmenux/installed_tools.json. Ouvrez Désinstaller les optimisations pour choisir les éléments à rétablir. Les sauvegardes des fichiers modifiés se trouvent à côté des originaux avec le suffixe .bak." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— choisissez exactement ce que vous voulez dans le même catalogue." + }, + { + "label": "Désinstaller les optimisations", + "href": "/docs/post-install/uninstall", + "tail": "— de revenir sur tout sous-ensemble de ce qui a été appliqué ici." + }, + { + "label": "Commandes système utiles", + "href": "/docs/help-info/system-commands", + "tail": "— vérifier les changements (uptime, free, journalctl, etc.)." + }, + { + "label": "Aperçu après l'installation", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/basic-settings.json b/web/messages/fr/docs/post-install/basic-settings.json new file mode 100644 index 00000000..135ec717 --- /dev/null +++ b/web/messages/fr/docs/post-install/basic-settings.json @@ -0,0 +1,240 @@ +{ + "meta": { + "title": "Post-installation : Paramètres de base | Documentation ProxMenux", + "description": "Options de base après installation : passer aux dépôts Proxmox sans abonnement et mettre à niveau le système, détecter le fuseau horaire et activer NTP, ignorer les traductions APT et choisir parmi 25 utilitaires courants à installer." + }, + "header": { + "title": "Post-Install: Paramètres de base", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que cette catégorie couvre", + "body": "Cinq options de base pour un hôte Proxmox neuf : passer aux dépôts communautaires sans abonnement, mettre à niveau tout le système, configurer automatiquement le fuseau horaire et NTP, supprimer les traductions APT pour économiser bande passante et espace disque et choisir parmi 25 utilitaires courants." + }, + "upgrade": { + "heading": "Mettre à jour les listes de paquets et le système", + "intro": "Reconfigure APT pour utiliser le dépôt gratuit pve-no-subscription (au lieu de la repo d'entreprise qui nécessite un abonnement) et exécute une mise à niveau complète du système. Les étapes exactes dépendent de la version majeure de Proxmox VE : ProxMenux la détecte et envoie vers le bon script.", + "headerVersion": "Version PVE", + "headerScript": "Script de sélection par version", + "headerCodename": "Nom de code Debian", + "rows": [ + { + "version": "9.x", + "script": "update-pve9_2.sh", + "codename": "trixie" + }, + { + "version": "8.x", + "script": "update-pve8.sh", + "codename": "bookworm" + } + ], + "officialTitle": "La recommandation officielle de Proxmox", + "officialBody": "Le guide de mise à niveau de Proxmox est à exécuter, dans cet ordre exact:", + "officialOutro": "C’est la commande habituelle pour les mises à jour au sein de la version majeure installée de Proxmox VE. Vérifiez les dépôts et les changements de paquets proposés avant de continuer. Un changement de version majeure exige la procédure officielle de migration.", + "doesTitle": "Ce que fait l'option ProxMenux — vérifié par rapport au script", + "doesIntro": "La mise à jour ProxMenux exécute les commandes apt ci-dessus et ajoute des étapes avant et après que vous devriez autrement gérer manuellement. Les éléments suivants correspondent au script de sélection ; voir Mise à jour du système Proxmox pour le détail complet.", + "doesItems": [ + "D’abord, nettoyer les dépôts. Désactive les dépôts Enterprise pve-enterprise.sources / ceph.sources, supprime les anciens fichiers de dépôt laissés par les versions précédentes de PVE et écrit un fichier proxmox.sources propre pointant vers le canal gratuit pve-no-subscription, adapté au nom de code Debian de l’hôte : trixie pour PVE 9, bookworm pour PVE 8.", + "Réécrit les dépôts Debian avec main / updates / security et non-free-firmware, pour éliminer l’avertissement du firmware pendant la mise à niveau.", + "Exécute la mise à niveau officielle. apt-get update suivi de apt full-upgrade -y (PVE 9) ou apt dist-upgrade -y (PVE 8), sans interaction avec --force-confdef --force-confold pour conserver vos fichiers de configuration personnalisés.", + "Installe les paquets essentiels s'ils manquent: zfsutils-linux, proxmox-backup-restore-image, chrony.", + "Vérifie les métadonnées LVM. Recherche les VM avec accès direct aux disques qui ont pu laisser d’anciens en-têtes de volumes physiques sur les disques bruts. Signale les anomalies sans correction automatique.", + "Nettoye ensuite : apt-get autoremove -y + apt-get autoclean -y, puis demande un redémarrage si le noyau a été mis à jour ou si /var/run/reboot-required est présent." + ], + "shortTitle": "Bref", + "shortBody": "L’option exécute apt update && apt full-upgrade -y comme recommandé par Proxmox, avec le nettoyage des dépôts et les étapes finales mentionnés dans le guide officiel, puis propose un redémarrage. Voir Mise à jour du système Proxmox pour le diagramme complet ; le même outil est disponible seul dans le menu principal.", + "subTitle": "Ne pas appliquer à un hôte avec abonnement", + "subBody": "Si vous avez un abonnement Proxmox et souhaitez garder les dépôts Enterprise, ignorez cette option. Elle désactive Enterprise et passe au canal communautaire. La mise à niveau des paquets et la réécriture des dépôts ne sont pas réversibles dans Désinstaller les optimisations ; reconfigurez explicitement les dépôts pour changer de canal plus tard.", + "safetyTitle": "Contrôle de sécurité après mise à jour", + "safetyBody": "Après la mise à niveau, le script cherche d’anciennes métadonnées de volume physique (PV) sur les disques. Cela peut arriver lorsqu’une VM avec accès direct écrit des en-têtes LVM sur un disque brut. Toute anomalie produit un avertissement suggérant pvs pour l’inspection. Aucune action automatique." + }, + "time": { + "heading": "Synchroniser l'heure automatiquement", + "intro": "Détecte l'IP public du serveur via dig myip.opendns.com @resolver1.opendns.com, puis interroge ipapi.co/'{'ip'}'/timezone pour rechercher le fuseau horaire IANA correspondant, et l'applique avec timedatectl set-timezone. Enfin permet NTP avec timedatectl set-ntp true.", + "depTitle": "Dépend de deux services externes", + "depBody": "La recherche repose sur OpenDNS et ipapi.co étant accessibles, et leurs réponses étant correctes. Si vous exécutez Proxmox derrière un VPN ou sur un VLAN qui s'échappe d'une autre région, le fuseau horaire détecté automatiquement peut être erroné. Dans ce cas, sautez cette option et définissez le fuseau horaire à la main:", + "revertTitle": "Réversible depuis le menu Désinstaller", + "revertBody": "Désinstaller les optimisations remet le fuseau horaire à UTC, une valeur par défaut sûre. NTP reste actif : l’horloge continue de se synchroniser et affiche UTC jusqu’au réglage manuel d’un autre fuseau." + }, + "languages": { + "heading": "ignorer le téléchargement de langues supplémentaires", + "intro": "Pendant apt update, APT peut télécharger des descriptions de paquets traduites en plus des métadonnées principales. Cette option les désactive pour économiser bande passante et espace. Avant cela, ProxMenux vérifie que les paramètres régionaux de l’hôte sont générés : lit /etc/default/locale ou /etc/environment, ajoute à /etc/locale.gen si nécessaire et lance locale-gen. Les paramètres régionaux du shell sont ainsi conservés.", + "writtenTitle": "Ce qui est écrit", + "revertTitle": "Réversible depuis le menu Désinstaller", + "revertBody": "Suppression de /etc/apt/apt.conf.d/99-disable-translations (soit manuellement soit à partir du menu Désinstaller) restaure le comportement par défaut et APT télécharge à nouveau les fichiers linguistiques." + }, + "utilities": { + "heading": "Installer les utilitaires système courants", + "intro": "Ouvre une liste groupée de 25 utilitaires sélectionnés. Choisissez et confirmez ; ProxMenux les installe via apt, vérifie le résultat et affiche un résumé final.", + "imageAlt": "Sélecteur des utilitaires ProxMenux : Espace pour sélectionner, Entrée pour confirmer", + "reuseTitle": "La même liste est réutilisée ailleurs", + "reuseBody": "Le catalogue des 25 utilitaires est défini à un seul endroit : PROXMENUX_UTILS dans scripts/global/utils-install-functions.sh. Le menu Utilitaires et outils → Utilitaires système présente la même liste pour en ajouter plus tard sans refaire la post-installation.", + "listTitle": "Ce qui est dans la liste", + "groups": [ + { + "group": "Moniteurs système", + "items": [ + { + "pkg": "htop", + "desc": "Affichage interactif des processus" + }, + { + "pkg": "btop", + "desc": "Moniteur de ressources modernes (CPU, RAM, disques, net, processus)" + }, + { + "pkg": "s-tui", + "desc": "Interface terminal pour les tests de charge CPU et la surveillance" + }, + { + "pkg": "iftop", + "desc": "Utilisation de bande passante par connexion en direct" + }, + { + "pkg": "iotop", + "desc": "E/S disque par processus" + }, + { + "pkg": "iptraf-ng", + "desc": "Moniteur IP LAN interactif" + } + ] + }, + { + "group": "Réseau", + "items": [ + { + "pkg": "iperf3", + "desc": "Mesurer la bande passante maximale réalisable entre les hôtes" + }, + { + "pkg": "net-tools", + "desc": "Anciens outils (ifconfig, netstat, route). Toujours utiles pour les vérifications rapides" + }, + { + "pkg": "ipset", + "desc": "Gérer les grands ensembles IP dans le noyau — utile avec les règles iptables/nftables." + } + ] + }, + { + "group": "Téléchargement et archive", + "items": [ + { + "pkg": "axel", + "desc": "accélérateur de téléchargement parallèle léger" + }, + { + "pkg": "aria2", + "desc": "Téléchargeur multisource / multiprotocole (HTTP, FTP, BitTorrent, Metalink)" + }, + { + "pkg": "unzip", + "desc": "Extraire les archives ZIP" + }, + { + "pkg": "zip", + "desc": "Créer des archives ZIP" + }, + { + "pkg": "cabextract", + "desc": "Extraire les archives Microsoft CAB (utile avec les ISO Windows)" + }, + { + "pkg": "wimtools", + "desc": "Manipuler les images WIM Windows (extraire, fractionner, monter, appliquer)" + }, + { + "pkg": "genisoimage", + "desc": "Construire des images ISO 9660 à partir d'un arbre de répertoires" + } + ] + }, + { + "group": "Texte et fichiers", + "items": [ + { + "pkg": "dos2unix", + "desc": "Convertir les fins de ligne CRLF (Windows) en LF (Unix)" + }, + { + "pkg": "grc", + "desc": "Coloration générique : applique une coloration syntaxique aux sorties de ping, traceroute, dig, tail, etc." + }, + { + "pkg": "plocate", + "desc": "Recherche rapide de fichiers (indexée). Exécutez `updatedb` après l'installation pour construire l'index." + } + ] + }, + { + "group": "Accès distant et sessions", + "items": [ + { + "pkg": "sshpass", + "desc": "Authentification SSH par mot de passe sans interaction (pour les scripts, pas pour l’usage quotidien)" + }, + { + "pkg": "tmux", + "desc": "Multiplexeur de terminal : détacher les sessions, diviser les panneaux et conserver les sessions après une déconnexion" + } + ] + }, + { + "group": "Matériel et bas niveau", + "items": [ + { + "pkg": "msr-tools", + "desc": "Registres spécifiques au modèle CPU de lecture/écriture (rdmsr, wrmsr)" + }, + { + "pkg": "intel-gpu-tools", + "desc": "utilitaires de diagnostic Intel GPU y compris `intel_gpu_top`" + } + ] + }, + { + "group": "Virtualisation", + "items": [ + { + "pkg": "libguestfs-tools", + "desc": "Inspecter et modifier les images de disque VM (virt-ls, virt-cat, guestmount...)" + }, + { + "pkg": "chntpw", + "desc": "Modifier Windows SAM — utile pour la récupération de mot de passe sur Windows VMs que vous héritez" + } + ] + } + ], + "actionTitle": "Quelques-uns en action", + "noBulkTitle": "Seuls les utilitaires installés par ProxMenux sont supprimés", + "noBulkBody": "ProxMenux enregistre uniquement les paquets sélectionnés qui n’étaient pas déjà installés. Désinstaller les optimisations les supprime complètement et conserve les paquets présents auparavant. Une mise à niveau APT n’a pas de retour arrière atomique sûr : désinstaller les utilitaires n’annule pas la mise à niveau du système." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Mise à jour du système Proxmox", + "href": "/docs/utils/system-update", + "tail": "— relance le cycle apt update + dist-upgrade sur demande." + }, + { + "label": "Installateur des utilitaires système", + "href": "/docs/utils/system-utils", + "tail": "— installer (ou réinstaller) les utilitaires individuellement après l'installation." + }, + { + "label": "Commandes de mises à jour et de paquets", + "href": "/docs/help-info/update-commands", + "tail": " — Référence apt pour le shell." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/customizable.json b/web/messages/fr/docs/post-install/customizable.json new file mode 100644 index 00000000..7590e504 --- /dev/null +++ b/web/messages/fr/docs/post-install/customizable.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Script post-installation personnalisable | Documentation ProxMenux", + "description": "Choisissez précisément les optimisations à appliquer à un hôte Proxmox VE avec ProxMenux. 10 catégories, environ 35 outils et une interface à cases à cocher. Inclut tout le script Automatisé, plus des options à activer explicitement (IOMMU, Fastfetch, Figurine, Ceph, HA, correctifs AMD…).", + "ogTitle": "Script post-installation personnalisable | Documentation ProxMenux", + "ogDescription": "10 catégories, environ 35 optimisations individuelles. Choisissez précisément ce que vous voulez sur un hôte Proxmox VE. Les modifications réversibles sont suivies." + }, + "header": { + "title": "Script post-installation personnalisable", + "description": "Choisissez précisément les optimisations à appliquer à un hôte Proxmox VE. ProxMenux regroupe environ 35 outils dans 10 catégories au sein d’une seule boîte de dialogue à cases à cocher. Même moteur qu’Automatisé, avec un contrôle complet.", + "section": "Post-Installation · Personnalisable" + }, + "intro": { + "title": "Quand choisir Personnalisable", + "body": "Choisissez cette voie si vous connaissez déjà les réglages souhaités ou à éviter. Une liste à cases à cocher, groupée par catégorie, permet de sélectionner, désélectionner et combiner les optimisations. Vous pouvez les réappliquer plus tard ; les modifications réversibles sont suivies pour Désinstaller les optimisations. Les mises à niveau de paquets ne sont pas présentées comme réversibles." + }, + "compare": { + "heading": "Comment il se compare à Automatisé", + "body": "Personnalisable inclut tout le script Automatisé : les mêmes 14 optimisations de base et de nombreuses options volontairement omises par Automatisé, utiles à certains matériels (correctifs AMD), hébergeurs (OVH RTM) ou usages (IOMMU/VFIO, dépôt Ceph, haute disponibilité, Fastfetch, Figurine, réglage de l’ARC ZFS, pigz, instantanés ZFS automatiques, limites de vitesse vzdump, Open vSwitch, TCP BBR…)." + }, + "categoriesSection": { + "heading": "Les 10 catégories", + "body": "Le script Personnalisable regroupe les optimisations en 10 catégories dans une seule boîte de dialogue à cases à cocher. Chaque catégorie a sa propre page de documentation : ouvrez une carte pour consulter la justification, les valeurs par défaut et les vérifications de chaque option." + }, + "categories": [ + { + "name": "Paramètres de base", + "description": "Nettoyer les sources APT, lancer la mise à niveau officielle Proxmox et définir le fuseau horaire, les paramètres régionaux et les utilitaires courants. La base de toutes les autres catégories." + }, + { + "name": "Système", + "description": "Règle la journalisation et les limites du noyau pour un hôte hébergeant de nombreuses VM et conteneurs. Couvre journald, logrotate, sysctl (mémoire, limites de fichiers), le comportement en cas de kernel panic et les redémarrages rapides." + }, + { + "name": "Virtualisation", + "description": "Prépare l’hôte à la virtualisation avancée. Installe l’agent invité adapté lorsque Proxmox lui-même fonctionne dans une VM prise en charge et active IOMMU/VFIO pour l’accès direct PCI des GPU, contrôleurs et TPU." + }, + { + "name": "Réseau", + "description": "Renforce et règle la pile réseau de l’hôte. Force APT sur IPv4, applique des réglages de sécurité sysctl et des tampons TCP, propose Open vSwitch, TCP BBR et TCP Fast Open et associe les noms d’interface persistants aux adresses MAC." + }, + { + "name": "Stockage", + "description": "Configure les sous-systèmes de stockage courants de Proxmox : taille de l’ARC ZFS, instantanés ZFS automatiques, autotrim ZFS pour les pools SSD/NVMe et limites de vitesse vzdump pour éviter de saturer les disques pendant les sauvegardes." + }, + { + "name": "Sécurité", + "description": "Réduit la surface d’attaque exposée par défaut. Désactive les services RPC portmapper/rpcbind dont Proxmox n’a pas besoin mais qu’il laisse en écoute." + }, + { + "name": "Personnalisation", + "description": "Changer l'expérience visuelle et shell de l'hôte: couleurs et alias dans bashrc, bannière MOTD et suppression de l'avis d'abonnement dans l'interface utilisateur web." + }, + { + "name": "Surveillance", + "description": "Intègre l’hôte à OVH Real-Time Monitoring. Installe RTM uniquement si ProxMenux détecte un serveur OVH ; l’option ne modifie rien sur les autres hôtes." + }, + { + "name": "Performances", + "description": "Accélère la compression (sauvegardes, transferts) en remplaçant gzip par son équivalent parallèle pigz." + }, + { + "name": "Facultatif", + "description": "Options spécialisées dont tous les hôtes n’ont pas besoin : correctifs CPU AMD, bannière Fastfetch, nom d’hôte 3D Figurine, actualisation de l’index PVE Appliance Manager, dépôt Ceph, services haute disponibilité, Log2RAM pour limiter l’usure des SSD et profil de swap ZRAM." + } + ], + "mixTip": { + "title": "Combiner Automatisé et Personnalisable", + "body": "Un usage courant : commencez par Automatisé pour établir une base raisonnable, puis ouvrez Personnalisable et choisissez seulement les options utiles, comme IOMMU pour l’accès direct à un GPU. Les modifications sont suivies séparément ; Désinstaller affiche tout ce qui a été appliqué, quelle que soit la voie utilisée." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Post-installation automatisée", + "href": "/docs/post-install/automated", + "tail": " — valeurs par défaut raisonnables appliquées sans question." + }, + { + "label": "Désinstaller les optimisations", + "href": "/docs/post-install/uninstall", + "tail": " — annuler proprement les éléments sélectionnés." + }, + { + "label": "Paramètres de base", + "href": "/docs/post-install/basic-settings", + "tail": "— repos, temps, langue, utilitaires." + }, + { + "label": "Virtualisation", + "href": "/docs/post-install/virtualization", + "tail": "— IOMMU + VFIO pour transmission." + }, + { + "label": "Sécurité", + "href": "/docs/post-install/security", + "tailRich": " · Stockage · Réseau · Personnalisation — autres catégories." + }, + { + "label": "Aperçu après l'installation", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/customization.json b/web/messages/fr/docs/post-install/customization.json new file mode 100644 index 00000000..5b84af4b --- /dev/null +++ b/web/messages/fr/docs/post-install/customization.json @@ -0,0 +1,74 @@ +{ + "meta": { + "title": "Post-installation : Personnalisation | Documentation ProxMenux", + "description": "Options de personnalisation du script post-installation personnalisable de ProxMenux : invite bash colorée avec des alias utiles, bannière ProxMenux dans le MOTD et suppression du rappel d’abonnement de l’interface web Proxmox." + }, + "header": { + "title": "Après installation : personnalisation", + "description": "Réglages visuels et pratiques de l’hôte Proxmox. Ils rendent le shell plus agréable et masquent le rappel d’abonnement de l’interface web. Bashrc, MOTD et la bannière sont suivis et réversibles depuis Désinstaller.", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que cette catégorie couvre", + "body": "Trois petites options indépendantes : une invite bash colorée avec alias pour le shell root, une bannière MOTD d’une ligne à la connexion SSH et la suppression de la fenêtre « Aucun abonnement valide » affichée à chaque connexion web Proxmox." + }, + "bashrc": { + "heading": "Personnaliser bashrc", + "intro": "Insère dans /root/.bashrc un bloc préparé avec une invite colorée, un historique horodaté, les alias habituels de ls / grep et un source pour l’autocomplétion bash. Rend le travail via SSH plus agréable et permet d’identifier facilement l’hôte lorsque plusieurs onglets sont ouverts.", + "writesTitle": "Ce que ProxMenux ajoute à .bashrc", + "writesOutro": "Le bloc est délimité par les marqueurs PMX_CORE_BASHRC. Exécuter le script remplace à nouveau le bloc précédent au lieu de le dupliquer. Le .bashrc original est sauvegardé une fois sur /root/.bashrc.bak, et une ligne source /root/.bashrc est annexée au /root/.bash_profile de sorte que l'invite s'applique également sur les shells de connexion (par exemple après su -).", + "rootTitle": "S’applique uniquement à root", + "rootBody": "La personnalisation concerne le shell du compte root. Les autres utilisateurs gardent leurs propres réglages par défaut. Si vous administrez Proxmox uniquement par l’interface web sans utiliser le shell, vous pouvez ignorer cette option purement esthétique." + }, + "motd": { + "heading": "Configurer une bannière MOTD personnalisée", + "intro": "Ajoute \"This system is optimised by: ProxMenux\" au début de /etc/motd, le message après une connexion SSH réussie, au-dessus de l’invite et avant les scripts update-motd. Sans danger et purement informatif : confirme visuellement que ProxMenux a été appliqué sur l’hôte.", + "writesTitle": "Ce que ProxMenux écrit", + "writesOutro": "À la première application, ProxMenux enregistre si /etc/motd existait et conserve son contenu original sous /usr/local/share/proxmenux. L’opération est idempotente : si la ligne de repère existe déjà, rien n’est ajouté. Les anciennes installations avec /etc/motd.bak sont migrées vers le même état réversible." + }, + "banner": { + "heading": "Supprimer la bannière d'abonnement", + "intro": "Supprime la fenêtre « Vous n’avez pas d’abonnement valide pour ce serveur » affichée à chaque connexion web Proxmox sans abonnement Enterprise. ProxMenux tient compte de la version et lance le script adapté aux différents fichiers d’interface des versions majeures.", + "versionTitle": "Choix du script selon la version", + "versionItems": [ + "PVE 9.x → exécute remove-banner-pve-v3.sh, qui modifie proxmoxlib.js pour le bureau et la nouvelle interface mobile basée sur Yew.", + "PVE 8.x → exécute remove-banner-pve8.sh, uniquement pour l’interface de bureau." + ], + "versionOutro": "Avant le patching, ProxMenux sauvegarde les fichiers JS/template originaux vers /usr/local/share/proxmenux/backups/ avec un horodatage. Le flux Désinstaller utilise ces sauvegardes pour restaurer les fichiers originaux, et revient à réinstaller les paquets de l'interface utilisateur Proxmox si la sauvegarde est manquante ou corrompue.", + "breakTitle": "Peut se casser après les mises à jour Proxmox", + "breakBody": "Les mises à jour de l’interface Proxmox écrasent régulièrement proxmoxlib.js, ce qui peut faire revenir le rappel. Vous pouvez réappliquer l’option pour modifier le fichier ou garder le rappel jusque-là. ProxMenux installe aussi un hook APT qui réapplique la modification après les mises à niveau de paquets ; voir Désinstaller les optimisations pour sa suppression.", + "legalTitle": "Note juridique (il vaut toujours la peine de répéter)", + "legalBody": "Cette option masque seulement le rappel de l’interface. Elle ne donne pas droit au support Enterprise ni au dépôt Enterprise et ne change pas la licence du logiciel. Proxmox VE est publié sous GNU AGPLv3. Un abonnement soutient le projet et donne accès au canal de mises à jour Enterprise ; choisissez le niveau de support adapté à votre environnement." + }, + "verify": { + "heading": "Vérification", + "intro": "Après avoir appliqué les trois :", + "reversibleTitle": "Les trois changements de personnalisation sont suivis", + "reversibleBody": "Désinstaller les optimisations restaure /root/.bashrc, remet MOTD dans son état exact d’avant ProxMenux ou supprime le fichier s’il n’existait pas, et restaure les fichiers d’interface modifiés depuis la sauvegarde ou réinstalle les paquets concernés si nécessaire." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Facultatif", + "href": "/docs/post-install/optional", + "tail": "— Fastfetch et Figurine (autres personnalisations visuelles)." + }, + { + "label": "Afficher les informations sur la version", + "href": "/docs/settings/show-version-information", + "tail": "— confirme que les personnalisations sont suivies comme installées." + }, + { + "label": "Désinstaller les optimisations", + "href": "/docs/post-install/uninstall", + "tail": " — restaurer bashrc, motd et le rappel d’abonnement." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/index.json b/web/messages/fr/docs/post-install/index.json new file mode 100644 index 00000000..937e0797 --- /dev/null +++ b/web/messages/fr/docs/post-install/index.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Script post-installation de Proxmox VE — Automatisé et personnalisable | ProxMenux", + "description": "Présentation des scripts post-installation de ProxMenux pour Proxmox VE. Le script Automatisé applique des valeurs par défaut raisonnables sans question ; le script Personnalisable permet de choisir précisément parmi 10 catégories ; Désinstaller les optimisations restaure les modifications réversibles prises en charge.", + "ogTitle": "Proxmox VE Script post-installation — automatisé et personnalisable", + "ogDescription": "Appliquez les optimisations courantes après installation de Proxmox VE dans 10 catégories, automatiquement ou à la carte, avec des options réversibles.", + "twitterTitle": "Script post-installation de Proxmox VE | ProxMenux", + "twitterDescription": "Optimisations automatisées et personnalisables post-installation pour Proxmox VE — avec options réversibles." + }, + "header": { + "title": "Scripts post-installation", + "description": "Configurez un hôte Proxmox VE fraîchement installé avec les optimisations post-installation de ProxMenux. Appliquez automatiquement la configuration de base, choisissez des options individuelles, mettez à jour les fonctions installées ou restaurez les modifications réversibles prises en charge. Les mises à niveau de paquets ne sont pas présentées comme réversibles.", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "À quoi sert ce menu", + "body": "Après l’installation de Proxmox VE, des dizaines de petites modifications rendent l’hôte plus rapide et plus facile à entretenir : dépôts sans abonnement, limites journald raisonnables, tampons TCP adaptés, stockage des journaux ménageant les SSD, améliorations de bashrc et plus encore. ProxMenux les automatise et suit les modifications de configuration réversibles prises en charge." + }, + "openingMenu": { + "heading": "Ouverture du menu", + "body": "Dans le menu principal de ProxMenux, sélectionnez Paramètres après l'installation Proxmox. Vous verrez ceci :", + "imageAlt": "Menu des scripts post-installation : Automatisé, Personnalisable, l’entrée conditionnelle Appliquer les mises à jour disponibles (uniquement si des mises à jour sont en attente) et Désinstaller, suivis de la section Scripts communautaires" + }, + "threeWays": { + "heading": "Quatre façons d'appliquer les optimisations", + "body": "Les quatre entrées ProxMenux partagent le même code et le même registre d’outils installés, mais offrent différents niveaux de contrôle. Appliquer les mises à jour disponibles n’apparaît que si la version sur disque d’au moins une optimisation installée est plus récente que la version enregistrée ; l’entrée reste masquée juste après la configuration de l’hôte." + }, + "routes": [ + { + "title": "Automatisé", + "description": "Une sélection de 14 optimisations sûres et toujours utiles, appliquées successivement sans question. Un bon choix par défaut pour la plupart des utilisateurs.", + "bullets": [ + "Dépôts sans abonnement + mise à niveau du système", + "Mémoire, noyau, réglage réseau", + "Log2RAM (détecté automatiquement sur SSD/NVMe)", + "Limites de taille pour journald + logrotate", + "Noms d'interface persistants" + ] + }, + { + "title": "Personnalisable", + "description": "Environ 35 optimisations individuelles dans 10 catégories. Vous choisissez précisément lesquelles appliquer. Même moteur qu’Automatisé, avec un contrôle complet.", + "bullets": [ + "Interface à cases à cocher par catégorie", + "Inclut tout ce que fait Automatisé, plus des options à activer explicitement (IOMMU, Fastfetch, Figurine, Ceph, HA, correctifs AMD…)", + "Exécutez-le autant de fois que voulu : les modifications sont idempotentes" + ] + }, + { + "title": "Appliquer les mises à jour disponibles", + "description": "Si une optimisation post-installation (Log2Ram, paramètres de mémoire, Logrotate…) a une version sur disque plus récente que celle enregistrée sur l’hôte, cette entrée affiche uniquement les optimisations concernées. Elle relance leur fonction et actualise le registre, sans rien toucher d’autre.", + "bullets": [ + "Activation individuelle par optimisation, uniquement celles modifiées", + "Même sélecteur disponible dans le tableau de bord Monitor", + "Une seule notification groupée lorsque de nouvelles mises à jour sont disponibles" + ] + }, + { + "title": "Désinstaller les optimisations", + "description": "Les modifications réversibles prises en charge sont suivies dans un registre JSON et associées à une fonction de restauration. Les actions sans retour en arrière sûr, comme une mise à niveau complète des paquets, sont volontairement exclues.", + "bullets": [ + "Détecte automatiquement les optimisations précédemment appliquées", + "Choisit le retour adapté à chaque élément : restaurer une sauvegarde .bak si elle existe, supprimer le fragment de configuration sysctl.d si rien ne nécessitait de sauvegarde, ou réinstaller le paquet d’origine avec --force-confnew (par exemple pour la bannière d’abonnement)", + "Demande de redémarrage si nécessaire (VFIO, noms persistants, etc.)" + ] + } + ], + "whichTitle": "Lequel choisir ?", + "whichBody": "Pour une nouvelle installation de Proxmox avec une configuration de base raisonnable sans décisions à prendre : Automatisé. Si vous connaissez déjà les réglages souhaités ou à éviter : Personnalisable. Pour ne mettre à jour qu’une optimisation déjà appliquée dont une version plus récente est sur disque : Appliquer les mises à jour disponibles. Pour annuler proprement une modification précédente : Désinstaller les optimisations. Vous pouvez combiner ces modes : commencez par Automatisé, ajoutez Fastfetch ou IOMMU avec Personnalisable, puis annulez des éléments individuels plus tard.", + "mixing": { + "heading": "Mélange avec d'autres scripts post-installation", + "stackTitle": "Ne pas empiler plusieurs scripts post-installation", + "stackBody": "Exécuter plusieurs scripts post-installation sur le même hôte peut créer des fichiers de configuration en double, des entrées sysctl contradictoires ou même casser le réseau après redémarrage. Si vous avez déjà appliqué Helper-Scripts Post Install, certaines optimisations ProxMenux peuvent recouper sa configuration. Utilisez un seul outil post-installation par hôte.", + "xshokTitle": "xshok-proxmox: déprécié", + "xshokBody": "Les anciennes versions de ProxMenux présentaient xshok-proxmox comme outil post-installation complémentaire. Ce projet est désormais obsolète et n’est plus proposé dans ProxMenux. Si une ancienne exécution a laissé des marqueurs sur l’hôte, ProxMenux les détecte toujours et vous avertit. Ce n’est toutefois plus un outil à installer aux côtés de ProxMenux." + }, + "community": { + "heading": "Scripts communautaires", + "body": "Le menu propose aussi deux scripts tiers du projet community-scripts : Proxmox VE Post Install et Proxmox VE Microcode. Ces enveloppes téléchargent et exécutent les scripts originaux via wget | bash. ProxMenux ne les maintient pas. Consultez Dépôts externes pour les détails et les questions de confiance avant de les lancer." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Mise à jour du système Proxmox", + "href": "/docs/utils/system-update", + "tail": "— tient l'hôte à jour une fois qu'il a été installé." + }, + { + "label": "Sécurité", + "href": "/docs/security", + "tail": "— Fail2Ban + Lynis au-dessus du durcissement post-installation." + }, + { + "label": "Afficher les informations sur la version", + "href": "/docs/settings/show-version-information", + "tail": "— voir quels composants post-installation sont suivis comme installés." + }, + { + "label": "Commandes de mises à jour et de paquets", + "href": "/docs/help-info/update-commands", + "tail": "— référence pour apt / pveupgrade." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/monitoring.json b/web/messages/fr/docs/post-install/monitoring.json new file mode 100644 index 00000000..44fc2a5b --- /dev/null +++ b/web/messages/fr/docs/post-install/monitoring.json @@ -0,0 +1,56 @@ +{ + "meta": { + "title": "Post-installation : Surveillance | Documentation ProxMenux", + "description": "Options de surveillance dans le script de post-installation personnalisable ProxMenux. Actuellement une seule option : installer OVH Real-Time Monitoring (RTM), qui ne s'active que si l'hôte est détecté comme serveur OVH." + }, + "header": { + "title": "Après installation : surveillance", + "description": "Options de surveillance dans le script de post-installation personnalisable. Cette catégorie est petite et spécifique au fournisseur, elle installe l'agent de surveillance en temps réel OVH sur des serveurs OVH dédiés et ne fait rien ailleurs.", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Un périmètre volontairement limité", + "body": "La surveillance post-installation se limite à un agent propre à un fournisseur. Les outils généraux (Prometheus, Grafana, node_exporter) sont hors périmètre, car leurs choix d’architecture — hôte séparé, conservation des données, destinataires des alertes — dépassent une étape en un clic. ProxMenux Monitor, inclus dans ProxMenux, remplit l’essentiel de ce rôle sans agent externe." + }, + "ovh": { + "heading": "Installer la surveillance en temps réel OVH (RTM)", + "intro": "Si votre hôte Proxmox est un serveur dédié loué à partir de OVHcloud, vous pouvez permettre à RTM d'exposer la télémétrie matérielle (température CPU, statut PSU, disque SMART, état contrôleur RAID, etc.) au panneau de contrôle OVH. C'est le même agent OVH utilise pour leur propre fonction \"Surveillance du serveur\".", + "decisionsTitle": "La décision de ProxMenux", + "decisionsItems": [ + "Obtenez l'IP public de l'hôte via curl ipinfo.io/ip.", + "Examine le FAI propriétaire avec une requête whois sur v4.whois.cymru.com.", + "Si le résultat mentionne OVH, télécharge last-public-ovh-infra-yak.snap.mirrors.ovh.net/yak/archives/apply.sh et le transmet à bash avec le manifeste Puppet de RTM v2.", + "Si le résultat ne mentionne pas OVH, rien n'est installé. L'option est sans opération." + ], + "remoteTitle": "Le script distant est passé à bash", + "remoteBody": "L’installation exécute wget -qO - https://…apply.sh | bash. Si le miroir OVH est compromis, le script s’exécute en root sur votre hôte. Avant d’activer l’option, mettez en balance la confiance dans la chaîne de miroirs OVH et le bénéfice de surveillance. Pour la plupart des utilisateurs de laboratoires domestiques ou hors OVH, l’option devrait rester désactivée.", + "noOpTitle": "Activer uniquement si l'hôte est effectivement à OVH", + "noOpBody": "L'option est un non-op sur les serveurs non-OVH, donc cochez-le sur un Proxmox home-lab ne casse rien. Sur un hôte non-OVH le script imprime \"Pas un serveur OVH, sauter l'installation RTM\" et sortir proprement; aucun paquet n'est installé.", + "runsTitle": "Ce que ProxMenux exécute", + "verifyTitle": "Vérification", + "verifyBody": "Sur un véritable hôte OVH, après un redémarrage, vous devriez voir le tableau de bord RTM dans votre gestionnaire OVH peuplé de données en direct pour l'hôte. Du côté Proxmox, le capteur RTM est un service systemd — vérifiez-le directement:", + "troubleTitle": "Dépannage", + "revertTitle": "Supprimer RTM depuis le menu Désinstaller", + "revertBody": "Si RTM est enregistré comme installé, Désinstaller les optimisations propose une entrée OVH Real-Time Monitoring. Elle exécute apt-get purge -y ''ovh-rtm*'' ''rtm'' ''rtm-*'', supprime /etc/rtm et marque RTM comme désinstallé. Des éléments Puppet peuvent encore nécessiter un nettoyage manuel ; examinez les manifestes propres à RTM dans /etc/puppet/. Sur un hôte hors OVH, aucun paquet RTM n’a été installé, donc rien n’est à supprimer." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": "— tableau de bord web local pour l'hôte (travaille sur n'importe quel fournisseur, pas seulement OVH)." + }, + { + "label": "Commandes système utiles", + "href": "/docs/help-info/system-commands", + "tail": "— référence de surveillance des hôtes locaux." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/network.json b/web/messages/fr/docs/post-install/network.json new file mode 100644 index 00000000..021784c2 --- /dev/null +++ b/web/messages/fr/docs/post-install/network.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Post-installation : Réseau | Documentation ProxMenux", + "description": "Options réseau du script de post-installation personnalisable ProxMenux : forcer APT sur IPv4, appliquer un profil sysctl sélectionné, installer Open vSwitch, activer TCP BBR + Fast Open et associer les noms d’interfaces aux adresses MAC." + }, + "header": { + "title": "Post-Installation: Réseau", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que cette catégorie couvre", + "body": "Cinq options réseau indépendantes. Deux sont simples (APT sur IPv4, installation d’Open vSwitch), deux règlent le comportement TCP (profil sysctl réseau, BBR + Fast Open) et une résout un problème courant : fixer les noms d’interfaces pour qu’une nouvelle carte réseau ou une mise à jour du BIOS ne renomme pas enp3s0 en enp4s0 et ne casse pas vos ponts." + }, + "ipv4": { + "heading": "Forcer APT à utiliser IPv4", + "intro": "Écrit Acquire::ForceIPv4 \"true\"; à /etc/apt/apt.conf.d/99-force-ipv4. APT refuse alors d'utiliser IPv6 pour les téléchargements de paquets, même si l'hôte a une connectivité IPv6.", + "tipTitle": "Bénéficiaires", + "tipBody": "Utile si la connexion IPv6 est instable, plus lente qu’IPv4 ou si le miroir Debian/Proxmox échoue parfois en IPv6. Sans effet indésirable sur les hôtes sans IPv6. Sur un réseau double pile sain, le comportement devient prévisible : apt ne vous surprendra pas avec un délai d’attente IPv6 dépassé." + }, + "sysctl": { + "heading": "Appliquer les optimisations réseau", + "intro": "Écrit un profil sysctl sélectionné dans /etc/sysctl.d/99-network.conf : tampons de sockets du noyau, durcissement ICMP, protection de base contre l’usurpation d’adresse et tailles de tampons TCP adaptées à un hyperviseur avec de nombreux flux simultanés.", + "tunedTitle": "Paramètres ajustés", + "headerArea": "Domaine", + "headerSettings": "Paramètres clés", + "rows": [ + { + "area": "Tampons de sockets du noyau", + "settings": "netdev_max_backlog=8192, rmem_max=16M, wmem_max=16M, somaxconn=8192" + }, + { + "area": "durcissement ICMP", + "settings": "icmp_echo_ignore_broadcasts=1, icmp_ignore_bogus_error_responses=1" + }, + { + "area": "Sécurité du routage", + "settings": "accept_redirects=0, accept_source_route=0, secure_redirects=0, send_redirects=0, log_martians=0" + }, + { + "area": "Filtre de chemin inversé", + "settings": "rp_filter=2 (mode souple, voir la note ci-dessous)" + }, + { + "area": "TCP", + "settings": "tcp_mtu_probing=1, tcp_rfc1337=1, tcp_sack=1, tcp_rmem=8K/87K/16M, tcp_wmem=8K/64K/16M" + }, + { + "area": "Ports", + "settings": "ip_local_port_range=1024 65535 (plage de ports éphémères)" + }, + { + "area": "Sockets Unix", + "settings": "net.unix.max_dgram_qlen=4096" + } + ], + "sourceOutro": "Il ajoute également source /etc/network/interfaces.d/* à /etc/network/interfaces si ce n'est déjà présent — pratique standard pour que vous puissiez déposer des extraits d'interface modulaires sans modifier le fichier principal.", + "fwbrTitle": "Réglage automatique des ponts pare-feu virtuels", + "fwbrBody": "En plus du profil sysctl, ProxMenux installe le script auxiliaire /usr/local/sbin/proxmenux-fwbr-tune, qui applique rp_filter=0 et log_martians=0 aux interfaces fwbr* / fwln* / fwpr* / tap* créées par Proxmox pour les VM et conteneurs. L’unité à exécution unique proxmenux-fwbr-tune.service le lance au démarrage, et la règle /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules à chaque événement net add correspondant à ces préfixes. Cela couvre les interfaces recréées au démarrage ou à l’arrêt des VM, au redémarrage et à la migration à chaud. Le script traite aussi les interfaces existantes immédiatement après l’installation.", + "rpFilterTitle": "Pourquoi rp_filter=2 (souple) plutôt que 1 (strict)", + "rpFilterBody": "Le filtrage strict du chemin inverse rejette les paquets dont l’adresse source serait accessible par une interface différente. C’est une valeur par défaut adaptée aux clients, mais problématique sur un hôte Proxmox où le trafic VM arrive souvent par un pont et repart par une liaison montante avec des routes asymétriques. rp_filter=2 (souple) ne rejette que les paquets dont la source est réellement injoignable par routage. Le compromis réduit légèrement la détection de l’usurpation d’IP locale pour préserver le réseau des VM." + }, + "ovs": { + "heading": "Installer Open vSwitch", + "intro": "Installe openvswitch-switch + openvswitch-common. Ces paquets ajoutent OVS comme alternative aux ponts Linux utilisés par défaut par Proxmox. L’installation seule ne modifie pas le réseau : les ponts vmbrX existants continuent de fonctionner. Lorsque vous créez un nouveau pont dans Proxmox, OVS devient disponible dans la liste des types.", + "tipTitle": "Quand OVS a du sens", + "tipBody": "Envisagez OVS pour des trunks VLAN avec des ID non contigus, LACP avec LLDP dans certains modes, la programmation fine des flux (OpenFlow) ou l’interopérabilité avec les contrôleurs SDN. Pour un laboratoire domestique avec quelques VLAN et une seule liaison montante LACP, les ponts Linux + vmbrX.VID sont plus simples et tout à fait adaptés.", + "revertTitle": "Réversible depuis le menu Désinstaller", + "revertBody": "OVS est enregistré. Désinstaller les optimisations lance apt purge pour openvswitch-switch et openvswitch-common. Migrez les ponts OVS vers des ponts Linux avant la désinstallation, sinon leurs VM perdront le réseau au prochain démarrage. Équivalent manuel :" + }, + "bbr": { + "heading": "Activer TCP BBR + TCP Fast Open", + "intro": "Écrit deux fichiers sysctl et les recharge. BBR remplace CUBIC par l’algorithme de congestion de Google fondé sur la bande passante, qui gère mieux les liaisons à forte capacité et latence ou avec pertes. TCP Fast Open (TFO) économise un aller-retour sur les connexions TCP répétées en envoyant des données dans le SYN.", + "verifyTitle": "Vérification", + "impactTitle": "L'impact dépend de la charge de travail", + "impactBody": "BBR brille sur des liaisons à haute latence ou à perte (réplication transcontinentale, tunnels VPN, clients mobiles). Sur un LAN entre deux machines sur le même commutateur, la différence est souvent dans le bruit. TFO aide les connexions courtes et répétées HTTP le plus.", + "revertTitle": "Réversible depuis le menu Désinstaller", + "revertBody": "BBR/TFO sont enregistrés. Désinstaller les optimisations supprime les deux fichiers sysctl (/etc/sysctl.d/99-kernel-bbr.conf et 99-tcp-fastopen.conf) et recharge la configuration restante. Supprimer un fichier ne réinitialise pas ses valeurs actives dans le noyau. Les valeurs par défaut comme cubic et tcp_fastopen=1 reviennent après un redémarrage, sauf si une autre configuration les remplace. Équivalent manuel :" + }, + "names": { + "heading": "Noms d’interfaces persistants", + "intro": "Parcourt les cartes réseau physiques de l’hôte, en excluant loopback, les veth Docker, les ponts, les périphériques TAP, les bonds, Cilium, ZeroTier et WireGuard. Écrit un fichier systemd .link associant le nom actuel à l’adresse MAC actuelle. Cette association prend alors le pas sur le nommage automatique du noyau.", + "whyTitle": "Pourquoi cela est important", + "whyItems": [ + "L'ajout ou la suppression de périphériques PCIe peut déplacer la numérotation du bus, transformer enp3s0 en enp4s0. Si votre /etc/network/interfaces fait référence à l'ancien nom, le pont disparaît sur le redémarrage.", + "Les mises à jour du BIOS ou du firmware changent parfois l’énumération des périphériques, avec le même effet.", + "Le script fixe les noms des cartes physiques, y compris les ports physiques utilisés par les bonds. Il ignore les interfaces virtuelles, comme les veth LXC et les bonds eux-mêmes ; il ne corrige pas les courses au nommage des cartes virtuelles hotplug." + ], + "writtenTitle": "Ce qui est écrit", + "writtenIntro": "Un fichier par NIC physique, au /etc/systemd/network/10-proxmenux-<iface>.link. Chaque fichier commence par l'en-tête # Managed by ProxMenux — do not edit de sorte que ProxMenux puisse distinguer ses propres fichiers des fichiers .link fournis par l'utilisateur ou le paquet.", + "writtenOutro": "Les fichiers .link d’autres paquets ou écrits par l’utilisateur sont conservés ; seuls ceux portant l’en-tête ProxMenux sont gérés. À chaque nouvelle exécution, la fonction vérifie ses fichiers : elle relit MACAddress= dans chaque 10-proxmenux-*.link et supprime ceux dont la MAC n’apparaît plus sous /sys/class/net/. Les fichiers d’anciennes versions ProxMenux au format 10-<iface>.link sont migrés automatiquement la première fois.", + "pveTitle": "PVE 9 vs PVE 8", + "pveBody": "Le script utilise des fichiers systemd .link pour les noms persistants. Sur Proxmox VE 9, il recharge aussi les règles udev après écriture afin que les nouvelles cartes puissent les utiliser sans redémarrage. Vérifiez les interfaces existantes après un redémarrage sur PVE 8 comme sur PVE 9. Cela ne remplace pas ifupdown2 sur l’hôte. Le script demande un redémarrage dans les deux cas via la post-installation personnalisable.", + "reviewTitle": "Examiner d'abord les /etc/network/interfaces existants", + "reviewBody": "Si l’ancienne configuration dans /etc/network/interfaces utilise des noms de cartes générés par le noyau, fixer les noms actuels est le résultat souhaité. Si vous avez déjà adapté la configuration à des noms précis, vérifiez soigneusement que les noms fixés correspondent au fichier interfaces avant de redémarrer.", + "revertTitle": "Réversible depuis le menu Désinstaller", + "revertBody": "Désinstaller les optimisations supprime uniquement les fichiers 10-proxmenux-*.link portant l’en-tête ProxMenux dans /etc/systemd/network/. Les fichiers .link de l’utilisateur ou d’autres paquets sont conservés. Le nommage par défaut de systemd revient au prochain redémarrage." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Gestion du réseau", + "href": "/docs/network", + "tail": "— diagnostic, analyse des ponts, réparations guidées." + }, + { + "label": "Noms d'interface persistants", + "href": "/docs/network/persistent-names", + "tail": " — la même fonction dans un menu distinct pour plus tard ; utilisez l’une ou l’autre option, pas les deux." + }, + { + "label": "Référence des commandes réseau", + "href": "/docs/help-info/network-commands", + "tail": " — ip, ss, ethtool, sysctl." + }, + { + "label": "Désinstaller les optimisations", + "href": "/docs/post-install/uninstall", + "tail": " — annuler ces changements réseau." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/optional.json b/web/messages/fr/docs/post-install/optional.json new file mode 100644 index 00000000..c4f06e38 --- /dev/null +++ b/web/messages/fr/docs/post-install/optional.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Post-Installation: Paramètres optionnels", + "description": "Guide des paramètres optionnels dans le script ProxMenux post-installation pour les fonctionnalités et optimisations supplémentaires de Proxmox VE.", + "ogTitle": "ProxMenux Post-Installation: Paramètres optionnels", + "ogDescription": "Guide des paramètres optionnels dans le script ProxMenux post-installation pour les fonctionnalités et optimisations supplémentaires de Proxmox VE.", + "ogImageAlt": "Paramètres optionnels après l'installation de ProxMenux" + }, + "title": "Paramètres optionnels", + "intro": "La catégorie Paramètres optionnels fournit des fonctions et optimisations supplémentaires à appliquer à Proxmox VE. Elles ne sont pas essentielles, mais peuvent améliorer les possibilités du système dans certains cas.", + "available": "Fonctions optionnelles disponibles", + "stepLabel": "Étape", + "ceph": { + "title": "Ajouter le dernier support Ceph", + "intro": "Cette option installe la dernière prise en charge du système de stockage Ceph pour Proxmox VE. Ceph est un système de stockage distribué qui offre des performances élevées, la fiabilité et l'évolutivité.", + "doesIntro": "Ce qu'il fait:", + "doesItems": [ + "Ajoute le dépôt Ceph à votre système", + "Mise à jour des listes de paquets", + "Installe les paquets Ceph en utilisant la commande 'pveceph install'", + "Vérification de l'installation" + ], + "howUse": "Comment utiliser : Après l'installation, vous pouvez configurer et gérer le stockage Ceph en utilisant l'interface web ou les outils en ligne de commande Proxmox VE.", + "automates": "Ce réglage automatise les commandes suivantes :" + }, + "amd": { + "title": "Appliquer les correctifs AMD CPU", + "intro": "Cette option applique des corrections spécifiques pour les processeurs AMD EPYC et Ryzen pour améliorer la stabilité et la compatibilité.", + "doesIntro": "Ce qu'il fait:", + "doesItems": [ + "Détecte si un AMD EPYC ou Ryzen CPU est présent", + "Applique le paramètre du noyau idle=nomwait pour prévenir les plantages aléatoires (via /etc/kernel/cmdline sur les hôtes systemd-boot ou /etc/default/grub sur les hôtes GRUB, avec une copie .bak de l’original).", + "Configure KVM pour ignorer certains MSR (Registres spécifiques au modèle) pour une meilleure compatibilité des clients Windows" + ], + "howUse": "Comment utiliser: Ces corrections sont appliquées automatiquement et nécessitent un redémarrage du système pour prendre effet.", + "automates": "Ce réglage automatise les commandes suivantes :" + }, + "ha": { + "title": "Activer les services à haute disponibilité", + "intro": "Cette option active les services de haute disponibilité (HA) de Proxmox VE, permettant la reprise automatique des VM et conteneurs sur un autre nœud en cas de panne.", + "doesIntro": "Ce qu'il fait:", + "doesItems": [ + "Active et démarre le service pve-ha-lrm (gestionnaire des ressources locales)", + "Active et démarre le service pve-ha-crm (Gestionnaire des ressources de la grappe)", + "Active et démarre le service Corosync pour la communication cluster" + ], + "howUse": "Comment utiliser: Après avoir activé ces services, vous pouvez configurer des groupes et des ressources HA dans l'interface web Proxmox VE.", + "automates": "Ce réglage automatise les commandes suivantes :" + }, + "pveam": { + "title": "Mettre à jour le gestionnaire d'appliances Proxmox VE", + "intro": "Actualise l’index local des modèles de conteneurs exposé par pveam dans Proxmox, afin que les appliances logicielles disponibles soient à jour à la prochaine création d’un LXC.", + "doesIntro": "Ce qu'il fait:", + "doesItems": [ + "Exécute pveam update sur les miroirs Proxmox pour récupérer le catalogue actuel des appliances logicielles", + "Remplit la liste des appliances logicielles affichée lors de la création d’un conteneur" + ], + "howUse": "Utilisation : exécutez-le si la liste des appliances logicielles semble ancienne ou après un changement de miroir. Il télécharge uniquement l’index du catalogue, pas les modèles eux-mêmes.", + "automates": "Ce réglage automatise la commande suivante :" + }, + "fastfetch": { + "title": "Installer et configurer Fastfetch", + "intro": "Cette option installe et configure en silence Fastfetch, un outil d'information système qui affiche les spécifications du système et un logo personnalisé lors de la connexion.", + "doesLabel": "Ce qu'il fait:", + "doesItems": [ + "Télécharge et installe silencieusement la dernière version de Fastfetch", + "Vous permet de choisir un logo personnalisé (ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology, ou un logo personnalisé)", + "Configure Fastfetch pour afficher \"Système optimisé par ProxMenux\"", + "Configure Fastfetch pour fonctionner automatiquement à la connexion de la console" + ], + "importantLabel": "Important:", + "importantBody": "Si vous vous connectez à Proxmox via SSH, sélectionnez le logo Proxmox ou créez un logo personnalisé en utilisant jp2a ou img2txt. Les autres logos sont générés en utilisant chafa et peuvent ne pas s'afficher correctement dans une session standard SSH.", + "customLabel": "Logos personnalisés :", + "customBody1": "Pour utiliser un logo personnalisé, placez votre fichier texte art ASCII dans : /usr/local/share/fastfetch/logos/", + "customBody2": "Vous pouvez créer des logos personnalisés en utilisant des outils tels que chafa, jp2a ou img2txt.", + "customBody3": "Pour de meilleurs résultats:", + "customItems": [ + "Limitez la hauteur du logo à 35 lignes pour conserver les proportions et tenir dans le terminal", + "Utilisez chafa pour les logos couleur (peut ne pas s'afficher correctement dans les sessions SSH)", + "Utiliser jp2a ou img2txt pour les logos compatibles SSH" + ], + "examplesLabel": "Exemple de logos :", + "logos": [ + { + "name": "ProxMenux", + "alt": "Logo ProxMenux", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmenux.png" + }, + { + "name": "Proxmox", + "alt": "Logo Proxmox", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmox.png" + }, + { + "name": "JC Channel", + "alt": "Logo JC Channel", + "src": "/fastfetch/jc-channel.png" + }, + { + "name": "Helper-Scripts", + "alt": "Logo Helper-Scripts", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/helper-scripts.png" + }, + { + "name": "Home-Labs-Club", + "alt": "Logo Home-Labs-Club", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/home-labs-club.png" + }, + { + "name": "Proxmology", + "alt": "Logo Proxmology", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmology.png" + } + ], + "automates": "Ce réglage automatise les commandes suivantes :" + }, + "figurine": { + "title": "Installer et configurer Figurine", + "intro": "Cette option installe et configure Figurine, un outil qui crée des bannières texte ASCII élégantes pour votre terminal, affichant votre nom d'hôte dans un format 3D attrayant visuellement.", + "doesLabel": "Ce qu'il fait:", + "doesItems": [ + "Télécharge et installe Figurine v2.1.1 depuis GitHub pour l’architecture de l’hôte (AMD64, ARM64 ou ARMv7)", + "Crée un message de bienvenue qui affiche votre nom d'hôte dans l'art 3D ASCII lorsque vous vous connectez", + "Met à jour le binaire Figurine existant une fois le téléchargement et l’extraction terminés avec succès", + "Configure le message de bienvenue à exécuter automatiquement à la connexion" + ], + "practicalLabel": "Utilisation pratique:", + "practicalBody": "Lors de la gestion de plusieurs nœuds Proxmox dans un cluster, Figurine fournit une indication visuelle immédiate du noeud dans lequel vous êtes actuellement connecté. Cela permet d'éviter les commandes accidentelles sur le mauvais noeud et améliore votre workflow lors de la gestion de plusieurs serveurs.", + "exampleLabel": "Exemple de sortie :", + "imageAlt": "Figurine Exemple de sortie", + "automates": "Ce réglage automatise le processus suivant :", + "outro": "Après l'installation, vous verrez votre nom d'hôte affiché dans l'art 3D ASCII chaque fois que vous vous connectez, rendant immédiatement clair sur quel noeud Proxmox vous travaillez." + }, + "log2ram": { + "title": "Installer Log2RAM (SSD/NVMe réduction de l'usure)", + "intro": "Log2RAM monte /var/log sur un disque RAM tmpfs et le synchronise régulièrement vers le disque. Mettre en mémoire les écritures journald fréquentes peut réduire l’usure SSD et les E/S. La synchronisation et un arrêt propre sauvegardent les journaux ; une coupure brutale peut perdre les entrées depuis la dernière synchronisation.", + "upstreamLabel": "Projet en amont:", + "upstreamUrl": "https://github.com/azlux/log2ram", + "upstreamLinkLabel": "azlux/log2ram sur GitHub", + "doesLabel": "Que fait ProxMenux:", + "doesItems": [ + "Détecte si le disque racine est SSD/NVMe en lisant /sys/block/<dev>/queue/rotational. Sur un disque rotatif, le flux automatisé demande d'abord avant d'installer.", + "Clone le dépôt original (azlux/log2ram) dans /tmp/log2ram et modifie install.sh en remplaçant rsync -aAXv par rsync -aXv --no-acls. Cela évite l’erreur set_acl: Operation not supported avec code de sortie 23, déclenchée par le script original lors du déplacement de /var/log sur un système sans ACL. L’unité systemd log2ram est activée après installation.", + "Dimensionne le disque RAM selon la mémoire de l’hôte : ≤ 8 GB → 128M, ≤ 16 GB → 256M, > 16 GB → 512M. Écrit la valeur dans SIZE= de /etc/log2ram.conf.", + "Planifie une synchronisation périodique du disque via /etc/cron.d/log2ram : toutes les 1h / 3h / 6h selon le même niveau RAM.", + "Installe /usr/local/bin/log2ram-check.sh, lancé toutes les 10 minutes par /etc/cron.d/log2ram-auto-sync. Quand /var/log atteint 80% du disque RAM, il purge les anciens journaux journald. À 92%, il lance d’abord logrotate -f /etc/logrotate.d/proxmox-backup-api si le fichier existe : les journaux API PBS occupent souvent le plus d’espace sur un hôte PBS. Il tronque ensuite pveproxy access/error et pveam.log avant synchronisation. log2ram write seul copie tmpfs sur disque sans le réduire. Cette protection aide à éviter un arrêt de PVE avec No space left on device lorsque les journaux grossissent sans contrôle.", + "Détecte le service proxmox-backup-server sur l’hôte. S’il est présent, crée /etc/logrotate.d/proxmox-backup-api (20 Mo × 3 rotations) et /etc/cron.hourly/proxmox-backup-logrotate pour limiter les journaux API PBS, souvent à l’origine de la croissance, même entre les synchronisations Log2RAM. Sans PBS, cette étape ne change rien.", + "Ajuste les limites systemd-journald (SystemMaxUse, RuntimeMaxUse) pour qu'elles s'adaptent au disque virtuel afin qu'une seule rafale ne puisse pas le remplir.", + "S’enregistre dans installed_tools.json pour pouvoir être annulé via Désinstaller les optimisations." + ], + "howUseLabel": "Comment utiliser:", + "howUseBody": "Le parcours automatisé installe Log2RAM sans intervention si le disque racine est SSD/NVMe. Le parcours personnalisable demande taille, intervalle et activation de la protection. L’invite indique actuellement 90%, mais le script généré utilise les seuils de nettoyage à 80% et intensif à 92% décrits plus haut.", + "verifyLabel": "Vérifier et gérer à partir du shell:", + "verifyCode": "# Service state and configured timers\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Current ramdisk usage — /var/log IS the tmpfs itself\ndf -h /var/log\n\n# Force a sync now (tmpfs → disk); does NOT shrink the tmpfs\nlog2ram write\n\n# Trigger the auto-sync guard on demand (vacuum + sync when usage is high)\n/usr/local/bin/log2ram-check.sh\n\n# Current config: SIZE, mail settings, path\ncat /etc/log2ram.conf\n\n# ProxMenux-specific cron jobs\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Recent Log2RAM activity\njournalctl -u log2ram -n 50 --no-pager" + }, + "zram": { + "title": "Activer le profil d'échange ZRAM", + "intro": "Crée un périphérique swap compressé en RAM, /dev/zram0, avec systemd-zram-generator. Les pages déplacées vers le swap sont compressées par zstd et conservées en mémoire avant l’utilisation du swap sur disque.", + "doesLabel": "Ce qu'il fait:", + "doesItems": [ + "Installe systemd-zram-generator s'il manque, et enregistre si ProxMenux l'a installé.", + "Écrit /etc/systemd/zram-generator.conf.d/90-proxmenux.conf : un périphérique zram0 d’un dixième de la RAM de l’hôte, compression zstd (zstd(level=9) avec systemd-zram-generator 1.2.0 ou ultérieur) et priorité swap 32767.", + "Avec cette priorité, le noyau remplit d'abord ZRAM. Un swap existant sur disque conserve sa propre priorité et prend les pages qui ne correspondent plus à ZRAM.", + "Avant de changer quoi que ce soit, recherche une autre configuration ZRAM: un swap zram actif, une ligne zram dans /etc/fstab, une unité systemd ou un autre fichier générateur. Si elle en trouve un, l'option s'arrête et laisse cette configuration telle qu'elle est.", + "Démarre dev-zram0.swap et vérifie que l'appareil actif correspond au profil. Sinon, l'état précédent est rétabli.", + "S’enregistre dans installed_tools.json pour pouvoir être annulé via Désinstaller les optimisations." + ], + "howUseLabel": "Comment utiliser:", + "howUseBody": "Cette option appartient uniquement au parcours personnalisable ; le parcours automatisé ne l’applique pas. Le périphérique est recréé à chaque démarrage. Lorsqu’il est actif, le panneau Mémoire de ProxMenux Monitor affiche capacité, swap utilisé, algorithme, taux de compression et mémoire physique occupée.", + "verifyLabel": "Vérifier depuis le shell :", + "verifyCode": "# Active swap devices and their priority\nswapon --show\n\n# ZRAM device: algorithm, size and compressed data\nzramctl\n\n# Profile written by ProxMenux\ncat /etc/systemd/zram-generator.conf.d/90-proxmenux.conf\n\n# State of the swap unit\nsystemctl status dev-zram0.swap" + }, + "autoApplication": { + "title": "Application automatique", + "body": "Dans le parcours personnalisable, choisissez les fonctions selon vos besoins. Log2RAM appartient aussi au parcours automatisé avec détection matérielle ; ZRAM reste réservé au personnalisable. Consultez chaque section pour les confirmations et prérequis." + } +} diff --git a/web/messages/fr/docs/post-install/performance.json b/web/messages/fr/docs/post-install/performance.json new file mode 100644 index 00000000..29f96090 --- /dev/null +++ b/web/messages/fr/docs/post-install/performance.json @@ -0,0 +1,61 @@ +{ + "meta": { + "title": "Post-installation : Performances | Documentation ProxMenux", + "description": "Options de performance du script post-installation personnalisable de ProxMenux. Remplace gzip à un seul thread par pigz (gzip parallèle) pour accélérer les sauvegardes et la compression sur les hôtes multicœurs." + }, + "header": { + "title": "Après installation : performances", + "description": "Options de performance du script post-installation personnalisable. Cette catégorie contient une seule optimisation : remplacer gzip par pigz pour que les sauvegardes et la compression utilisent tous les cœurs du processeur au lieu d’un seul.", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que cette catégorie couvre", + "body": "La seule option de performance ici redirige gzip vers une implémentation parallèle. Les autres réglages de performance (mémoire, ordonnancement des E/S, taille de l’ARC ZFS, limites du noyau) se trouvent dans leurs catégories (Système, Stockage), car ils concernent d’autres sous-systèmes." + }, + "pigz": { + "heading": "Utilisez pigz pour une compression gzip plus rapide", + "intro": "gzip standard compresse avec un seul cœur de processeur. Sur les hôtes Proxmox modernes à 8, 16 ou 32 cœurs, cela limite fortement les sauvegardes VM/CT avec vzdump, la rotation des journaux et tout ce qui passe par gzip. pigz est un remplacement parallèle directement compatible : même sortie compatible gzip, mais travail réparti sur tous les cœurs.", + "doesTitle": "Ce que fait ProxMenux", + "doesIntro": "Cinq étapes, toutes idempotentes :", + "doesItems": [ + "Définit pigz: 1 dans /etc/vzdump.conf pour que l’outil de sauvegarde Proxmox utilise pigz nativement.", + "Installe le paquet apt pigz s’il est absent.", + "Écrit un script wrapper dans /bin/pigzwrapper qui transmet tous les arguments à /usr/bin/pigz.", + "Enregistre un détournement dpkg du binaire système gzip (/usr/bin/gzip sur Proxmox VE 9, /bin/gzip sur Proxmox VE 8). Le binaire original est conservé à côté sous gzip.distrib et le wrapper prend sa place. Désormais, tout ce qui appelle gzip — logrotate, tar czf, scripts, vzdump — utilise pigz de façon transparente.", + "Vérifie que le fichier conservé sous gzip.distrib est un gzip fonctionnel avant de placer le wrapper ; sinon, réinstalle d’abord le paquet gzip. Un hôte utilisant encore l’ancien remplacement /bin/gzip.original passe au détournement lors de la prochaine application." + ], + "replacesTitle": "Cela remplace un binaire système", + "replacesBody": "Placer un wrapper à la place de gzip est inhabituel. C’est sûr, car il produit une sortie compatible gzip, mais les scripts à chemins codés en dur, exécutés dans des chroots restrictifs ou vérifiant les empreintes des binaires peuvent se comporter différemment. Le binaire original reste sous gzip.distrib. Grâce au détournement dpkg, une mise à jour du paquet gzip ou le passage de Proxmox VE 8 à 9 met à jour ce fichier et laisse le wrapper en place.", + "revertTitle": "Réversible depuis le menu Désinstaller", + "revertBody": "Cette optimisation est suivie. Désinstaller les optimisations remet le binaire original de gzip.distrib à la place du wrapper, supprime le détournement et pigzwrapper, commente la ligne pigz dans /etc/vzdump.conf, puis exécute apt purge pigz après vérification du fonctionnement de gzip. Équivalent manuel sur Proxmox VE 9 :", + "verifyTitle": "Vérification", + "verifyBody": "Après application, gzip --version doit mentionner pigz. Un test rapide montre aussi la différence de vitesse sur un hôte multicœur :", + "whenTitle": "Quand cela importe le plus", + "whenBody": "Le gain dépend du nombre de cœurs de l’hôte et de la fréquence des sauvegardes. Sur un serveur de laboratoire domestique à 2 cœurs avec un vzdump quotidien, le gain est faible. Sur un hôte de production à 16 cœurs sauvegardant une douzaine de VM chaque nuit, pigz peut réduire la fenêtre de sauvegarde à une fraction du temps de gzip à un seul thread." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Commandes de sauvegarde et de restauration", + "href": "/docs/help-info/backup-commands", + "tailRich": " — référence CLI de vzdump, dont l’option de nombre de threads --pigz." + }, + { + "label": "Stockage", + "href": "/docs/post-install/storage", + "tail": "— limites de vitesse vzdump et réglage ARC ZFS." + }, + { + "label": "Système", + "href": "/docs/post-install/system", + "tail": "— descripteur de fichiers et réglage de mémoire." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/security.json b/web/messages/fr/docs/post-install/security.json new file mode 100644 index 00000000..9953d1d8 --- /dev/null +++ b/web/messages/fr/docs/post-install/security.json @@ -0,0 +1,57 @@ +{ + "meta": { + "title": "Post-installation : Sécurité | Documentation ProxMenux", + "description": "Options de sécurité disponibles dans le script de post-installation personnalisable ProxMenux. Actuellement une seule option : désactiver le service portmapper/rpcbind pour réduire la surface d'attaque de l'hôte." + }, + "header": { + "title": "Post-Installation: Sécurité", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que cette catégorie couvre", + "body": "La sécurité post-installation se limite au renforcement de l’hôte applicable sans surveillance en toute sécurité : désactiver des services rarement nécessaires et pouvoir l’annuler dans Désinstaller. Les outils actifs (Fail2Ban pour prévenir les intrusions, Lynis pour les audits) se trouvent dans Sécurité du menu principal de ProxMenux, hors de la post-installation." + }, + "rpcbind": { + "heading": "Désactiver le portmapper / rpcbind", + "intro": "rpcbind (anciennement portmap) associe les numéros de programmes RPC aux ports réseau. NFS et certains anciens outils RPC en dépendent. Sur un hôte Proxmox typique qui ne sert pas de serveur NFS, rien ne l’utilise ; le laisser actif maintient le port 111/tcp en écoute sur toutes les interfaces.", + "whyTitle": "Pourquoi ça vaut la peine d'être désactivé", + "whyItems": [ + "Réduit la surface d'attaque de l'hôte — un service d'écoute de moins pour s'inquiéter.", + "Historiquement utilisé comme vecteur de réflexion/amplification dans les attaques DDoS. Désactiver rpcbind supprime ce facteur d'amplification pour votre hôte.", + "Supprime le bruit qu’il génère dans les journaux et les sorties de netstat / ss, pour repérer plus facilement l’activité réelle." + ], + "nfsTitle": "Ne pas désactiver cela si vous utilisez NFS", + "nfsBody": "Le serveur NFS et le client NFS utilisent rpcbind pour négocier les ports de mountd, statd, lockd, etc. N’appliquez pas cette option si l’hôte Proxmox exporte des partages NFS vers d’autres machines ou monte des partages NFS d’un NAS. Les montages échoueront avec mount.nfs: rpc.statd is not running ou une erreur similaire.", + "runsTitle": "Ce que ProxMenux exécute", + "runsOutro": "Le paquet reste installé. ProxMenux enregistre les états d’activation et d’exécution d’origine de rpcbind.service et rpcbind.socket, puis désactive et arrête les deux unités pour empêcher la réactivation du service par le socket.", + "verifyTitle": "Vérification", + "verifyBody": "Après application, vérifiez que rpcbind est arrêté et que rien n’écoute sur le port 111 :", + "reversibleTitle": "Restaurer l'état de service original", + "reversibleBody": "Cette modification est enregistrée dans installed_tools.json. Désinstaller les optimisations restaure chaque unité rpcbind à ses états d’activation et d’exécution relevés avant la modification par ProxMenux. L’outil ne suppose pas que rpcbind était activé sur tous les hôtes." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Menu de sécurité", + "href": "/docs/security", + "tail": " — des outils plus poussés : Fail2Ban (prévention des intrusions) et Lynis (audit)." + }, + { + "label": "Lynis", + "href": "/docs/security/lynis", + "tail": " — pour auditer l’hôte et trouver d’autres possibilités de renforcer la sécurité." + }, + { + "label": "Commandes système utiles", + "href": "/docs/help-info/system-commands", + "tail": "— état de service, journalctl, référence d'audit lynis." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/storage.json b/web/messages/fr/docs/post-install/storage.json new file mode 100644 index 00000000..b78bb8d7 --- /dev/null +++ b/web/messages/fr/docs/post-install/storage.json @@ -0,0 +1,167 @@ +{ + "meta": { + "title": "Post-Installation: Stockage - Documentation ProxMenux", + "description": "Optimisations de stockage du script de post-installation personnalisable ProxMenux : taille ZFS ARC selon la RAM de l’hôte, instantanés périodiques avec zfs-auto-snapshot et suppression des limites de vitesse des sauvegardes vzdump." + }, + "header": { + "title": "Post-Installation: Stockage", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que cette catégorie couvre", + "body": "Quatre optimisations de stockage : régler ZFS ARC sur une part raisonnable de la RAM, installer et programmer les instantanés ZFS automatiques, activer ZFS autotrim sur les pools SSD/NVMe et retirer les limitations de vzdump pour accélérer les sauvegardes. Choisissez chaque option indépendante selon votre configuration. Une cinquième option, Log2RAM, réduit l’usure SSD/NVMe en déplaçant /var/log en RAM. Elle figure dans Options car le menu personnalisable la classe ainsi." + }, + "trackedTitle": "Les quatre sont suivis dans le menu Désinstaller", + "trackedBody": "Chaque option s’enregistre dans installed_tools.json pour Désinstaller les optimisations. zfs_arc supprime /etc/modprobe.d/99-zfsarc.conf et reconstruit initramfs ; zfs_auto_snapshot annule le calendrier cron et propose de purger le paquet ; zfs_autotrim définit autotrim=off sur les pools activés ; vzdump_speed restaure /etc/vzdump.conf depuis le .bak créé à l’installation.", + "arc": { + "heading": "Optimiser la taille de ZFS ARC", + "intro": "Le Adaptive Replacement Cache (ARC) est le cache de lecture ZFS en mémoire. Les installations Proxmox VE depuis 8.1 fixent 10% de RAM, au maximum 16 GiB ; les hôtes anciens ou mis à niveau peuvent différer. Cette option écrit sa propre limite selon la RAM. Vérifiez les réglages et la charge : un cache plus petit n’est pas toujours plus rapide.", + "sizingTitle": "Règles de calibrage", + "headerRam": "RAM de l'hôte", + "headerMax": "Plafond ARC", + "rows": [ + { + "ram": "Formule", + "max": "RAM / 10, plafonné à 16 GiB, avec un plancher 64 MiB" + }, + { + "ram": "Hôte 8 GB", + "max": "≈ 819 MiB (RAM/10)" + }, + { + "ram": "Hôte 16 GB", + "max": "≈ 1.6 GiB (RAM/10)" + }, + { + "ram": "Hôte 64 GB", + "max": "≈ 6.4 GiB (RAM/10)" + }, + { + "ram": "≥ 160 GB hôte", + "max": "16 GiB (plafond)" + } + ], + "after": "Le fichier /etc/modprobe.d/99-zfsarc.conf contient uniquement options zfs zfs_arc_max=…. Les autres paramètres ZFS (zfs_arc_min, prélecture/limitation des écritures L2ARC, délai TXG) ne sont pas ajustés. Au préalable, une vérification recherche les autres *.conf de /etc/modprobe.d/ définissant zfs_arc_min / zfs_arc_max, les sauvegarde avec manifeste dans /usr/local/share/proxmenux/backups/zfs_arc/ et retire les lignes conflictuelles pour ne laisser actif que le fichier ARC ProxMenux. Puis update-initramfs -u -k all et, si nécessaire, proxmox-boot-tool refresh intègrent la limite à l’initramfs des systèmes avec racine ZFS.", + "rebootTitle": "Nécessite un redémarrage pour prendre effet", + "rebootBody": "Les réglages ARC sont lus au chargement du module zfs. Pour les hôtes avec racine ZFS, ProxMenux régénère initramfs avec update-initramfs -u -k all et actualise si nécessaire le chargeur avec proxmox-boot-tool refresh. Le nouveau paramètre exige toujours un redémarrage, signalé automatiquement.", + "safeTitle": "Sans effet indésirable sur les hôtes sans ZFS", + "safeBody": "La fonction n’écrit la configuration que si zpool list signale au moins un pool ZFS importé. Sur un hôte Proxmox ext4/LVM uniquement, ou avec outils ZFS mais sans pool importé, cocher cette option ne fait rien : aucun fichier n’est écrit.", + "verifyTitle": "Vérification et retour arrière manuel" + }, + "autoSnap": { + "heading": "Installer l'instantané automatique ZFS", + "intro": "Installe le paquet zfs-auto-snapshot et réécrit ses horaires cron afin que les instantanés soient pris automatiquement à plusieurs intervalles. Un grand filet de sécurité sans effort en plus de vos sauvegardes Vzdump régulières.", + "cadenceTitle": "Fréquence des instantanés configurée par ProxMenux", + "headerLabel": "Étiquette", + "headerRuns": "Exécution", + "headerKept": "Captures instantanées conservées", + "rows": [ + { + "label": "fréquent", + "runs": "chaque 15 min", + "kept": "4" + }, + { + "label": "horaire", + "runs": "toutes les heures", + "kept": "1" + }, + { + "label": "quotidiennement", + "runs": "une fois par jour", + "kept": "1" + }, + { + "label": "hebdomadaire", + "runs": "une fois par semaine", + "kept": "1" + }, + { + "label": "mensuel", + "runs": "une fois par mois", + "kept": "1" + } + ], + "conservativeTitle": "Rétention limitée", + "conservativeBody": "ProxMenux est livré avec une rétention prudente (juste 4 fréquent + 1 de chaque intervalle plus long) de sorte que le stockage des instantanés ZFS ne ballonne pas. Si vous souhaitez une conservation plus longue, modifiez les numéros dans /etc/cron.d/zfs-auto-snapshot, /etc/cron.hourly/zfs-auto-snapshot, etc. après le script.", + "onlyZfsTitle": "Utile uniquement sur les pools ZFS", + "onlyZfsBody": "Installer le paquet sur un hôte ext4 seulement est inoffensif mais inutile — il n'y a pas d'ensembles de données ZFS pour qu'il snapshot. Passez cette option si vous n'utilisez pas ZFS.", + "verifyTitle": "Vérification et retour arrière manuel" + }, + "autotrim": { + "heading": "Activer ZFS autotrim (pools SSD/NVMe)", + "intro": "Active autotrim sur les pools ZFS composés uniquement de SSD ou NVMe compatibles TRIM. Le script ignore par précaution les pools avec un disque rotatif. Les pools déjà en autotrim=on restent inchangés.", + "trimTitle": "Ce que TRIM fait, et pourquoi il importe sur ZFS", + "trimBody1": "Les SSD et NVMe utilisent des blocs d’effacement internes plus grands que les secteurs logiques du système de fichiers. Après suppression d’un fichier, le disque ne sait pas encore que les secteurs sont libres ; son nettoyage interne peut donc recopier des données obsolètes pour libérer d’autres blocs. TRIM lui signale les secteurs libres pour permettre leur effacement anticipé.", + "trimBody2": "Sans TRIM, les performances de SSD se dégradent au fil du temps car le lecteur n'a plus de blocs pré-effacés et doit faire effacer-à-écrire, et l'amplification de l'écriture augmente — les deux raccourcissant la vie utile du lecteur. Avec TRIM activé, le lecteur peut garder un bassin sain de blocs vides prêts à écrire.", + "trimBody3": "Avec autotrim=on, ZFS traite en arrière-plan l’espace récemment libéré en regroupant les plages. Un zpool trim <pool> périodique est une alternative. Autotrim évite un calendrier séparé, mais son impact dépend des disques ; le TRIM manuel périodique peut mieux convenir à certains modèles modestes.", + "practicalTitle": "Pourquoi est-ce pratique?", + "practicalItems": [ + "Performances d’écriture durables. TRIM peut aider le disque à récupérer efficacement les blocs inutilisés. Le bénéfice et l’impact sur la latence dépendent du matériel et de la charge.", + "Longévité du disque. Éviter des copies internes inutiles peut réduire l’amplification d’écriture et l’usure NAND, sans garantir une durée de vie supplémentaire précise.", + "Pas de tâche cron à prévoir. Contrairement à un zpool trim périodique, autotrim est géré automatiquement par le pool." + ], + "whenTitle": "Quand est-ce nécessaire ?", + "whenIntro1": "Envisagez de l’activer sur les pools ZFS uniquement en SSD/NVMe compatibles TRIM. Vérifiez le comportement et la latence ; un TRIM manuel planifié peut mieux convenir.", + "whenIntro2": "Le script le saute automatiquement sur:", + "whenSkipItems": [ + "Pools avec un vdev sur disque dur rotatif : filtre matériel prudent de ce script.", + "Disques sans discard_granularity exposé dans sysfs : anciens SSD sans TRIM ou accès direct ne permettant pas au système de voir le périphérique sous-jacent.", + "Pools où ZFS lui-même signale la propriété non supportée (rare; très vieux pools).", + "Pools déjà mis à autotrim=on (non-op)." + ], + "whenIntro3": "Non pertinent sur les hôtes ext4 seulement — il n'y a rien pour ZFS à découper. La fonction sort avec un message amical dans ce cas.", + "recordedTitle": "Pourquoi seuls les pools ProxMenux modifiés sont enregistrés", + "recordedBody": "La fonction n'écrit un pool à son fichier d'état interne (/usr/local/share/proxmenux/zfs_autotrim_pools) que lorsqu'elle a activement retourné ce pool de off à on. Les pools que vous aviez sur autotrim avant d'exécuter le script sont laissés en dehors de la liste, de sorte qu'un futur désinstallation ne désactive pas les paramètres que vous avez configurés vous-même — seuls les changements de ProxMenux sont retournés.", + "manualTitle": "Équivalent manuel (exécutez sur votre serveur)", + "manualIntro": "La séquence complète du script s'exécute contre chaque pool est reproductible à la main. C'est ce que vous taperiez si vous vouliez faire la même chose sur un seul pool sans ProxMenux:", + "verifyTitle": "Vérification et retour arrière manuel", + "oneShotTitle": "Besoin d’un TRIM ponctuel plutôt que continu ?", + "oneShotBody": "Certains administrateurs préfèrent un TRIM manuel aux heures creuses. Désactivez autotrim et programmez une tâche cron exécutant zpool trim <pool> : même objectif, fréquence différente." + }, + "vzdump": { + "heading": "Augmenter la vitesse de sauvegarde de vzdump", + "intro": "Écrit bwlimit: 0 et ionice: 5 dans la configuration globale vzdump. Proxmox n’a déjà pas de limite de bande passante par défaut : seul un plafond configuré est retiré. Par rapport à ionice: 7, la valeur 5 augmente la priorité E/S best-effort si l’ordonnanceur la respecte. Cela peut affecter les invités sans garantir des sauvegardes plus rapides.", + "changedTitle": "Ce qui est changé dans /etc/vzdump.conf", + "backupTitle": "La première exécution crée un .bak de vzdump.conf", + "backupBody": "Au premier passage, ProxMenux copie /etc/vzdump.conf vers /etc/vzdump.conf.bak avant modification. Les exécutions suivantes conservent cette sauvegarde pour récupérer la configuration antérieure. bwlimit et ionice sont modifiés par sed ; les autres options comme compress, pigz, tmpdir et exclude-path sont conservées.", + "skipTitle": "Quand sauter ça", + "skipBody": "Sur un hôte à stockage local lent avec des VM sensibles à la latence, retirer la limite de bande passante peut causer des ralentissements pendant les sauvegardes. Si vous avez défini un bwlimit pour cela, conservez-le et ignorez cette option.", + "verifyTitle": "Vérification et retour arrière manuel" + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Commandes de gestion ZFS", + "href": "/docs/help-info/zfs-commands", + "tail": " — référence zpool / zfs pour ARC, instantanés et scrub." + }, + { + "label": "Commandes de stockage et de disques", + "href": "/docs/help-info/storage-commands", + "tail": " — référence des périphériques de blocs et du stockage Proxmox." + }, + { + "label": "Commandes de sauvegarde et restauration", + "href": "/docs/help-info/backup-commands", + "tail": " — référence CLI vzdump pour la bande passante et la priorité E/S." + }, + { + "label": "Désinstaller les optimisations", + "href": "/docs/post-install/uninstall", + "tail": " — annuler les modifications ARC / vzdump." + }, + { + "label": "Log2RAM", + "href": "/docs/post-install/optional#log2ram", + "tail": "— réduit l'usure du SSD/NVMe par le support de ramdisque /var/log; documenté sous Facultatif." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/system.json b/web/messages/fr/docs/post-install/system.json new file mode 100644 index 00000000..8a95c1fa --- /dev/null +++ b/web/messages/fr/docs/post-install/system.json @@ -0,0 +1,133 @@ +{ + "meta": { + "title": "Post-installation : Système | Documentation ProxMenux", + "description": "Optimisations système du script de post-installation personnalisable ProxMenux : limites de taille journald et logrotate, limites du noyau et des descripteurs de fichiers relevées, réglage équilibré de la mémoire, redémarrages rapides par kexec et récupération après panique du noyau." + }, + "header": { + "title": "Après installation : système", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que cette catégorie couvre", + "body": "Six optimisations système indépendantes. Elles règlent journald et logrotate pour éviter de remplir le disque, relèvent les limites du noyau et des descripteurs de fichiers pour les applications ouvrant beaucoup de fichiers, équilibrent la mémoire d’un hôte de virtualisation, ajoutent kexec pour redémarrer sans passer par le BIOS et configurent la récupération automatique après panique du noyau. Les six sont enregistrées et réversibles depuis le menu de désinstallation." + }, + "journald": { + "heading": "Optimiser journald", + "intro": "Réécrit /etc/systemd/journald.conf avec des valeurs raisonnables pour éviter que le journal systemd remplisse progressivement la partition racine, puis redémarre systemd-journald et purge les anciens journaux.", + "keyTitle": "Valeurs clés", + "keyItems": [ + "Storage=persistent — tenir des journaux sur le disque à travers les reboots.", + "SystemMaxUse=64M / RuntimeMaxUse=60M — plafonds d’utilisation du disque et de la mémoire par le journal.", + "Compress=yes, Seal=no — compresser les journaux, désactiver le scellement à sécurité persistante (économise du CPU).", + "MaxLevelStore=info — conserver les niveaux info et supérieurs, nécessaires au lecteur de journaux ProxMenux Monitor et à la détection des échecs d’authentification SSH/Proxmox par Fail2Ban dans le journal.", + "Limite de débit : 1000 events / 30 s pour éviter un afflux excessif de journaux.", + "ForwardToSyslog=no, ForwardToWall=no — ne dupliquez pas les messages au syslog ou ne les diffusez pas sur des consoles." + ], + "tipTitle": "Pourquoi MaxLevelStore=info compte", + "tipBody": "Un seuil plus strict comme warning fait afficher presque les mêmes entrées à ProxMenux Monitor sur toutes les périodes, car la plupart des activités sont de niveau info, et empêche Fail2Ban de voir les échecs de connexion. Réduisez plutôt le volume avec SystemMaxUse et RateLimitBurst sans restreindre les niveaux conservés." + }, + "logrotate": { + "heading": "Optimiser logrotate", + "intro": "Réécrit /etc/logrotate.conf avec des réglages globaux quotidiens et de taille, 7 rotations conservées, compression et copytruncate pour que les services continuent d’écrire sans rouvrir les fichiers. Le critère de taille, placé après le critère quotidien, prévaut sauf règle propre au journal. Le logrotate.conf original est sauvegardé en .bak à la première application.", + "tipTitle": "Compatible avec Log2RAM", + "tipBody": "La directive size 10M prévaut sur le réglage quotidien précédent ; elle ne signifie pas le premier des deux critères. Logrotate vérifie le seuil à son exécution, et les règles propres aux journaux peuvent remplacer les valeurs globales. Pour /var/log en RAM avec Log2RAM, vérifiez les règles et la fréquence du minuteur afin de contrôler l’espace." + }, + "limits": { + "heading": "Augmenter diverses limites du système", + "intro": "Relève des limites du noyau, de systemd et de PAM dont les valeurs par défaut peuvent être trop faibles pour un hôte exécutant de nombreuses VM, conteneurs et services réseau.", + "headerFile": "Fichier", + "headerSets": "Ce qu'il définit", + "rows": [ + { + "file": "/etc/sysctl.d/99-maxwatches.conf", + "sets": "fs.inotify.max_user_watches / max_user_instances / max_queued_events = 1048576" + }, + { + "file": "/etc/sysctl.d/99-maxkeys.conf", + "sets": "kernel.keys.maxkeys / root_maxkeys = 1000000" + }, + { + "file": "/etc/sysctl.d/99-swap.conf", + "sets": "vm.swappiness = 10, vm.vfs_cache_pressure = 100" + }, + { + "file": "/etc/sysctl.d/99-fs.conf", + "sets": "fs.nr_open / file-max = 2097152, fs.aio-max-nr = 1048576" + }, + { + "file": "/etc/security/limits.d/99-limits.conf", + "sets": "nofile et nproc à 1 048 576 (illimités pour root)" + }, + { + "file": "/etc/systemd/system.conf + user.conf", + "sets": "DefaultLimitNOFILE=1048576 pour les services systemd" + }, + { + "file": "/etc/pam.d/common-session + runuser-l", + "sets": "session required pam_limits.so donc ce qui précède s'applique aux shells de connexion" + }, + { + "file": "/root/.profile", + "sets": "ulimit -n 1048576 pour le shell root" + } + ], + "tipTitle": "Pourquoi inotify est important", + "tipBody": "Docker, Syncthing, les surveillances de fichiers Node.js et les analyses Plex peuvent épuiser max_user_watches. La valeur par défaut dépend du noyau et de la mémoire ; elle n’est pas toujours 8192. Un plafond de 1M autorise davantage de surveillances sans les préallouer. Les surveillances actives consomment de la mémoire du noyau : vérifiez l’usage si la RAM est limitée." + }, + "memory": { + "heading": "Optimiser les paramètres de la mémoire", + "intro": "Écrit un profil de sysctl équilibré à /etc/sysctl.d/99-memory.conf. Conçu pour un hôte hyperviseur — préfère garder les ensembles de travail VM dans RAM et libère les pages de manière proactive afin que les éclats d'allocation ne s'arrêtent pas.", + "warnTitle": "swappiness=10 sur les hôtes avec peu de mémoire", + "warnBody": "Sur un hôte de 16 Go de RAM exécutant de nombreuses VM, réduire swappiness peut conduire le noyau à tuer des processus par manque de mémoire plutôt qu’à utiliser le swap. Si les événements OOM sont fréquents, remontez swappiness à 30–60 dans /etc/sysctl.d/99-memory.conf après le script." + }, + "kexec": { + "heading": "Activer les redémarrages rapides (kexec)", + "intro": "Installe kexec-tools et le branche pour que vous puissiez redémarrer l'hôte directement dans un nouveau noyau sans passer par BIOS/UEFI firmware. Sur les grands serveurs où POST prend 45 – 90 secondes, cela transforme un redémarrage d'une pause café en quelques secondes d'arrêt.", + "installsTitle": "Ce que ProxMenux installe", + "installsItems": [ + "Paquet kexec-tools (debconf pré-réponse avec kexec-tools/load_kexec boolean false donc apt n'invite pas et le chargement automatique à l'arrêt reste désactivé).", + "Unité systemd /etc/systemd/system/kexec-pve.service — charge le noyau Proxmox et initrd en mémoire au démarrage en réutilisant la ligne de commande actuelle du noyau.", + "Un alias dans /root/.bash_profile: reboot-quick → systemctl kexec." + ], + "usageIntro": "Utilisation après le prochain redémarrage (ou manuel systemctl start kexec-pve):", + "warnTitle": "Quand ne pas utiliser kexec", + "warnBody": "kexec saute l’initialisation du firmware. Si vous dépendez de BIOS/UEFI pour réinitialiser le matériel, par exemple un GPU en passthrough nécessitant un POST complet ou un firmware HBA problématique, ces redémarrages peuvent laisser les appareils partiellement initialisés. Utilisez un reboot normal après une mise à niveau du noyau ou pour appliquer des changements BIOS/UEFI. reboot-quick sert aux redémarrages courants." + }, + "panic": { + "heading": "Activer le redémarrage en cas de panique du noyau", + "intro": "Fait redémarrer automatiquement le noyau au lieu de rester bloqué sur l’écran de panique. Essentiel pour les hôtes Proxmox distants ou sans console locale : un noyau bloqué arrête toutes les VM jusqu’à ce que vous puissiez couper puis rétablir l’alimentation.", + "tipTitle": "Combinez ceci avec l'accès à la console à distance", + "tipBody": "Le redémarrage automatique sert à récupérer le système, pas à le déboguer. Pour analyser une panique plutôt que simplement redémarrer, utilisez l’option kexec ci-dessus avec kdump du noyau, non configuré par ProxMenux, ou enregistrez une console série sur un autre hôte avant d’activer le redémarrage automatique." + }, + "verify": { + "heading": "Vérification", + "intro": "Après l'application des optimisations système:", + "tipTitle": "Restauration et limites", + "tipBody": "Les six options figurent dans installed_tools.json et Désinstaller les optimisations. La restauration retire fichiers de configuration, unité et alias kexec, et rétablit journald/logrotate. Certaines limites actives nécessitent une nouvelle session ou un redémarrage. Le nettoyage de /root/.profile retire seulement l’ancien ulimit -n 256000 ; l’actuel ulimit -n 1048576 peut rester et nécessiter une suppression manuelle." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Commandes système utiles", + "href": "/docs/help-info/system-commands", + "tail": " — vérifier les modifications (free -h, journalctl, ulimit -a)." + }, + { + "label": "Performances", + "href": "/docs/post-install/performance", + "tail": "— réglage supplémentaire au niveau du système (pigz)." + }, + { + "label": "Désinstaller les optimisations", + "href": "/docs/post-install/uninstall", + "tail": "— revenir à l'un de ces changements." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/uninstall.json b/web/messages/fr/docs/post-install/uninstall.json new file mode 100644 index 00000000..b61db8ae --- /dev/null +++ b/web/messages/fr/docs/post-install/uninstall.json @@ -0,0 +1,271 @@ +{ + "meta": { + "title": "Désinstaller les optimisations | Documentation ProxMenux", + "description": "Restaurer les modifications de configuration réversibles après l'installation appliquées par ProxMenux. Les outils enregistrés utilisent des désinstallateurs dédiés qui préservent l'état d'hôte préexistant lorsque c'est possible." + }, + "header": { + "title": "Désinstaller les optimisations", + "description": "Restaurer les modifications réversibles apportées par les scripts de post-installation automatisés ou personnalisables. ProxMenux enregistre chaque optimisation supportée avec sa fonction de restauration dédiée; les mises à jour de paquets sont intentionnellement exclues.", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Pourquoi cela existe", + "body": "Chaque réglage réversible pris en charge est enregistré dans /usr/local/share/proxmenux/installed_tools.json. Ce registre liste les optimisations actives et appelle la fonction de restauration correspondante. Les actions sans retour arrière sûr, comme une mise à niveau complète des paquets, ne sont pas ajoutées." + }, + "openMenu": { + "heading": "Comment l'ouvrir", + "body": "Depuis le menu principal, ouvrez Paramètres post-installation Proxmox → Désinstaller les optimisations. La liste propose les optimisations actuellement appliquées ; celles non appliquées n’apparaissent pas.", + "imageAlt": "Liste de désinstallation montrant les optimisations actives sur l’hôte, avec cases de sélection pour les annuler" + }, + "howWorks": { + "heading": "Comment fonctionne le retour arrière", + "steps": [ + { + "title": "Registre et détection automatique", + "body1": "Au premier passage, ProxMenux recherche des marqueurs sur l’hôte : /etc/sysctl.d/99-memory.conf, /etc/apt/apt.conf.d/99-force-ipv4, paquet haveged installé, service Log2RAM actif, etc. Les éléments reconnus sont enregistrés comme réversibles, même s’ils viennent d’une version antérieure au registre.", + "body2": "Cette migration ne dure qu'une seule fois. Ensuite, chaque application/réversion met à jour le registre directement." + }, + { + "title": "Choisir les changements à annuler", + "body1": "La liste de vérification présente une étiquette lisible par l'homme par article (p. ex. Optimisation des paramètres de mémoire, IOMMU/VFIO PCI Passthrough, Log2RAM (SSD Protection)). Cochez ceux que vous voulez inverser. Rien de ce que vous ne cochez ne sera touché." + }, + { + "title": "Exécution de la restauration", + "body1": "Pour chaque élément sélectionné, ProxMenux appelle sa fonction de désinstallation correspondante. La plupart des renversements suivent l'un des trois modèles suivants :", + "items": [ + "Basé sur la sauvegarde — restaurer un .bak capturé au moment de l'application (bashrc, logrotate.conf, journald.conf, GRUB/kernel cmdline).", + "Suppression de configuration — retire les fichiers ProxMenux /etc/sysctl.d/99-*.conf, /etc/apt/apt.conf.d/99-* ou l’unité systemd, puis recharge.", + "Réinstallation de paquets — pour les modifications d’interface comme l’avertissement d’abonnement, réinstalle les paquets originaux avec --force-confnew pour rétablir les réglages fournis." + ], + "body2": "Chaque renversement enregistre ses progrès. Les éléments qui nécessitent un redémarrage (VFIO, noms d'interface persistants) définissent un drapeau qui déclenche l'invite de redémarrage à la fin." + }, + { + "title": "Demande de redémarrage à la fin", + "body1": "Une fois l'inversion terminée, le menu affiche une invite de redémarrage. Les éléments qui ont modifié les paramètres du noyau, les modules du noyau ou le nom de réseau (VFIO, noms d'interface persistants) ont besoin du redémarrage pour prendre effet; d'autres éléments ne le font pas, et l'invite est une sécurité par défaut plutôt qu'une vérification par item." + } + ] + }, + "reversible": { + "heading": "Ce qui est réversible", + "intro": "Les optimisations réversibles enregistrées et leurs désinstallateurs correspondants sont regroupés ici par domaine:", + "groups": [ + { + "title": "Dépôts & APT", + "items": [ + { + "tool": "Suppression de la bannière d'abonnement", + "restores": "D'abord essayer de restaurer les fichiers d'interface utilisateur à partir des sauvegardes de ProxMenux (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* et, lorsque l'interface utilisateur mobile est patchée, index.html.tpl.backup.*). Seulement si une sauvegarde est manquante ou corrompue, revient à réinstaller pve-manager, proxmox-widget-toolkit, libjs-extjs et libpve-http-server-perl avec force-confnew. Efface également les copies en cache .js / .gz." + }, + { + "tool": "Ignorer les langues APT", + "restores": "Supprime /etc/apt/apt.conf.d/99-disable-translations pour permettre les index de descriptions de paquets traduites selon les autres réglages linguistiques APT." + }, + { + "tool": "Forcer IPv4 pour APT", + "restores": "Supprime /etc/apt/apt.conf.d/99-force-ipv4." + }, + { + "tool": "Utilitaires système", + "restores": "Purge seulement les paquets utilitaires sélectionnés que ProxMenux enregistré comme nouvellement installé. Les paquets déjà présents avant l'action ne sont jamais ajoutés à cette liste et restent intacts." + } + ] + }, + { + "title": "Limites du noyau, de la mémoire et du système", + "items": [ + { + "tool": "Paramètres de la mémoire", + "restores": "Supprime /etc/sysctl.d/99-memory.conf et recharge sysctl." + }, + { + "tool": "Configuration de la panique du noyau", + "restores": "Supprime /etc/sysctl.d/99-kernelpanic.conf." + }, + { + "tool": "Augmentation des limites du système", + "restores": "Supprime /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf et /etc/security/limits.d/99-limits.conf. Rétablit les limites PAM et DefaultLimitNOFILE systemd. Dans /root/.profile, seul l’ancien ulimit -n 256000 est retiré ; ulimit -n 1048576 de l’installateur actuel peut rester et nécessiter une suppression manuelle." + }, + { + "tool": "Profil d'échange ZRAM", + "restores": "Désactive le swap /dev/zram0, arrête dev-zram0.swap et supprime /etc/systemd/zram-generator.conf.d/90-proxmenux.conf. Le paquet systemd-zram-generator n’est purgé que si ProxMenux l’a installé et qu’aucune autre configuration ZRAM n’existe. Si les pages ne peuvent pas être évacuées, le profil reste actif et rien n’est supprimé." + } + ] + }, + { + "title": "Réseautage", + "items": [ + { + "tool": "Optimisations du réseau", + "restores": "Supprime /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf et 98-proxmenux-rpf.conf, l’unité proxmenux-fwbr-tune.service, le script /usr/local/sbin/proxmenux-fwbr-tune et la règle udev /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules. Retire aussi la ligne source /etc/network/interfaces.d/* de /etc/network/interfaces. Recharge sysctl, systemd et les règles udev." + }, + { + "tool": "Open vSwitch", + "restores": "Exécute apt purge pour openvswitch-switch et openvswitch-common. Migrez les ponts OVS vers Linux avant la désinstallation, sinon leurs VM perdront le réseau au prochain démarrage." + }, + { + "tool": "TCP BBR + TCP Fast Open", + "restores": "Supprime /etc/sysctl.d/99-kernel-bbr.conf et 99-tcp-fastopen.conf, puis recharge le reste de sysctl. Supprimer les fichiers ne réinitialise pas les valeurs actives ; les valeurs par défaut comme cubic et tcp_fastopen=1 reviennent au redémarrage sauf autre configuration." + }, + { + "tool": "Noms d'interface persistants", + "restores": "Supprime uniquement les fichiers 10-proxmenux-*.link contenant l'en-tête ProxMenux de /etc/systemd/network/. Tout fichier .link fourni par un autre paquet ou écrit par l'utilisateur est laissé en place. Les noms d'interface retournent au comportement par défaut de systemd lors du prochain redémarrage." + } + ] + }, + { + "title": "Journalisation", + "items": [ + { + "tool": "Optimisation de journald", + "restores": "Réécrit /etc/systemd/journald.conf par défaut et redémarre systemd-journald." + }, + { + "tool": "Optimisation du logrotate", + "restores": "Restaurer /etc/logrotate.conf à partir du fichier .bak capturé avant le changement." + }, + { + "tool": "Log2RAM", + "restores": "Arrête et désactive le service et le minuteur. Supprime tâches cron, unités systemd, binaires, configuration et /var/log.hdd. Désinstalle aussi le paquet apt si cette méthode a été utilisée." + }, + { + "tool": "TRIM automatique ZFS", + "restores": "Lit /usr/local/share/proxmenux/zfs_autotrim_pools, la liste des pools réellement modifiés, et lance zpool set autotrim=off sur chacun. Les pools activés manuellement avant ProxMenux restent intacts." + } + ] + }, + { + "title": "Shell & apparence", + "items": [ + { + "tool": "Personnalisation de Bashrc", + "restores": "Restaurer /root/.bashrc à partir de la sauvegarde .bak. Si aucune sauvegarde n'existe, supprime le bloc PMX_CORE_BASHRC par des marqueurs." + }, + { + "tool": "Bannière MOTD personnalisée", + "restores": "Restaurer le contenu original exact /etc/motd conservé sous /usr/local/share/proxmenux, supprime le fichier lorsqu'il n'existait pas avant, ou supprime en toute sécurité le marqueur existant lors de la migration d'une ancienne installation." + }, + { + "tool": "Fastfetch", + "restores": "Supprime le binaire, le répertoire de configuration, le hook update-motd et le bloc délimité BEGIN FASTFETCH / END FASTFETCH de /root/.bashrc, ~/.profile, /etc/profile et /etc/profile.d/fastfetch.sh. Purge le paquet apt s’il est installé." + }, + { + "tool": "Figurine", + "restores": "Supprime le binaire, l’entrée profile.d et le bloc d’alias de bashrc/profile." + } + ] + }, + { + "title": "Matériel & virtualisation", + "items": [ + { + "tool": "IOMMU / VFIO", + "restores": "Supprime les modules vfio de /etc/modules, les entrées de blocage nouveau / radeon / nvidia et les paramètres intel_iommu=on / amd_iommu=on / iommu=pt / pcie_acs_override de /etc/kernel/cmdline (ZFS) ou GRUB. Reconstruit initramfs." + }, + { + "tool": "Corrections AMD CPU (Ryzen/EPYC)", + "restores": "Supprime idle=nomwait de la ligne de commande du noyau (ZFS) ou GRUB, et les options ignore_msrs / report_ignored_msrs de /etc/modprobe.d/kvm.conf." + }, + { + "tool": "Agent invité pour un hôte Proxmox virtualisé", + "restores": "Lit /usr/local/share/proxmenux/guest_agent.pkg et purge le paquet hôte enregistré. L’installateur choisit qemu-guest-agent, open-vm-tools ou virtualbox-guest-utils selon l’hyperviseur. Sans enregistrement, la désinstallation essaie ces trois paquets. Cela agit sur l’hôte Proxmox imbriqué, pas sur les modèles invités." + } + ] + }, + { + "title": "Stockage", + "items": [ + { + "tool": "Dimensionnement de l'ARC ZFS", + "restores": "Supprime /etc/modprobe.d/99-zfsarc.conf, restaure les *.conf externes en conflit sauvegardés dans /usr/local/share/proxmenux/backups/zfs_arc/, reconstruit initramfs et lance proxmox-boot-tool refresh sur les hôtes systemd-boot." + }, + { + "tool": "Instantanés automatiques ZFS", + "restores": "Supprime les tâches cron écrites par le script et propose apt purge zfs-auto-snapshot. Les instantanés existants sur les pools restent intacts ; supprimez-les séparément si nécessaire." + }, + { + "tool": "Limites de vitesse vzdump", + "restores": "Restaure /etc/vzdump.conf depuis le .bak créé à l’installation pour rétablir bwlimit et ionice à leurs valeurs avant ProxMenux." + } + ] + }, + { + "title": "Services et suppléments", + "items": [ + { + "tool": "Synchronisation du temps", + "restores": "Rétablit le fuseau UTC, valeur par défaut sûre, via timedatectl." + }, + { + "tool": "Génération d’entropie (haveged)", + "restores": "Arrête, désactive et purge le paquet haveged." + }, + { + "tool": "kexec (redémarrages rapides)", + "restores": "Désactive kexec-pve.service, supprime l’unité et l’alias reboot-quick de /root/.bash_profile, puis purge kexec-tools." + }, + { + "tool": "RPC / rpcbind Désactiver", + "restores": "Rétablit séparément rpcbind.service et rpcbind.socket dans leurs états activé/désactivé et actif/inactif enregistrés avant ProxMenux." + }, + { + "tool": "pigz (parallèle gzip)", + "restores": "Rétablit le vrai gzip depuis gzip.distrib, supprime le détournement dpkg et /bin/pigzwrapper, commente la ligne pigz de /etc/vzdump.conf puis lance apt purge pigz après vérification de gzip." + }, + { + "tool": "Services à haute disponibilité", + "restores": "Arrête et désactive pve-ha-lrm, pve-ha-crm et corosync. Les groupes HA existants et les définitions de ressources ne sont pas supprimés — les supprimer de l'interface utilisateur Web si vous n'en avez plus besoin." + }, + { + "tool": "Dépôt Ceph", + "restores": "Purge les paquets Ceph installés par cette option, supprime le deb822 /etc/apt/sources.list.d/ceph.sources sur PVE 9 (ou la liste de Ceph sur PVE 8), et rafraîchit le cache APT." + }, + { + "tool": "OVH RTM (surveillance)", + "restores": "Purge les paquets correspondant à ovh-rtm*, rtm et rtm-*, supprime /etc/rtm et retire l’entrée RTM du registre. Les restes Puppet dans /etc/puppet/ peuvent nécessiter une vérification et un nettoyage manuels ; le répertoire n’est pas supprimé. Hors OVH, l’installateur ne change normalement rien." + } + ] + } + ] + }, + "edge": { + "heading": "Cas particuliers et précautions", + "packageTitle": "La réinstallation touche des paquets Proxmox en cours d’utilisation", + "packageBody": "Si les sauvegardes ProxMenux ne peuvent pas annuler Suppression de l’avertissement d’abonnement, la solution de repli réinstalle pve-manager, proxmox-widget-toolkit, libjs-extjs et libpve-http-server-perl avec --force-confnew. Cela touche l’interface active : actualisez le navigateur et attendez la reconnexion. Évitez les migrations et clonages en cours.", + "rebootTitle": "Les noms persistants et VFIO ont besoin d'un redémarrage", + "rebootBody": "Suppression ProxMenux's 10-proxmenux-*.link fichiers (Noms d'interface persistants) et retour IOMMU/VFIO n'affectent pas le système d'exécution — ils ne comptent qu'après un redémarrage. ProxMenux définit le drapeau de redémarrage automatiquement pour ceux-ci.", + "perItemTitle": "Vous pouvez annuler une modification et garder les autres", + "perItemBody": "Le désinstallateur fonctionne par élément. Si vous voulez seulement supprimer Log2RAM mais garder le réglage réseau et les changements de bashrc, cochez uniquement Log2RAM. Rien d'autre n'est touché et le registre est mis à jour en conséquence." + }, + "inspect": { + "heading": "Inspection manuelle du registre", + "intro": "Si vous voulez voir ce qui est suivi sans ouvrir le menu:", + "outro": "Chaque entrée \"tool\": true correspond à quelque chose de ProxMenux appliqué et peut inverser. L'élimination manuelle d'une entrée n'est pas recommandée — utilisez toujours le menu, qui exécute également la fonction d'inversion au lieu de simplement oublier le changement.", + "reinstallTitle": "Réinstaller après désinstallation", + "reinstallBody": "La réversion d'une optimisation ne vous empêche pas de la réappliquer plus tard. Ouvrez le menu Post-Installer à nouveau et exécutez soit Automatique ou Personnalisable — le registre suivra le nouvel état." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Système automatisé de post-installation", + "href": "/docs/post-install/automated", + "tail": "— réappliquer le niveau de référence par défaut." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— choisir un sous-ensemble différent." + }, + { + "label": "Désinstaller ProxMenux", + "href": "/docs/settings/uninstall-proxmenux", + "tail": "— fonctionnement différent: supprime ProxMenux lui-même, et non ses optimisations appliquées." + }, + { + "label": "Aperçu après l'installation", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/fr/docs/post-install/updates.json b/web/messages/fr/docs/post-install/updates.json new file mode 100644 index 00000000..bab56dc7 --- /dev/null +++ b/web/messages/fr/docs/post-install/updates.json @@ -0,0 +1,112 @@ +{ + "meta": { + "title": "Appliquer les mises à jour disponibles — Optimisations post-installation | Documentation ProxMenux", + "description": "Comment ProxMenux détecte lorsqu'une optimisation post-installation (Log2Ram, Paramètres de mémoire, Limites du système, Logrotate, réglage réseau...) a été mise à jour en amont, et comment appliquer la nouvelle version — depuis le menu Post-Install ou depuis le tableau de bord de Monitor." + }, + "header": { + "title": "Appliquer les mises à jour disponibles", + "description": "Si une optimisation post-installation (Log2Ram, paramètres de mémoire, limites système, Logrotate…) a une version sur disque plus récente que celle enregistrée sur l’hôte, ProxMenux la signale comme mise à jour disponible. Vous pouvez l’appliquer depuis le menu post-installation des scripts ou le tableau de bord Monitor. Les deux relancent la même fonction et actualisent le registre.", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que c'est", + "body": "Les optimisations post-installation ProxMenux ont des versions, par exemple Log2ram SSD Protection v1.2. L’hôte enregistre les optimisations actives et leurs versions dans /usr/local/share/proxmenux/installed_tools.json. Lorsqu’une version ProxMenux fournit une optimisation plus récente, l’écart est détecté et seule celle-ci est proposée à la réapplication, sans relancer toute la post-installation." + }, + "why": { + "heading": "Pourquoi cela existe", + "body": "Les optimisations après installation peuvent être améliorées : meilleur réglage sysctl, limite Logrotate plus stricte, nouvelle méthode de dimensionnement de Log2RAM ou correction d’un cas particulier signalé par un testeur. Sans mécanisme de mise à jour, il fallait relancer manuellement le script après installation, qui réapplique toutes les optimisations, ou renoncer à l’amélioration. Appliquer les mises à jour disponibles permet de relancer volontairement chaque optimisation dont la version a changé." + }, + "detection": { + "heading": "Comment les mises à jour sont détectées", + "steps": [ + { + "title": "Scripts versionnés sur disque", + "body": "Chaque fonction post-installation déclare sa version dans le script (scripts/post_install/auto_post_install.sh et scripts/post_install/customizable_post_install.sh). Un scanner extrait ces versions de la source sur le disque." + }, + { + "title": "Registre des versions sur l’hôte", + "body": "Lorsque l'opérateur a appliqué chaque optimisation, l'appel register_tool correspondant a écrit la version active dans /usr/local/share/proxmenux/installed_tools.json. Ce fichier est la source de la vérité pour \"ce qui est actif sur cet hôte en ce moment\"." + }, + { + "title": "Monitor compare les deux versions", + "body": "Au démarrage et toutes les 24 h, Monitor compare les versions sur disque aux versions enregistrées. Chaque écart crée une entrée dans /usr/local/share/proxmenux/updates_available.json. Ce fichier alimente l’entrée du menu post-installation et la carte du tableau de bord Monitor." + }, + { + "title": "Une notification par nouvelle version", + "body": "Dès qu’une optimisation a une mise à jour en attente, Monitor envoie une notification groupée, par exemple « 4 mises à jour d’optimisations ProxMenux disponibles », avec une ligne par outil au format name (vX → vY), comme pour les paquets Proxmox. Elle ne se répète pas chaque jour pour le même ensemble : seule une nouvelle version ou un nouvel outil dans la liste la déclenche à nouveau." + } + ] + }, + "pathA": { + "heading": "Chemin A — À partir du menu Post-Installation", + "intro": "À partir du menu principal de ProxMenux, ouvrez Paramètres après l'installation Proxmox. Lorsqu'il y a des mises à jour en attente, une nouvelle entrée Appliquer les mises à jour disponibles (N) apparaît juste au-dessus de Désinstaller les optimisations. Le nombre reflète combien d'optimisations ont une version plus récente sur disque que ce que l'hôte a actuellement enregistré. Lorsque tout est à jour, l'entrée n'apparaît tout simplement pas, donc le menu reste propre.", + "menuAlt": "Menu des scripts post-installation montrant Appliquer les mises à jour disponibles (N) au-dessus de Désinstaller les optimisations ; le compteur indique les optimisations dont une version plus récente est sur disque", + "menuCaption": "Appliquer les mises à jour disponibles (N) apparaît seulement si une optimisation a une mise à jour en attente ; l’entrée est masquée quand l’hôte est à jour.", + "checklistBody": "Sélectionner l'entrée ouvre une liste de contrôle avec chaque mise à jour en attente, chaque ligne formatée en name (vX → vY). Toutes les lignes sont pré-cochées par défaut; décochez toutes les lignes que vous ne voulez pas appliquer ce tour.", + "checklistAlt": "Sélecteur Appliquer les mises à jour disponibles avec une ligne par optimisation en attente, son nom et le changement de version (actuelle → disponible). Toutes les lignes sont cochées.", + "checklistCaption": "Sélection individuelle des optimisations à mettre à jour. Le même moteur qu’Automatisé et Personnalisable réapplique chaque fonction en arrière-plan et actualise sa version enregistrée." + }, + "pathB": { + "heading": "Voie B — Depuis le tableau de bord Monitor", + "intro": "Les mêmes mises à jour apparaissent dans Monitor sous Paramètres → Optimisations ProxMenux. La carte affiche un compteur des mises à jour en attente qui ouvre le sélecteur par optimisation. Chaque outil propose aussi sa propre action de mise à jour.", + "imageAlt": "Carte Optimisations ProxMenux dans les paramètres Monitor avec un compteur ouvrant le sélecteur par optimisation et des actions de mise à jour par outil", + "imageCaption": "La carte Optimisations de Monitor donne accès aux mises à jour via son compteur dès qu’une version plus récente est sur disque, sans accès au shell." + }, + "applying": { + "heading": "Ce qui se passe lors de l’application", + "steps": [ + { + "title": "Réexécute la fonction post-installation", + "body": "La fonction de l’optimisation sélectionnée est réexécutée sur l’hôte. Comme chaque fonction après installation est idempotente, la relancer ne duplique pas la configuration : elle remplace la version précédente par la nouvelle, notamment les fichiers sysctl, les fichiers complémentaires et les unités de service." + }, + { + "title": "Actualise le registre", + "body": "L'appel register_tool à l'intérieur de la fonction écrit la nouvelle version dans installed_tools.json. Le scan suivant ne voit plus d'inadéquation et l'entrée mise à jour disparaît du menu et de la carte Monitor." + }, + { + "title": "Pas de redémarrage sauf si la fonction le dit", + "body": "La plupart des mises à jour prennent effet immédiatement. Les mises à jour qui touchent les modules du noyau, les noms d'interface persistants ou VFIO affichent la même invitation de redémarrage qu'une nouvelle installation." + }, + { + "title": "Mise à jour du registre envoyée au moniteur", + "body": "Après le lot, le menu envoie une requête POST à http://127.0.0.1:8008/api/updates/post-install/scan pour reconstruire /usr/local/share/proxmenux/updates_available.json. Une fois toutes les mises à jour appliquées, leur compteur et l’entrée conditionnelle du menu shell disparaissent sans attendre le prochain scan. La carte Optimisations reste disponible." + } + ], + "jqTitle": "jq est nécessaire", + "jqBody": "La liste de contrôle Path A repose sur jq pour analyser les mises à jour en attente JSON. Si le jq manque, le flux s'éteint silencieusement — vous verrez l'entrée du menu avec un nombre mais rien ne se produirait après avoir sélectionné les lignes. Sur n'importe quelle installation Proxmox moderne jq est présente; si dans le doute exécuter apt install -y jq." + }, + "differs": { + "heading": "Comment il diffère des autres chemins", + "headerPath": "Path", + "headerScope": "Portée", + "headerWhen": "Quand ça a du sens", + "rows": [ + { + "pathLabel": "Automatisé", + "pathHref": "/docs/post-install/automated", + "scope": "Ré-applique chaque optimisation dans le paquet.", + "when": "Hôte neuf ou réapplication complète de la configuration de base d’un nœud entièrement géré." + }, + { + "pathLabel": "Personnalisable", + "pathHref": "/docs/post-install/customizable", + "scope": "Choisissez parmi le catalogue complet.", + "when": "Choisir précisément les optimisations actives sur l’hôte." + }, + { + "pathLabel": "appliquer les mises à jour disponibles", + "pathHref": null, + "scope": "Uniquement les optimisations dont la version sur disque a augmenté.", + "when": "Garder les optimisations installées à jour sans toucher au reste." + }, + { + "pathLabel": "Désinstaller les optimisations", + "pathHref": "/docs/post-install/uninstall", + "scope": "Inverser l'optimisation et supprimer son entrée de registre.", + "when": "Annuler une modification précise." + } + ] + }, + "notifTitle": "Contrôle de la notification", + "notifBody": "L’événement Mises à jour d’optimisations ProxMenux disponibles annonce les mises à jour en attente. Activé par défaut sur chaque canal, il peut être désactivé par canal dans Paramètres → Notifications. Il ne se déclenche qu’une fois par ensemble distinct de mises à jour, pas à chaque scan de 24 h." +} diff --git a/web/messages/fr/docs/post-install/virtualization.json b/web/messages/fr/docs/post-install/virtualization.json new file mode 100644 index 00000000..0f2d1bf8 --- /dev/null +++ b/web/messages/fr/docs/post-install/virtualization.json @@ -0,0 +1,116 @@ +{ + "meta": { + "title": "Post-installation : Virtualisation | Documentation ProxMenux", + "description": "Options de virtualisation dans le script post-installation personnalisable ProxMenux : installer automatiquement le bon agent invité si Proxmox fonctionne à l'intérieur d'un VM, et activer IOMMU / VFIO afin que vous puissiez passer les périphériques PCI (GPU, NIC, HBAs) à vos propres VM." + }, + "header": { + "title": "Post-Installation : Virtualisation", + "section": "Paramètres post-installation de Proxmox" + }, + "intro": { + "title": "Ce que cette catégorie couvre", + "body": "Deux options indépendantes. Installer l’agent invité adapté aide lorsque Proxmox fonctionne lui-même dans un autre hyperviseur. Activer la prise en charge de VFIO IOMMU intéresse la plupart des utilisateurs : active les fonctions du noyau pour attribuer directement un GPU, HBA ou une carte réseau à une VM avec des performances quasi natives." + }, + "guestAgent": { + "heading": "installer l'agent invité approprié", + "intro": "Détecte l'environnement de virtualisation sur lequel s'exécute l'hôte Proxmox (en utilisant systemd-detect-virt et dmidecode) et installe le paquet d'outils invités correspondant afin que l'hyperviseur externe puisse communiquer avec Proxmox de manière propre (arrêt progressif, synchronisation d'horloge, reportage IP, etc.).", + "headerDetected": "Hôte détecté", + "headerPackage": "Paquet installé", + "rows": [ + { + "detected": "QEMU / KVM", + "package": "qemu-guest-agent" + }, + { + "detected": "VMware (ESXi, Workstation)", + "package": "open-vm-tools" + }, + { + "detected": "VirtualBox", + "package": "virtualbox-guest-utils" + }, + { + "detected": "Matériel physique (aucun)", + "package": "— non-op, rien installé" + } + ], + "skipTitle": "Ignorez cette option si Proxmox fonctionne sur du matériel physique", + "skipBody": "Si Proxmox fonctionne directement sur le matériel, le cas habituel, cocher cette option ne change rien : le détecteur retourne none et le script quitte sans modification. L’option concerne seulement les installations où Proxmox fonctionne en tant qu’invité pour des tests ou des laboratoires." + }, + "vfio": { + "heading": "Activer la prise en charge de VFIO IOMMU", + "intro": "Active IOMMU sur l’hôte et charge les modules permettant l’accès direct PCI (vfio, vfio_iommu_type1, vfio_pci). Vous pouvez alors attribuer un périphérique physique à une VM, qui y accède directement avec des performances proches du matériel natif.", + "whoTitle": "Qui en a besoin ?", + "whoItems": [ + "Vous voulez attribuer directement un GPU à une VM Windows de jeu ou à une VM macOS.", + "Vous avez un 10G NIC dédié pour un pare-feu/routeur VM (OPNsense, pfSense).", + "Vous souhaitez passer un HBA directement à un TrueNAS/Unraid VM pour ZFS sur disques nus.", + "Vous prévoyez utiliser Coral TPU, une carte de capture, ou un dongle SDR dans un VM." + ], + "whoOutro": "Si aucun de ces éléments ne s'applique, vous pouvez ignorer cette option en toute sécurité. Pour le relais vers un LXC (et non un VM), IOMMU n'est pas requis.", + "doesTitle": "Ce que fait ProxMenux", + "doesIntro": "La fonction tient compte du chargeur de démarrage : elle détecte ZFS (systemd-boot) ou LVM/ext4 (GRUB) et écrit dans le bon fichier. Elle est idempotente : les paramètres déjà présents ne sont pas ajoutés une seconde fois.", + "headerBoot": "Type de démarrage", + "headerFile": "Fichier touché", + "headerPost": "Étape postérieure à la mise à jour", + "bootRows": [ + { + "boot": "systemd-boot (ZFS)", + "file": "/etc/kernel/cmdline", + "post": "proxmox-boot-tool refresh" + }, + { + "boot": "GRUB (LVM/ext4)", + "file": "/etc/default/grub", + "post": "update-grub" + } + ], + "kernelIntro": "Paramètres du noyau ajoutés:", + "modulesIntro": "Modules de noyau ajoutés au /etc/modules:", + "blacklistIntro": "Pilotes en conflit bloqués dans /etc/modprobe.d/blacklist.conf :", + "blacklistTitle": "Bloquer les pilotes GPU empêche l’utilisation du GPU par l’hôte", + "blacklistBody": "La liste de blocage empêche le noyau hôte de lier tout pilote GPU, pour que VFIO puisse prendre le contrôle du GPU. C’est souhaitable pour l’attribution directe à une VM, mais c’est l’opposé de ce qu’il faut pour installer les pilotes NVIDIA sur l’hôte, par exemple pour le transcodage LXC. Choisissez une voie par GPU :", + "pathItems": [ + "GPU → VM: activez VFIO/IOMMU ici, laissez les pilotes GPU sur la liste noire.", + "GPU → LXC (ou hôte) : ignorez cette option, utilisez l’installation NVIDIA sur l’hôte et ne bloquez pas nvidia/nouveau.", + "Deux GPU : l’un peut aller à une VM, l’autre à un LXC, mais une configuration plus précise est nécessaire : lier une seule carte à vfio-pci par son identifiant PCI. La liste de blocage par défaut est trop large ; modifiez ensuite blacklist.conf." + ], + "acsTitle": "À propos de pcie_acs_override — comprenez ce que vous activez", + "acsBody": "pcie_acs_override=downstream,multifunction assouplit la vérification PCIe Access Control Services. Le noyau peut alors séparer des groupes IOMMU signalés comme indivisibles par le firmware, parfois seul moyen d’attribuer un périphérique sans tout le groupe. En contrepartie, l’isolation entre périphériques est réduite : une VM malveillante ou compromise avec accès direct dispose d’une plus grande surface d’attaque via DMA. Acceptable en laboratoire domestique, à bien évaluer pour des charges non fiables. Si inutile, retirez le paramètre de /etc/kernel/cmdline ou /etc/default/grub après le script et relancez la mise à jour du chargeur de démarrage.", + "rebootTitle": "Redémarrage nécessaire", + "rebootBody": "IOMMU, les modules VFIO et la liste de blocage prennent effet après régénération d’initramfs et redémarrage. Le script exécute update-initramfs -u -k all, actualise le chargeur de démarrage et indique qu’un redémarrage est nécessaire pour que Personnalisable le propose à la fin.", + "verifyTitle": "Vérification après redémarrage", + "revertTitle": "Réversible depuis le menu Désinstaller", + "revertBody": "Désinstaller les optimisations annule toutes les modifications : retire les paramètres IOMMU de /etc/kernel/cmdline ou GRUB, les modules VFIO de /etc/modules et les entrées de blocage des pilotes, puis reconstruit initramfs. Un redémarrage applique le retour en arrière." + }, + "related": { + "heading": "Voir aussi", + "items": [ + { + "label": "Ajouter GPU à VM (Passthrough)", + "href": "/docs/hardware/gpu-vm-passthrough", + "tail": "— l'étape suivante naturelle une fois IOMMU + VFIO activé." + }, + { + "label": "Ajouter le contrôleur ou NVMe au VM", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "tail": "— la même infrastructure de transmission pour les contrôleurs de stockage." + }, + { + "label": "commandes GPU Passthrough", + "href": "/docs/help-info/gpu-commands", + "tail": "— Référence de vérification IOMMU." + }, + { + "label": "Désinstaller les optimisations", + "href": "/docs/post-install/uninstall", + "tail": " — annuler proprement IOMMU / VFIO." + }, + { + "label": "Post-installation personnalisable", + "href": "/docs/post-install/customizable", + "tail": "— retour au menu parent." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/automated.json b/web/messages/it/docs/post-install/automated.json new file mode 100644 index 00000000..f6b19215 --- /dev/null +++ b/web/messages/it/docs/post-install/automated.json @@ -0,0 +1,172 @@ +{ + "meta": { + "title": "Script post-installazione automatizzato | Documentazione ProxMenux", + "description": "Lo script post-installazione automatizzato ProxMenux esegue 14 ottimizzazioni predefinite in base all’hardware su un nuovo host Proxmox VE. Non presenta una lista di funzioni da selezionare, ma può chiedere conferma per rimuovere l’avviso di abbonamento, alcune installazioni Log2RAM e il riavvio. Le modifiche reversibili vengono registrate.", + "ogTitle": "Script post-installazione automatizzato | Documentazione ProxMenux", + "ogDescription": "14 ottimizzazioni predefinite in base all’hardware per un nuovo host Proxmox VE, con conferme per alcune azioni e registrazione delle modifiche reversibili." + }, + "header": { + "title": "Script post-installazione automatizzato", + "description": "ProxMenux esegue 14 ottimizzazioni di base predefinite senza lista di funzioni da selezionare. Alcune azioni chiedono conferma. Le modifiche reversibili vengono registrate per Disinstalla ottimizzazioni; gli aggiornamenti dei pacchetti non sono descritti come reversibili.", + "section": "Post-Install · Automatizzato" + }, + "intro": { + "title": "Quando scegliere l’installazione automatizzata", + "body": "Eseguilo su un host Proxmox appena installato per ottenere una configurazione di base senza scegliere ogni funzione. Lo script è idempotente: una seconda esecuzione riapplica le stesse impostazioni. Le funzioni opzionali (Fastfetch, IOMMU, repository Ceph, HA, correzioni AMD…) non fanno parte di questo percorso; sceglile da Personalizzabile se ti servono." + }, + "applies": { + "heading": "Cosa applica lo script", + "intro": "Le ottimizzazioni vengono applicate in questo ordine preciso. La colonna Categoria rimanda alla documentazione dettagliata di ogni modifica nella guida personalizzabile.", + "headerNum": "#", + "headerTool": "Strumento", + "headerWhat": "Che cosa fa", + "headerCategory": "Categoria" + }, + "optimizations": [ + { + "tool": "Repository APT + aggiornamento completo", + "what": "Disabilita le sorgenti Enterprise pve-enterprise.sources e ceph.sources, crea una sorgente no-subscription per il nome in codice Debian dell’host, quindi esegue apt update && apt full-upgrade -y (comando ufficiale di aggiornamento Proxmox).", + "category": "Impostazioni di base", + "categorySlug": "basic-settings" + }, + { + "tool": "Rimozione dell’avviso di abbonamento", + "what": "Modifica l’interfaccia web per nascondere l’avviso «Nessun abbonamento valido». Chiede conferma prima di applicare; reversibile da Disinstalla ottimizzazioni.", + "category": "Personalizzazione", + "categorySlug": "customization" + }, + { + "tool": "Forza IPv4", + "what": "Scrive /etc/apt/apt.conf.d/99-force-ipv4 affinché apt usi solo IPv4, evitando collegamenti IPv6 instabili ai mirror.", + "category": "Rete", + "categorySlug": "network" + }, + { + "tool": "Salta i pacchetti di lingua", + "what": "Scrive /etc/apt/apt.conf.d/99-disable-translations per non scaricare più gli indici delle descrizioni tradotte dei pacchetti, riducendo i dati degli aggiornamenti apt.", + "category": "Impostazioni di base", + "categorySlug": "basic-settings" + }, + { + "tool": "Aumentare i limiti del sistema", + "what": "Aumenta le risorse di monitoraggio inotify, i limiti nofile/nproc, quelli del portachiavi del kernel e fs.file-max tramite sysctl.d, limits.d, pam e systemd, per host con molti container.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Regolazione della memoria", + "what": "Imposta vm.swappiness=10, rapporti bilanciati di pagine modificate non ancora scritte, vm.max_map_count=262144 e compattazione proattiva se supportata. La politica di overcommit della memoria del kernel resta quella predefinita di Proxmox.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Comportamento in caso di kernel panic", + "what": "Configura l’host per riavviarsi 10 secondi dopo un panic / oops / hardlockup invece di restare bloccato indefinitamente.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Regolazione dello stack di rete", + "what": "Dimensioni dei buffer TCP, rafforzamento IPv4 (redirect disattivati, rp_filter=2, registrazione martian disattivata), porte locali 1024-65535, rilevamento MTU TCP, RFC 1337 e script /usr/local/sbin/proxmenux-fwbr-tune collegato a un’unità systemd a esecuzione singola e una regola udev. Così rp_filter=0 / log_martians=0 vengono riapplicati alle interfacce fwbr*/fwln*/fwpr*/tap* ogni volta che Proxmox le ricrea all’avvio/arresto delle VM, al riavvio o alla migrazione live.", + "category": "Rete", + "categorySlug": "network" + }, + { + "tool": "Personalizzazione Bashrc (root)", + "what": "PS1 colorato, alias comuni (l/la/ll/ls/grep), cronologia con data e ora e caricamento di bash-completion, dentro un blocco delimitato PMX_CORE_BASHRC facile da rimuovere.", + "category": "Personalizzazione", + "categorySlug": "customization" + }, + { + "tool": "Log2RAM (ottimizzato per SSD, automatico)", + "what": "Riduce l’usura SSD/NVMe spostando /var/log in un ramdisk tmpfs sincronizzato periodicamente sul disco. Installazione dal progetto upstream quando il disco root è SSD o NVMe. Dimensione in base alla RAM dell’host (128M / 256M / 512M), sincronizzazione periodica e protezione automatica che elimina vecchi journal all’80% e tronca i log molto attivi al 92% prima della scrittura. Adatta i limiti journald al ramdisk. Dettagli su Log2RAM.", + "category": "Archiviazione", + "categorySlug": "storage" + }, + { + "tool": "Autotrim ZFS (solo SSD)", + "what": "Attiva zpool autotrim=on su ogni pool ZFS i cui vdev siano tutti SSD o NVMe con supporto TRIM, controllando /sys/block/[dev]/queue/rotational e discard_granularity. I pool su HDD vengono saltati. Per la disinstallazione registra solo i pool realmente modificati da ProxMenux; quelli su cui hai attivato autotrim manualmente restano invariati.", + "category": "Archiviazione", + "categorySlug": "storage" + }, + { + "tool": "Limiti di dimensione di journald", + "what": "Forza l’archiviazione persistente, limita SystemMaxUse=64M / RuntimeMaxUse=60M e abilita compressione e log di livello info richiesti da Monitor. Viene saltato se Log2RAM è attivo, perché esegue la propria regolazione.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Regolazione di logrotate", + "what": "Imposta globalmente daily seguito da size 10M, conserva 7 rotazioni e abilita compressione e copytruncate. Il criterio di dimensione successivo prevale; le regole specifiche possono sovrascriverlo. Adatto a Log2RAM, ma la frequenza dipende da regole e timer.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Nomi di interfaccia persistenti", + "what": "Scrive un file /etc/systemd/network/10-proxmenux-<iface>.link per scheda fisica, con intestazione «Managed by ProxMenux», che associa il MAC al nome attuale. I nomi eth0 / enp… restano stabili dopo riavvii e aggiunte di schede.", + "category": "Rete", + "categorySlug": "network" + } + ], + "hardwareTitle": "Impostazioni predefinite in base all’hardware", + "hardwareBody": "Lo script legge l'hardware dell'host prima di applicare le impostazioni. Log2RAM è installato solo su dischi SSD/root NVMe per impostazione predefinita (richiede se il rilevamento indica diversamente). La dimensione del disco ram Log2RAM viene scelta dal totale RAM (≤ 8 GB → 128M, ≤ 16 GB → 256M, '>' 16 GB → 512M). I limiti del journald vengono adattati alla dimensione del ramdisk quando Log2RAM è attivo, per evitare di riempirlo.", + "upgrade": { + "heading": "Aggiorna gli elenchi dei pacchetti e il sistema", + "intro": "Il primo passo del pacchetto automatizzato è l'aggiornamento Proxmox. La guida di aggiornamento di Proxmox per un host in esecuzione (nella stessa versione principale) è quella di eseguire:", + "after": "Questa riga è il comando ufficiale delle versioni attuali di Proxmox. Lo script automatizzato esegue esattamente questo e aggiunge la pulizia dei repository e le operazioni successive consigliate dalla guida — come l’utilità separata Aggiornamento del sistema Proxmox:", + "items": [ + "Disabilita le sorgenti Enterprise pve-enterprise.sources / ceph.sources, rimuove i vecchi file dei repository e crea una sorgente no-subscription per il nome in codice dell’host.", + "Esegue l’aggiornamento senza interazione con DEBIAN_FRONTEND=noninteractive e --force-confdef --force-confold: conserva i file personalizzati anche quando sono cambiati nel progetto originale.", + "Installa pacchetti Proxmox essenziali se mancanti (zfsutils-linux, proxmox-backup-restore-image, chrony).", + "Controllo di coerenza dei metadati LVM, apt-get autoremove -y + apt-get autoclean -y e richiesta di riavvio solo se il kernel è cambiato." + ], + "sameTitle": "Stesso aggiornamento, due punti di ingresso", + "sameBody": "Il bundle automatizzato e l'utilità standalone Proxmox System Update condividono gli stessi script sottostanti (update-pve8.sh / update-pve9_2.sh). Utilizzare l'utilità da solo quando si desidera aggiornare l'host solo senza applicare il resto delle ottimizzazioni." + }, + "endResult": { + "heading": "Risultato finale previsto", + "body": "Al termine vedrai un messaggio di successo con l’output di ogni passaggio e una richiesta di riavvio, necessario per alcune impostazioni del kernel. Puoi rimandarlo: le impostazioni si applicheranno al prossimo avvio.", + "imageAlt": "Script post-installazione automatizzato — output finale del terminale con ogni ottimizzazione applicata correttamente" + }, + "notDoes": { + "heading": "Che cosa questo script NON fa", + "items": [ + "Rilevamento automatico del fuso orario (commentato nel sorgente; usa Personalizzabile se ti serve).", + "Disattivare portmapper / rpcbind (vedi Sicurezza).", + "Abilitare IOMMU / VFIO (vedi Virtualizzazione).", + "Installare Fastfetch / Figurine / repository Ceph / HA / correzioni CPU AMD (vedi Opzionali).", + "Installare pigz o regolare ZFS ARC (vedi Prestazioni / Archiviazione)." + ] + }, + "xshokTitle": "rilevamento xshok-proxmox", + "xshokBody": "Se l'host ha precedentemente eseguito lo script xshok-proxmox, ProxMenux rileva il file marcatore e ti avvisa prima di continuare. Alcune modifiche possono sovrapporsi. Lo script compagno è deprecato — se si decide di continuare comunque, rivedere la panoramica per contesto.", + "revert": { + "heading": "Ripristino", + "body": "Ogni strumento della tabella viene registrato in /usr/local/share/proxmenux/installed_tools.json. Apri Disinstalla ottimizzazioni per scegliere quali elementi ripristinare. Le copie dei file modificati sono accanto agli originali con suffisso .bak." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": "— scegli esattamente quello che vuoi dallo stesso catalogo." + }, + { + "label": "Disinstalla ottimizzazioni", + "href": "/docs/post-install/uninstall", + "tail": "— ripristinare qualsiasi sottoinsieme di ciò che è stato applicato qui." + }, + { + "label": "Comandi di sistema utili", + "href": "/docs/help-info/system-commands", + "tail": " — verifica le modifiche (uptime, free, journalctl, ecc.)." + }, + { + "label": "Panoramica post-install", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/basic-settings.json b/web/messages/it/docs/post-install/basic-settings.json new file mode 100644 index 00000000..331ee23a --- /dev/null +++ b/web/messages/it/docs/post-install/basic-settings.json @@ -0,0 +1,240 @@ +{ + "meta": { + "title": "Post-Install: Impostazioni di base | Documentazione ProxMenux", + "description": "Opzioni di base post-installazione: passare ai repository Proxmox senza abbonamento e aggiornare il sistema, rilevare il fuso orario e attivare NTP, saltare le traduzioni APT e scegliere tra 25 utilità comuni da installare." + }, + "header": { + "title": "Post-Install: Impostazioni di base", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa copre questa categoria", + "body": "Cinque opzioni di base per un host Proxmox nuovo: passare ai repository della community senza abbonamento, aggiornare tutto il sistema, configurare automaticamente fuso orario e NTP, disattivare le traduzioni APT per risparmiare banda e spazio e scegliere tra 25 utilità comuni." + }, + "upgrade": { + "heading": "Aggiorna gli elenchi dei pacchetti e il sistema", + "intro": "Riconfigura APT per utilizzare il repository gratuito pve-no-subscription (invece del repo aziendale che richiede un abbonamento) e gestisce un aggiornamento completo del sistema. I passaggi esatti dipendono dalla versione principale di Proxmox VE: ProxMenux lo rileva e invia allo script giusto.", + "headerVersion": "Versione PVE", + "headerScript": "Script di selezione per versione", + "headerCodename": "Nome in codice Debian", + "rows": [ + { + "version": "9.x", + "script": "update-pve9_2.sh", + "codename": "trixie" + }, + { + "version": "8.x", + "script": "update-pve8.sh", + "codename": "bookworm" + } + ], + "officialTitle": "Raccomandazione ufficiale Proxmox", + "officialBody": "La guida ufficiale Proxmox consiglia questi comandi in quest’ordine:", + "officialOutro": "È il comando usuale per aggiornare all’interno della stessa versione principale di Proxmox VE. Controlla i repository e le modifiche proposte ai pacchetti prima di procedere. Il passaggio a un’altra versione principale richiede la procedura ufficiale di migrazione.", + "doesTitle": "Ciò che l'opzione ProxMenux fa — verificata contro lo script", + "doesIntro": "L’aggiornamento ProxMenux esegue i comandi apt indicati e aggiunge passaggi preliminari e finali che altrimenti dovresti gestire manualmente. L’elenco seguente corrisponde allo script di selezione; vedi Aggiornamento del sistema Proxmox per tutti i dettagli.", + "doesItems": [ + "Prima di tutto, sistemare i repository. Disabilita i repository enterprise pve-enterprise.sources / ceph.sources, elimina i vecchi file dei repository rimasti dalle precedenti versioni di PVE e scrive un file proxmox.sources pulito che punta al canale gratuito pve-no-subscription, corrispondente al nome in codice Debian dell'host: trixie per PVE 9, bookworm per PVE 8.", + "Riscrive i repository Debian con main / updates / security e non-free-firmware, eliminando l’avviso del firmware durante l’aggiornamento.", + "Esegue l’aggiornamento ufficiale. apt-get update seguito da apt full-upgrade -y (PVE 9) oppure apt dist-upgrade -y (PVE 8), senza interazione con --force-confdef --force-confold per mantenere i file di configurazione personalizzati.", + "Installa i pacchetti essenziali se mancanti: zfsutils-linux, proxmox-backup-restore-image, chrony.", + "Controlla i metadati LVM. Cerca VM con passthrough dei dischi che potrebbero aver lasciato vecchie intestazioni di volumi fisici sui dischi grezzi. Segnala anomalie senza correzioni automatiche.", + "Pulisce al termine: apt-get autoremove -y + apt-get autoclean -y, poi chiede il riavvio se il kernel è stato aggiornato o esiste /var/run/reboot-required." + ], + "shortTitle": "In breve", + "shortBody": "L’opzione esegue il comando consigliato apt update && apt full-upgrade -y, aggiunge la sistemazione dei repository e la pulizia finale indicate nella guida ufficiale e chiede il riavvio al termine. Vedi Aggiornamento del sistema Proxmox per il diagramma completo: lo stesso strumento è disponibile separatamente nel menu principale.", + "subTitle": "Non applicare a un host con abbonamento", + "subBody": "Se hai un abbonamento Proxmox e vuoi mantenere i repository Enterprise, salta l’opzione. Disabilita Enterprise e passa al canale della community. L’aggiornamento dei pacchetti e la riscrittura dei repository non sono reversibili da Disinstalla ottimizzazioni; riconfigura esplicitamente i repository per cambiare canale in seguito.", + "safetyTitle": "Controllo di sicurezza post-update", + "safetyBody": "Dopo l’aggiornamento, lo script cerca vecchi metadati di volumi fisici (PV) sui dischi. Può accadere quando una VM con passthrough scrive intestazioni LVM su un disco grezzo. Se rileva qualcosa di sospetto, avvisa e suggerisce pvs per l’ispezione. Nessuna azione automatica." + }, + "time": { + "heading": "Sincronizza l’ora automaticamente", + "intro": "Rileva l'IP pubblico del server tramite dig myip.opendns.com @resolver1.opendns.com, quindi chiede a ipapi.co/'{'ip'}'/timezone di cercare il fuso orario IANA corrispondente e applicarlo con timedatectl set-timezone. Infine consente NTP con timedatectl set-ntp true.", + "depTitle": "Dipende da due servizi esterni", + "depBody": "La ricerca si basa su OpenDNS e ipapi.co raggiungibile, e sulle loro risposte sono corrette. Se si esegue Proxmox dietro una VPN o su un VLAN che evade da una regione diversa, il fuso orario auto-detected potrebbe essere sbagliato. In questo caso saltare questa opzione e impostare il fuso orario a mano:", + "revertTitle": "Reversibile dal menu Disinstalla", + "revertBody": "Disinstalla ottimizzazioni reimposta il fuso orario su UTC, un valore sicuro. NTP resta attivo: l’orologio continua a sincronizzarsi e mostra UTC finché non imposti un altro fuso." + }, + "languages": { + "heading": "Salta il download di lingue aggiuntive", + "intro": "Durante apt update, APT può scaricare descrizioni tradotte dei pacchetti oltre ai metadati principali. L’opzione le disattiva per risparmiare banda e spazio. Prima, ProxMenux verifica che la locale dell’host sia generata: legge /etc/default/locale o /etc/environment, aggiunge a /etc/locale.gen se manca ed esegue locale-gen. Le impostazioni locali della shell restano quindi intatte.", + "writtenTitle": "Cosa si scrive", + "revertTitle": "Reversibile dal menu Disinstalla", + "revertBody": "Cancellare /etc/apt/apt.conf.d/99-disable-translations (sia manualmente che dal menu Disinstalla) ripristina il comportamento predefinito e APT scarica nuovamente i file di lingua." + }, + "utilities": { + "heading": "Installa utilità di sistema comuni", + "intro": "Apre una lista di 25 utilità selezionate in gruppi. Scegli e conferma: ProxMenux le installa con apt, verifica il risultato e mostra un riepilogo finale.", + "imageAlt": "Selettore delle utilità ProxMenux: Spazio per selezionare, Invio per confermare", + "reuseTitle": "La stessa lista viene riutilizzata altrove", + "reuseBody": "Il catalogo di 25 utilità è definito in un solo punto: PROXMENUX_UTILS in scripts/global/utils-install-functions.sh. Il menu Utilità e strumenti → Utilità di sistema mostra la stessa lista per aggiungerne altre in seguito senza ripetere la post-installazione.", + "listTitle": "Cosa c'è nella lista", + "groups": [ + { + "group": "Monitor di sistema", + "items": [ + { + "pkg": "htop", + "desc": "Visualizzatore interattivo dei processi" + }, + { + "pkg": "btop", + "desc": "Monitor di risorse moderne (CPU, RAM, dischi, rete, processi)" + }, + { + "pkg": "s-tui", + "desc": "Interfaccia terminale per stress test e monitoraggio CPU" + }, + { + "pkg": "iftop", + "desc": "Uso della larghezza di banda per connessione in tempo reale" + }, + { + "pkg": "iotop", + "desc": "I/O disco per processo" + }, + { + "pkg": "iptraf-ng", + "desc": "Monitor LAN IP interattivo" + } + ] + }, + { + "group": "Rete", + "items": [ + { + "pkg": "iperf3", + "desc": "Misura la larghezza di banda massima raggiungibile tra gli host" + }, + { + "pkg": "net-tools", + "desc": "Strumenti legacy (ifconfig, netstat, route). Ancora utile per i controlli rapidi." + }, + { + "pkg": "ipset", + "desc": "Gestire grandi set IP nel kernel — utile con le regole iptables/nftables." + } + ] + }, + { + "group": "Download e archivi", + "items": [ + { + "pkg": "axel", + "desc": "Acceleratore di download parallelo leggero" + }, + { + "pkg": "aria2", + "desc": "Downloader multi-source / multi-protocollo (HTTP, FTP, BitTorrent, Metalink)" + }, + { + "pkg": "unzip", + "desc": "Estrarre archivi ZIP" + }, + { + "pkg": "zip", + "desc": "Crea archivi ZIP" + }, + { + "pkg": "cabextract", + "desc": "Estrarre archivi Microsoft CAB (utile con le ISO di Windows)" + }, + { + "pkg": "wimtools", + "desc": "Gestire immagini WIM di Windows (estrarre, dividere, montare, applicare)" + }, + { + "pkg": "genisoimage", + "desc": "Costruisci immagini ISO 9660 da un albero di directory" + } + ] + }, + { + "group": "Testo e file", + "items": [ + { + "pkg": "dos2unix", + "desc": "Convertire i terminatori di riga CRLF (Windows) in LF (Unix)" + }, + { + "pkg": "grc", + "desc": "Colorazione generica: applica l’evidenziazione della sintassi all’output di ping, traceroute, dig, tail e altri comandi" + }, + { + "pkg": "plocate", + "desc": "Ricerca file veloce (indicizzata). Eseguire `updatedb` dopo l'installazione per costruire l'indice." + } + ] + }, + { + "group": "Accesso remoto e sessioni", + "items": [ + { + "pkg": "sshpass", + "desc": "Autenticazione SSH con password senza interazione (utile negli script, non nell’uso quotidiano)" + }, + { + "pkg": "tmux", + "desc": "Multiplexer di terminale: scollegare sessioni, dividere pannelli e mantenere le sessioni dopo una disconnessione" + } + ] + }, + { + "group": "Hardware e basso livello", + "items": [ + { + "pkg": "msr-tools", + "desc": "Lettura/scrittura dei registri specifici del modello CPU (rdmsr, wrmsr)" + }, + { + "pkg": "intel-gpu-tools", + "desc": "Utilità diagnostiche Intel GPU tra cui `intel_gpu_top`" + } + ] + }, + { + "group": "Virtualizzazione", + "items": [ + { + "pkg": "libguestfs-tools", + "desc": "Ispezionare e modificare immagini disco VM (virt-ls, virt-cat, guestmount...)" + }, + { + "pkg": "chntpw", + "desc": "Modifica SAM di Windows — utile per il recupero di password su VM Windows che eredite" + } + ] + } + ], + "actionTitle": "Alcuni di loro in azione", + "noBulkTitle": "Vengono rimosse solo le utilità installate da ProxMenux", + "noBulkBody": "ProxMenux registra solo i pacchetti selezionati che non erano già installati. Disinstalla ottimizzazioni li rimuove completamente e conserva quelli già presenti. Gli aggiornamenti APT non hanno un ripristino atomico sicuro: disinstallare le utilità non annulla l’aggiornamento del sistema." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Aggiornamento sistema Proxmox", + "href": "/docs/utils/system-update", + "tail": " — Riesegue il ciclo apt update + dist-upgrade su richiesta." + }, + { + "label": "Installatore delle utilità di sistema", + "href": "/docs/utils/system-utils", + "tail": "— installare (o reinstallare) le utilità singolarmente dopo l'installazione." + }, + { + "label": "Comandi aggiornamenti e pacchetti", + "href": "/docs/help-info/update-commands", + "tail": " — Riferimento apt per la shell." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/customizable.json b/web/messages/it/docs/post-install/customizable.json new file mode 100644 index 00000000..1526a3b9 --- /dev/null +++ b/web/messages/it/docs/post-install/customizable.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Script post-installazione personalizzabile | Documentazione ProxMenux", + "description": "Scegli esattamente quali ottimizzazioni applicare a un host Proxmox VE con ProxMenux. 10 categorie, circa 35 strumenti e un’interfaccia con caselle di selezione. Include tutto lo script Automatizzato, più opzioni esplicite (IOMMU, Fastfetch, Figurine, Ceph, HA, correzioni AMD…).", + "ogTitle": "Script post-installazione personalizzabile | Documentazione ProxMenux", + "ogDescription": "10 categorie, circa 35 ottimizzazioni individuali. Scegli esattamente cosa vuoi su un host Proxmox VE. Le modifiche reversibili sono registrate." + }, + "header": { + "title": "Script post-installazione personalizzabile", + "description": "Scegli esattamente quali ottimizzazioni applicare a un host Proxmox VE. ProxMenux raggruppa circa 35 strumenti in 10 categorie in un’unica finestra con caselle di selezione. Lo stesso motore di Automatizzato, con controllo completo sulle modifiche.", + "section": "Post-installazione · Personalizzabile" + }, + "intro": { + "title": "Quando scegliere Personalizzabile", + "body": "Scegli questa opzione se sai già quali regolazioni vuoi o non vuoi sull’host. Una lista con caselle raggruppate per categoria permette di selezionare, deselezionare e combinare le ottimizzazioni. Puoi riapplicarle in seguito; le modifiche reversibili sono registrate per Disinstalla ottimizzazioni. Gli aggiornamenti dei pacchetti non sono presentati come reversibili." + }, + "compare": { + "heading": "Confronto con Automatizzato", + "body": "Personalizzabile include tutto lo script Automatizzato: le stesse 14 ottimizzazioni di base e molte opzioni che Automatizzato omette intenzionalmente, utili per hardware specifico (correzioni AMD), hosting specifico (OVH RTM) o carichi particolari (IOMMU/VFIO, repository Ceph, alta disponibilità, Fastfetch, Figurine, regolazione dell’ARC ZFS, pigz, istantanee ZFS automatiche, limiti di velocità vzdump, Open vSwitch, TCP BBR…)." + }, + "categoriesSection": { + "heading": "Le 10 categorie", + "body": "Lo script Personalizzabile raggruppa le ottimizzazioni in 10 categorie in un’unica finestra con caselle di selezione. Ogni categoria ha una pagina di documentazione: apri una scheda per motivazioni, valori predefiniti e verifiche di ogni opzione." + }, + "categories": [ + { + "name": "Impostazioni di base", + "description": "Pulisce le sorgenti APT, esegue l’aggiornamento ufficiale Proxmox e imposta fuso orario, impostazioni locali e utilità comuni. La base di tutte le altre categorie." + }, + { + "name": "Sistema", + "description": "Regola i log e i limiti del kernel per un host che ospita molte VM e container. Include journald, logrotate, sysctl (memoria, limiti dei file), comportamento in caso di kernel panic e riavvii rapidi." + }, + { + "name": "Virtualizzazione", + "description": "Prepara l’host per la virtualizzazione avanzata. Installa l’agente guest adatto quando Proxmox stesso gira in una VM supportata e abilita IOMMU/VFIO per il passthrough PCI di GPU, controller e TPU." + }, + { + "name": "Rete", + "description": "Rafforza e regola lo stack di rete dell’host. Forza APT su IPv4, applica impostazioni di sicurezza sysctl e buffer TCP, offre Open vSwitch, TCP BBR e TCP Fast Open e associa nomi persistenti delle interfacce agli indirizzi MAC." + }, + { + "name": "Archiviazione", + "description": "Configura i comuni sottosistemi di archiviazione Proxmox: dimensione dell’ARC ZFS, istantanee ZFS automatiche, autotrim ZFS per pool SSD/NVMe e limiti di velocità vzdump per evitare di saturare i dischi durante i backup." + }, + { + "name": "Sicurezza", + "description": "Riduce la superficie di attacco esposta per impostazione predefinita. Disattiva i servizi RPC portmapper/rpcbind che Proxmox non richiede ma lascia in ascolto." + }, + { + "name": "Personalizzazione", + "description": "Modificare l'esperienza visiva e shell dell'ospite: colori e alias in bashrc, banner MOTD e rimozione dell'avviso di abbonamento nell'interfaccia utente web." + }, + { + "name": "Monitoraggio", + "description": "Integra l’host con OVH Real-Time Monitoring. Installa RTM solo se ProxMenux rileva un server OVH; sugli altri host non apporta modifiche." + }, + { + "name": "Prestazioni", + "description": "Accelerare le operazioni di compressione (backup, trasferimenti) sostituendo gzip con la sua controparte parallela pigz." + }, + { + "name": "Opzionale", + "description": "Opzioni specializzate non necessarie a tutti gli host: correzioni CPU AMD, banner Fastfetch, nome host 3D con Figurine, aggiornamento dell’indice PVE Appliance Manager, repository Ceph, servizi di alta disponibilità, Log2RAM per ridurre l’usura degli SSD e profilo swap ZRAM." + } + ], + "mixTip": { + "title": "Combina Automatizzato e Personalizzabile", + "body": "Un uso comune: esegui prima Automatizzato per la configurazione di base, poi apri Personalizzabile e scegli solo gli strumenti opzionali utili, come IOMMU per il passthrough GPU. Le modifiche sono registrate separatamente; Disinstalla mostra tutto ciò che hai applicato, indipendentemente dalla modalità usata." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Post-installazione automatizzata", + "href": "/docs/post-install/automated", + "tail": " — impostazioni predefinite ragionevoli applicate senza domande." + }, + { + "label": "Disinstalla ottimizzazioni", + "href": "/docs/post-install/uninstall", + "tail": " — annulla in modo pulito le opzioni selezionate." + }, + { + "label": "Impostazioni di base", + "href": "/docs/post-install/basic-settings", + "tail": "— repos, tempo, lingua, utilità." + }, + { + "label": "Virtualizzazione", + "href": "/docs/post-install/virtualization", + "tail": "— IOMMU + VFIO per il passaggio." + }, + { + "label": "Sicurezza", + "href": "/docs/post-install/security", + "tailRich": " · Archiviazione · Rete · Personalizzazione — altre categorie." + }, + { + "label": "Panoramica post-installazione", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/customization.json b/web/messages/it/docs/post-install/customization.json new file mode 100644 index 00000000..6bc72270 --- /dev/null +++ b/web/messages/it/docs/post-install/customization.json @@ -0,0 +1,74 @@ +{ + "meta": { + "title": "Post-Install: Personalizzazione | Documentazione ProxMenux", + "description": "Opzioni di personalizzazione nello script post-installazione personalizzabile di ProxMenux: prompt bash colorato con alias utili, banner ProxMenux nel MOTD e rimozione dell’avviso di abbonamento dall’interfaccia web Proxmox." + }, + "header": { + "title": "Dopo l'installazione: personalizzazione", + "description": "Regolazioni estetiche e pratiche per l’host Proxmox. Rendono la shell più piacevole e nascondono l’avviso di abbonamento nell’interfaccia web. Bashrc, MOTD e banner sono registrati e reversibili dal menu Disinstalla.", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa copre questa categoria", + "body": "Tre piccole opzioni indipendenti: un prompt bash colorato con alias per la shell root, un banner MOTD di una riga visibile all’accesso SSH e la rimozione della finestra «Nessun abbonamento valido» mostrata a ogni accesso all’interfaccia web Proxmox." + }, + "bashrc": { + "heading": "Personalizza bashrc", + "intro": "Inserisce in /root/.bashrc un blocco con prompt colorato, cronologia con data e ora, alias standard di ls / grep e un source per il completamento bash. Migliora il lavoro via SSH e rende chiaro su quale host ti trovi quando hai molte schede aperte.", + "writesTitle": "Ciò che ProxMenux aggiunge a .bashrc", + "writesOutro": "Il blocco è delimitato dai marcatori PMX_CORE_BASHRC. Eseguire di nuovo lo script sostituisce il blocco precedente senza duplicarlo. L’originale .bashrc viene salvato una volta in /root/.bashrc.bak e una riga source /root/.bashrc viene aggiunta a /root/.bash_profile per applicare il prompt anche alle shell di login, ad esempio dopo su -.", + "rootTitle": "Si applica solo a root", + "rootBody": "La personalizzazione si applica alla shell dell’account root. Gli altri utenti creati sull’host mantengono le proprie impostazioni predefinite. Se amministri Proxmox esclusivamente dall’interfaccia web e non usi mai la shell, questa opzione ha solo un effetto estetico e puoi saltarla." + }, + "motd": { + "heading": "Imposta un banner MOTD personalizzato", + "intro": "Antepone \"This system is optimised by: ProxMenux\" a /etc/motd, il messaggio dopo un accesso SSH riuscito, sopra il prompt e prima degli script update-motd. Innocuo e puramente informativo: conferma a colpo d’occhio che ProxMenux è stato applicato sull’host.", + "writesTitle": "Cosa scrive ProxMenux", + "writesOutro": "Alla prima applicazione, ProxMenux registra se /etc/motd esisteva e ne salva il contenuto originale in /usr/local/share/proxmenux. L’operazione è idempotente: se la riga identificativa è già presente, non viene aggiunta. Le installazioni precedenti con /etc/motd.bak vengono migrate allo stesso stato reversibile." + }, + "banner": { + "heading": "Rimuovi il banner di abbonamento", + "intro": "Rimuove la finestra «Non hai un abbonamento valido per questo server» che appare a ogni accesso web Proxmox senza abbonamento Enterprise. ProxMenux tiene conto della versione e avvia lo script adatto ai diversi pacchetti dell’interfaccia delle versioni principali.", + "versionTitle": "Scelta dello script in base alla versione", + "versionItems": [ + "PVE 9.x → esegue remove-banner-pve-v3.sh, che modifica proxmoxlib.js per desktop e la nuova interfaccia mobile basata su Yew.", + "PVE 8.x → esegue remove-banner-pve8.sh, solo per l’interfaccia desktop." + ], + "versionOutro": "Prima della modifica, ProxMenux salva i file JS/template originali in /usr/local/share/proxmenux/backups/ con data e ora. Disinstalla usa queste copie per ripristinarli; se il backup manca o è danneggiato, reinstalla i pacchetti dell’interfaccia Proxmox.", + "breakTitle": "Può rompersi dopo gli aggiornamenti di Proxmox", + "breakBody": "Gli aggiornamenti dell’interfaccia Proxmox sovrascrivono spesso proxmoxlib.js e possono far tornare l’avviso. Puoi riapplicare l’opzione per modificare il file oppure accettare l’avviso fino ad allora. ProxMenux installa anche un hook APT che riapplica la modifica dopo gli aggiornamenti dei pacchetti: vedi Disinstalla ottimizzazioni per rimuoverlo.", + "legalTitle": "Nota legale (sempre vale la pena ripetere)", + "legalBody": "Questa opzione nasconde solo l’avviso dell’interfaccia. Non concede supporto Enterprise o accesso al repository Enterprise e non cambia la licenza del software. Proxmox VE è distribuito sotto GNU AGPLv3. Un abbonamento sostiene il progetto e dà accesso al canale di aggiornamento Enterprise: scegli il supporto adatto al tuo ambiente." + }, + "verify": { + "heading": "Verifica", + "intro": "Dopo aver applicato tutti e tre:", + "reversibleTitle": "Tutti e tre i cambiamenti di personalizzazione sono tracciati", + "reversibleBody": "Disinstalla ottimizzazioni ripristina /root/.bashrc, riporta MOTD al contenuto esatto precedente a ProxMenux o elimina il file se prima non esisteva e ripristina i file dell’interfaccia modificati dal backup oppure reinstalla i pacchetti necessari." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Opzionale", + "href": "/docs/post-install/optional", + "tail": " — Fastfetch e Figurine, altre personalizzazioni visive." + }, + { + "label": "Mostra informazioni sulla versione", + "href": "/docs/settings/show-version-information", + "tail": " — conferma che le personalizzazioni sono registrate come installate." + }, + { + "label": "Disinstalla ottimizzazioni", + "href": "/docs/post-install/uninstall", + "tail": " — ripristina bashrc, motd e l’avviso di abbonamento." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/index.json b/web/messages/it/docs/post-install/index.json new file mode 100644 index 00000000..cdb0054b --- /dev/null +++ b/web/messages/it/docs/post-install/index.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Script post-installazione di Proxmox VE — Automatizzato e personalizzabile | ProxMenux", + "description": "Panoramica degli script post-installazione di ProxMenux per Proxmox VE. Automatizzato applica impostazioni predefinite ragionevoli senza domande; Personalizzabile permette di scegliere esattamente cosa applicare in 10 categorie; Disinstalla ottimizzazioni ripristina le modifiche reversibili supportate.", + "ogTitle": "Script post-installazione di Proxmox VE — Automatizzato e personalizzabile", + "ogDescription": "Applica le comuni ottimizzazioni post-installazione di Proxmox VE in 10 categorie, automaticamente o a scelta, con opzioni reversibili.", + "twitterTitle": "Script dopo l'installazione di Proxmox VE | ProxMenux", + "twitterDescription": "Ottimizzazione post-installazione automatizzata e personalizzabile per Proxmox VE — con opzioni reversibili." + }, + "header": { + "title": "Script dopo l'installazione", + "description": "Configura un host Proxmox VE appena installato con le ottimizzazioni post-installazione di ProxMenux. Applica automaticamente la configurazione di base, scegli le singole opzioni, aggiorna le funzioni installate o ripristina le modifiche reversibili supportate. Gli aggiornamenti dei pacchetti non sono presentati come reversibili.", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "A cosa serve questo menu", + "body": "Dopo l’installazione di Proxmox VE, decine di piccole modifiche rendono l’host più veloce e più facile da mantenere: repository senza abbonamento, limiti ragionevoli per journald, buffer TCP adeguati, salvataggio dei log che preserva gli SSD, miglioramenti di bashrc e altro. ProxMenux le automatizza e registra le modifiche di configurazione reversibili supportate." + }, + "openingMenu": { + "heading": "Apertura del menu", + "body": "Dal menu principale di ProxMenux, selezionare Impostazioni post-installazione Proxmox. Vedrai questo:", + "imageAlt": "Menu degli script post-installazione: Automatizzato, Personalizzabile, la voce condizionale Applica aggiornamenti disponibili (solo se ci sono aggiornamenti in attesa) e Disinstalla, seguiti dalla sezione Script della community" + }, + "threeWays": { + "heading": "Quattro modi per applicare le ottimizzazioni", + "body": "Le quattro voci ProxMenux condividono lo stesso codice e registro degli strumenti installati, offrendo diversi livelli di controllo. Applica aggiornamenti disponibili compare solo se almeno un’ottimizzazione installata ha una versione su disco più recente di quella registrata; resta nascosta su un host appena configurato." + }, + "routes": [ + { + "title": "Automatizzato", + "description": "Una serie curata di 14 ottimizzazioni sicure e sempre utili applicate in sequenza con zero prompt. Buon default per la maggior parte degli utenti.", + "bullets": [ + "Repository senza abbonamento + aggiornamento del sistema", + "Memoria, kernel, rete tuning", + "Log2RAM (rilevamento automatico su SSD/NVMe)", + "Limiti di dimensione Journald + logrotate", + "Nomi di interfaccia persistenti" + ] + }, + { + "title": "Personalizzabile", + "description": "Circa 35 ottimizzazioni individuali in 10 categorie. Scegli esattamente quali applicare. Lo stesso motore di Automatizzato, con controllo completo.", + "bullets": [ + "Interfaccia con caselle di selezione per categoria", + "Include tutto ciò che fa Automatizzato, più opzioni da attivare esplicitamente (IOMMU, Fastfetch, Figurine, Ceph, HA, correzioni AMD…)", + "Eseguilo quante volte vuoi: le modifiche sono idempotenti" + ] + }, + { + "title": "Applica aggiornamenti disponibili", + "description": "Quando un’ottimizzazione post-installazione (Log2Ram, impostazioni della memoria, Logrotate…) ha una versione su disco più recente di quella registrata sull’host, questa voce mostra solo quelle cambiate. Esegue di nuovo la funzione corrispondente e aggiorna il registro, senza toccare altro.", + "bullets": [ + "Scelta esplicita per ogni ottimizzazione, solo quelle cambiate", + "Lo stesso selettore è disponibile nella dashboard di Monitor", + "Un’unica notifica raggruppata quando arrivano nuovi aggiornamenti" + ] + }, + { + "title": "Disinstalla ottimizzazioni", + "description": "Le modifiche reversibili supportate sono registrate in un registro JSON e associate a una funzione di ripristino. Le azioni senza un ripristino sicuro, come un aggiornamento completo dei pacchetti, sono escluse intenzionalmente.", + "bullets": [ + "Rileva automaticamente le ottimizzazioni precedentemente applicate", + "Sceglie il ripristino adatto a ogni voce: ripristina il backup .bak, se creato, elimina il frammento di configurazione sysctl.d se non serviva alcun backup oppure reinstalla il pacchetto originale con --force-confnew (ad esempio per il banner dell’abbonamento)", + "Richiesta di riavvio se necessario (VFIO, nomi persistenti, ecc.)" + ] + } + ], + "whichTitle": "Quale dovrebbe scegliere?", + "whichBody": "Per una nuova installazione Proxmox con una configurazione di base ragionevole senza decisioni: Automatizzato. Se sai già quali regolazioni vuoi o non vuoi: Personalizzabile. Per aggiornare solo un’ottimizzazione già applicata di cui esiste una versione più recente su disco: Applica aggiornamenti disponibili. Per annullare in modo pulito modifiche precedenti: Disinstalla ottimizzazioni. Puoi combinarli: prima Automatizzato, poi aggiungi opzioni come Fastfetch o IOMMU con Personalizzabile e annulla singole voci in seguito.", + "mixing": { + "heading": "Combinare con altri script post-installazione", + "stackTitle": "Non impilare più script post-installazione", + "stackBody": "Eseguire più script post-installazione sullo stesso host può creare file di configurazione duplicati, voci sysctl in conflitto o persino interrompere la rete dopo il riavvio. Se hai già applicato Helper-Scripts Post Install, alcune ottimizzazioni ProxMenux possono sovrapporsi alla sua configurazione. Usa un solo strumento post-installazione per host.", + "xshokTitle": "xshok-proxmox: deprecato", + "xshokBody": "Le versioni precedenti di ProxMenux indicavano xshok-proxmox come strumento post-installazione complementare. Il progetto è ora deprecato e non è più offerto da ProxMenux. Se una vecchia esecuzione ha lasciato marcatori sull’host, ProxMenux li rileva ancora e avvisa. Oggi non è però uno strumento da installare accanto a ProxMenux." + }, + "community": { + "heading": "Script della community", + "body": "Il menu offre anche due script di terze parti del progetto community-scripts: Proxmox VE Post Install e Proxmox VE Microcode. Sono wrapper che scaricano ed eseguono gli script originali tramite wget | bash. ProxMenux non li mantiene. Vedi Repository esterni per dettagli e valutazioni sull’affidabilità prima di eseguirli." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Aggiornamento sistema Proxmox", + "href": "/docs/utils/system-update", + "tail": "— mantiene l'host aggiornato una volta che è stato post-installato." + }, + { + "label": "Sicurezza", + "href": "/docs/security", + "tail": " — Fail2Ban + Lynis oltre alle misure di sicurezza post-installazione." + }, + { + "label": "Mostra informazioni sulla versione", + "href": "/docs/settings/show-version-information", + "tail": "— vedere quali componenti post-installazione vengono tracciati come installati." + }, + { + "label": "Comandi aggiornamenti e pacchetti", + "href": "/docs/help-info/update-commands", + "tail": "— riferimento per apt / pveupgrade." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/monitoring.json b/web/messages/it/docs/post-install/monitoring.json new file mode 100644 index 00000000..59891a2c --- /dev/null +++ b/web/messages/it/docs/post-install/monitoring.json @@ -0,0 +1,56 @@ +{ + "meta": { + "title": "Post-Install: Monitoraggio | Documentazione ProxMenux", + "description": "Opzioni di monitoraggio nello script ProxMenux Personalizzabile post-installazione. Attualmente un'unica opzione: installare OVH Real-Time Monitoring (RTM), che si attiva solo se l'host viene rilevato come server OVH." + }, + "header": { + "title": "Dopo l'installazione: monitoraggio", + "description": "Opzioni di monitoraggio all'interno dello script di installazione post personalizzabile. Questa categoria è piccola e specifica del fornitore — installa l'agente di monitoraggio OVH in tempo reale su server OVH dedicati e non fa nulla altrove.", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Ambito volutamente limitato", + "body": "Il monitoraggio post-installazione si limita a un agente specifico di un fornitore. Gli strumenti generici (Prometheus, Grafana, node_exporter) sono esclusi perché richiedono scelte architetturali — host separato, conservazione dei dati, destinazioni degli avvisi — che non si adattano a un passaggio con un clic. ProxMenux Monitor, incluso in ProxMenux, svolge gran parte di quel ruolo senza agenti esterni." + }, + "ovh": { + "heading": "Installare il monitoraggio in tempo reale OVH (RTM)", + "intro": "Se il vostro host Proxmox è un server dedicato affittato da OVHcloud, è possibile attivare RTM per esporre la telemetria hardware (CPU temperatura, stato PSU, disco SMART, stato del controller RAID, ecc.) al pannello di controllo OVH. Questo è lo stesso agente OVH utilizza per la propria funzione \"Server Monitoring\".", + "decisionsTitle": "Come decide ProxMenux", + "decisionsItems": [ + "Ottiene l'IP pubblico dell'host tramite curl ipinfo.io/ip.", + "Cerca il provider proprietario tramite una query whois a v4.whois.cymru.com.", + "Se il risultato menziona OVH, scarica last-public-ovh-infra-yak.snap.mirrors.ovh.net/yak/archives/apply.sh e lo passa a bash con il manifest Puppet di RTM v2.", + "Se il risultato non menziona OVH, non è installato nulla. L'opzione è una no-op." + ], + "remoteTitle": "Script remoto passato a bash tramite pipe", + "remoteBody": "L’installazione esegue wget -qO - https://…apply.sh | bash. Se il mirror OVH viene compromesso, lo script viene eseguito come root sull’host. Prima di attivare l’opzione, valuta la fiducia nella catena dei mirror OVH rispetto al beneficio del monitoraggio. Per la maggior parte degli utenti domestici o non OVH, l’opzione dovrebbe restare disattivata.", + "noOpTitle": "Attiva solo se l'host è effettivamente in OVH", + "noOpBody": "L’opzione non modifica i server non OVH, quindi selezionarla su un Proxmox domestico non rompe nulla. Su un host non OVH lo script mostra «Non è un server OVH, installazione RTM saltata» e termina senza installare pacchetti.", + "runsTitle": "Cosa esegue ProxMenux", + "verifyTitle": "Verifica", + "verifyBody": "Su un vero host OVH, dopo il riavvio dovresti vedere la dashboard RTM in OVH Manager con dati dell’host in tempo reale. Sul lato Proxmox, il raccoglitore RTM è un servizio systemd: controllalo direttamente:", + "troubleTitle": "Risoluzione dei problemi", + "revertTitle": "Rimuovi RTM dal menu Disinstalla", + "revertBody": "Se RTM è registrato come installato, Disinstalla ottimizzazioni offre una voce OVH Real-Time Monitoring. Esegue apt-get purge -y ''ovh-rtm*'' ''rtm'' ''rtm-*'', elimina /etc/rtm e registra RTM come disinstallato. I residui Puppet possono richiedere pulizia manuale: controlla i manifest specifici di RTM in /etc/puppet/. Su un host non OVH non sono stati installati pacchetti RTM, quindi non c’è nulla da rimuovere." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": "— dashboard web locale per l'host (lavora su qualsiasi fornitore, non solo OVH)." + }, + { + "label": "Comandi di sistema utili", + "href": "/docs/help-info/system-commands", + "tail": " — riferimento per il monitoraggio dell’host locale." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/network.json b/web/messages/it/docs/post-install/network.json new file mode 100644 index 00000000..2bef9365 --- /dev/null +++ b/web/messages/it/docs/post-install/network.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Post-installazione: Rete | Documentazione ProxMenux", + "description": "Opzioni di rete dello script post-installazione personalizzabile ProxMenux: forzare APT su IPv4, applicare un profilo sysctl selezionato, installare Open vSwitch, abilitare TCP BBR + Fast Open e associare i nomi delle interfacce ai loro indirizzi MAC." + }, + "header": { + "title": "Post-Install: Rete", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa copre questa categoria", + "body": "Cinque opzioni di rete indipendenti. Due sono semplici (APT su IPv4, installazione di Open vSwitch), due regolano il comportamento TCP (profilo sysctl di rete, BBR + Fast Open) e una risolve un problema comune: fissare i nomi delle interfacce, affinché una nuova scheda di rete o un aggiornamento BIOS non rinomini enp3s0 in enp4s0 e non interrompa i bridge." + }, + "ipv4": { + "heading": "Forza APT a usare IPv4", + "intro": "Scrive Acquire::ForceIPv4 \"true\"; a /etc/apt/apt.conf.d/99-force-ipv4. APT si rifiuta quindi di utilizzare IPv6 per i download dei pacchetti, anche se l'host ha connettività IPv6.", + "tipTitle": "Chi beneficia", + "tipBody": "Utile se la connessione IPv6 è instabile, più lenta di IPv4 o se il mirror Debian/Proxmox a volte non funziona su IPv6. Non crea problemi sugli host senza IPv6. Su una rete dual stack funzionante rende il comportamento prevedibile: apt non ti sorprenderà con un timeout IPv6." + }, + "sysctl": { + "heading": "Applica ottimizzazioni di rete", + "intro": "Scrive un profilo sysctl selezionato in /etc/sysctl.d/99-network.conf: buffer dei socket del kernel, rafforzamento di ICMP, protezione di base dallo spoofing e dimensioni dei buffer TCP adatte a un hypervisor con molti flussi simultanei.", + "tunedTitle": "Cosa viene regolato", + "headerArea": "Settore", + "headerSettings": "Impostazioni chiave", + "rows": [ + { + "area": "Buffer dei socket del kernel", + "settings": "netdev_max_backlog=8192, rmem_max=16M, wmem_max=16M, somaxconn=8192" + }, + { + "area": "Rafforzamento di ICMP", + "settings": "icmp_echo_ignore_broadcasts=1, icmp_ignore_bogus_error_responses=1" + }, + { + "area": "Sicurezza del routing", + "settings": "accept_redirects=0, accept_source_route=0, secure_redirects=0, send_redirects=0, log_martians=0" + }, + { + "area": "Filtro percorso inverso", + "settings": "rp_filter=2 (modalità permissiva, vedi nota sotto)" + }, + { + "area": "TCP", + "settings": "tcp_mtu_probing=1, tcp_rfc1337=1, tcp_sack=1, tcp_rmem=8K/87K/16M, tcp_wmem=8K/64K/16M" + }, + { + "area": "Porte", + "settings": "ip_local_port_range=1024 65535 (insieme delle porte effimere)" + }, + { + "area": "Socket Unix", + "settings": "net.unix.max_dgram_qlen=4096" + } + ], + "sourceOutro": "Aggiunge anche source /etc/network/interfaces.d/* a /etc/network/interfaces se non già presente — pratica standard in modo da poter rilasciare frammenti di interfaccia modulare senza modificare il file principale.", + "fwbrTitle": "Regolazione automatica dei bridge del firewall virtuale", + "fwbrBody": "Insieme al profilo sysctl, ProxMenux installa lo script ausiliario /usr/local/sbin/proxmenux-fwbr-tune, che applica rp_filter=0 e log_martians=0 alle interfacce fwbr* / fwln* / fwpr* / tap* create da Proxmox per VM e container. L’unità a esecuzione singola proxmenux-fwbr-tune.service lo avvia al boot; la regola /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules a ogni evento net add corrispondente a questi prefissi. Copre quindi le interfacce ricreate all’avvio o all’arresto delle VM, al riavvio e durante la migrazione live. Lo script elabora anche le interfacce già presenti subito dopo l’installazione.", + "rpFilterTitle": "Perché rp_filter=2 (permissivo) invece di 1 (rigoroso)", + "rpFilterBody": "Il filtro del percorso inverso rigoroso scarta i pacchetti la cui sorgente sarebbe raggiungibile tramite un’interfaccia diversa. È un’impostazione predefinita adatta ai client, ma problematica su un host Proxmox dove il traffico VM spesso arriva su un bridge ed esce da un uplink con percorsi asimmetrici. rp_filter=2 (permissivo) scarta solo pacchetti con sorgenti realmente non raggiungibili tramite routing. Il compromesso riduce leggermente il rilevamento dello spoofing IP locale per non interrompere la rete delle VM." + }, + "ovs": { + "heading": "Installa Open vSwitch", + "intro": "Installa openvswitch-switch + openvswitch-common. I pacchetti aggiungono OVS come alternativa ai bridge Linux predefiniti di Proxmox. La sola installazione non cambia la rete: i bridge vmbrX esistenti continuano a funzionare. Quando crei un nuovo bridge nell’interfaccia Proxmox, puoi scegliere OVS dall’elenco dei tipi.", + "tipTitle": "Quando OVS ha senso", + "tipBody": "Valuta OVS se ti servono trunk VLAN con ID non contigui, LACP con LLDP in modalità specifiche, programmazione dettagliata dei flussi (OpenFlow) o interoperabilità con controller SDN. Per un laboratorio domestico con poche VLAN e un solo uplink LACP, i bridge Linux + vmbrX.VID sono più semplici e adeguati.", + "revertTitle": "Reversibile dal menu Disinstalla", + "revertBody": "OVS viene registrato. Disinstalla ottimizzazioni esegue apt purge su openvswitch-switch e openvswitch-common. Migra i bridge OVS a bridge Linux prima della disinstallazione, altrimenti le VM su quei bridge perderanno la rete al prossimo avvio. Equivalente manuale:" + }, + "bbr": { + "heading": "Abilita TCP BBR + TCP Fast Open", + "intro": "Scrive due file sysctl e li ricarica. BBR sostituisce CUBIC con l’algoritmo di congestione di Google basato sulla banda, che gestisce meglio collegamenti ad alta capacità e latenza o con perdite. TCP Fast Open (TFO) elimina un’andata e ritorno sulle connessioni TCP ripetute inviando dati nel SYN.", + "verifyTitle": "Verifica", + "impactTitle": "L'impatto è dipendente dal carico di lavoro", + "impactBody": "BBR è efficace su collegamenti ad alta latenza o con perdite (replica intercontinentale, tunnel VPN, client mobili). In una LAN tra due macchine sullo stesso switch, la differenza spesso rientra nelle oscillazioni di misura. TFO aiuta soprattutto le connessioni HTTP brevi e ripetute.", + "revertTitle": "Reversibile dal menu Disinstalla", + "revertBody": "BBR/TFO vengono registrati. Disinstalla ottimizzazioni elimina i due file sysctl (/etc/sysctl.d/99-kernel-bbr.conf e 99-tcp-fastopen.conf) e ricarica la configurazione restante. Eliminare un file non reimposta i valori attivi del kernel. Valori predefiniti come cubic e tcp_fastopen=1 tornano dopo un riavvio, salvo altre configurazioni che li sovrascrivano. Equivalente manuale:" + }, + "names": { + "heading": "Nomi interfacce (persistenti)", + "intro": "Esamina ogni scheda di rete fisica dell’host, saltando loopback, veth Docker, bridge, dispositivi TAP, bond, Cilium, ZeroTier e WireGuard. Scrive un file systemd .link che associa il nome attuale all’indirizzo MAC attuale. L’associazione MAC prevale quindi sulla logica di denominazione del kernel.", + "whyTitle": "Perché questo è importante", + "whyItems": [ + "Aggiungere o rimuovere dispositivi PCIe può cambiare la numerazione del bus, trasformando enp3s0 in enp4s0. Se /etc/network/interfaces fa riferimento al vecchio nome, il bridge scompare al riavvio.", + "Gli aggiornamenti BIOS o firmware a volte cambiano l’enumerazione dei dispositivi, con lo stesso effetto.", + "Lo script fissa i nomi delle schede fisiche, incluse le porte fisiche usate dai bond. Salta le interfacce virtuali, come veth LXC e i dispositivi bond stessi; non risolve le condizioni di gara nei nomi delle schede virtuali hotplug." + ], + "writtenTitle": "Cosa si scrive", + "writtenIntro": "Un file per NIC fisico, a /etc/systemd/network/10-proxmenux-<iface>.link. Ogni file inizia con l'intestazione # Managed by ProxMenux — do not edit così ProxMenux può distinguere i propri file da file .link forniti dall'utente o dal pacchetto.", + "writtenOutro": "I file .link di altri pacchetti o scritti dall’utente vengono conservati; sono gestiti solo quelli con l’intestazione ProxMenux. A ogni esecuzione successiva la funzione verifica i propri file: rilegge MACAddress= da ogni 10-proxmenux-*.link ed elimina quelli la cui MAC non compare più in /sys/class/net/. I file delle versioni precedenti nel formato 10-<iface>.link vengono migrati automaticamente la prima volta.", + "pveTitle": "PVE 9 vs PVE 8", + "pveBody": "Lo script usa file systemd .link per i nomi persistenti. Su Proxmox VE 9 ricarica anche le regole udev dopo la scrittura, affinché le nuove schede possano usarle senza riavvio. Controlla le interfacce esistenti dopo un riavvio sia su PVE 8 sia su PVE 9. Questo non sostituisce ifupdown2 sull’host. In entrambi i casi lo script segnala la necessità di riavvio alla post-installazione personalizzabile.", + "reviewTitle": "Controlla prima il file /etc/network/interfaces esistente", + "reviewBody": "Se la configurazione precedente in /etc/network/interfaces usa nomi delle schede generati dal kernel, fissare quelli attuali è il risultato voluto. Se hai già adattato manualmente la configurazione a nomi specifici, verifica prima del riavvio che i nomi fissati corrispondano al file interfaces.", + "revertTitle": "Reversibile dal menu Disinstalla", + "revertBody": "Disinstalla ottimizzazioni elimina solo i file 10-proxmenux-*.link con intestazione ProxMenux da /etc/systemd/network/. Conserva ogni file .link aggiunto dall’utente o da altri pacchetti. Al prossimo riavvio torna la denominazione predefinita di systemd." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Gestione rete", + "href": "/docs/network", + "tail": "— diagnostica, analisi del ponte, riparazioni guidate." + }, + { + "label": "Nomi di interfaccia persistenti", + "href": "/docs/network/persistent-names", + "tail": " — la stessa funzione disponibile in un menu dedicato per un secondo momento; usa una delle due opzioni, non entrambe." + }, + { + "label": "Riferimento dei comandi di rete", + "href": "/docs/help-info/network-commands", + "tail": " — ip, ss, ethtool, sysctl." + }, + { + "label": "Disinstalla ottimizzazioni", + "href": "/docs/post-install/uninstall", + "tail": " — annulla queste modifiche di rete." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/optional.json b/web/messages/it/docs/post-install/optional.json new file mode 100644 index 00000000..576b0b13 --- /dev/null +++ b/web/messages/it/docs/post-install/optional.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Post-Install: Impostazioni opzionali", + "description": "Guida a Impostazioni opzionali nello script post-install ProxMenux per ulteriori funzioni e ottimizzazioni Proxmox VE.", + "ogTitle": "ProxMenux Post-Install: Impostazioni opzionali", + "ogDescription": "Guida a Impostazioni opzionali nello script post-install ProxMenux per ulteriori funzioni e ottimizzazioni Proxmox VE.", + "ogImageAlt": "Impostazioni opzionali ProxMenux Post-Install" + }, + "title": "Impostazioni opzionali", + "intro": "La categoria Impostazioni opzionali offre funzioni e ottimizzazioni aggiuntive per Proxmox VE. Non sono essenziali, ma possono migliorare le capacità del sistema in situazioni specifiche.", + "available": "Funzioni opzionali disponibili", + "stepLabel": "Passaggio", + "ceph": { + "title": "Aggiungi l'ultimo supporto Ceph", + "intro": "Questa opzione installa l'ultimo supporto del sistema di archiviazione Ceph per Proxmox VE. Ceph è un sistema di archiviazione distribuito che offre elevate prestazioni, affidabilità e scalabilità.", + "doesIntro": "Cosa fa:", + "doesItems": [ + "Aggiunge il repository Ceph al sistema", + "Aggiorna gli elenchi dei pacchetti", + "Installa i pacchetti Ceph utilizzando il comando 'pveceph install'", + "Verifica l'installazione" + ], + "howUse": "Come utilizzare: Dopo l'installazione, è possibile configurare e gestire lo storage Ceph utilizzando l'interfaccia web Proxmox VE o gli strumenti di riga di comando.", + "automates": "Questa regolazione automatizza i seguenti comandi:" + }, + "amd": { + "title": "Applicare correzioni per CPU AMD", + "intro": "Questa opzione applica correzioni specifiche per le CPU AMD EPYC e Ryzen per migliorare la stabilità e la compatibilità.", + "doesIntro": "Cosa fa:", + "doesItems": [ + "Rileva se è presente un EPYC AMD o Ryzen CPU", + "Applica il parametro kernel 'idle=nomwait' per prevenire crash casuali (tramite /etc/kernel/cmdline su host systemd-boot, o /etc/default/grub su host GRUB — con un .bak dell'originale)", + "Configura KVM per ignorare alcuni MSR (Model Specific Registers) per una migliore compatibilità degli ospiti di Windows" + ], + "howUse": "Come usare: Queste correzioni vengono applicate automaticamente e richiedono un riavvio del sistema per avere effetto.", + "automates": "Questa regolazione automatizza i seguenti comandi:" + }, + "ha": { + "title": "Abilita servizi di alta disponibilità", + "intro": "Questa opzione consente servizi High Availability (HA) in Proxmox VE, consentendo il failover automatico di VM e container in caso di guasto del nodo.", + "doesIntro": "Cosa fa:", + "doesItems": [ + "Attiva e avvia il servizio pve-ha-lrm (Local Resource Manager)", + "Attiva e avvia il servizio pve-ha-crm (Cluster Resource Manager)", + "Attiva e avvia il servizio corosync per la comunicazione cluster" + ], + "howUse": "Come utilizzare: Dopo aver abilitato questi servizi, è possibile configurare gruppi HA e risorse nell'interfaccia web Proxmox VE.", + "automates": "Questa regolazione automatizza i seguenti comandi:" + }, + "pveam": { + "title": "Aggiorna Proxmox VE Appliance Manager", + "intro": "Aggiorna l’indice locale dei modelli di container esposto da pveam in Proxmox, così l’elenco delle appliance software è aggiornato alla prossima creazione di un LXC.", + "doesIntro": "Cosa fa:", + "doesItems": [ + "Esegue pveam update sui mirror Proxmox per recuperare il catalogo attuale delle appliance software", + "Popola l’elenco delle appliance software mostrato quando si crea un container" + ], + "howUse": "Uso: eseguilo se l’elenco delle appliance software sembra datato o dopo un cambio di mirror. Scarica solo l’indice del catalogo, non i modelli stessi.", + "automates": "Questa regolazione automatizza il seguente comando:" + }, + "fastfetch": { + "title": "Installare e configurare Fastfetch", + "intro": "Questa opzione installa silenziosamente e configura Fastfetch, uno strumento di informazioni di sistema che visualizza specifiche di sistema e un logo personalizzato al login.", + "doesLabel": "Cosa fa:", + "doesItems": [ + "Scarica e installa silenziosamente l’ultima versione di Fastfetch", + "Consente di scegliere un logo personalizzato (ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology, o uno personalizzato)", + "Configura Fastfetch per visualizzare \"Sistema ottimizzato da ProxMenux\"", + "Configura Fastfetch per avviarsi automaticamente all’accesso in console" + ], + "importantLabel": "Importante:", + "importantBody": "Se ti connetti a Proxmox tramite SSH, scegli il logo Proxmox o creane uno con jp2a o img2txt. Gli altri loghi vengono generati con chafa e potrebbero non essere visualizzati correttamente in una normale sessione SSH.", + "customLabel": "Loghi personalizzati:", + "customBody1": "Per utilizzare un logo personalizzato, posizionare il file di testo ASCII in: /usr/local/share/fastfetch/logos/", + "customBody2": "È possibile creare loghi personalizzati utilizzando strumenti come chafa, jp2a, o img2txt.", + "customBody3": "Per i migliori risultati:", + "customItems": [ + "Mantieni l’altezza del logo entro 35 righe per conservare le proporzioni e rientrare nel terminale", + "Utilizzare chafa per loghi a colori (può non visualizzare correttamente in sessioni SSH)", + "Utilizzare jp2a o img2txt per loghi compatibili con SSH" + ], + "examplesLabel": "Loghi di esempio:", + "logos": [ + { + "name": "ProxMenux", + "alt": "Logo ProxMenux", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmenux.png" + }, + { + "name": "Proxmox", + "alt": "Logo Proxmox", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmox.png" + }, + { + "name": "JC Channel", + "alt": "Logo di JC Channel", + "src": "/fastfetch/jc-channel.png" + }, + { + "name": "Helper-Scripts", + "alt": "Logo di Helper-Scripts", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/helper-scripts.png" + }, + { + "name": "Home-Labs-Club", + "alt": "Logo di Home-Labs-Club", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/home-labs-club.png" + }, + { + "name": "Proxmology", + "alt": "Logo Proxmology", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmology.png" + } + ], + "automates": "Questa regolazione automatizza i seguenti comandi:" + }, + "figurine": { + "title": "Installare e configurare Figurine", + "intro": "Questa opzione installa e configura Figurine, uno strumento che crea eleganti banner di testo ASCII per il tuo terminale, visualizzando il tuo nome host in un formato 3D visivamente accattivante.", + "doesLabel": "Cosa fa:", + "doesItems": [ + "Scarica e installa Figurine v2.1.1 da GitHub per l’architettura dell’host (AMD64, ARM64 o ARMv7)", + "Crea un messaggio di benvenuto che visualizza il tuo hostname in 3D ASCII art quando accedi", + "Aggiorna il binario Figurine esistente solo dopo aver completato correttamente il download e l’estrazione", + "Imposta il messaggio di benvenuto da eseguire automaticamente al login" + ], + "practicalLabel": "Uso pratico:", + "practicalBody": "Quando gestisci più nodi Proxmox in un cluster, Figurine mostra subito a quale nodo sei connesso. Aiuta a evitare comandi accidentali sul nodo sbagliato e migliora il flusso di lavoro con più server.", + "exampleLabel": "Esempio di output:", + "imageAlt": "Output di esempio di Figurine", + "automates": "Questa regolazione automatizza il seguente processo:", + "outro": "Dopo l'installazione, vedrai il tuo nome host visualizzato nell'arte 3D ASCII ogni volta che accedi, rendendo immediatamente chiaro su quale nodo Proxmox stai lavorando." + }, + "log2ram": { + "title": "Installare Log2RAM (SSD/NVMe riduzione dell'usura)", + "intro": "Log2RAM monta /var/log su un ramdisk tmpfs e lo sincronizza periodicamente sul disco. Accumulare in RAM le frequenti scritture journald può ridurre usura SSD e I/O. Sincronizzazione e arresto regolare salvano i log, ma una perdita improvvisa di alimentazione può perdere le voci dall’ultima sincronizzazione.", + "upstreamLabel": "Progetto a monte:", + "upstreamUrl": "https://github.com/azlux/log2ram", + "upstreamLinkLabel": "azlux/log2ram su GitHub", + "doesLabel": "Cosa fa ProxMenux:", + "doesItems": [ + "Rileva se il disco root è SSD/NVMe leggendo /sys/block/<dev>/queue/rotational. Su un disco rotazionale il flusso automatizzato chiede prima di installare.", + "Clona il repository originale (azlux/log2ram) in /tmp/log2ram e modifica install.sh, sostituendo rsync -aAXv con rsync -aXv --no-acls. Evita l’errore set_acl: Operation not supported con codice di uscita 23, che lo script originale genera spostando /var/log su filesystem senza ACL. L’unità systemd log2ram viene abilitata dopo l’installazione.", + "Dimensiona il ramdisk in base alla RAM dell’host: ≤ 8 GB → 128M, ≤ 16 GB → 256M, > 16 GB → 512M. Scrive il valore in SIZE= di /etc/log2ram.conf.", + "Pianifica una sincronizzazione periodica del disco tramite /etc/cron.d/log2ram: ogni 1h / 3h / 6h secondo lo stesso livello RAM.", + "Installa /usr/local/bin/log2ram-check.sh, eseguito ogni 10 minuti da /etc/cron.d/log2ram-auto-sync. Quando /var/log raggiunge l’80% del ramdisk, pulisce i vecchi journal. Al 92% esegue prima logrotate -f /etc/logrotate.d/proxmox-backup-api se il file esiste: i log API PBS sono spesso i maggiori consumatori di spazio su un host PBS. Poi tronca pveproxy access/error e pveam.log prima della sincronizzazione. log2ram write da solo copia tmpfs sul disco senza ridurlo. La protezione aiuta a evitare arresti di PVE con No space left on device per crescita incontrollata dei log.", + "Rileva il servizio proxmox-backup-server sull’host. Se presente, crea /etc/logrotate.d/proxmox-backup-api (20 MB × 3 rotazioni) e /etc/cron.hourly/proxmox-backup-logrotate per limitare i log API PBS, abituale fonte di crescita, anche tra le sincronizzazioni Log2RAM. Senza PBS non modifica nulla.", + "Regola i limiti systemd-journald (SystemMaxUse, RuntimeMaxUse) per adattarsi all'interno del ramdisk in modo che un singolo scoppio non possa riempirlo.", + "Si registra in installed_tools.json per consentire il ripristino da Disinstalla ottimizzazioni." + ], + "howUseLabel": "Come usare:", + "howUseBody": "Il percorso automatizzato installa Log2RAM senza intervento se rileva un disco root SSD/NVMe. Quello personalizzabile chiede dimensione, intervallo e attivazione della protezione. Il messaggio indica 90%, ma lo script generato usa le soglie di pulizia all’80% e intensiva al 92% descritte sopra.", + "verifyLabel": "Verificare e gestire dalla shell:", + "verifyCode": "# Service state and configured timers\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Current ramdisk usage — /var/log IS the tmpfs itself\ndf -h /var/log\n\n# Force a sync now (tmpfs → disk); does NOT shrink the tmpfs\nlog2ram write\n\n# Trigger the auto-sync guard on demand (vacuum + sync when usage is high)\n/usr/local/bin/log2ram-check.sh\n\n# Current config: SIZE, mail settings, path\ncat /etc/log2ram.conf\n\n# ProxMenux-specific cron jobs\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Recent Log2RAM activity\njournalctl -u log2ram -n 50 --no-pager" + }, + "zram": { + "title": "Abilita il profilo di scambio ZRAM", + "intro": "Crea un dispositivo swap compresso in RAM, /dev/zram0, con systemd-zram-generator. Le pagine spostate dal kernel nello swap vengono compresse con zstd e tenute in memoria prima di usare lo swap su disco.", + "doesLabel": "Cosa fa:", + "doesItems": [ + "Installa systemd-zram-generator se manca e registra se è stato installato da ProxMenux.", + "Scrive /etc/systemd/zram-generator.conf.d/90-proxmenux.conf: un dispositivo zram0 dimensionato ad un decimo dell'host RAM, compressione zstd (zstd(level=9) con systemd-zram-generator 1.2.0 o versioni successive) e priorità swap 32767.", + "Con questa priorità il kernel riempie prima ZRAM. Uno swap esistente su disco mantiene la propria priorità e prende le pagine che non si adattano più a ZRAM.", + "Prima di cambiare qualcosa, cerca un'altra configurazione ZRAM: uno swap zram attivo, una linea zram in /etc/fstab, un'unità systemd o un altro file generatore. Se ne trova una, l'opzione si ferma e lascia quella configurazione così com'è.", + "Avvia dev-zram0.swap e controlla che il dispositivo attivo corrisponda al profilo. Se non lo fa, lo stato precedente viene ripristinato.", + "Si registra in installed_tools.json per consentire il ripristino da Disinstalla ottimizzazioni." + ], + "howUseLabel": "Come usare:", + "howUseBody": "L’opzione è disponibile solo nel percorso personalizzabile, non in quello automatizzato. Il dispositivo viene ricreato a ogni avvio. Quando è attivo, il riquadro Memoria di ProxMenux Monitor mostra capacità, swap usato, algoritmo, rapporto di compressione e memoria fisica occupata.", + "verifyLabel": "Verificare dalla shell:", + "verifyCode": "# Active swap devices and their priority\nswapon --show\n\n# ZRAM device: algorithm, size and compressed data\nzramctl\n\n# Profile written by ProxMenux\ncat /etc/systemd/zram-generator.conf.d/90-proxmenux.conf\n\n# State of the swap unit\nsystemctl status dev-zram0.swap" + }, + "autoApplication": { + "title": "Applicazione automatica", + "body": "Nel percorso personalizzabile seleziona ogni funzione in base alle necessità. Log2RAM fa parte anche di quello automatizzato con rilevamento hardware; ZRAM resta esclusivo di Personalizzabile. Consulta le sezioni per conferme e prerequisiti." + } +} diff --git a/web/messages/it/docs/post-install/performance.json b/web/messages/it/docs/post-install/performance.json new file mode 100644 index 00000000..f8e4efdb --- /dev/null +++ b/web/messages/it/docs/post-install/performance.json @@ -0,0 +1,61 @@ +{ + "meta": { + "title": "Post-installazione: Prestazioni | Documentazione ProxMenux", + "description": "Opzioni di prestazioni nello script post-installazione personalizzabile di ProxMenux. Sostituisce gzip a thread singolo con pigz (gzip parallelo) per accelerare backup e compressione sugli host multicore." + }, + "header": { + "title": "Dopo l'installazione: prestazioni", + "description": "Opzioni di prestazioni dello script post-installazione Personalizzabile. La categoria contiene una sola ottimizzazione: sostituire gzip con pigz affinché backup e compressione usino tutti i core della CPU invece di uno solo.", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa copre questa categoria", + "body": "L’unica opzione di prestazioni qui reindirizza gzip a un’implementazione parallela. Le altre regolazioni (memoria, scheduling I/O, dimensione dell’ARC ZFS, limiti del kernel) sono nelle rispettive categorie (Sistema, Archiviazione), perché riguardano sottosistemi diversi." + }, + "pigz": { + "heading": "Usa pigz per una compressione gzip più rapida", + "intro": "gzip standard comprime usando un solo core della CPU. Sugli host Proxmox moderni con 8, 16 o 32 core, ciò limita molto i backup VM/CT con vzdump, la rotazione dei log e ogni operazione che passa per gzip. pigz è un sostituto parallelo immediatamente compatibile: stesso output compatibile gzip, ma lavoro distribuito su tutti i core.", + "doesTitle": "Cosa fa ProxMenux", + "doesIntro": "Cinque passaggi, tutti idempotenti:", + "doesItems": [ + "Imposta pigz: 1 in /etc/vzdump.conf quindi lo strumento di backup di Proxmox utilizza pigz in modo nativo.", + "Installa il pacchetto pigz apt se non già presente.", + "Scrive uno script wrapper a /bin/pigzwrapper che inoltra ogni argomento a /usr/bin/pigz.", + "Registra una diversione dpkg per il binario di sistema gzip (/usr/bin/gzip su Proxmox VE 9, /bin/gzip su Proxmox VE 8). Il binario originale resta accanto come gzip.distrib e il wrapper lo sostituisce. Da quel momento qualsiasi programma che chiama gzip, come logrotate, tar czf, script e vzdump, usa pigz in modo trasparente.", + "Controlla che il file mantenuto come gzip.distrib sia un gzip funzionante prima che l'involucro sia messo in atto e reinstalla il pacchetto gzip prima quando non lo è. Un host che ha ancora il precedente swap /bin/gzip.original viene spostato alla diversione quando l'opzione viene applicata di nuovo." + ], + "replacesTitle": "Sostituisce un binario di sistema", + "replacesBody": "Mettere un wrapper al posto di gzip è insolito. È sicuro perché produce output compatibile gzip, ma gli script con percorsi fissi, eseguiti in chroot restrittivi o che verificano gli hash dei binari possono comportarsi diversamente. Il binario originale resta come gzip.distrib. Grazie alla diversione dpkg, un aggiornamento del pacchetto gzip o il passaggio da Proxmox VE 8 a 9 aggiorna quel file e mantiene il wrapper.", + "revertTitle": "Reversibile dal menu Disinstalla", + "revertBody": "Questa ottimizzazione è registrata. Disinstalla ottimizzazioni copia il binario originale da gzip.distrib al posto del wrapper, rimuove la diversione e pigzwrapper, commenta la riga pigz in /etc/vzdump.conf ed esegue apt purge pigz dopo aver verificato che gzip funziona. Equivalente manuale su Proxmox VE 9:", + "verifyTitle": "Verifica", + "verifyBody": "Dopo l'applicazione, gzip --version dovrebbe menzionare pigz. Un rapido benchmark mostra anche la differenza di velocità su un host multi-core:", + "whenTitle": "Quando questo è più importante", + "whenBody": "Il vantaggio cresce con il numero di core dell’host e la frequenza dei backup. Su un server domestico a 2 core con un vzdump al giorno è marginale. Su un host di produzione a 16 core che salva una dozzina di VM ogni notte, pigz può ridurre la finestra di backup a una frazione del tempo richiesto da gzip a thread singolo." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Comandi di backup e ripristino", + "href": "/docs/help-info/backup-commands", + "tailRich": " — riferimento CLI di vzdump, inclusa l’opzione --pigz per i thread." + }, + { + "label": "Archiviazione", + "href": "/docs/post-install/storage", + "tail": "— limiti di velocità di vzdump e sintonizzazione ZFS ARC." + }, + { + "label": "Sistema", + "href": "/docs/post-install/system", + "tail": " — regolazione dei descrittori di file e della memoria." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/security.json b/web/messages/it/docs/post-install/security.json new file mode 100644 index 00000000..2a745162 --- /dev/null +++ b/web/messages/it/docs/post-install/security.json @@ -0,0 +1,57 @@ +{ + "meta": { + "title": "Post-Install: Sicurezza | Documentazione ProxMenux", + "description": "Opzioni di sicurezza disponibili nello script ProxMenux Personalizzabile post-installazione. Attualmente un'unica opzione: disabilitare il servizio portmapper/rpcbind per ridurre la superficie di attacco dell'host." + }, + "header": { + "title": "Post-Install: Sicurezza", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa copre questa categoria", + "body": "La sicurezza post-installazione si limita al rafforzamento dell’host applicabile in sicurezza senza supervisione: disattivare servizi che quasi nessuno usa, con possibilità di annullamento dal menu Disinstalla. Gli strumenti attivi (Fail2Ban per prevenire intrusioni, Lynis per gli audit) si trovano nella voce Sicurezza del menu principale di ProxMenux, fuori dalla post-installazione." + }, + "rpcbind": { + "heading": "Disattivare il portmapper / rpcbind", + "intro": "rpcbind (in precedenza portmap) associa i numeri dei programmi RPC alle porte di rete. È una dipendenza di NFS e di alcuni vecchi strumenti RPC. Su un tipico host Proxmox che non funge da server NFS, nulla lo usa; lasciarlo attivo mantiene la porta 111/tcp in ascolto su ogni interfaccia.", + "whyTitle": "Perché conviene disattivarlo", + "whyItems": [ + "Riduce la superficie di attacco ospite — un servizio di ascolto in meno di preoccuparsi.", + "Storicamente abusato come vettore di riflessione/amplificazione in attacchi DDoS. Disabilitare rpcbind rimuove quel fattore di amplificazione per il vostro host.", + "Rimuove il rumore generato nei log e nell’output di netstat / ss, rendendo più facile individuare l’attività reale." + ], + "nfsTitle": "Non disabilitarlo se si utilizza NFS", + "nfsBody": "Sia il server NFS sia il client NFS dipendono da rpcbind per negoziare le porte usate da mountd, statd, lockd e altri servizi. Se il tuo host Proxmox esporta condivisioni NFS verso altri dispositivi oppure monta condivisioni NFS da un NAS, non applicare questa opzione. I montaggi fallirebbero con mount.nfs: rpc.statd is not running o errori simili.", + "runsTitle": "Cosa esegue ProxMenux", + "runsOutro": "Il pacchetto resta installato. ProxMenux registra lo stato originale di abilitazione e attività di rpcbind.service e rpcbind.socket, poi disabilita e arresta entrambe le unità per impedire che l’attivazione tramite socket riavvii il servizio.", + "verifyTitle": "Verifica", + "verifyBody": "Dopo l'applicazione, confermare rpcbind è spento e nulla sta ascoltando sulla porta 111:", + "reversibleTitle": "Ripristinare lo stato di servizio originale", + "reversibleBody": "La modifica è registrata in installed_tools.json. Disinstalla ottimizzazioni riporta ogni unità rpcbind agli stati abilitato/disabilitato e attivo/inattivo rilevati prima della modifica di ProxMenux; non presume che rpcbind fosse abilitato su tutti gli host." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Menu di sicurezza", + "href": "/docs/security", + "tail": " — strumenti più avanzati: Fail2Ban (prevenzione delle intrusioni) e Lynis (audit)." + }, + { + "label": "Lynis", + "href": "/docs/security/lynis", + "tail": " — per controllare l’host e trovare altri modi di rafforzarne la sicurezza." + }, + { + "label": "Comandi di sistema utili", + "href": "/docs/help-info/system-commands", + "tail": "— stato di servizio, journalctl, riferimento di audit lynis." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/storage.json b/web/messages/it/docs/post-install/storage.json new file mode 100644 index 00000000..d1ff207b --- /dev/null +++ b/web/messages/it/docs/post-install/storage.json @@ -0,0 +1,167 @@ +{ + "meta": { + "title": "Post-installazione: Archiviazione | Documentazione ProxMenux", + "description": "Ottimizzazioni di archiviazione dello script post-installazione personalizzabile ProxMenux: dimensione ZFS ARC in base alla RAM, snapshot periodici con zfs-auto-snapshot e rimozione dei limiti di velocità dei backup vzdump." + }, + "header": { + "title": "Post-installazione: Archiviazione", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa copre questa categoria", + "body": "Quattro ottimizzazioni di archiviazione: regolare ZFS ARC su una parte ragionevole della RAM, installare e pianificare snapshot automatici ZFS, abilitare ZFS autotrim su pool SSD/NVMe e rimuovere i limiti di vzdump per velocizzare i backup. Le opzioni sono indipendenti: scegli quelle adatte al sistema. Una quinta, Log2RAM, riduce l’usura SSD/NVMe spostando /var/log su ramdisk. È nella pagina Opzionali perché il menu personalizzabile la raggruppa lì." + }, + "trackedTitle": "Tutti e quattro sono tracciati nel menu Disinstalla", + "trackedBody": "Ogni opzione si registra in installed_tools.json per Disinstalla ottimizzazioni. zfs_arc rimuove /etc/modprobe.d/99-zfsarc.conf e ricrea initramfs; zfs_auto_snapshot annulla la pianificazione cron e offre la rimozione completa del pacchetto; zfs_autotrim imposta autotrim=off sui pool che ha abilitato; vzdump_speed ripristina /etc/vzdump.conf dal .bak creato all’installazione.", + "arc": { + "heading": "Ottimizza dimensione ZFS ARC", + "intro": "La Adaptive Replacement Cache (ARC) è la cache di lettura ZFS in RAM. Le installazioni Proxmox VE dalla 8.1 impostano il 10% di RAM, massimo 16 GiB; host precedenti o aggiornati possono differire. Questa opzione scrive un proprio limite in base alla RAM. Controlla impostazioni e carico: una cache più piccola non è sempre più veloce.", + "sizingTitle": "Regole di dimensionamento", + "headerRam": "RAM dell'host", + "headerMax": "Limite ARC", + "rows": [ + { + "ram": "Formula", + "max": "RAM / 10, massimo 16 GiB e minimo 64 MiB" + }, + { + "ram": "host 8 GB", + "max": "≈ 819 MiB (RAM/10)" + }, + { + "ram": "host 16 GB", + "max": "≈ 1.6 GiB (RAM/10)" + }, + { + "ram": "host 64 GB", + "max": "≈ 6.4 GiB (RAM/10)" + }, + { + "ram": "≥ host 160 GB", + "max": "16 GiB (limite)" + } + ], + "after": "Il file /etc/modprobe.d/99-zfsarc.conf contiene solo options zfs zfs_arc_max=…. Gli altri parametri ZFS (zfs_arc_min, prelettura/limite scritture L2ARC, timeout TXG) non vengono regolati. Prima, una verifica cerca altri *.conf in /etc/modprobe.d/ che impostano zfs_arc_min / zfs_arc_max, li salva con manifesto in /usr/local/share/proxmenux/backups/zfs_arc/ ed elimina le righe in conflitto, lasciando attivo solo il file ARC ProxMenux. Poi update-initramfs -u -k all e, se necessario, proxmox-boot-tool refresh portano il limite nell’initramfs dei sistemi con root ZFS.", + "rebootTitle": "Richiede un riavvio per prendere effetto", + "rebootBody": "Le impostazioni ARC vengono lette caricando il modulo zfs. Per gli host con root ZFS, ProxMenux rigenera initramfs con update-initramfs -u -k all e aggiorna se necessario il bootloader con proxmox-boot-tool refresh. Il nuovo parametro richiede comunque un riavvio, segnalato automaticamente.", + "safeTitle": "Sicuro su host non-ZFS", + "safeBody": "La funzione scrive la configurazione solo se zpool list segnala almeno un pool ZFS importato. Su host Proxmox con solo ext4/LVM o con strumenti ZFS ma nessun pool importato, selezionare questa opzione non modifica nulla.", + "verifyTitle": "Verifica e rollback manuale" + }, + "autoSnap": { + "heading": "Installa ZFS auto-snapshot", + "intro": "Installa il pacchetto zfs-auto-snapshot e riscrive i suoi programmi di cron in modo che le snapshot vengano prese automaticamente a diversi intervalli. Una grande rete di sicurezza senza sforzo sopra i vostri backup vzdump regolari.", + "cadenceTitle": "Frequenza degli snapshot configurata da ProxMenux", + "headerLabel": "Etichetta", + "headerRuns": "Esecuzione", + "headerKept": "Istantanee tenute", + "rows": [ + { + "label": "frequente", + "runs": "ogni 15 min", + "kept": "4" + }, + { + "label": "oraria", + "runs": "ogni ora", + "kept": "1" + }, + { + "label": "ogni giorno", + "runs": "una volta al giorno", + "kept": "1" + }, + { + "label": "settimanale", + "runs": "una volta alla settimana", + "kept": "1" + }, + { + "label": "mensile", + "runs": "una volta al mese", + "kept": "1" + } + ], + "conservativeTitle": "Conservazione limitata", + "conservativeBody": "ProxMenux mantiene una conservazione limitata: 4 snapshot frequenti e 1 per ciascun intervallo più lungo, per contenere lo spazio ZFS. Per conservarne di più modifica i numeri in /etc/cron.d/zfs-auto-snapshot, /etc/cron.hourly/zfs-auto-snapshot ecc. dopo lo script.", + "onlyZfsTitle": "Utile solo sui pool ZFS", + "onlyZfsBody": "Installare il pacchetto su un host ext4-solo è innocuo ma inutile — non ci sono set di dati ZFS per esso di snapshot. Salta questa opzione se non si utilizza ZFS.", + "verifyTitle": "Verifica e rollback manuale" + }, + "autotrim": { + "heading": "Abilita ZFS autotrim (pool SSD/NVMe)", + "intro": "Abilita autotrim sui pool ZFS composti solo da SSD o NVMe con supporto TRIM. Per prudenza salta i pool con dispositivi rotanti. Quelli già impostati su autotrim=on restano invariati.", + "trimTitle": "Cosa fa TRIM e perché conta su ZFS", + "trimBody1": "SSD e NVMe gestiscono blocchi interni di cancellazione più grandi dei settori logici del filesystem. Quando si elimina un file, l’unità non sa ancora che i settori sono liberi e la pulizia interna può continuare a spostare dati obsoleti per liberare blocchi. TRIM indica all’unità i settori liberi per consentirne la cancellazione anticipata.", + "trimBody2": "Senza TRIM, esaurire i blocchi già cancellati può degradare le prestazioni SSD e aumentare le scritture interne, riducendo la vita utile. Con TRIM, l’unità può mantenere blocchi vuoti pronti alla scrittura.", + "trimBody3": "Con autotrim=on, ZFS esegue TRIM in background sullo spazio liberato di recente, raggruppando gli intervalli. Un zpool trim <pool> periodico è un’alternativa. Autotrim evita una pianificazione separata, ma l’impatto dipende dai dispositivi; il TRIM manuale periodico può essere migliore su alcune unità economiche.", + "practicalTitle": "Perché questo è pratico da abilitare?", + "practicalItems": [ + "Prestazioni di scrittura sostenute. TRIM può aiutare a recuperare blocchi inutilizzati. Benefici e impatto sulla latenza dipendono da dispositivo e carico.", + "Durata dell’unità. Evitare copie interne inutili può ridurre amplificazione di scrittura e usura NAND, senza garantire una durata aggiuntiva specifica.", + "Nessun processo cron da pianificare. A differenza di un zpool trim periodico, autotrim viene gestito automaticamente dal pool." + ], + "whenTitle": "Quando è necessario?", + "whenIntro1": "Valuta l’attivazione sui pool ZFS solo con SSD/NVMe compatibili TRIM. Controlla comportamento e latenza; su alcuni dispositivi è preferibile TRIM manuale pianificato.", + "whenIntro2": "Lo script lo ignora automaticamente su:", + "whenSkipItems": [ + "Pool con vdev HDD rotanti: filtro hardware prudente di questo script.", + "Drive senza discard_granularity esposti in sysfs — solitamente vecchi SSD senza TRIM, o percorsi passanti dove il sistema operativo non può vedere il dispositivo sottostante.", + "Pools dove ZFS riporta la proprietà non supportato (raro; molto vecchio pools).", + "Pools già predisposto per autotrim=on (no-op)." + ], + "whenIntro3": "Non pertinente su host ext4-solo — non c'è nulla per ZFS da tagliare. La funzione esce con un messaggio amichevole in quel caso.", + "recordedTitle": "Perché vengono registrati solo i pool modificati da ProxMenux", + "recordedBody": "La funzione registra un pool nel file di stato interno (/usr/local/share/proxmenux/zfs_autotrim_pools) solo se lo ha cambiato da off a on. I pool già con autotrim prima dello script restano fuori elenco: una futura disinstallazione annulla solo le modifiche di ProxMenux, non quelle impostate da te.", + "manualTitle": "Equivalente manuale (in esecuzione sul server)", + "manualIntro": "La sequenza completa che lo script corre contro ogni pool è replicabile a mano. Questo è quello che si digiterebbe se si desidera fare la stessa cosa su un singolo pool senza ProxMenux:", + "verifyTitle": "Verifica e rollback manuale", + "oneShotTitle": "Preferisci un TRIM singolo invece di quello continuo?", + "oneShotBody": "Alcuni amministratori preferiscono TRIM manuale nelle ore di minor carico. Disabilita autotrim e pianifica un processo cron con zpool trim <pool>: stesso obiettivo, frequenza diversa." + }, + "vzdump": { + "heading": "Aumenta la velocità di backup di vzdump", + "intro": "Scrive bwlimit: 0 e ionice: 5 nella configurazione globale vzdump. Proxmox non ha già limiti di banda predefiniti: rimuove un limite solo se configurato. Rispetto a ionice: 7, il valore 5 aumenta la priorità I/O best-effort se lo scheduler la rispetta. Può influire sugli ospiti e non garantisce backup più rapidi.", + "changedTitle": "Cosa cambia in /etc/vzdump.conf", + "backupTitle": "Prima esecuzione crea un .bak di vzdump.conf", + "backupBody": "Alla prima esecuzione ProxMenux copia /etc/vzdump.conf in /etc/vzdump.conf.bak prima di modificarlo. Le esecuzioni successive non sovrascrivono la copia, lasciando recuperabile la configurazione precedente. bwlimit e ionice vengono modificati con sed; altre opzioni come compress, pigz, tmpdir ed exclude-path sono conservate.", + "skipTitle": "Quando saltare questo", + "skipBody": "Su un host con storage locale lento e VM sensibili alla latenza, togliere il limite di banda può causare rallentamenti durante i backup. Se hai impostato un bwlimit per questo motivo, conservalo e salta questa opzione.", + "verifyTitle": "Verifica e rollback manuale" + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Comandi di gestione ZFS", + "href": "/docs/help-info/zfs-commands", + "tail": "— zpool / zfs riferimento per ARC, snapshot, scrub." + }, + { + "label": "Comandi di archiviazione e dischi", + "href": "/docs/help-info/storage-commands", + "tail": "— riferimento generico di blocco-dispositivo e di stoccaggio Proxmox." + }, + { + "label": "Comandi di backup e ripristino", + "href": "/docs/help-info/backup-commands", + "tail": " — riferimento CLI vzdump per banda e priorità I/O." + }, + { + "label": "Disinstalla ottimizzazioni", + "href": "/docs/post-install/uninstall", + "tail": " — annulla le modifiche ARC / vzdump." + }, + { + "label": "Log2RAM", + "href": "/docs/post-install/optional#log2ram", + "tail": " — riduce l’usura SSD/NVMe tenendo /var/log su ramdisk; documentato in Opzionali." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/system.json b/web/messages/it/docs/post-install/system.json new file mode 100644 index 00000000..a9779242 --- /dev/null +++ b/web/messages/it/docs/post-install/system.json @@ -0,0 +1,133 @@ +{ + "meta": { + "title": "Post-Install: Sistema | Documentazione ProxMenux", + "description": "Ottimizzazioni a livello di sistema nello script post-installazione personalizzabile ProxMenux: journald e limiti di dimensione logrotate, limiti più elevati del kernel e dei descrittori di file, ottimizzazione della memoria bilanciata, kexec per riavvii rapidi e ripristino dal kernel panico." + }, + "header": { + "title": "Dopo l'installazione: sistema", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa copre questa categoria", + "body": "Sei ottimizzazioni di sistema indipendenti. Regolano journald e logrotate per evitare che i log riempiano il disco, aumentano i limiti del kernel e dei descrittori di file per le applicazioni con molti file aperti, bilanciano la memoria su un host di virtualizzazione, aggiungono kexec per riavviare senza BIOS e configurano il ripristino automatico in caso di kernel panic. Tutte e sei sono registrate e reversibili dal menu Disinstalla." + }, + "journald": { + "heading": "Ottimizza journald", + "intro": "Riscrive /etc/systemd/journald.conf con valori ragionevoli affinché il journal di systemd non riempia gradualmente la partizione root, poi riavvia systemd-journald e ripulisce i log esistenti.", + "keyTitle": "Valori chiave", + "keyItems": [ + "Storage=persistent — tenere i registri sul disco attraverso i reboots.", + "SystemMaxUse=64M / RuntimeMaxUse=60M — limiti all’uso di disco e memoria del journal.", + "Compress=yes, Seal=no — comprime i log, disabilita la sigillatura con sicurezza in avanti (risparmia CPU).", + "MaxLevelStore=info — salva il livello info e quelli superiori, necessari al visualizzatore log ProxMenux Monitor e a Fail2Ban per rilevare gli accessi SSH/Proxmox falliti dal journal.", + "Limite di frequenza: 1000 events / 30 s per evitare un flusso eccessivo di log.", + "ForwardToSyslog=no, ForwardToWall=no — non duplicare messaggi a syslog o trasmettere a console." + ], + "tipTitle": "Perché MaxLevelStore=info conta", + "tipBody": "Una soglia più rigorosa come warning fa mostrare a ProxMenux Monitor voci quasi identiche in tutti gli intervalli, perché gran parte dell’attività è di livello info, e impedisce a Fail2Ban di vedere gli accessi falliti. Per ridurre i log usa SystemMaxUse e RateLimitBurst senza restringere i livelli salvati." + }, + "logrotate": { + "heading": "Ottimizza logrotate", + "intro": "Riscrive /etc/logrotate.conf con impostazioni globali giornaliere e di dimensione, 7 rotazioni conservate, compressione e copytruncate per consentire ai servizi di scrivere senza riaprire i log. La dimensione, indicata dopo la frequenza giornaliera, prevale salvo regole specifiche del log. Il logrotate.conf originale viene copiato in .bak alla prima applicazione.", + "tipTitle": "Compatibile con Log2RAM", + "tipBody": "La direttiva size 10M prevale sull’impostazione giornaliera precedente; non significa il primo dei due criteri. Logrotate controlla la soglia quando viene eseguito, e le regole specifiche possono sovrascrivere quelle globali. Con /var/log nella RAM di Log2RAM, verifica regole e frequenza del timer per controllare lo spazio." + }, + "limits": { + "heading": "Aumenta i vari limiti del sistema", + "intro": "Aumenta i limiti di kernel, systemd e PAM che possono essere troppo bassi per un host con molte VM, container e servizi di rete.", + "headerFile": "File", + "headerSets": "Che cosa imposta", + "rows": [ + { + "file": "/etc/sysctl.d/99-maxwatches.conf", + "sets": "fs.inotify.max_user_watches / max_user_instances / max_queued_events = 1048576" + }, + { + "file": "/etc/sysctl.d/99-maxkeys.conf", + "sets": "kernel.keys.maxkeys / root_maxkeys = 1000000" + }, + { + "file": "/etc/sysctl.d/99-swap.conf", + "sets": "vm.swappiness = 10, vm.vfs_cache_pressure = 100" + }, + { + "file": "/etc/sysctl.d/99-fs.conf", + "sets": "fs.nr_open / file-max = 2097152, fs.aio-max-nr = 1048576" + }, + { + "file": "/etc/security/limits.d/99-limits.conf", + "sets": "nofile e nproc a 1.048.576 (illimitati per root)" + }, + { + "file": "/etc/systemd/system.conf + user.conf", + "sets": "DefaultLimitNOFILE=1048576 per servizi systemd" + }, + { + "file": "/etc/pam.d/common-session + runuser-l", + "sets": "session required pam_limits.so così il suddetto si applica alle shell di login" + }, + { + "file": "/root/.profile", + "sets": "ulimit -n 1048576 per la shell root" + } + ], + "tipTitle": "Perché inotify è importante", + "tipBody": "Docker, Syncthing, gli osservatori di file Node.js e le scansioni Plex possono esaurire max_user_watches. Il valore predefinito dipende dal kernel e dalla RAM; non è sempre 8192. Il limite di 1M consente più osservatori senza preallocarli. Quelli attivi consumano memoria del kernel: controlla l’uso sugli host con poca RAM." + }, + "memory": { + "heading": "Ottimizzare le impostazioni di memoria", + "intro": "Scrive un profilo sysctl bilanciato in /etc/sysctl.d/99-memory.conf. È pensato per un host hypervisor: preferisce tenere in RAM la memoria attivamente usata dalle VM e libera pagine in anticipo per evitare blocchi durante picchi di allocazione.", + "warnTitle": "swappiness=10 sugli host con poca memoria", + "warnBody": "Su un host con 16 GB di RAM e molte VM, abbassare swappiness può portare il kernel a terminare processi per memoria esaurita invece di usare lo swap. Se gli eventi OOM sono frequenti, riporta swappiness a 30–60 in /etc/sysctl.d/99-memory.conf dopo lo script." + }, + "kexec": { + "heading": "Attiva reboot veloci (kexec)", + "intro": "Installa kexec-tools e lo collega in modo da poter riavviare l'host direttamente in un nuovo kernel senza passare attraverso il firmware BIOS/UEFI. Su grandi server dove POST prende 45 – 90 secondi, questo trasforma un riavvio da una pausa caffè in pochi secondi di downtime.", + "installsTitle": "Cosa installa ProxMenux", + "installsItems": [ + "Pacchetto kexec-tools (debconf preimpostato con kexec-tools/load_kexec boolean false per evitare domande di apt e lasciare disattivato il caricamento automatico allo spegnimento).", + "Unità systemd /etc/systemd/system/kexec-pve.service — carica kernel Proxmox e initrd in memoria all’avvio, riutilizzando la riga di comando attuale del kernel.", + "Un alias in /root/.bash_profile: reboot-quick → systemctl kexec." + ], + "usageIntro": "Utilizzo dopo il riavvio successivo (o manuale systemctl start kexec-pve):", + "warnTitle": "Quando non usare kexec", + "warnBody": "kexec salta l’inizializzazione del firmware. Se BIOS/UEFI deve ripristinare lo stato hardware, per esempio una GPU in passthrough che si reimposta solo con POST completo o un firmware HBA problematico, i riavvii kexec possono lasciare i dispositivi parzialmente inizializzati. Usa un reboot normale dopo aggiornamenti del kernel o per applicare modifiche BIOS/UEFI. reboot-quick serve ai riavvii quotidiani." + }, + "panic": { + "heading": "Abilita riavvio in caso di kernel panic", + "intro": "Fa riavviare automaticamente il kernel invece di lasciarlo bloccato sulla schermata di panic. Essenziale per host Proxmox remoti o senza console locale: un kernel bloccato ferma tutte le VM finché non puoi spegnere e riaccendere l’host.", + "tipTitle": "Abbina questo con accesso remoto alla console", + "tipBody": "Il riavvio automatico serve al recupero, non al debug. Per indagare su un panic invece di ripartire soltanto, usa l’opzione kexec con il supporto kdump del kernel, non configurato da ProxMenux, oppure registra una console seriale su un altro host prima di abilitare il riavvio automatico." + }, + "verify": { + "heading": "Verifica", + "intro": "Dopo aver applicato le ottimizzazioni del sistema:", + "tipTitle": "Ripristino e limiti", + "tipBody": "Le sei opzioni sono registrate in installed_tools.json e disponibili in Disinstalla ottimizzazioni. Il ripristino rimuove configurazioni, unità e alias kexec e ripristina journald/logrotate. Alcuni limiti attivi richiedono una nuova sessione o riavvio. Da /root/.profile viene rimosso solo il vecchio ulimit -n 256000; l’attuale ulimit -n 1048576 può restare e richiedere rimozione manuale." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Comandi di sistema utili", + "href": "/docs/help-info/system-commands", + "tail": "— verificare le modifiche (free -h, journalctl, ulimit -a)." + }, + { + "label": "Prestazioni", + "href": "/docs/post-install/performance", + "tail": "— regolazione supplementare del livello di sistema (pigz)." + }, + { + "label": "Disinstalla ottimizzazioni", + "href": "/docs/post-install/uninstall", + "tail": "— annullare qualsiasi modifica." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/uninstall.json b/web/messages/it/docs/post-install/uninstall.json new file mode 100644 index 00000000..e0ffc8d6 --- /dev/null +++ b/web/messages/it/docs/post-install/uninstall.json @@ -0,0 +1,271 @@ +{ + "meta": { + "title": "Disinstalla ottimizzazioni | Documentazione ProxMenux", + "description": "Ripristina le modifiche di configurazione post-installazione reversibili applicate da ProxMenux. Gli strumenti registrati utilizzano disinstallatori dedicati che conservano lo stato host preesistente, laddove possibile." + }, + "header": { + "title": "Disinstalla ottimizzazioni", + "description": "Ripristina le modifiche reversibili apportate dagli script post-installazione automatizzati o personalizzabili. ProxMenux registra ogni ottimizzazione supportata con la sua funzione di restauro dedicata; gli aggiornamenti dei pacchetti sono intenzionalmente esclusi.", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Perché questo esiste", + "body": "Ogni modifica reversibile supportata viene registrata in /usr/local/share/proxmenux/installed_tools.json. Il registro elenca le ottimizzazioni attive e richiama la funzione di ripristino corrispondente. Le azioni senza ripristino sicuro, come l’aggiornamento completo dei pacchetti, non vengono aggiunte." + }, + "openMenu": { + "heading": "Come aprirlo", + "body": "Dal menu principale apri Impostazioni post-installazione Proxmox → Disinstalla ottimizzazioni. La lista mostra le ottimizzazioni attualmente applicate; quelle non applicate non compaiono.", + "imageAlt": "Lista Disinstalla ottimizzazioni con modifiche attive sull’host e caselle per scegliere quali annullare" + }, + "howWorks": { + "heading": "Come funziona il ripristino", + "steps": [ + { + "title": "Registro e rilevamento automatico", + "body1": "Alla prima esecuzione ProxMenux cerca indicatori sull’host: /etc/sysctl.d/99-memory.conf, /etc/apt/apt.conf.d/99-force-ipv4, pacchetto haveged installato, servizio Log2RAM attivo e simili. Gli elementi riconosciuti vengono registrati come reversibili anche se applicati da una versione precedente al registro.", + "body2": "Questa migrazione funziona solo una volta. Dopo di che, ogni applicazione/ritorno aggiorna il registro direttamente." + }, + { + "title": "Scegli cosa ripristinare", + "body1": "La lista mostra un nome comprensibile per ogni elemento, come Ottimizzazione della memoria, Passthrough PCI IOMMU/VFIO o Log2RAM (protezione SSD). Seleziona quelli da annullare; gli altri non vengono modificati." + }, + { + "title": "Esecuzione del ripristino", + "body1": "Per ogni elemento selezionato, ProxMenux chiama la sua funzione disinstallazione corrispondente. La maggior parte delle inversioni seguono uno dei tre modelli:", + "items": [ + "Da backup — ripristina un .bak creato all’applicazione (bashrc, logrotate.conf, journald.conf, riga di comando GRUB/kernel).", + "Rimozione della configurazione — elimina i file ProxMenux /etc/sysctl.d/99-*.conf, /etc/apt/apt.conf.d/99-* o l’unità systemd, poi ricarica.", + "Reinstallazione dei pacchetti — per modifiche all’interfaccia come l’avviso di abbonamento, reinstalla i pacchetti originali con --force-confnew per ripristinare le impostazioni distribuite." + ], + "body2": "Ogni inversione registra i suoi progressi. Gli elementi che richiedono un riavvio (VFIO, nomi di interfaccia persistenti) impostano una bandiera che attiva il prompt di riavvio alla fine." + }, + { + "title": "Richiesta di riavvio finale", + "body1": "Dopo l'inversione il menu mostra un prompt di riavvio. Gli elementi che hanno cambiato i parametri del kernel, i moduli del kernel o la denominazione di rete (VFIO, i nomi di interfaccia persistenti) hanno bisogno del riavvio per prendere effetto; altri elementi non lo fanno, e il prompt è un default di sicurezza piuttosto che un controllo per-item." + } + ] + }, + "reversible": { + "heading": "Che cosa è reversibile", + "intro": "Le ottimizzazioni reversibili registrate e i loro disinstallatori corrispondenti sono raggruppati qui per area:", + "groups": [ + { + "title": "Repositori & APT", + "items": [ + { + "tool": "Rimozione dell’avviso di abbonamento", + "restores": "Prima cerca di ripristinare i file UI da backup propri di ProxMenux (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* e, quando l'interfaccia utente mobile viene patchata, index.html.tpl.backup.*). Solo se un backup è mancante o danneggiato, torna a reinstallare pve-manager, proxmox-widget-toolkit, libjs-extjs e libpve-http-server-perl con force-confnew. Inoltre cancella le copie cache .js / .gz." + }, + { + "tool": "Salta le lingue APT", + "restores": "Rimuove /etc/apt/apt.conf.d/99-disable-translations, consentendo gli indici delle descrizioni tradotte secondo le altre impostazioni linguistiche APT." + }, + { + "tool": "Forza IPv4 per APT", + "restores": "Rimuove /etc/apt/apt.conf.d/99-force-ipv4." + }, + { + "tool": "Utilità del sistema", + "restores": "Rimuove completamente solo i pacchetti di utilità selezionati che ProxMenux ha registrato come appena installati. I pacchetti già presenti non entrano nell’elenco e restano intatti." + } + ] + }, + { + "title": "Limiti di Kernel, memoria e sistema", + "items": [ + { + "tool": "Impostazioni della memoria", + "restores": "Rimuove /etc/sysctl.d/99-memory.conf e ricarica sysctl." + }, + { + "tool": "Configurazione del kernel panic", + "restores": "Rimuove /etc/sysctl.d/99-kernelpanic.conf." + }, + { + "tool": "Aumento dei limiti di sistema", + "restores": "Rimuove /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf e /etc/security/limits.d/99-limits.conf. Ripristina limiti PAM e DefaultLimitNOFILE systemd. In /root/.profile rimuove solo il vecchio ulimit -n 256000; ulimit -n 1048576 dell’installatore attuale può restare e richiedere rimozione manuale." + }, + { + "tool": "Profilo swap ZRAM", + "restores": "Disattiva lo swap /dev/zram0, ferma dev-zram0.swap e rimuove /etc/systemd/zram-generator.conf.d/90-proxmenux.conf. Rimuove completamente systemd-zram-generator solo se installato da ProxMenux e senza altre configurazioni ZRAM. Se non può spostare le pagine fuori da ZRAM, il profilo rimane attivo e non elimina nulla." + } + ] + }, + { + "title": "Rete", + "items": [ + { + "tool": "Ottimizzazione della rete", + "restores": "Rimuove /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf e 98-proxmenux-rpf.conf, l’unità proxmenux-fwbr-tune.service, lo script /usr/local/sbin/proxmenux-fwbr-tune e la regola udev /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules. Elimina anche source /etc/network/interfaces.d/* da /etc/network/interfaces. Ricarica sysctl, systemd e le regole udev." + }, + { + "tool": "Open vSwitch", + "restores": "Esegue apt purge su openvswitch-switch e openvswitch-common. Migrare eventuali ponti OVS indietro ai ponti Linux prima di eseguire questa disinstallazione — altrimenti le VM su quei ponti perdono la rete sul prossimo avvio." + }, + { + "tool": "TCP BBR + TCP Fast Open", + "restores": "Rimuove /etc/sysctl.d/99-kernel-bbr.conf e 99-tcp-fastopen.conf e ricarica le altre impostazioni sysctl. Eliminare i file non ripristina i valori attivi; valori come cubic e tcp_fastopen=1 tornano al riavvio salvo altre configurazioni." + }, + { + "tool": "Nomi di interfaccia persistenti", + "restores": "Rimuove solo i file 10-proxmenux-*.link che trasportano l'intestazione ProxMenux da /etc/systemd/network/. Qualsiasi file .link fornito da un altro pacchetto o scritto dall'utente viene lasciato in posizione. I nomi delle interfacce ritornano al comportamento predefinito di systemd nel prossimo riavvio." + } + ] + }, + { + "title": "Registrazione", + "items": [ + { + "tool": "Ottimizzazione di journald", + "restores": "Riscrive /etc/systemd/journald.conf con i valori predefiniti originali e riavvia systemd-journald." + }, + { + "tool": "Ottimizzazione Logrotate", + "restores": "Ripristina /etc/logrotate.conf dal file .bak catturato prima della modifica." + }, + { + "tool": "Log2RAM", + "restores": "Ferma e disabilita servizio e timer. Elimina processi cron, unità systemd, binari, configurazione e /var/log.hdd. Rimuove anche il pacchetto apt se installato in quel modo." + }, + { + "tool": "TRIM automatico ZFS", + "restores": "Legge /usr/local/share/proxmenux/zfs_autotrim_pools, l’elenco dei pool realmente modificati, ed esegue zpool set autotrim=off su ciascuno. Non tocca autotrim abilitato manualmente prima di ProxMenux." + } + ] + }, + { + "title": "Shell & apparenza", + "items": [ + { + "tool": "Personalizzazione di Bashrc", + "restores": "Ripristina /root/.bashrc dal backup .bak. Se non esiste alcun backup, rimuove il blocco PMX_CORE_BASHRC da marcatori." + }, + { + "tool": "Banner MOTD personalizzato", + "restores": "Ripristina l'esatto contenuto originale /etc/motd mantenuto sotto /usr/local/share/proxmenux, rimuove il file quando non esisteva prima, o rimuove in modo sicuro il marcatore legacy durante la migrazione di un'installazione precedente." + }, + { + "tool": "Fastfetch", + "restores": "Rimuove binario, directory di configurazione, hook update-motd e blocco delimitato BEGIN FASTFETCH / END FASTFETCH da /root/.bashrc, ~/.profile, /etc/profile e /etc/profile.d/fastfetch.sh. Rimuove completamente il pacchetto apt se installato." + }, + { + "tool": "Figurine", + "restores": "Rimuove il binario, la voce profile.d e il blocco alias in bashrc/profile." + } + ] + }, + { + "title": "Hardware e virtualizzazione", + "items": [ + { + "tool": "IOMMU / VFIO", + "restores": "Rimuove i moduli vfio da /etc/modules, il nouveau / radeon / nvidia blacklist, e intel_iommu=on / amd_iommu=on / iommu=pt / pcie_acs_override parametri da /etc/kernel/cmdline (ZFS) o GRUB. Ricostruisce initramfs." + }, + { + "tool": "AMD CPU correzioni (Ryzen/EPYC)", + "restores": "Rimuove idle=nomwait dal kernel cmdline (ZFS) o GRUB, e le opzioni ignore_msrs / report_ignored_msrs da /etc/modprobe.d/kvm.conf." + }, + { + "tool": "Agente guest per un host Proxmox virtualizzato", + "restores": "Legge /usr/local/share/proxmenux/guest_agent.pkg e rimuove il pacchetto host registrato. L’installatore sceglie qemu-guest-agent, open-vm-tools o virtualbox-guest-utils secondo l’hypervisor. Senza registrazione prova quei tre pacchetti. Agisce sull’host Proxmox annidato, non sui modelli guest." + } + ] + }, + { + "title": "Archiviazione", + "items": [ + { + "tool": "Dimensionamento dell'ARC ZFS", + "restores": "Rimuove /etc/modprobe.d/99-zfsarc.conf, ripristina i file *.conf esterni in conflitto salvati in /usr/local/share/proxmenux/backups/zfs_arc/, ricrea initramfs ed esegue proxmox-boot-tool refresh sugli host systemd-boot." + }, + { + "tool": "Snapshot automatici ZFS", + "restores": "Rimuove le voci cron scritte dallo script e propone apt purge zfs-auto-snapshot. Gli snapshot esistenti sui pool restano intatti; eliminali separatamente se necessario." + }, + { + "tool": "Limiti di velocità di vzdump", + "restores": "Ripristina /etc/vzdump.conf dal .bak l'installazione creata, riportando bwlimit e ionice ai valori pre-ProxMenux." + } + ] + }, + { + "title": "Servizi e extra", + "items": [ + { + "tool": "Sincronizzazione del tempo", + "restores": "Imposta il fuso orario di ritorno a UTC (impostazione predefinita sicura) tramite timedatectl." + }, + { + "tool": "Generazione di entropia (haveged)", + "restores": "Ferma, disabilita e rimuove completamente il pacchetto haveged." + }, + { + "tool": "kexec (riavvii rapidi)", + "restores": "Disabilita kexec-pve.service, rimuove il file dell'unità e gli alias reboot-quick da /root/.bash_profile, purges kexec-tools." + }, + { + "tool": "RPC / rpcbind Disabilitazione", + "restores": "Ripristina separatamente rpcbind.service e rpcbind.socket negli stati abilitato/disabilitato e attivo/inattivo registrati prima di ProxMenux." + }, + { + "tool": "pigz (gzip parallelo)", + "restores": "Ripristina il vero gzip da gzip.distrib, rimuove la deviazione dpkg e /bin/pigzwrapper, commenta la riga pigz in /etc/vzdump.conf ed esegue apt purge pigz dopo aver verificato gzip." + }, + { + "tool": "Servizi di alta disponibilità", + "restores": "Ferma e disabilita pve-ha-lrm, pve-ha-crm e corosync. I gruppi HA esistenti e le definizioni delle risorse non vengono eliminati — rimuoverli dall'interfaccia utente web se non ne hai più bisogno." + }, + { + "tool": "repository Ceph", + "restores": "Rimuove completamente i pacchetti Ceph installati dall’opzione, elimina il file deb822 /etc/apt/sources.list.d/ceph.sources su PVE 9 o la vecchia lista Ceph su PVE 8 e aggiorna la cache APT." + }, + { + "tool": "OVH RTM (monitoraggio)", + "restores": "Rimuove i pacchetti corrispondenti a ovh-rtm*, rtm e rtm-*, elimina /etc/rtm e la voce RTM dal registro. I residui Puppet in /etc/puppet/ possono richiedere verifica e pulizia manuale; la directory non viene eliminata. Su host non OVH l’installatore normalmente non modifica nulla." + } + ] + } + ] + }, + "edge": { + "heading": "Casi particolari e limiti", + "packageTitle": "La reinstallazione interessa pacchetti Proxmox in uso", + "packageBody": "Se le copie ProxMenux non possono annullare Rimozione dell’avviso di abbonamento, il ripiego reinstalla pve-manager, proxmox-widget-toolkit, libjs-extjs e libpve-http-server-perl con --force-confnew. Interessa l’interfaccia web in uso: ricarica il browser e attendi qualche secondo per riconnetterti. Evitalo durante migrazioni o clonazioni.", + "rebootTitle": "I nomi persistenti e VFIO hanno bisogno di un riavvio", + "rebootBody": "Eliminare i file 10-proxmenux-*.link (Nomi persistenti delle interfacce) e annullare IOMMU/VFIO non cambia il sistema già avviato: le modifiche si applicano dopo il riavvio. ProxMenux segnala automaticamente la necessità di riavviare.", + "perItemTitle": "Puoi annullare una modifica e conservare le altre", + "perItemBody": "Il disinstallatore opera per-item. Se si desidera solo rimuovere Log2RAM ma mantenere il tuning di rete e le modifiche bashrc, selezionare solo Log2RAM. Nient'altro è toccato, e il registro è aggiornato di conseguenza." + }, + "inspect": { + "heading": "Ispezione manuale del registro", + "intro": "Se volete vedere cosa è tracciato senza aprire il menu:", + "outro": "Ogni voce \"tool\": true corrisponde a qualcosa che ProxMenux applicato e può invertire. Rimuovere una voce manualmente non è raccomandato — utilizzare sempre il menu, che esegue anche la funzione inversione invece di semplicemente dimenticando il cambiamento.", + "reinstallTitle": "Reinstallare dopo aver disinstallato", + "reinstallBody": "Puoi riapplicare in seguito un’ottimizzazione annullata. Apri di nuovo il menu post-installazione ed esegui Automatizzato o Personalizzabile: il registro memorizzerà il nuovo stato." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Post-Install automatizzato", + "href": "/docs/post-install/automated", + "tail": " — riapplica la configurazione di base consigliata." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": "— scegliere un sottoinsieme diverso." + }, + { + "label": "Disinstalla ProxMenux", + "href": "/docs/settings/uninstall-proxmenux", + "tail": "— operazione diversa: rimuove ProxMenux se stessa, non le sue ottimizzazioni applicate." + }, + { + "label": "Panoramica post-install", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/it/docs/post-install/updates.json b/web/messages/it/docs/post-install/updates.json new file mode 100644 index 00000000..64536f4e --- /dev/null +++ b/web/messages/it/docs/post-install/updates.json @@ -0,0 +1,112 @@ +{ + "meta": { + "title": "Applica aggiornamenti disponibili — Ottimizzazioni post-installazione | Documentazione ProxMenux", + "description": "Come ProxMenux rileva quando un'ottimizzazione post-install (Log2Ram, Impostazioni di memoria, Limiti di sistema, Logrotate, tuning di rete...) è stata aggiornata a monte e come applicare la nuova versione — dal menu Post-Install o dal cruscotto Monitor." + }, + "header": { + "title": "Applica aggiornamenti disponibili", + "description": "Quando sul disco è presente una versione di un’ottimizzazione post-installazione (Log2Ram, impostazioni della memoria, limiti di sistema, Logrotate …) più recente di quella registrata sull’host, ProxMenux la segnala come aggiornamento disponibile. Puoi applicarla dal menu di post-installazione nell’interfaccia degli script oppure dalla dashboard del Monitor. Entrambi i percorsi rieseguono la stessa funzione di post-installazione e ne aggiornano la versione registrata.", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa è questo", + "body": "Le ottimizzazioni post-installazione ProxMenux hanno versioni, ad esempio Log2ram SSD Protection v1.2. L’host registra quelle attive e le relative versioni in /usr/local/share/proxmenux/installed_tools.json. Quando una nuova versione ProxMenux aggiorna un’ottimizzazione, viene rilevata la differenza ed è possibile riapplicare solo quella, senza ripetere tutta la post-installazione." + }, + "why": { + "heading": "Perché questo esiste", + "body": "Le ottimizzazioni post-installazione ricevono miglioramenti: regolazioni sysctl, limiti Logrotate più severi, nuovi criteri di dimensionamento Log2RAM o correzioni di casi limite. Senza questa modalità occorreva ripetere lo script, che riapplica tutte le ottimizzazioni, oppure rinunciare al miglioramento. Applica aggiornamenti disponibili permette di scegliere solo quelle la cui versione è cambiata." + }, + "detection": { + "heading": "Come vengono rilevati gli aggiornamenti", + "steps": [ + { + "title": "Script con versione su disco", + "body": "Ogni funzione post-installazione dichiara la sua versione all'interno dello script (scripts/post_install/auto_post_install.sh e scripts/post_install/customizable_post_install.sh). Uno scanner estrae queste versioni dalla fonte sul disco." + }, + { + "title": "Registro delle versioni sull’host", + "body": "Quando l'operatore ha applicato ogni ottimizzazione, la corrispondente chiamata register_tool ha scritto la versione attiva in /usr/local/share/proxmenux/installed_tools.json. Questo file è la fonte della verità per \"che cosa è attivo su questo host in questo momento\"." + }, + { + "title": "Monitor confronta entrambi i lati", + "body": "All’avvio e ogni 24 ore, Monitor confronta le versioni su disco con quelle registrate. Ogni differenza genera una voce in /usr/local/share/proxmenux/updates_available.json. Il file alimenta la voce del menu post-installazione e la scheda della dashboard Monitor." + }, + { + "title": "Una notifica per nuova versione", + "body": "Quando almeno un’ottimizzazione ha un aggiornamento in attesa, Monitor invia un’unica notifica raggruppata, ad esempio «4 aggiornamenti delle ottimizzazioni ProxMenux disponibili», con una riga per strumento nel formato name (vX → vY), come per i pacchetti Proxmox. Non si ripete ogni giorno per lo stesso insieme: si riattiva solo con una nuova versione o un nuovo strumento nell’elenco." + } + ] + }, + "pathA": { + "heading": "Percorso A — Dal menu post-installazione", + "intro": "Dal menu principale ProxMenux, apri Impostazioni post-installazione Proxmox. Con aggiornamenti in attesa compare Applica aggiornamenti disponibili (N) sopra Disinstalla ottimizzazioni. Il numero indica quante ottimizzazioni hanno una versione su disco più recente di quella registrata. Se tutto è aggiornato, la voce è nascosta.", + "menuAlt": "Menu degli script post-installazione con Applica aggiornamenti disponibili (N) sopra Disinstalla ottimizzazioni; il contatore indica quante ottimizzazioni hanno una versione più recente su disco", + "menuCaption": "Applica aggiornamenti disponibili (N) compare solo se almeno un’ottimizzazione ha un aggiornamento in attesa; si nasconde quando l’host è aggiornato.", + "checklistBody": "Apre una lista con tutti gli aggiornamenti in attesa, nel formato name (vX → vY). Sono tutti selezionati per impostazione predefinita: deseleziona quelli che non vuoi applicare ora.", + "checklistAlt": "Finestra Applica aggiornamenti disponibili con una riga per ottimizzazione in attesa, nome e passaggio di versione (attuale → disponibile). Tutte le righe sono selezionate.", + "checklistCaption": "Seleziona le singole ottimizzazioni da aggiornare. Lo stesso motore usato per la post-installazione automatica e personalizzabile riesegue in background ogni funzione selezionata e ne aggiorna la versione registrata." + }, + "pathB": { + "heading": "Percorso B — Dalla dashboard Monitor", + "intro": "Gli stessi aggiornamenti compaiono in Monitor sotto Impostazioni → Ottimizzazioni ProxMenux. La scheda mostra un contatore degli aggiornamenti in attesa che apre il selettore per ottimizzazione. Ogni strumento ha anche la propria azione di aggiornamento.", + "imageAlt": "Scheda Ottimizzazioni ProxMenux nelle impostazioni Monitor con contatore degli aggiornamenti che apre il selettore e azioni di aggiornamento per ogni strumento", + "imageCaption": "La scheda Ottimizzazioni di Monitor rende accessibili gli aggiornamenti dal contatore quando esiste una versione più recente su disco, senza accedere alla shell." + }, + "applying": { + "heading": "Cosa succede quando si applica", + "steps": [ + { + "title": "Riesegue la funzione post-installazione", + "body": "La funzione scelta viene rieseguita sull’host. Essendo idempotente, non duplica la configurazione: sostituisce la versione precedente con la nuova, inclusi file sysctl, configurazioni aggiuntive e unità dei servizi." + }, + { + "title": "Aggiorna il registro", + "body": "La chiamata register_tool nella funzione scrive la nuova versione in installed_tools.json. La scansione successiva non rileva più differenze e l’aggiornamento scompare dal menu e dalla scheda Monitor." + }, + { + "title": "Nessun riavvio a meno che la funzione non lo dica", + "body": "La maggior parte degli aggiornamenti hanno effetto immediatamente. Gli aggiornamenti che toccano i moduli del kernel, i nomi di interfaccia persistenti, o VFIO mostrano lo stesso prompt di riavvio di una nuova installazione." + }, + { + "title": "Aggiornamento del Registro inviato al Monitor", + "body": "Al termine del gruppo, il menu invia una richiesta POST a http://127.0.0.1:8008/api/updates/post-install/scan per ricostruire /usr/local/share/proxmenux/updates_available.json. Dopo tutti gli aggiornamenti scompaiono il contatore nella scheda Ottimizzazioni e la voce condizionale della shell, senza attendere la scansione successiva. La scheda resta disponibile." + } + ], + "jqTitle": "jq è necessario", + "jqBody": "La lista del percorso A usa jq per leggere il JSON degli aggiornamenti. Se jq manca, termina senza messaggi: vedresti il menu con il conteggio ma nulla accadrebbe dopo la selezione. Su un’installazione Proxmox moderna jq è presente; in caso di dubbio esegui apt install -y jq." + }, + "differs": { + "heading": "Come differisce dagli altri percorsi", + "headerPath": "Path", + "headerScope": "Ambito", + "headerWhen": "Quando ha senso", + "rows": [ + { + "pathLabel": "Automatizzato", + "pathHref": "/docs/post-install/automated", + "scope": "Riapplica tutte le ottimizzazioni del pacchetto.", + "when": "Host nuovo o riapplicazione completa della configurazione di base di un nodo interamente gestito." + }, + { + "pathLabel": "Personalizzabile", + "pathHref": "/docs/post-install/customizable", + "scope": "Scegli dal catalogo completo.", + "when": "Scegliere esattamente quali ottimizzazioni sono attive sull’host." + }, + { + "pathLabel": "Applica aggiornamenti disponibili", + "pathHref": null, + "scope": "Solo le ottimizzazioni con una versione più recente su disco.", + "when": "Mantenere aggiornate le ottimizzazioni installate senza toccare il resto." + }, + { + "pathLabel": "Disinstalla ottimizzazioni", + "pathHref": "/docs/post-install/uninstall", + "scope": "Invertire l'ottimizzazione e rimuovere la sua voce di registro.", + "when": "Annullare una modifica specifica." + } + ] + }, + "notifTitle": "Controllo della notifica", + "notifBody": "L’evento Aggiornamenti delle ottimizzazioni ProxMenux disponibili annuncia gli aggiornamenti in attesa. È attivo per impostazione predefinita su ogni canale e può essere silenziato per canale in Impostazioni → Notifiche. Si attiva una sola volta per insieme distinto di aggiornamenti, non a ogni scansione di 24 ore." +} diff --git a/web/messages/it/docs/post-install/virtualization.json b/web/messages/it/docs/post-install/virtualization.json new file mode 100644 index 00000000..7470dc39 --- /dev/null +++ b/web/messages/it/docs/post-install/virtualization.json @@ -0,0 +1,116 @@ +{ + "meta": { + "title": "Post-installazione: Virtualizzazione | Documentazione ProxMenux", + "description": "Opzioni di virtualizzazione nel ProxMenux Personalizzabile script post-installazione: installare automaticamente l'agente ospite giusto se Proxmox viene eseguito all'interno di un VM e abilitare IOMMU / VFIO in modo da poter passare i dispositivi PCI (GPU, NIC, HBA) attraverso le proprie VM." + }, + "header": { + "title": "Post-Install: Virtualizzazione", + "section": "Impostazioni post-installazione Proxmox" + }, + "intro": { + "title": "Che cosa copre questa categoria", + "body": "Due opzioni indipendenti. Installa il guest agent appropriato serve quando Proxmox stesso gira dentro un altro hypervisor. Abilita supporto VFIO IOMMU interessa la maggior parte degli utenti: attiva le funzioni del kernel per assegnare direttamente GPU, HBA o schede di rete a una VM con prestazioni quasi native." + }, + "guestAgent": { + "heading": "Installa il guest agent appropriato", + "intro": "Rileva l’ambiente di virtualizzazione dell’host Proxmox tramite systemd-detect-virt e dmidecode e installa gli strumenti guest adatti per comunicare correttamente con l’hypervisor esterno: arresto ordinato, sincronizzazione dell’orologio, informazioni IP, ecc.", + "headerDetected": "Host rilevato", + "headerPackage": "Pacchetto installato", + "rows": [ + { + "detected": "QEMU / KVM", + "package": "qemu-guest-agent" + }, + { + "detected": "VMware (ESXi, Workstation)", + "package": "open-vm-tools" + }, + { + "detected": "VirtualBox", + "package": "virtualbox-guest-utils" + }, + { + "detected": "Bare metal (nessuno)", + "package": "— no-op, niente installato" + } + ], + "skipTitle": "Salta questo su bare-metal Proxmox", + "skipBody": "Se Proxmox gira direttamente sull’hardware, il caso comune, selezionare l’opzione non cambia nulla: il rilevatore restituisce none e lo script termina senza modifiche. Serve solo alle configurazioni che eseguono Proxmox come guest per test o laboratori." + }, + "vfio": { + "heading": "Abilita supporto VFIO IOMMU", + "intro": "Attiva IOMMU sull’host e carica i moduli per il passthrough PCI (vfio, vfio_iommu_type1, vfio_pci). Puoi così assegnare un dispositivo fisico a una VM, che vi accede direttamente con prestazioni quasi native.", + "whoTitle": "Chi ha bisogno di questo", + "whoItems": [ + "Vuoi assegnare una GPU a una VM Windows per il gaming o a una VM macOS.", + "Hai un NIC 10G dedicato per un firewall/router VM (OPNsense, pfSense).", + "Si desidera passare un HBA direttamente a un TrueNAS/Unraid VM per ZFS su dischi nudi.", + "Prevedi di usare una Coral TPU, una scheda di acquisizione o un dongle SDR in una VM." + ], + "whoOutro": "Se non ti serve nulla di questo, puoi saltare l’opzione. Per l’accesso ai dispositivi da un LXC, invece di una VM, IOMMU non è necessario.", + "doesTitle": "Cosa fa ProxMenux", + "doesIntro": "La funzione tiene conto del boot loader: rileva ZFS (systemd-boot) o LVM/ext4 (GRUB) e scrive nel file corretto. È idempotente: se i parametri esistono già, non li aggiunge di nuovo.", + "headerBoot": "Tipo di avvio", + "headerFile": "File modificato", + "headerPost": "Passo dopo aggiornamento", + "bootRows": [ + { + "boot": "systemd-boot (ZFS)", + "file": "/etc/kernel/cmdline", + "post": "proxmox-boot-tool refresh" + }, + { + "boot": "GRUB (LVM/ext4)", + "file": "/etc/default/grub", + "post": "update-grub" + } + ], + "kernelIntro": "Parametri del kernel aggiunti:", + "modulesIntro": "Moduli Kernel aggiunti a /etc/modules:", + "blacklistIntro": "Driver in conflitto inseriti nella blacklist in /etc/modprobe.d/blacklist.conf:", + "blacklistTitle": "La blacklist dei driver GPU impedisce l’uso della GPU sull’host", + "blacklistBody": "La blacklist impedisce al kernel host di associare qualsiasi driver GPU, permettendo a VFIO di acquisire la GPU. È ciò che serve per il passthrough a una VM, ma è l’opposto di quanto necessario per installare i driver NVIDIA sull’host, ad esempio per la transcodifica LXC. Scegli un percorso per ogni GPU:", + "pathItems": [ + "GPU → VM: abilita VFIO/IOMMU qui e lascia i driver GPU nella blacklist.", + "GPU → LXC (o host): salta questa opzione, usa l’installazione NVIDIA sull’host e non inserire nvidia/nouveau nella blacklist.", + "Due GPU: una può andare a una VM e l’altra a un LXC, ma serve una configurazione più precisa: associare solo una scheda a vfio-pci tramite ID PCI. La blacklist predefinita è troppo ampia: modifica poi blacklist.conf." + ], + "acsTitle": "Informazioni su pcie_acs_override — sapere cosa stai abilitando", + "acsBody": "pcie_acs_override=downstream,multifunction allenta il controllo PCIe Access Control Services. Il kernel può separare gruppi IOMMU che il firmware indica come indivisibili, talvolta l’unico modo per assegnare un dispositivo senza l’intero gruppo. Il compromesso è un isolamento ridotto tra dispositivi: una VM malevola o compromessa con passthrough ha una superficie di attacco DMA maggiore. Accettabile in un laboratorio domestico, da valutare bene su host con carichi non attendibili. Se non serve, rimuovi il parametro da /etc/kernel/cmdline o /etc/default/grub dopo lo script e ripeti l’aggiornamento del boot loader.", + "rebootTitle": "Riavvio necessario", + "rebootBody": "IOMMU, moduli VFIO e blacklist hanno effetto dopo la rigenerazione di initramfs e il riavvio. Lo script esegue update-initramfs -u -k all, aggiorna il boot loader e imposta «riavvio necessario», così Personalizzabile lo propone alla fine.", + "verifyTitle": "Verifica dopo il riavvio", + "revertTitle": "Reversibile dal menu Disinstalla", + "revertBody": "Rimuovi le ottimizzazioni annulla tutte le modifiche: elimina i parametri IOMMU da /etc/kernel/cmdline o da GRUB, rimuove i moduli VFIO da /etc/modules, elimina le voci della blacklist dei driver e ricostruisce initramfs. Per applicare effettivamente il ripristino è necessario riavviare." + }, + "related": { + "heading": "Correlati", + "items": [ + { + "label": "Aggiungi GPU a VM (Passthrough)", + "href": "/docs/hardware/gpu-vm-passthrough", + "tail": "— passo successivo naturale una volta abilitato IOMMU + VFIO." + }, + { + "label": "Aggiungi controller o NVMe a VM", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "tail": " — la stessa infrastruttura di passthrough per i controller di archiviazione." + }, + { + "label": "Comandi di passaggio GPU", + "href": "/docs/help-info/gpu-commands", + "tail": "— Riferimento di verifica IOMMU." + }, + { + "label": "Disinstalla ottimizzazioni", + "href": "/docs/post-install/uninstall", + "tail": " — annulla IOMMU / VFIO in modo pulito." + }, + { + "label": "Post-installazione personalizzabile", + "href": "/docs/post-install/customizable", + "tail": " — torna al menu superiore." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/automated.json b/web/messages/pt/docs/post-install/automated.json new file mode 100644 index 00000000..a1d329f5 --- /dev/null +++ b/web/messages/pt/docs/post-install/automated.json @@ -0,0 +1,172 @@ +{ + "meta": { + "title": "Script pós-instalação automatizado | Documentação ProxMenux", + "description": "O script pós-instalação automatizado ProxMenux executa 14 otimizações predefinidas adaptadas ao hardware num host Proxmox VE novo. Não tem lista de funções para selecionar, mas pode pedir confirmação para ocultar o aviso de subscrição, instalar Log2RAM em certos casos e reiniciar. As alterações reversíveis ficam registadas.", + "ogTitle": "Script pós-instalação automatizado | Documentação ProxMenux", + "ogDescription": "14 otimizações predefinidas adaptadas ao hardware para um host Proxmox VE novo, com confirmações para algumas ações e registo de alterações reversíveis." + }, + "header": { + "title": "Script pós-instalação automatizado", + "description": "O ProxMenux executa 14 otimizações de base predefinidas sem lista de funções para selecionar. Algumas ações pedem confirmação. As alterações reversíveis ficam registadas em Desinstalar otimizações; as atualizações de pacotes não são descritas como reversíveis.", + "section": "Pós-instalação · Automatizada" + }, + "intro": { + "title": "Quando escolher Automatizado", + "body": "Execute isso em um host Proxmox recém-instalado quando desejar uma linha de base sensata sem tomar decisões. O script é idempotente – executá-lo duas vezes é seguro, basta reaplicar as mesmas configurações. Recursos opcionais (Fastfetch, IOMMU, repositório Ceph, HA, correções AMD…) intencionalmente não fazem parte deste caminho; escolha-os em Personalizáveis se precisar deles." + }, + "applies": { + "heading": "O que o script aplica", + "intro": "As otimizações são aplicadas nesta ordem exata. A coluna Categoria liga à documentação detalhada de cada alteração na referência personalizável.", + "headerNum": "#", + "headerTool": "Ferramenta", + "headerWhat": "O que ele faz", + "headerCategory": "Categoria" + }, + "optimizations": [ + { + "tool": "Repositórios APT + atualização completa", + "what": "Desativa as fontes Enterprise pve-enterprise.sources e ceph.sources, cria uma fonte no-subscription para o nome de código Debian do host e executa apt update && apt full-upgrade -y (comando oficial de atualização Proxmox).", + "category": "Configurações básicas", + "categorySlug": "basic-settings" + }, + { + "tool": "Remoção de banner de assinatura", + "what": "Aplica patches na interface web para ocultar o banner 'Sem assinatura válida'. Pede confirmação antes de aplicar; reversível de Desinstalar Otimizações.", + "category": "Personalização", + "categorySlug": "customization" + }, + { + "tool": "Forçar IPv4", + "what": "Escreve /etc/apt/apt.conf.d/99-force-ipv4 para o apt usar apenas IPv4, contornando ligações IPv6 instáveis aos espelhos.", + "category": "Rede", + "categorySlug": "network" + }, + { + "tool": "Ignorar pacotes de idioma", + "what": "Escreve /etc/apt/apt.conf.d/99-disable-translations para deixar de transferir índices de descrições traduzidas de pacotes, reduzindo os dados das atualizações apt.", + "category": "Configurações básicas", + "categorySlug": "basic-settings" + }, + { + "tool": "Aumentar os limites do sistema", + "what": "Aumenta as monitorizações inotify, os limites nofile/nproc, os limites do chaveiro do kernel e fs.file-max através de sysctl.d, limits.d, pam e systemd, para hosts com muitos contentores.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Ajuste de memória", + "what": "Define vm.swappiness=10, proporções equilibradas de páginas modificadas ainda não gravadas, vm.max_map_count=262144 e compactação proativa quando suportada. A política de sobrealocação de memória do kernel mantém a predefinição Proxmox.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Comportamento de pânico no Kernel", + "what": "Configura o host para reiniciar 10 segundos após um pânico / oops / hardlockup em vez de congelar indefinidamente.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Ajuste de pilha de rede", + "what": "Dimensionamento dos buffers TCP, reforço IPv4 (redirecionamentos desligados, rp_filter=2, registo martian desligado), portas locais 1024-65535, deteção MTU TCP, RFC 1337 e script /usr/local/sbin/proxmenux-fwbr-tune ligado a uma unidade systemd de execução única e regra udev. Assim, rp_filter=0 / log_martians=0 são reaplicados às interfaces fwbr*/fwln*/fwpr*/tap* sempre que Proxmox as recria ao iniciar/parar VMs, reiniciar ou migrar em funcionamento.", + "category": "Rede", + "categorySlug": "network" + }, + { + "tool": "Personalização de bashrc (root)", + "what": "PS1 colorido, aliases comuns (l/la/ll/ls/grep), histórico com datas e horas e carregamento de bash-completion, num bloco delimitado PMX_CORE_BASHRC fácil de remover.", + "category": "Personalização", + "categorySlug": "customization" + }, + { + "tool": "Log2RAM (adaptado a SSD, automático)", + "what": "Reduz o desgaste SSD/NVMe movendo /var/log para um ramdisk tmpfs com sincronização periódica para disco. Instalação a partir do projeto original quando o disco raiz é SSD ou NVMe. Dimensiona pela RAM do host (128M / 256M / 512M), agenda sincronização periódica e proteção automática que limpa journals antigos aos 80% e trunca registos muito ativos aos 92% antes de gravar. Ajusta limites journald ao ramdisk. Detalhes em Log2RAM.", + "category": "Armazenamento", + "categorySlug": "storage" + }, + { + "tool": "Autotrim ZFS (apenas SSD)", + "what": "Ativa zpool autotrim=on em cada pool ZFS cujos vdevs sejam todos SSD/NVMe com TRIM (verifica /sys/block/[dev]/queue/rotational e discard_granularity). Ignora automaticamente pools com HDDs. Só regista para desinstalação os pools realmente alterados pelo ProxMenux; autotrim ativado manualmente é preservado.", + "category": "Armazenamento", + "categorySlug": "storage" + }, + { + "tool": "Limites de tamanho do journald", + "what": "Força armazenamento persistente, limita SystemMaxUse=64M / RuntimeMaxUse=60M e ativa compressão e registos de nível info necessários ao Monitor. É ignorado se Log2RAM estiver ativo, pois faz o seu próprio ajuste.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Ajuste de logrotate", + "what": "Define globalmente daily e depois size 10M, retém 7 rotações e ativa compressão e copytruncate. O critério de tamanho posterior prevalece; regras específicas podem substituí-lo. Adequado ao Log2RAM, mas a frequência depende das regras e do temporizador.", + "category": "Sistema", + "categorySlug": "system" + }, + { + "tool": "Nomes de interface persistentes", + "what": "Escreve um ficheiro /etc/systemd/network/10-proxmenux-<iface>.link por placa física, com cabeçalho «Managed by ProxMenux», associando o MAC ao nome atual. Os nomes eth0 / enp… ficam estáveis após reinícios e adição de placas.", + "category": "Rede", + "categorySlug": "network" + } + ], + "hardwareTitle": "Predefinições adaptadas ao hardware", + "hardwareBody": "O script lê o hardware do host antes de aplicar as configurações. Log2RAM é instalado apenas em discos raiz SSD / NVMe por padrão (ele avisa se a detecção indicar o contrário). O tamanho do ramdisk Log2RAM é escolhido do total RAM (≤ 8 GB → 128M, ≤ 16 GB → 256M, '>' 16 GB → 512M). Os limites journald correspondem ao tamanho do disco RAM quando Log2RAM está ativo, para evitar preenchê-lo.", + "upgrade": { + "heading": "Atualizar listas de pacotes e sistema", + "intro": "O primeiro passo do percurso automatizado é atualizar o Proxmox. Para um host em funcionamento dentro da mesma versão principal, o Proxmox recomenda:", + "after": "Esta linha é o comando oficial das versões atuais do Proxmox. O script automatizado executa exatamente isso e acrescenta a limpeza dos repositórios e as tarefas após atualização recomendadas pelo guia — como o utilitário independente Atualização do sistema Proxmox:", + "items": [ + "Desativa as fontes Enterprise pve-enterprise.sources / ceph.sources, remove ficheiros antigos de repositórios e cria uma fonte no-subscription para o nome de código do host.", + "Executa a atualização não-interativa com DEBIAN_FRONTEND=noninteractive e --force-confdef --force-confold — os arquivos de configuração que você personalizou permanecem seus quando o upstream também os alterou.", + "Instala pacotes essenciais do Proxmox em falta (zfsutils-linux, proxmox-backup-restore-image, chrony).", + "Verificação de sanidade de metadados LVM, apt-get autoremove -y + apt-get autoclean -y, e um prompt de reinicialização apenas se o kernel realmente mudou." + ], + "sameTitle": "Mesmo atualizador, dois pontos de entrada", + "sameBody": "O pacote automatizado e o utilitário independente Proxmox System Update compartilham os mesmos scripts subjacentes (update-pve8.sh / update-pve9_2.sh). Use o utilitário por conta própria quando você só quiser atualizar o host sem aplicar o resto das otimizações." + }, + "endResult": { + "heading": "Resultado final esperado", + "body": "No fim, verá uma mensagem de sucesso com a saída de cada passo e uma pergunta de reinício, necessário para algumas definições do kernel. Pode adiá-lo; as definições aplicam-se no próximo arranque.", + "imageAlt": "Programa pós-instalação automatizado — saída final do terminal mostrando cada otimização aplicada com sucesso" + }, + "notDoes": { + "heading": "O que este script NÃO faz", + "items": [ + "Deteção automática do fuso horário (comentada no código original; use Personalizável se precisar).", + "Desativar portmapper / rpcbind (ver Segurança).", + "Activar IOMMU / VFIO (ver Virtualização).", + "Instalar Fastfetch / Figurine / repositório Ceph / HA / correções de CPU AMD (ver Opcionais).", + "Instalar pigz ou ajustar ZFS ARC (ver Desempenho / Armazenamento)." + ] + }, + "xshokTitle": "detecção xshok-proxmox", + "xshokBody": "Se o host tiver executado anteriormente o script xshok-proxmox, ProxMenux detecta o arquivo marcador e avisa você antes de continuar. Alguns ajustes podem se sobrepor. O script companheiro está desatualizado — se você decidir continuar de qualquer forma, reveja a visão geral para o contexto.", + "revert": { + "heading": "Revertendo", + "body": "Cada ferramenta da tabela fica registada em /usr/local/share/proxmenux/installed_tools.json. Abra Desinstalar otimizações para escolher os itens a reverter. As cópias dos ficheiros modificados ficam junto dos originais com sufixo .bak." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — escolher exactamente o que pretende do mesmo catálogo." + }, + { + "label": "Desinstalar otimizações", + "href": "/docs/post-install/uninstall", + "tail": " — reverter qualquer subconjunto do que foi aqui aplicado." + }, + { + "label": "Comandos úteis do sistema", + "href": "/docs/help-info/system-commands", + "tail": " — verificar as alterações (uptime, free, journalctl, etc.)." + }, + { + "label": "Visão geral da pós-instalação", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/basic-settings.json b/web/messages/pt/docs/post-install/basic-settings.json new file mode 100644 index 00000000..852954f2 --- /dev/null +++ b/web/messages/pt/docs/post-install/basic-settings.json @@ -0,0 +1,240 @@ +{ + "meta": { + "title": "Pós-instalação: Configurações básicas | Documentação ProxMenux", + "description": "Opções de pós-instalação fundamentais: mude para repositórios gratuitos do Proxmox e atualize, detecte automaticamente o fuso horário e habilite o NTP, pule downloads de linguagem APT e escolha os utilitários comuns do sistema 25 para instalar." + }, + "header": { + "title": "Pós-instalação: Configurações básicas", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que esta categoria abrange", + "body": "Cinco opções de base para um host Proxmox novo: usar repositórios comunitários sem subscrição, atualizar todo o sistema, configurar automaticamente o fuso horário e NTP, desativar traduções APT para poupar largura de banda e espaço e escolher entre 25 utilitários comuns." + }, + "upgrade": { + "heading": "Atualizar listas de pacotes e sistema", + "intro": "Reconfigura o APT para usar o repositório pve-no-subscription gratuito (em vez do repositório corporativo que requer uma assinatura) e executa uma atualização completa do sistema. Os passos exatos dependem da versão principal do Proxmox VE: ProxMenux detecta e envia para o script certo.", + "headerVersion": "Versão PVE", + "headerScript": "Script de seleção por versão", + "headerCodename": "Nome de código Debian", + "rows": [ + { + "version": "9.x", + "script": "update-pve9_2.sh", + "codename": "trixie" + }, + { + "version": "8.x", + "script": "update-pve8.sh", + "codename": "bookworm" + } + ], + "officialTitle": "A recomendação oficial da Proxmox", + "officialBody": "A própria orientação de atualização da Proxmox é executar, nesta ordem exata:", + "officialOutro": "É o comando habitual para atualizações dentro da versão principal instalada do Proxmox VE. Verifique os repositórios e as alterações propostas aos pacotes antes de continuar. A mudança de versão principal exige o procedimento oficial de migração.", + "doesTitle": "O que a opção ProxMenux faz — verificado contra o script", + "doesIntro": "A atualização ProxMenux executa os comandos apt acima e acrescenta passos prévios e posteriores que teria de gerir manualmente. Cada item abaixo corresponde ao script de seleção; consulte Atualização do sistema Proxmox para o detalhe completo.", + "doesItems": [ + "Primeiro, organizar os repositórios. Desativa as fontes Enterprise pve-enterprise.sources / ceph.sources, remove ficheiros antigos de versões PVE anteriores e cria um proxmox.sources limpo para o canal gratuito pve-no-subscription, conforme o nome de código Debian: trixie para PVE 9, bookworm para PVE 8.", + "Reescreve os repositórios Debian com main / updates / security e non-free-firmware, para eliminar o aviso de firmware durante a atualização.", + "Executa a atualização oficial. apt-get update seguido por apt full-upgrade -y (PVE 9) ou apt dist-upgrade -y (PVE 8), ambos lançados não-interactivamente com --force-confdef --force-confold para que quaisquer arquivos de configuração que você personalizou permaneçam seus.", + "Instala pacotes essenciais se estiverem faltando: zfsutils-linux, proxmox-backup-restore-image, chrony.", + "Verifica os metadados LVM. Procura VMs com passthrough de discos que possam ter deixado cabeçalhos antigos de volumes físicos nos discos em bruto. Avisa sobre anomalias sem as corrigir automaticamente.", + "Limpa depois: apt-get autoremove -y + apt-get autoclean -y, então pede uma reinicialização se o kernel foi atualizado ou /var/run/reboot-required está presente." + ], + "shortTitle": "Em suma", + "shortBody": "A opção executa o comando recomendado apt update && apt full-upgrade -y, com a organização dos repositórios e a limpeza final indicadas no guia oficial, e pede reinício no fim. Consulte Atualização do sistema Proxmox para o diagrama completo; o mesmo atualizador está disponível separadamente no menu principal.", + "subTitle": "Não aplicar a um host com subscrição", + "subBody": "Se você realmente tiver uma assinatura Proxmox e quiser continuar usando os repositórios empresariais, pule esta opção. Executando-o desabilita o repositório corporativo e encaminha o host para o canal comunitário. A atualização do pacote e reescrita do repositório não são apresentadas como reversíveis em Desinstalar Otimizações; restaure sua configuração do repositório deliberadamente se você precisar mudar de canal mais tarde.", + "safetyTitle": "Controlo de segurança pós-atualização", + "safetyBody": "Após a atualização, o script procura metadados antigos de volumes físicos (PV) nos discos. Pode acontecer quando uma VM com passthrough escreve cabeçalhos LVM num disco em bruto. Se detetar algo suspeito, avisa e sugere pvs para inspeção. Não altera nada automaticamente." + }, + "time": { + "heading": "Sincronizar a hora automaticamente", + "intro": "Detecta o IP público do servidor via dig myip.opendns.com @resolver1.opendns.com, em seguida, consulta o ipapi.co/'{'ip'}'/timezone para procurar o fuso horário IANA correspondente, e aplica-o com o timedatectl set-timezone. Finalmente permite NTP com timedatectl set-ntp true.", + "depTitle": "Depende de dois serviços externos", + "depBody": "A pesquisa depende de OpenDNS e ipapi.co serem alcançáveis, e de suas respostas serem corretas. Se você executar o Proxmox atrás de uma VPN ou em um VLAN que sai de uma região diferente, o fuso horário detectado automaticamente pode estar errado. Nesse caso, ignore esta opção e defina o fuso- horário à mão:", + "revertTitle": "Reversível do menu Desinstalar", + "revertBody": "Desinstalar otimizações repõe o fuso horário em UTC, um valor seguro. NTP continua ativo: o relógio sincroniza e mostra UTC até definir outro fuso manualmente." + }, + "languages": { + "heading": "ignorar o download de idiomas adicionais", + "intro": "Durante apt update, o APT pode transferir descrições de pacotes traduzidas além dos metadados principais. A opção desativa-as para poupar largura de banda e espaço. Antes, o ProxMenux confirma que as definições regionais do host foram geradas: lê /etc/default/locale ou /etc/environment, acrescenta a /etc/locale.gen se faltar e executa locale-gen. Assim mantém as definições regionais da shell.", + "writtenTitle": "O que é escrito", + "revertTitle": "Reversível do menu Desinstalar", + "revertBody": "Excluindo /etc/apt/apt.conf.d/99-disable-translations (quer manualmente ou a partir do menu Desinstalar) restaura o comportamento padrão e APT baixa arquivos de idioma novamente." + }, + "utilities": { + "heading": "Instale utilitários comuns do sistema", + "intro": "Abre uma lista de 25 utilitários selecionados por grupos. Escolha e confirme; o ProxMenux instala-os pelo apt, verifica o resultado e mostra um resumo final.", + "imageAlt": "Seletor de utilitários ProxMenux: Espaço para selecionar, Enter para confirmar", + "reuseTitle": "A mesma lista é reutilizada em outro lugar", + "reuseBody": "O catálogo dos 25 utilitários tem uma única definição: PROXMENUX_UTILS em scripts/global/utils-install-functions.sh. O menu Utilitários e ferramentas → Utilitários do sistema oferece a mesma lista para instalar mais tarde sem repetir a pós-instalação.", + "listTitle": "O que está na lista", + "groups": [ + { + "group": "Monitores de sistemas", + "items": [ + { + "pkg": "htop", + "desc": "Visualizador interativo de processos" + }, + { + "pkg": "btop", + "desc": "Monitor moderno de recursos (CPU, RAM, discos, rede, processos)" + }, + { + "pkg": "s-tui", + "desc": "Interface de terminal para testes de esforço e monitorização da CPU" + }, + { + "pkg": "iftop", + "desc": "Utilização de largura de banda ao vivo por ligação" + }, + { + "pkg": "iotop", + "desc": "I/O do disco por processo" + }, + { + "pkg": "iptraf-ng", + "desc": "Monitor Interativo IP LAN" + } + ] + }, + { + "group": "Rede", + "items": [ + { + "pkg": "iperf3", + "desc": "Medir largura de banda máxima alcançável entre máquinas" + }, + { + "pkg": "net-tools", + "desc": "Ferramentas antigas (ifconfig, netstat, route). Ainda úteis para verificações rápidas" + }, + { + "pkg": "ipset", + "desc": "Gerencie grandes conjuntos de IP no kernel — úteis com regras iptables/nftables." + } + ] + }, + { + "group": "Transferências e arquivos", + "items": [ + { + "pkg": "axel", + "desc": "Acelerador de transferência paralelo leve" + }, + { + "pkg": "aria2", + "desc": "Downloader multi-fonte / multi-protocolo (HTTP, FTP, BitTorrent, Metalink)" + }, + { + "pkg": "unzip", + "desc": "Extrair arquivos ZIP" + }, + { + "pkg": "zip", + "desc": "Criar arquivos ZIP" + }, + { + "pkg": "cabextract", + "desc": "Extrair arquivos Microsoft CAB (útil com ISOs do Windows)" + }, + { + "pkg": "wimtools", + "desc": "Manipular imagens WIM do Windows (extrair, dividir, montar, aplicar)" + }, + { + "pkg": "genisoimage", + "desc": "Compila imagens ISO 9660 de uma árvore de diretórios" + } + ] + }, + { + "group": "Texto e ficheiros", + "items": [ + { + "pkg": "dos2unix", + "desc": "Converter final de linha CRLF (Windows) para LF (Unix)" + }, + { + "pkg": "grc", + "desc": "Colorização genérica: aplica realce de sintaxe às saídas de ping, traceroute, dig, tail e outros comandos" + }, + { + "pkg": "plocate", + "desc": "Pesquisa rápida de arquivos (indexado). Executar `updatedb` após instalar para construir o índice." + } + ] + }, + { + "group": "Remoto e sessões", + "items": [ + { + "pkg": "sshpass", + "desc": "Autenticação de senha SSH não interativa — útil para scripts, não para uso diário" + }, + { + "pkg": "tmux", + "desc": "Multiplexador de terminal — desacoplar sessões, dividir painéis, sobreviver a desconexão" + } + ] + }, + { + "group": "Hardware e baixo nível", + "items": [ + { + "pkg": "msr-tools", + "desc": "Ler/escrever registos específicos do modelo de CPU (rdmsr, wrmsr)" + }, + { + "pkg": "intel-gpu-tools", + "desc": "Utilitários de diagnóstico Intel GPU incluindo `intel_gpu_top`" + } + ] + }, + { + "group": "Virtualização", + "items": [ + { + "pkg": "libguestfs-tools", + "desc": "Inspecionar e modificar imagens de disco VM (virt-ls, virt-cat, guestmount...)" + }, + { + "pkg": "chntpw", + "desc": "Editar Windows SAM — útil para recuperação de senha em Windows VMs você herda" + } + ] + } + ], + "actionTitle": "Alguns deles em acção", + "noBulkTitle": "Apenas os utilitários instalados pelo ProxMenux são removidos", + "noBulkBody": "ProxMenux registra apenas os pacotes utilitários selecionados que ainda não estavam instalados antes desta ação. Desinstalar Otimizações pode purgar esses pacotes mais tarde, enquanto utilitários que já estavam presentes no host são deixados intocados. A atualização geral do sistema APT não é intencionalmente rastreada como reversível porque os pacotes atualizados não têm retorno atômico seguro." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Atualização do sistema Proxmox", + "href": "/docs/utils/system-update", + "tail": " — reexecuta o ciclo apt update + dist-upgrade a pedido." + }, + { + "label": "Instalador de utilitários de sistema", + "href": "/docs/utils/system-utils", + "tail": " — instalar (ou reinstalar) utilitários individualmente após a pós-instalação." + }, + { + "label": "Comandos de atualizações e pacotes", + "href": "/docs/help-info/update-commands", + "tail": " — Referência apt para a shell." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/customizable.json b/web/messages/pt/docs/post-install/customizable.json new file mode 100644 index 00000000..40afe220 --- /dev/null +++ b/web/messages/pt/docs/post-install/customizable.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Script pós-instalação personalizável | Documentação ProxMenux", + "description": "Escolha exatamente que otimizações aplicar a um host Proxmox VE com ProxMenux. 10 categorias, cerca de 35 ferramentas e uma interface com caixas de seleção. Inclui tudo do script Automatizado, mais opções de ativação explícita (IOMMU, Fastfetch, Figurine, Ceph, HA, correções AMD…).", + "ogTitle": "Script pós-instalação personalizável | Documentação ProxMenux", + "ogDescription": "10 categorias, cerca de 35 otimizações individuais. Escolha exatamente o que pretende num host Proxmox VE. As alterações reversíveis são registadas." + }, + "header": { + "title": "Script pós-instalação personalizável", + "description": "Escolha exatamente que otimizações aplicar a um host Proxmox VE. O ProxMenux agrupa cerca de 35 ferramentas em 10 categorias numa única janela com caixas de seleção. O mesmo motor de Automatizado, com controlo total sobre o que é aplicado.", + "section": "Pós-instalação · Personalizável" + }, + "intro": { + "title": "Quando escolher Personalizável", + "body": "Escolha esta opção se já souber os ajustes que quer ou não quer no host. Uma lista com caixas agrupadas por categoria permite selecionar, desmarcar e combinar otimizações. Pode voltar a aplicá-las mais tarde; as alterações reversíveis são registadas para Desinstalar otimizações. As atualizações de pacotes não são apresentadas como reversíveis." + }, + "compare": { + "heading": "Comparação com Automatizado", + "body": "Personalizável inclui todo o script Automatizado: as mesmas 14 otimizações de base e várias opções deliberadamente omitidas por Automatizado, úteis em hardware específico (correções AMD), alojamento específico (OVH RTM) ou cargas particulares (IOMMU/VFIO, repositório Ceph, alta disponibilidade, Fastfetch, Figurine, ajuste do ARC ZFS, pigz, instantâneos ZFS automáticos, limites de velocidade vzdump, Open vSwitch, TCP BBR…)." + }, + "categoriesSection": { + "heading": "As 10 categorias", + "body": "O script Personalizável agrupa as otimizações em 10 categorias numa única janela com caixas de seleção. Cada categoria tem a sua página de documentação: abra um cartão para consultar a justificação, os valores predefinidos e as verificações de cada opção." + }, + "categories": [ + { + "name": "Configurações básicas", + "description": "Limpa as fontes APT, executa a atualização oficial Proxmox e define o fuso horário, as definições regionais e utilitários comuns. A base de todas as outras categorias." + }, + { + "name": "Sistema", + "description": "Ajusta os registos e os limites do kernel para um host com muitas VMs e contentores. Abrange journald, logrotate, sysctl (memória, limites de ficheiros), comportamento em caso de kernel panic e reinícios rápidos." + }, + { + "name": "Virtualização", + "description": "Prepara o host para virtualização avançada. Instala o agente convidado adequado quando o próprio Proxmox corre numa VM suportada e ativa IOMMU/VFIO para passthrough PCI de GPUs, controladores e TPUs." + }, + { + "name": "Rede", + "description": "Proteja e ajuste a pilha de rede do host. Força o APT sobre IPv4, aplica proteção sysctl + TCP ajuste de buffer, oferece Open vSwitch, TCP BBR + TCP Fast Open e fixa nomes de interface persistentes por MAC." + }, + { + "name": "Armazenamento", + "description": "Configure os subsistemas comuns de armazenamento do Proxmox: ZFS Dimensionamento do ARC, ZFS auto-snapshot, ZFS Autotrim para SSD/NVMe pools, e vzdump limites de velocidade para evitar saturar o disco durante backups." + }, + { + "name": "Segurança", + "description": "Reduz a superfície de ataque exposta por predefinição. Desativa os serviços RPC portmapper/rpcbind de que o Proxmox não precisa mas que deixa à escuta." + }, + { + "name": "Personalização", + "description": "Altera a aparência e a experiência da shell do host: cores e aliases no bashrc, faixa MOTD e remoção do aviso de subscrição na interface web." + }, + { + "name": "Monitoramento", + "description": "Integra o host com OVH Real-Time Monitoring. Só instala RTM se o ProxMenux detetar um servidor OVH; nos outros hosts não faz alterações." + }, + { + "name": "Desempenho", + "description": "Acelerar as operações de compressão (backups, transferências) substituindo o gzip por seu equivalente paralelo pigz." + }, + { + "name": "Opcional", + "description": "Opções especializadas de que nem todos os hosts precisam: correções CPU AMD, faixa Fastfetch, nome 3D com Figurine, atualização do índice PVE Appliance Manager, repositório Ceph, serviços de alta disponibilidade, Log2RAM para reduzir o desgaste dos SSD e perfil swap ZRAM." + } + ], + "mixTip": { + "title": "Misturar automatizado e personalizável", + "body": "Um uso comum: execute primeiro Automatizado para estabelecer uma base sensata, abra depois Personalizável e escolha apenas as opções úteis, como IOMMU para passthrough de GPU. As alterações são registadas separadamente; Desinstalar mostra tudo o que foi aplicado, independentemente da opção usada." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Pós-instalação automatizada", + "href": "/docs/post-install/automated", + "tail": " — valores predefinidos sensatos aplicados sem perguntas." + }, + { + "label": "Desinstalar otimizações", + "href": "/docs/post-install/uninstall", + "tail": " — reverter de forma limpa as opções selecionadas." + }, + { + "label": "Configurações básicas", + "href": "/docs/post-install/basic-settings", + "tail": " — repositórios, hora, idioma e utilitários." + }, + { + "label": "Virtualização", + "href": "/docs/post-install/virtualization", + "tail": " — IOMMU + VFIO para passagem." + }, + { + "label": "Segurança", + "href": "/docs/post-install/security", + "tailRich": " · Armazenamento · Rede · Personalização — outras categorias." + }, + { + "label": "Visão geral pós-instalação", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/customization.json b/web/messages/pt/docs/post-install/customization.json new file mode 100644 index 00000000..b1e35ee1 --- /dev/null +++ b/web/messages/pt/docs/post-install/customization.json @@ -0,0 +1,74 @@ +{ + "meta": { + "title": "Pós-instalação: Personalização | Documentação ProxMenux", + "description": "Opções de personalização no script pós-instalação personalizável do ProxMenux: prompt bash colorido com aliases úteis, faixa ProxMenux no MOTD e remoção do aviso de subscrição da interface web Proxmox." + }, + "header": { + "title": "Após a instalação: personalização", + "description": "Ajustes visuais e de utilização do host Proxmox. Melhoram a shell e ocultam o aviso de subscrição na interface web. Bashrc, MOTD e a faixa de subscrição são registados e reversíveis pelo menu Desinstalar.", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que esta categoria abrange", + "body": "Três opções pequenas e independentes: um prompt bash colorido com aliases para a shell root, uma faixa MOTD de uma linha no acesso SSH e remoção da janela «Sem subscrição válida» apresentada a cada acesso à interface web Proxmox." + }, + "bashrc": { + "heading": "Personalizar bashrc", + "intro": "Insere em /root/.bashrc um bloco com prompt colorido, histórico com data e hora, aliases comuns de ls / grep e um source para o preenchimento automático bash. Torna o trabalho por SSH mais agradável e identifica claramente o host quando tem muitos separadores abertos.", + "writesTitle": "O que o ProxMenux adiciona ao .bashrc", + "writesOutro": "O bloco é delimitado pelos marcadores PMX_CORE_BASHRC. Voltar a executar o script substitui o bloco anterior sem o duplicar. O .bashrc original é guardado uma vez em /root/.bashrc.bak e acrescenta-se a linha source /root/.bashrc a /root/.bash_profile para aplicar o prompt também nas shells de login, por exemplo após su -.", + "rootTitle": "Aplica-se apenas ao root", + "rootBody": "A personalização visa o shell da conta root. Outros usuários que você cria no host mantêm seus próprios padrões. Se você administrar o Proxmox exclusivamente na interface web e nunca usar o shell, esta opção é estética pura e você pode pular." + }, + "motd": { + "heading": "configurar banner MOTD personalizado", + "intro": "Acrescenta \"This system is optimised by: ProxMenux\" ao início de /etc/motd, a mensagem após um acesso SSH bem-sucedido, acima do prompt e antes dos scripts update-motd. Inofensivo e apenas informativo: confirma visualmente que o ProxMenux foi aplicado no host.", + "writesTitle": "O que o ProxMenux escreve", + "writesOutro": "Em primeiro lugar, ProxMenux registra se /etc/motd existia e armazena seu conteúdo original sob /usr/local/share/proxmenux. A operação é idempotente: se a linha do marcador já está presente, nada é adicionado. Instalações antigas com /etc/motd.bak existentes são migradas para o mesmo estado reversível." + }, + "banner": { + "heading": "Remover banner de assinatura", + "intro": "Remove o \"Você não tem uma assinatura válida para este servidor\" modal que aparece toda vez que alguém entra na interface web do Proxmox sem uma assinatura corporativa. O patch tem conhecimento de versão: diferentes versões principais do Proxmox têm diferentes pacotes de UI, então o ProxMenux envia para o script certo.", + "versionTitle": "Escolha do script conforme a versão", + "versionItems": [ + "PVE 9.x → executa remove-banner-pve-v3.sh, que altera proxmoxlib.js para desktop e a nova interface móvel baseada em Yew.", + "PVE 8.x → executa remove-banner-pve8.sh (somente desktop)." + ], + "versionOutro": "Antes do patch, o ProxMenux faz backup dos arquivos originais JS/template para /usr/local/share/proxmenux/backups/ com um timestamp. O fluxo de desinstalação usa esses backups para restaurar os arquivos originais, e cai de volta para reinstalar os pacotes de UI Proxmox se o backup estiver faltando ou corrompido.", + "breakTitle": "Pode quebrar após as atualizações do Proxmox", + "breakBody": "As atualizações da interface Proxmox substituem regularmente proxmoxlib.js e podem fazer regressar o aviso. Pode voltar a aplicar a opção para alterar o ficheiro ou aceitar o aviso até lá. O ProxMenux também instala um hook APT que reaplica a alteração após atualizações de pacotes; consulte Desinstalar otimizações para o remover.", + "legalTitle": "Nota legal (sempre vale a pena repetir)", + "legalBody": "Esta opção só oculta o aviso da interface. Não dá suporte Enterprise nem acesso ao repositório Enterprise e não altera a licença do software. O Proxmox VE é distribuído sob GNU AGPLv3. Uma subscrição apoia o projeto e dá acesso ao canal de atualizações Enterprise; escolha o suporte adequado ao seu ambiente." + }, + "verify": { + "heading": "Verificação", + "intro": "Após a aplicação dos três:", + "reversibleTitle": "Todas as três alterações de personalização são monitoradas", + "reversibleBody": "Desinstalar otimizações repõe /root/.bashrc, devolve ao MOTD o conteúdo exato anterior ao ProxMenux ou remove o ficheiro se antes não existia e restaura os ficheiros de interface alterados a partir das cópias ou reinstala os pacotes necessários." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Opcional", + "href": "/docs/post-install/optional", + "tail": " — Fastfetch e Figurine (outras personalizações visuais)." + }, + { + "label": "Mostrar informações da versão", + "href": "/docs/settings/show-version-information", + "tail": " — confirma que as personalizações são seguidas como instaladas." + }, + { + "label": "Desinstalar otimizações", + "href": "/docs/post-install/uninstall", + "tail": " — reverter bashrc, motd e o aviso de subscrição." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/index.json b/web/messages/pt/docs/post-install/index.json new file mode 100644 index 00000000..40f74230 --- /dev/null +++ b/web/messages/pt/docs/post-install/index.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Script pós-instalação Proxmox VE — Automatizado e personalizável | ProxMenux", + "description": "Visão geral dos scripts pós-instalação ProxMenux para Proxmox VE. Automatizado aplica valores predefinidos sensatos sem perguntas; Personalizável permite escolher exatamente o que pretende em 10 categorias; Desinstalar otimizações repõe as alterações reversíveis suportadas.", + "ogTitle": "Script pós-instalação Proxmox VE — Automatizado e personalizável", + "ogDescription": "Aplique otimizações comuns após a instalação do Proxmox VE em 10 categorias, automaticamente ou à escolha, com opções reversíveis.", + "twitterTitle": "Script pós-instalação Proxmox VE | ProxMenux", + "twitterDescription": "Otimizações pós-instalação automatizadas e personalizáveis para Proxmox VE — com opções reversíveis." + }, + "header": { + "title": "Scripts pós-instalação", + "description": "Configure um host Proxmox VE recém-instalado com as otimizações pós-instalação do ProxMenux. Aplique automaticamente a configuração de base, escolha opções individuais, atualize funções instaladas ou reponha as alterações reversíveis suportadas. As atualizações de pacotes não são apresentadas como reversíveis.", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "Para que serve este menu", + "body": "Após instalar o Proxmox VE, dezenas de pequenas alterações tornam o host mais rápido e fácil de manter: repositórios sem subscrição, limites sensatos para journald, buffers TCP adequados, armazenamento de registos que protege os SSD, melhorias no bashrc e mais. O ProxMenux automatiza-as e acompanha as alterações de configuração reversíveis suportadas." + }, + "openingMenu": { + "heading": "Abrir o menu", + "body": "No menu principal do ProxMenux, selecione Configurações pós-instalação Proxmox. Você verá isto:", + "imageAlt": "Menu de Scripts pós-instalação — Automatizado, Personalizável, o condicional Aplicar Atualizações Disponíveis (somente quando as atualizações estão pendentes) e Desinstalar, seguido da seção de scripts comunitários" + }, + "threeWays": { + "heading": "Quatro maneiras de aplicar otimizações", + "body": "As quatro entradas ProxMenux compartilham o mesmo código subjacente e o mesmo registro de ferramentas instaladas — elas apenas lhe dão diferentes níveis de controle. A entrada Aplicar atualizações disponíveis só mostra quando pelo menos uma otimização instalada tem uma versão mais recente no disco do que o registrado; em um host recém-aplicado ele permanece oculto." + }, + "routes": [ + { + "title": "Automatizado", + "description": "Um conjunto curado de 14 otimizações seguras e sempre úteis aplicadas em sequência com zero prompts. Bom padrão para a maioria dos usuários.", + "bullets": [ + "Repositórios sem subscrição + atualização do sistema", + "Memória, kernel, ajuste de rede", + "Log2RAM (detectado automaticamente em SSD/NVMe)", + "Limites de tamanho para journald + logrotate", + "Nomes de interface persistentes" + ] + }, + { + "title": "Personalizável", + "description": "Cerca de 35 otimizações individuais em 10 categorias. Escolhe exatamente quais aplicar. O mesmo motor de Automatizado, com controlo total.", + "bullets": [ + "Interface com caixas de seleção por categoria", + "Inclui tudo o que Automatizado faz, mais opções de ativação explícita (IOMMU, Fastfetch, Figurine, Ceph, HA, correções AMD…)", + "Executar quantas vezes quiser — as alterações são idempotentes" + ] + }, + { + "title": "Aplicar atualizações disponíveis", + "description": "Quando uma otimização pós-instalação (Log2Ram, definições de memória, Logrotate…) tem uma versão no disco mais recente do que a registada no host, esta entrada mostra apenas as que mudaram. Volta a executar a função correspondente e atualiza o registo, sem tocar em mais nada.", + "bullets": [ + "Aceitação por otimização, apenas as que mudaram", + "O mesmo seletor disponível no painel do Monitor", + "Uma única notificação agrupada quando chegam novas atualizações" + ] + }, + { + "title": "Desinstalar otimizações", + "description": "Alterações reversíveis suportadas são monitoradas em um registro JSON e emparelhadas com uma função de restauração. Ações sem um retorno seguro, como uma atualização completa do pacote, são intencionalmente excluídas.", + "bullets": [ + "Detecta otimizações aplicadas anteriormente automaticamente", + "Escolhe a reversão adequada a cada item: repõe a cópia .bak, se existir, elimina o fragmento de configuração sysctl.d se nada precisava de cópia ou reinstala o pacote original com --force-confnew (por exemplo para o aviso de subscrição)", + "Pedido de reinício se necessário (VFIO, nomes persistentes, etc.)" + ] + } + ], + "whichTitle": "Qual deve escolher?", + "whichBody": "Para uma instalação nova do Proxmox com uma base sensata sem decisões: Automatizado. Se já souber os ajustes que quer ou não quer: Personalizável. Para atualizar apenas uma otimização já aplicada com versão mais recente no disco: Aplicar atualizações disponíveis. Para anular alterações anteriores de forma limpa: Desinstalar otimizações. Pode combiná-los: comece por Automatizado, adicione opções como Fastfetch ou IOMMU com Personalizável e reverta itens individuais mais tarde.", + "mixing": { + "heading": "Combinar com outros scripts pós-instalação", + "stackTitle": "Não empilhar vários scripts pós-instalação", + "stackBody": "Executar vários scripts pós-instalação no mesmo host pode causar arquivos de configuração duplicados, entradas de sysctl conflitantes, ou pior — rede quebrada após reinicialização. Se você já aplicou o Helper-Scripts Post Install, algumas otimizações ProxMenux podem se sobrepor ao que ele já configurou. Atenha-se a uma ferramenta pós-instalação por máquina.", + "xshokTitle": "xshok-proxmox: desactualizado", + "xshokBody": "As versões anteriores do ProxMenux indicavam xshok-proxmox como ferramenta pós-instalação complementar. O projeto está obsoleto e já não é oferecido no ProxMenux. Se uma execução antiga tiver deixado marcadores no host, o ProxMenux continua a detetá-los e avisa. Hoje não é uma ferramenta que deva instalar em conjunto com o ProxMenux." + }, + "community": { + "heading": "Scripts da comunidade", + "body": "O menu também oferece dois scripts de terceiros do projeto community-scripts: Proxmox VE Post Install e Proxmox VE Microcode. São invólucros que transferem e executam os scripts originais através de wget | bash. Não são mantidos pelo ProxMenux. Consulte Repositórios externos para detalhes e questões de confiança antes de os executar." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Atualização do sistema Proxmox", + "href": "/docs/utils/system-update", + "tail": " — mantém o host atualizado depois de instalado." + }, + { + "label": "Segurança", + "href": "/docs/security", + "tail": " — Fail2Ban + Lynis além do reforço de segurança pós-instalação." + }, + { + "label": "Mostrar informações da versão", + "href": "/docs/settings/show-version-information", + "tail": " — ver que componentes pós-instalação são rastreados como instalados." + }, + { + "label": "Comandos de atualizações e pacotes", + "href": "/docs/help-info/update-commands", + "tail": " — referência para o apt/pveupgrade." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/monitoring.json b/web/messages/pt/docs/post-install/monitoring.json new file mode 100644 index 00000000..7340c06f --- /dev/null +++ b/web/messages/pt/docs/post-install/monitoring.json @@ -0,0 +1,56 @@ +{ + "meta": { + "title": "Pós-instalação: Monitorização | Documentação ProxMenux", + "description": "Opções de monitoramento no script de pós-instalação personalizável ProxMenux. Atualmente uma única opção: instalar OVH Real-Time Monitoring (RTM), que só se ativa se o host for detectado como um servidor OVH." + }, + "header": { + "title": "Após a instalação: monitorização", + "description": "Opções de monitoramento dentro do script pós-instalação personalizável. Esta categoria é pequena e específica do provedor — instala o agente OVH Real-Time Monitoring em servidores OVH dedicados e não faz nada em nenhum outro lugar.", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "Âmbito intencionalmente limitado", + "body": "A monitorização pós-instalação limita-se a um agente específico de um fornecedor. Ferramentas gerais (Prometheus, Grafana, node_exporter) ficam fora deste âmbito, pois exigem decisões de arquitetura — host separado, retenção de dados e destinos de alertas — que não cabem num passo com um clique. O ProxMenux Monitor, incluído no ProxMenux, cobre grande parte dessa função sem agentes externos." + }, + "ovh": { + "heading": "Instalar o Monitoramento em Tempo Real OVH (RTM)", + "intro": "Se o host Proxmox for um servidor dedicado alugado à OVHcloud, pode ativar o RTM para apresentar telemetria de hardware (temperatura da CPU, estado da fonte de alimentação, SMART dos discos, estado do controlador RAID, etc.) no painel de controlo OVH. É o mesmo agente usado pela OVH na função «Server Monitoring».", + "decisionsTitle": "Como ProxMenux decide", + "decisionsItems": [ + "Obtém o IP público do host via curl ipinfo.io/ip.", + "Procura o ISP proprietário com uma consulta whois para v4.whois.cymru.com.", + "Se o resultado mencionar OVH, transfere last-public-ovh-infra-yak.snap.mirrors.ovh.net/yak/archives/apply.sh e passa-o para bash com o manifesto Puppet do RTM v2.", + "Se o resultado não mencionar OVH, nada é instalado. A opção não faz alterações." + ], + "remoteTitle": "Script remoto passado para bash através de um pipe", + "remoteBody": "A instalação executa wget -qO - https://…apply.sh | bash. Se o espelho OVH for comprometido, o script corre como root no host. Antes de ativar a opção, pondere a confiança na cadeia de espelhos OVH face ao benefício da monitorização. Para a maioria dos utilizadores domésticos ou fora da OVH, a opção deve ficar desativada.", + "noOpTitle": "Só activar se a máquina estiver em OVH", + "noOpBody": "A opção não altera servidores fora da OVH, pelo que selecioná-la num Proxmox doméstico não causa problemas. Num host não OVH, o script mostra «Não é um servidor OVH, a instalação RTM será ignorada» e termina sem instalar pacotes.", + "runsTitle": "O que o ProxMenux executa", + "verifyTitle": "Verificação", + "verifyBody": "Em um host OVH real, após uma reinicialização você deve ver o painel RTM em seu OVH Manager povoado com dados ao vivo para o host. No lado Proxmox, o coletor RTM é um serviço systemd — verifique-o diretamente:", + "troubleTitle": "Resolução de Problemas", + "revertTitle": "Remover RTM pelo menu Desinstalar", + "revertBody": "Quando RTM está registado como instalado, Desinstalar otimizações oferece uma entrada OVH Real-Time Monitoring. Executa apt-get purge -y ''ovh-rtm*'' ''rtm'' ''rtm-*'', remove /etc/rtm e marca RTM como desinstalado. Os artefactos Puppet podem precisar de limpeza manual; reveja os manifestos específicos do RTM em /etc/puppet/. Num host fora da OVH não foram instalados pacotes RTM, pelo que nada há a remover." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — painel web local para o host (funciona em qualquer fornecedor, não apenas OVH)." + }, + { + "label": "Comandos úteis do sistema", + "href": "/docs/help-info/system-commands", + "tail": " — referência de monitorização do host local." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/network.json b/web/messages/pt/docs/post-install/network.json new file mode 100644 index 00000000..96a052e0 --- /dev/null +++ b/web/messages/pt/docs/post-install/network.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Pós-instalação: Rede | Documentação ProxMenux", + "description": "Opções de rede do script de pós-instalação personalizável ProxMenux: forçar APT por IPv4, aplicar um perfil sysctl selecionado, instalar Open vSwitch, ativar TCP BBR + Fast Open e associar os nomes das interfaces aos seus endereços MAC." + }, + "header": { + "title": "Pós-instalação: Rede", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que esta categoria abrange", + "body": "Cinco opções de rede independentes. Duas são simples (APT por IPv4, instalação do Open vSwitch), duas ajustam o comportamento TCP (perfil sysctl de rede, BBR + Fast Open) e uma resolve um problema comum: fixar os nomes das interfaces para que uma nova placa de rede ou atualização do BIOS não mude enp3s0 para enp4s0 e interrompa as pontes." + }, + "ipv4": { + "heading": "Forçar o APT a usar IPv4", + "intro": "Escreve Acquire::ForceIPv4 \"true\"; para /etc/apt/apt.conf.d/99-force-ipv4. APT então se recusa a usar IPv6 para downloads de pacotes, mesmo que o host tenha conectividade IPv6.", + "tipTitle": "Quem beneficia", + "tipBody": "Útil se a ligação IPv6 for instável, mais lenta que IPv4 ou se o espelho Debian/Proxmox falhar ocasionalmente por IPv6. Não causa problemas em hosts sem IPv6. Numa rede de pilha dupla funcional, torna o comportamento previsível: apt não o surpreende com um tempo limite de IPv6." + }, + "sysctl": { + "heading": "Aplicar otimizações de rede", + "intro": "Escreve um perfil sysctl selecionado em /etc/sysctl.d/99-network.conf: buffers de sockets do kernel, reforço do ICMP, proteção básica contra falsificação de endereços e tamanhos de buffers TCP adequados a um hipervisor com muitos fluxos simultâneos.", + "tunedTitle": "O que é ajustado", + "headerArea": "Área", + "headerSettings": "Principais definições", + "rows": [ + { + "area": "Buffers de sockets do kernel", + "settings": "netdev_max_backlog=8192, rmem_max=16M, wmem_max=16M, somaxconn=8192" + }, + { + "area": "Endurecimento do ICMP", + "settings": "icmp_echo_ignore_broadcasts=1, icmp_ignore_bogus_error_responses=1" + }, + { + "area": "Segurança de roteamento", + "settings": "accept_redirects=0, accept_source_route=0, secure_redirects=0, send_redirects=0, log_martians=0" + }, + { + "area": "Filtro de caminho inverso", + "settings": "rp_filter=2 (modo solto, ver nota abaixo)" + }, + { + "area": "TCP", + "settings": "tcp_mtu_probing=1, tcp_rfc1337=1, tcp_sack=1, tcp_rmem=8K/87K/16M, tcp_wmem=8K/64K/16M" + }, + { + "area": "Portas", + "settings": "ip_local_port_range=1024 65535 (conjunto de portas efémeras)" + }, + { + "area": "Soquetes Unix", + "settings": "net.unix.max_dgram_qlen=4096" + } + ], + "sourceOutro": "Ele também adiciona source /etc/network/interfaces.d/* ao /etc/network/interfaces se ainda não estiver presente — prática padrão para que você possa soltar trechos de interface modular sem editar o arquivo principal.", + "fwbrTitle": "Ajuste automático de pontes de firewall virtuais", + "fwbrBody": "Além do perfil sysctl, o ProxMenux instala o script auxiliar /usr/local/sbin/proxmenux-fwbr-tune, que aplica rp_filter=0 e log_martians=0 às interfaces fwbr* / fwln* / fwpr* / tap* criadas pelo Proxmox para VMs e contentores. A unidade de execução única proxmenux-fwbr-tune.service chama-o no arranque, e a regra /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules a cada evento net add com esses prefixos. Abrange assim interfaces recriadas ao iniciar/parar VMs, reiniciar e migrar em funcionamento. O script também processa as interfaces já presentes imediatamente após a instalação.", + "rpFilterTitle": "Porquê rp_filter=2 (permissivo) em vez de 1 (estrito)", + "rpFilterBody": "A filtragem estrita do caminho inverso descarta pacotes cuja origem seria alcançada por uma interface diferente. É uma predefinição adequada a clientes, mas problemática num host Proxmox onde o tráfego das VMs chega frequentemente por uma ponte e sai por um uplink com rotas assimétricas. rp_filter=2 (permissivo) só descarta pacotes com origens realmente inalcançáveis pelo encaminhamento. É um compromisso: reduz ligeiramente a deteção de falsificação de IP local para preservar a rede das VMs." + }, + "ovs": { + "heading": "Instalar Open vSwitch", + "intro": "Instala openvswitch-switch + openvswitch-common. Os pacotes acrescentam OVS como alternativa às pontes Linux predefinidas do Proxmox. A instalação por si só não altera a rede: as pontes vmbrX existentes continuam a funcionar. Ao criar uma nova ponte na interface Proxmox, pode escolher OVS na lista de tipos.", + "tipTitle": "Quando a OVS faz sentido", + "tipBody": "Considere OVS se precisar de trunks VLAN com IDs não contíguos, LACP com LLDP em modos específicos, programação detalhada de fluxos (OpenFlow) ou interoperabilidade com controladores SDN. Num laboratório doméstico com poucas VLANs e um único uplink LACP, pontes Linux + vmbrX.VID são mais simples e adequadas.", + "revertTitle": "Reversível do menu Desinstalar", + "revertBody": "OVS fica registado. Desinstalar otimizações executa apt purge em openvswitch-switch e openvswitch-common. Migre as pontes OVS para pontes Linux antes de desinstalar; caso contrário, as VMs nessas pontes perderão a rede no próximo arranque. Equivalente manual:" + }, + "bbr": { + "heading": "Ativar TCP BBR + TCP Fast Open", + "intro": "Escreve dois ficheiros sysctl e recarrega-os. BBR substitui CUBIC pelo algoritmo de congestionamento da Google baseado em largura de banda, que lida melhor com ligações de alta capacidade e latência ou com perdas. TCP Fast Open (TFO) elimina uma ida e volta nas ligações TCP repetidas enviando dados no SYN.", + "verifyTitle": "Verificação", + "impactTitle": "O impacto depende da carga de trabalho", + "impactBody": "BBR destaca-se em ligações de alta latência ou com perdas (replicação intercontinental, túneis VPN, clientes móveis). Numa LAN entre duas máquinas no mesmo switch, a diferença costuma ficar nas variações de medição. TFO ajuda sobretudo em ligações HTTP curtas e repetidas.", + "revertTitle": "Reversível do menu Desinstalar", + "revertBody": "BBR/TFO ficam registados. Desinstalar otimizações remove os dois ficheiros sysctl (/etc/sysctl.d/99-kernel-bbr.conf e 99-tcp-fastopen.conf) e recarrega a configuração restante. Eliminar um ficheiro não repõe os valores ativos do kernel. As predefinições como cubic e tcp_fastopen=1 regressam após reiniciar, salvo se outra configuração as substituir. Equivalente manual:" + }, + "names": { + "heading": "Nomes de interfaces persistentes", + "intro": "Percorre as placas de rede físicas do host, excluindo loopback, veths Docker, pontes, dispositivos TAP, bonds, Cilium, ZeroTier e WireGuard. Escreve um ficheiro systemd .link que associa o nome atual ao endereço MAC atual. A associação MAC passa a prevalecer sobre a lógica de nomes do kernel.", + "whyTitle": "Por que isso importa?", + "whyItems": [ + "Adicionar ou remover dispositivos PCIe pode mudar a numeração do barramento, transformando enp3s0 em enp4s0. Se /etc/network/interfaces mencionar o nome antigo, a ponte desaparece ao reiniciar.", + "As atualizações de BIOS / firmware às vezes alteram como os dispositivos enumeram, com o mesmo efeito.", + "O script fixa os nomes das placas físicas, incluindo portas físicas usadas por bonds. Ignora interfaces virtuais, como veths LXC e os próprios dispositivos bond; não corrige condições de corrida nos nomes de placas virtuais hotplug." + ], + "writtenTitle": "O que é escrito", + "writtenIntro": "Um ficheiro por NIC físico, em /etc/systemd/network/10-proxmenux-<iface>.link. Cada arquivo começa com o cabeçalho # Managed by ProxMenux — do not edit para que ProxMenux possa distinguir seus próprios arquivos de arquivos .link fornecidos pelo usuário ou pacote.", + "writtenOutro": "Os ficheiros .link de outros pacotes ou escritos pelo utilizador são preservados; só os que têm o cabeçalho ProxMenux são geridos. Em cada nova execução, a função verifica os seus ficheiros: relê MACAddress= de cada 10-proxmenux-*.link e remove os que têm uma MAC ausente de /sys/class/net/. Os ficheiros de versões anteriores no formato 10-<iface>.link são migrados automaticamente na primeira execução.", + "pveTitle": "PVE 9 vs PVE 8", + "pveBody": "O script usa ficheiros systemd .link para os nomes persistentes. No Proxmox VE 9 também recarrega as regras udev após os escrever, para que novas placas possam usá-las sem reiniciar. Verifique as interfaces existentes após reiniciar tanto no PVE 8 como no PVE 9. Isto não substitui ifupdown2 no host. Em ambos os casos, o script assinala a necessidade de reinício na pós-instalação personalizável.", + "reviewTitle": "Reveja primeiro o /etc/network/interfaces existente", + "reviewBody": "Se a configuração antiga em /etc/network/interfaces usa nomes de placas gerados pelo kernel, fixar os nomes atuais é o resultado pretendido. Se já adaptou manualmente a configuração a nomes específicos, confirme antes de reiniciar que os nomes fixados correspondem ao ficheiro interfaces.", + "revertTitle": "Reversível do menu Desinstalar", + "revertBody": "Desinstalar otimizações elimina apenas os ficheiros 10-proxmenux-*.link com cabeçalho ProxMenux de /etc/systemd/network/. Preserva todos os ficheiros .link do utilizador ou de outros pacotes. No próximo reinício regressa o comportamento de nomes predefinido do systemd." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Gerenciamento de rede", + "href": "/docs/network", + "tail": " — diagnóstico, análise da ponte, reparação guiada." + }, + { + "label": "Nomes de interface persistentes", + "href": "/docs/network/persistent-names", + "tail": " — a mesma função num menu próprio para mais tarde; use uma das opções, não ambas." + }, + { + "label": "Referência de comandos de rede", + "href": "/docs/help-info/network-commands", + "tail": " — ip, ss, ethtool, sysctl." + }, + { + "label": "Desinstalar otimizações", + "href": "/docs/post-install/uninstall", + "tail": " — reverte qualquer uma destas alterações de rede." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/optional.json b/web/messages/pt/docs/post-install/optional.json new file mode 100644 index 00000000..923883d7 --- /dev/null +++ b/web/messages/pt/docs/post-install/optional.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "Pós-instalação ProxMenux: Configurações opcionais", + "description": "Guia de configurações opcionais no script pós-instalação ProxMenux para recursos e otimizações adicionais Proxmox VE.", + "ogTitle": "Pós-instalação ProxMenux: Configurações opcionais", + "ogDescription": "Guia de configurações opcionais no script pós-instalação ProxMenux para recursos e otimizações adicionais Proxmox VE.", + "ogImageAlt": "Configurações opcionais da pós-instalação ProxMenux" + }, + "title": "Configurações Opcionais", + "intro": "A categoria Configurações opcionais oferece funções e otimizações adicionais para Proxmox VE. Não são essenciais, mas podem melhorar as capacidades do sistema em situações específicas.", + "available": "Funções opcionais disponíveis", + "stepLabel": "Etapa", + "ceph": { + "title": "Adicionar suporte mais recente ao Ceph", + "intro": "Esta opção instala o mais recente suporte ao sistema de armazenamento Ceph para Proxmox VE. O Ceph é um sistema de armazenamento distribuído que oferece alto desempenho, confiabilidade e escalabilidade.", + "doesIntro": "O que faz:", + "doesItems": [ + "Adiciona o repositório Ceph ao seu sistema", + "Atualiza as listas de pacotes", + "Instala pacotes Ceph usando o comando 'pveceph install'", + "Verifica a instalação" + ], + "howUse": "Como usar: Após a instalação, você pode configurar e gerenciar o armazenamento Ceph usando a interface web Proxmox VE ou ferramentas de linha de comando.", + "automates": "Este ajuste automatiza os seguintes comandos:" + }, + "amd": { + "title": "Aplicar correções AMD CPU", + "intro": "Esta opção aplica correções específicas para CPUs AMD EPYC e Ryzen para melhorar a estabilidade e compatibilidade.", + "doesIntro": "O que faz:", + "doesItems": [ + "Detecta se está presente um AMD EPYC ou Ryzen CPU", + "Aplica o parâmetro 'idle=nomwait' para evitar falhas aleatórias (via /etc/kernel/cmdline em máquinas systemd-boot, ou /etc/default/grub em máquinas GRUB — com um .bak do original)", + "Configura o KVM para ignorar certos MSRs (registos específicos do modelo) e melhorar a compatibilidade com máquinas virtuais Windows." + ], + "howUse": "Como usar: Estas correções são aplicadas automaticamente e requerem uma reinicialização do sistema para fazer efeito.", + "automates": "Este ajuste automatiza os seguintes comandos:" + }, + "ha": { + "title": "Habilitar serviços de alta disponibilidade", + "intro": "Esta opção permite serviços de Alta Disponibilidade (HA) em Proxmox VE, permitindo failover automático de VMs e contêineres em caso de falha de nó.", + "doesIntro": "O que faz:", + "doesItems": [ + "Activa e inicia o serviço pve-ha-lrm (Local Resource Manager)", + "Activa e inicia o serviço pve-ha-crm (Cluster Resource Manager)", + "Activa e inicia o serviço corosync para comunicação de clusters" + ], + "howUse": "Como usar: Depois de ativar esses serviços, você pode configurar grupos e recursos HA na interface web Proxmox VE.", + "automates": "Este ajuste automatiza os seguintes comandos:" + }, + "pveam": { + "title": "Atualizar Proxmox VE Appliance Manager", + "intro": "Atualiza o índice local dos modelos de contentores apresentado pelo pveam no Proxmox, para que a lista de modelos de software esteja atualizada ao criar o próximo LXC.", + "doesIntro": "O que faz:", + "doesItems": [ + "Executa pveam update nos espelhos Proxmox para obter o catálogo atual de modelos de software", + "Preenche a lista de modelos de software apresentada ao criar um contentor" + ], + "howUse": "Utilização: execute se a lista de modelos na interface parecer desatualizada ou após mudar de espelho. Transfere apenas o índice do catálogo, não os próprios modelos.", + "automates": "Este ajuste automatiza o seguinte comando:" + }, + "fastfetch": { + "title": "Instalar e Configurar o Fastfetch", + "intro": "Esta opção instala silenciosamente e configura Fastfetch, uma ferramenta de informação do sistema que exibe especificações do sistema e um logotipo personalizado no login.", + "doesLabel": "O que faz:", + "doesItems": [ + "Silenciosamente baixa e instala a versão mais recente do Fastfetch", + "Permite-lhe escolher um logotipo personalizado (ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology, ou um personalizado)", + "Configura Fastfetch para exibir \"Sistema otimizado por ProxMenux\"", + "Configura o Fastfetch para executar automaticamente no login do console" + ], + "importantLabel": "Importante:", + "importantBody": "Se você se conectar ao Proxmox via SSH, você deve selecionar o logotipo Proxmox ou criar um personalizado usando jp2a ou img2txt. Os outros logotipos são gerados usando chafa e podem não exibir corretamente em uma sessão padrão SSH.", + "customLabel": "Logótipos personalizados:", + "customBody1": "Para usar um logotipo personalizado, coloque seu arquivo de texto de arte ASCII em: /usr/local/share/fastfetch/logos/", + "customBody2": "Você pode criar logotipos personalizados usando ferramentas como chafa, jp2a, ou img2txt.", + "customBody3": "Para melhores resultados:", + "customItems": [ + "Limite a altura do logótipo a 35 linhas para manter as proporções e caber no terminal", + "Use chafa para logotipos de cores (pode não exibir corretamente em sessões de SSH)", + "Use jp2a ou img2txt para logotipos compatíveis com SSH" + ], + "examplesLabel": "Logotipos de Exemplo:", + "logos": [ + { + "name": "ProxMenux", + "alt": "Logótipo do ProxMenux", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmenux.png" + }, + { + "name": "Proxmox", + "alt": "Logótipo do Proxmox", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmox.png" + }, + { + "name": "JC Channel", + "alt": "Logótipo do JC Channel", + "src": "/fastfetch/jc-channel.png" + }, + { + "name": "Helper-Scripts", + "alt": "Logótipo do Helper-Scripts", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/helper-scripts.png" + }, + { + "name": "Home-Labs-Club", + "alt": "Logótipo do Home-Labs-Club", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/home-labs-club.png" + }, + { + "name": "Proxmology", + "alt": "Logótipo Proxmology", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmology.png" + } + ], + "automates": "Este ajuste automatiza os seguintes comandos:" + }, + "figurine": { + "title": "Instalar e Configurar Figurine", + "intro": "Esta opção instala e configura o Figurine, uma ferramenta que cria banners de texto elegantes ASCII para o seu terminal, exibindo o seu nome de máquina em um formato 3D visualmente atraente.", + "doesLabel": "O que faz:", + "doesItems": [ + "Descarrega e instala o Figurine v2.1.1 a partir do GitHub para a arquitetura do host (AMD64, ARM64 ou ARMv7)", + "Cria uma mensagem de boas- vindas que mostra o seu nome de máquina na arte ASCII 3D quando você entra", + "Atualiza o binário existente do Figurine após concluir a transferência e a extração com sucesso", + "Configura a mensagem de boas- vindas a executar automaticamente na autenticação" + ], + "practicalLabel": "Uso prático:", + "practicalBody": "Ao gerenciar vários nós Proxmox em um cluster, o Figurine fornece uma indicação visual imediata de qual nó você está conectado atualmente. Isso ajuda a prevenir comandos acidentais no nó errado e melhora seu fluxo de trabalho ao gerenciar vários servidores.", + "exampleLabel": "Resultado do Exemplo:", + "imageAlt": "Saída de Exemplo Figurine", + "automates": "Este ajuste automatiza o seguinte processo:", + "outro": "Após a instalação, você verá seu hostname exibido na arte ASCII 3D cada vez que você entrar, deixando imediatamente claro em que nó Proxmox você está trabalhando." + }, + "log2ram": { + "title": "Instalar Log2RAM (redução do desgaste de SSD/NVMe)", + "intro": "Log2RAM monta /var/log num ramdisk tmpfs e sincroniza-o periodicamente para disco. Guardar temporariamente na RAM as escritas frequentes do journald pode reduzir desgaste SSD e E/S. A sincronização e o encerramento normal guardam os registos; um corte abrupto pode perder entradas desde a última sincronização.", + "upstreamLabel": "Projeto a montante:", + "upstreamUrl": "https://github.com/azlux/log2ram", + "upstreamLinkLabel": "azlux/log2ram em GitHub", + "doesLabel": "O que o ProxMenux faz:", + "doesItems": [ + "Detecta se o disco raiz é SSD/NVMe lendo /sys/block/<dev>/queue/rotational. Em um disco rotacional o fluxo automatizado pede primeiro antes de instalar.", + "Clona o repositório original (azlux/log2ram) para /tmp/log2ram e modifica install.sh, substituindo rsync -aAXv por rsync -aXv --no-acls. Evita o erro set_acl: Operation not supported com código de saída 23, gerado pelo script original ao mover /var/log em sistemas sem ACL. A unidade systemd log2ram é ativada após instalação.", + "Dimensiona o ramdisk pela RAM do host: ≤ 8 GB → 128M, ≤ 16 GB → 256M, > 16 GB → 512M. Escreve o valor em SIZE= de /etc/log2ram.conf.", + "Agenda uma sincronização periódica do disco via /etc/cron.d/log2ram: a cada 1h / 3h / 6h de acordo com o mesmo nível RAM.", + "Instala /usr/local/bin/log2ram-check.sh, executado a cada 10 minutos por /etc/cron.d/log2ram-auto-sync. Quando /var/log chega a 80% do ramdisk, limpa journals antigos. Aos 92%, executa primeiro logrotate -f /etc/logrotate.d/proxmox-backup-api se o ficheiro existir: os registos API PBS costumam ocupar mais espaço num host PBS. Depois trunca pveproxy access/error e pveam.log antes de sincronizar. log2ram write apenas copia tmpfs para disco, sem o reduzir. A proteção ajuda a evitar falhas PVE com No space left on device por crescimento descontrolado dos registos.", + "Deteta o serviço proxmox-backup-server no host. Se existir, cria /etc/logrotate.d/proxmox-backup-api (20 MB × 3 rotações) e /etc/cron.hourly/proxmox-backup-logrotate para limitar os registos API PBS, fonte habitual de crescimento, mesmo entre sincronizações Log2RAM. Sem PBS não altera nada.", + "Ajusta os limites systemd-journald (SystemMaxUse, RuntimeMaxUse) ao ramdisk para que uma rajada de registos não o encha.", + "Fica registado em installed_tools.json para poder ser revertido em Desinstalar otimizações." + ], + "howUseLabel": "Como utilizar:", + "howUseBody": "O percurso automatizado instala Log2RAM sem intervenção se detetar disco raiz SSD/NVMe. O personalizável pergunta tamanho, intervalo e ativação da proteção. A pergunta indica 90%, mas o script gerado usa os limiares de limpeza de 80% e intensiva de 92% descritos acima.", + "verifyLabel": "Verificar e gerenciar a partir da shell:", + "verifyCode": "# Service state and configured timers\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Current ramdisk usage — /var/log IS the tmpfs itself\ndf -h /var/log\n\n# Force a sync now (tmpfs → disk); does NOT shrink the tmpfs\nlog2ram write\n\n# Trigger the auto-sync guard on demand (vacuum + sync when usage is high)\n/usr/local/bin/log2ram-check.sh\n\n# Current config: SIZE, mail settings, path\ncat /etc/log2ram.conf\n\n# ProxMenux-specific cron jobs\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Recent Log2RAM activity\njournalctl -u log2ram -n 50 --no-pager" + }, + "zram": { + "title": "Habilitar perfil de troca ZRAM", + "intro": "Cria um dispositivo swap comprimido em RAM, /dev/zram0, com systemd-zram-generator. As páginas movidas pelo kernel para swap são comprimidas com zstd e mantidas em memória antes de usar swap em disco.", + "doesLabel": "O que faz:", + "doesItems": [ + "Instala systemd-zram-generator se estiver faltando, e registra se ProxMenux o instalou.", + "Escreve /etc/systemd/zram-generator.conf.d/90-proxmenux.conf: um dispositivo zram0 de um décimo da RAM do host, compressão zstd (zstd(level=9) com systemd-zram-generator 1.2.0 ou posterior) e prioridade swap 32767.", + "Com essa prioridade, o kernel preenche primeiro o ZRAM. Uma troca existente no disco mantém sua própria prioridade e leva as páginas que já não se encaixam no ZRAM.", + "Antes de mudar qualquer coisa, procura outra configuração ZRAM: uma troca zram ativa, uma linha zram em /etc/fstab, uma unidade systemd ou outro arquivo gerador. Se encontrar uma, a opção pára e deixa essa configuração como está.", + "Inicia o dev-zram0.swap e verifica se o dispositivo ativo corresponde ao perfil. Caso contrário, o estado anterior é restaurado.", + "Fica registado em installed_tools.json para poder ser revertido em Desinstalar otimizações." + ], + "howUseLabel": "Como utilizar:", + "howUseBody": "A opção só existe no percurso personalizável, não no automatizado. O dispositivo é recriado em cada arranque. Enquanto estiver ativo, o painel Memória do ProxMenux Monitor mostra capacidade, swap utilizado, algoritmo, relação de compressão e memória física ocupada.", + "verifyLabel": "Verificar a partir do shell:", + "verifyCode": "# Active swap devices and their priority\nswapon --show\n\n# ZRAM device: algorithm, size and compressed data\nzramctl\n\n# Profile written by ProxMenux\ncat /etc/systemd/zram-generator.conf.d/90-proxmenux.conf\n\n# State of the swap unit\nsystemctl status dev-zram0.swap" + }, + "autoApplication": { + "title": "Aplicação automática", + "body": "No percurso personalizável, selecione as funções conforme as necessidades. Log2RAM também integra o automatizado com deteção de hardware; ZRAM é exclusivo do personalizável. Consulte cada secção para confirmações e requisitos." + } +} diff --git a/web/messages/pt/docs/post-install/performance.json b/web/messages/pt/docs/post-install/performance.json new file mode 100644 index 00000000..40508128 --- /dev/null +++ b/web/messages/pt/docs/post-install/performance.json @@ -0,0 +1,61 @@ +{ + "meta": { + "title": "Pós-instalação: Desempenho | Documentação ProxMenux", + "description": "Opções de desempenho no script pós-instalação personalizável do ProxMenux. Substitui o gzip de uma só thread pelo pigz (gzip paralelo) para acelerar cópias de segurança e compressão em hosts com vários núcleos." + }, + "header": { + "title": "Após a instalação: desempenho", + "description": "Opções de desempenho do script pós-instalação Personalizável. Esta categoria contém uma só otimização: substituir gzip por pigz para que as cópias de segurança e a compressão usem todos os núcleos da CPU em vez de um.", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que esta categoria abrange", + "body": "A única opção de desempenho aqui redireciona o gzip para uma implementação paralela. Os outros ajustes de desempenho (memória, escalonamento de E/S, tamanho do ARC ZFS, limites do kernel) ficam nas respetivas categorias (Sistema, Armazenamento), pois afetam subsistemas diferentes." + }, + "pigz": { + "heading": "Use pigz para compactação gzip mais rápida", + "intro": "O gzip normal comprime usando um só núcleo da CPU. Nos hosts Proxmox modernos com 8, 16 ou 32 núcleos, isto limita muito as cópias VM/CT com vzdump, a rotação de registos e tudo o que passa pelo gzip. O pigz é um substituto paralelo diretamente compatível: produz o mesmo formato gzip, mas distribui o trabalho por todos os núcleos.", + "doesTitle": "O que o ProxMenux faz", + "doesIntro": "Cinco passos, todos idempotentes:", + "doesItems": [ + "Define pigz: 1 em /etc/vzdump.conf para que a ferramenta de backup do Proxmox use pigz nativamente.", + "Instala o pacote apt pigz se ainda não estiver presente.", + "Cria um script wrapper em /bin/pigzwrapper que encaminha todos os argumentos para /usr/bin/pigz.", + "Registra um desvio de dpkg para o binário gzip do sistema (/usr/bin/gzip em Proxmox VE 9, /bin/gzip em Proxmox VE 8): o binário real é mantido ao lado dele como gzip.distrib e o invólucro toma o seu lugar. A partir de agora, qualquer coisa que chama gzip — logrotate, tar czf, scripts, vzdump — usa pigz de forma transparente.", + "Verifica que o arquivo mantido como gzip.distrib é um gzip funcional antes da embalagem ser colocada no lugar, e reinstala o pacote gzip primeiro quando não estiver. Uma máquina que ainda tenha o swap /bin/gzip.original anterior é movida para o desvio quando a opção é aplicada novamente." + ], + "replacesTitle": "Substitui um binário do sistema", + "replacesBody": "Colocar um wrapper no lugar do gzip é invulgar. É seguro porque produz saída compatível com gzip, mas scripts com caminhos fixos, executados em chroots restritivos ou que verificam hashes dos binários podem comportar-se de forma diferente. O binário original fica em gzip.distrib. Graças ao desvio dpkg, uma atualização do pacote gzip ou a passagem do Proxmox VE 8 para 9 atualiza esse ficheiro e mantém o wrapper.", + "revertTitle": "Reversível do menu Desinstalar", + "revertBody": "Esta otimização é registada. Desinstalar otimizações copia o binário original de gzip.distrib para o lugar do wrapper, remove o desvio e pigzwrapper, comenta a linha pigz em /etc/vzdump.conf e executa apt purge pigz após confirmar que o gzip funciona. Equivalente manual no Proxmox VE 9:", + "verifyTitle": "Verificação", + "verifyBody": "Após a aplicação, gzip --version deve mencionar pigz. Um benchmark rápido também mostra a diferença de velocidade em um host multi-core:", + "whenTitle": "Quando isto é mais importante", + "whenBody": "O benefício aumenta com o número de núcleos do host e a frequência das cópias de segurança. Num servidor doméstico de 2 núcleos com um vzdump diário, o ganho é marginal. Num host de produção com 16 núcleos que guarda uma dúzia de VMs todas as noites, o pigz pode reduzir a janela de cópia a uma fração do tempo do gzip de uma thread." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Comandos de backup e restauração", + "href": "/docs/help-info/backup-commands", + "tailRich": " — vzdump CLI, incluindo a opção de threads --pigz." + }, + { + "label": "Armazenamento", + "href": "/docs/post-install/storage", + "tail": " — limites de velocidade vzdump e afinação ZFS ARC." + }, + { + "label": "Sistema", + "href": "/docs/post-install/system", + "tail": " — ajuste de descritores de ficheiros e memória." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/security.json b/web/messages/pt/docs/post-install/security.json new file mode 100644 index 00000000..7431de82 --- /dev/null +++ b/web/messages/pt/docs/post-install/security.json @@ -0,0 +1,57 @@ +{ + "meta": { + "title": "Pós-instalação: Segurança | Documentação ProxMenux", + "description": "Opções de segurança disponíveis no script pós-instalação personalizável ProxMenux. Atualmente uma única opção: desabilitar o serviço portmapper/rpcbind para reduzir a superfície de ataque do host." + }, + "header": { + "title": "Pós-instalação: Segurança", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que esta categoria abrange", + "body": "A segurança pós-instalação limita-se ao reforço do host que pode ser aplicado em segurança sem supervisão: desativar serviços raramente necessários, com reversão pelo menu Desinstalar. As ferramentas ativas (Fail2Ban para prevenção de intrusões e Lynis para auditoria) ficam em Segurança no menu principal do ProxMenux, fora da pós-instalação." + }, + "rpcbind": { + "heading": "Desactivar o portmapper / rpcbind", + "intro": "rpcbind (anteriormente portmap) é um serviço que mapeia números de programas RPC para portas de rede. É uma dependência para NFS e algumas ferramentas baseadas em RPC. Em um host típico do Proxmox que não está atuando como um servidor NFS, o nada o usa — e deixando-o habilitado mantém a porta 111/tcp ouvindo em cada interface.", + "whyTitle": "Porque vale a pena desactivar", + "whyItems": [ + "Reduz a superfície do ataque do hospedeiro — um serviço de escuta a menos para se preocupar.", + "Historicamente abusado como vetor de reflexão/amplificação em ataques de DDoS. Desativar o rpcbind remove esse fator de amplificação para o seu host.", + "Remove o ruído que gera em logs e saída netstat / ss, tornando a atividade real mais fácil de detectar." + ], + "nfsTitle": "Não desactivar isto se usar o NFS", + "nfsBody": "O servidor NFS e o cliente NFS dependem do rpcbind para negociar as portas usadas por mountd, statd, lockd, etc. Se o host Proxmox exportar partilhas NFS para outras máquinas ou montar partilhas NFS de um NAS, não aplique esta opção. As montagens falharão com mount.nfs: rpc.statd is not running ou semelhante.", + "runsTitle": "O que o ProxMenux executa", + "runsOutro": "O pacote permanece instalado. O ProxMenux regista os estados originais de ativação e execução de rpcbind.service e rpcbind.socket, depois desativa e para ambas as unidades para impedir a reativação do serviço pelo socket.", + "verifyTitle": "Verificação", + "verifyBody": "Após a aplicação, confirme que o rpcbind está desligado e nada está ouvindo na porta 111:", + "reversibleTitle": "Restaura o estado de serviço original", + "reversibleBody": "A alteração é registada em installed_tools.json. Desinstalar otimizações repõe cada unidade rpcbind nos estados de ativação e execução registados antes da alteração pelo ProxMenux; não pressupõe que o rpcbind estivesse ativado em todos os hosts." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Menu de segurança", + "href": "/docs/security", + "tail": " — ferramentas mais completas: Fail2Ban (prevenção de intrusões) e Lynis (auditoria)." + }, + { + "label": "Lynis", + "href": "/docs/security/lynis", + "tail": "— audite o host para encontrar mais oportunidades de proteção." + }, + { + "label": "Comandos úteis do sistema", + "href": "/docs/help-info/system-commands", + "tail": " — estado dos serviços e referência para journalctl e lynis audit." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/storage.json b/web/messages/pt/docs/post-install/storage.json new file mode 100644 index 00000000..02ee48e7 --- /dev/null +++ b/web/messages/pt/docs/post-install/storage.json @@ -0,0 +1,167 @@ +{ + "meta": { + "title": "Pós-instalação: Armazenamento | Documentação ProxMenux", + "description": "Otimizações de armazenamento do script pós-instalação personalizável ProxMenux: dimensão ZFS ARC pela RAM do host, instantâneos periódicos com zfs-auto-snapshot e remoção dos limites de velocidade dos backups vzdump." + }, + "header": { + "title": "Pós-instalação: Armazenamento", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que esta categoria abrange", + "body": "Quatro otimizações de armazenamento: ajustar ZFS ARC a uma fração adequada da RAM, instalar e agendar instantâneos ZFS automáticos, ativar ZFS autotrim em pools SSD/NVMe e retirar limitações de vzdump para acelerar backups. Escolha cada opção independente conforme o sistema. Uma quinta, Log2RAM, reduz desgaste SSD/NVMe movendo /var/log para ramdisk. Está em Opcionais porque o menu personalizável a agrupa aí." + }, + "trackedTitle": "Todos os quatro são rastreados no menu Desinstalar", + "trackedBody": "Cada uma dessas opções registra uma ferramenta em installed_tools.json, então eles aparecem em Otimizações de Uninstall. Reverter o zfs_arc remove o /etc/modprobe.d/99-zfsarc.conf e reconstrói o initramfs; o zfs_auto_snapshot reverte o cronograma do cron e oferece purgar o pacote; o zfs_autotrim configura o autotrim=off nos pools que ele ativou; o vzdump_speed restaura o /etc/vzdump.conf do .bak a instalação criada.", + "arc": { + "heading": "Otimizar o tamanho do ZFS ARC", + "intro": "A Adaptive Replacement Cache (ARC) é a cache de leitura ZFS em RAM. Instalações Proxmox VE desde 8.1 limitam a 10% da RAM, máximo 16 GiB; hosts antigos ou atualizados podem diferir. Esta opção escreve o seu próprio limite pela RAM. Verifique definições e carga: uma cache menor nem sempre é mais rápida.", + "sizingTitle": "Regras de dimensionamento", + "headerRam": "RAM do host", + "headerMax": "Limite ARC", + "rows": [ + { + "ram": "Fórmula", + "max": "RAM / 10, máximo 16 GiB e mínimo 64 MiB" + }, + { + "ram": "Máquina 8 GB", + "max": "≈ 819 MiB (RAM/10)" + }, + { + "ram": "Máquina 16 GB", + "max": "≈ 1.6 GiB (RAM/10)" + }, + { + "ram": "Máquina 64 GB", + "max": "≈ 6.4 GiB (RAM/10)" + }, + { + "ram": "≥ Máquina 160 GB", + "max": "16 GiB (limite)" + } + ], + "after": "O ficheiro /etc/modprobe.d/99-zfsarc.conf contém apenas options zfs zfs_arc_max=…. Os outros parâmetros ZFS (zfs_arc_min, pré-leitura/limite de escritas L2ARC, tempo limite TXG) não são ajustados. Antes, procura outros *.conf em /etc/modprobe.d/ com zfs_arc_min / zfs_arc_max, copia-os com manifesto para /usr/local/share/proxmenux/backups/zfs_arc/ e remove linhas em conflito, deixando ativo só o ficheiro ARC ProxMenux. Depois, update-initramfs -u -k all e, quando aplicável, proxmox-boot-tool refresh integram o limite no initramfs dos sistemas com raiz ZFS.", + "rebootTitle": "Requer uma reinicialização para fazer efeito", + "rebootBody": "As definições ARC são lidas ao carregar o módulo zfs. Para hosts com raiz ZFS, ProxMenux regenera initramfs com update-initramfs -u -k all e atualiza o carregador quando necessário com proxmox-boot-tool refresh. O novo parâmetro continua a exigir reinício, assinalado automaticamente.", + "safeTitle": "Seguro em hosts não-ZFS", + "safeBody": "A função só escreve a configuração quando zpool list relata pelo menos um pool de ZFS. No ext4 / LVM- only Proxmox hosts, ou em máquinas com as ferramentas ZFS instaladas, mas sem pool importado, assinalar esta opção é um no-op - nada é escrito.", + "verifyTitle": "Verificação e retrocesso manual" + }, + "autoSnap": { + "heading": "Instale o instantâneo automático do ZFS", + "intro": "Instala o pacote zfs-auto-snapshot e reescreve seus agendamentos cron para que instantâneos sejam tomados automaticamente em vários intervalos. Uma grande rede de segurança sem esforço em cima de seus backups regulares vzdump.", + "cadenceTitle": "Frequência dos instantâneos configurada pelo ProxMenux", + "headerLabel": "Rótulo", + "headerRuns": "Execução", + "headerKept": "Instantâneos retidos", + "rows": [ + { + "label": "frequentes", + "runs": "cada 15 min", + "kept": "4" + }, + { + "label": "horário", + "runs": "a cada hora", + "kept": "1" + }, + { + "label": "diariamente", + "runs": "uma vez por dia", + "kept": "1" + }, + { + "label": "semanalmente", + "runs": "uma vez por semana", + "kept": "1" + }, + { + "label": "mensal", + "runs": "uma vez por mês", + "kept": "1" + } + ], + "conservativeTitle": "Retenção limitada", + "conservativeBody": "ProxMenux usa retenção limitada: 4 instantâneos frequentes e 1 por cada intervalo mais longo, para conter a ocupação ZFS. Para reter mais, altere os números em /etc/cron.d/zfs-auto-snapshot, /etc/cron.hourly/zfs-auto-snapshot etc. após o script.", + "onlyZfsTitle": "Útil apenas em pools ZFS", + "onlyZfsBody": "Instalar o pacote num host apenas ext4 é inofensivo mas inútil: não há datasets ZFS para criar instantâneos. Ignore a opção se não usa ZFS.", + "verifyTitle": "Verificação e retrocesso manual" + }, + "autotrim": { + "heading": "Ativar ZFS autotrim (pools SSD/NVMe)", + "intro": "Ativa autotrim em pools ZFS só com SSD ou NVMe compatíveis com TRIM. Por precaução, ignora pools com dispositivos rotacionais. Os pools já com autotrim=on ficam inalterados.", + "trimTitle": "O que TRIM faz, e por que importa em ZFS", + "trimBody1": "SSD e NVMe usam blocos internos de apagamento maiores que os setores lógicos do sistema de ficheiros. Quando um ficheiro é apagado, a unidade ainda não sabe que os setores estão livres e a limpeza interna pode continuar a mover dados obsoletos para libertar blocos. TRIM indica os setores livres para permitir o seu apagamento antecipado.", + "trimBody2": "Sem TRIM, o desempenho do SSD degrada-se ao longo do tempo, pois a unidade fica sem blocos pré-apagados e tem que fazer apagar-em-escrever, e aumentar a amplificação de gravação — tanto encurtando a vida útil da unidade. Com TRIM ativado, a unidade pode manter um saudável pool de blocos vazios prontos para escrever.", + "trimBody3": "Com autotrim=on, ZFS aplica TRIM em segundo plano ao espaço recém-libertado, agrupando intervalos. Um zpool trim <pool> periódico é alternativa. Autotrim evita agendamento separado, mas o impacto depende dos dispositivos; TRIM manual periódico pode ser melhor em algumas unidades modestas.", + "practicalTitle": "Por que isso é prático para habilitar?", + "practicalItems": [ + "Desempenho de escrita sustentado. TRIM pode ajudar a recuperar blocos sem uso. Benefícios e impacto na latência dependem do dispositivo e da carga.", + "Vida útil da unidade. Evitar cópias internas desnecessárias pode reduzir amplificação de escrita e desgaste NAND, sem garantir uma duração adicional específica.", + "Sem tarefa cron para agendar. Ao contrário de um zpool trim periódico, autotrim é gerido automaticamente pelo pool." + ], + "whenTitle": "Quando é que isto é necessário?", + "whenIntro1": "Considere ativá-lo em pools ZFS só com SSD/NVMe compatíveis com TRIM. Verifique comportamento e latência; TRIM manual agendado pode ser preferível.", + "whenIntro2": "O programa ignora- o automaticamente em:", + "whenSkipItems": [ + "Pools com vdev HDD rotacional: filtro conservador de hardware deste script.", + "Unidades sem discard_granularity expostas em sysfs — geralmente SSDs antigos sem TRIM, ou caminhos de passagem onde o SO não pode ver o dispositivo subjacente.", + "Pools em que ZFS ela mesma relata a propriedade não suportada (raro; muito antigo pools).", + "Pools já definidos para autotrim=on (no-op)." + ], + "whenIntro3": "Não relevante em hosts somente ext4 — não há nada para ZFS cortar. A função termina com uma mensagem amigável nesse caso.", + "recordedTitle": "Por que apenas os pools ProxMenux alterados são registrados", + "recordedBody": "A função só escreve um pool para o seu arquivo de estado interno (/usr/local/share/proxmenux/zfs_autotrim_pools) quando ele ativamente virou esse pool de off para on. Pools que você tinha no autotrim antes de executar o script são deixados de fora da lista, então um futuro Desinstalar não desliga as configurações que você mesmo configurou — apenas as próprias alterações do ProxMenux são revertidas.", + "manualTitle": "Equivalente manual (executado no seu servidor)", + "manualIntro": "A sequência completa que o script executa contra cada pool é replicável à mão. Isto é o que você digitaria se você quisesse fazer a mesma coisa em um único pool sem ProxMenux:", + "verifyTitle": "Verificação e retrocesso manual", + "oneShotTitle": "Prefere TRIM pontual em vez de contínuo?", + "oneShotBody": "Alguns administradores preferem TRIM manual nas horas de menor carga. Desative autotrim e agende uma tarefa cron com zpool trim <pool>: mesmo objetivo, frequência diferente." + }, + "vzdump": { + "heading": "Aumentar a velocidade de backup do vzdump", + "intro": "Escreve bwlimit: 0 e ionice: 5 na configuração global vzdump. Proxmox já não limita a banda por predefinição: só remove um limite configurado. Face a ionice: 7, o valor 5 aumenta a prioridade E/S best-effort se o escalonador a respeitar. Pode afetar os convidados e não garante backups mais rápidos.", + "changedTitle": "O que é alterado em /etc/vzdump.conf", + "backupTitle": "Primeira execução cria um .bak de vzdump.conf", + "backupBody": "Na primeira execução, ProxMenux copia /etc/vzdump.conf para /etc/vzdump.conf.bak antes de alterar. As seguintes preservam essa cópia para recuperar a configuração anterior. bwlimit e ionice são alterados com sed; outras opções como compress, pigz, tmpdir e exclude-path são preservadas.", + "skipTitle": "Quando saltar isto", + "skipBody": "Num host com armazenamento local lento e VMs sensíveis à latência, retirar o limite de banda pode causar lentidão durante backups. Se definiu bwlimit por esse motivo, mantenha-o e ignore a opção.", + "verifyTitle": "Verificação e retrocesso manual" + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Comandos de gerenciamento ZFS", + "href": "/docs/help-info/zfs-commands", + "tail": " — referência zpool / zfs para ARC, instantâneos e scrub." + }, + { + "label": "Comandos de armazenamento e discos", + "href": "/docs/help-info/storage-commands", + "tail": " — referência de dispositivos de blocos e armazenamento Proxmox." + }, + { + "label": "Comandos de backup e restauração", + "href": "/docs/help-info/backup-commands", + "tail": " — referência CLI vzdump para banda e prioridade E/S." + }, + { + "label": "Desinstalar otimizações", + "href": "/docs/post-install/uninstall", + "tail": " — reverter as alterações ARC / vzdump." + }, + { + "label": "Log2RAM", + "href": "/docs/post-install/optional#log2ram", + "tail": " — reduz o desgaste SSD/NVMe por /var/log ramdisk backing; documentado sob opcional." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/system.json b/web/messages/pt/docs/post-install/system.json new file mode 100644 index 00000000..f8897d55 --- /dev/null +++ b/web/messages/pt/docs/post-install/system.json @@ -0,0 +1,133 @@ +{ + "meta": { + "title": "Pós-instalação: Sistema | Documentação ProxMenux", + "description": "Otimizações em nível de sistema no ProxMenux Script pós-instalação personalizável: journald e limites de tamanho de rotação de log, limites mais altos de kernel e descritor de arquivo, ajuste de memória balanceado, kexec para reinicializações rápidas e recuperação de kernel panic." + }, + "header": { + "title": "Após a instalação: sistema", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que esta categoria abrange", + "body": "Seis otimizações de sistema independentes. Ajustam journald e logrotate para os registos não encherem o disco, aumentam os limites do kernel e dos descritores de ficheiros para aplicações com muitos ficheiros abertos, equilibram a memória num host de virtualização, acrescentam kexec para reinícios sem BIOS e configuram a recuperação automática de kernel panic. As seis ficam registadas e são reversíveis no menu Desinstalar." + }, + "journald": { + "heading": "Otimizar journald", + "intro": "Reescreve /etc/systemd/journald.conf com valores adequados para o journal systemd não encher gradualmente a partição raiz; depois reinicia systemd-journald e limpa registos antigos.", + "keyTitle": "Valores-chave", + "keyItems": [ + "Storage=persistent — manter registros no disco através de reinicialização.", + "SystemMaxUse=64M / RuntimeMaxUse=60M — limites de utilização de disco e memória do journal.", + "Compress=yes, Seal=no — comprime registos e desativa a selagem com segurança futura (poupa CPU).", + "MaxLevelStore=info — guarda nível info e superiores, necessários ao visualizador de registos ProxMenux Monitor e à deteção de falhas de autenticação SSH/Proxmox pelo Fail2Ban no journal.", + "Limite de frequência: 1000 events / 30 s para evitar um excesso de registos.", + "ForwardToSyslog=no, ForwardToWall=no — não duplicar mensagens para syslog ou transmitir para consoles." + ], + "tipTitle": "Por que o MaxLevelStore=info importa", + "tipBody": "Um limiar mais rigoroso como warning faz ProxMenux Monitor mostrar entradas quase iguais em todos os períodos, pois a maioria da atividade é de nível info, e impede Fail2Ban de ver acessos falhados. Reduza o volume com SystemMaxUse e RateLimitBurst sem restringir os níveis guardados." + }, + "logrotate": { + "heading": "Otimizar logrotate", + "intro": "Reescreve /etc/logrotate.conf com definições globais diárias e de tamanho, 7 rotações retidas, compressão e copytruncate, para os serviços continuarem a escrever sem reabrir os registos. O tamanho aparece após a frequência diária e prevalece, salvo regras específicas de cada registo. O logrotate.conf original é copiado para .bak na primeira aplicação.", + "tipTitle": "Compatível com Log2RAM", + "tipBody": "A diretiva size 10M prevalece sobre a definição diária anterior; não significa o primeiro dos dois critérios. Logrotate verifica o limiar quando é executado, e regras específicas podem substituir as globais. Com /var/log na RAM do Log2RAM, verifique as regras e a frequência do temporizador para controlar o espaço." + }, + "limits": { + "heading": "Aumentar vários limites do sistema", + "intro": "Aumenta limites do kernel, systemd e PAM cujas predefinições podem ser baixas para um host com muitas VMs, contentores e serviços de rede.", + "headerFile": "Arquivo", + "headerSets": "O que define", + "rows": [ + { + "file": "/etc/sysctl.d/99-maxwatches.conf", + "sets": "fs.inotify.max_user_watches / max_user_instances / max_queued_events = 1048576" + }, + { + "file": "/etc/sysctl.d/99-maxkeys.conf", + "sets": "kernel.keys.maxkeys / root_maxkeys = 1000000" + }, + { + "file": "/etc/sysctl.d/99-swap.conf", + "sets": "vm.swappiness = 10, vm.vfs_cache_pressure = 100" + }, + { + "file": "/etc/sysctl.d/99-fs.conf", + "sets": "fs.nr_open / file-max = 2097152, fs.aio-max-nr = 1048576" + }, + { + "file": "/etc/security/limits.d/99-limits.conf", + "sets": "nofile e nproc a 1 048 576 (ilimitados para root)" + }, + { + "file": "/etc/systemd/system.conf + user.conf", + "sets": "DefaultLimitNOFILE=1048576 para serviços systemd" + }, + { + "file": "/etc/pam.d/common-session + runuser-l", + "sets": "session required pam_limits.so então o acima se aplica às shells de login" + }, + { + "file": "/root/.profile", + "sets": "ulimit -n 1048576 para a shell root" + } + ], + "tipTitle": "Por que inotify é importante", + "tipBody": "Docker, Syncthing, as monitorizações de ficheiros Node.js e análises Plex podem esgotar max_user_watches. A predefinição depende do kernel e da memória; nem sempre é 8192. O limite de 1M permite mais monitorizações sem as pré-alocar. As ativas consomem memória do kernel: controle a utilização nos hosts com pouca RAM." + }, + "memory": { + "heading": "Otimizar as configurações de memória", + "intro": "Escreve um perfil sysctl equilibrado para /etc/sysctl.d/99-memory.conf. Projetado para um host de hipervisor — prefere manter conjuntos de trabalho VM em RAM e libera páginas proativamente para que as rajadas de alocação não parem.", + "warnTitle": "swappiness=10 em hosts com pouca memória", + "warnBody": "Num host com 16 GB de RAM e muitas VMs, reduzir swappiness pode levar o kernel a terminar processos por falta de memória em vez de usar swap. Se os eventos OOM forem frequentes, aumente swappiness para 30–60 em /etc/sysctl.d/99-memory.conf após executar o script." + }, + "kexec": { + "heading": "Activar reinicialização rápida (kexec)", + "intro": "Instala o kexec-tools e o liga para que você possa reiniciar o host diretamente em um novo kernel sem passar pelo firmware BIOS/UEFI. Em grandes servidores onde POST leva 45 – 90 segundos, isso transforma uma reinicialização de uma pausa de café em alguns segundos de parada.", + "installsTitle": "O que o ProxMenux instala", + "installsItems": [ + "Pacote kexec-tools (debconf pré-configurado com kexec-tools/load_kexec boolean false para o apt não pedir confirmação e manter desativado o carregamento automático ao desligar).", + "Unidade systemd /etc/systemd/system/kexec-pve.service — carrega o kernel Proxmox e initrd em memória no arranque, reutilizando a linha de comandos atual do kernel.", + "Um apelido em /root/.bash_profile: reboot-quick → systemctl kexec." + ], + "usageIntro": "Uso após a próxima reinicialização (ou manual systemctl start kexec-pve):", + "warnTitle": "Quando não usar o kexec", + "warnBody": "O kexec ignora o nível de firmware init. Se você confiar em BIOS/UEFI para redefinir o estado de hardware — por exemplo, um GPU fazendo a passagem que só repõe de forma limpa no POST completo, ou um firmware HBA problemático — o reboots do kexec pode deixar esses dispositivos em um estado semi-inicializado. Use um reboot normal após atualizações do kernel ou quando você precisar de alterações BIOS/UEFI para fazer efeito. reboot-quick é para reinícios diários." + }, + "panic": { + "heading": "Habilite a reinicialização no kernel panic", + "intro": "Faz o kernel reiniciar automaticamente em vez de ficar bloqueado no ecrã de panic. Essencial em hosts Proxmox remotos ou sem consola local: um kernel bloqueado para todas as VMs até poder desligar e voltar a ligar a alimentação.", + "tipTitle": "Emparelha isto com o acesso remoto à consola", + "tipBody": "Auto-reboot é um mecanismo de recuperação, não uma ferramenta de depuração. Se você quiser investigar um pânico em vez de apenas voltar, use a opção kexec acima com o suporte kdump do kernel (não configurado pelo ProxMenux) ou capture um console serial para outro host antes de habilitar o reinício automático." + }, + "verify": { + "heading": "Verificação", + "intro": "Após a aplicação das otimizações do sistema:", + "tipTitle": "Restauro e limitações", + "tipBody": "As seis opções ficam em installed_tools.json e Desinstalar otimizações. O restauro remove configurações, unidade e alias kexec e repõe journald/logrotate. Alguns limites ativos precisam de nova sessão ou reinício. A limpeza de /root/.profile só remove o antigo ulimit -n 256000; o atual ulimit -n 1048576 pode permanecer e exigir remoção manual." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Comandos úteis do sistema", + "href": "/docs/help-info/system-commands", + "tail": " — verificar as alterações (free -h, journalctl, ulimit -a)." + }, + { + "label": "Desempenho", + "href": "/docs/post-install/performance", + "tail": " — afinação adicional do nível do sistema (pigz)." + }, + { + "label": "Desinstalar otimizações", + "href": "/docs/post-install/uninstall", + "tail": " — reverter qualquer uma destas alterações." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/uninstall.json b/web/messages/pt/docs/post-install/uninstall.json new file mode 100644 index 00000000..50b1b48e --- /dev/null +++ b/web/messages/pt/docs/post-install/uninstall.json @@ -0,0 +1,271 @@ +{ + "meta": { + "title": "Desinstalar otimizações | Documentação ProxMenux", + "description": "Restaurar as alterações reversíveis de configuração pós-instalação aplicadas pelo ProxMenux. Ferramentas registradas usam desinstaladores dedicados que preservam o estado de host pré-existente sempre que possível." + }, + "header": { + "title": "Desinstalar otimizações", + "description": "Restaurar as alterações reversíveis feitas pelos scripts pós-instalação automatizados ou personalizáveis. ProxMenux registra cada otimização suportada com sua função de restauração dedicada; upgrades de pacotes são intencionalmente excluídos.", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "Por que isto existe", + "body": "Cada ajuste reversível suportado fica registado em /usr/local/share/proxmenux/installed_tools.json. O registo lista otimizações ativas e chama a função de restauro correspondente. Ações sem reversão segura, como uma atualização completa de pacotes, não são acrescentadas." + }, + "openMenu": { + "heading": "Como abri-lo", + "body": "Do menu principal do ProxMenux, Configurações pós-instalação Proxmox → Desinstalar otimizações. Você verá uma lista de verificação das otimizações aplicadas atualmente — itens que você não tenha aplicado não aparecem.", + "imageAlt": "Desinstalar Lista de verificação de Otimizações mostrando itens atualmente aplicados no host, com caixas de seleção para selecionar quais reverter" + }, + "howWorks": { + "heading": "Como funciona a inversão", + "steps": [ + { + "title": "Registro e autodetecção", + "body1": "Na primeira execução, ProxMenux procura indicadores no host: /etc/sysctl.d/99-memory.conf, /etc/apt/apt.conf.d/99-force-ipv4, pacote haveged instalado, serviço Log2RAM ativo, etc. Os elementos reconhecidos são registados como reversíveis mesmo se aplicados por uma versão anterior ao registo.", + "body2": "Esta migração só funciona uma vez. Depois disso, cada aplicação/reversão atualiza diretamente o registro." + }, + { + "title": "Escolha o que reverter", + "body1": "A lista de verificação mostra um rótulo legível pelo homem por item (por exemplo, Otimização da Configuração da Memória, IOMMU/VFIO PCI Passthrough, Log2RAM (Proteção SSD)). Assinale os que quiser reverter. Nada que não tiquetes será tocado." + }, + { + "title": "Execução da reversão", + "body1": "Para cada item selecionado, ProxMenux chama sua função de desinstalação correspondente. A maioria das reversões segue um dos três padrões:", + "items": [ + "A partir de cópia — restaura um .bak criado ao aplicar a alteração (bashrc, logrotate.conf, journald.conf, linha de comandos GRUB/kernel).", + "Remoção da configuração — remove os ficheiros ProxMenux /etc/sysctl.d/99-*.conf, /etc/apt/apt.conf.d/99-* ou a unidade systemd e recarrega.", + "Reinstale o pacote — para alterações de UI como o banner de assinatura, reinstale os pacotes upstream com --force-confnew para restaurar a configuração enviada." + ], + "body2": "Cada inversão regista o seu progresso. Itens que requerem uma reinicialização (VFIO, nomes de interface persistentes) definem uma bandeira que ativa o prompt de reinicialização no final." + }, + { + "title": "Pedido de reinício no fim", + "body1": "Após a reversão terminar, o menu mostra um prompt de reinicialização. Itens que mudaram os parâmetros do kernel, módulos do kernel ou nomes de rede (VFIO, nomes de interface persistentes) precisam da reinicialização para fazer efeito; outros itens não, e o prompt é um padrão de segurança em vez de uma verificação por item." + } + ] + }, + "reversible": { + "heading": "O que é reversível", + "intro": "As otimizações reversíveis registradas e seus desinstaladores correspondentes são agrupados aqui por área:", + "groups": [ + { + "title": "Repositórios & APT", + "items": [ + { + "tool": "Remoção da Banner de Assinatura", + "restores": "Primeiro tenta restaurar os ficheiros da interface a partir das cópias ProxMenux (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* e index.html.tpl.backup.* se a interface móvel foi modificada). Só quando a cópia falta ou está danificada reinstala pve-manager, proxmox-widget-toolkit, libjs-extjs e libpve-http-server-perl com force-confnew. Também limpa cópias .js / .gz em cache." + }, + { + "tool": "Ignorar idiomas do APT", + "restores": "Remove /etc/apt/apt.conf.d/99-disable-translations, permitindo os índices de descrições traduzidas segundo as restantes definições de idioma APT." + }, + { + "tool": "Forçar IPv4 no APT", + "restores": "Remove /etc/apt/apt.conf.d/99-force-ipv4." + }, + { + "tool": "Utilitários de Sistema", + "restores": "Purga apenas os pacotes utilitários selecionados que o ProxMenux gravou como recém-instalado. Pacotes já presentes antes da ação nunca são adicionados a esta lista e ficam intocados." + } + ] + }, + { + "title": "Limites de Kernel, memória e sistema", + "items": [ + { + "tool": "Configuração da Memória", + "restores": "Remove o /etc/sysctl.d/99-memory.conf e recarrega o sysctl." + }, + { + "tool": "Configuração do Pânico do Kernel", + "restores": "Remove /etc/sysctl.d/99-kernelpanic.conf." + }, + { + "tool": "Aumento dos limites do sistema", + "restores": "Remove /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf e /etc/security/limits.d/99-limits.conf. Repõe limites PAM e DefaultLimitNOFILE systemd. Em /root/.profile só remove o antigo ulimit -n 256000; ulimit -n 1048576 do instalador atual pode permanecer e exigir remoção manual." + }, + { + "tool": "Perfil de troca ZRAM", + "restores": "Desativa o swap /dev/zram0, para dev-zram0.swap e remove /etc/systemd/zram-generator.conf.d/90-proxmenux.conf. Só purga systemd-zram-generator se instalado pelo ProxMenux e sem outra configuração ZRAM. Se não conseguir evacuar as páginas, o perfil mantém-se ativo e nada é removido." + } + ] + }, + { + "title": "Rede", + "items": [ + { + "tool": "Otimizações de Rede", + "restores": "Remove /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf e 98-proxmenux-rpf.conf, a unidade proxmenux-fwbr-tune.service, o script /usr/local/sbin/proxmenux-fwbr-tune e a regra udev /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules. Retira também source /etc/network/interfaces.d/* de /etc/network/interfaces. Recarrega sysctl, systemd e regras udev." + }, + { + "tool": "Open vSwitch", + "restores": "Executa apt purge para openvswitch-switch e openvswitch-common. Migre antes as pontes OVS para Linux; caso contrário, as VMs nessas pontes perdem a rede no próximo arranque." + }, + { + "tool": "TCP BBR + TCP Fast Open", + "restores": "Remove /etc/sysctl.d/99-kernel-bbr.conf e 99-tcp-fastopen.conf e recarrega o restante sysctl. Eliminar ficheiros não repõe valores ativos; predefinições como cubic e tcp_fastopen=1 voltam após reiniciar, salvo outra configuração." + }, + { + "tool": "Nomes de Interface Persistentes", + "restores": "Remove apenas os arquivos 10-proxmenux-*.link carregando o cabeçalho ProxMenux do /etc/systemd/network/. Qualquer arquivo .link fornecido por outro pacote ou escrito pelo usuário é deixado no lugar. Os nomes da interface retornam ao comportamento padrão do systemd na próxima reinicialização." + } + ] + }, + { + "title": "Registo", + "items": [ + { + "tool": "Otimização do journald", + "restores": "Reescreve /etc/systemd/journald.conf com predefinições originais e reinicia systemd-journald." + }, + { + "tool": "Otimização do Logrotate", + "restores": "Restaura /etc/logrotate.conf do arquivo .bak capturado antes da mudança." + }, + { + "tool": "Log2RAM", + "restores": "Para e desativa o serviço e o timer. Purga trabalhos de cron, unidades systemd, binários, arquivos de configuração e o diretório /var/log.hdd. Também desinstala o pacote apt se ele foi instalado dessa forma." + }, + { + "tool": "TRIM automático do ZFS", + "restores": "Lê /usr/local/share/proxmenux/zfs_autotrim_pools, a lista dos pools realmente alterados, e executa zpool set autotrim=off em cada um. Preserva autotrim ativado manualmente antes do ProxMenux." + } + ] + }, + { + "title": "Shell & aparência", + "items": [ + { + "tool": "Personalização do Bashrc", + "restores": "Restaura /root/.bashrc do backup .bak. Se não existir backup, remove o bloco PMX_CORE_BASHRC por marcadores." + }, + { + "tool": "Banner MOTD personalizado", + "restores": "Restaura o conteúdo original exato /etc/motd mantido sob /usr/local/share/proxmenux, remove o arquivo quando ele não existia antes, ou remove com segurança o marcador legado ao migrar uma instalação mais antiga." + }, + { + "tool": "Fastfetch", + "restores": "Remove binário, diretório de configuração, integração update-motd e bloco delimitado BEGIN FASTFETCH / END FASTFETCH de /root/.bashrc, ~/.profile, /etc/profile e /etc/profile.d/fastfetch.sh. Purga o pacote apt se instalado." + }, + { + "tool": "Figurine", + "restores": "Remove o binário, a entrada profile.d e o bloco de aliases em bashrc/profile." + } + ] + }, + { + "title": "Hardware e virtualização", + "items": [ + { + "tool": "IOMMU / VFIO", + "restores": "Remove os módulos vfio de /etc/modules, as entradas de bloqueio dos controladores nouveau / radeon / nvidia e os parâmetros intel_iommu=on / amd_iommu=on / iommu=pt / pcie_acs_override de /etc/kernel/cmdline (ZFS) ou do GRUB. Reconstrói initramfs." + }, + { + "tool": "Correcções AMD CPU (Ryzen/EPYC)", + "restores": "Remove idle=nomwait da linha de comandos do kernel (ZFS) ou GRUB e as opções ignore_msrs / report_ignored_msrs de /etc/modprobe.d/kvm.conf." + }, + { + "tool": "Agente convidado para host Proxmox virtualizado", + "restores": "Lê /usr/local/share/proxmenux/guest_agent.pkg e purga o pacote registado do host. O instalador escolhe qemu-guest-agent, open-vm-tools ou virtualbox-guest-utils pelo hipervisor. Sem registo, tenta esses três pacotes. Atua no host Proxmox aninhado, não em modelos de convidados." + } + ] + }, + { + "title": "Armazenamento", + "items": [ + { + "tool": "Dimensionamento do ARC do ZFS", + "restores": "Remove /etc/modprobe.d/99-zfsarc.conf, restaura *.conf externos em conflito guardados em /usr/local/share/proxmenux/backups/zfs_arc/, reconstrói initramfs e executa proxmox-boot-tool refresh em hosts systemd-boot." + }, + { + "tool": "Snapshots automáticos do ZFS", + "restores": "Remove as entradas cron escritas pelo script e oferece apt purge zfs-auto-snapshot. Os instantâneos existentes nos pools são preservados; remova-os separadamente se necessário." + }, + { + "tool": "Limites de velocidade do vzdump", + "restores": "Restaura /etc/vzdump.conf do .bak a instalação criada, trazendo de volta bwlimit e ionice para seus valores pré-ProxMenux." + } + ] + }, + { + "title": "Serviços & extras", + "items": [ + { + "tool": "Sincronização do Tempo", + "restores": "Define o fuso- horário de volta para UTC (padrão seguro) via timedatectl." + }, + { + "tool": "Geração de entropia (haveged)", + "restores": "Para, desativa e purga o pacote haveged." + }, + { + "tool": "kexec (reiniciações rápidas)", + "restores": "Desativa kexec-pve.service, remove o ficheiro da unidade e o alias reboot-quick de /root/.bash_profile e purga kexec-tools." + }, + { + "tool": "RPC / rpcbind Desabilitar", + "restores": "Restaura rpcbind.service e rpcbind.socket independentemente para os estados ativados/desativados e ativos/inativos registrados antes de ProxMenux os alterar." + }, + { + "tool": "pigz (paralelo gzip)", + "restores": "Restaura o gzip original de gzip.distrib, remove o desvio dpkg e /bin/pigzwrapper, comenta a linha pigz em /etc/vzdump.conf e executa apt purge pigz após verificar gzip." + }, + { + "tool": "Serviços de alta disponibilidade", + "restores": "Para e desactiva pve-ha-lrm, pve-ha-crm e corosync. Grupos HA existentes e definições de recursos não são excluídos — remova-os da interface web se você não precisar mais deles." + }, + { + "tool": "repositório Ceph", + "restores": "Purga os pacotes Ceph instalados por esta opção, remove o deb822 /etc/apt/sources.list.d/ceph.sources no PVE 9 (ou a lista de Ceph no PVE 8) e atualiza o cache APT." + }, + { + "tool": "OVH RTM (monitorização)", + "restores": "Purga pacotes correspondentes a ovh-rtm*, rtm e rtm-*, remove /etc/rtm e a entrada RTM do registo. Restos Puppet em /etc/puppet/ podem exigir inspeção e limpeza manual; o diretório não é eliminado. Fora da OVH, o instalador normalmente não altera nada." + } + ] + } + ] + }, + "edge": { + "heading": "Casos particulares e limitações", + "packageTitle": "A reinstalação afeta pacotes Proxmox em utilização", + "packageBody": "Se as cópias ProxMenux não conseguirem reverter Remoção do aviso de subscrição, a alternativa reinstala pve-manager, proxmox-widget-toolkit, libjs-extjs e libpve-http-server-perl com --force-confnew. Afeta a interface em uso: atualize o navegador e aguarde alguns segundos pela reconexão. Evite fazê-lo durante migrações ou clonagens.", + "rebootTitle": "Nomes persistentes e VFIO precisam de uma reinicialização", + "rebootBody": "Removendo ProxMenux's 10-proxmenux-*.link ficheiros (Nomes de Interface Persistentes) e reversão IOMMU/VFIO não afetam o sistema de execução — eles só importam após uma reinicialização. ProxMenux define a bandeira de reinicialização automaticamente para estes.", + "perItemTitle": "Podes reverter uma coisa e ficar com o resto.", + "perItemBody": "O desinstalador opera por item. Se você só quiser remover Log2RAM, mas manter o ajuste de rede e mudanças bashrc, marque apenas Log2RAM. Nada mais é tocado, e o registro é atualizado em conformidade." + }, + "inspect": { + "heading": "Inspecionar o registro manualmente", + "intro": "Se você quiser ver o que é rastreado sem abrir o menu:", + "outro": "Cada entrada \"tool\": true corresponde a algo ProxMenux aplicado e pode reverter. Remover uma entrada manualmente não é recomendado — use sempre o menu, que também executa a função reversão em vez de apenas esquecer a mudança.", + "reinstallTitle": "Reinstalar após desinstalar", + "reinstallBody": "Reverter uma otimização não impede que você a aplique mais tarde. Abra o menu Post-Install novamente e execute Automatizado ou Personalizável – o registro irá rastrear o novo estado." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Pós- instalação automatizada", + "href": "/docs/post-install/automated", + "tail": " — reaplicar a configuração de base recomendada." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — escolher um subconjunto diferente." + }, + { + "label": "Desinstalar ProxMenux", + "href": "/docs/settings/uninstall-proxmenux", + "tail": " — operação diferente: remove o ProxMenux em si, não as suas otimizações aplicadas." + }, + { + "label": "Visão geral da pós-instalação", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/pt/docs/post-install/updates.json b/web/messages/pt/docs/post-install/updates.json new file mode 100644 index 00000000..8b856985 --- /dev/null +++ b/web/messages/pt/docs/post-install/updates.json @@ -0,0 +1,112 @@ +{ + "meta": { + "title": "Aplicar atualizações disponíveis — Otimizações pós-instalação | Documentação ProxMenux", + "description": "Como o ProxMenux detecta quando uma otimização pós-instalação (Log2Ram, Configurações de Memória, Limites de Sistema, Logrotate, Ajuste de Rede...) foi atualizada a montante, e como aplicar a nova versão — do menu Post-Install ou do painel Monitor." + }, + "header": { + "title": "Aplicar atualizações disponíveis", + "description": "Quando uma otimização pós-instalação (Log2Ram, definições de memória, limites do sistema, Logrotate…) tem uma versão no disco mais recente que a registada no host, o ProxMenux apresenta-a como atualização disponível. Pode aplicá-la pelo menu pós-instalação dos scripts ou pelo painel Monitor. Ambos executam novamente a mesma função e atualizam o registo.", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que é isto?", + "body": "As otimizações pós-instalação ProxMenux têm versões, por exemplo Log2ram SSD Protection v1.2. O host regista as otimizações ativas e as suas versões em /usr/local/share/proxmenux/installed_tools.json. Quando uma nova versão ProxMenux atualiza uma otimização, deteta a diferença e propõe reaplicar só essa, sem repetir toda a pós-instalação." + }, + "why": { + "heading": "Por que isto existe", + "body": "As otimizações pós-instalação recebem melhorias: ajustes sysctl, limites Logrotate mais rigorosos, novas regras de dimensão Log2RAM ou correções de casos extremos. Sem esta via, era necessário repetir o script, que reaplica todas as otimizações, ou abdicar da melhoria. Aplicar atualizações disponíveis permite escolher individualmente só as que mudaram de versão." + }, + "detection": { + "heading": "Como as atualizações são detectadas", + "steps": [ + { + "title": "Scripts com versão no disco", + "body": "Cada função pós-instalação declara sua versão dentro do script (scripts/post_install/auto_post_install.sh e scripts/post_install/customizable_post_install.sh). Um scanner extrai estas versões da fonte no disco." + }, + { + "title": "Registo versionado na máquina", + "body": "Quando o operador aplicou cada otimização, a chamada register_tool correspondente escreveu a versão ativa em /usr/local/share/proxmenux/installed_tools.json. Esse arquivo é a fonte da verdade para \"o que está ativo neste host agora\"." + }, + { + "title": "Monitor compara ambos os lados", + "body": "Na inicialização e a cada 24h, o Monitor compara versões de disco com versões de registro. Qualquer incompatibilidade produz uma entrada em /usr/local/share/proxmenux/updates_available.json. Esse arquivo dirige tanto a entrada de menu Post-Install quanto o cartão de painel Monitor." + }, + { + "title": "Uma notificação por nova versão", + "body": "Se houver pelo menos uma atualização pendente, Monitor envia uma única notificação agrupada, por exemplo «4 atualizações de otimizações ProxMenux disponíveis», com uma linha por ferramenta no formato name (vX → vY), como nos pacotes Proxmox. Não a repete diariamente para o mesmo conjunto: só uma nova versão ou nova ferramenta na lista volta a ativá-la." + } + ] + }, + "pathA": { + "heading": "Caminho A — Do menu pós- instalação", + "intro": "No menu principal ProxMenux, abra Configurações pós-instalação do Proxmox. Havendo atualizações pendentes, surge Aplicar atualizações disponíveis (N) acima de Desinstalar otimizações. O número indica quantas têm versão no disco mais recente que a registada. Se tudo estiver atualizado, a entrada fica oculta.", + "menuAlt": "Post-Install Scripts menu mostrando a entrada condicional 'Aplicar atualizações disponíveis (N)' posicionado logo acima 'Desinstalar otimizações', com o crachá de contagem indicando quantas otimizações têm uma versão mais recente no disco", + "menuCaption": "A entrada Aplicar atualizações disponíveis (N) só renderiza quando pelo menos uma otimização tem uma atualização pendente — ela esconde quando o host está atual.", + "checklistBody": "Abre uma lista com todas as atualizações pendentes no formato name (vX → vY). Estão todas selecionadas por predefinição; desmarque as que não pretende aplicar agora.", + "checklistAlt": "Janela Aplicar atualizações disponíveis com uma linha por otimização pendente, nome e mudança de versão (atual → disponível). Todas as linhas estão selecionadas.", + "checklistCaption": "Escolha individualmente as otimizações a atualizar. O mesmo motor de Automatizado e Personalizável reaplica cada função em segundo plano e atualiza a versão registada." + }, + "pathB": { + "heading": "Caminho B — Do painel do monitor", + "intro": "As mesmas atualizações aparecem em Monitor, em Configurações → Otimizações ProxMenux. A ficha mostra um contador de atualizações pendentes que abre o seletor por otimização. Cada ferramenta também tem a sua ação de atualização.", + "imageAlt": "Ficha Otimizações ProxMenux nas configurações Monitor com contador de atualizações pendentes que abre o seletor e ações de atualização por ferramenta", + "imageCaption": "A ficha Otimizações de Monitor permite aceder às atualizações pelo contador quando existe uma versão mais recente no disco, sem acesso à shell." + }, + "applying": { + "heading": "O que acontece ao aplicar", + "steps": [ + { + "title": "Repetir a função pós-instalação", + "body": "A função escolhida volta a ser executada no host. Como é idempotente, não duplica a configuração: substitui a versão anterior pela nova, incluindo ficheiros sysctl, configurações adicionais e unidades de serviços." + }, + { + "title": "Atualiza o registro", + "body": "A chamada register_tool dentro da função escreve a nova versão em installed_tools.json. A próxima varredura não vê mais um descompasso e a entrada de atualização desaparece tanto do menu quanto do cartão Monitor." + }, + { + "title": "Sem reiniciar, a menos que a função o diga", + "body": "A maioria das actualizações produz efeitos imediatamente. Atualizações que tocam módulos do kernel, nomes de interface persistentes ou VFIO mostram o mesmo prompt de reinicialização que uma nova instalação seria." + }, + { + "title": "Actualizar o registo enviado para o Monitor", + "body": "No fim do lote, o menu envia um pedido POST a http://127.0.0.1:8008/api/updates/post-install/scan para reconstruir /usr/local/share/proxmenux/updates_available.json. Após aplicar todas as atualizações, desaparecem o contador da ficha Otimizações e a entrada condicional da shell, sem esperar pelo próximo scan. A ficha continua disponível." + } + ], + "jqTitle": "jq é necessário", + "jqBody": "A lista de verificação Caminho A baseia-se em jq para processar as atualizações pendentes JSON. Se o jq estiver faltando, o fluxo sai silenciosamente — você verá a entrada do menu com uma contagem, mas nada aconteceria depois de escolher linhas. Em qualquer instalação moderna Proxmox jq está presente; se em dúvida executar apt install -y jq." + }, + "differs": { + "heading": "Como difere dos outros caminhos", + "headerPath": "Path", + "headerScope": "Escopo", + "headerWhen": "Quando faz sentido", + "rows": [ + { + "pathLabel": "Automatizado", + "pathHref": "/docs/post-install/automated", + "scope": "Reaplica todas as otimizações do conjunto.", + "when": "Host novo ou reaplicação completa da base de um nó totalmente gerido." + }, + { + "pathLabel": "Personalizável", + "pathHref": "/docs/post-install/customizable", + "scope": "Escolha no catálogo completo.", + "when": "Escolher exatamente as otimizações ativas no host." + }, + { + "pathLabel": "Aplicar atualizações disponíveis", + "pathHref": null, + "scope": "Só as otimizações com versão mais recente no disco.", + "when": "Mantenha as otimizações já instaladas atuais sem tocar no resto." + }, + { + "pathLabel": "Desinstalar otimizações", + "pathHref": "/docs/post-install/uninstall", + "scope": "Inverta a otimização e remova sua entrada de registro.", + "when": "Retroceda uma mudança específica." + } + ] + }, + "notifTitle": "Controlo da notificação", + "notifBody": "O evento Atualizações de otimizações ProxMenux disponíveis anuncia as atualizações pendentes. Está ativo por predefinição em cada canal e pode ser silenciado por canal em Configurações → Notificações. Só dispara uma vez por conjunto diferente de atualizações, não em cada scan de 24 horas." +} diff --git a/web/messages/pt/docs/post-install/virtualization.json b/web/messages/pt/docs/post-install/virtualization.json new file mode 100644 index 00000000..768d5676 --- /dev/null +++ b/web/messages/pt/docs/post-install/virtualization.json @@ -0,0 +1,116 @@ +{ + "meta": { + "title": "Pós-instalação: Virtualização | Documentação ProxMenux", + "description": "Opções de virtualização no script pós-instalação personalizável ProxMenux: auto-instale o agente convidado certo se o Proxmox correr dentro de um VM, e habilite o IOMMU / VFIO para que você possa passar dispositivos PCI (GPUs, NICs, HBAS) através de suas próprias VMs." + }, + "header": { + "title": "Post-Install: Virtualização", + "section": "Configurações pós-instalação do Proxmox" + }, + "intro": { + "title": "O que esta categoria abrange", + "body": "Duas opções independentes. Instalar o agente convidado adequado ajuda quando o próprio Proxmox corre dentro de outro hipervisor. Ativar suporte VFIO IOMMU interessa à maioria dos utilizadores: ativa as funções do kernel para atribuir diretamente uma GPU, HBA ou placa de rede a uma VM com desempenho quase nativo." + }, + "guestAgent": { + "heading": "Instale o agente convidado relevante", + "intro": "Deteta o ambiente de virtualização do host Proxmox através de systemd-detect-virt e dmidecode e instala as ferramentas de convidado adequadas para comunicar com o hipervisor externo: encerramento ordenado, sincronização do relógio, informação de IP, etc.", + "headerDetected": "Máquina detectada", + "headerPackage": "Pacote instalado", + "rows": [ + { + "detected": "QEMU / KVM", + "package": "qemu-guest-agent" + }, + { + "detected": "VMware (ESXi, Workstation)", + "package": "open-vm-tools" + }, + { + "detected": "VirtualBox", + "package": "virtualbox-guest-utils" + }, + { + "detected": "Hardware físico (nenhum)", + "package": "— no-op, nada instalado" + } + ], + "skipTitle": "Ignore esta opção se o Proxmox correr diretamente no hardware", + "skipBody": "Se o Proxmox for executado diretamente no hardware (o caso comum), assinalar esta opção é um no-op — o detector devolve none e o script sai sem alterações. A opção só importa para a minoria de configurações que executam Proxmox como um guest para testes ou laboratórios." + }, + "vfio": { + "heading": "Habilitar suporte VFIO IOMMU", + "intro": "Ativa IOMMU no host e carrega os módulos para passthrough PCI (vfio, vfio_iommu_type1, vfio_pci). Pode então atribuir um dispositivo físico a uma VM, que terá acesso direto com desempenho quase nativo.", + "whoTitle": "Quem precisa disto?", + "whoItems": [ + "Quer atribuir uma GPU a uma VM Windows para jogos ou a uma VM macOS.", + "Você tem um NIC de 10G dedicado para um firewall/roteador VM (OPNsense, pfSense).", + "Você quer passar um HBA diretamente para um TrueNAS / Unraid VM para ZFS em discos nus.", + "Você está planejando usar Coral TPU, uma placa de captura, ou um dongle SDR em um VM." + ], + "whoOutro": "Se nada disso se aplicar, você pode ignorar esta opção com segurança. Para passagem para um LXC (não um VM), o IOMMU não é necessário.", + "doesTitle": "O que o ProxMenux faz", + "doesIntro": "A função está ciente de boot-loader: detecta se Proxmox está em ZFS (systemd-boot) ou LVM/ext4 (GRUB) e escreve para o arquivo direito. Também é idempotente — se os parâmetros já estão presentes, nada é adicionado.", + "headerBoot": "Tipo de arranque", + "headerFile": "Ficheiro alterado", + "headerPost": "Passo de pós- atualização", + "bootRows": [ + { + "boot": "systemd-boot (ZFS)", + "file": "/etc/kernel/cmdline", + "post": "proxmox-boot-tool refresh" + }, + { + "boot": "GRUB (LVM/ext4)", + "file": "/etc/default/grub", + "post": "update-grub" + } + ], + "kernelIntro": "Parâmetros do kernel adicionados:", + "modulesIntro": "Módulos de kernel adicionados ao /etc/modules:", + "blacklistIntro": "Conflitantes drivers na lista negra em /etc/modprobe.d/blacklist.conf:", + "blacklistTitle": "A lista negra de drivers GPU entra em conflito com o uso do GPU no lado do host", + "blacklistBody": "A lista de bloqueio impede o kernel do host de associar qualquer controlador GPU, permitindo ao VFIO assumir a GPU. É o pretendido para passthrough a uma VM, mas é o oposto do necessário para instalar controladores NVIDIA no host, por exemplo para transcodificação LXC. Escolha um caminho por GPU:", + "pathItems": [ + "GPU → VM: habilite VFIO/IOMMU aqui, deixe os drivers GPU na lista negra.", + "GPU → LXC (ou host): ignore esta opção, use a instalação NVIDIA no host e não bloqueie nvidia/nouveau.", + "Dois GPUs: um pode ir para um VM e o outro para um LXC, mas você precisará de uma configuração mais fina (ligar apenas um cartão para vfio-pci por ID PCI). A lista negra padrão é muito ampla para este caso — edite blacklist.conf depois." + ], + "acsTitle": "Sobre o pcie_acs_override — saiba o que está habilitando", + "acsBody": "pcie_acs_override=downstream,multifunction relaxa a verificação dos Serviços de Controle de Acesso PCIe. Ele permite que o kernel divida grupos IOMMU que o firmware reporta como monolítico, que às vezes é a única maneira de passar através de um dispositivo de um grupo sem arrastar o resto. O trade-off é o isolamento reduzido entre dispositivos: um VM malicioso ou comprometido com passagem tem uma superfície de ataque maior via DMA. Tudo bem para um laboratório doméstico; pense duas vezes antes de habilitar um host que executa cargas de trabalho não confiáveis. Se você não precisar, remova esse token do /etc/kernel/cmdline ou /etc/default/grub após o script correr e execute novamente a etapa de atualização do carregador de inicialização.", + "rebootTitle": "Reinício necessário", + "rebootBody": "IOMMU, módulos VFIO e lista de bloqueio entram em vigor após regenerar initramfs e reiniciar. O script executa update-initramfs -u -k all, atualiza o carregador de arranque e indica «reinício necessário» para que Personalizável o proponha no fim.", + "verifyTitle": "Verificação após reiniciar", + "revertTitle": "Reversível do menu Desinstalar", + "revertBody": "Desinstalar otimizações reverte todas as alterações: remove os parâmetros IOMMU de /etc/kernel/cmdline ou GRUB, os módulos VFIO de /etc/modules e as entradas de bloqueio dos controladores, depois reconstrói initramfs. É necessário reiniciar para aplicar a reversão." + }, + "related": { + "heading": "Relacionado", + "items": [ + { + "label": "Adicionar GPU à VM (passthrough)", + "href": "/docs/hardware/gpu-vm-passthrough", + "tail": " — passo seguinte natural uma vez activado o IOMMU + VFIO." + }, + { + "label": "Adicionar Controlador ou NVMe ao VM", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "tail": " — a mesma infra-estrutura de passagem para os controladores de armazenamento." + }, + { + "label": "Comandos de passagem GPU", + "href": "/docs/help-info/gpu-commands", + "tail": " — Referência da verificação IOMMU." + }, + { + "label": "Desinstalar otimizações", + "href": "/docs/post-install/uninstall", + "tail": " — reverter IOMMU / VFIO de forma limpa." + }, + { + "label": "Pós-instalação personalizável", + "href": "/docs/post-install/customizable", + "tail": " — voltar ao menu superior." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/automated.json b/web/messages/sk/docs/post-install/automated.json new file mode 100644 index 00000000..6a2b395f --- /dev/null +++ b/web/messages/sk/docs/post-install/automated.json @@ -0,0 +1,172 @@ +{ + "meta": { + "title": "Automatický skript po inštalácii | Dokumentácia ProxMenux", + "description": "Automatický skript ProxMenux po inštalácii vykoná na novom hostiteľovi Proxmox VE 14 vopred určených optimalizácií podľa hardvéru. Nemá zoznam funkcií na výber, no môže žiadať potvrdenie odstránenia upozornenia na predplatné, niektorých inštalácií Log2RAM a reštartu. Vratné zmeny sa zaznamenajú na neskoršiu obnovu.", + "ogTitle": "Automatický skript po inštalácii | Dokumentácia ProxMenux", + "ogDescription": "14 vopred určených optimalizácií podľa hardvéru pre nový hostiteľ Proxmox VE, s potvrdením niektorých krokov a záznamom vratných zmien." + }, + "header": { + "title": "Automatický skript po inštalácii", + "description": "ProxMenux vykoná 14 vopred určených základných optimalizácií bez zoznamu funkcií na výber. Niektoré kroky žiadajú potvrdenie. Vratné zmeny sa zaznamenajú pre Odinštalovať optimalizácie; aktualizácie balíkov sa neoznačujú za vratné.", + "section": "Po inštalácii · Automatizovaná" + }, + "intro": { + "title": "Kedy vybrať automatizované", + "body": "Spustite ho na čerstvo nainštalovanom hostiteľovi Proxmox, ak chcete rozumné základné nastavenie bez výberu každej funkcie. Skript je idempotentný: opakované spustenie znovu použije rovnakú konfiguráciu. Voliteľné funkcie (Fastfetch, IOMMU, repozitár Ceph, HA, opravy AMD…) zámerne nie sú súčasťou tohto postupu; v prípade potreby ich vyberte v Prispôsobiteľné." + }, + "applies": { + "heading": "Čo skript nastaví", + "intro": "Optimalizácia sa uplatňuje v tomto presnom poradí. Stĺpec Kategória odkazuje na podrobnú dokumentáciu každej zmeny v prispôsobiteľnom odkaze.", + "headerNum": "#", + "headerTool": "Nástroj", + "headerWhat": "Čo to robí?", + "headerCategory": "Kategória" + }, + "optimizations": [ + { + "tool": "Repozitáre APT + úplná aktualizácia", + "what": "Zakáže podnikové zdroje pve-enterprise.sources a ceph.sources, vytvorí čistý zdroj no-subscription pre kódový názov Debianu na hostiteľovi a spustí apt update && apt full-upgrade -y, čo je oficiálny príkaz Proxmoxu na aktualizáciu.", + "category": "Základné nastavenia", + "categorySlug": "basic-settings" + }, + { + "tool": "Odstránenie upozornenia na predplatné", + "what": "Upraví webové rozhranie, aby skrylo upozornenie „Žiadne platné predplatné“. Pred použitím žiada potvrdenie; zmenu možno vrátiť cez Odinštalovať optimalizácie.", + "category": "Prispôsobenie", + "categorySlug": "customization" + }, + { + "tool": "Vynútiť IPv4", + "what": "Zapíše /etc/apt/apt.conf.d/99-force-ipv4, aby apt používal iba IPv4 a obišiel nestabilné IPv6 spojenia so zrkadlami.", + "category": "Sieť", + "categorySlug": "network" + }, + { + "tool": "Preskočiť jazykové balíky", + "what": "Zapíše /etc/apt/apt.conf.d/99-disable-translations, aby sa nesťahovali indexy preložených opisov balíkov a znížil sa objem dát pri aktualizáciách apt.", + "category": "Základné nastavenia", + "categorySlug": "basic-settings" + }, + { + "tool": "Zvýšiť systémové limity", + "what": "Zvýši počet sledovaní inotify, limity nofile/nproc, limity zväzku kľúčov jadra a fs.file-max cez sysctl.d, limits.d, pam a systemd na hodnoty vhodné pre hostiteľov s mnohými kontajnermi.", + "category": "Systém", + "categorySlug": "system" + }, + { + "tool": "Ladenie pamäte", + "what": "Nastaví vm.swappiness=10, vyvážené podiely zmenených nezapísaných stránok, vm.max_map_count=262144 a proaktívnu kompaktáciu, ak je podporovaná. Politika prideľovania pamäte nad dostupnú kapacitu zostáva na predvolenej hodnote Proxmoxu.", + "category": "Systém", + "categorySlug": "system" + }, + { + "tool": "Správanie pri panike jadra", + "what": "Nastaví reštart hostiteľa 10 sekúnd po panic / oops / hardlockup namiesto neobmedzeného zamrznutia.", + "category": "Systém", + "categorySlug": "system" + }, + { + "tool": "Ladenie sieťového zásobníka", + "what": "Veľkosti vyrovnávacích pamätí TCP, posilnenie IPv4 (vypnuté presmerovania, rp_filter=2, vypnuté logovanie martian), lokálne porty 1024-65535, zisťovanie MTU TCP, RFC 1337 a skript /usr/local/sbin/proxmenux-fwbr-tune spúšťaný jednorazovou jednotkou systemd a pravidlom udev. Tým sa rp_filter=0 / log_martians=0 opätovne nastavia na fwbr*/fwln*/fwpr*/tap* vždy, keď ich Proxmox znovu vytvorí pri štarte/zastavení VM, reštarte alebo živej migrácii.", + "category": "Sieť", + "categorySlug": "network" + }, + { + "tool": "Prispôsobenie bashrc (root)", + "what": "Farebné PS1, bežné aliasy (l/la/ll/ls/grep), história s časovými značkami a načítanie bash-completion, všetko v ohraničenom bloku PMX_CORE_BASHRC na jednoduché odstránenie.", + "category": "Prispôsobenie", + "categorySlug": "customization" + }, + { + "tool": "Log2RAM (prispôsobené pre SSD, automatické)", + "what": "Znižuje opotrebenie SSD/NVMe presunom /var/log na ramdisk tmpfs s pravidelnou synchronizáciou na disk. Inštalácia z pôvodného projektu pri koreňovom disku SSD alebo NVMe. Veľkosť podľa RAM hostiteľa (128M / 256M / 512M), pravidelná synchronizácia a ochrana, ktorá pri 80% zaplnení vyčistí staré žurnály a pri 92% skráti rýchlo rastúce logy pred zápisom. Limity journald prispôsobí ramdisku. Podrobnosti v Log2RAM.", + "category": "Úložisko", + "categorySlug": "storage" + }, + { + "tool": "Autotrim ZFS (iba SSD)", + "what": "Zapne zpool autotrim=on v každom poole ZFS, ktorého všetky vdev sú SSD/NVMe s podporou TRIM (kontroluje /sys/block/[dev]/queue/rotational a discard_granularity). Pooly s HDD automaticky vynechá. Na odinštalovanie zaznamená iba pooly skutočne zmenené cez ProxMenux; ručne zapnutý autotrim ponechá.", + "category": "Úložisko", + "categorySlug": "storage" + }, + { + "tool": "Limity veľkosti journald", + "what": "Vynúti trvalé ukladanie, obmedzí SystemMaxUse=64M / RuntimeMaxUse=60M, zapne kompresiu a logovanie úrovne info potrebné pre Monitor. Pri aktívnom Log2RAM sa vynechá, pretože ten vykonáva vlastné úpravy.", + "category": "Systém", + "categorySlug": "system" + }, + { + "tool": "Ladenie logrotate", + "what": "Globálne nastaví daily a potom size 10M, uchová 7 rotácií a zapne kompresiu aj copytruncate. Neskoršie veľkostné kritérium má prednosť; pravidlá konkrétnych logov ho môžu prepísať. Vhodné pre Log2RAM, no frekvencia závisí od pravidiel a časovača.", + "category": "Systém", + "categorySlug": "system" + }, + { + "tool": "Trvalé názvy rozhraní", + "what": "Pre každú fyzickú sieťovú kartu zapíše /etc/systemd/network/10-proxmenux-<iface>.link s hlavičkou „Managed by ProxMenux“, ktorý priradí MAC k aktuálnemu názvu. Názvy eth0 / enp… zostanú stabilné po reštarte aj pridaní kariet.", + "category": "Sieť", + "categorySlug": "network" + } + ], + "hardwareTitle": "Predvolené hodnoty podľa hardvéru", + "hardwareBody": "Skript pred nastavením preskúma hardvér hostiteľa. Log2RAM sa predvolene inštaluje iba pri koreňovom disku SSD alebo NVMe; pri inej detekcii žiada potvrdenie. Veľkosť ramdisku sa vyberá podľa celkovej RAM (≤ 8 GB → 128M, ≤ 16 GB → 256M, '>' 16 GB → 512M). Pri aktívnom Log2RAM sa limity journald prispôsobia ramdisku, aby sa nezaplnil.", + "upgrade": { + "heading": "Aktualizovať systém", + "intro": "Prvým krokom automatického postupu je aktualizácia Proxmoxu. Oficiálny návod pre bežiaci hostiteľ v rámci rovnakej hlavnej verzie odporúča spustiť:", + "after": "Tento riadok je oficiálny príkaz pre aktuálne verzie Proxmoxu. Automatický skript vykoná presne tento príkaz a pridá čistenie repozitárov a kroky po aktualizácii podľa oficiálneho návodu — rovnako ako samostatný nástroj Aktualizácia systému Proxmox:", + "items": [ + "Zakáže podnikové zdroje pve-enterprise.sources / ceph.sources, odstráni staré súbory repozitárov a zapíše čistý zdroj bez predplatného pre kódový názov distribúcie hostiteľa.", + "Spustí inováciu neinteraktívne pomocou DEBIAN_FRONTEND=noninteractive a --force-confdef --force-confold – konfiguračné súbory, ktoré ste si prispôsobili, zostanú vaše, aj keď ich upstream zmení.", + "Nainštaluje základné balíky Proxmox, ak chýbajú (zfsutils-linux, proxmox-backup-restore-image, chrony).", + "Kontrola konzistentnosti metadát LVM, apt-get autoremove -y + apt-get autoclean -y a výzva na reštart iba pri zmene jadra." + ], + "sameTitle": "Rovnaká aktualizácia, dva vstupné body", + "sameBody": "Automatický postup a samostatný nástroj Aktualizácia systému Proxmox používajú rovnaké skripty (update-pve8.sh / update-pve9_2.sh). Samostatný nástroj použite, ak chcete iba aktualizovať hostiteľa bez ostatných optimalizácií." + }, + "endResult": { + "heading": "Očakávaný konečný výsledok", + "body": "Po skončení uvidíte správu o úspechu s výstupmi jednotlivých krokov a výzvu na reštart, ktorý vyžadujú niektoré nastavenia jadra. Reštart môžete odložiť; nastavenia sa prejavia pri ďalšom štarte.", + "imageAlt": "Automatický skript po inštalácii – konečný výstup terminálu zobrazujúci každú úspešne aplikovanú optimalizáciu" + }, + "notDoes": { + "heading": "Čo tento skript nerobí", + "items": [ + "Automatické zistenie časového pásma (v pôvodnom skripte je zakomentované; v prípade potreby použite Prispôsobiteľné).", + "Zakázať portmapper / rpcbind (pozri Zabezpečenie).", + "Povoliť IOMMU / VFIO (pozri Virtualizácia).", + "Nainštalovať Fastfetch / Figurine / repozitár Ceph / HA / opravy CPU AMD (pozri Voliteľné).", + "Nainštalovať pigz alebo naladiť ZFS ARC (pozri Výkon / Úložisko)." + ] + }, + "xshokTitle": "Detekcia xshok-proxmox", + "xshokBody": "Ak hostiteľ už spustil skript xshok-proxmox, ProxMenux rozpozná súbor označenia a pred pokračovaním vás upozorní. Niektoré úpravy sa môžu prekrývať. Doplnkový skript je zastaraný; ak napriek tomu pokračujete, prečítajte si prehľad so súvislosťami.", + "revert": { + "heading": "Vrátenie", + "body": "Každý nástroj v tabuľke sa zaznamená v /usr/local/share/proxmenux/installed_tools.json. Otvorte Odinštalovať optimalizácie a vyberte položky na obnovu. Zálohy zmenených súborov sú vedľa originálov s príponou .bak." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — Vyberte si presne to, čo chcete z rovnakého katalógu." + }, + { + "label": "Odinštalovať optimalizácie", + "href": "/docs/post-install/uninstall", + "tail": " — vráťte vybrané zmeny z tohto postupu späť." + }, + { + "label": "Užitočné systémové príkazy", + "href": "/docs/help-info/system-commands", + "tail": " — overte zmeny (uptime, free, journalctl atď.)." + }, + { + "label": "Prehľad po inštalácii", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/basic-settings.json b/web/messages/sk/docs/post-install/basic-settings.json new file mode 100644 index 00000000..7ae6b83e --- /dev/null +++ b/web/messages/sk/docs/post-install/basic-settings.json @@ -0,0 +1,240 @@ +{ + "meta": { + "title": "Po inštalácii: Základné nastavenia | Dokumentácia ProxMenux", + "description": "Základné možnosti po inštalácii: prechod na repozitáre Proxmox bez predplatného a aktualizácia systému, zistenie časového pásma a zapnutie NTP, vynechanie prekladov APT a výber z 25 bežných systémových nástrojov na inštaláciu." + }, + "header": { + "title": "Po inštalácii: Základné nastavenia", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo táto kategória zahŕňa", + "body": "Päť základných možností pre nový hostiteľ Proxmox: prejsť na komunitné repozitáre bez predplatného, plne aktualizovať systém, automaticky nastaviť časové pásmo a NTP, vypnúť preklady APT na úsporu šírky pásma a disku a vybrať z 25 bežných nástrojov." + }, + "upgrade": { + "heading": "Aktualizovať systém", + "intro": "Nastaví APT na bezplatný repozitár pve-no-subscription namiesto repozitára Enterprise s predplatným a plne aktualizuje systém. Presné kroky závisia od hlavnej verzie Proxmox VE; ProxMenux ju zistí a spustí správny skript.", + "headerVersion": "PVE verzia", + "headerScript": "Skript výberu podľa verzie", + "headerCodename": "Kódové meno Debianu", + "rows": [ + { + "version": "9.x", + "script": "update-pve9_2.sh", + "codename": "trixie" + }, + { + "version": "8.x", + "script": "update-pve8.sh", + "codename": "bookworm" + } + ], + "officialTitle": "Oficiálne odporúčanie pre Proxmox", + "officialBody": "Oficiálny návod Proxmox odporúča tieto príkazy v presnom poradí:", + "officialOutro": "Toto je bežný príkaz pre aktualizácie v rámci nainštalovanej hlavnej verzie Proxmox VE. Skontrolujte repozitáre a navrhované zmeny balíkov pred pokračovaním. Prechod na inú hlavnú verziu vyžaduje oficiálny migračný postup.", + "doesTitle": "Čo robí možnosť ProxMenux — overené podľa skriptu", + "doesIntro": "Aktualizácia ProxMenux vykoná uvedené príkazy apt a pridá prípravné aj záverečné kroky, na ktoré by ste inak museli myslieť sami. Nasledujúce položky zodpovedajú výberovému skriptu; podrobnosti sú v Aktualizácia systému Proxmox.", + "doesItems": [ + "Najprv poriadok v repozitároch. Zakáže podnikové zdroje pve-enterprise.sources / ceph.sources, odstráni staré súbory repozitárov z predchádzajúcich verzií PVE a vytvorí čistý proxmox.sources s bezplatným kanálom pve-no-subscription podľa kódového názvu Debianu na hostiteľovi: trixie pre PVE 9, bookworm pre PVE 8.", + "Prepíše repozitáre Debian s main / updates / security a non-free-firmware, aby počas aktualizácie zmizlo upozornenie na firmvér.", + "Spustí oficiálnu aktualizáciu. apt-get update a potom apt full-upgrade -y (PVE 9) alebo apt dist-upgrade -y (PVE 8), neinteraktívne s --force-confdef --force-confold na zachovanie upravených konfiguračných súborov.", + "Nainštaluje základné balíky, ak chýbajú: zfsutils-linux, proxmox-backup-restore-image, chrony.", + "Skontroluje metadáta LVM. Hľadá VM s priamo priradenými diskami, ktoré mohli na surové disky zapísať staré hlavičky fyzických zväzkov. Upozorní na nezrovnalosti bez automatickej opravy.", + "Potom vyčistí: apt-get autoremove -y + apt-get autoclean -y, potom vyzve na reštart, ak jadro bolo aktualizované alebo /var/run/reboot-required je prítomný." + ], + "shortTitle": "Stručne povedané", + "shortBody": "Možnosť spustí odporúčaný príkaz apt update && apt full-upgrade -y, doplní úpravu repozitárov a záverečné čistenie uvedené v oficiálnom návode a ponúkne reštart. Pozrite Aktualizácia systému Proxmox s celým diagramom; rovnaký aktualizátor je samostatne dostupný v hlavnom menu.", + "subTitle": "Nepoužívajte na hostiteľovi s predplatným", + "subBody": "Ak máte predplatné Proxmox a chcete ponechať repozitáre Enterprise, túto možnosť vynechajte. Zakáže Enterprise a prepne hostiteľa na komunitný kanál. Aktualizácia balíkov ani prepísanie repozitárov sa nedajú vrátiť cez Odinštalovať optimalizácie. Neskoršiu zmenu kanála musíte vykonať úpravou konfigurácie repozitárov.", + "safetyTitle": "Bezpečnostná kontrola po aktualizácii", + "safetyBody": "Po aktualizácii skript hľadá staré metadáta fyzických zväzkov (PV) na diskoch. Môže k tomu dôjsť, keď VM s priamo priradeným diskom zapíše hlavičky LVM na surový disk. Pri podozrivom náleze zobrazí upozornenie a navrhne kontrolu cez pvs. Automaticky nič nemení." + }, + "time": { + "heading": "Automaticky synchronizovať čas", + "intro": "Zistí verejnú IP adresu servera cez dig myip.opendns.com @resolver1.opendns.com, potom z ipapi.co/'{'ip'}'/timezone získa zodpovedajúce časové pásmo IANA a nastaví ho cez timedatectl set-timezone. Nakoniec zapne NTP cez timedatectl set-ntp true.", + "depTitle": "Závisí od dvoch externých služieb", + "depBody": "Vyhľadávanie závisí od dostupnosti OpenDNS a ipapi.co a od správnosti ich odpovedí. Ak spustíte Proxmox za VPN alebo na VLAN, ktorá vychádza z iného regiónu, automaticky zistené časové pásmo môže byť nesprávne. V takom prípade preskočte túto možnosť a nastavte časové pásmo ručne:", + "revertTitle": "Reverzibilné z menu Odinštalovať", + "revertBody": "Odinštalovanie optimalizácií obnoví časové pásmo na UTC (bezpečné predvolené nastavenie). Nezakáže NTP – vaše hodiny sa neustále synchronizujú, len sú ukotvené na UTC, kým manuálne nenastavíte nové časové pásmo." + }, + "languages": { + "heading": "Nesťahovať ďalšie jazyky", + "intro": "Počas apt update môže APT okrem hlavných metadát sťahovať aj preklady opisov balíkov. Možnosť ich vypne na úsporu šírky pásma a miesta. Predtým ProxMenux overí, že miestne nastavenie hostiteľa je vygenerované: prečíta /etc/default/locale alebo /etc/environment, podľa potreby doplní /etc/locale.gen a spustí locale-gen. Miestne nastavenie shellu sa tak zachová.", + "writtenTitle": "Čo sa napíše", + "revertTitle": "Reverzibilné z menu Odinštalovať", + "revertBody": "Odstraňovanie /etc/apt/apt.conf.d/99-disable-translations (buď manuálne, alebo z menu Odinštalovať) obnoví štandardné správanie a APT znovu stiahne jazykové súbory." + }, + "utilities": { + "heading": "Nainštalovať bežné systémové nástroje", + "intro": "Otvorí zoznam 25 vybraných nástrojov rozdelených do skupín. Vyberiete požadované nástroje a potvrdíte výber. ProxMenux ich nainštaluje cez apt, overí fungovanie balíkov a na konci zobrazí súhrn.", + "imageAlt": "Výber systémových nástrojov ProxMenux: medzerník vyberá, Enter potvrdzuje", + "reuseTitle": "Rovnaký zoznam je opätovne použitý inde", + "reuseBody": "Katalóg 25 nástrojov má jedinú definíciu: PROXMENUX_UTILS v scripts/global/utils-install-functions.sh. Menu Pomôcky a nástroje → Systémové nástroje ponúka rovnaký zoznam na neskoršie inštalácie bez opakovania nastavení po inštalácii.", + "listTitle": "Čo je v zozname?", + "groups": [ + { + "group": "Monitory systému", + "items": [ + { + "pkg": "htop", + "desc": "Interaktívny prehliadač procesov" + }, + { + "pkg": "btop", + "desc": "Moderný monitor zdrojov (CPU, RAM, disky, sieť, procesy)" + }, + { + "pkg": "s-tui", + "desc": "Terminálové rozhranie na záťažové testy a sledovanie CPU" + }, + { + "pkg": "iftop", + "desc": "Využitie šírky pásma pre každé spojenie v reálnom čase" + }, + { + "pkg": "iotop", + "desc": "Diskové I/O podľa procesu" + }, + { + "pkg": "iptraf-ng", + "desc": "Interaktívny monitor IP LAN" + } + ] + }, + { + "group": "Sieť", + "items": [ + { + "pkg": "iperf3", + "desc": "Meranie maximálnej dosiahnuteľnej šírky pásma medzi hostiteľmi" + }, + { + "pkg": "net-tools", + "desc": "Staršie nástroje (ifconfig, netstat, route). Stále užitočné na rýchle kontroly" + }, + { + "pkg": "ipset", + "desc": "Spravuje veľké množiny IP adries v jadre — užitočné pre pravidlá iptables/nftables" + } + ] + }, + { + "group": "Sťahovanie a archívy", + "items": [ + { + "pkg": "axel", + "desc": "Nenáročný akcelerátor paralelného sťahovania" + }, + { + "pkg": "aria2", + "desc": "Sťahovanie z viacerých zdrojov a cez viac protokolov (HTTP, FTP, BitTorrent, Metalink)" + }, + { + "pkg": "unzip", + "desc": "Rozbaliť archívy ZIP" + }, + { + "pkg": "zip", + "desc": "Vytvoriť ZIP archívy" + }, + { + "pkg": "cabextract", + "desc": "Rozbaliť archívy Microsoft CAB (užitočné pri súboroch ISO systému Windows)" + }, + { + "pkg": "wimtools", + "desc": "Manipulovať obrazy Windows WIM (extrahovať, rozdeliť, pripojiť, použiť)" + }, + { + "pkg": "genisoimage", + "desc": "Vytvárať obrazy ISO 9660 z adresára" + } + ] + }, + { + "group": "Text a súbory", + "items": [ + { + "pkg": "dos2unix", + "desc": "Previesť koncovky riadkov CRLF (Windows) na LF (Unix)" + }, + { + "pkg": "grc", + "desc": "Univerzálne farebné zvýraznenie výstupu príkazov ping, traceroute, dig, tail a ďalších" + }, + { + "pkg": "plocate", + "desc": "Rýchle indexované vyhľadávanie súborov. Po inštalácii spustite updatedb na vytvorenie indexu" + } + ] + }, + { + "group": "Vzdialený prístup a relácie", + "items": [ + { + "pkg": "sshpass", + "desc": "Neinteraktívne overenie SSH heslom (užitočné pre skripty, nie na každodenné používanie)" + }, + { + "pkg": "tmux", + "desc": "Terminálový multiplexer: odpojenie relácií, rozdelenie panelov a zachovanie relácií pri strate spojenia" + } + ] + }, + { + "group": "Hardvér a nízkoúrovňové nástroje", + "items": [ + { + "pkg": "msr-tools", + "desc": "Čítať a zapisovať registre špecifické pre model CPU (rdmsr, wrmsr)" + }, + { + "pkg": "intel-gpu-tools", + "desc": "Intel GPU diagnostické pomôcky vrátane `intel_gpu_top`" + } + ] + }, + { + "group": "Virtualizácia", + "items": [ + { + "pkg": "libguestfs-tools", + "desc": "Kontrolovať a upravovať obrazy diskov VM (virt-ls, virt-cat, guestmount…)" + }, + { + "pkg": "chntpw", + "desc": "Upravovať Windows SAM (užitočné na obnovenie hesiel v prevzatých Windows VM)" + } + ] + } + ], + "actionTitle": "Niekoľko z nich v akcii", + "noBulkTitle": "Odstránia sa iba nástroje nainštalované cez ProxMenux", + "noBulkBody": "ProxMenux zaznamenáva iba vybrané balíky, ktoré ešte neboli nainštalované. Voľba Odinštalovať optimalizácie ich úplne odstráni a ponechá pôvodné balíky. Aktualizácie APT nemajú bezpečný atómový návrat späť: odinštalovanie nástrojov nevráti aktualizáciu systému." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Aktualizácia systému Proxmox", + "href": "/docs/utils/system-update", + "tail": " — Na požiadanie zopakuje cyklus apt update + dist-upgrade." + }, + { + "label": "Inštalátor systémových nástrojov", + "href": "/docs/utils/system-utils", + "tail": " — Nainštalovať alebo preinštalovať jednotlivé nástroje aj po nastavení po inštalácii." + }, + { + "label": "Príkazy na aktualizácie a balíky", + "href": "/docs/help-info/update-commands", + "tail": " — Prehľad apt pre shell." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/customizable.json b/web/messages/sk/docs/post-install/customizable.json new file mode 100644 index 00000000..cbc7d261 --- /dev/null +++ b/web/messages/sk/docs/post-install/customizable.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Prispôsobiteľný skript po inštalácii | Dokumentácia ProxMenux", + "description": "Vyberte presne tie optimalizácie, ktoré má ProxMenux použiť na hostiteľovi Proxmox VE. 10 kategórií, približne 35 nástrojov a výber pomocou zaškrtávacích políčok. Obsahuje všetko z automatizovaného skriptu aj voliteľné funkcie (IOMMU, Fastfetch, Figurine, Ceph, HA, opravy AMD…).", + "ogTitle": "Prispôsobiteľný skript po inštalácii | Dokumentácia ProxMenux", + "ogDescription": "10 kategórií, približne 35 jednotlivých optimalizácií. Vyberte presne to, čo chcete na hostiteľovi Proxmox VE. Vratné zmeny sa zaznamenávajú." + }, + "header": { + "title": "Prispôsobiteľný post-inštalačný skript", + "description": "Vyberte presne tie optimalizácie, ktoré chcete použiť na hostiteľovi Proxmox VE. ProxMenux zoskupuje približne 35 nástrojov do 10 kategórií v jednom výberovom dialógu. Rovnaký základ ako Automatizované, ale s úplnou kontrolou nad použitými zmenami.", + "section": "Po inštalácii · Prispôsobiteľné" + }, + "intro": { + "title": "Kedy vybrať prispôsobiteľné", + "body": "Vyberte túto cestu, ak už poznáte požadované alebo nechcené úpravy hostiteľa. Výberový zoznam zoskupený podľa kategórií umožňuje vopred vyberať, rušiť výber a kombinovať optimalizácie. Položky možno neskôr použiť znovu a vratné zmeny sa zaznamenávajú pre Odinštalovať optimalizácie. Aktualizácie balíkov sa neuvádzajú ako vratné." + }, + "compare": { + "heading": "Ako sa porovnáva s Automatizovaným", + "body": "Prispôsobiteľné obsahuje celý automatizovaný skript: rovnakých 14 základných optimalizácií a množstvo voliteľných položiek, ktoré Automatizované zámerne vynecháva. Sú užitočné pre konkrétny hardvér (opravy AMD), hosting (OVH RTM) alebo záťaže (IOMMU/VFIO, repozitár Ceph, vysoká dostupnosť, Fastfetch, Figurine, ladenie ARC ZFS, pigz, automatické snímky ZFS, rýchlostné limity vzdump, Open vSwitch, TCP BBR…)." + }, + "categoriesSection": { + "heading": "10 kategórií", + "body": "Prispôsobiteľný skript zoskupuje optimalizácie do 10 kategórií v jednom výberovom dialógu. Každá kategória má vlastnú stránku dokumentácie — otvorte kartu nižšie pre zdôvodnenie, predvolené hodnoty a overovacie kroky jednotlivých možností." + }, + "categories": [ + { + "name": "Základné nastavenia", + "description": "Vyčistí zdroje APT, spustí oficiálnu aktualizáciu Proxmox a nastaví časové pásmo, miestne nastavenia a bežné nástroje. Základ všetkých ostatných skupín." + }, + { + "name": "Systém", + "description": "Vyladí záznamový subsystém a limity jadra pre hostiteľa s mnohými VM a kontajnermi. Zahŕňa journald, logrotate, sysctl (pamäť, limity súborov), správanie pri kernel panic a rýchle reštarty." + }, + { + "name": "Virtualizácia", + "description": "Pripraví hostiteľa na pokročilú virtualizáciu. Nainštaluje zodpovedajúceho hosťovského agenta, ak samotný Proxmox beží v podporovanej VM, a povolí IOMMU/VFIO na priame priradenie PCI zariadení GPU, radičov a TPU." + }, + { + "name": "Sieť", + "description": "Posilní a vyladí sieťový stack hostiteľa. Vynúti IPv4 pre APT, použije bezpečnostné nastavenia sysctl a ladenie vyrovnávacích pamätí TCP, ponúkne Open vSwitch, TCP BBR a TCP Fast Open a priradí trvalé názvy rozhraní k MAC adresám." + }, + { + "name": "Úložisko", + "description": "Nastaví bežné úložné subsystémy Proxmox: veľkosť ARC ZFS, automatické snímky ZFS, autotrim ZFS pre pooly SSD/NVMe a rýchlostné limity vzdump proti vyťaženiu diskov pri zálohovaní." + }, + { + "name": "Zabezpečenie", + "description": "Zmenší predvolene vystavenú útočnú plochu. Vypne služby RPC portmapper/rpcbind, ktoré Proxmox nepotrebuje, ale ponecháva načúvať." + }, + { + "name": "Prispôsobenie", + "description": "Zmení vzhľad a prostredie shellu hostiteľa: farby a aliasy v bashrc, banner MOTD a odstránenie upozornenia na predplatné vo webovom rozhraní." + }, + { + "name": "Monitorovanie", + "description": "Integruje hostiteľa s OVH Real-Time Monitoring. RTM sa nainštaluje iba pri zistení servera OVH; na iných hostiteľoch možnosť nič nemení." + }, + { + "name": "Výkon", + "description": "Zrýchli kompresiu pri zálohách a prenosoch nahradením gzip jeho paralelnou alternatívou pigz." + }, + { + "name": "Voliteľné", + "description": "Špecializované možnosti, ktoré nepotrebuje každý hostiteľ: opravy CPU AMD, banner Fastfetch, 3D názov hostiteľa Figurine, aktualizácia indexu PVE Appliance Manager, repozitár Ceph, služby vysokej dostupnosti, Log2RAM na zníženie opotrebenia SSD a swapový profil ZRAM." + } + ], + "mixTip": { + "title": "Kombinujte Automatizované a Prispôsobiteľné", + "body": "Bežný postup: najprv spustite Automatizované pre rozumné základné nastavenia, potom otvorte Prispôsobiteľné a vyberte iba potrebné voliteľné nástroje, napríklad IOMMU pre priame priradenie GPU. Zmeny sa sledujú nezávisle; menu Odinštalovať zobrazí všetko použité bez ohľadu na zvolenú cestu." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Automatizované nastavenia po inštalácii", + "href": "/docs/post-install/automated", + "tail": " — rozumné predvolené nastavenia použité bez otázok." + }, + { + "label": "Odinštalovať optimalizácie", + "href": "/docs/post-install/uninstall", + "tail": " — čisto vrátiť vybrané zmeny." + }, + { + "label": "Základné nastavenia", + "href": "/docs/post-install/basic-settings", + "tail": " — repozitáre, čas, jazyk a nástroje." + }, + { + "label": "Virtualizácia", + "href": "/docs/post-install/virtualization", + "tail": " — IOMMU + VFIO na priame priradenie zariadení." + }, + { + "label": "Zabezpečenie", + "href": "/docs/post-install/security", + "tailRich": " · Úložisko · Sieť · Prispôsobenie — ďalšie kategórie." + }, + { + "label": "Prehľad po inštalácii", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/customization.json b/web/messages/sk/docs/post-install/customization.json new file mode 100644 index 00000000..c26ee7e3 --- /dev/null +++ b/web/messages/sk/docs/post-install/customization.json @@ -0,0 +1,74 @@ +{ + "meta": { + "title": "Po inštalácii: Prispôsobenie | Dokumentácia ProxMenux", + "description": "Možnosti prispôsobenia v prispôsobiteľnom skripte ProxMenux po inštalácii: farebný prompt bash s užitočnými aliasmi, banner ProxMenux v MOTD a odstránenie upozornenia na predplatné z webového rozhrania Proxmox." + }, + "header": { + "title": "Po inštalácii: prispôsobenie", + "description": "Vizuálne a praktické úpravy hostiteľa Proxmox. Spríjemnia používanie shellu a skryjú upozornenie na predplatné vo webovom rozhraní. Bashrc, MOTD aj banner predplatného sa zaznamenávajú a dajú sa obnoviť cez Odinštalovať.", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo táto kategória zahŕňa", + "body": "Tri malé nezávislé možnosti: farebný prompt bash s aliasmi pre shell root, jednoriadkový banner MOTD pri prihlásení cez SSH a odstránenie okna „Žiadne platné predplatné“, ktoré Proxmox zobrazuje pri každom prihlásení do webového rozhrania." + }, + "bashrc": { + "heading": "Prispôsobiť bashrc", + "intro": "Vloží do /root/.bashrc pripravený blok s farebným promptom, históriou s časovými pečiatkami, bežnými aliasmi ls / grep a príkazom source na dopĺňanie bash. Spríjemní prácu cez SSH a pri viacerých otvorených kartách jasne ukáže aktuálneho hostiteľa.", + "writesTitle": "Čo ProxMenux pridáva do .bashrc", + "writesOutro": "Blok je ohraničený značkami PMX_CORE_BASHRC. Opätovné spustenie nahradí predchádzajúci blok bez duplikovania. Pôvodný .bashrc sa raz zálohuje do /root/.bashrc.bak a do /root/.bash_profile sa pridá riadok source /root/.bashrc, aby sa prompt použil aj v prihlasovacích shelloch, napríklad po su -.", + "rootTitle": "Platí iba pre root", + "rootBody": "Prispôsobenie sa týka shellu účtu root. Ostatní používatelia hostiteľa si ponechajú svoje predvolené nastavenia. Ak spravujete Proxmox výhradne cez webové rozhranie a shell nepoužívate, túto čisto estetickú možnosť môžete vynechať." + }, + "motd": { + "heading": "Nastaviť vlastnú MOTD správu", + "intro": "Pridá \"This system is optimised by: ProxMenux\" na začiatok /etc/motd, správy po úspešnom prihlásení cez SSH, nad promptom a pred skriptmi update-motd. Neškodné a čisto informatívne — rýchle vizuálne potvrdenie použitia ProxMenux na hostiteľovi.", + "writesTitle": "Čo píše ProxMenux", + "writesOutro": "Pri prvom použití ProxMenux zaznamená, či /etc/motd existoval, a uloží pôvodný obsah pod /usr/local/share/proxmenux. Operácia je idempotentná: ak riadok so značkou už existuje, nič sa nepridá. Staršie inštalácie s /etc/motd.bak sa prevedú do rovnakého vratného stavu." + }, + "banner": { + "heading": "Odstrániť hlásenie o predplatnom", + "intro": "Odstráni okno „Nemáte platné predplatné pre tento server“, ktoré sa zobrazuje pri každom prihlásení do webového rozhrania Proxmox bez predplatného Enterprise. ProxMenux zohľadňuje verziu a spustí správny skript pre odlišné balíky rozhrania hlavných verzií.", + "versionTitle": "Výber skriptu podľa verzie", + "versionItems": [ + "PVE 9.x → spúšťa remove-banner-pve-v3.sh (opravuje desktop proxmoxlib.js aj nový mobilný UI založený na Yew).", + "PVE 8.x → spustí remove-banner-pve8.sh (iba pre počítač)." + ], + "versionOutro": "Pred úpravou ProxMenux zálohuje pôvodné súbory JS/šablón do /usr/local/share/proxmenux/backups/ s časovou pečiatkou. Odinštalovanie ich obnoví zo záloh; ak záloha chýba alebo je poškodená, preinštaluje balíky rozhrania Proxmox.", + "breakTitle": "Môže sa zlomiť po aktualizáciách Proxmoxu", + "breakBody": "Aktualizácie rozhrania Proxmox pravidelne prepisujú proxmoxlib.js, takže upozornenie sa môže vrátiť. Túto možnosť môžete použiť znovu na opätovnú úpravu súboru alebo dovtedy ponechať upozornenie. ProxMenux inštaluje aj hook APT na automatické opakovanie úpravy po aktualizácii balíkov — jeho odstránenie opisuje Odinštalovať optimalizácie.", + "legalTitle": "Právne upozornenie (vždy stojí za to zopakovať)", + "legalBody": "Táto možnosť iba skryje upozornenie rozhrania. Neposkytuje podporu Enterprise ani prístup k repozitáru Enterprise a nemení licenciu softvéru. Proxmox VE sa vydáva pod GNU AGPLv3. Predplatné podporuje projekt a umožňuje prístup ku kanálu aktualizácií Enterprise; vyberte si podporu vhodnú pre svoje prostredie." + }, + "verify": { + "heading": "Overenie", + "intro": "Po uplatnení všetkých troch:", + "reversibleTitle": "Všetky tri zmeny prispôsobenia sú sledované", + "reversibleBody": "Odinštalovať optimalizácie obnoví /root/.bashrc, vráti presný obsah MOTD spred ProxMenux alebo súbor odstráni, ak predtým neexistoval, a obnoví upravené súbory rozhrania zo zálohy alebo podľa potreby preinštaluje príslušné balíky Proxmox." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Voliteľné", + "href": "/docs/post-install/optional", + "tail": " — Fastfetch a Figurine, ďalšie vizuálne úpravy." + }, + { + "label": "Zobraziť informácie o verzii", + "href": "/docs/settings/show-version-information", + "tail": " — potvrdí, že prispôsobenia sú registrované ako nainštalované." + }, + { + "label": "Odinštalovať optimalizácie", + "href": "/docs/post-install/uninstall", + "tail": " — obnoviť bashrc, motd a upozornenie na predplatné." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/index.json b/web/messages/sk/docs/post-install/index.json new file mode 100644 index 00000000..af8baf78 --- /dev/null +++ b/web/messages/sk/docs/post-install/index.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Skript po inštalácii Proxmox VE — Automatizovaný a prispôsobiteľný | ProxMenux", + "description": "Prehľad skriptov ProxMenux po inštalácii Proxmox VE. Automatizovaný skript použije rozumné predvolené nastavenia bez otázok. Prispôsobiteľný skript umožní presný výber z 10 kategórií. Odinštalovať optimalizácie obnoví podporované vratné zmeny.", + "ogTitle": "Skript po inštalácii Proxmox VE — Automatizovaný a prispôsobiteľný", + "ogDescription": "Použite bežné optimalizácie po inštalácii Proxmox VE v 10 kategóriách — automaticky alebo podľa výberu, s vratnými možnosťami.", + "twitterTitle": "Skript po inštalácii Proxmox VE | ProxMenux", + "twitterDescription": "Automatizované a prispôsobiteľné optimalizácie po inštalácii Proxmox VE s vratnými možnosťami." + }, + "header": { + "title": "Skripty po inštalácii", + "description": "Nakonfigurujte čerstvo nainštalovaný hostiteľ Proxmox VE pomocou optimalizácií ProxMenux. Automaticky použite základné nastavenia, vyberte jednotlivé možnosti, aktualizujte nainštalované funkcie alebo obnovte podporované vratné zmeny. Aktualizácie balíkov sa neuvádzajú ako vratné.", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Na čo je toto menu", + "body": "Hneď po inštalácii Proxmox VE môžu desiatky drobných zmien zrýchliť hostiteľa a zjednodušiť jeho údržbu: repozitáre bez predplatného, rozumné limity journald a vyrovnávacie pamäte TCP, ukladanie záznamov šetrné k SSD, vylepšenia bashrc a ďalšie. ProxMenux ich automatizuje a sleduje podporované vratné zmeny konfigurácie." + }, + "openingMenu": { + "heading": "Otvorenie menu", + "body": "V hlavnom menu ProxMenux vyberte Nastavenie Proxmoxu po inštalácii. Zobrazí sa toto:", + "imageAlt": "Ponuka Skripty po inštalácii – Automatizované, Prispôsobiteľné, podmienené Použiť dostupné aktualizácie (iba keď čakajú aktualizácie) a Odinštalovať, po ktorej nasleduje sekcia Komunitné skripty" + }, + "threeWays": { + "heading": "Štyri spôsoby, ako uplatniť optimalizáciu", + "body": "Štyri položky ProxMenux používajú rovnaký kód aj register nainštalovaných nástrojov, ale poskytujú rôznu mieru ovládania. Aplikovať dostupné aktualizácie sa zobrazí iba vtedy, keď má aspoň jedna nainštalovaná optimalizácia na disku novšiu verziu než registrovanú. Na čerstvo nakonfigurovanom hostiteľovi zostáva skrytá." + }, + "routes": [ + { + "title": "Automatizované", + "description": "Starostlivo vybraných 14 bezpečných a vždy užitočných optimalizácií, ktoré sa použijú postupne bez otázok. Dobrá predvolená voľba pre väčšinu používateľov.", + "bullets": [ + "Repozitáre bez predplatného + aktualizácia systému", + "Pamäť, jadro, sieťové ladenie", + "Log2RAM (automatické zistenie SSD/NVMe)", + "Journald + limity veľkosti logrotate", + "Trvalé názvy rozhraní" + ] + }, + { + "title": "Prispôsobiteľné", + "description": "Približne 35 jednotlivých optimalizácií v 10 kategóriách. Presne si vyberiete, ktoré sa použijú. Rovnaký základ ako Automatizované, ale s úplnou kontrolou.", + "bullets": [ + "Výberový zoznam so zaškrtávacími políčkami pre každú kategóriu", + "Obsahuje všetko z Automatizované a navyše výslovne voliteľné položky (IOMMU, Fastfetch, Figurine, Ceph, HA, opravy AMD…)", + "Spustite ho ľubovoľne veľakrát — zmeny sú idempotentné" + ] + }, + { + "title": "Aplikovať dostupné aktualizácie", + "description": "Keď má optimalizácia po inštalácii (Log2Ram, nastavenia pamäte, Logrotate…) na disku novšiu verziu než tú registrovanú na hostiteľovi, položka zobrazí iba zmenené optimalizácie. Znovu spustí príslušnú funkciu a aktualizuje register — ničoho iného sa nedotkne.", + "bullets": [ + "Výslovný výber každej optimalizácie, iba zmenených", + "Rovnaký výber je dostupný z prehľadu Monitor", + "Jedno súhrnné oznámenie pri dostupnosti nových aktualizácií" + ] + }, + { + "title": "Odinštalovať optimalizácie", + "description": "Podporované vratné zmeny sa sledujú v registri JSON a majú priradenú funkciu obnovy. Akcie bez bezpečného vrátenia, napríklad úplná aktualizácia balíkov, sú zámerne vylúčené.", + "bullets": [ + "Odhaľuje predtým aplikovanú optimalizáciu automaticky", + "Pre každú položku vyberie správny postup obnovy: obnoví zálohu .bak, ak bola vytvorená, odstráni konfiguračný úryvok sysctl.d, ak nebolo čo zálohovať, alebo znovu nainštaluje pôvodný balík s --force-confnew (napríklad pri upozornení na predplatné)", + "Výzva na reštart podľa potreby (VFIO, trvalé názvy atď.)" + ] + } + ], + "whichTitle": "Ktorý by si si mal vybrať?", + "whichBody": "Pri novej inštalácii Proxmox s rozumnými základnými nastaveniami bez rozhodovania vyberte Automatizované. Ak už poznáte požadované alebo nechcené úpravy: Prispôsobiteľné. Na aktualizáciu iba už použitej optimalizácie s novšou verziou na disku: Aplikovať dostupné aktualizácie. Na čisté vrátenie predchádzajúcich zmien: Odinštalovať optimalizácie. Možnosti možno kombinovať: najprv Automatizované, potom pridať Fastfetch či IOMMU cez Prispôsobiteľné a neskôr vrátiť jednotlivé položky.", + "mixing": { + "heading": "Miešanie s inými postinštalačnými skriptmi", + "stackTitle": "Nekombinujte viacero skriptov po inštalácii", + "stackBody": "Spustenie viacerých skriptov po inštalácii na rovnakom hostiteľovi môže vytvoriť duplicitné konfiguračné súbory, konfliktné položky sysctl alebo dokonca nefunkčnú sieť po reštarte. Ak ste už použili Helper-Scripts Post Install, niektoré optimalizácie ProxMenux sa môžu prekrývať s jeho konfiguráciou. Používajte jeden nástroj po inštalácii na hostiteľa.", + "xshokTitle": "xshok-proxmox: deprekovaný", + "xshokBody": "Staršie verzie ProxMenux uvádzali xshok-proxmox ako doplnkový nástroj po inštalácii. Projekt je už zastaraný a ProxMenux ho neponúka. Ak predchádzajúce spustenie zanechalo značky na hostiteľovi, ProxMenux ich stále zistí a upozorní vás. Dnes ho však nemáte inštalovať popri ProxMenux." + }, + "community": { + "heading": "Komunitné skripty", + "body": "Menu ponúka aj dva skripty tretích strán z projektu community-scripts: Proxmox VE Post Install a Proxmox VE Microcode. Ide o obaly, ktoré stiahnu a spustia pôvodné autorské skripty cez wget | bash. ProxMenux ich neudržiava. Pred spustením si pozrite podrobnosti a otázky dôvery v časti Externé repozitáre." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Aktualizácia systému Proxmox", + "href": "/docs/utils/system-update", + "tail": " — udržiava hostiteľa aktuálneho po nastavení po inštalácii." + }, + { + "label": "Zabezpečenie", + "href": "/docs/security", + "tail": " — Fail2Ban + Lynis navyše k posilneniu zabezpečenia po inštalácii." + }, + { + "label": "Zobraziť informácie o verzii", + "href": "/docs/settings/show-version-information", + "tail": " — Pozrite sa, ktoré komponenty po inštalácii sú sledované ako nainštalované." + }, + { + "label": "Príkazy na aktualizácie a balíky", + "href": "/docs/help-info/update-commands", + "tail": " — Referencie pre apt / pveupgrade." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/monitoring.json b/web/messages/sk/docs/post-install/monitoring.json new file mode 100644 index 00000000..c68ed4d9 --- /dev/null +++ b/web/messages/sk/docs/post-install/monitoring.json @@ -0,0 +1,56 @@ +{ + "meta": { + "title": "Po inštalácii: Sledovanie | Dokumentácia ProxMenux", + "description": "Možnosti sledovania v prispôsobiteľnom skripte ProxMenux po inštalácii. Zatiaľ jediná možnosť: inštalácia OVH Real-Time Monitoring (RTM), ktorá sa vykoná iba po zistení, že hostiteľ je serverom OVH." + }, + "header": { + "title": "Po inštalácii: monitorovanie", + "description": "Možnosti sledovania v prispôsobiteľnom skripte po inštalácii. Táto malá kategória je špecifická pre poskytovateľa: nainštaluje agenta OVH Real-Time Monitoring na dedikovaných serveroch OVH a inde nič nevykoná.", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Zámerne úzky rozsah", + "body": "Sledovanie po inštalácii sa obmedzuje na jedného agenta konkrétneho poskytovateľa. Všeobecné nástroje (Prometheus, Grafana, node_exporter) sem nepatria, pretože vyžadujú architektonické rozhodnutia o samostatnom hostiteľovi, uchovávaní údajov a cieľoch upozornení, ktoré sa nehodia do kroku na jedno kliknutie. ProxMenux Monitor, dodávaný s ProxMenux, pokrýva väčšinu tejto úlohy bez externého agenta." + }, + "ovh": { + "heading": "Inštalovať OVH monitorovanie v reálnom čase (RTM)", + "intro": "Ak je hostiteľ Proxmox dedikovaný server prenajatý od OVHcloud, môžete povoliť RTM a sprístupniť hardvérovú telemetriu (teplota CPU, stav zdroja, SMART diskov, stav radiča RAID atď.) v ovládacom paneli OVH. Ide o rovnakého agenta, akého OVH používa pre funkciu „Server Monitoring“.", + "decisionsTitle": "Ako sa rozhoduje ProxMenux", + "decisionsItems": [ + "Získa verejnú IP adresu hostiteľa cez curl ipinfo.io/ip.", + "Zistí vlastníckeho poskytovateľa pomocou dotazu whois na v4.whois.cymru.com.", + "Ak výsledok uvádza OVH, stiahne last-public-ovh-infra-yak.snap.mirrors.ovh.net/yak/archives/apply.sh a cez rúru ho odovzdá bash s manifestom Puppet pre RTM v2.", + "Ak výsledok neuvádza OVH, nič sa nenainštaluje. Možnosť nevykoná žiadne zmeny." + ], + "remoteTitle": "Vzdialený skript odovzdaný cez rúru do bash", + "remoteBody": "Inštalácia spustí wget -qO - https://…apply.sh | bash. Ak dôjde ku kompromitovaniu zrkadla OVH, skript sa na hostiteľovi vykoná ako root. Pred povolením zvážte dôveru v reťazec zrkadiel OVH oproti prínosu sledovania. Pre väčšinu domácich laboratórií a používateľov mimo OVH má možnosť zostať vypnutá.", + "noOpTitle": "Povoliť iba vtedy, ak je hostiteľ skutočne na OVH", + "noOpBody": "Na serveroch mimo OVH možnosť nič nemení, takže jej zaškrtnutie na domácom Proxmox nič nepokazí. Skript vypíše „Nie je to server OVH, inštalácia RTM sa preskočí“ a ukončí sa bez inštalácie balíkov.", + "runsTitle": "Čo ProxMenux spúšťa", + "verifyTitle": "Overenie", + "verifyBody": "Na skutočnom hostiteľovi OVH by sa po reštarte mal v OVH Manager zobraziť prehľad RTM s aktuálnymi údajmi hostiteľa. Na strane Proxmox je zberač RTM službou systemd — overte ju priamo:", + "troubleTitle": "Riešenie problémov", + "revertTitle": "Odstrániť RTM cez menu Odinštalovať", + "revertBody": "Ak je RTM registrovaný ako nainštalovaný, Odinštalovať optimalizácie ponúkne položku OVH Real-Time Monitoring. Spustí apt-get purge -y ''ovh-rtm*'' ''rtm'' ''rtm-*'', odstráni /etc/rtm a označí RTM za odinštalovaný. Zvyšky Puppet môžu vyžadovať ručné čistenie; skontrolujte manifesty RTM v /etc/puppet/. Na hostiteľovi mimo OVH sa balíky RTM nenainštalovali, takže nie je čo odstrániť." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — lokálny webový prehľad hostiteľa, ktorý funguje u každého poskytovateľa, nielen OVH." + }, + { + "label": "Užitočné systémové príkazy", + "href": "/docs/help-info/system-commands", + "tail": " — referencia pre sledovanie lokálneho hostiteľa." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/network.json b/web/messages/sk/docs/post-install/network.json new file mode 100644 index 00000000..fe3b8af4 --- /dev/null +++ b/web/messages/sk/docs/post-install/network.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Po inštalácii: Sieť | Dokumentácia ProxMenux", + "description": "Sieťové možnosti prispôsobiteľného skriptu ProxMenux po inštalácii: vynútiť APT cez IPv4, použiť vybraný profil sysctl, nainštalovať Open vSwitch, zapnúť TCP BBR + Fast Open a priradiť názvy rozhraní k ich MAC adresám." + }, + "header": { + "title": "Po inštalácii: Sieť", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo táto kategória zahŕňa", + "body": "Päť nezávislých sieťových možností. Dve sú jednoduché (APT cez IPv4, inštalácia Open vSwitch), dve upravujú správanie TCP (sieťový profil sysctl, BBR + Fast Open) a jedna rieši častý prevádzkový problém: pevné priradenie názvov rozhraní, aby nová sieťová karta alebo aktualizácia BIOSu nepremenovala enp3s0 na enp4s0 a nenarušila mosty." + }, + "ipv4": { + "heading": "Prinútiť APT používať IPv4", + "intro": "Píše Acquire::ForceIPv4 \"true\"; na /etc/apt/apt.conf.d/99-force-ipv4. APT potom odmieta používať IPv6 na sťahovanie balíkov, aj keď má hostiteľ IPv6 pripojenie.", + "tipTitle": "Kto má prospech", + "tipBody": "Užitočné pri nestabilnom IPv6, pri nižšej rýchlosti oproti IPv4 alebo ak zrkadlo Debian/Proxmox občas cez IPv6 nefunguje. Hostiteľom bez IPv6 neprekáža. Vo funkčnej sieti s oboma protokolmi zaistí predvídateľné správanie: apt vás neprekvapí prekročením časového limitu IPv6." + }, + "sysctl": { + "heading": "Použiť sieťové optimalizácie", + "intro": "Zapíše vybraný profil sysctl do /etc/sysctl.d/99-network.conf. Zahŕňa vyrovnávacie pamäte socketov jadra, posilnenie ICMP, základnú ochranu pred falšovaním adries a veľkosti vyrovnávacích pamätí TCP vhodné pre hypervízor s mnohými súbežnými tokmi.", + "tunedTitle": "Čo sa upraví", + "headerArea": "Oblasť", + "headerSettings": "Kľúčové nastavenia", + "rows": [ + { + "area": "Vyrovnávacie pamäte socketov jadra", + "settings": "netdev_max_backlog=8192, rmem_max=16M, wmem_max=16M, somaxconn=8192" + }, + { + "area": "Posilnenie ICMP", + "settings": "icmp_echo_ignore_broadcasts=1, icmp_ignore_bogus_error_responses=1" + }, + { + "area": "Bezpečnosť smerovania", + "settings": "accept_redirects=0, accept_source_route=0, secure_redirects=0, send_redirects=0, log_martians=0" + }, + { + "area": "Filter spätnej cesty", + "settings": "rp_filter=2 (voľný režim, pozri poznámku nižšie)" + }, + { + "area": "TCP", + "settings": "tcp_mtu_probing=1, tcp_rfc1337=1, tcp_sack=1, tcp_rmem=8K/87K/16M, tcp_wmem=8K/64K/16M" + }, + { + "area": "Porty", + "settings": "ip_local_port_range=1024 65535 (rozsah dočasných portov)" + }, + { + "area": "Unixové sockety", + "settings": "net.unix.max_dgram_qlen=4096" + } + ], + "sourceOutro": "Pridá tiež source /etc/network/interfaces.d/* do /etc/network/interfaces, ak tam ešte nie je. Ide o bežný postup umožňujúci pridávať samostatné konfiguračné súbory rozhraní bez úpravy hlavného súboru.", + "fwbrTitle": "Automatické ladenie virtuálnych mostov firewallu", + "fwbrBody": "Spolu s profilom sysctl ProxMenux nainštaluje pomocný skript /usr/local/sbin/proxmenux-fwbr-tune. Nastaví rp_filter=0 a log_martians=0 na rozhraniach fwbr* / fwln* / fwpr* / tap*, ktoré Proxmox vytvára pre VM a kontajnery. Jednorazová jednotka proxmenux-fwbr-tune.service ho spustí pri štarte a pravidlo /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules pri každej udalosti net add s týmito predponami. Zahŕňa aj rozhrania znovu vytvorené pri spustení/zastavení VM, reštarte a živej migrácii. Skript sa spustí aj hneď po inštalácii a spracuje už existujúce rozhrania.", + "rpFilterTitle": "Prečo rp_filter=2 (voľný) namiesto 1 (prísny)", + "rpFilterBody": "Prísny filter spätnej cesty zahadzuje pakety, ktorých zdroj by bol dostupný cez iné rozhranie. Je to vhodné predvolené nastavenie klienta, ale na hostiteľovi Proxmox môže narušiť sieť: prevádzka VM často prichádza cez most a odchádza cez uplink s asymetrickými trasami. rp_filter=2 (voľný) zahadzuje iba pakety so skutočne nesmerovateľnými zdrojmi. Ide o kompromis: mierne nižšia detekcia falšovania lokálnej IP adresy výmenou za funkčnú sieť VM." + }, + "ovs": { + "heading": "Nainštalovať Open vSwitch", + "intro": "Nainštaluje openvswitch-switch + openvswitch-common. Balíky pridajú OVS ako alternatívu k predvoleným linuxovým mostom Proxmoxu. Samotná inštalácia nemení sieť: existujúce mosty vmbrX fungujú ďalej. Pri vytváraní nového mosta v rozhraní Proxmox si môžete vybrať OVS zo zoznamu typov.", + "tipTitle": "Keď OVS dáva zmysel", + "tipBody": "Zvážte OVS, ak potrebujete VLAN trunking s nesúvislými VLAN ID, LACP s LLDP v špecifických režimoch, jemnozrnné programovanie toku (OpenFlow), alebo súčinnosť s radičmi SDN. Pre domáce laboratórium s niekoľkými sieťami VLAN a jedným uplinkom LACP, štandardné linuxové mosty + vmbrX.VID sú jednoduchšie a úplne v poriadku.", + "revertTitle": "Reverzibilné z menu Odinštalovať", + "revertBody": "OVS je zaznamenaný. Odinštalovať optimalizácie spustí apt purge pre openvswitch-switch a openvswitch-common. Mosty OVS migrujte späť na linuxové mosty pred odinštaláciou, inak ich VM pri ďalšom štarte stratia sieť. Ručný ekvivalent:" + }, + "bbr": { + "heading": "Povoliť TCP BBR + TCP Fast Open", + "intro": "Zapíše dva súbory sysctl a znovu ich načíta. BBR nahradí CUBIC algoritmom riadenia preťaženia od Googlu založeným na šírke pásma, ktorý lepšie zvláda vysokokapacitné spoje s veľkou latenciou aj stratové spoje. TCP Fast Open (TFO) ušetrí jeden obojsmerný prenos pri opakovaných spojeniach TCP tým, že odošle dáta už v SYN.", + "verifyTitle": "Overenie", + "impactTitle": "Vplyv závisí od pracovného zaťaženia", + "impactBody": "BBR vyniká na spojoch s vysokou latenciou alebo stratami paketov (medzikontinentálna replikácia, tunely VPN, mobilní klienti). V LAN medzi dvoma počítačmi na rovnakom prepínači býva rozdiel v rámci šumu merania. TFO najviac pomáha krátkym opakovaným spojeniam HTTP.", + "revertTitle": "Reverzibilné z menu Odinštalovať", + "revertBody": "BBR/TFO sú zaznamenané. Odinštalovať optimalizácie odstráni dva súbory sysctl (/etc/sysctl.d/99-kernel-bbr.conf a 99-tcp-fastopen.conf) a znovu načíta zvyšnú konfiguráciu. Odstránenie súboru samo neobnoví aktívne hodnoty jadra. Predvolené hodnoty ako cubic a tcp_fastopen=1 sa vrátia po reštarte, ak ich neprepíše iná konfigurácia. Ručný ekvivalent:" + }, + "names": { + "heading": "Trvalé názvy rozhraní", + "intro": "Prejde fyzické sieťové karty hostiteľa. Vynechá loopback, Docker veth, mosty, zariadenia TAP, bondy, Cilium, ZeroTier a WireGuard. Zapíše súbor systemd .link, ktorý priradí aktuálny názov k aktuálnej MAC adrese. Priradenie podľa MAC tak dostane prednosť pred pravidlami pomenovania jadra.", + "whyTitle": "Prečo na tom záleží", + "whyItems": [ + "Pridanie alebo odstránenie zariadení PCIe môže zmeniť číslovanie zbernice a premenovať enp3s0 na enp4s0. Ak /etc/network/interfaces odkazuje na starý názov, most po reštarte zmizne.", + "BIOS / Aktualizácie firmvéru niekedy menia spôsob, akým zariadenia enumerujú, s rovnakým účinkom.", + "Pomocný skript pevne priraďuje názvy fyzických kariet vrátane fyzických portov bondov. Vynecháva virtuálne rozhrania, napríklad LXC veth a samotné bondy; nerieši súbehy pri pomenovaní virtuálnych kariet hotplug." + ], + "writtenTitle": "Čo sa napíše", + "writtenIntro": "Jeden súbor pre každú fyzickú kartu v /etc/systemd/network/10-proxmenux-<iface>.link. Začína hlavičkou # Managed by ProxMenux — do not edit, aby ProxMenux rozlíšil vlastné súbory od súborov .link používateľa alebo iných balíkov.", + "writtenOutro": "Súbory .link iných balíkov alebo používateľa zostávajú zachované; spravujú sa iba súbory s hlavičkou ProxMenux. Pri opakovanom spustení funkcia skontroluje svoje súbory: z každého 10-proxmenux-*.link znovu načíta MACAddress= a odstráni tie, ktorých MAC sa už nenachádza v /sys/class/net/. Súbory starších verzií vo formáte 10-<iface>.link sa pri prvom spustení automaticky migrujú.", + "pveTitle": "PVE 9 vs PVE 8", + "pveBody": "Skript používa súbory systemd .link pre trvalé názvy. V Proxmox VE 9 po ich zápise navyše načíta pravidlá udev, aby ich novo pridané karty mohli použiť bez reštartu. Existujúce rozhrania skontrolujte po reštarte v PVE 8 aj PVE 9. Nemení sa tým používanie ifupdown2 na hostiteľovi. Skript v oboch prípadoch nastaví príznak reštartu, aby sa naň prispôsobiteľné nastavenie opýtalo.", + "reviewTitle": "Najprv skontrolujte existujúci /etc/network/interfaces", + "reviewBody": "Ak staršia konfigurácia v /etc/network/interfaces odkazuje na názvy kariet vytvorené jadrom, pevné priradenie aktuálnych názvov je správny výsledok. Ak ste už konfiguráciu ručne prispôsobili konkrétnym názvom, pred reštartom overte, že pevné názvy zodpovedajú súboru interfaces.", + "revertTitle": "Reverzibilné z menu Odinštalovať", + "revertBody": "Odinštalovať optimalizácie odstráni iba súbory 10-proxmenux-*.link s hlavičkou ProxMenux z /etc/systemd/network/. Zachová všetky súbory .link používateľa alebo iných balíkov. Po ďalšom reštarte sa obnoví predvolené pomenovanie systemd." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Správa siete", + "href": "/docs/network", + "tail": " — diagnostika, analýza mostov a opravy so sprievodcom." + }, + { + "label": "Trvalé názvy rozhraní", + "href": "/docs/network/persistent-names", + "tail": " — rovnaká funkcia neskôr v samostatnom menu; použite jednu z možností, nie obe." + }, + { + "label": "Prehľad sieťových príkazov", + "href": "/docs/help-info/network-commands", + "tail": " — ip, ss, ethtool, sysctl." + }, + { + "label": "Odinštalovať optimalizácie", + "href": "/docs/post-install/uninstall", + "tail": " — vráti tieto zmeny siete späť." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/optional.json b/web/messages/sk/docs/post-install/optional.json new file mode 100644 index 00000000..ee101952 --- /dev/null +++ b/web/messages/sk/docs/post-install/optional.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux po inštalácii: Voliteľné nastavenia", + "description": "Sprievodca voliteľnými nastaveniami skriptu ProxMenux po inštalácii pre ďalšie funkcie a optimalizácie Proxmox VE.", + "ogTitle": "ProxMenux po inštalácii: Voliteľné nastavenia", + "ogDescription": "Sprievodca voliteľnými nastaveniami skriptu ProxMenux po inštalácii pre ďalšie funkcie a optimalizácie Proxmox VE.", + "ogImageAlt": "ProxMenux Nepovinné nastavenia po inštalácii" + }, + "title": "Voliteľné nastavenia", + "intro": "Kategória Voliteľné nastavenia ponúka ďalšie funkcie a optimalizácie pre inštaláciu Proxmox VE. Nie sú nevyhnutné, ale v konkrétnych situáciách môžu rozšíriť možnosti systému.", + "available": "Dostupné voliteľné funkcie", + "stepLabel": "Krok", + "ceph": { + "title": "Pridať najnovšiu podporu Ceph", + "intro": "Táto možnosť nainštaluje najnovšiu podporu Ceph úložného systému pre Proxmox VE. Ceph je distribuovaný úložný systém, ktorý poskytuje vysoký výkon, spoľahlivosť a škálovateľnosť.", + "doesIntro": "Čo robí:", + "doesItems": [ + "Pridá repozitár Ceph do vášho systému", + "Aktualizuje zoznamy balíkov", + "Inštaluje balíky Ceph pomocou príkazu 'pveceph install'", + "Overuje inštaláciu" + ], + "howUse": "Použitie: Po inštalácii môžete nastaviť a spravovať úložisko Ceph cez webové rozhranie Proxmox VE alebo nástroje príkazového riadku.", + "automates": "Táto úprava automatizuje nasledujúce príkazy:" + }, + "amd": { + "title": "Použiť opravy CPU AMD", + "intro": "Táto možnosť použije konkrétne opravy procesorov AMD EPYC a Ryzen na zlepšenie stability a kompatibility.", + "doesIntro": "Čo robí:", + "doesItems": [ + "Odhaľuje, či je prítomný AMD EPYC alebo Ryzen CPU", + "Použije parameter jadra idle=nomwait na predchádzanie náhodným pádom (cez /etc/kernel/cmdline na hostiteľoch so systemd-boot alebo /etc/default/grub pri GRUB, so zálohou originálu .bak).", + "Nastaví KVM na ignorovanie určitých MSR (registrov špecifických pre model) pre lepšiu kompatibilitu hosťovských systémov Windows." + ], + "howUse": "Použitie: Opravy sa použijú automaticky a prejavia sa po reštarte systému.", + "automates": "Táto úprava automatizuje nasledujúce príkazy:" + }, + "ha": { + "title": "Zapnúť služby vysokej dostupnosti", + "intro": "Táto možnosť zapne služby vysokej dostupnosti (HA) v Proxmox VE, ktoré umožňujú automatické prevzatie VM a kontajnerov iným uzlom pri poruche uzla.", + "doesIntro": "Čo robí:", + "doesItems": [ + "Zapne a spustí službu pve-ha-lrm (lokálny správca zdrojov)", + "Zapne a spustí službu pve-ha-crm (správca zdrojov klastra)", + "Zapne a spustí službu corosync na komunikáciu klastra" + ], + "howUse": "Ako používať: Po umožnení týchto služieb môžete konfigurovať HA skupiny a zdroje vo webovom rozhraní Proxmox VE.", + "automates": "Táto úprava automatizuje nasledujúce príkazy:" + }, + "pveam": { + "title": "Aktualizovať Proxmox VE Appliance Manager", + "intro": "Obnoví lokálny index šablón kontajnerov, ktorý pveam sprístupňuje v rozhraní Proxmox. Zoznam dostupných softvérových šablón tak bude aktuálny pri ďalšom vytvorení LXC.", + "doesIntro": "Čo robí:", + "doesItems": [ + "Spustí pveam update voči zrkadlám Proxmox a získa aktuálny katalóg softvérových šablón", + "Doplní zoznam softvérových šablón zobrazený pri vytváraní kontajnera" + ], + "howUse": "Použitie: spustite ho, ak zoznam šablón v rozhraní vyzerá zastarano alebo po zmene zrkadiel. Stiahne iba index katalógu, nie samotné šablóny.", + "automates": "Táto úprava automatizuje nasledujúci príkaz:" + }, + "fastfetch": { + "title": "Nainštalovať a nastaviť Fastfetch", + "intro": "Táto možnosť ticho nainštaluje a konfiguruje nástroj Fastfetch, ktorý zobrazuje systémové špecifikácie a vlastné logo pri prihlásení.", + "doesLabel": "Čo robí:", + "doesItems": [ + "Ticho stiahne a nainštaluje najnovšiu verziu Fastfetch", + "Umožňuje vám vybrať si vlastné logo (ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology alebo vlastné logo)", + "Nastaví Fastfetch na zobrazenie „Systém optimalizovaný cez ProxMenux“", + "Nastaví Fastfetch pre automatické spustenie pri prihlásení konzoly" + ], + "importantLabel": "Dôležité:", + "importantBody": "Ak sa pripájate k Proxmoxu cez SSH, vyberte logo Proxmox alebo vytvorte vlastné pomocou jp2a alebo img2txt. Ostatné logá vytvára chafa a v bežnej relácii SSH sa nemusia zobraziť správne.", + "customLabel": "Vlastné logá:", + "customBody1": "Vlastné logo použijete vložením textového súboru s ASCII grafikou do: /usr/local/share/fastfetch/logos/", + "customBody2": "Môžete vytvoriť vlastné logá pomocou nástrojov ako chafa, jp2a, alebo img2txt.", + "customBody3": "Pre dosiahnutie najlepších výsledkov:", + "customItems": [ + "Obmedzte výšku loga na 35 riadkov, aby sa zachovali proporcie a zmestilo sa do terminálu", + "Použite chafa pre farebné logá (v reláciách SSH sa nemusia zobraziť správne)", + "Použiť jp2a alebo img2txt pre logá kompatibilné s SSH" + ], + "examplesLabel": "Príkladové logá:", + "logos": [ + { + "name": "ProxMenux", + "alt": "Logo ProxMenux", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmenux.png" + }, + { + "name": "Proxmox", + "alt": "Logo Proxmox", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmox.png" + }, + { + "name": "JC Channel", + "alt": "Logo JC Channel", + "src": "/fastfetch/jc-channel.png" + }, + { + "name": "Helper-Scripts", + "alt": "Logo Helper-Scripts", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/helper-scripts.png" + }, + { + "name": "Home-Labs-Club", + "alt": "Logo Home-Labs-Club", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/home-labs-club.png" + }, + { + "name": "Proxmology", + "alt": "Logo Proxmology", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmology.png" + } + ], + "automates": "Táto úprava automatizuje nasledujúce príkazy:" + }, + "figurine": { + "title": "Inštalovať a nastaviť Figurine", + "intro": "Táto voľba nainštaluje a konfiguruje Figurine, nástroj, ktorý vytvára štýlové ASCII textové bannery pre váš terminál, zobrazujúci vaše meno hostiteľa vo vizuálne atraktívnom 3D formáte.", + "doesLabel": "Čo robí:", + "doesItems": [ + "Stiahne a nainštaluje Figurine v2.1.1 z GitHubu pre architektúru hostiteľa (AMD64, ARM64 alebo ARMv7)", + "Vytvorí uvítaciu správu, ktorá zobrazí vaše meno hostiteľa v 3D ASCII umení pri prihlásení", + "Aktualizuje existujúci binárny súbor Figurine až po úspešnom stiahnutí a rozbalení", + "Nastaví uvítaciu správu pre automatické spustenie pri prihlásení" + ], + "practicalLabel": "Praktické použitie:", + "practicalBody": "Pri správe viacerých uzlov Proxmox v klastri Figurine hneď ukáže, do ktorého uzla ste prihlásený. Pomáha to predchádzať náhodným príkazom na nesprávnom uzle a zlepšuje prácu s viacerými servermi.", + "exampleLabel": "Príklad výstupu:", + "imageAlt": "Príklad výstupu Figurine", + "automates": "Táto úprava automatizuje tento proces:", + "outro": "Po inštalácii uvidíte vaše meno hostiteľa zobrazené v 3D ASCII umení zakaždým, keď sa prihlásite, aby bolo okamžite jasné, na ktorom uzol Proxmox pracujete." + }, + "log2ram": { + "title": "Nainštalovať Log2RAM (zníženie opotrebenia SSD/NVMe)", + "intro": "Log2RAM pripojí /var/log ako ramdisk tmpfs a pravidelne ho synchronizuje na disk. Ukladanie častých zápisov journald do RAM môže znížiť opotrebenie SSD a diskové I/O. Synchronizácia a riadne vypnutie uložia logy na disk, ale náhly výpadok napájania môže stratiť záznamy od poslednej synchronizácie.", + "upstreamLabel": "Pôvodný projekt:", + "upstreamUrl": "https://github.com/azlux/log2ram", + "upstreamLinkLabel": "azlux/log2ram na GitHub", + "doesLabel": "Čo robí ProxMenux:", + "doesItems": [ + "Čítaním /sys/block/<dev>/queue/rotational zistí, či je koreňový disk SSD/NVMe. Pri rotačnom disku sa automatický postup pred inštaláciou opýta.", + "Naklonuje pôvodný repozitár (azlux/log2ram) do /tmp/log2ram a upraví install.sh: nahradí rsync -aAXv príkazom rsync -aXv --no-acls. Predíde tak chybe set_acl: Operation not supported s návratovým kódom 23 pri presune /var/log na súborovom systéme bez ACL. Jednotka systemd log2ram sa po inštalácii zapne.", + "Nastaví veľkosť ramdisku podľa RAM hostiteľa: ≤ 8 GB → 128M, ≤ 16 GB → 256M, > 16 GB → 512M. Zapíše hodnotu do SIZE= v /etc/log2ram.conf.", + "Plánuje periodickú synchronizáciu disku cez /etc/cron.d/log2ram: každý 1h / 3h / 6h podľa rovnakej úrovne RAM.", + "Nainštaluje /usr/local/bin/log2ram-check.sh, spúšťaný cez /etc/cron.d/log2ram-auto-sync každých 10 minút. Keď /var/log dosiahne 80% ramdisku, vyčistí staré žurnály. Pri 92% najprv spustí logrotate -f /etc/logrotate.d/proxmox-backup-api, ak súbor existuje: logy API PBS bývajú najväčším spotrebiteľom miesta na hostiteľovi PBS. Potom skráti pveproxy access/error a pveam.log pred synchronizáciou. Samotný log2ram write skopíruje tmpfs na disk, ale nezmenší ho. Ochrana pomáha predchádzať pádom PVE s No space left on device pri nekontrolovanom raste logov.", + "Zistí službu proxmox-backup-server na hostiteľovi. Ak existuje, vytvorí /etc/logrotate.d/proxmox-backup-api (20 MB × 3 rotácie) a /etc/cron.hourly/proxmox-backup-logrotate, aby obmedzil logy API PBS, častý zdroj rastu, aj medzi synchronizáciami Log2RAM. Bez PBS nič nezmení.", + "Prispôsobí limity systemd-journald (SystemMaxUse, RuntimeMaxUse) ramdisku, aby ho nárazový príval záznamov nezaplnil.", + "Zaznamená sa v installed_tools.json, aby sa dal vrátiť cez Odinštalovať optimalizácie." + ], + "howUseLabel": "Ako používať:", + "howUseBody": "Automatický postup nainštaluje Log2RAM bez zásahu pri zistení koreňového SSD/NVMe. Prispôsobiteľný postup sa pýta na veľkosť, interval a ochranu synchronizácie. Výzva uvádza 90%, no vytvorený skript používa vyššie opísané limity 80% na čistenie a 92% na intenzívne čistenie.", + "verifyLabel": "Overiť a spravovať zo shellu:", + "verifyCode": "# Service state and configured timers\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Current ramdisk usage — /var/log IS the tmpfs itself\ndf -h /var/log\n\n# Force a sync now (tmpfs → disk); does NOT shrink the tmpfs\nlog2ram write\n\n# Trigger the auto-sync guard on demand (vacuum + sync when usage is high)\n/usr/local/bin/log2ram-check.sh\n\n# Current config: SIZE, mail settings, path\ncat /etc/log2ram.conf\n\n# ProxMenux-specific cron jobs\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Recent Log2RAM activity\njournalctl -u log2ram -n 50 --no-pager" + }, + "zram": { + "title": "Povoliť výmenný profil ZRAM", + "intro": "Pomocou /dev/zram0 vytvorí komprimované odkladacie zariadenie v RAM cez systemd-zram-generator. Stránky presunuté jadrom do swapu sa komprimujú cez zstd a zostanú v pamäti pred použitím swapu na disku.", + "doesLabel": "Čo robí:", + "doesItems": [ + "Nainštaluje systemd-zram-generator, ak chýba, a zaznamená, či ho nainštaloval ProxMenux.", + "Zapíše /etc/systemd/zram-generator.conf.d/90-proxmenux.conf: zariadenie zram0 s veľkosťou desatiny RAM hostiteľa, kompresiou zstd (zstd(level=9) pri systemd-zram-generator 1.2.0 alebo novšom) a prioritou swapu 32767.", + "S touto prioritou jadro najprv zaplní ZRAM. Existujúci swap na disku si zachová svoju prioritu a prijme stránky, ktoré sa už do ZRAM nezmestia.", + "Pred zmenou niečoho, hľadá ďalšie nastavenie ZRAM: aktívny zram swap, zram linka v /etc/fstab, systemd jednotka alebo iný súbor generátora. Ak ho nájde, možnosť sa zastaví a nechá nastavenie ako je.", + "Spustí dev-zram0.swap a overí, či aktívne zariadenie zodpovedá profilu. Ak nie, obnoví predchádzajúci stav.", + "Zaznamená sa v installed_tools.json, aby sa dal vrátiť cez Odinštalovať optimalizácie." + ], + "howUseLabel": "Ako používať:", + "howUseBody": "Možnosť je iba v prispôsobiteľnom postupe; automatický ju nepoužíva. Zariadenie sa pri každom štarte vytvorí znovu. Kým je aktívne, panel Pamäť v ProxMenux Monitor zobrazí kapacitu, využitý swap, algoritmus, kompresný pomer a obsadenú fyzickú pamäť.", + "verifyLabel": "Overiť zo shellu:", + "verifyCode": "# Active swap devices and their priority\nswapon --show\n\n# ZRAM device: algorithm, size and compressed data\nzramctl\n\n# Profile written by ProxMenux\ncat /etc/systemd/zram-generator.conf.d/90-proxmenux.conf\n\n# State of the swap unit\nsystemctl status dev-zram0.swap" + }, + "autoApplication": { + "title": "Automatická aplikácia", + "body": "V prispôsobiteľnom postupe vyberte funkcie podľa potreby. Log2RAM je aj súčasťou automatického postupu s detekciou hardvéru; ZRAM zostáva iba prispôsobiteľný. Jednotlivé časti opisujú výzvy a predpoklady." + } +} diff --git a/web/messages/sk/docs/post-install/performance.json b/web/messages/sk/docs/post-install/performance.json new file mode 100644 index 00000000..0681e16a --- /dev/null +++ b/web/messages/sk/docs/post-install/performance.json @@ -0,0 +1,61 @@ +{ + "meta": { + "title": "Po inštalácii: Výkon | Dokumentácia ProxMenux", + "description": "Možnosti výkonu v prispôsobiteľnom skripte ProxMenux po inštalácii. Nahrádza jednovláknový gzip programom pigz (paralelný gzip) na rýchlejšie zálohovanie a kompresiu na viacjadrových hostiteľoch." + }, + "header": { + "title": "Po inštalácii: výkon", + "description": "Možnosti výkonu v prispôsobiteľnom skripte po inštalácii. Kategória obsahuje jednu optimalizáciu: nahradenie gzip programom pigz, aby zálohovanie a kompresia používali všetky jadrá CPU namiesto jedného.", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo táto kategória zahŕňa", + "body": "Jediná možnosť výkonu tu presmeruje systémový gzip na paralelnú implementáciu. Ostatné úpravy výkonu (pamäť, plánovanie I/O, veľkosť ARC ZFS, limity jadra) sú vo vlastných kategóriách (Systém, Úložisko), pretože ovplyvňujú iné subsystémy." + }, + "pigz": { + "heading": "Použiť pigz pre rýchlejšiu gzip kompresiu", + "intro": "Štandardný gzip komprimuje údaje pomocou jediného jadra CPU. Na moderných hostiteľoch Proxmox s 8, 16 alebo 32 jadrami je to veľké úzke miesto pri zálohách VM/CT cez vzdump, rotácii záznamov a všetkom, čo prechádza cez gzip. pigz je priamo zameniteľná paralelná náhrada: rovnaký výstup kompatibilný s gzip, ale práca rozdelená medzi všetky jadrá.", + "doesTitle": "Čo robí ProxMenux", + "doesIntro": "Päť krokov, všetky idempotentné:", + "doesItems": [ + "Nastaví pigz: 1 v /etc/vzdump.conf, aby zálohovací nástroj Proxmox používal pigz natívne.", + "Nainštaluje apt balíček pigz, ak už nie je prítomný.", + "Napíše wrapper skript na /bin/pigzwrapper, ktorý posiela každý argument na /usr/bin/pigz.", + "Zaregistruje presmerovanie dpkg pre systémový program gzip (/usr/bin/gzip v Proxmox VE 9, /bin/gzip v Proxmox VE 8). Pôvodný program zostane vedľa ako gzip.distrib a na jeho miesto príde wrapper. Odvtedy všetko, čo volá gzip — logrotate, tar czf, skripty aj vzdump — používa pigz transparentne.", + "Pred umiestnením wrappera overí, že súbor gzip.distrib je funkčný gzip; ak nie, najprv preinštaluje balík gzip. Hostiteľ so staršou náhradou /bin/gzip.original pri opätovnom použití možnosti prejde na presmerovanie dpkg." + ], + "replacesTitle": "Nahrádza systémový program", + "replacesBody": "Umiestniť wrapper namiesto gzip je nezvyčajné. Je to bezpečné, pretože vytvára výstup kompatibilný s gzip, ale skripty s pevne zapísanými cestami, v obmedzených prostrediach chroot alebo overujúce hash programu sa môžu správať inak. Pôvodný program zostáva ako gzip.distrib. Vďaka presmerovaniu dpkg aktualizácia balíka gzip alebo prechod z Proxmox VE 8 na 9 aktualizuje tento súbor a ponechá wrapper na mieste.", + "revertTitle": "Reverzibilné z menu Odinštalovať", + "revertBody": "Táto optimalizácia sa sleduje. Odinštalovať optimalizácie skopíruje pôvodný program z gzip.distrib na miesto wrappera, odstráni presmerovanie aj pigzwrapper, zakomentuje riadok pigz v /etc/vzdump.conf a po overení funkčnosti gzip spustí apt purge pigz. Ručný ekvivalent pre Proxmox VE 9:", + "verifyTitle": "Overenie", + "verifyBody": "Po použití by mal gzip --version uviesť pigz. Rýchly test výkonu tiež ukáže rozdiel v rýchlosti na viacjadrovom hostiteľovi:", + "whenTitle": "Keď na tom záleží najviac", + "whenBody": "Prínos závisí od počtu jadier hostiteľa a frekvencie zálohovania. Na domácom serveri s 2 jadrami a jedným denným vzdump je malý. Na produkčnom hostiteľovi so 16 jadrami, ktorý každú noc zálohuje tucet VM, môže pigz skrátiť časové okno záloh na zlomok času jednovláknového gzip." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Príkazy na zálohovanie a obnovu", + "href": "/docs/help-info/backup-commands", + "tailRich": " — referencia CLI vzdump vrátane voľby počtu vlákien --pigz." + }, + { + "label": "Úložisko", + "href": "/docs/post-install/storage", + "tail": " — Vzdump rýchlostné limity a ZFS ARC ladenie." + }, + { + "label": "Systém", + "href": "/docs/post-install/system", + "tail": " — ladenie deskriptorov súborov a pamäte." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/security.json b/web/messages/sk/docs/post-install/security.json new file mode 100644 index 00000000..8cc4c920 --- /dev/null +++ b/web/messages/sk/docs/post-install/security.json @@ -0,0 +1,57 @@ +{ + "meta": { + "title": "Po inštalácii: Zabezpečenie | Dokumentácia ProxMenux", + "description": "Možnosti zabezpečenia v prispôsobiteľnom skripte ProxMenux po inštalácii. Zatiaľ jediná možnosť: zakázať službu portmapper/rpcbind na zmenšenie útočnej plochy hostiteľa." + }, + "header": { + "title": "Po inštalácii: Zabezpečenie", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo táto kategória zahŕňa", + "body": "Zabezpečenie po inštalácii zahŕňa iba posilnenie hostiteľa, ktoré sa dá bezpečne použiť bez dozoru: vypnutie služieb, ktoré takmer nikto nepotrebuje a ktoré možno obnoviť cez Odinštalovať. Aktívne bezpečnostné nástroje (Fail2Ban na prevenciu prienikov, Lynis na audit) nájdete pod položkou Zabezpečenie v hlavnom menu ProxMenux, mimo nastavení po inštalácii." + }, + "rpcbind": { + "heading": "Zakázať portmapper / rpcbind", + "intro": "rpcbind (predtým portmap) mapuje čísla programov RPC na sieťové porty. NFS a niektoré staršie nástroje RPC ho potrebujú. Na typickom hostiteľovi Proxmox, ktorý nie je serverom NFS, ho nič nepoužíva; ak zostane zapnutý, port 111/tcp načúva na každom rozhraní.", + "whyTitle": "Prečo sa ho oplatí vypnúť", + "whyItems": [ + "Zmenšuje útočnú plochu hostiteľa — o jednu načúvajúcu službu menej, o ktorú sa treba starať.", + "V minulosti sa zneužíval ako vektor odrazu a zosilnenia pri útokoch DDoS. Vypnutím rpcbind sa tento faktor zosilnenia na hostiteľovi odstráni.", + "Odstráni zbytočné hlásenia zo záznamov a výstupu netstat / ss, aby sa skutočná aktivita ľahšie rozpoznávala." + ], + "nfsTitle": "Nevypnite to, ak používate NFS", + "nfsBody": "Server NFS aj klient NFS používajú rpcbind na vyjednanie portov pre mountd, statd, lockd a ďalšie služby. Ak hostiteľ Proxmox exportuje zdieľania NFS iným počítačom alebo pripája zdieľania NFS z NAS, túto možnosť nepoužívajte. Pripájanie zlyhá s chybou mount.nfs: rpc.statd is not running alebo podobnou.", + "runsTitle": "Čo ProxMenux spúšťa", + "runsOutro": "Balík zostáva nainštalovaný. ProxMenux zaznamená pôvodný stav povolenia a aktivity rpcbind.service aj rpcbind.socket, potom obe jednotky zakáže a zastaví, aby aktivácia cez socket nemohla službu znovu spustiť.", + "verifyTitle": "Overenie", + "verifyBody": "Po použití overte, že rpcbind je vypnutý a na porte 111 nič nenačúva:", + "reversibleTitle": "Obnovuje pôvodný stav služby", + "reversibleBody": "Zmena sa zaznamená do installed_tools.json. Odinštalovať optimalizácie vráti každú jednotku rpcbind do povoleného/zakázaného a aktívneho/neaktívneho stavu zaznamenaného pred zmenou ProxMenux. Nepredpokladá, že rpcbind bol povolený na každom hostiteľovi." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Bezpečnostné menu", + "href": "/docs/security", + "tail": " — pokročilejšie nástroje: Fail2Ban (prevencia prienikov) a Lynis (audit)." + }, + { + "label": "Lynis", + "href": "/docs/security/lynis", + "tail": " — audit hostiteľa na nájdenie ďalších možností posilnenia zabezpečenia." + }, + { + "label": "Užitočné systémové príkazy", + "href": "/docs/help-info/system-commands", + "tail": " — Stav služby, journalctl, referencia auditu lynis." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/storage.json b/web/messages/sk/docs/post-install/storage.json new file mode 100644 index 00000000..6b9180a4 --- /dev/null +++ b/web/messages/sk/docs/post-install/storage.json @@ -0,0 +1,167 @@ +{ + "meta": { + "title": "Po inštalácii: Úložisko | Dokumentácia ProxMenux", + "description": "Optimalizácie úložiska v prispôsobiteľnom skripte ProxMenux po inštalácii: veľkosť ZFS ARC podľa RAM, pravidelné snímky cez zfs-auto-snapshot a odstránenie rýchlostných limitov záloh vzdump." + }, + "header": { + "title": "Po inštalácii: Úložisko", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo táto kategória zahŕňa", + "body": "Štyri optimalizácie úložiska: nastaviť ZFS ARC na vhodný podiel RAM, nainštalovať a naplánovať automatické snímky ZFS, zapnúť ZFS autotrim v SSD/NVMe pooloch a odstrániť obmedzenia vzdump, aby sa zálohy mohli vytvárať plnou rýchlosťou. Možnosti sú nezávislé; vyberte podľa svojho systému. Piata, Log2RAM, znižuje opotrebenie SSD/NVMe presunom /var/log na ramdisk. Je na stránke Voliteľné podľa zaradenia v prispôsobiteľnom menu." + }, + "trackedTitle": "Všetky štyri sú sledované v menu Odinštalovať", + "trackedBody": "Každá z týchto možností zaregistruje nástroj v installed_tools.json, takže sa zobrazí v časti Odstrániť optimalizácie. Vrátenie zfs_arc odstráni /etc/modprobe.d/99-zfsarc.conf a znovu vytvorí initramfs. zfs_auto_snapshot zruší plán cron a ponúkne úplné odstránenie balíka; zfs_autotrim nastaví autotrim=off v pooloch, v ktorých ho zaplo; vzdump_speed obnoví /etc/vzdump.conf zo súboru .bak vytvoreného pri inštalácii.", + "arc": { + "heading": "Optimalizovať veľkosť ZFS ARC", + "intro": "Adaptive Replacement Cache (ARC) je čítacia cache ZFS v RAM. Inštalácie Proxmox VE od 8.1 nastavujú 10% RAM, najviac 16 GiB; staršie alebo aktualizované hostitele sa môžu líšiť. Táto možnosť zapíše vlastný limit podľa RAM. Skontrolujte existujúce nastavenia a záťaž: menšia cache nie je vždy rýchlejšia.", + "sizingTitle": "Pravidlá veľkosti", + "headerRam": "RAM hostiteľa", + "headerMax": "Limit ARC", + "rows": [ + { + "ram": "Vzorec", + "max": "RAM / 10, najviac 16 GiB a najmenej 64 MiB" + }, + { + "ram": "8 GB hostiteľ", + "max": "≈ 819 MiB (RAM/10)" + }, + { + "ram": "16 GB hostiteľ", + "max": "≈ 1.6 GiB (RAM/10)" + }, + { + "ram": "64 GB hostiteľ", + "max": "≈ 6.4 GiB (RAM/10)" + }, + { + "ram": "≥ 160 GB hostiteľ", + "max": "16 GiB (limit)" + } + ], + "after": "Súbor /etc/modprobe.d/99-zfsarc.conf obsahuje iba options zfs zfs_arc_max=…. Ostatné parametre ZFS (zfs_arc_min, prednačítanie/obmedzenie zápisov L2ARC, časový limit TXG) sa neladia. Pred zápisom kontrola nájde iné *.conf v /etc/modprobe.d/ s zfs_arc_min / zfs_arc_max, zálohuje ich s manifestom do /usr/local/share/proxmenux/backups/zfs_arc/ a odstráni konfliktné riadky, aby zostal aktívny iba súbor ARC ProxMenux. Potom update-initramfs -u -k all a podľa potreby proxmox-boot-tool refresh začlenia limit do initramfs systémov s koreňom na ZFS.", + "rebootTitle": "Prejaví sa po reštarte", + "rebootBody": "Nastavenia ARC sa čítajú pri načítaní modulu zfs. Pre hostiteľov s koreňom na ZFS ProxMenux znovu vytvorí initramfs cez update-initramfs -u -k all a podľa potreby obnoví zavádzač cez proxmox-boot-tool refresh. Nový parameter stále vyžaduje reštart; príznak potreby reštartu sa nastaví automaticky.", + "safeTitle": "Bezpečné na hostiteľoch bez ZFS", + "safeBody": "Funkcia zapíše konfiguráciu iba vtedy, ak zpool list ohlási aspoň jeden importovaný pool ZFS. Na hostiteľoch iba s ext4/LVM alebo s nástrojmi ZFS bez importovaného poolu voľba nič neurobí a nič nezapíše.", + "verifyTitle": "Overenie a ručná obnova" + }, + "autoSnap": { + "heading": "Nainštalovať ZFS auto-snapshot", + "intro": "Nainštaluje balík zfs-auto-snapshot a prepíše plány cron na automatické vytváranie snímok v niekoľkých intervaloch. Jednoduchá dodatočná ochrana popri pravidelných zálohách vzdump.", + "cadenceTitle": "Intervaly snímok nastavené cez ProxMenux", + "headerLabel": "Štítok", + "headerRuns": "Beží", + "headerKept": "Uchované snímky", + "rows": [ + { + "label": "časté", + "runs": "každý 15 min.", + "kept": "4" + }, + { + "label": "hodinová", + "runs": "každú hodinu", + "kept": "1" + }, + { + "label": "denne", + "runs": "jedenkrát denne", + "kept": "1" + }, + { + "label": "týždenne", + "runs": "jedenkrát týždenne", + "kept": "1" + }, + { + "label": "mesačne", + "runs": "jedenkrát mesačne", + "kept": "1" + } + ], + "conservativeTitle": "Obmedzené počty uchovaných snímok", + "conservativeBody": "ProxMenux sa dodáva s konzervatívnym uchovávaním (len 4 často + 1 každého dlhšieho intervalu), takže ZFS snapshot úložisko nenarastá. Ak chcete dlhšie uchovávanie, po spustení skriptu upravte čísla v /etc/cron.d/zfs-auto-snapshot, /etc/cron.hourly/zfs-auto-snapshot atď.", + "onlyZfsTitle": "Užitočné iba v pooloch ZFS", + "onlyZfsBody": "Inštalácia balíka na hostiteľovi iba s ext4 je neškodná, ale zbytočná: neexistujú datasety ZFS na vytváranie snímok. Ak ZFS nepoužívate, možnosť vynechajte.", + "verifyTitle": "Overenie a ručná obnova" + }, + "autotrim": { + "heading": "Zapnúť ZFS autotrim (SSD/NVMe pooly)", + "intro": "Zapne autotrim v pooloch ZFS zložených iba z SSD alebo NVMe s TRIM. Z opatrnosti vynechá pooly s rotačným diskom. Pooly už nastavené na autotrim=on ponechá bez zmeny.", + "trimTitle": "Čo TRIM robí, a prečo to záleží na ZFS", + "trimBody1": "SSD a NVMe používajú interné mazacie bloky väčšie než logické sektory súborového systému. Po zmazaní súboru disk ešte nevie, že sektory sú voľné, a jeho interné čistenie môže pri uvoľňovaní ďalších blokov zbytočne presúvať staré dáta. TRIM oznámi disku voľné sektory, aby ich mohol vymazať vopred.", + "trimBody2": "Bez TRIM sa výkon SSD časom znižuje, pretože na disku sa míňajú vopred vymazané bloky a musí vykonať vymazanie pri zápise a zvyšuje sa zosilnenie zápisu – oboje skracuje životnosť disku. So zapnutým TRIM môže disk udržiavať zdravé pool prázdnych blokov pripravených na zápis.", + "trimBody3": "Pri autotrim=on ZFS na pozadí vykonáva TRIM nedávno uvoľneného miesta a zlučuje rozsahy. Alternatívou je pravidelný zpool trim <pool>. Autotrim nepotrebuje samostatný plán, ale vplyv závisí od diskov; slabším zariadeniam môže viac vyhovovať pravidelný ručný TRIM.", + "practicalTitle": "Prečo je to praktické?", + "practicalItems": [ + "Trvalý výkon zápisu. TRIM môže pomôcť efektívne obnoviť nepoužité bloky. Prínos a vplyv na latenciu závisia od zariadenia a záťaže.", + "Životnosť disku. Menej zbytočného interného kopírovania môže znížiť násobenie zápisov a opotrebenie NAND. Nezaručuje konkrétne predĺženie životnosti.", + "Bez samostatnej úlohy cron. Na rozdiel od pravidelného zpool trim sa o autotrim stará samotný pool." + ], + "whenTitle": "Kedy je to nutné?", + "whenIntro1": "Zvážte zapnutie v pooloch ZFS iba s SSD/NVMe podporujúcimi TRIM. Overte správanie a latenciu; niektorému hardvéru viac vyhovuje plánovaný ručný TRIM.", + "whenIntro2": "Skript ho automaticky preskočí na:", + "whenSkipItems": [ + "Pooly s rotačným HDD vdev — opatrný hardvérový filter tohto skriptu.", + "Disky bez discard_granularity vystavené v sysfs – zvyčajne staré SSD bez TRIM alebo priechodných ciest, kde OS nevidí základné zariadenie.", + "Pools, kde ZFS sám uvádza, že vlastnosť nie je podporovaná (zriedkavé; veľmi staré pools).", + "Pools už nastavený na autotrim=on (bez-op)." + ], + "whenIntro3": "Nie je relevantné pre hostiteľov iba s ext4 — ZFS nemá čo trimovať. Funkcia vtedy skončí s vysvetľujúcou správou.", + "recordedTitle": "Prečo sa zaznamenávajú iba pooly zmenené cez ProxMenux", + "recordedBody": "Funkcia zapíše pool do interného súboru stavu (/usr/local/share/proxmenux/zfs_autotrim_pools) iba pri zmene z off na on. Pooly s už aktívnym autotrimom vynechá. Neskoršie odinštalovanie tak vráti iba vlastné zmeny ProxMenuxu a nevypne vaše nastavenia.", + "manualTitle": "Ručný ekvivalent (spustite na svojom serveri)", + "manualIntro": "Úplná sekvencia skriptu spustená proti každému pool je replikovateľná ručne. Toto by ste napísali, ak by ste chceli urobiť to isté na jednom pool bez ProxMenux:", + "verifyTitle": "Overenie a ručná obnova", + "oneShotTitle": "Potrebujete jednorazový TRIM namiesto priebežného?", + "oneShotBody": "Niektorí správcovia uprednostňujú ručný TRIM mimo špičky. Vypnite autotrim a naplánujte úlohu cron s zpool trim <pool>: rovnaký cieľ, iný interval." + }, + "vzdump": { + "heading": "Zvýšiť rýchlosť záloh vzdump", + "intro": "Zapíše bwlimit: 0 a ionice: 5 do globálnej konfigurácie vzdump. Proxmox už predvolene neobmedzuje šírku pásma; odstráni teda iba nastavený limit. Oproti ionice: 7 hodnota 5 zvýši prioritu I/O best-effort, ak ju plánovač rešpektuje. Môže ovplyvniť hostí a nezaručuje rýchlejšie zálohy.", + "changedTitle": "Čo sa zmení v /etc/vzdump.conf", + "backupTitle": "Prvý beh vytvára .bak vzdump.conf", + "backupBody": "Pri prvom spustení ProxMenux pred úpravami skopíruje /etc/vzdump.conf do /etc/vzdump.conf.bak. Ďalšie spustenia zálohu neprepíšu, takže pôvodná ručne upravená konfigurácia zostane obnoviteľná. bwlimit a ionice zmení cez sed; ostatné možnosti ako compress, pigz, tmpdir a exclude-path ponechá.", + "skipTitle": "Kedy to preskočiť", + "skipBody": "Na hostiteľovi s pomalým úložiskom a VM citlivými na latenciu môže odstránenie limitu šírky pásma spomaliť prevádzku počas záloh. Ak ste preto nastavili bwlimit, ponechajte ho a túto možnosť vynechajte.", + "verifyTitle": "Overenie a ručná obnova" + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Príkazy na správu ZFS", + "href": "/docs/help-info/zfs-commands", + "tail": " — prehľad zpool / zfs pre ARC, snímky a scrub." + }, + { + "label": "Príkazy pre úložiská a disky", + "href": "/docs/help-info/storage-commands", + "tail": " — všeobecná príručka blokových zariadení a úložísk Proxmox." + }, + { + "label": "Príkazy zálohovania a obnovy", + "href": "/docs/help-info/backup-commands", + "tail": " — prehľad CLI vzdump pre šírku pásma a prioritu I/O." + }, + { + "label": "Odinštalovať optimalizácie", + "href": "/docs/post-install/uninstall", + "tail": " — vráťte zmeny ARC / vzdump späť." + }, + { + "label": "Log2RAM", + "href": "/docs/post-install/optional#log2ram", + "tail": " - znižuje SSD/NVMe opotrebenie ramdiskom /var/log; zdokumentované podľa Voliteľné." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/system.json b/web/messages/sk/docs/post-install/system.json new file mode 100644 index 00000000..47ae01bf --- /dev/null +++ b/web/messages/sk/docs/post-install/system.json @@ -0,0 +1,133 @@ +{ + "meta": { + "title": "Po inštalácii: Systém | Dokumentácia ProxMenux", + "description": "Systémové optimalizácie prispôsobiteľného skriptu ProxMenux po inštalácii: limity veľkosti journald a logrotate, vyššie limity jadra a deskriptorov súborov, vyvážené ladenie pamäte, rýchle reštarty cez kexec a obnova po panike jadra." + }, + "header": { + "title": "Po inštalácii: systém", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo táto kategória zahŕňa", + "body": "Šesť nezávislých systémových optimalizácií. Upravujú journald a logrotate, aby logy nezaplnili disk, zvyšujú limity jadra a deskriptorov súborov pre aplikácie s mnohými otvorenými súbormi, vyvažujú využitie pamäte na virtualizačnom hostiteľovi, pridávajú kexec na reštart bez BIOSu a nastavujú automatickú obnovu pri panike jadra. Všetkých šesť je zaznamenaných a vratných z menu Odinštalovať." + }, + "journald": { + "heading": "Optimalizovať journald", + "intro": "Prepíše /etc/systemd/journald.conf s rozumnými predvolenými hodnotami, aby žurnál systemd postupne nezaplnil koreňový oddiel. Potom reštartuje systemd-journald a vyčistí staré záznamy.", + "keyTitle": "Kľúčové hodnoty", + "keyItems": [ + "Storage=persistent — uchová záznamy na disku aj po reštarte.", + "SystemMaxUse=64M / RuntimeMaxUse=60M — pevné limity využitia disku a pamäte systémovým denníkom.", + "Compress=yes, Seal=no — komprimuje záznamy, vypne kryptografické pečatenie s doprednou bezpečnosťou (šetrí CPU).", + "MaxLevelStore=info — ukladá úroveň info a vyššie, potrebné pre prehliadač logov ProxMenux Monitor aj pre detekciu neúspešných overení SSH/Proxmox cez Fail2Ban v žurnáli.", + "Limit frekvencie: 1000 events / 30 s proti zahlteniu logmi.", + "ForwardToSyslog=no, ForwardToWall=no — neduplikovať hlásenia do syslogu ani ich nerozosielať na konzoly." + ], + "tipTitle": "Prečo je MaxLevelStore=info dôležité", + "tipBody": "Prísnejšia úroveň ako warning spôsobí, že ProxMenux Monitor ukáže takmer rovnaké záznamy vo všetkých obdobiach, pretože väčšina aktivity má úroveň info, a Fail2Ban neuvidí neúspešné prihlásenia. Objem obmedzte pomocou SystemMaxUse a RateLimitBurst, nie obmedzením ukladaných úrovní." + }, + "logrotate": { + "heading": "Optimalizovať logrotate", + "intro": "Prepíše /etc/logrotate.conf s globálnym denným a veľkostným nastavením, uchovaním 7 rotácií, kompresiou a copytruncate, aby služby mohli písať bez opätovného otvorenia logov. Veľkostné kritérium je uvedené po dennom a má prednosť, ak ho neprepíše pravidlo konkrétneho logu. Pôvodný logrotate.conf sa pri prvom použití zálohuje do .bak.", + "tipTitle": "Vhodné pre Log2RAM", + "tipBody": "Direktíva size 10M má prednosť pred skorším denným nastavením; neznamená to prvé splnené kritérium. Logrotate kontroluje limit pri spustení a pravidlá konkrétnych logov môžu prepísať globálne hodnoty. Pri /var/log v RAM cez Log2RAM skontrolujte pravidlá aj frekvenciu časovača na riadenie využitia miesta." + }, + "limits": { + "heading": "Zvýšiť systémové limity", + "intro": "Zvýši limity jadra, systemd a PAM, ktorých predvolené hodnoty môžu byť nízke pre hostiteľa s mnohými VM, kontajnermi a sieťovými službami.", + "headerFile": "Súbor", + "headerSets": "Čo nastavuje", + "rows": [ + { + "file": "/etc/sysctl.d/99-maxwatches.conf", + "sets": "fs.inotify.max_user_watches / max_user_instances / max_queued_events = 1048576" + }, + { + "file": "/etc/sysctl.d/99-maxkeys.conf", + "sets": "kernel.keys.maxkeys / root_maxkeys = 1000000" + }, + { + "file": "/etc/sysctl.d/99-swap.conf", + "sets": "vm.swappiness = 10, vm.vfs_cache_pressure = 100" + }, + { + "file": "/etc/sysctl.d/99-fs.conf", + "sets": "fs.nr_open / file-max = 2097152, fs.aio-max-nr = 1048576" + }, + { + "file": "/etc/security/limits.d/99-limits.conf", + "sets": "nofile a nproc na 1,048,576 (pre root bez obmedzenia)" + }, + { + "file": "/etc/systemd/system.conf + user.conf", + "sets": "DefaultLimitNOFILE=1048576 pre služby systemd" + }, + { + "file": "/etc/pam.d/common-session + runuser-l", + "sets": "session required pam_limits.so, aby sa uvedené limity uplatnili v prihlasovacích shelloch" + }, + { + "file": "/root/.profile", + "sets": "ulimit -n 1048576 pre shell používateľa root" + } + ], + "tipTitle": "Prečo je inotify dôležité", + "tipBody": "Docker, Syncthing, sledovanie súborov Node.js a skenovanie knižníc Plex môžu vyčerpať max_user_watches. Predvolená hodnota závisí od jadra a pamäte; nie je vždy 8192. Limit 1M umožní viac sledovaní bez ich predbežného pridelenia. Aktívne sledovania spotrebúvajú pamäť jadra, preto pri nedostatku RAM kontrolujte využitie." + }, + "memory": { + "heading": "Optimalizácia nastavenia pamäte", + "intro": "Zapíše vyvážený profil sysctl do /etc/sysctl.d/99-memory.conf. Je navrhnutý pre hostiteľa hypervízora: uprednostňuje ponechanie aktívnej pamäte VM v RAM a vopred uvoľňuje stránky, aby nárazové prideľovanie pamäte nespôsobovalo zdržanie.", + "warnTitle": "swappiness=10 na hostiteľoch s nedostatkom pamäte", + "warnBody": "Na hostiteľovi so 16 GB RAM a mnohými VM môže zníženie swappiness viesť k ukončovaniu procesov pre nedostatok pamäte namiesto použitia swapu. Pri častých udalostiach OOM po spustení skriptu zvýšte swappiness na 30–60 v /etc/sysctl.d/99-memory.conf." + }, + "kexec": { + "heading": "Povoliť rýchle reštarty (kexec)", + "intro": "Nainštaluje kexec-tools a nastaví ich na priamy reštart hostiteľa do nového jadra bez prechodu firmvérom BIOS/UEFI. Na veľkých serveroch, kde POST trvá 45 – 90 sekúnd, sa tým reštart môže skrátiť z prestávky na kávu na niekoľko sekúnd výpadku.", + "installsTitle": "Čo nainštaluje ProxMenux", + "installsItems": [ + "Balík kexec-tools (debconf má vopred nastavené kexec-tools/load_kexec boolean false, aby sa apt nepýtal a automatické načítanie pri vypínaní zostalo vypnuté).", + "Jednotka Systemd /etc/systemd/system/kexec-pve.service — načíta jadro Proxmox a initrd do pamäte pri zavádzaní, pričom opätovne použije aktuálny cmdline.", + "Alias v /root/.bash_profile: reboot-quick → systemctl kexec." + ], + "usageIntro": "Použitie po ďalšom reštarte (alebo manuálnom systemctl start kexec-pve):", + "warnTitle": "Kedy nepoužívať kexec", + "warnBody": "kexec vynechá inicializáciu firmvéru. Ak BIOS/UEFI musí obnoviť stav hardvéru, napríklad GPU s passthrough vyžadujúca úplný POST alebo problémový firmvér HBA, reštart cez kexec môže nechať zariadenia čiastočne inicializované. Po aktualizácii jadra alebo pre zmeny BIOS/UEFI použite bežný reboot. reboot-quick je na každodenné reštarty." + }, + "panic": { + "heading": "Zapnúť reštart pri kernel panic", + "intro": "Zabezpečí automatický reštart jadra namiesto trvalého zamrznutia na obrazovke paniky. Dôležité pri vzdialených hostiteľoch Proxmox bez lokálnej konzoly: pri zaseknutom jadre sú všetky VM nedostupné, kým hostiteľa nevypnete a znovu nezapnete.", + "tipTitle": "Skombinujte to s prístupom k vzdialenej konzole", + "tipBody": "Automatický reštart je mechanizmus obnovy, nie nástroj na ladenie. Ak chcete paniku preskúmať, nielen znovu spustiť systém, použite možnosť kexec vyššie s podporou kdump jadra, ktorú ProxMenux nenastavuje, alebo pred zapnutím automatického reštartu zachytávajte sériovú konzolu na inom hostiteľovi." + }, + "verify": { + "heading": "Overenie", + "intro": "Po uplatnení optimalizácie systému:", + "tipTitle": "Obnova a obmedzenia", + "tipBody": "Všetkých šesť možností je v installed_tools.json a Odinštalovať optimalizácie. Obnova odstráni konfiguračné súbory, jednotku a alias kexec a obnoví journald/logrotate. Niektoré aktívne limity vyžadujú novú reláciu alebo reštart. Z /root/.profile sa odstráni iba starý ulimit -n 256000; aktuálny ulimit -n 1048576 môže zostať a vyžadovať ručné odstránenie." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Užitočné systémové príkazy", + "href": "/docs/help-info/system-commands", + "tail": " — overte zmeny (free -h, journalctl, ulimit -a)." + }, + { + "label": "Výkon", + "href": "/docs/post-install/performance", + "tail": " — ďalšie systémové ladenie (pigz)." + }, + { + "label": "Odinštalovať optimalizácie", + "href": "/docs/post-install/uninstall", + "tail": " — vráťte tieto zmeny späť." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/uninstall.json b/web/messages/sk/docs/post-install/uninstall.json new file mode 100644 index 00000000..ee7856ba --- /dev/null +++ b/web/messages/sk/docs/post-install/uninstall.json @@ -0,0 +1,271 @@ +{ + "meta": { + "title": "Odinštalovať optimalizácie | Dokumentácia ProxMenux", + "description": "Obnoví vratné zmeny konfigurácie vykonané cez ProxMenux po inštalácii. Zaznamenané nástroje majú vlastné odinštalačné funkcie, ktoré podľa možností zachovajú pôvodný stav hostiteľa." + }, + "header": { + "title": "Odinštalovať optimalizácie", + "description": "Obnoviť reverzibilné zmeny vykonané automatizovanými alebo prispôsobiteľnými skriptmi po inštalácii. ProxMenux registruje každú podporovanú optimalizáciu s jeho špecializovanou funkciou obnovy; aktualizácie balíkov sú zámerne vylúčené.", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Prečo to existuje?", + "body": "Každá podporovaná vratná úprava sa zaznamená v /usr/local/share/proxmenux/installed_tools.json. Register riadi odinštalovanie: ukáže aktívne optimalizácie a spustí zodpovedajúcu obnovu. Akcie bez bezpečného návratu, napríklad úplná aktualizácia balíkov, sa nepridávajú." + }, + "openMenu": { + "heading": "Ako to otvoriť", + "body": "V hlavnom menu otvorte Nastavenia Proxmox po inštalácii → Odinštalovať optimalizácie. Zobrazí sa zoznam aktuálne použitých optimalizácií; nepoužité položky sa nezobrazia.", + "imageAlt": "Zoznam Odinštalovať optimalizácie s aktívnymi úpravami hostiteľa a políčkami na výber obnovy" + }, + "howWorks": { + "heading": "Ako reverzia účinkuje", + "steps": [ + { + "title": "Register a autodetekcia", + "body1": "Pri prvom spustení ProxMenux hľadá rozpoznávacie znaky na hostiteľovi, napríklad /etc/sysctl.d/99-memory.conf, /etc/apt/apt.conf.d/99-force-ipv4, nainštalovaný balík haveged alebo aktívny Log2RAM. Nájdené úpravy pridá do registra ako vratné aj pri staršej verzii ProxMenux bez registra.", + "body2": "Migrácia prebehne iba raz. Potom každý zásah aj obnova aktualizujú register priamo." + }, + { + "title": "Vyberte si, čo vrátiť", + "body1": "Zoznam má pre každú položku čitateľné označenie, napríklad Optimalizácia pamäte, IOMMU/VFIO PCI passthrough alebo Log2RAM (ochrana SSD). Označte úpravy na obnovu; neoznačené sa nemenia." + }, + { + "title": "Spustenie obnovy", + "body1": "Pre každú vybranú položku ProxMenux volá zodpovedajúcu funkciu odinštalovania. Väčšina zvratov nasleduje jeden z troch vzorov:", + "items": [ + "Zo zálohy — obnoví .bak vytvorený pri použití úpravy (bashrc, logrotate.conf, journald.conf, príkazový riadok GRUB/jadra).", + "Odstránenie konfigurácie — odstráni súbory ProxMenux /etc/sysctl.d/99-*.conf, /etc/apt/apt.conf.d/99-* alebo jednotku systemd a znovu načíta nastavenia.", + "Preinštalovanie balíkov — pri zmenách rozhrania, napríklad upozornení na predplatné, preinštaluje pôvodné balíky s --force-confnew na obnovu dodanej konfigurácie." + ], + "body2": "Každá obnova zaznamenáva priebeh. Položky vyžadujúce reštart (VFIO, trvalé názvy rozhraní) nastavia príznak, ktorý na konci vyvolá výzvu na reštart." + }, + { + "title": "Reštart na konci", + "body1": "Po dokončení obnovy menu ponúkne reštart. Zmeny parametrov alebo modulov jadra a názvov rozhraní (VFIO, trvalé názvy) reštart vyžadujú; iné nie. Výzva je všeobecné bezpečnostné opatrenie, nie kontrola každej položky." + } + ] + }, + "reversible": { + "heading": "Čo je reverzibilné", + "intro": "Registrované reverzibilné optimalizácie a ich zodpovedajúce odinštalátory sú zoskupené podľa oblastí:", + "groups": [ + { + "title": "Repozitáre a APT", + "items": [ + { + "tool": "Odstránenie upozornenia na predplatné", + "restores": "Najprv skúsi obnoviť súbory rozhrania zo záloh ProxMenux (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* a index.html.tpl.backup.* pri upravenom mobilnom rozhraní). Iba pri chýbajúcej alebo poškodenej zálohe preinštaluje pve-manager, proxmox-widget-toolkit, libjs-extjs a libpve-http-server-perl s force-confnew. Vyčistí aj kópie .js / .gz v cache." + }, + { + "tool": "Preskočiť jazykové súbory APT", + "restores": "Odstráni /etc/apt/apt.conf.d/99-disable-translations, aby APT mohol sťahovať indexy preložených opisov balíkov podľa ostatných jazykových nastavení." + }, + { + "tool": "Vynútiť IPv4 pre APT", + "restores": "Odstráni /etc/apt/apt.conf.d/99-force-ipv4." + }, + { + "tool": "Systémové nástroje", + "restores": "Úplne odstráni iba vybrané balíky nástrojov, ktoré ProxMenux zaznamenal ako nové inštalácie. Pôvodné balíky sa do zoznamu nepridávajú a zostanú zachované." + } + ] + }, + { + "title": "Kernel, pamäť a systémové limity", + "items": [ + { + "tool": "Nastavenie pamäte", + "restores": "Odstráni /etc/sysctl.d/99-memory.conf a znovu načíta sysctl." + }, + { + "tool": "Nastavenie paniky jadra", + "restores": "Odstráni /etc/sysctl.d/99-kernelpanic.conf." + }, + { + "tool": "Zvýšenie systémových limitov", + "restores": "Odstráni /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf a /etc/security/limits.d/99-limits.conf. Obnoví limity PAM a DefaultLimitNOFILE systemd. V /root/.profile odstraňuje iba starý ulimit -n 256000; aktuálny ulimit -n 1048576 môže zostať a vyžadovať ručné odstránenie." + }, + { + "tool": "Profil výmeny ZRAM", + "restores": "Vypne swap /dev/zram0, zastaví dev-zram0.swap a odstráni /etc/systemd/zram-generator.conf.d/90-proxmenux.conf. Balík systemd-zram-generator úplne odstráni iba pri inštalácii cez ProxMenux a bez inej konfigurácie ZRAM. Ak sa stránky nedajú presunúť zo ZRAM, profil zostane aktívny a nič sa neodstráni." + } + ] + }, + { + "title": "Sieťovanie", + "items": [ + { + "tool": "Optimalizácia siete", + "restores": "Odstráni /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf a 98-proxmenux-rpf.conf, jednotku proxmenux-fwbr-tune.service, skript /usr/local/sbin/proxmenux-fwbr-tune a pravidlo udev /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules. Odstráni aj riadok source /etc/network/interfaces.d/* z /etc/network/interfaces. Znovu načíta sysctl, systemd a pravidlá udev." + }, + { + "tool": "Open vSwitch", + "restores": "Spustí apt purge pre openvswitch-switch a openvswitch-common. Mosty OVS najprv migrujte na linuxové mosty, inak ich VM pri ďalšom štarte stratia sieť." + }, + { + "tool": "TCP BBR + TCP Fast Open", + "restores": "Odstráni /etc/sysctl.d/99-kernel-bbr.conf a 99-tcp-fastopen.conf a načíta zvyšné sysctl. Odstránenie súborov neobnoví aktívne hodnoty; predvolené cubic a tcp_fastopen=1 sa vrátia po reštarte, ak ich neprepíše iná konfigurácia." + }, + { + "tool": "Pretrvávajúce názvy rozhraní", + "restores": "Odstráni iba súbory 10-proxmenux-*.link s hlavičkou ProxMenux z /etc/systemd/network/. Všetky súbory .link iných balíkov alebo používateľa zostanú zachované. Po ďalšom reštarte sa obnoví predvolené pomenovanie systemd." + } + ] + }, + { + "title": "Zaznamenávanie", + "items": [ + { + "tool": "Optimalizácia journald", + "restores": "Prepíše /etc/systemd/journald.conf s pôvodnými predvolenými hodnotami a reštartuje systemd-journald." + }, + { + "tool": "Optimalizácia logrotate", + "restores": "Obnoví /etc/logrotate.conf zo súboru .bak zachytený pred zmenou." + }, + { + "tool": "Log2RAM", + "restores": "Zastaví a zakáže službu a časovač. Čistí úlohy cron, jednotky systemd, binárne súbory, konfiguračné súbory a adresár /var/log.hdd. Tiež odinštaluje balík apt, ak bol nainštalovaný týmto spôsobom." + }, + { + "tool": "Automatický TRIM ZFS", + "restores": "Prečíta /usr/local/share/proxmenux/zfs_autotrim_pools so skutočne zmenenými poolmi a na každom spustí zpool set autotrim=off. Ručne zapnutý autotrim spred ProxMenuxu ponechá." + } + ] + }, + { + "title": "Shell a vzhľad", + "items": [ + { + "tool": "Prispôsobenie Bashrc", + "restores": "Obnovuje /root/.bashrc zo zálohy .bak. Ak neexistuje záloha, odstráni blok PMX_CORE_BASHRC pomocou markerov." + }, + { + "tool": "Vlastný banner MOTD", + "restores": "Obnoví presný pôvodný obsah /etc/motd uložený v /usr/local/share/proxmenux, odstráni súbor, ak predtým neexistoval, alebo bezpečne odstráni starý marker pri migrácii staršej inštalácie." + }, + { + "tool": "Fastfetch", + "restores": "Odstráni binárny súbor, konfiguračný adresár, hook update-motd a ohraničený blok BEGIN FASTFETCH / END FASTFETCH z /root/.bashrc, ~/.profile, /etc/profile a /etc/profile.d/fastfetch.sh. Úplne odstráni nainštalovaný balík apt." + }, + { + "tool": "Figurine", + "restores": "Odstráni binárny súbor, záznam profile.d a blok aliasov v bashrc/profile." + } + ] + }, + { + "title": "Hardware & virtualizácia", + "items": [ + { + "tool": "IOMMU / VFIO", + "restores": "Odstráni moduly vfio z /etc/modules, položky blokovania ovládačov nouveau / radeon / nvidia a parametre intel_iommu=on / amd_iommu=on / iommu=pt / pcie_acs_override z /etc/kernel/cmdline (ZFS) alebo GRUB. Znovu vytvorí initramfs." + }, + { + "tool": "Opravy AMD CPU (Ryzen/EPYC)", + "restores": "Odstráni idle=nomwait z príkazového riadka jadra (ZFS) alebo GRUB a možnosti ignore_msrs / report_ignored_msrs z /etc/modprobe.d/kvm.conf." + }, + { + "tool": "Hosťovský agent pre virtualizovaný hostiteľ Proxmox", + "restores": "Prečíta /usr/local/share/proxmenux/guest_agent.pkg a úplne odstráni zaznamenaný balík hostiteľa. Inštalátor vyberá qemu-guest-agent, open-vm-tools alebo virtualbox-guest-utils podľa hypervízora. Bez záznamu skúsi tieto tri balíky. Ide o vnorený hostiteľ Proxmox, nie šablóny hostí." + } + ] + }, + { + "title": "Úložisko", + "items": [ + { + "tool": "Nastavenie veľkosti ARC ZFS", + "restores": "Odstráni /etc/modprobe.d/99-zfsarc.conf, obnoví konfliktné externé *.conf zo zálohy /usr/local/share/proxmenux/backups/zfs_arc/, znovu vytvorí initramfs a na hostiteľoch so systemd-boot spustí proxmox-boot-tool refresh." + }, + { + "tool": "Automatické snímky ZFS", + "restores": "Odstráni položky cron zapísané skriptom a ponúkne apt purge zfs-auto-snapshot. Existujúce snímky v pooloch zostanú zachované; v prípade potreby ich odstráňte samostatne." + }, + { + "tool": "Obmedzenia rýchlosti vzdump", + "restores": "Obnoví /etc/vzdump.conf zo zálohy .bak vytvorenej pri inštalácii a vráti bwlimit aj ionice na hodnoty pred ProxMenux." + } + ] + }, + { + "title": "Služby a doplnky", + "items": [ + { + "tool": "Synchronizácia času", + "restores": "Nastaví časovú zónu späť do UTC (bezpečné predvolené) prostredníctvom timedatectl." + }, + { + "tool": "Generovanie entropie (haveged)", + "restores": "Zastaví, vypne a úplne odstráni balík haveged." + }, + { + "tool": "kexec (rýchly reštart)", + "restores": "Vypne kexec-pve.service, odstráni súbor jednotky a alias reboot-quick z /root/.bash_profile a úplne odstráni kexec-tools." + }, + { + "tool": "Zakázať RPC / rpcbind", + "restores": "Obnoví rpcbind.service a rpcbind.socket každý samostatne na zaznamenaný stav zapnutia/vypnutia a aktivity/neaktivity spred ProxMenuxu." + }, + { + "tool": "pigz (paralelný gzip)", + "restores": "Obnoví skutočný gzip z gzip.distrib, odstráni presmerovanie dpkg a /bin/pigzwrapper, zakomentuje riadok pigz v /etc/vzdump.conf a po overení gzip spustí apt purge pigz." + }, + { + "tool": "Vysoko dostupné služby", + "restores": "Zastaví a vypne pve-ha-lrm, pve-ha-crm a corosync. Existujúce skupiny HA a definície zdrojov nevymaže; ak ich už nepotrebujete, odstráňte ich cez webové rozhranie." + }, + { + "tool": "Repozitár Ceph", + "restores": "Úplne odstráni balíky Ceph z tejto možnosti, odstráni deb822 /etc/apt/sources.list.d/ceph.sources v PVE 9 alebo starý zoznam Ceph v PVE 8 a obnoví cache APT." + }, + { + "tool": "OVH RTM (monitorovanie)", + "restores": "Úplne odstráni balíky zodpovedajúce ovh-rtm*, rtm a rtm-*, odstráni /etc/rtm a záznam RTM v registri. Zvyšky Puppet v /etc/puppet/ môžu vyžadovať ručnú kontrolu a čistenie; adresár sa neodstraňuje. Mimo OVH inštalátor zvyčajne nič nemení." + } + ] + } + ] + }, + "edge": { + "heading": "Osobitné prípady a obmedzenia", + "packageTitle": "Preinštalovanie zasiahne používané balíky Proxmox", + "packageBody": "Ak zálohy ProxMenux nedokážu vrátiť Odstránenie upozornenia na predplatné, náhradný postup preinštaluje pve-manager, proxmox-widget-toolkit, libjs-extjs a libpve-http-server-perl s --force-confnew. Zasiahne bežiace webové rozhranie: obnovte prehliadač a počkajte pár sekúnd na spojenie. Nerobte to počas migrácie alebo klonovania.", + "rebootTitle": "Trvalé mená a VFIO potrebujú reštart", + "rebootBody": "Odstránenie súborov 10-proxmenux-*.link (Trvalé názvy rozhraní) a vrátenie IOMMU/VFIO nemenia už spustený systém; prejavia sa po reštarte. ProxMenux automaticky nastaví príznak potreby reštartu.", + "perItemTitle": "Môžeš vrátiť jednu vec a zvyšok si nechať.", + "perItemBody": "Odinštalačný program funguje pre každú položku. Ak chcete odstrániť iba Log2RAM, ale zachovať ladenie siete a zmeny bashrc, začiarknite iba Log2RAM. Nič iného sa nedotkne a register sa podľa toho aktualizuje." + }, + "inspect": { + "heading": "Manuálne sledovanie registra", + "intro": "Ak chcete vidieť, čo je sledované bez otvorenia menu:", + "outro": "Každý záznam \"tool\": true zodpovedá úprave, ktorú ProxMenux použil a dokáže vrátiť. Neodstraňujte záznamy ručne: použite menu, ktoré aj spustí obnovu namiesto toho, aby na zmenu iba zabudlo.", + "reinstallTitle": "Preinštalovať po odinštalovaní", + "reinstallBody": "Vrátenú optimalizáciu môžete neskôr použiť znova. Otvorte menu po inštalácii a spustite Automatické alebo Prispôsobiteľné; register zaznamená nový stav." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Automatizované po inštalácii", + "href": "/docs/post-install/automated", + "tail": " — znovu použite rozumnú základnú konfiguráciu." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — Vyber si inú podskupinu." + }, + { + "label": "Odinštalovať ProxMenux", + "href": "/docs/settings/uninstall-proxmenux", + "tail": " — Rôzne operácie: odstraňuje ProxMenux sám, nie jeho aplikované optimalizácie." + }, + { + "label": "Prehľad po inštalácii", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/sk/docs/post-install/updates.json b/web/messages/sk/docs/post-install/updates.json new file mode 100644 index 00000000..bf7b42d5 --- /dev/null +++ b/web/messages/sk/docs/post-install/updates.json @@ -0,0 +1,112 @@ +{ + "meta": { + "title": "Aplikovať dostupné aktualizácie — Optimalizácie po inštalácii | Dokumentácia ProxMenux", + "description": "Ako ProxMenux zisťuje nové verzie optimalizácií po inštalácii (Log2Ram, nastavenia pamäte, limity systému, Logrotate, sieť…) a ako ich použiť cez menu po inštalácii alebo prehľad Monitor." + }, + "header": { + "title": "Aplikovať dostupné aktualizácie", + "description": "Ak má optimalizácia po inštalácii (Log2Ram, nastavenia pamäte, limity systému, Logrotate…) na disku novšiu verziu než registrovanú, ProxMenux ju zobrazí ako dostupnú aktualizáciu. Možno ju použiť cez menu po inštalácii v skriptoch alebo cez prehľad Monitor. Obe cesty znovu spustia tú istú funkciu a aktualizujú register.", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo to je?", + "body": "Optimalizácie ProxMenux po inštalácii majú verzie, napríklad Log2ram SSD Protection v1.2. Hostiteľ eviduje aktívne optimalizácie a ich verzie v /usr/local/share/proxmenux/installed_tools.json. Ak nové vydanie ProxMenux prinesie novšiu optimalizáciu, zistí rozdiel a ponúkne opätovné použitie iba tejto položky bez spustenia celého skriptu po inštalácii." + }, + "why": { + "heading": "Prečo to existuje?", + "body": "Optimalizácie po inštalácii sa priebežne zlepšujú: vhodnejšie nastavenia sysctl, prísnejšie limity Logrotate, nový odhad veľkosti Log2RAM alebo oprava okrajového prípadu nahláseného testerom. Bez aktualizačného postupu mal správca len dve možnosti: znovu spustiť celý poinštalačný skript, ktorý opäť použije všetky optimalizácie, alebo sa zlepšenia vzdať. Použiť dostupné aktualizácie umožňuje dobrovoľne znovu spustiť iba tie optimalizácie, ktorých verzia sa skutočne zmenila." + }, + "detection": { + "heading": "Spôsob zistenia aktualizácií", + "steps": [ + { + "title": "Verziované skripty na disku", + "body": "Každá funkcia po inštalácii deklaruje svoju verziu vo vnútri skriptu (scripts/post_install/auto_post_install.sh a scripts/post_install/customizable_post_install.sh). Scanner vyberá tieto verzie zo zdroja na disku." + }, + { + "title": "Register verzií na hostiteľovi", + "body": "Pri použití každej optimalizácie príslušné volanie register_tool zapísalo aktívnu verziu do /usr/local/share/proxmenux/installed_tools.json. Tento súbor je rozhodujúcim záznamom toho, čo je na hostiteľovi práve aktívne." + }, + { + "title": "Monitor porovnáva obe strany", + "body": "Pri štarte a každých 24 hodín Monitor porovná verzie na disku s registrom. Každý rozdiel vytvorí položku v /usr/local/share/proxmenux/updates_available.json. Súbor riadi položku menu po inštalácii aj kartu prehľadu Monitor." + }, + { + "title": "Jedno oznámenie na novú verziu", + "body": "Ak čaká aspoň jedna aktualizácia, Monitor odošle jedno súhrnné oznámenie, napríklad „Dostupné 4 aktualizácie optimalizácií ProxMenux“, s riadkom pre každý nástroj vo formáte name (vX → vY), ako pri balíkoch Proxmox. Pre rovnakú skupinu sa denne neopakuje; znovu ho vyvolá iba nová verzia alebo nový nástroj v zozname." + } + ] + }, + "pathA": { + "heading": "Cesta A — Z menu po inštalácii", + "intro": "V hlavnom menu ProxMenux otvorte Nastavenie Proxmoxu po inštalácii. Pri čakajúcich aktualizáciách sa nad Odinštalovať optimalizácie zobrazí Aplikovať dostupné aktualizácie (N). Číslo udáva počet optimalizácií s novšou verziou na disku než v registri. Ak je všetko aktuálne, položka sa skryje.", + "menuAlt": "Menu skriptov po inštalácii s podmienenou položkou Aplikovať dostupné aktualizácie (N) nad Odinštalovať optimalizácie; počítadlo udáva počet novších verzií optimalizácií na disku", + "menuCaption": "Aplikovať dostupné aktualizácie (N) sa zobrazí iba pri čakajúcej aktualizácii aspoň jednej optimalizácie; pri aktuálnom hostiteľovi sa skryje.", + "checklistBody": "Otvorí výberový zoznam všetkých čakajúcich aktualizácií vo formáte name (vX → vY). Všetky riadky sú predvolene zaškrtnuté; zrušte výber tých, ktoré teraz nechcete použiť.", + "checklistAlt": "Dialóg Aplikovať dostupné aktualizácie s riadkom pre každú čakajúcu optimalizáciu, názvom a zmenou verzie (aktuálna → dostupná). Všetky riadky sú zaškrtnuté.", + "checklistCaption": "Vyberte jednotlivé optimalizácie na aktualizáciu. Rovnaký mechanizmus ako Automatizované a Prispôsobiteľné znovu použije funkcie na pozadí a aktualizuje ich verzie v registri." + }, + "pathB": { + "heading": "Cesta B — Z prehľadu Monitor", + "intro": "Rovnaké aktualizácie sú v Monitor pod Nastavenia → Optimalizácie ProxMenux. Karta zobrazí počítadlo čakajúcich aktualizácií, ktoré otvorí výber jednotlivých optimalizácií. Každý nástroj má aj vlastnú akciu aktualizácie.", + "imageAlt": "Karta Optimalizácie ProxMenux v nastaveniach Monitor s počítadlom čakajúcich aktualizácií na otvorenie výberu a akciami aktualizácie jednotlivých nástrojov", + "imageCaption": "Karta Optimalizácie v Monitor sprístupní aktualizácie cez počítadlo pri novšej verzii na disku bez prístupu do shellu." + }, + "applying": { + "heading": "Čo sa stane po použití aktualizácie", + "steps": [ + { + "title": "Znovu spustí funkciu po inštalácii", + "body": "Funkcia vybranej optimalizácie sa znovu spustí na hostiteľovi. Keďže každá poinštalačná funkcia je idempotentná, opakovanie nevytvára duplicitnú konfiguráciu: nahradí predchádzajúcu verziu novou, napríklad súbory sysctl, doplnkové konfigurácie a jednotky služieb." + }, + { + "title": "Obnovuje register", + "body": "Volanie register_tool vo vnútri funkcie zapíše novú verziu do installed_tools.json. Ďalší sken už nevidí nesúlad a položka aktualizácie zmizne z menu aj z karty Monitor." + }, + { + "title": "Žiadny reštart, pokiaľ to funkcia nepovie", + "body": "Väčšina aktualizácií sa prejaví okamžite. Tie, ktoré menia moduly jadra, trvalé názvy rozhraní alebo VFIO, zobrazia rovnakú výzvu na reštart ako pri prvej inštalácii." + }, + { + "title": "Aktualizácia registra zaslaná monitoru", + "body": "Po dokončení dávky menu odošle požiadavku POST na http://127.0.0.1:8008/api/updates/post-install/scan na obnovu /usr/local/share/proxmenux/updates_available.json. Po použití všetkých aktualizácií zmizne ich počítadlo na karte Optimalizácie aj podmienená položka menu shellu bez čakania na ďalšiu kontrolu. Samotná karta zostane dostupná." + } + ], + "jqTitle": "Vyžaduje sa jq", + "jqBody": "Výber na ceste A používa jq na spracovanie JSON čakajúcich aktualizácií. Ak jq chýba, postup sa potichu ukončí: menu ukáže počet, ale po výbere sa nič nestane. Moderná inštalácia Proxmox má jq; pri pochybnostiach spustite apt install -y jq." + }, + "differs": { + "heading": "Ako sa líši od ostatných ciest", + "headerPath": "Path", + "headerScope": "Rozsah", + "headerWhen": "Keď to dáva zmysel", + "rows": [ + { + "pathLabel": "Automatizované", + "pathHref": "/docs/post-install/automated", + "scope": "Znovu použije všetky optimalizácie v balíku.", + "when": "Nový hostiteľ alebo úplné obnovenie základných nastavení plne spravovaného uzla." + }, + { + "pathLabel": "Prispôsobiteľné", + "pathHref": "/docs/post-install/customizable", + "scope": "Vyberte si z celého katalógu.", + "when": "Presne vybrať aktívne optimalizácie hostiteľa." + }, + { + "pathLabel": "Nainštalovať dostupné aktualizácie", + "pathHref": null, + "scope": "Iba optimalizácie s novšou verziou na disku.", + "when": "Udržiavať nainštalované optimalizácie aktuálne bez zásahu do ostatných." + }, + { + "pathLabel": "Odstrániť optimalizácie", + "pathHref": "/docs/post-install/uninstall", + "scope": "Vrátiť optimalizáciu a odstrániť jej položku registra.", + "when": "Vrátiť konkrétnu zmenu." + } + ] + }, + "notifTitle": "Ovládanie oznámenia", + "notifBody": "Čakajúce aktualizácie oznamuje udalosť Dostupné aktualizácie optimalizácií ProxMenux. Predvolene je povolená na každom kanáli a dá sa pre jednotlivé kanály stíšiť v Nastavenia → Oznámenia. Spustí sa iba raz pre každú odlišnú skupinu aktualizácií, nie pri každej kontrole po 24 hodinách." +} diff --git a/web/messages/sk/docs/post-install/virtualization.json b/web/messages/sk/docs/post-install/virtualization.json new file mode 100644 index 00000000..4d88c434 --- /dev/null +++ b/web/messages/sk/docs/post-install/virtualization.json @@ -0,0 +1,116 @@ +{ + "meta": { + "title": "Po inštalácii: Virtualizácia | Dokumentácia ProxMenux", + "description": "Možnosti virtualizácie v prispôsobiteľnom skripte ProxMenux po inštalácii: automaticky nainštaluje správneho hosťovského agenta, ak Proxmox beží vo VM, a povolí IOMMU / VFIO na priame priradenie zariadení PCI (GPU, NIC, HBA) vašim VM." + }, + "header": { + "title": "Po inštalácii: Virtualizácia", + "section": "Nastavenie Proxmoxu po inštalácii" + }, + "intro": { + "title": "Čo táto kategória zahŕňa", + "body": "Dve nezávislé možnosti. Nainštalovať vhodného hosťovského agenta pomáha, keď samotný Proxmox beží vnorený v inom hypervízore. Zapnúť podporu VFIO/IOMMU zaujíma väčšinu používateľov: povolí funkcie jadra na priame priradenie GPU, HBA alebo sieťovej karty do VM s takmer natívnym výkonom." + }, + "guestAgent": { + "heading": "Nainštalovať vhodného hosťovského agenta", + "intro": "Zistí virtualizačné prostredie hostiteľa Proxmox pomocou systemd-detect-virt a dmidecode a nainštaluje príslušný balík hosťovských nástrojov na správnu komunikáciu s vonkajším hypervízorom: riadne vypnutie, synchronizácia času, hlásenie IP adresy atď.", + "headerDetected": "Detekovaný hostiteľ", + "headerPackage": "Inštalovaný balík", + "rows": [ + { + "detected": "QEMU / KVM", + "package": "qemu-guest-agent" + }, + { + "detected": "VMware (ESXi, Workstation)", + "package": "open-vm-tools" + }, + { + "detected": "VirtualBox", + "package": "virtualbox-guest-utils" + }, + { + "detected": "Bare metal (žiadne)", + "package": " — bez zmien, nič sa nenainštaluje" + } + ], + "skipTitle": "Vynechajte pri Proxmox bežiacom priamo na hardvéri", + "skipBody": "Ak Proxmox beží priamo na hardvéri, čo je bežný prípad, zaškrtnutie nič nezmení: detektor vráti none a skript sa ukončí bez zmien. Možnosť má význam iba pre menšinu zostáv, kde Proxmox beží ako hosť na testovanie alebo v laboratóriu." + }, + "vfio": { + "heading": "Zapnúť podporu VFIO/IOMMU", + "intro": "Zapne IOMMU na hostiteľovi a načíta moduly jadra na priame priradenie PCI (vfio, vfio_iommu_type1, vfio_pci). Fyzické zariadenie potom môžete priradiť do VM, ktorej hosť získa priamy prístup s takmer natívnym výkonom.", + "whoTitle": "Kto to potrebuje?", + "whoItems": [ + "Chcete priamo priradiť GPU hernej VM s Windows alebo VM s macOS.", + "Máte vyhradenú 10G NIC pre firewall / router VM (OPNsense, pfSense).", + "Chcete priamo priradiť HBA do VM s TrueNAS/Unraid pre ZFS na fyzických diskoch.", + "Plánujete použiť Coral TPU, zachytávaciu kartu alebo SDR adaptér vo VM." + ], + "whoOutro": "Ak nič z toho neplatí, môžete možnosť vynechať. Na sprístupnenie zariadenia kontajneru LXC namiesto VM sa IOMMU nevyžaduje.", + "doesTitle": "Čo robí ProxMenux", + "doesIntro": "Funkcia zohľadňuje zavádzač: zistí ZFS (systemd-boot) alebo LVM/ext4 (GRUB) a zapíše do správneho súboru. Je idempotentná — existujúce parametre nepridáva znovu.", + "headerBoot": "Typ zavádzania", + "headerFile": "Upravený súbor", + "headerPost": "Krok po aktualizácii", + "bootRows": [ + { + "boot": "systemd-boot (ZFS)", + "file": "/etc/kernel/cmdline", + "post": "proxmox-boot-tool refresh" + }, + { + "boot": "GRUB (LVM/ext4)", + "file": "/etc/default/grub", + "post": "update-grub" + } + ], + "kernelIntro": "Pridané parametre jadra:", + "modulesIntro": "Moduly jadra pridané do /etc/modules:", + "blacklistIntro": "Konfliktné ovládače zakázané v /etc/modprobe.d/blacklist.conf:", + "blacklistTitle": "Zákaz ovládačov GPU je v konflikte s používaním GPU na hostiteľovi", + "blacklistBody": "Zoznam zakázaných ovládačov zabraňuje jadru hostiteľa priradiť akýkoľvek ovládač GPU, aby ju mohol prevziať VFIO. To chcete pri priamom priradení do VM, ale je to opak toho, čo treba na inštaláciu ovládačov NVIDIA na hostiteľovi, napríklad pre transkódovanie LXC. Pre každú GPU vyberte jednu cestu:", + "pathItems": [ + "GPU → VM: povoľte tu VFIO/IOMMU a ponechajte ovládače GPU zakázané.", + "GPU → LXC (alebo hostiteľ): túto možnosť vynechajte, použite inštaláciu NVIDIA na hostiteľovi a nezakazujte nvidia/nouveau.", + "Dve GPU: jedna môže ísť do VM a druhá do LXC, ale treba presnejšiu konfiguráciu: priradiť iba jednu kartu k vfio-pci podľa PCI ID. Predvolený zoznam zákazov je príliš široký — potom upravte blacklist.conf." + ], + "acsTitle": "O pcie_acs_override — vedzte, čo povoľujete", + "acsBody": "pcie_acs_override=downstream,multifunction uvoľňuje kontrolu PCIe Access Control Services. Umožňuje jadru rozdeliť skupiny IOMMU, ktoré firmvér označuje za nedeliteľné, čo je niekedy jediná cesta na priradenie jedného zariadenia bez ostatných. Nevýhodou je znížená izolácia medzi zariadeniami: škodlivá alebo kompromitovaná VM s priamym priradením má väčšiu útočnú plochu cez DMA. Pre domáce laboratórium prijateľné; pri nedôveryhodných záťažiach to dôkladne zvážte. Ak parameter nepotrebujete, po skripte ho odstráňte z /etc/kernel/cmdline alebo /etc/default/grub a znovu aktualizujte zavádzač.", + "rebootTitle": "Vyžaduje sa reštart", + "rebootBody": "IOMMU, moduly VFIO a zoznam zákazov sa prejavia po obnovení initramfs a reštarte. Skript spustí update-initramfs -u -k all, aktualizuje zavádzač a nastaví príznak „vyžaduje sa reštart“, aby sa Prispôsobiteľné na konci opýtalo.", + "verifyTitle": "Overenie po reštarte", + "revertTitle": "Reverzibilné z menu Odinštalovať", + "revertBody": "Odinštalujte optimalizácie vráti všetky zmeny: odoberie tokeny IOMMU /etc/kernel/cmdline alebo GRUB, odstráni moduly VFIO z /etc/modules, odstráni položky čiernej listiny ovládačov a prebuduje initramfs. Na skutočné použitie reverzie je potrebný reštart." + }, + "related": { + "heading": "Súvisiace", + "items": [ + { + "label": "Pridať GPU do VM (passthrough)", + "href": "/docs/hardware/gpu-vm-passthrough", + "tail": " — prirodzený ďalší krok po povolení IOMMU + VFIO." + }, + { + "label": "Pridať radič alebo NVMe do VM", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "tail": " — rovnaká infraštruktúra priameho priradenia pre radiče úložísk." + }, + { + "label": "Príkazy na priame priradenie GPU", + "href": "/docs/help-info/gpu-commands", + "tail": " — Referencia na overenie IOMMU." + }, + { + "label": "Odinštalovať optimalizácie", + "href": "/docs/post-install/uninstall", + "tail": " — čisto vrátiť nastavenia IOMMU / VFIO." + }, + { + "label": "Prispôsobiteľné nastavenia po inštalácii", + "href": "/docs/post-install/customizable", + "tail": " — späť do nadradeného menu." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/automated.json b/web/messages/sv/docs/post-install/automated.json new file mode 100644 index 00000000..02fbc2ca --- /dev/null +++ b/web/messages/sv/docs/post-install/automated.json @@ -0,0 +1,172 @@ +{ + "meta": { + "title": "Automatiserat efterinstallationsskript | ProxMenux Dokumentation", + "description": "ProxMenux automatiserade efterinstallationsskript kör 14 förvalda optimeringar anpassade efter hårdvaran på en ny Proxmox VE-värd. Det saknar checklista för funktionsval men kan be om bekräftelse för prenumerationsvarningen, vissa Log2RAM-installationer och omstart. Återställbara konfigurationsändringar registreras.", + "ogTitle": "Automatiserat efterinstallationsskript | ProxMenux Dokumentation", + "ogDescription": "14 fasta, hårdvaruanpassade optimeringar för en ny Proxmox VE-värd, med bekräftelse för vissa åtgärder och registrering av återställbara ändringar." + }, + "header": { + "title": "Automatiserat efterinstallationsskript", + "description": "ProxMenux kör 14 förvalda grundoptimeringar utan checklista för funktionsval. Vissa åtgärder kräver bekräftelse. Återställbara konfigurationsändringar registreras för Avinstallera optimeringar; paketuppgraderingar beskrivs inte som återställbara.", + "section": "Post-Install · Automatiserad" + }, + "intro": { + "title": "När du ska välja automatiserad efterinstallation", + "body": "Kör detta på en nyinstallerad Proxmox-värd när du vill ha den vettiga baslinjen utan att ta beslut. Skriptet är idempotent - att köra det två gånger är säkert, det tillämpar bara samma konfigurationer igen. Opt-in-funktioner (Fastfetch, IOMMU, Ceph repo, HA, AMD-fixar...) är avsiktligt inte en del av denna väg; välj dem från Anpassningsbara om du behöver dem." + }, + "applies": { + "heading": "Vad skriptet tillämpar", + "intro": "Optimeringarna tillämpas i exakt denna ordning. Kolumnen Kategori länkar till utförlig dokumentation om varje ändring i den anpassningsbara efterinstallationen.", + "headerNum": "#", + "headerTool": "Verktyg", + "headerWhat": "Vad det gör", + "headerCategory": "Kategori" + }, + "optimizations": [ + { + "tool": "APT-repositorier + full uppgradering", + "what": "Inaktiverar företagsförråden pve-enterprise.sources och ceph.sources, skriver en no-subscription-källa för värdens Debian-kodnamn och kör sedan apt update && apt full-upgrade -y, Proxmox officiella uppgraderingskommando.", + "category": "Grundinställningar", + "categorySlug": "basic-settings" + }, + { + "tool": "Borttagning av prenumerationsvarning", + "what": "Ändrar webbgränssnittet för att dölja varningen ”Ingen giltig prenumeration”. Ber om bekräftelse före ändringen; kan återställas via Avinstallera optimeringar.", + "category": "Anpassning", + "categorySlug": "customization" + }, + { + "tool": "Tvinga IPv4", + "what": "Skriver /etc/apt/apt.conf.d/99-force-ipv4 så att apt bara använder IPv4 och kringgår instabila IPv6-anslutningar till speglar.", + "category": "Nätverk", + "categorySlug": "network" + }, + { + "tool": "Hoppa över språkpaket", + "what": "Skriver /etc/apt/apt.conf.d/99-disable-translations för att sluta hämta index över översatta paketbeskrivningar och minska datamängden vid apt-uppdateringar.", + "category": "Grundinställningar", + "categorySlug": "basic-settings" + }, + { + "tool": "Öka systemgränserna", + "what": "Höjer antalet inotify-bevakningar, nofile/nproc-gränser, kärnans nyckelringsgränser och fs.file-max via sysctl.d, limits.d, pam och systemd för värdar med många containrar.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Minnesjustering", + "what": "Sätter vm.swappiness=10, balanserade andelar ändrade men ännu inte skrivna minnessidor, vm.max_map_count=262144 och proaktiv minneskompaktering när det stöds. Kärnans policy för minnesöverallokering behåller Proxmox standardvärde.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Beteende vid kärnpanik", + "what": "Konfigurerar värden för att starta om 10 sekunder efter en panik / oops / hardlockup istället för att frysa på obestämd tid.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Justering av nätverksstacken", + "what": "TCP-buffertstorlekar, IPv4-härdning (omdirigeringar av, rp_filter=2, martian-loggning av), lokala portar 1024-65535, TCP MTU-avkänning, RFC 1337 och hjälpskriptet /usr/local/sbin/proxmenux-fwbr-tune kopplat till en engångsenhet i systemd och en udev-regel. Därmed återställs rp_filter=0 / log_martians=0 på fwbr*/fwln*/fwpr*/tap* varje gång Proxmox återskapar dem när VM:ar startas/stoppas, vid omstart eller livemigrering.", + "category": "Nätverk", + "categorySlug": "network" + }, + { + "tool": "Anpassning av bashrc (root)", + "what": "Färgad PS1, vanliga alias (l/la/ll/ls/grep), tidsstämplad historik och inläsning av bash-completion, allt i ett avgränsat PMX_CORE_BASHRC-block som är lätt att ta bort.", + "category": "Anpassning", + "categorySlug": "customization" + }, + { + "tool": "Log2RAM (SSD-medveten, auto)", + "what": "Minskar SSD-/NVMe-slitage genom att flytta /var/log till en tmpfs-ramdisk med regelbunden synkronisering till disk. Installation från ursprungsprojektet när rotdisken är SSD eller NVMe. Storlek efter värdens RAM (128M / 256M / 512M), periodisk synkronisering och skydd som rensar äldre journaler vid 80% fyllnadsgrad och trunkerar snabbt växande loggar vid 92% före skrivning. Anpassar journald-gränser till ramdisken. Detaljer på Log2RAM.", + "category": "Lagring", + "categorySlug": "storage" + }, + { + "tool": "ZFS autotrim (endast SSD)", + "what": "Aktiverar zpool autotrim=on för varje ZFS-pool där alla vdevs är SSD- eller NVMe-enheter med TRIM-stöd. Kontrollerar /sys/block/[dev]/queue/rotational och discard_granularity. Pooler med hårddiskar hoppas över. Endast pooler som ProxMenux faktiskt ändrar registreras för återställning vid avinstallation; manuellt aktiverad autotrim lämnas oförändrad.", + "category": "Lagring", + "categorySlug": "storage" + }, + { + "tool": "Journald storleksgränser", + "what": "Tvingar beständig lagring, begränsar SystemMaxUse=64M / RuntimeMaxUse=60M och aktiverar komprimering och info-loggning som Monitor behöver. Hoppas över när Log2RAM är aktivt eftersom det gör sin egen justering.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Justering av logrotate", + "what": "Sätter globalt daily följt av size 10M, sparar 7 rotationer och aktiverar komprimering och copytruncate. Det senare storleksvillkoret får företräde; enskilda loggregler kan åsidosätta det. Lämpligt för Log2RAM men frekvensen beror på regler och timer.", + "category": "System", + "categorySlug": "system" + }, + { + "tool": "Beständiga gränssnittsnamn", + "what": "Skriver en /etc/systemd/network/10-proxmenux-<iface>.link per fysiskt nätverkskort med rubriken ”Managed by ProxMenux” som binder MAC till aktuellt namn. Namn som eth0 / enp… förblir stabila efter omstarter och nya nätverkskort.", + "category": "Nätverk", + "categorySlug": "network" + } + ], + "hardwareTitle": "Hårdvaruanpassade standardvärden", + "hardwareBody": "Skriptet läser värdhårdvaran innan inställningar tillämpas. Log2RAM är bara installerat på SSD / NVMe rotdiskar som standard (den frågar om upptäckten säger något annat). Log2RAM ramdiskstorlek väljs från totalt RAM (≤ 8 GB → 128M, ≤ 16 GB → 256M, '>' 16 GB → 512M). De journald gränser matchas till ramdiskstorleken när Log2RAM är aktivt, för att undvika att fylla det.", + "upgrade": { + "heading": "Uppdatera och uppgradera systemet", + "intro": "Det första steget i Automated-paketet är Proxmox-uppgraderingen. Proxmox egen uppgraderingsvägledning för en löpande värd (inom samma stora version) är att köra:", + "after": "Denna rad är det officiella kommandot för aktuella Proxmox-versioner. Skriptet kör exakt detta och lägger till förrådsstädning och efterarbete enligt uppgraderingsguiden — samma steg som det fristående verktyget Proxmox systemuppdatering:", + "items": [ + "Inaktiverar Enterprise-källorna pve-enterprise.sources / ceph.sources, tar bort äldre förrådsfiler och skriver en no-subscription-källa för värdens kodnamn.", + "Kör uppgraderingen utan interaktion med DEBIAN_FRONTEND=noninteractive och --force-confdef --force-confold. Anpassade konfigurationsfiler behålls även när de har ändrats i ursprungsprojektet.", + "Installerar viktiga Proxmox-paket om de saknas (zfsutils-linux, proxmox-backup-restore-image, chrony).", + "Kontroll av LVM-metadatas rimlighet, apt-get autoremove -y + apt-get autoclean -y och omstartsfråga bara om kärnan faktiskt ändrats." + ], + "sameTitle": "Samma uppdaterare, två ingångspunkter", + "sameBody": "Automatiserad bunt och fristående Proxmox System Update-verktyget delar samma underliggande skript (update-pve8.sh / update-pve9_2.sh). Använd verktyget på egen hand när du bara vill uppgradera värden utan att tillämpa resten av optimeringarna." + }, + "endResult": { + "heading": "Förväntat slutresultat", + "body": "När skriptet är klart visas ett framgångsmeddelande med utdata från varje steg och en fråga om omstart, eftersom vissa kärninställningar kräver det. Du kan skjuta upp omstarten; inställningarna gäller vid nästa start.", + "imageAlt": "Automatiserat efterinstallationsskript — slutlig terminalutdata med varje optimering genomförd" + }, + "notDoes": { + "heading": "Vad skriptet INTE gör", + "items": [ + "Automatisk tidszonsidentifiering (bortkommenterad i källskriptet; använd Anpassningsbar om du vill ha den).", + "Inaktivera portmapper / rpcbind (se Säkerhet).", + "Aktivera IOMMU / VFIO (se Virtualisering).", + "Installera Fastfetch / Figurine / Ceph-förråd / HA / AMD-CPU-korrigeringar (se Valfritt).", + "Installera pigz eller justera ZFS ARC (se Prestanda / Lagring)." + ] + }, + "xshokTitle": "xshok-proxmox detektering", + "xshokBody": "Om värden redan har kört skriptet xshok-proxmox upptäcker ProxMenux markörfilen och varnar innan du fortsätter. Vissa ändringar kan överlappa. Kompanjonskriptet är föråldrat; om du ändå fortsätter, läs översikten för sammanhang.", + "revert": { + "heading": "Revertering", + "body": "Varje verktyg i tabellen registreras i /usr/local/share/proxmenux/installed_tools.json. Öppna Avinstallera optimeringar och välj vilka delar som ska återställas. Kopior av ändrade konfigurationsfiler ligger bredvid originalen med suffixet .bak." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — Välj exakt vad du vill ha från samma katalog." + }, + { + "label": "Avinstallera optimeringar", + "href": "/docs/post-install/uninstall", + "tail": " — återställ valfria delar av ändringarna som gjorts här." + }, + { + "label": "Användbara systemkommandon", + "href": "/docs/help-info/system-commands", + "tail": " — verifiera ändringarna (uptime, free, journalctl osv.)." + }, + { + "label": "Översikt över efterinstallation", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/basic-settings.json b/web/messages/sv/docs/post-install/basic-settings.json new file mode 100644 index 00000000..44a4b929 --- /dev/null +++ b/web/messages/sv/docs/post-install/basic-settings.json @@ -0,0 +1,240 @@ +{ + "meta": { + "title": "Post-Install: Grundläggande inställningar | ProxMenux Dokumentation", + "description": "Grundalternativ efter installationen: byt till Proxmox paketförråd utan prenumeration och uppgradera, identifiera tidszon och aktivera NTP, hoppa över APT-översättningar och välj bland 25 vanliga systemverktyg att installera." + }, + "header": { + "title": "Post-Install: Grundläggande inställningar", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad denna kategori täcker", + "body": "Fem grundval för en ny Proxmox-värd: byt till gemenskapens paketförråd utan prenumeration, uppgradera hela systemet, konfigurera tidszon och NTP automatiskt, stäng av APT-översättningar för att spara bandbredd och diskutrymme och välj bland 25 vanliga verktyg." + }, + "upgrade": { + "heading": "Uppdatera och uppgradera systemet", + "intro": "Ställer om APT till det kostnadsfria förrådet pve-no-subscription i stället för Enterprise-förrådet som kräver prenumeration och uppgraderar hela systemet. Stegen beror på huvudversionen av Proxmox VE; ProxMenux identifierar den och startar rätt skript.", + "headerVersion": "PVE-version", + "headerScript": "Fördelningsskript", + "headerCodename": "Debians kodnamn", + "rows": [ + { + "version": "9.x", + "script": "update-pve9_2.sh", + "codename": "trixie" + }, + { + "version": "8.x", + "script": "update-pve8.sh", + "codename": "bookworm" + } + ], + "officialTitle": "Den officiella Proxmox rekommendation", + "officialBody": "Proxmox egna uppgraderingsvägledning är att köra i denna exakta ordning:", + "officialOutro": "Detta är det vanliga kommandot för uppdateringar inom den installerade huvudversionen av Proxmox VE. Kontrollera paketförråden och de föreslagna paketändringarna innan du fortsätter. Byte av huvudversion kräver den officiella migreringsproceduren.", + "doesTitle": "Vad ProxMenux-alternativet gör - verifierad mot skriptet", + "doesIntro": "ProxMenux-uppdateraren kör apt-kommandona ovan och lägger till för- och eftersteg som du annars behöver hantera manuellt. Punkterna nedan motsvarar vad versionsskriptet gör; se Proxmox systemuppdatering för hela beskrivningen.", + "doesItems": [ + "Städa först i paketarkiven. Inaktiverar Enterprise-källorna pve-enterprise.sources / ceph.sources, tar bort gamla arkivfiler från tidigare PVE-versioner och skriver en ren proxmox.sources som pekar på den kostnadsfria kanalen pve-no-subscription, anpassad till värdens Debian-kodnamn: trixie för PVE 9, bookworm för PVE 8.", + "Skriver om Debians paketförråd med main / updates / security och non-free-firmware, så att firmwarevarningen vid uppgradering försvinner.", + "Kör den officiella uppgraderingen. apt-get update följt av apt full-upgrade -y (PVE 9) eller apt dist-upgrade -y (PVE 8), båda utan interaktion med --force-confdef --force-confold för att behålla anpassade konfigurationsfiler.", + "Installerar viktiga paket om de saknas: zfsutils-linux, proxmox-backup-restore-image, chrony.", + "Kontrollerar LVM-metadata. Söker efter VM:ar med diskgenomkoppling som kan ha lämnat gamla fysiska volymhuvuden på rådiskar. Varnar vid avvikelser utan automatisk åtgärd.", + "Rengör efteråt: apt-get autoremove -y + apt-get autoclean -y, sedan uppmanar till en omstart om kärnan uppdaterades eller /var/run/reboot-required är närvarande." + ], + "shortTitle": "Kort sagt", + "shortBody": "Alternativet kör rekommenderade apt update && apt full-upgrade -y, lägger till förråds- och efterstädning som beskrivs i den officiella guiden och frågar om omstart i slutet. Se Proxmox systemuppdatering för hela diagrammet — samma uppdaterare finns separat i huvudmenyn.", + "subTitle": "Tillämpa inte på en värd med prenumeration", + "subBody": "Om du har Proxmox-prenumeration och vill behålla Enterprise-förråden ska du hoppa över alternativet. Det stänger av Enterprise och byter till gemenskapskanalen. Paketuppgradering och omskrivning av förråd kan inte återställas via Avinstallera optimeringar; konfigurera förråden uttryckligen om du senare vill byta kanal.", + "safetyTitle": "Säkerhetskontroll efter uppdatering", + "safetyBody": "Efter uppgraderingen söker skriptet efter gamla metadata för fysiska volymer (PV) på diskar. Det kan uppstå när en VM med diskgenomkoppling skriver LVM-huvuden på en rådisk. Misstänkta fynd ger en varning med förslaget att granska med pvs. Inga automatiska åtgärder utförs." + }, + "time": { + "heading": "Synkronisera tiden automatiskt", + "intro": "Hämtar serverns offentliga IP-adress med dig myip.opendns.com @resolver1.opendns.com, frågar sedan ipapi.co/'{'ip'}'/timezone efter motsvarande IANA-tidszon och ställer in den med timedatectl set-timezone. Aktiverar slutligen NTP med timedatectl set-ntp true.", + "depTitle": "Beroende på två externa tjänster", + "depBody": "Uppslagningen är beroende av att OpenDNS och ipapi.co kan nås och att deras svar är korrekta. Om du kör Proxmox bakom en VPN eller på en VLAN som avgår från en annan region, kan den automatiska upptäckta tidszonen vara fel. I det fallet hoppa över detta alternativ och ställa in tidszonen för hand:", + "revertTitle": "Kan återställas från Avinstallera-menyn", + "revertBody": "Avinstallera optimeringar återställer tidszonen till UTC, ett säkert standardval. NTP förblir aktivt: klockan fortsätter synkroniseras och visar UTC tills du ställer in en annan tidszon." + }, + "languages": { + "heading": "Hoppa över nedladdning av ytterligare språk", + "intro": "Vid apt update kan APT hämta översatta paketbeskrivningar utöver huvudmetadata. Alternativet stänger av dessa för att spara bandbredd och diskutrymme. Först kontrollerar ProxMenux att värdens regionala inställning är genererad: läser /etc/default/locale eller /etc/environment, lägger till i /etc/locale.gen vid behov och kör locale-gen. Därmed behålls skalets regionala inställning.", + "writtenTitle": "Vad blir skrivet", + "revertTitle": "Kan återställas från Avinstallera-menyn", + "revertBody": "Ta bort /etc/apt/apt.conf.d/99-disable-translations (antingen manuellt eller från avinstallationsmenyn) återställer standardbeteendet och APT hämtar språkfiler igen." + }, + "utilities": { + "heading": "Installera vanliga systemverktyg", + "intro": "Öppnar en grupperad lista med 25 utvalda verktyg. Välj och bekräfta; ProxMenux installerar dem via apt, kontrollerar resultatet och visar en sammanfattning.", + "imageAlt": "Val av ProxMenux-systemverktyg: mellanslag väljer och Enter bekräftar", + "reuseTitle": "Samma lista återanvänds någon annanstans", + "reuseBody": "Katalogen med 25 verktyg definieras centralt: PROXMENUX_UTILS i scripts/global/utils-install-functions.sh. Menyn Hjälpprogram och verktyg → Systemverktyg erbjuder samma lista för senare installationer utan att köra efterinstallationen igen.", + "listTitle": "Vad finns i listan", + "groups": [ + { + "group": "Systemövervakare", + "items": [ + { + "pkg": "htop", + "desc": "Interaktiv processvisare" + }, + { + "pkg": "btop", + "desc": "Modern resursövervakning (CPU, RAM, diskar, nät, processer)" + }, + { + "pkg": "s-tui", + "desc": "Terminalgränssnitt för CPU-belastningstest och övervakning" + }, + { + "pkg": "iftop", + "desc": "Bandbreddsanvändning per anslutning i realtid" + }, + { + "pkg": "iotop", + "desc": "Disk-I/O per process" + }, + { + "pkg": "iptraf-ng", + "desc": "Interaktiv IP-/LAN-övervakare" + } + ] + }, + { + "group": "Nätverk", + "items": [ + { + "pkg": "iperf3", + "desc": "Mät maximal uppnåelig bandbredd mellan värdar" + }, + { + "pkg": "net-tools", + "desc": "Äldre verktyg (ifconfig, netstat, route). Fortfarande användbara för snabba kontroller" + }, + { + "pkg": "ipset", + "desc": "Hantera stora IP-uppsättningar i kärnan - användbart med iptables/nftables-regler." + } + ] + }, + { + "group": "Nedladdning och arkivering", + "items": [ + { + "pkg": "axel", + "desc": "Resurssnål accelerator för parallella nedladdningar" + }, + { + "pkg": "aria2", + "desc": "Nedladdare med flera källor och protokoll (HTTP, FTP, BitTorrent, Metalink)" + }, + { + "pkg": "unzip", + "desc": "Extrahera ZIP arkiv" + }, + { + "pkg": "zip", + "desc": "Skapa ZIP-arkiv" + }, + { + "pkg": "cabextract", + "desc": "Packa upp Microsoft CAB-arkiv (användbart för Windows-ISO-filer)" + }, + { + "pkg": "wimtools", + "desc": "Hantera Windows WIM-avbildningar (extrahera, dela, montera, tillämpa)" + }, + { + "pkg": "genisoimage", + "desc": "Skapa ISO 9660-avbildningar från en katalog" + } + ] + }, + { + "group": "Text och filer", + "items": [ + { + "pkg": "dos2unix", + "desc": "Konvertera CRLF-radslut (Windows) till LF (Unix)" + }, + { + "pkg": "grc", + "desc": "Allmän färgmarkering: ger syntaxmarkering åt utdata från ping, traceroute, dig, tail med flera" + }, + { + "pkg": "plocate", + "desc": "Snabb filsökning (indexerad). Kör `updatedb` efter installation för att bygga indexet." + } + ] + }, + { + "group": "Fjärråtkomst och sessioner", + "items": [ + { + "pkg": "sshpass", + "desc": "SSH-lösenordsautentisering utan interaktion (användbart för skript, inte för dagligt bruk)" + }, + { + "pkg": "tmux", + "desc": "Terminalmultiplexer: koppla loss sessioner, dela paneler och behåll sessioner efter frånkoppling" + } + ] + }, + { + "group": "Hårdvara och låg nivå", + "items": [ + { + "pkg": "msr-tools", + "desc": "Läs/skriv CPU-modellspecifika register (rdmsr, wrmsr)" + }, + { + "pkg": "intel-gpu-tools", + "desc": "Intel GPU diagnostiska verktyg inklusive `intel_gpu_top`" + } + ] + }, + { + "group": "Virtualisering", + "items": [ + { + "pkg": "libguestfs-tools", + "desc": "Inspektera och ändra VM-diskavbildningar (virt-ls, virt-cat, guestmount…)" + }, + { + "pkg": "chntpw", + "desc": "Redigera Windows SAM - användbar för återställning av lösenord på Windows VMs du ärver" + } + ] + } + ], + "actionTitle": "Några exempel i praktiken", + "noBulkTitle": "Endast ProxMenux-installerade verktyg tas bort", + "noBulkBody": "ProxMenux registrerar bara valda paket som inte redan var installerade. Avinstallera optimeringar rensar bort dessa paket och behåller tidigare installerade paket. APT-uppgraderingar har ingen säker atomär återställning: avinstallation av verktygen återställer inte systemuppgraderingen." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Proxmox systemuppdatering", + "href": "/docs/utils/system-update", + "tail": " — Kör cykeln apt update + dist-upgrade igen vid behov." + }, + { + "label": "Installationsprogram för systemverktyg", + "href": "/docs/utils/system-utils", + "tail": " - installera (eller installera om) verktyg individuellt efter post-install." + }, + { + "label": "Uppdateringar och paketkommandon", + "href": "/docs/help-info/update-commands", + "tail": " — apt-referens för skalet." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/customizable.json b/web/messages/sv/docs/post-install/customizable.json new file mode 100644 index 00000000..b592c041 --- /dev/null +++ b/web/messages/sv/docs/post-install/customizable.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Anpassningsbart skript efter installation | ProxMenux-dokumentation", + "description": "Välj exakt vilka optimeringar ProxMenux ska tillämpa på en Proxmox VE-värd. 10 kategorier, cirka 35 verktyg och ett gränssnitt med kryssrutor. Innehåller allt i det automatiserade skriptet samt uttryckligen valbara funktioner (IOMMU, Fastfetch, Figurine, Ceph, HA, AMD-korrigeringar …).", + "ogTitle": "Anpassningsbart skript efter installation | ProxMenux-dokumentation", + "ogDescription": "10 kategorier, ~ 35 individuella optimeringar. Välj exakt vad du vill ha på en Proxmox VE värd. Reversibla förändringar spåras." + }, + "header": { + "title": "Anpassningsbart skript efter installation", + "description": "Välj exakt vilka optimeringar som ska tillämpas på en Proxmox VE-värd. ProxMenux grupperar cirka 35 verktyg i 10 kategorier i en gemensam dialog med kryssrutor. Samma motor som Automatiserad, med full kontroll över vad som tillämpas.", + "section": "Efter installation · Anpassningsbar" + }, + "intro": { + "title": "När du ska välja Anpassningsbar", + "body": "Välj detta om du redan vet vilka justeringar du vill ha eller undvika på värden. En lista med kryssrutor grupperade per kategori låter dig välja, avmarkera och kombinera optimeringar. Poster kan tillämpas igen senare och återställbara ändringar registreras för Avinstallera optimeringar. Paketuppgraderingar presenteras inte som återställbara." + }, + "compare": { + "heading": "Jämförelse med Automatiserad", + "body": "Anpassningsbar innehåller hela det automatiserade skriptet: samma 14 grundoptimeringar och en lång lista med valbara alternativ som Automatiserad avsiktligt hoppar över. De passar viss maskinvara (AMD-korrigeringar), viss hosting (OVH RTM) eller särskilda arbetslaster (IOMMU/VFIO, Ceph-förråd, hög tillgänglighet, Fastfetch, Figurine, justering av ZFS ARC, pigz, automatiska ZFS-ögonblicksbilder, hastighetsgränser för vzdump, Open vSwitch, TCP BBR …)." + }, + "categoriesSection": { + "heading": "De 10 kategorierna", + "body": "Det anpassningsbara skriptet grupperar optimeringarna i 10 kategorier i en gemensam dialog med kryssrutor. Varje kategori har en egen dokumentationssida — öppna ett kort nedan för motivering, standardvärden och verifieringssteg för varje alternativ." + }, + "categories": [ + { + "name": "Grundinställningar", + "description": "Rensar APT-källorna, kör den officiella Proxmox-uppgraderingen och ställer in tidszon, regionala inställningar och vanliga verktyg. Grunden för alla andra kategorier." + }, + { + "name": "System", + "description": "Justerar loggning och kärngränser för en värd med många VM:ar och containrar. Omfattar journald, logrotate, sysctl (minne och filgränser), beteende vid kärnpanik och snabba omstarter." + }, + { + "name": "Virtualisering", + "description": "Förbereder värden för avancerad virtualisering. Installerar rätt gästagent när Proxmox självt körs i en VM som stöds och aktiverar IOMMU/VFIO för PCI-genomkoppling av GPU:er, styrenheter och TPU:er." + }, + { + "name": "Nätverk", + "description": "Stärker och justerar värdens nätverksstack. Tvingar APT över IPv4, tillämpar säkerhetsinställningar i sysctl och TCP-buffertjusteringar, erbjuder Open vSwitch, TCP BBR och TCP Fast Open och binder beständiga gränssnittsnamn till MAC-adresser." + }, + { + "name": "Lagring", + "description": "Konfigurerar Proxmox vanliga lagringsdelsystem: ZFS ARC-storlek, automatiska ZFS-ögonblicksbilder, ZFS autotrim för SSD-/NVMe-pooler och hastighetsgränser för vzdump så att diskar inte mättas under säkerhetskopiering." + }, + { + "name": "Säkerhet", + "description": "Minskar attackytan som exponeras som standard. Inaktiverar RPC-tjänsterna portmapper/rpcbind som Proxmox inte behöver men lämnar lyssnande." + }, + { + "name": "Anpassning", + "description": "Ändrar värdens utseende och skalmiljö: färger och alias i bashrc, MOTD-banner och borttagning av prenumerationsmeddelandet i webbgränssnittet." + }, + { + "name": "Övervakning", + "description": "Integrerar värden med OVH Real-Time Monitoring. Installerar RTM bara om ProxMenux identifierar en OVH-server; på andra värdar ändrar alternativet ingenting." + }, + { + "name": "Prestanda", + "description": "Snabbar upp komprimering vid säkerhetskopiering och överföringar genom att ersätta gzip med dess parallella motsvarighet pigz." + }, + { + "name": "Valfritt", + "description": "Specialiserade alternativ som inte alla värdar behöver: AMD CPU-korrigeringar, Fastfetch-banner, 3D-värdnamn med Figurine, uppdatering av PVE Appliance Manager-indexet, Ceph-förråd, tjänster för hög tillgänglighet, Log2RAM för mindre SSD-slitage och en ZRAM-swapprofil." + } + ], + "mixTip": { + "title": "Kombinera Automatiserad och Anpassningsbar", + "body": "Ett vanligt upplägg: kör först Automatiserad för rimliga grundinställningar, öppna sedan Anpassningsbar och välj bara de extra verktyg du behöver, till exempel IOMMU för GPU-genomkoppling. Ändringarna registreras separat; Avinstallera visar allt du har tillämpat oavsett vilken väg som lade till det." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Automatiserad efterinstallation", + "href": "/docs/post-install/automated", + "tail": " — rimliga standardvärden som tillämpas utan frågor." + }, + { + "label": "Avinstallera optimeringar", + "href": "/docs/post-install/uninstall", + "tail": " — återställ valda ändringar utan rester." + }, + { + "label": "Grundinställningar", + "href": "/docs/post-install/basic-settings", + "tail": " — repos, tid, språk, verktyg." + }, + { + "label": "Virtualisering", + "href": "/docs/post-install/virtualization", + "tail": " — IOMMU + VFIO för genomkoppling." + }, + { + "label": "Säkerhet", + "href": "/docs/post-install/security", + "tailRich": " · Lagring · Nätverk · Anpassning - andra kategorier." + }, + { + "label": "Översikt efter installation", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/customization.json b/web/messages/sv/docs/post-install/customization.json new file mode 100644 index 00000000..c4882529 --- /dev/null +++ b/web/messages/sv/docs/post-install/customization.json @@ -0,0 +1,74 @@ +{ + "meta": { + "title": "Post-Install: Anpassning | ProxMenux Dokumentation", + "description": "Anpassningar i ProxMenux anpassningsbara skript efter installationen: färgad bash-prompt med användbara alias, ProxMenux-banner i MOTD och möjlighet att ta bort prenumerationsmeddelandet från Proxmox webbgränssnitt." + }, + "header": { + "title": "Efter installationen: anpassning", + "description": "Visuella och praktiska justeringar för Proxmox-värden. De gör skalet trevligare och döljer prenumerationsmeddelandet i webbgränssnittet. Bashrc, MOTD och bannern registreras och kan återställas via Avinstallera.", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad denna kategori täcker", + "body": "Tre små oberoende alternativ: en färgad bash-prompt med alias för root-skalet, en enradig MOTD-banner vid SSH-inloggning och borttagning av popupen ”Ingen giltig prenumeration” som Proxmox visar vid varje webbinloggning." + }, + "bashrc": { + "heading": "Anpassa bashrc", + "intro": "Lägger in ett förberett block i /root/.bashrc med färgad prompt, tidsstämplad historik, vanliga ls-/grep-alias och en source för bash-komplettering. Gör arbetet via SSH trevligare och visar tydligt vilken värd du är på när många flikar är öppna.", + "writesTitle": "Vad ProxMenux lägger till .bashrc", + "writesOutro": "Blocket avgränsas av markörerna PMX_CORE_BASHRC. Om skriptet körs igen ersätts det gamla blocket utan att dupliceras. Ursprunglig .bashrc säkerhetskopieras en gång till /root/.bashrc.bak, och raden source /root/.bashrc läggs till i /root/.bash_profile så att prompten även gäller i inloggningsskal, till exempel efter su -.", + "rootTitle": "Gäller för root endast", + "rootBody": "Anpassningen gäller root-kontots skal. Andra användare på värden behåller sina egna standardinställningar. Om du bara administrerar Proxmox via webben och aldrig använder skalet kan du hoppa över detta rent estetiska alternativ." + }, + "motd": { + "heading": "Konfigurera anpassad MOTD-banner", + "intro": "Lägger \"This system is optimised by: ProxMenux\" först i /etc/motd, meddelandet efter lyckad SSH-inloggning ovanför prompten och före update-motd-skript. Ofarligt och rent informativt — en snabb synlig bekräftelse på att ProxMenux har tillämpats på värden.", + "writesTitle": "Vad ProxMenux skriver", + "writesOutro": "Vid första tillämpningen registrerar ProxMenux om /etc/motd fanns och sparar originalinnehållet under /usr/local/share/proxmenux. Åtgärden är idempotent: om markörraden redan finns läggs inget till. Äldre installationer med /etc/motd.bak migreras till samma återställbara tillstånd." + }, + "banner": { + "heading": "Ta bort prenumerationsbanner", + "intro": "Tar bort dialogen ”Du har ingen giltig prenumeration för den här servern” som visas vid varje webbinloggning i Proxmox utan Enterprise-prenumeration. ProxMenux tar hänsyn till versionen och väljer rätt skript för huvudversionernas olika gränssnittspaket.", + "versionTitle": "Val av skript efter version", + "versionItems": [ + "PVE 9.x → kör remove-banner-pve-v3.sh, som patchar både proxmoxlib.js för datorgränssnittet och det nya Yew-baserade mobilgränssnittet.", + "PVE 8.x → kör remove-banner-pve8.sh, endast för datorgränssnittet." + ], + "versionOutro": "Före patchningen säkerhetskopierar ProxMenux originalfilerna för JS/mallar till /usr/local/share/proxmenux/backups/ med tidsstämpel. Avinstallationen återställer filerna därifrån eller installerar om Proxmox gränssnittspaket om säkerhetskopian saknas eller är skadad.", + "breakTitle": "Kan bryta efter Proxmox uppdateringar", + "breakBody": "Proxmox gränssnittsuppdateringar skriver regelbundet över proxmoxlib.js, vilket kan få meddelandet att återkomma. Du kan tillämpa alternativet igen eller acceptera meddelandet tills dess. ProxMenux installerar också en APT-hook som patchar om efter paketuppgraderingar — se Avinstallera optimeringar för hur den tas bort.", + "legalTitle": "Juridisk anmärkning (alltid värt att upprepa)", + "legalBody": "Alternativet döljer bara gränssnittets meddelande. Det ger inte Enterprise-support eller åtkomst till Enterprise-förrådet och ändrar inte programvarans licens. Proxmox VE ges ut under GNU AGPLv3. En prenumeration stödjer projektet och ger åtkomst till Enterprise-uppdateringskanalen; välj rätt supportnivå för din miljö." + }, + "verify": { + "heading": "Verifiering", + "intro": "Efter att ha applicerat alla tre:", + "reversibleTitle": "Alla tre anpassningsförändringar spåras", + "reversibleBody": "Avinstallera optimeringar återställer /root/.bashrc, återför MOTD till exakt innehåll före ProxMenux eller tar bort filen om den inte fanns tidigare och återställer patchade gränssnittsfiler från säkerhetskopian eller installerar om berörda paket vid behov." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Valfritt", + "href": "/docs/post-install/optional", + "tail": " — Fastfetch och Figurine (andra visuella anpassningar)." + }, + { + "label": "Visa versionsinformation", + "href": "/docs/settings/show-version-information", + "tail": " — bekräftar att anpassningarna spåras som installerade." + }, + { + "label": "Avinstallera optimeringar", + "href": "/docs/post-install/uninstall", + "tail": " — återställ bashrc, motd och prenumerationsmeddelandet." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/index.json b/web/messages/sv/docs/post-install/index.json new file mode 100644 index 00000000..e9e49444 --- /dev/null +++ b/web/messages/sv/docs/post-install/index.json @@ -0,0 +1,106 @@ +{ + "meta": { + "title": "Skript efter installation av Proxmox VE — Automatiserat och anpassningsbart | ProxMenux", + "description": "Översikt över ProxMenux skript efter installation av Proxmox VE. Automatiserad tillämpar rimliga standardvärden utan frågor, Anpassningsbar låter dig välja exakt vad du vill i 10 kategorier och Avinstallera optimeringar återställer de ändringar som stöder återställning.", + "ogTitle": "Skript efter installation av Proxmox VE — Automatiserat och anpassningsbart", + "ogDescription": "Tillämpa vanliga optimeringar efter installation av Proxmox VE i 10 kategorier — automatiskt eller efter eget val, med återställbara alternativ.", + "twitterTitle": "Skript efter installation av Proxmox VE | ProxMenux", + "twitterDescription": "Automatiserade och anpassningsbara optimeringar efter installationen för Proxmox VE med reversibla alternativ." + }, + "header": { + "title": "Skript efter installationen", + "description": "Konfigurera en nyinstallerad Proxmox VE-värd med ProxMenux optimeringar efter installationen. Tillämpa grundinställningarna automatiskt, välj enskilda alternativ, uppdatera installerade funktioner eller återställ de ändringar som stöds. Paketuppgraderingar presenteras inte som återställbara.", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad menyn används till", + "body": "Efter installation av Proxmox VE finns dussintals små ändringar som gör värden snabbare och lättare att underhålla: paketförråd utan prenumeration, rimliga journald-gränser, lämpliga TCP-buffertar, SSD-vänlig logglagring, förbättringar i bashrc med mera. ProxMenux automatiserar dem och registrerar de konfigurationsändringar som stöder återställning." + }, + "openingMenu": { + "heading": "Öppna menyn", + "body": "Välj Inställningar efter installation av Proxmox i ProxMenux huvudmeny. Då visas följande:", + "imageAlt": "Menyn för skript efter installation: Automatiserad, Anpassningsbar, det villkorliga alternativet Tillämpa tillgängliga uppdateringar (bara vid väntande uppdateringar) och Avinstallera, följt av Gemenskapens skript" + }, + "threeWays": { + "heading": "Fyra sätt att tillämpa optimeringar", + "body": "De fyra ProxMenux-alternativen delar samma kod och register över installerade verktyg men ger olika grad av kontroll. Tillämpa tillgängliga uppdateringar visas bara när minst en installerad optimering har en nyare version på disk än den registrerade. På en nykonfigurerad värd är alternativet dolt." + }, + "routes": [ + { + "title": "Automatiserad", + "description": "Ett utvalt paket med 14 säkra och alltid användbara optimeringar som tillämpas i följd utan frågor. Ett bra standardval för de flesta användare.", + "bullets": [ + "Paketförråd utan prenumeration + systemuppgradering", + "Minne, kärna, nätverkstuning", + "Log2RAM (auto-detekterad på SSD/NVMe)", + "Journald + logrotate storleksgränser", + "Beständiga gränssnittsnamn" + ] + }, + { + "title": "Anpassningsbar", + "description": "Cirka 35 enskilda optimeringar i 10 kategorier. Du väljer exakt vilka som ska tillämpas. Samma motor som Automatiserad, med full kontroll.", + "bullets": [ + "Gränssnitt med kryssrutor per kategori", + "Innehåller allt i Automatiserad samt alternativ som väljs uttryckligen (IOMMU, Fastfetch, Figurine, Ceph, HA, AMD-korrigeringar …)", + "Kör så många gånger du vill — ändringarna är idempotenta" + ] + }, + { + "title": "Tillämpa tillgängliga uppdateringar", + "description": "När en optimering efter installationen (Log2Ram, minnesinställningar, Logrotate …) har en nyare version på disk än den registrerade visar alternativet bara de ändrade optimeringarna. Motsvarande funktion körs igen och registret uppdateras — inget annat ändras.", + "bullets": [ + "Uttryckligt val per optimering, endast de ändrade", + "Samma väljare finns i Monitors instrumentpanel", + "En samlad avisering när nya uppdateringar blir tillgängliga" + ] + }, + { + "title": "Avinstallera optimeringar", + "description": "Återställbara ändringar som stöds registreras i ett JSON-register och kopplas till en återställningsfunktion. Åtgärder utan säker återställning, som fullständig paketuppgradering, är avsiktligt uteslutna.", + "bullets": [ + "Detekterar tidigare tillämpade optimeringar automatiskt", + "Väljer rätt återställning för varje post: återställer från en .bak-säkerhetskopia om en sådan togs, tar bort konfigurationsfragmentet i sysctl.d om inget behövde säkerhetskopieras eller installerar om originalpaketet med --force-confnew (till exempel för prenumerationsbannern)", + "Fråga om omstart vid behov (VFIO, beständiga namn osv.)" + ] + } + ], + "whichTitle": "Vilken ska du välja?", + "whichBody": "För en ny Proxmox-installation med rimliga grundinställningar utan beslut: Automatiserad. Om du redan vet vilka justeringar du vill ha eller undvika: Anpassningsbar. För att bara uppdatera en tillämpad optimering som har en nyare version på disk: Tillämpa tillgängliga uppdateringar. För att återställa tidigare ändringar: Avinstallera optimeringar. Du kan kombinera dem: börja med Automatiserad, lägg sedan till Fastfetch eller IOMMU med Anpassningsbar och återställ enskilda poster senare.", + "mixing": { + "heading": "Blanda med andra post-install skript", + "stackTitle": "Kombinera inte flera skript efter installationen", + "stackBody": "Kör flera post-install-skript på samma värd kan orsaka duplicerade konfigurationsfiler, motstridiga sysctl-poster eller värre - brutna nätverk efter omstart. Om du redan tillämpade Helper-Scripts Post Install, kan vissa ProxMenux optimeringar överlappa med vad den redan konfigurerade. Håll dig till ett post-install-verktyg per värd.", + "xshokTitle": "xshok-proxmox: föråldrad", + "xshokBody": "Tidigare versioner av ProxMenux hänvisade till xshok-proxmox som ett kompletterande verktyg efter installationen. Projektet är nu föråldrat och erbjuds inte längre i ProxMenux. Om en tidigare körning lämnat markörer på värden upptäcker ProxMenux dem fortfarande och varnar dig. Det är dock inget som bör installeras tillsammans med ProxMenux i dag." + }, + "community": { + "heading": "Gemenskapens skript", + "body": "Menyn erbjuder också två tredjepartsskript från projektet community-scripts: Proxmox VE Post Install och Proxmox VE Microcode. Startskripten laddar ned och kör originalförfattarnas skript via wget | bash. De underhålls inte av ProxMenux. Se Externa paketförråd för detaljer och frågor om tillit innan du kör dem." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Proxmox systemuppdatering", + "href": "/docs/utils/system-update", + "tail": " — håller värden uppdaterad efter grundkonfigurationen." + }, + { + "label": "Säkerhet", + "href": "/docs/security", + "tail": " — Fail2Ban + Lynis utöver säkerhetsförstärkningen efter installationen." + }, + { + "label": "Visa versionsinformation", + "href": "/docs/settings/show-version-information", + "tail": " - se vilka postinstallationskomponenter som spåras som installerade." + }, + { + "label": "Uppdateringar och paketkommandon", + "href": "/docs/help-info/update-commands", + "tail": " — referens för apt / pveupgrade." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/monitoring.json b/web/messages/sv/docs/post-install/monitoring.json new file mode 100644 index 00000000..2ab048f3 --- /dev/null +++ b/web/messages/sv/docs/post-install/monitoring.json @@ -0,0 +1,56 @@ +{ + "meta": { + "title": "Post-Install: Övervakning | ProxMenux Dokumentation", + "description": "Övervakningsalternativ i ProxMenux anpassningsbara skript efter installationen. För närvarande ett alternativ: installera OVH Real-Time Monitoring (RTM), som bara aktiveras om värden identifieras som en OVH-server." + }, + "header": { + "title": "Efter installationen: övervakning", + "description": "Övervakningsalternativ i det anpassningsbara skriptet efter installationen. Denna lilla leverantörsspecifika kategori installerar OVH Real-Time Monitoring-agenten på dedikerade OVH-servrar och gör ingenting på andra värdar.", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Avsiktligt begränsad omfattning", + "body": "Övervakningen efter installationen begränsas till en leverantörsspecifik agent. Allmänna verktyg (Prometheus, Grafana, node_exporter) ingår inte här eftersom arkitekturval om separat värd, datalagring och aviseringsmål inte passar i ett steg med ett klick. ProxMenux Monitor, som ingår i ProxMenux, fyller större delen av den rollen utan extern agent." + }, + "ovh": { + "heading": "Installera OVH Real-Time Monitoring (RTM)", + "intro": "Om din Proxmox värd är en dedikerad server hyrd från OVHcloud, kan du aktivera RTM för att exponera hårdvara telemetri (CPU temperatur, PSU status, disk SMART, RAID controller state, etc.) till OVH kontrollpanelen. Detta är samma agent OVH använder för sin egen \"Server Monitoring\" -funktion.", + "decisionsTitle": "Hur ProxMenux bestämmer", + "decisionsItems": [ + "Hämtar värdens offentliga IP-adress med curl ipinfo.io/ip.", + "Slår upp internetleverantören som äger adressen med en whois-fråga till v4.whois.cymru.com.", + "Om resultatet nämner OVH hämtas last-public-ovh-infra-yak.snap.mirrors.ovh.net/yak/archives/apply.sh och skickas till bash med Puppet-manifestet för RTM v2.", + "Om resultatet inte nämner OVH, är ingenting installerat. Alternativet är en no-op." + ], + "remoteTitle": "Fjärrskript skickas via pipe till bash", + "remoteBody": "Installationen kör wget -qO - https://…apply.sh | bash. Om OVH-spegeln komprometteras körs skriptet som root på värden. Väg tilliten till OVH:s spegelkedja mot nyttan av övervakningen innan du aktiverar alternativet. För de flesta hemmaservrar och användare utanför OVH bör det vara avstängt.", + "noOpTitle": "Endast aktivera om värden faktiskt är på OVH", + "noOpBody": "Alternativet ändrar ingenting på servrar utanför OVH, så att kryssa i det på en hemmaserver med Proxmox orsakar inga problem. Skriptet skriver ”Inte en OVH-server, hoppar över RTM-installationen” och avslutas utan att installera paket.", + "runsTitle": "Vad ProxMenux kör", + "verifyTitle": "Verifiering", + "verifyBody": "På en riktig OVH-värd bör du efter omstart se RTM-panelen i OVH Manager med aktuella data från värden. På Proxmox-sidan är RTM-insamlaren en systemd-tjänst — kontrollera den direkt:", + "troubleTitle": "Felsökning", + "revertTitle": "Ta bort RTM via Avinstallera-menyn", + "revertBody": "När RTM är registrerat som installerat erbjuder Avinstallera optimeringar alternativet OVH Real-Time Monitoring. Det kör apt-get purge -y ''ovh-rtm*'' ''rtm'' ''rtm-*'', raderar /etc/rtm och markerar RTM som avinstallerat. Puppet-filer kan fortfarande behöva städas manuellt; granska RTM-specifika manifest i /etc/puppet/. På en värd utanför OVH installerades inga RTM-paket, så inget behöver tas bort." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "ProxMenux Monitor", + "href": "/docs/settings/proxmenux-monitor", + "tail": " — lokal webbpanel för värden som fungerar hos alla leverantörer, inte bara OVH." + }, + { + "label": "Användbara systemkommandon", + "href": "/docs/help-info/system-commands", + "tail": " — referens för övervakning av den lokala värden." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/network.json b/web/messages/sv/docs/post-install/network.json new file mode 100644 index 00000000..72858184 --- /dev/null +++ b/web/messages/sv/docs/post-install/network.json @@ -0,0 +1,128 @@ +{ + "meta": { + "title": "Post-Install: Nätverk | ProxMenux Dokumentation", + "description": "Nätverksalternativ i ProxMenux anpassningsbara efterinstallation: tvinga APT över IPv4, tillämpa en utvald sysctl-profil, installera Open vSwitch, aktivera TCP BBR + Fast Open och bind gränssnittsnamn till deras MAC-adresser." + }, + "header": { + "title": "Post-Install: Nätverk", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad denna kategori täcker", + "body": "Fem oberoende nätverksalternativ. Två är enkla (APT över IPv4, installation av Open vSwitch), två justerar TCP-beteendet (sysctl-profil för nätverk, BBR + Fast Open) och ett löser ett vanligt driftproblem: fasta gränssnittsnamn så att ett nytt nätverkskort eller en BIOS-uppdatering inte byter namn från enp3s0 till enp4s0 och bryter bryggorna." + }, + "ipv4": { + "heading": "Tvinga APT att använda IPv4", + "intro": "Skriver Acquire::ForceIPv4 \"true\"; till /etc/apt/apt.conf.d/99-force-ipv4. APT vägrar sedan att använda IPv6 för nedladdning av paket, även om värden har IPv6-anslutning.", + "tipTitle": "Vem har nytta av det", + "tipBody": "Användbart när IPv6-anslutningen är instabil, långsammare än IPv4 eller Debian-/Proxmox-spegeln ibland inte fungerar över IPv6. Ofarligt på värdar utan IPv6. I ett fungerande dual stack-nät ger det förutsägbart beteende: apt överraskar dig inte med en IPv6-timeout." + }, + "sysctl": { + "heading": "Tillämpa nätverksoptimeringar", + "intro": "Skriver en utvald sysctl-profil till /etc/sysctl.d/99-network.conf med kärnans socketbuffertar, ICMP-härdning, grundläggande skydd mot adressförfalskning och TCP-buffertstorlekar för en hypervisor med många samtidiga flöden.", + "tunedTitle": "Vad som justeras", + "headerArea": "Område", + "headerSettings": "Nyckelinställningar", + "rows": [ + { + "area": "Kärnans socketbuffertar", + "settings": "netdev_max_backlog=8192, rmem_max=16M, wmem_max=16M, somaxconn=8192" + }, + { + "area": "ICMP-härdning", + "settings": "icmp_echo_ignore_broadcasts=1, icmp_ignore_bogus_error_responses=1" + }, + { + "area": "Routningssäkerhet", + "settings": "accept_redirects=0, accept_source_route=0, secure_redirects=0, send_redirects=0, log_martians=0" + }, + { + "area": "Filter för omvänd väg", + "settings": "rp_filter=2 (löst läge, se nedan)" + }, + { + "area": "TCP", + "settings": "tcp_mtu_probing=1, tcp_rfc1337=1, tcp_sack=1, tcp_rmem=8K/87K/16M, tcp_wmem=8K/64K/16M" + }, + { + "area": "Portar", + "settings": "ip_local_port_range=1024 65535 (pool av tillfälliga portar)" + }, + { + "area": "Unix-socketar", + "settings": "net.unix.max_dgram_qlen=4096" + } + ], + "sourceOutro": "Lägger även till source /etc/network/interfaces.d/* i /etc/network/interfaces om det saknas. Det är standardpraxis för att kunna lägga till separata konfigurationsfiler för gränssnitt utan att redigera huvudfilen.", + "fwbrTitle": "Automatisk justering av virtuella brandväggsbryggor", + "fwbrBody": "Utöver sysctl-profilen installerar ProxMenux hjälpskriptet /usr/local/sbin/proxmenux-fwbr-tune, som sätter rp_filter=0 och log_martians=0 på gränssnitten fwbr* / fwln* / fwpr* / tap* som Proxmox skapar för VM:ar och containrar. Engångsenheten proxmenux-fwbr-tune.service kör det vid uppstart och regeln /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules vid varje net add-händelse med dessa prefix. Därmed täcks gränssnitt som återskapas när VM:ar startas/stoppas, vid omstart och vid livemigrering. Skriptet körs även direkt efter installationen för att behandla befintliga gränssnitt.", + "rpFilterTitle": "Varför rp_filter=2 (löst) i stället för 1 (strikt)", + "rpFilterBody": "Strikt filtrering av omvänd väg kastar paket vars källa skulle nås via ett annat gränssnitt. Det är en lämplig standard för en klient, men kan störa en Proxmox-värd där VM-trafik ofta kommer in via en brygga och lämnar via en upplänk med asymmetriska rutter. rp_filter=2 (löst) kastar bara paket med källor som verkligen saknar en rutt. Det är en praktisk avvägning: något sämre upptäckt av lokal IP-adressförfalskning för att hålla VM-nätet fungerande." + }, + "ovs": { + "heading": "Installera Open vSwitch", + "intro": "Installerar openvswitch-switch + openvswitch-common. Paketen lägger till OVS som alternativ till de Linux-bryggor Proxmox använder som standard. Installationen ändrar ingen nätverkskonfiguration: befintliga vmbrX-bryggor fungerar vidare. När du skapar en ny brygga i Proxmox kan du välja OVS i listan över typer.", + "tipTitle": "När OVS är meningsfullt", + "tipBody": "Överväg OVS om du behöver VLAN-trunkning med VLAN-ID:n som inte är sammanhängande, LACP med LLDP i vissa lägen, detaljerad programmering av trafikflöden (OpenFlow) eller samverkan med SDN-styrenheter. För ett hemlabb med några VLAN och en enda LACP-upplänk är Linux-bryggor + vmbrX.VID enklare och fullt tillräckliga.", + "revertTitle": "Kan återställas via avinstallationsmenyn", + "revertBody": "OVS registreras. Avinstallera optimeringar kör apt purge för openvswitch-switch och openvswitch-common. Migrera OVS-bryggor till Linux-bryggor innan du avinstallerar, annars förlorar VM:arna på dem nätverket vid nästa start. Manuell motsvarighet:" + }, + "bbr": { + "heading": "Aktivera TCP BBR + TCP Fast Open", + "intro": "Skriver två sysctl-filer och laddar om dem. BBR ersätter CUBIC med Googles bandbreddsbaserade överbelastningsalgoritm, som hanterar länkar med hög kapacitet och latens samt paketförluster bättre. TCP Fast Open (TFO) sparar en tur och retur vid upprepade TCP-anslutningar genom att skicka data i SYN.", + "verifyTitle": "Verifiering", + "impactTitle": "Effekten beror på arbetsbelastningen", + "impactBody": "BBR gör mest nytta på länkar med hög latens eller paketförluster (replikering mellan kontinenter, VPN-tunnlar, mobila klienter). I ett LAN mellan två datorer på samma switch ligger skillnaden ofta inom mätbruset. TFO hjälper främst korta, upprepade HTTP-anslutningar.", + "revertTitle": "Kan återställas via avinstallationsmenyn", + "revertBody": "BBR/TFO registreras. Avinstallera optimeringar tar bort de två sysctl-filerna (/etc/sysctl.d/99-kernel-bbr.conf och 99-tcp-fastopen.conf) och laddar om återstående konfiguration. Att ta bort en fil återställer inte dess aktiva kärnvärden. Standardvärden som cubic och tcp_fastopen=1 återkommer efter omstart om ingen annan konfiguration åsidosätter dem. Manuell motsvarighet:" + }, + "names": { + "heading": "Beständiga gränssnittsnamn", + "intro": "Går igenom värdens fysiska nätverkskort och hoppar över loopback, Docker-veth, bryggor, TAP-enheter, bond-gränssnitt, Cilium, ZeroTier och WireGuard. Skriver en systemd-.link-fil som binder det aktuella namnet till den aktuella MAC-adressen. MAC-bindningen får då företräde framför kärnans namnlogik.", + "whyTitle": "Varför detta är viktigt", + "whyItems": [ + "Lägga till eller ta bort PCIe-enheter kan flytta bussnumret, vända enp3s0 till enp4s0. Om din /etc/network/interfaces refererar till det gamla namnet försvinner bron på omstart.", + "BIOS / firmwareuppdateringar ändrar ibland hur enheterna räknas, med samma effekt.", + "Hjälpskriptet binder fysiska nätverkskorts namn, även fysiska portar som används av bond-gränssnitt. Det hoppar över virtuella gränssnitt som LXC-veth och bond-enheterna själva; det löser inte kapplöpningar vid namngivning av virtuella hotplug-kort." + ], + "writtenTitle": "Vad blir skrivet", + "writtenIntro": "En fil per fysisk NIC, på /etc/systemd/network/10-proxmenux-<iface>.link. Varje fil börjar med rubriken # Managed by ProxMenux — do not edit så att ProxMenux kan skilja sina egna filer från användar- eller pakettillhandahållna .link-filer.", + "writtenOutro": ".link-filer från andra paket eller användaren bevaras; endast filer med ProxMenux-rubriken hanteras. Vid nästa körning stämmer funktionen av sina filer: den läser MACAddress= från varje 10-proxmenux-*.link och tar bort filer vars MAC inte längre finns under /sys/class/net/. Filer från äldre ProxMenux-versioner i formatet 10-<iface>.link migreras automatiskt första gången.", + "pveTitle": "PVE 9 vs PVE 8", + "pveBody": "Skriptet använder systemd-.link-filer för beständiga namn. På Proxmox VE 9 laddar det även om udev-regler efter skrivningen, så att nya nätverkskort kan använda dem utan omstart. Kontrollera befintliga gränssnitt efter en omstart på både PVE 8 och PVE 9. Detta ersätter inte ifupdown2 på värden. Skriptet sätter omstartsflaggan i båda fallen så att den anpassningsbara efterinstallationen frågar om omstart.", + "reviewTitle": "Granska befintlig /etc/network/interfaces först", + "reviewBody": "Om äldre konfiguration i /etc/network/interfaces använder nätverkskortsnamn som kärnan skapar automatiskt är det rätt att binda dagens namn. Om du redan har anpassat konfigurationen till vissa namn, kontrollera före omstart att bindningarna matchar vad interfaces-filen förväntar sig.", + "revertTitle": "Kan återställas via avinstallationsmenyn", + "revertBody": "Avinstallera optimeringar tar bara bort 10-proxmenux-*.link-filer med ProxMenux-rubriken från /etc/systemd/network/. Alla .link-filer från användaren eller andra paket bevaras. Namngivningen återgår till systemd-standard vid nästa omstart." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Nätverkshantering", + "href": "/docs/network", + "tail": " — diagnostik, broanalys, guidade reparationer." + }, + { + "label": "Beständiga gränssnittsnamn", + "href": "/docs/network/persistent-names", + "tail": " — samma funktion som eget menyval senare; använd ett av alternativen, inte båda." + }, + { + "label": "Referens för nätverkskommandon", + "href": "/docs/help-info/network-commands", + "tail": " — ip, ss, ethtool, sysctl." + }, + { + "label": "Avinstallera optimeringar", + "href": "/docs/post-install/uninstall", + "tail": " - återställ någon av dessa nätverksändringar." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/optional.json b/web/messages/sv/docs/post-install/optional.json new file mode 100644 index 00000000..e1811788 --- /dev/null +++ b/web/messages/sv/docs/post-install/optional.json @@ -0,0 +1,177 @@ +{ + "meta": { + "title": "ProxMenux Post-Install: Valfria inställningar", + "description": "Guide till valfria inställningar i ProxMenux efterinstallationsskript för ytterligare funktioner och optimeringar i Proxmox VE.", + "ogTitle": "ProxMenux Post-Install: Valfria inställningar", + "ogDescription": "Guide till valfria inställningar i ProxMenux efterinstallationsskript för ytterligare funktioner och optimeringar i Proxmox VE.", + "ogImageAlt": "ProxMenux Post-Install valfria inställningar" + }, + "title": "Valfria inställningar", + "intro": "Kategorin Valfria inställningar erbjuder ytterligare funktioner och optimeringar för Proxmox VE. De är inte nödvändiga men kan förbättra systemets möjligheter i vissa situationer.", + "available": "Tillgängliga valfria funktioner", + "stepLabel": "Steg", + "ceph": { + "title": "Lägg till det senaste Ceph-stödet", + "intro": "Detta alternativ installerar den senaste Ceph lagringssystem stöd för Proxmox VE. Ceph är ett distribuerat lagringssystem som ger hög prestanda, tillförlitlighet och skalbarhet.", + "doesIntro": "Vad det gör:", + "doesItems": [ + "Lägger till Ceph-förvaret i ditt system", + "Uppdaterar paketlistor", + "Installerar Ceph-paket med kommandot pveceph install", + "Verifierar installationen" + ], + "howUse": "Hur man använder: Efter installationen kan du konfigurera och hantera Ceph lagring med Proxmox VE webbgränssnitt eller kommandoradsverktyg.", + "automates": "Denna justering automatiserar följande kommandon:" + }, + "amd": { + "title": "Tillämpa korrigeringar för AMD-processorer", + "intro": "Detta alternativ tillämpar specifika fixar för AMD EPYC och Ryzen CPU för att förbättra stabiliteten och kompatibiliteten.", + "doesIntro": "Vad det gör:", + "doesItems": [ + "Detekterar om en AMD EPYC eller Ryzen CPU är närvarande", + "Tillämpar kärnparametern idle=nomwait för att förebygga slumpmässiga krascher (via /etc/kernel/cmdline på systemd-boot-värdar eller /etc/default/grub på GRUB-värdar, med en .bak-kopia av originalet).", + "Konfigurerar KVM för att ignorera vissa MSR (Model Specific Register) för bättre Windows-gästkompatibilitet" + ], + "howUse": "Hur man använder: Dessa korrigeringar tillämpas automatiskt och kräver en omstart av systemet för att träda i kraft.", + "automates": "Denna justering automatiserar följande kommandon:" + }, + "ha": { + "title": "Aktivera tjänster för hög tillgänglighet", + "intro": "Alternativet aktiverar tjänster för hög tillgänglighet (HA) i Proxmox VE, vilket möjliggör automatisk överflyttning av VM:ar och containrar om en nod slutar fungera.", + "doesIntro": "Vad det gör:", + "doesItems": [ + "Möjliggör och startar tjänsten pve-ha-lrm (Local Resource Manager)", + "Möjliggör och startar tjänsten pve-ha-crm (Cluster Resource Manager)", + "Möjliggör och startar corosync-tjänsten för klusterkommunikation" + ], + "howUse": "Hur man använder: Efter att ha aktiverat dessa tjänster kan du konfigurera HA-grupper och resurser i Proxmox VE-webbgränssnittet.", + "automates": "Denna justering automatiserar följande kommandon:" + }, + "pveam": { + "title": "Uppdatera Proxmox VE Appliance Manager", + "intro": "Uppdaterar det lokala indexet över containermallar som pveam visar i Proxmox, så att listan över tillgängliga programmallar är aktuell nästa gång du skapar en LXC.", + "doesIntro": "Vad det gör:", + "doesItems": [ + "Kör pveam update mot Proxmox speglar för att hämta den aktuella katalogen över programmallar", + "Fyller listan över programmallar som visas när du skapar en container" + ], + "howUse": "Användning: kör det när listan över programmallar verkar gammal eller efter byte av speglar. Det hämtar bara katalogindexet, inte själva mallarna.", + "automates": "Denna justering automatiserar följande kommando:" + }, + "fastfetch": { + "title": "Installera och konfigurera Fastfetch", + "intro": "Det här alternativet installerar tyst och konfigurerar Fastfetch, ett systeminformationsverktyg som visar systemspecifikationer och en anpassad logotyp vid inloggningen.", + "doesLabel": "Vad det gör:", + "doesItems": [ + "Tyst laddar ner och installerar den senaste versionen av Fastfetch", + "Låter dig välja en anpassad logotyp (ProxMenux, Proxmox, Helper-Scripts, Home-Labs-Club, Proxmology, eller en anpassad)", + "Konfigurerar Fastfetch för att visa \"System optimerad av ProxMenux\"", + "Ställ in Fastfetch för att köra automatiskt vid konsolinloggning" + ], + "importantLabel": "Viktigt:", + "importantBody": "Om du ansluter till Proxmox via SSH, bör du välja Proxmox logotyp eller skapa en anpassad med jp2a eller img2txt. De andra logotyperna genereras med chafa och kan inte visas korrekt i en vanlig SSH-session.", + "customLabel": "Egna logotyper:", + "customBody1": "För att använda en anpassad logotyp, placera din ASCII art textfil i: /usr/local/share/fastfetch/logos/", + "customBody2": "Du kan skapa anpassade logotyper med verktyg som chafa, jp2a eller img2txt.", + "customBody3": "För bästa resultat:", + "customItems": [ + "Håll logohöjden till 35-linjer eller mindre för att upprätthålla proportioner och passa i terminalen", + "Använd chafa för färglogotyper (kan inte visas korrekt i SSH-sessioner)", + "Använd jp2a eller img2txt för SSH-kompatibel logotyp" + ], + "examplesLabel": "Exempel på logotyper:", + "logos": [ + { + "name": "ProxMenux", + "alt": "ProxMenux-logotyp", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmenux.png" + }, + { + "name": "Proxmox", + "alt": "Proxmox-logotyp", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmox.png" + }, + { + "name": "JC Channel", + "alt": "JC Channel-logotyp", + "src": "/fastfetch/jc-channel.png" + }, + { + "name": "Helper-Scripts", + "alt": "Helper-Scripts-logotyp", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/helper-scripts.png" + }, + { + "name": "Home-Labs-Club", + "alt": "Home-Labs-Club-logotyp", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/home-labs-club.png" + }, + { + "name": "Proxmology", + "alt": "Proxmology-logotyp", + "src": "https://macrimi.github.io/ProxMenux/fastfetch/proxmology.png" + } + ], + "automates": "Denna justering automatiserar följande kommandon:" + }, + "figurine": { + "title": "Installera och konfigurera Figurine", + "intro": "Det här alternativet installerar och konfigurerar Figurine, ett verktyg som skapar snygga ASCII-textbanners för din terminal och visar ditt värdnamn i ett visuellt tilltalande 3D-format.", + "doesLabel": "Vad det gör:", + "doesItems": [ + "Hämtar och installerar Figurine v2.1.1 från GitHub för värdens arkitektur (AMD64, ARM64 eller ARMv7)", + "Skapa ett välkomstmeddelande som visar ditt värdnamn i 3D ASCII-konst när du loggar in", + "Uppdaterar en befintlig Figurine-binär först när hämtningen och uppackningen har slutförts utan fel", + "Ställ in välkomstmeddelandet för att köra automatiskt vid inloggningen" + ], + "practicalLabel": "Praktisk användning:", + "practicalBody": "När du hanterar flera Proxmox-noder i ett kluster ger Figurine en omedelbar visuell indikation på vilken nod du för närvarande är inloggad. Detta hjälper till att förhindra oavsiktliga kommandon på fel nod och förbättrar ditt arbetsflöde när du hanterar flera servrar.", + "exampleLabel": "Exempel på utdata:", + "imageAlt": "Exempel på utdata från Figurine", + "automates": "Denna justering automatiserar följande process:", + "outro": "Efter installationen ser du ditt värdnamn som visas i 3D ASCII-konst varje gång du loggar in, vilket gör det omedelbart klart vilken Proxmox-nod du arbetar på." + }, + "log2ram": { + "title": "Installera Log2RAM (SSD/NVMe slitage reduktion)", + "intro": "Log2RAM monterar /var/log som en tmpfs-ramdisk och synkroniserar regelbundet till disk. Att buffra journalds täta skrivningar i RAM kan minska SSD-slitage och disk-I/O. Synkronisering och normal avstängning sparar loggar, men ett plötsligt strömavbrott kan förlora poster sedan senaste synkroniseringen.", + "upstreamLabel": "Upstream projekt:", + "upstreamUrl": "https://github.com/azlux/log2ram", + "upstreamLinkLabel": "azlux/log2ram på GitHub", + "doesLabel": "Vad ProxMenux gör:", + "doesItems": [ + "Detekterar om rotskivan är SSD/NVMe genom att läsa /sys/block/<dev>/queue/rotational. På en rotationsdisk frågar det automatiska flödet först innan du installerar.", + "Kloner uppströms repository (azlux/log2ram) i /tmp/log2ram och patchar sin install.sh, ersätta rsync -aAXv med rsync -aXv --no-acls. Denna justering undviker set_acl: Operation not supported exit 23 misslyckande att vaniljskriptet utlöser när man flyttar /var/log på filsystem utan ACL stöd. log2ram systemd-enheten är aktiverad efter installation.", + "Anpassar ramdiskens storlek efter värdens RAM: ≤ 8 GB → 128M, ≤ 16 GB → 256M, > 16 GB → 512M. Skriver värdet till SIZE= i /etc/log2ram.conf.", + "Schemalägger regelbunden disksynkronisering via /etc/cron.d/log2ram: var 1 / 3 / 6 timme enligt samma RAM-nivå.", + "Installerar /usr/local/bin/log2ram-check.sh, som körs var tionde minut via /etc/cron.d/log2ram-auto-sync. När /var/log når 80% av ramdisken rensas äldre journaler. Vid 92% körs först logrotate -f /etc/logrotate.d/proxmox-backup-api om filen finns: PBS API-loggar tar ofta mest utrymme på en PBS-värd. Sedan trunkeras pveproxy access/error och pveam.log före synkronisering. log2ram write kopierar bara tmpfs till disk utan att krympa det. Skyddet hjälper till att förebygga PVE-fel med No space left on device när loggar växer okontrollerat.", + "Upptäcker tjänsten proxmox-backup-server på värden. Om den finns skapas /etc/logrotate.d/proxmox-backup-api (20 MB × 3 rotationer) och /etc/cron.hourly/proxmox-backup-logrotate för att begränsa PBS API-loggar, den vanliga tillväxtkällan, även mellan Log2RAM-synkroniseringar. Utan PBS görs ingen ändring.", + "Justerar systemd-journald gränser (SystemMaxUse, RuntimeMaxUse) för att passa in i ramdisken så att en enda burst inte kan fylla den.", + "Registreras i installed_tools.json så att det kan återställas via Avinstallera optimeringar." + ], + "howUseLabel": "Hur man använder:", + "howUseBody": "Det automatiserade flödet installerar Log2RAM utan åtgärd när en SSD-/NVMe-rotdisk upptäcks. Det anpassningsbara flödet frågar om storlek, intervall och synkskydd. Frågan anger 90%, men det genererade skriptet använder trösklarna 80% för rensning och 92% för intensiv rensning som beskrivs ovan.", + "verifyLabel": "Verifiera och hantera från skalet:", + "verifyCode": "# Service state and configured timers\nsystemctl status log2ram\nsystemctl list-timers log2ram*\n\n# Current ramdisk usage — /var/log IS the tmpfs itself\ndf -h /var/log\n\n# Force a sync now (tmpfs → disk); does NOT shrink the tmpfs\nlog2ram write\n\n# Trigger the auto-sync guard on demand (vacuum + sync when usage is high)\n/usr/local/bin/log2ram-check.sh\n\n# Current config: SIZE, mail settings, path\ncat /etc/log2ram.conf\n\n# ProxMenux-specific cron jobs\ncat /etc/cron.d/log2ram /etc/cron.d/log2ram-auto-sync\n\n# Recent Log2RAM activity\njournalctl -u log2ram -n 50 --no-pager" + }, + "zram": { + "title": "Aktivera ZRAM-swap-profil", + "intro": "Skapar en komprimerad swap-enhet i RAM, /dev/zram0, med systemd-zram-generator. Sidor som kärnan flyttar till swap komprimeras med zstd och hålls i minnet, så de är skrivna till RAM innan de når swap på disken.", + "doesLabel": "Vad det gör:", + "doesItems": [ + "Installerar systemd-zram-generator om det saknas och registrerar om ProxMenux installerade det.", + "Skriver /etc/systemd/zram-generator.conf.d/90-proxmenux.conf: en zram0-enhet på en tiondel av värdens RAM, zstd-komprimering (zstd(level=9) med systemd-zram-generator 1.2.0 eller senare) och swap-prioritet 32767.", + "Med denna prioritet fyller kärnan ZRAM först. En befintlig swap på disken håller sin egen prioritet och tar de sidor som inte längre passar i ZRAM.", + "Innan du ändrar något, letar efter en annan ZRAM-installation: en aktiv zram swap, en zramlinje i /etc/fstab, en systemd-enhet eller en annan generatorfil. Om det hittar en, stannar alternativet och lämnar den inställningen som den är.", + "Startar dev-zram0.swap och kontrollerar att den aktiva enheten matchar profilen. Om det inte gör det återställs det tidigare tillståndet.", + "Registreras i installed_tools.json så att det kan återställas via Avinstallera optimeringar." + ], + "howUseLabel": "Hur man använder:", + "howUseBody": "Alternativet finns bara i det anpassningsbara flödet, inte det automatiserade. Enheten återskapas vid varje start. Medan den är aktiv visar panelen Minne i ProxMenux Monitor kapacitet, använd swap, algoritm, komprimeringsgrad och använt fysiskt minne.", + "verifyLabel": "Verifiera från skalet:", + "verifyCode": "# Active swap devices and their priority\nswapon --show\n\n# ZRAM device: algorithm, size and compressed data\nzramctl\n\n# Profile written by ProxMenux\ncat /etc/systemd/zram-generator.conf.d/90-proxmenux.conf\n\n# State of the swap unit\nsystemctl status dev-zram0.swap" + }, + "autoApplication": { + "title": "Automatisk applikation", + "body": "Välj funktioner efter behov i det anpassningsbara flödet. Log2RAM ingår även i det automatiserade flödet med hårdvaruidentifiering; ZRAM finns bara i det anpassningsbara. Läs avsnitten om bekräftelser och förutsättningar." + } +} diff --git a/web/messages/sv/docs/post-install/performance.json b/web/messages/sv/docs/post-install/performance.json new file mode 100644 index 00000000..b688cbf8 --- /dev/null +++ b/web/messages/sv/docs/post-install/performance.json @@ -0,0 +1,61 @@ +{ + "meta": { + "title": "Post-Install: Prestanda | ProxMenux Dokumentation", + "description": "Prestandaalternativ i ProxMenux anpassningsbara skript efter installationen. Ersätter entrådig gzip med pigz (parallell gzip) för snabbare säkerhetskopiering och komprimering på värdar med flera kärnor." + }, + "header": { + "title": "Efter installationen: prestanda", + "description": "Prestandaalternativ i det anpassningsbara skriptet efter installationen. Kategorin innehåller en enda optimering: att ersätta gzip med pigz så att säkerhetskopiering och komprimering använder alla CPU-kärnor i stället för en.", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad denna kategori täcker", + "body": "Det enda prestandaalternativet här styr om systemets gzip till en parallell implementation. Andra prestandajusteringar (minne, I/O-schemaläggning, ZFS ARC-storlek och kärngränser) finns i sina egna kategorier (System, Lagring) eftersom de påverkar andra delsystem." + }, + "pigz": { + "heading": "Använd pigz för snabbare gzip-komprimering", + "intro": "Vanlig gzip komprimerar med en enda CPU-kärna. På moderna Proxmox-värdar med 8, 16 eller 32 kärnor blir det en stor flaskhals vid VM-/CT-säkerhetskopiering med vzdump, loggrotation och annat som går genom gzip. pigz är en direkt kompatibel parallell ersättning: samma gzip-kompatibla utdata, men arbetet fördelas över alla kärnor.", + "doesTitle": "Vad ProxMenux gör", + "doesIntro": "Fem steg, alla idempotenta:", + "doesItems": [ + "Ställer in pigz: 1 i /etc/vzdump.conf så att Proxmox säkerhetskopieringsverktyg använder pigz direkt.", + "Installerar pigz apt-paketet om det inte redan finns.", + "Skriver ett wrapper-skript på /bin/pigzwrapper som vidarebefordrar varje argument till /usr/bin/pigz.", + "Registrerar en dpkg-omdirigering för systemets gzip-program (/usr/bin/gzip på Proxmox VE 9, /bin/gzip på Proxmox VE 8). Originalprogrammet bevaras bredvid som gzip.distrib och wrappern tar dess plats. Därefter använder allt som anropar gzip — logrotate, tar czf, skript och vzdump — pigz transparent.", + "Kontrollerar att filen som hålls som gzip.distrib är en fungerande gzip innan omslaget sätts på plats, och installerar om gzip-paketet först när det inte är det. En värd som fortfarande har den tidigare /bin/gzip.original swap flyttas till avledningen när alternativet appliceras igen." + ], + "replacesTitle": "Ersätter ett systemprogram", + "replacesBody": "Att sätta en wrapper i stället för gzip är ovanligt. Det är säkert eftersom utdata är gzip-kompatibla, men skript med hårdkodade sökvägar, i restriktiva chroot-miljöer eller med kontroll av programhashar kan fungera annorlunda. Originalprogrammet bevaras som gzip.distrib. Tack vare dpkg-omdirigeringen uppdaterar ett nytt gzip-paket eller uppgraderingen från Proxmox VE 8 till 9 den filen och lämnar wrappern på plats.", + "revertTitle": "Kan återställas från Avinstallera-menyn", + "revertBody": "Denna optimering registreras. Avinstallera optimeringar kopierar originalprogrammet från gzip.distrib över wrappern, tar bort omdirigeringen och pigzwrapper, kommenterar bort pigz-raden i /etc/vzdump.conf och kör apt purge pigz när gzip har verifierats fungera. Manuell motsvarighet på Proxmox VE 9:", + "verifyTitle": "Verifiering", + "verifyBody": "Efter applicering bör gzip --version nämna pigz. Ett snabbt riktmärke visar också hastighetsskillnaden på en multi-core värd:", + "whenTitle": "När detta betyder mest", + "whenBody": "Nyttan ökar med antalet kärnor på värden och hur ofta du säkerhetskopierar. På en hemmaserver med 2 kärnor och en daglig vzdump är vinsten liten. På en produktionsvärd med 16 kärnor som säkerhetskopierar ett dussin VM:ar varje natt kan pigz minska säkerhetskopieringsfönstret till en bråkdel av tiden för entrådig gzip." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Kommandon för säkerhetskopiering och återställning", + "href": "/docs/help-info/backup-commands", + "tailRich": " — CLI-referens för vzdump, inklusive trådalternativet --pigz." + }, + { + "label": "Lagring", + "href": "/docs/post-install/storage", + "tail": " — hastighetsgränser för vzdump och justering av ZFS ARC." + }, + { + "label": "System", + "href": "/docs/post-install/system", + "tail": " — justering av filbeskrivare och minne." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/security.json b/web/messages/sv/docs/post-install/security.json new file mode 100644 index 00000000..8f1a77b3 --- /dev/null +++ b/web/messages/sv/docs/post-install/security.json @@ -0,0 +1,57 @@ +{ + "meta": { + "title": "Post-Install: Säkerhet | ProxMenux Dokumentation", + "description": "Säkerhetsalternativ i ProxMenux anpassningsbara skript efter installationen. För närvarande ett enda alternativ: inaktivera tjänsten portmapper/rpcbind för att minska värdens attackyta." + }, + "header": { + "title": "Post-Install: Säkerhet", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad denna kategori täcker", + "body": "Säkerheten efter installationen begränsas till förstärkning av värden som säkert kan tillämpas utan övervakning: inaktivera tjänster som nästan ingen behöver och kunna återställa dem via Avinstallera. Aktiva säkerhetsverktyg (Fail2Ban för intrångsskydd och Lynis för granskning) finns under Säkerhet i ProxMenux huvudmeny, utanför efterinstallationen." + }, + "rpcbind": { + "heading": "Inaktivera Portmapper / rpcbind", + "intro": "rpcbind (tidigare portmap) mappar RPC-programnummer till nätverksportar. NFS och vissa äldre RPC-verktyg är beroende av det. På en typisk Proxmox-värd som inte är NFS-server använder inget det; om det lämnas aktiverat lyssnar port 111/tcp på alla gränssnitt.", + "whyTitle": "Varför det är värt att inaktivera", + "whyItems": [ + "Minskar värdattackytan - en mindre lyssnande tjänst att oroa sig för.", + "Historiskt missbrukas som en reflektion/amplifieringsvektor i DDoS-attacker. Inaktivera rpcbind tar bort den förstärkningsfaktorn för din värd.", + "Tar bort bruset i loggar och utdata från netstat / ss, så att verklig aktivitet blir lättare att upptäcka." + ], + "nfsTitle": "Inaktivera inte detta om du använder NFS", + "nfsBody": "NFS-servern och NFS-klienten använder rpcbind för att förhandla om portarna för mountd, statd, lockd med flera. Tillämpa inte alternativet om Proxmox-värden exporterar NFS-resurser till andra datorer eller monterar NFS-resurser från en NAS. Montering misslyckas då med mount.nfs: rpc.statd is not running eller liknande.", + "runsTitle": "Vad ProxMenux kör", + "runsOutro": "Paketet förblir installerat. ProxMenux registrerar de ursprungliga aktiverings- och körningstillstånden för rpcbind.service och rpcbind.socket, inaktiverar och stoppar sedan båda enheterna så att socketaktivering inte kan starta tjänsten igen.", + "verifyTitle": "Verifiering", + "verifyBody": "Efter applicering, bekräfta rpcbind är avstängd och ingenting lyssnar på port 111:", + "reversibleTitle": "Återställer tjänstens ursprungliga tillstånd", + "reversibleBody": "Ändringen registreras i installed_tools.json. Avinstallera optimeringar återställer varje rpcbind-enhet till dess aktiverade/inaktiverade och aktiva/inaktiva tillstånd som registrerades före ProxMenux ändring. Verktyget antar inte att rpcbind var aktiverat på alla värdar." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Säkerhetsmenyn", + "href": "/docs/security", + "tail": " — kraftfullare verktyg: Fail2Ban (intrångsskydd) och Lynis (granskning)." + }, + { + "label": "Lynis", + "href": "/docs/security/lynis", + "tail": " — granska värden för att hitta fler möjligheter att stärka säkerheten." + }, + { + "label": "Användbara systemkommandon", + "href": "/docs/help-info/system-commands", + "tail": " — referens för tjänststatus, journalctl och lynis audit." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/storage.json b/web/messages/sv/docs/post-install/storage.json new file mode 100644 index 00000000..99101af4 --- /dev/null +++ b/web/messages/sv/docs/post-install/storage.json @@ -0,0 +1,167 @@ +{ + "meta": { + "title": "Post-Install: Lagring | ProxMenux Dokumentation", + "description": "Lagringsoptimeringar i ProxMenux anpassningsbara efterinstallationsskript: ZFS ARC-storlek efter värdens RAM, periodiska ögonblicksbilder med zfs-auto-snapshot och borttagning av vzdump-hastighetsgränser." + }, + "header": { + "title": "Post-Install: Lagring", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad denna kategori täcker", + "body": "Fyra lagringsoptimeringar: anpassa ZFS ARC till en rimlig andel av RAM, installera och schemalägg automatiska ZFS-ögonblicksbilder, aktivera ZFS autotrim på SSD-/NVMe-pooler och ta bort begränsningar i vzdump för snabbare säkerhetskopiering. Välj de oberoende alternativen efter din miljö. Ett femte, Log2RAM, minskar SSD-/NVMe-slitage genom att flytta /var/log till en ramdisk. Det ligger under Valfritt eftersom den anpassningsbara menyn grupperar det där." + }, + "trackedTitle": "Alla fyra registreras i avinstallationsmenyn", + "trackedBody": "Varje alternativ registreras i installed_tools.json för Avinstallera optimeringar. Återställning av zfs_arc tar bort /etc/modprobe.d/99-zfsarc.conf och bygger om initramfs; zfs_auto_snapshot tar bort cron-schemat och erbjuder paketrensning; zfs_autotrim sätter autotrim=off på pooler det aktiverat; vzdump_speed återställer /etc/vzdump.conf från installationens .bak.", + "arc": { + "heading": "Optimera ZFS ARC-storlek", + "intro": "Adaptive Replacement Cache (ARC) är ZFS läscache i RAM. Proxmox VE-installationer från 8.1 sätter 10% av RAM, högst 16 GiB; äldre eller uppgraderade värdar kan skilja sig. Alternativet skriver en egen RAM-baserad gräns. Granska befintliga inställningar och arbetslast; en mindre cache är inte alltid snabbare.", + "sizingTitle": "Storleksregler", + "headerRam": "Värdens RAM", + "headerMax": "ARC-gräns", + "rows": [ + { + "ram": "Formel", + "max": "RAM / 10, högst 16 GiB och minst 64 MiB" + }, + { + "ram": "8 GB värd", + "max": "≈ 819 MiB (RAM/10)" + }, + { + "ram": "16 GB värd", + "max": "≈ 1.6 GiB (RAM/10)" + }, + { + "ram": "64 GB värd", + "max": "≈ 6.4 GiB (RAM/10)" + }, + { + "ram": "≥ 160 GB värd", + "max": "16 GiB (gräns)" + } + ], + "after": "Filen /etc/modprobe.d/99-zfsarc.conf innehåller bara options zfs zfs_arc_max=…. Övriga ZFS-parametrar (zfs_arc_min, L2ARC-förhämtning/skrivbegränsning, TXG-timeout) justeras inte. Först söks andra *.conf i /etc/modprobe.d/ efter zfs_arc_min / zfs_arc_max. De säkerhetskopieras med manifest till /usr/local/share/proxmenux/backups/zfs_arc/ och motstridiga rader tas bort så bara ProxMenux ARC-fil är aktiv. Sedan körs update-initramfs -u -k all och vid behov proxmox-boot-tool refresh så gränsen når initramfs för system med ZFS-rot.", + "rebootTitle": "Kräver en omstart för att träda i kraft", + "rebootBody": "ARC-inställningar läses när kärnmodulen zfs laddas. För ZFS-rotvärdar bygger ProxMenux om initramfs med update-initramfs -u -k all och uppdaterar vid behov starthanteraren med proxmox-boot-tool refresh. Den nya parametern kräver fortfarande omstart; omstartsflaggan sätts automatiskt.", + "safeTitle": "Säker på icke-ZFS värdar", + "safeBody": "Funktionen skriver bara konfigen när zpool list rapporterar minst en importerad ZFS-pool. På ext4 / LVM-bara Proxmox-värdar, eller på maskiner med ZFS-verktyg installerade men ingen pool importerad, kryssa detta alternativ är en no-op - ingenting blir skrivet.", + "verifyTitle": "Verifiering och manuell återgång" + }, + "autoSnap": { + "heading": "Installera ZFS auto-snapshot", + "intro": "Installerar zfs-auto-snapshot-paketet och skriver om sina cron scheman så snapshots tas automatiskt vid flera intervaller. Ett bra säkerhetsnät på toppen av dina vanliga vzdump-backups.", + "cadenceTitle": "Intervall för ögonblicksbilder som ProxMenux konfigurerar", + "headerLabel": "Etikett", + "headerRuns": "Körs", + "headerKept": "Sparade ögonblicksbilder", + "rows": [ + { + "label": "frekventa", + "runs": "var 15:e minut", + "kept": "4" + }, + { + "label": "timme", + "runs": "varje timme", + "kept": "1" + }, + { + "label": "dagligen", + "runs": "En gång om dagen", + "kept": "1" + }, + { + "label": "Veckovis", + "runs": "En gång i veckan", + "kept": "1" + }, + { + "label": "månadsvis", + "runs": "En gång i månaden", + "kept": "1" + } + ], + "conservativeTitle": "Begränsade antal sparade ögonblicksbilder", + "conservativeBody": "ProxMenux sparar ett begränsat antal: 4 täta ögonblicksbilder och 1 för varje längre intervall, så att ZFS-utrymmet inte växer för mycket. För längre lagring, ändra antalen i /etc/cron.d/zfs-auto-snapshot, /etc/cron.hourly/zfs-auto-snapshot osv. efter skriptet.", + "onlyZfsTitle": "Endast användbar på ZFS pooler", + "onlyZfsBody": "Installera paketet på en ext4-bara värd är ofarlig men meningslös - det finns inga ZFS datamängder för att det ska snapshot. Hoppa över det här alternativet om du inte använder ZFS.", + "verifyTitle": "Verifiering och manuell återgång" + }, + "autotrim": { + "heading": "Aktivera ZFS autotrim (SSD/NVMe-pooler)", + "intro": "Aktiverar autotrim på ZFS-pooler med enbart TRIM-kompatibla SSD- eller NVMe-enheter. Skriptet hoppar försiktigt över pooler med roterande enheter. Pooler som redan har autotrim=on lämnas oförändrade.", + "trimTitle": "Vad TRIM gör och varför det spelar roll på ZFS", + "trimBody1": "SSD- och NVMe-enheter använder interna raderingsblock som är större än filsystemets logiska sektorer. När en fil tas bort vet enheten ännu inte att sektorerna är lediga, så intern städning kan fortsätta flytta gamla data för att frigöra block. TRIM talar om vilka sektorer som är lediga så att de kan raderas i förväg.", + "trimBody2": "Utan TRIM kan brist på redan raderade block försämra SSD-prestanda och öka interna skrivningar, vilket förkortar livslängden. Med TRIM kan enheten hålla tomma block redo för skrivning.", + "trimBody3": "Med autotrim=on trimmar ZFS nyligen frigjort utrymme i bakgrunden och samlar intervall före kommandona. Periodisk zpool trim <pool> är ett alternativ. Autotrim slipper separat schema men påverkan beror på enheterna; periodisk manuell trimning kan passa enklare diskar bättre.", + "practicalTitle": "Varför kan det vara praktiskt att aktivera?", + "practicalItems": [ + "Uthållig skrivprestanda. TRIM kan hjälpa enheten att återvinna oanvända block effektivt. Nytta och latenspåverkan beror på enhet och arbetslast.", + "Enhetens livslängd. Färre onödiga interna kopior kan minska skrivförstärkning och NAND-slitage. Det garanterar ingen viss förlängning av livslängden.", + "Inget separat cron-jobb att schemalägga. Till skillnad från periodisk zpool trim hanteras autotrim automatiskt av poolen." + ], + "whenTitle": "När är detta nödvändigt?", + "whenIntro1": "Överväg att aktivera det på ZFS-pooler med enbart TRIM-kompatibla SSD-/NVMe-enheter. Kontrollera beteende och latens; schemalagd manuell trimning kan passa bättre.", + "whenIntro2": "Skriptet hoppar automatiskt över det på:", + "whenSkipItems": [ + "Pooler med roterande HDD-vdev — ett försiktigt maskinvarufilter i skriptet.", + "Enheter utan discard_granularity i sysfs — vanligen äldre SSD:er utan TRIM eller passthrough-vägar där operativsystemet inte ser den underliggande enheten.", + "Pooler där ZFS rapporterar att egenskapen inte stöds (sällsynt; mycket gamla pooler).", + "Pooler som redan är inställda på autotrim=on (no-op)." + ], + "whenIntro3": "Inte relevant på ext4-bara värdar - det finns inget för ZFS att trimma. Funktionen avslutas med ett vänligt meddelande i det fallet.", + "recordedTitle": "Varför bara pooler som ProxMenux ändrat registreras", + "recordedBody": "Funktionen skriver bara en pool till sin interna statliga fil (/usr/local/share/proxmenux/zfs_autotrim_pools) när den aktivt vände den poolen från off till on. Pooler du hade på autotrim innan du kör skriptet lämnas ut ur listan, så en framtida Uninstall stänger inte av inställningar du konfigurerade själv - bara ProxMenux egna ändringar återställs.", + "manualTitle": "Manuell motsvarighet (kör på din server)", + "manualIntro": "Den fullständiga sekvensen manuset går mot varje pool är replikerbart för hand. Detta är vad du skulle skriva om du ville göra samma sak på en enda pool utan ProxMenux:", + "verifyTitle": "Verifiering och manuell återgång", + "oneShotTitle": "Behöver du engångstrimning i stället för kontinuerlig?", + "oneShotBody": "Vissa operatörer föredrar en manuell trim under off-peak timmar snarare än kontinuerlig trim aktivitet. Inaktivera autotrim och schemalägga ett cronjobb som kör zpool trim <pool> - samma slutmål, olika kadens." + }, + "vzdump": { + "heading": "Öka hastigheten för vzdump-säkerhetskopiering", + "intro": "Skriver bwlimit: 0 och ionice: 5 i global vzdump-konfiguration. Proxmox har redan obegränsad bandbredd som standard, så bara en inställd gräns tas bort. Jämfört med ionice: 7 ger 5 högre best effort-I/O-prioritet där schemaläggaren stöder det. Det kan påverka gäster och garanterar inte snabbare säkerhetskopiering.", + "changedTitle": "Vad som ändras i /etc/vzdump.conf", + "backupTitle": "Första körningen skapar en .bak av vzdump.conf", + "backupBody": "Första gången kopierar ProxMenux /etc/vzdump.conf till /etc/vzdump.conf.bak före ändringar. Senare körningar skriver inte över kopian, så den tidigare manuella konfigurationen kan återställas. bwlimit och ionice ändras med sed; övriga alternativ som compress, pigz, tmpdir och exclude-path bevaras.", + "skipTitle": "När man ska hoppa över detta", + "skipBody": "På en värd med långsam lokal lagring och VM som är latenskänsliga, kan avlägsna bandbredd cap orsaka märkbara avmattningar under säkerhetskopior. Om du tidigare har angett en specifik bwlimit av den anledningen, håll det - hoppa över det här alternativet.", + "verifyTitle": "Verifiering och manuell återgång" + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Kommandon för ZFS-hantering", + "href": "/docs/help-info/zfs-commands", + "tail": " — zpool / zfs referens för ARC, snapshots, scrub." + }, + { + "label": "Kommandon för lagring och diskar", + "href": "/docs/help-info/storage-commands", + "tail": " — generisk block-enhet och Proxmox lagring referens." + }, + { + "label": "Kommandon för säkerhetskopiering och återställning", + "href": "/docs/help-info/backup-commands", + "tail": " — vzdump-CLI-referens för bandbredd och I/O-prioritet." + }, + { + "label": "Avinstallera optimeringar", + "href": "/docs/post-install/uninstall", + "tail": " — återställ ARC-/vzdump-ändringar." + }, + { + "label": "Log2RAM", + "href": "/docs/post-install/optional#log2ram", + "tail": " — minskar SSD-/NVMe-slitage med /var/log på ramdisk; dokumenteras under Valfritt." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/system.json b/web/messages/sv/docs/post-install/system.json new file mode 100644 index 00000000..08a8e81d --- /dev/null +++ b/web/messages/sv/docs/post-install/system.json @@ -0,0 +1,133 @@ +{ + "meta": { + "title": "Post-Install: System | ProxMenux Dokumentation", + "description": "Systemoptimeringar i ProxMenux anpassningsbara efterinstallationsskript: storleksgränser för journald och logrotate, högre kärn- och filbeskrivargränser, balanserad minnesjustering, snabba omstarter med kexec och återhämtning efter kärnpanik." + }, + "header": { + "title": "Efter installationen: system", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad denna kategori täcker", + "body": "Sex oberoende systemoptimeringar. De justerar journald och logrotate så att loggar inte fyller disken, höjer kärn- och filbeskrivargränser för program med många öppna filer, balanserar minnet för en virtualiseringsvärd, lägger till kexec för omstarter utan BIOS och konfigurerar automatisk återhämtning vid kärnpanik. Alla sex registreras och kan återställas via avinstallationsmenyn." + }, + "journald": { + "heading": "Optimera journald", + "intro": "Skriver om /etc/systemd/journald.conf med rimliga standardvärden så att systemd-journalen inte fyller rotpartitionen över tid. Startar sedan om systemd-journald och rensar äldre loggar.", + "keyTitle": "Nyckelvärden", + "keyItems": [ + "Storage=persistent - hålla loggar på disk över omstarter.", + "SystemMaxUse=64M / RuntimeMaxUse=60M — gränser för journalens disk- och minnesanvändning.", + "Compress=yes, Seal=no — komprimera loggar och hoppa över kryptografisk försegling med framåtsäkerhet (sparar CPU).", + "MaxLevelStore=info — lagra info och högre nivåer, vilket behövs för loggvisaren i ProxMenux Monitor och för att Fail2Ban ska upptäcka misslyckad SSH-/Proxmox-autentisering i journalen.", + "Frekvensgräns: 1000 events / 30 s för att förhindra loggflöden.", + "ForwardToSyslog=no, ForwardToWall=no - duplicera inte meddelanden till syslog eller sänds till konsoler." + ], + "tipTitle": "Varför MaxLevelStore=info är viktigt", + "tipBody": "En striktare nivå som warning gör att ProxMenux Monitor visar nästan samma poster i alla datumintervall eftersom de flesta aktiviteter har info-nivå, och hindrar Fail2Ban från att se misslyckade inloggningar. Begränsa i stället volymen med SystemMaxUse och RateLimitBurst utan att begränsa vilka nivåer som lagras." + }, + "logrotate": { + "heading": "Optimera logrotate", + "intro": "Skriver om /etc/logrotate.conf med globala dags- och storleksinställningar, 7 sparade rotationer, komprimering och copytruncate så att tjänster kan fortsätta skriva utan att öppna loggarna igen. Storleksvillkoret står efter daglig rotation och får företräde om ingen enskild loggregel ändrar det. Originalets logrotate.conf kopieras till .bak första gången.", + "tipTitle": "Anpassat för Log2RAM", + "tipBody": "Direktivet size 10M får företräde framför den tidigare dagsinställningen; det betyder inte det som inträffar först. Logrotate kontrollerar tröskeln när det körs och enskilda loggregler kan åsidosätta globala värden. För /var/log i Log2RAMs RAM bör du granska regler och timerfrekvens för att styra utrymmesanvändningen." + }, + "limits": { + "heading": "Öka olika systemgränser", + "intro": "Höjer gränser i kärnan, systemd och PAM som kan vara för låga för en värd med många VM:ar, containrar och nätverkstjänster.", + "headerFile": "Fil", + "headerSets": "Vad det sätter", + "rows": [ + { + "file": "/etc/sysctl.d/99-maxwatches.conf", + "sets": "fs.inotify.max_user_watches / max_user_instances / max_queued_events = 1048576" + }, + { + "file": "/etc/sysctl.d/99-maxkeys.conf", + "sets": "kernel.keys.maxkeys / root_maxkeys = 1000000" + }, + { + "file": "/etc/sysctl.d/99-swap.conf", + "sets": "vm.swappiness = 10, vm.vfs_cache_pressure = 100" + }, + { + "file": "/etc/sysctl.d/99-fs.conf", + "sets": "fs.nr_open / file-max = 2097152, fs.aio-max-nr = 1048576" + }, + { + "file": "/etc/security/limits.d/99-limits.conf", + "sets": "nofile och nproc till 1 048 576 (obegränsade för root)" + }, + { + "file": "/etc/systemd/system.conf + user.conf", + "sets": "DefaultLimitNOFILE=1048576 för systemd-tjänster" + }, + { + "file": "/etc/pam.d/common-session + runuser-l", + "sets": "session required pam_limits.so så ovanstående gäller för inloggningsskal" + }, + { + "file": "/root/.profile", + "sets": "ulimit -n 1048576 för root shell" + } + ], + "tipTitle": "Varför inotify är viktigt", + "tipBody": "Docker, Syncthing, Node.js filbevakare och Plex-biblioteksskanningar kan förbruka max_user_watches. Standardvärdet beror på kärnan och värdens minne; det är inte alltid 8192. Gränsen 1M tillåter fler bevakningar utan att förallokera dem. Aktiva bevakningar använder kärnminne, så kontrollera användningen på värdar med ont om RAM." + }, + "memory": { + "heading": "Optimera minnesinställningar", + "intro": "Skriver en balanserad sysctl-profil till /etc/sysctl.d/99-memory.conf. Avsedd för en hypervisorvärd: håller helst VM:arnas aktivt använda minne i RAM och frigör sidor i förväg så att allokeringstoppar inte fastnar.", + "warnTitle": "swappiness=10 på värdar med ont om minne", + "warnBody": "På en värd med 16 GB RAM och många VM:ar kan lägre swappiness leda till att kärnan avslutar processer vid minnesbrist i stället för att använda swap. Vid återkommande OOM-händelser, höj swappiness till 30–60 i /etc/sysctl.d/99-memory.conf efter skriptet." + }, + "kexec": { + "heading": "Aktivera snabba omstarter (kexec)", + "intro": "Installerar kexec-tools och trådar upp det så att du kan starta om värden rakt in i en ny kärna utan att gå igenom BIOS / UEFI firmware. På stora servrar där POST tar 45 - 90 sekunder, förvandlar detta en omstart från en kaffepaus till några sekunder av stillestånd.", + "installsTitle": "Vad ProxMenux installerar", + "installsItems": [ + "Paketet kexec-tools (debconf förinställt med kexec-tools/load_kexec boolean false så att apt inte frågar och automatisk laddning vid avstängning förblir avstängd).", + "Systemd-enhet /etc/systemd/system/kexec-pve.service - laddar Proxmox-kärnan och initrd till minne vid start, återanvändning av den nuvarande cmdline.", + "Ett alias i /root/.bash_profile: reboot-quick → systemctl kexec." + ], + "usageIntro": "Användning efter nästa omstart (eller manuell systemctl start kexec-pve):", + "warnTitle": "När du inte använder kexec", + "warnBody": "kexec hoppar över firmware-nivå init. Om du litar på BIOS/UEFI för att återställa hårdvarutillstånd - till exempel en GPU gör genomgång som bara återställs rent på full POST, eller en besvärlig HBA firmware - kexec omstarter kan lämna dessa enheter i ett halvinitialiserat tillstånd. Använd en normal reboot efter kerneluppgraderingar eller när du behöver BIOS/UEFI ändringar för att träda i kraft. reboot-quick är för vardagliga omstarter." + }, + "panic": { + "heading": "Aktivera omstart vid kernel panic", + "intro": "Låter kärnan starta om automatiskt i stället för att fastna på panikskärmen. Viktigt för fjärrstyrda Proxmox-värdar utan lokal konsol: en låst kärna stoppar alla VM:ar tills du kan bryta och återställa strömmen.", + "tipTitle": "Kombinera med åtkomst till fjärrkonsol", + "tipBody": "Automatisk omstart är en återställningsmekanism, inte ett felsökningsverktyg. För att undersöka en kärnpanik i stället för att bara starta igen, använd kexec-alternativet ovan med kärnans kdump-stöd, som ProxMenux inte konfigurerar, eller spela in en seriell konsol på en annan värd innan automatisk omstart aktiveras." + }, + "verify": { + "heading": "Verifiering", + "intro": "Efter att ha tillämpat systemoptimeringarna:", + "tipTitle": "Återställning och begränsningar", + "tipBody": "Alla sex alternativ finns i installed_tools.json och Avinstallera optimeringar. Återställningen tar bort konfigurationsfiler, kexec-enhet och alias och återställer journald/logrotate. Vissa aktiva gränser kräver ny session eller omstart. Bara äldre ulimit -n 256000 tas bort ur /root/.profile; nuvarande ulimit -n 1048576 kan bli kvar och behöva tas bort manuellt." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Användbara systemkommandon", + "href": "/docs/help-info/system-commands", + "tail": " — verifiera ändringarna (free -h, journalctl, ulimit -a)." + }, + { + "label": "Prestanda", + "href": "/docs/post-install/performance", + "tail": " — ytterligare systemnivåjustering (pigz)." + }, + { + "label": "Avinstallera optimeringar", + "href": "/docs/post-install/uninstall", + "tail": " — återställ någon av dessa förändringar." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/uninstall.json b/web/messages/sv/docs/post-install/uninstall.json new file mode 100644 index 00000000..c8fad698 --- /dev/null +++ b/web/messages/sv/docs/post-install/uninstall.json @@ -0,0 +1,271 @@ +{ + "meta": { + "title": "Avinstallera optimeringar | ProxMenux Dokumentation", + "description": "Återställ återställbara konfigurationsändringar som ProxMenux gjort efter installationen. Registrerade verktyg har egna avinstallationsfunktioner som bevarar värdens tidigare tillstånd där det är möjligt." + }, + "header": { + "title": "Avinstallera optimeringar", + "description": "Återställ reversibla ändringar som gjorts av Automatiserade eller Anpassningsbara postinstallationsskript. ProxMenux registrerar varje stödd optimering med sin dedikerade restaureringsfunktion; paketuppgraderingar är avsiktligt uteslutna.", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Varför detta existerar", + "body": "Varje ändring som stöds för återställning registreras i /usr/local/share/proxmenux/installed_tools.json. Registret listar aktiva optimeringar och anropar rätt återställningsfunktion. Åtgärder utan säker återgång, till exempel fullständig paketuppgradering, läggs inte till." + }, + "openMenu": { + "heading": "Hur man öppnar den", + "body": "Öppna Proxmox-inställningar efter installation → Avinstallera optimeringar i huvudmenyn. Listan visar nu tillämpade optimeringar; sådant som inte tillämpats visas inte.", + "imageAlt": "Lista för Avinstallera optimeringar med aktiva ändringar och kryssrutor för att välja vad som ska återställas" + }, + "howWorks": { + "heading": "Hur reverseringen fungerar", + "steps": [ + { + "title": "Register och automatisk identifiering", + "body1": "Första gången söker ProxMenux efter kännetecken på värden: /etc/sysctl.d/99-memory.conf, /etc/apt/apt.conf.d/99-force-ipv4, installerat haveged, aktiv Log2RAM-tjänst och liknande. Identifierade ändringar registreras som återställbara även om en äldre ProxMenux-version utan register gjorde dem.", + "body2": "Migreringen körs bara en gång. Därefter uppdaterar varje tillämpning och återställning registret direkt." + }, + { + "title": "Välj vad som ska återställas", + "body1": "Listan visar begripliga namn som Optimering av minnesinställningar, IOMMU/VFIO PCI-passthrough och Log2RAM (SSD-skydd). Markera det du vill återställa. Omarkerade objekt ändras inte." + }, + { + "title": "Återställningen körs", + "body1": "För varje valt objekt kallar ProxMenux sin matchande avinstallationsfunktion. De flesta omkastningar följer ett av tre mönster:", + "items": [ + "Från säkerhetskopia — återställer en .bak skapad vid ändringen (bashrc, logrotate.conf, journald.conf, GRUB-/kärnkommandorad).", + "Ta bort konfiguration — tar bort ProxMenux-filerna /etc/sysctl.d/99-*.conf, /etc/apt/apt.conf.d/99-* eller systemd-enheten och laddar om.", + "Ominstallation av paket — för gränssnittsändringar som prenumerationsvarningen installeras ursprungspaketen om med --force-confnew för att återställa levererad konfiguration." + ], + "body2": "Varje omvänd loggar sina framsteg. Objekt som kräver en omstart (VFIO, ihållande gränssnittsnamn) ställer in en flagga som utlöser omstartsprompten i slutet." + }, + { + "title": "Fråga om omstart i slutet", + "body1": "Efter återställningen visar menyn en omstartsfråga. Ändringar av kärnparametrar, moduler och gränssnittsnamn (VFIO, beständiga namn) behöver omstart; andra gör det inte. Frågan visas som allmän försiktighetsåtgärd, inte efter en kontroll per objekt." + } + ] + }, + "reversible": { + "heading": "Vad är reversibelt", + "intro": "Registrerade reversibla optimeringar och deras matchande avinstallatörer grupperas här efter område:", + "groups": [ + { + "title": "Repositorier och APT", + "items": [ + { + "tool": "Borttagning av prenumerationsvarning", + "restores": "Försöker först återställa gränssnittsfiler från ProxMenux säkerhetskopior (/usr/local/share/proxmenux/backups/proxmoxlib.js.backup.* och index.html.tpl.backup.* om mobilgränssnittet ändrats). Bara om kopian saknas eller är skadad installeras pve-manager, proxmox-widget-toolkit, libjs-extjs och libpve-http-server-perl om med force-confnew. Rensar även cachade .js-/ .gz-kopior." + }, + { + "tool": "Hoppa över APT-språkfiler", + "restores": "Tar bort /etc/apt/apt.conf.d/99-disable-translations så att APT kan hämta index över översatta paketbeskrivningar enligt övriga språkinställningar." + }, + { + "tool": "Tvinga IPv4 för APT", + "restores": "Ta bort /etc/apt/apt.conf.d/99-force-ipv4." + }, + { + "tool": "Systemverktyg", + "restores": "Rensar bara valda verktygspaket som ProxMenux registrerat som nyinstallerade. Paket som redan fanns läggs aldrig till i listan och lämnas oförändrade." + } + ] + }, + { + "title": "Kernel, minne och systemgränser", + "items": [ + { + "tool": "Minnesinställningar", + "restores": "Tar bort /etc/sysctl.d/99-memory.conf och laddar om sysctl." + }, + { + "tool": "Konfiguration vid kärnpanik", + "restores": "Ta bort /etc/sysctl.d/99-kernelpanic.conf." + }, + { + "tool": "Höjning av systemgränser", + "restores": "Tar bort /etc/sysctl.d/99-maxwatches.conf, 99-maxkeys.conf, 99-swap.conf, 99-fs.conf och /etc/security/limits.d/99-limits.conf. Återställer PAM-gränser och systemd DefaultLimitNOFILE. I /root/.profile tas bara äldre ulimit -n 256000 bort; nuvarande ulimit -n 1048576 kan bli kvar och behöva tas bort manuellt." + }, + { + "tool": "ZRAM swap profil", + "restores": "Stänger av bytet på /dev/zram0, stoppar dev-zram0.swap och tar bort /etc/systemd/zram-generator.conf.d/90-proxmenux.conf. systemd-zram-generatorpaketet rensas endast när ProxMenux installerade det och ingen annan ZRAM-installation är närvarande. Om sidorna i ZRAM inte kan flyttas ut, förblir profilen aktiv och ingenting tas bort." + } + ] + }, + { + "title": "Nätverk", + "items": [ + { + "tool": "Nätverksoptimeringar", + "restores": "Tar bort /etc/sysctl.d/99-network.conf, 97-proxmenux-fwbr.conf och 98-proxmenux-rpf.conf samt proxmenux-fwbr-tune.service, hjälpskriptet /usr/local/sbin/proxmenux-fwbr-tune och udev-regeln /etc/udev/rules.d/99-zz-proxmenux-fwbr-tune.rules. Tar även bort raden source /etc/network/interfaces.d/* ur /etc/network/interfaces. Laddar om sysctl, systemd och udev-regler." + }, + { + "tool": "Open vSwitch", + "restores": "Kör apt purge för openvswitch-switch och openvswitch-common. Migrera OVS-bryggor till Linux-bryggor först, annars förlorar VM:arna på dem nätverket vid nästa start." + }, + { + "tool": "TCP BBR + TCP Fast Open", + "restores": "Tar bort /etc/sysctl.d/99-kernel-bbr.conf och 99-tcp-fastopen.conf och laddar om övrig sysctl-konfiguration. Borttagning återställer inte aktiva värden; standarder som cubic och tcp_fastopen=1 återkommer efter omstart om ingen annan konfiguration åsidosätter dem." + }, + { + "tool": "Persistenta gränssnittsnamn", + "restores": "Ta bort endast 10-proxmenux-*.link-filer som bär ProxMenux-rubriken från /etc/systemd/network/. Alla .link-filer som tillhandahålls av ett annat paket eller skrivs av användaren lämnas på plats. Interface namn återvänder till systemd: s standard beteende på nästa omstart." + } + ] + }, + { + "title": "Loggning", + "items": [ + { + "tool": "Optimering av journald", + "restores": "Skriver om /etc/systemd/journald.conf med ursprungliga standardvärden och startar om systemd-journald." + }, + { + "tool": "Logrotate-optimering", + "restores": "Återställer /etc/logrotate.conf från .bak-filen som fångats före ändringen." + }, + { + "tool": "Log2RAM", + "restores": "Stoppar och inaktiverar tjänst och timer. Tar bort cron-jobb, systemd-enheter, binärer, konfiguration och /var/log.hdd. Avinstallerar även apt-paketet om det installerats så." + }, + { + "tool": "Automatisk ZFS-TRIM", + "restores": "Läser /usr/local/share/proxmenux/zfs_autotrim_pools med faktiskt ändrade pooler och kör zpool set autotrim=off på var och en. Autotrim som aktiverats manuellt före ProxMenux lämnas kvar." + } + ] + }, + { + "title": "Shell & utseende", + "items": [ + { + "tool": "Anpassning av Bashrc", + "restores": "Återställer /root/.bashrc från .bak backup. Om ingen säkerhetskopia finns, tar bort PMX_CORE_BASHRC blocket av markörer." + }, + { + "tool": "Egen MOTD-banner", + "restores": "Återställer det exakta ursprungliga /etc/motd-innehållet som hålls under /usr/local/share/proxmenux, tar bort filen när den inte fanns innan, eller tar säkert bort arvsmarkören när du migrerar en äldre installation." + }, + { + "tool": "Fastfetch", + "restores": "Tar bort binär, konfigurationskatalog, update-motd-krok och det avgränsade blocket BEGIN FASTFETCH / END FASTFETCH ur /root/.bashrc, ~/.profile, /etc/profile och /etc/profile.d/fastfetch.sh. Rensar apt-paketet om det är installerat." + }, + { + "tool": "Figurine", + "restores": "Tar bort binären, profile.d-posten och aliasblocket i bashrc/profile." + } + ] + }, + { + "title": "Hårdvara och virtualisering", + "items": [ + { + "tool": "IOMMU / VFIO", + "restores": "Ta bort vfio-moduler från /etc/modules, nouveau / radeon / nvidia svartlista poster, och intel_iommu=on / amd_iommu=on / iommu=pt / pcie_acs_override parametrar från /etc/kernel/cmdline (ZFS) eller GRUB. Bygger initramfs." + }, + { + "tool": "AMD-processorkorrigeringar (Ryzen/EPYC)", + "restores": "Ta bort idle=nomwait från kernel cmdline (ZFS) eller GRUB, och ignore_msrs / report_ignored_msrs alternativ från /etc/modprobe.d/kvm.conf." + }, + { + "tool": "Gästagent för en virtualiserad Proxmox-värd", + "restores": "Läser /usr/local/share/proxmenux/guest_agent.pkg och rensar det registrerade värdpaketet. Installationen väljer qemu-guest-agent, open-vm-tools eller virtualbox-guest-utils efter hypervisor. Utan post prövas dessa tre paket. Det gäller den nästlade Proxmox-värden, inte gästmallar." + } + ] + }, + { + "title": "Lagring", + "items": [ + { + "tool": "Dimensionering av ZFS ARC", + "restores": "Tar bort /etc/modprobe.d/99-zfsarc.conf, återställer eventuella externa *.conf-filer som tillfälligt flyttats till /usr/local/share/proxmenux/backups/zfs_arc/, bygger om initramfs och kör proxmox-boot-tool refresh på värdar med systemd-boot." + }, + { + "tool": "Automatiska ZFS-ögonblicksbilder", + "restores": "Ta bort cron-posterna som manuset skrev och erbjuder till apt purge zfs-auto-snapshot. Befintliga snapshot-dataset på poolerna lämnas intakt - ta bort dem separat om du vill ha dem borta." + }, + { + "tool": "Hastighetsgränser för vzdump", + "restores": "Återställer /etc/vzdump.conf från installationens .bak och ger bwlimit och ionice deras värden före ProxMenux." + } + ] + }, + { + "title": "Tjänster & extras", + "items": [ + { + "tool": "Tidssynkronisering", + "restores": "Ställ in tidszon tillbaka till UTC (säker standard) via timedatectl." + }, + { + "tool": "Entropigenerering (haveged)", + "restores": "Stoppar, inaktiverar och rensar paketet haveged." + }, + { + "tool": "kexec (snabba omstarter)", + "restores": "Inaktiverar kexec-pve.service, tar bort enhetsfilen och aliaset reboot-quick ur /root/.bash_profile och rensar kexec-tools." + }, + { + "tool": "Inaktivering av RPC / rpcbind", + "restores": "Återställer rpcbind.service och rpcbind.socket var för sig till registrerat aktiverat/inaktiverat och aktivt/inaktivt tillstånd före ProxMenux." + }, + { + "tool": "pigz (parallell gzip)", + "restores": "Återställer riktig gzip från gzip.distrib, tar bort dpkg-omdirigeringen och /bin/pigzwrapper, kommenterar pigz-raden i /etc/vzdump.conf och kör apt purge pigz efter verifiering av gzip." + }, + { + "tool": "Hög tillgänglighetstjänster", + "restores": "Stoppar och inaktiverar pve-ha-lrm, pve-ha-crm och corosync. Befintliga HA-grupper och resursdefinitioner raderas inte; ta bort dem i webbgränssnittet om de inte längre behövs." + }, + { + "tool": "Ceph-paketförråd", + "restores": "Rensar Ceph-paketen som alternativet installerat, tar bort deb822-filen /etc/apt/sources.list.d/ceph.sources på PVE 9 eller äldre Ceph-lista på PVE 8 och uppdaterar APT-cachen." + }, + { + "tool": "OVH RTM (övervakning)", + "restores": "Rensar paket som matchar ovh-rtm*, rtm och rtm-*, tar bort /etc/rtm och RTM-posten i registret. Puppet-rester under /etc/puppet/ kan behöva granskas och rensas manuellt; katalogen tas inte bort. På andra värdar än OVH gör installationen normalt inga ändringar." + } + ] + } + ] + }, + "edge": { + "heading": "Specialfall och begränsningar", + "packageTitle": "Ominstallation påverkar Proxmox-paket som används", + "packageBody": "Om ProxMenux säkerhetskopior inte kan återställa Borttagning av prenumerationsvarning installeras pve-manager, proxmox-widget-toolkit, libjs-extjs och libpve-http-server-perl om med --force-confnew. Det påverkar webbgränssnittet som används: uppdatera webbläsaren och vänta några sekunder på återanslutning. Undvik det under migrering eller kloning.", + "rebootTitle": "Ihållande namn och VFIO behöver en omstart", + "rebootBody": "Att ta bort 10-proxmenux-*.link-filerna (Beständiga gränssnittsnamn) och återställa IOMMU/VFIO ändrar inte det redan startade systemet; ändringarna gäller efter omstart. ProxMenux sätter omstartsflaggan automatiskt.", + "perItemTitle": "Du kan återställa en sak och hålla resten", + "perItemBody": "Avinstallationen arbetar per objekt. För att bara ta bort Log2RAM och behålla nätverksjusteringar och bashrc, markera endast Log2RAM. Övriga ändringar lämnas kvar och registret uppdateras." + }, + "inspect": { + "heading": "Inspektera registret manuellt", + "intro": "Om du vill se vad som spåras utan att öppna menyn:", + "outro": "Varje \"tool\": true-post motsvarar något ProxMenux tillämpas och kan vända. Ta bort en post manuellt rekommenderas inte - använd alltid menyn, som också kör omvänd funktion istället för att bara glömma förändringen.", + "reinstallTitle": "Installera om efter avinstallation", + "reinstallBody": "En återställd optimering kan tillämpas igen senare. Öppna efterinstallationsmenyn och kör Automatiserad eller Anpassningsbar; registret sparar det nya tillståndet." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Automatiserad post-Install", + "href": "/docs/post-install/automated", + "tail": " — tillämpa den rimliga grundkonfigurationen igen." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — Välj en annan delmängd." + }, + { + "label": "Avinstallera ProxMenux", + "href": "/docs/settings/uninstall-proxmenux", + "tail": " - olika operationer: tar bort ProxMenux själv, inte dess tillämpade optimeringar." + }, + { + "label": "Översikt över efterinstallation", + "href": "/docs/post-install", + "tail": "." + } + ] + } +} diff --git a/web/messages/sv/docs/post-install/updates.json b/web/messages/sv/docs/post-install/updates.json new file mode 100644 index 00000000..dd5f6a4c --- /dev/null +++ b/web/messages/sv/docs/post-install/updates.json @@ -0,0 +1,112 @@ +{ + "meta": { + "title": "Tillämpa tillgängliga uppdateringar — Optimeringar efter installation | ProxMenux-dokumentation", + "description": "Hur ProxMenux upptäcker nya versioner av optimeringar efter installationen (Log2Ram, minnesinställningar, systemgränser, Logrotate, nätverk …) och hur du tillämpar dem via efterinstallationsmenyn eller Monitors instrumentpanel." + }, + "header": { + "title": "Tillämpa tillgängliga uppdateringar", + "description": "När en optimering efter installationen (Log2Ram, minnesinställningar, systemgränser, Logrotate …) har en nyare version på disk än den registrerade visar ProxMenux den som en tillgänglig uppdatering. Du kan tillämpa den via skriptens efterinstallationsmeny eller Monitors instrumentpanel. Båda kör samma funktion igen och uppdaterar registret.", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad detta är", + "body": "ProxMenux optimeringar efter installationen har versionsnummer, till exempel Log2ram SSD Protection v1.2. Värden registrerar aktiva optimeringar och deras versioner i /usr/local/share/proxmenux/installed_tools.json. När en ny ProxMenux-version levererar en uppdaterad optimering upptäcks skillnaden och bara den erbjuds för ny tillämpning utan att köra hela efterinstallationen." + }, + "why": { + "heading": "Varför detta existerar", + "body": "Optimeringar efter installationen förbättras ibland med bättre sysctl-inställningar, striktare Logrotate-gränser, nya storleksregler för Log2RAM eller korrigeringar av specialfall. Utan uppdateringsvägen behövde administratören köra hela skriptet med alla optimeringar igen eller avstå förbättringen. Tillämpa tillgängliga uppdateringar låter dig välja omkörning för endast de optimeringar vars version har ändrats." + }, + "detection": { + "heading": "Hur uppdateringar upptäcks", + "steps": [ + { + "title": "Versionerade skript på disk", + "body": "Varje post-install-funktion förklarar sin version i skriptet (scripts/post_install/auto_post_install.sh och scripts/post_install/customizable_post_install.sh). En scanner extraherar dessa versioner från källan på disken." + }, + { + "title": "Versionsregister på värden", + "body": "När administratören tillämpade varje optimering skrev motsvarande register_tool-anrop den aktiva versionen till /usr/local/share/proxmenux/installed_tools.json. Filen är den auktoritativa uppgiften om vad som är aktivt på värden just nu." + }, + { + "title": "Monitor jämför båda sidor", + "body": "Vid start och var 24:e timme jämför Monitor versionerna på disk med registret. Varje skillnad ger en post i /usr/local/share/proxmenux/updates_available.json. Filen styr både efterinstallationsmenyns alternativ och kortet i Monitors instrumentpanel." + }, + { + "title": "En avisering per ny version", + "body": "När minst en uppdatering väntar skickar Monitor en samlad avisering, till exempel ”4 uppdateringar av ProxMenux-optimeringar tillgängliga”, med en rad per verktyg i formatet name (vX → vY), som för Proxmox-paket. Den upprepas inte dagligen för samma uppsättning; bara en ny version eller ett nytt verktyg i listan utlöser den igen." + } + ] + }, + "pathA": { + "heading": "Väg A — Från efterinstallationsmenyn", + "intro": "Öppna Inställningar efter installation av Proxmox i huvudmenyn. När uppdateringar väntar visas Tillämpa tillgängliga uppdateringar (N) ovanför Avinstallera optimeringar. Antalet visar optimeringar med nyare version på disk än i registret. När allt är aktuellt döljs alternativet.", + "menuAlt": "Efterinstallationsmenyn med det villkorliga alternativet Tillämpa tillgängliga uppdateringar (N) ovanför Avinstallera optimeringar; antalet visar optimeringar med nyare version på disk", + "menuCaption": "Tillämpa tillgängliga uppdateringar (N) visas bara när en optimering har en väntande uppdatering och döljs när värden är aktuell.", + "checklistBody": "Öppnar en lista med alla väntande uppdateringar i formatet name (vX → vY). Alla är valda som standard; avmarkera dem du inte vill tillämpa nu.", + "checklistAlt": "Dialogen Tillämpa tillgängliga uppdateringar med en rad per väntande optimering, namn och versionsövergång (aktuell → tillgänglig). Alla rader är valda.", + "checklistCaption": "Välj enskilda optimeringar att uppdatera. Samma motor som Automatiserad och Anpassningsbar tillämpar funktionerna igen i bakgrunden och uppdaterar deras registerversioner." + }, + "pathB": { + "heading": "Väg B — Från Monitors instrumentpanel", + "intro": "Samma uppdateringar finns i Monitor under Inställningar → ProxMenux-optimeringar. Kortet visar en räknare för väntande uppdateringar som öppnar väljaren per optimering. Varje verktyg har också en egen uppdateringsåtgärd.", + "imageAlt": "Kortet ProxMenux-optimeringar i Monitors inställningar med räknare som öppnar väljaren och uppdateringsåtgärder per verktyg", + "imageCaption": "Optimeringskortet i Monitor gör uppdateringarna tillgängliga via räknaren när en nyare version finns på disk, utan skalåtkomst." + }, + "applying": { + "heading": "Vad som händer när du tillämpar uppdateringen", + "steps": [ + { + "title": "Kör efterinstallationsfunktionen igen", + "body": "Den valda funktionen körs igen på värden. Eftersom den är idempotent dupliceras inte konfigurationen utan den gamla versionen ersätts av den nya, inklusive sysctl-filer, tilläggskonfigurationer och tjänsteenheter." + }, + { + "title": "Uppdaterar registret", + "body": "register_tool-anropet i funktionen skriver den nya versionen till installed_tools.json. Nästa skanning ser inte längre en felmatch och uppdateringsinmatningen försvinner från både menyn och Monitor-kortet." + }, + { + "title": "Ingen omstart om inte funktionen säger så", + "body": "De flesta uppdateringar gäller omedelbart. De som ändrar kärnmoduler, beständiga gränssnittsnamn eller VFIO visar samma fråga om omstart som vid en ny installation." + }, + { + "title": "Registreringsuppdatering skickas till Monitor", + "body": "När omgången är klar skickar menyn en POST-begäran till http://127.0.0.1:8008/api/updates/post-install/scan för att återskapa /usr/local/share/proxmenux/updates_available.json. När alla väntande uppdateringar tillämpats försvinner räknaren och det villkorliga skalmenyalternativet utan att invänta nästa skanning. Optimeringskortet finns kvar." + } + ], + "jqTitle": "jq krävs", + "jqBody": "Listan i väg A använder jq för att läsa JSON med väntande uppdateringar. Om jq saknas avslutas flödet tyst: menyn visar antalet men inget händer efter valet. På en modern Proxmox-installation finns jq; kör annars apt install -y jq." + }, + "differs": { + "heading": "Hur det skiljer sig från de andra vägarna", + "headerPath": "Path", + "headerScope": "Omfattning", + "headerWhen": "När det är meningsfullt", + "rows": [ + { + "pathLabel": "Automatiserad", + "pathHref": "/docs/post-install/automated", + "scope": "Tillämpar alla optimeringar i paketet igen.", + "when": "Ny värd eller fullständig återtillämpning av grundinställningarna för en helt hanterad nod." + }, + { + "pathLabel": "Anpassningsbar", + "pathHref": "/docs/post-install/customizable", + "scope": "Välj från hela katalogen.", + "when": "Välja exakt vilka optimeringar som är aktiva på värden." + }, + { + "pathLabel": "Tillämpa tillgängliga uppdateringar", + "pathHref": null, + "scope": "Bara optimeringar med nyare version på disk.", + "when": "Hålla installerade optimeringar aktuella utan att ändra resten." + }, + { + "pathLabel": "Avinstallera optimeringar", + "pathHref": "/docs/post-install/uninstall", + "scope": "Omvänd optimering och ta bort dess registerpost.", + "when": "Rulla tillbaka en specifik förändring." + } + ] + }, + "notifTitle": "Styrning av aviseringen", + "notifBody": "Händelsen Uppdateringar av ProxMenux-optimeringar tillgängliga meddelar väntande uppdateringar. Den är aktiverad som standard på varje kanal och kan tystas per kanal under Inställningar → Aviseringar. Den utlöses bara en gång per unik uppsättning uppdateringar, inte vid varje skanning var 24:e timme." +} diff --git a/web/messages/sv/docs/post-install/virtualization.json b/web/messages/sv/docs/post-install/virtualization.json new file mode 100644 index 00000000..8375333e --- /dev/null +++ b/web/messages/sv/docs/post-install/virtualization.json @@ -0,0 +1,116 @@ +{ + "meta": { + "title": "Post-Install: Virtualisering | ProxMenux Dokumentation", + "description": "Virtualiseringsalternativ i ProxMenux anpassningsbara skript efter installationen: installerar automatiskt rätt gästagent om Proxmox körs i en VM och aktiverar IOMMU / VFIO så att PCI-enheter (GPU:er, nätverkskort, HBA:er) kan genomkopplas till dina VM:ar." + }, + "header": { + "title": "Post-Install: Virtualisering", + "section": "Inställningar efter installation av Proxmox" + }, + "intro": { + "title": "Vad denna kategori täcker", + "body": "Två oberoende alternativ. Installera rätt gästagent hjälper när Proxmox självt körs inuti en annan hypervisor. Aktivera VFIO IOMMU-stöd är det alternativ de flesta behöver: aktiverar kärnfunktioner för att genomkoppla en GPU, HBA eller ett nätverkskort direkt till en VM med nästan nativ prestanda." + }, + "guestAgent": { + "heading": "Installera relevant gästagent", + "intro": "Identifierar Proxmox-värdens virtualiseringsmiljö med systemd-detect-virt och dmidecode och installerar rätt gästverktyg så att den yttre hypervisorn kan kommunicera korrekt med Proxmox: ordnad avstängning, klocksynkronisering, IP-rapportering med mera.", + "headerDetected": "Detekterad värd", + "headerPackage": "Paket installerat", + "rows": [ + { + "detected": "QEMU / KVM", + "package": "qemu-guest-agent" + }, + { + "detected": "VMware (ESXi, Workstation)", + "package": "open-vm-tools" + }, + { + "detected": "VirtualBox", + "package": "virtualbox-guest-utils" + }, + { + "detected": "Bare metal (ingen)", + "package": " — ingen åtgärd, inget installeras" + } + ], + "skipTitle": "Hoppa över detta när Proxmox körs direkt på maskinvaran", + "skipBody": "Om Proxmox körs direkt på maskinvaran, vilket är vanligast, ändrar alternativet ingenting: detektorn returnerar none och skriptet avslutas utan ändringar. Det gäller bara de installationer som kör Proxmox som gäst för test eller labb." + }, + "vfio": { + "heading": "Aktivera VFIO IOMMU-stöd", + "intro": "Aktiverar IOMMU på värden och läser in kärnmodulerna för PCI-genomkoppling (vfio, vfio_iommu_type1, vfio_pci). Då kan du tilldela en fysisk enhet till en VM, vars gäst får direkt åtkomst med nästan nativ prestanda.", + "whoTitle": "Vem behöver detta", + "whoItems": [ + "Du vill genomkoppla en GPU till en Windows-VM för spel eller en macOS-VM.", + "Du har en dedikerad 10G NIC för en brandvägg / router VM (OPNsense, pfSense).", + "Du vill passera en HBA direkt till en TrueNAS/Unraid VM för ZFS på nakna diskar.", + "Du planerar att använda Coral TPU, ett inspelningskort eller en SDR-dongel i en VM." + ], + "whoOutro": "Om inget av dessa stämmer kan du säkert hoppa över det här alternativet. För vidarekoppling till en LXC (inte en VM), krävs inte IOMMU.", + "doesTitle": "Vad ProxMenux gör", + "doesIntro": "Funktionen tar hänsyn till starthanteraren: den identifierar ZFS (systemd-boot) eller LVM/ext4 (GRUB) och skriver till rätt fil. Den är idempotent — parametrar som redan finns läggs inte till igen.", + "headerBoot": "Starttyp", + "headerFile": "Ändrad fil", + "headerPost": "Steg efter uppdatering", + "bootRows": [ + { + "boot": "systemd-boot (ZFS)", + "file": "/etc/kernel/cmdline", + "post": "proxmox-boot-tool refresh" + }, + { + "boot": "GRUB (LVM/ext4)", + "file": "/etc/default/grub", + "post": "update-grub" + } + ], + "kernelIntro": "Tillagda kärnparametrar:", + "modulesIntro": "Kärnmoduler som läggs till i /etc/modules:", + "blacklistIntro": "Konflikterande drivrutiner svartlistas i /etc/modprobe.d/blacklist.conf:", + "blacklistTitle": "Svartlistade GPU-drivrutiner förhindrar GPU-användning på värden", + "blacklistBody": "Svartlistan hindrar värdkärnan från att binda någon GPU-drivrutin så att VFIO kan ta över GPU:n. Det är önskat för genomkoppling till en VM, men är motsatsen till vad du behöver för att installera NVIDIA-drivrutiner på värden, till exempel för LXC-transkodning. Välj en väg per GPU:", + "pathItems": [ + "GPU → VM: aktivera VFIO/IOMMU här och låt GPU-drivrutinerna vara svartlistade.", + "GPU → LXC (eller värd): hoppa över det här alternativet, använd NVIDIA-värdinstallationen, svartlista inte nvidia/nouveau.", + "Två GPU:er: en kan tilldelas en VM och den andra en LXC, men du behöver mer detaljerad konfiguration: bind bara ett kort till vfio-pci med PCI-ID. Standardsvartlistan är för bred för detta — redigera blacklist.conf efteråt." + ], + "acsTitle": "Om pcie_acs_override — förstå vad du aktiverar", + "acsBody": "pcie_acs_override=downstream,multifunction lättar på kontrollen av PCIe Access Control Services. Kärnan kan dela IOMMU-grupper som firmware rapporterar som odelbara, ibland det enda sättet att genomkoppla en enhet utan hela gruppen. Avvägningen är minskad isolering mellan enheter: en skadlig eller komprometterad VM med genomkoppling får större attackyta via DMA. Acceptabelt i ett hemlabb, men överväg noga på värdar med opålitliga arbetslaster. Ta bort parametern från /etc/kernel/cmdline eller /etc/default/grub efter skriptet om den inte behövs och uppdatera starthanteraren igen.", + "rebootTitle": "Omstart krävs", + "rebootBody": "IOMMU, VFIO-moduler och svartlistan börjar gälla efter ombyggnad av initramfs och omstart. Skriptet kör update-initramfs -u -k all, uppdaterar starthanteraren och markerar ”omstart krävs” så att Anpassningsbar frågar i slutet.", + "verifyTitle": "Verifiering efter omstart", + "revertTitle": "Kan återställas från Avinstallera-menyn", + "revertBody": "Avinstallera optimeringar återställer alla ändringar: tar bort IOMMU-parametrarna från /etc/kernel/cmdline eller GRUB, VFIO-modulerna från /etc/modules och drivrutinernas svartlistposter samt bygger om initramfs. En omstart krävs för att återställningen ska börja gälla." + }, + "related": { + "heading": "Relaterat", + "items": [ + { + "label": "Lägg till GPU till VM (Passthrough)", + "href": "/docs/hardware/gpu-vm-passthrough", + "tail": " — naturliga nästa steg när IOMMU + VFIO är aktiverat." + }, + { + "label": "Lägg till Controller eller NVMe till VM", + "href": "/docs/disk-manager/add-controller-nvme-vm", + "tail": " — samma genomkopplingsinfrastruktur för lagringsstyrenheter." + }, + { + "label": "GPU Passthrough kommandon", + "href": "/docs/help-info/gpu-commands", + "tail": " — IOMMU verifiering referens." + }, + { + "label": "Avinstallera optimeringar", + "href": "/docs/post-install/uninstall", + "tail": " — återställ IOMMU / VFIO utan rester." + }, + { + "label": "Anpassningsbar efterinstallation", + "href": "/docs/post-install/customizable", + "tail": " — tillbaka till den överordnade menyn." + } + ] + } +} From 45756cb45f6e6508f3f7f1fa9b62b0d1b8b6647f Mon Sep 17 00:00:00 2001 From: Jonatan <190036+jcastro@users.noreply.github.com> Date: Sat, 17 Oct 2026 15:08:53 +0200 Subject: [PATCH 20/73] docs: review command references in all seven translations --- .github/workflows/test-i18n.yml | 10 + .../de/docs/help-info/backup-commands.json | 235 +++++++++++++++ .../de/docs/help-info/gpu-commands.json | 162 ++++++++++ web/messages/de/docs/help-info/index.json | 87 ++++++ .../de/docs/help-info/network-commands.json | 174 +++++++++++ .../de/docs/help-info/storage-commands.json | 232 +++++++++++++++ .../de/docs/help-info/system-commands.json | 158 ++++++++++ .../de/docs/help-info/tools-commands.json | 276 ++++++++++++++++++ .../de/docs/help-info/update-commands.json | 170 +++++++++++ .../de/docs/help-info/vm-ct-commands.json | 182 ++++++++++++ .../de/docs/help-info/zfs-commands.json | 227 ++++++++++++++ .../en/docs/help-info/backup-commands.json | 40 +-- .../en/docs/help-info/gpu-commands.json | 8 +- .../en/docs/help-info/network-commands.json | 2 +- .../en/docs/help-info/storage-commands.json | 22 +- .../en/docs/help-info/system-commands.json | 6 +- .../en/docs/help-info/tools-commands.json | 2 +- .../en/docs/help-info/update-commands.json | 18 +- .../en/docs/help-info/vm-ct-commands.json | 6 +- .../en/docs/help-info/zfs-commands.json | 2 +- .../es/docs/help-info/backup-commands.json | 44 +-- .../es/docs/help-info/gpu-commands.json | 8 +- web/messages/es/docs/help-info/index.json | 24 +- .../es/docs/help-info/network-commands.json | 8 +- .../es/docs/help-info/storage-commands.json | 30 +- .../es/docs/help-info/system-commands.json | 12 +- .../es/docs/help-info/tools-commands.json | 12 +- .../es/docs/help-info/update-commands.json | 28 +- .../es/docs/help-info/vm-ct-commands.json | 20 +- .../es/docs/help-info/zfs-commands.json | 18 +- .../fr/docs/help-info/backup-commands.json | 235 +++++++++++++++ .../fr/docs/help-info/gpu-commands.json | 162 ++++++++++ web/messages/fr/docs/help-info/index.json | 87 ++++++ .../fr/docs/help-info/network-commands.json | 174 +++++++++++ .../fr/docs/help-info/storage-commands.json | 232 +++++++++++++++ .../fr/docs/help-info/system-commands.json | 158 ++++++++++ .../fr/docs/help-info/tools-commands.json | 276 ++++++++++++++++++ .../fr/docs/help-info/update-commands.json | 170 +++++++++++ .../fr/docs/help-info/vm-ct-commands.json | 182 ++++++++++++ .../fr/docs/help-info/zfs-commands.json | 227 ++++++++++++++ .../it/docs/help-info/backup-commands.json | 235 +++++++++++++++ .../it/docs/help-info/gpu-commands.json | 162 ++++++++++ web/messages/it/docs/help-info/index.json | 87 ++++++ .../it/docs/help-info/network-commands.json | 174 +++++++++++ .../it/docs/help-info/storage-commands.json | 232 +++++++++++++++ .../it/docs/help-info/system-commands.json | 158 ++++++++++ .../it/docs/help-info/tools-commands.json | 276 ++++++++++++++++++ .../it/docs/help-info/update-commands.json | 170 +++++++++++ .../it/docs/help-info/vm-ct-commands.json | 182 ++++++++++++ .../it/docs/help-info/zfs-commands.json | 227 ++++++++++++++ .../pt/docs/help-info/backup-commands.json | 235 +++++++++++++++ .../pt/docs/help-info/gpu-commands.json | 162 ++++++++++ web/messages/pt/docs/help-info/index.json | 87 ++++++ .../pt/docs/help-info/network-commands.json | 174 +++++++++++ .../pt/docs/help-info/storage-commands.json | 232 +++++++++++++++ .../pt/docs/help-info/system-commands.json | 158 ++++++++++ .../pt/docs/help-info/tools-commands.json | 276 ++++++++++++++++++ .../pt/docs/help-info/update-commands.json | 170 +++++++++++ .../pt/docs/help-info/vm-ct-commands.json | 182 ++++++++++++ .../pt/docs/help-info/zfs-commands.json | 227 ++++++++++++++ .../sk/docs/help-info/backup-commands.json | 235 +++++++++++++++ .../sk/docs/help-info/gpu-commands.json | 162 ++++++++++ web/messages/sk/docs/help-info/index.json | 87 ++++++ .../sk/docs/help-info/network-commands.json | 174 +++++++++++ .../sk/docs/help-info/storage-commands.json | 232 +++++++++++++++ .../sk/docs/help-info/system-commands.json | 158 ++++++++++ .../sk/docs/help-info/tools-commands.json | 276 ++++++++++++++++++ .../sk/docs/help-info/update-commands.json | 170 +++++++++++ .../sk/docs/help-info/vm-ct-commands.json | 182 ++++++++++++ .../sk/docs/help-info/zfs-commands.json | 227 ++++++++++++++ .../sv/docs/help-info/backup-commands.json | 235 +++++++++++++++ .../sv/docs/help-info/gpu-commands.json | 162 ++++++++++ web/messages/sv/docs/help-info/index.json | 87 ++++++ .../sv/docs/help-info/network-commands.json | 174 +++++++++++ .../sv/docs/help-info/storage-commands.json | 232 +++++++++++++++ .../sv/docs/help-info/system-commands.json | 158 ++++++++++ .../sv/docs/help-info/tools-commands.json | 276 ++++++++++++++++++ .../sv/docs/help-info/update-commands.json | 170 +++++++++++ .../sv/docs/help-info/vm-ct-commands.json | 182 ++++++++++++ .../sv/docs/help-info/zfs-commands.json | 227 ++++++++++++++ 80 files changed, 11583 insertions(+), 155 deletions(-) create mode 100644 web/messages/de/docs/help-info/backup-commands.json create mode 100644 web/messages/de/docs/help-info/gpu-commands.json create mode 100644 web/messages/de/docs/help-info/index.json create mode 100644 web/messages/de/docs/help-info/network-commands.json create mode 100644 web/messages/de/docs/help-info/storage-commands.json create mode 100644 web/messages/de/docs/help-info/system-commands.json create mode 100644 web/messages/de/docs/help-info/tools-commands.json create mode 100644 web/messages/de/docs/help-info/update-commands.json create mode 100644 web/messages/de/docs/help-info/vm-ct-commands.json create mode 100644 web/messages/de/docs/help-info/zfs-commands.json create mode 100644 web/messages/fr/docs/help-info/backup-commands.json create mode 100644 web/messages/fr/docs/help-info/gpu-commands.json create mode 100644 web/messages/fr/docs/help-info/index.json create mode 100644 web/messages/fr/docs/help-info/network-commands.json create mode 100644 web/messages/fr/docs/help-info/storage-commands.json create mode 100644 web/messages/fr/docs/help-info/system-commands.json create mode 100644 web/messages/fr/docs/help-info/tools-commands.json create mode 100644 web/messages/fr/docs/help-info/update-commands.json create mode 100644 web/messages/fr/docs/help-info/vm-ct-commands.json create mode 100644 web/messages/fr/docs/help-info/zfs-commands.json create mode 100644 web/messages/it/docs/help-info/backup-commands.json create mode 100644 web/messages/it/docs/help-info/gpu-commands.json create mode 100644 web/messages/it/docs/help-info/index.json create mode 100644 web/messages/it/docs/help-info/network-commands.json create mode 100644 web/messages/it/docs/help-info/storage-commands.json create mode 100644 web/messages/it/docs/help-info/system-commands.json create mode 100644 web/messages/it/docs/help-info/tools-commands.json create mode 100644 web/messages/it/docs/help-info/update-commands.json create mode 100644 web/messages/it/docs/help-info/vm-ct-commands.json create mode 100644 web/messages/it/docs/help-info/zfs-commands.json create mode 100644 web/messages/pt/docs/help-info/backup-commands.json create mode 100644 web/messages/pt/docs/help-info/gpu-commands.json create mode 100644 web/messages/pt/docs/help-info/index.json create mode 100644 web/messages/pt/docs/help-info/network-commands.json create mode 100644 web/messages/pt/docs/help-info/storage-commands.json create mode 100644 web/messages/pt/docs/help-info/system-commands.json create mode 100644 web/messages/pt/docs/help-info/tools-commands.json create mode 100644 web/messages/pt/docs/help-info/update-commands.json create mode 100644 web/messages/pt/docs/help-info/vm-ct-commands.json create mode 100644 web/messages/pt/docs/help-info/zfs-commands.json create mode 100644 web/messages/sk/docs/help-info/backup-commands.json create mode 100644 web/messages/sk/docs/help-info/gpu-commands.json create mode 100644 web/messages/sk/docs/help-info/index.json create mode 100644 web/messages/sk/docs/help-info/network-commands.json create mode 100644 web/messages/sk/docs/help-info/storage-commands.json create mode 100644 web/messages/sk/docs/help-info/system-commands.json create mode 100644 web/messages/sk/docs/help-info/tools-commands.json create mode 100644 web/messages/sk/docs/help-info/update-commands.json create mode 100644 web/messages/sk/docs/help-info/vm-ct-commands.json create mode 100644 web/messages/sk/docs/help-info/zfs-commands.json create mode 100644 web/messages/sv/docs/help-info/backup-commands.json create mode 100644 web/messages/sv/docs/help-info/gpu-commands.json create mode 100644 web/messages/sv/docs/help-info/index.json create mode 100644 web/messages/sv/docs/help-info/network-commands.json create mode 100644 web/messages/sv/docs/help-info/storage-commands.json create mode 100644 web/messages/sv/docs/help-info/system-commands.json create mode 100644 web/messages/sv/docs/help-info/tools-commands.json create mode 100644 web/messages/sv/docs/help-info/update-commands.json create mode 100644 web/messages/sv/docs/help-info/vm-ct-commands.json create mode 100644 web/messages/sv/docs/help-info/zfs-commands.json diff --git a/.github/workflows/test-i18n.yml b/.github/workflows/test-i18n.yml index 2b3e4685..7f4dfb51 100644 --- a/.github/workflows/test-i18n.yml +++ b/.github/workflows/test-i18n.yml @@ -9,15 +9,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' push: branches: [main, develop] paths: @@ -27,15 +32,20 @@ on: - 'AppImage/messages/**' - 'AppImage/lib/i18n/**' - 'AppImage/components/terminal-panel.tsx' + - 'web/**' - 'CONTRIBUTING.md' # Scheduler consumers and the offline extractor's .sh/.func inputs. - 'scripts/**/*.sh' - 'scripts/**/*.func' - 'scripts/**/*.py' - 'lang/*.json' + - 'menu' + - 'install_proxmenux.sh' + - 'install_proxmenux_beta.sh' - 'oci/src/**/*.py' - 'oci/catalog/**/*.json' - 'oci/remote/**/*.sh' + - 'oci/remote/**/*.py' workflow_dispatch: permissions: diff --git a/web/messages/de/docs/help-info/backup-commands.json b/web/messages/de/docs/help-info/backup-commands.json new file mode 100644 index 00000000..4652f759 --- /dev/null +++ b/web/messages/de/docs/help-info/backup-commands.json @@ -0,0 +1,235 @@ +{ + "meta": { + "title": "Proxmox-Sicherungsbefehle — vzdump, qmrestore, pct restore | ProxMenux", + "description": "Referenz der Sicherungs- und Wiederherstellungsbefehle von Proxmox VE: vzdump für VMs und LXC-Container, qmrestore für VMs, pct restore für Container, geplante Sicherungen in /etc/pve/jobs.cfg, Hook-Skripte und auszuschließende Pfade.", + "ogTitle": "Proxmox-Sicherungsbefehle — vzdump, qmrestore, pct restore", + "ogDescription": "Referenz der Befehle vzdump, qmrestore und pct restore zum Sichern und Wiederherstellen von Proxmox VMs und LXC Containern.", + "twitterTitle": "Proxmox Backup Befehle | ProxMenux", + "twitterDescription": "vzdump, qmrestore und pct restore Befehle zum Sichern und Wiederherstellen von Proxmox VMs und Containern." + }, + "header": { + "title": "Sicherung und Wiederherstellung", + "description": "Kuratierte Referenz der Befehle vzdump, qmrestore und pct restore für Proxmox Backup-Workflows. Enthält Planung, erweiterte Optionen wie Hook-Skripte / Ausschlusspfade / I / O-Priorität und Backup-Dateiverwaltung.", + "section": "Hilfe und Informationen" + }, + "intro": { + "title": "Drei Backup-Modi", + "body": "Bei VMs ist snapshot eine Live-Sicherung ohne Speicher-Snapshot-Anforderung. suspend pausiert die VM davor und verbessert die Konsistenz nicht unbedingt. stop fährt sie zunächst herunter; eine zuvor laufende VM kann nach Beginn der Sicherung weiterlaufen. Bei LXC ist es anders: snapshot benötigt Snapshot-fähigen Speicher, suspend nutzt zwei rsync-Durchläufe, und stop hält den Container während der gesamten Sicherung an." + }, + "commandGroups": [ + { + "title": "VM-Sicherung", + "commands": [ + { + "command": "vzdump ", + "description": "Erstellen Sie ein Backup eines bestimmten VM/CT" + }, + { + "command": "vzdump --storage ", + "description": "VM auf einen bestimmten Speicher sichern" + }, + { + "command": "vzdump --mode snapshot", + "description": "Snapshot-Backup erstellen (für VMs)" + }, + { + "command": "vzdump --mode suspend", + "description": "VM vor der Live-Sicherung pausieren, veralteter suspend-Modus" + }, + { + "command": "vzdump --mode stop", + "description": "VM vor dem Start der Sicherung herunterfahren" + }, + { + "command": "vzdump --all", + "description": "Backup aller VMs und Container" + }, + { + "command": "vzdump --all --exclude ,", + "description": "Backup aller außer spezifizierten VMs" + } + ] + }, + { + "title": "Backup-Optionen", + "commands": [ + { + "command": "vzdump --compress zstd", + "description": "Verwenden Sie zstd Kompression für Backup" + }, + { + "command": "vzdump --compress gzip --pigz ", + "description": "Verwenden Sie pigz mit mehreren Threads" + }, + { + "command": "vzdump --storage --notes-template ", + "description": "Notizen zum Backup hinzufügen" + }, + { + "command": "vzdump --mailto ", + "description": "Senden Sie Benachrichtigung E-Mail" + }, + { + "command": "vzdump --prune-backups keep-last=", + "description": "Halten Sie nur n Backups pro VM" + }, + { + "command": "vzdump --stdexcludes 0", + "description": "Keine temporären Dateien ausschließen" + }, + { + "command": "vzdump --quiet 1", + "description": "Ausgabemeldungen unterdrücken" + } + ] + }, + { + "title": "Backups wiederherstellen", + "commands": [ + { + "command": "qmrestore ", + "description": "VM aus dem Backup wiederherstellen" + }, + { + "command": "qmrestore --storage ", + "description": "Wiederherstellen zu einem bestimmten Speicher" + }, + { + "command": "qmrestore --unique", + "description": "VM mit neu erzeugten zufälligen MAC-Adressen wiederherstellen" + }, + { + "command": "pct restore ", + "description": "Container aus dem Backup wiederherstellen" + }, + { + "command": "pct restore --storage ", + "description": "Container auf einen bestimmten Speicher wiederherstellen" + }, + { + "command": "pct restore --rootfs :", + "description": "Mit Root-Disk auf dem gewählten Speicher und in der gewählten Größe wiederherstellen" + }, + { + "command": "pct restore --unprivileged 1", + "description": "Wiederherstellen als unprivilegierte CT" + } + ] + }, + { + "title": "Sicherungsverwaltung", + "commands": [ + { + "command": "ls -la /var/lib/vz/dump/", + "description": "Backups am Standardstandort auflisten" + }, + { + "command": "find /var/lib/vz/dump/ -name \"*.vma*\"", + "description": "VM Backups finden" + }, + { + "command": "find /var/lib/vz/dump/ -name \"*.tar*\"", + "description": "Container-Backups finden" + }, + { + "command": "pvesm list --content backup", + "description": "Backups im spezifischen Speicher auflisten" + }, + { + "command": "rm /var/lib/vz/dump/", + "description": "Löschen einer Backup-Datei" + }, + { + "command": "cat /etc/vzdump.conf", + "description": "Backup Konfiguration anzeigen" + } + ] + }, + { + "title": "Geplante Backups", + "commands": [ + { + "command": "cat /etc/pve/jobs.cfg", + "description": "Backup-Zeitplan anzeigen" + }, + { + "command": "nano /etc/vzdump.conf", + "description": "Backup-Konfiguration bearbeiten" + }, + { + "command": "systemctl list-timers", + "description": "systemd-Timer auflisten" + }, + { + "command": "systemctl status cron", + "description": "Status des cron-Dienstes prüfen" + }, + { + "command": "pvenode task list --typefilter vzdump", + "description": "Abgeschlossene Sicherungsaufgaben auflisten" + }, + { + "command": "pvenode task log ", + "description": "Protokoll einer Sicherungsaufgabe anhand der UPID anzeigen" + } + ] + }, + { + "title": "Fortgeschrittene Operationen", + "commands": [ + { + "command": "qmrestore --force", + "description": "Wiederherstellung erzwingen und vorhandene VM überschreiben" + }, + { + "command": "vzdump --dumpdir ", + "description": "Benutzerdefiniertes Backup-Verzeichnis angeben" + }, + { + "command": "vzdump --script ' + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + locales = ["en", "es", "de", "fr", "it", "pt", "sk", "sv"] + for locale in locales: + file = root / "out" / locale / "docs/monitor/index.html" + file.parent.mkdir(parents=True) + file.write_text(html) + for relative in ["out/index.html", "out/assets/index.html"]: + file = root / relative + file.parent.mkdir(parents=True, exist_ok=True) + file.write_text(html) + result = subprocess.run([node, str(SCRIPT)], cwd=root, capture_output=True, text=True) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn("8 localized pages", result.stdout) + for locale in locales: + actual = (root / "out" / locale / "docs/monitor/index.html").read_text() + self.assertEqual(actual, html.replace('&1 1>&2 2>&3) + "sk" "Slovenčina" \ + "sv" "Svenska" 3>&1 1>&2 2>&3) if [ -z "$LANGUAGE" ]; then msg_error "No language selected. Exiting." diff --git a/install_proxmenux_beta.sh b/install_proxmenux_beta.sh index 90022cd2..225b3502 100644 --- a/install_proxmenux_beta.sh +++ b/install_proxmenux_beta.sh @@ -594,7 +594,8 @@ select_language() { "de" "German" \ "it" "Italian" \ "pt" "Portuguese" \ - "sk" "Slovenčina" 3>&1 1>&2 2>&3) + "sk" "Slovenčina" \ + "sv" "Svenska" 3>&1 1>&2 2>&3) if [ -z "$LANGUAGE" ]; then msg_error "No language selected. Exiting." diff --git a/lang/de.json b/lang/de.json index 6b118ceb..1e552659 100644 --- a/lang/de.json +++ b/lang/de.json @@ -1643,8 +1643,8 @@ "Default Proxmox logo applied": "Standardmäßiges Proxmox-Logo angewendet", "Default is none (video-only passthrough). Use SPACE to toggle selections.": "Der Standardwert ist „Keine“ (nur Video-Passthrough). Verwenden Sie die LEERTASTE, um die Auswahl umzuschalten.", "Default journald configuration restored": "Standard-Journald-Konfiguration wiederhergestellt", - "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "Der Standardspeicherort ist /mnt/. Die Freigabe wird hier auf dem Host mit offenen Berechtigungen gemountet, sodass ein unprivilegierter LXC sie binden, mounten und darauf schreiben kann. Für den LXC-Zugriff müssen Sie diesen Pfad mit dem LXC Mount Manager binden.", - "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "Der Standardspeicherort ist /mnt/. Die Freigabe wird hier auf dem Host gemountet. Verwenden Sie diesen Pfad in /etc/fstab. Für den LXC-Zugriff müssen Sie diesen Pfad mit dem LXC Mount Manager binden.", + "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "Der Standardspeicherort ist /mnt/. Die Freigabe wird hier auf dem Host mit offenen Berechtigungen eingehängt, sodass ein unprivilegierter LXC sie per Bind-Mount einbinden und darauf schreiben kann. Verwenden Sie dafür den LXC Mount Manager.", + "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "Der Standardspeicherort ist /mnt/. Die Freigabe wird hier auf dem Host eingehängt. Verwenden Sie diesen Pfad in /etc/fstab. Für den Zugriff aus einem LXC binden Sie ihn mit dem LXC Mount Manager als Bind-Mount ein.", "Default login": "Standard-Login", "Default options": "Standardoptionen", "Default options read/write": "Standardoptionen Lesen/Schreiben", @@ -2035,7 +2035,7 @@ "Enter VM ID:": "Geben Sie die VM-ID ein:", "Enter VM/CT ID:": "Geben Sie die VM/CT-ID ein:", "Enter ZFS pool name for the selected disk:": "Geben Sie den ZFS-Poolnamen für die ausgewählte Festplatte ein:", - "Enter a name for the mount point (used as /mnt/):": "Geben Sie einen Namen für den Mount-Punkt ein (verwendet als /mnt/):", + "Enter a name for the mount point (used as /mnt/):": "Geben Sie einen Namen für den Mountpoint ein (wird als /mnt/ verwendet):", "Enter a name for the new virtual machine:": "Geben Sie einen Namen für die neue virtuelle Maschine ein:", "Enter a non-empty password or access token on a single line.": "Geben Sie in einer einzelnen Zeile ein nicht leeres Passwort oder Zugriffstoken ein.", "Enter a number, or write or paste a command:": "Geben Sie eine Zahl ein oder schreiben oder fügen Sie einen Befehl ein:", @@ -2183,7 +2183,7 @@ "Example: pct stop 110": "Beispiel: pct stop 110", "Example: pct stop 114": "Beispiel: pct stop 114", "Example: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup": "Beispiel: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup", - "Example: pvesm path local-lvm:vm-114-disk-0": "Beispiel: pvesm-Pfad local-lvm:vm-114-disk-0", + "Example: pvesm path local-lvm:vm-114-disk-0": "Beispiel: pvesm path local-lvm:vm-114-disk-0", "Example: sed -i '/^unprivileged: 1/d' /etc/pve/lxc/110.conf": "Beispiel: sed -i '/^unprivileged: 1/d' /etc/pve/lxc/110.conf", "Examples:": "Beispiele:", "Execute destructive rollback?": "Destruktives Rollback ausführen?", @@ -2495,7 +2495,7 @@ "For a consistent export, the VM should be stopped.": "Für einen konsistenten Export sollte die VM gestoppt werden.", "For any question, issue or bug report, please use the official repository": "Für Fragen, Probleme oder Fehlerberichte nutzen Sie bitte das offizielle Repository", "For dedicated GPUs, FLR is required by this policy to reduce VM": "Für dedizierte GPUs ist gemäß dieser Richtlinie FLR erforderlich, um VM zu reduzieren", - "For example: pct enter 101": "Beispiel: pct Geben Sie 101 ein", + "For example: pct enter 101": "Zum Beispiel: pct enter 101", "For guest shares add: --options guest": "Für Gastfreigaben hinzufügen: --options Guest", "For security reasons, the system cannot format it.": "Aus Sicherheitsgründen kann das System es nicht formatieren.", "For unprivileged containers, use instead:": "Verwenden Sie für nichtprivilegierte Container stattdessen:", @@ -2907,8 +2907,8 @@ "If notifications are enabled (Telegram/Discord/ntfy/...), you will receive a \"Host restore finished\" message when all background tasks complete.": "Wenn Benachrichtigungen aktiviert sind (Telegram/Discord/ntfy/...), erhalten Sie die Meldung „Host-Wiederherstellung abgeschlossen“, wenn alle Hintergrundaufgaben abgeschlossen sind.", "If passthrough fails on Windows: install RadeonResetBugFix.": "Wenn Passthrough unter Windows fehlschlägt: Installieren Sie RadeonResetBugFix.", "If path not accessible (ZFS/BTRFS):": "Wenn der Pfad nicht zugänglich ist (ZFS/BTRFS):", - "If pvesm path returned a DEVICE (LVM):": "Wenn der pvesm-Pfad ein GERÄT (LVM) zurückgegeben hat:", - "If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Wenn der pvesm-Pfad ein VERZEICHNIS (ZFS/BTRFS) zurückgegeben hat:", + "If pvesm path returned a DEVICE (LVM):": "Wenn pvesm path ein GERÄT (LVM) zurückgegeben hat:", + "If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Wenn pvesm path ein VERZEICHNIS (ZFS/BTRFS) zurückgegeben hat:", "If repositories error:": "Bei Repository-Fehler:", "If the container had already been changed, its previous native backup is restored. Shared host directories are not reverted. The disks of the failed attempt are removed when the cleanup succeeds.": "Wenn der Container bereits geändert wurde, wird sein vorheriges natives Backup wiederhergestellt. Freigegebene Hostverzeichnisse werden nicht zurückgesetzt. Die Festplatten des fehlgeschlagenen Versuchs werden entfernt, wenn die Bereinigung erfolgreich ist.", "If the host freezes, remove hostpci entries from": "Wenn der Host einfriert, entfernen Sie die Hostpci-Einträge aus", @@ -3225,7 +3225,7 @@ "Interrupted operation:": "Unterbrochene operation:", "Interrupted stack operation found": "Unterbrochener Stapel operation gefunden", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Ungültiger „proxmox-ve“-Kandidat (nicht 9.x oder keiner). Bitte überprüfen Sie Ihre Repository-Konfiguration und Ihr Netzwerk und versuchen Sie es dann erneut.", - "Invalid ALLOWED_HOSTS value": "Wert für ungültig ALLOWED HOSTs", + "Invalid ALLOWED_HOSTS value": "Ungültiger Wert für ALLOWED_HOSTS", "Invalid Home Assistant OS check timeout": "Invalid Home Assistant OS Check Timeout", "Invalid ID": "Ungültige ID", "Invalid IPv4 address": "Ungültige IPv4-Adresse", @@ -3460,7 +3460,7 @@ "Keyfile removed.": "Schlüsseldatei entfernt.", "Keyrings method failed; trying apt-key fallback": "Keyrings-Methode fehlgeschlagen; Ich versuche einen Apt-Key-Fallback", "KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad - Eine Cross-Plattform und Open Source Electronics Design Automation Suite.", - "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai hat kein Standardkonto. Geben Sie den Container ein mit: pct enter {main vmid}", + "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai hat kein Standardkonto. Öffnen Sie eine Shell im Container mit: pct enter {main_vmid}", "Kimai is a professional grade time-tracking application, free and open-source.": "Kimai ist eine professionelle Time-Tracking-Anwendung, kostenlos und Open-Source.", "Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa ist ein leistungsstarkes Tool, das Ihnen die vollständige Kontrolle über Ihre Medienbibliotheken gibt. Mit Kometa können Sie Ihre Anpassung auf die nächste Ebene bringen, mit granularer Kontrolle über Metadaten, Sammlungen, Overlays und vielem mehr.", "Kometa reads its configuration from /config/config.yml and the container only ships /config/config.yml.template. Copy the template to config.yml, fill in the required Plex and TMDb connections, then restart the container.": "Kometa liest seine Konfiguration aus /config/config.yml und der Container liefert nur /config/config.yml.template. Kopieren Sie die Vorlage auf config.yml, füllen Sie die required Plex und TMDb-Verbindungen aus und starten Sie dann den Container neu.", @@ -3531,7 +3531,7 @@ "Limiting size and optimizing journald": "Begrenzung der Größe und Optimierung des Journals", "Limiting size and optimizing journald...": "Größe begrenzen und Journal optimieren...", "Limnoria A robust, full-featured, and user/programmer-friendly Python IRC bot, with many existing plugins. Successor of the well-known Supybot.": "Limnoria Ein robuster, voll ausgestatteter und benutzerfreundlicher Python IRC-Bot mit vielen vorhandenen Plugins. Nachfolger des bekannten Supybot.", - "Limnoria joins no IRC network until its configuration file exists. Create it with the setup wizard from the Proxmox host: pct exec -- bash -c 'cd /config && limnoria-wizard'": "Limnoria schließt sich keinem IRC-Netzwerk an, bis seine Konfigurationsdatei existiert. Erstellen Sie es mit dem Setup-Assistenten aus dem Proxmox-Host: pct exec - bash -c 'cd /config & & limnoria-Wizard'", + "Limnoria joins no IRC network until its configuration file exists. Create it with the setup wizard from the Proxmox host: pct exec -- bash -c 'cd /config && limnoria-wizard'": "Limnoria verbindet sich erst mit einem IRC-Netzwerk, wenn die Konfigurationsdatei existiert. Erstellen Sie sie mit dem Einrichtungsassistenten auf dem Proxmox-Host: pct exec -- bash -c 'cd /config && limnoria-wizard'", "Line to paste (single line, including \"command=...\" prefix):": "Einzufügende Zeile (einzelne Zeile, einschließlich „command=…“-Präfix):", "Linux Installation Options": "Linux-Installationsoptionen", "Linux/Mac path:": "Linux/Mac-Pfad:", @@ -4263,7 +4263,7 @@ "No jobs": "Keine Jobs", "No language selected.": "Keine Sprache ausgewählt.", "No local disk storage configured.": "Kein lokaler Festplattenspeicher konfiguriert.", - "No main sources.list present (skipped)": "Keine Hauptquellenliste vorhanden (übersprungen)", + "No main sources.list present (skipped)": "Keine zentrale sources.list vorhanden (übersprungen)", "No matches for:": "Keine Treffer für:", "No matching PVE vzdump jobs were found for the PBS backend.": "Für das PBS-Backend wurden keine passenden PVE-vzdump-Jobs gefunden.", "No matching PVE vzdump jobs were found for the local archive backend.": "Für das lokale Archiv-Backend wurden keine passenden PVE-vzdump-Jobs gefunden.", @@ -6993,7 +6993,7 @@ "Transaction log:": "Transaktionsprotokoll:", "Translation files:": "Übersetzungsdateien:", "Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, µTP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more.": "Transmission wurde für eine einfache und leistungsstarke Nutzung entwickelt. Transmission verfügt über die Funktionen, die Sie von einem BitTorrent-Client erwarten: Verschlüsselung, eine Web-Schnittstelle, Peer-Exchange, Magnet-Links, DHT, μTP, UPnP und NAT-PMP Port-Weiterleitung, Webseed-Unterstützung, Watch-Verzeichnisse, Tracker-Bearbeitung, globale und per-Torrent-Geschwindigkeitsbeschränkungen und mehr.", - "Tried pvesm path and manual detection methods": "Versuchte den Pvesm-Pfad und manuelle Erkennungsmethoden", + "Tried pvesm path and manual detection methods": "pvesm path und manuelle Erkennungsmethoden wurden versucht", "Trust this certificate and save it for scheduled backups?": "Diesem Zertifikat vertrauen und es für geplante Sicherungen speichern?", "Try Again": "Versuchen Sie es erneut", "Try a different search term.": "Versuchen Sie es mit einem anderen Suchbegriff.", @@ -7249,7 +7249,7 @@ "Usage:": "Verwendung:", "Use \"Check test progress\" to see results.": "Verwenden Sie „Testfortschritt prüfen“, um die Ergebnisse anzuzeigen.", "Use 'Export to file' to save it and inspect manually.": "Verwenden Sie „In Datei exportieren“, um es zu speichern und manuell zu überprüfen.", - "Use 'pct restore' / 'qmrestore' to recover their disks from your VM backups.": "Verwenden Sie „pct restart“ / „qmrestore“, um ihre Festplatten aus Ihren VM-Backups wiederherzustellen.", + "Use 'pct restore' / 'qmrestore' to recover their disks from your VM backups.": "Verwenden Sie 'pct restore' / 'qmrestore', um die Datenträger aus den VM-Sicherungen wiederherzustellen.", "Use Custom backup and uncheck the conflicting path from the list": "Verwenden Sie die benutzerdefinierte Sicherung und deaktivieren Sie den in Konflikt stehenden Pfad aus der Liste", "Use Default Settings?": "Standardeinstellungen verwenden?", "Use Download first if you want to save a copy of the current key. Continue?": "Verwenden Sie zuerst „Herunterladen“, wenn Sie eine Kopie des aktuellen Schlüssels speichern möchten. Weitermachen?", @@ -7994,8 +7994,8 @@ "partition(s). Partition table preserved.": "Partition(en). Partitionstabelle bleibt erhalten.", "pasted Compose file": "Einfügen der Compose-Datei", "paths for next boot (/etc/pve, guests, drivers, ...)": "Pfade für den nächsten Start (/etc/pve, Gäste, Treiber, ...)", - "pct exec authorization failed": "PCT-Exec-Autorisierung fehlgeschlagen", - "pct push failed. Check log:": "PCT-Push fehlgeschlagen. Protokoll prüfen:", + "pct exec authorization failed": "Autorisierung für pct exec fehlgeschlagen", + "pct push failed. Check log:": "pct push fehlgeschlagen. Protokoll prüfen:", "pending (reboot required to enumerate full group)": "ausstehend (Neustart erforderlich, um die vollständige Gruppe aufzulisten)", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin wird mit aktivierten beliebigen Serververbindungen installiert: Die Anmeldeseite hat ein Serverfeld, in dem die Adresse des MySQL- oder MariaDB-Servers zusammen mit seinem Benutzer und seinem Passwort eingegeben wird.", "pigz configuration completed": "Pigz-Konfiguration abgeschlossen", @@ -8018,8 +8018,8 @@ "pvesm command not found. This should not happen on Proxmox.": "pvesm-Befehl nicht gefunden. Dies sollte auf Proxmox nicht passieren.", "pvesm not available.": "pvesm nicht verfügbar.", "pvesm not found.": "pvesm nicht gefunden.", - "pvesm path failed, trying manual detection...": "pvesm-Pfad fehlgeschlagen, manuelle Erkennung versucht ...", - "pvesm status failed": "pvesm-Status fehlgeschlagen", + "pvesm path failed, trying manual detection...": "pvesm path fehlgeschlagen, manuelle Erkennung wird versucht...", + "pvesm status failed": "pvesm status fehlgeschlagen", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad ist ein Free- und Open Source-Download-Manager, der in Python geschrieben ist und extrem leicht, leicht erweiterbar und vollständig über das Web zu verwalten ist.", "pyLoad web interface": "pyLoad Web Interface", "qBittorrent WebUI password (user: admin)": "qBittorrent WebUI Passwort (Benutzer: admin)", @@ -8078,8 +8078,8 @@ "skipped (already exist)": "übersprungen (existiert bereits)", "smbclient command is not working properly.": "Der smbclient-Befehl funktioniert nicht ordnungsgemäß.", "smbclient command not found after installation.": "Der Befehl smbclient wurde nach der Installation nicht gefunden.", - "sources.list update skipped (no change)": "Aktualisierung der Quellenliste übersprungen (keine Änderung)", - "sources.list updated to Trixie": "Quellen. Liste auf Trixie aktualisiert", + "sources.list update skipped (no change)": "Aktualisierung von sources.list übersprungen (keine Änderung)", + "sources.list updated to Trixie": "sources.list auf Trixie aktualisiert", "ssh-keygen failed. Cannot create a new SSH key.": "ssh-keygen ist fehlgeschlagen. Es kann kein neuer SSH-Schlüssel erstellt werden.", "stale entry/entries for interfaces no longer present": "veralteter Eintrag/Einträge für Schnittstellen, die nicht mehr vorhanden sind", "standard performance": "Standardleistung", @@ -8098,7 +8098,7 @@ "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh wurde nicht gefunden.", "sysfs ROM dump failed — trying ACPI VFCT table...": "sysfs-ROM-Dump fehlgeschlagen – Versuch der ACPI-VFCT-Tabelle ...", "syslog-ng allows you to flexibly collect, parse, classify, rewrite and correlate logs from across your infrastructure and store or route them to log analysis tools.": "syslog-ng ermöglicht es Ihnen, Protokolle aus Ihrer gesamten Infrastruktur flexibel zu sammeln, zu analysieren, zu klassifizieren, neu zu schreiben und zu korrelieren und sie zu Protokollanalyse-Tools zu speichern oder zu leiten.", - "systemctl restart networking failed:": "systemctl-Neustart des Netzwerks fehlgeschlagen:", + "systemctl restart networking failed:": "systemctl restart networking fehlgeschlagen:", "systemd OnCalendar expression": "systemd OnCalendar-Ausdruck", "the API key was not generated on the first start": "Der API-Schlüssel wurde beim ersten Start nicht generiert", "the NVIDIA hook of the container is not available:": "der NVIDIA-Hook des Containers ist nicht verfügbar:", @@ -8152,7 +8152,7 @@ "video + recognition": "Video + Erkennung", "video only": "nur Video", "vzdump backup speed optimization completed": "vzdump-Backup-Geschwindigkeitsoptimierung abgeschlossen", - "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again.": "wallabag baut seine Links aus der während der Installation angegebenen Adresse auf. Wenn es nicht mit der Adresse des Containers übereinstimmt, bearbeiten Sie lxc.environment. Laufzeit: SYMFONY ENV DOMAIN NAME in /etc/pve/lxc/.conf mit angehaltenem Container und erneut starten.", + "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again.": "wallabag erzeugt seine Links aus der bei der Installation angegebenen Adresse. Passt diese nicht zur Container-Adresse, stoppen Sie den Container, bearbeiten Sie lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf und starten Sie ihn erneut.", "wallabag listens on port 80 of the container and stores its data in SQLite.": "wallabag hört auf Port 80 des Containers und speichert seine Daten in SQLite.", "wallabag web interface": "wallabag Web-Schnittstelle", "was": "war", diff --git a/lang/es.json b/lang/es.json index b54e843c..0638f139 100644 --- a/lang/es.json +++ b/lang/es.json @@ -320,7 +320,7 @@ "After confirming, you will be asked to choose the NVIDIA driver version to install.": "Después de confirmar, se le pedirá que elija la versión del controlador NVIDIA para instalar.", "After detailed analysis, no changes are needed.": "Después de un análisis detallado, no se necesitan cambios.", "After detailed analysis, no cleanup is needed.": "Después de un análisis detallado, no es necesaria ninguna limpieza.", - "After logging in, run: ip a to obtain the IP address.\nThen, enter that IP address in your web browser like this:\n http://IP_ADDRESS\n\nThis will open the Umbral OS dashboard.": "Después de iniciar sesión, ejecute: ip a para obtener la dirección IP.\nLuego, ingrese esa dirección IP en su navegador web de esta manera:\n http://DIRECCIÓN_IP\n\nEsto abrirá el panel de Umbral OS.", + "After logging in, run: ip a to obtain the IP address.\nThen, enter that IP address in your web browser like this:\n http://IP_ADDRESS\n\nThis will open the Umbral OS dashboard.": "Después de iniciar sesión, ejecuta ip a para obtener la dirección IP.\nIntroduce esa dirección en el navegador de esta forma:\n http://IP_ADDRESS\n\nSe abrirá el panel de Umbral OS.", "After pasting on the server, ensure the file is chmod 600 and owned by": "Después de pegarlo en el servidor, asegúrese de que el archivo sea chmod 600 y sea propiedad de", "After reboot the system will be fully accessible (SSH, web UI, login), but the following components will be reinstalled in BACKGROUND — until they finish, commands like nvidia-smi may not yet be available:": "Después de reiniciar, el sistema será completamente accesible (SSH, interfaz web e inicio de sesión), pero los siguientes componentes se reinstalarán EN SEGUNDO PLANO; hasta que finalicen, es posible que comandos como nvidia-smi aún no estén disponibles:", "After reboot, these components will reinstall in background:": "Después de reiniciar, estos componentes se reinstalarán en segundo plano:", @@ -1641,8 +1641,8 @@ "Default Proxmox logo applied": "Logotipo predeterminado de Proxmox aplicado", "Default is none (video-only passthrough). Use SPACE to toggle selections.": "Por defecto, ninguno (passthrough solo de vídeo). Use ESPACIO para marcar o desmarcar.", "Default journald configuration restored": "Configuración de diario predeterminada restaurada", - "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "La ubicación predeterminada es /mnt/. El recurso compartido se montará aquí en el host con permisos abiertos para que un LXC sin privilegios pueda vincularlo, montarlo y escribir en él. Para acceder a LXC, vincule esta ruta con LXC Mount Manager.", - "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "La ubicación predeterminada es /mnt/. El recurso compartido se montará aquí en el host. Utilice esta ruta en /etc/fstab. Para acceder a LXC, vincule esta ruta con LXC Mount Manager.", + "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "La ubicación predeterminada es /mnt/. El recurso compartido se montará aquí, en el host, con permisos abiertos para que un LXC sin privilegios pueda montarlo mediante un bind mount y escribir en él. Usa LXC Mount Manager para crear ese montaje en el LXC.", + "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "La ubicación predeterminada es /mnt/. El recurso compartido se montará aquí, en el host. Usa esta ruta en /etc/fstab. Para acceder desde un LXC, crea un bind mount de esta ruta con LXC Mount Manager.", "Default login": "Acceso predeterminado", "Default options": "Opciones predeterminadas", "Default options read/write": "Opciones predeterminadas lectura/escritura", @@ -2033,7 +2033,7 @@ "Enter VM ID:": "Introduzca el ID de la máquina virtual:", "Enter VM/CT ID:": "Introduzca el ID de VM/CT:", "Enter ZFS pool name for the selected disk:": "Ingrese el nombre del grupo ZFS para el disco seleccionado:", - "Enter a name for the mount point (used as /mnt/):": "Ingrese un nombre para el punto de montaje (usado como /mnt/):", + "Enter a name for the mount point (used as /mnt/):": "Introduce un nombre para el punto de montaje (se usará como /mnt/):", "Enter a name for the new virtual machine:": "Ingrese un nombre para la nueva máquina virtual:", "Enter a non-empty password or access token on a single line.": "Escribe una contraseña o un token de acceso, en una sola línea.", "Enter a number, or write or paste a command:": "Ingrese un número, o escriba o pegue un comando:", @@ -2176,11 +2176,11 @@ "Example: cp /etc/pve/lxc/114.conf /etc/pve/lxc/114.conf.bak": "Ejemplo: cp /etc/pve/lxc/114.conf /etc/pve/lxc/114.conf.bak", "Example: daily or Mon..Fri 03:00": "Ejemplo: diario o lunes a viernes 03:00", "Example: mkdir -p /tmp/lxc_convert_114": "Ejemplo: mkdir -p /tmp/lxc_convert_114", - "Example: pct config 110 | grep unprivileged": "Ejemplo: configuración pct 110 | grep sin privilegios", - "Example: pct stop 110": "Ejemplo: parada pct 110", - "Example: pct stop 114": "Ejemplo: parada pct 114", + "Example: pct config 110 | grep unprivileged": "Ejemplo: pct config 110 | grep unprivileged", + "Example: pct stop 110": "Ejemplo: pct stop 110", + "Example: pct stop 114": "Ejemplo: pct stop 114", "Example: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup": "Ejemplo: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup", - "Example: pvesm path local-lvm:vm-114-disk-0": "Ejemplo: ruta pvesm local-lvm:vm-114-disk-0", + "Example: pvesm path local-lvm:vm-114-disk-0": "Ejemplo: pvesm path local-lvm:vm-114-disk-0", "Example: sed -i '/^unprivileged: 1/d' /etc/pve/lxc/110.conf": "Ejemplo: sed -i '/^sin privilegios: 1/d' /etc/pve/lxc/110.conf", "Examples:": "Ejemplos:", "Execute destructive rollback?": "¿Ejecutar el rollback destructivo?", @@ -2492,7 +2492,7 @@ "For a consistent export, the VM should be stopped.": "Para una exportación consistente, se debe detener la VM.", "For any question, issue or bug report, please use the official repository": "Para cualquier pregunta, problema o informe de error, utilice el repositorio oficial", "For dedicated GPUs, FLR is required by this policy to reduce VM": "Para GPU dedicadas, esta política requiere FLR para reducir la VM", - "For example: pct enter 101": "Por ejemplo: pct introduzca 101", + "For example: pct enter 101": "Por ejemplo: pct enter 101", "For guest shares add: --options guest": "Para recursos compartidos de invitado añada: --options guest", "For security reasons, the system cannot format it.": "Por razones de seguridad, el sistema no puede formatearlo.", "For unprivileged containers, use instead:": "Para contenedores sin privilegios, utilice en su lugar:", @@ -5234,7 +5234,7 @@ "Replace": "Reemplazar", "Replace with the actual ID.": "Reemplace con el ID real.", "Replace with your actual container ID": "Reemplace con su ID de contenedor real", - "Replace with the value from step 4": "Reemplace con el valor del paso 4", + "Replace with the value from step 4": "Sustituye por el valor del paso 4", "Replace invalid port(s)": "Reemplazar puerto(s) no válido(s)", "Replace it?": "¿Reemplazarlo?", "Replace paths with your actual values from step 5": "Reemplace las rutas con sus valores reales del paso 5", @@ -7967,7 +7967,7 @@ "partition(s). Partition table preserved.": "partición(es). Se conserva la tabla de particiones.", "pasted Compose file": "archivo Compose pegado", "paths for next boot (/etc/pve, guests, drivers, ...)": "rutas para el próximo arranque (/etc/pve, VM y CT, controladores, ...)", - "pct exec authorization failed": "error en la autorización ejecutiva de PCT", + "pct exec authorization failed": "Ha fallado la autorización de pct exec", "pct push failed. Check log:": "pct push falló. Revise el log:", "pending (reboot required to enumerate full group)": "pendiente (es necesario reiniciar para enumerar el grupo completo)", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin se instala con conexiones de servidor arbitrarias habilitadas: la página de inicio de sesión tiene un campo Server donde se introduce la dirección del servidor MySQL o MariaDB, junto con su usuario y contraseña.", @@ -7991,8 +7991,8 @@ "pvesm command not found. This should not happen on Proxmox.": "Comando pvesm no encontrado. Esto no debería suceder en Proxmox.", "pvesm not available.": "pvesm no disponible.", "pvesm not found.": "pvesm no encontrado.", - "pvesm path failed, trying manual detection...": "La ruta pvesm falló, intentando la detección manual...", - "pvesm status failed": "el estado de pvesm falló", + "pvesm path failed, trying manual detection...": "Ha fallado pvesm path; intentando la detección manual...", + "pvesm status failed": "Ha fallado pvesm status", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad es un gestor de descargas libre y de código abierto escrito en Python, diseñado para ser muy ligero, fácil de ampliar y totalmente gestionable por web.", "pyLoad web interface": "Interfaz web de pyLoad", "qBittorrent WebUI password (user: admin)": "contraseña de qBittorrent WebUI (usuario: admin)", @@ -8052,7 +8052,7 @@ "smbclient command is not working properly.": "El comando smbclient no funciona correctamente.", "smbclient command not found after installation.": "El comando smbclient no se encuentra después de la instalación.", "sources.list update skipped (no change)": "Actualización de sources.list omitida (sin cambios)", - "sources.list updated to Trixie": "fuentes.lista actualizada a Trixie", + "sources.list updated to Trixie": "sources.list actualizado a Trixie", "ssh-keygen failed. Cannot create a new SSH key.": "ssh-keygen falló. No se puede crear una nueva clave SSH.", "stale entry/entries for interfaces no longer present": "entrada(s) obsoleta(s) de interfaces que ya no existen", "standard performance": "rendimiento estándar", diff --git a/lang/fr.json b/lang/fr.json index 4a83f430..d9509728 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -301,7 +301,7 @@ "Address of the database server (mysql and pgsql only)": "Adresse du serveur de base de données (mysql et pgsql uniquement)", "Address of the oci-compose file": "Adresse du fichier oci-compose", "Address to reach Pydio Cells (https://domain or https://IP:8080)": "Adresse pour atteindre Pydio Cells (https://domaine ou https://IP:8080)", - "Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Adresse utilisée pour atteindre wallabag (http://IP ou https://wallabag.exemple.com)", + "Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Adresse d’accès à wallabag (http://IP ou https://wallabag.example.com)", "Addresses to update: ipv4, ipv6 or both (uses an external service)": "Adresses à mettre à jour: ipv4, ipv6 ou les deux (utilise un service externe)", "Adguardhome Sync web interface": "Interface web Adguardhome Sync", "Adguardhome-sync is a tool to synchronize AdGuardHome config to replica instances.": "Adguardhome-sync est un outil pour synchroniser la configuration AdGuardHome pour reproduire des instances.", @@ -322,7 +322,7 @@ "After confirming, you will be asked to choose the NVIDIA driver version to install.": "Après confirmation, il vous sera demandé de choisir la version du pilote NVIDIA à installer.", "After detailed analysis, no changes are needed.": "Après une analyse détaillée, aucune modification n’est nécessaire.", "After detailed analysis, no cleanup is needed.": "Après une analyse détaillée, aucun nettoyage n’est nécessaire.", - "After logging in, run: ip a to obtain the IP address.\nThen, enter that IP address in your web browser like this:\n http://IP_ADDRESS\n\nThis will open the Umbral OS dashboard.": "Après vous être connecté, exécutez : ip a pour obtenir l'adresse IP.\nEnsuite, saisissez cette adresse IP dans votre navigateur Web comme ceci :\n http://ADRESSE_IP\n\nCela ouvrira le tableau de bord Umbral OS.", + "After logging in, run: ip a to obtain the IP address.\nThen, enter that IP address in your web browser like this:\n http://IP_ADDRESS\n\nThis will open the Umbral OS dashboard.": "Après la connexion, exécutez ip a pour obtenir l’adresse IP.\nSaisissez ensuite cette adresse dans votre navigateur sous cette forme :\n http://IP_ADDRESS\n\nLe tableau de bord Umbral OS s’ouvrira.", "After pasting on the server, ensure the file is chmod 600 and owned by": "Après avoir collé sur le serveur, assurez-vous que le fichier est chmod 600 et appartient à", "After reboot the system will be fully accessible (SSH, web UI, login), but the following components will be reinstalled in BACKGROUND — until they finish, commands like nvidia-smi may not yet be available:": "Après le redémarrage, le système sera entièrement accessible (SSH, interface utilisateur Web, connexion), mais les composants suivants seront réinstallés en ARRIÈRE-PLAN — jusqu'à ce qu'ils soient terminés, des commandes comme nvidia-smi peuvent ne pas encore être disponibles :", "After reboot, these components will reinstall in background:": "Après le redémarrage, ces composants seront réinstallés en arrière-plan :", @@ -1643,8 +1643,8 @@ "Default Proxmox logo applied": "Logo Proxmox par défaut appliqué", "Default is none (video-only passthrough). Use SPACE to toggle selections.": "La valeur par défaut est aucune (passthrough vidéo uniquement). Utilisez ESPACE pour basculer les sélections.", "Default journald configuration restored": "Configuration journald par défaut restaurée", - "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "L'emplacement par défaut est /mnt/. Le partage sera monté ici sur l'hôte avec des autorisations ouvertes afin qu'un LXC non privilégié puisse y effectuer un montage en liaison et y écrire. Pour l'accès LXC, montez en liaison ce chemin avec le gestionnaire de montage LXC.", - "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "L'emplacement par défaut est /mnt/. Le partage sera monté ici sur l'hôte. Utilisez ce chemin dans /etc/fstab. Pour l'accès LXC, montez en liaison ce chemin avec le gestionnaire de montage LXC.", + "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "L’emplacement par défaut est /mnt/. Le partage sera monté ici sur l’hôte avec des permissions ouvertes, afin qu’un LXC non privilégié puisse le monter par liaison et y écrire. Utilisez LXC Mount Manager pour créer ce montage dans le LXC.", + "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "L’emplacement par défaut est /mnt/. Le partage sera monté ici sur l’hôte. Utilisez ce chemin dans /etc/fstab. Pour y accéder depuis un LXC, créez un montage lié de ce chemin avec LXC Mount Manager.", "Default login": "Connexion par défaut", "Default options": "Options par défaut", "Default options read/write": "Options par défaut lecture/écriture", @@ -1920,7 +1920,7 @@ "Dry run completed; the container and the mounts were not changed.": "Le parcours à sec est terminé; le conteneur et les supports n'ont pas été changés.", "DuckDNS subdomain without .duckdns.org (comma separated for several)": "DuckDNS sous-domaine sans .duckdns.org (comma séparé pour plusieurs)", "DuckDNS token from your account at duckdns.org": "Jeton DuckDNS de votre compte sur duckdns.org", - "DuckDNS updates the subdomain every 5 minutes. Without UPDATE_IP, DuckDNS itself detects the public IPv4 address of the request.": "DuckDNS met à jour le sous-domaine toutes les 5 minutes. Sans mise à jour, DuckDNS détecte lui-même l'adresse IPv4 publique de la requête.", + "DuckDNS updates the subdomain every 5 minutes. Without UPDATE_IP, DuckDNS itself detects the public IPv4 address of the request.": "DuckDNS met à jour le sous-domaine toutes les 5 minutes. Sans UPDATE_IP, DuckDNS détecte lui-même l’adresse IPv4 publique de la requête.", "DuckStation is a PS1 Emulator aiming for the best accuracy and game support.": "DuckStation est un émulateur PS1 visant le meilleur accuracy et le meilleur support de jeu.", "Duckdns is a free service which will point a DNS (sub domains of duckdns.org) to an IP of your choice. The service is completely free, and doesn't require reactivation or forum posts to maintain its existence.": "Duckdns est un service gratuit qui dirigera un DNS (sous-domaines de duckdns.org) vers une IP de votre choix. Le service est entièrement gratuit, et ne require réactivation ou forum posts pour maintenir son existence.", "Dumping AMD GPU ROM BIOS via sysfs...": "Vidage du BIOS ROM GPU AMD via sysfs...", @@ -2179,11 +2179,11 @@ "Example: cp /etc/pve/lxc/114.conf /etc/pve/lxc/114.conf.bak": "Exemple : cp /etc/pve/lxc/114.conf /etc/pve/lxc/114.conf.bak", "Example: daily or Mon..Fri 03:00": "Exemple : tous les jours ou du lundi au vendredi à 03h00", "Example: mkdir -p /tmp/lxc_convert_114": "Exemple : mkdir -p /tmp/lxc_convert_114", - "Example: pct config 110 | grep unprivileged": "Exemple : configuration PCT 110 | grep sans privilège", - "Example: pct stop 110": "Exemple : PCT stop 110", - "Example: pct stop 114": "Exemple : PCT arrêt 114", + "Example: pct config 110 | grep unprivileged": "Exemple : pct config 110 | grep unprivileged", + "Example: pct stop 110": "Exemple : pct stop 110", + "Example: pct stop 114": "Exemple : pct stop 114", "Example: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup": "Exemple : pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup", - "Example: pvesm path local-lvm:vm-114-disk-0": "Exemple : chemin pvesm local-lvm:vm-114-disk-0", + "Example: pvesm path local-lvm:vm-114-disk-0": "Exemple : pvesm path local-lvm:vm-114-disk-0", "Example: sed -i '/^unprivileged: 1/d' /etc/pve/lxc/110.conf": "Exemple : sed -i '/^unprivileged : 1/d' /etc/pve/lxc/110.conf", "Examples:": "Exemples :", "Execute destructive rollback?": "Exécuter une restauration destructrice ?", @@ -2495,7 +2495,7 @@ "For a consistent export, the VM should be stopped.": "Pour une exportation cohérente, la VM doit être arrêtée.", "For any question, issue or bug report, please use the official repository": "Pour toute question, problème ou rapport de bug, veuillez utiliser le référentiel officiel", "For dedicated GPUs, FLR is required by this policy to reduce VM": "Pour les GPU dédiés, FLR est requis par cette stratégie pour réduire les VM", - "For example: pct enter 101": "Par exemple : PCT, entrez 101", + "For example: pct enter 101": "Par exemple : pct enter 101", "For guest shares add: --options guest": "Pour les partages invités, ajoutez : --options invité", "For security reasons, the system cannot format it.": "Pour des raisons de sécurité, le système ne peut pas le formater.", "For unprivileged containers, use instead:": "Pour les conteneurs non privilégiés, utilisez plutôt :", @@ -2907,8 +2907,8 @@ "If notifications are enabled (Telegram/Discord/ntfy/...), you will receive a \"Host restore finished\" message when all background tasks complete.": "Si les notifications sont activées (Telegram/Discord/ntfy/...), vous recevrez un message « Restauration de l'hôte terminée » lorsque toutes les tâches en arrière-plan seront terminées.", "If passthrough fails on Windows: install RadeonResetBugFix.": "Si le relais échoue sous Windows : installez RadeonResetBugFix.", "If path not accessible (ZFS/BTRFS):": "Si chemin non accessible (ZFS/BTRFS) :", - "If pvesm path returned a DEVICE (LVM):": "Si le chemin pvesm a renvoyé un DEVICE (LVM) :", - "If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Si le chemin pvesm renvoie un RÉPERTOIRE (ZFS/BTRFS) :", + "If pvesm path returned a DEVICE (LVM):": "Si pvesm path a renvoyé un PÉRIPHÉRIQUE (LVM) :", + "If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Si pvesm path a renvoyé un RÉPERTOIRE (ZFS/BTRFS) :", "If repositories error:": "Si erreur de référentiels :", "If the container had already been changed, its previous native backup is restored. Shared host directories are not reverted. The disks of the failed attempt are removed when the cleanup succeeds.": "Si le conteneur a déjà été modifié, sa sauvegarde native précédente est restaurée. Les répertoires hôtes partagés ne sont pas rétablis. Les disques de la tentative ayant échoué sont supprimés une fois le nettoyage réussi.", "If the host freezes, remove hostpci entries from": "Si l'hôte se bloque, supprimez les entrées hostpci de", @@ -3048,7 +3048,7 @@ "Initiator IQN is authorised on the target": "L'IQN initiateur est autorisé sur la cible", "Initiator IQN:": "IQN initiateur :", "Inkscape is professional quality vector graphics software which runs on Linux, Mac OS X and Windows desktop computers.": "Inkscape est un logiciel graphique vectoriel de qualité professionnelle qui fonctionne sur les ordinateurs de bureau Linux, Mac OS X et Windows.", - "Inside the LXC, create the administrator: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN": "À l'intérieur du LXC, créez l'administrateur: console kimai:utilisateur:créez VOTRE USERNAME VOTRE ROLE_SUPER_ADMIN", + "Inside the LXC, create the administrator: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN": "Dans le LXC, créez l’administrateur : console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN", "Inspect disks before any action": "Inspecter les disques avant toute action", "Inspect host device nodes": "Inspecter les nœuds du périphérique hôte", "Inspect passthrough/kernel events": "Inspecter les événements de relais/noyau", @@ -3225,7 +3225,7 @@ "Interrupted operation:": "Interruption du opera:", "Interrupted stack operation found": "Pile interrompue operation trouvée", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Candidat 'proxmox-ve' invalide (pas 9.x ou aucun). Veuillez vérifier la configuration et le réseau de votre référentiel, puis réessayez.", - "Invalid ALLOWED_HOSTS value": "Valeur HÔTES INDÉSIRABLES", + "Invalid ALLOWED_HOSTS value": "Valeur ALLOWED_HOSTS invalide", "Invalid Home Assistant OS check timeout": "Non valide Home Assistant OS check timeout", "Invalid ID": "Pièce d'identité invalide", "Invalid IPv4 address": "Adresse IPv4 non valide", @@ -3460,7 +3460,7 @@ "Keyfile removed.": "fichier clé supprimé.", "Keyrings method failed; trying apt-key fallback": "La méthode des porte-clés a échoué ; essayer la solution de secours apt-key", "KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad - Une plateforme croisée et une suite d'automatisation de conception électronique ouverte.", - "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai n'a pas de compte par défaut. Saisissez le conteneur avec : pct entre {main vmid}", + "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai n’a pas de compte par défaut. Ouvrez un shell dans le conteneur avec : pct enter {main_vmid}", "Kimai is a professional grade time-tracking application, free and open-source.": "Kimai est une application professionnelle de suivi du temps, libre et open-source.", "Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa est un outil puissant conçu pour vous donner un contrôle complet sur vos bibliothèques multimédias. Avec Kometa, vous pouvez porter votre personnalisation au niveau suivant, avec un contrôle granulaire sur les métadonnées, les collections, les superpositions et bien plus encore.", "Kometa reads its configuration from /config/config.yml and the container only ships /config/config.yml.template. Copy the template to config.yml, fill in the required Plex and TMDb connections, then restart the container.": "Kometa lit sa configuration à partir de /config/config.yml et le conteneur ne livre que /config/config.yml.template. Copiez le modèle pour config.yml, remplissez les connexions required Plex et TMDb, puis redémarrez le conteneur.", @@ -3512,7 +3512,7 @@ "Leave empty to keep every backup (not recommended).": "Laissez vide pour conserver chaque sauvegarde (non recommandé).", "Leave empty to use the retention of the storage.": "Laisser vide pour utiliser la rétention du stockage.", "Legacy PVE 8 .list files commented or not present": "Fichiers .list hérités PVE 8 commentés ou non présents", - "Legacy ceph.list commented or not present": "Ceph.list hérité commenté ou non présent", + "Legacy ceph.list commented or not present": "Ancien fichier ceph.list commenté ou absent", "Legacy gasket-dkms cleanup could not be verified as complete.": "Impossible de confirmer que le nettoyage de l'ancien paquet gasket-dkms est terminé.", "Legacy gasket-dkms detected": "Ancien paquet gasket-dkms détecté", "Legacy network tools (e.g., ifconfig)": "Outils réseau hérités (par exemple, ifconfig)", @@ -4263,7 +4263,7 @@ "No jobs": "Aucun emploi", "No language selected.": "Aucune langue sélectionnée.", "No local disk storage configured.": "Aucun stockage sur disque local configuré.", - "No main sources.list present (skipped)": "Aucune liste de sources principale présente (ignorée)", + "No main sources.list present (skipped)": "Aucun fichier sources.list principal présent (ignoré)", "No matches for:": "Aucune correspondance pour :", "No matching PVE vzdump jobs were found for the PBS backend.": "Aucune tâche vzdump PVE correspondante n'a été trouvée pour le backend PBS.", "No matching PVE vzdump jobs were found for the local archive backend.": "Aucune tâche vzdump PVE correspondante n'a été trouvée pour le backend d'archive local.", @@ -6992,7 +6992,7 @@ "Transaction log:": "Registre des transactions & #160;:", "Translation files:": "Fichiers de traduction :", "Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, µTP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more.": "Transmission est conçu pour une utilisation facile et puissante. Transmission possède les fonctionnalités que vous souhaitez d'un client BitTorrent : cryptage, interface web, échange entre pairs, liens magnétiques, DHT, μTP, UPnP et le transfert de port NAT-PMP, support de webseed, répertoires de veille, édition de tracker, limites de vitesse globales et per-torrent, et plus encore.", - "Tried pvesm path and manual detection methods": "Chemin pvesm essayé et méthodes de détection manuelle", + "Tried pvesm path and manual detection methods": "pvesm path et les méthodes de détection manuelle ont été essayés", "Trust this certificate and save it for scheduled backups?": "Faire confiance à ce certificat et l'enregistrer pour les sauvegardes planifiées ?", "Try Again": "Essayer à nouveau", "Try a different search term.": "Essayez un autre terme de recherche.", @@ -7248,7 +7248,7 @@ "Usage:": "Utilisation :", "Use \"Check test progress\" to see results.": "Utilisez « Vérifier la progression du test » pour voir les résultats.", "Use 'Export to file' to save it and inspect manually.": "Utilisez « Exporter vers un fichier » pour l'enregistrer et l'inspecter manuellement.", - "Use 'pct restore' / 'qmrestore' to recover their disks from your VM backups.": "Utilisez « PCT Restore » / « qmrestore » pour récupérer leurs disques à partir des sauvegardes de votre VM.", + "Use 'pct restore' / 'qmrestore' to recover their disks from your VM backups.": "Utilisez 'pct restore' / 'qmrestore' pour récupérer leurs disques depuis les sauvegardes des VM.", "Use Custom backup and uncheck the conflicting path from the list": "Utilisez la sauvegarde personnalisée et décochez le chemin en conflit dans la liste", "Use Default Settings?": "Utiliser les paramètres par défaut ?", "Use Download first if you want to save a copy of the current key. Continue?": "utilisez d'abord Télécharger si vous souhaitez enregistrer une copie de la clé actuelle. Continuer?", @@ -7993,8 +7993,8 @@ "partition(s). Partition table preserved.": "partition(s). Table de partition conservée.", "pasted Compose file": "fichier Compose collé", "paths for next boot (/etc/pve, guests, drivers, ...)": "chemins pour le prochain démarrage (/etc/pve, invités, pilotes, ...)", - "pct exec authorization failed": "échec de l'autorisation d'exécution PCT", - "pct push failed. Check log:": "La poussée PCT a échoué. Journal de vérification :", + "pct exec authorization failed": "Échec de l’autorisation pour pct exec", + "pct push failed. Check log:": "Échec de pct push. Consultez le journal :", "pending (reboot required to enumerate full group)": "en attente (redémarrage requis pour énumérer le groupe complet)", "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.": "phpMyAdmin est installé avec des connexions de serveur arbitraires activées : la page de connexion a un champ Serveur où l'adresse du serveur MySQL ou MariaDB est saisie, ainsi que son utilisateur et son mot de passe.", "pigz configuration completed": "configuration pigz terminée", @@ -8017,8 +8017,8 @@ "pvesm command not found. This should not happen on Proxmox.": "Commande pvesm introuvable. Cela ne devrait pas arriver sur Proxmox.", "pvesm not available.": "pvesm non disponible.", "pvesm not found.": "pvesm introuvable.", - "pvesm path failed, trying manual detection...": "Échec du chemin pvesm, tentative de détection manuelle...", - "pvesm status failed": "le statut pvesm a échoué", + "pvesm path failed, trying manual detection...": "Échec de pvesm path, tentative de détection manuelle...", + "pvesm status failed": "Échec de pvesm status", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad est un gestionnaire de téléchargement gratuit et Open Source écrit en Python et conçu pour être extrêmement léger, facilement extensible et entièrement gérable via le web.", "pyLoad web interface": "PyLoad interface web", "qBittorrent WebUI password (user: admin)": "qBittorrent Mot de passe WebUI (utilisateur: admin)", @@ -8097,7 +8097,7 @@ "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh n'a pas été trouvé.", "sysfs ROM dump failed — trying ACPI VFCT table...": "Échec du vidage de la ROM sysfs - tentative de la table ACPI VFCT...", "syslog-ng allows you to flexibly collect, parse, classify, rewrite and correlate logs from across your infrastructure and store or route them to log analysis tools.": "syslog-ng vous permet de collecter, d'analyser, de classer, de réécrire et de corréler les logs de toute votre infrastructure et de les stocker ou de les acheminer vers des outils d'analyse de log.", - "systemctl restart networking failed:": "échec du redémarrage du réseau systemctl :", + "systemctl restart networking failed:": "Échec de systemctl restart networking :", "systemd OnCalendar expression": "expression systemd OnCalendar", "the API key was not generated on the first start": "la clé API n'a pas été générée au premier démarrage", "the NVIDIA hook of the container is not available:": "le hook NVIDIA du conteneur n'est pas disponible :", @@ -8151,7 +8151,7 @@ "video + recognition": "vidéo + reconnaissance", "video only": "vidéo uniquement", "vzdump backup speed optimization completed": "Optimisation de la vitesse de sauvegarde de vzdump terminée", - "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again.": "wallabag construit ses liens à partir de l'adresse donnée pendant l'installation. S'il ne correspond pas à l'adresse du conteneur, modifier lxc.environnement. temps d'exécution: SYMFONY ENV DOMAIN NAME dans /etc/pve/lxc/.conf avec le conteneur arrêté, et recommencer.", + "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again.": "wallabag construit ses liens avec l’adresse indiquée à l’installation. Si elle ne correspond pas à celle du conteneur, arrêtez-le, modifiez lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME dans /etc/pve/lxc/.conf, puis redémarrez-le.", "wallabag listens on port 80 of the container and stores its data in SQLite.": "wallabag écoute sur le port 80 du conteneur et stocke ses données dans SQLite.", "wallabag web interface": "Interface web wallabag", "was": "était", diff --git a/lang/pt.json b/lang/pt.json index 41fb2fd7..ade30ee9 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -138,7 +138,7 @@ "ALL DATA ON": "TODOS OS DADOS EM", "ALL DATA ON THIS DISK WILL BE PERMANENTLY LOST!": "TODOS OS DADOS NESTE DISCO SERÃO PERMANENTEMENTE PERDIDOS!", "ALL Utilities": "TODOS os utilitários", - "ALLOWED_HOSTS cannot contain line breaks": "Allowed hosts não pode conter quebras de linha", + "ALLOWED_HOSTS cannot contain line breaks": "ALLOWED_HOSTS não pode conter quebras de linha", "AList initial login": "Login inicial do AList", "AMD (ROCm)": "AMD (ROCm)", "AMD (VA-API and ROCm detection)": "AMD (detecção VA-API e ROCm)", @@ -1643,8 +1643,8 @@ "Default Proxmox logo applied": "Logotipo padrão do Proxmox aplicado", "Default is none (video-only passthrough). Use SPACE to toggle selections.": "O padrão é nenhum (passagem somente de vídeo). Use ESPAÇO para alternar as seleções.", "Default journald configuration restored": "Configuração padrão do diário restaurada", - "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "O local padrão é /mnt/. O compartilhamento será montado aqui no host com permissões abertas para que um LXC sem privilégios possa montar e gravar nele. Para acesso LXC, monte este caminho com o LXC Mount Manager.", - "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "O local padrão é /mnt/. O compartilhamento será montado aqui no host. Use este caminho em /etc/fstab. Para acesso LXC, monte este caminho com o LXC Mount Manager.", + "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "A localização predefinida é /mnt/. A partilha será montada aqui no host com permissões abertas, para que um LXC sem privilégios a possa montar por bind mount e nela escrever. Utilize o LXC Mount Manager para criar essa montagem no LXC.", + "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "A localização predefinida é /mnt/. A partilha será montada aqui no host. Utilize este caminho em /etc/fstab. Para aceder a partir de um LXC, crie um bind mount deste caminho com o LXC Mount Manager.", "Default login": "Utilizador por omissão", "Default options": "Opções padrão", "Default options read/write": "Opções padrão leitura/gravação", @@ -2035,7 +2035,7 @@ "Enter VM ID:": "Insira o ID da VM:", "Enter VM/CT ID:": "Insira o ID da VM/CT:", "Enter ZFS pool name for the selected disk:": "Insira o nome do pool ZFS para o disco selecionado:", - "Enter a name for the mount point (used as /mnt/):": "Insira um nome para o ponto de montagem (usado como /mnt/):", + "Enter a name for the mount point (used as /mnt/):": "Introduza um nome para o ponto de montagem (será usado como /mnt/):", "Enter a name for the new virtual machine:": "Insira um nome para a nova máquina virtual:", "Enter a non-empty password or access token on a single line.": "Insira uma senha ou token de acesso não vazio em uma única linha.", "Enter a number, or write or paste a command:": "Digite um número ou escreva ou cole um comando:", @@ -2179,11 +2179,11 @@ "Example: cp /etc/pve/lxc/114.conf /etc/pve/lxc/114.conf.bak": "Exemplo: cp /etc/pve/lxc/114.conf /etc/pve/lxc/114.conf.bak", "Example: daily or Mon..Fri 03:00": "Exemplo: diariamente ou Seg..Sex 03:00", "Example: mkdir -p /tmp/lxc_convert_114": "Exemplo: mkdir -p /tmp/lxc_convert_114", - "Example: pct config 110 | grep unprivileged": "Exemplo: configuração pct 110 | grep sem privilégios", + "Example: pct config 110 | grep unprivileged": "Exemplo: pct config 110 | grep unprivileged", "Example: pct stop 110": "Exemplo: pct stop 110", - "Example: pct stop 114": "Exemplo: parada pct 114", + "Example: pct stop 114": "Exemplo: pct stop 114", "Example: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup": "Exemplo: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup", - "Example: pvesm path local-lvm:vm-114-disk-0": "Exemplo: caminho pvesm local-lvm:vm-114-disk-0", + "Example: pvesm path local-lvm:vm-114-disk-0": "Exemplo: pvesm path local-lvm:vm-114-disk-0", "Example: sed -i '/^unprivileged: 1/d' /etc/pve/lxc/110.conf": "Exemplo: sed -i '/^unprivileged: 1/d' /etc/pve/lxc/110.conf", "Examples:": "Exemplos:", "Execute destructive rollback?": "Executar reversão destrutiva?", @@ -2495,7 +2495,7 @@ "For a consistent export, the VM should be stopped.": "Para uma exportação consistente, a VM deve ser interrompida.", "For any question, issue or bug report, please use the official repository": "Para qualquer dúvida, problema ou relatório de bug, use o repositório oficial", "For dedicated GPUs, FLR is required by this policy to reduce VM": "Para GPUs dedicadas, o FLR é exigido por esta política para reduzir VM", - "For example: pct enter 101": "Por exemplo: pct digite 101", + "For example: pct enter 101": "Por exemplo: pct enter 101", "For guest shares add: --options guest": "Para compartilhamentos de convidados, adicione: --options guest", "For security reasons, the system cannot format it.": "Por motivos de segurança, o sistema não pode formatá-lo.", "For unprivileged containers, use instead:": "Para contêineres sem privilégios, use:", @@ -2907,8 +2907,8 @@ "If notifications are enabled (Telegram/Discord/ntfy/...), you will receive a \"Host restore finished\" message when all background tasks complete.": "Se as notificações estiverem habilitadas (Telegram/Discord/ntfy/...), você receberá uma mensagem \"Restauração do host concluída\" quando todas as tarefas em segundo plano forem concluídas.", "If passthrough fails on Windows: install RadeonResetBugFix.": "Se a passagem falhar no Windows: instale RadeonResetBugFix.", "If path not accessible (ZFS/BTRFS):": "Se o caminho não estiver acessível (ZFS/BTRFS):", - "If pvesm path returned a DEVICE (LVM):": "Se o caminho pvesm retornou um DEVICE (LVM):", - "If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Se o caminho pvesm retornou um DIRETÓRIO (ZFS/BTRFS):", + "If pvesm path returned a DEVICE (LVM):": "Se pvesm path devolveu um DISPOSITIVO (LVM):", + "If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Se pvesm path devolveu um DIRETÓRIO (ZFS/BTRFS):", "If repositories error:": "Se houver erro nos repositórios:", "If the container had already been changed, its previous native backup is restored. Shared host directories are not reverted. The disks of the failed attempt are removed when the cleanup succeeds.": "Se o contêiner já tiver sido alterado, seu backup nativo anterior será restaurado. Os diretórios de host compartilhados não são revertidos. Os discos da tentativa fracassada serão removidos quando a limpeza for bem-sucedida.", "If the host freezes, remove hostpci entries from": "Se o host congelar, remova as entradas hostpci de", @@ -3048,7 +3048,7 @@ "Initiator IQN is authorised on the target": "O iniciador IQN está autorizado no alvo", "Initiator IQN:": "IQN do iniciador:", "Inkscape is professional quality vector graphics software which runs on Linux, Mac OS X and Windows desktop computers.": "Inkscape é um software gráfico vetorial de qualidade profissional que funciona em computadores desktop Linux, Mac OS X e Windows.", - "Inside the LXC, create the administrator: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN": "Dentro do LXC, crie o administrador: console kimai:user:create Your USERNAME Your EMAIL ROLE_SUPER_ADMIN", + "Inside the LXC, create the administrator: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN": "Dentro do LXC, crie o administrador: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN", "Inspect disks before any action": "Inspecione os discos antes de qualquer ação", "Inspect host device nodes": "Inspecione os nós do dispositivo host", "Inspect passthrough/kernel events": "Inspecionar eventos de passagem/kernel", @@ -3225,7 +3225,7 @@ "Interrupted operation:": "operation interrompida:", "Interrupted stack operation found": "Pilha interrompida operation encontrada", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Candidato 'proxmox-ve' inválido (não 9.x ou nenhum). Verifique a configuração e a rede do seu repositório e tente novamente.", - "Invalid ALLOWED_HOSTS value": "Valor Allowed hosts inválido", + "Invalid ALLOWED_HOSTS value": "Valor de ALLOWED_HOSTS inválido", "Invalid Home Assistant OS check timeout": "Tempo de verificação do sistema operacional Home Assistant inválido", "Invalid ID": "ID inválido", "Invalid IPv4 address": "Endereço IPv4 inválido", @@ -3460,7 +3460,7 @@ "Keyfile removed.": "arquivo-chave removido.", "Keyrings method failed; trying apt-key fallback": "O método dos chaveiros falhou; tentando substituto do apt-key", "KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad - Uma plataforma cruzada e Open Source Electronics Design Automation Suite.", - "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai não tem conta padrão. Digite o recipiente com: pct enter {main vmid}", + "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "O Kimai não tem uma conta predefinida. Aceda ao contentor com: pct enter {main_vmid}", "Kimai is a professional grade time-tracking application, free and open-source.": "Kimai é um aplicativo de rastreamento de tempo profissional, gratuito e de código aberto.", "Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa é uma ferramenta poderosa projetada para lhe dar controle completo sobre suas bibliotecas de mídia. Com o Kometa, você pode levar sua personalização para o próximo nível, com controle granular sobre metadados, coleções, sobreposições e muito mais.", "Kometa reads its configuration from /config/config.yml and the container only ships /config/config.yml.template. Copy the template to config.yml, fill in the required Plex and TMDb connections, then restart the container.": "Kometa lê a sua configuração a partir de /config/config.yml e o recipiente apenas navios /config/config.yml.template. Copie o modelo para config.yml, preencha o requi vermelho Plex e conexões TMDb, em seguida, reinicie o recipiente.", @@ -3512,7 +3512,7 @@ "Leave empty to keep every backup (not recommended).": "Deixe em branco para manter todos os backups (não recomendado).", "Leave empty to use the retention of the storage.": "Deixe em branco para usar a retenção do armazenamento.", "Legacy PVE 8 .list files commented or not present": "Arquivos .list PVE 8 legados comentados ou não presentes", - "Legacy ceph.list commented or not present": "Ceph.list legado comentado ou não presente", + "Legacy ceph.list commented or not present": "ceph.list antigo comentado ou inexistente", "Legacy gasket-dkms cleanup could not be verified as complete.": "Não foi possível confirmar a conclusão da limpeza do pacote gasket-dkms legado.", "Legacy gasket-dkms detected": "gasket-dkms legado detetado", "Legacy network tools (e.g., ifconfig)": "Ferramentas de rede legadas (por exemplo, ifconfig)", @@ -4263,7 +4263,7 @@ "No jobs": "Sem empregos", "No language selected.": "Nenhum idioma selecionado.", "No local disk storage configured.": "Nenhum armazenamento em disco local configurado.", - "No main sources.list present (skipped)": "Nenhuma fonte principal.list presente (ignorada)", + "No main sources.list present (skipped)": "Não existe um sources.list principal (ignorado)", "No matches for:": "Nenhuma correspondência para:", "No matching PVE vzdump jobs were found for the PBS backend.": "Nenhum trabalho PVE vzdump correspondente foi encontrado para o backend do PBS.", "No matching PVE vzdump jobs were found for the local archive backend.": "Nenhum trabalho PVE vzdump correspondente foi encontrado para o back-end do arquivo local.", @@ -6993,7 +6993,7 @@ "Transaction log:": "Registo de transacções:", "Translation files:": "Arquivos de tradução:", "Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, µTP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more.": "Transmission é projetado para uso fácil e poderoso. Transmission tem os recursos que você deseja de um cliente BitTorrent: criptografia, uma interface web, troca de pares, links magnéticos, DHT, μTP, encaminhamento de portas UPnP e NAT-PMP, suporte a webseed, diretórios de relógio, edição de rastreadores, limites de velocidade globais e per-torrent, e muito mais.", - "Tried pvesm path and manual detection methods": "Tentei caminho pvesm e métodos de detecção manual", + "Tried pvesm path and manual detection methods": "Foram tentados pvesm path e os métodos de deteção manual", "Trust this certificate and save it for scheduled backups?": "Confiar neste certificado e salvá-lo para backups agendados?", "Try Again": "Tente novamente", "Try a different search term.": "Experimente um termo de pesquisa diferente.", @@ -7213,7 +7213,7 @@ "Updates file is empty or unreadable.": "O arquivo de atualizações está vazio ou ilegível.", "Updating": "Actualização", "Updating APT package lists...": "Atualizando listas de pacotes APT...", - "Updating Debian Bookworm → Trixie in sources.list...": "Atualizando Debian Bookworm → Trixie em fontes.list...", + "Updating Debian Bookworm → Trixie in sources.list...": "A atualizar Debian Bookworm → Trixie em sources.list...", "Updating Figurine binary...": "Atualizando o binário da estatueta...", "Updating Lynis to the latest version...": "Atualizando Lynis para a versão mais recente...", "Updating PVE application manager...": "Atualizando o gerenciador de aplicativos PVE...", @@ -8018,8 +8018,8 @@ "pvesm command not found. This should not happen on Proxmox.": "Comando pvesm não encontrado. Isso não deveria acontecer no Proxmox.", "pvesm not available.": "pvesm não disponível.", "pvesm not found.": "pvesm não encontrado.", - "pvesm path failed, trying manual detection...": "caminho pvesm falhou, tentando detecção manual...", - "pvesm status failed": "status pvesm falhou", + "pvesm path failed, trying manual detection...": "O pvesm path falhou; a tentar a deteção manual...", + "pvesm status failed": "O pvesm status falhou", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad é um gerenciador de download livre e Open Source escrito em Python e projetado para ser extremamente leve, facilmente extensível e totalmente gerenciável via web.", "pyLoad web interface": "interface web pyLoad", "qBittorrent WebUI password (user: admin)": "Senha do WebUI do qBittorrent (utilizador: administrador)", @@ -8079,7 +8079,7 @@ "smbclient command is not working properly.": "O comando smbclient não está funcionando corretamente.", "smbclient command not found after installation.": "Comando smbclient não encontrado após a instalação.", "sources.list update skipped (no change)": "Atualização de sources.list ignorada (sem alteração)", - "sources.list updated to Trixie": "fontes.list atualizado para Trixie", + "sources.list updated to Trixie": "sources.list atualizado para Trixie", "ssh-keygen failed. Cannot create a new SSH key.": "ssh-keygen falhou. Não é possível criar uma nova chave SSH.", "stale entry/entries for interfaces no longer present": "entradas/entradas obsoletas para interfaces não estão mais presentes", "standard performance": "desempenho padrão", @@ -8098,7 +8098,7 @@ "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh não foi encontrado.", "sysfs ROM dump failed — trying ACPI VFCT table...": "Falha no despejo de ROM do sysfs - tentando tabela ACPI VFCT...", "syslog-ng allows you to flexibly collect, parse, classify, rewrite and correlate logs from across your infrastructure and store or route them to log analysis tools.": "o syslog-ng permite coletar, analisar, classificar, reescrever e correlacionar logs de toda sua infraestrutura e armazená-los ou roteá-los para ferramentas de análise de log.", - "systemctl restart networking failed:": "falha na reinicialização da rede do systemctl:", + "systemctl restart networking failed:": "O systemctl restart networking falhou:", "systemd OnCalendar expression": "Expressão Systemd OnCalendar", "the API key was not generated on the first start": "a tecla API não foi gerada no primeiro início", "the NVIDIA hook of the container is not available:": "o hook NVIDIA do contêiner não está disponível:", @@ -8152,7 +8152,7 @@ "video + recognition": "vídeo + reconhecimento", "video only": "apenas vídeo", "vzdump backup speed optimization completed": "otimização da velocidade de backup do vzdump concluída", - "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again.": "wallabag constrói seus links a partir do endereço fornecido durante a instalação. Se não corresponder ao endereço do recipiente, edite lxc.environment. tempo de execução: SYMFONY ENV DOMAIN NAME em /etc/pve/lxc/.conf com o recipiente parado, e inicie-o novamente.", + "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again.": "O wallabag gera as ligações com o endereço indicado na instalação. Se não corresponder ao do contentor, pare-o, edite lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME em /etc/pve/lxc/.conf e volte a iniciá-lo.", "wallabag listens on port 80 of the container and stores its data in SQLite.": "wallabag escuta na porta 80 do recipiente e armazena seus dados em SQLite.", "wallabag web interface": "Interface Web wallabag", "was": "era", diff --git a/lang/sk.json b/lang/sk.json index 63a88682..becda058 100644 --- a/lang/sk.json +++ b/lang/sk.json @@ -138,7 +138,7 @@ "ALL DATA ON": "VŠETKY DÁTA NA", "ALL DATA ON THIS DISK WILL BE PERMANENTLY LOST!": "VŠETKY DÁTA NA TOMTO DISKU BUDÚ NATRVALO STRATENÉ!", "ALL Utilities": "VŠETKY nástroje", - "ALLOWED_HOSTS cannot contain line breaks": "UDELENÉ HOSTS nemôžu obsahovať prestávky na čiare", + "ALLOWED_HOSTS cannot contain line breaks": "ALLOWED_HOSTS nesmie obsahovať zalomenia riadkov", "AList initial login": "AList začiatočné prihlásenie", "AMD (ROCm)": "AMD (ROCm)", "AMD (VA-API and ROCm detection)": "AMD (detekcia VA-API a ROCm)", @@ -322,7 +322,7 @@ "After confirming, you will be asked to choose the NVIDIA driver version to install.": "Po potvrdení si vyberiete verziu ovládača NVIDIA, ktorú chcete nainštalovať.", "After detailed analysis, no changes are needed.": "Po podrobnej analýze nie sú potrebné žiadne zmeny.", "After detailed analysis, no cleanup is needed.": "Po podrobnej analýze nie je potrebné žiadne čistenie.", - "After logging in, run: ip a to obtain the IP address.\nThen, enter that IP address in your web browser like this:\n http://IP_ADDRESS\n\nThis will open the Umbral OS dashboard.": "Po prihlásení spustite príkaz: ip a, aby ste zistili IP adresu.\nPotom túto IP adresu zadajte do prehliadača takto:\n http://IP_ADRESA\n\nOtvorí sa tým webové rozhranie Umbral OS.", + "After logging in, run: ip a to obtain the IP address.\nThen, enter that IP address in your web browser like this:\n http://IP_ADDRESS\n\nThis will open the Umbral OS dashboard.": "Po prihlásení zistite IP adresu príkazom ip a.\nPotom ju zadajte do prehliadača v tomto tvare:\n http://IP_ADDRESS\n\nOtvorí sa panel Umbral OS.", "After pasting on the server, ensure the file is chmod 600 and owned by": "Po vložení na serveri overte, že súbor má chmod 600 a vlastní ho", "After reboot the system will be fully accessible (SSH, web UI, login), but the following components will be reinstalled in BACKGROUND — until they finish, commands like nvidia-smi may not yet be available:": "Po reštarte bude systém plne dostupný (SSH, webové rozhranie, prihlásenie), ale tieto súčasti sa budú doinštalovávať NA POZADÍ - kým neskončia, príkazy ako nvidia-smi ešte nemusia byť dostupné:", "After reboot, these components will reinstall in background:": "Po reštarte sa tieto súčasti doinštalujú na pozadí:", @@ -3048,7 +3048,7 @@ "Initiator IQN is authorised on the target": "IQN iniciátora je na targete povolené", "Initiator IQN:": "IQN iniciátora:", "Inkscape is professional quality vector graphics software which runs on Linux, Mac OS X and Windows desktop computers.": "Inkscape je profesionálne kvalitný vektorový grafický softvér, ktorý beží na počítačoch Linux, Mac OS X a Windows.", - "Inside the LXC, create the administrator: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN": "Vnútri LXC, vytvoriť administrátor: konzola kimai:používateľ:vytvorte VAŠE VYUŽITE VAŠE EMAIL ROLE_SUPER_ADMIN", + "Inside the LXC, create the administrator: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN": "V LXC vytvorte správcu príkazom: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN", "Inspect disks before any action": "Skontrolovať disky pred akoukoľvek akciou", "Inspect host device nodes": "Skontrolovať device nodes na hostovi", "Inspect passthrough/kernel events": "Skontrolovať passthrough/kernel udalosti", @@ -3225,7 +3225,7 @@ "Interrupted operation:": "Prerušená operation:", "Interrupted stack operation found": "Prerušený zásobník operation nájdený", "Invalid 'proxmox-ve' candidate (not 9.x or none). Please verify your repository configuration and network, then retry.": "Neplatný kandidát 'proxmox-ve' (nie je 9.x alebo chýba). Skontrolujte nastavenie repozitárov a sieť, potom skúste znova.", - "Invalid ALLOWED_HOSTS value": "Neplatná hodnota UDELENÁ HOSTS", + "Invalid ALLOWED_HOSTS value": "Neplatná hodnota ALLOWED_HOSTS", "Invalid Home Assistant OS check timeout": "Neplatný čas odhlásenia Home Assistant OS", "Invalid ID": "Neplatné ID", "Invalid IPv4 address": "Neplatná adresa IPv4", @@ -3460,7 +3460,7 @@ "Keyfile removed.": "Keyfile odstránený.", "Keyrings method failed; trying apt-key fallback": "Metóda keyrings zlyhala; skúšam náhradný apt-key postup", "KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad - Cross Platform a Open Source Electronics Design Automation Suite.", - "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai nemá predvolený účet. Zadajte kontajner s: pct zadajte {main vmid}", + "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai nemá predvolený účet. Do kontajnera vstúpite príkazom: pct enter {main_vmid}", "Kimai is a professional grade time-tracking application, free and open-source.": "Kimai je profesionálna časová aplikácia, zadarmo a open-source.", "Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa je výkonný nástroj navrhnutý tak, aby vám plnú kontrolu nad vaše mediálne knižnice. S Kometa, môžete vziať svoje prispôsobenie na ďalšiu úroveň, s granulovanou kontrolou nad metaúdaje, zbierky, prekrývanie, a oveľa viac.", "Kometa reads its configuration from /config/config.yml and the container only ships /config/config.yml.template. Copy the template to config.yml, fill in the required Plex and TMDb connections, then restart the container.": "Kometa číta svoju konfiguráciu z /config/config.yml a kontajner iba lode /config/config.yml.templát. Skopírujte šablónu pre config.yml, vyplňte required Plex a TMDb pripojenia, potom reštartujte kontajner.", @@ -8153,7 +8153,7 @@ "video + recognition": "video + rozpoznávanie", "video only": "iba video", "vzdump backup speed optimization completed": "Optimalizácia rýchlosti záloh vzdump je dokončená", - "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again.": "wallabag buduje svoje odkazy z adresy uvedenej počas inštalácie. Ak nezodpovedá adrese kontajnera, upravte prostredie lxc. čas: SYMFONY ENV DOMAIN NAME in /etc/pve/lxc/ .conf s kontajnerom zastavil, a začať znova.", + "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again.": "wallabag vytvára odkazy z adresy zadanej pri inštalácii. Ak sa nezhoduje s adresou kontajnera, zastavte ho, upravte lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME v /etc/pve/lxc/.conf a znova ho spustite.", "wallabag listens on port 80 of the container and stores its data in SQLite.": "wallabag počúva port 80 kontajnera a ukladá svoje údaje v SQLite.", "wallabag web interface": "Webové rozhranie wallabag", "was": "bolo", diff --git a/lang/sv.json b/lang/sv.json index c06a631e..663e5e28 100644 --- a/lang/sv.json +++ b/lang/sv.json @@ -322,7 +322,7 @@ "After confirming, you will be asked to choose the NVIDIA driver version to install.": "Efter bekräftelse kommer du att bli ombedd att välja NVIDIA-drivrutinsversionen att installera.", "After detailed analysis, no changes are needed.": "Efter detaljerad analys behövs inga ändringar.", "After detailed analysis, no cleanup is needed.": "Efter detaljerad analys behövs ingen rengöring.", - "After logging in, run: ip a to obtain the IP address.\nThen, enter that IP address in your web browser like this:\n http://IP_ADDRESS\n\nThis will open the Umbral OS dashboard.": "När du har loggat in, kör: ip a för att få IP-adressen.\nAnge sedan den IP-adressen i din webbläsare så här:\n http://IP_ADRESS\n\nDetta öppnar Umbral OS-instrumentpanelen.", + "After logging in, run: ip a to obtain the IP address.\nThen, enter that IP address in your web browser like this:\n http://IP_ADDRESS\n\nThis will open the Umbral OS dashboard.": "Kör ip a efter inloggningen för att ta reda på IP-adressen.\nAnge sedan adressen i webbläsaren så här:\n http://IP_ADDRESS\n\nDå öppnas instrumentpanelen för Umbral OS.", "After pasting on the server, ensure the file is chmod 600 and owned by": "Efter att ha klistrat in på servern, se till att filen är chmod 600 och ägs av", "After reboot the system will be fully accessible (SSH, web UI, login), but the following components will be reinstalled in BACKGROUND — until they finish, commands like nvidia-smi may not yet be available:": "Efter omstart kommer systemet att vara fullt tillgängligt (SSH, webbgränssnitt, inloggning), men följande komponenter kommer att installeras om i BAKGRUND - tills de är klara kanske kommandon som nvidia-smi inte är tillgängliga ännu:", "After reboot, these components will reinstall in background:": "Efter omstart kommer dessa komponenter att installeras om i bakgrunden:", @@ -1643,8 +1643,8 @@ "Default Proxmox logo applied": "Standard Proxmox-logotyp tillämpas", "Default is none (video-only passthrough). Use SPACE to toggle selections.": "Standard är ingen (endast videogenomströmning). Använd MELLANSLAG för att växla mellan val.", "Default journald configuration restored": "Standard journalkonfiguration återställd", - "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "Standardplatsen är /mnt/. Delingen kommer att monteras här på värden med öppna behörigheter så att en oprivilegierad LXC kan bind-mounta och skriva till den. För LXC-åtkomst, bind-montera den här sökvägen med LXC Mount Manager.", - "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "Standardplatsen är /mnt/. Delen kommer att monteras här på värden. Använd denna sökväg i /etc/fstab. För LXC-åtkomst, bind-montera den här sökvägen med LXC Mount Manager.", + "Default location is /mnt/. The share will be mounted here on the host with open permissions so an unprivileged LXC can bind-mount and write to it. For LXC access, bind-mount this path with the LXC Mount Manager.": "Standardplatsen är /mnt/. Den delade resursen monteras här på värden med öppna behörigheter, så att en oprivilegierad LXC-container kan bind-montera den och skriva till den. Använd LXC Mount Manager för att skapa monteringen i LXC-containern.", + "Default location is /mnt/. The share will be mounted here on the host. Use this path in /etc/fstab. For LXC access, bind-mount this path with the LXC Mount Manager.": "Standardplatsen är /mnt/. Den delade resursen monteras här på värden. Använd sökvägen i /etc/fstab. För åtkomst från en LXC-container, skapa en bind-montering av sökvägen med LXC Mount Manager.", "Default login": "Standard inloggning", "Default options": "Standardalternativ", "Default options read/write": "Standardalternativ läs/skriv", @@ -2035,7 +2035,7 @@ "Enter VM ID:": "Ange VM ID:", "Enter VM/CT ID:": "Ange VM/CT ID:", "Enter ZFS pool name for the selected disk:": "Ange ZFS-poolnamn för den valda disken:", - "Enter a name for the mount point (used as /mnt/):": "Ange ett namn för monteringspunkten (används som /mnt/):", + "Enter a name for the mount point (used as /mnt/):": "Ange ett namn för monteringspunkten (används som /mnt/):", "Enter a name for the new virtual machine:": "Ange ett namn för den nya virtuella maskinen:", "Enter a non-empty password or access token on a single line.": "Ange ett icke-tomt lösenord eller åtkomsttoken på en enda rad.", "Enter a number, or write or paste a command:": "Ange ett nummer, eller skriv eller klistra in ett kommando:", @@ -2183,7 +2183,7 @@ "Example: pct stop 110": "Exempel: pct stop 110", "Example: pct stop 114": "Exempel: pct stop 114", "Example: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,backup": "Exempel: pvesm add nfs nfs-nas --server 192.168.1.50 --export /volume1/proxmox --content import,säkerhetskopia", - "Example: pvesm path local-lvm:vm-114-disk-0": "Exempel: pvesm sökväg local-lvm:vm-114-disk-0", + "Example: pvesm path local-lvm:vm-114-disk-0": "Exempel: pvesm path local-lvm:vm-114-disk-0", "Example: sed -i '/^unprivileged: 1/d' /etc/pve/lxc/110.conf": "Exempel: sed -i '/^unprivileged: 1/d' /etc/pve/lxc/110.conf", "Examples:": "Exempel:", "Execute destructive rollback?": "Utföra destruktiv återställning?", @@ -2495,7 +2495,7 @@ "For a consistent export, the VM should be stopped.": "För en konsekvent export bör den virtuella datorn stoppas.", "For any question, issue or bug report, please use the official repository": "För alla frågor, problem eller felrapporter, använd det officiella arkivet", "For dedicated GPUs, FLR is required by this policy to reduce VM": "För dedikerade GPU:er krävs FLR enligt denna policy för att minska virtuella datorer", - "For example: pct enter 101": "Till exempel: pct ange 101", + "For example: pct enter 101": "Till exempel: pct enter 101", "For guest shares add: --options guest": "För gästandelar lägg till: --options gäst", "For security reasons, the system cannot format it.": "Av säkerhetsskäl kan systemet inte formatera det.", "For unprivileged containers, use instead:": "För oprivilegierade behållare, använd istället:", @@ -2773,7 +2773,7 @@ "Host backup attached to PVE job": "Värdsäkerhetskopia kopplad till PVE-jobb", "Host data is not restored by the backup; confirm it with --acknowledge-external-data": "Värddata återställs inte av säkerhetskopieringen; bekräfta den med --acknowledge-external-data", "Host device for /dev/kvm": "Värd enhet för /dev/kvm", - "Host device for /dev/net/tun": "Värd enhet för /dev/nett/tun", + "Host device for /dev/net/tun": "Enhet på värden för /dev/net/tun", "Host device for /dev/ttyUSB0": "Värd enhet för /dev/ttyUSB0", "Host device for /dev/video10": "Värd enhet för /dev/video10", "Host device for /dev/video11": "Värd enhet för /dev/video11", @@ -2907,8 +2907,8 @@ "If notifications are enabled (Telegram/Discord/ntfy/...), you will receive a \"Host restore finished\" message when all background tasks complete.": "Om aviseringar är aktiverade (Telegram/Discord/ntfy/...), kommer du att få meddelandet \"Värdåterställning avslutad\" när alla bakgrundsuppgifter är klara.", "If passthrough fails on Windows: install RadeonResetBugFix.": "Om passthrough misslyckas på Windows: installera RadeonResetBugFix.", "If path not accessible (ZFS/BTRFS):": "Om sökväg inte är tillgänglig (ZFS/BTRFS):", - "If pvesm path returned a DEVICE (LVM):": "Om pvesm-sökvägen returnerade en DEVICE (LVM):", - "If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Om pvesm-sökvägen returnerade en DIRECTORY (ZFS/BTRFS):", + "If pvesm path returned a DEVICE (LVM):": "Om pvesm path returnerade en ENHET (LVM):", + "If pvesm path returned a DIRECTORY (ZFS/BTRFS):": "Om pvesm path returnerade en KATALOG (ZFS/BTRFS):", "If repositories error:": "Om förrådsfel:", "If the container had already been changed, its previous native backup is restored. Shared host directories are not reverted. The disks of the failed attempt are removed when the cleanup succeeds.": "Om behållaren redan hade ändrats, återställs dess tidigare inbyggda säkerhetskopia. Delade värdkataloger återställs inte. Diskarna för det misslyckade försöket tas bort när rensningen lyckas.", "If the host freezes, remove hostpci entries from": "Om värden fryser, ta bort hostpci-poster från", @@ -3048,7 +3048,7 @@ "Initiator IQN is authorised on the target": "Initiator IQN är auktoriserad på målet", "Initiator IQN:": "Initiativtagare IQN:", "Inkscape is professional quality vector graphics software which runs on Linux, Mac OS X and Windows desktop computers.": "Inkscape är professionell kvalitet vektor grafik programvara som körs på Linux, Mac OS X och Windows stationära datorer.", - "Inside the LXC, create the administrator: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN": "Inuti LXC, skapa administratören: konsol kimai:user: skapa ditt USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN", + "Inside the LXC, create the administrator: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN": "Skapa administratören inne i LXC-containern: console kimai:user:create YOUR_USERNAME YOUR_EMAIL ROLE_SUPER_ADMIN", "Inspect disks before any action": "Inspektera diskar innan någon åtgärd", "Inspect host device nodes": "Inspektera värdenhetsnoder", "Inspect passthrough/kernel events": "Inspektera passthrough/kärnhändelser", @@ -3460,7 +3460,7 @@ "Keyfile removed.": "Nyckelfilen har tagits bort.", "Keyrings method failed; trying apt-key fallback": "Nyckelringsmetoden misslyckades; försöker apt-key fallback", "KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad - En Cross Platform och Open Source Electronics Design Automation Suite.", - "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai har inget standardkonto. Ange behållaren med: pct enter {main vmid}", + "Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai har inget standardkonto. Öppna ett skal i containern med: pct enter {main_vmid}", "Kimai is a professional grade time-tracking application, free and open-source.": "Kimai är en professionell tidsspårningsapplikation, fri och öppen källkod.", "Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa är ett kraftfullt verktyg för att ge dig fullständig kontroll över dina mediebibliotek. Med Kometa kan du ta din anpassning till nästa nivå, med granulär kontroll över metadata, samlingar, överlagringar och mycket mer.", "Kometa reads its configuration from /config/config.yml and the container only ships /config/config.yml.template. Copy the template to config.yml, fill in the required Plex and TMDb connections, then restart the container.": "Kometa läser sin konfiguration från /config/config.yml och behållaren endast fartyg /config/config.yml.template. Kopiera mallen till config.yml, fyll i required Plex och TMDb-anslutningar och starta sedan om behållaren.", @@ -3531,7 +3531,7 @@ "Limiting size and optimizing journald": "Begränsning av storlek och optimering av journal", "Limiting size and optimizing journald...": "Begränsar storlek och optimerar journal...", "Limnoria A robust, full-featured, and user/programmer-friendly Python IRC bot, with many existing plugins. Successor of the well-known Supybot.": "Limnoria En robust, fullfjädrad och användarvänlig Python IRC bot, med många befintliga plugins. Framgång för den välkända Supybot.", - "Limnoria joins no IRC network until its configuration file exists. Create it with the setup wizard from the Proxmox host: pct exec -- bash -c 'cd /config && limnoria-wizard'": "Limnoria går med i inget IRC-nätverk tills dess konfigurationsfil finns. Skapa den med installationsguiden från Proxmox-värden: pct exec - bash -c \"cd /config & & & & limnoria-wizard\"", + "Limnoria joins no IRC network until its configuration file exists. Create it with the setup wizard from the Proxmox host: pct exec -- bash -c 'cd /config && limnoria-wizard'": "Limnoria ansluter inte till något IRC-nätverk förrän konfigurationsfilen finns. Skapa den med installationsguiden från Proxmox-värden: pct exec -- bash -c 'cd /config && limnoria-wizard'", "Line to paste (single line, including \"command=...\" prefix):": "Rad att klistra in (en rad, inklusive \"command=...\" prefix):", "Linux Installation Options": "Linux installationsalternativ", "Linux/Mac path:": "Linux/Mac sökväg:", @@ -4600,7 +4600,7 @@ "Partition created:": "Partition skapad:", "Partition table wiped": "Skiljebord torkat", "Pass /dev/kvm to the LXC": "Pass /dev/kvm till LXC", - "Pass /dev/net/tun to the LXC": "Pass /dev/netto/tun till LXC", + "Pass /dev/net/tun to the LXC": "Ge LXC-containern åtkomst till /dev/net/tun", "Pass /dev/ttyUSB0 to the LXC": "Pass /dev/ttyUSB0 till LXC", "Pass /dev/video10 to the LXC": "Pass /dev/video10 till LXC", "Pass /dev/video11 to the LXC": "Pass /dev/video11 till LXC", @@ -5250,7 +5250,7 @@ "Replace": "Ersätta", "Replace with the actual ID.": "Ersätt med det faktiska ID:t.", "Replace with your actual container ID": "Ersätt med ditt faktiska container-ID", - "Replace with the value from step 4": "Ersätt med värdet från steg 4", + "Replace with the value from step 4": "Ersätt med värdet från steg 4", "Replace invalid port(s)": "Ersätt ogiltiga port(ar)", "Replace it?": "Byt ut den?", "Replace paths with your actual values from step 5": "Ersätt sökvägar med dina faktiska värden från steg 5", @@ -6993,7 +6993,7 @@ "Transaction log:": "Transaktionslogg:", "Translation files:": "Översättningsfiler:", "Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, µTP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more.": "Transmission är utformad för enkel, kraftfull användning. Transmission har de funktioner du vill ha från en BitTorrent-klient: kryptering, ett webbgränssnitt, peer-utbyte, magnetlänkar, DHT, μTP, UPnP och NAT-PMP-port vidarebefordran, webseed support, watch kataloger, tracker redigering, globala och per-torrent hastighet gränser, och mer.", - "Tried pvesm path and manual detection methods": "Testade pvesm-väg och manuella detekteringsmetoder", + "Tried pvesm path and manual detection methods": "Har provat pvesm path och metoder för manuell identifiering", "Trust this certificate and save it for scheduled backups?": "Lita på det här certifikatet och spara det för schemalagda säkerhetskopieringar?", "Try Again": "Försök igen", "Try a different search term.": "Prova en annan sökterm.", @@ -8018,8 +8018,8 @@ "pvesm command not found. This should not happen on Proxmox.": "pvesm-kommandot hittades inte. Detta bör inte hända på Proxmox.", "pvesm not available.": "pvesm inte tillgänglig.", "pvesm not found.": "pvesm hittades inte.", - "pvesm path failed, trying manual detection...": "pvesm sökväg misslyckades, försöker manuell upptäckt...", - "pvesm status failed": "pvesm-status misslyckades", + "pvesm path failed, trying manual detection...": "pvesm path misslyckades, försöker identifiera manuellt...", + "pvesm status failed": "pvesm status misslyckades", "pyLoad is a Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web.": "pyLoad är en gratis och öppen källkod nedladdningshanterare skriven i Python och utformad för att vara extremt lätt, lättföränderlig och fullt hanterbar via webben.", "pyLoad web interface": "PyLoad webbgränssnitt", "qBittorrent WebUI password (user: admin)": "qBittorrent WebUI lösenord (användare: admin)", @@ -8098,7 +8098,7 @@ "switch_gpu_mode.sh was not found.": "switch_gpu_mode.sh hittades inte.", "sysfs ROM dump failed — trying ACPI VFCT table...": "sysfs ROM-dump misslyckades — försöker ACPI VFCT-tabell...", "syslog-ng allows you to flexibly collect, parse, classify, rewrite and correlate logs from across your infrastructure and store or route them to log analysis tools.": "syslog-ng låter dig flexibelt samla in, analysera, klassificera, skriva och korrelera loggar från hela din infrastruktur och lagra eller dirigera dem för att logga analysverktyg.", - "systemctl restart networking failed:": "systemctl omstart av nätverk misslyckades:", + "systemctl restart networking failed:": "systemctl restart networking misslyckades:", "systemd OnCalendar expression": "systemd OnCalendar-uttryck", "the API key was not generated on the first start": "API-nyckeln genererades inte i första början", "the NVIDIA hook of the container is not available:": "NVIDIA-hooken för behållaren är inte tillgänglig:", diff --git a/web/CONTRIBUTING-TRANSLATIONS.md b/web/CONTRIBUTING-TRANSLATIONS.md index ce9250cb..bd668edc 100644 --- a/web/CONTRIBUTING-TRANSLATIONS.md +++ b/web/CONTRIBUTING-TRANSLATIONS.md @@ -5,7 +5,12 @@ serves every published page under locale-prefixed URLs: - `/en/` — English, the source of truth - `/es/` — Spanish +- `/de/` — German +- `/fr/` — French +- `/it/` — Italian +- `/pt/` — Portuguese - `/sk/` — Slovak, with English fallback where needed +- `/sv/` — Swedish 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 @@ -148,6 +153,18 @@ Example: ### 4. Test locally +From the repository root, check the available catalogs without using a +translation provider: + +```bash +python3 .github/scripts/check_web_docs_catalogs.py +``` + +For a full locale-completion change, add `--require-complete` to also require +every English file and leaf. This validates schema, placeholders, rich-text +tags, literal code and rendering metadata; it does not replace linguistic +review. Partial translations can continue to use the English fallback. + ```bash cd web npm run dev @@ -311,7 +328,10 @@ registers a renderer for them. If you want to add a language that isn't in the project yet: 1. Create `messages//common.json` and the page catalogs. The automated - builder can provide the initial baseline. + builder can provide the initial baseline when explicitly dispatched. It + does not run on merge: changing English and its translations together must + not trigger machine retranslation of the reviewed text. Offline validation + still runs automatically for website changes. 2. Review the shared navigation and a representative set of documentation pages with a native speaker. 3. Add the locale code to `routing.ts` only when the locale is ready to be diff --git a/web/app/layout.tsx b/web/app/layout.tsx index 22dcf74a..05cf6b82 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -8,13 +8,14 @@ const inter = Inter({ subsets: ["latin"] }) * Minimal root layout — the localized layout under [locale]/ does the * real work (provider, navbar, etc.) but cannot own / tags * because Next.js requires those at the root level. Lang is set to the - * default locale here and refined client-side from inside the locale - * layout so the page still renders correctly with JS disabled (defaults - * to English) and switches to the active locale once hydrated. + * default locale here; scripts/localize-export.mjs sets the exported + * document's language before search indexing, and LocaleHtmlSync keeps + * it in sync during client navigation. The root-only hydration suppression + * allows that intentional lang attribute change in the static export. */ export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - + {children} diff --git a/web/components/language-switcher.tsx b/web/components/language-switcher.tsx index aa084783..cede72da 100644 --- a/web/components/language-switcher.tsx +++ b/web/components/language-switcher.tsx @@ -29,7 +29,12 @@ export function LanguageSwitcher() { const labels: Record = { en: t("en"), es: t("es"), + de: t("de"), + fr: t("fr"), + it: t("it"), + pt: t("pt"), sk: t("sk"), + sv: t("sv"), } return ( diff --git a/web/i18n/routing.ts b/web/i18n/routing.ts index 41c0cfdc..ffc11c7f 100644 --- a/web/i18n/routing.ts +++ b/web/i18n/routing.ts @@ -19,7 +19,7 @@ import { defineRouting } from "next-intl/routing" * `CONTRIBUTING-TRANSLATIONS.md`. */ export const routing = defineRouting({ - locales: ["en", "es", "sk"], + locales: ["en", "es", "de", "fr", "it", "pt", "sk", "sv"], defaultLocale: "en", localePrefix: "always", }) diff --git a/web/messages/de/common.json b/web/messages/de/common.json new file mode 100644 index 00000000..c3aefb73 --- /dev/null +++ b/web/messages/de/common.json @@ -0,0 +1,254 @@ +{ + "site": { + "name": "ProxMenux", + "tagline": "Interaktives Menü und Web-Dashboard für Proxmox VE" + }, + "nav": { + "home": "Startseite", + "docs": "Dokumentation", + "documentation": "Dokumentation", + "guides": "Anleitungen", + "changelog": "Änderungsprotokoll", + "github": "GitHub", + "rss": "RSS", + "rssTitle": "RSS-Feed", + "menuOpen": "Menü öffnen" + }, + "footer": { + "sponsorHeading": "Projekt unterstützen", + "sponsorBody": "Wenn Sie das Projekt unterstützen möchten.", + "sponsorAlt": "Auf Ko-fi unterstützen", + "connectHeading": "Community", + "connectBody": "Beteiligen Sie sich an den Community-Diskussionen auf GitHub, um Hilfe zu erhalten, Ideen auszutauschen und zum Projekt beizutragen. Jede Idee ist willkommen!", + "joinDiscussion": "An der Diskussion teilnehmen", + "copyrightPrefix": "ProxMenux, ein gemeinschaftliches Open-Source-Projekt von", + "copyrightSuffix": "." + }, + "language": { + "switcher": "Sprache", + "en": "English", + "es": "Español", + "sk": "Slovenčina", + "de": "Deutsch", + "fr": "Français", + "it": "Italiano", + "pt": "Português", + "sv": "Svenska" + }, + "resources": { + "documentation": { + "title": "Dokumentation", + "description": "Systembeschreibung und Benutzeranleitungen" + }, + "changelog": { + "title": "Änderungsprotokoll", + "description": "Informationen zu den neuesten Aktualisierungen" + }, + "guides": { + "title": "Anleitungen", + "description": "Schrittweise Anleitungen für häufige Aufgaben" + }, + "github": { + "title": "GitHub-Repository", + "description": "Sehen Sie sich den Quellcode an." + } + }, + "docSidebar": { + "documentation": "Dokumentation", + "items": { + "introduction": "Einführung", + "installation": "Installation", + "proxmenuxMonitor": "ProxMenux Monitor", + "monitorOverview": "Übersicht", + "architecture": "Architektur", + "accessAuth": "Zugriff und Authentifizierung", + "dashboard": "Dashboard", + "dashboardSystemOverview": "Registerkarte Systemübersicht", + "dashboardApps": "Registerkarte Apps", + "dashboardStorage": "Registerkarte Speicher", + "dashboardNetwork": "Registerkarte Netzwerk", + "dashboardVmsLxcs": "Registerkarte VMs und LXCs", + "dashboardVmsLxcsApp": "App", + "dashboardVmsLxcsUpdates": "Aktualisierungen", + "dashboardHardware": "Registerkarte Hardware", + "dashboardSystemLogs": "Registerkarte Systemprotokolle", + "dashboardTerminal": "Registerkarte Terminal", + "dashboardSecurity": "Registerkarte Sicherheit", + "dashboardSettings": "Registerkarte Einstellungen", + "healthMonitor": "Zustandsüberwachung", + "auditReport": "Prüfung und Berichte", + "auditReportOverview": "Übersicht", + "auditReportAssessment": "Bewertung und Inventar", + "auditReportPolicy": "Richtlinie", + "auditReportChanges": "Änderungen", + "auditReportReports": "Berichte und Vergleiche", + "auditReportScope": "Umfang und Garantien", + "notifications": "Benachrichtigungen", + "aiAssistant": "KI-Assistent", + "apiReference": "API-Referenz", + "integrations": "Integrationen", + "ociManager": "OCI manager Apps", + "ociOverview": "Übersicht", + "ociArchitecture": "So wird ein OCI-Image umgesetzt", + "ociCustomImage": "Image außerhalb des Katalogs", + "ociStorageNetwork": "Daten, Pfade und Netzwerk", + "ociHardware": "Geräte und Beschleunigung", + "ociStacks": "Anwendungen mit mehreren Containern", + "ociLifecycle": "Installieren, aktualisieren und ändern", + "ociMonitor": "In ProxMenux Monitor", + "proxmenuxScripts": "ProxMenux Scripts", + "postInstallScript": "Skript zur Nachinstallation", + "postInstallOverview": "Übersicht", + "postInstallAutomated": "Automatisch", + "postInstallCustomizable": "Anpassbar", + "postInstallBasicSettings": "Grundeinstellungen", + "postInstallSystem": "System", + "postInstallVirtualization": "Virtualisierung", + "postInstallNetwork": "Netzwerk", + "postInstallStorage": "Speicher", + "postInstallSecurity": "Sicherheit", + "postInstallCustomization": "Anpassung", + "postInstallMonitoring": "Überwachung", + "postInstallPerformance": "Leistung", + "postInstallOptional": "Optional", + "postInstallUpdates": "Verfügbare Aktualisierungen installieren", + "postInstallUninstall": "Optimierungen entfernen", + "gpusCoralTpu": "GPUs und Coral TPU", + "nvidiaHost": "NVIDIA-Treiber auf dem Host installieren", + "coralHost": "Coral TPU auf dem Host installieren", + "addGpuLxc": "GPU für einen LXC freigeben", + "addCoralLxc": "Coral TPU für einen LXC freigeben", + "addGpuVm": "GPU einer VM zuweisen (Passthrough)", + "switchGpuMode": "GPU-Modus wechseln (VM ↔ LXC)", + "createVm": "VM erstellen", + "createVmOverview": "Übersicht", + "createVmSystemNas": "NAS-Systeme", + "createVmSynology": "Synology-VM", + "createVmNasOthers": "Weitere NAS-Systeme", + "createVmSystemWindows": "Windows-Systeme", + "createVmSystemLinux": "Linux-Systeme", + "diskManager": "Datenträgerverwaltung", + "diskManagerOverview": "Übersicht", + "diskImportVm": "Datenträger in eine VM importieren", + "diskImportImageVm": "Datenträgerabbild in eine VM importieren", + "diskAddController": "Controller oder NVMe-Gerät zu einer VM hinzufügen", + "diskImportLxc": "Datenträger in einen LXC importieren", + "diskFormat": "Physischen Datenträger formatieren oder löschen", + "diskSmart": "SMART-Zustand und Datenträgertests", + "storageShareManager": "Speicher und Freigaben verwalten", + "storageShareOverview": "Übersicht", + "hostStorage": "Speicher in den Host einbinden", + "hostNfs": "NFS-Freigabe als Proxmox-Speicher hinzufügen", + "hostSamba": "Samba-Freigabe als Proxmox-Speicher hinzufügen", + "hostIscsi": "iSCSI-Ziel als Proxmox-Speicher hinzufügen", + "hostLocalDisk": "Lokalen Datenträger als Proxmox-Speicher hinzufügen", + "hostLocalShared": "Freigegebenes Verzeichnis auf dem Host anlegen", + "lxcMountPoints": "LXC-Mountpoints (Host ↔ CT)", + "lxcNetworkSharing": "Netzwerkfreigaben in LXC", + "lxcNfsClient": "NFS-Client in LXC", + "lxcSambaClient": "Samba-Client in LXC", + "lxcNfsServer": "NFS-Server in LXC", + "lxcSambaServer": "Samba-Server in LXC", + "network": "Netzwerk", + "networkOverview": "Übersicht", + "networkDiagnostics": "Diagnose", + "networkMonitoring": "Werkzeuge zur Echtzeitüberwachung", + "networkBridge": "Netzwerk-Bridges prüfen und reparieren", + "networkConfig": "Konfiguration prüfen und bereinigen", + "networkPersistent": "Dauerhafte Schnittstellennamen", + "networkBackup": "Schnittstellen sichern und neu starten", + "security": "Sicherheit", + "securityOverview": "Übersicht", + "securityFail2ban": "Fail2Ban", + "securityLynis": "Lynis", + "utilities": "Dienstprogramme", + "utilsOverview": "Übersicht", + "utilsUupDump": "ISO-Erstellung mit UUP Dump", + "utilsSystemUtils": "Systemwerkzeuge installieren", + "utilsSystemUpdate": "Proxmox-System aktualisieren", + "utilsUpgradePve": "Von PVE 8 auf PVE 9 aktualisieren", + "utilsExportVm": "VM als OVA/OVF exportieren", + "utilsImportVm": "VM aus OVA/OVF importieren", + "settingsProxmenux": "ProxMenux-Einstellungen", + "settingsOverview": "Übersicht", + "settingsMonitor": "ProxMenux Monitor", + "settingsBeta": "Release-Kanal wechseln", + "settingsVersion": "Versionsinformationen anzeigen", + "settingsUninstall": "ProxMenux deinstallieren", + "commandsReference": "Befehlsreferenz", + "commandsOverview": "Übersicht", + "commandsSystem": "Nützliche Systembefehle", + "commandsVmCt": "VMs und CTs verwalten", + "commandsStorage": "Speicher und Datenträger", + "commandsNetwork": "Netzwerkbefehle", + "commandsUpdates": "Aktualisierungen und Pakete", + "commandsGpu": "GPU-Passthrough", + "commandsZfs": "ZFS verwalten", + "commandsBackup": "Sichern und Wiederherstellen", + "commandsTools": "Systemwerkzeuge für die Befehlszeile", + "glossary": "Glossar", + "about": "Über das Projekt", + "aboutOverview": "Übersicht", + "aboutFaq": "FAQ", + "aboutContributors": "Mitwirkende", + "aboutContributing": "Mitwirken", + "aboutCodeOfConduct": "Verhaltenskodex", + "externalRepositories": "Externe Repositorys", + "backupRestore": "Sichern und Wiederherstellen", + "backupRestoreOverview": "Übersicht", + "backupRestoreHowItWorks": "Funktionsweise", + "backupRestoreDestinations": "Ziele", + "backupRestoreDestOverview": "Übersicht", + "backupRestoreDestLocal": "Lokales Archiv", + "backupRestoreDestPbs": "Proxmox Backup Server", + "backupRestoreDestBorg": "Borg", + "backupRestoreCreating": "Sicherungen erstellen", + "backupRestoreJobs": "Geplante Aufträge", + "backupRestoreRestoring": "Wiederherstellen", + "backupRestoreCrossKernel": "Wiederherstellung mit anderer Kernel-Version", + "backupRestoreGlossary": "Glossar" + } + }, + "hero": { + "title": "ProxMenux", + "tagline": "Ein interaktives Menü und Web-Dashboard für Proxmox VE", + "description": "ProxMenux verbindet ein interaktives Menü mit einem Web-Dashboard für Proxmox VE. Führen Sie Befehle, Skripte und geführte Assistenten über das Terminalmenü aus oder verfolgen Sie Host-Zustand, Messwerte und Benachrichtigungen im Browser.", + "installButton": "Jetzt installieren", + "whatIsButton": "Was ist ProxMenux?", + "logoAlt": "ProxMenux-Logo" + }, + "docNav": { + "previous": "Zurück", + "next": "Weiter" + }, + "tocPanel": { + "onThisPage": "Auf dieser Seite" + }, + "supportProject": { + "heading": "Unterstützen Sie das Projekt!", + "body": "Wenn Sie ProxMenux hilfreich finden, geben Sie dem Projekt eine ⭐ auf GitHub, damit auch andere darauf aufmerksam werden.", + "button": "Stern auf GitHub vergeben" + }, + "rssLink": { + "heading": "Bleiben Sie auf dem Laufenden!", + "body": "Abonnieren Sie unseren RSS-Feed, um über neue Änderungen informiert zu werden.", + "copy": "Kopieren", + "copied": "Kopiert!", + "copyTitle": "RSS-URL kopieren", + "openFeed": "RSS-Feed öffnen", + "openTitle": "RSS-Feed öffnen" + }, + "changelog": { + "pageTitle": "Änderungsprotokoll", + "meta": { + "title": "ProxMenux-Änderungsprotokoll", + "titleSuffix": "Versionshinweise", + "latest": "Aktuell", + "mostRecent": "Neueste Version", + "description": "Versionshinweise und Aktualisierungsverlauf für ProxMenux, das menügesteuerte Skript zur Verwaltung von Proxmox VE.", + "descriptionTail": "Neue Funktionen, Fehlerbehebungen, Sicherheitsupdates, Verbesserungen an ProxMenux Monitor, Kompatibilität mit KI-Anbietern, zusätzliche Absicherung beim GPU-Passthrough und mehr.", + "ogDescription": "Versionshinweise für ProxMenux.", + "ogTail": "Abonnieren Sie den RSS-Feed oder besuchen Sie diese Seite erneut, um neue Versionen zu finden." + } + } +} diff --git a/web/messages/en/common.json b/web/messages/en/common.json index 8e5f794b..2c37c948 100644 --- a/web/messages/en/common.json +++ b/web/messages/en/common.json @@ -28,7 +28,12 @@ "switcher": "Language", "en": "English", "es": "Español", - "sk": "Slovenčina" + "sk": "Slovenčina", + "de": "Deutsch", + "fr": "Français", + "it": "Italiano", + "pt": "Português", + "sv": "Svenska" }, "resources": { "documentation": { diff --git a/web/messages/es/common.json b/web/messages/es/common.json index 3ba17487..477d303b 100644 --- a/web/messages/es/common.json +++ b/web/messages/es/common.json @@ -28,7 +28,12 @@ "switcher": "Idioma", "en": "English", "es": "Español", - "sk": "Slovenčina" + "sk": "Slovenčina", + "de": "Deutsch", + "fr": "Français", + "it": "Italiano", + "pt": "Português", + "sv": "Svenska" }, "resources": { "documentation": { diff --git a/web/messages/es/docs/backup-restore/creating-backups.json b/web/messages/es/docs/backup-restore/creating-backups.json index f4b2188f..8bca0e53 100644 --- a/web/messages/es/docs/backup-restore/creating-backups.json +++ b/web/messages/es/docs/backup-restore/creating-backups.json @@ -157,7 +157,7 @@ "Filesystems runtime del kernel y sistema — /proc, /sys, /dev y /run son pseudo-filesystems que produce el kernel y udev; no se persisten en ningún sitio.", "Binarios de paquetes bajo /usr/bin, /usr/lib, /lib, /sbin — los reinstala el APT del destino a partir de packages.manual.list.", "/var/log/, /var/tmp/, /var/cache/ — estado runtime por host, no se restaura.", - "/home/USUARIO — no está en el perfil por defecto. Añadirlo como ruta custom cuando un sistema tenga directorios home de usuario que deban sobrevivir a una restauración." + "/home/USER — no está en el perfil por defecto. Añadirlo como ruta custom cuando un sistema tenga directorios home de usuario que deban sobrevivir a una restauración." ], "customPathsTitle": "Cómo se tratan las rutas custom", "customPathsBody": "Una ruta custom añadida en línea en modo Custom o persistida en backup-extra-paths.txt pasa por el mismo pipeline de rsync que las rutas del perfil por defecto. Se aplican las exclusiones globales. Si la ruta custom está bajo /root/ o /usr/local/share/proxmenux/, siguen aplicando las exclusiones específicas de arriba. Cada ruta archivada — default o custom — queda registrada en metadata/paths_archived.txt. Las rutas que no existen en el origen se registran en metadata/missing_paths.txt sin detener la copia." diff --git a/web/messages/es/docs/backup-restore/cross-kernel.json b/web/messages/es/docs/backup-restore/cross-kernel.json index 407a7f53..ced544ff 100644 --- a/web/messages/es/docs/backup-restore/cross-kernel.json +++ b/web/messages/es/docs/backup-restore/cross-kernel.json @@ -14,7 +14,7 @@ }, "intro": { "title": "Cada salto de kernel se maneja de forma distinta", - "body": "Cuando la restauración detecta que la copia y el destino tienen versiones mayores distintas de kernel, el flujo se ramifica en función de la dirección del salto — si la copia es más antigua o más reciente que el destino — porque los dos casos tienen modos de fallo opuestos. Las copias más recientes que el destino se restauran limpiamente tal cual (verificado empíricamente en múltiples pruebas de banco). Las copias más antiguas que el destino necesitan un filtro para evitar romper el arranque del destino con configuración escrita para un kernel que desde entonces ha cambiado." + "body": "El kernel de un host Proxmox se identifica mediante una versión como 6.17.13-2-pve. Los dos primeros números (6.17 en este ejemplo) definen la versión principal: cuando cambian, algunos archivos de configuración del kernel anterior podrían no ser válidos para el nuevo. Si la restauración detecta versiones principales distintas en la copia y en el destino, el proceso toma un camino u otro según la dirección del salto: si el kernel de la copia es anterior o posterior al del destino. Los dos casos presentan riesgos opuestos. Las copias con un kernel más reciente que el del destino se restauran tal cual, sin problemas según las pruebas realizadas con varios saltos de kernel. Las copias con un kernel anterior al del destino necesitan un filtro para evitar que una configuración del kernel antiguo impida arrancar el sistema de destino." }, "directionCheck": { "heading": "La comprobación de dirección", @@ -78,7 +78,7 @@ "intro": "Para desarrolladores que quieran trazar o extender el comportamiento cross-kernel:", "rows": [ { "component": "Detección de dirección", "location": "hb_compat_check en lib_host_backup_common.sh. Fija HB_COMPAT_KERNEL_DIRECTION." }, - { "component": "Lista de rutas del subconjunto seguro", "location": "hb_unsafe_paths_cross_version en lib_host_backup_common.sh. Emite líneas path\\tmotivo usadas tanto por el filtro CLI como por el endpoint Web /api/host-backups/restore/prepare." }, + { "component": "Lista de rutas del subconjunto seguro", "location": "hb_unsafe_paths_cross_version en lib_host_backup_common.sh. Emite líneas path\\treason usadas tanto por el filtro CLI como por el endpoint Web /api/host-backups/restore/prepare." }, { "component": "Fases de hidratación", "location": "_rs_hyd_grub, _rs_hyd_kernel_cmdline, _rs_hyd_modules, _rs_hyd_files en backup_host.sh. Orquestados por _rs_apply_bk_older_hydration." }, { "component": "Forzado de reflow post-arranque", "location": "apply_pending_restore.sh lee HB_HYDRATION_APPLIED de plan.env y fuerza NEEDS_INITRAMFS=1/NEEDS_GRUB=1." }, { "component": "Preview Web", "location": "/api/host-backups/restore/prepare en flask_server.py. Fuentea la librería helper, ejecuta _rs_apply_bk_older_hydration en modo plan, devuelve las acciones al modal Web." } diff --git a/web/messages/es/docs/backup-restore/destinations/index.json b/web/messages/es/docs/backup-restore/destinations/index.json index 1965649f..efb1e349 100644 --- a/web/messages/es/docs/backup-restore/destinations/index.json +++ b/web/messages/es/docs/backup-restore/destinations/index.json @@ -76,7 +76,7 @@ }, "sameArchive": { "heading": "El contenido interno de la copia es el mismo en cualquier destino", - "body": "Con independencia de dónde se guarde la copia, dentro siempre están los mismos tres bloques descritos en Cómo funciona: el sistema de ficheros (rootfs/), los metadatos (metadata/) y el manifiesto (manifest.json). Al extraer una copia local .tar.zst, restaurar un archivo .pxar desde PBS o descomprimir un archivo Borg, el árbol de directorios resultante es idéntico en los tres casos. Esto significa que el proceso de restauración lee siempre los mismos ficheros y no le importa desde qué destino provenga la copia." + "body": "Los tres destinos contienen la misma estructura rootfs/ + metadata/ + manifest.json descrita en Cómo funciona. Extraer un .tar.zst de un archivo local, restaurar un .pxar desde PBS o extraer un archivo de Borg con borg extract produce el mismo árbol de directorios. El proceso de restauración (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) lee los mismos tres componentes sin necesitar saber de qué destino proceden." }, "extractStandalone": { "heading": "Extraer una copia fuera de ProxMenux", diff --git a/web/messages/es/docs/backup-restore/destinations/pbs.json b/web/messages/es/docs/backup-restore/destinations/pbs.json index 917cc76d..354ad987 100644 --- a/web/messages/es/docs/backup-restore/destinations/pbs.json +++ b/web/messages/es/docs/backup-restore/destinations/pbs.json @@ -23,7 +23,7 @@ }, "repoSelection": { "heading": "Selección del repositorio", - "intro": "ProxMenux descubre repositorios PBS desde dos fuentes en cada copia. El usuario elige uno desde un menú unificado; esa elección determina, para esa ejecución concreta, contra qué servidor y datastore se envía la copia, con qué contraseña se autentica y con qué huella (fingerprint) valida el certificado.", + "intro": "ProxMenux descubre los repositorios de PBS a partir de dos fuentes en cada copia de seguridad. El usuario elige uno en un menú unificado; esa elección determina los valores de HB_PBS_REPOSITORY, HB_PBS_SECRET y HB_PBS_FINGERPRINT para esa ejecución.", "sourceRows": [ { "source": "storage.cfg de Proxmox (auto-descubierto)", @@ -46,7 +46,7 @@ "backupIdTitle": "Nombrado del backup ID", "backupIdBody": "El backup ID por defecto es hostcfg-HOSTNAME. Se pide al usuario que lo confirme o edite antes de la subida; cualquier carácter fuera de [A-Za-z0-9_-] se elimina y los guiones finales se recortan. Reutilizar el mismo ID entre ejecuciones es intencional — PBS trata el ID como un grupo, y cada copia posterior aparece como un nuevo backup dentro de ese grupo, compartiendo dedup con las ejecuciones previas.", "pxarTitle": "Qué se incluye dentro del archivo .pxar", - "pxarBody": "Al construir el archivo .pxar se empaqueta el directorio de trabajo completo: el sistema de ficheros del host (rootfs/), los metadatos (metadata/) y el manifiesto (manifest.json). Al restaurar, ProxMenux compara la información del manifiesto con la del host destino para detectar si son equivalentes, si cambia el hardware o si se trata de un equipo distinto, y ajustar el proceso en consecuencia. Las copias antiguas —hechas con versiones anteriores de ProxMenux que empaquetaban solo el sistema de ficheros— siguen restaurándose sin problema: el flujo de restauración detecta ese formato heredado y lo reorganiza automáticamente." + "pxarBody": "El origen del .pxar es todo el directorio staging_root, con rootfs/, metadata/ y manifest.json juntos. Las versiones anteriores utilizaban $staging_root/rootfs como origen; esto dejaba metadata/ fuera del archivo y la comprobación de compatibilidad de la restauración no tenía datos que leer, por lo que mostraba advertencias de restauración entre hosts incluso al restaurar en el mismo host. Las copias antiguas creadas solo a partir de rootfs siguen restaurándose correctamente mediante la rama del caso 3 de _rs_check_layout, que vuelve a colocar el árbol plano etc/var/root/usr dentro de una estructura rootfs/." }, "encryption": { "heading": "Cifrado del lado del cliente", @@ -61,9 +61,9 @@ "modesSharedTitle": "Clave compartida (importar la misma en cada host)", "modesSharedBody": "Se genera una única clave y se importa en todos los hosts mediante la opción Usar una clave existente. La gestión es más sencilla: hay un solo secreto que proteger, y cualquier host puede leer las copias de cualquier otro (útil para verificación centralizada, ejercicios de restauración cruzada o consolidación). A cambio, si la clave compartida se filtra queda expuesto todo el conjunto de hosts a la vez. Recomendado para laboratorios personales y entornos donde todos los hosts pertenecen al mismo responsable y comparten el mismo nivel de confianza.", "recoveryTitle": "¿Subir la clave a PBS? — el usuario decide", - "recoveryBody": "Justo después de elegir la clave, ProxMenux pregunta si se quiere subir una copia de esa clave a PBS como red de seguridad, con dos opciones. No (por defecto) mantiene la clave solo en el host; ProxMenux no toca PBS con nada relacionado con la recuperación y el usuario gestiona por su cuenta la copia externa (desde el Monitor, la acción Descargar en la fila del destino PBS la exporta en el acto). Sí pide una passphrase de recuperación —dos veces, para comprobar que coincidan—; con esa passphrase, la clave se envuelve localmente con AES-256-CBC y PBKDF2 (600 000 iteraciones, sal aleatoria) en un fichero pbs-key.recovery.enc. A partir de ese momento, cada copia cifrada sube también ese fichero envuelto a PBS. Ni la passphrase ni la clave en claro salen del host. La respuesta se puede cambiar después desde el Monitor en cualquier momento; el interruptor está inline en la fila del destino PBS y el botón que aparece se adapta al estado (empezar a subir, dejar de subir, o cambiar la passphrase).", + "recoveryBody": "Justo después de elegir la clave, ProxMenux hace una única pregunta explícita — ¿Subir clave a PBS? — con dos respuestas. No se sube nada a PBS hasta que el usuario responde Sí. La opción por defecto es No, mantener solo local: la clave se queda solo en su ruta local, ProxMenux no toca PBS con nada relacionado con la recuperación y el usuario gestiona por su cuenta la copia externa (desde el Monitor, el botón Descargar archivo clave de la fila del destino PBS la exporta en el acto). Al elegir Sí, subir se pide una passphrase de recuperación —dos veces, para comprobar que coincidan— y ProxMenux envuelve la clave con esa passphrase usando AES-256-CBC y PBKDF2 (600 000 iteraciones, sal aleatoria) en un fichero pbs-key.recovery.enc. A partir de ese momento, cada backup cifrado sube también ese fichero envuelto a PBS como un grupo de backup asociado. Ni la passphrase ni la clave en claro salen del host. La respuesta se puede cambiar después desde el Monitor en cualquier momento: el interruptor de la fila del destino PBS cambia entre Sí y No y se aplica al momento (empezar a subir, dejar de subir o cambiar la passphrase, según el estado).", "blobUploadTitle": "Grupo emparejado en PBS", - "blobUploadBody1": "Cuando el usuario ha respondido Sí, ProxMenux sube el sobre de recuperación a PBS después de cada copia cifrada como un segundo grupo emparejado, con el mismo nombre que el del host pero terminado en -keyrecovery. Los dos grupos aparecen juntos en el listado del datastore: uno con las copias del host, otro con los sobres. El sobre nunca sale del host en claro: se cifra en el host con AES-256-CBC y PBKDF2 antes de enviar un solo byte (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS solo recibe el sobre ya cifrado.", + "blobUploadBody1": "Cuando la custodia está configurada como Sí, subir, ProxMenux sube el archivo de recuperación protegido a PBS después de cada copia cifrada. Lo guarda en un segundo grupo de copia asociado, con el mismo nombre que el grupo del host y el sufijo -keyrecovery. Los dos grupos aparecen juntos en la lista del almacén de datos: uno para las copias del host y otro para los archivos de recuperación. El archivo de recuperación nunca sale del host en texto plano: se cifra en el propio host con AES-256-CBC y PBKDF2 antes de enviar ningún dato (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS solo recibe el archivo ya cifrado.", "envelopeSecurityTitle": "¿No es un riesgo subir el archivo keyrecovery a PBS?", "envelopeSecurityBody": "El sobre viaja y se guarda cifrado en todo momento. La passphrase de recuperación no sale nunca del host: el cifrado ocurre en local antes de la subida y PBS solo recibe el resultado ya cifrado. Un administrador de PBS —o cualquiera con acceso al datastore— puede descargar el sobre, pero sin la passphrase no puede leer la clave que contiene: son solo bytes cifrados. Para reconstruir la clave hacen falta las dos cosas a la vez, el sobre y la passphrase, y solo el usuario tiene ambas.", "blobUploadConstraintTitle": "Por qué dos grupos y no uno solo cifrado", @@ -73,7 +73,7 @@ "recoverTitle": "Recuperación en un equipo recién instalado", "recoverBody": "Cuando la clave no está en su sitio —tras reinstalar el host desde cero o después de eliminarla a propósito— el flujo de restauración prueba tres fuentes en orden y se queda con la primera que produce una clave usable. Primero, si el repositorio PBS elegido tiene una clave gestionada por PVE en /etc/pve/priv/storage/<NAME>.enc, se copia sola a la ruta canónica. Segundo, si en PBS hay un grupo -keyrecovery, se descarga la copia más reciente y se pide la passphrase de recuperación para abrirla. Tercero, si ninguna de las dos anteriores funciona o el usuario las descarta, el diálogo pide la ruta absoluta donde ha dejado la clave en este host, y se copia a la ruta canónica. El Monitor expone el mismo flujo dentro del modal de la copia. Si al Restaurar, Descargar o Ver contenido falta la clave, aparece un panel ámbar arriba del modal con las mismas tres vías de importación. Si la clave está instalada pero no es la correcta para esa copia, PBS devuelve un error de tipo wrong key — manifest's key XX does not match provided key YY y el modal muestra un panel estructurado con el fingerprint que PBS espera (el que quedó grabado en el manifest de la copia), para que el usuario sepa qué clave concreta necesita importar.", "monitorManagementTitle": "Gestionar la clave desde el Monitor", - "monitorManagementBody": "En la página de configuración de copias, la fila de cada destino PBS incluye los controles de la clave. Tres acciones directas: Descargar exporta la clave actual al navegador. Subir reemplaza la clave instalada por otra que aporta el usuario (la anterior solo se sobrescribe cuando la nueva ha llegado correctamente a su sitio). Eliminar retira la clave del host. Justo al lado está el interruptor del sobre de recuperación: un Sí/No para subir o no la clave a PBS, un campo de passphrase que aparece al elegir Sí, y un botón que se adapta al estado actual (empezar a subir, dejar de subir, o cambiar la passphrase). Los controles del Monitor y el diálogo del shell hacen lo mismo por dentro, así que el resultado en disco y en PBS es idéntico se use la que se use." + "monitorManagementBody": "El Monitor muestra los controles del archivo de clave en cada fila de destino PBS de la página de configuración de copias. Hay tres acciones: Descargar envía el archivo de clave actual al navegador del usuario; Subir sustituye el archivo de clave instalado por uno proporcionado por el usuario (el anterior solo se sobrescribe cuando el nuevo se ha guardado correctamente en la ruta canónica); y Eliminar borra el archivo de clave del host. Junto a estas acciones hay un único control de custodia para la recuperación: las opciones Sí y No de ¿Subir la clave a PBS?, un campo para la frase de contraseña al elegir Sí y un botón contextual para aplicar el cambio, con el texto Iniciar subida, Detener subida o Actualizar frase de contraseña según el estado actual. Todas las acciones utilizan los mismos endpoints de Flask que el menú de terminal, por lo que el resultado en disco y el estado en PBS son idénticos desde ambas interfaces." }, "restoreAccess": { "heading": "Recuperación del lado de la restauración", diff --git a/web/messages/es/docs/backup-restore/glossary.json b/web/messages/es/docs/backup-restore/glossary.json index c96e29a7..a4f35780 100644 --- a/web/messages/es/docs/backup-restore/glossary.json +++ b/web/messages/es/docs/backup-restore/glossary.json @@ -112,7 +112,7 @@ { "id": "repositorio-pbs", "term": "Repositorio PBS", - "def": "Combinación de servidor Proxmox Backup Server + datastore + usuario al que se suben las copias. Se identifica con el formato usuario@realm@host:datastore. Un mismo servidor PBS puede alojar varios repositorios." + "def": "Combinación de servidor Proxmox Backup Server + datastore + usuario al que se suben las copias. Se identifica con el formato user@realm@host:datastore. Un mismo servidor PBS puede alojar varios repositorios." }, { "id": "datastore", diff --git a/web/messages/es/docs/backup-restore/how-it-works.json b/web/messages/es/docs/backup-restore/how-it-works.json index 0c5ec8c7..51c91934 100644 --- a/web/messages/es/docs/backup-restore/how-it-works.json +++ b/web/messages/es/docs/backup-restore/how-it-works.json @@ -121,7 +121,7 @@ } ], "schemaTitle": "Validación por esquema", - "schemaBody": "ProxMenux incluye una plantilla que describe qué campos debe contener el manifiesto y qué forma tiene cada uno. Cuando se genera una copia se puede comprobar automáticamente que el manifiesto respeta esa plantilla, de modo que si un colector produjera un JSON malformado o con un campo mal escrito se detectaría en el momento. Es una comprobación destinada al desarrollo del propio ProxMenux: si el sistema no la tiene instalada, la copia sigue funcionando con normalidad y el manifiesto se genera igual." + "schemaBody": "El manifiesto se valida con scripts/backup_restore/schema/manifest.schema.json. Ejecutar build_manifest.sh --validate activa una validación JSON Schema en Python (requiere python3 y jsonschema). Si el módulo no está instalado, se omite la comprobación sin mostrar ningún aviso: esta validación es principalmente una ayuda para el desarrollo, no una dependencia necesaria durante la ejecución." }, "applications": { "heading": "El inventario de aplicaciones", diff --git a/web/messages/es/docs/backup-restore/restoring.json b/web/messages/es/docs/backup-restore/restoring.json index 44689048..732fa278 100644 --- a/web/messages/es/docs/backup-restore/restoring.json +++ b/web/messages/es/docs/backup-restore/restoring.json @@ -26,7 +26,7 @@ }, { "action": "Descargar", - "detail": "Exporta el archivo como un fichero portable .tar.zst (tar comprimido con zstd). Se puede extraer en cualquier sistema Linux con tar --zstd -xf FICHERO.tar.zst, o desde macOS/Windows con herramientas que soporten zstd (7-Zip, PeaZip, Keka…). El árbol extraído contiene manifest.json, metadata/ y rootfs/, exactamente el mismo layout que consume la restauración. Es útil para inspección offline o para restaurar en un host que no tiene acceso al destino original (PBS, Borg)." + "detail": "Exporta el archivo como un fichero portable .tar.zst (tar comprimido con zstd). Se puede extraer en cualquier sistema Linux con tar --zstd -xf FILE.tar.zst, o desde macOS/Windows con herramientas que soporten zstd (7-Zip, PeaZip, Keka…). El árbol extraído contiene manifest.json, metadata/ y rootfs/, exactamente el mismo layout que consume la restauración. Es útil para inspección offline o para restaurar en un host que no tiene acceso al destino original (PBS, Borg)." }, { "action": "Restaurar", diff --git a/web/messages/es/docs/hardware/switch-gpu-mode.json b/web/messages/es/docs/hardware/switch-gpu-mode.json index b3aabdcf..bd4b1841 100644 --- a/web/messages/es/docs/hardware/switch-gpu-mode.json +++ b/web/messages/es/docs/hardware/switch-gpu-mode.json @@ -110,7 +110,7 @@ }, "apply": { "title": "Aplicar cambios del host + workloads", - "body": "Una vez confirmas, el script escribe los cambios del lado del host — vfio.conf, blacklist, módulos y (para NVIDIA) la regla udev por BDF en /etc/udev/rules.d/10-proxmenux-vfio-bind.rules más el estado BDF en /etc/proxmenux/vfio-bind.bdfs. También aplica la política de conflicto elegida a cada VM/LXC afectada. Si la config del host realmente cambió, ejecuta update-initramfs -u -k all — si no, salta ese paso." + "body": "Tras confirmar, el script escribe los cambios en el host: vfio.conf, la lista de módulos bloqueados, los módulos y, para NVIDIA, la regla udev por BDF en /etc/udev/rules.d/10-proxmenux-vfio-bind.rules y el estado BDF en /etc/proxmenux/vfio-bind.bdfs. También aplica la política de conflictos elegida a cada VM/LXC afectado. Si la configuración del host ha cambiado, ejecuta update-initramfs -u -k all y después proxmox-boot-tool refresh; si no ha cambiado, omite ambos comandos." }, "reboot": { "title": "Reiniciar", diff --git a/web/messages/es/docs/monitor/access-auth.json b/web/messages/es/docs/monitor/access-auth.json index 82207bf9..1600caa8 100644 --- a/web/messages/es/docs/monitor/access-auth.json +++ b/web/messages/es/docs/monitor/access-auth.json @@ -257,7 +257,7 @@ "Hecho. El 2FA está ahora activo. La próxima vez que te logues, el panel pide primero la contraseña; una vez aceptada pide el código actual de 6 dígitos." ], "setupStep4Sub": [ - "Camino fácil: en la app, pulsa Añadir cuenta → Escanear código QR, apunta la cámara al QR en la pantalla. La app nombra la entrada automáticamente (algo como ProxMenux Monitor (tu-usuario)) y empieza a mostrar un código de 6 dígitos que se refresca cada 30 segundos.", + "Camino fácil: en la app, pulsa Añadir cuenta → Escanear código QR, apunta la cámara al QR en la pantalla. La app nombra la entrada automáticamente (algo como ProxMenux Monitor (your-username)) y empieza a mostrar un código de 6 dígitos que se refresca cada 30 segundos.", "Plan B manual (cuando escanear no es posible — p. ej. configurando en el mismo móvil con el que abriste el panel): pulsa Añadir cuenta → Introducir clave de setup. Escribe cualquier nombre (p. ej. Proxmox Monitor), pega la cadena Base32 del diálogo, deja Tipo como Basado en tiempo, guarda." ], "testTitle": "Prueba antes de hacer logout", @@ -319,7 +319,7 @@ "heading": "Secure Gateway (Tailscale)", "intro": "Los reverse proxies son la respuesta clásica a \"llegar al panel desde fuera\" pero requieren un dominio público, certificado y un puerto abierto en el borde. Secure Gateway es la alternativa cero-puertos que viene dentro del propio Monitor — una app desplegable preconstruida que levanta un LXC Alpine ejecutando Tailscale como subnet router. Una vez unido a tu tailnet, cada dispositivo en él puede llegar al Monitor en la propia IP LAN del host — desde un portátil de vacaciones, un móvil con 5G u otro nodo — sin exponer TCP 8008 a internet.", "calloutTitle": "Por qué esto es cómodo", - "calloutBody": "La URL se mantiene igual que en la LAN — http://<ip-lan-proxmox>:8008 funciona donde Tailscale funcione. Sin certificados, sin DNS, sin port forwarding. El propio Monitor ve la petición viniendo de una IP de tailnet (típicamente 100.x.y.z), así que el log de auth y el hook de Fail2Ban siguen funcionando como en la LAN.", + "calloutBody": "La URL se mantiene igual que en la LAN — http://<proxmox-lan-ip>:8008 funciona donde Tailscale funcione. Sin certificados, sin DNS, sin port forwarding. El propio Monitor ve la petición viniendo de una IP de tailnet (típicamente 100.x.y.z), así que el log de auth y el hook de Fail2Ban siguen funcionando como en la LAN.", "deployBody": "El flujo de despliegue es una sola pantalla — elige el storage LXC del host, pega un auth-key de Tailscale (generado en login.tailscale.com/admin/settings/keys), elige qué subnets anunciar, pulsa Deploy. El LXC tarda ~30 segundos en arrancar y se registra en el tailnet automáticamente.", "outro": "El despliegue paso a paso, la configuración de subnet-routes, las ACLs de Tailscale y el modo Exit Node se documentan por separado en Dashboard → Security → Secure Gateway — ahí vive el wizard de despliegue en la UI del panel. Esta página solo cubre el patrón de acceso." }, diff --git a/web/messages/es/docs/monitor/api-reference.json b/web/messages/es/docs/monitor/api-reference.json index b2906347..11ffc9eb 100644 --- a/web/messages/es/docs/monitor/api-reference.json +++ b/web/messages/es/docs/monitor/api-reference.json @@ -55,7 +55,7 @@ "heading": "Convenciones", "items": [ "Todas las peticiones y respuestas son JSON salvo que se indique explícitamente (la descarga de logs es texto plano, /api/prometheus es text/plain en formato OpenMetrics, el log de tareas es texto plano).", - "Los endpoints que modifican estado con éxito devuelven '{'\"success\": true, ...'}'. Las respuestas de error usan un estado HTTP no-2xx con '{'\"success\": false, \"error\": \"'<'motivo'>'\"'}'.", + "Los endpoints que modifican estado con éxito devuelven '{'\"success\": true, ...'}'. Las respuestas de error usan un estado HTTP no-2xx con '{'\"success\": false, \"error\": \"'<'reason'>'\"'}'.", "Los endpoints de listado aceptan limit, offset, since opcionales y filtros específicos por categoría vía query string.", "Los campos de tiempo se devuelven como segundos epoch Unix o ISO-8601 con zona horaria explícita, nunca como cadenas de locale." ] @@ -174,7 +174,7 @@ "syncVsAsyncBody": "Las acciones a nivel de sistema (power del host, PVE update, self-update de ProxMenux) pueden tardar minutos — corren en su propia unit systemd transitoria y exponen un endpoint .../status más un DELETE para cancelar. Las acciones VM / LXC (start, stop, shutdown, reboot, backup) son rápidas y usan el estilo fire-and-return que la UI del Monitor ya expone: el POST devuelve el resultado directo. Ambos estilos comparten el mismo modelo de autenticación (JWT o token de API de larga duración).", "curlTitle": "Ejemplo con curl", "curlBody": "Disparar una actualización de PVE y hacer polling hasta que termine — exactamente la misma secuencia que ejecutaría una automatización de Home Assistant o un playbook de Ansible:", - "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"estado final: $state\"", + "curlCode": "TOKEN=\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"", "haTitle": "Snippet de integración con Home Assistant", "haBody": "Un sensor rest hace polling del estado y un rest_command dispara la actualización. Conecta ambos a un botón del dashboard y a las automatizaciones que quieras:", "haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Encender VM 100 (funciona igual para LXC — mismo endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup de la VM 100 al storage 'pbs-main'\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"" diff --git a/web/messages/es/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/es/docs/monitor/dashboard/vms-lxcs-app.json index 08895a8f..1cafcd5b 100644 --- a/web/messages/es/docs/monitor/dashboard/vms-lxcs-app.json +++ b/web/messages/es/docs/monitor/dashboard/vms-lxcs-app.json @@ -101,7 +101,7 @@ ], "sourcesHeading": "Fuentes para la versión disponible", "sources": [ - "Repositorio de GitHub: último lanzamiento o etiqueta de un repositorio público propietario/nombre.", + "Repositorio de GitHub: último lanzamiento o etiqueta de un repositorio público owner/name.", "HTTP JSON: un punto final público y una ruta como data.version o releases[0].tag_name.", "Docker Hub: etiquetas versionadas filtradas con una expresión regular. La vista previa muestra etiquetas reales coincidentes antes de guardar.", "Las etiquetas móviles como latest, stable o lts no contienen una versión. Esas imágenes se siguen por digest desde las actualizaciones de imágenes Docker." diff --git a/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json index 6bd3f77d..0fb53ddb 100644 --- a/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json +++ b/web/messages/es/docs/monitor/dashboard/vms-lxcs-updates.json @@ -110,8 +110,8 @@ "No incluyas pct exec; ProxMenux ya entra en el contenedor y ejecuta el comando como root." ], "exampleLead": "Ejemplo de procedimiento completo dentro del contenedor:", - "example": "cd /opt/mi-app && ./update.sh", - "callout": "Un comando de versión como miapp --version solo lee una versión; no instala nada. Los comandos se ejecutan con privilegios administrativos y deben revisarse con el mismo cuidado que un comando de shell como root." + "example": "cd /opt/my-app && ./update.sh", + "callout": "Un comando de versión como myapp --version solo lee una versión; no instala nada. Los comandos se ejecutan con privilegios administrativos y deben revisarse con el mismo cuidado que un comando de shell como root." }, "bulk": { "heading": "Actualización en bloque", @@ -142,7 +142,7 @@ "La espera tras una versión solo se aplica a las apps seleccionadas con seguimiento. Las apps sin seguimiento ejecutan su actualizador cuando vence la programación.", "El estado de la última ejecución diferencia entre éxito, finalización parcial, error, retención de seguridad y ausencia de elementos pendientes. Después de la primera ejecución programada, Actualizaciones → Actualizaciones programadas → Ver log abre la salida completa capturada del actualizador y de los scripts secundarios que haya ejecutado.", "Después de cada ejecución, ProxMenux comprueba el marcador estándar de Debian que indica si es necesario reiniciar. Cuando hace falta, la pestaña Actualizaciones y la notificación de finalización lo indican; el aviso se elimina cuando ese LXC se inicia o reinicia.", - "En el host Proxmox, los logs de las ejecuciones programadas se guardan en /usr/local/share/proxmenux/logs/lxc-updates/ con el nombre <VMID>-scheduled-<id-de-ejecución>.log. Se conservan los diez últimos logs de cada LXC y los archivos más antiguos se eliminan automáticamente.", + "En el host Proxmox, los logs de las ejecuciones programadas se guardan en /usr/local/share/proxmenux/logs/lxc-updates/ con el nombre <VMID>-scheduled-<run-id>.log. Se conservan los diez últimos logs de cada LXC y los archivos más antiguos se eliminan automáticamente.", "Este historial corresponde a las actualizaciones programadas. Una actualización manual muestra su salida en tiempo real en la ventana de ejecución del Monitor y no crea un log de ejecución programada en ese directorio.", "Las programaciones externas detectadas de Proxmox VE Helper-Scripts se muestran aparte para hacer visible cualquier automatización coincidente." ], @@ -186,7 +186,7 @@ }, { "problem": "Una actualización programada indica que es necesario reiniciar", - "resolution": "Abre Ver log para revisar la ejecución completada y reinicia ese LXC. ProxMenux elimina el aviso mediante el evento de ciclo de vida existente cuando el contenedor vuelve a arrancar." + "resolution": "Abre Ver registro para revisar la ejecución completada y después reinicia ese LXC. ProxMenux borra el aviso cuando el evento de ciclo de vida detecta el nuevo arranque." } ] }, diff --git a/web/messages/es/docs/monitor/integrations.json b/web/messages/es/docs/monitor/integrations.json index 36896b10..13c8d5de 100644 --- a/web/messages/es/docs/monitor/integrations.json +++ b/web/messages/es/docs/monitor/integrations.json @@ -37,7 +37,7 @@ "headingHref": "https://gethomepage.dev", "intro": "Homepage es un panel de aplicaciones totalmente estático y personalizable. ProxMenux Monitor se enchufa vía el widget customapi integrado — pega una entrada de servicio en services.yaml, reinicia Homepage y la tarjeta aparece con números en vivo.", "iconCalloutTitle": "El logo oficial de ProxMenux está en dashboardicons.com", - "iconCalloutBody": "Las guías de abajo usan icon: proxmenux.png. Homepage resuelve automáticamente los nombres de archivo simples contra dashboardicons.com — una librería de iconos curada para paneles autoalojados. La entrada de ProxMenux vive en dashboardicons.com/icons/external/proxmenux y Homepage la descarga en el primer render. La misma búsqueda funciona para miles de otras herramientas (Telegram, Discord, Grafana, Tailscale, etc.) — basta con escribir icon: <nombre>.png en cualquier entrada de servicio.", + "iconCalloutBody": "Las guías de abajo usan icon: proxmenux.png. Homepage resuelve automáticamente los nombres de archivo simples contra dashboardicons.com — una librería de iconos curada para paneles autoalojados. La entrada de ProxMenux vive en dashboardicons.com/icons/external/proxmenux y Homepage la descarga en el primer render. La misma búsqueda funciona para miles de otras herramientas (Telegram, Discord, Grafana, Tailscale, etc.) — basta con escribir icon: <name>.png en cualquier entrada de servicio.", "imageAlt": "Panel Homepage mostrando tres tarjetas de ProxMenux Monitor (EDGE, VOID, DREAM) con uptime, CPU, RAM y temperatura para cada host Proxmox", "imageCaption": "Tres instancias de ProxMenux Monitor renderizadas como tarjetas Homepage — uptime, CPU, RAM y temperatura de CPU leídas en vivo desde /api/system en cada host cada 10 s.", "basicTitle": "Widget básico — sin autenticación", @@ -94,7 +94,7 @@ "twoColTipBody": "Reemplaza cualquier par de tarjetas (p. ej. Sistema + VMs, o Almacenamiento + Red) con un único horizontal-stack envolviendo ambas, para que siempre se rendericen lado a lado independientemente del ancho de pantalla:", "twoColTipOutro": "En móvil la fila se mantiene comprimida; el auto layout de HA (sin horizontal-stack) refluye mejor a anchos estrechos.", "step6Title": "6 · Automatizaciones", - "step6Body": "Tres automatizaciones que cubren los escenarios reactivos más comunes — reemplaza notify.mobile_app_<tu_movil> por el servicio notify que uses:", + "step6Body": "Tres automatizaciones que cubren los escenarios reactivos más comunes — reemplaza notify.mobile_app_<your_phone> por el servicio notify que uses:", "logoTitle": "Sobre el logo de ProxMenux", "logoBody": "La tarjeta picture-entity en la parte superior del YAML Lovelace descarga el logo oficial de ProxMenux desde dashboardicons.com — una librería de iconos gratuita curada para paneles autoalojados. La entrada de ProxMenux vive en dashboardicons.com/icons/external/proxmenux. Home Assistant descarga el SVG sobre HTTPS en el primer render y lo cachea.", "logoBrokenTitle": "Si la tarjeta del logo muestra una imagen rota", @@ -120,7 +120,7 @@ "tokenTipTitle": "Token vía archivo o env, no inline", "tokenTipBody": "Para despliegues en producción evita poner el token inline. Prometheus soporta credentials_file: /etc/prometheus/secrets/proxmenux.token como alternativa — guarda el token en un archivo 0600 y deja que Prometheus lo lea.", "step2Title": "2 · Verifica el scrape con un par de queries", - "step2Body": "Antes de configurar Grafana, confirma que Prometheus realmente tiene los datos. Abre la propia UI de Prometheus en http://<host-prometheus>:9090, pulsa Query y ejecuta cualquiera de estas — deberías obtener números en vivo de tu host Proxmox:", + "step2Body": "Antes de configurar Grafana, confirma que Prometheus realmente tiene los datos. Abre la propia UI de Prometheus en http://<prometheus-host>:9090, pulsa Query y ejecuta cualquiera de estas — deberías obtener números en vivo de tu host Proxmox:", "headerQuery": "Query", "headerConfirms": "Qué confirma", "verifyRows": [ diff --git a/web/messages/es/docs/monitor/notifications.json b/web/messages/es/docs/monitor/notifications.json index 85089fa0..6a0cf1f3 100644 --- a/web/messages/es/docs/monitor/notifications.json +++ b/web/messages/es/docs/monitor/notifications.json @@ -44,7 +44,7 @@ "Arranca el hilo de fondo de despacho. El hilo hace polling de la cola de eventos y camina cada evento por la pipeline diagramada arriba." ], "activeAlt": "Tarjeta de notificaciones activada con pestañas de canales, nombre visible y opciones avanzadas de IA", - "activeCaption": "Estado activo: pestañas Telegram, Gotify, Discord, Email, Pushover y Apprise, nombre visible, categorías por canal y opciones avanzadas de IA." + "activeCaption": "Estado activo: pestañas de canales en la parte superior (Telegram / Gotify / Discord / correo electrónico / Pushover / Apprise), campo Nombre para mostrar, lista de categorías de cada canal y sección desplegable Avanzado: mejora con IA." }, "sources": { "heading": "Fuentes de eventos", @@ -119,7 +119,7 @@ "groupItems": [ "Añade el bot al grupo como miembro (y hazlo admin si el grupo lo requiere para publicar).", "Envía cualquier mensaje en el grupo.", - "Abre https://api.telegram.org/bot<TU_TOKEN>/getUpdates en un navegador. Busca chat.id en la respuesta JSON — para grupos es un número negativo, para supergrupos empieza con -100.", + "Abre https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates en un navegador. Busca chat.id en la respuesta JSON — para grupos es un número negativo, para supergrupos empieza con -100.", "Para supergrupos con Topics activado, anota también el message_thread_id del tema al que quieres apuntar — eso va en el campo opcional Topic ID." ], "groupAlt": "Formulario de canal Telegram con Bot Token (enmascarado), Chat ID negativo prefijado con -100 indicando un supergrupo, y Topic ID 3 configurado para entregar a un tema específico", @@ -203,7 +203,7 @@ "stepsTitle": "Pasos", "steps": [ "Elige el servicio destino en la wiki de Apprise y copia la plantilla de URL para él. Cada página de servicio muestra el esquema exacto a usar (ntfy://, matrix://, pover://, slack://…) más cualquier token, canal u hostname requerido.", - "Rellena los placeholders con tus propias credenciales. Por ejemplo, un topic de ntfy.sh tiene aspecto de ntfy://ntfy.sh/mi-topic; una URL de Pushover tiene aspecto de pover://user@token; una URL de Matrix tiene aspecto de matrix://user:pass@host:port/#room.", + "Sustituye los marcadores por tus credenciales. Ejemplos: ntfy.sh ntfy://ntfy.sh/my-topic; Pushover pover://user@token; Matrix matrix://user:pass@host:port/#room.", "Pega la URL final en el campo Apprise URL en la pestaña Apprise del panel Notifications y guarda.", "Pulsa Send Test para verificar que la URL es alcanzable y las credenciales se aceptan." ], @@ -295,7 +295,7 @@ "rows": [ { "stage": "1. Deduplicación por huella", - "what": "Cada evento genera una huella (event_type + campos clave de data). Las huellas idénticas dentro de una ventana corta se consideran duplicados del primero.", + "what": "Cada evento genera una huella (event_type + key fields from data). Las huellas idénticas dentro de una ventana corta se consideran duplicados del primero.", "tunable": "No — lógica interna del dispatcher." }, { @@ -339,7 +339,7 @@ "Llamadores remotos. Cinco capas se apilan encima del rate-limiting: un shared secret en la cabecera X-Webhook-Secret, un timestamp de frescura en X-ProxMenux-Timestamp (rechazado si se desvía más allá de la ventana configurada), una búsqueda de caché de replay y una allowlist de IP opcional. El shared secret vive en la tabla de ajustes SQLite del Monitor — no en /etc/pve/priv/notifications.cfg — y se genera en el primer setup. Este camino existe para integraciones personalizadas que hacen POST desde fuera del host; el destino configurado por PVE nunca lo ejercita." ], "practiceTitle": "En la práctica", - "practiceBody": "El setup de PVE escribe el destino como http://127.0.0.1:8008, así que las notificaciones emitidas por PVE siempre pasan por el camino loopback con seguridad solo rate-limit. El camino de llamador remoto con shared secret es opt-in para integraciones personalizadas — apunta un servicio externo a https://<host-monitor>:<port>/api/notifications/webhook y suministra la cabecera X-Webhook-Secret para usarlo.", + "practiceBody": "El setup de PVE escribe el destino como http://127.0.0.1:8008, así que las notificaciones emitidas por PVE siempre pasan por el camino loopback con seguridad solo rate-limit. El camino de llamador remoto con shared secret es opt-in para integraciones personalizadas — apunta un servicio externo a https://<monitor-host>:<port>/api/notifications/webhook y suministra la cabecera X-Webhook-Secret para usarlo.", "actionsIntro": "El Monitor gestiona este destino a través de tres acciones en la pestaña Settings:", "actionsItems": [ "Setup — corre automáticamente cuando activas Notifications. Crea la entrada en /etc/pve/notifications.cfg. El archivo solo se escribe cuando su contenido tiene que cambiar, y se guarda un backup del anterior en /usr/local/share/proxmenux/backups/pve-notifications/ (los tres más recientes). No se escribe nada mientras /etc/pve no está montado: un Monitor que arranca durante un reinicio de pve-cluster registra la entrada cuando vuelve.", diff --git a/web/messages/es/docs/oci-manager/hardware.json b/web/messages/es/docs/oci-manager/hardware.json index b4f24154..92d0bf14 100644 --- a/web/messages/es/docs/oci-manager/hardware.json +++ b/web/messages/es/docs/oci-manager/hardware.json @@ -59,7 +59,7 @@ "table": { "headers": ["Tipo", "Identificación", "Validación"], "rows": [ - ["Intel/AMD DRM", "/dev/dri/renderD* y /sys/class/drm/NODO/device/vendor", "Un dispositivo de caracteres con fabricante 0x8086 (Intel) o 0x1002 (AMD)"], + ["Intel/AMD DRM", "/dev/dri/renderD* y /sys/class/drm/NODE/device/vendor", "Un dispositivo de caracteres con fabricante 0x8086 (Intel) o 0x1002 (AMD)"], ["OpenCL AMD", "El render node, más /dev/kfd cuando el perfil lo necesita", "Existencia, tipo, fabricante, permisos y compatibilidad declarada"], ["AMD ROCm", "El nodo de render, /dev/kfd y la generación que declara el driver de cómputo en /sys/class/kfd/kfd/topology/nodes/*/properties", "Una generación para la que la imagen ROCm de la aplicación trae kernels, las GPU RDNA2 que incluye y las posteriores, se ofrece tal cual. Las demás GPU de esas familias, como las Radeon 680M y 780M, se ofrecen como experimentales y nunca son la opción propuesta: ROCm no las soporta oficialmente, la aplicación las presenta como la generación de su familia (HSA_OVERRIDE_GFX_VERSION) y el instalador pide confirmación antes de descargar la imagen, que es más grande. Una GPU anterior, como los gráficos integrados de un Ryzen 5000U, no se ofrece e Immich deja el reconocimiento en la CPU"], ["NVIDIA", "nvidia-smi y nvidia-container-cli", "GPU, UUID, bus PCI, versión del driver, Toolkit, nodos /dev/nvidia*, binarios y librerías"], diff --git a/web/messages/es/docs/oci-manager/storage-network.json b/web/messages/es/docs/oci-manager/storage-network.json index 08d67c4e..00849e0c 100644 --- a/web/messages/es/docs/oci-manager/storage-network.json +++ b/web/messages/es/docs/oci-manager/storage-network.json @@ -112,7 +112,7 @@ "items": [ { "title": "Contenedor y remoto", "body": "El VMID del contenedor Rclone, el nombre exacto del remoto y, opcionalmente, una ruta dentro de él." }, { "title": "Nombre y caché", "body": "El nombre del montaje y el modo de caché VFS: off, minimal, writes o full (por defecto)." }, - { "title": "Vistas publicadas", "body": "Una raíz común, /mnt/oci-shared por defecto, contiene una vista de lectura y escritura en /mnt/oci-shared/remotes/NOMBRE y una de solo lectura en /mnt/oci-shared/remotes-ro/NOMBRE." }, + { "title": "Vistas publicadas", "body": "Una raíz común, /mnt/oci-shared de forma predeterminada, contiene una vista de lectura y escritura en /mnt/oci-shared/remotes/NAME y otra de solo lectura en /mnt/oci-shared/remotes-ro/NAME." }, { "title": "Activación", "body": "Tras una confirmación, el CT se detiene, se configuran su orden de arranque y un hookscript de Proxmox VE, y se vuelve a iniciar. La operación espera hasta que las dos vistas están montadas en el host." } ] } diff --git a/web/messages/es/docs/post-install/system.json b/web/messages/es/docs/post-install/system.json index 0861d3b7..1abad55d 100644 --- a/web/messages/es/docs/post-install/system.json +++ b/web/messages/es/docs/post-install/system.json @@ -20,7 +20,7 @@ "SystemMaxUse=64M / RuntimeMaxUse=60M — caps duros sobre el uso de disco/memoria del journal.", "Compress=yes, Seal=no — comprimir logs, saltar el forward-secure sealing (ahorra CPU).", "MaxLevelStore=info — almacenar info y superiores (requerido para el visor de logs del ProxMenux Monitor y para que Fail2Ban detecte fallos de autenticación SSH/Proxmox desde el journal).", - "Rate-limits: 1000 eventos / 30 s para prevenir flooding de logs.", + "Límite de frecuencia: 1000 events / 30 s para evitar una avalancha de registros.", "ForwardToSyslog=no, ForwardToWall=no — no duplicar mensajes a syslog ni broadcastear a consolas." ], "tipTitle": "Por qué importa MaxLevelStore=info", diff --git a/web/messages/es/docs/storage-share/host-iscsi.json b/web/messages/es/docs/storage-share/host-iscsi.json index 04be8a5f..e77d54ca 100644 --- a/web/messages/es/docs/storage-share/host-iscsi.json +++ b/web/messages/es/docs/storage-share/host-iscsi.json @@ -56,7 +56,7 @@ "Entrada del portal — escribe la IP o hostname del servidor del target iSCSI. Se asume el puerto 3260 a menos que escribas host:port.", "Descubrimiento de targets — ProxMenux llama a iscsiadm --mode discovery --type sendtargets --portal <ip:port>. El servidor responde con cada IQN que permite ver a este initiator. Si el descubrimiento falla, el script muestra el error exacto de iscsiadm y lista las causas comunes (IP incorrecta, firewall, IQN del initiator no autorizado).", "Selección del target — si hay un solo target se selecciona automáticamente; con varios targets se muestra un menú.", - "Storage ID — por defecto es iscsi-<último segmento del IQN, máx. 20 caracteres>. Solo letras, dígitos, - y _.", + "Storage ID — por defecto es iscsi-<last IQN segment, 20 chars max>. Solo letras, dígitos, - y _.", "Content type — a diferencia de NFS / Samba, el contenido iSCSI está fijado a images. iSCSI expone dispositivos de bloque raw, no un sistema de archivos, así que Proxmox solo te deja alojar discos de VM ahí." ], "authTitle": "Autorizar el initiator de Proxmox en el target", diff --git a/web/messages/es/docs/storage-share/lxc-mount-points.json b/web/messages/es/docs/storage-share/lxc-mount-points.json index d89b7a54..fa80e077 100644 --- a/web/messages/es/docs/storage-share/lxc-mount-points.json +++ b/web/messages/es/docs/storage-share/lxc-mount-points.json @@ -129,7 +129,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "noMountTitle": "El montaje aparece en la config del pct pero no dentro del contenedor", + "noMountTitle": "El montaje aparece en pct config, pero no dentro del contenedor", "noMountBody": "Los bind mounts solo se adjuntan cuando el contenedor arranca. Si añadiste el montaje mientras el CT estaba corriendo, reinícialo (pct reboot <ctid>). Si ya está reiniciado y sigue faltando, comprueba pct config <ctid> para confirmar que la entrada existe y que la ruta del host realmente contiene un directorio.", "noWriteTitle": "El contenedor puede ver el directorio pero no puede escribir", "noWriteBody": "Casi siempre un problema de permisos. Para contenedores unprivileged, ejecuta de nuevo el fix de permisos del script — las ACLs del directorio del host pueden haber sido reseteadas por otra herramienta (rsync, restore desde backup, chmod manual). Para CIFS, revisa las opciones de montaje en el host: findmnt /mnt/pve/cifs-…, busca valores uid= / gid= / file_mode=.", diff --git a/web/messages/fr/common.json b/web/messages/fr/common.json new file mode 100644 index 00000000..76c712d2 --- /dev/null +++ b/web/messages/fr/common.json @@ -0,0 +1,254 @@ +{ + "site": { + "name": "ProxMenux", + "tagline": "Menu interactif et tableau de bord web pour Proxmox VE" + }, + "nav": { + "home": "Accueil", + "docs": "Documentation", + "documentation": "Documentation", + "guides": "Guides", + "changelog": "Journal des modifications", + "github": "GitHub", + "rss": "RSS", + "rssTitle": "Flux RSS", + "menuOpen": "Ouvrir le menu" + }, + "footer": { + "sponsorHeading": "Soutenir le projet", + "sponsorBody": "Si vous souhaitez soutenir le projet.", + "sponsorAlt": "Soutenez-moi sur Ko-fi", + "connectHeading": "Communauté", + "connectBody": "Rejoignez les discussions de la communauté sur GitHub pour obtenir de l’aide, partager vos idées et contribuer au projet. Toutes les idées sont les bienvenues !", + "joinDiscussion": "Participer à la discussion", + "copyrightPrefix": "ProxMenux, un projet collaboratif et open source créé par", + "copyrightSuffix": "." + }, + "language": { + "switcher": "Langue", + "en": "English", + "es": "Español", + "sk": "Slovenčina", + "de": "Deutsch", + "fr": "Français", + "it": "Italiano", + "pt": "Português", + "sv": "Svenska" + }, + "resources": { + "documentation": { + "title": "Documentation", + "description": "Présentation du système et guides d’utilisation" + }, + "changelog": { + "title": "Journal des modifications", + "description": "Informations sur les dernières mises à jour" + }, + "guides": { + "title": "Guides", + "description": "Tutoriels et guides pas à pas pour les tâches courantes" + }, + "github": { + "title": "Dépôt GitHub", + "description": "Consultez le code source." + } + }, + "docSidebar": { + "documentation": "Documentation", + "items": { + "introduction": "Introduction", + "installation": "Installation", + "proxmenuxMonitor": "ProxMenux Monitor", + "monitorOverview": "Vue d’ensemble", + "architecture": "Architecture", + "accessAuth": "Accès et authentification", + "dashboard": "Tableau de bord", + "dashboardSystemOverview": "Onglet Vue d’ensemble du système", + "dashboardApps": "Onglet Applications", + "dashboardStorage": "Onglet Stockage", + "dashboardNetwork": "Onglet Réseau", + "dashboardVmsLxcs": "Onglet VM et LXC", + "dashboardVmsLxcsApp": "Application", + "dashboardVmsLxcsUpdates": "Mises à jour", + "dashboardHardware": "Onglet Matériel", + "dashboardSystemLogs": "Onglet Journaux système", + "dashboardTerminal": "Onglet Terminal", + "dashboardSecurity": "Onglet Sécurité", + "dashboardSettings": "Onglet Paramètres", + "healthMonitor": "Surveillance de l’état du système", + "auditReport": "Audit et rapports", + "auditReportOverview": "Vue d’ensemble", + "auditReportAssessment": "Évaluation et inventaire", + "auditReportPolicy": "Politique", + "auditReportChanges": "Modifications", + "auditReportReports": "Rapports et comparaisons", + "auditReportScope": "Périmètre et garanties", + "notifications": "Notifications", + "aiAssistant": "Assistant IA", + "apiReference": "Référence de l’API", + "integrations": "Intégrations", + "ociManager": "OCI manager Apps", + "ociOverview": "Vue d’ensemble", + "ociArchitecture": "Comment une image OCI est adaptée", + "ociCustomImage": "Image absente du catalogue", + "ociStorageNetwork": "Données, chemins et réseau", + "ociHardware": "Périphériques et accélération", + "ociStacks": "Applications à plusieurs conteneurs", + "ociLifecycle": "Installer, mettre à jour et modifier", + "ociMonitor": "Dans ProxMenux Monitor", + "proxmenuxScripts": "ProxMenux Scripts", + "postInstallScript": "Script de post-installation", + "postInstallOverview": "Vue d’ensemble", + "postInstallAutomated": "Automatique", + "postInstallCustomizable": "Personnalisable", + "postInstallBasicSettings": "Paramètres de base", + "postInstallSystem": "Système", + "postInstallVirtualization": "Virtualisation", + "postInstallNetwork": "Réseau", + "postInstallStorage": "Stockage", + "postInstallSecurity": "Sécurité", + "postInstallCustomization": "Personnalisation", + "postInstallMonitoring": "Surveillance", + "postInstallPerformance": "Performances", + "postInstallOptional": "Facultatif", + "postInstallUpdates": "Appliquer les mises à jour disponibles", + "postInstallUninstall": "Supprimer les optimisations", + "gpusCoralTpu": "GPU et Coral TPU", + "nvidiaHost": "Installer les pilotes NVIDIA sur l’hôte", + "coralHost": "Installer Coral TPU sur l’hôte", + "addGpuLxc": "Donner accès à un GPU dans un LXC", + "addCoralLxc": "Donner accès à Coral TPU dans un LXC", + "addGpuVm": "Attribuer un GPU à une VM (passthrough)", + "switchGpuMode": "Changer le mode du GPU (VM ↔ LXC)", + "createVm": "Créer une VM", + "createVmOverview": "Vue d’ensemble", + "createVmSystemNas": "Systèmes NAS", + "createVmSynology": "VM Synology", + "createVmNasOthers": "Autres systèmes NAS", + "createVmSystemWindows": "Systèmes Windows", + "createVmSystemLinux": "Systèmes Linux", + "diskManager": "Gestionnaire de disques", + "diskManagerOverview": "Vue d’ensemble", + "diskImportVm": "Importer un disque dans une VM", + "diskImportImageVm": "Importer une image disque dans une VM", + "diskAddController": "Ajouter un contrôleur ou un périphérique NVMe à une VM", + "diskImportLxc": "Importer un disque dans un LXC", + "diskFormat": "Formater ou effacer un disque physique", + "diskSmart": "État SMART et tests du disque", + "storageShareManager": "Gestion du stockage et des partages", + "storageShareOverview": "Vue d’ensemble", + "hostStorage": "Intégration du stockage à l’hôte", + "hostNfs": "Ajouter un partage NFS comme stockage Proxmox", + "hostSamba": "Ajouter un partage Samba comme stockage Proxmox", + "hostIscsi": "Ajouter une cible iSCSI comme stockage Proxmox", + "hostLocalDisk": "Ajouter un disque local comme stockage Proxmox", + "hostLocalShared": "Créer un répertoire partagé sur l’hôte", + "lxcMountPoints": "Points de montage LXC (hôte ↔ CT)", + "lxcNetworkSharing": "Partages réseau dans LXC", + "lxcNfsClient": "Client NFS dans LXC", + "lxcSambaClient": "Client Samba dans LXC", + "lxcNfsServer": "Serveur NFS dans LXC", + "lxcSambaServer": "Serveur Samba dans LXC", + "network": "Réseau", + "networkOverview": "Vue d’ensemble", + "networkDiagnostics": "Diagnostic", + "networkMonitoring": "Outils de surveillance en temps réel", + "networkBridge": "Analyse et réparation des ponts réseau", + "networkConfig": "Analyse et nettoyage de la configuration", + "networkPersistent": "Noms persistants des interfaces", + "networkBackup": "Sauvegarde et redémarrage des interfaces", + "security": "Sécurité", + "securityOverview": "Vue d’ensemble", + "securityFail2ban": "Fail2Ban", + "securityLynis": "Lynis", + "utilities": "Utilitaires", + "utilsOverview": "Vue d’ensemble", + "utilsUupDump": "Création d’ISO avec UUP Dump", + "utilsSystemUtils": "Installation d’utilitaires système", + "utilsSystemUpdate": "Mise à jour du système Proxmox", + "utilsUpgradePve": "Passer de PVE 8 à PVE 9", + "utilsExportVm": "Exporter une VM au format OVA/OVF", + "utilsImportVm": "Importer une VM depuis OVA/OVF", + "settingsProxmenux": "Paramètres de ProxMenux", + "settingsOverview": "Vue d’ensemble", + "settingsMonitor": "ProxMenux Monitor", + "settingsBeta": "Changer de canal de publication", + "settingsVersion": "Afficher les informations de version", + "settingsUninstall": "Désinstaller ProxMenux", + "commandsReference": "Référence des commandes", + "commandsOverview": "Vue d’ensemble", + "commandsSystem": "Commandes système utiles", + "commandsVmCt": "Gestion des VM et CT", + "commandsStorage": "Stockage et disques", + "commandsNetwork": "Commandes réseau", + "commandsUpdates": "Mises à jour et paquets", + "commandsGpu": "Passthrough GPU", + "commandsZfs": "Gestion de ZFS", + "commandsBackup": "Sauvegarde et restauration", + "commandsTools": "Outils système en ligne de commande", + "glossary": "Glossaire", + "about": "À propos", + "aboutOverview": "Vue d’ensemble", + "aboutFaq": "FAQ", + "aboutContributors": "Contributeurs", + "aboutContributing": "Contribuer", + "aboutCodeOfConduct": "Code de conduite", + "externalRepositories": "Dépôts externes", + "backupRestore": "Sauvegarde et restauration", + "backupRestoreOverview": "Vue d’ensemble", + "backupRestoreHowItWorks": "Fonctionnement", + "backupRestoreDestinations": "Destinations", + "backupRestoreDestOverview": "Vue d’ensemble", + "backupRestoreDestLocal": "Archive locale", + "backupRestoreDestPbs": "Proxmox Backup Server", + "backupRestoreDestBorg": "Borg", + "backupRestoreCreating": "Créer des sauvegardes", + "backupRestoreJobs": "Tâches planifiées", + "backupRestoreRestoring": "Restaurer", + "backupRestoreCrossKernel": "Restauration entre versions du noyau", + "backupRestoreGlossary": "Glossaire" + } + }, + "hero": { + "title": "ProxMenux", + "tagline": "Un menu interactif et un tableau de bord web pour Proxmox VE", + "description": "ProxMenux réunit un menu interactif et un tableau de bord web pour Proxmox VE. Exécutez des commandes, des scripts et des assistants depuis le terminal, ou consultez l’état de l’hôte, ses métriques et ses notifications dans un navigateur.", + "installButton": "Installer maintenant", + "whatIsButton": "Qu’est-ce que ProxMenux ?", + "logoAlt": "Logo ProxMenux" + }, + "docNav": { + "previous": "Précédent", + "next": "Suivant" + }, + "tocPanel": { + "onThisPage": "Sur cette page" + }, + "supportProject": { + "heading": "Soutenez le projet !", + "body": "Si ProxMenux vous est utile, donnez-lui une ⭐ sur GitHub pour aider d’autres personnes à le découvrir.", + "button": "Ajouter une étoile sur GitHub" + }, + "rssLink": { + "heading": "Suivez les nouveautés !", + "body": "Abonnez-vous à notre flux RSS pour être informé des nouveautés.", + "copy": "Copier", + "copied": "Copié !", + "copyTitle": "Copier l’URL du flux RSS", + "openFeed": "Ouvrir le flux RSS", + "openTitle": "Ouvrir le flux RSS" + }, + "changelog": { + "pageTitle": "Journal des modifications", + "meta": { + "title": "Journal des modifications de ProxMenux", + "titleSuffix": "Notes de version", + "latest": "Dernière version", + "mostRecent": "Version la plus récente", + "description": "Notes de version et historique des mises à jour de ProxMenux, le script à menus pour administrer Proxmox VE.", + "descriptionTail": "Nouvelles fonctionnalités, corrections de bugs, mises à jour de sécurité, améliorations de ProxMenux Monitor, compatibilité avec les fournisseurs d’IA, sécurisation du passthrough GPU et bien plus.", + "ogDescription": "Notes de version de ProxMenux.", + "ogTail": "Abonnez-vous au flux RSS ou revenez consulter les nouvelles versions." + } + } +} diff --git a/web/messages/it/common.json b/web/messages/it/common.json new file mode 100644 index 00000000..659c356d --- /dev/null +++ b/web/messages/it/common.json @@ -0,0 +1,254 @@ +{ + "site": { + "name": "ProxMenux", + "tagline": "Menu interattivo e dashboard web per Proxmox VE" + }, + "nav": { + "home": "Home", + "docs": "Documentazione", + "documentation": "Documentazione", + "guides": "Guide", + "changelog": "Registro delle modifiche", + "github": "GitHub", + "rss": "RSS", + "rssTitle": "Feed RSS", + "menuOpen": "Apri menu" + }, + "footer": { + "sponsorHeading": "Sostieni il progetto", + "sponsorBody": "Se desideri sostenere il progetto.", + "sponsorAlt": "Sostienimi su Ko-fi", + "connectHeading": "Community", + "connectBody": "Partecipa alle discussioni della community su GitHub per ricevere aiuto, condividere idee e contribuire al progetto. Ogni idea è benvenuta!", + "joinDiscussion": "Partecipa alla discussione", + "copyrightPrefix": "ProxMenux, un progetto collaborativo e open source di", + "copyrightSuffix": "." + }, + "language": { + "switcher": "Lingua", + "en": "English", + "es": "Español", + "sk": "Slovenčina", + "de": "Deutsch", + "fr": "Français", + "it": "Italiano", + "pt": "Português", + "sv": "Svenska" + }, + "resources": { + "documentation": { + "title": "Documentazione", + "description": "Descrizione del sistema e guide per l’utente" + }, + "changelog": { + "title": "Registro delle modifiche", + "description": "Informazioni sugli ultimi aggiornamenti" + }, + "guides": { + "title": "Guide", + "description": "Tutorial e guide passo passo per le attività più comuni" + }, + "github": { + "title": "Repository GitHub", + "description": "Esplora il codice sorgente." + } + }, + "docSidebar": { + "documentation": "Documentazione", + "items": { + "introduction": "Introduzione", + "installation": "Installazione", + "proxmenuxMonitor": "ProxMenux Monitor", + "monitorOverview": "Panoramica", + "architecture": "Architettura", + "accessAuth": "Accesso e autenticazione", + "dashboard": "Dashboard", + "dashboardSystemOverview": "Scheda Panoramica del sistema", + "dashboardApps": "Scheda App", + "dashboardStorage": "Scheda Archiviazione", + "dashboardNetwork": "Scheda Rete", + "dashboardVmsLxcs": "Scheda VM e LXC", + "dashboardVmsLxcsApp": "App", + "dashboardVmsLxcsUpdates": "Aggiornamenti", + "dashboardHardware": "Scheda Hardware", + "dashboardSystemLogs": "Scheda Log di sistema", + "dashboardTerminal": "Scheda Terminale", + "dashboardSecurity": "Scheda Sicurezza", + "dashboardSettings": "Scheda Impostazioni", + "healthMonitor": "Monitoraggio dello stato", + "auditReport": "Verifica e report", + "auditReportOverview": "Panoramica", + "auditReportAssessment": "Valutazione e inventario", + "auditReportPolicy": "Criteri", + "auditReportChanges": "Modifiche", + "auditReportReports": "Report e confronti", + "auditReportScope": "Ambito e garanzie", + "notifications": "Notifiche", + "aiAssistant": "Assistente IA", + "apiReference": "Riferimento API", + "integrations": "Integrazioni", + "ociManager": "OCI manager Apps", + "ociOverview": "Panoramica", + "ociArchitecture": "Come viene adattata un’immagine OCI", + "ociCustomImage": "Immagine non presente nel catalogo", + "ociStorageNetwork": "Dati, percorsi e rete", + "ociHardware": "Dispositivi e accelerazione", + "ociStacks": "Applicazioni con più container", + "ociLifecycle": "Installazione, aggiornamento e modifica", + "ociMonitor": "In ProxMenux Monitor", + "proxmenuxScripts": "ProxMenux Scripts", + "postInstallScript": "Script di post-installazione", + "postInstallOverview": "Panoramica", + "postInstallAutomated": "Automatico", + "postInstallCustomizable": "Personalizzabile", + "postInstallBasicSettings": "Impostazioni di base", + "postInstallSystem": "Sistema", + "postInstallVirtualization": "Virtualizzazione", + "postInstallNetwork": "Rete", + "postInstallStorage": "Archiviazione", + "postInstallSecurity": "Sicurezza", + "postInstallCustomization": "Personalizzazione", + "postInstallMonitoring": "Monitoraggio", + "postInstallPerformance": "Prestazioni", + "postInstallOptional": "Facoltativo", + "postInstallUpdates": "Applica gli aggiornamenti disponibili", + "postInstallUninstall": "Rimuovi le ottimizzazioni", + "gpusCoralTpu": "GPU e Coral TPU", + "nvidiaHost": "Installa i driver NVIDIA sull’host", + "coralHost": "Installa Coral TPU sull’host", + "addGpuLxc": "Abilita una GPU in un LXC", + "addCoralLxc": "Abilita Coral TPU in un LXC", + "addGpuVm": "Assegna una GPU a una VM (passthrough)", + "switchGpuMode": "Cambia modalità GPU (VM ↔ LXC)", + "createVm": "Crea una VM", + "createVmOverview": "Panoramica", + "createVmSystemNas": "Sistemi NAS", + "createVmSynology": "VM Synology", + "createVmNasOthers": "Altri sistemi NAS", + "createVmSystemWindows": "Sistemi Windows", + "createVmSystemLinux": "Sistemi Linux", + "diskManager": "Gestione dischi", + "diskManagerOverview": "Panoramica", + "diskImportVm": "Importa un disco in una VM", + "diskImportImageVm": "Importa un’immagine disco in una VM", + "diskAddController": "Aggiungi un controller o un dispositivo NVMe a una VM", + "diskImportLxc": "Importa un disco in un LXC", + "diskFormat": "Formatta o cancella un disco fisico", + "diskSmart": "Stato SMART e test del disco", + "storageShareManager": "Gestione archiviazione e condivisioni", + "storageShareOverview": "Panoramica", + "hostStorage": "Integrazione dell’archiviazione nell’host", + "hostNfs": "Aggiungi una condivisione NFS come storage Proxmox", + "hostSamba": "Aggiungi una condivisione Samba come storage Proxmox", + "hostIscsi": "Aggiungi una destinazione iSCSI come storage Proxmox", + "hostLocalDisk": "Aggiungi un disco locale come storage Proxmox", + "hostLocalShared": "Crea una directory condivisa sull’host", + "lxcMountPoints": "Punti di montaggio LXC (host ↔ CT)", + "lxcNetworkSharing": "Condivisioni di rete in LXC", + "lxcNfsClient": "Client NFS in LXC", + "lxcSambaClient": "Client Samba in LXC", + "lxcNfsServer": "Server NFS in LXC", + "lxcSambaServer": "Server Samba in LXC", + "network": "Rete", + "networkOverview": "Panoramica", + "networkDiagnostics": "Diagnostica", + "networkMonitoring": "Strumenti di monitoraggio in tempo reale", + "networkBridge": "Analisi e riparazione dei bridge di rete", + "networkConfig": "Analisi e pulizia della configurazione", + "networkPersistent": "Nomi persistenti delle interfacce", + "networkBackup": "Backup e riavvio delle interfacce", + "security": "Sicurezza", + "securityOverview": "Panoramica", + "securityFail2ban": "Fail2Ban", + "securityLynis": "Lynis", + "utilities": "Utilità", + "utilsOverview": "Panoramica", + "utilsUupDump": "Creazione di ISO con UUP Dump", + "utilsSystemUtils": "Installazione di utilità di sistema", + "utilsSystemUpdate": "Aggiornamento del sistema Proxmox", + "utilsUpgradePve": "Passaggio da PVE 8 a PVE 9", + "utilsExportVm": "Esporta una VM in OVA/OVF", + "utilsImportVm": "Importa una VM da OVA/OVF", + "settingsProxmenux": "Impostazioni di ProxMenux", + "settingsOverview": "Panoramica", + "settingsMonitor": "ProxMenux Monitor", + "settingsBeta": "Cambia canale di rilascio", + "settingsVersion": "Mostra informazioni sulla versione", + "settingsUninstall": "Disinstalla ProxMenux", + "commandsReference": "Riferimento dei comandi", + "commandsOverview": "Panoramica", + "commandsSystem": "Comandi di sistema utili", + "commandsVmCt": "Gestione di VM e CT", + "commandsStorage": "Archiviazione e dischi", + "commandsNetwork": "Comandi di rete", + "commandsUpdates": "Aggiornamenti e pacchetti", + "commandsGpu": "Passthrough GPU", + "commandsZfs": "Gestione di ZFS", + "commandsBackup": "Backup e ripristino", + "commandsTools": "Strumenti di sistema da riga di comando", + "glossary": "Glossario", + "about": "Informazioni sul progetto", + "aboutOverview": "Panoramica", + "aboutFaq": "FAQ", + "aboutContributors": "Collaboratori", + "aboutContributing": "Come contribuire", + "aboutCodeOfConduct": "Codice di condotta", + "externalRepositories": "Repository esterni", + "backupRestore": "Backup e ripristino", + "backupRestoreOverview": "Panoramica", + "backupRestoreHowItWorks": "Come funziona", + "backupRestoreDestinations": "Destinazioni", + "backupRestoreDestOverview": "Panoramica", + "backupRestoreDestLocal": "Archivio locale", + "backupRestoreDestPbs": "Proxmox Backup Server", + "backupRestoreDestBorg": "Borg", + "backupRestoreCreating": "Creare backup", + "backupRestoreJobs": "Attività pianificate", + "backupRestoreRestoring": "Ripristino", + "backupRestoreCrossKernel": "Ripristino tra versioni del kernel", + "backupRestoreGlossary": "Glossario" + } + }, + "hero": { + "title": "ProxMenux", + "tagline": "Un menu interattivo e una dashboard web per Proxmox VE", + "description": "ProxMenux unisce un menu interattivo e una dashboard web per Proxmox VE. Esegui comandi, script e procedure guidate dal terminale oppure controlla lo stato dell’host, le metriche e le notifiche dal browser.", + "installButton": "Installa ora", + "whatIsButton": "Che cos’è ProxMenux?", + "logoAlt": "Logo di ProxMenux" + }, + "docNav": { + "previous": "Precedente", + "next": "Successivo" + }, + "tocPanel": { + "onThisPage": "In questa pagina" + }, + "supportProject": { + "heading": "Sostieni il progetto!", + "body": "Se ProxMenux ti è utile, lascia una ⭐ su GitHub per aiutare altre persone a scoprirlo.", + "button": "Lascia una stella su GitHub" + }, + "rssLink": { + "heading": "Resta aggiornato!", + "body": "Iscriviti al feed RSS per ricevere le novità.", + "copy": "Copia", + "copied": "Copiato!", + "copyTitle": "Copia l’URL del feed RSS", + "openFeed": "Apri il feed RSS", + "openTitle": "Apri il feed RSS" + }, + "changelog": { + "pageTitle": "Registro delle modifiche", + "meta": { + "title": "Registro delle modifiche di ProxMenux", + "titleSuffix": "Note di rilascio", + "latest": "Ultima versione", + "mostRecent": "Versione più recente", + "description": "Note di rilascio e cronologia degli aggiornamenti di ProxMenux, lo script a menu per gestire Proxmox VE.", + "descriptionTail": "Nuove funzionalità, correzioni di bug, aggiornamenti di sicurezza, miglioramenti di ProxMenux Monitor, compatibilità con i fornitori IA, maggiore sicurezza del passthrough GPU e altro.", + "ogDescription": "Note di rilascio di ProxMenux.", + "ogTail": "Iscriviti al feed RSS o torna su questa pagina per le nuove versioni." + } + } +} diff --git a/web/messages/pt/common.json b/web/messages/pt/common.json new file mode 100644 index 00000000..a7cb872c --- /dev/null +++ b/web/messages/pt/common.json @@ -0,0 +1,254 @@ +{ + "site": { + "name": "ProxMenux", + "tagline": "Menu interativo e painel web para o Proxmox VE" + }, + "nav": { + "home": "Início", + "docs": "Documentação", + "documentation": "Documentação", + "guides": "Guias", + "changelog": "Histórico de alterações", + "github": "GitHub", + "rss": "RSS", + "rssTitle": "Feed RSS", + "menuOpen": "Abrir menu" + }, + "footer": { + "sponsorHeading": "Apoiar o projeto", + "sponsorBody": "Se quiser apoiar o projeto.", + "sponsorAlt": "Apoie-me no Ko-fi", + "connectHeading": "Comunidade", + "connectBody": "Participe nas discussões da comunidade no GitHub para obter ajuda, partilhar ideias e contribuir para o projeto. Todas as ideias são bem-vindas!", + "joinDiscussion": "Participar na discussão", + "copyrightPrefix": "ProxMenux, um projeto colaborativo e de código aberto criado por", + "copyrightSuffix": "." + }, + "language": { + "switcher": "Idioma", + "en": "English", + "es": "Español", + "sk": "Slovenčina", + "de": "Deutsch", + "fr": "Français", + "it": "Italiano", + "pt": "Português", + "sv": "Svenska" + }, + "resources": { + "documentation": { + "title": "Documentação", + "description": "Descrição do sistema e guias de utilização" + }, + "changelog": { + "title": "Histórico de alterações", + "description": "Informações sobre as últimas atualizações" + }, + "guides": { + "title": "Guias", + "description": "Tutoriais e guias passo a passo para tarefas comuns" + }, + "github": { + "title": "Repositório do GitHub", + "description": "Explore o código-fonte." + } + }, + "docSidebar": { + "documentation": "Documentação", + "items": { + "introduction": "Introdução", + "installation": "Instalação", + "proxmenuxMonitor": "ProxMenux Monitor", + "monitorOverview": "Visão geral", + "architecture": "Arquitetura", + "accessAuth": "Acesso e autenticação", + "dashboard": "Painel", + "dashboardSystemOverview": "Separador Visão geral do sistema", + "dashboardApps": "Separador Aplicações", + "dashboardStorage": "Separador Armazenamento", + "dashboardNetwork": "Separador Rede", + "dashboardVmsLxcs": "Separador VM e LXC", + "dashboardVmsLxcsApp": "Aplicação", + "dashboardVmsLxcsUpdates": "Atualizações", + "dashboardHardware": "Separador Hardware", + "dashboardSystemLogs": "Separador Registos do sistema", + "dashboardTerminal": "Separador Terminal", + "dashboardSecurity": "Separador Segurança", + "dashboardSettings": "Separador Definições", + "healthMonitor": "Monitor de estado", + "auditReport": "Auditoria e relatórios", + "auditReportOverview": "Visão geral", + "auditReportAssessment": "Avaliação e inventário", + "auditReportPolicy": "Política", + "auditReportChanges": "Alterações", + "auditReportReports": "Relatórios e comparações", + "auditReportScope": "Âmbito e garantias", + "notifications": "Notificações", + "aiAssistant": "Assistente de IA", + "apiReference": "Referência da API", + "integrations": "Integrações", + "ociManager": "OCI manager Apps", + "ociOverview": "Visão geral", + "ociArchitecture": "Como é adaptada uma imagem OCI", + "ociCustomImage": "Imagem fora do catálogo", + "ociStorageNetwork": "Dados, caminhos e rede", + "ociHardware": "Dispositivos e aceleração", + "ociStacks": "Aplicações com vários contentores", + "ociLifecycle": "Instalar, atualizar e modificar", + "ociMonitor": "No ProxMenux Monitor", + "proxmenuxScripts": "ProxMenux Scripts", + "postInstallScript": "Script de pós-instalação", + "postInstallOverview": "Visão geral", + "postInstallAutomated": "Automático", + "postInstallCustomizable": "Personalizável", + "postInstallBasicSettings": "Definições básicas", + "postInstallSystem": "Sistema", + "postInstallVirtualization": "Virtualização", + "postInstallNetwork": "Rede", + "postInstallStorage": "Armazenamento", + "postInstallSecurity": "Segurança", + "postInstallCustomization": "Personalização", + "postInstallMonitoring": "Monitorização", + "postInstallPerformance": "Desempenho", + "postInstallOptional": "Opcional", + "postInstallUpdates": "Aplicar as atualizações disponíveis", + "postInstallUninstall": "Remover otimizações", + "gpusCoralTpu": "GPU e Coral TPU", + "nvidiaHost": "Instalar controladores NVIDIA no host", + "coralHost": "Instalar Coral TPU no host", + "addGpuLxc": "Disponibilizar uma GPU num LXC", + "addCoralLxc": "Disponibilizar Coral TPU num LXC", + "addGpuVm": "Atribuir uma GPU a uma VM (passthrough)", + "switchGpuMode": "Alterar o modo da GPU (VM ↔ LXC)", + "createVm": "Criar uma VM", + "createVmOverview": "Visão geral", + "createVmSystemNas": "Sistemas NAS", + "createVmSynology": "VM Synology", + "createVmNasOthers": "Outros sistemas NAS", + "createVmSystemWindows": "Sistemas Windows", + "createVmSystemLinux": "Sistemas Linux", + "diskManager": "Gestor de discos", + "diskManagerOverview": "Visão geral", + "diskImportVm": "Importar um disco para uma VM", + "diskImportImageVm": "Importar uma imagem de disco para uma VM", + "diskAddController": "Adicionar um controlador ou dispositivo NVMe a uma VM", + "diskImportLxc": "Importar um disco para um LXC", + "diskFormat": "Formatar ou apagar um disco físico", + "diskSmart": "Estado SMART e testes do disco", + "storageShareManager": "Gestor de armazenamento e partilhas", + "storageShareOverview": "Visão geral", + "hostStorage": "Integração de armazenamento no host", + "hostNfs": "Adicionar uma partilha NFS como armazenamento do Proxmox", + "hostSamba": "Adicionar uma partilha Samba como armazenamento do Proxmox", + "hostIscsi": "Adicionar um destino iSCSI como armazenamento do Proxmox", + "hostLocalDisk": "Adicionar um disco local como armazenamento do Proxmox", + "hostLocalShared": "Criar um diretório partilhado no host", + "lxcMountPoints": "Pontos de montagem LXC (host ↔ CT)", + "lxcNetworkSharing": "Partilhas de rede em LXC", + "lxcNfsClient": "Cliente NFS em LXC", + "lxcSambaClient": "Cliente Samba em LXC", + "lxcNfsServer": "Servidor NFS em LXC", + "lxcSambaServer": "Servidor Samba em LXC", + "network": "Rede", + "networkOverview": "Visão geral", + "networkDiagnostics": "Diagnóstico", + "networkMonitoring": "Ferramentas de monitorização em tempo real", + "networkBridge": "Análise e reparação de bridges de rede", + "networkConfig": "Análise e limpeza da configuração", + "networkPersistent": "Nomes persistentes das interfaces", + "networkBackup": "Cópia de segurança e reinício das interfaces", + "security": "Segurança", + "securityOverview": "Visão geral", + "securityFail2ban": "Fail2Ban", + "securityLynis": "Lynis", + "utilities": "Utilitários", + "utilsOverview": "Visão geral", + "utilsUupDump": "Criação de ISO com UUP Dump", + "utilsSystemUtils": "Instalação de utilitários do sistema", + "utilsSystemUpdate": "Atualização do sistema Proxmox", + "utilsUpgradePve": "Atualizar do PVE 8 para o PVE 9", + "utilsExportVm": "Exportar uma VM para OVA/OVF", + "utilsImportVm": "Importar uma VM a partir de OVA/OVF", + "settingsProxmenux": "Definições do ProxMenux", + "settingsOverview": "Visão geral", + "settingsMonitor": "ProxMenux Monitor", + "settingsBeta": "Alterar o canal de versões", + "settingsVersion": "Mostrar informações da versão", + "settingsUninstall": "Desinstalar o ProxMenux", + "commandsReference": "Referência de comandos", + "commandsOverview": "Visão geral", + "commandsSystem": "Comandos úteis do sistema", + "commandsVmCt": "Gestão de VM e CT", + "commandsStorage": "Armazenamento e discos", + "commandsNetwork": "Comandos de rede", + "commandsUpdates": "Atualizações e pacotes", + "commandsGpu": "Passthrough de GPU", + "commandsZfs": "Gestão do ZFS", + "commandsBackup": "Cópia de segurança e restauro", + "commandsTools": "Ferramentas de sistema para a linha de comandos", + "glossary": "Glossário", + "about": "Sobre o projeto", + "aboutOverview": "Visão geral", + "aboutFaq": "FAQ", + "aboutContributors": "Colaboradores", + "aboutContributing": "Como contribuir", + "aboutCodeOfConduct": "Código de conduta", + "externalRepositories": "Repositórios externos", + "backupRestore": "Cópia de segurança e restauro", + "backupRestoreOverview": "Visão geral", + "backupRestoreHowItWorks": "Como funciona", + "backupRestoreDestinations": "Destinos", + "backupRestoreDestOverview": "Visão geral", + "backupRestoreDestLocal": "Arquivo local", + "backupRestoreDestPbs": "Proxmox Backup Server", + "backupRestoreDestBorg": "Borg", + "backupRestoreCreating": "Criar cópias de segurança", + "backupRestoreJobs": "Tarefas agendadas", + "backupRestoreRestoring": "Restaurar", + "backupRestoreCrossKernel": "Restauro entre versões do kernel", + "backupRestoreGlossary": "Glossário" + } + }, + "hero": { + "title": "ProxMenux", + "tagline": "Um menu interativo e um painel web para o Proxmox VE", + "description": "O ProxMenux reúne um menu interativo e um painel web para o Proxmox VE. Execute comandos, scripts e assistentes a partir do terminal ou consulte o estado do host, as métricas e as notificações no navegador.", + "installButton": "Instalar agora", + "whatIsButton": "O que é o ProxMenux?", + "logoAlt": "Logótipo do ProxMenux" + }, + "docNav": { + "previous": "Anterior", + "next": "Seguinte" + }, + "tocPanel": { + "onThisPage": "Nesta página" + }, + "supportProject": { + "heading": "Apoie o projeto!", + "body": "Se o ProxMenux lhe é útil, dê-lhe uma ⭐ no GitHub para ajudar outras pessoas a descobri-lo.", + "button": "Dar uma estrela no GitHub" + }, + "rssLink": { + "heading": "Acompanhe as novidades!", + "body": "Subscreva o feed RSS para receber as novidades.", + "copy": "Copiar", + "copied": "Copiado!", + "copyTitle": "Copiar o URL do feed RSS", + "openFeed": "Abrir o feed RSS", + "openTitle": "Abrir o feed RSS" + }, + "changelog": { + "pageTitle": "Histórico de alterações", + "meta": { + "title": "Histórico de alterações do ProxMenux", + "titleSuffix": "Notas da versão", + "latest": "Última versão", + "mostRecent": "Versão mais recente", + "description": "Notas de versão e histórico de atualizações do ProxMenux, o script com menus para gerir o Proxmox VE.", + "descriptionTail": "Novas funcionalidades, correções de erros, atualizações de segurança, melhorias do ProxMenux Monitor, compatibilidade com fornecedores de IA, reforço de segurança do passthrough de GPU e muito mais.", + "ogDescription": "Notas de versão do ProxMenux.", + "ogTail": "Subscreva o feed RSS ou volte a esta página para consultar novas versões." + } + } +} diff --git a/web/messages/sk/common.json b/web/messages/sk/common.json index 1c34e6b1..b95d8c96 100644 --- a/web/messages/sk/common.json +++ b/web/messages/sk/common.json @@ -28,7 +28,12 @@ "switcher": "Jazyk", "en": "English", "es": "Español", - "sk": "Slovenčina" + "sk": "Slovenčina", + "de": "Deutsch", + "fr": "Français", + "it": "Italiano", + "pt": "Português", + "sv": "Svenska" }, "resources": { "documentation": { @@ -193,7 +198,15 @@ "backupRestoreJobs": "Plánované úlohy", "backupRestoreRestoring": "Obnova", "backupRestoreCrossKernel": "Obnova medzi kernelmi", - "backupRestoreGlossary": "Slovník pojmov" + "backupRestoreGlossary": "Slovník pojmov", + "dashboardApps": "Karta Aplikácie", + "auditReport": "Audit a správy", + "auditReportOverview": "Prehľad", + "auditReportAssessment": "Hodnotenie a inventár", + "auditReportPolicy": "Pravidlá", + "auditReportChanges": "Zmeny", + "auditReportReports": "Správy a porovnania", + "auditReportScope": "Rozsah a záruky" } }, "hero": { diff --git a/web/messages/sk/docs/monitor/dashboard/vms-lxcs-app.json b/web/messages/sk/docs/monitor/dashboard/vms-lxcs-app.json index 8abc8a2b..551b00fc 100644 --- a/web/messages/sk/docs/monitor/dashboard/vms-lxcs-app.json +++ b/web/messages/sk/docs/monitor/dashboard/vms-lxcs-app.json @@ -98,7 +98,7 @@ ], "sourcesHeading": "Zdroje dostupnej verzie", "sources": [ - "GitHub repozitár: najnovšie vydanie alebo značka verejného repozitára vlastník/názov.", + "GitHub repozitár: najnovšie vydanie alebo značka verejného repozitára owner/name.", "HTTP JSON: verejný koncový bod a cesta ako data.version alebo releases[0].tag_name.", "Docker Hub: verzované značky filtrované regulárnym výrazom. Živý náhľad pred uložením ukáže skutočné zodpovedajúce značky.", "Pohyblivé značky ako latest, stable alebo lts neobsahujú verziu. Tieto obrazy sledujte podľa digestu v aktualizáciách Docker obrazov." diff --git a/web/messages/sk/docs/monitor/dashboard/vms-lxcs-updates.json b/web/messages/sk/docs/monitor/dashboard/vms-lxcs-updates.json index 7f4438f6..52331ccf 100644 --- a/web/messages/sk/docs/monitor/dashboard/vms-lxcs-updates.json +++ b/web/messages/sk/docs/monitor/dashboard/vms-lxcs-updates.json @@ -110,7 +110,7 @@ "Nepridávajte pct exec; ProxMenux už vstupuje do kontajnera a príkaz spúšťa ako root." ], "exampleLead": "Príklad úplného postupu v kontajneri:", - "example": "cd /opt/moja-aplikacia && ./update.sh", + "example": "cd /opt/my-app && ./update.sh", "callout": "Príkaz ako myapp --version iba číta verziu a nič neaktualizuje. Príkazy sa spúšťajú s oprávneniami správcu a musia sa kontrolovať ako príkazy shellu root." }, "bulk": { @@ -140,7 +140,7 @@ "items": [ "Vyberte predvoľbu alebo cron výraz a potom presné ciele: balíky OS, jednotlivé aplikácie, Docker Engine, samostatné jednotky Dockeru alebo skupiny služieb Compose.", "Oneskorenie po vydaní platí iba pre vybrané aplikácie so sledovaním verzie. Aplikácie bez sledovania spustia aktualizátor pri každom termíne.", - "Stav posledného behu rozlišuje úspech, čiastočné dokončenie, zlyhanie, bezpečnostné pozdržanie a stav bez čakajúcich aktualizácií.", + "Stav posledného behu rozlišuje úspech, čiastočné dokončenie, zlyhanie, bezpečnostné pozastavenie a žiadne čakajúce aktualizácie. Po prvom plánovanom behu otvorí Aktualizácie → Plánované aktualizácie → Zobraziť záznam celý výstup aktualizátora a podradených skriptov.", "Zistené externé plány Proxmox VE Helper-Scripts sa zobrazia samostatne, aby bola viditeľná prekrývajúca sa automatizácia." ], "callout": "Pred zapnutím plánu otestujte každú vybranú metódu manuálne. Plánovaný príkaz nemôže odpovedať na interaktívne otázky." diff --git a/web/messages/sv/common.json b/web/messages/sv/common.json new file mode 100644 index 00000000..658933e3 --- /dev/null +++ b/web/messages/sv/common.json @@ -0,0 +1,254 @@ +{ + "site": { + "name": "ProxMenux", + "tagline": "Interaktiv meny och webbaserad instrumentpanel för Proxmox VE" + }, + "nav": { + "home": "Start", + "docs": "Dokumentation", + "documentation": "Dokumentation", + "guides": "Guider", + "changelog": "Ändringslogg", + "github": "GitHub", + "rss": "RSS", + "rssTitle": "RSS-flöde", + "menuOpen": "Öppna meny" + }, + "footer": { + "sponsorHeading": "Stöd projektet", + "sponsorBody": "Om du vill stödja projektet.", + "sponsorAlt": "Stöd mig på Ko-fi", + "connectHeading": "Gemenskap", + "connectBody": "Delta i diskussionerna på GitHub för att få hjälp, dela idéer och bidra till projektet. Alla idéer är välkomna!", + "joinDiscussion": "Delta i diskussionen", + "copyrightPrefix": "ProxMenux, ett samarbetsprojekt med öppen källkod av", + "copyrightSuffix": "." + }, + "language": { + "switcher": "Språk", + "en": "English", + "es": "Español", + "sk": "Slovenčina", + "de": "Deutsch", + "fr": "Français", + "it": "Italiano", + "pt": "Português", + "sv": "Svenska" + }, + "resources": { + "documentation": { + "title": "Dokumentation", + "description": "Systembeskrivning och användarguider" + }, + "changelog": { + "title": "Ändringslogg", + "description": "Information om de senaste uppdateringarna" + }, + "guides": { + "title": "Guider", + "description": "Stegvisa instruktioner och guider för vanliga uppgifter" + }, + "github": { + "title": "GitHub-arkiv", + "description": "Utforska källkoden." + } + }, + "docSidebar": { + "documentation": "Dokumentation", + "items": { + "introduction": "Introduktion", + "installation": "Installation", + "proxmenuxMonitor": "ProxMenux Monitor", + "monitorOverview": "Översikt", + "architecture": "Arkitektur", + "accessAuth": "Åtkomst och autentisering", + "dashboard": "Instrumentpanel", + "dashboardSystemOverview": "Fliken Systemöversikt", + "dashboardApps": "Fliken Program", + "dashboardStorage": "Fliken Lagring", + "dashboardNetwork": "Fliken Nätverk", + "dashboardVmsLxcs": "Fliken VM och LXC", + "dashboardVmsLxcsApp": "Program", + "dashboardVmsLxcsUpdates": "Uppdateringar", + "dashboardHardware": "Fliken Maskinvara", + "dashboardSystemLogs": "Fliken Systemloggar", + "dashboardTerminal": "Fliken Terminal", + "dashboardSecurity": "Fliken Säkerhet", + "dashboardSettings": "Fliken Inställningar", + "healthMonitor": "Systemövervakning", + "auditReport": "Granskning och rapporter", + "auditReportOverview": "Översikt", + "auditReportAssessment": "Bedömning och inventering", + "auditReportPolicy": "Policy", + "auditReportChanges": "Ändringar", + "auditReportReports": "Rapporter och jämförelser", + "auditReportScope": "Omfattning och garantier", + "notifications": "Aviseringar", + "aiAssistant": "AI-assistent", + "apiReference": "API-referens", + "integrations": "Integrationer", + "ociManager": "OCI manager Apps", + "ociOverview": "Översikt", + "ociArchitecture": "Så anpassas en OCI-avbildning", + "ociCustomImage": "Avbildning utanför katalogen", + "ociStorageNetwork": "Data, sökvägar och nätverk", + "ociHardware": "Enheter och acceleration", + "ociStacks": "Program med flera containrar", + "ociLifecycle": "Installera, uppdatera och ändra", + "ociMonitor": "I ProxMenux Monitor", + "proxmenuxScripts": "ProxMenux Scripts", + "postInstallScript": "Skript efter installationen", + "postInstallOverview": "Översikt", + "postInstallAutomated": "Automatiskt", + "postInstallCustomizable": "Anpassningsbart", + "postInstallBasicSettings": "Grundinställningar", + "postInstallSystem": "System", + "postInstallVirtualization": "Virtualisering", + "postInstallNetwork": "Nätverk", + "postInstallStorage": "Lagring", + "postInstallSecurity": "Säkerhet", + "postInstallCustomization": "Anpassning", + "postInstallMonitoring": "Övervakning", + "postInstallPerformance": "Prestanda", + "postInstallOptional": "Valfritt", + "postInstallUpdates": "Installera tillgängliga uppdateringar", + "postInstallUninstall": "Ta bort optimeringar", + "gpusCoralTpu": "GPU och Coral TPU", + "nvidiaHost": "Installera NVIDIA-drivrutiner på värden", + "coralHost": "Installera Coral TPU på värden", + "addGpuLxc": "Gör en GPU tillgänglig i en LXC", + "addCoralLxc": "Gör Coral TPU tillgänglig i en LXC", + "addGpuVm": "Tilldela en GPU till en VM (passthrough)", + "switchGpuMode": "Byt GPU-läge (VM ↔ LXC)", + "createVm": "Skapa en VM", + "createVmOverview": "Översikt", + "createVmSystemNas": "NAS-system", + "createVmSynology": "Synology-VM", + "createVmNasOthers": "Andra NAS-system", + "createVmSystemWindows": "Windows-system", + "createVmSystemLinux": "Linux-system", + "diskManager": "Diskhantering", + "diskManagerOverview": "Översikt", + "diskImportVm": "Importera en disk till en VM", + "diskImportImageVm": "Importera en diskavbildning till en VM", + "diskAddController": "Lägg till en styrenhet eller NVMe-enhet i en VM", + "diskImportLxc": "Importera en disk till en LXC", + "diskFormat": "Formatera eller radera en fysisk disk", + "diskSmart": "SMART-status och disktester", + "storageShareManager": "Hantering av lagring och delningar", + "storageShareOverview": "Översikt", + "hostStorage": "Anslut lagring till värden", + "hostNfs": "Lägg till en NFS-delning som Proxmox-lagring", + "hostSamba": "Lägg till en Samba-delning som Proxmox-lagring", + "hostIscsi": "Lägg till ett iSCSI-mål som Proxmox-lagring", + "hostLocalDisk": "Lägg till en lokal disk som Proxmox-lagring", + "hostLocalShared": "Skapa en delad katalog på värden", + "lxcMountPoints": "LXC-monteringspunkter (värd ↔ CT)", + "lxcNetworkSharing": "Nätverksdelning i LXC", + "lxcNfsClient": "NFS-klient i LXC", + "lxcSambaClient": "Samba-klient i LXC", + "lxcNfsServer": "NFS-server i LXC", + "lxcSambaServer": "Samba-server i LXC", + "network": "Nätverk", + "networkOverview": "Översikt", + "networkDiagnostics": "Diagnostik", + "networkMonitoring": "Verktyg för övervakning i realtid", + "networkBridge": "Analysera och reparera nätverksbryggor", + "networkConfig": "Analysera och rensa konfigurationen", + "networkPersistent": "Beständiga gränssnittsnamn", + "networkBackup": "Säkerhetskopiera och starta om gränssnitt", + "security": "Säkerhet", + "securityOverview": "Översikt", + "securityFail2ban": "Fail2Ban", + "securityLynis": "Lynis", + "utilities": "Verktyg", + "utilsOverview": "Översikt", + "utilsUupDump": "Skapa ISO med UUP Dump", + "utilsSystemUtils": "Installera systemverktyg", + "utilsSystemUpdate": "Uppdatera Proxmox-systemet", + "utilsUpgradePve": "Uppgradera från PVE 8 till PVE 9", + "utilsExportVm": "Exportera en VM till OVA/OVF", + "utilsImportVm": "Importera en VM från OVA/OVF", + "settingsProxmenux": "ProxMenux-inställningar", + "settingsOverview": "Översikt", + "settingsMonitor": "ProxMenux Monitor", + "settingsBeta": "Byt versionskanal", + "settingsVersion": "Visa versionsinformation", + "settingsUninstall": "Avinstallera ProxMenux", + "commandsReference": "Kommandoreferens", + "commandsOverview": "Översikt", + "commandsSystem": "Användbara systemkommandon", + "commandsVmCt": "Hantera VM och CT", + "commandsStorage": "Lagring och diskar", + "commandsNetwork": "Nätverkskommandon", + "commandsUpdates": "Uppdateringar och paket", + "commandsGpu": "GPU-passthrough", + "commandsZfs": "Hantera ZFS", + "commandsBackup": "Säkerhetskopiering och återställning", + "commandsTools": "Systemverktyg för kommandoraden", + "glossary": "Ordlista", + "about": "Om projektet", + "aboutOverview": "Översikt", + "aboutFaq": "FAQ", + "aboutContributors": "Medverkande", + "aboutContributing": "Bidra", + "aboutCodeOfConduct": "Uppförandekod", + "externalRepositories": "Externa arkiv", + "backupRestore": "Säkerhetskopiering och återställning", + "backupRestoreOverview": "Översikt", + "backupRestoreHowItWorks": "Så fungerar det", + "backupRestoreDestinations": "Mål", + "backupRestoreDestOverview": "Översikt", + "backupRestoreDestLocal": "Lokalt arkiv", + "backupRestoreDestPbs": "Proxmox Backup Server", + "backupRestoreDestBorg": "Borg", + "backupRestoreCreating": "Skapa säkerhetskopior", + "backupRestoreJobs": "Schemalagda jobb", + "backupRestoreRestoring": "Återställning", + "backupRestoreCrossKernel": "Återställning mellan kärnversioner", + "backupRestoreGlossary": "Ordlista" + } + }, + "hero": { + "title": "ProxMenux", + "tagline": "En interaktiv meny och webbaserad instrumentpanel för Proxmox VE", + "description": "ProxMenux kombinerar en interaktiv meny med en webbaserad instrumentpanel för Proxmox VE. Kör kommandon, skript och guidade steg från terminalmenyn, eller följ värdens status, mätvärden och aviseringar i webbläsaren.", + "installButton": "Installera nu", + "whatIsButton": "Vad är ProxMenux?", + "logoAlt": "ProxMenux-logotyp" + }, + "docNav": { + "previous": "Föregående", + "next": "Nästa" + }, + "tocPanel": { + "onThisPage": "På den här sidan" + }, + "supportProject": { + "heading": "Stöd projektet!", + "body": "Om du har nytta av ProxMenux kan du ge projektet en ⭐ på GitHub så att fler upptäcker det.", + "button": "Ge en stjärna på GitHub" + }, + "rssLink": { + "heading": "Följ uppdateringarna!", + "body": "Prenumerera på vårt RSS-flöde för att få information om nyheter.", + "copy": "Kopiera", + "copied": "Kopierat!", + "copyTitle": "Kopiera RSS-adressen", + "openFeed": "Öppna RSS-flödet", + "openTitle": "Öppna RSS-flödet" + }, + "changelog": { + "pageTitle": "Ändringslogg", + "meta": { + "title": "Ändringslogg för ProxMenux", + "titleSuffix": "Versionsinformation", + "latest": "Senaste", + "mostRecent": "Senaste versionen", + "description": "Versionsinformation och uppdateringshistorik för ProxMenux, det menystyrda skriptet för administration av Proxmox VE.", + "descriptionTail": "Nya funktioner, felrättningar, säkerhetsuppdateringar, förbättringar i ProxMenux Monitor, stöd för AI-leverantörer, säkrare GPU-passthrough och mer.", + "ogDescription": "Versionsinformation för ProxMenux.", + "ogTail": "Prenumerera via RSS eller besök sidan igen för att se nya versioner." + } + } +} diff --git a/web/package.json b/web/package.json index ca3302cd..3996563d 100644 --- a/web/package.json +++ b/web/package.json @@ -4,10 +4,10 @@ "private": true, "scripts": { "dev": "next dev", - "build": "next build && pagefind --site out --output-path public/pagefind && cp -r public/pagefind out/pagefind", + "build": "next build && node scripts/localize-export.mjs && pagefind --site out --output-path public/pagefind && cp -r public/pagefind out/pagefind", "start": "next start", "lint": "next lint", - "index": "pagefind --site out --output-path public/pagefind && cp -r public/pagefind out/pagefind" + "index": "node scripts/localize-export.mjs && pagefind --site out --output-path public/pagefind && cp -r public/pagefind out/pagefind" }, "dependencies": { "@hookform/resolvers": "^3.9.1", diff --git a/web/scripts/localize-export.mjs b/web/scripts/localize-export.mjs new file mode 100644 index 00000000..89e7f221 --- /dev/null +++ b/web/scripts/localize-export.mjs @@ -0,0 +1,32 @@ +// Next's shared root layout cannot read its nested [locale] parameter. +// Set the static document language before Pagefind indexes the export, so +// search and no-JavaScript readers see the same locale as the hydrated app. +import { readdir, readFile, writeFile } from 'node:fs/promises' +import { join } from 'node:path' + +async function htmlFiles(directory) { + const entries = await readdir(directory, { withFileTypes: true }) + const files = await Promise.all(entries.map(entry => { + const path = join(directory, entry.name) + return entry.isDirectory() ? htmlFiles(path) : entry.isFile() && entry.name.endsWith('.html') ? [path] : [] + })) + return files.flat() +} + +let count = 0 +for (const entry of await readdir('out', { withFileTypes: true })) { + if (!entry.isDirectory() || !/^[a-z]{2}(?:-[a-z0-9]+)?$/.test(entry.name)) continue + const locale = entry.name + for (const file of await htmlFiles(join('out', locale))) { + const original = await readFile(file, 'utf8') + const updated = original.replace(/]*)>/i, (tag, attributes) => { + const next = /\blang\s*=\s*["'][^"']*["']/i.test(attributes) + ? attributes.replace(/\blang\s*=\s*["'][^"']*["']/i, `lang="${locale}"`) + : `${attributes} lang="${locale}"` + return `` + }) + if (updated !== original) await writeFile(file, updated, 'utf8') + count += 1 + } +} +console.log(`Static document language verified for ${count} localized pages.`) From efaeed370625d001f1820aa2524699a0aa806ea3 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:13:38 +0200 Subject: [PATCH 54/73] Keep Spanish networking docs aligned with the screen and the glossary - Quoted messages match the Spanish interface, and untranslated ones stay in English - backup and slot stay in English; iptraf-ng modes keep the program's own names --- web/messages/es/docs/network/backup-restore.json | 2 +- web/messages/es/docs/network/bridge-analysis.json | 6 +++--- web/messages/es/docs/network/config-analysis.json | 4 ++-- web/messages/es/docs/network/index.json | 8 ++++---- web/messages/es/docs/network/monitoring.json | 10 +++++----- web/messages/es/docs/network/persistent-names.json | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/web/messages/es/docs/network/backup-restore.json b/web/messages/es/docs/network/backup-restore.json index 75ead38d..c8759c70 100644 --- a/web/messages/es/docs/network/backup-restore.json +++ b/web/messages/es/docs/network/backup-restore.json @@ -27,7 +27,7 @@ "heading": "Crear backup de red", "body": "Copia el /etc/network/interfaces actual al directorio de backups con un timestamp nuevo. Ya está — sin análisis, sin prompts, solo un snapshot.", "whenTitle": "Cuándo hacer un backup manual", - "whenBody": "Antes de editar /etc/network/interfaces a mano, antes de instalar un paquete que pueda modificar la pila de red (p. ej. NetworkManager, Open vSwitch) o antes de cualquier cambio de hardware. Las reparaciones guiadas ya crean una copia automáticamente; esta opción es para las operaciones manuales." + "whenBody": "Antes de editar /etc/network/interfaces a mano, antes de instalar un paquete que pueda modificar la pila de red (p. ej. NetworkManager, Open vSwitch) o antes de cualquier cambio de hardware. Las reparaciones guiadas ya hacen un backup automáticamente; esta opción es para las operaciones manuales." }, "restore": { "heading": "Restaurar backup de red", diff --git a/web/messages/es/docs/network/bridge-analysis.json b/web/messages/es/docs/network/bridge-analysis.json index af1f211f..08511c30 100644 --- a/web/messages/es/docs/network/bridge-analysis.json +++ b/web/messages/es/docs/network/bridge-analysis.json @@ -35,7 +35,7 @@ "bridgeLabel": "Analizar (solo lectura)", "bridgeDetail": "ip link show enp3s0\n→ no existe", "targetLabel": "Informe + sugerencia", - "targetDetail": "❌ enp3s0: NO ENCONTRADA\nReemplazar por: eno1\n(aún sin cambios)" + "targetDetail": "❌ enp3s0: NO ENCONTRADO\nReemplazar por: eno1\n(aún sin cambios)" } }, "diagram2": { @@ -76,7 +76,7 @@ }, { "title": "3. Previsualizar los cambios propuestos", - "body": "Lista exactamente qué bridges se modificarán y qué sustituciones de puertos se harán. Si el análisis determina que no hay nada que reparar porque el puerto ha reaparecido entre las comprobaciones, el proceso termina con «No es necesario realizar cambios».", + "body": "Lista exactamente qué bridges se modificarán y qué sustituciones de puertos se harán. Si el análisis determina que no hay nada que reparar porque el puerto ha reaparecido entre las comprobaciones, el proceso termina con «No se necesitan cambios».", "tone": "blue" }, { @@ -99,7 +99,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "unsupportedTitle": "El análisis se detiene con «Pila de red no compatible»", + "unsupportedTitle": "El análisis se detiene con «Unsupported Network Stack»", "unsupportedBody": "El host usa netplan, systemd-networkd o NetworkManager. La herramienta solo admite /etc/network/interfaces. Cambia primero el host a la pila clásica o edita la configuración con las herramientas nativas del gestor (p. ej. netplan apply).", "noSuggestTitle": "No se imprime sugerencia para un puerto inválido", "noSuggestBody": "El host no tiene ninguna interfaz física libre (todas están ya en otro bridge o no existen). El análisis cae a sugerir bridge-ports none para que el bridge al menos pueda levantar sin puerto. Añade una NIC o migra puertos entre bridges manualmente antes de volver a ejecutar.", diff --git a/web/messages/es/docs/network/config-analysis.json b/web/messages/es/docs/network/config-analysis.json index 637b08f6..e04f23a2 100644 --- a/web/messages/es/docs/network/config-analysis.json +++ b/web/messages/es/docs/network/config-analysis.json @@ -60,7 +60,7 @@ }, { "title": "2. Confirmar la lista a eliminar", - "body": "Lista exactamente qué bloques de interfaz física se eliminarán. Si las NIC han reaparecido entre el análisis y la limpieza, por ejemplo al volver a insertar una tarjeta, el proceso termina con «No es necesaria ninguna limpieza».", + "body": "Lista exactamente qué bloques de interfaz física se eliminarán. Si las NIC han reaparecido entre el análisis y la limpieza, por ejemplo al volver a insertar una tarjeta, el proceso termina con «No se necesita limpieza».", "tone": "blue" }, { @@ -91,7 +91,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "notFoundTitle": "El análisis muestra mi NIC nueva como «NO ENCONTRADA»", + "notFoundTitle": "El análisis muestra mi NIC nueva como «NO ENCONTRADO»", "notFoundBody": "El kernel ve el dispositivo con un nombre distinto al que hay en el fichero. Ejecuta ip link show para obtener el nombre real. Este es exactamente el caso en el que Nombres persistentes de interfaz evitaría el problema de aquí en adelante.", "tooMuchTitle": "La limpieza eliminó demasiado (un bloque que quería conservar)", "tooMuchBody": "Restaura desde el backup impreso en el paso 5:", diff --git a/web/messages/es/docs/network/index.json b/web/messages/es/docs/network/index.json index 66c61ea1..07c20084 100644 --- a/web/messages/es/docs/network/index.json +++ b/web/messages/es/docs/network/index.json @@ -1,15 +1,15 @@ { "meta": { "title": "Gestión de red en Proxmox — bridges, bonds, diagnóstico, reparación | ProxMenux", - "description": "Diagnóstico de solo lectura, análisis con propuestas y reparaciones guiadas para la pila de red Debian / Proxmox (/etc/network/interfaces). Inspecciona bridges y bonds, ejecuta herramientas de monitorización en vivo, fija nombres de interfaz, crea copias de seguridad y reinicia la red de forma segura, con copias obligatorias y vistas previas paso a paso.", + "description": "Diagnóstico de solo lectura, análisis con propuestas y reparaciones guiadas para la pila de red Debian / Proxmox (/etc/network/interfaces). Inspecciona bridges y bonds, ejecuta herramientas de monitorización en vivo, fija nombres de interfaz, crea backups y reinicia la red de forma segura, con backups obligatorios y vistas previas paso a paso.", "ogTitle": "Gestión de red en Proxmox — bridges, bonds, diagnóstico, reparación", - "ogDescription": "Diagnóstico, análisis y reparaciones guiadas para la pila de red de Proxmox con copias de seguridad obligatorias y vistas previas paso a paso.", + "ogDescription": "Diagnóstico, análisis y reparaciones guiadas para la pila de red de Proxmox con backups obligatorios y vistas previas paso a paso.", "twitterTitle": "Gestión de red en Proxmox | ProxMenux", - "twitterDescription": "Bridges, bonds, diagnóstico y reparaciones guiadas para la pila de red de Proxmox con copias de seguridad obligatorias." + "twitterDescription": "Bridges, bonds, diagnóstico y reparaciones guiadas para la pila de red de Proxmox con backups obligatorios." }, "header": { "title": "Gestión de red", - "description": "Diagnóstico de solo lectura, informes de análisis con propuestas y reparaciones guiadas para la pila de red clásica de Debian/Proxmox. Cada operación destructiva crea primero una copia de seguridad y muestra los cambios exactos antes de aplicarlos.", + "description": "Diagnóstico de solo lectura, informes de análisis con propuestas y reparaciones guiadas para la pila de red clásica de Debian/Proxmox. Cada operación destructiva hace primero un backup y muestra los cambios exactos antes de aplicarlos.", "section": "Red" }, "intro": { diff --git a/web/messages/es/docs/network/monitoring.json b/web/messages/es/docs/network/monitoring.json index d2d6c671..5a04cbfb 100644 --- a/web/messages/es/docs/network/monitoring.json +++ b/web/messages/es/docs/network/monitoring.json @@ -48,23 +48,23 @@ "headerUseFor": "Úsalo para", "rows": [ { - "mode": "Monitor de tráfico IP", + "mode": "IP traffic monitor", "useFor": "Lista en vivo de flujos TCP / UDP / ICMP / otro-IP con contadores de bytes y estado de conexión" }, { - "mode": "Estadísticas generales de interfaces", + "mode": "General interface stats", "useFor": "Conteos agregados de paquetes IPv4 / IPv6 / TCP / UDP / ICMP / no-IP por NIC" }, { - "mode": "Estadísticas de interfaz detalladas", + "mode": "Detailed interface stats", "useFor": "Igual que arriba pero para una interfaz, con detalle de tamaño y tasa de paquetes" }, { - "mode": "Desglose estadístico", + "mode": "Statistical breakdowns", "useFor": "Histograma de distribución de tamaño de paquete, por puerto TCP / UDP" }, { - "mode": "Monitor de estaciones LAN", + "mode": "LAN station monitor", "useFor": "Estadísticas de tráfico por MAC del dominio de broadcast local" } ], diff --git a/web/messages/es/docs/network/persistent-names.json b/web/messages/es/docs/network/persistent-names.json index c6c4de2a..5859a0ff 100644 --- a/web/messages/es/docs/network/persistent-names.json +++ b/web/messages/es/docs/network/persistent-names.json @@ -16,7 +16,7 @@ }, "problem": { "heading": "El problema que resuelve", - "intro": "Linux obtiene los nombres de interfaz predeterminados a partir de la topología PCI: eno1 = integrada en placa, enp3s0 = la tarjeta en el bus PCI 3, ranura 0, etc. El esquema de nombres es determinista con la misma disposición de hardware. Si cambia la disposición, cambian los nombres:", + "intro": "Linux obtiene los nombres de interfaz predeterminados a partir de la topología PCI: eno1 = integrada en placa, enp3s0 = la tarjeta en el bus PCI 3, slot 0, etc. El esquema de nombres es determinista con la misma disposición de hardware. Si cambia la disposición, cambian los nombres:", "items": [ "Añade una GPU delante de una NIC existente → el número de bus de la NIC puede cambiar → el nombre cambia.", "Mueve una tarjeta a otro slot PCIe → el nombre cambia.", @@ -87,7 +87,7 @@ "intro": "Si /etc/systemd/network/ ya contiene ficheros .link (de una ejecución anterior u otra herramienta), se copian a un directorio de backup con timestamp antes de generar los nuevos:", "outro": "Para hacer rollback: copia los ficheros desde el directorio de backup y reinicia.", "rebootTitle": "Tiene efecto en el siguiente reinicio, no inmediatamente", - "rebootBody": "Los cambios en ficheros .link solo se aplican en el arranque, cuando udev vuelve a enumerar los dispositivos. Por eso la herramienta indica «Los cambios se aplicarán tras reiniciar». No intenta renombrar una interfaz en vivo por el riesgo que supone: un vmbr0 activo con interfaces miembro tendría que reconfigurarse de forma atómica, así que la operación se aplaza al siguiente arranque limpio." + "rebootBody": "Los cambios en ficheros .link solo se aplican en el arranque, cuando udev vuelve a enumerar los dispositivos. Por eso la herramienta indica «Los cambios se aplicarán después del reinicio». No intenta renombrar una interfaz en vivo por el riesgo que supone: un vmbr0 activo con interfaces miembro tendría que reconfigurarse de forma atómica, así que la operación se aplaza al siguiente arranque limpio." }, "afterReboot": { "heading": "Tras el reinicio", @@ -100,7 +100,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "emptyTitle": "«No se han encontrado interfaces físicas» tras ejecutar la herramienta", + "emptyTitle": "«No se encontraron interfaces físicas» tras ejecutar la herramienta", "emptyBody": "El host no tiene interfaces respaldadas por PCI / phy80211 visibles para el kernel. Confirma con ls -l /sys/class/net/ — cada entrada debería tener un symlink device (PCI) o una entrada phy80211 (Wi-Fi). Si faltan ambos para lo que debería ser una NIC real, el driver no está cargado.", "noChangeTitle": "Tras el reinicio, los nombres no han cambiado como esperaba", "noChangeBody": "Comprueba que el fichero está presente y bien formado: cat /etc/systemd/network/10-<iface>.link. Después mira los logs de udev: journalctl -u systemd-udevd -b | grep -i link. Una causa habitual es un parámetro de kernel net.ifnames=0 residual que deshabilita el naming predictivo por completo — quítalo de /etc/default/grub, ejecuta update-grub y reinicia.", From f6d3ad4337a85e198334d66bff71acb88becced2 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:15:58 +0200 Subject: [PATCH 55/73] Keep security docs aligned with the screen - Lynis output stays as the program prints it, in every language - The Spanish HTTPS steps use the Monitor's button names --- web/messages/de/docs/security/lynis.json | 2 +- web/messages/es/docs/security/lynis.json | 2 +- web/messages/es/docs/security/ssl-letsencrypt.json | 2 +- web/messages/fr/docs/security/lynis.json | 2 +- web/messages/it/docs/security/lynis.json | 2 +- web/messages/pt/docs/security/lynis.json | 2 +- web/messages/sk/docs/security/lynis.json | 2 +- web/messages/sv/docs/security/lynis.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/messages/de/docs/security/lynis.json b/web/messages/de/docs/security/lynis.json index 42c5b8bd..36545875 100644 --- a/web/messages/de/docs/security/lynis.json +++ b/web/messages/de/docs/security/lynis.json @@ -66,7 +66,7 @@ "intro": "Wählen Sie im Verwaltungsmenü Sicherheitsprüfung jetzt ausführen. Das entspricht folgendem Aufruf :", "code": "lynis audit system --no-colors", "outro": "Die Prüfung dauert je nach Hostgröße 30 Sekunden bis einige Minuten. Die Ausgabe erscheint direkt im Terminal, ohne Warteanimation. Lynis gliedert die Prüfungen nach Kategorien und kennzeichnet Tests mit [ OK ], [ WARNING ] oder [ SUGGESTION ]. Die abschließende Zusammenfassung enthält die wichtigsten Zahlen :", - "summary": "================================================================================\n\n Details der Lynis-Sicherheitsprüfung:\n\n Härtungsindex : 76 [############ ]\n Durchgeführte Tests : 247\n Aktivierte Plugins : 0\n\n Komponenten:\n - Firewall [V]\n - Malware-Scanner [X]\n\n Lynis-Module:\n - Konformitätsstatus [?]\n - Sicherheitsprüfung [V]\n - Schwachstellenprüfung [V]\n\n================================================================================" + "summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================" }, "report": { "heading": "Lesen Sie den Bericht", diff --git a/web/messages/es/docs/security/lynis.json b/web/messages/es/docs/security/lynis.json index 452dad31..d5387aa7 100644 --- a/web/messages/es/docs/security/lynis.json +++ b/web/messages/es/docs/security/lynis.json @@ -66,7 +66,7 @@ "intro": "En el menú de gestión, elige Ejecutar auditoría de seguridad ahora. Equivale a ejecutar:", "code": "lynis audit system --no-colors", "outro": "La auditoría tarda de 30 segundos a varios minutos según el tamaño del host. La salida se muestra directamente en el terminal, sin indicador giratorio. Lynis organiza los controles por categoría y marca cada prueba como [ OK ], [ WARNING ] o [ SUGGESTION ]. El resumen final muestra las cifras principales:", - "summary": "================================================================================\n\n Detalles del análisis de seguridad de Lynis:\n\n Índice de refuerzo : 76 [############ ]\n Pruebas realizadas : 247\n Plugins habilitados : 0\n\n Componentes:\n - Cortafuegos [V]\n - Escáner de malware [X]\n\n Módulos de Lynis:\n - Estado de cumplimiento [?]\n - Auditoría de seguridad [V]\n - Análisis de vulnerabilidades [V]\n\n================================================================================" + "summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================" }, "report": { "heading": "Leer el informe", diff --git a/web/messages/es/docs/security/ssl-letsencrypt.json b/web/messages/es/docs/security/ssl-letsencrypt.json index 0e97809e..f7710e7a 100644 --- a/web/messages/es/docs/security/ssl-letsencrypt.json +++ b/web/messages/es/docs/security/ssl-letsencrypt.json @@ -160,7 +160,7 @@ }, "disable": { "heading": "Deshabilitar HTTPS", - "bodyRich": "Pulsa Desactivar HTTPS en el mismo panel. Monitor reinicia con HTTP sin cifrar, útil si un certificado personalizado no se puede leer y el servicio no arranca. No hay otra desinstalación y los archivos de certificado no se modifican.", + "bodyRich": "Pulsa Deshabilitar HTTPS en el mismo panel. Monitor reinicia con HTTP sin cifrar, útil si un certificado personalizado no se puede leer y el servicio no arranca. No hay otra desinstalación y los archivos de certificado no se modifican.", "stateCallout": { "title": "Dónde se guarda el estado", "bodyRich": "/etc/proxmenux/ssl_config.json almacena las rutas de certificado activas y la fuente (none, proxmox, custom). Borrar el archivo equivale a deshabilitar HTTPS — en el siguiente arranque el Monitor recae en HTTP." diff --git a/web/messages/fr/docs/security/lynis.json b/web/messages/fr/docs/security/lynis.json index 0444e96d..5b9a5b43 100644 --- a/web/messages/fr/docs/security/lynis.json +++ b/web/messages/fr/docs/security/lynis.json @@ -66,7 +66,7 @@ "intro": "Dans le menu de gestion, choisissez Lancer l'audit de sécurité maintenant. Cela revient à exécuter :", "code": "lynis audit system --no-colors", "outro": "L'audit prend de 30 secondes à quelques minutes selon la taille de l'hôte. La sortie apparaît directement dans le terminal, sans animation d'attente. Lynis classe les contrôles par catégorie et marque chaque test [ OK ], [ WARNING ] ou [ SUGGESTION ]. Le résumé final affiche les chiffres principaux :", - "summary": "================================================================================\n\n Détails de l’audit de sécurité Lynis:\n\n Indice de durcissement : 76 [############ ]\n Tests effectués : 247\n Plugins activés : 0\n\n Composants:\n - Pare-feu [V]\n - Analyseur de logiciels malveillants [X]\n\n Modules Lynis:\n - État de conformité [?]\n - Audit de sécurité [V]\n - Analyse de vulnérabilités [V]\n\n================================================================================" + "summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================" }, "report": { "heading": "Lire le rapport", diff --git a/web/messages/it/docs/security/lynis.json b/web/messages/it/docs/security/lynis.json index bf23305b..35cc85c1 100644 --- a/web/messages/it/docs/security/lynis.json +++ b/web/messages/it/docs/security/lynis.json @@ -66,7 +66,7 @@ "intro": "Dal menu di gestione scegli Esegui audit di sicurezza ora. Equivale a eseguire:", "code": "lynis audit system --no-colors", "outro": "L'audit richiede da 30 secondi ad alcuni minuti secondo le dimensioni dell'host. Lo output viene mostrato direttamente nel terminale, senza animazione di attesa. Lynis organizza i controlli per categoria e marca ogni test come [ OK ], [ WARNING ] o [ SUGGESTION ]. Il riepilogo finale mostra i dati principali:", - "summary": "================================================================================\n\n Dettagli della scansione di sicurezza Lynis:\n\n Indice di rafforzamento : 76 [############ ]\n Test eseguiti : 247\n Plugin abilitati : 0\n\n Componenti:\n - Firewall [V]\n - Scanner malware [X]\n\n Moduli Lynis:\n - Stato di conformità [?]\n - Audit di sicurezza [V]\n - Scansione vulnerabilità [V]\n\n================================================================================" + "summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================" }, "report": { "heading": "Leggere il rapporto", diff --git a/web/messages/pt/docs/security/lynis.json b/web/messages/pt/docs/security/lynis.json index 6b019ae9..4054e6b4 100644 --- a/web/messages/pt/docs/security/lynis.json +++ b/web/messages/pt/docs/security/lynis.json @@ -66,7 +66,7 @@ "intro": "No menu de gestão escolha Executar auditoria de segurança agora. Equivale a executar:", "code": "lynis audit system --no-colors", "outro": "A auditoria demora de 30 segundos a alguns minutos conforme a dimensão do anfitrião. A saída aparece diretamente no terminal, sem animação de espera. Lynis organiza os controlos por categoria e marca cada teste como [ OK ], [ WARNING ] ou [ SUGGESTION ]. O resumo final apresenta os números principais:", - "summary": "================================================================================\n\n Detalhes da análise de segurança Lynis:\n\n Índice de reforço : 76 [############ ]\n Testes realizados : 247\n Plugins ativados : 0\n\n Componentes:\n - Firewall [V]\n - Analisador de malware [X]\n\n Módulos Lynis:\n - Estado de conformidade [?]\n - Auditoria de segurança [V]\n - Análise de vulnerabilidades [V]\n\n================================================================================" + "summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================" }, "report": { "heading": "Ler o relatório", diff --git a/web/messages/sk/docs/security/lynis.json b/web/messages/sk/docs/security/lynis.json index c010cf27..41bd07bc 100644 --- a/web/messages/sk/docs/security/lynis.json +++ b/web/messages/sk/docs/security/lynis.json @@ -66,7 +66,7 @@ "intro": "V menu správy vyberte Spustiť bezpečnostný audit teraz. Zodpovedá to spusteniu:", "code": "lynis audit system --no-colors", "outro": "Audit trvá od 30 sekúnd do niekoľkých minút podľa veľkosti hostiteľa. Výstup ide priamo do terminálu bez animácie čakania. Lynis člení kontroly podľa kategórií a každý test označí ako [ OK ], [ WARNING ] alebo [ SUGGESTION ]. Záverečné zhrnutie ukazuje hlavné údaje:", - "summary": "================================================================================\n\n Podrobnosti bezpečnostného auditu Lynis:\n\n Index zabezpečenia : 76 [############ ]\n Vykonané testy : 247\n Povolené doplnky : 0\n\n Komponenty:\n - Firewall [V]\n - Skener škodlivého softvéru [X]\n\n Moduly Lynis:\n - Stav súladu [?]\n - Bezpečnostný audit [V]\n - Kontrola zraniteľností [V]\n\n================================================================================" + "summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================" }, "report": { "heading": "Čítanie správy", diff --git a/web/messages/sv/docs/security/lynis.json b/web/messages/sv/docs/security/lynis.json index 2eb520b4..55e58af0 100644 --- a/web/messages/sv/docs/security/lynis.json +++ b/web/messages/sv/docs/security/lynis.json @@ -66,7 +66,7 @@ "intro": "Välj Kör säkerhetsgranskning nu i hanteringsmenyn. Det motsvarar att köra:", "code": "lynis audit system --no-colors", "outro": "Granskningen tar 30 sekunder till några minuter beroende på värdens storlek. Utdata visas direkt i terminalen utan väntanimation. Lynis grupperar kontroller efter kategori och märker varje test med [ OK ], [ WARNING ] eller [ SUGGESTION ]. Slutets sammanfattning visar de viktigaste siffrorna:", - "summary": "================================================================================\n\n Detaljer för Lynis säkerhetsgranskning:\n\n Härdningsindex : 76 [############ ]\n Utförda tester : 247\n Aktiverade insticksmoduler : 0\n\n Komponenter:\n - Brandvägg [V]\n - Skanner för skadlig kod [X]\n\n Lynis-moduler:\n - Efterlevnadsstatus [?]\n - Säkerhetsgranskning [V]\n - Sårbarhetsgranskning [V]\n\n================================================================================" + "summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================" }, "report": { "heading": "Läsa rapporten", From 3e9ac6750bce3875c79cf6f7f318ffebc4df8700 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:16:10 +0200 Subject: [PATCH 56/73] Keep iptraf-ng mode names as the program shows them in every language --- web/messages/de/docs/network/monitoring.json | 10 +++++----- web/messages/fr/docs/network/monitoring.json | 10 +++++----- web/messages/it/docs/network/monitoring.json | 10 +++++----- web/messages/pt/docs/network/monitoring.json | 10 +++++----- web/messages/sk/docs/network/monitoring.json | 10 +++++----- web/messages/sv/docs/network/monitoring.json | 10 +++++----- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/web/messages/de/docs/network/monitoring.json b/web/messages/de/docs/network/monitoring.json index c0be503f..908aee12 100644 --- a/web/messages/de/docs/network/monitoring.json +++ b/web/messages/de/docs/network/monitoring.json @@ -48,23 +48,23 @@ "headerUseFor": "Verwenden Sie es für", "rows": [ { - "mode": "IP-Verkehrsmonitor", + "mode": "IP traffic monitor", "useFor": "Live TCP / UDP/ICMP / Other-IP-Flow-Liste mit Byte-Zählern und Verbindungszustand" }, { - "mode": "Allgemeine Schnittstellenstatistiken", + "mode": "General interface stats", "useFor": "Aggregierte IPv4/IPv6/TCP/UDP/ICMP/Nicht-IP-Paketzahl pro NIC" }, { - "mode": "Detaillierte Schnittstellenstatistiken", + "mode": "Detailed interface stats", "useFor": "Gleiche wie oben, aber für eine Schnittstelle, mit Paketgröße und -rate Details" }, { - "mode": "Statistische Aufgliederungen", + "mode": "Statistical breakdowns", "useFor": "Histogramm der Paketgrößenverteilung nach TCP / UDP Port" }, { - "mode": "LAN-Stationenmonitor", + "mode": "LAN station monitor", "useFor": "Per-MAC-Verkehrsstatistiken für die lokale Broadcast-Domain" } ], diff --git a/web/messages/fr/docs/network/monitoring.json b/web/messages/fr/docs/network/monitoring.json index d81420cb..33f652a2 100644 --- a/web/messages/fr/docs/network/monitoring.json +++ b/web/messages/fr/docs/network/monitoring.json @@ -48,23 +48,23 @@ "headerUseFor": "Utilisez-le pour", "rows": [ { - "mode": "Surveillance du trafic IP", + "mode": "IP traffic monitor", "useFor": "Liste de flux en direct TCP / UDP / ICMP / autre-IP avec compteurs d'octets et état de connexion" }, { - "mode": "Statistiques générales de l'interface", + "mode": "General interface stats", "useFor": "Nombre total de paquets IPv4 / IPv6 / TCP / UDP / ICMP / non IP par carte réseau" }, { - "mode": "Statistiques détaillées de l'interface", + "mode": "Detailed interface stats", "useFor": "Comme ci-dessus, mais pour une interface, avec la taille du paquet et le détail du taux" }, { - "mode": "Ventilations statistiques", + "mode": "Statistical breakdowns", "useFor": "Histogramme de distribution de la taille du paquet, par port TCP / UDP" }, { - "mode": "Moniteur de station LAN", + "mode": "LAN station monitor", "useFor": "Statistiques du trafic par adresse MAC pour le domaine de diffusion local" } ], diff --git a/web/messages/it/docs/network/monitoring.json b/web/messages/it/docs/network/monitoring.json index 3474dec7..1998637f 100644 --- a/web/messages/it/docs/network/monitoring.json +++ b/web/messages/it/docs/network/monitoring.json @@ -48,23 +48,23 @@ "headerUseFor": "Usalo per", "rows": [ { - "mode": "Monitor di traffico IP", + "mode": "IP traffic monitor", "useFor": "Elenco in tempo reale dei flussi TCP / UDP / ICMP / altri protocolli IP con contatori di byte e stato della connessione" }, { - "mode": "Statistiche generali delle interfacce", + "mode": "General interface stats", "useFor": "Conteggi aggregati dei pacchetti IPv4 / IPv6 / TCP / UDP / ICMP / non IP per scheda di rete" }, { - "mode": "Statistiche dettagliate dell’interfaccia", + "mode": "Detailed interface stats", "useFor": "Come sopra, ma per una sola interfaccia, con dettagli sulle dimensioni e sulla frequenza dei pacchetti" }, { - "mode": "Ripartizioni statistiche", + "mode": "Statistical breakdowns", "useFor": "Istogramma della distribuzione delle dimensioni dei pacchetti, per porta TCP / UDP" }, { - "mode": "Monitor della stazione LAN", + "mode": "LAN station monitor", "useFor": "Per-MAC statistiche del traffico per il dominio broadcast locale" } ], diff --git a/web/messages/pt/docs/network/monitoring.json b/web/messages/pt/docs/network/monitoring.json index c1e8307b..4f279fae 100644 --- a/web/messages/pt/docs/network/monitoring.json +++ b/web/messages/pt/docs/network/monitoring.json @@ -48,23 +48,23 @@ "headerUseFor": "Use-o para", "rows": [ { - "mode": "Monitor de tráfego IP", + "mode": "IP traffic monitor", "useFor": "Lista em tempo real de fluxos TCP / UDP / ICMP / outros protocolos IP, com contadores de bytes e estado da ligação" }, { - "mode": "Estatísticas gerais da interface", + "mode": "General interface stats", "useFor": "Contagens agregadas de pacotes IPv4 / IPv6 / TCP / UDP / ICMP / não IP por placa de rede" }, { - "mode": "Estatísticas de interface detalhadas", + "mode": "Detailed interface stats", "useFor": "O mesmo que acima, mas para uma interface, com tamanho de pacote e detalhe de taxa" }, { - "mode": "Desagregações estatísticas", + "mode": "Statistical breakdowns", "useFor": "Histograma de distribuição do tamanho do pacote, por porta TCP / UDP" }, { - "mode": "Monitor de estação LAN", + "mode": "LAN station monitor", "useFor": "Estatísticas de tráfego por MAC para o domínio de transmissão local" } ], diff --git a/web/messages/sk/docs/network/monitoring.json b/web/messages/sk/docs/network/monitoring.json index 6038905a..e46d34d3 100644 --- a/web/messages/sk/docs/network/monitoring.json +++ b/web/messages/sk/docs/network/monitoring.json @@ -48,23 +48,23 @@ "headerUseFor": "Použiť pre", "rows": [ { - "mode": "Monitor prevádzky IP", + "mode": "IP traffic monitor", "useFor": "Zoznam tokov TCP / UDP / ICMP / iných protokolov IP v reálnom čase s počítadlami bajtov a stavom pripojenia" }, { - "mode": "Všeobecné štatistiky rozhraní", + "mode": "General interface stats", "useFor": "Súhrnný počet paketov IPv4 / IPv6 / TCP / UDP / ICMP / non-IP paketov na sieťovú kartu" }, { - "mode": "Podrobné štatistiky rozhrania", + "mode": "Detailed interface stats", "useFor": "Rovnaké ako vyššie, ale pre jedno rozhranie, s podrobnosťami o veľkosti a rýchlosti paketov" }, { - "mode": "Štatistické členenia", + "mode": "Statistical breakdowns", "useFor": "Histogram rozdelenia veľkosti paketov podľa portu TCP / UDP" }, { - "mode": "Monitor stanice LAN", + "mode": "LAN station monitor", "useFor": "Štatistiky prevádzky podľa MAC adresy pre lokálnu broadcastovú doménu" } ], diff --git a/web/messages/sv/docs/network/monitoring.json b/web/messages/sv/docs/network/monitoring.json index 6ef3b059..e09a8e9b 100644 --- a/web/messages/sv/docs/network/monitoring.json +++ b/web/messages/sv/docs/network/monitoring.json @@ -48,23 +48,23 @@ "headerUseFor": "Använd den för", "rows": [ { - "mode": "IP trafikövervakning", + "mode": "IP traffic monitor", "useFor": "Lista i realtid över TCP-/UDP-/ICMP-/övriga IP-flöden med byteräknare och anslutningstillstånd" }, { - "mode": "Allmän gränssnittsstatistik", + "mode": "General interface stats", "useFor": "Samlat antal IPv4-/IPv6-/TCP-/UDP-/ICMP-/icke-IP-paket per nätverkskort" }, { - "mode": "Detaljerad gränssnittsstatistik", + "mode": "Detailed interface stats", "useFor": "Samma som ovan men för ett gränssnitt, med paketstorlek och hastighetsdetalj" }, { - "mode": "Statistisk fördelning", + "mode": "Statistical breakdowns", "useFor": "Histogram över paketstorleksfördelningen per TCP-/UDP-port" }, { - "mode": "Övervakning av LAN-stationer", + "mode": "LAN station monitor", "useFor": "Per-MAC trafikstatistik för den lokala sändningsdomänen" } ], From fc5884cdc11624165d0195d07636a8ed8a78f028 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:18:20 +0200 Subject: [PATCH 57/73] Keep Spanish OCI manager docs aligned with the screen and the glossary - Backups of containers and host storage are called backup - The watchdog is named vigilancia, as in the menu and the Monitor - The Monitor tabs keep their names App and Logs --- .../es/docs/oci-manager/architecture.json | 2 +- .../es/docs/oci-manager/custom-image.json | 4 ++-- web/messages/es/docs/oci-manager/index.json | 4 ++-- web/messages/es/docs/oci-manager/monitor.json | 6 +++--- .../es/docs/oci-manager/storage-network.json | 18 +++++++++--------- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/web/messages/es/docs/oci-manager/architecture.json b/web/messages/es/docs/oci-manager/architecture.json index 75094840..1a65c74f 100644 --- a/web/messages/es/docs/oci-manager/architecture.json +++ b/web/messages/es/docs/oci-manager/architecture.json @@ -163,7 +163,7 @@ } }, { - "p": "mp0 es un segundo disco que pertenece al contenedor, con el nombre vm-VMID-disk-N en el almacenamiento seleccionado. Se monta en /config y, con backup=1, se incluye en la copia de seguridad del contenedor. mp1 no crea ningún disco: monta el directorio del host /srv/downloads en /downloads dentro del LXC. El puerto 8080 no se mapea: el LXC tiene su propia dirección y el servicio responde en ella." + "p": "mp0 es un segundo disco que pertenece al contenedor, con el nombre vm-VMID-disk-N en el almacenamiento seleccionado. Se monta en /config y, con backup=1, forma parte del backup del contenedor. mp1 no crea ningún disco: monta el directorio del host /srv/downloads en /downloads dentro del LXC. El puerto 8080 no se mapea: el LXC tiene su propia dirección y el servicio responde en ella." } ] } diff --git a/web/messages/es/docs/oci-manager/custom-image.json b/web/messages/es/docs/oci-manager/custom-image.json index c1f9642d..ed75b621 100644 --- a/web/messages/es/docs/oci-manager/custom-image.json +++ b/web/messages/es/docs/oci-manager/custom-image.json @@ -232,7 +232,7 @@ }, { "title": "Instalar y mantener al día", - "body": "Esa cuenta se utiliza para descargar la imagen durante la instalación y también en las actualizaciones, Modificar, Recrear, el watchdog y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster." + "body": "Esa cuenta se utiliza para descargar la imagen durante la instalación y también en las actualizaciones, Modificar, Recrear, la vigilancia y la comprobación de actualizaciones del Monitor, en cualquier nodo del clúster." } ] } @@ -252,7 +252,7 @@ { "calloutInfo": { "title": "Dónde se guardan las cuentas", - "body": "En /etc/pve/priv/proxmenux/registry-auth.json, accesible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de almacenamiento. /etc/pve se comparte entre los nodos del clúster, de modo que una cuenta añadida en un nodo se utiliza en todos. La copia del host incluye ese archivo y desinstalar ProxMenux lo elimina de todos los nodos." + "body": "En /etc/pve/priv/proxmenux/registry-auth.json, accesible solo por root, en la misma carpeta donde Proxmox guarda las contraseñas de almacenamiento. /etc/pve se comparte entre los nodos del clúster, de modo que una cuenta añadida en un nodo se utiliza en todos. El backup del host incluye ese archivo y desinstalar ProxMenux lo elimina de todos los nodos." } } ] diff --git a/web/messages/es/docs/oci-manager/index.json b/web/messages/es/docs/oci-manager/index.json index 8eef2329..635b395f 100644 --- a/web/messages/es/docs/oci-manager/index.json +++ b/web/messages/es/docs/oci-manager/index.json @@ -79,7 +79,7 @@ "p": "OCI manager Apps mantiene la etiqueta Technology Preview que Proxmox VE asigna a los contenedores de aplicaciones creados a partir de imágenes OCI, cuyo soporte se introdujo en Proxmox VE 9.1. La etiqueta se refiere a la tecnología sobre la que funciona OCI manager Apps, no al motor de ProxMenux: el comportamiento de estos contenedores puede cambiar entre versiones de Proxmox VE. Se mantendrá hasta que Proxmox VE considere estable ese soporte." }, { - "p": "El motor de OCI manager Apps se prueba en el laboratorio de ProxMenux: instalación, actualización, modificación, recreación, copias de seguridad, restauración, migración y watchdog. Cada aplicación se verifica por separado. Las que se han probado realmente muestran Verificado y llevan un ✓ en las listas." + "p": "El motor de OCI manager Apps se prueba en el laboratorio de ProxMenux: instalación, actualización, modificación, recreación, backups, restauración, migración y vigilancia. Cada aplicación se verifica por separado. Las que se han probado realmente muestran Verificado y llevan un ✓ en las listas." } ] }, @@ -103,7 +103,7 @@ [ "Conservar la configuración", "volumes: /config", - "Un volumen persistente mpN incluido en la copia de seguridad, o bien un directorio del host." + "Un volumen persistente mpN incluido en el backup, o bien un directorio del host." ], [ "Publicar el servicio", diff --git a/web/messages/es/docs/oci-manager/monitor.json b/web/messages/es/docs/oci-manager/monitor.json index aae9c49f..72701fb7 100644 --- a/web/messages/es/docs/oci-manager/monitor.json +++ b/web/messages/es/docs/oci-manager/monitor.json @@ -30,7 +30,7 @@ "Un interruptor Vigilancia bajo Iniciar al arrancar: la aplicación se inicia de nuevo cuando se detiene sola" ], [ - "Aplicación", + "App", "La aplicación se identifica desde el registro y sus actualizaciones se siguen por la imagen" ], [ @@ -42,7 +42,7 @@ "Discos del contenedor y directorios del host, con su uso" ], [ - "Registros", + "Logs", "Solo en contenedores OCI: la salida de consola de la aplicación" ] ] @@ -150,7 +150,7 @@ }, { "id": "logs", - "title": "Registros", + "title": "Logs", "intro": "La pestaña Logs solo aparece en los contenedores instalados por OCI manager Apps, entre Montajes y Backups. Muestra la salida estándar y de errores del proceso principal de la imagen, la misma que muestra docker logs en un contenedor Docker.", "blocks": [ { diff --git a/web/messages/es/docs/oci-manager/storage-network.json b/web/messages/es/docs/oci-manager/storage-network.json index 554e3f91..5884786e 100644 --- a/web/messages/es/docs/oci-manager/storage-network.json +++ b/web/messages/es/docs/oci-manager/storage-network.json @@ -75,7 +75,7 @@ "mpN: /mnt/oci-shared/media,mp=/data/media" ], [ - "Copia del contenedor (vzdump)", + "Backup del contenedor (vzdump)", "Incluido, con backup=1", "No incluido" ], @@ -123,7 +123,7 @@ } }, { - "p": "Una actualización o recreación solo sustituye el rootfs: mp0 conserva usuarios, bibliotecas y ajustes, y mp1 sigue mostrando los mismos archivos multimedia. Al restaurar la copia del CT se recupera /config; si hace falta restaurar el directorio multimedia, se utiliza la copia de seguridad del almacenamiento del host." + "p": "Una actualización o recreación solo sustituye el rootfs: mp0 conserva usuarios, bibliotecas y ajustes, y mp1 sigue mostrando los mismos archivos multimedia. Al restaurar el backup del CT se recupera /config; si hace falta restaurar el directorio multimedia, se utiliza el backup del almacenamiento del host." }, { "flow": { @@ -261,30 +261,30 @@ }, { "id": "backup", - "title": "Qué contiene una copia del contenedor", + "title": "Qué contiene el backup de un contenedor", "blocks": [ { "table": { "headers": [ "Elemento", - "En la copia vzdump del CT", + "En el backup vzdump del CT", "Dónde se conserva" ], "rows": [ [ "Rootfs OCI", "Sí", - "En la copia del CT; también se puede reconstruir a partir de la imagen y el contrato" + "En el backup del CT; también se puede reconstruir a partir de la imagen y el contrato" ], [ "Disco del contenedor con backup=1", "Sí", - "La copia del CT" + "El backup del CT" ], [ "Directorio del host", "No", - "La copia de seguridad del almacenamiento del host" + "El backup del almacenamiento del host" ], [ "Contrato de la instancia", @@ -293,8 +293,8 @@ ], [ "Aplicación con varios contenedores", - "Cada miembro en su propia copia", - "Las copias de todos los miembros, más el contrato de la pila y su puente de red en el host" + "Cada miembro en su propio backup", + "Los backups de todos los miembros, más el contrato de la pila y su puente de red en el host" ] ] } From b6bce3cae4bcd59b96575973e3741c9f2d2ec4c1 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:19:12 +0200 Subject: [PATCH 58/73] Keep Spanish project information aligned with the screen and the glossary - The uninstaller is reached from Ajustes, as the Spanish menu shows - Backups are called backup; GitHub Discussions keeps its name --- web/messages/es/docs/about/contributing.json | 2 +- web/messages/es/docs/about/faq.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web/messages/es/docs/about/contributing.json b/web/messages/es/docs/about/contributing.json index 5ac006ce..f5090e22 100644 --- a/web/messages/es/docs/about/contributing.json +++ b/web/messages/es/docs/about/contributing.json @@ -163,7 +163,7 @@ }, { "function": "msg_success \"text\"", - "whenRich": "Mensaje final «Pulsa Intro para volver» al terminar la fase 2.", + "whenRich": "Mensaje final «Press Enter to return» al terminar la fase 2.", "spinner": "Para" }, { diff --git a/web/messages/es/docs/about/faq.json b/web/messages/es/docs/about/faq.json index 834d8ffa..c6d9252d 100644 --- a/web/messages/es/docs/about/faq.json +++ b/web/messages/es/docs/about/faq.json @@ -19,7 +19,7 @@ "uninstallLabel": "Desinstalación", "uninstallSuffix": " — eliminación limpia.", "issuesLabel": "GitHub Issues", - "discussionsLabel": "Discusiones" + "discussionsLabel": "Discussions" }, "q1": { "question": "¿Qué es ProxMenux y para qué sirve?", @@ -75,7 +75,7 @@ "item2Rich": "El árbol de scripts en /usr/local/share/proxmenux/.", "item3Rich": "El lanzador en /usr/local/bin/menu.", "item4Rich": "Opcional: el servicio systemd del Monitor en proxmenux-monitor.service.", - "p2Rich": "ProxMenux no modifica la configuración principal de Proxmox salvo que lo solicites expresamente desde un menú específico. Por ejemplo, la reparación de red edita /etc/network/interfaces, pero solo después de tu confirmación y de crear una copia de seguridad." + "p2Rich": "ProxMenux no modifica la configuración principal de Proxmox salvo que lo solicites expresamente desde un menú específico. Por ejemplo, la reparación de red edita /etc/network/interfaces, pero solo después de tu confirmación y de hacer un backup." }, "q9": { "question": "¿Es seguro usar ProxMenux en producción?", @@ -83,7 +83,7 @@ }, "q10": { "question": "¿Cómo desinstalo ProxMenux?", - "p1Rich": "Desde ProxMenux: Configuración → Desinstalar ProxMenux. El desinstalador elimina el árbol de scripts, el lanzador y el servicio Monitor, permite eliminar dependencias seleccionadas y restaura /root/.bashrc y /etc/motd desde las copias de la instalación, si existen.", + "p1Rich": "Desde ProxMenux: Ajustes → Desinstalar ProxMenux. El desinstalador elimina el árbol de scripts, el lanzador y el servicio Monitor, permite eliminar dependencias seleccionadas y restaura /root/.bashrc y /etc/motd desde los backups hechos al instalar, si existen.", "p2Rich": "Paso a paso completo: Desinstalar ProxMenux." }, "q11": { From 36a8e84491ccc26f932838bd7708ef0f9ce50aeb Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sun, 18 Oct 2026 13:37:18 +0200 Subject: [PATCH 59/73] Update common.json --- AppImage/messages/es/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppImage/messages/es/common.json b/AppImage/messages/es/common.json index 02a4260b..91a29007 100644 --- a/AppImage/messages/es/common.json +++ b/AppImage/messages/es/common.json @@ -2673,7 +2673,7 @@ "expires": "Vence", "selfSignedWarning": "Los certificados autofirmados pueden mostrar una advertencia en el navegador. Esto es normal para las configuraciones locales de Proxmox.", "configuring": "Configurando...", - "useProxmoxCertificate": "Utilice el certificado Proxmox", + "useProxmoxCertificate": "Usar certificado de Proxmox", "noProxmoxCertificate": "No se detectó ningún certificado Proxmox.", "useCustomCertificate": "Usar certificado personalizado", "customPaths": "Rutas de certificados personalizadas", From 3756a6de9ac6ae7103f32206e8e9341b2dc7c728 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:43:52 +0200 Subject: [PATCH 60/73] Keep Spanish disk manager docs aligned with the screen - Format modes, dialogs and error messages use the names the Spanish menu shows --- .../es/docs/disk-manager/add-controller-nvme-vm.json | 2 +- web/messages/es/docs/disk-manager/format-disk.json | 12 ++++++------ .../es/docs/disk-manager/import-disk-image-vm.json | 4 ++-- .../es/docs/disk-manager/import-disk-lxc.json | 2 +- .../es/docs/disk-manager/import-disk-vm.json | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/web/messages/es/docs/disk-manager/add-controller-nvme-vm.json b/web/messages/es/docs/disk-manager/add-controller-nvme-vm.json index 0c2a9cf6..7be436cb 100644 --- a/web/messages/es/docs/disk-manager/add-controller-nvme-vm.json +++ b/web/messages/es/docs/disk-manager/add-controller-nvme-vm.json @@ -55,7 +55,7 @@ "outro": "Es necesario reiniciar después de este cambio. El script te pide reiniciar ahora o más tarde; el passthrough no puede continuar hasta que la nueva cmdline del kernel esté activa.", "img": "/disk/nvme-passthrough/iommu-warning.png", "alt": "Diálogo que indica que se requiere IOMMU", - "caption": "IOMMU requerido: propuesta de habilitarlo y reiniciar" + "caption": "Se requiere IOMMU: propuesta de habilitarlo y reiniciar" }, { "title": "Enumeración de dispositivos", diff --git a/web/messages/es/docs/disk-manager/format-disk.json b/web/messages/es/docs/disk-manager/format-disk.json index 24c7099b..a9bd4009 100644 --- a/web/messages/es/docs/disk-manager/format-disk.json +++ b/web/messages/es/docs/disk-manager/format-disk.json @@ -49,13 +49,13 @@ "useCase": "Eliminar las particiones y los metadatos para preparar una nueva distribución. No sobrescribe todos los datos de usuario." }, { - "mode": "2. Quitar etiquetas FS", + "mode": "2. Borrar firmas FS", "part": "Preservada", "data": "Preservados", - "useCase": "Elimina firmas antiguas de ZFS / LVM / RAID para evitar que el disco se reclame automáticamente. No sobrescribe los datos de usuario en bloque, pero quitar las firmas puede dejarlos inaccesibles." + "useCase": "Elimina firmas antiguas de ZFS / LVM / RAID para evitar que el disco se reclame automáticamente. No sobrescribe los datos de usuario en bloque, pero borrar las firmas puede dejarlos inaccesibles." }, { - "mode": "3. Sobrescribir los datos con ceros", + "mode": "3. Poner a cero", "part": "Preservada", "data": "Destruidos (sobrescritos con ceros)", "useCase": "Sobrescribir con ceros las particiones existentes conservando la tabla de particiones. No cubre el espacio sin asignar ni las áreas de reserva de los SSD; no garantiza el saneamiento completo del dispositivo." @@ -67,7 +67,7 @@ "useCase": "Disco listo para usar con una única partición nueva y un filesystem fresco." } ], - "fullFormatOutro": "Formateo completo continúa con dos diálogos más:", + "fullFormatOutro": "Formato completo continúa con dos diálogos más:", "fullFormatItems": [ "Filesystem — ext4, xfs, exfat (portable) o btrfs. Si faltan herramientas (por ejemplo mkfs.btrfs) aborta con un mensaje claro.", "Etiqueta — etiqueta opcional del filesystem para identificación." @@ -83,10 +83,10 @@ }, { "title": "Elige un modo de operación", - "bodyRich": "Elige entre Borrar todo, Quitar etiquetas FS, Sobrescribir los datos con ceros o Formateo completo según la tabla anterior." + "bodyRich": "Elige entre Borrar todo, Borrar firmas FS, Poner a cero o Formato completo según la tabla anterior." }, { - "title": "(Solo formateo completo) Elegir sistema de archivos y etiqueta", + "title": "(Solo Formato completo) Elegir sistema de archivos y etiqueta", "body": "ext4 / xfs / exfat / btrfs, más una etiqueta opcional." }, { diff --git a/web/messages/es/docs/disk-manager/import-disk-image-vm.json b/web/messages/es/docs/disk-manager/import-disk-image-vm.json index 998b0ab8..6457ccb1 100644 --- a/web/messages/es/docs/disk-manager/import-disk-image-vm.json +++ b/web/messages/es/docs/disk-manager/import-disk-image-vm.json @@ -53,7 +53,7 @@ "items": [ "Interfaz — scsi (por defecto), virtio, sata o ide. Determina cómo verá el disco el guest.", "Emulación SSD: solo se ofrece para interfaces que no sean VirtIO. Añade ssd=1 para que el invitado reconozca un disco de estado sólido. La compatibilidad con discard/TRIM debe configurarse aparte.", - "De arranque: si eliges sí, ProxMenux añade el disco al orden de arranque como dispositivo principal de la VM." + "Disco de arranque: si eliges sí, ProxMenux añade el disco al orden de arranque como dispositivo principal de la VM." ] }, { @@ -70,7 +70,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "noImagesTitle": "\"No se encuentran imágenes de disco compatibles\"", + "noImagesTitle": "\"No se encontraron imágenes de disco compatibles\"", "noImagesBody": "El script escaneó el directorio pero no encontró ningún archivo .img / .qcow2 / .vmdk / .raw. Comprueba la extensión (las mayúsculas importan), que el archivo esté directamente en el directorio seleccionado (no se buscan subdirectorios) y que los permisos permitan a root leerlo.", "slowTitle": "La importación va lenta", "slowBody": "Las conversiones entre VMDK, QCOW2 y raw pueden estar limitadas por CPU y E/S. La velocidad depende de la lectura del origen, la escritura del destino y la descompresión necesaria. Prefiere fuentes raw o qcow2 cuando sea posible.", diff --git a/web/messages/es/docs/disk-manager/import-disk-lxc.json b/web/messages/es/docs/disk-manager/import-disk-lxc.json index a68417d0..2edff1e8 100644 --- a/web/messages/es/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/es/docs/disk-manager/import-disk-lxc.json @@ -82,7 +82,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "unprivTitle": "\"No puede continuar con un contenedor no privilegiado\"", + "unprivTitle": "\"No se puede continuar con un contenedor no privilegiado\"", "unprivBody": "Rechazaste la conversión. La opción de /etc/pve/lxc/<CTID>.conf cambia de unprivileged: 1 a unprivileged: 0, pero eso por sí solo no convierte los UID/GID de los archivos existentes. Haz una copia y resuelve el mapeo de propietarios antes de aceptar una conversión in situ; como alternativa, restaura o recrea el contenedor como privilegiado.", "permsTitle": "Los permisos dentro del contenedor están mal", "permsBody": "Al montar una partición en un contenedor privilegiado se conserva la propiedad existente; un sistema de archivos recién formateado suele pertenecer a root:root. Si el servicio usa otro usuario, por ejemplo www-data para Nextcloud, comprueba su UID/GID y ajusta los archivos necesarios con chown/chmod. Los cambios afectan también al disco subyacente." diff --git a/web/messages/es/docs/disk-manager/import-disk-vm.json b/web/messages/es/docs/disk-manager/import-disk-vm.json index c0082215..7f594292 100644 --- a/web/messages/es/docs/disk-manager/import-disk-vm.json +++ b/web/messages/es/docs/disk-manager/import-disk-vm.json @@ -69,7 +69,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "noDisksTitle": "\"No hay discos disponibles para este VM\"", + "noDisksTitle": "\"No hay discos disponibles para esta máquina virtual\"", "noDisksIntro": "El script encontró discos, pero todos los candidatos se filtraron. Razones comunes:", "noDisksItems": [ "Cada disco restante ya está referenciado en la config de la VM destino.", From 85bf3b8584fea0a5a56f8e691ad10a3f984c7b78 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:43:53 +0200 Subject: [PATCH 61/73] Keep Spanish storage sharing docs aligned with the screen and the glossary - Error messages match the Spanish interface - Destructive actions use eliminar --- web/messages/es/docs/storage-share/host-local-disk.json | 2 +- web/messages/es/docs/storage-share/host-nfs.json | 4 ++-- web/messages/es/docs/storage-share/host-samba.json | 4 ++-- web/messages/es/docs/storage-share/lxc-mount-points.json | 4 ++-- web/messages/es/docs/storage-share/lxc-samba-client.json | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/messages/es/docs/storage-share/host-local-disk.json b/web/messages/es/docs/storage-share/host-local-disk.json index d1c16832..d07de410 100644 --- a/web/messages/es/docs/storage-share/host-local-disk.json +++ b/web/messages/es/docs/storage-share/host-local-disk.json @@ -147,7 +147,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "noDisksTitle": "\"No hay discos disponibles encontrados\"", + "noDisksTitle": "\"No se encontraron discos disponibles\"", "noDisksIntro": "El filtro de seguridad ocultó cada disco. Razones comunes:", "noDisksItems": [ "Solo está presente el disco raíz.", diff --git a/web/messages/es/docs/storage-share/host-nfs.json b/web/messages/es/docs/storage-share/host-nfs.json index 14655926..47a046c4 100644 --- a/web/messages/es/docs/storage-share/host-nfs.json +++ b/web/messages/es/docs/storage-share/host-nfs.json @@ -138,14 +138,14 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "noServersTitle": "\"Ningún servidor NFS encontrado en la red\"", + "noServersTitle": "\"No se encontraron servidores NFS en la red\"", "noServersBody": "El auto-descubrimiento usa nmap -p 2049 --open <subnet>/24. El servidor puede no responder si: está en una VLAN / subnet diferente, su firewall bloquea las sondas nmap (muchos lo hacen) o el puerto 2049 está intencionalmente cerrado en esa interfaz. Usa la opción Manual con la IP o hostname del servidor en su lugar.", "portTitle": "«El puerto NFS (2049) no es accesible»", "portBody": "El ping tuvo éxito pero nc -z -w 3 <server> 2049 falló. Comprueba que el servicio NFS está corriendo en el servidor (systemctl status nfs-server en Linux, Panel de Control → File Services en Synology, plugin NFS en OMV / TrueNAS) y que el firewall permite el 2049 desde el host Proxmox.", "showmountTitle": "\"Failed to connect\" desde showmount", "showmountBody": "El servidor rechazó la consulta de la lista de exports. Causas comunes: el servidor aplica ACLs de cliente estrictas (tu IP de Proxmox no está en la lista permitida), rpcbind no está corriendo en el servidor o el servidor expone solo NFSv4 con showmount deshabilitado. La ruta del export se puede añadir manualmente igualmente si la conoces.", "inactiveTitle": "El almacenamiento aparece como inactive en la UI de Proxmox", - "inactiveBody": "Ejecuta Probar conectividad NFS para revisar DNS, puertos y acceso al montaje. Si la conectividad funciona pero sigue inactivo, consulta journalctl -u pvestatd y la configuración del servidor/export. Corrige primero la conectividad o los permisos. pvesm set <id> --disable 0 habilita un almacenamiento deshabilitado; no repara fallos NFS en general.", + "inactiveBody": "Ejecuta Probar la conectividad NFS para revisar DNS, puertos y acceso al montaje. Si la conectividad funciona pero sigue inactivo, consulta journalctl -u pvestatd y la configuración del servidor/export. Corrige primero la conectividad o los permisos. pvesm set <id> --disable 0 habilita un almacenamiento deshabilitado; no repara fallos NFS en general.", "lxcNoWriteTitle": "El montaje fstab funciona pero un LXC unprivileged no puede escribir por un bind mount", "lxcNoWriteBody": "El acceso NFS depende de propiedad, ACL y squash en el servidor. Las opciones CIFS como uid= y file_mode= no se aplican a NFS. Con el mapeo LXC predeterminado, root del CT se convierte en UID 100000 del host, no en UID remoto 0. Da acceso al UID/GID mapeado real o a la identidad anónima del servidor. no_root_squash solo afecta al UID remoto 0, por lo que no resuelve todos los casos de UID 100000. El script intenta chmod 1777, pero no anula permisos del servidor.", "fstabBootTitle": "El montaje fstab no se levanta tras el reinicio", diff --git a/web/messages/es/docs/storage-share/host-samba.json b/web/messages/es/docs/storage-share/host-samba.json index da5b9ad9..051f995d 100644 --- a/web/messages/es/docs/storage-share/host-samba.json +++ b/web/messages/es/docs/storage-share/host-samba.json @@ -126,7 +126,7 @@ }, "remove": { "heading": "Eliminar almacenamiento CIFS o montaje del host", - "body": "El selector ofrece almacenamientos pvesm y montajes fstab del host. Para pvesm ejecuta pvesm remove <storage-id> y Proxmox borra las credenciales asociadas. Para fstab intenta umount <path>, elimina la entrada de /etc/fstab y las credenciales de /etc/samba/credentials/, y quita el directorio de montaje si está vacío. Si falla el desmontaje, debes hacerlo manualmente o reiniciar. No modifica el servidor Samba remoto ni sus archivos.", + "body": "El selector ofrece almacenamientos pvesm y montajes fstab del host. Para pvesm ejecuta pvesm remove <storage-id> y Proxmox borra las credenciales asociadas. Para fstab intenta umount <path>, elimina la entrada de /etc/fstab y las credenciales de /etc/samba/credentials/, y elimina el directorio de montaje si está vacío. Si falla el desmontaje, debes hacerlo manualmente o reiniciar. No modifica el servidor Samba remoto ni sus archivos.", "warnTitle": "Haz backup de las dependencias primero", "warnBody": "Las VMs, CTs o trabajos de backup que referencien este almacenamiento por ID fallarán tras la eliminación. Mueve / elimina esas referencias antes de eliminar el almacenamiento." }, @@ -136,7 +136,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "noServersTitle": "\"No hay servidores Samba encontrados en la red\"", + "noServersTitle": "\"No se encontraron servidores Samba en la red\"", "noServersBody": "El auto-descubrimiento usa nmap -p 139,445. El servidor puede estar en una subnet diferente, con firewall o solo alcanzable por hostname (mDNS / WINS). Usa la opción Manual con la IP o hostname en su lugar.", "noSharesTitle": "«No se encontraron recursos compartidos accesibles»", "noSharesBody": "smbclient -L no devolvió nada para estas credenciales. Causas: el usuario no tiene permiso para listar shares (prueba con credenciales de admin una vez, o escribe el nombre del share manualmente), el servidor tiene la visibilidad de shares deshabilitada o las credenciales son incorrectas. El script te permite escribir el nombre del share a mano en este caso.", diff --git a/web/messages/es/docs/storage-share/lxc-mount-points.json b/web/messages/es/docs/storage-share/lxc-mount-points.json index daed7a76..3ae18e97 100644 --- a/web/messages/es/docs/storage-share/lxc-mount-points.json +++ b/web/messages/es/docs/storage-share/lxc-mount-points.json @@ -123,7 +123,7 @@ }, "remove": { "heading": "Eliminar un punto de montaje", - "body": "Elige el contenedor, elige la entrada mpN, confirma. El script ejecuta pct set --delete mpN para quitar la entrada de la config del CT y ofrece reiniciar el contenedor si está corriendo. El directorio del host y su contenido no se tocan — puedes volver a añadir el montaje después (o adjuntar el mismo directorio a un CT distinto).", + "body": "Elige el contenedor, elige la entrada mpN, confirma. El script ejecuta pct set --delete mpN para eliminar la entrada de la config del CT y ofrece reiniciar el contenedor si está corriendo. El directorio del host y su contenido no se tocan — puedes volver a añadir el montaje después (o adjuntar el mismo directorio a un CT distinto).", "warnTitle": "Los contenedores en ejecución necesitan un reinicio para que los cambios surtan efecto", "warnBody": "Tanto añadir como eliminar puntos de montaje solo se hacen visibles dentro del contenedor tras un reinicio. El script ofrece un pct reboot de un clic al final de cada operación; puedes declinar y reiniciar manualmente después." }, @@ -133,7 +133,7 @@ "noMountBody": "Los bind mounts solo se adjuntan cuando el contenedor arranca. Si añadiste el montaje mientras el CT estaba corriendo, reinícialo (pct reboot <ctid>). Si ya está reiniciado y sigue faltando, comprueba pct config <ctid> para confirmar que la entrada existe y que la ruta del host realmente contiene un directorio.", "noWriteTitle": "El contenedor puede ver el directorio pero no puede escribir", "noWriteBody": "Casi siempre un problema de permisos. Para contenedores unprivileged, ejecuta de nuevo el fix de permisos del script — las ACLs del directorio del host pueden haber sido reseteadas por otra herramienta (rsync, restore desde backup, chmod manual). Para CIFS, revisa las opciones de montaje en el host: findmnt /mnt/pve/cifs-…, busca valores uid= / gid= / file_mode=.", - "alreadyTitle": "\"Este camino ya se utiliza como punto de montaje en este contenedor\"", + "alreadyTitle": "\"Esta ruta ya se utiliza como punto de montaje en este contenedor\"", "alreadyBody": "Elegiste la misma ruta del contenedor que ya está cableada a un directorio del host distinto. O elige una ruta del contenedor diferente, o elimina el punto de montaje existente primero.", "nfsTitle": "El acceso NFS sigue bloqueado tras aplicar el fix del host", "nfsIntro": "Tu servidor NFS está aplicando squash a root o a todas las conexiones. El script puede detectar esto (intenta escribir un archivo de prueba desde el host) y muestra guía del lado del servidor. Dos arreglos comunes del lado del servidor para el export:", diff --git a/web/messages/es/docs/storage-share/lxc-samba-client.json b/web/messages/es/docs/storage-share/lxc-samba-client.json index 37231a48..f63450a8 100644 --- a/web/messages/es/docs/storage-share/lxc-samba-client.json +++ b/web/messages/es/docs/storage-share/lxc-samba-client.json @@ -118,7 +118,7 @@ "Rocky / Alma: dnf install cifs-utils samba-client" ], "aptOutro": "Después reejecuta el script de ProxMenux — el paso de instalación se salta cuando las herramientas ya están presentes.", - "guestFallbackTitle": "\"El servidor te conecta como invitado en lugar del usuario especificado\"", + "guestFallbackTitle": "\"El servidor te conectó como invitado en lugar de con el usuario indicado\"", "guestFallbackBody": "La validación activa del script detectó un problema real de auth. El servidor aceptó la conexión pero la degradó a guest porque las credenciales son incorrectas. Causas comunes: typo en el usuario / contraseña, el usuario no existe en el servidor, el usuario está bloqueado o el workgroup / dominio no coincide. Reejecuta el flujo y vuelve a introducir las credenciales con cuidado (la contraseña queda oculta en el diálogo).", "denyTitle": "\"NT_STATUS_ACCESS_DENIED\" al montar", "denyBody": "Las credenciales se validaron pero el share deniega el acceso. Comprueba en el lado del servidor si el usuario tiene permisos en ese share específico (la validación solo confirma el login, no las ACLs por share). Comprueba también si el servidor requiere una versión específica del protocolo SMB: añade vers=3.0 (o 2.1, 2.0) a las opciones de montaje.", From 163c9643146fd29438bfa58dc7ec93fcf536f8b6 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:47:58 +0200 Subject: [PATCH 62/73] Describe the disk manager behaviour as the scripts run it - Wipe all trims the whole disk when discard is supported and is not a secure erase - Declining the privileged conversion changes nothing, and accepting backs up the configuration first - The by-id path is used when it exists, with /dev/sdX as fallback - Full report opens in a scrollable dialog; SAS progress comes from the self-test log --- web/messages/de/docs/disk-manager/format-disk.json | 2 +- web/messages/de/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/de/docs/disk-manager/import-disk-vm.json | 2 +- web/messages/de/docs/disk-manager/smart-disk-test.json | 4 ++-- web/messages/en/docs/disk-manager/format-disk.json | 2 +- web/messages/en/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/en/docs/disk-manager/import-disk-vm.json | 2 +- web/messages/en/docs/disk-manager/smart-disk-test.json | 4 ++-- web/messages/es/docs/disk-manager/format-disk.json | 2 +- web/messages/es/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/es/docs/disk-manager/import-disk-vm.json | 2 +- web/messages/es/docs/disk-manager/smart-disk-test.json | 8 ++++---- web/messages/fr/docs/disk-manager/format-disk.json | 2 +- web/messages/fr/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/fr/docs/disk-manager/import-disk-vm.json | 2 +- web/messages/fr/docs/disk-manager/smart-disk-test.json | 4 ++-- web/messages/it/docs/disk-manager/format-disk.json | 2 +- web/messages/it/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/it/docs/disk-manager/import-disk-vm.json | 2 +- web/messages/it/docs/disk-manager/smart-disk-test.json | 4 ++-- web/messages/pt/docs/disk-manager/format-disk.json | 2 +- web/messages/pt/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/pt/docs/disk-manager/import-disk-vm.json | 2 +- web/messages/pt/docs/disk-manager/smart-disk-test.json | 4 ++-- web/messages/sk/docs/disk-manager/format-disk.json | 2 +- web/messages/sk/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/sk/docs/disk-manager/import-disk-vm.json | 2 +- web/messages/sk/docs/disk-manager/smart-disk-test.json | 4 ++-- web/messages/sv/docs/disk-manager/format-disk.json | 2 +- web/messages/sv/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/sv/docs/disk-manager/import-disk-vm.json | 2 +- web/messages/sv/docs/disk-manager/smart-disk-test.json | 4 ++-- 32 files changed, 42 insertions(+), 42 deletions(-) diff --git a/web/messages/de/docs/disk-manager/format-disk.json b/web/messages/de/docs/disk-manager/format-disk.json index 1a015a7c..24c14381 100644 --- a/web/messages/de/docs/disk-manager/format-disk.json +++ b/web/messages/de/docs/disk-manager/format-disk.json @@ -46,7 +46,7 @@ "mode": "1. Alles löschen", "part": "Zerstört", "data": "Signaturen gelöscht", - "useCase": "Partitionierung und Metadaten für ein neues Layout entfernen. Dabei werden nicht alle Nutzdaten überschrieben." + "useCase": "Entfernt die Partitionstabelle sowie Dateisystem- und RAID-Metadaten, überschreibt die ersten und letzten 16 MiB mit Nullen und führt bei Laufwerken mit Discard-Unterstützung ein TRIM über den gesamten Datenträger aus. Die übrigen Daten werden nicht überschrieben und können auf HDDs noch wiederherstellbar sein; dies ist kein sicheres Löschen." }, { "mode": "2. FS-Etiketten entfernen", diff --git a/web/messages/de/docs/disk-manager/import-disk-lxc.json b/web/messages/de/docs/disk-manager/import-disk-lxc.json index 7620d437..7d8235f2 100644 --- a/web/messages/de/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/de/docs/disk-manager/import-disk-lxc.json @@ -83,7 +83,7 @@ "troubleshoot": { "heading": "Fehlerbehebung", "unprivTitle": "\"Kann nicht mit einem unprivilegierten Container fortfahren\"", - "unprivBody": "Sie haben die Konvertierung abgelehnt. In /etc/pve/lxc/<CTID>.conf wird unprivileged: 1 zu unprivileged: 0, doch das allein wandelt vorhandene UID-/GID-Eigentümer nicht um. Sichern Sie den Container und klären Sie die Eigentümerzuordnung vor einer direkten Konvertierung; alternativ stellen Sie ihn privilegiert wieder her oder erstellen ihn neu.", + "unprivBody": "Sie haben die Konvertierung abgelehnt; das Skript wurde daher ohne Änderungen beendet. Um fortzufahren, führen Sie es erneut aus und stimmen zu: Das Skript stoppt den Container, sichert seine Konfiguration in /etc/pve/lxc/<CTID>.conf.bak und ersetzt unprivileged: 1 durch unprivileged: 0. Diese Änderung allein wandelt die UID-/GID-Eigentümer vorhandener Dateien nicht um; sichern Sie den Container daher vorher und passen Sie die Eigentümer an. Alternativ stellen Sie ihn privilegiert wieder her oder erstellen ihn neu.", "permsTitle": "Berechtigungen im Container sind falsch", "permsBody": "Beim Einhängen in einen privilegierten Container bleiben vorhandene Dateieigentümer erhalten; ein neues Dateisystem gehört häufig root:root. Läuft der Dienst unter einem anderen Benutzer, etwa www-data für Nextcloud, prüfen Sie dessen UID/GID und passen Sie die nötigen Dateien mit chown/chmod an. Dies verändert auch den zugrunde liegenden Datenträger." }, diff --git a/web/messages/de/docs/disk-manager/import-disk-vm.json b/web/messages/de/docs/disk-manager/import-disk-vm.json index c6c8ed3a..4ae57b22 100644 --- a/web/messages/de/docs/disk-manager/import-disk-vm.json +++ b/web/messages/de/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "Was das macht", - "body": "Ein physisches Laufwerk wird als Backend einer virtuellen Laufwerksschnittstelle zugewiesen. Der Gast erhält nicht automatisch native SMART-Daten oder Funktionen des physischen Controllers; dafür ist Controller-PCI-Passthrough geeignet. Das Laufwerk wird über /dev/disk/by-id/… statt /dev/sdX zugewiesen, sodass eine geänderte Gerätereihenfolge beim Start die Zuordnung nicht unterbricht." + "body": "Ein physisches Laufwerk wird als Backend einer virtuellen Laufwerksschnittstelle zugewiesen. Der Gast erhält nicht automatisch native SMART-Daten oder Funktionen des physischen Controllers; dafür ist Controller-PCI-Passthrough geeignet. Das Laufwerk wird, falls vorhanden, über seinen Pfad /dev/disk/by-id/… zugewiesen, sodass eine geänderte Gerätereihenfolge beim Start die Zuordnung nicht unterbricht; andernfalls wird /dev/sdX verwendet." }, "howRuns": { "heading": "Wie das Skript läuft", diff --git a/web/messages/de/docs/disk-manager/smart-disk-test.json b/web/messages/de/docs/disk-manager/smart-disk-test.json index 15c0bbba..93c20841 100644 --- a/web/messages/de/docs/disk-manager/smart-disk-test.json +++ b/web/messages/de/docs/disk-manager/smart-disk-test.json @@ -89,7 +89,7 @@ }, { "title": "Prüfergebnisse", - "bodyRich": "Status und Berichte erscheinen im Terminal; JSON wird für die oben genannten Aktionen exportiert, nicht für den vollständigen Bericht. Verwenden Sie bei Langtests später Testfortschritt prüfen für dasselbe Laufwerk.", + "bodyRich": "Status-, Test- und Fortschrittsausgaben erscheinen im Terminal; Vollständiger Bericht öffnet sich in einem scrollbaren Dialog. JSON wird für die oben genannten Aktionen exportiert, nicht für den vollständigen Bericht. Verwenden Sie bei Langtests später Testfortschritt prüfen für dasselbe Laufwerk.", "img": "/disk/smart/quick-status.png", "alt": "Schnelle Ausgabe des Gesundheitszustands", "caption": "Schnelle Ausgabe des Gesundheitszustands (SATA — smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"Konnte SMART-Daten aus /dev/sdX nicht lesen\"", "noSmartBody": "Die Festplatte befindet sich wahrscheinlich hinter einem RAID / SAS-Controller, der SMART nicht durchläuft. Versuchen Sie mit Megaraid-basierten Karten smartctl -d megaraid,N /dev/sdX. Für HBAs im IT-Modus funktioniert der direkte Aufruf.", "longTitle": "Langer Test nie abgeschlossen", - "longBody": "Der Test läuft in der Laufwerksfirmware; hohe E/A-Last kann ihn verzögern. Nutzen Sie eine ruhige Zeit, etwa nachts. Bei SATA/SAS zeigt smartctl -c den verbleibenden Prozentsatz; das Selbsttestprotokoll zeigt Abschlussstatus und gegebenenfalls fehlerhafte LBAs. Lesefehler müssen untersucht werden; langsamer Fortschritt allein beweist keinen defekten Sektor." + "longBody": "Der Test läuft in der Laufwerksfirmware; hohe E/A-Last kann ihn verzögern. Nutzen Sie eine ruhige Zeit, etwa nachts. Bei SATA zeigt smartctl -c den verbleibenden Prozentsatz, bei SAS smartctl -l selftest; das Selbsttestprotokoll zeigt Abschlussstatus und gegebenenfalls fehlerhafte LBAs. Lesefehler müssen untersucht werden; langsamer Fortschritt allein beweist keinen defekten Sektor." }, "related": { "heading": "Verwandte Themen", diff --git a/web/messages/en/docs/disk-manager/format-disk.json b/web/messages/en/docs/disk-manager/format-disk.json index f0ee2449..f60c46b5 100644 --- a/web/messages/en/docs/disk-manager/format-disk.json +++ b/web/messages/en/docs/disk-manager/format-disk.json @@ -46,7 +46,7 @@ "mode": "1. Wipe all", "part": "Destroyed", "data": "Signatures wiped", - "useCase": "Remove partitioning and metadata to prepare a new layout. This does not overwrite all user data." + "useCase": "Removes the partition table and the filesystem and RAID metadata, zeroes the first and last 16 MiB and, on drives that support discard, trims the whole disk. The rest of the data is not overwritten and may still be recoverable on HDDs; this is not a secure erase." }, { "mode": "2. Remove FS labels", diff --git a/web/messages/en/docs/disk-manager/import-disk-lxc.json b/web/messages/en/docs/disk-manager/import-disk-lxc.json index 6878456e..a9793c01 100644 --- a/web/messages/en/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/en/docs/disk-manager/import-disk-lxc.json @@ -83,7 +83,7 @@ "troubleshoot": { "heading": "Troubleshooting", "unprivTitle": "\"Cannot continue with an unprivileged container\"", - "unprivBody": "You declined the conversion. The flag in /etc/pve/lxc/<CTID>.conf changes from unprivileged: 1 to unprivileged: 0, but that alone does not convert existing UID/GID ownership. Back up and handle the ownership mapping before accepting an in-place conversion; alternatively restore or rebuild the container as privileged.", + "unprivBody": "You declined the conversion, so the script stopped without changing anything. To continue, run it again and accept: the script stops the container, backs up its configuration to /etc/pve/lxc/<CTID>.conf.bak and replaces unprivileged: 1 with unprivileged: 0. That flag change alone does not convert the UID/GID ownership of existing files, so back up the container and fix the ownership first; alternatively, restore or rebuild the container as privileged.", "permsTitle": "Permissions inside the container are wrong", "permsBody": "Existing file ownership is retained when a partition is mounted into a privileged container; a newly formatted filesystem is often owned by root:root. If the service runs as another user (e.g. www-data for Nextcloud), inspect its UID/GID and adjust the required files with chown/chmod. Changes also affect the underlying disk." }, diff --git a/web/messages/en/docs/disk-manager/import-disk-vm.json b/web/messages/en/docs/disk-manager/import-disk-vm.json index 3a49c002..1ad8b3b5 100644 --- a/web/messages/en/docs/disk-manager/import-disk-vm.json +++ b/web/messages/en/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "What this does", - "body": "This attaches a raw physical disk as the backing device for a virtual disk interface. The guest does not automatically receive native SMART data or the physical controller’s features; use controller PCI passthrough when those are required. The disk is attached through /dev/disk/by-id/…, not /dev/sdX, so a changed device enumeration order at boot does not break the assignment." + "body": "This attaches a raw physical disk as the backing device for a virtual disk interface. The guest does not automatically receive native SMART data or the physical controller’s features; use controller PCI passthrough when those are required. The disk is attached through its /dev/disk/by-id/… path when one exists, so a changed device enumeration order at boot does not break the assignment; otherwise /dev/sdX is used." }, "howRuns": { "heading": "How the script runs", diff --git a/web/messages/en/docs/disk-manager/smart-disk-test.json b/web/messages/en/docs/disk-manager/smart-disk-test.json index a06ccdc4..4ff76f57 100644 --- a/web/messages/en/docs/disk-manager/smart-disk-test.json +++ b/web/messages/en/docs/disk-manager/smart-disk-test.json @@ -89,7 +89,7 @@ }, { "title": "Review results", - "bodyRich": "Status and reports are shown in the terminal; JSON export is performed for supported actions as described above, not for Full report. For long tests, return later and run Check test progress on the same disk to see the outcome.", + "bodyRich": "Status, test and progress output is shown in the terminal; Full report opens in a scrollable dialog. JSON is exported for the actions described above, not for Full report. For long tests, return later and run Check test progress on the same disk to see the outcome.", "img": "/disk/smart/quick-status.png", "alt": "Quick health status output", "caption": "Quick health status output (SATA — smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"Could not read SMART data from /dev/sdX\"", "noSmartBody": "The disk is probably behind a RAID / SAS controller that does not pass SMART through. With megaraid-based cards, try smartctl -d megaraid,N /dev/sdX. For HBAs in IT mode the direct invocation works.", "longTitle": "Long test never completes", - "longBody": "The drive runs the test in firmware, and heavy I/O can delay completion. Try an idle period such as overnight. For SATA/SAS, smartctl -c shows the remaining percentage; inspect the self-test log for completion status and any failing LBA. A reported read failure needs investigation; slow progress alone does not prove a bad sector." + "longBody": "The drive runs the test in firmware, and heavy I/O can delay completion. Try an idle period such as overnight. For SATA, smartctl -c shows the remaining percentage, and for SAS, smartctl -l selftest; inspect the self-test log for completion status and any failing LBA. A reported read failure needs investigation; slow progress alone does not prove a bad sector." }, "related": { "heading": "Related", diff --git a/web/messages/es/docs/disk-manager/format-disk.json b/web/messages/es/docs/disk-manager/format-disk.json index a9bd4009..c8835c94 100644 --- a/web/messages/es/docs/disk-manager/format-disk.json +++ b/web/messages/es/docs/disk-manager/format-disk.json @@ -46,7 +46,7 @@ "mode": "1. Borrar todo", "part": "Destruida", "data": "Firmas borradas", - "useCase": "Eliminar las particiones y los metadatos para preparar una nueva distribución. No sobrescribe todos los datos de usuario." + "useCase": "Elimina la tabla de particiones y los metadatos de sistemas de archivos y RAID, pone a cero los primeros y los últimos 16 MiB y, en unidades que admiten discard, aplica TRIM a todo el disco. El resto de los datos no se sobrescribe y en un HDD aún podría recuperarse; no es un borrado seguro." }, { "mode": "2. Borrar firmas FS", diff --git a/web/messages/es/docs/disk-manager/import-disk-lxc.json b/web/messages/es/docs/disk-manager/import-disk-lxc.json index 2edff1e8..1c5ad1b0 100644 --- a/web/messages/es/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/es/docs/disk-manager/import-disk-lxc.json @@ -83,7 +83,7 @@ "troubleshoot": { "heading": "Solución de problemas", "unprivTitle": "\"No se puede continuar con un contenedor no privilegiado\"", - "unprivBody": "Rechazaste la conversión. La opción de /etc/pve/lxc/<CTID>.conf cambia de unprivileged: 1 a unprivileged: 0, pero eso por sí solo no convierte los UID/GID de los archivos existentes. Haz una copia y resuelve el mapeo de propietarios antes de aceptar una conversión in situ; como alternativa, restaura o recrea el contenedor como privilegiado.", + "unprivBody": "Rechazaste la conversión, así que el script se detuvo sin cambiar nada. Para continuar, vuelve a ejecutarlo y acepta: el script detiene el contenedor, guarda una copia de su configuración en /etc/pve/lxc/<CTID>.conf.bak y sustituye unprivileged: 1 por unprivileged: 0. Ese cambio por sí solo no convierte los UID/GID de los archivos existentes, así que haz antes un backup del contenedor y corrige los propietarios; como alternativa, restaura o recrea el contenedor como privilegiado.", "permsTitle": "Los permisos dentro del contenedor están mal", "permsBody": "Al montar una partición en un contenedor privilegiado se conserva la propiedad existente; un sistema de archivos recién formateado suele pertenecer a root:root. Si el servicio usa otro usuario, por ejemplo www-data para Nextcloud, comprueba su UID/GID y ajusta los archivos necesarios con chown/chmod. Los cambios afectan también al disco subyacente." }, diff --git a/web/messages/es/docs/disk-manager/import-disk-vm.json b/web/messages/es/docs/disk-manager/import-disk-vm.json index 7f594292..5dfdf100 100644 --- a/web/messages/es/docs/disk-manager/import-disk-vm.json +++ b/web/messages/es/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "Qué hace esto", - "body": "Conecta un disco físico como dispositivo subyacente de una interfaz de disco virtual. El invitado no recibe automáticamente los datos SMART nativos ni las funciones de la controladora física; usa passthrough PCI de la controladora si los necesitas. Se conecta mediante /dev/disk/by-id/…, no /dev/sdX, para que un cambio en el orden de enumeración al arrancar no rompa la asignación." + "body": "Conecta un disco físico como dispositivo subyacente de una interfaz de disco virtual. El invitado no recibe automáticamente los datos SMART nativos ni las funciones de la controladora física; usa passthrough PCI de la controladora si los necesitas. Se conecta mediante su ruta /dev/disk/by-id/… cuando existe, para que un cambio en el orden de enumeración al arrancar no rompa la asignación; si no existe, se usa /dev/sdX." }, "howRuns": { "heading": "Cómo se ejecuta el script", diff --git a/web/messages/es/docs/disk-manager/smart-disk-test.json b/web/messages/es/docs/disk-manager/smart-disk-test.json index 3ce64749..958b199f 100644 --- a/web/messages/es/docs/disk-manager/smart-disk-test.json +++ b/web/messages/es/docs/disk-manager/smart-disk-test.json @@ -49,13 +49,13 @@ "dur": "Horas (depende del tamaño del disco)" }, { - "action": "Comprobar el progreso del test", + "action": "Progreso de prueba", "what": "Estado del self-test activo o más reciente.", "dur": "Instantáneo" } ], "tipTitle": "Los tests largos sobreviven al cierre del terminal", - "tipBody": "Un test largo se ejecuta dentro de la unidad y no depende de que siga activo el proceso de ProxMenux. Puedes cerrar el terminal y volver después a Comprobar el progreso del test. Un reinicio del host, de la controladora o una pérdida de alimentación puede interrumpir el test y su recopilador de resultados; no presupongas que se reanudará automáticamente." + "tipBody": "Un test largo se ejecuta dentro de la unidad y no depende de que siga activo el proceso de ProxMenux. Puedes cerrar el terminal y volver después a Progreso de prueba. Un reinicio del host, de la controladora o una pérdida de alimentación puede interrumpir el test y su recopilador de resultados; no presupongas que se reanudará automáticamente." }, "json": { "heading": "Exportación JSON para el Monitor", @@ -89,7 +89,7 @@ }, { "title": "Revisa los resultados", - "bodyRich": "El estado y los informes se muestran en el terminal; el JSON se exporta para las acciones indicadas arriba, no para Informe completo. Para los tests largos, vuelve después a Comprobar el progreso del test en el mismo disco.", + "bodyRich": "La salida del estado, de las pruebas y del progreso se muestra en el terminal; Informe completo se abre en un diálogo desplazable. El JSON se exporta para las acciones indicadas arriba, no para Informe completo. Para las pruebas largas, vuelve después a Progreso de prueba en el mismo disco.", "img": "/disk/smart/quick-status.png", "alt": "Salida del estado de salud rápido", "caption": "Salida del estado de salud rápido (SATA — smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"No se pudieron leer los datos SMART de /dev/sdX\"", "noSmartBody": "El disco está probablemente detrás de una controladora RAID / SAS que no pasa SMART. Con tarjetas basadas en megaraid, prueba smartctl -d megaraid,N /dev/sdX. Para HBAs en modo IT la invocación directa funciona.", "longTitle": "El test largo no termina nunca", - "longBody": "La unidad ejecuta el test en su firmware y la carga de E/S puede retrasarlo. Prueba en un periodo de poca actividad, como de noche. En SATA/SAS, smartctl -c muestra el porcentaje restante; revisa el registro de tests para ver el resultado y posibles LBA con fallos. Un error de lectura requiere investigación; la lentitud por sí sola no demuestra un sector defectuoso." + "longBody": "La unidad ejecuta el test en su firmware y la carga de E/S puede retrasarlo. Prueba en un periodo de poca actividad, como de noche. En SATA, smartctl -c muestra el porcentaje restante, y en SAS, smartctl -l selftest; revisa el registro de tests para ver el resultado y posibles LBA con fallos. Un error de lectura requiere investigación; la lentitud por sí sola no demuestra un sector defectuoso." }, "related": { "heading": "Relacionado", diff --git a/web/messages/fr/docs/disk-manager/format-disk.json b/web/messages/fr/docs/disk-manager/format-disk.json index ec530617..711986c0 100644 --- a/web/messages/fr/docs/disk-manager/format-disk.json +++ b/web/messages/fr/docs/disk-manager/format-disk.json @@ -46,7 +46,7 @@ "mode": "1. Tout effacer", "part": "Détruite", "data": "Signatures effacées", - "useCase": "Supprimer le partitionnement et les métadonnées pour préparer une nouvelle organisation. Cela n’écrase pas toutes les données utilisateur." + "useCase": "Supprime la table de partitions et les métadonnées de système de fichiers et RAID, met à zéro les 16 premiers et derniers Mio et, sur les disques qui prennent en charge discard, applique un TRIM à tout le disque. Le reste des données n’est pas écrasé et peut encore être récupérable sur un HDD ; ce n’est pas un effacement sécurisé." }, { "mode": "2. Supprimer les étiquettes FS", diff --git a/web/messages/fr/docs/disk-manager/import-disk-lxc.json b/web/messages/fr/docs/disk-manager/import-disk-lxc.json index a7be475b..b98a47f2 100644 --- a/web/messages/fr/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/fr/docs/disk-manager/import-disk-lxc.json @@ -83,7 +83,7 @@ "troubleshoot": { "heading": "Dépannage", "unprivTitle": "\"Ne peut pas continuer avec un conteneur non privilégié\"", - "unprivBody": "Vous avez refusé la conversion. Le paramètre de /etc/pve/lxc/<CTID>.conf passe de unprivileged: 1 à unprivileged: 0, mais cela ne convertit pas à lui seul les UID/GID des fichiers existants. Sauvegardez et traitez le mappage des propriétaires avant une conversion sur place ; sinon, restaurez ou recréez le conteneur en mode privilégié.", + "unprivBody": "Vous avez refusé la conversion : le script s’est arrêté sans rien modifier. Pour continuer, relancez-le et acceptez : le script arrête le conteneur, sauvegarde sa configuration dans /etc/pve/lxc/<CTID>.conf.bak et remplace unprivileged: 1 par unprivileged: 0. Ce changement ne convertit pas à lui seul les UID/GID des fichiers existants ; sauvegardez donc d’abord le conteneur et corrigez les propriétaires, ou restaurez ou recréez-le en mode privilégié.", "permsTitle": "Les autorisations à l'intérieur du conteneur sont erronées", "permsBody": "Le montage dans un conteneur privilégié conserve les propriétaires des fichiers existants ; un système de fichiers neuf appartient souvent à root:root. Si le service utilise un autre compte, par exemple www-data pour Nextcloud, vérifiez son UID/GID et ajustez les fichiers nécessaires avec chown/chmod. Ces changements affectent aussi le disque sous-jacent." }, diff --git a/web/messages/fr/docs/disk-manager/import-disk-vm.json b/web/messages/fr/docs/disk-manager/import-disk-vm.json index c01301c8..483ca8b4 100644 --- a/web/messages/fr/docs/disk-manager/import-disk-vm.json +++ b/web/messages/fr/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "Ce que ça fait", - "body": "Cette méthode utilise un disque physique brut comme support d’une interface de disque virtuel. L’invité ne reçoit pas automatiquement les données SMART natives ni les fonctions du contrôleur physique ; utilisez le passthrough PCI du contrôleur si elles sont nécessaires. Le disque est connecté via /dev/disk/by-id/… et non /dev/sdX, pour préserver l’affectation si l’ordre des périphériques change au démarrage." + "body": "Cette méthode utilise un disque physique brut comme support d’une interface de disque virtuel. L’invité ne reçoit pas automatiquement les données SMART natives ni les fonctions du contrôleur physique ; utilisez le passthrough PCI du contrôleur si elles sont nécessaires. Le disque est connecté via son chemin /dev/disk/by-id/… lorsqu’il existe, pour préserver l’affectation si l’ordre des périphériques change au démarrage ; sinon, /dev/sdX est utilisé." }, "howRuns": { "heading": "Comment fonctionne le script", diff --git a/web/messages/fr/docs/disk-manager/smart-disk-test.json b/web/messages/fr/docs/disk-manager/smart-disk-test.json index f39fe0c7..2f7381a6 100644 --- a/web/messages/fr/docs/disk-manager/smart-disk-test.json +++ b/web/messages/fr/docs/disk-manager/smart-disk-test.json @@ -89,7 +89,7 @@ }, { "title": "Examen des résultats", - "bodyRich": "L’état et les rapports s’affichent dans le terminal ; le JSON est exporté pour les actions décrites plus haut, sauf Rapport complet. Pour les tests longs, revenez à Vérifier la progression du test sur le même disque.", + "bodyRich": "L’état, les tests et la progression s’affichent dans le terminal ; Rapport complet s’ouvre dans une boîte de dialogue défilante. Le JSON est exporté pour les actions décrites plus haut, sauf Rapport complet. Pour les tests longs, revenez à Vérifier la progression du test sur le même disque.", "img": "/disk/smart/quick-status.png", "alt": "État de santé rapide", "caption": "État de santé rapide (SATA — smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"Ne pouvait pas lire les données SMART de /dev/sdX\"", "noSmartBody": "Le disque est probablement derrière un contrôleur RAID / SAS qui ne passe pas SMART à travers. Avec des cartes à base de megaraid, essayez smartctl -d megaraid,N /dev/sdX. Pour les HBA en mode IT, l'invocation directe fonctionne.", "longTitle": "Un long test ne se termine jamais", - "longBody": "Le disque exécute le test dans son firmware et une forte activité peut le retarder. Essayez pendant une période calme, par exemple la nuit. Pour SATA/SAS, smartctl -c indique le pourcentage restant ; le journal des autotests contient l’état final et les éventuels LBA en erreur. Une erreur de lecture doit être examinée ; la lenteur seule ne prouve pas un secteur défectueux." + "longBody": "Le disque exécute le test dans son firmware et une forte activité peut le retarder. Essayez pendant une période calme, par exemple la nuit. Pour SATA, smartctl -c indique le pourcentage restant, et pour SAS, smartctl -l selftest ; le journal des autotests contient l’état final et les éventuels LBA en erreur. Une erreur de lecture doit être examinée ; la lenteur seule ne prouve pas un secteur défectueux." }, "related": { "heading": "Voir aussi", diff --git a/web/messages/it/docs/disk-manager/format-disk.json b/web/messages/it/docs/disk-manager/format-disk.json index 8a33ecb2..a83bcf38 100644 --- a/web/messages/it/docs/disk-manager/format-disk.json +++ b/web/messages/it/docs/disk-manager/format-disk.json @@ -46,7 +46,7 @@ "mode": "1. Pulisci tutto", "part": "Distrutto", "data": "Firme cancellate", - "useCase": "Rimuove partizionamento e metadati per preparare una nuova struttura. Non sovrascrive tutti i dati utente." + "useCase": "Rimuove la tabella delle partizioni e i metadati di file system e RAID, azzera i primi e gli ultimi 16 MiB e, sulle unità che supportano discard, esegue il TRIM dell’intero disco. Il resto dei dati non viene sovrascritto e su un HDD potrebbe essere ancora recuperabile; non è una cancellazione sicura." }, { "mode": "2. Rimuovere le etichette FS", diff --git a/web/messages/it/docs/disk-manager/import-disk-lxc.json b/web/messages/it/docs/disk-manager/import-disk-lxc.json index 301cb14d..c8221ee9 100644 --- a/web/messages/it/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/it/docs/disk-manager/import-disk-lxc.json @@ -83,7 +83,7 @@ "troubleshoot": { "heading": "Risoluzione dei problemi", "unprivTitle": "\"Impossibile proseguire con un contenitore non privilegiato\"", - "unprivBody": "Hai rifiutato la conversione. In /etc/pve/lxc/<CTID>.conf il valore passa da unprivileged: 1 a unprivileged: 0, ma questo da solo non converte la proprietà UID/GID esistente. Salva un backup e gestisci la mappatura dei proprietari prima della conversione sul posto; in alternativa, ripristina o ricrea il contenitore come privilegiato.", + "unprivBody": "Hai rifiutato la conversione, quindi lo script si è fermato senza modificare nulla. Per continuare, eseguilo di nuovo e accetta: lo script arresta il contenitore, salva la sua configurazione in /etc/pve/lxc/<CTID>.conf.bak e sostituisce unprivileged: 1 con unprivileged: 0. Questa modifica da sola non converte la proprietà UID/GID dei file esistenti: esegui prima un backup del contenitore e correggi i proprietari, oppure ripristina o ricrea il contenitore come privilegiato.", "permsTitle": "Le autorizzazioni all'interno del contenitore sono sbagliate", "permsBody": "Montare una partizione in un contenitore privilegiato conserva i proprietari esistenti; un filesystem appena formattato appartiene spesso a root:root. Se il servizio usa un altro utente, ad esempio www-data per Nextcloud, controlla UID/GID e modifica i file necessari con chown/chmod. Le modifiche agiscono anche sul disco sottostante." }, diff --git a/web/messages/it/docs/disk-manager/import-disk-vm.json b/web/messages/it/docs/disk-manager/import-disk-vm.json index eb5e3de0..44df1ca3 100644 --- a/web/messages/it/docs/disk-manager/import-disk-vm.json +++ b/web/messages/it/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "Che cosa fa", - "body": "Collega un disco fisico grezzo come supporto di un’interfaccia disco virtuale. Il guest non riceve automaticamente i dati SMART nativi o le funzioni del controller fisico; usa il passthrough PCI del controller se servono. Il disco viene collegato tramite /dev/disk/by-id/…, non /dev/sdX, così un diverso ordine di enumerazione all’avvio non interrompe l’assegnazione." + "body": "Collega un disco fisico grezzo come supporto di un’interfaccia disco virtuale. Il guest non riceve automaticamente i dati SMART nativi o le funzioni del controller fisico; usa il passthrough PCI del controller se servono. Il disco viene collegato tramite il suo percorso /dev/disk/by-id/… quando esiste, così un diverso ordine di enumerazione all’avvio non interrompe l’assegnazione; altrimenti si usa /dev/sdX." }, "howRuns": { "heading": "Come funziona lo script", diff --git a/web/messages/it/docs/disk-manager/smart-disk-test.json b/web/messages/it/docs/disk-manager/smart-disk-test.json index 2dd9a180..f42b8ae1 100644 --- a/web/messages/it/docs/disk-manager/smart-disk-test.json +++ b/web/messages/it/docs/disk-manager/smart-disk-test.json @@ -89,7 +89,7 @@ }, { "title": "Controlla i risultati", - "bodyRich": "Stato e rapporti compaiono nel terminale; l’esportazione JSON avviene per le azioni indicate sopra, non per Rapporto completo. Per i test lunghi torna a Verifica avanzamento test sullo stesso disco.", + "bodyRich": "Stato, test e avanzamento compaiono nel terminale; Rapporto completo si apre in una finestra scorrevole. L’esportazione JSON avviene per le azioni indicate sopra, non per Rapporto completo. Per i test lunghi torna a Verifica avanzamento test sullo stesso disco.", "img": "/disk/smart/quick-status.png", "alt": "Uscita rapida dello stato di salute", "caption": "Uscita rapida dello stato di salute (SATA — smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"Impossibile leggere i dati SMART da /dev/sdX\"", "noSmartBody": "Il disco è probabilmente dietro un controller RAID / SAS che non passa SMART attraverso. Con le carte a base di megaraid, prova a smartctl -d megaraid,N /dev/sdX. Per HBA in modalità IT l'invocazione diretta funziona.", "longTitle": "Il lungo test non completa mai", - "longBody": "Il test viene eseguito nel firmware e un carico I/O elevato può ritardarlo. Prova in un periodo di inattività, ad esempio di notte. Su SATA/SAS, smartctl -c mostra la percentuale rimanente; il log degli autotest indica esito ed eventuali LBA difettosi. Un errore di lettura va indagato; la lentezza da sola non prova un settore danneggiato." + "longBody": "Il test viene eseguito nel firmware e un carico I/O elevato può ritardarlo. Prova in un periodo di inattività, ad esempio di notte. Su SATA, smartctl -c mostra la percentuale rimanente, su SAS smartctl -l selftest; il log degli autotest indica esito ed eventuali LBA difettosi. Un errore di lettura va indagato; la lentezza da sola non prova un settore danneggiato." }, "related": { "heading": "Correlati", diff --git a/web/messages/pt/docs/disk-manager/format-disk.json b/web/messages/pt/docs/disk-manager/format-disk.json index 69cd0681..b3d1ed08 100644 --- a/web/messages/pt/docs/disk-manager/format-disk.json +++ b/web/messages/pt/docs/disk-manager/format-disk.json @@ -46,7 +46,7 @@ "mode": "1. Limpar tudo", "part": "Destruído", "data": "Assinaturas apagadas", - "useCase": "Remove o particionamento e os metadados para preparar uma nova organização. Não sobrescreve todos os dados do utilizador." + "useCase": "Remove a tabela de partições e os metadados de sistemas de ficheiros e RAID, preenche com zeros os primeiros e os últimos 16 MiB e, nas unidades que suportam discard, aplica TRIM a todo o disco. O resto dos dados não é sobrescrito e ainda pode ser recuperável num HDD; não é um apagamento seguro." }, { "mode": "2. Remover rótulos FS", diff --git a/web/messages/pt/docs/disk-manager/import-disk-lxc.json b/web/messages/pt/docs/disk-manager/import-disk-lxc.json index 87e27693..e3d2c822 100644 --- a/web/messages/pt/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/pt/docs/disk-manager/import-disk-lxc.json @@ -83,7 +83,7 @@ "troubleshoot": { "heading": "Resolução de Problemas", "unprivTitle": "\"Não posso continuar com um contentor sem privilégios\"", - "unprivBody": "Recusou a conversão. Em /etc/pve/lxc/<CTID>.conf, a opção passa de unprivileged: 1 para unprivileged: 0, mas isso não converte por si só os UID/GID dos ficheiros existentes. Faça uma cópia de segurança e trate do mapeamento de proprietários antes da conversão no local; em alternativa, restaure ou recrie o contentor como privilegiado.", + "unprivBody": "Recusou a conversão, por isso o script terminou sem alterar nada. Para continuar, execute-o novamente e aceite: o script para o contentor, guarda uma cópia da configuração em /etc/pve/lxc/<CTID>.conf.bak e substitui unprivileged: 1 por unprivileged: 0. Essa alteração, por si só, não converte os UID/GID dos ficheiros existentes; faça antes uma cópia de segurança do contentor e corrija os proprietários, ou restaure ou recrie o contentor como privilegiado.", "permsTitle": "Permissões dentro do recipiente estão erradas", "permsBody": "Montar uma partição num contentor privilegiado mantém os proprietários existentes; um sistema de ficheiros novo pertence frequentemente a root:root. Se o serviço usar outro utilizador, por exemplo www-data para Nextcloud, verifique o UID/GID e ajuste os ficheiros necessários com chown/chmod. As alterações também afetam o disco subjacente." }, diff --git a/web/messages/pt/docs/disk-manager/import-disk-vm.json b/web/messages/pt/docs/disk-manager/import-disk-vm.json index eea26349..4d386ff8 100644 --- a/web/messages/pt/docs/disk-manager/import-disk-vm.json +++ b/web/messages/pt/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "O que isto faz", - "body": "Liga um disco físico bruto como dispositivo subjacente de uma interface de disco virtual. O sistema convidado não recebe automaticamente os dados SMART nativos nem as funções do controlador físico; utilize passthrough PCI do controlador se forem necessários. O disco é ligado por /dev/disk/by-id/…, não por /dev/sdX, para manter a atribuição se a ordem dos dispositivos mudar no arranque." + "body": "Liga um disco físico bruto como dispositivo subjacente de uma interface de disco virtual. O sistema convidado não recebe automaticamente os dados SMART nativos nem as funções do controlador físico; utilize passthrough PCI do controlador se forem necessários. O disco é ligado pelo seu caminho /dev/disk/by-id/… quando existe, para manter a atribuição se a ordem dos dispositivos mudar no arranque; caso contrário, é usado /dev/sdX." }, "howRuns": { "heading": "Como o script é executado", diff --git a/web/messages/pt/docs/disk-manager/smart-disk-test.json b/web/messages/pt/docs/disk-manager/smart-disk-test.json index 7eba6a83..5f4dbcb6 100644 --- a/web/messages/pt/docs/disk-manager/smart-disk-test.json +++ b/web/messages/pt/docs/disk-manager/smart-disk-test.json @@ -89,7 +89,7 @@ }, { "title": "Rever os resultados", - "bodyRich": "O estado e os relatórios são apresentados no terminal; o JSON é exportado para as ações descritas acima, exceto Relatório completo. Para testes longos, volte a Verificar o progresso do teste no mesmo disco.", + "bodyRich": "O estado, os testes e o progresso são apresentados no terminal; Relatório completo abre numa caixa de diálogo com deslocamento. O JSON é exportado para as ações descritas acima, exceto Relatório completo. Para testes longos, volte a Verificar o progresso do teste no mesmo disco.", "img": "/disk/smart/quick-status.png", "alt": "Saída rápida do estado de saúde", "caption": "Saída rápida do estado de saúde (SATA — smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"Não foi possível ler dados SMART de /dev/sdX\"", "noSmartBody": "O disco pode estar ligado a um controlador RAID/SAS que não transmite SMART. Com placas megaraid, tente smartctl -d megaraid,N /dev/sdX. Com HBA em modo IT, a chamada direta funciona.", "longTitle": "O teste longo nunca termina", - "longBody": "O teste corre no firmware e uma carga elevada de E/S pode atrasá-lo. Tente num período calmo, como durante a noite. Em SATA/SAS, smartctl -c mostra a percentagem restante; o registo de autotestes indica o resultado e eventuais LBA com erros. Uma falha de leitura exige investigação; a lentidão, por si só, não prova um setor danificado." + "longBody": "O teste corre no firmware e uma carga elevada de E/S pode atrasá-lo. Tente num período calmo, como durante a noite. Em SATA, smartctl -c mostra a percentagem restante e, em SAS, smartctl -l selftest; o registo de autotestes indica o resultado e eventuais LBA com erros. Uma falha de leitura exige investigação; a lentidão, por si só, não prova um setor danificado." }, "related": { "heading": "Relacionado", diff --git a/web/messages/sk/docs/disk-manager/format-disk.json b/web/messages/sk/docs/disk-manager/format-disk.json index a3cd9645..38bfd68e 100644 --- a/web/messages/sk/docs/disk-manager/format-disk.json +++ b/web/messages/sk/docs/disk-manager/format-disk.json @@ -46,7 +46,7 @@ "mode": "1. Vymazať všetko", "part": "Zničené", "data": "Vymazané podpisy", - "useCase": "Odstráni rozdelenie na oddiely a metadáta pre nové usporiadanie. Neprepíše všetky používateľské dáta." + "useCase": "Odstráni tabuľku oddielov a metadáta súborových systémov a RAID, vynuluje prvých a posledných 16 MiB a na diskoch s podporou discard vykoná TRIM celého disku. Ostatné dáta sa neprepíšu a na HDD môžu byť stále obnoviteľné; nejde o bezpečné vymazanie." }, { "mode": "2. Odstrániť značky FS", diff --git a/web/messages/sk/docs/disk-manager/import-disk-lxc.json b/web/messages/sk/docs/disk-manager/import-disk-lxc.json index 61d6fdb3..408e34dc 100644 --- a/web/messages/sk/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/sk/docs/disk-manager/import-disk-lxc.json @@ -83,7 +83,7 @@ "troubleshoot": { "heading": "Riešenie problémov", "unprivTitle": "\"Nemôže pokračovať s neprivilegovaným kontajnerom\"", - "unprivBody": "Odmietli ste konverziu. V /etc/pve/lxc/<CTID>.conf sa zmení unprivileged: 1 na unprivileged: 0, no samotná zmena neprevedie existujúce vlastníctvo UID/GID. Pred priamou konverziou kontajner zálohujte a vyriešte mapovanie vlastníkov; prípadne ho obnovte alebo znova vytvorte ako privilegovaný.", + "unprivBody": "Odmietli ste konverziu, takže skript skončil bez akejkoľvek zmeny. Ak chcete pokračovať, spustite ho znova a súhlaste: skript zastaví kontajner, zálohuje jeho konfiguráciu do /etc/pve/lxc/<CTID>.conf.bak a nahradí unprivileged: 1 hodnotou unprivileged: 0. Samotná zmena neprevedie vlastníctvo UID/GID existujúcich súborov; preto kontajner najprv zálohujte a upravte vlastníkov, prípadne ho obnovte alebo znova vytvorte ako privilegovaný.", "permsTitle": "Práva vnútri kontajnera sú nesprávne", "permsBody": "Pri pripojení oddielu do privilegovaného kontajnera sa zachová existujúce vlastníctvo súborov; nový súborový systém často patrí root:root. Ak služba beží pod iným používateľom, napríklad www-data pri Nextcloude, overte UID/GID a upravte potrebné súbory pomocou chown/chmod. Zmeny ovplyvnia aj podkladový disk." }, diff --git a/web/messages/sk/docs/disk-manager/import-disk-vm.json b/web/messages/sk/docs/disk-manager/import-disk-vm.json index d7e60361..820e6983 100644 --- a/web/messages/sk/docs/disk-manager/import-disk-vm.json +++ b/web/messages/sk/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "Čo to robí?", - "body": "Fyzický disk sa pripojí ako podkladové zariadenie rozhrania virtuálneho disku. Hosť automaticky nedostane natívne SMART dáta ani funkcie fyzického radiča; ak ich potrebujete, použite PCI passthrough radiča. Disk sa pripája cez /dev/disk/by-id/…, nie /dev/sdX, takže zmena poradia zariadení pri štarte nenaruší priradenie." + "body": "Fyzický disk sa pripojí ako podkladové zariadenie rozhrania virtuálneho disku. Hosť automaticky nedostane natívne SMART dáta ani funkcie fyzického radiča; ak ich potrebujete, použite PCI passthrough radiča. Disk sa pripája cez svoju cestu /dev/disk/by-id/…, ak existuje, takže zmena poradia zariadení pri štarte nenaruší priradenie; inak sa použije /dev/sdX." }, "howRuns": { "heading": "Ako beží skript", diff --git a/web/messages/sk/docs/disk-manager/smart-disk-test.json b/web/messages/sk/docs/disk-manager/smart-disk-test.json index de8f1f0f..d186464f 100644 --- a/web/messages/sk/docs/disk-manager/smart-disk-test.json +++ b/web/messages/sk/docs/disk-manager/smart-disk-test.json @@ -89,7 +89,7 @@ }, { "title": "Skontrolovať výsledky", - "bodyRich": "Stav a správy sa zobrazia v termináli; JSON sa exportuje pri vyššie opísaných akciách, nie pri úplnej správe. Pri dlhých testoch neskôr použite Skontrolovať priebeh testu na rovnakom disku.", + "bodyRich": "Stav, testy a priebeh sa zobrazia v termináli; Úplná správa sa otvorí v posúvateľnom dialógu. JSON sa exportuje pri vyššie opísaných akciách, nie pri úplnej správe. Pri dlhých testoch neskôr použite Skontrolovať priebeh testu na rovnakom disku.", "img": "/disk/smart/quick-status.png", "alt": "Výstup rýchlej kontroly stavu", "caption": "Rýchly prehľad stavu disku (SATA — smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"Nepodarilo sa prečítať dáta SMART z /dev/sdX\"", "noSmartBody": "Disk je pravdepodobne za radičom RAID/SAS, ktorý nesprístupňuje SMART. Pri kartách megaraid skúste smartctl -d megaraid,N /dev/sdX. Pri HBA v režime IT funguje priame volanie.", "longTitle": "Dlhý test sa nikdy nedokončil", - "longBody": "Test beží vo firmvéri disku a vysoká záťaž ho môže spomaliť. Skúste pokojné obdobie, napríklad noc. Pri SATA/SAS zobrazí smartctl -c zostávajúce percento; výsledok a prípadné chybné LBA nájdete v zázname testov. Chybu čítania treba preskúmať; pomalý priebeh sám osebe nedokazuje chybný sektor." + "longBody": "Test beží vo firmvéri disku a vysoká záťaž ho môže spomaliť. Skúste pokojné obdobie, napríklad noc. Pri SATA zobrazí smartctl -c zostávajúce percento, pri SAS smartctl -l selftest; výsledok a prípadné chybné LBA nájdete v zázname testov. Chybu čítania treba preskúmať; pomalý priebeh sám osebe nedokazuje chybný sektor." }, "related": { "heading": "Súvisiace", diff --git a/web/messages/sv/docs/disk-manager/format-disk.json b/web/messages/sv/docs/disk-manager/format-disk.json index 443bda73..760c04cc 100644 --- a/web/messages/sv/docs/disk-manager/format-disk.json +++ b/web/messages/sv/docs/disk-manager/format-disk.json @@ -46,7 +46,7 @@ "mode": "1. Radera allt", "part": "Förstörd", "data": "Signaturer raderade", - "useCase": "Ta bort partitionering och metadata för att förbereda en ny layout. Detta skriver inte över alla användardata." + "useCase": "Tar bort partitionstabellen och metadata för filsystem och RAID, nollställer de första och sista 16 MiB och kör TRIM på hela disken om enheten stöder discard. Övriga data skrivs inte över och kan fortfarande gå att återställa på en HDD; detta är ingen säker radering." }, { "mode": "2. Ta bort FS-etiketter", diff --git a/web/messages/sv/docs/disk-manager/import-disk-lxc.json b/web/messages/sv/docs/disk-manager/import-disk-lxc.json index e093ed96..07347a3b 100644 --- a/web/messages/sv/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/sv/docs/disk-manager/import-disk-lxc.json @@ -83,7 +83,7 @@ "troubleshoot": { "heading": "Felsökning", "unprivTitle": "\"Kan inte fortsätta med en oprivilegierad container\"", - "unprivBody": "Du avböjde konverteringen. Flaggan i /etc/pve/lxc/<CTID>.conf ändras från unprivileged: 1 till unprivileged: 0, men det omvandlar inte befintligt UID/GID-ägarskap. Säkerhetskopiera och hantera ägarmappningen före en konvertering på plats, eller återläs eller återskapa containern som privilegierad.", + "unprivBody": "Du avböjde konverteringen, så skriptet avslutades utan att ändra något. Kör det igen och godkänn för att fortsätta: skriptet stoppar containern, säkerhetskopierar konfigurationen till /etc/pve/lxc/<CTID>.conf.bak och ersätter unprivileged: 1 med unprivileged: 0. Den ändringen omvandlar inte i sig UID/GID-ägarskapet för befintliga filer, så säkerhetskopiera containern och rätta ägarskapet först, eller återställ eller återskapa containern som privilegierad.", "permsTitle": "Behörigheter inne i containern är fel", "permsBody": "Befintliga filägare behålls när en partition monteras i en privilegierad container; ett nyformaterat filsystem ägs ofta av root:root. Om tjänsten körs som en annan användare, exempelvis www-data för Nextcloud, kontrollera UID/GID och justera berörda filer med chown/chmod. Ändringarna påverkar även den underliggande disken." }, diff --git a/web/messages/sv/docs/disk-manager/import-disk-vm.json b/web/messages/sv/docs/disk-manager/import-disk-vm.json index 036725ac..3c05c8a0 100644 --- a/web/messages/sv/docs/disk-manager/import-disk-vm.json +++ b/web/messages/sv/docs/disk-manager/import-disk-vm.json @@ -12,7 +12,7 @@ }, "intro": { "title": "Vad detta gör", - "body": "En fysisk disk ansluts som underlag för ett virtuellt diskgränssnitt. Gästen får inte automatiskt inbyggda SMART-data eller den fysiska styrenhetens funktioner; använd PCI-passthrough av styrenheten om dessa behövs. Disken ansluts via /dev/disk/by-id/…, inte /dev/sdX, så ändrad enhetsordning vid start bryter inte tilldelningen." + "body": "En fysisk disk ansluts som underlag för ett virtuellt diskgränssnitt. Gästen får inte automatiskt inbyggda SMART-data eller den fysiska styrenhetens funktioner; använd PCI-passthrough av styrenheten om dessa behövs. Disken ansluts via sin sökväg /dev/disk/by-id/… när en sådan finns, så ändrad enhetsordning vid start bryter inte tilldelningen; annars används /dev/sdX." }, "howRuns": { "heading": "Så körs skriptet", diff --git a/web/messages/sv/docs/disk-manager/smart-disk-test.json b/web/messages/sv/docs/disk-manager/smart-disk-test.json index 2d862f81..0836550e 100644 --- a/web/messages/sv/docs/disk-manager/smart-disk-test.json +++ b/web/messages/sv/docs/disk-manager/smart-disk-test.json @@ -89,7 +89,7 @@ }, { "title": "Granska resultat", - "bodyRich": "Status och rapporter visas i terminalen; JSON exporteras för åtgärderna ovan, inte för Fullständig rapport. För långa tester återkommer du till Kontrollera testförlopp på samma disk.", + "bodyRich": "Status, tester och förlopp visas i terminalen; Fullständig rapport öppnas i en rullbar dialog. JSON exporteras för åtgärderna ovan, inte för Fullständig rapport. För långa tester återkommer du till Kontrollera testförlopp på samma disk.", "img": "/disk/smart/quick-status.png", "alt": "Utdata från snabb statuskontroll", "caption": "Snabb hälsostatusutgång (SATA - smartctl -H + -A)" @@ -106,7 +106,7 @@ "noSmartTitle": "\"Kan inte läsa SMART data från /dev/sdX\"", "noSmartBody": "Disken sitter troligen bakom en RAID/SAS-styrenhet som inte vidarebefordrar SMART. För megaraid-kort kan du prova smartctl -d megaraid,N /dev/sdX. För HBA:er i IT-läge fungerar det direkta anropet.", "longTitle": "Långt test slutför aldrig", - "longBody": "Testet körs i diskens firmware och hög I/O-belastning kan fördröja det. Prova en lugn period, exempelvis över natten. För SATA/SAS visar smartctl -c återstående procent; självtestloggen visar slutstatus och eventuella felaktiga LBA:er. Läsfel behöver undersökas; långsamt förlopp bevisar inte i sig en dålig sektor." + "longBody": "Testet körs i diskens firmware och hög I/O-belastning kan fördröja det. Prova en lugn period, exempelvis över natten. För SATA visar smartctl -c återstående procent, för SAS smartctl -l selftest; självtestloggen visar slutstatus och eventuella felaktiga LBA:er. Läsfel behöver undersökas; långsamt förlopp bevisar inte i sig en dålig sektor." }, "related": { "heading": "Relaterat", From d4c4dce832f227d6dcb90cdba8f487739f798010 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:47:58 +0200 Subject: [PATCH 63/73] Describe the storage sharing behaviour as the scripts run it - A local disk is registered in Proxmox only when As Proxmox storage is marked - Test NFS Connectivity checks ping, port 2049 and the export list - Proxmox keeps CIFS passwords with mode 0600, protected by access control --- web/messages/de/docs/storage-share/host-local-disk.json | 2 +- web/messages/de/docs/storage-share/host-nfs.json | 2 +- web/messages/de/docs/storage-share/host-samba.json | 2 +- web/messages/en/docs/storage-share/host-local-disk.json | 2 +- web/messages/en/docs/storage-share/host-nfs.json | 2 +- web/messages/en/docs/storage-share/host-samba.json | 2 +- web/messages/es/docs/storage-share/host-local-disk.json | 2 +- web/messages/es/docs/storage-share/host-nfs.json | 2 +- web/messages/es/docs/storage-share/host-samba.json | 2 +- web/messages/fr/docs/storage-share/host-local-disk.json | 2 +- web/messages/fr/docs/storage-share/host-nfs.json | 2 +- web/messages/fr/docs/storage-share/host-samba.json | 2 +- web/messages/it/docs/storage-share/host-local-disk.json | 2 +- web/messages/it/docs/storage-share/host-nfs.json | 2 +- web/messages/it/docs/storage-share/host-samba.json | 2 +- web/messages/pt/docs/storage-share/host-local-disk.json | 2 +- web/messages/pt/docs/storage-share/host-nfs.json | 2 +- web/messages/pt/docs/storage-share/host-samba.json | 2 +- web/messages/sk/docs/storage-share/host-local-disk.json | 2 +- web/messages/sk/docs/storage-share/host-nfs.json | 2 +- web/messages/sk/docs/storage-share/host-samba.json | 2 +- web/messages/sv/docs/storage-share/host-local-disk.json | 2 +- web/messages/sv/docs/storage-share/host-nfs.json | 2 +- web/messages/sv/docs/storage-share/host-samba.json | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/web/messages/de/docs/storage-share/host-local-disk.json b/web/messages/de/docs/storage-share/host-local-disk.json index 0a2753e8..7f66e57a 100644 --- a/web/messages/de/docs/storage-share/host-local-disk.json +++ b/web/messages/de/docs/storage-share/host-local-disk.json @@ -78,7 +78,7 @@ "Wählen Sie das Dateisystem aus - siehe Tabelle oben für Kompromisse.", "Storage ID (default disk-<device>), Mount-Pfad, Voreinstellung des Inhaltstyps.", "Bestätigen Sie im FINAL CONFIRMATION — DATA WILL BE ERASED Dialog.", - "ProxMenux löscht die Partitionstabelle und erstellt eine Partition über den Datenträger. Es führt mkfs.<fs> oder zpool create aus und hängt das Ergebnis ein. Normale Dateisysteme erhalten einen UUID-Eintrag in /etc/fstab mit defaults,nofail; ZFS verwendet die Mount-Konfiguration des Pools. Die Registrierung erfolgt mit pvesm add dir oder pvesm add zfspool." + "ProxMenux löscht die Partitionstabelle und erstellt eine Partition über den Datenträger. Es führt mkfs.<fs> oder zpool create aus und hängt das Ergebnis ein. Normale Dateisysteme erhalten einen UUID-Eintrag in /etc/fstab mit defaults,nofail; ZFS verwendet die Mount-Konfiguration des Pools. Ist Als Proxmox-Speicher markiert (bei ZFS immer), wird er anschließend mit pvesm add dir oder pvesm add zfspool registriert; andernfalls bleibt er nur ein Host-Mount." ], "tipTitle": "Warum UUID + nofail in /etc/fstab", "tipBody": "Das Skript schreibt UUID=… /mnt/<id> <fs> defaults,nofail 0 2. UUID überlebt die Geräteumordnung über Neustarts hinweg (so dass /dev/sdc, das /dev/sdd wird, den Boot nicht unterbricht). nofail bedeutet, dass, wenn die Festplatte jemals verschwindet (Hardwarefehler, Unplugged), Proxmox immer noch bootet - der Speicher wird nur als inaktiv angezeigt, bis die Festplatte zurückkommt." diff --git a/web/messages/de/docs/storage-share/host-nfs.json b/web/messages/de/docs/storage-share/host-nfs.json index 4295dbeb..bb131054 100644 --- a/web/messages/de/docs/storage-share/host-nfs.json +++ b/web/messages/de/docs/storage-share/host-nfs.json @@ -145,7 +145,7 @@ "showmountTitle": "\"Failed to connect\" von showmount", "showmountBody": "Der Server lehnte die Exportlistenabfrage ab. Häufige Ursachen: Der Server erzwingt strenge Client-ACLs (Ihre Proxmox-IP steht nicht auf der erlaubten Liste), rpcbind läuft nicht auf dem Server oder der Server stellt nur NFSv4 mit deaktiviertem showmount bereit. Der Exportpfad kann weiterhin manuell hinzugefügt werden, wenn Sie ihn kennen.", "inactiveTitle": "Storage zeigt als inaktiv in der Proxmox UI", - "inactiveBody": "Starten Sie NFS-Verbindung testen, um DNS, Ports und Mount-Zugriff zu prüfen. Bleibt der Speicher bei funktionierender Verbindung inaktiv, prüfen Sie journalctl -u pvestatd und Server-/Exportkonfiguration. Beheben Sie zuerst Verbindungs- oder Berechtigungsprobleme. pvesm set <id> --disable 0 aktiviert einen deaktivierten Speicher und ist keine allgemeine NFS-Reparatur.", + "inactiveBody": "Starten Sie zuerst NFS-Verbindung testen: Es prüft, ob der Server auf Ping antwortet, Port 2049 offen ist und die Exportliste (showmount -e) verfügbar ist. Bleibt der Speicher bei funktionierender Verbindung inaktiv, prüfen Sie journalctl -u pvestatd und Server-/Exportkonfiguration. Beheben Sie zuerst Verbindungs- oder Berechtigungsprobleme. pvesm set <id> --disable 0 aktiviert einen deaktivierten Speicher und ist keine allgemeine NFS-Reparatur.", "lxcNoWriteTitle": "fstab mount funktioniert, aber unprivilegierte LXC kann nicht durch ein bind-mount schreiben", "lxcNoWriteBody": "NFS-Zugriff hängt von Eigentümern, ACLs und Squash-Einstellungen auf dem Server ab. CIFS-Optionen wie uid= und file_mode= gelten nicht für NFS. Bei der Standard-LXC-Zuordnung wird CT-root zu Host-UID 100000, nicht zu Remote-UID 0. Gewähren Sie der tatsächlich zugeordneten UID/GID oder anonymen Serveridentität Zugriff. no_root_squash betrifft nur Remote-UID 0 und löst Probleme mit UID 100000 nicht allgemein. Das Skript versucht chmod 1777, kann Serverrechte aber nicht umgehen.", "fstabBootTitle": "fstab Mount wird nach dem Neustart nicht angezeigt", diff --git a/web/messages/de/docs/storage-share/host-samba.json b/web/messages/de/docs/storage-share/host-samba.json index 2a7048ea..1a09af4d 100644 --- a/web/messages/de/docs/storage-share/host-samba.json +++ b/web/messages/de/docs/storage-share/host-samba.json @@ -91,7 +91,7 @@ "warnTitle": "VM-Disks auf CIFS", "warnBody": "Die Auswahl images löst eine ProxMenux-Warnung aus: CIFS/SMB kann Sperrprobleme bei VM-Festplattenoperationen verursachen. Das Skript empfiehlt NFS, lässt Sie aber fortfahren. Sicherungen und ISOs sind typische CIFS-Anwendungen. Prüfen Sie Sperren, Snapshots, Migration und Last vor der Verwendung für images.", "credsTitle": "Wo pvesm Anmeldeinformationen speichert", - "credsBody": "Das Passwort steht nicht in /etc/pve/storage.cfg. Proxmox schreibt Klartext-Zugangsdaten in /etc/pve/priv/storage/<storage-id>.pw, geschützt durch das private Cluster-Dateisystemverzeichnis für root. Nehmen Sie weder einen festen Dateimodus 0600 noch Verschlüsselung an. Nach einer Passwortänderung am Server verwenden Sie pvesm set <id> --password <new> oder entfernen und ergänzen den Speicher über ProxMenux erneut." + "credsBody": "Das Passwort steht nicht in /etc/pve/storage.cfg. Proxmox schreibt Klartext-Zugangsdaten in /etc/pve/priv/storage/<storage-id>.pw, im privaten Bereich des Cluster-Dateisystems, den nur root lesen kann (Modus 0600); geschützt sind sie durch Zugriffsrechte, nicht durch Verschlüsselung. Nach einer Passwortänderung am Server verwenden Sie pvesm set <id> --password <new> oder entfernen und ergänzen den Speicher über ProxMenux erneut." }, "fstabBranch": { "heading": "Methode B — nur ein fstab-Mount auf dem Host", diff --git a/web/messages/en/docs/storage-share/host-local-disk.json b/web/messages/en/docs/storage-share/host-local-disk.json index 44b0d065..056fbd3e 100644 --- a/web/messages/en/docs/storage-share/host-local-disk.json +++ b/web/messages/en/docs/storage-share/host-local-disk.json @@ -78,7 +78,7 @@ "Pick the filesystem — see the table above for trade-offs.", "Storage ID (default disk-<device>), mount path, content-type preset.", "Confirm at the FINAL CONFIRMATION — DATA WILL BE ERASED dialog.", - "ProxMenux clears the partition table and creates one partition spanning the disk. It runs mkfs.<fs> or zpool create and mounts the result. Regular filesystems get an entry in /etc/fstab by UUID with defaults,nofail; ZFS uses its pool mount configuration instead. Registration uses pvesm add dir or pvesm add zfspool." + "ProxMenux clears the partition table and creates one partition spanning the disk. It runs mkfs.<fs> or zpool create and mounts the result. Regular filesystems get an entry in /etc/fstab by UUID with defaults,nofail; ZFS uses its pool mount configuration instead. If As Proxmox storage is marked (always the case for ZFS), it is then registered with pvesm add dir or pvesm add zfspool; otherwise it stays a host mount only." ], "tipTitle": "Why UUID + nofail in /etc/fstab", "tipBody": "The script writes UUID=… /mnt/<id> <fs> defaults,nofail 0 2. UUID survives device reordering across reboots (so /dev/sdc becoming /dev/sdd does not break boot). nofail means that if the disk ever disappears (hardware failure, unplugged), Proxmox still boots — storage will just show as inactive until the disk comes back." diff --git a/web/messages/en/docs/storage-share/host-nfs.json b/web/messages/en/docs/storage-share/host-nfs.json index ffcda4d5..fdff8644 100644 --- a/web/messages/en/docs/storage-share/host-nfs.json +++ b/web/messages/en/docs/storage-share/host-nfs.json @@ -145,7 +145,7 @@ "showmountTitle": "\"Failed to connect\" from showmount", "showmountBody": "The server refused the export-list query. Common causes: the server enforces strict client ACLs (your Proxmox IP is not on the allowed list), rpcbind is not running on the server, or the server exposes only NFSv4 with showmount disabled. The export path can still be added manually if you know it.", "inactiveTitle": "Storage shows as inactive in the Proxmox UI", - "inactiveBody": "Run Test NFS Connectivity first to investigate DNS, ports and mount access. If connectivity works but storage remains inactive, inspect journalctl -u pvestatd and the server/export configuration. Restore the underlying connectivity or permissions first. pvesm set <id> --disable 0 enables a disabled storage; it is not a general repair for NFS failures.", + "inactiveBody": "Run Test NFS Connectivity first: it checks that the server answers ping, that port 2049 is open and that the export list (showmount -e) is available. If connectivity works but storage remains inactive, inspect journalctl -u pvestatd and the server/export configuration. Restore the underlying connectivity or permissions first. pvesm set <id> --disable 0 enables a disabled storage; it is not a general repair for NFS failures.", "lxcNoWriteTitle": "fstab mount works but unprivileged LXC can't write through a bind-mount", "lxcNoWriteBody": "NFS access depends on server-side ownership, ACLs and squash settings. CIFS-style options such as uid= and file_mode= do not apply to NFS. With default LXC mapping, CT root becomes host UID 100000, not remote UID 0. Configure access for the actual mapped UID/GID or the server’s anonymous identity. no_root_squash only affects remote UID 0, so it is not a universal fix for UID 100000. The script attempts chmod 1777 but cannot override the server’s permissions.", "fstabBootTitle": "fstab mount does not come up after reboot", diff --git a/web/messages/en/docs/storage-share/host-samba.json b/web/messages/en/docs/storage-share/host-samba.json index 99955bd8..bd3de8d7 100644 --- a/web/messages/en/docs/storage-share/host-samba.json +++ b/web/messages/en/docs/storage-share/host-samba.json @@ -91,7 +91,7 @@ "warnTitle": "Live VM disks on CIFS", "warnBody": "Selecting images triggers a ProxMenux warning that CIFS/SMB can cause locking issues with VM disk operations. The script recommends NFS for VM disk images but lets you continue. Backups and ISOs are common CIFS uses. Assess locking, snapshots, migration and workload requirements before using CIFS for images.", "credsTitle": "Where pvesm stores credentials", - "credsBody": "The password is not written in /etc/pve/storage.cfg. Proxmox writes plaintext credentials in /etc/pve/priv/storage/<storage-id>.pw, protected by the private cluster filesystem directory accessible to root. Do not assume a fixed file mode of 0600 or encryption. After a server password change, use pvesm set <id> --password <new> or remove and re-add through ProxMenux." + "credsBody": "The password is not written in /etc/pve/storage.cfg. Proxmox writes plaintext credentials in /etc/pve/priv/storage/<storage-id>.pw, inside the private area of the cluster filesystem, readable only by root (mode 0600); it is protected by access control, not by encryption. After a server password change, use pvesm set <id> --password <new> or remove and re-add through ProxMenux." }, "fstabBranch": { "heading": "Method B — Host fstab mount only", diff --git a/web/messages/es/docs/storage-share/host-local-disk.json b/web/messages/es/docs/storage-share/host-local-disk.json index d07de410..513f9f0e 100644 --- a/web/messages/es/docs/storage-share/host-local-disk.json +++ b/web/messages/es/docs/storage-share/host-local-disk.json @@ -78,7 +78,7 @@ "Elige el sistema de archivos — mira la tabla de arriba para las contrapartidas.", "Storage ID (por defecto disk-<device>), ruta de montaje, preset de content type.", "Confirma en el diálogo FINAL CONFIRMATION — DATA WILL BE ERASED.", - "ProxMenux limpia la tabla de particiones y crea una partición que abarca el disco. Ejecuta mkfs.<fs> o zpool create y monta el resultado. Los sistemas de archivos normales reciben una entrada en /etc/fstab por UUID con defaults,nofail; ZFS usa la configuración de montaje del pool. El registro usa pvesm add dir o pvesm add zfspool." + "ProxMenux limpia la tabla de particiones y crea una partición que abarca el disco. Ejecuta mkfs.<fs> o zpool create y monta el resultado. Los sistemas de archivos normales reciben una entrada en /etc/fstab por UUID con defaults,nofail; ZFS usa la configuración de montaje del pool. Si Como almacenamiento Proxmox está marcado (siempre en ZFS), se registra con pvesm add dir o pvesm add zfspool; si no, queda solo como montaje del host." ], "tipTitle": "Por qué UUID + nofail en /etc/fstab", "tipBody": "El script escribe UUID=… /mnt/<id> <fs> defaults,nofail 0 2. El UUID sobrevive a reordenaciones de dispositivos entre reinicios (así que /dev/sdc pasando a ser /dev/sdd no rompe el arranque). nofail significa que si el disco desaparece alguna vez (fallo de hardware, desconectado), Proxmox arranca igualmente — el almacenamiento simplemente se mostrará como inactive hasta que el disco vuelva." diff --git a/web/messages/es/docs/storage-share/host-nfs.json b/web/messages/es/docs/storage-share/host-nfs.json index 47a046c4..9354db11 100644 --- a/web/messages/es/docs/storage-share/host-nfs.json +++ b/web/messages/es/docs/storage-share/host-nfs.json @@ -145,7 +145,7 @@ "showmountTitle": "\"Failed to connect\" desde showmount", "showmountBody": "El servidor rechazó la consulta de la lista de exports. Causas comunes: el servidor aplica ACLs de cliente estrictas (tu IP de Proxmox no está en la lista permitida), rpcbind no está corriendo en el servidor o el servidor expone solo NFSv4 con showmount deshabilitado. La ruta del export se puede añadir manualmente igualmente si la conoces.", "inactiveTitle": "El almacenamiento aparece como inactive en la UI de Proxmox", - "inactiveBody": "Ejecuta Probar la conectividad NFS para revisar DNS, puertos y acceso al montaje. Si la conectividad funciona pero sigue inactivo, consulta journalctl -u pvestatd y la configuración del servidor/export. Corrige primero la conectividad o los permisos. pvesm set <id> --disable 0 habilita un almacenamiento deshabilitado; no repara fallos NFS en general.", + "inactiveBody": "Ejecuta primero Probar la conectividad NFS: comprueba que el servidor responde al ping, que el puerto 2049 está abierto y que la lista de exports (showmount -e) está disponible. Si la conectividad funciona pero sigue inactivo, consulta journalctl -u pvestatd y la configuración del servidor/export. Corrige primero la conectividad o los permisos. pvesm set <id> --disable 0 habilita un almacenamiento deshabilitado; no repara fallos NFS en general.", "lxcNoWriteTitle": "El montaje fstab funciona pero un LXC unprivileged no puede escribir por un bind mount", "lxcNoWriteBody": "El acceso NFS depende de propiedad, ACL y squash en el servidor. Las opciones CIFS como uid= y file_mode= no se aplican a NFS. Con el mapeo LXC predeterminado, root del CT se convierte en UID 100000 del host, no en UID remoto 0. Da acceso al UID/GID mapeado real o a la identidad anónima del servidor. no_root_squash solo afecta al UID remoto 0, por lo que no resuelve todos los casos de UID 100000. El script intenta chmod 1777, pero no anula permisos del servidor.", "fstabBootTitle": "El montaje fstab no se levanta tras el reinicio", diff --git a/web/messages/es/docs/storage-share/host-samba.json b/web/messages/es/docs/storage-share/host-samba.json index 051f995d..25e45b47 100644 --- a/web/messages/es/docs/storage-share/host-samba.json +++ b/web/messages/es/docs/storage-share/host-samba.json @@ -91,7 +91,7 @@ "warnTitle": "Discos de VM en vivo en CIFS", "warnBody": "Seleccionar images muestra un aviso: CIFS/SMB puede causar problemas de bloqueo en operaciones con discos de VM. El script recomienda NFS para imágenes de VM, pero permite continuar. Backups e ISO son usos habituales de CIFS. Evalúa bloqueos, instantáneas, migración y carga antes de usar CIFS para images.", "credsTitle": "Dónde guarda pvesm las credenciales", - "credsBody": "La contraseña no se escribe en /etc/pve/storage.cfg. Proxmox guarda credenciales en texto plano en /etc/pve/priv/storage/<storage-id>.pw, protegidas por el directorio privado del sistema de archivos del clúster accesible a root. No asumas un modo fijo 0600 ni cifrado. Tras cambiar la contraseña en el servidor, usa pvesm set <id> --password <new> o elimina y vuelve a añadir desde ProxMenux." + "credsBody": "La contraseña no se escribe en /etc/pve/storage.cfg. Proxmox guarda credenciales en texto plano en /etc/pve/priv/storage/<storage-id>.pw, dentro del área privada del sistema de archivos del clúster, que solo puede leer root (modo 0600); están protegidas por permisos, no por cifrado. Tras cambiar la contraseña en el servidor, usa pvesm set <id> --password <new> o elimina y vuelve a añadir desde ProxMenux." }, "fstabBranch": { "heading": "Método B — Solo montaje fstab del host", diff --git a/web/messages/fr/docs/storage-share/host-local-disk.json b/web/messages/fr/docs/storage-share/host-local-disk.json index 9eed4e8f..cc173c72 100644 --- a/web/messages/fr/docs/storage-share/host-local-disk.json +++ b/web/messages/fr/docs/storage-share/host-local-disk.json @@ -78,7 +78,7 @@ "Choisissez le système de fichiers — voir le tableau ci-dessus pour les compromis.", "ID de stockage (disk-<device> par défaut), chemin de montage, préréglage de type contenu.", "Confirmez dans le dialogue CONFIRMATION FINALE — LES DONNÉES SERONT EFFACÉES.", - "ProxMenux efface la table de partitions et crée une partition sur tout le disque. Il exécute mkfs.<fs> ou zpool create, puis monte le résultat. Les systèmes de fichiers classiques reçoivent une entrée UUID dans /etc/fstab avec defaults,nofail ; ZFS utilise la configuration de montage du pool. L’enregistrement utilise pvesm add dir ou pvesm add zfspool." + "ProxMenux efface la table de partitions et crée une partition sur tout le disque. Il exécute mkfs.<fs> ou zpool create, puis monte le résultat. Les systèmes de fichiers classiques reçoivent une entrée UUID dans /etc/fstab avec defaults,nofail ; ZFS utilise la configuration de montage du pool. Si Comme stockage Proxmox est coché (toujours le cas pour ZFS), il est ensuite enregistré avec pvesm add dir ou pvesm add zfspool ; sinon, il reste un simple montage de l’hôte." ], "tipTitle": "Pourquoi UUID + nofail dans /etc/fstab", "tipBody": "Le script écrit UUID=… /mnt/<id> <fs> defaults,nofail 0 2. UUID survit à la réorganisation de l'appareil à travers les reboots (ainsi /dev/sdc devenir /dev/sdd ne casse pas le démarrage). nofail signifie que si le disque disparaît un jour (défaut de matériel, débranché), Proxmox démarre quand même — le stockage se montrera comme inactif jusqu'à ce que le disque revienne." diff --git a/web/messages/fr/docs/storage-share/host-nfs.json b/web/messages/fr/docs/storage-share/host-nfs.json index 3b8dab3e..f6371e5f 100644 --- a/web/messages/fr/docs/storage-share/host-nfs.json +++ b/web/messages/fr/docs/storage-share/host-nfs.json @@ -145,7 +145,7 @@ "showmountTitle": "« Impossible de se connecter » depuis showmount", "showmountBody": "Le serveur a refusé la requête de la liste d'exportation. Causes communes : le serveur fait respecter les CLA du client (votre IP Proxmox n'est pas sur la liste autorisée), rpcbind ne fonctionne pas sur le serveur, ou le serveur n'expose que NFSv4 avec showmount désactivé. Le chemin d'exportation peut encore être ajouté manuellement si vous le connaissez.", "inactiveTitle": "Le stockage est inactif dans l'UI Proxmox", - "inactiveBody": "Lancez Tester la connectivité NFS pour examiner DNS, ports et accès au montage. Si la connexion fonctionne mais que le stockage reste inactif, consultez journalctl -u pvestatd et la configuration serveur/export. Rétablissez d’abord connexion ou permissions. pvesm set <id> --disable 0 active un stockage désactivé ; ce n’est pas une réparation générale de NFS.", + "inactiveBody": "Lancez d’abord Tester la connectivité NFS : il vérifie que le serveur répond au ping, que le port 2049 est ouvert et que la liste des exports (showmount -e) est disponible. Si la connexion fonctionne mais que le stockage reste inactif, consultez journalctl -u pvestatd et la configuration serveur/export. Rétablissez d’abord connexion ou permissions. pvesm set <id> --disable 0 active un stockage désactivé ; ce n’est pas une réparation générale de NFS.", "lxcNoWriteTitle": "Le montage fstab fonctionne mais le LXC non privilégié ne peut pas écrire à travers un montage de liaison", "lxcNoWriteBody": "L’accès NFS dépend des propriétaires, ACL et réglages de squash du serveur. Les options CIFS uid= et file_mode= ne s’appliquent pas à NFS. Avec le mappage LXC par défaut, root dans le CT devient l’UID 100000 de l’hôte, pas l’UID distant 0. Autorisez l’UID/GID réellement mappé ou l’identité anonyme du serveur. no_root_squash concerne seulement l’UID distant 0 et ne résout pas tous les cas d’UID 100000. Le script tente chmod 1777 sans pouvoir contourner les permissions serveur.", "fstabBootTitle": "fstab mount ne vient pas après le redémarrage", diff --git a/web/messages/fr/docs/storage-share/host-samba.json b/web/messages/fr/docs/storage-share/host-samba.json index 95ce45fd..2c5d06d9 100644 --- a/web/messages/fr/docs/storage-share/host-samba.json +++ b/web/messages/fr/docs/storage-share/host-samba.json @@ -91,7 +91,7 @@ "warnTitle": "Live VM disques sur CIFS", "warnBody": "Sélectionner images déclenche un avertissement ProxMenux : CIFS/SMB peut poser des problèmes de verrouillage lors des opérations sur disques VM. Le script recommande NFS mais permet de continuer. Sauvegardes et ISO sont des usages courants de CIFS. Évaluez verrouillage, instantanés, migration et charge avant d’utiliser CIFS pour images.", "credsTitle": "Où pvesm stocke les identifiants", - "credsBody": "Le mot de passe n’est pas écrit dans /etc/pve/storage.cfg. Proxmox écrit les identifiants en clair dans /etc/pve/priv/storage/<storage-id>.pw, protégé par le répertoire privé du système de fichiers du cluster accessible à root. Ne supposez ni mode fixe 0600 ni chiffrement. Après un changement de mot de passe serveur, utilisez pvesm set <id> --password <new> ou supprimez puis ajoutez le stockage via ProxMenux." + "credsBody": "Le mot de passe n’est pas écrit dans /etc/pve/storage.cfg. Proxmox écrit les identifiants en clair dans /etc/pve/priv/storage/<storage-id>.pw, dans la zone privée du système de fichiers du cluster, lisible uniquement par root (mode 0600) ; ils sont protégés par les droits d’accès, pas par un chiffrement. Après un changement de mot de passe serveur, utilisez pvesm set <id> --password <new> ou supprimez puis ajoutez le stockage via ProxMenux." }, "fstabBranch": { "heading": "Méthode B — Montage fstab de l'hôte uniquement", diff --git a/web/messages/it/docs/storage-share/host-local-disk.json b/web/messages/it/docs/storage-share/host-local-disk.json index a7c63a4b..ebc56176 100644 --- a/web/messages/it/docs/storage-share/host-local-disk.json +++ b/web/messages/it/docs/storage-share/host-local-disk.json @@ -78,7 +78,7 @@ "Scegli il filesystem — vedi la tabella sopra per i trade-off.", "ID di archiviazione (default disk-<device>), percorso di montaggio, preimpostazione del tipo di contenuto.", "Conferma nel dialogo CONFERMA FINALE — I DATI SARANNO CANCELLATI.", - "ProxMenux cancella la tabella delle partizioni e crea una partizione sull’intero disco. Esegue mkfs.<fs> o zpool create e monta il risultato. I file system normali ricevono una voce UUID in /etc/fstab con defaults,nofail; ZFS usa la configurazione di montaggio del pool. La registrazione usa pvesm add dir o pvesm add zfspool." + "ProxMenux cancella la tabella delle partizioni e crea una partizione sull’intero disco. Esegue mkfs.<fs> o zpool create e monta il risultato. I file system normali ricevono una voce UUID in /etc/fstab con defaults,nofail; ZFS usa la configurazione di montaggio del pool. Se Come storage Proxmox è selezionato (sempre per ZFS), viene poi registrato con pvesm add dir o pvesm add zfspool; altrimenti resta solo un montaggio dell’host." ], "tipTitle": "Perché UUID + nofail in /etc/fstab", "tipBody": "Lo script scrive UUID=… /mnt/<id> <fs> defaults,nofail 0 2. UUID sopravvive al riordino del dispositivo attraverso i reboots (così /dev/sdc diventando /dev/sdd non rompe l'avvio). nofail significa che se il disco scomparirà mai (guasto hardware, scollegamento), Proxmox si avvia comunque — lo storage mostra solo come inattivo fino a quando il disco torna indietro." diff --git a/web/messages/it/docs/storage-share/host-nfs.json b/web/messages/it/docs/storage-share/host-nfs.json index c54162ad..47dd3b19 100644 --- a/web/messages/it/docs/storage-share/host-nfs.json +++ b/web/messages/it/docs/storage-share/host-nfs.json @@ -145,7 +145,7 @@ "showmountTitle": "\"Failed to connect\" da showmount", "showmountBody": "Il server ha rifiutato la query della lista delle esportazioni. Cause comuni: il server applica il client rigoroso ACLs (il vostro IP Proxmox non è nell'elenco consentito), rpcbind non è in esecuzione sul server, o il server espone solo NFSv4 con showmount disabilitato. Il percorso di esportazione può ancora essere aggiunto manualmente se lo conosci.", "inactiveTitle": "Lo stoccaggio mostra come inattivo nell'UI Proxmox", - "inactiveBody": "Esegui Testa connettività NFS per verificare DNS, porte e accesso al montaggio. Se la connessione funziona ma lo storage rimane inattivo, controlla journalctl -u pvestatd e la configurazione server/esportazione. Ripristina prima connessione o permessi. pvesm set <id> --disable 0 abilita uno storage disabilitato; non è una riparazione generica di NFS.", + "inactiveBody": "Esegui prima Testa connettività NFS: verifica che il server risponda al ping, che la porta 2049 sia aperta e che l’elenco delle esportazioni (showmount -e) sia disponibile. Se la connessione funziona ma lo storage rimane inattivo, controlla journalctl -u pvestatd e la configurazione server/esportazione. Ripristina prima connessione o permessi. pvesm set <id> --disable 0 abilita uno storage disabilitato; non è una riparazione generica di NFS.", "lxcNoWriteTitle": "Il montaggio fstab funziona ma il LXC non privilegiato non può scrivere tramite bind mount", "lxcNoWriteBody": "L’accesso NFS dipende da proprietari, ACL e squash sul server. Le opzioni CIFS uid= e file_mode= non si applicano a NFS. Con la mappatura LXC predefinita, root nel CT diventa UID 100000 sull’host, non UID remoto 0. Configura l’accesso per l’UID/GID mappato effettivo o l’identità anonima del server. no_root_squash riguarda solo l’UID remoto 0 e non risolve ogni caso di UID 100000. Lo script tenta chmod 1777 ma non aggira i permessi del server.", "fstabBootTitle": "fstab mount non arriva dopo il riavvio", diff --git a/web/messages/it/docs/storage-share/host-samba.json b/web/messages/it/docs/storage-share/host-samba.json index 52c70806..7d820d08 100644 --- a/web/messages/it/docs/storage-share/host-samba.json +++ b/web/messages/it/docs/storage-share/host-samba.json @@ -91,7 +91,7 @@ "warnTitle": "Live dischi VM su CIFS", "warnBody": "Selezionare images attiva un avviso ProxMenux: CIFS/SMB può causare problemi di blocco nelle operazioni sui dischi VM. Lo script consiglia NFS ma consente di continuare. Backup e ISO sono usi comuni di CIFS. Valuta blocchi, snapshot, migrazione e carico prima di usare CIFS per images.", "credsTitle": "Dove pvesm memorizza le credenziali", - "credsBody": "La password non è scritta in /etc/pve/storage.cfg. Proxmox salva credenziali in chiaro in /etc/pve/priv/storage/<storage-id>.pw, protette dalla directory privata del file system del cluster accessibile a root. Non presumere una modalità fissa 0600 o la cifratura. Dopo un cambio password sul server usa pvesm set <id> --password <new> oppure rimuovi e aggiungi lo storage tramite ProxMenux." + "credsBody": "La password non è scritta in /etc/pve/storage.cfg. Proxmox salva credenziali in chiaro in /etc/pve/priv/storage/<storage-id>.pw, nell’area privata del file system del cluster, leggibile solo da root (modalità 0600); sono protette dai permessi di accesso, non dalla cifratura. Dopo un cambio password sul server usa pvesm set <id> --password <new> oppure rimuovi e aggiungi lo storage tramite ProxMenux." }, "fstabBranch": { "heading": "Metodo B — solo montaggio tramite fstab sull’host", diff --git a/web/messages/pt/docs/storage-share/host-local-disk.json b/web/messages/pt/docs/storage-share/host-local-disk.json index cdb3a4ad..88588111 100644 --- a/web/messages/pt/docs/storage-share/host-local-disk.json +++ b/web/messages/pt/docs/storage-share/host-local-disk.json @@ -78,7 +78,7 @@ "Escolha o sistema de arquivos — veja a tabela acima para trade-offs.", "ID de armazenamento (padrão disk-<device>), caminho de montagem, tipo de conteúdo predefinido.", "Confirme no diálogo CONFIRMAÇÃO FINAL — OS DADOS SERÃO APAGADOS.", - "O ProxMenux limpa a tabela de partições e cria uma partição que ocupa o disco. Executa mkfs.<fs> ou zpool create e monta o resultado. Sistemas de arquivos comuns recebem uma entrada UUID em /etc/fstab com defaults,nofail; o ZFS usa a configuração de montagem do pool. O registro usa pvesm add dir ou pvesm add zfspool." + "O ProxMenux limpa a tabela de partições e cria uma partição que ocupa o disco. Executa mkfs.<fs> ou zpool create e monta o resultado. Sistemas de arquivos comuns recebem uma entrada UUID em /etc/fstab com defaults,nofail; o ZFS usa a configuração de montagem do pool. Se Como armazenamento Proxmox estiver marcado (sempre no caso do ZFS), ele é registrado com pvesm add dir ou pvesm add zfspool; caso contrário, fica apenas como montagem do host." ], "tipTitle": "Porquê UUID + nofail em /etc/fstab", "tipBody": "O script escreve UUID=… /mnt/<id> <fs> defaults,nofail 0 2. O UUID sobrevive à reordenação do dispositivo através de reinicialização (então o /dev/sdc tornando-se o /dev/sdd não quebra a inicialização). nofail significa que se o disco desaparecer (falha de Hardware, desconectado), o Proxmox ainda inicia — o armazenamento só será mostrado como inativo até que o disco volte." diff --git a/web/messages/pt/docs/storage-share/host-nfs.json b/web/messages/pt/docs/storage-share/host-nfs.json index 52396bfa..2e8471a4 100644 --- a/web/messages/pt/docs/storage-share/host-nfs.json +++ b/web/messages/pt/docs/storage-share/host-nfs.json @@ -145,7 +145,7 @@ "showmountTitle": "\"Falhou em conectar\" do showmount", "showmountBody": "O servidor recusou a consulta da lista de exportação. Causas comuns: o servidor obriga ACLs cliente restrito (seu IP Proxmox não está na lista permitida), rpcbind não está em execução no servidor, ou o servidor expõe apenas NFSv4 com showmount desabilitado. O caminho de exportação ainda pode ser adicionado manualmente se você souber.", "inactiveTitle": "O armazenamento mostra como inativo na UI Proxmox", - "inactiveBody": "Execute Testar conectividade NFS para verificar DNS, portas e acesso à montagem. Se a conexão funcionar mas o armazenamento continuar inativo, consulte journalctl -u pvestatd e a configuração do servidor/exportação. Corrija primeiro a conexão ou os privilégios. pvesm set <id> --disable 0 habilita um armazenamento desabilitado; não é um reparo geral de NFS.", + "inactiveBody": "Execute primeiro Testar conectividade NFS: ele verifica se o servidor responde ao ping, se a porta 2049 está aberta e se a lista de exportações (showmount -e) está disponível. Se a conexão funcionar mas o armazenamento continuar inativo, consulte journalctl -u pvestatd e a configuração do servidor/exportação. Corrija primeiro a conexão ou os privilégios. pvesm set <id> --disable 0 habilita um armazenamento desabilitado; não é um reparo geral de NFS.", "lxcNoWriteTitle": "A montagem fstab funciona mas o LXC sem privilégios não consegue gravar por bind mount", "lxcNoWriteBody": "O acesso NFS depende de proprietários, ACLs e squash no servidor. Opções CIFS como uid= e file_mode= não se aplicam a NFS. Com o mapeamento LXC padrão, root no CT vira UID 100000 no host, não UID remoto 0. Configure o acesso para o UID/GID mapeado real ou a identidade anônima do servidor. no_root_squash afeta apenas o UID remoto 0 e não resolve todos os casos de UID 100000. O script tenta chmod 1777, mas não ignora permissões do servidor.", "fstabBootTitle": "A montagem do fstab não aparece após reiniciar", diff --git a/web/messages/pt/docs/storage-share/host-samba.json b/web/messages/pt/docs/storage-share/host-samba.json index 1d75713a..c0bf69fc 100644 --- a/web/messages/pt/docs/storage-share/host-samba.json +++ b/web/messages/pt/docs/storage-share/host-samba.json @@ -91,7 +91,7 @@ "warnTitle": "Discos de VM vivos em CIFS", "warnBody": "Selecionar images mostra um aviso ProxMenux: CIFS/SMB pode causar problemas de bloqueio em operações com discos de VMs. O script recomenda NFS, mas permite continuar. Backups e ISOs são usos comuns de CIFS. Avalie bloqueios, snapshots, migração e carga antes de usar CIFS para images.", "credsTitle": "Onde o pvesm armazena credenciais", - "credsBody": "A senha não é gravada em /etc/pve/storage.cfg. O Proxmox salva credenciais em texto simples em /etc/pve/priv/storage/<storage-id>.pw, protegidas pelo diretório privado do sistema de arquivos do cluster acessível a root. Não suponha modo fixo 0600 nem criptografia. Após mudar a senha no servidor, use pvesm set <id> --password <new> ou remova e adicione o armazenamento pelo ProxMenux." + "credsBody": "A senha não é gravada em /etc/pve/storage.cfg. O Proxmox salva credenciais em texto simples em /etc/pve/priv/storage/<storage-id>.pw, na área privada do sistema de arquivos do cluster, legível apenas por root (modo 0600); elas são protegidas por permissões de acesso, não por criptografia. Após mudar a senha no servidor, use pvesm set <id> --password <new> ou remova e adicione o armazenamento pelo ProxMenux." }, "fstabBranch": { "heading": "Método B — Montagem fstab da máquina", diff --git a/web/messages/sk/docs/storage-share/host-local-disk.json b/web/messages/sk/docs/storage-share/host-local-disk.json index 035633f7..e3ca9cbb 100644 --- a/web/messages/sk/docs/storage-share/host-local-disk.json +++ b/web/messages/sk/docs/storage-share/host-local-disk.json @@ -78,7 +78,7 @@ "Vyberte súborový systém — porovnanie výhod a nevýhod je v tabuľke vyššie.", "ID úložiska (predvolene disk-<device>), cesta pripojenia a predvoľba typu obsahu.", "Potvrďte v dialógu KONEČNÉ POTVRDENIE — DÁTA SA VYMAŽÚ.", - "ProxMenux vymaže tabuľku oddielov a vytvorí jeden oddiel na celom disku. Spustí mkfs.<fs> alebo zpool create a výsledok pripojí. Bežné súborové systémy dostanú položku UUID v /etc/fstab s defaults,nofail; ZFS používa konfiguráciu pripojenia poolu. Registrácia používa pvesm add dir alebo pvesm add zfspool." + "ProxMenux vymaže tabuľku oddielov a vytvorí jeden oddiel na celom disku. Spustí mkfs.<fs> alebo zpool create a výsledok pripojí. Bežné súborové systémy dostanú položku UUID v /etc/fstab s defaults,nofail; ZFS používa konfiguráciu pripojenia poolu. Ak je označené Ako úložisko Proxmoxu (pri ZFS vždy), následne sa zaregistruje cez pvesm add dir alebo pvesm add zfspool; inak zostane len pripojením na hostiteľovi." ], "tipTitle": "Prečo UUID + nofail v /etc/fstab", "tipBody": "Skript zapíše UUID=… /mnt/<id> <fs> defaults,nofail 0 2. UUID zostane rovnaké aj pri zmene poradia zariadení po reštarte, takže premenovanie /dev/sdc na /dev/sdd nenaruší štart. S nofail sa Proxmox spustí aj pri chýbajúcom disku (porucha alebo odpojenie); úložisko sa bude zobrazovať ako neaktívne, kým sa disk nevráti." diff --git a/web/messages/sk/docs/storage-share/host-nfs.json b/web/messages/sk/docs/storage-share/host-nfs.json index 88602472..fd90b99a 100644 --- a/web/messages/sk/docs/storage-share/host-nfs.json +++ b/web/messages/sk/docs/storage-share/host-nfs.json @@ -145,7 +145,7 @@ "showmountTitle": "„Failed to connect“ z príkazu showmount", "showmountBody": "Server odmietol dotaz exportného zoznamu. Bežné príčiny: server vymáha prísne klientske ACL (vaše Proxmox IP nie je na povolenom zozname), rpcbind nebeží na serveri, alebo server vystaví iba NFSv4 s showmount vypnutým. Exportná cesta môže byť stále pridaná ručne, ak ju poznáte.", "inactiveTitle": "Úložisko ukazuje ako neaktívne v systéme Proxmox UI", - "inactiveBody": "Spustite Testovať pripojenie NFS a overte DNS, porty aj prístup. Ak spojenie funguje, ale úložisko zostáva neaktívne, skontrolujte journalctl -u pvestatd a konfiguráciu servera/exportu. Najprv opravte spojenie alebo oprávnenia. Príkaz pvesm set <id> --disable 0 zapne vypnuté úložisko; nie je všeobecnou opravou chýb NFS.", + "inactiveBody": "Najprv spustite Testovať pripojenie NFS: overí, či server odpovedá na ping, či je otvorený port 2049 a či je dostupný zoznam exportov (showmount -e). Ak spojenie funguje, ale úložisko zostáva neaktívne, skontrolujte journalctl -u pvestatd a konfiguráciu servera/exportu. Najprv opravte spojenie alebo oprávnenia. Príkaz pvesm set <id> --disable 0 zapne vypnuté úložisko; nie je všeobecnou opravou chýb NFS.", "lxcNoWriteTitle": "Pripojenie fstab funguje, ale neprivilegovaný LXC nemôže zapisovať cez bind mount", "lxcNoWriteBody": "Prístup NFS závisí od vlastníkov, ACL a nastavení squash na serveri. Voľby CIFS uid= a file_mode= pre NFS neplatia. Pri predvolenom mapovaní LXC má root z CT na hostiteľovi UID 100000, nie vzdialené UID 0. Povoľte prístup skutočnému mapovanému UID/GID alebo anonymnej identite servera. no_root_squash ovplyvňuje iba vzdialené UID 0 a nie je všeobecným riešením pre UID 100000. Skript skúsi chmod 1777, ale oprávnenia servera neobíde.", "fstabBootTitle": "fstab mount nepríde po reštarte", diff --git a/web/messages/sk/docs/storage-share/host-samba.json b/web/messages/sk/docs/storage-share/host-samba.json index a17b0da9..dca9ba3c 100644 --- a/web/messages/sk/docs/storage-share/host-samba.json +++ b/web/messages/sk/docs/storage-share/host-samba.json @@ -91,7 +91,7 @@ "warnTitle": "Živé disky VM na CIFS", "warnBody": "Výber images zobrazí varovanie ProxMenuxu: CIFS/SMB môže spôsobovať problémy so zámkami pri operáciách s diskami VM. Skript odporúča NFS, ale umožní pokračovať. Zálohy a ISO sú bežným použitím CIFS. Pred použitím pre images posúďte zámky, snímky, migráciu a záťaž.", "credsTitle": "Kde pvesm ukladá údaje", - "credsBody": "Heslo sa nezapisuje do /etc/pve/storage.cfg. Proxmox uloží údaje v otvorenom texte do /etc/pve/priv/storage/<storage-id>.pw, chránené súkromným adresárom klastrového súborového systému prístupným pre root. Nepredpokladajte pevný režim 0600 ani šifrovanie. Po zmene hesla na serveri použite pvesm set <id> --password <new> alebo úložisko odstráňte a pridajte cez ProxMenux." + "credsBody": "Heslo sa nezapisuje do /etc/pve/storage.cfg. Proxmox uloží údaje v otvorenom texte do /etc/pve/priv/storage/<storage-id>.pw, v súkromnej oblasti klastrového súborového systému, ktorú môže čítať iba root (režim 0600); chránia ich prístupové práva, nie šifrovanie. Po zmene hesla na serveri použite pvesm set <id> --password <new> alebo úložisko odstráňte a pridajte cez ProxMenux." }, "fstabBranch": { "heading": "Metóda B — iba pripojenie cez fstab hostiteľa", diff --git a/web/messages/sv/docs/storage-share/host-local-disk.json b/web/messages/sv/docs/storage-share/host-local-disk.json index 030c4af2..f0e1d7ae 100644 --- a/web/messages/sv/docs/storage-share/host-local-disk.json +++ b/web/messages/sv/docs/storage-share/host-local-disk.json @@ -78,7 +78,7 @@ "Välj filsystemet - se tabellen ovan för avvägningar.", "Lagring ID (standard disk-<device>), monteringsväg, innehållstyp förinställd.", "Bekräfta i dialogen SLUTLIG BEKRÄFTELSE — DATA KOMMER ATT RADERAS.", - "ProxMenux rensar partitionstabellen och skapar en partition över hela disken. Det kör mkfs.<fs> eller zpool create och monterar resultatet. Vanliga filsystem får en UUID-post i /etc/fstab med defaults,nofail; ZFS använder poolens monteringskonfiguration. Registreringen görs med pvesm add dir eller pvesm add zfspool." + "ProxMenux rensar partitionstabellen och skapar en partition över hela disken. Det kör mkfs.<fs> eller zpool create och monterar resultatet. Vanliga filsystem får en UUID-post i /etc/fstab med defaults,nofail; ZFS använder poolens monteringskonfiguration. Om Som Proxmox-lagring är markerat (alltid för ZFS) registreras den sedan med pvesm add dir eller pvesm add zfspool; annars förblir den bara en montering på värden." ], "tipTitle": "Varför UUID + nofail i /etc/fstab", "tipBody": "Skriptet skriver UUID=… /mnt/<id> <fs> defaults,nofail 0 2. UUID överlever enhetsreordering över omstart (så /dev/sdc blir /dev/sdd inte bryta start). nofail innebär att om disken någonsin försvinner (hårdvarufel, urkopplad), startar Proxmox ändå - lagring kommer bara att visas som inaktiv tills disken kommer tillbaka." diff --git a/web/messages/sv/docs/storage-share/host-nfs.json b/web/messages/sv/docs/storage-share/host-nfs.json index c520353e..bf3fe357 100644 --- a/web/messages/sv/docs/storage-share/host-nfs.json +++ b/web/messages/sv/docs/storage-share/host-nfs.json @@ -145,7 +145,7 @@ "showmountTitle": "\"Fel att ansluta\" från showmount", "showmountBody": "Servern vägrade exportlistafrågan. Vanliga orsaker: servern genomdriver strikta klient ACL (din Proxmox IP är inte på den tillåtna listan), rpcbind körs inte på servern, eller servern exponerar endast NFSv4 med showmount inaktiverat. Exportvägen kan fortfarande läggas manuellt om du vet det.", "inactiveTitle": "Lagring visar som inaktiv i Proxmox UI", - "inactiveBody": "Kör Testa NFS-anslutning för att undersöka DNS, portar och monteringsåtkomst. Om anslutningen fungerar men lagringen förblir inaktiv, kontrollera journalctl -u pvestatd och serverns/exportens inställningar. Återställ först anslutning eller behörigheter. pvesm set <id> --disable 0 aktiverar inaktiverad lagring; det är ingen allmän reparation av NFS-fel.", + "inactiveBody": "Kör först Testa NFS-anslutning: den kontrollerar att servern svarar på ping, att port 2049 är öppen och att exportlistan (showmount -e) är tillgänglig. Om anslutningen fungerar men lagringen förblir inaktiv, kontrollera journalctl -u pvestatd och serverns/exportens inställningar. Återställ först anslutning eller behörigheter. pvesm set <id> --disable 0 aktiverar inaktiverad lagring; det är ingen allmän reparation av NFS-fel.", "lxcNoWriteTitle": "fstab montering fungerar men oprivilegierad LXC kan inte skriva genom en bind-mount", "lxcNoWriteBody": "NFS-åtkomst beror på serverns ägare, ACL:er och squash-inställningar. CIFS-alternativ som uid= och file_mode= gäller inte för NFS. Med LXC:s standardmappning blir CT-root värdens UID 100000, inte fjärr-UID 0. Ge åtkomst till det faktiska mappade UID/GID:t eller serverns anonyma identitet. no_root_squash påverkar endast fjärr-UID 0 och löser inte alla fall med UID 100000. Skriptet försöker köra chmod 1777 men kan inte kringgå serverns behörigheter.", "fstabBootTitle": "fstab montering kommer inte upp efter omstart", diff --git a/web/messages/sv/docs/storage-share/host-samba.json b/web/messages/sv/docs/storage-share/host-samba.json index c80a971c..2ec63e3b 100644 --- a/web/messages/sv/docs/storage-share/host-samba.json +++ b/web/messages/sv/docs/storage-share/host-samba.json @@ -91,7 +91,7 @@ "warnTitle": "Live VM diskar på CIFS", "warnBody": "Valet images visar en ProxMenux-varning om att CIFS/SMB kan ge låsningsproblem vid VM-diskoperationer. Skriptet rekommenderar NFS men låter dig fortsätta. Säkerhetskopior och ISO-filer är vanliga CIFS-användningar. Bedöm låsning, ögonblicksbilder, migrering och arbetslast innan CIFS används för images.", "credsTitle": "Var pvesm lagrar inloggningsuppgifter", - "credsBody": "Lösenordet skrivs inte i /etc/pve/storage.cfg. Proxmox sparar klartextuppgifter i /etc/pve/priv/storage/<storage-id>.pw, skyddade av klusterfilsystemets privata katalog för root. Förutsätt varken ett fast filläge 0600 eller kryptering. Efter ett lösenordsbyte på servern använder du pvesm set <id> --password <new> eller tar bort och lägger till lagringen via ProxMenux." + "credsBody": "Lösenordet skrivs inte i /etc/pve/storage.cfg. Proxmox sparar klartextuppgifter i /etc/pve/priv/storage/<storage-id>.pw, i klusterfilsystemets privata område som bara root kan läsa (läge 0600); de skyddas av åtkomstbehörigheter, inte av kryptering. Efter ett lösenordsbyte på servern använder du pvesm set <id> --password <new> eller tar bort och lägger till lagringen via ProxMenux." }, "fstabBranch": { "heading": "Metod B - Värd fstab montering endast", From 2efd775559a89dd4ac71ba8bf36b44bbe8269228 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:51:26 +0200 Subject: [PATCH 64/73] Keep the curated Spanish backup and restore docs - The reviewed Spanish text is kept where the English source is unchanged - New and changed texts follow the glossary and the Spanish interface --- .../docs/backup-restore/creating-backups.json | 90 +++++++++---------- .../es/docs/backup-restore/cross-kernel.json | 38 ++++---- .../backup-restore/destinations/borg.json | 32 +++---- .../backup-restore/destinations/index.json | 30 +++---- .../backup-restore/destinations/local.json | 34 +++---- .../docs/backup-restore/destinations/pbs.json | 54 +++++------ .../es/docs/backup-restore/glossary.json | 62 ++++++------- .../es/docs/backup-restore/how-it-works.json | 40 ++++----- .../es/docs/backup-restore/index.json | 50 +++++------ .../es/docs/backup-restore/restoring.json | 42 ++++----- .../docs/backup-restore/scheduled-jobs.json | 42 ++++----- 11 files changed, 257 insertions(+), 257 deletions(-) diff --git a/web/messages/es/docs/backup-restore/creating-backups.json b/web/messages/es/docs/backup-restore/creating-backups.json index 71d2d5ab..b3805757 100644 --- a/web/messages/es/docs/backup-restore/creating-backups.json +++ b/web/messages/es/docs/backup-restore/creating-backups.json @@ -1,20 +1,20 @@ { "meta": { - "title": "Crear copias — flujo interactivo de copia | ProxMenux", - "description": "El flujo interactivo de copia de seguridad en ProxMenux. Dos puntos de entrada (el menú TUI de Scripts y la interfaz web de Monitor), tres destinos, dos modos de perfil, un paso de preparación temporal y un diálogo de confirmación. Documenta la matriz de seis opciones, los perfiles predeterminado y personalizado, y lo que ve el usuario desde que selecciona una copia hasta que el archivo se guarda en el destino.", - "ogTitle": "ProxMenux Backup — crear copias", - "ogDescription": "El flujo interactivo de copia con tres destinos, dos perfiles y un paso común de staging.", - "twitterTitle": "Crear copias | ProxMenux", - "twitterDescription": "Flujo interactivo de copia con tres destinos y dos modos de perfil." + "title": "Crear backups — flujo interactivo de backup | ProxMenux", + "description": "El flujo interactivo de backup en ProxMenux. Dos puntos de entrada (menú TUI de Scripts y UI Web del Monitor), tres destinos, dos modos de perfil, un paso común de staging y un diálogo de confirmación. Documenta la matriz de seis opciones, los perfiles Default y Custom, y qué ve el usuario entre seleccionar un backup y ver el archivo aterrizando en el destino.", + "ogTitle": "ProxMenux Backup — crear backups", + "ogDescription": "El flujo interactivo de backup con tres destinos, dos perfiles y un paso común de staging.", + "twitterTitle": "Crear backups | ProxMenux", + "twitterDescription": "Flujo interactivo de backup con tres destinos y dos modos de perfil." }, "header": { - "title": "Crear copias", - "description": "El flujo interactivo de copia de seguridad: elige un destino y un perfil, revisa el resumen de confirmación y observa cómo se guarda el archivo. Los dos puntos de entrada comparten el mismo backend y producen archivos idénticos.", - "section": "Copias de seguridad y restauración" + "title": "Crear backups", + "description": "El flujo interactivo de backup: elegir un destino y un perfil, revisar el resumen de confirmación, y ver el archivo aterrizando. Dos puntos de entrada comparten el mismo backend y producen archivos idénticos.", + "section": "Backup & Restore" }, "intro": { "title": "Dos puntos de entrada, funcionalidad idéntica", - "body": "El TUI de Scripts y la interfaz web de Monitor ofrecen exactamente las mismas funciones. Cada copia —manual o programada— pasa por la misma matriz de opciones (tres destinos × dos perfiles) y llama a la misma función del backend en cada celda (_bk_pbs, _bk_borg o _bk_local). Los archivos generados desde cualquiera de los dos puntos de entrada son indistinguibles. La elección depende de tus preferencias: el TUI se puede usar por SSH y mediante scripts; Monitor permite trabajar con clics y reúne las vistas de notificaciones y seguimiento del registro." + "body": "El TUI de Scripts y la UI Web del Monitor exponen exactamente la misma funcionalidad. Cada backup — manual o programado — pasa por la misma matriz de elección (tres destinos × dos perfiles) e invoca la misma función backend por celda (_bk_pbs, _bk_borg o _bk_local). Los archivos producidos desde uno u otro punto de entrada son indistinguibles. Cuál usar es una cuestión de preferencia: el TUI es amigable por SSH y admite scripting; el Monitor ofrece click-y-elegir y convive con las vistas de notificaciones y de tail del log." }, "entryPoints": { "heading": "Los dos puntos de entrada", @@ -26,17 +26,17 @@ }, { "entry": "ProxMenux Monitor (UI Web)", - "path": "Backups tab → Create backup", + "path": "Pestaña Backups → Create backup", "detail": "Flujo en estilo asistente. Las mismas seis opciones presentadas como formulario de dos pasos (destino → perfil). Se invocan las mismas funciones backend por la API Flask." } ] }, "modes": { - "heading": "Copias manuales vs programadas", - "body": "Las copias se pueden producir en dos modos: manuales (el flujo interactivo que documenta esta página — el usuario elige un destino y un perfil desde un menú y ve cómo se guarda el archivo) o programadas (un trabajo desatendido que se ejecuta en un timer estilo cron y aplica la retención configurada en el trabajo). Ambos modos soportan los mismos tres destinos y los mismos dos perfiles, y ambos están disponibles desde los dos puntos de entrada — el menú TUI de Scripts y la pestaña Backups del Monitor. Los trabajos programados usan las mismas funciones backend que el flujo manual a través de run_scheduled_backup.sh; los archivos producidos son indistinguibles.", + "heading": "Backups manuales vs programados", + "body": "Los backups se pueden producir en dos modos: manuales (el flujo interactivo que documenta esta página — el usuario elige un destino y un perfil desde un menú y ve el archivo aterrizando) o programadas (un trabajo desatendido que se ejecuta en un timer estilo cron y aplica la retención configurada en el trabajo). Ambos modos soportan los mismos tres destinos y los mismos dos perfiles, y ambos están disponibles desde los dos puntos de entrada — el menú TUI de Scripts y la pestaña Backups del Monitor. Los trabajos programados usan las mismas funciones backend que el flujo manual a través de run_scheduled_backup.sh; los archivos producidos son indistinguibles.", "seeAlso": "La página de trabajos programados cubre el flujo completo, incluyendo cómo crear un trabajo, adjuntarlo a un timer vzdump de PVE existente, y configurar los valores de retención.", "monitorAlt": "Pestaña Backups del Monitor de ProxMenux mostrando el diálogo New scheduled backup con los campos de destino, perfil, horario y retención.", - "monitorCaption": "Copia programada — Monitor de ProxMenux. El mismo diálogo estilo asistente que crea una copia manual lleva los campos de horario y retención al final para la ruta desatendida." + "monitorCaption": "Backup programado — Monitor de ProxMenux. El mismo diálogo estilo asistente que crea un backup manual lleva los campos de horario y retención al final para la ruta desatendida." }, "matrix": { "heading": "La matriz de seis opciones", @@ -45,51 +45,51 @@ { "combo": "1", "destination": "PBS", - "profile": "Por defecto", + "profile": "Default", "action": "Sube el perfil por defecto más los extras persistentes a un repositorio PBS configurado." }, { "combo": "2", "destination": "Borg", - "profile": "Por defecto", + "profile": "Default", "action": "Crea un archivo con el perfil por defecto más los extras persistentes en el repositorio Borg seleccionado." }, { "combo": "3", "destination": "Local", - "profile": "Por defecto", + "profile": "Default", "action": "Escribe un archivo .tar.zst con el perfil por defecto más los extras persistentes en el destino local configurado." }, { "combo": "4", "destination": "PBS", - "profile": "Personalizado", - "action": "Abre el selector de rutas antes de la subida a PBS; el usuario marca las rutas y puede añadir otras nuevas." + "profile": "Custom", + "action": "Abre el path picker antes de la subida a PBS; el usuario marca rutas y puede añadir nuevas." }, { "combo": "5", "destination": "Borg", - "profile": "Personalizado", - "action": "Abre el selector de rutas antes de crear el archivo Borg." + "profile": "Custom", + "action": "Abre el path picker antes de crear el archivo Borg." }, { "combo": "6", "destination": "Local", - "profile": "Personalizado", - "action": "Abre el selector de rutas antes de escribir el .tar.zst local." + "profile": "Custom", + "action": "Abre el path picker antes de escribir el .tar.zst local." } ] }, "profiles": { - "heading": "Perfil predeterminado y personalizado", - "defaultTitle": "Perfil predeterminado", - "defaultBody": "El perfil por defecto es la lista curada de hb_default_profile_paths (documentada en Cómo funciona bajo Categorías de rutas) más cada entrada del fichero de extras persistentes /usr/local/share/proxmenux/backup-extra-paths.txt. El usuario confirma el destino y las opciones de cifrado y la copia continúa sin más selección de rutas.", - "customTitle": "Perfil personalizado", - "customBody": "El perfil Custom abre un checklist mostrando cada ruta del perfil por defecto (sin marcar) y cada extra persistente (premarcado, prefijado con [+]). El usuario marca el conjunto para esa ejecución y puede pulsar Add custom path para añadir una nueva ruta absoluta. Cualquier ruta añadida en línea se persiste en backup-extra-paths.txt para que futuras copias la recojan automáticamente sin volver a añadirla. Quitar la marca a un extra persistente lo desmarca para esa ejecución pero no lo elimina del fichero — la eliminación es una acción Manage custom paths separada, fuera del flujo de copia.", + "heading": "Perfil Default vs Custom", + "defaultTitle": "Perfil Default", + "defaultBody": "El perfil por defecto es la lista curada de hb_default_profile_paths (documentada en Cómo funciona bajo Categorías de rutas) más cada entrada del fichero de extras persistentes /usr/local/share/proxmenux/backup-extra-paths.txt. El usuario confirma el destino y las opciones de cifrado y el backup continúa sin más selección de rutas.", + "customTitle": "Perfil Custom", + "customBody": "El perfil Custom abre un checklist mostrando cada ruta del perfil por defecto (sin marcar) y cada extra persistente (premarcado, prefijado con [+]). El usuario marca el conjunto para esa ejecución y puede pulsar Add custom path para añadir una nueva ruta absoluta. Cualquier ruta añadida en línea se persiste en backup-extra-paths.txt para que futuros backups la recojan automáticamente sin volver a añadirla. Quitar la marca a un extra persistente lo desmarca para esa ejecución pero no lo elimina del fichero — la eliminación es una acción Manage custom paths separada, fuera del flujo de backup.", "customPickerAlt": "Checklist del perfil Custom mostrando las rutas del perfil por defecto (sin marcar) y los extras persistentes (premarcados con prefijo [+]), más botones para añadir una ruta nueva o confirmar la selección.", "customPickerCaption": "Perfil Custom — el path picker. Las rutas del perfil por defecto aparecen sin marcar; los extras persistentes aparecen premarcados con prefijo [+]. El usuario marca el conjunto para esa ejecución.", "manageCustomAlt": "Menú Manage custom paths mostrando la lista de extras persistentes y opciones para añadirlos, eliminarlos o editarlos.", - "manageCustomCaption": "Manage custom paths — el punto de entrada donde se añaden o eliminan los extras persistentes. Cada ruta listada aquí se incluye automáticamente en las copias en modo Default sin necesidad de abrir el picker Custom." + "manageCustomCaption": "Manage custom paths — el punto de entrada donde se añaden o eliminan los extras persistentes. Cada ruta listada aquí se incluye automáticamente en los backups en modo Default sin necesidad de abrir el picker Custom." }, "commonPipeline": { "heading": "Qué se ejecuta con independencia del destino", @@ -98,7 +98,7 @@ { "step": "1", "name": "Ensamblado del rootfs", - "detail": "Ejecuta rsync -a por cada ruta seleccionada hacia staging_root/rootfs/. La base pmxcfs en /var/lib/pve-cluster/config.db se captura aparte con sqlite3 .backup para obtener un snapshot consistente sin parar el clúster, y los sidecars .db-wal / .db-shm se excluyen del rsync; si sqlite3 no está disponible, se deposita un config.db.raw-fallback que la restauración promociona al importar. Excluye subrutas volátiles (historial de bash, cachés, papelera) de /root/. Las rutas ausentes en el origen se registran en metadata/missing_paths.txt sin detener la copia." + "detail": "Ejecuta rsync -a por cada ruta seleccionada hacia staging_root/rootfs/. La base pmxcfs en /var/lib/pve-cluster/config.db se captura aparte con sqlite3 .backup para obtener un snapshot consistente sin parar el clúster, y los sidecars .db-wal / .db-shm se excluyen del rsync; si sqlite3 no está disponible, se deposita un config.db.raw-fallback que la restauración promociona al importar. Excluye subrutas volátiles (historial de bash, cachés, papelera) de /root/. Las rutas ausentes en el origen se registran en metadata/missing_paths.txt sin detener el backup." }, { "step": "2", @@ -113,12 +113,12 @@ { "step": "4", "name": "Info de la ejecución", - "detail": "metadata/run_info.env registra la identidad de la ejecución de copia — hostname, timestamp, versión del kernel — usada por el chequeo de compatibilidad de la restauración para determinar la dirección cross-kernel." + "detail": "metadata/run_info.env registra la identidad de la ejecución de backup — hostname, timestamp, versión del kernel — usada por el chequeo de compatibilidad de la restauración para determinar la dirección cross-kernel." }, { "step": "5", "name": "Notificación (start)", - "detail": "Se ejecuta hb_notify_lifecycle \"start\". Si las notificaciones están configuradas en Monitor, se emite un evento Copia de seguridad del host iniciada para el usuario. No se envía nada si no hay canales configurados." + "detail": "Se dispara hb_notify_lifecycle \"start\". Si las notificaciones están configuradas en el Monitor, se emite un evento usuario-facing Host backup started. Silencioso si no hay canales configurados." } ] }, @@ -150,9 +150,9 @@ "ProxMenux-Monitor.AppImage*, install_proxmenux*.sh" ], "notInProfileTitle": "Rutas fuera del perfil", - "notInProfileBody": "Todo lo que no esté listado en hb_default_profile_paths y no se haya añadido como ruta custom o extra persistente no forma parte de la copia. Ejemplos notables:", + "notInProfileBody": "Todo lo que no esté listado en hb_default_profile_paths y no se haya añadido como ruta custom o extra persistente no forma parte del backup. Ejemplos notables:", "notInProfileItems": [ - "Discos de VMs y LXCs — los gestiona vzdump, no esta funcionalidad. Los ficheros de configuración de los invitados bajo /etc/pve/nodes/*/qemu-server/*.conf y lxc/*.conf sí se capturan (viven bajo /etc/pve) para que la restauración reproduzca el inventario; los discos se re-adjuntan desde una copia existente de vzdump/PBS.", + "Discos de VMs y LXCs — los gestiona vzdump, no esta funcionalidad. Los ficheros de configuración de los invitados bajo /etc/pve/nodes/*/qemu-server/*.conf y lxc/*.conf sí se capturan (viven bajo /etc/pve) para que la restauración reproduzca el inventario; los discos se re-adjuntan desde un backup existente de vzdump/PBS.", "/boot y /boot/efi — los binarios del kernel, el initramfs y la partición ESP UEFI los regenera el propio destino con update-initramfs, update-grub o proxmox-boot-tool refresh tras la restauración. El bootloader nunca se copia verbatim.", "Filesystems runtime del kernel y sistema — /proc, /sys, /dev y /run son pseudo-filesystems que produce el kernel y udev; no se persisten en ningún sitio.", "Binarios de paquetes bajo /usr/bin, /usr/lib, /lib, /sbin — los reinstala el APT del destino a partir de packages.manual.list.", @@ -160,16 +160,16 @@ "/home/USER — no está en el perfil por defecto. Añadirlo como ruta custom cuando un sistema tenga directorios home de usuario que deban sobrevivir a una restauración." ], "customPathsTitle": "Cómo se tratan las rutas custom", - "customPathsBody": "Una ruta custom añadida en línea en modo Custom o persistida en backup-extra-paths.txt pasa por el mismo pipeline de rsync que las rutas del perfil por defecto. Se aplican las exclusiones globales. Si la ruta custom está bajo /root/ o /usr/local/share/proxmenux/, siguen aplicando las exclusiones específicas de arriba. Cada ruta archivada — default o custom — queda registrada en metadata/paths_archived.txt. Las rutas que no existen en el origen se registran en metadata/missing_paths.txt sin detener la copia." + "customPathsBody": "Una ruta custom añadida en línea en modo Custom o persistida en backup-extra-paths.txt pasa por el mismo pipeline de rsync que las rutas del perfil por defecto. Se aplican las exclusiones globales. Si la ruta custom está bajo /root/ o /usr/local/share/proxmenux/, siguen aplicando las exclusiones específicas de arriba. Cada ruta archivada — default o custom — queda registrada en metadata/paths_archived.txt. Las rutas que no existen en el origen se registran en metadata/missing_paths.txt sin detener el backup." }, "archiveStructure": { "heading": "Estructura del archivo", "intro": "El directorio de staging que produce cada backend sigue el mismo layout con independencia del destino. El tarball, el .pxar de PBS o el archivo Borg almacenan este árbol verbatim.", - "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│ ├── paths_archived.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" + "tree": "backup-[timestamp]/\n├── manifest.json # estado estructurado del host (kernel_params, hardware, storage, guests, components, source_host)\n├── metadata/\n│ ├── packages.manual.list # salida de apt-mark showmanual\n│ ├── run_info.env # hostname, timestamp, versión del kernel, método pmxcfs\n│ ├── paths_archived.txt # lista exacta de rutas que llegaron a rootfs/\n│ └── missing_paths.txt # rutas del perfil ausentes en el origen\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, /etc/apt, ...\n ├── root/ # /root sin subpaths volátiles\n ├── usr/local/ # /usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux (sólo estado)\n └── var/ # /var/lib/pve-cluster (config.db vía sqlite3 .backup), /var/spool/cron/crontabs" }, "confirmation": { "heading": "Resumen de confirmación", - "body": "Antes de que el backend escriba nada en el destino, ProxMenux muestra un diálogo resumen con el destino, el backup ID o nombre del archivo, el estado del cifrado y la lista de rutas que se copian. Cancelar aquí aborta la copia limpiamente — el directorio de staging se elimina por el hook trap definido en la función backend y ningún dato parcial llega al destino." + "body": "Antes de que el backend escriba nada en el destino, ProxMenux muestra un diálogo resumen con el destino, el backup ID o nombre del archivo, el estado del cifrado y la lista de rutas que se copian. Cancelar aquí aborta el backup limpiamente — el directorio de staging se elimina por el hook trap definido en la función backend y ningún dato parcial llega al destino." }, "writing": { "heading": "Escritura en el destino", @@ -181,21 +181,21 @@ }, { "topic": "Sidecar (sólo local)", - "detail": "hb_write_archive_sidecar deposita un *.proxmenux.json junto al archivo local para que el Monitor lo identifique como copia de host de ProxMenux incluso tras movimientos o renombrados." + "detail": "hb_write_archive_sidecar deposita un *.proxmenux.json junto al archivo local para que el Monitor lo identifique como backup de host de ProxMenux incluso tras movimientos o renombrados." }, { - "topic": "Notificación (éxito o fallo)", + "topic": "Notificación (complete/fail)", "detail": "Se dispara hb_notify_lifecycle \"complete\" o \"fail\" con duración, tamaño del archivo y — en fallos — la última línea del log que parezca un error." } ] }, "finishedScreens": { - "heading": "Cómo se ve una copia finalizada", + "heading": "Cómo se ve un backup finalizado", "intro": "El mismo evento de finalización lo exponen los dos puntos de entrada. El TUI escribe un bloque resumen en el terminal; la pestaña Backups del Monitor muestra la ejecución en la lista de archivos con badges de tamaño, duración y estado.", - "scriptsAlt": "TUI de ProxMenux Scripts mostrando una copia de host finalizada — destino, backup ID, ruta del snapshot, tamaño de datos, duración y estado de cifrado.", - "scriptsCaption": "Copia finalizada — ProxMenux Scripts (TUI). El bloque de finalización imprime el destino, backup ID, nombre del snapshot o archivo resultante, tamaño de datos, duración y estado de cifrado.", - "monitorAlt": "Pestaña Backups del Monitor de ProxMenux mostrando una entrada de copia de host finalizada con tamaño, duración, badge del método y indicador de cifrado.", - "monitorCaption": "Copia finalizada — pestaña Backups del Monitor de ProxMenux. La nueva copia aparece en la lista de archivos con el badge del método del destino, tamaño, duración y — cuando aplica — el indicador de cifrado." + "scriptsAlt": "TUI de ProxMenux Scripts mostrando un backup de host finalizado — destino, backup ID, ruta del snapshot, tamaño de datos, duración y estado de cifrado.", + "scriptsCaption": "Backup finalizado — ProxMenux Scripts (TUI). El bloque de finalización imprime el destino, backup ID, nombre del snapshot o archivo resultante, tamaño de datos, duración y estado de cifrado.", + "monitorAlt": "Pestaña Backups del Monitor de ProxMenux mostrando una entrada de backup de host finalizado con tamaño, duración, badge del método y indicador de cifrado.", + "monitorCaption": "Backup finalizado — pestaña Backups del Monitor de ProxMenux. El nuevo backup aparece en la lista de archivos con el badge del método del destino, tamaño, duración y — cuando aplica — el indicador de cifrado." }, "whereNext": { "heading": "A dónde seguir", @@ -208,7 +208,7 @@ { "label": "Trabajos programados", "href": "/docs/backup-restore/scheduled-jobs", - "tail": " — ejecutar la misma copia desatendida en un horario en lugar de interactivamente." + "tail": " — ejecutar el mismo backup desatendido en un horario en lugar de interactivamente." }, { "label": "Restauración", diff --git a/web/messages/es/docs/backup-restore/cross-kernel.json b/web/messages/es/docs/backup-restore/cross-kernel.json index 33c6acca..9dfe82c4 100644 --- a/web/messages/es/docs/backup-restore/cross-kernel.json +++ b/web/messages/es/docs/backup-restore/cross-kernel.json @@ -1,52 +1,52 @@ { "meta": { "title": "Restauración cross-kernel — detección de dirección, filtro de subconjunto seguro, hidratación | ProxMenux", - "description": "Cómo restaura ProxMenux una copia de host sobre un destino con un kernel de versión mayor distinta. Documenta cómo se detecta la dirección del salto, el filtro de subconjunto seguro que salta rutas críticas del arranque cuando el destino corre un kernel más reciente que la copia, y la hidratación independiente del kernel de cuatro fases que reaplica la configuración del usuario como IOMMU, IDs VFIO y tokens custom del cmdline sin copiar verbatim los ficheros ligados al kernel.", + "description": "Cómo restaura ProxMenux un backup de host sobre un destino con un kernel de versión mayor distinta. Documenta cómo se detecta la dirección del salto, el filtro de subconjunto seguro que salta rutas críticas del arranque cuando el destino corre un kernel más reciente que el backup, y la hidratación independiente del kernel de cuatro fases que reaplica la configuración del usuario como IOMMU, IDs VFIO y tokens custom del cmdline sin copiar verbatim los ficheros ligados al kernel.", "ogTitle": "ProxMenux Backup — restauración cross-kernel e hidratación", "ogDescription": "Restauración cross-kernel direccional con filtro de subconjunto seguro e hidratación independiente del kernel.", "twitterTitle": "Restauración cross-kernel | ProxMenux", - "twitterDescription": "Cómo maneja ProxMenux una restauración cuando el kernel del destino difiere del de la copia." + "twitterDescription": "Cómo maneja ProxMenux una restauración cuando el kernel del destino difiere del del backup." }, "header": { "title": "Restauración cross-kernel", - "description": "Cómo maneja ProxMenux una restauración cuando el kernel del host de destino es distinto al kernel que había en el momento de la copia — especialmente cuando el destino ejecuta un kernel más reciente. Documenta cómo se detecta la diferencia, cómo se filtran las rutas críticas del arranque que podrían romper el destino, y cómo se reaplica la configuración propia del usuario sin copiar verbatim los ficheros ligados al kernel.", - "section": "Copias de seguridad y restauración" + "description": "Cómo maneja ProxMenux una restauración cuando el kernel del host de destino es distinto al kernel que había en el momento del backup — especialmente cuando el destino ejecuta un kernel más reciente. Documenta cómo se detecta la diferencia, cómo se filtran las rutas críticas del arranque que podrían romper el destino, y cómo se reaplica la configuración propia del usuario sin copiar verbatim los ficheros ligados al kernel.", + "section": "Backup & Restore" }, "intro": { "title": "Cada salto de kernel se maneja de forma distinta", - "body": "El kernel de un host Proxmox se identifica mediante una versión como 6.17.13-2-pve. Los dos primeros números (6.17 en este ejemplo) definen la versión principal: cuando cambian, algunos archivos de configuración del kernel anterior podrían no ser válidos para el nuevo. Si la restauración detecta versiones principales distintas en la copia y en el destino, el proceso toma un camino u otro según la dirección del salto: si el kernel de la copia es anterior o posterior al del destino. Los dos casos presentan riesgos opuestos. Las copias con un kernel más reciente que el del destino se restauran tal cual, sin problemas según las pruebas realizadas con varios saltos de kernel. Las copias con un kernel anterior al del destino necesitan un filtro para evitar que una configuración del kernel antiguo impida arrancar el sistema de destino." + "body": "El kernel de un host Proxmox se identifica con una cadena de versión como 6.17.13-2-pve. Los dos primeros números (6.17 en este ejemplo) definen la versión mayor: cuando cambian, algunos ficheros de configuración escritos para el kernel anterior pueden no ser válidos en el nuevo. Cuando la restauración detecta que el backup y el destino tienen versiones mayores de kernel distintas, el flujo se ramifica según la dirección del salto —si el backup es más antiguo o más reciente que el destino— porque los dos casos tienen modos de fallo opuestos. Los backups más recientes que el destino se restauran limpiamente tal cual (verificado en banco de pruebas con varios saltos de kernel). Los backups más antiguos que el destino necesitan un filtro para no romper el arranque del destino con configuración escrita para un kernel que desde entonces ha cambiado." }, "directionCheck": { "heading": "La comprobación de dirección", - "intro": "Durante la comprobación de compatibilidad, hb_compat_check compara el kernel registrado en el manifiesto de la copia contra el kernel actual del destino (uname -r) y clasifica la restauración en uno de tres casos, guardado en la variable interna HB_COMPAT_KERNEL_DIRECTION:", + "intro": "Durante la comprobación de compatibilidad, hb_compat_check compara el kernel registrado en el manifiesto del backup contra el kernel actual del destino (uname -r) y clasifica la restauración en uno de tres casos, guardado en la variable interna HB_COMPAT_KERNEL_DIRECTION:", "rows": [ { "direction": "same", - "condition": "La versión mayor del kernel coincide entre la copia y el destino.", + "condition": "La versión mayor del kernel coincide entre el backup y el destino.", "behavior": "El flujo de restauración completo corre sin cambios. Sin filtro adicional, sin hidratación, sin aviso especial en la interfaz." }, { "direction": "bk_newer", - "condition": "El kernel de la copia es más RECIENTE que el del destino (por ejemplo: la copia se hizo con kernel 7.0 y el destino corre kernel 6.17).", + "condition": "El kernel del backup es más RECIENTE que el del destino (por ejemplo: el backup se hizo con kernel 7.0 y el destino corre kernel 6.17).", "behavior": "El flujo de restauración completo corre sin cambios, exactamente igual que en same. No se aplica ningún filtro. Verificado empíricamente: los controladores se reinstalan contra el kernel del destino, la configuración IOMMU se aplica limpia, las VMs con passthrough GPU arrancan sin problemas." }, { "direction": "bk_older", - "condition": "El kernel de la copia es más ANTIGUO que el del destino (por ejemplo: la copia se hizo con kernel 6.17 y el destino corre kernel 7.0).", + "condition": "El kernel del backup es más ANTIGUO que el del destino (por ejemplo: el backup se hizo con kernel 6.17 y el destino corre kernel 7.0).", "behavior": "Se activan el filtro de subconjunto seguro y la hidratación de cuatro fases descritos más abajo. La restauración procede — el destino reproduce el origen, pero los ficheros críticos del arranque no se copian verbatim." } ] }, "whyBkNewerIsSafe": { - "heading": "Por qué una copia con kernel más reciente que el destino se restaura sin cambios", - "body": "Cuando la restauración corre contra un destino con un kernel más antiguo que el registrado en la copia, todos los mecanismos de los que depende la restauración son independientes de la versión del kernel. Los instaladores de controladores de GPU y otros dispositivos PCI detectan el kernel en ejecución con uname -r y compilan DKMS contra lo que tenga el destino. La instalación de paquetes por APT trae binarios construidos para la distribución del destino. Los tokens IOMMU del cmdline como intel_iommu=on son estables entre versiones mayores de kernel. La copia lleva rutas escritas bajo un kernel más reciente, pero esas rutas (blacklists de módulos, defaults de GRUB, configuración de initramfs) siguen siendo sintaxis válida en el más antiguo — los kernels ignoran los tokens que no reconocen en lugar de fallar. Este caso es equivalente en la práctica a una restauración con el mismo kernel, y ProxMenux lo trata como tal." + "heading": "Por qué un backup con kernel más reciente que el destino se restaura sin cambios", + "body": "Cuando la restauración corre contra un destino con un kernel más antiguo que el registrado en el backup, todos los mecanismos de los que depende la restauración son independientes de la versión del kernel. Los instaladores de controladores de GPU y otros dispositivos PCI detectan el kernel en ejecución con uname -r y compilan DKMS contra lo que tenga el destino. La instalación de paquetes por APT trae binarios construidos para la distribución del destino. Los tokens IOMMU del cmdline como intel_iommu=on son estables entre versiones mayores de kernel. El backup lleva rutas escritas bajo un kernel más reciente, pero esas rutas (blacklists de módulos, defaults de GRUB, configuración de initramfs) siguen siendo sintaxis válida en el más antiguo — los kernels ignoran los tokens que no reconocen en lugar de fallar. Este caso es equivalente en la práctica a una restauración con el mismo kernel, y ProxMenux lo trata como tal." }, "safeSubsetFilter": { "heading": "El filtro de subconjunto seguro (sólo cuando el kernel del destino es más reciente)", - "intro": "Cuando el kernel del destino es más reciente que el de la copia, la comprobación de compatibilidad añade 16 rutas críticas del arranque de hb_unsafe_paths_cross_version a RS_SKIP_PATHS. Estas rutas se excluyen de la restauración porque escribir una versión suya de un kernel más antiguo sobre un destino que corre uno más reciente ha causado kernel panics en pruebas de banco. Las rutas cubren cinco categorías:", + "intro": "Cuando el kernel del destino es más reciente que el del backup, la comprobación de compatibilidad añade 16 rutas críticas del arranque de hb_unsafe_paths_cross_version a RS_SKIP_PATHS. Estas rutas se excluyen de la restauración porque escribir una versión suya de un kernel más antiguo sobre un destino que corre uno más reciente ha causado kernel panics en pruebas de banco. Las rutas cubren cinco categorías:", "categoryRows": [ { - "category": "Cargador de arranque", + "category": "Bootloader", "paths": "/etc/default/grub, /etc/kernel", "reason": "Defaults de GRUB atados al orden previo de kernels, y estado de proxmox-boot-tool (cmdline, UUIDs de ESP, hooks) que referencia rutas e identificadores de la instalación más antigua." }, @@ -79,7 +79,7 @@ "phaseRows": [ { "phase": "1a — Ruta GRUB", - "detail": "Para hosts que usan GRUB (instalaciones ext4/lvm). _rs_hyd_grub mergea cada token de manifest.kernel_params.cmdline_extra de la copia en el GRUB_CMDLINE_LINUX_DEFAULT vivo del destino, saltando los tokens cuya clave el destino ya lleva. Después mergea claves whitelisted GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) del /etc/default/grub de la copia si difieren de las del destino." + "detail": "Para hosts que usan GRUB (instalaciones ext4/lvm). _rs_hyd_grub mergea cada token de manifest.kernel_params.cmdline_extra del backup en el GRUB_CMDLINE_LINUX_DEFAULT vivo del destino, saltando los tokens cuya clave el destino ya lleva. Después mergea claves whitelisted GRUB_* (GRUB_TIMEOUT, GRUB_TIMEOUT_STYLE, GRUB_DEFAULT, GRUB_TERMINAL, GRUB_DISABLE_OS_PROBER, GRUB_SERIAL_COMMAND, GRUB_GFXMODE, GRUB_GFXPAYLOAD_LINUX) del /etc/default/grub del backup si difieren de las del destino." }, { "phase": "1b — Ruta systemd-boot / ZFS", @@ -104,27 +104,27 @@ "body": "La hidratación corre en dos modos. Antes del diálogo de confirmación, ProxMenux ejecuta _rs_apply_bk_older_hydration en modo plan: calcula exactamente lo que se mergearía, rellena RS_HYDRATION_SUMMARY con un bloque verde que lista cada acción, y retorna sin escribir nada. El diálogo de confirmación muestra ese bloque verde junto a la lista ámbar de rutas saltadas por el subconjunto seguro, para que el usuario vea POR ADELANTADO qué se reaplicará automáticamente. Tras la confirmación del usuario, ProxMenux vuelve a ejecutar el mismo helper en modo commit — mismas fases, misma lógica, pero esta vez cada fase escribe en el destino vivo. Cancelar el diálogo de confirmación deja el destino intacto." }, "flowDiagram": { - "heading": "El flujo cuando el kernel del destino es más reciente que el de la copia", + "heading": "El flujo cuando el kernel del destino es más reciente que el del backup", "intro": "Los pasos específicos que se añaden cuando el kernel del destino es más reciente se insertan dentro del flujo normal de restauración. Todo lo demás — hot apply, prepare pending, instalación de paquetes, dispatcher post-arranque — corre idéntico a una restauración con el mismo kernel.", - "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 └────────────────────────────────────────────────────────────┘" + "diagram": " ┌────────────────────────────────────────────────────────────┐\n │ hb_compat_check │\n │ HB_COMPAT_KERNEL_DIRECTION = bk_older │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Añade 16 rutas críticas del arranque a 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 │ Calcula qué se mergearía │\n │ Rellena RS_HYDRATION_SUMMARY (bloque verde) │\n │ Sin escrituras │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ Diálogo de confirmación │\n │ Ámbar: rutas saltadas por el filtro de subconjunto seguro │\n │ Verde: tokens/ficheros reaplicados por la hidratación │\n │ El usuario acepta o cancela │\n └───────────────────────────┬────────────────────────────────┘\n │ (aceptado)\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ _rs_apply_bk_older_hydration \"commit\" │\n │ Fase 1a/1b: mergea tokens del cmdline + claves GRUB │\n │ Fase 2: añade módulos a /etc/modules │\n │ Fase 3: copia ficheros whitelisted vfio/nvidia │\n │ Fija HB_HYDRATION_APPLIED=1 │\n └───────────────────────────┬────────────────────────────────┘\n │\n ▼\n ┌────────────────────────────────────────────────────────────┐\n │ El resto de la restauración corre normalmente │\n │ _rs_apply hot (salta RS_SKIP_PATHS) │\n │ _rs_prepare_pending_restore (escribe plan.env con │\n │ HB_HYDRATION_APPLIED=1) │\n │ packages.manual.list install │\n │ Reinicio │\n │ apply_pending_restore.sh (fuerza NEEDS_INITRAMFS=1, │\n │ NEEDS_GRUB=1 por el flag de hidratación) │\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": "Ejemplos concretos", "intro": "La pasada de hidratación no es abstracta — produce resultados observables y correctos en escenarios habituales. Dos ejemplos que la hidratación resuelve automáticamente:", "rows": [ { - "scenario": "Paso GPU (VFIO)", + "scenario": "GPU passthrough (VFIO)", "detail": "El origen tenía intel_iommu=on iommu=pt en el cmdline, vfio/vfio_pci/vfio_iommu_type1 en /etc/modules, un /etc/modprobe.d/vfio.conf con options vfio-pci ids=10de:2216, y un /etc/modprobe.d/blacklist-nvidia.conf. La hidratación mergea los tokens del cmdline en el GRUB o kernel cmdline del destino, añade los módulos vfio a /etc/modules, y copia los dos ficheros modprobe escritos por el usuario. En el siguiente arranque, IOMMU está activo, los módulos VFIO cargan, la GPU queda ligada a vfio-pci y la VM arranca con el passthrough funcionando." }, { "scenario": "Defaults custom de GRUB", - "detail": "El origen tenía GRUB_TIMEOUT=1 y GRUB_DISABLE_OS_PROBER=true. La hidratación lee ambas claves del /etc/default/grub de la copia, ve que difieren de los defaults de la instalación fresca, y reescribe esas dos líneas en el fichero del destino (dejando todo lo demás, incluido GRUB_DISTRIBUTOR, intacto)." + "detail": "El origen tenía GRUB_TIMEOUT=1 y GRUB_DISABLE_OS_PROBER=true. La hidratación lee ambas claves del /etc/default/grub del backup, ve que difieren de los defaults de la instalación fresca, y reescribe esas dos líneas en el fichero del destino (dejando todo lo demás, incluido GRUB_DISTRIBUTOR, intacto)." } ] }, "callout": { "warningTitle": "Qué no reaplica la hidratación cuando el kernel del destino es más reciente", - "warningBody": "La hidratación reaplica sólo la configuración que ProxMenux sabe que es segura entre versiones del kernel: tokens IOMMU, IDs VFIO, claves whitelisted de GRUB y módulos de una lista fija (vfio*, nvidia*, i915, xe, kvm*). Todo lo que quede fuera de ese conjunto — hooks custom de initramfs bajo /etc/initramfs-tools/hooks/, ficheros no whitelisted bajo /etc/modprobe.d/, overrides de unit de systemd escritos por el usuario — permanece excluido. El motivo es concreto: esos ficheros pueden invocar interfaces internas del kernel (APIs de módulos, layout de /sys, hooks de udev) que cambian entre versiones mayores, y aplicarlos verbatim sobre el kernel más reciente puede impedir que el destino arranque. Cuando se necesita reproducción exacta de la cadena de arranque, la restauración debe correr sobre un host con la misma versión mayor de kernel que la copia." + "warningBody": "La hidratación reaplica sólo la configuración que ProxMenux sabe que es segura entre versiones del kernel: tokens IOMMU, IDs VFIO, claves whitelisted de GRUB y módulos de una lista fija (vfio*, nvidia*, i915, xe, kvm*). Todo lo que quede fuera de ese conjunto — hooks custom de initramfs bajo /etc/initramfs-tools/hooks/, ficheros no whitelisted bajo /etc/modprobe.d/, overrides de unit de systemd escritos por el usuario — permanece excluido. El motivo es concreto: esos ficheros pueden invocar interfaces internas del kernel (APIs de módulos, layout de /sys, hooks de udev) que cambian entre versiones mayores, y aplicarlos verbatim sobre el kernel más reciente puede impedir que el destino arranque. Cuando se necesita reproducción exacta de la cadena de arranque, la restauración debe correr sobre un host con la misma versión mayor de kernel que el backup." }, "codeReference": { "heading": "Dónde viven los mecanismos", diff --git a/web/messages/es/docs/backup-restore/destinations/borg.json b/web/messages/es/docs/backup-restore/destinations/borg.json index ffa24433..deb255a1 100644 --- a/web/messages/es/docs/backup-restore/destinations/borg.json +++ b/web/messages/es/docs/backup-restore/destinations/borg.json @@ -1,28 +1,28 @@ { "meta": { "title": "Destino Borg — tipos de repositorio, autenticación SSH, cifrado | ProxMenux", - "description": "El destino Borg escribe las copias de host de ProxMenux en un repositorio Borg — local, en un disco externo montado, o en un servidor remoto accedido por SSH. Cubre la cadena de resolución del binario borg, las cuatro estrategias de clave SSH, el cifrado repokey, la configuración de destinos guardados y la retención por trabajo programado.", + "description": "El destino Borg escribe los backups de host de ProxMenux en un repositorio Borg — local, en un disco externo montado, o en un servidor remoto accedido por SSH. Cubre la cadena de resolución del binario borg, las cuatro estrategias de clave SSH, el cifrado repokey, la configuración de destinos guardados y la retención por trabajo programado.", "ogTitle": "ProxMenux Backup — destino Borg", - "ogDescription": "Cómo escribe ProxMenux las copias de host en repositorios Borg, con estrategias de autenticación SSH y cifrado repokey.", - "twitterTitle": "Destino Borg de copia | ProxMenux", - "twitterDescription": "Repositorios Borg local, USB y servidos por SSH para copias del host." + "ogDescription": "Cómo escribe ProxMenux los backups de host en repositorios Borg, con estrategias de autenticación SSH y cifrado repokey.", + "twitterTitle": "Destino Borg de backup | ProxMenux", + "twitterDescription": "Repositorios Borg local, USB y servidos por SSH para backups del host." }, "header": { "title": "Borg", - "description": "El destino Borg escribe las copias del host en un repositorio Borg. Se soportan tres tipos de repositorio: ruta local de sistema de ficheros, disco externo montado o servidor remoto vía SSH. Deduplicación a nivel de chunk entre todos los archivos del repositorio y cifrado opcional repokey.", - "section": "Copias de seguridad y restauración" + "description": "El destino Borg escribe los backups del host en un repositorio Borg. Se soportan tres tipos de repositorio: ruta local de sistema de ficheros, disco externo montado o servidor remoto vía SSH. Deduplicación a nivel de chunk entre todos los archivos del repositorio y cifrado opcional repokey.", + "section": "Backup & Restore" }, "aboutBorg": { "heading": "Qué es Borg", - "body": "Borg (también escrito BorgBackup) es una herramienta de copia de seguridad open-source con deduplicación, mantenida por la comunidad Borg Backup. Almacena cada archivo como un conjunto de chunks de longitud variable dentro de un repositorio; los chunks se comparten entre archivos, por lo que volver a copiar datos que no han cambiado tiene un coste de almacenamiento prácticamente nulo. Borg no está atado a Proxmox — es una herramienta de copia de uso general utilizada en muchos entornos. ProxMenux la usa como uno de los tres destinos para copias del host; cada mecanismo específico de Borg descrito en esta página (tipos de repositorio, borg-serve por SSH, cifrado repokey, prune) es comportamiento estándar de Borg." + "body": "Borg (también escrito BorgBackup) es una herramienta de backup open-source con deduplicación, mantenida por la comunidad Borg Backup. Almacena cada archivo como un conjunto de chunks de longitud variable dentro de un repositorio; los chunks se comparten entre archivos, por lo que volver a copiar datos que no han cambiado tiene un coste de almacenamiento prácticamente nulo. Borg no está atado a Proxmox — es una herramienta de backup de uso general utilizada en muchos entornos. ProxMenux la usa como uno de los tres destinos para backups del host; cada mecanismo específico de Borg descrito en esta página (tipos de repositorio, borg-serve por SSH, cifrado repokey, prune) es comportamiento estándar de Borg." }, "intro": { "title": "Deduplicación por chunks con repositorios locales o servidos por SSH", - "body": "Un repositorio Borg almacena chunks que se comparten entre cada archivo que contiene, por lo que volver a copiar un fichero que no ha cambiado no transfiere ni almacena nada nuevo. ProxMenux invoca borg create contra el repositorio en el momento de la copia y borg extract en la restauración. El repositorio puede vivir en el mismo sistema de ficheros que el origen, en un disco externo montado, o en un host remoto accedido por SSH." + "body": "Un repositorio Borg almacena chunks que se comparten entre cada archivo que contiene, por lo que volver a copiar un fichero que no ha cambiado no transfiere ni almacena nada nuevo. ProxMenux invoca borg create contra el repositorio en el momento del backup y borg extract en la restauración. El repositorio puede vivir en el mismo sistema de ficheros que el origen, en un disco externo montado, o en un host remoto accedido por SSH." }, "binarySourcing": { "heading": "El binario borg", - "intro": "Borg no es una dependencia base del instalador de ProxMenux. Cuando se ejecuta una copia, hb_ensure_borg resuelve el binario desde cuatro fuentes por orden y devuelve la primera que funciona:", + "intro": "Borg no es una dependencia base del instalador de ProxMenux. Cuando se ejecuta un backup, hb_ensure_borg resuelve el binario desde cuatro fuentes por orden y devuelve la primera que funciona:", "rows": [ { "priority": "1", @@ -42,7 +42,7 @@ { "priority": "4", "source": "Descarga desde GitHub", - "detail": "wget contra la URL fijada de borg-linux64 bajo github.com/borgbackup/borg/releases/, verificado contra un SHA-256 constante en lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). Si el checksum no coincide, el binario se descarta y la copia se aborta. El fichero descargado se cachea en el state-dir para que las copias posteriores usen el camino 2." + "detail": "wget contra la URL fijada de borg-linux64 bajo github.com/borgbackup/borg/releases/, verificado contra un SHA-256 constante en lib_host_backup_common.sh (HB_BORG_LINUX64_SHA256). Si el checksum no coincide, el binario se descarta y el backup se aborta. El fichero descargado se cachea en el state-dir para que los backups posteriores usen el camino 2." } ] }, @@ -62,7 +62,7 @@ }, { "type": "local", - "url": "/backup/borgbackup (any absolute path)", + "url": "/backup/borgbackup (cualquier ruta absoluta)", "detail": "El repositorio vive en un directorio local. Sólo tiene sentido cuando el directorio está en un disco físico distinto — un repositorio en el mismo disco que el origen protege contra error humano pero no contra fallo de disco." } ] @@ -74,7 +74,7 @@ "hostChoicesBody": "Cualquier host Linux con acceso SSH cumple. Setups habituales:", "hostChoicesItems": [ "Un NAS dedicado o caja de backup (Debian, Ubuntu, TrueNAS SCALE con shell).", - "Un contenedor LXC dentro de un nodo Proxmox. Huella pequeña, aislado del host que ejecuta las copias.", + "Un contenedor LXC dentro de un nodo Proxmox. Huella pequeña, aislado del host que ejecuta los backups.", "Otro host Proxmox en la misma LAN, o una VM en cualquier lugar alcanzable por SSH." ], "lxcWarningTitle": "LXC como servidor Borg", @@ -101,7 +101,7 @@ "minimalSetupTitle": "Setup mínimo del servidor", "minimalSetupBody": "En un servidor Borg Debian o Ubuntu, un baseline funcional son cuatro comandos como root:", "minimalSetupCmd": "apt install borgbackup\nuseradd -m -d /home/borg -s /bin/bash borg\nmkdir -p /backup/borgbackup\nchown borg:borg /backup/borgbackup", - "minimalSetupNote": "Con el servidor preparado y la autenticación SSH por contraseña disponible, generate-auto instala la clave mediante una cuenta que pueda escribir en authorized_keys del usuario borg. Las copias posteriores usan esa clave, restringida a borg serve en la ruta configurada. Si no hay acceso por contraseña, instala la clave manualmente o usa la alternativa a través del host PVE." + "minimalSetupNote": "Con el servidor preparado y la autenticación SSH por contraseña disponible, generate-auto instala la clave mediante una cuenta que pueda escribir en authorized_keys del usuario borg. Los backups posteriores usan esa clave, restringida a borg serve en la ruta configurada. Si no hay acceso por contraseña, instala la clave manualmente o usa la alternativa a través del host PVE." }, "sshAuth": { "heading": "Autenticación SSH (lado cliente)", @@ -192,9 +192,9 @@ }, "archiveFormat": { "heading": "Nombrado de archivos y retención", - "intro": "Cada copia crea un archivo nuevo dentro del repositorio.", + "intro": "Cada backup crea un archivo nuevo dentro del repositorio.", "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS", - "retentionBody": "Para trabajos programados, run_scheduled_backup.sh ejecuta borg prune contra el repositorio tras cada copia exitosa con los valores de retención configurados en el trabajo (--keep-last, --keep-daily, --keep-weekly). Las copias interactivas no aplican poda." + "retentionBody": "Para trabajos programados, run_scheduled_backup.sh ejecuta borg prune contra el repositorio tras cada backup exitoso con los valores de retención configurados en el trabajo (--keep-last, --keep-daily, --keep-weekly). Los backups interactivos no aplican poda." }, "restoreAccess": { "heading": "Recuperación del lado de la restauración", @@ -212,7 +212,7 @@ { "label": "borg create", "href": "https://borgbackup.readthedocs.io/en/stable/usage/create.html", - "tail": " — el comando que ProxMenux invoca en cada copia, con todas las flags soportadas." + "tail": " — el comando que ProxMenux invoca en cada backup, con todas las flags soportadas." }, { "label": "Cifrado del repositorio", diff --git a/web/messages/es/docs/backup-restore/destinations/index.json b/web/messages/es/docs/backup-restore/destinations/index.json index 1b4d14c6..1f6eca83 100644 --- a/web/messages/es/docs/backup-restore/destinations/index.json +++ b/web/messages/es/docs/backup-restore/destinations/index.json @@ -1,20 +1,20 @@ { "meta": { - "title": "Destinos de copia — Local, Proxmox Backup Server, Borg | ProxMenux", - "description": "Tres backends de almacenamiento reciben el mismo contenido de una copia de ProxMenux: un archivo local .tar.zst en cualquier sistema de ficheros escribible, un backup en un datastore de Proxmox Backup Server o un archivo en un repositorio local o remoto de Borg. Cada backend tiene sus propias características de compresión, deduplicación, cifrado y red.", + "title": "Destinos de backup — Local, Proxmox Backup Server, Borg | ProxMenux", + "description": "Tres backends de almacenamiento reciben el mismo contenido de un backup de ProxMenux: un archivo local .tar.zst en cualquier sistema de ficheros escribible, un backup en un datastore de Proxmox Backup Server o un archivo en un repositorio local o remoto de Borg. Cada backend tiene sus propias características de compresión, deduplicación, cifrado y red.", "ogTitle": "Destinos de ProxMenux Backup", - "ogDescription": "Local, Proxmox Backup Server y Borg — tres backends de almacenamiento para el mismo contenido de copia del host.", + "ogDescription": "Local, Proxmox Backup Server y Borg — tres backends de almacenamiento para el mismo contenido de backup del host.", "twitterTitle": "Destinos de ProxMenux Backup | ProxMenux", - "twitterDescription": "Archivo local, Proxmox Backup Server y Borg como backends para copias del host." + "twitterDescription": "Archivo local, Proxmox Backup Server y Borg como backends para backups del host." }, "header": { "title": "Destinos", "description": "Los tres backends de almacenamiento soportados por ProxMenux Backup: archivo local, Proxmox Backup Server (recomendado) y Borg. Cada uno recibe el mismo archivo de tres bloques; se diferencian en formato de almacenamiento, deduplicación, modelo de cifrado y requisitos de red.", - "section": "Copias de seguridad y restauración" + "section": "Backup & Restore" }, "intro": { "title": "El mismo contenido, tres backends", - "body": "Cada copia produce los mismos tres bloques (rootfs, manifiesto, aplicaciones). Lo que cambia entre destinos es cómo se almacenan esos bloques y cómo el usuario los recupera para una restauración. Cada backend está implementado como una función independiente en backup_host.sh — _bk_local, _bk_pbs, _bk_borg — pero los tres comparten el mismo paso de staging (hb_prepare_staging) y el mismo camino de restauración. La elección del destino sólo afecta a la escritura y la recuperación; no cambia lo que hace una restauración ni cómo consume el archivo." + "body": "Cada backup produce los mismos tres bloques (rootfs, manifiesto, aplicaciones). Lo que cambia entre destinos es cómo se almacenan esos bloques y cómo el usuario los recupera para una restauración. Cada backend está implementado como una función independiente en backup_host.sh — _bk_local, _bk_pbs, _bk_borg — pero los tres comparten el mismo paso de staging (hb_prepare_staging) y el mismo camino de restauración. La elección del destino sólo afecta a la escritura y la recuperación; no cambia lo que hace una restauración ni cómo consume el archivo." }, "comparison": { "heading": "Comparativa de características", @@ -34,7 +34,7 @@ }, { "feature": "Deduplicación", - "local": "Ninguna. Cada copia es un archivo completo independiente.", + "local": "Ninguna. Cada backup es un archivo completo independiente.", "pbs": "Deduplicación completa a nivel de chunk entre todas las backups del datastore.", "borg": "Deduplicación completa a nivel de chunk entre todos los archivos del repositorio." }, @@ -46,9 +46,9 @@ }, { "feature": "Retención / poda", - "local": "Aplicada por trabajo programado vía KEEP_LAST. Los archivos antiguos (y sus sidecars + logs del runner) se eliminan de forma simétrica. Las copias interactivas no aplican poda.", - "pbs": "Aplicada por trabajo programado vía proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly. Las copias interactivas no aplican poda.", - "borg": "Aplicada por trabajo programado vía borg prune --keep-last / --keep-daily / --keep-weekly. Las copias interactivas no aplican poda." + "local": "Aplicada por trabajo programado vía KEEP_LAST. Los archivos antiguos (y sus sidecars + logs del runner) se eliminan de forma simétrica. Los backups interactivos no aplican poda.", + "pbs": "Aplicada por trabajo programado vía proxmox-backup-client prune --keep-last / --keep-daily / --keep-weekly. Los backups interactivos no aplican poda.", + "borg": "Aplicada por trabajo programado vía borg prune --keep-last / --keep-daily / --keep-weekly. Los backups interactivos no aplican poda." }, { "feature": "Red", @@ -69,20 +69,20 @@ "borg": "Requiere borg + la ruta del repositorio + la passphrase (si está cifrado)." } ], - "captionCode": "feature", + "captionCode": "Característica", "captionLocal": "Local", "captionPbs": "Proxmox Backup Server (recomendado)", "captionBorg": "Borg" }, "sameArchive": { - "heading": "El contenido interno de la copia es el mismo en cualquier destino", + "heading": "El contenido interno del backup es el mismo en cualquier destino", "body": "Los tres destinos contienen la misma estructura rootfs/ + metadata/ + manifest.json descrita en Cómo funciona. Extraer un .tar.zst de un archivo local, restaurar un .pxar desde PBS o extraer un archivo de Borg con borg extract produce el mismo árbol de directorios. El proceso de restauración (_rs_check_layout, _rs_apply, _rs_prepare_pending_restore) lee los mismos tres componentes sin necesitar saber de qué destino proceden." }, "extractStandalone": { - "heading": "Extraer una copia fuera de ProxMenux", + "heading": "Extraer un backup fuera de ProxMenux", "intro": "Cualquiera de los tres formatos de archivo se puede leer con herramientas estándar sin tener ProxMenux instalado en el host de lectura. Los comandos siguientes producen el mismo árbol de directorios que consume internamente una restauración.", - "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.", + "localCmd": "# Desde un archivo local .tar.zst:\ntar --zstd -xf hostcfg-HOST-TIMESTAMP.tar.zst\n\n# Desde el fallback .tar.gz:\ntar -xzf hostcfg-HOST-TIMESTAMP.tar.gz", + "pbsCmd": "# Desde un backup PBS (requiere 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# Añadir --keyfile KEY-PATH cuando el backup está cifrado.", "borgCmd": "# Desde un archivo Borg (requiere el binario borg + passphrase si hay cifrado):\nborg extract REPO-PATH::ARCHIVE-NAME\n\n# Sobre un repo servido por SSH:\nborg extract ssh://USER@HOST:PORT/REPO-PATH::ARCHIVE-NAME", "note": "El árbol extraído puede inspeccionarse manualmente o alimentar una restauración manual. Consulta las páginas de cada destino para conocer el flujo exacto de recuperación que ProxMenux utiliza por dentro." }, diff --git a/web/messages/es/docs/backup-restore/destinations/local.json b/web/messages/es/docs/backup-restore/destinations/local.json index c53790cc..79d75136 100644 --- a/web/messages/es/docs/backup-restore/destinations/local.json +++ b/web/messages/es/docs/backup-restore/destinations/local.json @@ -1,24 +1,24 @@ { "meta": { "title": "Destino de archivo local — tar.zst en filesystem o unidad USB | ProxMenux", - "description": "El destino local de la copia escribe un único archivo .tar.zst en cualquier directorio escribible: un disco interno, un punto de montaje de Proxmox, un share NFS o una unidad USB. Documenta el flujo de configuración, la lógica de detección y montaje USB, el chequeo de seguridad contra escribir el archivo dentro de una ruta que se está copiando, y el sidecar JSON que identifica el fichero.", + "description": "El destino local del backup escribe un único archivo .tar.zst en cualquier directorio escribible: un disco interno, un punto de montaje de Proxmox, un share NFS o una unidad USB. Documenta el flujo de configuración, la lógica de detección y montaje USB, el chequeo de seguridad contra escribir el archivo dentro de una ruta que se está copiando, y el sidecar JSON que identifica el fichero.", "ogTitle": "ProxMenux Backup — Destino local", - "ogDescription": "Cómo escribe ProxMenux las copias locales como archivos .tar.zst y cómo configurar el directorio de destino o la unidad USB.", - "twitterTitle": "Destino local de copia | ProxMenux", - "twitterDescription": "Cómo escribe ProxMenux las copias locales como archivos .tar.zst en filesystem o USB." + "ogDescription": "Cómo escribe ProxMenux los backups locales como archivos .tar.zst y cómo configurar el directorio de destino o la unidad USB.", + "twitterTitle": "Destino local de backup | ProxMenux", + "twitterDescription": "Cómo escribe ProxMenux los backups locales como archivos .tar.zst en filesystem o USB." }, "header": { "title": "Archivo local", "description": "El destino local escribe un único archivo tar comprimido en cualquier directorio escribible del host: un disco interno, un montaje NFS o SMB, o una unidad USB.", - "section": "Copias de seguridad y restauración" + "section": "Backup & Restore" }, "intro": { "title": "Un solo fichero, autocontenido", - "body": "Una copia local produce un único fichero hostcfg-HOST-TIMESTAMP.tar.zst (o .tar.gz cuando zstd no está presente). El fichero contiene el árbol completo del archivo — manifest.json, metadata/ y rootfs/ — y puede restaurarse en cualquier host Proxmox con el flujo de restauración de ProxMenux, o extraerse a mano con tar --zstd -xf en cualquier sistema Linux. Sin servidor, sin inicialización de repositorio, sin dependencia externa. Es el destino con el camino de recuperación más corto cuando ni PBS ni Borg están disponibles." + "body": "Un backup local produce un único fichero hostcfg-HOST-TIMESTAMP.tar.zst (o .tar.gz cuando zstd no está presente). El fichero contiene el árbol completo del archivo — manifest.json, metadata/ y rootfs/ — y puede restaurarse en cualquier host Proxmox con el flujo de restauración de ProxMenux, o extraerse a mano con tar --zstd -xf en cualquier sistema Linux. Sin servidor, sin inicialización de repositorio, sin dependencia externa. Es el destino con el camino de recuperación más corto cuando ni PBS ni Borg están disponibles." }, "targetConfig": { "heading": "Configurar el directorio de destino", - "intro": "El destino local es un único directorio de destino persistido — no una lista. ProxMenux guarda la elección del usuario en /usr/local/share/proxmenux/local-target.conf y la lee en cada copia. Cuando no hay ningún destino configurado, se usa el valor por defecto HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump (el mismo directorio que Proxmox utiliza para las salidas de vzdump). El destino se configura desde Configure backup destinations → Local destinations:", + "intro": "El destino local es un único directorio de destino persistido — no una lista. ProxMenux guarda la elección del usuario en /usr/local/share/proxmenux/local-target.conf y la lee en cada backup. Cuando no hay ningún destino configurado, se usa el valor por defecto HB_LOCAL_TARGET_DEFAULT = /var/lib/vz/dump (el mismo directorio que Proxmox utiliza para las salidas de vzdump). El destino se configura desde Configure backup destinations → Local destinations:", "options": [ "Usar el valor por defecto (/var/lib/vz/dump). El almacenamiento local de Proxmox. Está presente en cualquier instalación de Proxmox; el archivo queda junto a las salidas de vzdump y lo detecta automáticamente la pestaña Backups del Monitor.", "Introducir una ruta personalizada. Cualquier ruta absoluta del sistema de ficheros vale: un montaje NFS, un share SMB montado por fstab, un dataset ZFS dedicado, un segundo disco interno. ProxMenux valida que la ruta existe y es un directorio antes de persistirla.", @@ -31,17 +31,17 @@ "statesTitle": "Los tres estados del dispositivo", "stateRows": [ { - "state": "montado", - "shown": "Tamaño · etiqueta · [fstype] · → /mount/point", + "state": "mounted", + "shown": "Tamaño · label · [fstype] · → /mount/point", "action": "La partición ya está montada en algún sitio. Seleccionarla persiste ese punto de montaje como destino local. No se realiza ningún montaje." }, { - "state": "sin montar", + "state": "unmounted", "shown": "Tamaño · label · [fstype] · (no montada — se montará)", "action": "Hay un filesystem pero no está montado. Al confirmar, ProxMenux ejecuta hb_mount_usb_partition: crea /mnt/backup-LABEL (o una ruta basada en UUID si no hay label), monta la partición y persiste el punto de montaje como destino local." }, { - "state": "vacía", + "state": "empty", "shown": "Tamaño · disco USB en crudo — sin filesystem (se FORMATEARÁ)", "action": "El dispositivo no tiene filesystem. Camino destructivo — protegido por dos confirmaciones. Primero un diálogo Yes/No explica que la operación borrará el disco. Después una caja de entrada obliga al usuario a escribir la ruta exacta del dispositivo (por ejemplo /dev/sdb) antes de que ProxMenux cree una partición GPT + ext4 fresca y la monte." } @@ -50,11 +50,11 @@ }, "safetyCheck": { "heading": "Chequeo de seguridad — destino dentro de una ruta copiada", - "body": "Antes de escribir el archivo, _bk_local verifica que el directorio de destino no sea un subcamino de ninguno de los directorios que se están copiando. Un error habitual sería añadir /root al perfil y elegir /root/backups como destino — el archivo se incluiría a sí mismo, produciendo o bien un archivo corrupto o bien crecimiento sin límite hasta llenar el disco. El chequeo resuelve ambos caminos con readlink -m, los compara y, si hay conflicto, aborta la copia con un diálogo que nombra la ruta en conflicto y lista tres formas de resolverlo: elegir un destino fuera de la ruta en conflicto, eliminar la entrada personalizada que contiene el destino, o usar modo Custom para desmarcar la ruta en conflicto en esa ejecución." + "body": "Antes de escribir el archivo, _bk_local verifica que el directorio de destino no sea un subcamino de ninguno de los directorios que se están copiando. Un footgun habitual sería añadir /root al perfil y elegir /root/backups como destino — el archivo se incluiría a sí mismo, produciendo o bien un archivo corrupto o bien crecimiento sin límite hasta llenar el disco. El chequeo resuelve ambos caminos con readlink -m, los compara y, si hay conflicto, aborta el backup con un diálogo que nombra la ruta en conflicto y lista tres formas de resolverlo: elegir un destino fuera de la ruta en conflicto, eliminar la entrada personalizada que contiene el destino, o usar modo Custom para desmarcar la ruta en conflicto en esa ejecución." }, "archiveFormat": { "heading": "Formato de archivo y compresión", - "intro": "El nombre del fichero de salida incorpora el hostname del origen y el timestamp de la copia para que un directorio con varios archivos se ordene cronológicamente y cada fichero se identifique por sí mismo.", + "intro": "El nombre del fichero de salida incorpora el hostname del origen y el timestamp del backup para que un directorio con varios archivos se ordene cronológicamente y cada fichero se identifique por sí mismo.", "namePattern": "hostcfg-HOSTNAME-YYYYMMDD_HHMMSS.tar.zst", "compressionTitle": "Compresión", "compressionBody": "El camino principal usa tar --zstd -cf — un pipeline de un solo comando que comprime al nivel por defecto de zstd. Cuando zstd no está presente en el origen (raro en Proxmox pero posible en instalaciones minimalistas), ProxMenux cae en gzip. En el camino de fallback, si pv está disponible, se añade una barra de progreso al pipeline para que el usuario vea crecer el tamaño del archivo en tiempo real; sin pv, se usa tar -czf plano en silencio.", @@ -63,13 +63,13 @@ }, "sidecar": { "heading": "El sidecar JSON", - "intro": "Cada copia local con éxito produce un fichero compañero: HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, escrito junto al archivo por hb_write_archive_sidecar. Este pequeño fichero JSON permite al Monitor de ProxMenux identificar el archivo como una copia de host de ProxMenux incluso si posteriormente se mueve, renombra o archiva en otro lugar.", + "intro": "Cada backup local con éxito produce un fichero compañero: HOSTNAME-TIMESTAMP.tar.zst.proxmenux.json, escrito junto al archivo por hb_write_archive_sidecar. Este pequeño fichero JSON permite al Monitor de ProxMenux identificar el archivo como un backup de host de ProxMenux incluso si posteriormente se mueve, renombra o archiva en otro lugar.", "contentTitle": "Contenido del sidecar", - "contentBody": "El sidecar almacena la versión de schema, si la copia viene de una ejecución interactiva o de un trabajo programado (kind), el ID de trabajo para las ejecuciones programadas, el modo de perfil usado (default o custom), el hostname del origen, el basename original del archivo, un timestamp de creación en ISO-8601 y el tamaño del archivo en bytes.", - "whyBody": "La pestaña Backups del Monitor escanea los directorios locales configurados buscando sidecars *.proxmenux.json — no ficheros *.tar.zst — porque un .tar.zst sin sidecar podría no ser una copia de ProxMenux en absoluto. El escaneo es rápido (los JSON son diminutos) y el emparejamiento es estable frente a renombrados del archivo mientras el sidecar se renombre en paralelo." + "contentBody": "El sidecar almacena la versión de schema, si el backup viene de una ejecución interactiva o de un trabajo programado (kind), el ID de trabajo para las ejecuciones programadas, el modo de perfil usado (default o custom), el hostname del origen, el basename original del archivo, un timestamp de creación en ISO-8601 y el tamaño del archivo en bytes.", + "whyBody": "La pestaña Backups del Monitor escanea los directorios locales configurados buscando sidecars *.proxmenux.json — no ficheros *.tar.zst — porque un .tar.zst sin sidecar podría no ser un backup de ProxMenux en absoluto. El escaneo es rápido (los JSON son diminutos) y el emparejamiento es estable frente a renombrados del archivo mientras el sidecar se renombre en paralelo." }, "restoreAccess": { "heading": "Restaurar desde un archivo local", - "body": "El flujo de restauración de ProxMenux descubre los archivos locales escaneando el destino local configurado buscando sidecars y mostrándolos en la lista de copias disponibles. Seleccionar uno dispara _rs_check_layout, que extrae el tarball en un directorio de staging y confirma el layout de tres bloques antes de continuar. Para una extracción manual fuera de ProxMenux, tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg produce el mismo árbol que consume el código de restauración." + "body": "El flujo de restauración de ProxMenux descubre los archivos locales escaneando el destino local configurado buscando sidecars y mostrándolos en la lista de backups disponibles. Seleccionar uno dispara _rs_check_layout, que extrae el tarball en un directorio de staging y confirma el layout de tres bloques antes de continuar. Para una extracción manual fuera de ProxMenux, tar --zstd -xf hostcfg-HOSTNAME-TIMESTAMP.tar.zst -C /tmp/hostcfg produce el mismo árbol que consume el código de restauración." } } diff --git a/web/messages/es/docs/backup-restore/destinations/pbs.json b/web/messages/es/docs/backup-restore/destinations/pbs.json index 18686262..d92ff2ef 100644 --- a/web/messages/es/docs/backup-restore/destinations/pbs.json +++ b/web/messages/es/docs/backup-restore/destinations/pbs.json @@ -1,29 +1,29 @@ { "meta": { "title": "Destino Proxmox Backup Server — repositorio, cifrado, recuperación | ProxMenux", - "description": "El destino PBS guarda las copias del host de ProxMenux como copias PBS. Explica la detección de repositorios desde /etc/pve/storage.cfg, la configuración manual, la subida de .pxar, el cifrado con archivo de clave en el cliente y su custodia opcional protegida por una frase de contraseña, y la recuperación de la clave desde varias fuentes en un host recién instalado.", + "description": "El destino PBS escribe los backups de host de ProxMenux como backups PBS. Documenta la auto-detección del repositorio desde /etc/pve/storage.cfg, la configuración manual de PBS, el comando de subida .pxar, el modelo de cifrado por keyfile del lado del cliente, el blob de escrow con passphrase de recuperación, y la recuperación del keyfile desde PBS en instalaciones frescas.", "ogTitle": "ProxMenux Backup — destino Proxmox Backup Server", - "ogDescription": "Cómo escribe ProxMenux las copias de host en Proxmox Backup Server con cifrado por keyfile del lado del cliente y escrow de recuperación.", - "twitterTitle": "Destino PBS de copia | ProxMenux", + "ogDescription": "Cómo escribe ProxMenux los backups de host en Proxmox Backup Server con cifrado por keyfile del lado del cliente y escrow de recuperación.", + "twitterTitle": "Destino PBS de backup | ProxMenux", "twitterDescription": "Destino Proxmox Backup Server con cifrado por keyfile y escrow de passphrase de recuperación." }, "header": { "title": "Proxmox Backup Server", - "description": "El destino PBS sube todo el directorio de preparación como una única copia .pxar a un datastore de Proxmox Backup Server. Permite cifrarla en el cliente con un archivo de clave y, de forma opcional, subir junto a cada copia una copia de la clave protegida por una frase de contraseña para recuperarla después.", - "section": "Copias de seguridad y restauración" + "description": "El destino PBS sube la raíz de staging como un único backup .pxar a un datastore de Proxmox Backup Server, con cifrado opcional por keyfile del lado del cliente y escrow automático de una passphrase de recuperación para recuperación tras reinstalación.", + "section": "Backup & Restore" }, "recommendedBadge": "Destino recomendado", "aboutPbs": { "heading": "Qué es Proxmox Backup Server", - "body": "Proxmox Backup Server (PBS) es el producto de servidor de copias propio de Proxmox, desarrollado y mantenido por el mismo equipo que autora Proxmox VE. Es un servidor dedicado diseñado para recibir copias desde hosts Proxmox VE (VMs, LXCs y — vía proxmox-backup-client — directorios arbitrarios del host) con deduplicación a nivel de chunk, cifrado del lado del cliente y políticas de retención aplicadas del lado del servidor. ProxMenux usa PBS como uno de los tres destinos para copias del host; cada mecanismo específico de PBS descrito en esta página (grupos de copia, archivos .pxar, --backup-id, cifrado por keyfile) es comportamiento estándar de PBS." + "body": "Proxmox Backup Server (PBS) es el producto de servidor de backups propio de Proxmox, desarrollado y mantenido por el mismo equipo que autora Proxmox VE. Es un servidor dedicado diseñado para recibir backups desde hosts Proxmox VE (VMs, LXCs y — vía proxmox-backup-client — directorios arbitrarios del host) con deduplicación a nivel de chunk, cifrado del lado del cliente y políticas de retención aplicadas del lado del servidor. ProxMenux usa PBS como uno de los tres destinos para backups del host; cada mecanismo específico de PBS descrito en esta página (grupos de backup, archivos .pxar, --backup-id, cifrado por keyfile) es comportamiento estándar de PBS." }, "intro": { "title": "Un backup por ejecución, deduplicación a nivel de chunk", - "body": "Una copia PBS produce una única entrada en el datastore, agrupada bajo el backup ID host/hostcfg-HOSTNAME/BACKUP-TIME. El contenido es un archivo .pxar con el mismo layout de tres bloques descrito en Cómo funciona. PBS deduplica a nivel de chunk en todas las copias del datastore, por lo que las copias siguientes del mismo host transfieren y almacenan sólo los chunks que hayan cambiado. La retención la aplica el propio ProxMenux para los trabajos programados — run_scheduled_backup.sh ejecuta proxmox-backup-client prune con --keep-last / --keep-daily / --keep-weekly tras cada ejecución exitosa usando los valores configurados en el trabajo." + "body": "Un backup PBS produce una única entrada en el datastore, agrupada bajo el backup ID host/hostcfg-HOSTNAME/BACKUP-TIME. El contenido es un archivo .pxar con el mismo layout de tres bloques descrito en Cómo funciona. PBS deduplica a nivel de chunk en todos los backups del datastore, por lo que los backups siguientes del mismo host transfieren y almacenan sólo los chunks que hayan cambiado. La retención la aplica el propio ProxMenux para los trabajos programados — run_scheduled_backup.sh ejecuta proxmox-backup-client prune con --keep-last / --keep-daily / --keep-weekly tras cada ejecución exitosa usando los valores configurados en el trabajo." }, "repoSelection": { "heading": "Selección del repositorio", - "intro": "ProxMenux descubre los repositorios de PBS a partir de dos fuentes en cada copia de seguridad. El usuario elige uno en un menú unificado; esa elección determina los valores de HB_PBS_REPOSITORY, HB_PBS_SECRET y HB_PBS_FINGERPRINT para esa ejecución.", + "intro": "ProxMenux descubre los repositorios de PBS a partir de dos fuentes en cada backup. El usuario elige uno en un menú unificado; esa elección determina los valores de HB_PBS_REPOSITORY, HB_PBS_SECRET y HB_PBS_FINGERPRINT para esa ejecución.", "sourceRows": [ { "source": "storage.cfg de Proxmox (auto-descubierto)", @@ -33,51 +33,51 @@ { "source": "Configuración manual de ProxMenux", "path": "/usr/local/share/proxmenux/pbs-manual-configs.txt + pbs-pass-NAME.txt + pbs-fingerprint-NAME.txt", - "content": "Se añade desde Configure backup destinations → PBS destinations → Add PBS. Pregunta por un nombre, usuario (root@pam o user@pbs!token), host o IP, datastore y contraseña. La contraseña se re-pregunta ante entrada vacía — un guardado vacío persistiría silenciosamente y cada copia posterior fallaría con un error de autenticación opaco. Este camino se usa cuando el PBS objetivo no está registrado como storage de Proxmox." + "content": "Se añade desde Configure backup destinations → PBS destinations → Add PBS. Pregunta por un nombre, usuario (root@pam o user@pbs!token), host o IP, datastore y contraseña. La contraseña se re-pregunta ante entrada vacía — un guardado vacío persistiría silenciosamente y cada backup posterior fallaría con un error de autenticación opaco. Este camino se usa cuando el PBS objetivo no está registrado como storage de Proxmox." } ], "menuTitle": "Menú de selección", - "menuBody": "Ambas fuentes se muestran en un único menú, cada fila etiquetada con su origen ([proxmox] o [manual]). Las entradas cuya contraseña no se pudo resolver se marcan con un aviso ⚠ no password — seleccionarlas dispara una re-introducción de contraseña antes de iniciar la copia. El fingerprint se pasa a proxmox-backup-client vía la variable de entorno PBS_FINGERPRINT; cuando no está presente, el cliente pide al usuario aceptar el certificado del servidor de forma interactiva en la primera copia." + "menuBody": "Ambas fuentes se muestran en un único menú, cada fila etiquetada con su origen ([proxmox] o [manual]). Las entradas cuya contraseña no se pudo resolver se marcan con un aviso ⚠ no password — seleccionarlas dispara una re-introducción de contraseña antes de iniciar el backup. El fingerprint se pasa a proxmox-backup-client vía la variable de entorno PBS_FINGERPRINT; cuando no está presente, el cliente pide al usuario aceptar el certificado del servidor de forma interactiva en el primer backup." }, "backupCommand": { - "heading": "El comando de copia", + "heading": "El comando de backup", "intro": "La subida se realiza con una única invocación de proxmox-backup-client backup. ProxMenux utiliza env para pasar al cliente la contraseña, la contraseña de cifrado y el fingerprint como variables de entorno.", "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": "Nombrado del backup ID", - "backupIdBody": "El backup ID por defecto es hostcfg-HOSTNAME. Se pide al usuario que lo confirme o edite antes de la subida; cualquier carácter fuera de [A-Za-z0-9_-] se elimina y los guiones finales se recortan. Reutilizar el mismo ID entre ejecuciones es intencional — PBS trata el ID como un grupo, y cada copia posterior aparece como un nuevo backup dentro de ese grupo, compartiendo dedup con las ejecuciones previas.", + "backupIdBody": "El backup ID por defecto es hostcfg-HOSTNAME. Se pide al usuario que lo confirme o edite antes de la subida; cualquier carácter fuera de [A-Za-z0-9_-] se elimina y los guiones finales se recortan. Reutilizar el mismo ID entre ejecuciones es intencional — PBS trata el ID como un grupo, y cada backup posterior aparece como un nuevo backup dentro de ese grupo, compartiendo dedup con las ejecuciones previas.", "pxarTitle": "Qué se incluye dentro del archivo .pxar", - "pxarBody": "El origen del .pxar es todo el directorio staging_root, con rootfs/, metadata/ y manifest.json juntos. Las versiones anteriores utilizaban $staging_root/rootfs como origen; esto dejaba metadata/ fuera del archivo y la comprobación de compatibilidad de la restauración no tenía datos que leer, por lo que mostraba advertencias de restauración entre hosts incluso al restaurar en el mismo host. Las copias antiguas creadas solo a partir de rootfs siguen restaurándose correctamente mediante la rama del caso 3 de _rs_check_layout, que vuelve a colocar el árbol plano etc/var/root/usr dentro de una estructura rootfs/." + "pxarBody": "El origen del .pxar es todo el directorio staging_root, con rootfs/, metadata/ y manifest.json juntos. Las versiones anteriores utilizaban $staging_root/rootfs como origen; esto dejaba metadata/ fuera del archivo y la comprobación de compatibilidad de la restauración no tenía datos que leer, por lo que mostraba advertencias de restauración entre hosts incluso al restaurar en el mismo host. Los backups antiguos creados solo a partir de rootfs siguen restaurándose correctamente mediante la rama del caso 3 de _rs_check_layout, que vuelve a colocar el árbol plano etc/var/root/usr dentro de una estructura rootfs/." }, "encryption": { "heading": "Cifrado del lado del cliente", "glossaryHint": "En esta sección aparecen los términos clave, passphrase y sobre de recuperación. El glosario resume las diferencias en una frase por término.", - "intro": "PBS puede cifrar las copias con una clave que vive solo en el host. Los datos se cifran en el host antes de subirse; en PBS llegan ya cifrados. En ProxMenux este cifrado es opcional. Al activarlo, el usuario decide aparte, con una pregunta sí/no, si quiere subir a PBS también una copia de esa clave envuelta con una passphrase (el sobre de recuperación) como red de seguridad. La respuesta se puede cambiar después desde el Monitor. La clave siempre queda en una única ruta del host — /usr/local/share/proxmenux/pbs-key.conf — y se reutiliza sin volver a preguntar en las copias siguientes.", + "intro": "PBS puede cifrar los backups con una clave que vive solo en el host. Los datos se cifran en el host antes de subirse; en PBS llegan ya cifrados. En ProxMenux este cifrado es opcional. Al activarlo, el usuario decide aparte, con una pregunta sí/no, si quiere subir a PBS también una copia de esa clave envuelta con una passphrase (el sobre de recuperación) como red de seguridad. La respuesta se puede cambiar después desde el Monitor. La clave siempre queda en una única ruta del host — /usr/local/share/proxmenux/pbs-key.conf — y se reutiliza sin volver a preguntar en los backups siguientes.", "keyfileTitle": "Configuración inicial de la clave", - "keyfileBody": "El diálogo aparece en la primera copia cifrada del host y hace dos preguntas. Primero, si se quiere cifrar la copia: No sigue sin cifrado; Sí pasa al segundo paso. Segundo, qué clave usar. Si ya hay una instalada en /usr/local/share/proxmenux/pbs-key.conf, se reutiliza sin preguntar más y las copias posteriores tampoco vuelven a preguntar. Si no la hay, aparecen dos opciones: Generar una clave nueva crea una con proxmox-backup-client key create --kdf none. Usar una clave existente busca primero una gestionada por PVE: si el repositorio PBS elegido tiene una en /etc/pve/priv/storage/<NAME>.enc, ese fichero se copia solo a la ruta canónica. Si no hay ninguna que coincida, el diálogo pide la ruta absoluta donde el usuario ha dejado la clave en este host. En cualquier caso, el fichero termina en la ruta canónica con chmod 600.", + "keyfileBody": "El diálogo aparece en el primer backup cifrado del host y hace dos preguntas. Primero, si se quiere cifrar el backup: No sigue sin cifrado; Sí pasa al segundo paso. Segundo, qué clave usar. Si ya hay una instalada en /usr/local/share/proxmenux/pbs-key.conf, se reutiliza sin preguntar más y los backups posteriores tampoco vuelven a preguntar. Si no la hay, aparecen dos opciones: Generar una clave nueva crea una con proxmox-backup-client key create --kdf none. Usar una clave existente busca primero una gestionada por PVE: si el repositorio PBS elegido tiene una en /etc/pve/priv/storage/<NAME>.enc, ese fichero se copia solo a la ruta canónica. Si no hay ninguna que coincida, el diálogo pide la ruta absoluta donde el usuario ha dejado la clave en este host. En cualquier caso, el fichero termina en la ruta canónica con chmod 600.", "modesTitle": "Clave por host o compartida", "modesIntro": "Los dos modos están soportados y ninguno se impone — el usuario elige según cómo tenga organizados sus hosts.", "modesPerHostTitle": "Clave por host (por defecto)", - "modesPerHostBody": "Cada host genera su propia clave la primera vez que se activa el cifrado. Es el modo con mayor aislamiento: si la clave de un host se ve comprometida, no afecta a las copias de ningún otro. Recomendado para entornos de producción y para escenarios donde cada host tiene su propio responsable o requisitos distintos.", + "modesPerHostBody": "Cada host genera su propia clave la primera vez que se activa el cifrado. Es el modo con mayor aislamiento: si la clave de un host se ve comprometida, no afecta a los backups de ningún otro. Recomendado para entornos de producción y para escenarios donde cada host tiene su propio responsable o requisitos distintos.", "modesSharedTitle": "Clave compartida (importar la misma en cada host)", - "modesSharedBody": "Se genera una única clave y se importa en todos los hosts mediante la opción Usar una clave existente. La gestión es más sencilla: hay un solo secreto que proteger, y cualquier host puede leer las copias de cualquier otro (útil para verificación centralizada, ejercicios de restauración cruzada o consolidación). A cambio, si la clave compartida se filtra queda expuesto todo el conjunto de hosts a la vez. Recomendado para laboratorios personales y entornos donde todos los hosts pertenecen al mismo responsable y comparten el mismo nivel de confianza.", + "modesSharedBody": "Se genera una única clave y se importa en todos los hosts mediante la opción Usar una clave existente. La gestión es más sencilla: hay un solo secreto que proteger, y cualquier host puede leer los backups de cualquier otro (útil para verificación centralizada, ejercicios de restauración cruzada o consolidación). A cambio, si la clave compartida se filtra queda expuesto todo el conjunto de hosts a la vez. Recomendado para laboratorios personales y entornos donde todos los hosts pertenecen al mismo responsable y comparten el mismo nivel de confianza.", "recoveryTitle": "¿Subir la clave a PBS? — el usuario decide", - "recoveryBody": "Justo después de elegir la clave, ProxMenux pregunta ¿Subir la clave a PBS?, con dos respuestas. No se sube ningún artefacto de recuperación a PBS hasta que el usuario responde Sí. Por defecto se elige No, mantener solo en local: la clave queda en su ruta canónica, ProxMenux no sube artefactos de recuperación a PBS y el usuario se encarga de guardarla fuera del host. El botón Descargar archivo de clave del Monitor, en la fila del destino PBS, permite obtenerla cuando se necesite. Al elegir Sí, subir, se pide dos veces una frase de contraseña de recuperación y se comprueba que coincidan. ProxMenux protege la clave con AES-256-CBC y PBKDF2 (600.000 iteraciones y sal aleatoria) para generar pbs-key.recovery.enc. Cada copia cifrada posterior sube esa envoltura a PBS como un grupo de copias asociado. En estas subidas no se envían a PBS ni la frase de contraseña ni la clave en texto claro. La elección puede cambiarse en cualquier momento desde el Monitor: el control de custodia de la fila del destino permite elegir Sí o No y aplicar inmediatamente Iniciar subida, Detener subida o Actualizar frase de contraseña, según el estado.", + "recoveryBody": "Justo después de elegir la clave, ProxMenux pregunta ¿Subir clave a PBS?, con dos respuestas. No se sube ningún artefacto de recuperación a PBS hasta que el usuario responde Sí. Por defecto se elige No, mantener solo local: la clave queda en su ruta canónica, ProxMenux no sube artefactos de recuperación a PBS y el usuario se encarga de guardarla fuera del host. El botón Descargar archivo clave del Monitor, en la fila del destino PBS, permite obtenerla cuando se necesite. Al elegir Sí, subir, se pide dos veces una frase de contraseña de recuperación y se comprueba que coincidan. ProxMenux protege la clave con AES-256-CBC y PBKDF2 (600.000 iteraciones y sal aleatoria) para generar pbs-key.recovery.enc. Cada backup cifrado posterior sube esa envoltura a PBS como un grupo de backup asociado. En estas subidas no se envían a PBS ni la frase de contraseña ni la clave en texto claro. La elección puede cambiarse en cualquier momento desde el Monitor: el control de custodia de la fila del destino permite elegir Sí o No y aplicar inmediatamente Iniciar subida, Detener subida o Actualizar frase de contraseña, según el estado.", "blobUploadTitle": "Grupo emparejado en PBS", - "blobUploadBody1": "Cuando la custodia está configurada como Sí, subir, ProxMenux sube el archivo de recuperación protegido a PBS después de cada copia cifrada. Lo guarda en un segundo grupo de copia asociado, con el mismo nombre que el grupo del host y el sufijo -keyrecovery. Los dos grupos aparecen juntos en la lista del almacén de datos: uno para las copias del host y otro para los archivos de recuperación. El archivo de recuperación nunca sale del host en texto plano: se cifra en el propio host con AES-256-CBC y PBKDF2 antes de enviar ningún dato (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS solo recibe el archivo ya cifrado.", + "blobUploadBody1": "Cuando la respuesta es Sí, subir, ProxMenux sube el sobre de recuperación a PBS después de cada backup cifrado como un segundo grupo emparejado, con el mismo nombre que el del host pero terminado en -keyrecovery. Los dos grupos aparecen juntos en el listado del datastore: uno con los backups del host, otro con los sobres de recuperación. El sobre nunca sale del host en claro: se cifra en el propio host con AES-256-CBC y PBKDF2 antes de enviar un solo byte (openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt). PBS solo recibe el sobre ya cifrado.", "envelopeSecurityTitle": "¿No es un riesgo subir el archivo keyrecovery a PBS?", "envelopeSecurityBody": "El sobre viaja y se guarda cifrado en todo momento. La passphrase de recuperación no sale nunca del host: el cifrado ocurre en local antes de la subida y PBS solo recibe el resultado ya cifrado. Un administrador de PBS —o cualquiera con acceso al datastore— puede descargar el sobre, pero sin la passphrase no puede leer la clave que contiene: son solo bytes cifrados. Para reconstruir la clave hacen falta las dos cosas a la vez, el sobre y la passphrase, y solo el usuario tiene ambas.", "blobUploadConstraintTitle": "Por qué dos grupos y no uno solo cifrado", - "blobUploadConstraintBody": "Una invocación de proxmox-backup-client backup cifra todos sus archivos con la misma clave o no cifra ninguno; no permite mezclar ambos casos. La copia del host se cifra con su archivo de clave, pero la envoltura de recuperación no puede acompañarla en la misma subida porque acabaría cifrada con la propia clave que contiene. En un host recién reinstalado sería imposible abrirla: haría falta la clave para descifrar esa misma clave. Por eso los dos artefactos se suben por separado y aparecen en dos grupos: el cliente PBS cifra la copia del host con el archivo de clave y ProxMenux cifra la envoltura con la frase de contraseña antes de subirla. Dos capas de cifrado distintas protegen dos elementos diferentes.", + "blobUploadConstraintBody": "Una invocación de proxmox-backup-client backup cifra todos sus archivos con la misma clave o no cifra ninguno; no permite mezclar ambos casos. El backup del host se cifra con su archivo de clave, pero la envoltura de recuperación no puede acompañarla en la misma subida porque acabaría cifrada con la propia clave que contiene. En un host recién reinstalado sería imposible abrirla: haría falta la clave para descifrar esa misma clave. Por eso los dos artefactos se suben por separado y aparecen en dos grupos: el cliente PBS cifra el backup del host con el archivo de clave y ProxMenux cifra la envoltura con la frase de contraseña antes de subirla. Dos capas de cifrado distintas protegen dos elementos diferentes.", "blobUploadImageAlt": "Interfaz de PBS mostrando los grupos hostcfg-HOSTNAME y hostcfg-HOSTNAME-keyrecovery adyacentes en el listado del datastore.", - "blobUploadImageCaption": "Interfaz de PBS — los grupos de copia emparejados. El grupo principal contiene las copias del host; el grupo -keyrecovery contiene la clave envuelta con la passphrase.", + "blobUploadImageCaption": "Interfaz de PBS — los grupos de backup emparejados. El grupo principal contiene los backups del host; el grupo -keyrecovery contiene la clave envuelta con la passphrase.", "recoverTitle": "Recuperación en un equipo recién instalado", - "recoverBody": "Cuando la clave no está en su sitio —tras reinstalar el host desde cero o después de eliminarla a propósito— el flujo de restauración prueba tres fuentes en orden y se queda con la primera que produce una clave usable. Primero, si el repositorio PBS elegido tiene una clave gestionada por PVE en /etc/pve/priv/storage/<NAME>.enc, se copia sola a la ruta canónica. Segundo, si en PBS hay un grupo -keyrecovery, se descarga la copia más reciente y se pide la passphrase de recuperación para abrirla. Tercero, si ninguna de las dos anteriores funciona o el usuario las descarta, el diálogo pide la ruta absoluta donde ha dejado la clave en este host, y se copia a la ruta canónica. El Monitor expone el mismo flujo dentro del modal de la copia. Si al Restaurar, Descargar o Ver contenido falta la clave, aparece un panel ámbar arriba del modal con las mismas tres vías de importación. Si la clave está instalada pero no es la correcta para esa copia, PBS devuelve un error de tipo wrong key — manifest's key XX does not match provided key YY y el modal muestra un panel estructurado con el fingerprint que PBS espera (el que quedó grabado en el manifest de la copia), para que el usuario sepa qué clave concreta necesita importar.", + "recoverBody": "Cuando la clave no está en su sitio —tras reinstalar el host desde cero o después de eliminarla a propósito— el flujo de restauración prueba tres fuentes en orden y se queda con la primera que produce una clave usable. Primero, si el repositorio PBS elegido tiene una clave gestionada por PVE en /etc/pve/priv/storage/<NAME>.enc, se copia sola a la ruta canónica. Segundo, si en PBS hay un grupo -keyrecovery, se descarga el backup más reciente y se pide la passphrase de recuperación para abrirla. Tercero, si ninguna de las dos anteriores funciona o el usuario las descarta, el diálogo pide la ruta absoluta donde ha dejado la clave en este host, y se copia a la ruta canónica. El Monitor expone el mismo flujo dentro del modal del backup. Si al Restaurar, Descargar o Ver contenido falta la clave, aparece un panel ámbar arriba del modal con las mismas tres vías de importación. Si la clave está instalada pero no es la correcta para ese backup, PBS devuelve un error de tipo wrong key — manifest's key XX does not match provided key YY y el modal muestra un panel estructurado con el fingerprint que PBS espera (el que quedó grabado en el manifest del backup), para que el usuario sepa qué clave concreta necesita importar.", "monitorManagementTitle": "Gestionar la clave desde el Monitor", - "monitorManagementBody": "El Monitor muestra los controles del archivo de clave en cada fila de destino PBS de la página de configuración de copias. Hay tres acciones: Descargar envía el archivo de clave actual al navegador del usuario; Subir sustituye el archivo de clave instalado por uno proporcionado por el usuario (el anterior solo se sobrescribe cuando el nuevo se ha guardado correctamente en la ruta canónica); y Eliminar borra el archivo de clave del host. Junto a estas acciones hay un único control de custodia para la recuperación: las opciones Sí y No de ¿Subir la clave a PBS?, un campo para la frase de contraseña al elegir Sí y un botón contextual para aplicar el cambio, con el texto Iniciar subida, Detener subida o Actualizar frase de contraseña según el estado actual. Todas las acciones utilizan los mismos endpoints de Flask que el menú de terminal, por lo que el resultado en disco y el estado en PBS son idénticos desde ambas interfaces." + "monitorManagementBody": "En la página de configuración de backups, la fila de cada destino PBS incluye los controles de la clave. Tiene tres acciones: Descargar exporta la clave actual al navegador del usuario, Subir reemplaza la clave instalada por otra que aporta el usuario (la anterior solo se sobrescribe cuando la nueva ha llegado correctamente a su ruta) y Eliminar retira la clave del host. Justo al lado está el interruptor del sobre de recuperación: un Sí/No para ¿Subir clave a PBS?, un campo de passphrase que aparece al elegir Sí y un botón que se adapta al estado actual: Empezar a subir, Dejar de subir o Actualizar passphrase. Los controles del Monitor y el diálogo del shell hacen lo mismo por dentro, así que el resultado en disco y en PBS es idéntico se use el que se use." }, "restoreAccess": { "heading": "Recuperación del lado de la restauración", - "body": "El flujo de restauración descubre las copias de host de ProxMenux en PBS listando los grupos de backups bajo el repositorio configurado y filtrando por patrón de backup ID. La pestaña Backups del Monitor renderiza la misma lista. Seleccionar un backup dispara proxmox-backup-client restore con el mismo repositorio + contraseña + fingerprint (y --keyfile cuando el backup iba cifrado), extrayendo el .pxar a un directorio de staging que _rs_check_layout alimenta al pipeline estándar de restauración. Para recuperación manual fuera de ProxMenux, el mismo comando extrae el archivo a cualquier ruta — el árbol resultante puede inspeccionarse o alimentar una restauración a mano." + "body": "El flujo de restauración descubre los backups de host de ProxMenux en PBS listando los grupos de backups bajo el repositorio configurado y filtrando por patrón de backup ID. La pestaña Backups del Monitor renderiza la misma lista. Seleccionar un backup dispara proxmox-backup-client restore con el mismo repositorio + contraseña + fingerprint (y --keyfile cuando el backup iba cifrado), extrayendo el .pxar a un directorio de staging que _rs_check_layout alimenta al pipeline estándar de restauración. Para recuperación manual fuera de ProxMenux, el mismo comando extrae el archivo a cualquier ruta — el árbol resultante puede inspeccionarse o alimentar una restauración a mano." }, "references": { "heading": "Referencias", @@ -91,17 +91,17 @@ { "label": "proxmox-backup-client", "href": "https://pbs.proxmox.com/docs/backup-client.html", - "tail": " — la herramienta de línea de comandos que ProxMenux invoca en cada copia y restauración. Cubre backup IDs, tipos de backup, archivos, sintaxis del repositorio y variables de entorno." + "tail": " — la herramienta de línea de comandos que ProxMenux invoca en cada backup y restauración. Cubre backup IDs, tipos de backup, archivos, sintaxis del repositorio y variables de entorno." }, { "label": "Cifrado del lado del cliente", "href": "https://pbs.proxmox.com/docs/backup-client.html#encryption", - "tail": " — creación del archivo de clave, modos --kdf y modelo de cifrado que ProxMenux amplía con una copia de recuperación protegida por frase de contraseña." + "tail": " — creación del keyfile, modos --kdf, el modelo de cifrado que ProxMenux extiende con un escrow de passphrase." }, { "label": "Gestión de datastores", "href": "https://pbs.proxmox.com/docs/storage.html", - "tail": " — creación y administración de los datastores que reciben las copias de host, incluyendo el layout del chunk-store y permisos." + "tail": " — creación y administración de los datastores que reciben los backups de host, incluyendo el layout del chunk-store y permisos." }, { "label": "Poda y recolección de basura", diff --git a/web/messages/es/docs/backup-restore/glossary.json b/web/messages/es/docs/backup-restore/glossary.json index ce517b0d..24a9e168 100644 --- a/web/messages/es/docs/backup-restore/glossary.json +++ b/web/messages/es/docs/backup-restore/glossary.json @@ -1,16 +1,16 @@ { "meta": { "title": "Glosario de términos — Backup & Restore | ProxMenux", - "description": "Glosario de términos y definiciones en español para el sistema de copia y restauración de ProxMenux: cifrado, clave, passphrase, sobre de recuperación, PBS, chunks, rootfs, manifiesto, runner y hidratación cross-kernel.", + "description": "Glosario de términos y definiciones en español para el sistema de backup y restauración de ProxMenux: cifrado, clave, passphrase, sobre de recuperación, PBS, chunks, rootfs, manifiesto, runner y hidratación cross-kernel.", "ogTitle": "Glosario de Backup & Restore | ProxMenux", - "ogDescription": "Definiciones claras en español para los términos que aparecen en la documentación de copia y restauración de ProxMenux.", + "ogDescription": "Definiciones claras en español para los términos que aparecen en la documentación de backup y restauración de ProxMenux.", "twitterTitle": "Glosario Backup & Restore | ProxMenux", "twitterDescription": "Passphrase, keyfile, sobre de recuperación, rootfs, manifiesto, PBS, chunks — todo definido en español." }, "header": { "title": "Glosario", - "description": "Términos que aparecen a lo largo de la documentación de copia y restauración, con su definición.", - "section": "Copias de seguridad y restauración" + "description": "Términos que aparecen a lo largo de la documentación de backup y restauración, con su definición.", + "section": "Backup & Restore" }, "intro": { "body": "Los términos están agrupados por temas. Cada entrada incluye una definición breve." @@ -18,12 +18,12 @@ "groups": [ { "title": "Cifrado y recuperación de clave", - "intro": "Terminología del bloque de cifrado de copias en PBS. Incluye dos secretos distintos: una clave binaria y una passphrase escrita.", + "intro": "Terminología del bloque de cifrado de backups en PBS. Incluye dos secretos distintos: una clave binaria y una passphrase escrita.", "entries": [ { "id": "passphrase-recuperacion", "term": "Passphrase de recuperación", - "def": "Contraseña de texto que elige el usuario para proteger el sobre de recuperación. Se pide dos veces con validación de coincidencia y solo se usa para cifrar el sobre y para descifrarlo si algún día hay que recuperar la clave. No sirve para desbloquear la clave del keyfile ni se envía nunca a PBS. Nunca sale del host durante una copia normal." + "def": "Contraseña de texto que elige el usuario para proteger el sobre de recuperación. Se pide dos veces con validación de coincidencia y solo se usa para cifrar el sobre y para descifrarlo si algún día hay que recuperar la clave. No sirve para desbloquear la clave del keyfile ni se envía nunca a PBS. Nunca sale del host durante un backup normal." }, { "id": "clave-cifrado", @@ -33,7 +33,7 @@ { "id": "contrasena-keyfile", "term": "Contraseña de la clave (KDF passphrase)", - "def": "Contraseña opcional que puede llevar la propia clave, distinta de la passphrase de recuperación. Solo aparece si la clave se creó con --kdf scrypt (una clave importada de otro sitio, por ejemplo). Sin ella, la clave no se puede desbloquear en cada uso. ProxMenux la persiste cifrada en el host para que las copias programadas puedan ejecutarse sin diálogo interactivo." + "def": "Contraseña opcional que puede llevar la propia clave, distinta de la passphrase de recuperación. Solo aparece si la clave se creó con --kdf scrypt (una clave importada de otro sitio, por ejemplo). Sin ella, la clave no se puede desbloquear en cada uso. ProxMenux la persiste cifrada en el host para que los backups programados puedan ejecutarse sin diálogo interactivo." }, { "id": "sobre-recuperacion", @@ -53,7 +53,7 @@ { "id": "kdf-scrypt", "term": "--kdf scrypt", - "def": "Opción de proxmox-backup-client key create que genera una clave protegida con una contraseña de la clave. Cada vez que se usa la clave hay que desbloquearla con esa contraseña. ProxMenux acepta este tipo de claves al importarlas y guarda la contraseña cifrada para que las copias programadas puedan correr sin intervención." + "def": "Opción de proxmox-backup-client key create que genera una clave protegida con una contraseña de la clave. Cada vez que se usa la clave hay que desbloquearla con esa contraseña. ProxMenux acepta este tipo de claves al importarlas y guarda la contraseña cifrada para que los backups programados puedan correr sin intervención." }, { "id": "aes-256-cbc", @@ -68,8 +68,8 @@ ] }, { - "title": "Estructura de la copia", - "intro": "Términos que describen lo que hay dentro de una copia, sea cual sea el destino.", + "title": "Estructura del backup", + "intro": "Términos que describen lo que hay dentro de un backup, sea cual sea el destino.", "entries": [ { "id": "rootfs", @@ -79,17 +79,17 @@ { "id": "manifiesto", "term": "Manifiesto (manifest.json)", - "def": "Documento JSON estructurado que describe el host de origen en el momento de la copia: hardware, almacenamiento, kernel, componentes instalados por ProxMenux e inventario de VMs y LXCs. Lo genera ProxMenux con seis colectores independientes. La restauración lo utiliza para comparar origen y destino." + "def": "Documento JSON estructurado que describe el host de origen en el momento del backup: hardware, almacenamiento, kernel, componentes instalados por ProxMenux e inventario de VMs y LXCs. Lo genera ProxMenux con seis colectores independientes. La restauración lo utiliza para comparar origen y destino." }, { "id": "staging", "term": "Directorio de staging", - "def": "Directorio temporal donde ProxMenux ensambla los tres bloques (rootfs, metadata y manifiesto) antes de empaquetarlos y subirlos al destino. Se elimina automáticamente al terminar la copia, incluso si se aborta." + "def": "Directorio temporal donde ProxMenux ensambla los tres bloques (rootfs, metadata y manifiesto) antes de empaquetarlos y subirlos al destino. Se elimina automáticamente al terminar el backup, incluso si se aborta." }, { "id": "perfil-defecto", "term": "Perfil por defecto", - "def": "Conjunto curado de rutas que ProxMenux copia por defecto en toda copia. Cubre configuración de PVE, red, SSH, kernel, apt, herramientas ProxMenux y otras. Está definido en el código y se documenta en la página Cómo funciona." + "def": "Conjunto curado de rutas que ProxMenux copia por defecto en todo backup. Cubre configuración de PVE, red, SSH, kernel, apt, herramientas ProxMenux y otras. Está definido en el código y se documenta en la página Cómo funciona." }, { "id": "rutas-personalizadas", @@ -100,22 +100,22 @@ }, { "title": "Destinos y almacenamiento", - "intro": "Términos ligados al lugar donde acaba la copia — servidor PBS, archivo local o repositorio Borg — y a la forma en que PBS organiza los datos.", + "intro": "Términos ligados al lugar donde acaba el backup — servidor PBS, archivo local o repositorio Borg — y a la forma en que PBS organiza los datos.", "entries": [ { "id": "repositorio-pbs", "term": "Repositorio PBS", - "def": "Combinación de servidor Proxmox Backup Server + datastore + usuario al que se suben las copias. Se identifica con el formato user@realm@host:datastore. Un mismo servidor PBS puede alojar varios repositorios." + "def": "Combinación de servidor Proxmox Backup Server + datastore + usuario al que se suben los backups. Se identifica con el formato user@realm@host:datastore. Un mismo servidor PBS puede alojar varios repositorios." }, { "id": "datastore", - "term": "almacén de datos", - "def": "Almacén concreto dentro de un servidor PBS donde se guardan las copias y sus chunks. Cada datastore vive sobre un sistema de ficheros del servidor PBS y tiene sus propios permisos y políticas." + "term": "Datastore", + "def": "Almacén concreto dentro de un servidor PBS donde se guardan los backups y sus chunks. Cada datastore vive sobre un sistema de ficheros del servidor PBS y tiene sus propios permisos y políticas." }, { "id": "chunk", "term": "Chunk / deduplicación por chunks", - "def": "PBS divide cada copia en trozos (chunks) de tamaño variable, identifica cada trozo por su hash y solo guarda cada trozo una vez, aunque aparezca en muchas copias distintas. Esto hace que copias sucesivas del mismo host o entre hosts similares consuman muy poco espacio adicional." + "def": "PBS divide cada backup en trozos (chunks) de tamaño variable, identifica cada trozo por su hash y solo guarda cada trozo una vez, aunque aparezca en muchos backups distintos. Esto hace que backups sucesivos del mismo host o entre hosts similares consuman muy poco espacio adicional." }, { "id": "fingerprint", @@ -124,13 +124,13 @@ }, { "id": "grupo-copia", - "term": "Grupo de copia (backup group)", - "def": "Contenedor lógico dentro de PBS bajo el cual se acumulan todas las copias sucesivas del mismo activo. Cada nueva copia comparte deduplicación con las anteriores del mismo grupo. ProxMenux utiliza dos grupos por host cuando hay cifrado: uno para la copia del host y otro con sufijo -keyrecovery para el sobre de recuperación." + "term": "Grupo de backup (backup group)", + "def": "Contenedor lógico dentro de PBS bajo el cual se acumulan todos los backups sucesivos del mismo activo. Cada nuevo backup comparte deduplicación con los anteriores del mismo grupo. ProxMenux utiliza dos grupos por host cuando hay cifrado: uno para el backup del host y otro con sufijo -keyrecovery para el sobre de recuperación." }, { "id": "backup-id", - "term": "ID del backup", - "def": "Nombre del grupo de copia. ProxMenux propone por defecto hostcfg-HOSTNAME y permite editarlo antes de la subida; los caracteres no admitidos se limpian automáticamente." + "term": "Backup ID", + "def": "Nombre del grupo de backup. ProxMenux propone por defecto hostcfg-HOSTNAME y permite editarlo antes de la subida; los caracteres no admitidos se limpian automáticamente." }, { "id": "pxar", @@ -145,18 +145,18 @@ "entries": [ { "id": "runner", - "term": "Ejecutor", - "def": "Script run_scheduled_backup.sh que ejecuta una copia programada. Lee la configuración del trabajo, lanza el backend correspondiente (Local, PBS o Borg), aplica la retención tras completarse con éxito y envía las notificaciones configuradas." + "term": "Runner", + "def": "Script run_scheduled_backup.sh que ejecuta un backup programado. Lee la configuración del trabajo, lanza el backend correspondiente (Local, PBS o Borg), aplica la retención al terminar y envía las notificaciones configuradas." }, { "id": "trabajo-programado", "term": "Trabajo programado", - "def": "Configuración persistida de una copia recurrente. Incluye destino, credenciales, cifrado, horario y retención. Se guarda en /var/lib/proxmenux/backup-jobs/<id>.env." + "def": "Configuración persistida de un backup recurrente. Incluye destino, credenciales, cifrado, horario y retención. Se guarda en /var/lib/proxmenux/backup-jobs/<id>.env." }, { "id": "modo-adjunto", "term": "Modo adjunto (attach mode)", - "def": "Trabajo sin timer propio. Un hook job-end de vzdump lo ejecuta después de las copias de invitados cuando coincide el almacenamiento. El padre seleccionado aporta destino y retención inicial, pero el hook compara almacenamiento, no ID de tarea padre; otra tarea con el mismo destino también puede activarlo. Solo para Local y PBS." + "def": "Trabajo sin timer propio. Un hook job-end de vzdump lo ejecuta después de los backups de invitados cuando coincide el almacenamiento. El padre seleccionado aporta destino y retención inicial, pero el hook compara almacenamiento, no ID de tarea padre; otra tarea con el mismo destino también puede activarlo. Solo para Local y PBS." }, { "id": "timer-systemd", @@ -166,7 +166,7 @@ { "id": "retencion", "term": "Retención (keep-last, keep-daily…)", - "def": "Política que decide qué copias antiguas se conservan y cuáles se eliminan. Se define por trabajo con parámetros como keep-last, keep-daily, keep-weekly, keep-monthly. El runner la aplica después de cada copia exitosa." + "def": "Política que decide qué backups antiguos se conservan y cuáles se eliminan. Se define por trabajo con parámetros como keep-last, keep-daily, keep-weekly, keep-monthly. El runner la aplica después de cada backup exitoso." } ] }, @@ -182,7 +182,7 @@ { "id": "hidratacion", "term": "Hidratación (cross-kernel)", - "def": "Pasada de restauración que funde la configuración propia del usuario del origen (tokens IOMMU, IDs de dispositivos VFIO, quirks personalizadas, claves de GRUB) sobre la configuración de arranque fresca del destino, sin copiar verbatim los ficheros ligados al kernel del origen. Se ejecuta cuando el kernel del destino es más reciente que el de la copia." + "def": "Pasada de restauración que funde la configuración propia del usuario del origen (tokens IOMMU, IDs de dispositivos VFIO, quirks personalizadas, claves de GRUB) sobre la configuración de arranque fresca del destino, sin copiar verbatim los ficheros ligados al kernel del origen. Se ejecuta cuando el kernel del destino es más reciente que el del backup." }, { "id": "cross-kernel", @@ -196,13 +196,13 @@ }, { "id": "compatibility-check", - "term": "Verificación de compatibilidad", + "term": "Compatibility check", "def": "Comparación entre el manifiesto del origen y el estado del destino que ProxMenux realiza al principio de la restauración. Decide qué partes se copian verbatim, cuáles necesitan hidratación y cuáles se recrean desde el instalador." }, { "id": "equipo-recien-instalado", "term": "Equipo recién instalado", - "def": "Host acabado de reinstalar desde cero, sin la clave de cifrado local. Para restaurar copias cifradas hace falta primero recuperar la clave desde el sobre almacenado en PBS, con la passphrase de recuperación." + "def": "Host acabado de reinstalar desde cero, sin la clave de cifrado local. Para restaurar backups cifrados hace falta primero recuperar la clave desde el sobre almacenado en PBS, con la passphrase de recuperación." } ] } @@ -213,7 +213,7 @@ { "label": "Cómo funciona", "href": "/docs/backup-restore/how-it-works", - "tail": " — dónde encajan el rootfs, el manifiesto y el inventario de aplicaciones en cada copia." + "tail": " — dónde encajan el rootfs, el manifiesto y el inventario de aplicaciones en cada backup." }, { "label": "Destino Proxmox Backup Server", diff --git a/web/messages/es/docs/backup-restore/how-it-works.json b/web/messages/es/docs/backup-restore/how-it-works.json index 877fbaa4..9240775f 100644 --- a/web/messages/es/docs/backup-restore/how-it-works.json +++ b/web/messages/es/docs/backup-restore/how-it-works.json @@ -1,30 +1,30 @@ { "meta": { "title": "Cómo funciona ProxMenux Backup por dentro — rootfs, manifiesto, aplicaciones", - "description": "Desglose detallado del contenido de una copia de ProxMenux: el rootfs producido por rsync del perfil de rutas por defecto, el manifiesto estructurado construido por seis colectores independientes, y el inventario de aplicaciones que dirige la reinstalación automática de paquetes y componentes tras una restauración.", + "description": "Desglose detallado del contenido de un backup de ProxMenux: el rootfs producido por rsync del perfil de rutas por defecto, el manifiesto estructurado construido por seis colectores independientes, y el inventario de aplicaciones que dirige la reinstalación automática de paquetes y componentes tras una restauración.", "ogTitle": "Cómo funciona ProxMenux Backup por dentro", - "ogDescription": "Los tres bloques de una copia de ProxMenux explicados: rootfs, manifiesto y aplicaciones.", + "ogDescription": "Los tres bloques de un backup de ProxMenux explicados: rootfs, manifiesto y aplicaciones.", "twitterTitle": "Cómo funciona ProxMenux Backup | ProxMenux", - "twitterDescription": "Los tres bloques de una copia de ProxMenux y cómo la restauración reproduce el host de origen a partir de ellos." + "twitterDescription": "Los tres bloques de un backup de ProxMenux y cómo la restauración reproduce el host de origen a partir de ellos." }, "header": { "title": "Cómo funciona", - "description": "Desglose interno de una copia de seguridad creada con ProxMenux — sistema de ficheros, manifiesto e inventario de aplicaciones — y cómo la restauración consume los tres para reproducir el host de origen sobre un destino que puede no compartir el mismo kernel.", - "section": "Copias de seguridad y restauración" + "description": "Desglose interno de un backup creado con ProxMenux — sistema de ficheros, manifiesto e inventario de aplicaciones — y cómo la restauración consume los tres para reproducir el host de origen sobre un destino que puede no compartir el mismo kernel.", + "section": "Backup & Restore" }, "intro": { "title": "Un archivo, tres bloques", - "body": "Cada copia produce una estructura con tres bloques definidos bajo un único directorio de preparación. El archivo subido al destino (.tar.zst local, copia PBS o archivo Borg) contiene esa misma estructura. La restauración utiliza los tres: consulta el manifiesto antes de aplicar cambios para detectar diferencias y decidir qué omitir; rootfs aporta los archivos de configuración, que se aplican en vivo o tras el reinicio; y el inventario de aplicaciones dirige la instalación de paquetes y la reinstalación de componentes después del arranque. Cada bloque puede inspeccionarse o extraerse de forma independiente." + "body": "Cada backup produce una estructura con tres bloques definidos bajo un único directorio de preparación. El archivo subido al destino (.tar.zst local, backup PBS o archivo Borg) contiene esa misma estructura. La restauración utiliza los tres: consulta el manifiesto antes de aplicar cambios para detectar diferencias y decidir qué omitir; rootfs aporta los archivos de configuración, que se aplican en vivo o tras el reinicio; y el inventario de aplicaciones dirige la instalación de paquetes y la reinstalación de componentes después del arranque. Cada bloque puede inspeccionarse o extraerse de forma independiente." }, "layout": { "heading": "Layout del archivo", - "intro": "Cada archivo respeta el mismo layout con independencia del destino. El subdirectorio metadata/ contiene los bloques estructurados; el subdirectorio rootfs/ contiene la copia del sistema de ficheros.", - "treeCaption": "El directorio de staging generado durante una copia. Todos los destinos reciben el mismo árbol (adaptado a su formato nativo: tar para local, chunks PBS para PBS, segmentos borg para 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│ ├── paths_archived.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/…" + "intro": "Cada archivo respeta el mismo layout con independencia del destino. El subdirectorio metadata/ contiene los bloques estructurados; el subdirectorio rootfs/ contiene el backup del sistema de ficheros.", + "treeCaption": "El directorio de staging generado durante un backup. Todos los destinos reciben el mismo árbol (adaptado a su formato nativo: tar para local, chunks PBS para PBS, segmentos borg para Borg).", + "tree": "backup-[timestamp]/\n├── manifest.json # estado estructurado del host\n├── metadata/\n│ ├── packages.manual.list # apt-mark showmanual\n│ ├── run_info.env # identidad de la ejecución + versión del kernel + método pmxcfs\n│ ├── paths_archived.txt # lista exacta de rutas que llegaron a rootfs/\n│ └── missing_paths.txt # rutas del perfil ausentes en el origen\n└── rootfs/\n ├── etc/ # /etc/pve, /etc/network, /etc/systemd/network, /etc/ssh, …\n ├── root/ # /root (con subdirs volátiles excluidos)\n ├── usr/local/ # /usr/local/bin, /usr/local/share/proxmenux, …\n └── var/ # /var/lib/pve-cluster (config.db vía sqlite3 .backup), /var/spool/cron/…" }, "rootfs": { "heading": "El bloque rootfs", - "intro": "El árbol rootfs/ es una copia plana del sistema de ficheros producida por rsync desde el host de origen. Contiene un perfil por defecto curado de rutas que importan para una restauración de Proxmox, más cualquier ruta personalizada añadida por el usuario al trabajo de copia o a la sesión interactiva. El conjunto es intencionadamente estrecho: solamente rutas que contienen configuración o contienen estado que Proxmox no puede regenerar por sí solo.", + "intro": "El árbol rootfs/ es una copia plana del sistema de ficheros producida por rsync desde el host de origen. Contiene un perfil por defecto curado de rutas que importan para una restauración de Proxmox, más cualquier ruta personalizada añadida por el usuario al trabajo de backup o a la sesión interactiva. El conjunto es intencionadamente estrecho: solamente rutas que contienen configuración o contienen estado que Proxmox no puede regenerar por sí solo.", "defaultProfileTitle": "El perfil por defecto", "defaultProfileBody": "El perfil por defecto se define en hb_default_profile_paths de lib_host_backup_common.sh. Incluye ocho categorías fijas y, si corresponde, el estado ZFS, que juntas describen un host Proxmox operativo:", "categoriesTitle": "Categorías de rutas", @@ -32,7 +32,7 @@ { "category": "Núcleo PVE", "paths": "/etc/pve, /var/lib/pve-cluster, /etc/vzdump.conf", - "why": "Contenido del filesystem del clúster y valores por defecto de vzdump. La base pmxcfs (config.db) se captura con un snapshot consistente vía sqlite3 .backup sin parar el clúster, y los sidecars .db-wal y .db-shm quedan excluidos del rsync. Si sqlite3 no está disponible, la copia deposita un config.db.raw-fallback que la restauración promociona automáticamente." + "why": "Contenido del filesystem del clúster y valores por defecto de vzdump. La base pmxcfs (config.db) se captura con un snapshot consistente vía sqlite3 .backup sin parar el clúster, y los sidecars .db-wal y .db-shm quedan excluidos del rsync. Si sqlite3 no está disponible, el backup deposita un config.db.raw-fallback que la restauración promociona automáticamente." }, { "category": "Identidad del host y red", @@ -62,12 +62,12 @@ { "category": "Estado ProxMenux y herramientas", "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": "Herramientas opcionales pero habituales de Proxmox. Las rutas ausentes se registran en metadata/missing_paths.txt sin detener la copia." + "why": "Herramientas opcionales pero habituales de Proxmox. Las rutas ausentes se registran en metadata/missing_paths.txt sin detener el backup." }, { "category": "Binarios ProxMenux y root", "paths": "/usr/local/bin, /usr/local/sbin, /usr/local/share/proxmenux, /var/lib/proxmenux, /root (subdirs volátiles excluidos)", - "why": "Binarios instalados por ProxMenux y configuración por usuario bajo /root. Las rutas volátiles (.bash_history, .cache/, tmp/, .local/share/Trash/) quedan fuera de la copia. /var/lib/proxmenux guarda los trabajos de backup programados y el estado del host que mantiene ProxMenux; quedan fuera la preparación de una restauración, las copias de rollback y las marcas posteriores a la restauración, porque pertenecen al host que la ejecuta." + "why": "Binarios instalados por ProxMenux y configuración por usuario bajo /root. Las rutas volátiles (.bash_history, .cache/, tmp/, .local/share/Trash/) quedan fuera del backup. /var/lib/proxmenux guarda los trabajos de backup programados y el estado del host que mantiene ProxMenux; quedan fuera la preparación de una restauración, los backups de rollback y las marcas posteriores a la restauración, porque pertenecen al host que la ejecuta." }, { "category": "Estado ZFS (condicional)", @@ -76,18 +76,18 @@ } ], "customTitle": "Ampliar el perfil con rutas propias", - "customBody": "Además del perfil por defecto, ProxMenux ofrece dos maneras de incluir rutas adicionales en una copia. Se combinan sin conflicto y ambas se aplican tanto a copias interactivas como a trabajos programados.", + "customBody": "Además del perfil por defecto, ProxMenux ofrece dos maneras de incluir rutas adicionales en un backup. Se combinan sin conflicto y ambas se aplican tanto a backups interactivos como a trabajos programados.", "customExtrasTitle": "1. Extras persistentes (fichero por-host)", - "customExtrasBody": "Un fichero de texto en /usr/local/share/proxmenux/backup-extra-paths.txt guarda una lista de rutas absolutas que el usuario ha marcado como \"incluir siempre\" en este host. Cuando una copia se ejecuta en modo Default, ProxMenux añade automáticamente estas rutas al perfil por defecto sin preguntar. El fichero se edita desde la interfaz — no hay que tocarlo a mano — y persiste entre reinicios y actualizaciones. Cada línea es una ruta absoluta; se admiten comentarios con #.", + "customExtrasBody": "Un fichero de texto en /usr/local/share/proxmenux/backup-extra-paths.txt guarda una lista de rutas absolutas que el usuario ha marcado como \"incluir siempre\" en este host. Cuando un backup se ejecuta en modo Default, ProxMenux añade automáticamente estas rutas al perfil por defecto sin preguntar. El fichero se edita desde la interfaz — no hay que tocarlo a mano — y persiste entre reinicios y actualizaciones. Cada línea es una ruta absoluta; se admiten comentarios con #.", "customModeTitle": "2. Modo Custom (por ejecución)", - "customModeBody": "Al lanzar una copia en modo Custom, en lugar de aplicar el perfil por defecto directamente, se muestra un checklist con todas las rutas: las del perfil por defecto y las de extras persistentes (estas últimas premarcadas con [+]). El usuario marca o desmarca lo que quiera para esa ejecución concreta, y puede además pulsar Add custom path para introducir una ruta nueva — que queda registrada en el fichero de extras persistentes para futuras copias.", + "customModeBody": "Al lanzar un backup en modo Custom, en lugar de aplicar el perfil por defecto directamente, se muestra un checklist con todas las rutas: las del perfil por defecto y las de extras persistentes (estas últimas premarcadas con [+]). El usuario marca o desmarca lo que quiera para esa ejecución concreta, y puede además pulsar Add custom path para introducir una ruta nueva — que queda registrada en el fichero de extras persistentes para futuros backups.", "customMissingTitle": "Rutas ausentes en el origen", - "customMissingBody": "Cualquier ruta del perfil (por defecto o añadida) que no exista en el host de origen se registra en metadata/missing_paths.txt dentro del archivo. La copia no falla ni interrumpe — el usuario ve el resumen de rutas archivadas y rutas ausentes al terminar. En la práctica esto ocurre con las rutas de herramientas opcionales como /etc/wireguard o /etc/prometheus cuando esas herramientas no están instaladas." + "customMissingBody": "Cualquier ruta del perfil (por defecto o añadida) que no exista en el host de origen se registra en metadata/missing_paths.txt dentro del archivo. El backup no falla ni interrumpe — el usuario ve el resumen de rutas archivadas y rutas ausentes al terminar. En la práctica esto ocurre con las rutas de herramientas opcionales como /etc/wireguard o /etc/prometheus cuando esas herramientas no están instaladas." }, "manifest": { "heading": "El bloque manifiesto", - "intro": "manifest.json es un documento JSON estructurado que describe el host de origen en el momento de la copia. Se produce mediante seis colectores independientes orquestados por build_manifest.sh. Cada colector es de sólo lectura, produce un fragmento JSON bien definido y hace fallback a un valor vacío seguro si falla — el manifiesto sigue siendo utilizable aunque una sección quede incompleta.", - "orchestratorCaption": "Los seis colectores componen el manifiesto. Cada uno corre en su propio subproceso; un fallo en uno hace fallback al valor por defecto documentado y advierte, pero no aborta la copia.", + "intro": "manifest.json es un documento JSON estructurado que describe el host de origen en el momento del backup. Se produce mediante seis colectores independientes orquestados por build_manifest.sh. Cada colector es de sólo lectura, produce un fragmento JSON bien definido y hace fallback a un valor vacío seguro si falla — el manifiesto sigue siendo utilizable aunque una sección quede incompleta.", + "orchestratorCaption": "Los seis colectores componen el manifiesto. Cada uno corre en su propio subproceso; un fallo en uno hace fallback al valor por defecto documentado y advierte, pero no aborta el backup.", "collectorRows": [ { "collector": "collect_source_host.sh", @@ -117,7 +117,7 @@ { "collector": "collect_guests.sh", "produces": "vms_lxcs_at_backup", - "content": "Enumera VMs (qm list) y LXCs (pct list) presentes en el momento de la copia — VMID, nombre, estado actual. Sólo el inventario: los datos reales del invitado son responsabilidad de vzdump / PBS." + "content": "Enumera VMs (qm list) y LXCs (pct list) presentes en el momento del backup — VMID, nombre, estado actual. Sólo el inventario: los datos reales del invitado son responsabilidad de vzdump / PBS." } ], "schemaTitle": "Validación por esquema", diff --git a/web/messages/es/docs/backup-restore/index.json b/web/messages/es/docs/backup-restore/index.json index 81520dd6..dc1c3451 100644 --- a/web/messages/es/docs/backup-restore/index.json +++ b/web/messages/es/docs/backup-restore/index.json @@ -1,20 +1,20 @@ { "meta": { - "title": "ProxMenux Backup & Restore — Descripción general | Copia y restauración completa del host Proxmox VE", - "description": "ProxMenux Backup & Restore captura el estado completo de un host Proxmox — sistema de ficheros, manifiesto estructurado de configuración y paquetes/componentes instalados — y lo reproduce en el mismo host o en uno distinto. La copia y la restauración son autocontenidas: sin dependencias externas, y con soporte para restauraciones cross-kernel mediante un filtro direccional de subconjunto seguro y una hidratación kernel-agnóstica.", + "title": "ProxMenux Backup & Restore — Descripción general | Backup y restauración completa del host Proxmox VE", + "description": "ProxMenux Backup & Restore captura el estado completo de un host Proxmox — sistema de ficheros, manifiesto estructurado de configuración y paquetes/componentes instalados — y lo reproduce en el mismo host o en uno distinto. El backup y la restauración son autocontenidos: sin dependencias externas, y con soporte para restauraciones cross-kernel mediante un filtro direccional de subconjunto seguro y una hidratación kernel-agnóstica.", "ogTitle": "ProxMenux Backup & Restore — Descripción general", - "ogDescription": "Copia y restauración completa del host Proxmox VE con manifiesto estructurado, lista de paquetes y reinstaladores de componentes.", - "twitterTitle": "Copia de seguridad y restauración de ProxMenux | ProxMenux", - "twitterDescription": "Copia y restauración completa del host Proxmox VE con manifiesto estructurado, lista de paquetes y reinstaladores de componentes." + "ogDescription": "Backup y restauración completa del host Proxmox VE con manifiesto estructurado, lista de paquetes y reinstaladores de componentes.", + "twitterTitle": "ProxMenux Backup & Restore | ProxMenux", + "twitterDescription": "Backup y restauración completa del host Proxmox VE con manifiesto estructurado, lista de paquetes y reinstaladores de componentes." }, "header": { - "title": "Copias de seguridad y restauración", - "description": "Copia y restauración a nivel de host para Proxmox VE. Captura el sistema de ficheros, la configuración y los componentes instalados en un único archivo y reproduce el host sobre la misma instalación de Proxmox o sobre una distinta, sin dependencias externas.", - "section": "Copias de seguridad y restauración" + "title": "Backup & Restore", + "description": "Backup y restauración a nivel de host para Proxmox VE. Captura el sistema de ficheros, la configuración y los componentes instalados en un único archivo y reproduce el host sobre la misma instalación de Proxmox o sobre una distinta, sin dependencias externas.", + "section": "Backup & Restore" }, "intro": { "title": "Qué es, en un párrafo", - "body": "Una copia de ProxMenux recoge el estado completo de un host Proxmox: el sistema de archivos (los directorios pertinentes de /etc, /root y /var/lib/pve-cluster, además de las rutas personalizadas opcionales), un manifiesto estructurado (JSON con el hardware detectado, los parámetros del kernel, la configuración de red, el estado de ZFS, los usuarios y las entradas de cron) y un inventario de aplicaciones (los paquetes que APT marca como instalados manualmente y los componentes instalados por ProxMenux, con sus versiones exactas). Los tres destinos admitidos —archivo local, Proxmox Backup Server (recomendado) y Borg— reciben el mismo contenido autónomo. Cualquiera de ellos permite reconstruir el host de destino sin que el host de origen tenga que estar accesible durante la restauración." + "body": "Un backup de ProxMenux captura el estado completo de un host Proxmox: el sistema de ficheros (directorios relevantes bajo /etc, /root, /var/lib/pve-cluster, más rutas personalizadas opcionales), un manifiesto estructurado (JSON con el hardware detectado, los parámetros del kernel, la topología de red, el estado de ZFS, los usuarios y las entradas de cron) y un inventario de aplicaciones (todos los paquetes marcados como instalados manualmente por APT, más la lista de componentes instalados por ProxMenux con sus versiones exactas). Cualquiera de los tres destinos soportados — archivo local, Proxmox Backup Server (recomendado) o Borg — recibe el mismo contenido autocontenido, y cualquiera de ellos puede hidratar el host de destino sin depender de que el origen esté accesible en el momento de la restauración." }, "video": { "heading": "Vídeo demostración", @@ -24,39 +24,39 @@ }, "whatItIsNot": { "heading": "Qué no es", - "intro": "Esta sección trata de la copia y restauración del host: la instalación de Proxmox, no las aplicaciones y máquinas que se ejecutan sobre ella.", + "intro": "La sección cubre backup y restauración a nivel de host: la instalación de Proxmox en sí, no las cargas de trabajo que se ejecutan sobre ella.", "items": [ - "No es una herramienta de copia de VM/CT. Esta función no guarda los discos ni el estado de la RAM de los invitados; para eso está vzdump. Los archivos de configuración de los invitados (/etc/pve/nodes/<node>/qemu-server/*.conf y lxc/*.conf) sí se guardan. Tras restaurar, reaparece su inventario y los discos se pueden recuperar o volver a asociar a partir de una copia existente en PBS o en almacenamiento local.", - "No es una operación sobre todo el clúster. Cada nodo guarda su propia copia. La pertenencia al clúster se incluye en /etc/pve para poder volver a incorporar un nodo restaurado, pero recuperar todo el clúster requiere coordinar la restauración de sus nodos.", - "No es una imagen completa del disco. No se guardan los binarios del kernel, el initramfs ni la partición de arranque. Al restaurar, ProxMenux utiliza los archivos de arranque del host de destino, regenerados automáticamente con update-initramfs y la herramienta del gestor de arranque, e instala los controladores compatibles con el kernel que está ejecutando el destino." + "No es una herramienta de backup de VMs/CTs. Los discos de los invitados y su estado de RAM no se capturan en esta función; para eso está vzdump. Los ficheros de configuración de los invitados (/etc/pve/nodes/<node>/qemu-server/*.conf y lxc/*.conf) sí se capturan, de modo que tras la restauración el inventario de invitados reaparece y sus discos pueden re-adjuntarse desde un backup existente de PBS o local.", + "No es una operación a nivel de clúster. Cada nodo se copia a sí mismo. La pertenencia al clúster se captura como parte de /etc/pve para que un nodo restaurado pueda re-incorporarse al clúster, pero restaurar un clúster completo requiere coordinación por nodo.", + "No es una imagen completa del disco. Los binarios del kernel, el initramfs y la partición de arranque no se capturan. En la restauración, ProxMenux utiliza los artefactos de arranque propios del host de destino (regenerados automáticamente por update-initramfs y la herramienta de bootloader) e instala los controladores adecuados contra el kernel que el destino tenga en ejecución." ] }, "threePillars": { - "heading": "Los tres pilares de una copia", + "heading": "Los tres pilares de un backup", "intro": "Un archivo de ProxMenux se estructura en torno a tres cargas útiles autocontenidas. La restauración utiliza las tres en conjunto para reproducir el host de origen sobre un destino que puede no tener siquiera el mismo kernel instalado.", - "diagramCaption": "Cada copia contiene los mismos tres bloques con independencia del destino. La restauración los consume todos: rootfs para colocar los ficheros, manifiesto para detectar drift y diferencias cross-kernel, e inventario de aplicaciones para reinstalar paquetes y componentes contra el kernel del propio destino.", - "pillar1Label": "Sistema de archivos", + "diagramCaption": "Cada backup contiene los mismos tres bloques con independencia del destino. La restauración los consume todos: rootfs para colocar los ficheros, manifiesto para detectar drift y diferencias cross-kernel, e inventario de aplicaciones para reinstalar paquetes y componentes contra el kernel del propio destino.", + "pillar1Label": "Sistema de ficheros", "pillar1Detail": "rootfs/\n(rsync de /etc,\n/etc/systemd/network,\n/root, más snapshot\nsqlite3 de\n/var/lib/pve-cluster,\n+ rutas opcionales)", "pillar2Label": "Manifiesto", - "pillar2Detail": "manifest.json\n(hardware, parámetros\ndel kernel, red,\nZFS, usuarios, cron,\npools ZFS, almacenamiento)", + "pillar2Detail": "manifest.json\n(hardware, params\ndel kernel, red,\nZFS, usuarios, cron,\npools ZFS, storage)", "pillar3Label": "Aplicaciones", - "pillar3Detail": "packages.manual.list\n+ components_status.json\n(paquetes APT manuales + instaladores\nProxMenux con versiones)" + "pillar3Detail": "packages.manual.list\n+ components_status.json\n(APT manual + instaladores\nProxMenux con versiones)" }, "restoreIsUniversal": { "heading": "La restauración reproduce el host de origen, no el archivo", - "body": "Restaurar una copia de seguridad no consiste solamente en extraer el sistema de ficheros. El flujo de restauración lee el manifiesto para detectar diferencias entre origen y destino (variaciones de hardware, renombrado de NICs, versión de kernel, identidad de la pool ZFS), reproduce el sistema de ficheros y lanza el instalador correspondiente a cada servicio que estuviera instalado en el origen (controlador NVIDIA, Coral TPU, herramientas AMD GPU, herramientas Intel GPU). Cada instalador se ejecuta contra el kernel actual del destino, por lo que el host restaurado no depende de que el kernel del origen esté presente. Cuando el kernel del destino es más reciente que el de la copia, una pasada de hidratación kernel-agnóstica funde la configuración propia del usuario (tokens IOMMU, IDs de dispositivos VFIO, quirks personalizadas, claves de GRUB) sobre la configuración de arranque fresca del destino, sin copiar verbatim los ficheros ligados al kernel." + "body": "Restaurar un backup no consiste solamente en extraer el sistema de ficheros. El flujo de restauración lee el manifiesto para detectar diferencias entre origen y destino (variaciones de hardware, renombrado de NICs, versión de kernel, identidad de la pool ZFS), reproduce el sistema de ficheros y lanza el instalador correspondiente a cada servicio que estuviera instalado en el origen (controlador NVIDIA, Coral TPU, herramientas AMD GPU, herramientas Intel GPU). Cada instalador se ejecuta contra el kernel actual del destino, por lo que el host restaurado no depende de que el kernel del origen esté presente. Cuando el kernel del destino es más reciente que el del backup, una pasada de hidratación kernel-agnóstica funde la configuración propia del usuario (tokens IOMMU, IDs de dispositivos VFIO, quirks personalizadas, claves de GRUB) sobre la configuración de arranque fresca del destino, sin copiar verbatim los ficheros ligados al kernel." }, "twoInterfaces": { "heading": "Dos interfaces, un único backend", - "intro": "Cada paso del flujo de copia y restauración está disponible desde dos puntos de entrada. Ambos invocan la misma librería de shell, producen archivos idénticos y leen el mismo registro de trabajos.", + "intro": "Cada paso del flujo de backup y restauración está disponible desde dos puntos de entrada. Ambos invocan la misma librería de shell, producen archivos idénticos y leen el mismo registro de trabajos.", "cliLabel": "ProxMenux Scripts (TUI)", "cliDetail": "menu → Utilities →\nHost Backup / Restore\n\nFlujo basado en diálogos,\namigable por SSH, admite\nejecución desatendida\ndesde scripts.", - "webLabel": "ProxMenux Monitor (UI Web)", + "webLabel": "ProxMenux Monitor (Web UI)", "webDetail": "Pestaña Backups en la\ninterfaz Web del Monitor.\n\nRestauración con un clic,\nlog en vivo, integrado con\nlas notificaciones y con\nel visor de rollback." }, "whereNext": { "heading": "A dónde seguir desde aquí", - "intro": "Cada subsección posterior desarrolla en detalle un aspecto del flujo. Se recomienda empezar por Cómo funciona para entender qué contiene el archivo y por qué. Consultar Destinos para configurar el destino de la copia. Leer Restauración y Restauración cross-kernel para el lado de recuperación.", + "intro": "Cada subsección posterior desarrolla en detalle un aspecto del flujo. Se recomienda empezar por Cómo funciona para entender qué contiene el archivo y por qué. Consultar Destinos para configurar el destino del backup. Leer Restauración y Restauración cross-kernel para el lado de recuperación.", "items": [ { "label": "Cómo funciona", @@ -69,9 +69,9 @@ "tail": " — comparativa entre archivo local, Proxmox Backup Server (recomendado) y Borg, y cómo configurar cada uno." }, { - "label": "Crear copias", + "label": "Crear backups", "href": "/docs/backup-restore/creating-backups", - "tail": " — copias puntuales, perfil de rutas por defecto, adición de rutas personalizadas, cifrado en PBS." + "tail": " — backups puntuales, perfil de rutas por defecto, adición de rutas personalizadas, cifrado en PBS." }, { "label": "Trabajos programados", @@ -86,7 +86,7 @@ { "label": "Restauración cross-kernel", "href": "/docs/backup-restore/cross-kernel", - "tail": " — comportamiento direccional cuando el kernel del destino difiere del de la copia, el filtro de subconjunto seguro y las cuatro fases de hidratación." + "tail": " — comportamiento direccional cuando el kernel del destino difiere del del backup, el filtro de subconjunto seguro y las cuatro fases de hidratación." } ] } diff --git a/web/messages/es/docs/backup-restore/restoring.json b/web/messages/es/docs/backup-restore/restoring.json index 6809e382..1d5337a7 100644 --- a/web/messages/es/docs/backup-restore/restoring.json +++ b/web/messages/es/docs/backup-restore/restoring.json @@ -1,28 +1,28 @@ { "meta": { - "title": "Restaurar una copia — flujos Completo y Personalizado | ProxMenux", - "description": "El flujo completo de restauración. Documenta las tres acciones disponibles sobre cualquier copia (ver, descargar, restaurar), la comprobación de compatibilidad y sus resultados, los modos Completo y Personalizado, la clasificación de rutas que decide qué se aplica en vivo y qué espera al siguiente arranque, el dispatcher de arranque y la pasada de reinstalación post-arranque de componentes.", + "title": "Restaurar un backup — flujos Completo y Personalizado | ProxMenux", + "description": "El flujo completo de restauración. Documenta las tres acciones disponibles sobre cualquier backup (ver, descargar, restaurar), la comprobación de compatibilidad y sus resultados, los modos Completo y Personalizado, la clasificación de rutas que decide qué se aplica en vivo y qué espera al siguiente arranque, el dispatcher de arranque y la pasada de reinstalación post-arranque de componentes.", "ogTitle": "ProxMenux Backup — restaurar", "ogDescription": "Flujos de restauración completo y personalizado con la comprobación de compatibilidad, la clasificación de rutas, el dispatcher post-arranque y la reinstalación de componentes.", - "twitterTitle": "Restaurar una copia | ProxMenux", - "twitterDescription": "Cómo se convierte una copia de host de ProxMenux en un host Proxmox operativo." + "twitterTitle": "Restaurar un backup | ProxMenux", + "twitterDescription": "Cómo se convierte un backup de host de ProxMenux en un host Proxmox operativo." }, "header": { - "title": "Restaurar una copia", - "description": "El flujo completo de restauración: desde elegir una copia hasta un host operativo. Documenta la comprobación de compatibilidad, los dos modos de restauración, el dispatcher post-arranque, la pasada de reinstalación de componentes, y los mecanismos que hacen predecibles las restauraciones cross-host y cross-kernel.", - "section": "Copias de seguridad y restauración" + "title": "Restaurar un backup", + "description": "El flujo completo de restauración: desde elegir un backup hasta un host operativo. Documenta la comprobación de compatibilidad, los dos modos de restauración, el dispatcher post-arranque, la pasada de reinstalación de componentes, y los mecanismos que hacen predecibles las restauraciones cross-host y cross-kernel.", + "section": "Backup & Restore" }, "intro": { "title": "La restauración reproduce el origen, no sólo los ficheros", - "body": "Restaurar una copia de ProxMenux requiere más que extraer archivos. Antes de aplicar cambios, se consulta el manifiesto para detectar diferencias entre origen y destino, se filtran rutas que podrían impedir el arranque y se adapta la configuración del usuario que no puede copiarse literalmente. Tras el reinicio necesario, se intenta reinstalar los componentes compatibles registrados (controlador NVIDIA, Coral TPU y herramientas GPU) para el kernel que ejecuta el destino. Una única copia dirige la comprobación de compatibilidad, la clasificación de rutas y los procesos de arranque y posteriores. Revisa los resultados de cada componente y los logs para confirmar el resultado." + "body": "Restaurar un backup de ProxMenux requiere más que extraer archivos. Antes de aplicar cambios, se consulta el manifiesto para detectar diferencias entre origen y destino, se filtran rutas que podrían impedir el arranque y se adapta la configuración del usuario que no puede copiarse literalmente. Tras el reinicio necesario, se intenta reinstalar los componentes compatibles registrados (controlador NVIDIA, Coral TPU y herramientas GPU) para el kernel que ejecuta el destino. Un único backup dirige la comprobación de compatibilidad, la clasificación de rutas y los procesos de arranque y posteriores. Revisa los resultados de cada componente y los logs para confirmar el resultado." }, "threeActions": { - "heading": "Tres acciones sobre una copia", - "intro": "Seleccionar una copia de la lista abre un menú con tres acciones.", + "heading": "Tres acciones sobre un backup", + "intro": "Seleccionar un backup de la lista abre un menú con tres acciones.", "actionRows": [ { "action": "Ver", - "detail": "Abre una vista de sólo lectura del archivo: contenido de manifest.json (hostname de origen, versión de PVE, kernel, hardware, componentes instalados), la lista de rutas dentro de rootfs/, y un diff de qué cambiaría en el host actual si se aplicara la copia." + "detail": "Abre una vista de sólo lectura del archivo: contenido de manifest.json (hostname de origen, versión de PVE, kernel, hardware, componentes instalados), la lista de rutas dentro de rootfs/, y un diff de qué cambiaría en el host actual si se aplicara el backup." }, { "action": "Descargar", @@ -40,7 +40,7 @@ "outputRows": [ { "output": "Flag de dirección", - "detail": "HB_COMPAT_KERNEL_DIRECTION — uno de same, bk_newer o bk_older. Compara la versión mayor del kernel de la copia contra la del destino. Dirige el filtro cross-kernel de subconjunto seguro (sólo dispara en bk_older) y la pasada de hidratación documentada en la página cross-kernel." + "detail": "HB_COMPAT_KERNEL_DIRECTION — uno de same, bk_newer o bk_older. Compara la versión mayor del kernel del backup contra la del destino. Dirige el filtro cross-kernel de subconjunto seguro (sólo dispara en bk_older) y la pasada de hidratación documentada en la página cross-kernel." }, { "output": "Lista de rutas a saltar", @@ -52,7 +52,7 @@ }, { "output": "Plan de rollback", - "detail": "Lo calcula compute_rollback_plan.sh. Lista las VMs, LXCs y componentes presentes en el destino pero ausentes de la copia. La confirmación permite optar por eliminar los invitados adicionales antes del reinicio. Los componentes deben desinstalarse manualmente y la eliminación de invitados puede fallar; no garantiza que el destino coincida exactamente con la copia." + "detail": "Lo calcula compute_rollback_plan.sh. Lista las VMs, LXCs y componentes presentes en el destino pero ausentes del backup. La confirmación permite optar por eliminar los invitados adicionales antes del reinicio. Los componentes deben desinstalarse manualmente y la eliminación de invitados puede fallar; no garantiza que el destino coincida exactamente con el backup." } ], "reportBody": "La comprobación también emite un informe estructurado (HB_COMPAT_RESULTS) categorizado como PASS / INFO / WARN / FAIL. Las entradas WARN y FAIL aparecen en el panel previo a la restauración; la restauración se niega a continuar sólo cuando hay un FAIL que el usuario no puede resolver pulsando Continuar." @@ -77,7 +77,7 @@ "rows": [ { "class": "hot", - "detail": "Rutas que se aplican de inmediato sobre el sistema en ejecución. El servicio que las consume detecta el cambio por sí mismo o al siguiente reload, sin necesidad de reiniciar. Son la mayoría del contenido de una copia: /etc/ssh, /etc/apt, /etc/cron.*, /root, /usr/local/bin, ficheros de configuración de servicios generales, etc." + "detail": "Rutas que se aplican de inmediato sobre el sistema en ejecución. El servicio que las consume detecta el cambio por sí mismo o al siguiente reload, sin necesidad de reiniciar. Son la mayoría del contenido de un backup: /etc/ssh, /etc/apt, /etc/cron.*, /root, /usr/local/bin, ficheros de configuración de servicios generales, etc." }, { "class": "reboot", @@ -92,7 +92,7 @@ "fullFlow": { "heading": "El flujo completo de restauración", "intro": "El pipeline completo desde la selección del archivo hasta un host restaurado y operativo. Cada etapa alimenta a la siguiente; el estado escrito por etapas anteriores lo consumen las posteriores.", - "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archive → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · hardware drift → RS_SKIP_PATHS │\n │ · kernel direction → same / bk_newer / bk_older │\n │ · NIC remap plan │\n │ · hydration plan (bk_older only) │\n │ · rollback plan │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Confirmation dialog │\n │ Shows: hot count, pending count, drift, hydration, │\n │ NIC remap, cross-kernel note, reinstalls preview │\n └──────────────────────────────┬──────────────────────────┘\n │ (accepted)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Apply hot paths → LIVE │\n │ _rs_apply rsyncs each hot path │\n │ from staging_root/rootfs to / │\n │ (skips paths in RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (deferred paths) │\n │ Enable proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Imports non-root ZFS pools whose disks are all │\n │ present; retries with -f on foreign hostid; │\n │ skips with a warning when disks are missing. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → cascade-safe filter │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REBOOT │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (on early boot) │\n │ Reads plan.env │\n │ Applies apply-on-boot.list (filtered) │\n │ Installs the postboot systemd unit │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutes) │\n │ Runs after pve-cluster is up │\n │ · Applies /etc/pve entries to pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Boot sanity check │\n │ · Notification: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" + "diagram": "┌─────────────────────────────────────────────────────────────────┐\n│ Archivo → staging_root/ │\n│ manifest.json metadata/ rootfs/ │\n└──────────────────────────────┬──────────────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 1. hb_compat_check │\n │ · drift de hardware → RS_SKIP_PATHS │\n │ · dirección kernel → same / bk_newer / bk_older │\n │ · plan de remapeo NIC │\n │ · plan de hidratación (sólo bk_older) │\n │ · plan de rollback │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 2. Diálogo de confirmación │\n │ Muestra: rutas hot, rutas pending, drift, │\n │ hidratación, remapeo NIC, nota cross-kernel, │\n │ preview de reinstalaciones │\n └──────────────────────────────┬──────────────────────────┘\n │ (aceptado)\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 3. Aplicar rutas hot → EN VIVO │\n │ _rs_apply rsyncea cada ruta hot │\n │ desde staging_root/rootfs a / │\n │ (salta rutas en RS_SKIP_PATHS) │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4. _rs_prepare_pending_restore │\n │ /var/lib/proxmenux/pending-restore/ │\n │ ├── apply-on-boot.list │\n │ ├── plan.env │\n │ ├── rs-skip-paths.txt │\n │ └── rootfs/ (rutas diferidas) │\n │ Habilita proxmenux-restore-onboot.service │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 4b. _rs_import_data_pools │\n │ Importa pools ZFS no-raíz cuyos discos │\n │ están todos presentes; retry con -f en │\n │ foreign hostid; skip con warning si faltan discos. │\n │ Log: /var/log/proxmenux/restore-datapools-*.log │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 5. _rs_run_complete_extras │\n │ packages.manual.list │\n │ → filtro cascade-safe │\n │ → apt-get install │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 6. REINICIO │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 7. apply_pending_restore.sh (arranque temprano) │\n │ Lee plan.env │\n │ Aplica apply-on-boot.list (filtrado) │\n │ Instala la unit systemd de postboot │\n └──────────────────────────────┬──────────────────────────┘\n │\n ▼\n ┌─────────────────────────────────────────────────────────┐\n │ 8. apply_cluster_postboot.sh (~10 minutos) │\n │ Corre cuando pve-cluster está arriba │\n │ · Aplica entradas de /etc/pve a pmxcfs │\n │ · update-initramfs -u -k all │\n │ · update-grub / proxmox-boot-tool refresh │\n │ · component --auto-reinstall (nvidia, coral, ...) │\n │ · Comprobación de sanidad de arranque │\n │ · Notificación: \"Host restore finished\" │\n └─────────────────────────────────────────────────────────┘" }, "pendingMachinery": { "heading": "La maquinaria del pending-restore", @@ -134,7 +134,7 @@ "detail": "Lee el components_status.json restaurado y recorre los instaladores compatibles registrados (nvidia_driver, coral_driver, amdgpu_top e intel_gpu_tools). Cada uno se ejecuta en modo --auto-reinstall, lee su estado guardado y reinstala para el entorno del destino, recompilando módulos cuando corresponde. Se difiere hasta después del reinicio para utilizar el kernel que ejecute entonces el destino. Los fallos individuales se registran y no detienen el siguiente componente." }, { - "task": "Comprobación del arranque", + "task": "Comprobación de sanidad del arranque", "detail": "Antes de emitir la notificación de finalización, verifica que proxmox-boot-tool status muestra un ESP configurado, que cada /boot/vmlinuz-* tiene su directorio /lib/modules/<ver> correspondiente, y que /vmlinuz resuelve. Cualquier inconsistencia aparece en la notificación en lugar de quedar oculta." }, { @@ -173,7 +173,7 @@ }, { "name": "Tail del log", - "detail": "Las últimas 600 líneas de proxmenux-cluster-postboot-<ts>.log, con un filtro Solo incidencias que deja solo las líneas con error, warning, failed, ✗ o traceback." + "detail": "Las últimas 600 líneas de proxmenux-cluster-postboot-<ts>.log, con un filtro Issues only que deja solo las líneas con error, warning, failed, ✗ o traceback." } ], "dismissBody": "Cuando la restauración termina como complete o failed, el botón Dismiss colapsa la tarjeta. El fichero de estado se conserva y el botón History la reabre junto con cualquier restauración anterior (se archivan las últimas 20 en /var/lib/proxmenux/restore-history/).", @@ -218,12 +218,12 @@ "detail": "Descarga la versión registrada del driver, compila los módulos DKMS contra el kernel actual, aplica el parche de ProxMenux si el origen lo tenía. La tarea individual más larga." }, { - "stage": "Reinstalación de Coral y otros componentes", + "stage": "Reinstalación de otros componentes", "time": "3–5 min", "detail": "Compilaciones DKMS de Coral, apt install para intel-gpu-tools, descarga + install del .deb para amdgpu_top." }, { - "stage": "Comprobación del arranque y notificación", + "stage": "Comprobación de sanidad + notificación", "time": "~2 s", "detail": "Barata. El usuario se entera de que la ejecución ha terminado en el momento en que dispara la notificación." } @@ -232,7 +232,7 @@ }, "destructiveRollback": { "heading": "El rollback destructivo opcional", - "body": "La restauración es aditiva por defecto: se conservan las VMs, LXCs y componentes adicionales del destino. Si hay diferencias, la confirmación ofrece ¿Ejecutar rollback destructivo?, con No por defecto. Aceptar llama a _rs_execute_rollback antes del reinicio para intentar eliminar las VMs y LXCs adicionales indicados. Los componentes se señalan para desinstalación manual porque la automática no está implementada. Los fallos al eliminar invitados se registran y el proceso continúa; no se garantiza una coincidencia exacta con la copia. Revisa nombres y VMID/CTID antes de elegir esta opción destructiva." + "body": "La restauración es aditiva por defecto: se conservan las VMs, LXCs y componentes adicionales del destino. Si hay diferencias, la confirmación ofrece ¿Ejecutar el rollback destructivo?, con No por defecto. Aceptar llama a _rs_execute_rollback antes del reinicio para intentar eliminar las VMs y LXCs adicionales indicados. Los componentes se señalan para desinstalación manual porque la automática no está implementada. Los fallos al eliminar invitados se registran y el proceso continúa; no se garantiza una coincidencia exacta con el backup. Revisa nombres y VMID/CTID antes de elegir esta opción destructiva." }, "logs": { "heading": "Dónde viven los logs", @@ -265,7 +265,7 @@ { "label": "Restauración cross-kernel", "href": "/docs/backup-restore/cross-kernel", - "tail": " — el filtro direccional de subconjunto seguro y la pasada de hidratación que se invocan cuando el kernel del destino difiere del de la copia." + "tail": " — el filtro direccional de subconjunto seguro y la pasada de hidratación que se invocan cuando el kernel del destino difiere del del backup." }, { "label": "Cómo funciona", diff --git a/web/messages/es/docs/backup-restore/scheduled-jobs.json b/web/messages/es/docs/backup-restore/scheduled-jobs.json index ce6cd7d4..692d60dc 100644 --- a/web/messages/es/docs/backup-restore/scheduled-jobs.json +++ b/web/messages/es/docs/backup-restore/scheduled-jobs.json @@ -1,16 +1,16 @@ { "meta": { "title": "Trabajos programados — timers, modo adjunto, retención | ProxMenux", - "description": "Trabajos de copia de host programados en ProxMenux. Dos modos de creación (timer systemd propio o adjuntarse a un trabajo vzdump de PVE existente), valores de retención aplicados por trabajo vía proxmox-backup-client/borg/local prune, layout de almacenamiento bajo /var/lib/proxmenux/backup-jobs, y el script runner que produce archivos idénticos al flujo interactivo.", + "description": "Trabajos de backup de host programados en ProxMenux. Dos modos de creación (timer systemd propio o adjuntarse a un trabajo vzdump de PVE existente), valores de retención aplicados por trabajo vía proxmox-backup-client/borg/local prune, layout de almacenamiento bajo /var/lib/proxmenux/backup-jobs, y el script runner que produce archivos idénticos al flujo interactivo.", "ogTitle": "ProxMenux Backup — trabajos programados", - "ogDescription": "Copias de host desatendidas programadas con modo adjunto, retención, y los mismos tres destinos que el flujo interactivo.", + "ogDescription": "Backups de host desatendidos programados con modo adjunto, retención, y los mismos tres destinos que el flujo interactivo.", "twitterTitle": "Trabajos programados | ProxMenux", - "twitterDescription": "Trabajos de copia de host desatendidos con modo adjunto y retención." + "twitterDescription": "Trabajos de backup de host desatendidos con modo adjunto y retención." }, "header": { "title": "Trabajos programados", - "description": "Trabajos de copia de host desatendidos. Dos modelos de creación: un trabajo nuevo e independiente con su propio horario, o un trabajo adjuntado a una tarea vzdump de PVE existente que hereda el horario y la retención de esa tarea. Ambos producen archivos idénticos al flujo interactivo.", - "section": "Copias de seguridad y restauración" + "description": "Trabajos de backup de host desatendidos. Dos modelos de creación: un trabajo nuevo e independiente con su propio horario, o un trabajo adjuntado a una tarea vzdump de PVE existente que hereda el horario y la retención de esa tarea. Ambos producen archivos idénticos al flujo interactivo.", + "section": "Backup & Restore" }, "intro": { "title": "Los dos modelos de trabajo programado", @@ -22,11 +22,11 @@ }, "attachBadge": { "title": "Modo adjunto — recomendado cuando ya existe una tarea vzdump de PVE", - "body": "Si ya existe una tarea vzdump de PVE para las VM y los LXC de este nodo, adjuntar la copia del host hace que se ejecute después de la copia de los invitados, en el mismo ciclo de copia. Al restaurar, las configuraciones de los invitados proceden de la copia del host (bajo /etc/pve) y sus discos de las copias vzdump de ese ciclo. Esto facilita coordinar la recuperación de todo el nodo, pero no es una instantánea atómica: los cambios durante el ciclo pueden dejar diferencias entre la configuración del host y el estado de los discos de los invitados." + "body": "Si ya existe una tarea vzdump de PVE para las VM y los LXC de este nodo, adjuntar el backup del host hace que se ejecute después del backup de los invitados, en el mismo ciclo de backup. Al restaurar, las configuraciones de los invitados proceden del backup del host (bajo /etc/pve) y sus discos de los backups vzdump de ese ciclo. Esto facilita coordinar la recuperación de todo el nodo, pero no es un snapshot atómico: los cambios durante el ciclo pueden dejar diferencias entre la configuración del host y el estado de los discos de los invitados." }, "frequencyBadge": { "title": "Frecuencia recomendada", - "body": "Para garantizar la máxima compatibilidad entre la copia y su posterior restauración se recomienda hacer copias de seguridad del host con frecuencia. Cuanto más reciente sea la copia respecto al estado actual del host, menor será la desviación de configuración, paquetes y componentes que la restauración tendrá que reconciliar." + "body": "Para garantizar la máxima compatibilidad entre el backup y su posterior restauración se recomienda hacer backups del host con frecuencia. Cuanto más reciente sea el backup respecto al estado actual del host, menor será la desviación de configuración, paquetes y componentes que la restauración tendrá que reconciliar." }, "modes": { "heading": "Los dos modos", @@ -35,7 +35,7 @@ "mode": "Nuevo trabajo programado", "backends": "Local, PBS, Borg", "schedule": "Expresión OnCalendar propia (sintaxis de calendario systemd — por ejemplo daily, Mon..Fri 03:00).", - "retention": "Se pregunta por separado: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. La aplica el runner tras cada copia exitosa." + "retention": "Se pregunta por separado: keep-last, keep-hourly, keep-daily, keep-weekly, keep-monthly, keep-yearly. La aplica el runner tras cada backup exitoso." }, { "mode": "Adjuntar a un trabajo vzdump de PVE", @@ -47,7 +47,7 @@ }, "attachDetail": { "heading": "Cómo funciona el modo adjunto", - "intro": "PVE guarda las tareas vzdump en /etc/pve/jobs.cfg: una sección por tarea, con el almacenamiento de las copias de VM y LXC. El modo adjunto requiere un backend compatible con ProxMenux (Local o PBS). La copia del host se ejecuta desde el hook job-end cuando termina la tarea de copia de los invitados.", + "intro": "PVE guarda las tareas vzdump en /etc/pve/jobs.cfg: una sección por tarea, con el almacenamiento de los backups de VM y LXC. El modo adjunto requiere un backend compatible con ProxMenux (Local o PBS). El backup del host se ejecuta desde el hook job-end cuando termina la tarea de backup de los invitados.", "steps": [ { "step": "1", @@ -66,7 +66,7 @@ "detail": "El archivo aterriza en el mismo storage donde los dumps de vzdump acaban de escribirse: path/dump/ para Local, o el repositorio PBS configurado en la entrada de storage de PVE." } ], - "outroBody": "El modo adjunto no tiene temporizador propio. Desactivar o eliminar la tarea padre seleccionada detiene ese disparador, pero otra tarea vzdump con el mismo almacenamiento aún puede activar la copia del host. Para impedirlo, desactiva o elimina el propio trabajo de ProxMenux. Al desactivarlo, su entrada sigue en disco para poder reactivarla o volver a adjuntarla." + "outroBody": "El modo adjunto no tiene temporizador propio. Desactivar o eliminar la tarea padre seleccionada detiene ese disparador, pero otra tarea vzdump con el mismo almacenamiento aún puede activar el backup del host. Para impedirlo, desactiva o elimina el propio trabajo de ProxMenux. Al desactivarlo, su entrada sigue en disco para poder reactivarla o volver a adjuntarla." }, "storageLayout": { "heading": "Ficheros que componen un trabajo", @@ -85,7 +85,7 @@ "content": "Sólo modo Nuevo. El service invoca run_scheduled_backup.sh JOB_ID. El timer lo programa con Persistent=true (los disparos perdidos se ejecutan al siguiente arranque) y un pequeño RandomizedDelaySec=120 para repartir carga cuando varios trabajos comparten la misma expresión OnCalendar." }, { - "path": "/etc/vzdump.conf script-hook", + "path": "script-hook de /etc/vzdump.conf", "content": "Sólo modo adjunto. Lo instala una vez hb_install_vzdump_hook; casa el PVE_STORAGE de cada trabajo adjuntado contra el $STOREID que PVE pasa al script-hook." } ] @@ -94,9 +94,9 @@ "heading": "Qué hace un trabajo cuando se dispara", "intro": "Cada trabajo — sea del modelo nuevo o adjunto — ejecuta la misma secuencia de tres pasos:", "steps": [ - "Preparar la copia. Lee la configuración del trabajo (destino, perfil, rutas) y ensambla el árbol de la copia siguiendo exactamente el mismo procedimiento que el flujo interactivo. El resultado es el mismo archivo que produciría una copia manual con esos ajustes.", - "Escribir en el destino. Sube o escribe la copia al destino configurado — un archivo local .tar.zst, un backup PBS o un archivo Borg — usando exactamente las mismas herramientas y credenciales que utilizaría una copia manual al mismo destino.", - "Aplicar retención. Elimina las copias antiguas del destino conservando los valores keep-last / keep-daily / keep-weekly configurados en el trabajo. La poda la realiza el propio destino: PBS mantiene la cuenta en su lado, Borg ejecuta borg prune, y en Local ProxMenux borra los archivos que quedan fuera del keep-last." + "Preparar el backup. Lee la configuración del trabajo (destino, perfil, rutas) y ensambla el árbol del backup siguiendo exactamente el mismo procedimiento que el flujo interactivo. El resultado es el mismo archivo que produciría un backup manual con esos ajustes.", + "Escribir en el destino. Sube o escribe el backup al destino configurado — un archivo local .tar.zst, un backup PBS o un archivo Borg — usando exactamente las mismas herramientas y credenciales que utilizaría un backup manual al mismo destino.", + "Aplicar retención. Elimina los backups antiguos del destino conservando los valores keep-last / keep-daily / keep-weekly configurados en el trabajo. La poda la realiza el propio destino: PBS mantiene la cuenta en su lado, Borg ejecuta borg prune, y en Local ProxMenux borra los archivos que quedan fuera del keep-last." ] }, "management": { @@ -104,36 +104,36 @@ "intro": "El menú del scheduler (TUI de Scripts) y la pestaña Backups del Monitor exponen las mismas acciones sobre cualquier trabajo.", "rows": [ { - "action": "Ejecutar ahora", + "action": "Run now", "detail": "Invoca el runner de inmediato, saltándose el timer / hook de vzdump. Útil para verificar una configuración de trabajo sin esperar al siguiente disparo programado." }, { - "action": "Activar / Desactivar", + "action": "Enable / Disable", "detail": "Modo Nuevo: systemctl enable/disable --now sobre el timer. Modo adjunto: cambia el flag ENABLED en el env del trabajo — el script-hook lo respeta en el siguiente disparo de PVE." }, { - "action": "Editar", + "action": "Edit", "detail": "Reabre los prompts de destino, horario, perfil y retención y reescribe los ficheros del trabajo. Preserva el ID del trabajo." }, { - "action": "Eliminar", + "action": "Delete", "detail": "Elimina el env del trabajo, el fichero de rutas, el timer + service systemd (modo Nuevo) y desactiva el binding del hook (modo adjunto). No toca los archivos ya presentes en el destino." }, { - "action": "Ver log", + "action": "View log", "detail": "Muestra en streaming /var/log/proxmenux/backup-jobs/JOB_ID-YYYYMMDD_HHMMSS.log — un fichero de log por ejecución. El runner también emite una línea de estado compacta a journald bajo el service systemd." } ] }, "notifications": { "heading": "Notificaciones", - "body": "Cada ejecución programada dispara los mismos eventos hb_notify_lifecycle que el flujo interactivo (start, complete, fail). Si hay canales de notificación configurados en el Monitor, los trabajos desatendidos exponen sus resultados igual que las copias manuales — un usuario no necesita revisar el log para saber si un trabajo tuvo éxito." + "body": "Cada ejecución programada dispara los mismos eventos hb_notify_lifecycle que el flujo interactivo (start, complete, fail). Si hay canales de notificación configurados en el Monitor, los trabajos desatendidos exponen sus resultados igual que los backups manuales — un usuario no necesita revisar el log para saber si un trabajo tuvo éxito." }, "whereNext": { "heading": "A dónde seguir", "items": [ { - "label": "Crear copias", + "label": "Crear backups", "href": "/docs/backup-restore/creating-backups", "tail": " — el flujo interactivo que comparte backend con el scheduler." }, From 85bea617d6e80ebf4ce2d5aad1dcdf79a34146ed Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:52:33 +0200 Subject: [PATCH 65/73] Keep Spanish post-install docs aligned with the menu and the glossary - Menu paths use the names of the Spanish menu - backup, snapshot and usuario follow the glossary --- web/messages/es/docs/post-install/customizable.json | 2 +- web/messages/es/docs/post-install/index.json | 6 +++--- web/messages/es/docs/post-install/performance.json | 4 ++-- web/messages/es/docs/post-install/storage.json | 4 ++-- web/messages/es/docs/post-install/uninstall.json | 2 +- web/messages/es/docs/post-install/updates.json | 2 +- web/messages/es/docs/post-install/virtualization.json | 8 ++++---- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/web/messages/es/docs/post-install/customizable.json b/web/messages/es/docs/post-install/customizable.json index 6139064a..8db627be 100644 --- a/web/messages/es/docs/post-install/customizable.json +++ b/web/messages/es/docs/post-install/customizable.json @@ -16,7 +16,7 @@ }, "compare": { "heading": "Comparación con el Automatizado", - "body": "Personalizable incluye todo el script Automatizado. Cubre las mismas 14 optimizaciones básicas y una larga lista de opciones que Automatizado omite deliberadamente, útiles para hardware específico (correcciones AMD), alojamiento específico (OVH RTM) o cargas concretas (IOMMU/VFIO, repositorio Ceph, alta disponibilidad, Fastfetch, Figurine, ajuste del ARC de ZFS, pigz, instantáneas automáticas ZFS, límites de velocidad vzdump, Open vSwitch, TCP BBR…)." + "body": "Personalizable incluye todo el script Automatizado. Cubre las mismas 14 optimizaciones básicas y una larga lista de opciones que Automatizado omite deliberadamente, útiles para hardware específico (correcciones AMD), alojamiento específico (OVH RTM) o cargas concretas (IOMMU/VFIO, repositorio Ceph, alta disponibilidad, Fastfetch, Figurine, ajuste del ARC de ZFS, pigz, snapshots automáticos de ZFS, límites de velocidad vzdump, Open vSwitch, TCP BBR…)." }, "categoriesSection": { "heading": "Las 10 categorías", diff --git a/web/messages/es/docs/post-install/index.json b/web/messages/es/docs/post-install/index.json index 3bf6c0f9..12b41d67 100644 --- a/web/messages/es/docs/post-install/index.json +++ b/web/messages/es/docs/post-install/index.json @@ -80,13 +80,13 @@ }, "pbs": { "heading": "En Proxmox Backup Server", - "body": "En un host Proxmox Backup Server, el mismo menú se abre desde Settings post-install Proxmox en el menú de PBS. Automatizado, Personalizable, Apply Available Updates y Uninstall Optimizations funcionan igual que en Proxmox VE, con estas diferencias:", + "body": "En un host Proxmox Backup Server, el mismo menú se abre desde Configuración post instalación de Proxmox en el menú de PBS. Automatizado, Personalizable, Aplicar actualizaciones disponibles y Desinstalar optimizaciones funcionan igual que en Proxmox VE, con estas diferencias:", "items": [ "Repositorios y actualización: cuando el servidor no tiene suscripción y solo está activo el repositorio Enterprise de PBS, ProxMenux pregunta antes de cambiar al repositorio sin suscripción de PBS. El cambio se hace con la API de repositorios del propio servidor, la misma que usa Administration > Repositories. Con una suscripción activa, o con un repositorio sin suscripción o de pruebas ya configurado, las fuentes se mantienen como están.", "Lista personalizable: no aparecen las opciones que solo se aplican a Proxmox VE: agente de invitado, VFIO IOMMU, Open vSwitch, velocidad de backups vzdump, pigz, Appliance Manager, Ceph, alta disponibilidad y OVH Real Time Monitoring.", - "Banner de suscripción: el parche se aplica a la interfaz web de Proxmox Backup Server, y Uninstall Optimizations lo restaura.", + "Banner de suscripción: el parche se aplica a la interfaz web de Proxmox Backup Server, y Desinstalar optimizaciones lo restaura.", "Figurine: se instala sin los alias de Proxmox VE.", - "Scripts de la comunidad: la sección ofrece Proxmox Backup Server Post Install y Proxmox Backup Server Microcode en lugar de los scripts de Proxmox VE." + "Scripts comunitarios: la sección ofrece Proxmox Backup Server Post Install y Proxmox Backup Server Microcode en lugar de los scripts de Proxmox VE." ] }, "related": { diff --git a/web/messages/es/docs/post-install/performance.json b/web/messages/es/docs/post-install/performance.json index ce9022e7..95d7bdce 100644 --- a/web/messages/es/docs/post-install/performance.json +++ b/web/messages/es/docs/post-install/performance.json @@ -1,11 +1,11 @@ { "meta": { "title": "Post-instalación: Rendimiento | Documentación de ProxMenux", - "description": "Opciones de rendimiento en el script post-instalación Personalizable de ProxMenux. Sustituye gzip de un solo hilo por pigz (gzip paralelo) para copias de seguridad y compresión más rápidas en hosts multinúcleo." + "description": "Opciones de rendimiento en el script post-instalación Personalizable de ProxMenux. Sustituye gzip de un solo hilo por pigz (gzip paralelo) para backups y compresión más rápidos en hosts multinúcleo." }, "header": { "title": "Post-instalación: Rendimiento", - "description": "Opciones de rendimiento del script post-instalación Personalizable. Esta categoría contiene una sola optimización: sustituir gzip por pigz para que las copias de seguridad y la compresión usen todos los núcleos de la CPU en lugar de uno.", + "description": "Opciones de rendimiento del script post-instalación Personalizable. Esta categoría contiene una sola optimización: sustituir gzip por pigz para que los backups y la compresión usen todos los núcleos de la CPU en lugar de uno.", "section": "Configuración post instalación de Proxmox" }, "intro": { diff --git a/web/messages/es/docs/post-install/storage.json b/web/messages/es/docs/post-install/storage.json index 32b7c491..5a53580a 100644 --- a/web/messages/es/docs/post-install/storage.json +++ b/web/messages/es/docs/post-install/storage.json @@ -12,7 +12,7 @@ "body": "Cuatro optimizaciones relacionadas con almacenamiento: tunear el tamaño de la caché ARC de ZFS a una fracción sensata de la RAM del host, instalar y programar auto-snapshots de ZFS, activar autotrim de ZFS en pools SSD/NVMe y eliminar throttles de vzdump para que los backups corran a máxima velocidad. Las cuatro son independientes — elige las que se ajusten a tu setup. Una quinta optimización cercana al almacenamiento, Log2RAM, reduce el desgaste del SSD/NVMe moviendo /var/log a una ramdisk — vive en la página Optional porque el menú Personalizable de ProxMenux la agrupa allí." }, "trackedTitle": "Las cuatro se registran en el menú Desinstalar", - "trackedBody": "Cada una de estas opciones registra un tool en installed_tools.json, así que aparecen en Uninstall Optimizations. Revertir zfs_arc elimina /etc/modprobe.d/99-zfsarc.conf y reconstruye initramfs; zfs_auto_snapshot revierte la programación cron y ofrece purgar el paquete; zfs_autotrim pone autotrim=off en los pools que activó; vzdump_speed restaura /etc/vzdump.conf desde el .bak que la instalación creó.", + "trackedBody": "Cada una de estas opciones registra un tool en installed_tools.json, así que aparecen en Desinstalar optimizaciones. Revertir zfs_arc elimina /etc/modprobe.d/99-zfsarc.conf y reconstruye initramfs; zfs_auto_snapshot revierte la programación cron y ofrece purgar el paquete; zfs_autotrim pone autotrim=off en los pools que activó; vzdump_speed restaura /etc/vzdump.conf desde el .bak que la instalación creó.", "arc": { "heading": "Optimizar el tamaño del ARC de ZFS", "intro": "La Adaptive Replacement Cache (ARC) es la caché de lectura en memoria de ZFS. Las instalaciones Proxmox VE desde 8.1 fijan un límite del 10% de RAM, con máximo 16 GiB; hosts antiguos o actualizados pueden diferir. Esta opción escribe su propio límite según la RAM. Revisa ajustes y carga: una caché menor no siempre es más rápida.", @@ -117,7 +117,7 @@ "manualIntro": "La secuencia completa que el script ejecuta contra cada pool es replicable a mano. Esto es lo que escribirías si quisieras hacer lo mismo en un solo pool sin ProxMenux:", "verifyTitle": "Verificación y reversión manual", "oneShotTitle": "¿Necesitas un trim puntual en lugar de continuo?", - "oneShotBody": "Algunos operadores prefieren un trim manual durante horas de baja carga en lugar de actividad de trim continua. Desactiva autotrim y programa un cron que ejecute zpool trim <pool> — mismo objetivo final, distinta cadencia." + "oneShotBody": "Algunos usuarios prefieren un trim manual durante horas de baja carga en lugar de actividad de trim continua. Desactiva autotrim y programa un cron que ejecute zpool trim <pool> — mismo objetivo final, distinta cadencia." }, "vzdump": { "heading": "Aumentar la velocidad de backup de vzdump", diff --git a/web/messages/es/docs/post-install/uninstall.json b/web/messages/es/docs/post-install/uninstall.json index 52d2dfe4..32311b09 100644 --- a/web/messages/es/docs/post-install/uninstall.json +++ b/web/messages/es/docs/post-install/uninstall.json @@ -14,7 +14,7 @@ }, "openMenu": { "heading": "Cómo abrirlo", - "body": "Desde el menú principal, abre Configuración post-instalación de Proxmox → Desinstalar optimizaciones. Verás una lista de optimizaciones actualmente aplicadas; las no aplicadas no aparecen.", + "body": "Desde el menú principal, abre Configuración post instalación de Proxmox → Desinstalar optimizaciones. Verás una lista de optimizaciones actualmente aplicadas; las no aplicadas no aparecen.", "imageAlt": "Lista de Desinstalar optimizaciones con las opciones activas del host y casillas para elegir cuáles revertir" }, "howWorks": { diff --git a/web/messages/es/docs/post-install/updates.json b/web/messages/es/docs/post-install/updates.json index 1720b8be..daea8ffc 100644 --- a/web/messages/es/docs/post-install/updates.json +++ b/web/messages/es/docs/post-install/updates.json @@ -25,7 +25,7 @@ }, { "title": "Registro versionado en el host", - "body": "Cuando el operador aplicó cada optimización, la llamada register_tool correspondiente escribió la versión activa en /usr/local/share/proxmenux/installed_tools.json. Ese archivo es la fuente de verdad de \"qué está activo en este host ahora mismo\"." + "body": "Cuando el usuario aplicó cada optimización, la llamada register_tool correspondiente escribió la versión activa en /usr/local/share/proxmenux/installed_tools.json. Ese archivo es la fuente de verdad de \"qué está activo en este host ahora mismo\"." }, { "title": "El Monitor compara ambos lados", diff --git a/web/messages/es/docs/post-install/virtualization.json b/web/messages/es/docs/post-install/virtualization.json index bbb844c1..ca1e42e3 100644 --- a/web/messages/es/docs/post-install/virtualization.json +++ b/web/messages/es/docs/post-install/virtualization.json @@ -9,10 +9,10 @@ }, "intro": { "title": "Qué cubre esta categoría", - "body": "Dos opciones independientes. Instalar el agente invitado correspondiente ayuda cuando el propio Proxmox se ejecuta anidado dentro de otro hipervisor. Activar soporte VFIO IOMMU es la opción que más usuarios necesitan: activa las funciones del kernel para asignar una GPU, HBA o NIC directamente a una VM con rendimiento casi nativo." + "body": "Dos opciones independientes. Instalar el guest agent correspondiente ayuda cuando el propio Proxmox se ejecuta anidado dentro de otro hipervisor. Activar soporte VFIO IOMMU es la opción que más usuarios necesitan: activa las funciones del kernel para asignar una GPU, HBA o NIC directamente a una VM con rendimiento casi nativo." }, "guestAgent": { - "heading": "Instalar el agente invitado correspondiente", + "heading": "Instalar el guest agent correspondiente", "intro": "Detecta el entorno de virtualización del host Proxmox mediante systemd-detect-virt y dmidecode e instala el paquete de herramientas de invitado correspondiente para comunicarse correctamente con el hipervisor exterior: apagado ordenado, sincronización del reloj, información de IP, etc.", "headerDetected": "Host detectado", "headerPackage": "Paquete instalado", @@ -76,12 +76,12 @@ "Dos GPUs: una puede ir a una VM y la otra a un LXC, pero necesitarás una configuración más granular (vincular solo una tarjeta a vfio-pci por ID PCI). La blacklist por defecto es demasiado amplia para este caso — edita blacklist.conf después." ], "acsTitle": "Sobre pcie_acs_override — sé consciente de lo que estás activando", - "acsBody": "pcie_acs_override=downstream,multifunction relaja el chequeo de PCIe Access Control Services. Permite al kernel partir grupos IOMMU que el firmware reporta como monolíticos, que a veces es la única forma de hacer passthrough de un dispositivo de un grupo sin arrastrar el resto. El trade-off es aislamiento reducido entre dispositivos: una VM maliciosa o comprometida con passthrough tiene una superficie de ataque mayor vía DMA. Bien para un home lab; piénsatelo dos veces antes de activarlo en un host que ejecuta cargas no confiables. Si no lo necesitas, quita ese token de /etc/kernel/cmdline o /etc/default/grub tras ejecutar el script y vuelve a ejecutar el paso de actualización del cargador de arranque.", + "acsBody": "pcie_acs_override=downstream,multifunction relaja el chequeo de PCIe Access Control Services. Permite al kernel partir grupos IOMMU que el firmware reporta como monolíticos, que a veces es la única forma de hacer passthrough de un dispositivo de un grupo sin arrastrar el resto. El trade-off es aislamiento reducido entre dispositivos: una VM maliciosa o comprometida con passthrough tiene una superficie de ataque mayor vía DMA. Bien para un home lab; piénsatelo dos veces antes de activarlo en un host que ejecuta cargas no confiables. Si no lo necesitas, elimina ese token de /etc/kernel/cmdline o /etc/default/grub tras ejecutar el script y vuelve a ejecutar el paso de actualización del cargador de arranque.", "rebootTitle": "Se requiere reinicio", "rebootBody": "IOMMU, los módulos VFIO y la blacklist solo surten efecto tras un reinicio + regeneración del initramfs. El script dispara update-initramfs -u -k all y el refresh del cargador de arranque, y activa el flag de \"se requiere reinicio\" para que Personalizable te lo pregunte al final.", "verifyTitle": "Verificación tras el reinicio", "revertTitle": "Reversible desde el menú Desinstalar", - "revertBody": "Desinstalar optimizaciones revierte todos los cambios: elimina los parámetros IOMMU de /etc/kernel/cmdline o GRUB, quita los módulos VFIO de /etc/modules, elimina las entradas de bloqueo de controladores y reconstruye initramfs. Debes reiniciar para aplicar la reversión." + "revertBody": "Desinstalar optimizaciones revierte todos los cambios: elimina los parámetros IOMMU de /etc/kernel/cmdline o GRUB, elimina los módulos VFIO de /etc/modules, elimina las entradas de bloqueo de controladores y reconstruye initramfs. Debes reiniciar para aplicar la reversión." }, "related": { "heading": "Relacionado", From d3da2da48cc2d37e7df926697ef1196850f57241 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:57:26 +0200 Subject: [PATCH 66/73] Describe the post-install behaviour as the scripts run it - The automated run can also ask to confirm the system update - Persistent NIC names, ZFS ARC reconcile and ARC policy match the code - Uninstall rewrites journald.conf with systemd defaults --- web/messages/de/docs/post-install/automated.json | 2 +- web/messages/de/docs/post-install/network.json | 4 ++-- web/messages/de/docs/post-install/storage.json | 4 ++-- web/messages/de/docs/post-install/system.json | 2 +- web/messages/en/docs/post-install/automated.json | 2 +- web/messages/en/docs/post-install/network.json | 4 ++-- web/messages/en/docs/post-install/storage.json | 4 ++-- web/messages/en/docs/post-install/system.json | 2 +- web/messages/es/docs/post-install/automated.json | 2 +- web/messages/es/docs/post-install/network.json | 4 ++-- web/messages/es/docs/post-install/storage.json | 4 ++-- web/messages/es/docs/post-install/system.json | 2 +- web/messages/fr/docs/post-install/automated.json | 2 +- web/messages/fr/docs/post-install/network.json | 4 ++-- web/messages/fr/docs/post-install/storage.json | 4 ++-- web/messages/fr/docs/post-install/system.json | 2 +- web/messages/it/docs/post-install/automated.json | 2 +- web/messages/it/docs/post-install/network.json | 4 ++-- web/messages/it/docs/post-install/storage.json | 4 ++-- web/messages/it/docs/post-install/system.json | 2 +- web/messages/pt/docs/post-install/automated.json | 2 +- web/messages/pt/docs/post-install/network.json | 4 ++-- web/messages/pt/docs/post-install/storage.json | 4 ++-- web/messages/pt/docs/post-install/system.json | 2 +- web/messages/sk/docs/post-install/automated.json | 2 +- web/messages/sk/docs/post-install/network.json | 4 ++-- web/messages/sk/docs/post-install/storage.json | 4 ++-- web/messages/sk/docs/post-install/system.json | 2 +- web/messages/sv/docs/post-install/automated.json | 2 +- web/messages/sv/docs/post-install/network.json | 4 ++-- web/messages/sv/docs/post-install/storage.json | 4 ++-- web/messages/sv/docs/post-install/system.json | 2 +- 32 files changed, 48 insertions(+), 48 deletions(-) diff --git a/web/messages/de/docs/post-install/automated.json b/web/messages/de/docs/post-install/automated.json index afae9054..fc4ab3fb 100644 --- a/web/messages/de/docs/post-install/automated.json +++ b/web/messages/de/docs/post-install/automated.json @@ -1,7 +1,7 @@ { "meta": { "title": "Automatisiertes Nachinstallationsskript | ProxMenux Dokumentation", - "description": "Das automatisierte Nachinstallationsskript von ProxMenux führt 14 festgelegte, hardwareabhängige Optimierungen auf einem neuen Proxmox-VE-Host aus. Es gibt keine Funktionsauswahlliste; Bannerentfernung, manche Log2RAM-Installationen und Neustart können jedoch eine Bestätigung verlangen. Rückgängig zu machende Konfigurationsänderungen werden erfasst.", + "description": "Das automatisierte Nachinstallationsskript von ProxMenux führt 14 festgelegte, hardwareabhängige Optimierungen auf einem neuen Proxmox-VE-Host aus. Es gibt keine Funktionsauswahlliste; Systemaktualisierung, Bannerentfernung, manche Log2RAM-Installationen und Neustart können jedoch eine Bestätigung verlangen. Rückgängig zu machende Konfigurationsänderungen werden erfasst.", "ogTitle": "Automatisiertes Nachinstallationsskript | ProxMenux Dokumentation", "ogDescription": "14 festgelegte, hardwareabhängige Optimierungen für einen neuen Proxmox-VE-Host, mit Bestätigungen für einige Aktionen und Erfassung rückgängig zu machender Änderungen." }, diff --git a/web/messages/de/docs/post-install/network.json b/web/messages/de/docs/post-install/network.json index 30304efd..f07772a3 100644 --- a/web/messages/de/docs/post-install/network.json +++ b/web/messages/de/docs/post-install/network.json @@ -83,13 +83,13 @@ "whyItems": [ "Das Hinzufügen oder Entfernen von PCIe-Geräten kann die Busnummerierung verschieben und enp3s0 in enp4s0 verwandeln. Wenn Ihr /etc/network/interfaces auf den alten Namen verweist, verschwindet die Brücke beim Neustart.", "BIOS / Firmware-Updates ändern manchmal, wie Geräte aufgezählt werden, mit dem gleichen Effekt.", - "Das Hilfsskript weist physischen Netzwerkkarten feste Namen zu, auch den physischen Ports eines Bonds. Virtuelle Schnittstellen wie LXC-veth-Geräte und die Bond-Geräte selbst werden übersprungen. Namenskonflikte virtueller hotplug-NICs behebt es nicht." + "Das Hilfsskript schreibt .link-Dateien für physische Netzwerkkarten, auch für Bond-Ports, mit der MAC, die sysfs gerade meldet; bei Bond-Ports kann das die gemeinsame MAC des Bonds sein, prüfen Sie ihre Namen daher nach einem Neustart. Virtuelle Schnittstellen wie LXC-veth-Geräte und die Bond-Geräte selbst werden übersprungen. Namenskonflikte virtueller hotplug-NICs behebt es nicht." ], "writtenTitle": "Was geschrieben wird", "writtenIntro": "Eine Datei pro physischem NIC, bei /etc/systemd/network/10-proxmenux-<iface>.link. Jede Datei beginnt mit dem Header # Managed by ProxMenux — do not edit, so dass ProxMenux seine eigenen Dateien von benutzer- oder paketgebundenen .link-Dateien unterscheiden kann.", "writtenOutro": ".link-Dateien anderer Pakete oder des Benutzers bleiben erhalten; nur Dateien mit ProxMenux-Header werden verwaltet. Bei erneutem Ausführen gleicht die Funktion ihren Bestand ab: Sie liest MACAddress= aus jeder 10-proxmenux-*.link und entfernt Dateien, deren MAC unter /sys/class/net/ nicht mehr vorkommt. Dateien älterer ProxMenux-Versionen im Format 10-<iface>.link werden beim ersten Lauf automatisch migriert.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "Das Skript nutzt systemd-.link-Dateien für feste Namen. Auf Proxmox VE 9 lädt es danach zusätzlich udev-Regeln neu, damit neu hinzugefügte NICs sie ohne Neustart nutzen können. Prüfen Sie vorhandene Schnittstellen nach einem Neustart auf PVE 8 und PVE 9. Der Host bleibt bei ifupdown2. In beiden Fällen setzt das Skript das Neustart-Flag, damit die anpassbare Nachinstallation danach fragt.", + "pveBody": "Das Skript nutzt systemd-.link-Dateien für feste Namen. Auf Proxmox VE 9 lädt es danach zusätzlich udev-Regeln neu, damit eine bereits festgelegte NIC, die erneut angeschlossen oder erkannt wird, ihre Regel ohne Neustart übernimmt. Prüfen Sie vorhandene Schnittstellen nach einem Neustart auf PVE 8 und PVE 9. Der Host bleibt bei ifupdown2. In beiden Fällen setzt das Skript das Neustart-Flag, damit die anpassbare Nachinstallation danach fragt.", "reviewTitle": "Überprüfen Sie zuerst bestehende /etc/network/interfaces", "reviewBody": "Verweist die ältere Konfiguration in /etc/network/interfaces auf automatisch vom Kernel erzeugte NIC-Namen, ist das Festschreiben der aktuellen Namen sinnvoll. Haben Sie die Konfiguration bereits manuell an bestimmte Namen angepasst, prüfen Sie vor dem Neustart sorgfältig, ob die festen Namen mit der interfaces-Datei übereinstimmen.", "revertTitle": "Reversibel aus dem Menü Deinstallieren", diff --git a/web/messages/de/docs/post-install/storage.json b/web/messages/de/docs/post-install/storage.json index 93085edd..ea4710a1 100644 --- a/web/messages/de/docs/post-install/storage.json +++ b/web/messages/de/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Jede Option registriert ein Werkzeug in installed_tools.json für Optimierungen deinstallieren. zfs_arc entfernt /etc/modprobe.d/99-zfsarc.conf und erstellt initramfs neu; zfs_auto_snapshot entfernt den Cron-Zeitplan und bietet die vollständige Paketentfernung an; zfs_autotrim setzt autotrim=off auf den zuvor aktivierten Pools; vzdump_speed stellt /etc/vzdump.conf aus der bei Installation erstellten .bak wieder her.", "arc": { "heading": "ZFS ARC-Größe optimieren", - "intro": "Der Adaptive Replacement Cache (ARC) ist der ZFS-Lesecache im RAM. Proxmox-VE-Installationen ab 8.1 setzen 10% RAM mit maximal 16 GiB; ältere oder aktualisierte Hosts können abweichen. Diese Option schreibt einen eigenen RAM-basierten Grenzwert. Prüfen Sie vorhandene Einstellungen und Arbeitslast; ein kleinerer Cache ist nicht immer schneller.", + "intro": "Der Adaptive Replacement Cache (ARC) ist der ZFS-Lesecache im RAM. Proxmox-VE-Installationen ab 8.1 setzen 10% RAM mit maximal 16 GiB; ältere oder aktualisierte Hosts können abweichen. Diese Option schreibt genau diese Regel ausdrücklich (RAM/10, höchstens 16 GiB, mindestens 64 MiB) in eine eigene Datei und deckt so auch ältere oder aktualisierte Hosts ab. Prüfen Sie vorhandene Einstellungen und Arbeitslast; ein kleinerer Cache ist nicht immer schneller.", "sizingTitle": "Größenregeln", "headerRam": "Host-Arbeitsspeicher", "headerMax": "ARC-Obergrenze", @@ -41,7 +41,7 @@ "max": "16 GiB (Obergrenze)" } ], - "after": "Die Datei /etc/modprobe.d/99-zfsarc.conf enthält nur options zfs zfs_arc_max=…. Andere ZFS-Parameter (zfs_arc_min, L2ARC-Vorablesen/Schreibbegrenzung, TXG-Zeitlimit) werden nicht abgestimmt. Vorher prüft ein Abgleich andere *.conf in /etc/modprobe.d/ auf zfs_arc_min / zfs_arc_max, sichert sie mit Manifest unter /usr/local/share/proxmenux/backups/zfs_arc/ und entfernt widersprüchliche Zeilen. Damit bleibt nur ProxMenuxs ARC-Datei aktiv. Anschließend werden update-initramfs -u -k all und gegebenenfalls proxmox-boot-tool refresh ausgeführt, damit der Grenzwert auch im initramfs für ZFS-Root-Systeme ankommt.", + "after": "Die Datei /etc/modprobe.d/99-zfsarc.conf enthält nur options zfs zfs_arc_max=…. Andere ZFS-Parameter (zfs_arc_min, L2ARC-Vorablesen/Schreibbegrenzung, TXG-Zeitlimit) werden nicht abgestimmt. Vorher prüft ein Abgleich andere *.conf in /etc/modprobe.d/ auf zfs_arc_min / zfs_arc_max, sichert sie mit Manifest unter /usr/local/share/proxmenux/backups/zfs_arc/ und entfernt daraus die widersprüchlichen Werte zfs_arc_min / zfs_arc_max (andere Optionen dieser Zeilen bleiben erhalten). Damit legt nur die ARC-Datei von ProxMenux den Grenzwert fest. Anschließend werden update-initramfs -u -k all und gegebenenfalls proxmox-boot-tool refresh ausgeführt, damit der Grenzwert auch im initramfs für ZFS-Root-Systeme ankommt.", "rebootTitle": "Erfordert einen Neustart, um wirksam zu werden", "rebootBody": "ARC-Einstellungen werden beim Laden des Kernelmoduls zfs gelesen. Für ZFS-Root-Hosts erzeugt ProxMenux initramfs mit update-initramfs -u -k all neu und aktualisiert bei Bedarf den Bootloader mit proxmox-boot-tool refresh. Der neue Modulparameter wird erst nach Neustart genutzt; das entsprechende Flag wird automatisch gesetzt.", "safeTitle": "Sicher auf Nicht-ZFS-Hosts", diff --git a/web/messages/de/docs/post-install/system.json b/web/messages/de/docs/post-install/system.json index 95f06321..476ac221 100644 --- a/web/messages/de/docs/post-install/system.json +++ b/web/messages/de/docs/post-install/system.json @@ -103,7 +103,7 @@ "heading": "Verifizierung", "intro": "Nach Anwendung der Systemoptimierungen:", "tipTitle": "Wiederherstellung und Grenzen", - "tipBody": "Alle sechs Optionen werden in installed_tools.json erfasst und unter Optimierungen deinstallieren angeboten. Die Wiederherstellung entfernt Konfigurationsdateien, kexec-Unit und Alias und stellt journald/logrotate wieder her. Manche aktiven Grenzen brauchen eine neue Sitzung oder Neustart. Aus /root/.profile wird nur altes ulimit -n 256000 entfernt; aktuelles ulimit -n 1048576 kann bleiben und manuelle Entfernung erfordern." + "tipBody": "Alle sechs Optionen werden in installed_tools.json erfasst und unter Optimierungen deinstallieren angeboten. Die Wiederherstellung entfernt die Konfigurationsdateien sowie kexec-Unit und Alias, schreibt journald.conf mit den systemd-Standardwerten neu und stellt logrotate.conf aus der Sicherung wieder her. Manche aktiven Grenzen brauchen eine neue Sitzung oder einen Neustart." }, "related": { "heading": "Verwandte Themen", diff --git a/web/messages/en/docs/post-install/automated.json b/web/messages/en/docs/post-install/automated.json index 9d5eac6c..ed1aa387 100644 --- a/web/messages/en/docs/post-install/automated.json +++ b/web/messages/en/docs/post-install/automated.json @@ -1,7 +1,7 @@ { "meta": { "title": "Automated Post-Install Script | ProxMenux Documentation", - "description": "The ProxMenux Automated post-install script runs a fixed set of 14 hardware-aware optimizations on a fresh Proxmox VE host. It has no feature-selection checklist, but banner removal, some Log2RAM installations and rebooting can ask for confirmation. Reversible configuration changes are registered for later restoration.", + "description": "The ProxMenux Automated post-install script runs a fixed set of 14 hardware-aware optimizations on a fresh Proxmox VE host. It has no feature-selection checklist, but the system update, banner removal, some Log2RAM installations and rebooting can ask for confirmation. Reversible configuration changes are registered for later restoration.", "ogTitle": "Automated Post-Install Script | ProxMenux Documentation", "ogDescription": "14 fixed, hardware-aware optimizations for a fresh Proxmox VE host, with confirmations for some actions and reversible configuration changes tracked." }, diff --git a/web/messages/en/docs/post-install/network.json b/web/messages/en/docs/post-install/network.json index f9420fb8..e84682d0 100644 --- a/web/messages/en/docs/post-install/network.json +++ b/web/messages/en/docs/post-install/network.json @@ -83,13 +83,13 @@ "whyItems": [ "Adding or removing PCIe devices can shift the bus numbering, turning enp3s0 into enp4s0. If your /etc/network/interfaces references the old name, the bridge vanishes on reboot.", "BIOS / firmware updates sometimes change how devices enumerate, with the same effect.", - "The helper pins physical NIC names, including physical ports used by bonds. It skips virtual interfaces such as LXC veth devices and the bond devices themselves; it does not fix naming races for virtual hotplug NICs." + "The helper writes .link files for physical NICs, including bond member ports, using the MAC currently reported in sysfs; for bond members this may be the bond’s shared MAC, so check their names after a reboot. It skips virtual interfaces such as LXC veth devices and the bond devices themselves; it does not fix naming races for virtual hotplug NICs." ], "writtenTitle": "What gets written", "writtenIntro": "One file per physical NIC, at /etc/systemd/network/10-proxmenux-<iface>.link. Each file starts with the header # Managed by ProxMenux — do not edit so ProxMenux can distinguish its own files from user- or package-provided .link files.", "writtenOutro": ".link files from other packages or hand-written by the user are left in place — only files carrying the ProxMenux header are managed. On re-run, the function reconciles its own set: it re-reads MACAddress= from every 10-proxmenux-*.link and drops any whose MAC no longer appears under /sys/class/net/. Files written by an earlier ProxMenux release in the old 10-<iface>.link format are migrated automatically the first time.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "The script uses systemd .link files for persistent names. On Proxmox VE 9 it also reloads udev rules after writing them, so newly added NICs can use the rules without rebooting. Existing interfaces should be checked after a reboot on both PVE 8 and PVE 9. This does not switch the host away from ifupdown2. The script sets the reboot flag in either case so Customizable prompts you.", + "pveBody": "The script uses systemd .link files for persistent names. On Proxmox VE 9 it also reloads udev rules after writing them, so a pinned NIC that is re-added or re-probed can pick up its rule without rebooting. Existing interfaces should be checked after a reboot on both PVE 8 and PVE 9. This does not switch the host away from ifupdown2. The script sets the reboot flag in either case so Customizable prompts you.", "reviewTitle": "Review existing /etc/network/interfaces first", "reviewBody": "If your host has legacy configuration in /etc/network/interfaces that references NIC names generated by the kernel's default scheme, pinning today's names is exactly what you want. But if you've already manually customised the config around specific names, double-check the pinning matches what the interfaces file expects before rebooting.", "revertTitle": "Reversible from the Uninstall menu", diff --git a/web/messages/en/docs/post-install/storage.json b/web/messages/en/docs/post-install/storage.json index 888d021b..2998ba58 100644 --- a/web/messages/en/docs/post-install/storage.json +++ b/web/messages/en/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Each of these options registers a tool in installed_tools.json, so they appear in Uninstall Optimizations. Reverting zfs_arc removes /etc/modprobe.d/99-zfsarc.conf and rebuilds initramfs; zfs_auto_snapshot reverses the cron schedule and offers to purge the package; zfs_autotrim sets autotrim=off on the pools it enabled; vzdump_speed restores /etc/vzdump.conf from the .bak the install created.", "arc": { "heading": "Optimize ZFS ARC size", - "intro": "The Adaptive Replacement Cache (ARC) is ZFS’s in-memory read cache. Proxmox VE installations since 8.1 set a limit of 10% of RAM, capped at 16 GiB; older or upgraded hosts may differ. This option writes its own RAM-based ARC limit. Check existing settings and workload needs before changing it; a smaller cache is not always faster.", + "intro": "The Adaptive Replacement Cache (ARC) is ZFS’s in-memory read cache. Proxmox VE installations since 8.1 set a limit of 10% of RAM, capped at 16 GiB; older or upgraded hosts may differ. This option writes that same policy explicitly (RAM/10, capped at 16 GiB, with a 64 MiB floor) to its own file, which also covers older or upgraded hosts. Check existing settings and workload needs before changing it; a smaller cache is not always faster.", "sizingTitle": "Sizing rules", "headerRam": "Host RAM", "headerMax": "ARC cap", @@ -41,7 +41,7 @@ "max": "16 GiB (cap)" } ], - "after": "The file /etc/modprobe.d/99-zfsarc.conf contains a single directive — options zfs zfs_arc_max=…. This option does not tune other ZFS module parameters (zfs_arc_min, L2ARC prefetch/write throttle, TXG timeout). Before writing, a reconcile step scans other *.conf in /etc/modprobe.d/ that set zfs_arc_min / zfs_arc_max, backs them up to /usr/local/share/proxmenux/backups/zfs_arc/ with a manifest, and strips conflicting lines so only ProxMenux’s ARC file is active. After writing, it runs update-initramfs -u -k all and, when applicable, proxmox-boot-tool refresh, so the limit also reaches the initramfs used by ZFS-on-root setups.", + "after": "The file /etc/modprobe.d/99-zfsarc.conf contains a single directive — options zfs zfs_arc_max=…. This option does not tune other ZFS module parameters (zfs_arc_min, L2ARC prefetch/write throttle, TXG timeout). Before writing, a reconcile step scans other *.conf in /etc/modprobe.d/ that set zfs_arc_min / zfs_arc_max, backs them up to /usr/local/share/proxmenux/backups/zfs_arc/ with a manifest, and removes the conflicting zfs_arc_min / zfs_arc_max values (other options on those lines are kept), so only ProxMenux’s ARC file sets the limit. After writing, it runs update-initramfs -u -k all and, when applicable, proxmox-boot-tool refresh, so the limit also reaches the initramfs used by ZFS-on-root setups.", "rebootTitle": "Requires a reboot to take effect", "rebootBody": "ARC settings are read when the zfs kernel module loads. To make the cap take effect on ZFS-on-root hosts, ProxMenux regenerates the initramfs with update-initramfs -u -k all and, when applicable, refreshes the boot loader with proxmox-boot-tool refresh. A reboot is still required to pick up the new module parameter; the \"reboot required\" flag is set automatically.", "safeTitle": "Safe on non-ZFS hosts", diff --git a/web/messages/en/docs/post-install/system.json b/web/messages/en/docs/post-install/system.json index b2ff5383..8c62ce20 100644 --- a/web/messages/en/docs/post-install/system.json +++ b/web/messages/en/docs/post-install/system.json @@ -103,7 +103,7 @@ "heading": "Verification", "intro": "After applying the System optimizations:", "tipTitle": "Restoration and limitations", - "tipBody": "All six options are tracked in installed_tools.json and offered in Uninstall Optimizations. Restoration removes configuration files, the kexec unit and alias, and restores journald/logrotate configuration. Some live limits need a new session or reboot. The system-limits cleanup removes the legacy ulimit -n 256000 line from /root/.profile; the current ulimit -n 1048576 line can remain and may need manual removal." + "tipBody": "All six options are tracked in installed_tools.json and offered in Uninstall Optimizations. Restoration removes the configuration files and the kexec unit and alias, rewrites journald.conf with the stock systemd defaults and restores logrotate.conf from its backup. Some live limits need a new session or reboot." }, "related": { "heading": "Related", diff --git a/web/messages/es/docs/post-install/automated.json b/web/messages/es/docs/post-install/automated.json index 9fe719af..432263c5 100644 --- a/web/messages/es/docs/post-install/automated.json +++ b/web/messages/es/docs/post-install/automated.json @@ -1,7 +1,7 @@ { "meta": { "title": "Script automatizado post-instalación | Documentación de ProxMenux", - "description": "El script automatizado post-instalación de ProxMenux ejecuta un conjunto fijo de 14 optimizaciones adaptadas al hardware en un host Proxmox VE recién instalado. No ofrece una lista de funciones para elegir, pero puede pedir confirmación para ocultar el aviso de suscripción, instalar Log2RAM en ciertos casos y reiniciar. Los cambios reversibles se registran para restaurarlos después.", + "description": "El script automatizado post-instalación de ProxMenux ejecuta un conjunto fijo de 14 optimizaciones adaptadas al hardware en un host Proxmox VE recién instalado. No ofrece una lista de funciones para elegir, pero puede pedir confirmación para la actualización del sistema, ocultar el aviso de suscripción, instalar Log2RAM en ciertos casos y reiniciar. Los cambios reversibles se registran para restaurarlos después.", "ogTitle": "Script automatizado post-instalación | Documentación de ProxMenux", "ogDescription": "14 optimizaciones fijas adaptadas al hardware para un host Proxmox VE nuevo, con confirmaciones para algunas acciones y registro de cambios reversibles." }, diff --git a/web/messages/es/docs/post-install/network.json b/web/messages/es/docs/post-install/network.json index 023f89bd..f60275d6 100644 --- a/web/messages/es/docs/post-install/network.json +++ b/web/messages/es/docs/post-install/network.json @@ -83,13 +83,13 @@ "whyItems": [ "Añadir o quitar dispositivos PCIe puede desplazar la numeración del bus, convirtiendo enp3s0 en enp4s0. Si tu /etc/network/interfaces referencia el nombre antiguo, el bridge desaparece al reiniciar.", "Actualizaciones de BIOS / firmware a veces cambian cómo se enumeran los dispositivos, con el mismo efecto.", - "El auxiliar fija los nombres de las NIC físicas, incluidos los puertos físicos de los bonds. Omite interfaces virtuales como veth de LXC y los propios dispositivos bond; no corrige carreras de nombres de NIC virtuales hotplug." + "El auxiliar escribe archivos .link para las NIC físicas, incluidos los puertos de los bonds, con la MAC que muestra sysfs en ese momento; en los puertos de un bond puede ser la MAC compartida del bond, así que comprueba sus nombres tras reiniciar. Omite interfaces virtuales como veth de LXC y los propios dispositivos bond; no corrige carreras de nombres de NIC virtuales hotplug." ], "writtenTitle": "Qué se escribe", "writtenIntro": "Un archivo por NIC física, en /etc/systemd/network/10-proxmenux-<iface>.link. Cada archivo comienza con la cabecera # Managed by ProxMenux — do not edit, marca que permite a ProxMenux distinguir sus propios archivos de los .link provistos por el usuario o por otros paquetes.", "writtenOutro": "Los archivos .link de otros paquetes o escritos a mano por el usuario se dejan intactos — solo se gestionan los archivos que llevan la cabecera de ProxMenux. En cada nueva ejecución la función reconcilia su propio conjunto: relee MACAddress= de cada 10-proxmenux-*.link y elimina los cuya MAC ya no aparece en /sys/class/net/. Los archivos escritos por una versión antigua de ProxMenux en el formato 10-<iface>.link se migran automáticamente en la primera ejecución.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "El script utiliza archivos .link de systemd para los nombres persistentes. En Proxmox VE 9 también recarga las reglas udev al escribirlos, para que las NIC nuevas las apliquen sin reiniciar. Comprueba las interfaces existentes tras reiniciar tanto en PVE 8 como en PVE 9. Esto no sustituye ifupdown2 en el host. El script marca el reinicio como necesario en ambos casos para que la post-instalación personalizable lo solicite.", + "pveBody": "El script utiliza archivos .link de systemd para los nombres persistentes. En Proxmox VE 9 también recarga las reglas udev al escribirlos, para que una NIC ya fijada que se vuelva a conectar o detectar aplique su regla sin reiniciar. Comprueba las interfaces existentes tras reiniciar tanto en PVE 8 como en PVE 9. Esto no sustituye ifupdown2 en el host. El script marca el reinicio como necesario en ambos casos para que la post-instalación personalizable lo solicite.", "reviewTitle": "Revisa antes el /etc/network/interfaces existente", "reviewBody": "Si tu host tiene configuración legacy en /etc/network/interfaces que referencia nombres de NIC generados por el esquema por defecto del kernel, fijar los nombres de hoy es exactamente lo que quieres. Pero si ya has customizado manualmente la configuración alrededor de nombres específicos, comprueba dos veces que el pinning coincide con lo que el archivo interfaces espera antes de reiniciar.", "revertTitle": "Reversible desde el menú Desinstalar", diff --git a/web/messages/es/docs/post-install/storage.json b/web/messages/es/docs/post-install/storage.json index 5a53580a..4e92d452 100644 --- a/web/messages/es/docs/post-install/storage.json +++ b/web/messages/es/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Cada una de estas opciones registra un tool en installed_tools.json, así que aparecen en Desinstalar optimizaciones. Revertir zfs_arc elimina /etc/modprobe.d/99-zfsarc.conf y reconstruye initramfs; zfs_auto_snapshot revierte la programación cron y ofrece purgar el paquete; zfs_autotrim pone autotrim=off en los pools que activó; vzdump_speed restaura /etc/vzdump.conf desde el .bak que la instalación creó.", "arc": { "heading": "Optimizar el tamaño del ARC de ZFS", - "intro": "La Adaptive Replacement Cache (ARC) es la caché de lectura en memoria de ZFS. Las instalaciones Proxmox VE desde 8.1 fijan un límite del 10% de RAM, con máximo 16 GiB; hosts antiguos o actualizados pueden diferir. Esta opción escribe su propio límite según la RAM. Revisa ajustes y carga: una caché menor no siempre es más rápida.", + "intro": "La Adaptive Replacement Cache (ARC) es la caché de lectura en memoria de ZFS. Las instalaciones Proxmox VE desde 8.1 fijan un límite del 10% de RAM, con máximo 16 GiB; hosts antiguos o actualizados pueden diferir. Esta opción escribe esa misma política de forma explícita (RAM/10, con un máximo de 16 GiB y un mínimo de 64 MiB) en su propio archivo, lo que cubre también hosts antiguos o actualizados. Revisa ajustes y carga: una caché menor no siempre es más rápida.", "sizingTitle": "Reglas de dimensionado", "headerRam": "RAM del host", "headerMax": "Límite del ARC", @@ -41,7 +41,7 @@ "max": "16 GiB (tope)" } ], - "after": "El archivo /etc/modprobe.d/99-zfsarc.conf contiene solo options zfs zfs_arc_max=…. Esta opción no ajusta otros parámetros ZFS (zfs_arc_min, lectura anticipada/límite de escritura L2ARC, tiempo de espera TXG). Antes busca otros *.conf en /etc/modprobe.d/ que definan zfs_arc_min / zfs_arc_max, los copia con un manifiesto a /usr/local/share/proxmenux/backups/zfs_arc/ y elimina las líneas en conflicto para que solo quede activo el archivo ARC de ProxMenux. Después ejecuta update-initramfs -u -k all y, si procede, proxmox-boot-tool refresh para incorporar el límite al initramfs de los sistemas con raíz ZFS.", + "after": "El archivo /etc/modprobe.d/99-zfsarc.conf contiene solo options zfs zfs_arc_max=…. Esta opción no ajusta otros parámetros ZFS (zfs_arc_min, lectura anticipada/límite de escritura L2ARC, tiempo de espera TXG). Antes busca otros *.conf en /etc/modprobe.d/ que definan zfs_arc_min / zfs_arc_max, los copia con un manifiesto a /usr/local/share/proxmenux/backups/zfs_arc/ y elimina de ellos los valores zfs_arc_min / zfs_arc_max en conflicto (el resto de opciones de esas líneas se conserva), para que solo el archivo ARC de ProxMenux fije el límite. Después ejecuta update-initramfs -u -k all y, si procede, proxmox-boot-tool refresh para incorporar el límite al initramfs de los sistemas con raíz ZFS.", "rebootTitle": "Requiere reinicio para surtir efecto", "rebootBody": "Los ajustes del ARC se leen cuando se carga el módulo del kernel zfs. Para que el cap se aplique en hosts ZFS-on-root, ProxMenux regenera el initramfs con update-initramfs -u -k all y, cuando corresponde, refresca el cargador de arranque con proxmox-boot-tool refresh. Un reinicio sigue siendo necesario para que el módulo relea el parámetro; el flag de \"se requiere reinicio\" se activa automáticamente.", "safeTitle": "Seguro en hosts sin ZFS", diff --git a/web/messages/es/docs/post-install/system.json b/web/messages/es/docs/post-install/system.json index d260dc5a..52764c82 100644 --- a/web/messages/es/docs/post-install/system.json +++ b/web/messages/es/docs/post-install/system.json @@ -103,7 +103,7 @@ "heading": "Verificación", "intro": "Tras aplicar las optimizaciones de Sistema:", "tipTitle": "Restauración y limitaciones", - "tipBody": "Las seis opciones se registran en installed_tools.json y aparecen en Desinstalar optimizaciones. La restauración elimina archivos de configuración, unidad y alias kexec, y restaura journald/logrotate. Algunos límites activos requieren otra sesión o reinicio. La limpieza de /root/.profile solo elimina el antiguo ulimit -n 256000; el actual ulimit -n 1048576 puede permanecer y requerir eliminación manual." + "tipBody": "Las seis opciones se registran en installed_tools.json y aparecen en Desinstalar optimizaciones. La restauración elimina los archivos de configuración, la unidad y el alias de kexec, reescribe journald.conf con los valores predeterminados de systemd y restaura logrotate.conf desde su backup. Algunos límites activos requieren otra sesión o reinicio." }, "related": { "heading": "Relacionado", diff --git a/web/messages/fr/docs/post-install/automated.json b/web/messages/fr/docs/post-install/automated.json index e6f1511f..08183f4a 100644 --- a/web/messages/fr/docs/post-install/automated.json +++ b/web/messages/fr/docs/post-install/automated.json @@ -1,7 +1,7 @@ { "meta": { "title": "Script de post-installation automatisé | Documentation ProxMenux", - "description": "Le script de post-installation automatisé ProxMenux exécute 14 optimisations prédéfinies adaptées au matériel sur un nouvel hôte Proxmox VE. Il n’a pas de liste de fonctions à sélectionner, mais peut demander confirmation pour masquer l’avertissement d’abonnement, installer Log2RAM dans certains cas et redémarrer. Les changements réversibles sont enregistrés.", + "description": "Le script de post-installation automatisé ProxMenux exécute 14 optimisations prédéfinies adaptées au matériel sur un nouvel hôte Proxmox VE. Il n’a pas de liste de fonctions à sélectionner, mais peut demander confirmation pour la mise à jour du système, pour masquer l’avertissement d’abonnement, installer Log2RAM dans certains cas et redémarrer. Les changements réversibles sont enregistrés.", "ogTitle": "Script de post-installation automatisé | Documentation ProxMenux", "ogDescription": "14 optimisations prédéfinies adaptées au matériel pour un nouvel hôte Proxmox VE, avec confirmation de certaines actions et suivi des changements réversibles." }, diff --git a/web/messages/fr/docs/post-install/network.json b/web/messages/fr/docs/post-install/network.json index 021784c2..4b1cd33c 100644 --- a/web/messages/fr/docs/post-install/network.json +++ b/web/messages/fr/docs/post-install/network.json @@ -83,13 +83,13 @@ "whyItems": [ "L'ajout ou la suppression de périphériques PCIe peut déplacer la numérotation du bus, transformer enp3s0 en enp4s0. Si votre /etc/network/interfaces fait référence à l'ancien nom, le pont disparaît sur le redémarrage.", "Les mises à jour du BIOS ou du firmware changent parfois l’énumération des périphériques, avec le même effet.", - "Le script fixe les noms des cartes physiques, y compris les ports physiques utilisés par les bonds. Il ignore les interfaces virtuelles, comme les veth LXC et les bonds eux-mêmes ; il ne corrige pas les courses au nommage des cartes virtuelles hotplug." + "Le script écrit des fichiers .link pour les cartes physiques, y compris les ports des bonds, avec la MAC indiquée par sysfs à ce moment ; pour les ports d’un bond, il peut s’agir de la MAC partagée du bond, vérifiez donc leurs noms après un redémarrage. Il ignore les interfaces virtuelles, comme les veth LXC et les bonds eux-mêmes ; il ne corrige pas les courses au nommage des cartes virtuelles hotplug." ], "writtenTitle": "Ce qui est écrit", "writtenIntro": "Un fichier par NIC physique, au /etc/systemd/network/10-proxmenux-<iface>.link. Chaque fichier commence par l'en-tête # Managed by ProxMenux — do not edit de sorte que ProxMenux puisse distinguer ses propres fichiers des fichiers .link fournis par l'utilisateur ou le paquet.", "writtenOutro": "Les fichiers .link d’autres paquets ou écrits par l’utilisateur sont conservés ; seuls ceux portant l’en-tête ProxMenux sont gérés. À chaque nouvelle exécution, la fonction vérifie ses fichiers : elle relit MACAddress= dans chaque 10-proxmenux-*.link et supprime ceux dont la MAC n’apparaît plus sous /sys/class/net/. Les fichiers d’anciennes versions ProxMenux au format 10-<iface>.link sont migrés automatiquement la première fois.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "Le script utilise des fichiers systemd .link pour les noms persistants. Sur Proxmox VE 9, il recharge aussi les règles udev après écriture afin que les nouvelles cartes puissent les utiliser sans redémarrage. Vérifiez les interfaces existantes après un redémarrage sur PVE 8 comme sur PVE 9. Cela ne remplace pas ifupdown2 sur l’hôte. Le script demande un redémarrage dans les deux cas via la post-installation personnalisable.", + "pveBody": "Le script utilise des fichiers systemd .link pour les noms persistants. Sur Proxmox VE 9, il recharge aussi les règles udev après écriture afin qu’une carte déjà fixée qui est rebranchée ou redétectée applique sa règle sans redémarrage. Vérifiez les interfaces existantes après un redémarrage sur PVE 8 comme sur PVE 9. Cela ne remplace pas ifupdown2 sur l’hôte. Le script demande un redémarrage dans les deux cas via la post-installation personnalisable.", "reviewTitle": "Examiner d'abord les /etc/network/interfaces existants", "reviewBody": "Si l’ancienne configuration dans /etc/network/interfaces utilise des noms de cartes générés par le noyau, fixer les noms actuels est le résultat souhaité. Si vous avez déjà adapté la configuration à des noms précis, vérifiez soigneusement que les noms fixés correspondent au fichier interfaces avant de redémarrer.", "revertTitle": "Réversible depuis le menu Désinstaller", diff --git a/web/messages/fr/docs/post-install/storage.json b/web/messages/fr/docs/post-install/storage.json index b78bb8d7..fece9c00 100644 --- a/web/messages/fr/docs/post-install/storage.json +++ b/web/messages/fr/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Chaque option s’enregistre dans installed_tools.json pour Désinstaller les optimisations. zfs_arc supprime /etc/modprobe.d/99-zfsarc.conf et reconstruit initramfs ; zfs_auto_snapshot annule le calendrier cron et propose de purger le paquet ; zfs_autotrim définit autotrim=off sur les pools activés ; vzdump_speed restaure /etc/vzdump.conf depuis le .bak créé à l’installation.", "arc": { "heading": "Optimiser la taille de ZFS ARC", - "intro": "Le Adaptive Replacement Cache (ARC) est le cache de lecture ZFS en mémoire. Les installations Proxmox VE depuis 8.1 fixent 10% de RAM, au maximum 16 GiB ; les hôtes anciens ou mis à niveau peuvent différer. Cette option écrit sa propre limite selon la RAM. Vérifiez les réglages et la charge : un cache plus petit n’est pas toujours plus rapide.", + "intro": "Le Adaptive Replacement Cache (ARC) est le cache de lecture ZFS en mémoire. Les installations Proxmox VE depuis 8.1 fixent 10% de RAM, au maximum 16 GiB ; les hôtes anciens ou mis à niveau peuvent différer. Cette option écrit explicitement cette même règle (RAM/10, au maximum 16 GiB, au minimum 64 MiB) dans son propre fichier, ce qui couvre aussi les hôtes anciens ou mis à niveau. Vérifiez les réglages et la charge : un cache plus petit n’est pas toujours plus rapide.", "sizingTitle": "Règles de calibrage", "headerRam": "RAM de l'hôte", "headerMax": "Plafond ARC", @@ -41,7 +41,7 @@ "max": "16 GiB (plafond)" } ], - "after": "Le fichier /etc/modprobe.d/99-zfsarc.conf contient uniquement options zfs zfs_arc_max=…. Les autres paramètres ZFS (zfs_arc_min, prélecture/limitation des écritures L2ARC, délai TXG) ne sont pas ajustés. Au préalable, une vérification recherche les autres *.conf de /etc/modprobe.d/ définissant zfs_arc_min / zfs_arc_max, les sauvegarde avec manifeste dans /usr/local/share/proxmenux/backups/zfs_arc/ et retire les lignes conflictuelles pour ne laisser actif que le fichier ARC ProxMenux. Puis update-initramfs -u -k all et, si nécessaire, proxmox-boot-tool refresh intègrent la limite à l’initramfs des systèmes avec racine ZFS.", + "after": "Le fichier /etc/modprobe.d/99-zfsarc.conf contient uniquement options zfs zfs_arc_max=…. Les autres paramètres ZFS (zfs_arc_min, prélecture/limitation des écritures L2ARC, délai TXG) ne sont pas ajustés. Au préalable, une vérification recherche les autres *.conf de /etc/modprobe.d/ définissant zfs_arc_min / zfs_arc_max, les sauvegarde avec manifeste dans /usr/local/share/proxmenux/backups/zfs_arc/ et en retire les valeurs zfs_arc_min / zfs_arc_max conflictuelles (les autres options de ces lignes sont conservées), pour que seul le fichier ARC ProxMenux fixe la limite. Puis update-initramfs -u -k all et, si nécessaire, proxmox-boot-tool refresh intègrent la limite à l’initramfs des systèmes avec racine ZFS.", "rebootTitle": "Nécessite un redémarrage pour prendre effet", "rebootBody": "Les réglages ARC sont lus au chargement du module zfs. Pour les hôtes avec racine ZFS, ProxMenux régénère initramfs avec update-initramfs -u -k all et actualise si nécessaire le chargeur avec proxmox-boot-tool refresh. Le nouveau paramètre exige toujours un redémarrage, signalé automatiquement.", "safeTitle": "Sans effet indésirable sur les hôtes sans ZFS", diff --git a/web/messages/fr/docs/post-install/system.json b/web/messages/fr/docs/post-install/system.json index 8a95c1fa..427d28cf 100644 --- a/web/messages/fr/docs/post-install/system.json +++ b/web/messages/fr/docs/post-install/system.json @@ -103,7 +103,7 @@ "heading": "Vérification", "intro": "Après l'application des optimisations système:", "tipTitle": "Restauration et limites", - "tipBody": "Les six options figurent dans installed_tools.json et Désinstaller les optimisations. La restauration retire fichiers de configuration, unité et alias kexec, et rétablit journald/logrotate. Certaines limites actives nécessitent une nouvelle session ou un redémarrage. Le nettoyage de /root/.profile retire seulement l’ancien ulimit -n 256000 ; l’actuel ulimit -n 1048576 peut rester et nécessiter une suppression manuelle." + "tipBody": "Les six options figurent dans installed_tools.json et Désinstaller les optimisations. La restauration retire les fichiers de configuration, l’unité et l’alias kexec, réécrit journald.conf avec les valeurs par défaut de systemd et rétablit logrotate.conf depuis sa sauvegarde. Certaines limites actives nécessitent une nouvelle session ou un redémarrage." }, "related": { "heading": "Voir aussi", diff --git a/web/messages/it/docs/post-install/automated.json b/web/messages/it/docs/post-install/automated.json index f6b19215..c41c700a 100644 --- a/web/messages/it/docs/post-install/automated.json +++ b/web/messages/it/docs/post-install/automated.json @@ -1,7 +1,7 @@ { "meta": { "title": "Script post-installazione automatizzato | Documentazione ProxMenux", - "description": "Lo script post-installazione automatizzato ProxMenux esegue 14 ottimizzazioni predefinite in base all’hardware su un nuovo host Proxmox VE. Non presenta una lista di funzioni da selezionare, ma può chiedere conferma per rimuovere l’avviso di abbonamento, alcune installazioni Log2RAM e il riavvio. Le modifiche reversibili vengono registrate.", + "description": "Lo script post-installazione automatizzato ProxMenux esegue 14 ottimizzazioni predefinite in base all’hardware su un nuovo host Proxmox VE. Non presenta una lista di funzioni da selezionare, ma può chiedere conferma per l’aggiornamento del sistema, la rimozione dell’avviso di abbonamento, alcune installazioni Log2RAM e il riavvio. Le modifiche reversibili vengono registrate.", "ogTitle": "Script post-installazione automatizzato | Documentazione ProxMenux", "ogDescription": "14 ottimizzazioni predefinite in base all’hardware per un nuovo host Proxmox VE, con conferme per alcune azioni e registrazione delle modifiche reversibili." }, diff --git a/web/messages/it/docs/post-install/network.json b/web/messages/it/docs/post-install/network.json index 2bef9365..0c988d22 100644 --- a/web/messages/it/docs/post-install/network.json +++ b/web/messages/it/docs/post-install/network.json @@ -83,13 +83,13 @@ "whyItems": [ "Aggiungere o rimuovere dispositivi PCIe può cambiare la numerazione del bus, trasformando enp3s0 in enp4s0. Se /etc/network/interfaces fa riferimento al vecchio nome, il bridge scompare al riavvio.", "Gli aggiornamenti BIOS o firmware a volte cambiano l’enumerazione dei dispositivi, con lo stesso effetto.", - "Lo script fissa i nomi delle schede fisiche, incluse le porte fisiche usate dai bond. Salta le interfacce virtuali, come veth LXC e i dispositivi bond stessi; non risolve le condizioni di gara nei nomi delle schede virtuali hotplug." + "Lo script scrive file .link per le schede fisiche, incluse le porte dei bond, con il MAC riportato da sysfs in quel momento; per le porte di un bond può essere il MAC condiviso del bond, quindi controllane i nomi dopo un riavvio. Salta le interfacce virtuali, come veth LXC e i dispositivi bond stessi; non risolve le condizioni di gara nei nomi delle schede virtuali hotplug." ], "writtenTitle": "Cosa si scrive", "writtenIntro": "Un file per NIC fisico, a /etc/systemd/network/10-proxmenux-<iface>.link. Ogni file inizia con l'intestazione # Managed by ProxMenux — do not edit così ProxMenux può distinguere i propri file da file .link forniti dall'utente o dal pacchetto.", "writtenOutro": "I file .link di altri pacchetti o scritti dall’utente vengono conservati; sono gestiti solo quelli con l’intestazione ProxMenux. A ogni esecuzione successiva la funzione verifica i propri file: rilegge MACAddress= da ogni 10-proxmenux-*.link ed elimina quelli la cui MAC non compare più in /sys/class/net/. I file delle versioni precedenti nel formato 10-<iface>.link vengono migrati automaticamente la prima volta.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "Lo script usa file systemd .link per i nomi persistenti. Su Proxmox VE 9 ricarica anche le regole udev dopo la scrittura, affinché le nuove schede possano usarle senza riavvio. Controlla le interfacce esistenti dopo un riavvio sia su PVE 8 sia su PVE 9. Questo non sostituisce ifupdown2 sull’host. In entrambi i casi lo script segnala la necessità di riavvio alla post-installazione personalizzabile.", + "pveBody": "Lo script usa file systemd .link per i nomi persistenti. Su Proxmox VE 9 ricarica anche le regole udev dopo la scrittura, affinché una scheda già fissata che viene ricollegata o rilevata di nuovo applichi la sua regola senza riavvio. Controlla le interfacce esistenti dopo un riavvio sia su PVE 8 sia su PVE 9. Questo non sostituisce ifupdown2 sull’host. In entrambi i casi lo script segnala la necessità di riavvio alla post-installazione personalizzabile.", "reviewTitle": "Controlla prima il file /etc/network/interfaces esistente", "reviewBody": "Se la configurazione precedente in /etc/network/interfaces usa nomi delle schede generati dal kernel, fissare quelli attuali è il risultato voluto. Se hai già adattato manualmente la configurazione a nomi specifici, verifica prima del riavvio che i nomi fissati corrispondano al file interfaces.", "revertTitle": "Reversibile dal menu Disinstalla", diff --git a/web/messages/it/docs/post-install/storage.json b/web/messages/it/docs/post-install/storage.json index d1ff207b..3ee9ca36 100644 --- a/web/messages/it/docs/post-install/storage.json +++ b/web/messages/it/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Ogni opzione si registra in installed_tools.json per Disinstalla ottimizzazioni. zfs_arc rimuove /etc/modprobe.d/99-zfsarc.conf e ricrea initramfs; zfs_auto_snapshot annulla la pianificazione cron e offre la rimozione completa del pacchetto; zfs_autotrim imposta autotrim=off sui pool che ha abilitato; vzdump_speed ripristina /etc/vzdump.conf dal .bak creato all’installazione.", "arc": { "heading": "Ottimizza dimensione ZFS ARC", - "intro": "La Adaptive Replacement Cache (ARC) è la cache di lettura ZFS in RAM. Le installazioni Proxmox VE dalla 8.1 impostano il 10% di RAM, massimo 16 GiB; host precedenti o aggiornati possono differire. Questa opzione scrive un proprio limite in base alla RAM. Controlla impostazioni e carico: una cache più piccola non è sempre più veloce.", + "intro": "La Adaptive Replacement Cache (ARC) è la cache di lettura ZFS in RAM. Le installazioni Proxmox VE dalla 8.1 impostano il 10% di RAM, massimo 16 GiB; host precedenti o aggiornati possono differire. Questa opzione scrive esplicitamente la stessa regola (RAM/10, massimo 16 GiB, minimo 64 MiB) in un proprio file, coprendo anche host precedenti o aggiornati. Controlla impostazioni e carico: una cache più piccola non è sempre più veloce.", "sizingTitle": "Regole di dimensionamento", "headerRam": "RAM dell'host", "headerMax": "Limite ARC", @@ -41,7 +41,7 @@ "max": "16 GiB (limite)" } ], - "after": "Il file /etc/modprobe.d/99-zfsarc.conf contiene solo options zfs zfs_arc_max=…. Gli altri parametri ZFS (zfs_arc_min, prelettura/limite scritture L2ARC, timeout TXG) non vengono regolati. Prima, una verifica cerca altri *.conf in /etc/modprobe.d/ che impostano zfs_arc_min / zfs_arc_max, li salva con manifesto in /usr/local/share/proxmenux/backups/zfs_arc/ ed elimina le righe in conflitto, lasciando attivo solo il file ARC ProxMenux. Poi update-initramfs -u -k all e, se necessario, proxmox-boot-tool refresh portano il limite nell’initramfs dei sistemi con root ZFS.", + "after": "Il file /etc/modprobe.d/99-zfsarc.conf contiene solo options zfs zfs_arc_max=…. Gli altri parametri ZFS (zfs_arc_min, prelettura/limite scritture L2ARC, timeout TXG) non vengono regolati. Prima, una verifica cerca altri *.conf in /etc/modprobe.d/ che impostano zfs_arc_min / zfs_arc_max, li salva con manifesto in /usr/local/share/proxmenux/backups/zfs_arc/ e ne rimuove i valori zfs_arc_min / zfs_arc_max in conflitto (le altre opzioni di quelle righe restano), così solo il file ARC ProxMenux imposta il limite. Poi update-initramfs -u -k all e, se necessario, proxmox-boot-tool refresh portano il limite nell’initramfs dei sistemi con root ZFS.", "rebootTitle": "Richiede un riavvio per prendere effetto", "rebootBody": "Le impostazioni ARC vengono lette caricando il modulo zfs. Per gli host con root ZFS, ProxMenux rigenera initramfs con update-initramfs -u -k all e aggiorna se necessario il bootloader con proxmox-boot-tool refresh. Il nuovo parametro richiede comunque un riavvio, segnalato automaticamente.", "safeTitle": "Sicuro su host non-ZFS", diff --git a/web/messages/it/docs/post-install/system.json b/web/messages/it/docs/post-install/system.json index a9779242..3e925bd7 100644 --- a/web/messages/it/docs/post-install/system.json +++ b/web/messages/it/docs/post-install/system.json @@ -103,7 +103,7 @@ "heading": "Verifica", "intro": "Dopo aver applicato le ottimizzazioni del sistema:", "tipTitle": "Ripristino e limiti", - "tipBody": "Le sei opzioni sono registrate in installed_tools.json e disponibili in Disinstalla ottimizzazioni. Il ripristino rimuove configurazioni, unità e alias kexec e ripristina journald/logrotate. Alcuni limiti attivi richiedono una nuova sessione o riavvio. Da /root/.profile viene rimosso solo il vecchio ulimit -n 256000; l’attuale ulimit -n 1048576 può restare e richiedere rimozione manuale." + "tipBody": "Le sei opzioni sono registrate in installed_tools.json e disponibili in Disinstalla ottimizzazioni. Il ripristino rimuove i file di configurazione, l’unità e l’alias kexec, riscrive journald.conf con i valori predefiniti di systemd e ripristina logrotate.conf dal backup. Alcuni limiti attivi richiedono una nuova sessione o un riavvio." }, "related": { "heading": "Correlati", diff --git a/web/messages/pt/docs/post-install/automated.json b/web/messages/pt/docs/post-install/automated.json index a1d329f5..96ad54ff 100644 --- a/web/messages/pt/docs/post-install/automated.json +++ b/web/messages/pt/docs/post-install/automated.json @@ -1,7 +1,7 @@ { "meta": { "title": "Script pós-instalação automatizado | Documentação ProxMenux", - "description": "O script pós-instalação automatizado ProxMenux executa 14 otimizações predefinidas adaptadas ao hardware num host Proxmox VE novo. Não tem lista de funções para selecionar, mas pode pedir confirmação para ocultar o aviso de subscrição, instalar Log2RAM em certos casos e reiniciar. As alterações reversíveis ficam registadas.", + "description": "O script pós-instalação automatizado ProxMenux executa 14 otimizações predefinidas adaptadas ao hardware num host Proxmox VE novo. Não tem lista de funções para selecionar, mas pode pedir confirmação para a atualização do sistema, para ocultar o aviso de subscrição, instalar Log2RAM em certos casos e reiniciar. As alterações reversíveis ficam registadas.", "ogTitle": "Script pós-instalação automatizado | Documentação ProxMenux", "ogDescription": "14 otimizações predefinidas adaptadas ao hardware para um host Proxmox VE novo, com confirmações para algumas ações e registo de alterações reversíveis." }, diff --git a/web/messages/pt/docs/post-install/network.json b/web/messages/pt/docs/post-install/network.json index 96a052e0..62519fc4 100644 --- a/web/messages/pt/docs/post-install/network.json +++ b/web/messages/pt/docs/post-install/network.json @@ -83,13 +83,13 @@ "whyItems": [ "Adicionar ou remover dispositivos PCIe pode mudar a numeração do barramento, transformando enp3s0 em enp4s0. Se /etc/network/interfaces mencionar o nome antigo, a ponte desaparece ao reiniciar.", "As atualizações de BIOS / firmware às vezes alteram como os dispositivos enumeram, com o mesmo efeito.", - "O script fixa os nomes das placas físicas, incluindo portas físicas usadas por bonds. Ignora interfaces virtuais, como veths LXC e os próprios dispositivos bond; não corrige condições de corrida nos nomes de placas virtuais hotplug." + "O script escreve ficheiros .link para as placas físicas, incluindo as portas dos bonds, com o MAC indicado pelo sysfs nesse momento; nas portas de um bond pode ser o MAC partilhado do bond, por isso verifique os nomes após reiniciar. Ignora interfaces virtuais, como veths LXC e os próprios dispositivos bond; não corrige condições de corrida nos nomes de placas virtuais hotplug." ], "writtenTitle": "O que é escrito", "writtenIntro": "Um ficheiro por NIC físico, em /etc/systemd/network/10-proxmenux-<iface>.link. Cada arquivo começa com o cabeçalho # Managed by ProxMenux — do not edit para que ProxMenux possa distinguir seus próprios arquivos de arquivos .link fornecidos pelo usuário ou pacote.", "writtenOutro": "Os ficheiros .link de outros pacotes ou escritos pelo utilizador são preservados; só os que têm o cabeçalho ProxMenux são geridos. Em cada nova execução, a função verifica os seus ficheiros: relê MACAddress= de cada 10-proxmenux-*.link e remove os que têm uma MAC ausente de /sys/class/net/. Os ficheiros de versões anteriores no formato 10-<iface>.link são migrados automaticamente na primeira execução.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "O script usa ficheiros systemd .link para os nomes persistentes. No Proxmox VE 9 também recarrega as regras udev após os escrever, para que novas placas possam usá-las sem reiniciar. Verifique as interfaces existentes após reiniciar tanto no PVE 8 como no PVE 9. Isto não substitui ifupdown2 no host. Em ambos os casos, o script assinala a necessidade de reinício na pós-instalação personalizável.", + "pveBody": "O script usa ficheiros systemd .link para os nomes persistentes. No Proxmox VE 9 também recarrega as regras udev após os escrever, para que uma placa já fixada que volte a ser ligada ou detetada aplique a sua regra sem reiniciar. Verifique as interfaces existentes após reiniciar tanto no PVE 8 como no PVE 9. Isto não substitui ifupdown2 no host. Em ambos os casos, o script assinala a necessidade de reinício na pós-instalação personalizável.", "reviewTitle": "Reveja primeiro o /etc/network/interfaces existente", "reviewBody": "Se a configuração antiga em /etc/network/interfaces usa nomes de placas gerados pelo kernel, fixar os nomes atuais é o resultado pretendido. Se já adaptou manualmente a configuração a nomes específicos, confirme antes de reiniciar que os nomes fixados correspondem ao ficheiro interfaces.", "revertTitle": "Reversível do menu Desinstalar", diff --git a/web/messages/pt/docs/post-install/storage.json b/web/messages/pt/docs/post-install/storage.json index 02ee48e7..c540d8a3 100644 --- a/web/messages/pt/docs/post-install/storage.json +++ b/web/messages/pt/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Cada uma dessas opções registra uma ferramenta em installed_tools.json, então eles aparecem em Otimizações de Uninstall. Reverter o zfs_arc remove o /etc/modprobe.d/99-zfsarc.conf e reconstrói o initramfs; o zfs_auto_snapshot reverte o cronograma do cron e oferece purgar o pacote; o zfs_autotrim configura o autotrim=off nos pools que ele ativou; o vzdump_speed restaura o /etc/vzdump.conf do .bak a instalação criada.", "arc": { "heading": "Otimizar o tamanho do ZFS ARC", - "intro": "A Adaptive Replacement Cache (ARC) é a cache de leitura ZFS em RAM. Instalações Proxmox VE desde 8.1 limitam a 10% da RAM, máximo 16 GiB; hosts antigos ou atualizados podem diferir. Esta opção escreve o seu próprio limite pela RAM. Verifique definições e carga: uma cache menor nem sempre é mais rápida.", + "intro": "A Adaptive Replacement Cache (ARC) é a cache de leitura ZFS em RAM. Instalações Proxmox VE desde 8.1 limitam a 10% da RAM, máximo 16 GiB; hosts antigos ou atualizados podem diferir. Esta opção escreve explicitamente essa mesma regra (RAM/10, máximo de 16 GiB, mínimo de 64 MiB) num ficheiro próprio, o que cobre também hosts antigos ou atualizados. Verifique definições e carga: uma cache menor nem sempre é mais rápida.", "sizingTitle": "Regras de dimensionamento", "headerRam": "RAM do host", "headerMax": "Limite ARC", @@ -41,7 +41,7 @@ "max": "16 GiB (limite)" } ], - "after": "O ficheiro /etc/modprobe.d/99-zfsarc.conf contém apenas options zfs zfs_arc_max=…. Os outros parâmetros ZFS (zfs_arc_min, pré-leitura/limite de escritas L2ARC, tempo limite TXG) não são ajustados. Antes, procura outros *.conf em /etc/modprobe.d/ com zfs_arc_min / zfs_arc_max, copia-os com manifesto para /usr/local/share/proxmenux/backups/zfs_arc/ e remove linhas em conflito, deixando ativo só o ficheiro ARC ProxMenux. Depois, update-initramfs -u -k all e, quando aplicável, proxmox-boot-tool refresh integram o limite no initramfs dos sistemas com raiz ZFS.", + "after": "O ficheiro /etc/modprobe.d/99-zfsarc.conf contém apenas options zfs zfs_arc_max=…. Os outros parâmetros ZFS (zfs_arc_min, pré-leitura/limite de escritas L2ARC, tempo limite TXG) não são ajustados. Antes, procura outros *.conf em /etc/modprobe.d/ com zfs_arc_min / zfs_arc_max, copia-os com manifesto para /usr/local/share/proxmenux/backups/zfs_arc/ e remove deles os valores zfs_arc_min / zfs_arc_max em conflito (as outras opções dessas linhas mantêm-se), para que só o ficheiro ARC ProxMenux defina o limite. Depois, update-initramfs -u -k all e, quando aplicável, proxmox-boot-tool refresh integram o limite no initramfs dos sistemas com raiz ZFS.", "rebootTitle": "Requer uma reinicialização para fazer efeito", "rebootBody": "As definições ARC são lidas ao carregar o módulo zfs. Para hosts com raiz ZFS, ProxMenux regenera initramfs com update-initramfs -u -k all e atualiza o carregador quando necessário com proxmox-boot-tool refresh. O novo parâmetro continua a exigir reinício, assinalado automaticamente.", "safeTitle": "Seguro em hosts não-ZFS", diff --git a/web/messages/pt/docs/post-install/system.json b/web/messages/pt/docs/post-install/system.json index f8897d55..5165d20b 100644 --- a/web/messages/pt/docs/post-install/system.json +++ b/web/messages/pt/docs/post-install/system.json @@ -103,7 +103,7 @@ "heading": "Verificação", "intro": "Após a aplicação das otimizações do sistema:", "tipTitle": "Restauro e limitações", - "tipBody": "As seis opções ficam em installed_tools.json e Desinstalar otimizações. O restauro remove configurações, unidade e alias kexec e repõe journald/logrotate. Alguns limites ativos precisam de nova sessão ou reinício. A limpeza de /root/.profile só remove o antigo ulimit -n 256000; o atual ulimit -n 1048576 pode permanecer e exigir remoção manual." + "tipBody": "As seis opções ficam em installed_tools.json e Desinstalar otimizações. O restauro remove os ficheiros de configuração, a unidade e o alias kexec, reescreve journald.conf com os valores predefinidos do systemd e repõe logrotate.conf a partir da cópia de segurança. Alguns limites ativos precisam de nova sessão ou reinício." }, "related": { "heading": "Relacionado", diff --git a/web/messages/sk/docs/post-install/automated.json b/web/messages/sk/docs/post-install/automated.json index 6a2b395f..39289025 100644 --- a/web/messages/sk/docs/post-install/automated.json +++ b/web/messages/sk/docs/post-install/automated.json @@ -1,7 +1,7 @@ { "meta": { "title": "Automatický skript po inštalácii | Dokumentácia ProxMenux", - "description": "Automatický skript ProxMenux po inštalácii vykoná na novom hostiteľovi Proxmox VE 14 vopred určených optimalizácií podľa hardvéru. Nemá zoznam funkcií na výber, no môže žiadať potvrdenie odstránenia upozornenia na predplatné, niektorých inštalácií Log2RAM a reštartu. Vratné zmeny sa zaznamenajú na neskoršiu obnovu.", + "description": "Automatický skript ProxMenux po inštalácii vykoná na novom hostiteľovi Proxmox VE 14 vopred určených optimalizácií podľa hardvéru. Nemá zoznam funkcií na výber, no môže žiadať potvrdenie aktualizácie systému, odstránenia upozornenia na predplatné, niektorých inštalácií Log2RAM a reštartu. Vratné zmeny sa zaznamenajú na neskoršiu obnovu.", "ogTitle": "Automatický skript po inštalácii | Dokumentácia ProxMenux", "ogDescription": "14 vopred určených optimalizácií podľa hardvéru pre nový hostiteľ Proxmox VE, s potvrdením niektorých krokov a záznamom vratných zmien." }, diff --git a/web/messages/sk/docs/post-install/network.json b/web/messages/sk/docs/post-install/network.json index fe3b8af4..9a3cfe8a 100644 --- a/web/messages/sk/docs/post-install/network.json +++ b/web/messages/sk/docs/post-install/network.json @@ -83,13 +83,13 @@ "whyItems": [ "Pridanie alebo odstránenie zariadení PCIe môže zmeniť číslovanie zbernice a premenovať enp3s0 na enp4s0. Ak /etc/network/interfaces odkazuje na starý názov, most po reštarte zmizne.", "BIOS / Aktualizácie firmvéru niekedy menia spôsob, akým zariadenia enumerujú, s rovnakým účinkom.", - "Pomocný skript pevne priraďuje názvy fyzických kariet vrátane fyzických portov bondov. Vynecháva virtuálne rozhrania, napríklad LXC veth a samotné bondy; nerieši súbehy pri pomenovaní virtuálnych kariet hotplug." + "Pomocný skript zapisuje súbory .link pre fyzické karty vrátane portov bondov, s MAC adresou, ktorú práve hlási sysfs; pri portoch bondu to môže byť spoločná MAC bondu, preto ich názvy po reštarte skontrolujte. Vynecháva virtuálne rozhrania, napríklad LXC veth a samotné bondy; nerieši súbehy pri pomenovaní virtuálnych kariet hotplug." ], "writtenTitle": "Čo sa napíše", "writtenIntro": "Jeden súbor pre každú fyzickú kartu v /etc/systemd/network/10-proxmenux-<iface>.link. Začína hlavičkou # Managed by ProxMenux — do not edit, aby ProxMenux rozlíšil vlastné súbory od súborov .link používateľa alebo iných balíkov.", "writtenOutro": "Súbory .link iných balíkov alebo používateľa zostávajú zachované; spravujú sa iba súbory s hlavičkou ProxMenux. Pri opakovanom spustení funkcia skontroluje svoje súbory: z každého 10-proxmenux-*.link znovu načíta MACAddress= a odstráni tie, ktorých MAC sa už nenachádza v /sys/class/net/. Súbory starších verzií vo formáte 10-<iface>.link sa pri prvom spustení automaticky migrujú.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "Skript používa súbory systemd .link pre trvalé názvy. V Proxmox VE 9 po ich zápise navyše načíta pravidlá udev, aby ich novo pridané karty mohli použiť bez reštartu. Existujúce rozhrania skontrolujte po reštarte v PVE 8 aj PVE 9. Nemení sa tým používanie ifupdown2 na hostiteľovi. Skript v oboch prípadoch nastaví príznak reštartu, aby sa naň prispôsobiteľné nastavenie opýtalo.", + "pveBody": "Skript používa súbory systemd .link pre trvalé názvy. V Proxmox VE 9 po ich zápise navyše načíta pravidlá udev, aby už pripnutá karta, ktorá sa znova pripojí alebo rozpozná, použila svoje pravidlo bez reštartu. Existujúce rozhrania skontrolujte po reštarte v PVE 8 aj PVE 9. Nemení sa tým používanie ifupdown2 na hostiteľovi. Skript v oboch prípadoch nastaví príznak reštartu, aby sa naň prispôsobiteľné nastavenie opýtalo.", "reviewTitle": "Najprv skontrolujte existujúci /etc/network/interfaces", "reviewBody": "Ak staršia konfigurácia v /etc/network/interfaces odkazuje na názvy kariet vytvorené jadrom, pevné priradenie aktuálnych názvov je správny výsledok. Ak ste už konfiguráciu ručne prispôsobili konkrétnym názvom, pred reštartom overte, že pevné názvy zodpovedajú súboru interfaces.", "revertTitle": "Reverzibilné z menu Odinštalovať", diff --git a/web/messages/sk/docs/post-install/storage.json b/web/messages/sk/docs/post-install/storage.json index 6b9180a4..5a3a2440 100644 --- a/web/messages/sk/docs/post-install/storage.json +++ b/web/messages/sk/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Každá z týchto možností zaregistruje nástroj v installed_tools.json, takže sa zobrazí v časti Odstrániť optimalizácie. Vrátenie zfs_arc odstráni /etc/modprobe.d/99-zfsarc.conf a znovu vytvorí initramfs. zfs_auto_snapshot zruší plán cron a ponúkne úplné odstránenie balíka; zfs_autotrim nastaví autotrim=off v pooloch, v ktorých ho zaplo; vzdump_speed obnoví /etc/vzdump.conf zo súboru .bak vytvoreného pri inštalácii.", "arc": { "heading": "Optimalizovať veľkosť ZFS ARC", - "intro": "Adaptive Replacement Cache (ARC) je čítacia cache ZFS v RAM. Inštalácie Proxmox VE od 8.1 nastavujú 10% RAM, najviac 16 GiB; staršie alebo aktualizované hostitele sa môžu líšiť. Táto možnosť zapíše vlastný limit podľa RAM. Skontrolujte existujúce nastavenia a záťaž: menšia cache nie je vždy rýchlejšia.", + "intro": "Adaptive Replacement Cache (ARC) je čítacia cache ZFS v RAM. Inštalácie Proxmox VE od 8.1 nastavujú 10% RAM, najviac 16 GiB; staršie alebo aktualizované hostitele sa môžu líšiť. Táto možnosť zapíše rovnaké pravidlo výslovne (RAM/10, najviac 16 GiB, najmenej 64 MiB) do vlastného súboru, čím pokryje aj staršie alebo aktualizované hostitele. Skontrolujte existujúce nastavenia a záťaž: menšia cache nie je vždy rýchlejšia.", "sizingTitle": "Pravidlá veľkosti", "headerRam": "RAM hostiteľa", "headerMax": "Limit ARC", @@ -41,7 +41,7 @@ "max": "16 GiB (limit)" } ], - "after": "Súbor /etc/modprobe.d/99-zfsarc.conf obsahuje iba options zfs zfs_arc_max=…. Ostatné parametre ZFS (zfs_arc_min, prednačítanie/obmedzenie zápisov L2ARC, časový limit TXG) sa neladia. Pred zápisom kontrola nájde iné *.conf v /etc/modprobe.d/ s zfs_arc_min / zfs_arc_max, zálohuje ich s manifestom do /usr/local/share/proxmenux/backups/zfs_arc/ a odstráni konfliktné riadky, aby zostal aktívny iba súbor ARC ProxMenux. Potom update-initramfs -u -k all a podľa potreby proxmox-boot-tool refresh začlenia limit do initramfs systémov s koreňom na ZFS.", + "after": "Súbor /etc/modprobe.d/99-zfsarc.conf obsahuje iba options zfs zfs_arc_max=…. Ostatné parametre ZFS (zfs_arc_min, prednačítanie/obmedzenie zápisov L2ARC, časový limit TXG) sa neladia. Pred zápisom kontrola nájde iné *.conf v /etc/modprobe.d/ s zfs_arc_min / zfs_arc_max, zálohuje ich s manifestom do /usr/local/share/proxmenux/backups/zfs_arc/ a odstráni z nich konfliktné hodnoty zfs_arc_min / zfs_arc_max (ostatné voľby v týchto riadkoch zostanú), aby limit určoval iba súbor ARC ProxMenux. Potom update-initramfs -u -k all a podľa potreby proxmox-boot-tool refresh začlenia limit do initramfs systémov s koreňom na ZFS.", "rebootTitle": "Prejaví sa po reštarte", "rebootBody": "Nastavenia ARC sa čítajú pri načítaní modulu zfs. Pre hostiteľov s koreňom na ZFS ProxMenux znovu vytvorí initramfs cez update-initramfs -u -k all a podľa potreby obnoví zavádzač cez proxmox-boot-tool refresh. Nový parameter stále vyžaduje reštart; príznak potreby reštartu sa nastaví automaticky.", "safeTitle": "Bezpečné na hostiteľoch bez ZFS", diff --git a/web/messages/sk/docs/post-install/system.json b/web/messages/sk/docs/post-install/system.json index 47ae01bf..21a7bf3f 100644 --- a/web/messages/sk/docs/post-install/system.json +++ b/web/messages/sk/docs/post-install/system.json @@ -103,7 +103,7 @@ "heading": "Overenie", "intro": "Po uplatnení optimalizácie systému:", "tipTitle": "Obnova a obmedzenia", - "tipBody": "Všetkých šesť možností je v installed_tools.json a Odinštalovať optimalizácie. Obnova odstráni konfiguračné súbory, jednotku a alias kexec a obnoví journald/logrotate. Niektoré aktívne limity vyžadujú novú reláciu alebo reštart. Z /root/.profile sa odstráni iba starý ulimit -n 256000; aktuálny ulimit -n 1048576 môže zostať a vyžadovať ručné odstránenie." + "tipBody": "Všetkých šesť možností je v installed_tools.json a Odinštalovať optimalizácie. Obnova odstráni konfiguračné súbory, jednotku a alias kexec, prepíše journald.conf predvolenými hodnotami systemd a obnoví logrotate.conf zo zálohy. Niektoré aktívne limity vyžadujú novú reláciu alebo reštart." }, "related": { "heading": "Súvisiace", diff --git a/web/messages/sv/docs/post-install/automated.json b/web/messages/sv/docs/post-install/automated.json index 02fbc2ca..c3fc9aa6 100644 --- a/web/messages/sv/docs/post-install/automated.json +++ b/web/messages/sv/docs/post-install/automated.json @@ -1,7 +1,7 @@ { "meta": { "title": "Automatiserat efterinstallationsskript | ProxMenux Dokumentation", - "description": "ProxMenux automatiserade efterinstallationsskript kör 14 förvalda optimeringar anpassade efter hårdvaran på en ny Proxmox VE-värd. Det saknar checklista för funktionsval men kan be om bekräftelse för prenumerationsvarningen, vissa Log2RAM-installationer och omstart. Återställbara konfigurationsändringar registreras.", + "description": "ProxMenux automatiserade efterinstallationsskript kör 14 förvalda optimeringar anpassade efter hårdvaran på en ny Proxmox VE-värd. Det saknar checklista för funktionsval men kan be om bekräftelse för systemuppdateringen, prenumerationsvarningen, vissa Log2RAM-installationer och omstart. Återställbara konfigurationsändringar registreras.", "ogTitle": "Automatiserat efterinstallationsskript | ProxMenux Dokumentation", "ogDescription": "14 fasta, hårdvaruanpassade optimeringar för en ny Proxmox VE-värd, med bekräftelse för vissa åtgärder och registrering av återställbara ändringar." }, diff --git a/web/messages/sv/docs/post-install/network.json b/web/messages/sv/docs/post-install/network.json index 72858184..1f8bf807 100644 --- a/web/messages/sv/docs/post-install/network.json +++ b/web/messages/sv/docs/post-install/network.json @@ -83,13 +83,13 @@ "whyItems": [ "Lägga till eller ta bort PCIe-enheter kan flytta bussnumret, vända enp3s0 till enp4s0. Om din /etc/network/interfaces refererar till det gamla namnet försvinner bron på omstart.", "BIOS / firmwareuppdateringar ändrar ibland hur enheterna räknas, med samma effekt.", - "Hjälpskriptet binder fysiska nätverkskorts namn, även fysiska portar som används av bond-gränssnitt. Det hoppar över virtuella gränssnitt som LXC-veth och bond-enheterna själva; det löser inte kapplöpningar vid namngivning av virtuella hotplug-kort." + "Hjälpskriptet skriver .link-filer för fysiska nätverkskort, även bond-portar, med den MAC som sysfs rapporterar just då; för bond-portar kan det vara bondens gemensamma MAC, så kontrollera deras namn efter en omstart. Det hoppar över virtuella gränssnitt som LXC-veth och bond-enheterna själva; det löser inte kapplöpningar vid namngivning av virtuella hotplug-kort." ], "writtenTitle": "Vad blir skrivet", "writtenIntro": "En fil per fysisk NIC, på /etc/systemd/network/10-proxmenux-<iface>.link. Varje fil börjar med rubriken # Managed by ProxMenux — do not edit så att ProxMenux kan skilja sina egna filer från användar- eller pakettillhandahållna .link-filer.", "writtenOutro": ".link-filer från andra paket eller användaren bevaras; endast filer med ProxMenux-rubriken hanteras. Vid nästa körning stämmer funktionen av sina filer: den läser MACAddress= från varje 10-proxmenux-*.link och tar bort filer vars MAC inte längre finns under /sys/class/net/. Filer från äldre ProxMenux-versioner i formatet 10-<iface>.link migreras automatiskt första gången.", "pveTitle": "PVE 9 vs PVE 8", - "pveBody": "Skriptet använder systemd-.link-filer för beständiga namn. På Proxmox VE 9 laddar det även om udev-regler efter skrivningen, så att nya nätverkskort kan använda dem utan omstart. Kontrollera befintliga gränssnitt efter en omstart på både PVE 8 och PVE 9. Detta ersätter inte ifupdown2 på värden. Skriptet sätter omstartsflaggan i båda fallen så att den anpassningsbara efterinstallationen frågar om omstart.", + "pveBody": "Skriptet använder systemd-.link-filer för beständiga namn. På Proxmox VE 9 laddar det även om udev-regler efter skrivningen, så att ett redan fastlåst nätverkskort som ansluts eller identifieras på nytt kan använda sin regel utan omstart. Kontrollera befintliga gränssnitt efter en omstart på både PVE 8 och PVE 9. Detta ersätter inte ifupdown2 på värden. Skriptet sätter omstartsflaggan i båda fallen så att den anpassningsbara efterinstallationen frågar om omstart.", "reviewTitle": "Granska befintlig /etc/network/interfaces först", "reviewBody": "Om äldre konfiguration i /etc/network/interfaces använder nätverkskortsnamn som kärnan skapar automatiskt är det rätt att binda dagens namn. Om du redan har anpassat konfigurationen till vissa namn, kontrollera före omstart att bindningarna matchar vad interfaces-filen förväntar sig.", "revertTitle": "Kan återställas via avinstallationsmenyn", diff --git a/web/messages/sv/docs/post-install/storage.json b/web/messages/sv/docs/post-install/storage.json index 99101af4..73af8a1c 100644 --- a/web/messages/sv/docs/post-install/storage.json +++ b/web/messages/sv/docs/post-install/storage.json @@ -15,7 +15,7 @@ "trackedBody": "Varje alternativ registreras i installed_tools.json för Avinstallera optimeringar. Återställning av zfs_arc tar bort /etc/modprobe.d/99-zfsarc.conf och bygger om initramfs; zfs_auto_snapshot tar bort cron-schemat och erbjuder paketrensning; zfs_autotrim sätter autotrim=off på pooler det aktiverat; vzdump_speed återställer /etc/vzdump.conf från installationens .bak.", "arc": { "heading": "Optimera ZFS ARC-storlek", - "intro": "Adaptive Replacement Cache (ARC) är ZFS läscache i RAM. Proxmox VE-installationer från 8.1 sätter 10% av RAM, högst 16 GiB; äldre eller uppgraderade värdar kan skilja sig. Alternativet skriver en egen RAM-baserad gräns. Granska befintliga inställningar och arbetslast; en mindre cache är inte alltid snabbare.", + "intro": "Adaptive Replacement Cache (ARC) är ZFS läscache i RAM. Proxmox VE-installationer från 8.1 sätter 10% av RAM, högst 16 GiB; äldre eller uppgraderade värdar kan skilja sig. Alternativet skriver samma regel uttryckligen (RAM/10, högst 16 GiB, minst 64 MiB) till en egen fil, vilket även täcker äldre eller uppgraderade värdar. Granska befintliga inställningar och arbetslast; en mindre cache är inte alltid snabbare.", "sizingTitle": "Storleksregler", "headerRam": "Värdens RAM", "headerMax": "ARC-gräns", @@ -41,7 +41,7 @@ "max": "16 GiB (gräns)" } ], - "after": "Filen /etc/modprobe.d/99-zfsarc.conf innehåller bara options zfs zfs_arc_max=…. Övriga ZFS-parametrar (zfs_arc_min, L2ARC-förhämtning/skrivbegränsning, TXG-timeout) justeras inte. Först söks andra *.conf i /etc/modprobe.d/ efter zfs_arc_min / zfs_arc_max. De säkerhetskopieras med manifest till /usr/local/share/proxmenux/backups/zfs_arc/ och motstridiga rader tas bort så bara ProxMenux ARC-fil är aktiv. Sedan körs update-initramfs -u -k all och vid behov proxmox-boot-tool refresh så gränsen når initramfs för system med ZFS-rot.", + "after": "Filen /etc/modprobe.d/99-zfsarc.conf innehåller bara options zfs zfs_arc_max=…. Övriga ZFS-parametrar (zfs_arc_min, L2ARC-förhämtning/skrivbegränsning, TXG-timeout) justeras inte. Först söks andra *.conf i /etc/modprobe.d/ efter zfs_arc_min / zfs_arc_max. De säkerhetskopieras med manifest till /usr/local/share/proxmenux/backups/zfs_arc/ och de motstridiga värdena zfs_arc_min / zfs_arc_max tas bort (övriga alternativ på de raderna behålls) så att bara ProxMenux ARC-fil sätter gränsen. Sedan körs update-initramfs -u -k all och vid behov proxmox-boot-tool refresh så gränsen når initramfs för system med ZFS-rot.", "rebootTitle": "Kräver en omstart för att träda i kraft", "rebootBody": "ARC-inställningar läses när kärnmodulen zfs laddas. För ZFS-rotvärdar bygger ProxMenux om initramfs med update-initramfs -u -k all och uppdaterar vid behov starthanteraren med proxmox-boot-tool refresh. Den nya parametern kräver fortfarande omstart; omstartsflaggan sätts automatiskt.", "safeTitle": "Säker på icke-ZFS värdar", diff --git a/web/messages/sv/docs/post-install/system.json b/web/messages/sv/docs/post-install/system.json index 08a8e81d..b7461b07 100644 --- a/web/messages/sv/docs/post-install/system.json +++ b/web/messages/sv/docs/post-install/system.json @@ -103,7 +103,7 @@ "heading": "Verifiering", "intro": "Efter att ha tillämpat systemoptimeringarna:", "tipTitle": "Återställning och begränsningar", - "tipBody": "Alla sex alternativ finns i installed_tools.json och Avinstallera optimeringar. Återställningen tar bort konfigurationsfiler, kexec-enhet och alias och återställer journald/logrotate. Vissa aktiva gränser kräver ny session eller omstart. Bara äldre ulimit -n 256000 tas bort ur /root/.profile; nuvarande ulimit -n 1048576 kan bli kvar och behöva tas bort manuellt." + "tipBody": "Alla sex alternativ finns i installed_tools.json och Avinstallera optimeringar. Återställningen tar bort konfigurationsfilerna, kexec-enheten och aliaset, skriver om journald.conf med systemds standardvärden och återställer logrotate.conf från säkerhetskopian. Vissa aktiva gränser kräver ny session eller omstart." }, "related": { "heading": "Relaterat", From 7a6a6f93dca1263916fff572c5fe69347cc4639a Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:58:15 +0200 Subject: [PATCH 67/73] Describe the backup and restore behaviour as the scripts run it - BORG_RSH, the Borg SSH wizard and attached jobs match the code - Restore path classes name the right examples and when each path is written --- web/messages/de/docs/backup-restore/destinations/borg.json | 4 ++-- web/messages/de/docs/backup-restore/glossary.json | 2 +- web/messages/de/docs/backup-restore/restoring.json | 4 ++-- web/messages/en/docs/backup-restore/destinations/borg.json | 4 ++-- web/messages/en/docs/backup-restore/glossary.json | 2 +- web/messages/en/docs/backup-restore/restoring.json | 4 ++-- web/messages/es/docs/backup-restore/destinations/borg.json | 4 ++-- web/messages/es/docs/backup-restore/glossary.json | 2 +- web/messages/es/docs/backup-restore/restoring.json | 4 ++-- web/messages/fr/docs/backup-restore/destinations/borg.json | 4 ++-- web/messages/fr/docs/backup-restore/glossary.json | 2 +- web/messages/fr/docs/backup-restore/restoring.json | 4 ++-- web/messages/it/docs/backup-restore/destinations/borg.json | 4 ++-- web/messages/it/docs/backup-restore/glossary.json | 2 +- web/messages/it/docs/backup-restore/restoring.json | 4 ++-- web/messages/pt/docs/backup-restore/destinations/borg.json | 4 ++-- web/messages/pt/docs/backup-restore/glossary.json | 2 +- web/messages/pt/docs/backup-restore/restoring.json | 4 ++-- web/messages/sk/docs/backup-restore/destinations/borg.json | 4 ++-- web/messages/sk/docs/backup-restore/glossary.json | 2 +- web/messages/sk/docs/backup-restore/restoring.json | 4 ++-- web/messages/sv/docs/backup-restore/destinations/borg.json | 4 ++-- web/messages/sv/docs/backup-restore/glossary.json | 2 +- web/messages/sv/docs/backup-restore/restoring.json | 4 ++-- 24 files changed, 40 insertions(+), 40 deletions(-) diff --git a/web/messages/de/docs/backup-restore/destinations/borg.json b/web/messages/de/docs/backup-restore/destinations/borg.json index 6b523e64..1f4fea6f 100644 --- a/web/messages/de/docs/backup-restore/destinations/borg.json +++ b/web/messages/de/docs/backup-restore/destinations/borg.json @@ -107,7 +107,7 @@ "heading": "SSH-Authentifizierung (Clientseite)", "intro": "Remote-Borg-Repositories sind über SSH zugänglich. Die Verbindung läuft vom ProxMenux-Host zu einem Benutzerkonto auf dem Borg-Server, auf dem borg serve ausgeführt wird. Dieser Benutzer heißt normalerweise borg, NICHT der Admin / Root-Benutzer des Servers - die Befehlszeile borg-serve sperrt die Verbindung zu diesem spezifischen Repository-Pfad (siehe die wichtigsten Strategien unten).", "strategiesTitle": "SSH-Schlüsselstrategien", - "strategiesIntro": "Beim Hinzufügen eines entfernten Ziels fragt ProxMenux nach SSH-Benutzer, Host und entferntem Pfad und bietet vier Anmeldeoptionen. Wird die Passwortanmeldung abgewiesen, steht zusätzlich generate-pct zur Wahl. Die Modi sind unten beschrieben:", + "strategiesIntro": "Beim Hinzufügen eines entfernten Ziels fragt ProxMenux nach SSH-Benutzer, Host, Port und entferntem Pfad und bietet vier Anmeldeoptionen. Wird die Passwortanmeldung abgewiesen, steht zusätzlich generate-pct zur Wahl. Die Modi sind unten beschrieben:", "strategyRows": [ { "mode": "generate-auto", @@ -166,7 +166,7 @@ { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", - "purpose": "Remote-Shell-Befehl für Borg-Repositories über SSH. Ein gewählter Schlüssel ergänzt die Identitätsoptionen, ein abweichender Port ergänzt -p PORT. Ohne eigenen Schlüssel und mit Standardport bleibt die Variable ungesetzt; Borg nutzt dann die SSH-Vorgaben des Hosts." + "purpose": "Remote-Shell-Befehl für Borg-Repositories über SSH. Ein gewählter Schlüssel ergänzt die Identitätsoptionen. Wird ein Ziel erstmals mit einem abweichenden Port hinzugefügt, ergänzt ProxMenux zusätzlich -p PORT; gespeicherte Ziele, geplante Aufträge und der Monitor verwenden stattdessen den Port aus der ssh://-URL. Ohne eigenen Schlüssel und bei einem neuen Ziel mit Standardport bleibt die Variable ungesetzt; Borg nutzt dann die SSH-Vorgaben des Hosts." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/de/docs/backup-restore/glossary.json b/web/messages/de/docs/backup-restore/glossary.json index 321c6e68..32a4be40 100644 --- a/web/messages/de/docs/backup-restore/glossary.json +++ b/web/messages/de/docs/backup-restore/glossary.json @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Anhängemodus", - "def": "Auftrag ohne eigenen Timer. Ein job-end-Hook von PVE-vzdump startet ihn nach Gastsicherungen bei passendem Zielspeicher. Der gewählte Elternauftrag liefert Speicher und anfängliche Aufbewahrung; der Hook vergleicht aber Speicher statt Auftrags-ID. Auch andere Aufgaben desselben Speichers können ihn auslösen. Nur Local und PBS." + "def": "Auftrag ohne eigenen Timer. Ein job-end-Hook von PVE-vzdump startet ihn nach Gastsicherungen bei passendem Zielspeicher. Der gewählte Elternauftrag liefert Speicher und Aufbewahrung, die bei jedem Lauf erneut aus dem Elternauftrag gelesen wird; der Hook vergleicht aber Speicher statt Auftrags-ID. Auch andere Aufgaben desselben Speichers können ihn auslösen. Nur Local und PBS." }, { "id": "timer-systemd", diff --git a/web/messages/de/docs/backup-restore/restoring.json b/web/messages/de/docs/backup-restore/restoring.json index d7e11a92..0804b2dd 100644 --- a/web/messages/de/docs/backup-restore/restoring.json +++ b/web/messages/de/docs/backup-restore/restoring.json @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Pfade, die dieser Ablauf für den nächsten Start zurückstellt, statt sie sofort anzuwenden. Sie betreffen die Startkonfiguration: Die Bootloader-Erzeugung liest /etc/default/grub, das Einhängen nutzt /etc/fstab und das Laden von Modulen /etc/modules. Nach dem Neustart werden die vorgemerkten Dateien angewendet und die nötigen Startartefakte neu erzeugt. Beispiele: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Pfade, die dieser Ablauf für den nächsten Start zurückstellt, statt sie sofort anzuwenden. Sie betreffen die Startkonfiguration: Die Bootloader-Erzeugung liest /etc/default/grub, das Einhängen nutzt /etc/fstab und das Laden von Modulen /etc/modules. Nach dem Neustart werden die vorgemerkten Dateien angewendet und die nötigen Startartefakte neu erzeugt. Beispiele: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/modprobe.d." }, { "class": "dangerous", - "detail": "Pfade, die NICHT im laufenden System wiederhergestellt werden: Ein Schreibzugriff könnte dort den Zustand beschädigen oder die aktive Verbindung unterbrechen. Sie werden vorgemerkt und nach dem Neustart vom Post-Boot-Dispatcher geschrieben, wenn der Cluster verfügbar ist, das System aber noch nicht vollständig genutzt wird. Beispiele sind /etc/pve (pmxcfs ist ein aktiver FUSE-Mount mit laufender Clusterkonfiguration), /var/lib/pve-cluster (aktive Clusterdaten) und /etc/network (könnte die für die SSH-Verbindung verwendete Schnittstelle neu konfigurieren und dadurch die Sitzung trennen)." + "detail": "Pfade, die NICHT im laufenden System angewendet werden: Ein Schreibzugriff zur Laufzeit könnte den Zustand beschädigen oder die aktive Verbindung trennen. Sie werden vorgemerkt: /etc/network wird früh beim nächsten Start geschrieben, bevor das Netzwerk startet, und /etc/pve schreibt der Post-Boot-Dispatcher, sobald das Cluster-Dateisystem bereit ist. Beispiele: /etc/pve (pmxcfs ist ein aktiver FUSE-Mount mit laufender Clusterkonfiguration), /var/lib/pve-cluster (aktive Clusterdaten, nur zur manuellen Wiederherstellung im Wiederherstellungsverzeichnis abgelegt), /etc/network (könnte die für die SSH-Verbindung genutzte Schnittstelle neu konfigurieren und die Sitzung trennen)." } ] }, diff --git a/web/messages/en/docs/backup-restore/destinations/borg.json b/web/messages/en/docs/backup-restore/destinations/borg.json index bb2a1e0e..bebe8813 100644 --- a/web/messages/en/docs/backup-restore/destinations/borg.json +++ b/web/messages/en/docs/backup-restore/destinations/borg.json @@ -107,7 +107,7 @@ "heading": "SSH authentication (client side)", "intro": "Remote Borg repositories are accessed over SSH. The connection runs from the ProxMenux host to a user account on the Borg server that runs borg serve. This user is typically named borg, NOT the admin/root user of the server — the borg-serve command line locks the connection to that specific repository path (see the key strategies below).", "strategiesTitle": "SSH key strategies", - "strategiesIntro": "When a remote target is added, ProxMenux asks for the SSH user, host and remote path, then offers four authentication choices. The additional generate-pct path is offered when password authentication is refused. The modes are described below:", + "strategiesIntro": "When a remote target is added, ProxMenux asks for the SSH user, host, port and remote path, then offers four authentication choices. The additional generate-pct path is offered when password authentication is refused. The modes are described below:", "strategyRows": [ { "mode": "generate-auto", @@ -166,7 +166,7 @@ { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", - "purpose": "The remote-shell command Borg uses for SSH repositories. A selected key adds the identity options; a non-default port adds -p PORT. With no custom key and the default port, the variable is unset so Borg uses the host’s default SSH configuration." + "purpose": "The remote-shell command Borg uses for SSH repositories. A selected key adds the identity options. When a target is first added with a non-default port, ProxMenux also appends -p PORT; saved targets, scheduled jobs and the Monitor rely on the port in the ssh:// URL instead. Without a custom key, and for a newly added target with the default port, the variable is unset so Borg uses the host’s default SSH configuration." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/en/docs/backup-restore/glossary.json b/web/messages/en/docs/backup-restore/glossary.json index aca09d0a..35974d12 100644 --- a/web/messages/en/docs/backup-restore/glossary.json +++ b/web/messages/en/docs/backup-restore/glossary.json @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Attach mode", - "def": "Job without its own timer. A PVE vzdump job-end hook triggers it after guest backups when the destination storage matches. The selected parent supplies storage and initial retention, but the hook matches storage rather than parent job ID; another task using that storage may also trigger it. Supported for Local and PBS only." + "def": "Job without its own timer. A PVE vzdump job-end hook triggers it after guest backups when the destination storage matches. The selected parent supplies the storage and the retention, which is re-read from the parent job on every run, but the hook matches storage rather than parent job ID; another task using that storage may also trigger it. Supported for Local and PBS only." }, { "id": "timer-systemd", diff --git a/web/messages/en/docs/backup-restore/restoring.json b/web/messages/en/docs/backup-restore/restoring.json index c64b6652..cd16d81a 100644 --- a/web/messages/en/docs/backup-restore/restoring.json +++ b/web/messages/en/docs/backup-restore/restoring.json @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Paths deferred to the next boot, rather than applied immediately by this restore flow. They affect boot-time configuration: bootloader generation reads /etc/default/grub, filesystem mounting uses /etc/fstab, and module loading uses /etc/modules. The pending files are applied after reboot and the required boot artifacts are then regenerated. Examples: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Paths deferred to the next boot, rather than applied immediately by this restore flow. They affect boot-time configuration: bootloader generation reads /etc/default/grub, filesystem mounting uses /etc/fstab, and module loading uses /etc/modules. The pending files are applied after reboot and the required boot artifacts are then regenerated. Examples: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/modprobe.d." }, { "class": "dangerous", - "detail": "Paths that are NOT applied on the running system — a live write could corrupt state or drop the active connection. These are staged in the pending set and written by the post-boot dispatcher after the reboot, when the cluster is up but the system is not yet fully in use. Examples: /etc/pve (pmxcfs is a live FUSE mount holding active cluster configuration), /var/lib/pve-cluster (live cluster data), /etc/network (could reconfigure the very interface the user is connected on over SSH and drop the session)." + "detail": "Paths that are NOT applied on the running system — a live write could corrupt state or drop the active connection. These are staged in the pending set: /etc/network is written early in the next boot, before networking starts, and /etc/pve is written by the post-boot dispatcher once the cluster filesystem is up. Examples: /etc/pve (pmxcfs is a live FUSE mount holding active cluster configuration), /var/lib/pve-cluster (live cluster data, kept in the recovery directory for manual recovery only), /etc/network (could reconfigure the very interface the user is connected on over SSH and drop the session)." } ] }, diff --git a/web/messages/es/docs/backup-restore/destinations/borg.json b/web/messages/es/docs/backup-restore/destinations/borg.json index deb255a1..317e8387 100644 --- a/web/messages/es/docs/backup-restore/destinations/borg.json +++ b/web/messages/es/docs/backup-restore/destinations/borg.json @@ -107,7 +107,7 @@ "heading": "Autenticación SSH (lado cliente)", "intro": "Los repositorios Borg remotos se acceden vía SSH. La conexión va desde el host ProxMenux a una cuenta de usuario en el servidor Borg que ejecuta borg serve. Ese usuario se llama típicamente borg, NO el usuario admin/root del servidor — la línea de comando de borg-serve bloquea la conexión a esa ruta concreta del repositorio (ver las estrategias de clave más abajo).", "strategiesTitle": "Estrategias de clave SSH", - "strategiesIntro": "Al añadir un destino remoto, ProxMenux pide el usuario SSH, el host y la ruta remota, y ofrece cuatro opciones de autenticación. Si se rechaza la autenticación por contraseña, también ofrece generate-pct. Los modos se describen a continuación:", + "strategiesIntro": "Al añadir un destino remoto, ProxMenux pide el usuario SSH, el host, el puerto y la ruta remota, y ofrece cuatro opciones de autenticación. Si se rechaza la autenticación por contraseña, también ofrece generate-pct. Los modos se describen a continuación:", "strategyRows": [ { "mode": "generate-auto", @@ -166,7 +166,7 @@ { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", - "purpose": "Comando de shell remoto que Borg utiliza para repositorios SSH. Elegir una clave añade las opciones de identidad; un puerto distinto del predeterminado añade -p PORT. Sin clave personalizada y con el puerto predeterminado, la variable queda sin definir y Borg usa la configuración SSH del host." + "purpose": "Comando de shell remoto que Borg utiliza para repositorios SSH. Elegir una clave añade las opciones de identidad. Al añadir un destino con un puerto distinto del predeterminado, ProxMenux añade además -p PORT; los destinos guardados, los trabajos programados y el Monitor usan el puerto de la URL ssh://. Sin clave personalizada, y en un destino nuevo con el puerto predeterminado, la variable queda sin definir y Borg usa la configuración SSH del host." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/es/docs/backup-restore/glossary.json b/web/messages/es/docs/backup-restore/glossary.json index 24a9e168..6cb1d2d1 100644 --- a/web/messages/es/docs/backup-restore/glossary.json +++ b/web/messages/es/docs/backup-restore/glossary.json @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Modo adjunto (attach mode)", - "def": "Trabajo sin timer propio. Un hook job-end de vzdump lo ejecuta después de los backups de invitados cuando coincide el almacenamiento. El padre seleccionado aporta destino y retención inicial, pero el hook compara almacenamiento, no ID de tarea padre; otra tarea con el mismo destino también puede activarlo. Solo para Local y PBS." + "def": "Trabajo sin timer propio. Un hook job-end de vzdump lo ejecuta después de los backups de invitados cuando coincide el almacenamiento. El padre seleccionado aporta el destino y la retención, que se vuelve a leer de la tarea padre en cada ejecución, pero el hook compara almacenamiento, no ID de tarea padre; otra tarea con el mismo destino también puede activarlo. Solo para Local y PBS." }, { "id": "timer-systemd", diff --git a/web/messages/es/docs/backup-restore/restoring.json b/web/messages/es/docs/backup-restore/restoring.json index 1d5337a7..5f3ea69c 100644 --- a/web/messages/es/docs/backup-restore/restoring.json +++ b/web/messages/es/docs/backup-restore/restoring.json @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Rutas que este flujo difiere al siguiente arranque en lugar de aplicar de inmediato. Afectan a la configuración de arranque: la generación del bootloader lee /etc/default/grub, los montajes usan /etc/fstab y la carga de módulos usa /etc/modules. Los archivos pendientes se aplican tras reiniciar y después se regeneran los artefactos de arranque necesarios. Ejemplos: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Rutas que este flujo difiere al siguiente arranque en lugar de aplicar de inmediato. Afectan a la configuración de arranque: la generación del bootloader lee /etc/default/grub, los montajes usan /etc/fstab y la carga de módulos usa /etc/modules. Los archivos pendientes se aplican tras reiniciar y después se regeneran los artefactos de arranque necesarios. Ejemplos: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/modprobe.d." }, { "class": "dangerous", - "detail": "Rutas que NO se aplican en el sistema en ejecución — la escritura viva podría corromper estado o cortar la conexión activa. Estas rutas se preparan en el conjunto pendiente y las escribe el dispatcher post-arranque después del reinicio, cuando el clúster está arriba pero antes de que el sistema esté completamente en uso. Ejemplos: /etc/pve (pmxcfs es un montaje FUSE con configuración activa del clúster), /var/lib/pve-cluster (datos vivos del clúster), /etc/network (podría reconfigurar la misma interfaz por la que el usuario está conectado por SSH y cortar la sesión)." + "detail": "Rutas que NO se aplican en el sistema en ejecución: escribirlas en caliente podría corromper el estado o cortar la conexión activa. Se preparan en el conjunto pendiente: /etc/network se escribe al principio del siguiente arranque, antes de que se levante la red, y /etc/pve lo escribe el dispatcher post-arranque cuando el sistema de archivos del clúster ya está activo. Ejemplos: /etc/pve (pmxcfs es un montaje FUSE con la configuración activa del clúster), /var/lib/pve-cluster (datos vivos del clúster; se guardan en el directorio de recuperación solo para recuperarlos a mano), /etc/network (podría reconfigurar la misma interfaz por la que el usuario está conectado por SSH y cortar la sesión)." } ] }, diff --git a/web/messages/fr/docs/backup-restore/destinations/borg.json b/web/messages/fr/docs/backup-restore/destinations/borg.json index f3aa0fc0..8658819a 100644 --- a/web/messages/fr/docs/backup-restore/destinations/borg.json +++ b/web/messages/fr/docs/backup-restore/destinations/borg.json @@ -107,7 +107,7 @@ "heading": "authentification SSH (côté client)", "intro": "Les dépôts distants Borg sont accessibles sur SSH. La connexion passe de l'hôte ProxMenux à un compte utilisateur sur le serveur Borg qui exécute borg serve. Cet utilisateur s'appelle généralement borg, PAS l'utilisateur admin/root du serveur — la ligne de commande borg-serve verrouille la connexion à ce chemin de dépôt spécifique (voir les stratégies clés ci-dessous).", "strategiesTitle": "Stratégies de clé SSH", - "strategiesIntro": "Lors de l’ajout d’une destination distante, ProxMenux demande l’utilisateur SSH, l’hôte et le chemin distant, puis propose quatre choix d’authentification. L’alternative generate-pct est proposée si l’authentification par mot de passe est refusée. Voici les modes :", + "strategiesIntro": "Lors de l’ajout d’une destination distante, ProxMenux demande l’utilisateur SSH, l’hôte, le port et le chemin distant, puis propose quatre choix d’authentification. L’alternative generate-pct est proposée si l’authentification par mot de passe est refusée. Voici les modes :", "strategyRows": [ { "mode": "generate-auto", @@ -166,7 +166,7 @@ { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", - "purpose": "Commande distante utilisée par Borg pour les dépôts SSH. Une clé sélectionnée ajoute les options d’identité ; un port non standard ajoute -p PORT. Sans clé personnalisée et avec le port par défaut, la variable reste non définie et Borg utilise la configuration SSH de l’hôte." + "purpose": "Commande distante utilisée par Borg pour les dépôts SSH. Une clé sélectionnée ajoute les options d’identité. Quand une destination est ajoutée avec un port non standard, ProxMenux ajoute aussi -p PORT ; les destinations enregistrées, les tâches planifiées et le Monitor utilisent plutôt le port de l’URL ssh://. Sans clé personnalisée, et pour une nouvelle destination avec le port par défaut, la variable reste non définie et Borg utilise la configuration SSH de l’hôte." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/fr/docs/backup-restore/glossary.json b/web/messages/fr/docs/backup-restore/glossary.json index 2e709947..f99080d9 100644 --- a/web/messages/fr/docs/backup-restore/glossary.json +++ b/web/messages/fr/docs/backup-restore/glossary.json @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Mode rattaché", - "def": "Tâche sans timer propre. Un hook job-end de PVE vzdump la déclenche après les sauvegardes des invités si le stockage correspond. La tâche parent fournit destination et conservation initiale, mais le hook compare le stockage, pas l’ID parent. Une autre tâche sur ce stockage peut aussi la déclencher. Uniquement Local et PBS." + "def": "Tâche sans timer propre. Un hook job-end de PVE vzdump la déclenche après les sauvegardes des invités si le stockage correspond. La tâche parent fournit la destination et la conservation, relue depuis la tâche parent à chaque exécution, mais le hook compare le stockage, pas l’ID parent. Une autre tâche sur ce stockage peut aussi la déclencher. Uniquement Local et PBS." }, { "id": "timer-systemd", diff --git a/web/messages/fr/docs/backup-restore/restoring.json b/web/messages/fr/docs/backup-restore/restoring.json index 91b43de7..fcd555cf 100644 --- a/web/messages/fr/docs/backup-restore/restoring.json +++ b/web/messages/fr/docs/backup-restore/restoring.json @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Chemins reportés au prochain démarrage, au lieu d’être appliqués immédiatement par ce processus. Ils concernent la configuration de démarrage : la génération du chargeur lit /etc/default/grub, les montages utilisent /etc/fstab et le chargement des modules utilise /etc/modules. Les fichiers en attente sont appliqués après redémarrage, puis les éléments de démarrage nécessaires sont régénérés. Exemples : /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Chemins reportés au prochain démarrage, au lieu d’être appliqués immédiatement par ce processus. Ils concernent la configuration de démarrage : la génération du chargeur lit /etc/default/grub, les montages utilisent /etc/fstab et le chargement des modules utilise /etc/modules. Les fichiers en attente sont appliqués après redémarrage, puis les éléments de démarrage nécessaires sont régénérés. Exemples : /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/modprobe.d." }, { "class": "dangerous", - "detail": "Les chemins qui sont NON appliqués sur le système en cours d'exécution — une écriture en direct pourrait corrompre l'état ou abandonner la connexion active. Ceux-ci sont mis en scène dans le jeu en attente et écrits par le répartiteur post-démarrage après le redémarrage, lorsque le cluster est en place mais le système n'est pas encore pleinement utilisé. Exemples : /etc/pve (pmxcfs est un montage FUSE contenant la configuration active du cluster), /var/lib/pve-cluster (données de cluster en direct), /etc/network (pourrait reconfigurer l'interface même que l'utilisateur est connecté sur SSH et laisser tomber la session)." + "detail": "Chemins NON appliqués sur le système en cours d’exécution : une écriture à chaud pourrait corrompre l’état ou couper la connexion active. Ils sont placés dans l’ensemble en attente : /etc/network est écrit tôt au démarrage suivant, avant le démarrage du réseau, et /etc/pve est écrit par le répartiteur post-démarrage une fois le système de fichiers du cluster disponible. Exemples : /etc/pve (pmxcfs est un montage FUSE contenant la configuration active du cluster), /var/lib/pve-cluster (données actives du cluster, conservées dans le répertoire de récupération pour une récupération manuelle uniquement), /etc/network (pourrait reconfigurer l’interface même par laquelle l’utilisateur est connecté en SSH et couper la session)." } ] }, diff --git a/web/messages/it/docs/backup-restore/destinations/borg.json b/web/messages/it/docs/backup-restore/destinations/borg.json index fe33bf03..61f341ae 100644 --- a/web/messages/it/docs/backup-restore/destinations/borg.json +++ b/web/messages/it/docs/backup-restore/destinations/borg.json @@ -107,7 +107,7 @@ "heading": "Autenticazione SSH (lato cliente)", "intro": "I repository Borg remoti sono accessibili su SSH. La connessione viene eseguita dall'host ProxMenux a un account utente sul server Borg che esegue borg serve. Questo utente è tipicamente chiamato borg, NON l'utente admin/root del server — la linea di comando borg-serve blocca la connessione a quel percorso di repository specifico (vedere le strategie chiave qui sotto).", "strategiesTitle": "Strategie per le chiavi SSH", - "strategiesIntro": "Aggiungendo una destinazione remota, ProxMenux chiede utente SSH, host e percorso remoto, poi offre quattro opzioni di autenticazione. Se l’accesso con password viene rifiutato, propone anche generate-pct. Le modalità sono descritte di seguito:", + "strategiesIntro": "Aggiungendo una destinazione remota, ProxMenux chiede utente SSH, host, porta e percorso remoto, poi offre quattro opzioni di autenticazione. Se l’accesso con password viene rifiutato, propone anche generate-pct. Le modalità sono descritte di seguito:", "strategyRows": [ { "mode": "generate-auto", @@ -166,7 +166,7 @@ { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", - "purpose": "Comando remoto usato da Borg per i repository SSH. Una chiave selezionata aggiunge le opzioni di identità; una porta non standard aggiunge -p PORT. Senza chiave personalizzata e con la porta predefinita, la variabile resta non impostata e Borg usa la configurazione SSH dell’host." + "purpose": "Comando remoto usato da Borg per i repository SSH. Una chiave selezionata aggiunge le opzioni di identità. Quando una destinazione viene aggiunta con una porta non standard, ProxMenux aggiunge anche -p PORT; le destinazioni salvate, i processi pianificati e il Monitor usano invece la porta dell’URL ssh://. Senza chiave personalizzata, e per una nuova destinazione con la porta predefinita, la variabile resta non impostata e Borg usa la configurazione SSH dell’host." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/it/docs/backup-restore/glossary.json b/web/messages/it/docs/backup-restore/glossary.json index c32a3636..40a59b8d 100644 --- a/web/messages/it/docs/backup-restore/glossary.json +++ b/web/messages/it/docs/backup-restore/glossary.json @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Modalità allegato", - "def": "Processo senza timer proprio. Un hook job-end PVE di vzdump lo avvia dopo i backup dei guest se lo storage corrisponde. Il processo padre fornisce destinazione e conservazione iniziale, ma il hook confronta lo storage, non l’ID padre. Anche un altro processo sullo stesso storage può attivarlo. Solo Local e PBS." + "def": "Processo senza timer proprio. Un hook job-end PVE di vzdump lo avvia dopo i backup dei guest se lo storage corrisponde. Il processo padre fornisce destinazione e conservazione, riletta dal processo padre a ogni esecuzione, ma il hook confronta lo storage, non l’ID padre. Anche un altro processo sullo stesso storage può attivarlo. Solo Local e PBS." }, { "id": "timer-systemd", diff --git a/web/messages/it/docs/backup-restore/restoring.json b/web/messages/it/docs/backup-restore/restoring.json index d75549b1..2f53b1e3 100644 --- a/web/messages/it/docs/backup-restore/restoring.json +++ b/web/messages/it/docs/backup-restore/restoring.json @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Percorsi rimandati al prossimo avvio anziché applicati immediatamente da questo processo. Riguardano la configurazione di avvio: la generazione del bootloader legge /etc/default/grub, i montaggi usano /etc/fstab e il caricamento dei moduli usa /etc/modules. I file differiti vengono applicati dopo il riavvio, poi vengono rigenerati gli elementi di avvio necessari. Esempi: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Percorsi rimandati al prossimo avvio anziché applicati immediatamente da questo processo. Riguardano la configurazione di avvio: la generazione del bootloader legge /etc/default/grub, i montaggi usano /etc/fstab e il caricamento dei moduli usa /etc/modules. I file differiti vengono applicati dopo il riavvio, poi vengono rigenerati gli elementi di avvio necessari. Esempi: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/modprobe.d." }, { "class": "dangerous", - "detail": "Percorsi che sono NON applicati sul sistema in esecuzione — una scrittura in diretta potrebbe corrompere o rilasciare la connessione attiva. Questi sono messi in scena nel set in sospeso e scritti dal dispacciatore post-boot dopo il riavvio, quando il cluster è in funzione, ma il sistema non è ancora completamente in uso. Esempi: /etc/pve (pmxcfs è un montaggio FUSE con la configurazione attiva del cluster), /var/lib/pve-cluster (dati live cluster), /etc/network (potrebbe riconfigurare l'interfaccia stessa che l'utente è collegato su oltre SSH e rilasciare la sessione)." + "detail": "Percorsi NON applicati sul sistema in esecuzione: una scrittura a caldo potrebbe corrompere lo stato o interrompere la connessione attiva. Vengono messi nell’insieme in attesa: /etc/network viene scritto all’inizio del riavvio successivo, prima dell’avvio della rete, e /etc/pve viene scritto dal dispatcher post-avvio quando il file system del cluster è disponibile. Esempi: /etc/pve (pmxcfs è un montaggio FUSE con la configurazione attiva del cluster), /var/lib/pve-cluster (dati attivi del cluster, conservati nella directory di ripristino solo per il recupero manuale), /etc/network (potrebbe riconfigurare proprio l’interfaccia usata dalla connessione SSH e interrompere la sessione)." } ] }, diff --git a/web/messages/pt/docs/backup-restore/destinations/borg.json b/web/messages/pt/docs/backup-restore/destinations/borg.json index f73d9e2b..fe9ae079 100644 --- a/web/messages/pt/docs/backup-restore/destinations/borg.json +++ b/web/messages/pt/docs/backup-restore/destinations/borg.json @@ -107,7 +107,7 @@ "heading": "Autenticação SSH (lado cliente)", "intro": "Repositórios Borg remotos são acessados sobre SSH. A conexão é executada do host ProxMenux para uma conta de usuário no servidor Borg que executa o borg serve. Este usuário é tipicamente chamado borg, NÃO o administrador/root usuário do servidor — a linha de comando borg-serve bloqueia a conexão com esse caminho específico do repositório (veja as estratégias chave abaixo).", "strategiesTitle": "Estratégias de chave SSH", - "strategiesIntro": "Ao adicionar um destino remoto, o ProxMenux pede usuário SSH, host e caminho remoto e oferece quatro opções de autenticação. A alternativa generate-pct é oferecida quando o acesso por senha é recusado. Os modos são descritos abaixo:", + "strategiesIntro": "Ao adicionar um destino remoto, o ProxMenux pede usuário SSH, host, porta e caminho remoto e oferece quatro opções de autenticação. A alternativa generate-pct é oferecida quando o acesso por senha é recusado. Os modos são descritos abaixo:", "strategyRows": [ { "mode": "generate-auto", @@ -166,7 +166,7 @@ { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", - "purpose": "Comando remoto usado pelo Borg para repositórios SSH. Uma chave selecionada acrescenta as opções de identidade; uma porta diferente da padrão acrescenta -p PORT. Sem chave personalizada e com a porta padrão, a variável fica indefinida e o Borg usa a configuração SSH do host." + "purpose": "Comando remoto usado pelo Borg para repositórios SSH. Uma chave selecionada acrescenta as opções de identidade. Quando um destino é adicionado com uma porta diferente da padrão, o ProxMenux acrescenta também -p PORT; os destinos guardados, as tarefas agendadas e o Monitor usam antes a porta do URL ssh://. Sem chave personalizada, e num destino novo com a porta padrão, a variável fica indefinida e o Borg usa a configuração SSH do host." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/pt/docs/backup-restore/glossary.json b/web/messages/pt/docs/backup-restore/glossary.json index 93a79f4e..cbb802b5 100644 --- a/web/messages/pt/docs/backup-restore/glossary.json +++ b/web/messages/pt/docs/backup-restore/glossary.json @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Anexar modo", - "def": "Tarefa sem temporizador próprio. Um hook job-end PVE de vzdump a executa após os backups dos convidados quando o armazenamento coincide. A tarefa pai fornece destino e retenção inicial, mas o hook compara armazenamento, não ID pai. Outra tarefa no mesmo armazenamento também pode acioná-la. Somente Local e PBS." + "def": "Tarefa sem temporizador próprio. Um hook job-end PVE de vzdump a executa após os backups dos convidados quando o armazenamento coincide. A tarefa pai fornece o destino e a retenção, relida da tarefa pai em cada execução, mas o hook compara armazenamento, não ID pai. Outra tarefa no mesmo armazenamento também pode acioná-la. Somente Local e PBS." }, { "id": "timer-systemd", diff --git a/web/messages/pt/docs/backup-restore/restoring.json b/web/messages/pt/docs/backup-restore/restoring.json index b58c5d7e..44ab6673 100644 --- a/web/messages/pt/docs/backup-restore/restoring.json +++ b/web/messages/pt/docs/backup-restore/restoring.json @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Caminhos adiados para a próxima inicialização, em vez de aplicados imediatamente por este processo. Afetam a configuração de boot: a geração do carregador lê /etc/default/grub, as montagens usam /etc/fstab e a carga de módulos usa /etc/modules. Os arquivos pendentes são aplicados após reiniciar e os artefatos de boot necessários são então regenerados. Exemplos: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Caminhos adiados para a próxima inicialização, em vez de aplicados imediatamente por este processo. Afetam a configuração de boot: a geração do carregador lê /etc/default/grub, as montagens usam /etc/fstab e a carga de módulos usa /etc/modules. Os arquivos pendentes são aplicados após reiniciar e os artefatos de boot necessários são então regenerados. Exemplos: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/modprobe.d." }, { "class": "dangerous", - "detail": "Caminhos que são NÃO aplicados no sistema em execução — uma gravação ao vivo pode corromper o estado ou soltar a conexão ativa. Estes são encenados no conjunto pendente e escritos pelo expedidor pós-boot após a reinicialização, quando o cluster está acima, mas o sistema ainda não está totalmente em uso. Exemplos: /etc/pve (pmxcfs é uma montagem FUSE com a configuração ativa do cluster), /var/lib/pve-cluster (dados de cluster ao vivo), /etc/network (poderia reconfigurar a própria interface que o usuário está conectado sobre SSH e soltar a sessão)." + "detail": "Caminhos NÃO aplicados no sistema em execução: uma escrita a quente poderia corromper o estado ou cortar a ligação ativa. Ficam no conjunto pendente: /etc/network é escrito no início do arranque seguinte, antes de a rede arrancar, e /etc/pve é escrito pelo dispatcher pós-arranque quando o sistema de ficheiros do cluster está disponível. Exemplos: /etc/pve (pmxcfs é uma montagem FUSE com a configuração ativa do cluster), /var/lib/pve-cluster (dados ativos do cluster, guardados no diretório de recuperação apenas para recuperação manual), /etc/network (poderia reconfigurar a própria interface usada pela ligação SSH e cortar a sessão)." } ] }, diff --git a/web/messages/sk/docs/backup-restore/destinations/borg.json b/web/messages/sk/docs/backup-restore/destinations/borg.json index 0e28267a..bfa4be4a 100644 --- a/web/messages/sk/docs/backup-restore/destinations/borg.json +++ b/web/messages/sk/docs/backup-restore/destinations/borg.json @@ -107,7 +107,7 @@ "heading": "Overenie SSH (klientská strana)", "intro": "Remote Borg archívy sú prístupné cez SSH. Spojenie beží od ProxMenux host na užívateľský účet na serveri Borg, ktorý beží borg serve. Tento užívateľ je zvyčajne pomenovaný borg, NIE je admin / root užívateľa servera borg-serve príkazový riadok zablokuje pripojenie k tejto konkrétnej trase úložiska (pozri nižšie kľúčové stratégie).", "strategiesTitle": "Možnosti kľúča SSH", - "strategiesIntro": "Pri pridaní vzdialeného cieľa vyžiada ProxMenux používateľa SSH, hostiteľa a vzdialenú cestu a ponúkne štyri možnosti overenia. Ak je overenie heslom odmietnuté, ponúkne aj alternatívu generate-pct. Režimy sú opísané nižšie:", + "strategiesIntro": "Pri pridaní vzdialeného cieľa vyžiada ProxMenux používateľa SSH, hostiteľa, port a vzdialenú cestu a ponúkne štyri možnosti overenia. Ak je overenie heslom odmietnuté, ponúkne aj alternatívu generate-pct. Režimy sú opísané nižšie:", "strategyRows": [ { "mode": "generate-auto", @@ -166,7 +166,7 @@ { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", - "purpose": "Príkaz vzdialeného shellu pre úložiská Borg cez SSH. Vybraný kľúč pridá voľby identity; neštandardný port pridá -p PORT. Bez vlastného kľúča a s predvoleným portom zostane premenná nenastavená a Borg používa konfiguráciu SSH hostiteľa." + "purpose": "Príkaz vzdialeného shellu pre úložiská Borg cez SSH. Vybraný kľúč pridá voľby identity. Keď sa cieľ prvýkrát pridá s neštandardným portom, ProxMenux pridá aj -p PORT; uložené ciele, plánované úlohy a Monitor namiesto toho používajú port z URL ssh://. Bez vlastného kľúča a pri novom cieli s predvoleným portom zostane premenná nenastavená a Borg používa konfiguráciu SSH hostiteľa." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/sk/docs/backup-restore/glossary.json b/web/messages/sk/docs/backup-restore/glossary.json index c8b41233..f883a15d 100644 --- a/web/messages/sk/docs/backup-restore/glossary.json +++ b/web/messages/sk/docs/backup-restore/glossary.json @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Pripojený režim", - "def": "Úloha bez vlastného časovača. Hook job-end PVE vzdump ju spustí po zálohách hostí pri zhodnom úložisku. Vybraná nadradená úloha poskytne cieľ a počiatočné uchovávanie, ale hook porovnáva úložisko, nie ID nadradenej úlohy. Spustiť ju môže aj iná úloha s tým istým úložiskom. Iba Local a PBS." + "def": "Úloha bez vlastného časovača. Hook job-end PVE vzdump ju spustí po zálohách hostí pri zhodnom úložisku. Vybraná nadradená úloha poskytne cieľ a uchovávanie, ktoré sa pri každom spustení znova načíta z nadradenej úlohy, ale hook porovnáva úložisko, nie ID nadradenej úlohy. Spustiť ju môže aj iná úloha s tým istým úložiskom. Iba Local a PBS." }, { "id": "timer-systemd", diff --git a/web/messages/sk/docs/backup-restore/restoring.json b/web/messages/sk/docs/backup-restore/restoring.json index 7d53b200..8c5e01d0 100644 --- a/web/messages/sk/docs/backup-restore/restoring.json +++ b/web/messages/sk/docs/backup-restore/restoring.json @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Cesty odložené na ďalší štart, nie použité okamžite týmto postupom. Ovplyvňujú konfiguráciu štartu: tvorba zavádzača číta /etc/default/grub, pripájanie systémov používa /etc/fstab a načítanie modulov /etc/modules. Odložené súbory sa použijú po reštarte a potom sa znovu vytvoria potrebné zavádzacie súbory. Príklady: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Cesty odložené na ďalší štart, nie použité okamžite týmto postupom. Ovplyvňujú konfiguráciu štartu: tvorba zavádzača číta /etc/default/grub, pripájanie systémov používa /etc/fstab a načítanie modulov /etc/modules. Odložené súbory sa použijú po reštarte a potom sa znovu vytvoria potrebné zavádzacie súbory. Príklady: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/modprobe.d." }, { "class": "dangerous", - "detail": "Cesty, ktoré sa NEPOUŽÍVAJÚ na bežiacom systéme, pretože zápis by mohol poškodiť stav alebo prerušiť aktívne spojenie. Pripravia sa medzi odloženými súbormi a zapíšu sa po reštarte, keď je klaster spustený a systém ešte nie je plne používaný. Príklady: /etc/pve (pmxcfs je pripojenie FUSE s aktívnou konfiguráciou klastra), /var/lib/pve-cluster (aktívne údaje klastra) a /etc/network (zmena môže prekonfigurovať rozhranie používané na SSH a prerušiť reláciu)." + "detail": "Cesty, ktoré sa NEPOUŽIJÚ na bežiacom systéme, pretože zápis za behu by mohol poškodiť stav alebo prerušiť aktívne spojenie. Pripravia sa medzi odloženými súbormi: /etc/network sa zapíše na začiatku ďalšieho štartu, ešte pred spustením siete, a /etc/pve zapíše dispečer po štarte, keď je klastrový súborový systém dostupný. Príklady: /etc/pve (pmxcfs je pripojenie FUSE s aktívnou konfiguráciou klastra), /var/lib/pve-cluster (aktívne údaje klastra, uložené v adresári obnovy len na ručnú obnovu), /etc/network (zmena môže prekonfigurovať rozhranie používané na SSH a prerušiť reláciu)." } ] }, diff --git a/web/messages/sv/docs/backup-restore/destinations/borg.json b/web/messages/sv/docs/backup-restore/destinations/borg.json index 2ce2afc0..d5ee7167 100644 --- a/web/messages/sv/docs/backup-restore/destinations/borg.json +++ b/web/messages/sv/docs/backup-restore/destinations/borg.json @@ -107,7 +107,7 @@ "heading": "SSH autentisering (klientsida)", "intro": "Remote Borg repositorier är tillgängliga över SSH. Anslutningen går från ProxMenux-värden till ett användarkonto på Borg-servern som kör borg serve. Den här användaren heter vanligtvis borg, inte admin/root-användaren av servern - borg-serve-kommandoraden låser anslutningen till den specifika förvaringsbanan (se de viktigaste strategierna nedan).", "strategiesTitle": "SSH-nyckelalternativ", - "strategiesIntro": "När ett fjärrmål läggs till frågar ProxMenux efter SSH-användare, värd och fjärrsökväg och erbjuder fyra autentiseringsval. Alternativet generate-pct erbjuds om lösenordsautentisering nekas. Lägena beskrivs nedan:", + "strategiesIntro": "När ett fjärrmål läggs till frågar ProxMenux efter SSH-användare, värd, port och fjärrsökväg och erbjuder fyra autentiseringsval. Alternativet generate-pct erbjuds om lösenordsautentisering nekas. Lägena beskrivs nedan:", "strategyRows": [ { "mode": "generate-auto", @@ -166,7 +166,7 @@ { "var": "BORG_RSH", "value": "ssh -i SSH_KEY_PATH -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new [-p PORT]", - "purpose": "Fjärrskalskommandot som Borg använder för SSH-förvar. En vald nyckel lägger till identitetsalternativen; en annan port än standard lägger till -p PORT. Utan egen nyckel och med standardport lämnas variabeln osatt och Borg använder värdens SSH-konfiguration." + "purpose": "Fjärrskalskommandot som Borg använder för SSH-förvar. En vald nyckel lägger till identitetsalternativen. När ett mål läggs till med en annan port än standard lägger ProxMenux även till -p PORT; sparade mål, schemalagda jobb och Monitor använder i stället porten i ssh://-URL:en. Utan egen nyckel, och för ett nytt mål med standardport, lämnas variabeln osatt och Borg använder värdens SSH-konfiguration." }, { "var": "BORG_PASSPHRASE", diff --git a/web/messages/sv/docs/backup-restore/glossary.json b/web/messages/sv/docs/backup-restore/glossary.json index adfdbd7a..613cf074 100644 --- a/web/messages/sv/docs/backup-restore/glossary.json +++ b/web/messages/sv/docs/backup-restore/glossary.json @@ -156,7 +156,7 @@ { "id": "modo-adjunto", "term": "Anslutet läge", - "def": "Jobb utan egen timer. En job-end-hook i PVE vzdump utlöser det efter gästsäkerhetskopior när mållagringen matchar. Det valda överordnade jobbet ger lagring och inledande lagringsregler, men hooken matchar lagring, inte jobb-ID. Även en annan uppgift med samma lagring kan utlösa det. Endast Local och PBS." + "def": "Jobb utan egen timer. En job-end-hook i PVE vzdump utlöser det efter gästsäkerhetskopior när mållagringen matchar. Det valda överordnade jobbet ger lagring och lagringsregler, som läses om från det överordnade jobbet vid varje körning, men hooken matchar lagring, inte jobb-ID. Även en annan uppgift med samma lagring kan utlösa det. Endast Local och PBS." }, { "id": "timer-systemd", diff --git a/web/messages/sv/docs/backup-restore/restoring.json b/web/messages/sv/docs/backup-restore/restoring.json index 071758a0..2d86fed6 100644 --- a/web/messages/sv/docs/backup-restore/restoring.json +++ b/web/messages/sv/docs/backup-restore/restoring.json @@ -81,11 +81,11 @@ }, { "class": "reboot", - "detail": "Sökvägar som skjuts upp till nästa start i stället för att tillämpas omedelbart av återställningen. De påverkar startkonfigurationen: genereringen av starthanteraren läser /etc/default/grub, monteringar använder /etc/fstab och modulladdning /etc/modules. De väntande filerna tillämpas efter omstart och nödvändiga startfiler genereras sedan om. Exempel: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/initramfs-tools." + "detail": "Sökvägar som skjuts upp till nästa start i stället för att tillämpas omedelbart av återställningen. De påverkar startkonfigurationen: genereringen av starthanteraren läser /etc/default/grub, monteringar använder /etc/fstab och modulladdning /etc/modules. De väntande filerna tillämpas efter omstart och nödvändiga startfiler genereras sedan om. Exempel: /etc/default/grub, /etc/kernel, /etc/modules, /etc/fstab, /etc/zfs, /etc/modprobe.d." }, { "class": "dangerous", - "detail": "Paths som är INTE tillämpas på löpningssystem - en levande skriva kan korrumpera tillstånd eller släppa den aktiva anslutningen. Dessa är iscensatta i den väntande uppsättningen och skrivna av post-boot-sändaren efter omstarten, när klustret är upp men systemet är ännu inte helt i bruk. Exempel: /etc/pve (pmxcfs är en FUSE-montering med aktiv klusterkonfiguration), /var/lib/pve-cluster (levande klusterdata), /etc/network (kan omkonfigurera själva gränssnittet som användaren är ansluten på över SSH och släppa sessionen)." + "detail": "Sökvägar som INTE tillämpas på det körande systemet: en skrivning under drift kan förstöra tillståndet eller bryta den aktiva anslutningen. De läggs i den väntande uppsättningen: /etc/network skrivs tidigt vid nästa start, innan nätverket startar, och /etc/pve skrivs av efterstartsdistributören när klusterfilsystemet är uppe. Exempel: /etc/pve (pmxcfs är en aktiv FUSE-montering med klustrets konfiguration), /var/lib/pve-cluster (aktiva klusterdata, sparade i återställningskatalogen endast för manuell återställning), /etc/network (kan konfigurera om just det gränssnitt som SSH-anslutningen använder och bryta sessionen)." } ] }, From e5bf63b31f9f682d6a8efd846fa4232163072a97 Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sun, 18 Oct 2026 14:02:33 +0200 Subject: [PATCH 68/73] Remove the current open-file limits on uninstall and align the Log2RAM check - Uninstalling removes DefaultLimitNOFILE=1048576 and ulimit -n 1048576 as well as the legacy 256000 lines - The customizable post-install runs the Log2RAM check every 10 minutes at low priority, as the automated one does --- scripts/post_install/customizable_post_install.sh | 3 ++- scripts/post_install/uninstall-tools.sh | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/post_install/customizable_post_install.sh b/scripts/post_install/customizable_post_install.sh index 39274146..81601230 100644 --- a/scripts/post_install/customizable_post_install.sh +++ b/scripts/post_install/customizable_post_install.sh @@ -3580,7 +3580,8 @@ EOF SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MAILTO="" -*/5 * * * * root /usr/local/bin/log2ram-check.sh >/dev/null 2>&1 +# nice/ionice keep the check off the priority queue for scheduled tasks. +3-59/10 * * * * root nice -n 19 ionice -c 3 /usr/local/bin/log2ram-check.sh >/dev/null 2>&1 EOF chmod 0644 /etc/cron.d/log2ram-auto-sync chown root:root /etc/cron.d/log2ram-auto-sync diff --git a/scripts/post_install/uninstall-tools.sh b/scripts/post_install/uninstall-tools.sh index 1724f849..91f90867 100644 --- a/scripts/post_install/uninstall-tools.sh +++ b/scripts/post_install/uninstall-tools.sh @@ -581,7 +581,7 @@ uninstall_system_limits() { # Remove systemd limits (restore defaults) for file in /etc/systemd/system.conf /etc/systemd/user.conf; do if [ -f "$file" ]; then - pmx_edit_file "$file" '/^DefaultLimitNOFILE=256000/d' + pmx_edit_file "$file" -e '/^DefaultLimitNOFILE=256000$/d' -e '/^DefaultLimitNOFILE=1048576$/d' fi done @@ -594,7 +594,7 @@ uninstall_system_limits() { # Remove ulimit from profile if [ -f /root/.profile ]; then - pmx_edit_file /root/.profile '/ulimit -n 256000/d' + pmx_edit_file /root/.profile -e '/^ulimit -n 256000$/d' -e '/^ulimit -n 1048576$/d' fi # Reload sysctl From c09f27d489135674bc45aa3037217285dc596dbe Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:10:48 +0200 Subject: [PATCH 69/73] Keep Spanish command reference docs aligned with the menu and the glossary --- web/messages/es/docs/help-info/backup-commands.json | 6 +++--- web/messages/es/docs/help-info/index.json | 8 ++++---- web/messages/es/docs/help-info/system-commands.json | 4 ++-- web/messages/es/docs/help-info/tools-commands.json | 4 ++-- web/messages/es/docs/help-info/update-commands.json | 4 ++-- web/messages/es/docs/help-info/vm-ct-commands.json | 4 ++-- web/messages/es/docs/help-info/zfs-commands.json | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/web/messages/es/docs/help-info/backup-commands.json b/web/messages/es/docs/help-info/backup-commands.json index aa73d33c..9c812806 100644 --- a/web/messages/es/docs/help-info/backup-commands.json +++ b/web/messages/es/docs/help-info/backup-commands.json @@ -8,8 +8,8 @@ "twitterDescription": "Comandos vzdump, qmrestore y pct restore para hacer y restaurar backups de VMs y contenedores de Proxmox." }, "header": { - "title": "Copias de seguridad y restauración", - "description": "Selección de comandos vzdump, qmrestore y pct restore para copias de seguridad en Proxmox. Incluye programación, opciones avanzadas como hooks, rutas excluidas y prioridad de E/S, y gestión de archivos de copia.", + "title": "Backup y restauración", + "description": "Selección de comandos vzdump, qmrestore y pct restore para backups en Proxmox. Incluye programación, opciones avanzadas como hooks, rutas excluidas y prioridad de E/S, y gestión de archivos de copia.", "section": "Ayuda e información" }, "intro": { @@ -166,7 +166,7 @@ }, { "command": "pvenode task list --typefilter vzdump", - "description": "Listar tareas de copia de seguridad finalizadas" + "description": "Listar tareas de backup finalizadas" }, { "command": "pvenode task log ", diff --git a/web/messages/es/docs/help-info/index.json b/web/messages/es/docs/help-info/index.json index d3ef41fb..7a055c8c 100644 --- a/web/messages/es/docs/help-info/index.json +++ b/web/messages/es/docs/help-info/index.json @@ -1,9 +1,9 @@ { "meta": { "title": "Referencia de comandos de Proxmox — qm, pct, vzdump, zpool, pveversion | ProxMenux", - "description": "Selección de comandos esenciales de Proxmox VE y Linux por tema: inspección del sistema, gestión de VM y LXC (qm / pct), almacenamiento y discos, red, actualizaciones, passthrough de GPU, ZFS, copias de seguridad y restauración, y herramientas de terminal para el día a día.", + "description": "Selección de comandos esenciales de Proxmox VE y Linux por tema: inspección del sistema, gestión de VM y LXC (qm / pct), almacenamiento y discos, red, actualizaciones, passthrough de GPU, ZFS, backup y restauración, y herramientas de terminal para el día a día.", "ogTitle": "Referencia de comandos de Proxmox — qm, pct, vzdump, zpool", - "ogDescription": "Selección de comandos útiles de Proxmox VE y Linux por tema: sistema, VM/CT, almacenamiento, red, actualizaciones, passthrough de GPU, ZFS, copias de seguridad y herramientas CLI.", + "ogDescription": "Selección de comandos útiles de Proxmox VE y Linux por tema: sistema, VM/CT, almacenamiento, red, actualizaciones, passthrough de GPU, ZFS, backups y herramientas CLI.", "twitterTitle": "Referencia de comandos de Proxmox | ProxMenux", "twitterDescription": "Selección de comandos útiles de Proxmox VE y Linux, agrupados por tema." }, @@ -27,7 +27,7 @@ { "icon": "Terminal", "href": "/docs/help-info/system-commands", - "title": "Comandos de sistema útiles", + "title": "Comandos útiles del sistema", "description": "pveversion, uptime, free, journalctl, hostnamectl, información del usuario actual, auditoría con lynis y fastfetch." }, { @@ -69,7 +69,7 @@ { "icon": "Archive", "href": "/docs/help-info/backup-commands", - "title": "Copias de seguridad y restauración", + "title": "Backup y restauración", "description": "vzdump, qmrestore / pct restore, ayudas para Proxmox Backup Server, operaciones de snapshot." }, { diff --git a/web/messages/es/docs/help-info/system-commands.json b/web/messages/es/docs/help-info/system-commands.json index d40e9c82..e00c2ee1 100644 --- a/web/messages/es/docs/help-info/system-commands.json +++ b/web/messages/es/docs/help-info/system-commands.json @@ -8,13 +8,13 @@ "twitterDescription": "Comandos esenciales de inspección del sistema para Proxmox VE — versión, estado, servicios, logs, información de usuarios." }, "header": { - "title": "Comandos de sistema útiles", + "title": "Comandos útiles del sistema", "description": "Comandos para inspeccionar el host Proxmox: versión, kernel, tiempo de actividad, memoria, estado de la interfaz web, registros recientes y usuarios conectados, además de herramientas de auditoría y resumen. La mayoría consultan el estado, pero systemctl restart pveproxy reinicia el proxy web y las auditorías pueden escribir informes y registros.", "section": "Ayuda e información" }, "intro": { "title": "Qué es esto", - "body": "Es la misma lista numerada que ProxMenux muestra al elegir Comandos de sistema útiles. Usa el botón Copiar para copiar un comando o consulta la lista para recordar la opción exacta." + "body": "Es la misma lista numerada que ProxMenux muestra al elegir Comandos útiles del sistema. Usa el botón Copiar para copiar un comando o consulta la lista para recordar la opción exacta." }, "commandGroups": [ { diff --git a/web/messages/es/docs/help-info/tools-commands.json b/web/messages/es/docs/help-info/tools-commands.json index 6dc796a2..306d7272 100644 --- a/web/messages/es/docs/help-info/tools-commands.json +++ b/web/messages/es/docs/help-info/tools-commands.json @@ -251,7 +251,7 @@ ], "tmuxTip": { "title": "Usa tmux / screen para comandos de larga duración", - "bodyRich": "Ejecuta las tareas largas, como una copia de seguridad, una actualización o una transferencia grande con rsync, dentro de tmux o screen para que una desconexión SSH no termine la sesión del terminal. En una sesión tmux, vuelve a conectarte al mismo host con el mismo usuario y ejecuta tmux attach. Las sesiones screen tienen su propio comando de reconexión." + "bodyRich": "Ejecuta las tareas largas, como un backup, una actualización o una transferencia grande con rsync, dentro de tmux o screen para que una desconexión SSH no termine la sesión del terminal. En una sesión tmux, vuelve a conectarte al mismo host con el mismo usuario y ejecuta tmux attach. Las sesiones screen tienen su propio comando de reconexión." }, "related": { "heading": "Relacionado", @@ -263,7 +263,7 @@ }, { "href": "/docs/help-info/system-commands", - "label": "Comandos de sistema útiles", + "label": "Comandos útiles del sistema", "tail": " — comandos de inspección específicos de Proxmox." }, { diff --git a/web/messages/es/docs/help-info/update-commands.json b/web/messages/es/docs/help-info/update-commands.json index edda1684..444d2b66 100644 --- a/web/messages/es/docs/help-info/update-commands.json +++ b/web/messages/es/docs/help-info/update-commands.json @@ -144,8 +144,8 @@ } ], "backupWarn": { - "title": "Haz una copia de seguridad antes de las actualizaciones mayores", - "bodyRich": "Para las actualizaciones habituales, Proxmox recomienda apt update && apt full-upgrade; revisa los cambios de paquetes antes de confirmar. Para actualizaciones de versión mayor (PVE 8 → 9), usa el procedimiento específico de ProxMenux: Actualizar PVE 8 a PVE 9. Añade comprobaciones previas, migración de repositorios y validación posterior. Haz una copia de seguridad antes." + "title": "Haz un backup antes de las actualizaciones mayores", + "bodyRich": "Para las actualizaciones habituales, Proxmox recomienda apt update && apt full-upgrade; revisa los cambios de paquetes antes de confirmar. Para actualizaciones de versión mayor (PVE 8 → 9), usa el procedimiento específico de ProxMenux: Actualizar PVE 8 a PVE 9. Añade comprobaciones previas, migración de repositorios y validación posterior. Haz un backup antes." }, "related": { "heading": "Relacionado", diff --git a/web/messages/es/docs/help-info/vm-ct-commands.json b/web/messages/es/docs/help-info/vm-ct-commands.json index 17382747..9f33b9ac 100644 --- a/web/messages/es/docs/help-info/vm-ct-commands.json +++ b/web/messages/es/docs/help-info/vm-ct-commands.json @@ -153,7 +153,7 @@ ], "destroyWarn": { "title": "Destroy es irreversible", - "bodyRich": "qm destroy y pct destroy eliminan la configuración del guest y sus volúmenes de disco gestionados. No supongas que borran los datos externos o montados por bind mount. La CLI no pide confirmación por defecto. Guarda antes cualquier dato que puedas necesitar; consulta Copias de seguridad y restauración." + "bodyRich": "qm destroy y pct destroy eliminan la configuración del guest y sus volúmenes de disco gestionados. No supongas que borran los datos externos o montados por bind mount. La CLI no pide confirmación por defecto. Guarda antes cualquier dato que puedas necesitar; consulta Backup & Restore." }, "qmConfigTip": { "title": "qm config frente a editar directamente el archivo .conf", @@ -164,7 +164,7 @@ "items": [ { "href": "/docs/help-info/backup-commands", - "label": "Copias de seguridad y restauración", + "label": "Backup & Restore", "tail": " — vzdump y qmrestore / pct restore." }, { diff --git a/web/messages/es/docs/help-info/zfs-commands.json b/web/messages/es/docs/help-info/zfs-commands.json index b716771a..fb1342de 100644 --- a/web/messages/es/docs/help-info/zfs-commands.json +++ b/web/messages/es/docs/help-info/zfs-commands.json @@ -214,7 +214,7 @@ }, { "href": "/docs/help-info/backup-commands", - "label": "Copias de seguridad y restauración", + "label": "Backup & Restore", "tail": " — vzdump, qmrestore." }, { From 20e355c09f003115093365b0cd96c86703a23cf1 Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:10:50 +0200 Subject: [PATCH 70/73] Keep Spanish introduction docs aligned with the menu and the glossary --- web/messages/es/docs/introduction.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/messages/es/docs/introduction.json b/web/messages/es/docs/introduction.json index b9738f1e..9d8cb3a2 100644 --- a/web/messages/es/docs/introduction.json +++ b/web/messages/es/docs/introduction.json @@ -71,7 +71,7 @@ }, { "title": "Red", - "description": "Diagnósticos de solo lectura, flujos de análisis-y-sugerencia y reparaciones guiadas de /etc/network/interfaces. Copias de seguridad obligatorias antes de cualquier cambio.", + "description": "Diagnósticos de solo lectura, flujos de análisis-y-sugerencia y reparaciones guiadas de /etc/network/interfaces. Backups obligatorios antes de cualquier cambio.", "icon": "Network", "href": "/docs/network" }, @@ -89,7 +89,7 @@ }, { "title": "Referencia de comandos", - "description": "Selección de comandos de Linux y Proxmox organizada por temas: sistema, VM/CT con qm y pct, almacenamiento, red, ZFS, acceso directo a GPU, copias de seguridad y herramientas CLI de uso diario.", + "description": "Selección de comandos de Linux y Proxmox organizada por temas: sistema, VM/CT con qm y pct, almacenamiento, red, ZFS, acceso directo a GPU, backups y herramientas CLI de uso diario.", "icon": "BookOpen", "href": "/docs/help-info" } From 9247e6d8873ee3c251a83e00a3bce84de87a83de Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:13:26 +0200 Subject: [PATCH 71/73] Describe the disk image formats qm can import --- web/messages/de/docs/help-info/backup-commands.json | 2 +- web/messages/en/docs/help-info/backup-commands.json | 2 +- web/messages/es/docs/help-info/backup-commands.json | 2 +- web/messages/fr/docs/help-info/backup-commands.json | 2 +- web/messages/it/docs/help-info/backup-commands.json | 2 +- web/messages/pt/docs/help-info/backup-commands.json | 2 +- web/messages/sk/docs/help-info/backup-commands.json | 2 +- web/messages/sv/docs/help-info/backup-commands.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/messages/de/docs/help-info/backup-commands.json b/web/messages/de/docs/help-info/backup-commands.json index 4652f759..a9005c12 100644 --- a/web/messages/de/docs/help-info/backup-commands.json +++ b/web/messages/de/docs/help-info/backup-commands.json @@ -203,7 +203,7 @@ }, { "command": "qm importdisk ", - "description": "Ein bereits entpacktes raw- oder qcow2-Disk-Image importieren, kein Sicherungsarchiv" + "description": "Eine Datenträgerabbilddatei (zum Beispiel raw, qcow2 oder vmdk) als unbenutzten Datenträger importieren, kein vzdump-Sicherungsarchiv" } ] } diff --git a/web/messages/en/docs/help-info/backup-commands.json b/web/messages/en/docs/help-info/backup-commands.json index ebda4bb7..6fe17d7b 100644 --- a/web/messages/en/docs/help-info/backup-commands.json +++ b/web/messages/en/docs/help-info/backup-commands.json @@ -203,7 +203,7 @@ }, { "command": "qm importdisk ", - "description": "Import an extracted raw or qcow2 disk image, not a backup archive" + "description": "Import a disk image file (for example raw, qcow2 or vmdk) as an unused disk, not a vzdump backup archive" } ] } diff --git a/web/messages/es/docs/help-info/backup-commands.json b/web/messages/es/docs/help-info/backup-commands.json index 9c812806..43d183f1 100644 --- a/web/messages/es/docs/help-info/backup-commands.json +++ b/web/messages/es/docs/help-info/backup-commands.json @@ -203,7 +203,7 @@ }, { "command": "qm importdisk ", - "description": "Importar una imagen de disco raw o qcow2 ya extraída, no un archivo de copia" + "description": "Importar un archivo de imagen de disco (por ejemplo raw, qcow2 o vmdk) como disco sin usar, no un archivo de backup de vzdump" } ] } diff --git a/web/messages/fr/docs/help-info/backup-commands.json b/web/messages/fr/docs/help-info/backup-commands.json index 1328de6f..a149b4d5 100644 --- a/web/messages/fr/docs/help-info/backup-commands.json +++ b/web/messages/fr/docs/help-info/backup-commands.json @@ -203,7 +203,7 @@ }, { "command": "qm importdisk ", - "description": "Importer une image disque raw ou qcow2 déjà extraite, pas une archive de sauvegarde" + "description": "Importer un fichier image disque (par exemple raw, qcow2 ou vmdk) comme disque inutilisé, pas une archive de sauvegarde vzdump" } ] } diff --git a/web/messages/it/docs/help-info/backup-commands.json b/web/messages/it/docs/help-info/backup-commands.json index 7979e74d..15390865 100644 --- a/web/messages/it/docs/help-info/backup-commands.json +++ b/web/messages/it/docs/help-info/backup-commands.json @@ -203,7 +203,7 @@ }, { "command": "qm importdisk ", - "description": "Importa un’immagine disco raw o qcow2 già estratta, non un archivio di backup" + "description": "Importare un file immagine disco (ad esempio raw, qcow2 o vmdk) come disco non utilizzato, non un archivio di backup vzdump" } ] } diff --git a/web/messages/pt/docs/help-info/backup-commands.json b/web/messages/pt/docs/help-info/backup-commands.json index bba20242..ba0265e1 100644 --- a/web/messages/pt/docs/help-info/backup-commands.json +++ b/web/messages/pt/docs/help-info/backup-commands.json @@ -203,7 +203,7 @@ }, { "command": "qm importdisk ", - "description": "Importar uma imagem de disco raw ou qcow2 já extraída, não um arquivo de cópia" + "description": "Importar um ficheiro de imagem de disco (por exemplo raw, qcow2 ou vmdk) como disco não utilizado, não um arquivo de backup vzdump" } ] } diff --git a/web/messages/sk/docs/help-info/backup-commands.json b/web/messages/sk/docs/help-info/backup-commands.json index 25608e55..dc8760ca 100644 --- a/web/messages/sk/docs/help-info/backup-commands.json +++ b/web/messages/sk/docs/help-info/backup-commands.json @@ -203,7 +203,7 @@ }, { "command": "qm importdisk ", - "description": "Importovať už extrahovaný obraz disku raw alebo qcow2, nie archív zálohy" + "description": "Importovať súbor obrazu disku (napríklad raw, qcow2 alebo vmdk) ako nepoužitý disk, nie archív zálohy vzdump" } ] } diff --git a/web/messages/sv/docs/help-info/backup-commands.json b/web/messages/sv/docs/help-info/backup-commands.json index 1f82d85d..0ba26cb5 100644 --- a/web/messages/sv/docs/help-info/backup-commands.json +++ b/web/messages/sv/docs/help-info/backup-commands.json @@ -203,7 +203,7 @@ }, { "command": "qm importdisk ", - "description": "Importera en redan extraherad raw- eller qcow2-diskavbild, inte ett säkerhetskopieringsarkiv" + "description": "Importera en diskavbildsfil (till exempel raw, qcow2 eller vmdk) som en oanvänd disk, inte ett vzdump-säkerhetskopiearkiv" } ] } From d07b970f8b8c34ee1e41697e155be9cc604833dd Mon Sep 17 00:00:00 2001 From: MacRimi <123239993+MacRimi@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:14:37 +0200 Subject: [PATCH 72/73] Describe the installer, uninstaller and AI languages as the code does - The installer runs through bash -c with wget, not curl | bash - The .bashrc and MOTD backups are created by Post-Install - Thirteen languages belong to the AI language selector --- web/messages/de/docs/installation.json | 4 ++-- web/messages/de/docs/introduction.json | 2 +- web/messages/en/docs/installation.json | 4 ++-- web/messages/en/docs/introduction.json | 2 +- web/messages/es/docs/installation.json | 4 ++-- web/messages/es/docs/introduction.json | 2 +- web/messages/fr/docs/installation.json | 4 ++-- web/messages/fr/docs/introduction.json | 2 +- web/messages/it/docs/installation.json | 4 ++-- web/messages/it/docs/introduction.json | 2 +- web/messages/pt/docs/installation.json | 4 ++-- web/messages/pt/docs/introduction.json | 2 +- web/messages/sk/docs/installation.json | 4 ++-- web/messages/sk/docs/introduction.json | 2 +- web/messages/sv/docs/installation.json | 4 ++-- web/messages/sv/docs/introduction.json | 2 +- 16 files changed, 24 insertions(+), 24 deletions(-) diff --git a/web/messages/de/docs/installation.json b/web/messages/de/docs/installation.json index 1fd528fc..e8f31748 100644 --- a/web/messages/de/docs/installation.json +++ b/web/messages/de/docs/installation.json @@ -61,12 +61,12 @@ }, "uninstall": { "heading": "Deinstallation", - "body": "In ProxMenux: Einstellungen → ProxMenux deinstallieren. Die Deinstallation entfernt den Skriptbaum, das Startskript und den Monitor-Dienst sowie auf Wunsch ausgewählte Abhängigkeiten. /root/.bashrc und /etc/motd werden aus den bei der Installation angelegten Sicherungen wiederhergestellt, sofern diese vorhanden sind. Vollständige Anleitung: ProxMenux deinstallieren." + "body": "In ProxMenux: Einstellungen → ProxMenux deinstallieren. Die Deinstallation entfernt den Skriptbaum, das Startskript und den Monitor-Dienst sowie auf Wunsch ausgewählte Abhängigkeiten. /root/.bashrc und /etc/motd werden aus den von Post-Install angelegten Sicherungen wiederhergestellt, sofern diese vorhanden sind (andernfalls wird die ProxMenux-Zeile aus der MOTD entfernt). Vollständige Anleitung: ProxMenux deinstallieren." }, "troubleshoot": { "heading": "Fehlerbehebung", "virustotalTitle": "VirusTotal markiert die Installations-URL", - "virustotalBody": "Der in Issue #162 gemeldete Treffer von Chong Lua Dao bei 1 von 95 Prüfungen wurde vom Maintainer als Fehlalarm eingestuft. Der Installer verwendet das Muster curl | bash und kann jq aus dessen offizieller GitHub-Veröffentlichung herunterladen. Dieses Verhalten kann heuristische Scanner auslösen. Der damalige Bericht ist keine Bewertung aller künftigen Downloads. Der Installer ist quelloffen und überprüfbar. Weitere Hintergründe in Issue #162.", + "virustotalBody": "Der in Issue #162 gemeldete Treffer von Chong Lua Dao bei 1 von 95 Prüfungen wurde vom Maintainer als Fehlalarm eingestuft. Der Installer wird mit einem Befehl gestartet, der das Skript herunterlädt und ausführt (bash -c \"$(wget -qLO - …)\") und kann jq aus dessen offizieller GitHub-Veröffentlichung herunterladen. Dieses Verhalten kann heuristische Scanner auslösen. Der damalige Bericht ist keine Bewertung aller künftigen Downloads. Der Installer ist quelloffen und überprüfbar. Weitere Hintergründe in Issue #162.", "aptTitle": "Installation schlägt mit apt-Fehlern fehl", "aptBody": "Meist fehlt ein Proxmox-Repository oder ist falsch konfiguriert. Der Installer bezieht Abhängigkeiten über apt; fehlerhafte Repository-Einstellungen lassen apt scheitern. Das kommt etwa bei noch nicht aktualisierten Minimalinstallationen von Proxmox 8 vor. Führen Sie zuerst apt-get update manuell aus, beheben Sie alle Fehler und starten Sie den Installer erneut.", "menuTitle": "`menu: command not found` nach der Installation", diff --git a/web/messages/de/docs/introduction.json b/web/messages/de/docs/introduction.json index 5e9013c7..73af0b8f 100644 --- a/web/messages/de/docs/introduction.json +++ b/web/messages/de/docs/introduction.json @@ -113,7 +113,7 @@ }, { "title": "KI-Assistent", - "description": "Optionale Umformulierung von Benachrichtigungen in verständliche Sprache. Sechs Anbieter: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter und lokales Ollama. Dreizehn Sprachen in der Sprachauswahl für Benachrichtigungen.", + "description": "Optionale Umformulierung von Benachrichtigungen in verständliche Sprache. Sechs Anbieter: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter und lokales Ollama. Dreizehn Sprachen in der Sprachauswahl der KI.", "icon": "Sparkles", "href": "/docs/monitor/ai-assistant" }, diff --git a/web/messages/en/docs/installation.json b/web/messages/en/docs/installation.json index 9ab4c5a3..b633ad91 100644 --- a/web/messages/en/docs/installation.json +++ b/web/messages/en/docs/installation.json @@ -61,12 +61,12 @@ }, "uninstall": { "heading": "Uninstalling", - "body": "From inside ProxMenux: Settings → Uninstall ProxMenux. Removes the script tree, launcher and Monitor service, optionally removes selected dependencies, and restores /root/.bashrc and /etc/motd from install-time backups if they exist. Full step-by-step: Uninstall ProxMenux." + "body": "From inside ProxMenux: Settings → Uninstall ProxMenux. Removes the script tree, launcher and Monitor service, optionally removes selected dependencies, and restores /root/.bashrc and /etc/motd from the backups created by Post-Install, if they exist (otherwise it removes the ProxMenux MOTD line). Full step-by-step: Uninstall ProxMenux." }, "troubleshoot": { "heading": "Troubleshooting", "virustotalTitle": "VirusTotal flags the install URL", - "virustotalBody": "The 1/95 result from Chong Lua Dao reported in Issue #162 was identified by the maintainer as a false positive. The installer uses the curl | bash pattern and can download jq from its official GitHub release. This behaviour can trigger heuristic scanners. That historical report does not assess every future download. The installer is open source and reviewable. More context in Issue #162.", + "virustotalBody": "The 1/95 result from Chong Lua Dao reported in Issue #162 was identified by the maintainer as a false positive. The installer is run with a command that downloads and executes the script (bash -c \"$(wget -qLO - …)\") and can download jq from its official GitHub release. This behaviour can trigger heuristic scanners. That historical report does not assess every future download. The installer is open source and reviewable. More context in Issue #162.", "aptTitle": "Install fails with apt errors", "aptBody": "Usually a missing or misconfigured Proxmox repo. The installer pulls dependencies via apt; if the repo config is broken (often the case on bare-bones Proxmox 8 installs that haven't been updated yet), apt fails. Run apt-get update manually first and resolve any errors, then re-run the installer.", "menuTitle": "`menu: command not found` after install", diff --git a/web/messages/en/docs/introduction.json b/web/messages/en/docs/introduction.json index ce4dd696..7781d8dc 100644 --- a/web/messages/en/docs/introduction.json +++ b/web/messages/en/docs/introduction.json @@ -113,7 +113,7 @@ }, { "title": "AI Assistant", - "description": "Optional rewrite of notifications in plain language. Six providers: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter, local Ollama. Thirteen languages in the notification-language selector.", + "description": "Optional rewrite of notifications in plain language. Six providers: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter, local Ollama. Thirteen languages in the AI language selector.", "icon": "Sparkles", "href": "/docs/monitor/ai-assistant" }, diff --git a/web/messages/es/docs/installation.json b/web/messages/es/docs/installation.json index a059d13e..829cf7b4 100644 --- a/web/messages/es/docs/installation.json +++ b/web/messages/es/docs/installation.json @@ -61,12 +61,12 @@ }, "uninstall": { "heading": "Desinstalar", - "body": "Desde ProxMenux: Configuración → Desinstalar ProxMenux. El desinstalador elimina el árbol de scripts, el lanzador y el servicio Monitor, permite eliminar dependencias seleccionadas y restaura /root/.bashrc y /etc/motd desde las copias de la instalación, si existen. Procedimiento completo: Desinstalar ProxMenux." + "body": "Desde ProxMenux: Ajustes → Desinstalar ProxMenux. El desinstalador elimina el árbol de scripts, el lanzador y el servicio Monitor, permite eliminar dependencias seleccionadas y restaura /root/.bashrc y /etc/motd desde los backups que crea Post-Install, si existen (si no, elimina la línea de ProxMenux del MOTD). Procedimiento completo: Desinstalar ProxMenux." }, "troubleshoot": { "heading": "Solución de problemas", "virustotalTitle": "VirusTotal marca la URL de instalación", - "virustotalBody": "El resultado de 1/95 notificado en el issue #162, de Chong Lua Dao, fue identificado por el mantenedor como un falso positivo. El instalador usa el patrón curl | bash y puede descargar jq desde su versión oficial de GitHub. Este comportamiento puede activar análisis heurísticos; aquel informe histórico no determina la seguridad de futuras descargas. El código del instalador es abierto y se puede revisar. Más contexto en el issue #162.", + "virustotalBody": "El resultado de 1/95 notificado en el issue #162, de Chong Lua Dao, fue identificado por el mantenedor como un falso positivo. El instalador se ejecuta con una orden que descarga y ejecuta el script (bash -c \"$(wget -qLO - …)\") y puede descargar jq desde su versión oficial de GitHub. Este comportamiento puede activar análisis heurísticos; aquel informe histórico no determina la seguridad de futuras descargas. El código del instalador es abierto y se puede revisar. Más contexto en el issue #162.", "aptTitle": "La instalación falla con errores de apt", "aptBody": "Suele deberse a un repositorio de Proxmox ausente o mal configurado. El instalador obtiene las dependencias mediante apt: si los repositorios están mal configurados, apt falla. Es habitual en instalaciones mínimas de Proxmox 8 que aún no se han actualizado. Ejecuta primero apt-get update a mano, resuelve los errores y vuelve a ejecutar el instalador.", "menuTitle": "`menu: command not found` tras la instalación", diff --git a/web/messages/es/docs/introduction.json b/web/messages/es/docs/introduction.json index 9d8cb3a2..fdd39690 100644 --- a/web/messages/es/docs/introduction.json +++ b/web/messages/es/docs/introduction.json @@ -113,7 +113,7 @@ }, { "title": "Asistente de IA", - "description": "Reescritura opcional de notificaciones en lenguaje natural. Seis proveedores: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter, Ollama local. Trece idiomas en el selector de notificaciones.", + "description": "Reescritura opcional de notificaciones en lenguaje natural. Seis proveedores: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter, Ollama local. Trece idiomas en el selector de idioma de la IA.", "icon": "Sparkles", "href": "/docs/monitor/ai-assistant" }, diff --git a/web/messages/fr/docs/installation.json b/web/messages/fr/docs/installation.json index a8b6cc46..46cbbbf9 100644 --- a/web/messages/fr/docs/installation.json +++ b/web/messages/fr/docs/installation.json @@ -61,12 +61,12 @@ }, "uninstall": { "heading": "Désinstallation", - "body": "Dans ProxMenux : Paramètres → Désinstaller ProxMenux. La désinstallation supprime l’arborescence des scripts, le lanceur et le service Monitor, ainsi que les dépendances sélectionnées si vous le souhaitez. Elle restaure /root/.bashrc et /etc/motd depuis les sauvegardes de l’installation, si elles existent. Procédure complète : Désinstaller ProxMenux." + "body": "Dans ProxMenux : Paramètres → Désinstaller ProxMenux. La désinstallation supprime l’arborescence des scripts, le lanceur et le service Monitor, ainsi que les dépendances sélectionnées si vous le souhaitez. Elle restaure /root/.bashrc et /etc/motd depuis les sauvegardes créées par Post-Install, si elles existent (sinon, elle supprime la ligne ProxMenux du MOTD). Procédure complète : Désinstaller ProxMenux." }, "troubleshoot": { "heading": "Dépannage", "virustotalTitle": "VirusTotal signale l’URL d’installation comme suspecte", - "virustotalBody": "Le résultat de 1/95 attribué à Chong Lua Dao et signalé dans l’issue #162 a été identifié par le mainteneur comme un faux positif. L’installateur utilise le modèle curl | bash et peut télécharger jq depuis sa version officielle sur GitHub. Ce comportement peut déclencher des analyses heuristiques ; ce rapport historique ne préjuge pas de tous les téléchargements futurs. Le code de l’installateur est ouvert et vérifiable. Plus de contexte dans l’issue #162.", + "virustotalBody": "Le résultat de 1/95 attribué à Chong Lua Dao et signalé dans l’issue #162 a été identifié par le mainteneur comme un faux positif. L’installateur est lancé par une commande qui télécharge puis exécute le script (bash -c \"$(wget -qLO - …)\") et peut télécharger jq depuis sa version officielle sur GitHub. Ce comportement peut déclencher des analyses heuristiques ; ce rapport historique ne préjuge pas de tous les téléchargements futurs. Le code de l’installateur est ouvert et vérifiable. Plus de contexte dans l’issue #162.", "aptTitle": "L'installation échoue avec les erreurs apt", "aptBody": "Il s’agit généralement d’un dépôt Proxmox absent ou mal configuré. L’installateur utilise apt pour obtenir ses dépendances ; une mauvaise configuration des dépôts fait échouer apt. Cela arrive notamment sur des installations minimales de Proxmox 8 non encore mises à jour. Exécutez d’abord apt-get update manuellement, corrigez les erreurs, puis relancez l’installateur.", "menuTitle": "`menu: command not found` après installation", diff --git a/web/messages/fr/docs/introduction.json b/web/messages/fr/docs/introduction.json index 710c26ac..2bba4cb5 100644 --- a/web/messages/fr/docs/introduction.json +++ b/web/messages/fr/docs/introduction.json @@ -113,7 +113,7 @@ }, { "title": "Assistant AI", - "description": "Reformulation facultative des notifications en langage clair. Six fournisseurs : OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter et Ollama en local. Treize langues dans le sélecteur des notifications.", + "description": "Reformulation facultative des notifications en langage clair. Six fournisseurs : OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter et Ollama en local. Treize langues dans le sélecteur de langue de l’IA.", "icon": "Sparkles", "href": "/docs/monitor/ai-assistant" }, diff --git a/web/messages/it/docs/installation.json b/web/messages/it/docs/installation.json index d4158308..84c3791b 100644 --- a/web/messages/it/docs/installation.json +++ b/web/messages/it/docs/installation.json @@ -61,12 +61,12 @@ }, "uninstall": { "heading": "Disinstallare", - "body": "Da ProxMenux: Impostazioni → Disinstalla ProxMenux. La disinstallazione rimuove gli script, il comando di avvio e il servizio Monitor, oltre alle dipendenze selezionate se richiesto. Ripristina /root/.bashrc e /etc/motd dalle copie create all’installazione, se presenti. Procedura completa: Disinstallare ProxMenux." + "body": "Da ProxMenux: Impostazioni → Disinstalla ProxMenux. La disinstallazione rimuove gli script, il comando di avvio e il servizio Monitor, oltre alle dipendenze selezionate se richiesto. Ripristina /root/.bashrc e /etc/motd dalle copie create da Post-Install, se presenti (altrimenti rimuove la riga di ProxMenux dal MOTD). Procedura completa: Disinstallare ProxMenux." }, "troubleshoot": { "heading": "Risoluzione dei problemi", "virustotalTitle": "VirusTotal contrassegna l'URL di installazione", - "virustotalBody": "Il risultato di 1/95 del motore Chong Lua Dao, riportato nella issue #162, è stato identificato dal manutentore come falso positivo. L’installazione usa il modello curl | bash e può scaricare jq dalla sua release ufficiale su GitHub. Questo comportamento può attivare gli scanner euristici; il rapporto storico non costituisce una valutazione di ogni download futuro. Il codice dell’installazione è aperto e verificabile. Altri dettagli nella issue #162.", + "virustotalBody": "Il risultato di 1/95 del motore Chong Lua Dao, riportato nella issue #162, è stato identificato dal manutentore come falso positivo. L’installazione si avvia con un comando che scarica ed esegue lo script (bash -c \"$(wget -qLO - …)\") e può scaricare jq dalla sua release ufficiale su GitHub. Questo comportamento può attivare gli scanner euristici; il rapporto storico non costituisce una valutazione di ogni download futuro. Il codice dell’installazione è aperto e verificabile. Altri dettagli nella issue #162.", "aptTitle": "L’installazione non riesce a causa di errori di apt", "aptBody": "Di solito manca un repository Proxmox o è configurato male. L’installazione ottiene le dipendenze tramite apt, che non riesce a procedere se i repository sono configurati male. Può accadere su installazioni minime di Proxmox 8 non ancora aggiornate. Esegui prima apt-get update manualmente, correggi tutti gli errori e riavvia l’installazione.", "menuTitle": "`menu: command not found` dopo l'installazione", diff --git a/web/messages/it/docs/introduction.json b/web/messages/it/docs/introduction.json index 8d0fea6e..024aeed4 100644 --- a/web/messages/it/docs/introduction.json +++ b/web/messages/it/docs/introduction.json @@ -113,7 +113,7 @@ }, { "title": "Assistente AI", - "description": "Riformulazione facoltativa delle notifiche in un linguaggio chiaro. Sei fornitori: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter e Ollama locale. Tredici lingue nel selettore delle notifiche.", + "description": "Riformulazione facoltativa delle notifiche in un linguaggio chiaro. Sei fornitori: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter e Ollama locale. Tredici lingue nel selettore della lingua dell’IA.", "icon": "Sparkles", "href": "/docs/monitor/ai-assistant" }, diff --git a/web/messages/pt/docs/installation.json b/web/messages/pt/docs/installation.json index 831dcd7b..16faddf9 100644 --- a/web/messages/pt/docs/installation.json +++ b/web/messages/pt/docs/installation.json @@ -61,12 +61,12 @@ }, "uninstall": { "heading": "Desinstalar", - "body": "No ProxMenux: Definições → Desinstalar ProxMenux. A desinstalação remove os scripts, o comando de arranque e o serviço Monitor, além das dependências selecionadas, se assim escolher. Restaura /root/.bashrc e /etc/motd a partir das cópias criadas na instalação, caso existam. Procedimento completo: Desinstalar ProxMenux." + "body": "No ProxMenux: Definições → Desinstalar ProxMenux. A desinstalação remove os scripts, o comando de arranque e o serviço Monitor, além das dependências selecionadas, se assim escolher. Restaura /root/.bashrc e /etc/motd a partir das cópias criadas pelo Post-Install, caso existam (caso contrário, remove a linha do ProxMenux do MOTD). Procedimento completo: Desinstalar ProxMenux." }, "troubleshoot": { "heading": "Resolução de Problemas", "virustotalTitle": "VirusTotal sinaliza o URL de instalação", - "virustotalBody": "O resultado de 1/95 do motor Chong Lua Dao, comunicado na issue #162, foi identificado pelo responsável do projeto como um falso positivo. O instalador usa o padrão curl | bash e pode descarregar jq da sua versão oficial no GitHub. Este comportamento pode ativar análises heurísticas; esse relatório histórico não avalia todos os downloads futuros. O código do instalador é aberto e pode ser analisado. Mais contexto na issue #162.", + "virustotalBody": "O resultado de 1/95 do motor Chong Lua Dao, comunicado na issue #162, foi identificado pelo responsável do projeto como um falso positivo. O instalador é executado com um comando que descarrega e executa o script (bash -c \"$(wget -qLO - …)\") e pode descarregar jq da sua versão oficial no GitHub. Este comportamento pode ativar análises heurísticas; esse relatório histórico não avalia todos os downloads futuros. O código do instalador é aberto e pode ser analisado. Mais contexto na issue #162.", "aptTitle": "A instalação falhou com erros apt", "aptBody": "Normalmente falta um repositório Proxmox ou está mal configurado. O instalador obtém as dependências via apt, que falha se a configuração dos repositórios estiver incorreta. É comum em instalações mínimas do Proxmox 8 ainda não atualizadas. Execute primeiro apt-get update manualmente, resolva todos os erros e volte a executar o instalador.", "menuTitle": "`menu: command not found` após a instalação", diff --git a/web/messages/pt/docs/introduction.json b/web/messages/pt/docs/introduction.json index 7624786e..bba7927b 100644 --- a/web/messages/pt/docs/introduction.json +++ b/web/messages/pt/docs/introduction.json @@ -113,7 +113,7 @@ }, { "title": "Assistente de IA", - "description": "Reformulação opcional das notificações em linguagem clara. Seis fornecedores: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter e Ollama local. Treze idiomas no seletor das notificações.", + "description": "Reformulação opcional das notificações em linguagem clara. Seis fornecedores: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter e Ollama local. Treze idiomas no seletor de idioma da IA.", "icon": "Sparkles", "href": "/docs/monitor/ai-assistant" }, diff --git a/web/messages/sk/docs/installation.json b/web/messages/sk/docs/installation.json index 5569fb8b..5d067516 100644 --- a/web/messages/sk/docs/installation.json +++ b/web/messages/sk/docs/installation.json @@ -61,12 +61,12 @@ }, "uninstall": { "heading": "Odinštalovanie", - "body": "V ProxMenuxe: Nastavenia → Odinštalovať ProxMenux. Odinštalovanie odstráni skripty, spúšťač a službu Monitor a voliteľne aj vybrané závislosti. Súbory /root/.bashrc a /etc/motd obnoví zo záloh vytvorených pri inštalácii, ak sú dostupné. Celý postup: Odinštalovanie ProxMenuxu." + "body": "V ProxMenuxe: Nastavenia → Odinštalovať ProxMenux. Odinštalovanie odstráni skripty, spúšťač a službu Monitor a voliteľne aj vybrané závislosti. Súbory /root/.bashrc a /etc/motd obnoví zo záloh, ktoré vytvoril Post-Install, ak sú dostupné (inak odstráni riadok ProxMenux z MOTD). Celý postup: Odinštalovanie ProxMenuxu." }, "troubleshoot": { "heading": "Riešenie problémov", "virustotalTitle": "VirusTotal označuje URL inštalácie", - "virustotalBody": "Výsledok 1/95 od Chong Lua Dao, nahlásený v issue #162, správca projektu označil za falošný poplach. Inštalátor používa vzor curl | bash a môže stiahnuť jq z jeho oficiálneho vydania na GitHube. Takéto správanie môže spustiť heuristickú detekciu; historické hlásenie nie je hodnotením všetkých budúcich stiahnutí. Inštalátor má otvorený zdrojový kód a možno ho skontrolovať. Ďalšie súvislosti v issue #162.", + "virustotalBody": "Výsledok 1/95 od Chong Lua Dao, nahlásený v issue #162, správca projektu označil za falošný poplach. Inštalátor sa spúšťa príkazom, ktorý skript stiahne a spustí (bash -c \"$(wget -qLO - …)\") a môže stiahnuť jq z jeho oficiálneho vydania na GitHube. Takéto správanie môže spustiť heuristickú detekciu; historické hlásenie nie je hodnotením všetkých budúcich stiahnutí. Inštalátor má otvorený zdrojový kód a možno ho skontrolovať. Ďalšie súvislosti v issue #162.", "aptTitle": "Inštalácia zlyhala s apt chybami", "aptBody": "Zvyčajne chýba repozitár Proxmoxu alebo je nesprávne nastavený. Inštalátor získava závislosti cez apt, ktorý pri chybnej konfigurácii repozitárov zlyhá. Stáva sa to napríklad pri minimálnych inštaláciách Proxmoxu 8, ktoré ešte neboli aktualizované. Najprv ručne spustite apt-get update, opravte všetky chyby a potom znova spustite inštalátor.", "menuTitle": "`menu: command not found` po inštalácii", diff --git a/web/messages/sk/docs/introduction.json b/web/messages/sk/docs/introduction.json index 3502bb16..870fe71c 100644 --- a/web/messages/sk/docs/introduction.json +++ b/web/messages/sk/docs/introduction.json @@ -113,7 +113,7 @@ }, { "title": "AI asistent", - "description": "Voliteľné preformulovanie upozornení do zrozumiteľného jazyka. Šesť poskytovateľov: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter a lokálny Ollama. Trinásť jazykov vo výbere jazyka upozornení.", + "description": "Voliteľné preformulovanie upozornení do zrozumiteľného jazyka. Šesť poskytovateľov: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter a lokálny Ollama. Trinásť jazykov vo výbere jazyka AI.", "icon": "Sparkles", "href": "/docs/monitor/ai-assistant" }, diff --git a/web/messages/sv/docs/installation.json b/web/messages/sv/docs/installation.json index 1ec483a9..9157dac6 100644 --- a/web/messages/sv/docs/installation.json +++ b/web/messages/sv/docs/installation.json @@ -61,12 +61,12 @@ }, "uninstall": { "heading": "Avinstallera", - "body": "I ProxMenux: Inställningar → Avinstallera ProxMenux. Avinstallationen tar bort skriptträdet, startkommandot och Monitor-tjänsten samt, om du väljer det, utvalda beroenden. Den återställer /root/.bashrc och /etc/motd från säkerhetskopiorna som skapades vid installationen, om de finns. Fullständiga instruktioner: Avinstallera ProxMenux." + "body": "I ProxMenux: Inställningar → Avinstallera ProxMenux. Avinstallationen tar bort skriptträdet, startkommandot och Monitor-tjänsten samt, om du väljer det, utvalda beroenden. Den återställer /root/.bashrc och /etc/motd från säkerhetskopiorna som Post-Install skapade, om de finns (annars tas ProxMenux-raden bort ur MOTD). Fullständiga instruktioner: Avinstallera ProxMenux." }, "troubleshoot": { "heading": "Felsökning", "virustotalTitle": "VirusTotal flaggar installationsadressen", - "virustotalBody": "Resultatet 1/95 från Chong Lua Dao, som rapporterades i ärende #162, bedömdes av projektansvarig som ett falsklarm. Installationsprogrammet använder mönstret curl | bash och kan ladda ned jq från dess officiella GitHub-utgåva. Detta beteende kan utlösa heuristiska skannrar. Den historiska rapporten säger inget avgörande om alla framtida nedladdningar. Installationsprogrammet har öppen källkod och kan granskas. Mer bakgrund finns i ärende #162.", + "virustotalBody": "Resultatet 1/95 från Chong Lua Dao, som rapporterades i ärende #162, bedömdes av projektansvarig som ett falsklarm. Installationsprogrammet startas med ett kommando som laddar ned och kör skriptet (bash -c \"$(wget -qLO - …)\") och kan ladda ned jq från dess officiella GitHub-utgåva. Detta beteende kan utlösa heuristiska skannrar. Den historiska rapporten säger inget avgörande om alla framtida nedladdningar. Installationsprogrammet har öppen källkod och kan granskas. Mer bakgrund finns i ärende #162.", "aptTitle": "Installationen misslyckas med apt-fel", "aptBody": "Vanligtvis saknas ett Proxmox-kodarkiv eller så är det felkonfigurerat. Installationsprogrammet hämtar beroenden via apt, som misslyckas om arkivkonfigurationen är fel. Det förekommer bland annat på minimala Proxmox 8-installationer som ännu inte har uppdaterats. Kör först apt-get update manuellt, rätta alla fel och kör sedan installationsprogrammet igen.", "menuTitle": "`menu: command not found` efter installation", diff --git a/web/messages/sv/docs/introduction.json b/web/messages/sv/docs/introduction.json index be6688c6..eb8ebeac 100644 --- a/web/messages/sv/docs/introduction.json +++ b/web/messages/sv/docs/introduction.json @@ -113,7 +113,7 @@ }, { "title": "AI assistent", - "description": "Valfri omformulering av aviseringar till lättbegripligt språk. Sex leverantörer: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter och lokalt körd Ollama. Tretton språk i språkvalet för aviseringar.", + "description": "Valfri omformulering av aviseringar till lättbegripligt språk. Sex leverantörer: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter och lokalt körd Ollama. Tretton språk i AI-språkvalet.", "icon": "Sparkles", "href": "/docs/monitor/ai-assistant" }, From 95b7950ca3965ea6ef6ba7e8e644544517f3402d Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sun, 18 Oct 2026 14:17:16 +0200 Subject: [PATCH 73/73] Fix the help menu NFS scan and align the FAQ with the installer - Option 19 scans an NFS server for its exports with pvesm scan nfs - pveupgrade is described as the interactive package upgrade it starts - The FAQ describes the wget install command and the Post-Install backups of .bashrc and MOTD - Two Spanish error titles match the interface --- lang/de.json | 2 ++ lang/es.json | 2 ++ lang/fr.json | 2 ++ lang/it.json | 2 ++ lang/pt.json | 2 ++ lang/sk.json | 2 ++ lang/sv.json | 2 ++ scripts/help_info_menu.sh | 10 +++++----- web/messages/de/docs/about/faq.json | 4 ++-- web/messages/en/docs/about/faq.json | 4 ++-- web/messages/es/docs/about/faq.json | 4 ++-- web/messages/es/docs/disk-manager/import-disk-lxc.json | 2 +- web/messages/es/docs/storage-share/host-nfs.json | 2 +- web/messages/fr/docs/about/faq.json | 4 ++-- web/messages/it/docs/about/faq.json | 4 ++-- web/messages/pt/docs/about/faq.json | 4 ++-- web/messages/sk/docs/about/faq.json | 4 ++-- web/messages/sv/docs/about/faq.json | 4 ++-- 18 files changed, 37 insertions(+), 23 deletions(-) diff --git a/lang/de.json b/lang/de.json index 1e552659..d1f6b1dc 100644 --- a/lang/de.json +++ b/lang/de.json @@ -1778,6 +1778,7 @@ "Disabling portmapper/rpcbind for security...": "Portmapper/rpcbind wird aus Sicherheitsgründen deaktiviert...", "Discard changes": "Änderungen verwerfen", "Discard unapplied changes?": "Noch nicht angewendete Änderungen verwerfen?", + "Discover NFS exports on a server": "NFS-Exporte eines Servers ermitteln", "Discover targets on portal:": "Entdecken Sie Ziele auf dem Portal:", "Discovering iSCSI targets...": "iSCSI-Ziele werden ermittelt...", "Discovery successful": "Entdeckung erfolgreich", @@ -6008,6 +6009,7 @@ "Start the VM to begin Windows installation from the mounted ISO.": "Starten Sie die VM, um die Windows-Installation von der gemounteten ISO aus zu starten.", "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "Die Anwendungen starten, sobald sie registriert sind? Antworten Sie mit „Nein“, wenn die ursprünglichen Container noch auf einem anderen Host laufen: Beide würden die gleichen Adressen verwenden.", "Start the converted container:": "Starten Sie den konvertierten Container:", + "Start the interactive Proxmox package upgrade": "Interaktive Paketaktualisierung von Proxmox starten", "Start the main system upgrade:": "Starten Sie das Hauptsystem-Upgrade:", "Start the stack with Proxmox": "Starten Sie den Stack mit Proxmox", "Start uploading to PBS — sets a recovery passphrase": "Hochladen auf PBS starten – legt eine Wiederherstellungspassphrase fest", diff --git a/lang/es.json b/lang/es.json index 0638f139..8c5bc834 100644 --- a/lang/es.json +++ b/lang/es.json @@ -1776,6 +1776,7 @@ "Disabling portmapper/rpcbind for security...": "Deshabilitando portmapper/rpcbind por seguridad...", "Discard changes": "Descartar cambios", "Discard unapplied changes?": "¿Descartar los cambios sin aplicar?", + "Discover NFS exports on a server": "Descubrir los exports NFS de un servidor", "Discover targets on portal:": "Detectar destinos en el portal:", "Discovering iSCSI targets...": "Descubriendo destinos iSCSI...", "Discovery successful": "Detección correcta", @@ -5993,6 +5994,7 @@ "Start the VM to begin Windows installation from the mounted ISO.": "Inicie la VM para comenzar la instalación de Windows desde la ISO montada.", "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "¿Iniciar las aplicaciones una vez registradas? Responde No si los contenedores originales siguen en marcha en otro host: los dos usarían las mismas direcciones.", "Start the converted container:": "Inicie el contenedor convertido:", + "Start the interactive Proxmox package upgrade": "Iniciar la actualización interactiva de paquetes de Proxmox", "Start the main system upgrade:": "Inicie la actualización principal del sistema:", "Start the stack with Proxmox": "Iniciar la pila con Proxmox", "Start uploading to PBS — sets a recovery passphrase": "Empezar a subir a PBS — establece una frase de contraseña de recuperación", diff --git a/lang/fr.json b/lang/fr.json index d9509728..81f4f302 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -1778,6 +1778,7 @@ "Disabling portmapper/rpcbind for security...": "Désactivation de portmapper/rpcbind pour la sécurité...", "Discard changes": "Abandonner les modifications", "Discard unapplied changes?": "Abandonner les modifications non appliquées ?", + "Discover NFS exports on a server": "Découvrir les exports NFS d’un serveur", "Discover targets on portal:": "Découvrez les cibles sur le portail :", "Discovering iSCSI targets...": "Découverte des cibles iSCSI...", "Discovery successful": "Découverte réussie", @@ -6008,6 +6009,7 @@ "Start the VM to begin Windows installation from the mounted ISO.": "Démarrez la VM pour commencer l'installation de Windows à partir de l'ISO montée.", "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "Lancer les applications une fois enregistrées ? Répondez Non si les conteneurs d'origine s'exécutent toujours sur un autre hôte : les deux utiliseraient les mêmes adresses.", "Start the converted container:": "Démarrez le conteneur converti :", + "Start the interactive Proxmox package upgrade": "Lancer la mise à niveau interactive des paquets Proxmox", "Start the main system upgrade:": "Démarrez la mise à niveau principale du système :", "Start the stack with Proxmox": "Démarrer la pile avec Proxmox", "Start uploading to PBS — sets a recovery passphrase": "Commencer le téléchargement sur PBS – définit une phrase secrète de récupération", diff --git a/lang/it.json b/lang/it.json index 1828d013..74e297a0 100644 --- a/lang/it.json +++ b/lang/it.json @@ -1778,6 +1778,7 @@ "Disabling portmapper/rpcbind for security...": "Disabilitazione di portmapper/rpcbind per sicurezza...", "Discard changes": "Scarta le modifiche", "Discard unapplied changes?": "Scartare le modifiche non applicate?", + "Discover NFS exports on a server": "Individuare le esportazioni NFS di un server", "Discover targets on portal:": "Scopri target sul portale:", "Discovering iSCSI targets...": "Individuazione dei target iSCSI...", "Discovery successful": "Scoperta riuscita", @@ -6008,6 +6009,7 @@ "Start the VM to begin Windows installation from the mounted ISO.": "Avvia la VM per iniziare l’installazione di Windows dalla ISO montata.", "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "Avviare le applicazioni dopo la registrazione? Rispondi No se i container originali sono ancora in esecuzione su un altro host: entrambi userebbero gli stessi indirizzi.", "Start the converted container:": "Avvia il container convertito:", + "Start the interactive Proxmox package upgrade": "Avviare l’aggiornamento interattivo dei pacchetti Proxmox", "Start the main system upgrade:": "Avvia l’aggiornamento principale del sistema:", "Start the stack with Proxmox": "Avvia lo stack con Proxmox", "Start uploading to PBS — sets a recovery passphrase": "Avvia il caricamento su PBS — viene impostata una passphrase di ripristino", diff --git a/lang/pt.json b/lang/pt.json index ade30ee9..00269efe 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -1778,6 +1778,7 @@ "Disabling portmapper/rpcbind for security...": "Desativando portmapper/rpcbind por segurança...", "Discard changes": "Descartar alterações", "Discard unapplied changes?": "Descartar as alterações por aplicar?", + "Discover NFS exports on a server": "Descobrir as exportações NFS de um servidor", "Discover targets on portal:": "Descubra alvos no portal:", "Discovering iSCSI targets...": "Descobrindo alvos iSCSI...", "Discovery successful": "Descoberta bem-sucedida", @@ -6008,6 +6009,7 @@ "Start the VM to begin Windows installation from the mounted ISO.": "Inicie a VM para iniciar a instalação do Windows a partir do ISO montado.", "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "Iniciar os aplicativos assim que estiverem registrados? Responda Não se os contêineres originais ainda estiverem em execução em outro host: ambos usariam os mesmos endereços.", "Start the converted container:": "Inicie o contêiner convertido:", + "Start the interactive Proxmox package upgrade": "Iniciar a atualização interativa de pacotes do Proxmox", "Start the main system upgrade:": "Inicie a atualização principal do sistema:", "Start the stack with Proxmox": "Iniciar a pilha com Proxmox", "Start uploading to PBS — sets a recovery passphrase": "comece a enviar para o PBS – define uma senha de recuperação", diff --git a/lang/sk.json b/lang/sk.json index becda058..ae7dd52b 100644 --- a/lang/sk.json +++ b/lang/sk.json @@ -1778,6 +1778,7 @@ "Disabling portmapper/rpcbind for security...": "Z bezpečnostných dôvodov vypínam portmapper/rpcbind...", "Discard changes": "Zahodiť zmeny", "Discard unapplied changes?": "Zahodiť nepoužité zmeny?", + "Discover NFS exports on a server": "Zistiť NFS exporty servera", "Discover targets on portal:": "Vyhľadať targety na portáli:", "Discovering iSCSI targets...": "Vyhľadávam iSCSI targety...", "Discovery successful": "Vyhľadanie bolo úspešné", @@ -6010,6 +6011,7 @@ "Start the VM to begin Windows installation from the mounted ISO.": "Spustite VM a začnite inštaláciu Windowsu z pripojeného ISO.", "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "Spustiť aplikácie po ich zaregistrovaní? Odpoveď Nie, ak pôvodné kontajnery stále bežia na inom hostiteľovi: oba by používali rovnaké adresy.", "Start the converted container:": "Spustiť prevedený kontajner:", + "Start the interactive Proxmox package upgrade": "Spustiť interaktívnu aktualizáciu balíkov Proxmoxu", "Start the main system upgrade:": "Spustite hlavnú aktualizáciu systému:", "Start the stack with Proxmox": "Spustiť zásobník s Proxmox", "Start uploading to PBS — sets a recovery passphrase": "Spustiť nahrávanie do PBS - nastaví obnovovaciu frázu", diff --git a/lang/sv.json b/lang/sv.json index 663e5e28..25db3060 100644 --- a/lang/sv.json +++ b/lang/sv.json @@ -1778,6 +1778,7 @@ "Disabling portmapper/rpcbind for security...": "Inaktiverar portmapper/rpcbind för säkerhet...", "Discard changes": "Kasta ändringar", "Discard unapplied changes?": "Kasta ändringar som inte har tillämpats?", + "Discover NFS exports on a server": "Hitta NFS-exporter på en server", "Discover targets on portal:": "Upptäck mål på portalen:", "Discovering iSCSI targets...": "Upptäcker iSCSI-mål...", "Discovery successful": "Upptäckten lyckades", @@ -6008,6 +6009,7 @@ "Start the VM to begin Windows installation from the mounted ISO.": "Starta den virtuella datorn för att påbörja Windows-installationen från den monterade ISO.", "Start the applications once they are registered? Answer No if the original containers are still running on another host: both would use the same addresses.": "Starta applikationerna när de är registrerade? Svara Nej om de ursprungliga behållarna fortfarande körs på en annan värd: båda skulle använda samma adresser.", "Start the converted container:": "Starta den konverterade behållaren:", + "Start the interactive Proxmox package upgrade": "Starta den interaktiva paketuppgraderingen av Proxmox", "Start the main system upgrade:": "Starta huvudsystemuppgraderingen:", "Start the stack with Proxmox": "Börja stapeln med Proxmox", "Start uploading to PBS — sets a recovery passphrase": "Börja ladda upp till PBS — ställer in en återställningslösenfras", diff --git a/scripts/help_info_menu.sh b/scripts/help_info_menu.sh index 770400ca..cb1c02a9 100644 --- a/scripts/help_info_menu.sh +++ b/scripts/help_info_menu.sh @@ -308,7 +308,7 @@ show_storage_commands() { echo -e "16) ${GREEN}cat /etc/pve/storage.cfg${NC} - $(translate 'Show Proxmox storage configuration')" echo -e "17) ${GREEN}pvesm status${NC} - $(translate 'Show status of all storage pools')" echo -e "18) ${GREEN}pvesm list ${NC} - $(translate 'List content of specific storage')" - echo -e "19) ${GREEN}pvesm scan ${NC} - $(translate 'Scan storage for new content')" + echo -e "19) ${GREEN}pvesm scan nfs ${NC} - $(translate 'Discover NFS exports on a server')" echo -e "20) ${GREEN}qm importdisk ${NC} - $(translate 'Import disk image to VM')" echo -e "21) ${GREEN}qm set - ${NC} - $(translate 'Add physical disk to VM via') passthrough" echo -e "22) ${GREEN}qemu-img convert -O ${NC} - $(translate 'Convert disk image format')" @@ -358,9 +358,9 @@ show_storage_commands() { cmd="pvesm list $store" ;; 19) - echo -en "${TAB}${BOLD}${YW}${HOLD}$(translate 'Enter storage ID: ')${CL}" - read -r store - cmd="pvesm scan $store" + echo -en "${TAB}${BOLD}${YW}${HOLD}$(translate 'Enter NFS server IP or hostname:') ${CL}" + read -r server + cmd="pvesm scan nfs $server" ;; 20) echo -en "${TAB}${BOLD}${YW}${HOLD}$(translate 'Enter VM ID: ')${CL}" @@ -652,7 +652,7 @@ show_update_commands() { echo -e " 1) ${GREEN}apt update && apt upgrade -y${NC} - $(translate 'Update and upgrade all system packages')" echo -e " 2) ${GREEN}apt dist-upgrade -y${NC} - $(translate 'Full system upgrade, including dependencies')" echo -e " 3) ${GREEN}pveupdate${NC} - $(translate 'Update Proxmox package lists')" - echo -e " 4) ${GREEN}pveupgrade${NC} - $(translate 'Show available Proxmox upgrades')" + echo -e " 4) ${GREEN}pveupgrade${NC} - $(translate 'Start the interactive Proxmox package upgrade')" echo -e " 5) ${GREEN}apt autoremove --purge${NC} - $(translate 'Remove unused packages and their config')" echo -e " ${DEF}0) $(translate ' Back to previous menu or Esc + Enter')" echo diff --git a/web/messages/de/docs/about/faq.json b/web/messages/de/docs/about/faq.json index 579a8de6..737e140c 100644 --- a/web/messages/de/docs/about/faq.json +++ b/web/messages/de/docs/about/faq.json @@ -83,12 +83,12 @@ }, "q10": { "question": "Wie deinstalliere ich ProxMenux?", - "p1Rich": "In ProxMenux: Einstellungen → ProxMenux deinstallieren. Die Deinstallation entfernt den Skriptbaum, das Startskript und den Monitor-Dienst sowie auf Wunsch ausgewählte Abhängigkeiten. /root/.bashrc und /etc/motd werden aus den bei der Installation angelegten Sicherungen wiederhergestellt, sofern diese vorhanden sind.", + "p1Rich": "In ProxMenux: Einstellungen → ProxMenux deinstallieren. Die Deinstallation entfernt den Skriptbaum, das Startskript und den Monitor-Dienst sowie auf Wunsch ausgewählte Abhängigkeiten. /root/.bashrc und /etc/motd werden aus den von Post-Install angelegten Sicherungen wiederhergestellt, sofern diese vorhanden sind (andernfalls wird die ProxMenux-Zeile aus der MOTD entfernt).", "p2Rich": "Die vollständige Anleitung finden Sie unter ProxMenux deinstallieren." }, "q11": { "question": "VirusTotal markiert die Installations-URL - ist es sicher?", - "p1Rich": "Der in Issue #162 gemeldete Treffer von Chong Lua Dao bei 1 von 95 Prüfungen wurde vom Maintainer als Fehlalarm eingestuft. Der Installer verwendet das Muster curl | bash und kann jq aus dessen offizieller GitHub-Veröffentlichung herunterladen. Dieses Verhalten kann heuristische Scanner auslösen. Der damalige Bericht ist keine Bewertung aller künftigen Downloads.", + "p1Rich": "Der in Issue #162 gemeldete Treffer von Chong Lua Dao bei 1 von 95 Prüfungen wurde vom Maintainer als Fehlalarm eingestuft. Der Installer wird mit einem Befehl gestartet, der das Skript herunterlädt und ausführt (bash -c \"$(wget -qLO - …)\") und kann jq aus dessen offizieller GitHub-Veröffentlichung herunterladen. Dieses Verhalten kann heuristische Scanner auslösen. Der damalige Bericht ist keine Bewertung aller künftigen Downloads.", "p2Rich": "ProxMenux ist vollständig quelloffen. Sie können das Installationsskript Zeile für Zeile prüfen: install_proxmenux.sh. Weitere Hintergründe finden Sie in Issue #162." } } diff --git a/web/messages/en/docs/about/faq.json b/web/messages/en/docs/about/faq.json index e1a33f96..b1fdc48f 100644 --- a/web/messages/en/docs/about/faq.json +++ b/web/messages/en/docs/about/faq.json @@ -83,12 +83,12 @@ }, "q10": { "question": "How do I uninstall ProxMenux?", - "p1Rich": "From inside ProxMenux: Settings → Uninstall ProxMenux. The uninstaller removes the script tree, the launcher and the Monitor service, optionally removes selected dependencies, and restores /root/.bashrc and /etc/motd from install-time backups if those backups exist.", + "p1Rich": "From inside ProxMenux: Settings → Uninstall ProxMenux. The uninstaller removes the script tree, the launcher and the Monitor service, optionally removes selected dependencies, and restores /root/.bashrc and /etc/motd from the backups created by Post-Install, if they exist (otherwise it removes the ProxMenux MOTD line).", "p2Rich": "Full step-by-step: Uninstall ProxMenux." }, "q11": { "question": "VirusTotal flags the install URL — is it safe?", - "p1Rich": "The 1/95 result reported in Issue #162, from Chong Lua Dao, was identified by the maintainer as a false positive. The installer uses the curl | bash pattern and can download jq from its official GitHub release. Such behaviour can trigger heuristic scanners; the historical report is not a verdict on every future download.", + "p1Rich": "The 1/95 result reported in Issue #162, from Chong Lua Dao, was identified by the maintainer as a false positive. The installer is run with a command that downloads and executes the script (bash -c \"$(wget -qLO - …)\") and can download jq from its official GitHub release. Such behaviour can trigger heuristic scanners; the historical report is not a verdict on every future download.", "p2Rich": "ProxMenux is 100% open source and the install script is reviewable line by line: install_proxmenux.sh. More context in Issue #162." } } diff --git a/web/messages/es/docs/about/faq.json b/web/messages/es/docs/about/faq.json index c6d9252d..5b879271 100644 --- a/web/messages/es/docs/about/faq.json +++ b/web/messages/es/docs/about/faq.json @@ -83,12 +83,12 @@ }, "q10": { "question": "¿Cómo desinstalo ProxMenux?", - "p1Rich": "Desde ProxMenux: Ajustes → Desinstalar ProxMenux. El desinstalador elimina el árbol de scripts, el lanzador y el servicio Monitor, permite eliminar dependencias seleccionadas y restaura /root/.bashrc y /etc/motd desde los backups hechos al instalar, si existen.", + "p1Rich": "Desde ProxMenux: Ajustes → Desinstalar ProxMenux. El desinstalador elimina el árbol de scripts, el lanzador y el servicio Monitor, permite eliminar dependencias seleccionadas y restaura /root/.bashrc y /etc/motd desde los backups que crea Post-Install, si existen (si no, elimina la línea de ProxMenux del MOTD).", "p2Rich": "Paso a paso completo: Desinstalar ProxMenux." }, "q11": { "question": "VirusTotal marca la URL de instalación — ¿es seguro?", - "p1Rich": "El resultado de 1/95 notificado en el issue #162, de Chong Lua Dao, fue identificado por el mantenedor como un falso positivo. El instalador usa el patrón curl | bash y puede descargar jq desde su versión oficial de GitHub. Este comportamiento puede activar análisis heurísticos; aquel informe histórico no determina la seguridad de futuras descargas.", + "p1Rich": "El resultado de 1/95 notificado en el issue #162, de Chong Lua Dao, fue identificado por el mantenedor como un falso positivo. El instalador se ejecuta con una orden que descarga y ejecuta el script (bash -c \"$(wget -qLO - …)\") y puede descargar jq desde su versión oficial de GitHub. Este comportamiento puede activar análisis heurísticos; aquel informe histórico no determina la seguridad de futuras descargas.", "p2Rich": "ProxMenux es 100% código abierto y el script de instalación es revisable línea por línea: install_proxmenux.sh. Más contexto en la Issue #162." } } diff --git a/web/messages/es/docs/disk-manager/import-disk-lxc.json b/web/messages/es/docs/disk-manager/import-disk-lxc.json index 1c5ad1b0..9732c752 100644 --- a/web/messages/es/docs/disk-manager/import-disk-lxc.json +++ b/web/messages/es/docs/disk-manager/import-disk-lxc.json @@ -82,7 +82,7 @@ }, "troubleshoot": { "heading": "Solución de problemas", - "unprivTitle": "\"No se puede continuar con un contenedor no privilegiado\"", + "unprivTitle": "\"No se puede continuar con un contenedor sin privilegios\"", "unprivBody": "Rechazaste la conversión, así que el script se detuvo sin cambiar nada. Para continuar, vuelve a ejecutarlo y acepta: el script detiene el contenedor, guarda una copia de su configuración en /etc/pve/lxc/<CTID>.conf.bak y sustituye unprivileged: 1 por unprivileged: 0. Ese cambio por sí solo no convierte los UID/GID de los archivos existentes, así que haz antes un backup del contenedor y corrige los propietarios; como alternativa, restaura o recrea el contenedor como privilegiado.", "permsTitle": "Los permisos dentro del contenedor están mal", "permsBody": "Al montar una partición en un contenedor privilegiado se conserva la propiedad existente; un sistema de archivos recién formateado suele pertenecer a root:root. Si el servicio usa otro usuario, por ejemplo www-data para Nextcloud, comprueba su UID/GID y ajusta los archivos necesarios con chown/chmod. Los cambios afectan también al disco subyacente." diff --git a/web/messages/es/docs/storage-share/host-nfs.json b/web/messages/es/docs/storage-share/host-nfs.json index 9354db11..743e712c 100644 --- a/web/messages/es/docs/storage-share/host-nfs.json +++ b/web/messages/es/docs/storage-share/host-nfs.json @@ -140,7 +140,7 @@ "heading": "Solución de problemas", "noServersTitle": "\"No se encontraron servidores NFS en la red\"", "noServersBody": "El auto-descubrimiento usa nmap -p 2049 --open <subnet>/24. El servidor puede no responder si: está en una VLAN / subnet diferente, su firewall bloquea las sondas nmap (muchos lo hacen) o el puerto 2049 está intencionalmente cerrado en esa interfaz. Usa la opción Manual con la IP o hostname del servidor en su lugar.", - "portTitle": "«El puerto NFS (2049) no es accesible»", + "portTitle": "«No se puede acceder al puerto NFS (2049)»", "portBody": "El ping tuvo éxito pero nc -z -w 3 <server> 2049 falló. Comprueba que el servicio NFS está corriendo en el servidor (systemctl status nfs-server en Linux, Panel de Control → File Services en Synology, plugin NFS en OMV / TrueNAS) y que el firewall permite el 2049 desde el host Proxmox.", "showmountTitle": "\"Failed to connect\" desde showmount", "showmountBody": "El servidor rechazó la consulta de la lista de exports. Causas comunes: el servidor aplica ACLs de cliente estrictas (tu IP de Proxmox no está en la lista permitida), rpcbind no está corriendo en el servidor o el servidor expone solo NFSv4 con showmount deshabilitado. La ruta del export se puede añadir manualmente igualmente si la conoces.", diff --git a/web/messages/fr/docs/about/faq.json b/web/messages/fr/docs/about/faq.json index af1d0db6..1c4b1719 100644 --- a/web/messages/fr/docs/about/faq.json +++ b/web/messages/fr/docs/about/faq.json @@ -83,12 +83,12 @@ }, "q10": { "question": "Comment désinstaller ProxMenux ?", - "p1Rich": "Dans ProxMenux : Paramètres → Désinstaller ProxMenux. La désinstallation supprime l’arborescence des scripts, le lanceur et le service Monitor, ainsi que les dépendances sélectionnées si vous le souhaitez. Elle restaure /root/.bashrc et /etc/motd depuis les sauvegardes de l’installation, si elles existent.", + "p1Rich": "Dans ProxMenux : Paramètres → Désinstaller ProxMenux. La désinstallation supprime l’arborescence des scripts, le lanceur et le service Monitor, ainsi que les dépendances sélectionnées si vous le souhaitez. Elle restaure /root/.bashrc et /etc/motd depuis les sauvegardes créées par Post-Install, si elles existent (sinon, elle supprime la ligne ProxMenux du MOTD).", "p2Rich": "Étape par étape : Désinstaller ProxMenux." }, "q11": { "question": "VirusTotal affiche l'URL d'installation — est-ce sûr?", - "p1Rich": "Le résultat de 1/95 attribué à Chong Lua Dao et signalé dans l’issue #162 a été identifié par le mainteneur comme un faux positif. L’installateur utilise le modèle curl | bash et peut télécharger jq depuis sa version officielle sur GitHub. Ce comportement peut déclencher des analyses heuristiques ; ce rapport historique ne préjuge pas de tous les téléchargements futurs.", + "p1Rich": "Le résultat de 1/95 attribué à Chong Lua Dao et signalé dans l’issue #162 a été identifié par le mainteneur comme un faux positif. L’installateur est lancé par une commande qui télécharge puis exécute le script (bash -c \"$(wget -qLO - …)\") et peut télécharger jq depuis sa version officielle sur GitHub. Ce comportement peut déclencher des analyses heuristiques ; ce rapport historique ne préjuge pas de tous les téléchargements futurs.", "p2Rich": "ProxMenux est entièrement open source. Vous pouvez examiner le script d’installation ligne par ligne : install_proxmenux.sh. Plus de contexte dans l’issue #162." } } diff --git a/web/messages/it/docs/about/faq.json b/web/messages/it/docs/about/faq.json index a0252618..078002c8 100644 --- a/web/messages/it/docs/about/faq.json +++ b/web/messages/it/docs/about/faq.json @@ -83,12 +83,12 @@ }, "q10": { "question": "Come posso disinstallare ProxMenux?", - "p1Rich": "Da ProxMenux: Impostazioni → Disinstalla ProxMenux. La disinstallazione rimuove gli script, il comando di avvio e il servizio Monitor, oltre alle dipendenze selezionate se richiesto. Ripristina /root/.bashrc e /etc/motd dalle copie create all’installazione, se presenti.", + "p1Rich": "Da ProxMenux: Impostazioni → Disinstalla ProxMenux. La disinstallazione rimuove gli script, il comando di avvio e il servizio Monitor, oltre alle dipendenze selezionate se richiesto. Ripristina /root/.bashrc e /etc/motd dalle copie create da Post-Install, se presenti (altrimenti rimuove la riga di ProxMenux dal MOTD).", "p2Rich": "Procedura completa: Disinstallare ProxMenux." }, "q11": { "question": "VirusTotal contrassegna l'URL di installazione — è sicuro?", - "p1Rich": "Il risultato di 1/95 del motore Chong Lua Dao, riportato nella issue #162, è stato identificato dal manutentore come falso positivo. L’installazione usa il modello curl | bash e può scaricare jq dalla sua release ufficiale su GitHub. Questo comportamento può attivare gli scanner euristici; il rapporto storico non costituisce una valutazione di ogni download futuro.", + "p1Rich": "Il risultato di 1/95 del motore Chong Lua Dao, riportato nella issue #162, è stato identificato dal manutentore come falso positivo. L’installazione si avvia con un comando che scarica ed esegue lo script (bash -c \"$(wget -qLO - …)\") e può scaricare jq dalla sua release ufficiale su GitHub. Questo comportamento può attivare gli scanner euristici; il rapporto storico non costituisce una valutazione di ogni download futuro.", "p2Rich": "ProxMenux è completamente open source e puoi esaminare lo script di installazione riga per riga: install_proxmenux.sh. Altri dettagli nella issue #162." } } diff --git a/web/messages/pt/docs/about/faq.json b/web/messages/pt/docs/about/faq.json index ba153648..71549138 100644 --- a/web/messages/pt/docs/about/faq.json +++ b/web/messages/pt/docs/about/faq.json @@ -83,12 +83,12 @@ }, "q10": { "question": "Como faço para desinstalar ProxMenux?", - "p1Rich": "No ProxMenux: Definições → Desinstalar ProxMenux. A desinstalação remove os scripts, o comando de arranque e o serviço Monitor, além das dependências selecionadas, se assim escolher. Restaura /root/.bashrc e /etc/motd a partir das cópias criadas na instalação, caso existam.", + "p1Rich": "No ProxMenux: Definições → Desinstalar ProxMenux. A desinstalação remove os scripts, o comando de arranque e o serviço Monitor, além das dependências selecionadas, se assim escolher. Restaura /root/.bashrc e /etc/motd a partir das cópias criadas pelo Post-Install, caso existam (caso contrário, remove a linha do ProxMenux do MOTD).", "p2Rich": "Passo a passo completo: Desinstalar ProxMenux." }, "q11": { "question": "VirusTotal sinaliza o URL de instalação — é seguro?", - "p1Rich": "O resultado de 1/95 do motor Chong Lua Dao, comunicado na issue #162, foi identificado pelo responsável do projeto como um falso positivo. O instalador usa o padrão curl | bash e pode descarregar jq da sua versão oficial no GitHub. Este comportamento pode ativar análises heurísticas; esse relatório histórico não avalia todos os downloads futuros.", + "p1Rich": "O resultado de 1/95 do motor Chong Lua Dao, comunicado na issue #162, foi identificado pelo responsável do projeto como um falso positivo. O instalador é executado com um comando que descarrega e executa o script (bash -c \"$(wget -qLO - …)\") e pode descarregar jq da sua versão oficial no GitHub. Este comportamento pode ativar análises heurísticas; esse relatório histórico não avalia todos os downloads futuros.", "p2Rich": "O ProxMenux é totalmente de código aberto e pode analisar o script de instalação linha a linha: install_proxmenux.sh. Mais contexto na issue #162." } } diff --git a/web/messages/sk/docs/about/faq.json b/web/messages/sk/docs/about/faq.json index 52fe8bd1..f3d5e07f 100644 --- a/web/messages/sk/docs/about/faq.json +++ b/web/messages/sk/docs/about/faq.json @@ -83,12 +83,12 @@ }, "q10": { "question": "Ako odinštalujem ProxMenux?", - "p1Rich": "V ProxMenuxe: Nastavenia → Odinštalovať ProxMenux. Odinštalovanie odstráni skripty, spúšťač a službu Monitor a voliteľne aj vybrané závislosti. Súbory /root/.bashrc a /etc/motd obnoví zo záloh vytvorených pri inštalácii, ak sú dostupné.", + "p1Rich": "V ProxMenuxe: Nastavenia → Odinštalovať ProxMenux. Odinštalovanie odstráni skripty, spúšťač a službu Monitor a voliteľne aj vybrané závislosti. Súbory /root/.bashrc a /etc/motd obnoví zo záloh, ktoré vytvoril Post-Install, ak sú dostupné (inak odstráni riadok ProxMenux z MOTD).", "p2Rich": "Celý postup nájdete na stránke Odinštalovanie ProxMenuxu." }, "q11": { "question": "VirusTotal označuje inštalačnú URL ako podozrivú — je bezpečná?", - "p1Rich": "Výsledok 1/95 od Chong Lua Dao, nahlásený v issue #162, správca projektu označil za falošný poplach. Inštalátor používa vzor curl | bash a môže stiahnuť jq z jeho oficiálneho vydania na GitHube. Takéto správanie môže spustiť heuristickú detekciu; historické hlásenie nie je hodnotením všetkých budúcich stiahnutí.", + "p1Rich": "Výsledok 1/95 od Chong Lua Dao, nahlásený v issue #162, správca projektu označil za falošný poplach. Inštalátor sa spúšťa príkazom, ktorý skript stiahne a spustí (bash -c \"$(wget -qLO - …)\") a môže stiahnuť jq z jeho oficiálneho vydania na GitHube. Takéto správanie môže spustiť heuristickú detekciu; historické hlásenie nie je hodnotením všetkých budúcich stiahnutí.", "p2Rich": "ProxMenux má úplne otvorený zdrojový kód a inštalačný skript si môžete skontrolovať riadok po riadku: install_proxmenux.sh. Ďalšie súvislosti nájdete v issue #162." } } diff --git a/web/messages/sv/docs/about/faq.json b/web/messages/sv/docs/about/faq.json index ce2459dc..a39c07b9 100644 --- a/web/messages/sv/docs/about/faq.json +++ b/web/messages/sv/docs/about/faq.json @@ -83,12 +83,12 @@ }, "q10": { "question": "Hur avinstallerar jag ProxMenux?", - "p1Rich": "I ProxMenux: Inställningar → Avinstallera ProxMenux. Avinstallationen tar bort skriptträdet, startkommandot och Monitor-tjänsten samt, om du väljer det, utvalda beroenden. Den återställer /root/.bashrc och /etc/motd från säkerhetskopiorna som skapades vid installationen, om de finns.", + "p1Rich": "I ProxMenux: Inställningar → Avinstallera ProxMenux. Avinstallationen tar bort skriptträdet, startkommandot och Monitor-tjänsten samt, om du väljer det, utvalda beroenden. Den återställer /root/.bashrc och /etc/motd från säkerhetskopiorna som Post-Install skapade, om de finns (annars tas ProxMenux-raden bort ur MOTD).", "p2Rich": "Fullständiga instruktioner: Avinstallera ProxMenux." }, "q11": { "question": "VirusTotal flaggar installationsadressen — är den säker?", - "p1Rich": "Resultatet 1/95 från Chong Lua Dao, som rapporterades i ärende #162, bedömdes av projektansvarig som ett falsklarm. Installationsprogrammet använder mönstret curl | bash och kan ladda ned jq från dess officiella GitHub-utgåva. Detta beteende kan utlösa heuristiska skannrar. Den historiska rapporten säger inget avgörande om alla framtida nedladdningar.", + "p1Rich": "Resultatet 1/95 från Chong Lua Dao, som rapporterades i ärende #162, bedömdes av projektansvarig som ett falsklarm. Installationsprogrammet startas med ett kommando som laddar ned och kör skriptet (bash -c \"$(wget -qLO - …)\") och kan ladda ned jq från dess officiella GitHub-utgåva. Detta beteende kan utlösa heuristiska skannrar. Den historiska rapporten säger inget avgörande om alla framtida nedladdningar.", "p2Rich": "ProxMenux har helt öppen källkod och du kan granska installationsskriptet rad för rad: install_proxmenux.sh. Mer bakgrund finns i ärende #162." } }