From 4923b5478a1d8b1ae2104337d4c6fa3c40f9cb75 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 30 Dec 2025 20:33:22 +0000 Subject: [PATCH 01/17] Remove PASSIVE_COMPOSE_PATH --- node_cli/configs/__init__.py | 1 - node_cli/utils/docker_utils.py | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/node_cli/configs/__init__.py b/node_cli/configs/__init__.py index ad4c2216..35d776d8 100644 --- a/node_cli/configs/__init__.py +++ b/node_cli/configs/__init__.py @@ -55,7 +55,6 @@ SGX_CERTIFICATES_DIR_NAME = 'sgx_certs' COMPOSE_PATH = os.path.join(CONTAINER_CONFIG_PATH, 'docker-compose.yml') -PASSIVE_COMPOSE_PATH = os.path.join(CONTAINER_CONFIG_PATH, 'docker-compose-passive.yml') FAIR_COMPOSE_PATH = os.path.join(CONTAINER_CONFIG_PATH, 'docker-compose-fair.yml') STATIC_PARAMS_FILEPATH = os.path.join(CONTAINER_CONFIG_PATH, 'static_params.yaml') FAIR_STATIC_PARAMS_FILEPATH = os.path.join(CONTAINER_CONFIG_PATH, 'fair_static_params.yaml') diff --git a/node_cli/utils/docker_utils.py b/node_cli/utils/docker_utils.py index 9aa95f4f..2bc7b306 100644 --- a/node_cli/utils/docker_utils.py +++ b/node_cli/utils/docker_utils.py @@ -35,7 +35,6 @@ NGINX_CONTAINER_NAME, REMOVED_CONTAINERS_FOLDER_PATH, SGX_CERTIFICATES_DIR_NAME, - PASSIVE_COMPOSE_PATH, ) from node_cli.core.node_options import active_fair, active_skale, passive_fair, passive_skale from node_cli.utils.helper import run_cmd, str_to_bool @@ -292,9 +291,7 @@ def compose_build(env: dict, node_type: NodeType, node_mode: NodeMode): def get_compose_path(node_type: NodeType, node_mode: NodeMode) -> str: - if passive_skale(node_type, node_mode): - return PASSIVE_COMPOSE_PATH - elif active_fair(node_type, node_mode) or passive_fair(node_type, node_mode): + if node_type == NodeType.FAIR: return FAIR_COMPOSE_PATH return COMPOSE_PATH From 45de1fb4c530063753b9de2d5e766d131a38fda2 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Mon, 5 Jan 2026 20:17:31 +0000 Subject: [PATCH 02/17] Add api and watchdog containers to `BASE_PASSIVE_COMPOSE_SERVICES` --- node_cli/utils/docker_utils.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/node_cli/utils/docker_utils.py b/node_cli/utils/docker_utils.py index 2bc7b306..098a61e7 100644 --- a/node_cli/utils/docker_utils.py +++ b/node_cli/utils/docker_utils.py @@ -76,7 +76,13 @@ 'boot-api': 'sk_boot_api', } -BASE_PASSIVE_COMPOSE_SERVICES = {'admin': 'sk_admin', 'nginx': 'sk_nginx', **REDIS_SERVICE_DICT} +BASE_PASSIVE_COMPOSE_SERVICES = { + 'admin': 'sk_admin', + 'nginx': 'sk_nginx', + 'api': 'sk_api', + 'watchdog': 'sk_watchdog', + **REDIS_SERVICE_DICT, +} BASE_PASSIVE_FAIR_COMPOSE_SERVICES = { 'admin': 'sk_admin', From 7b7d589c769e77ca1d5ee68ebd643582073f664c Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Wed, 7 Jan 2026 17:47:15 +0000 Subject: [PATCH 03/17] Set Redis data directory ownership --- node_cli/core/host.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/node_cli/core/host.py b/node_cli/core/host.py index 8c684455..da4be640 100644 --- a/node_cli/core/host.py +++ b/node_cli/core/host.py @@ -19,7 +19,7 @@ import logging import os -from shutil import copyfile +from shutil import copyfile, chown from urllib.parse import urlparse from node_cli.core.resources import update_resource_allocation @@ -94,6 +94,7 @@ def prepare_host(env_filepath: str, env_type: str, allocation: bool = False) -> try: logger.info('Preparing host started') make_dirs() + chown(REDIS_DATA_PATH, user=999, group=1000) save_env_params(env_filepath) if allocation: From fae6a38a0b9183322aa2e0082a5e45594a399fd8 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Fri, 9 Jan 2026 19:50:22 +0000 Subject: [PATCH 04/17] Run `run_host_checks` during passive SKALE node init --- node_cli/operations/base.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/node_cli/operations/base.py b/node_cli/operations/base.py index 94139959..0429ae37 100644 --- a/node_cli/operations/base.py +++ b/node_cli/operations/base.py @@ -291,6 +291,16 @@ def init_passive( env_filepath, env_type=env['ENV_TYPE'], ) + failed_checks = run_host_checks( + env['BLOCK_DEVICE'], + TYPE, + NodeMode.PASSIVE, + env['ENV_TYPE'], + CONTAINER_CONFIG_PATH, + check_type=CheckType.PREINSTALL + ) + if failed_checks: + print_failed_requirements_checks(failed_checks) set_passive_node_options(archive=archive, indexer=indexer) From 0bc7f3a982ac678a3b0718cef8b8f01d1f2fc51f Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Fri, 9 Jan 2026 19:54:49 +0000 Subject: [PATCH 05/17] Run `run_host_checks` during passive SKALE node update --- node_cli/operations/base.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/node_cli/operations/base.py b/node_cli/operations/base.py index 0429ae37..05132995 100644 --- a/node_cli/operations/base.py +++ b/node_cli/operations/base.py @@ -349,6 +349,17 @@ def update_passive(env_filepath: str, env: Dict) -> bool: prepare_host(env_filepath, env['ENV_TYPE'], allocation=True) + failed_checks = run_host_checks( + env['BLOCK_DEVICE'], + TYPE, + NodeMode.PASSIVE, + env['ENV_TYPE'], + CONTAINER_CONFIG_PATH, + check_type=CheckType.PREINSTALL + ) + if failed_checks: + print_failed_requirements_checks(failed_checks) + meta_manager = CliMetaManager() meta_manager.update_meta( VERSION, From 67b68617c710eed098d58c2e97c6361ed982aaf7 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 12:35:18 +0000 Subject: [PATCH 06/17] Move `init_fair_boot` and `update_fair_boot` functions to `fair.py` --- node_cli/operations/__init__.py | 4 +- node_cli/operations/base.py | 75 --------------------------------- node_cli/operations/fair.py | 35 ++++++++++++++- 3 files changed, 36 insertions(+), 78 deletions(-) diff --git a/node_cli/operations/__init__.py b/node_cli/operations/__init__.py index f2ac1a94..7a72b442 100644 --- a/node_cli/operations/__init__.py +++ b/node_cli/operations/__init__.py @@ -21,8 +21,6 @@ update as update_op, init as init_op, init_passive as init_passive_op, - init_fair_boot as init_fair_boot_op, - update_fair_boot as update_fair_boot_op, update_passive as update_passive_op, turn_off as turn_off_op, turn_on as turn_on_op, @@ -31,7 +29,9 @@ configure_nftables, ) from node_cli.operations.fair import ( # noqa + init_fair_boot as init_fair_boot_op, init as init_fair_op, + update_fair_boot as update_fair_boot_op, update as update_fair_op, FairUpdateType, restore as restore_fair_op, diff --git a/node_cli/operations/base.py b/node_cli/operations/base.py index 05132995..1a64d585 100644 --- a/node_cli/operations/base.py +++ b/node_cli/operations/base.py @@ -159,48 +159,6 @@ def update(env_filepath: str, env: Dict, node_mode: NodeMode) -> bool: return True -@checked_host -def update_fair_boot(env_filepath: str, env: Dict, node_mode: NodeMode = NodeMode.ACTIVE) -> bool: - compose_rm(node_type=NodeType.FAIR, node_mode=node_mode, env=env) - remove_dynamic_containers() - cleanup_volume_artifacts(env['BLOCK_DEVICE']) - - sync_skale_node() - ensure_btrfs_kernel_module_autoloaded() - - if env.get('SKIP_DOCKER_CONFIG') != 'True': - configure_docker() - - enable_monitoring = str_to_bool(env.get('MONITORING_CONTAINERS', 'False')) - configure_nftables(enable_monitoring=enable_monitoring) - - generate_nginx_config() - prepare_block_device(env['BLOCK_DEVICE'], force=env['ENFORCE_BTRFS'] == 'True') - - prepare_host(env_filepath, env['ENV_TYPE']) - - meta_manager = FairCliMetaManager() - current_stream = meta_manager.get_meta_info().config_stream - skip_cleanup = env.get('SKIP_DOCKER_CLEANUP') == 'True' - if not skip_cleanup and current_stream != env['NODE_VERSION']: - logger.info( - 'Stream version was changed from %s to %s', - current_stream, - env['NODE_VERSION'], - ) - docker_cleanup() - - meta_manager.update_meta( - VERSION, - env['NODE_VERSION'], - distro.id(), - distro.version(), - ) - update_images(env=env, node_type=NodeType.FAIR, node_mode=NodeMode.ACTIVE) - compose_up(env=env, node_type=NodeType.FAIR, node_mode=NodeMode.ACTIVE, is_fair_boot=True) - return True - - @checked_host def init(env_filepath: str, env: dict, node_mode: NodeMode) -> None: sync_skale_node() @@ -236,39 +194,6 @@ def init(env_filepath: str, env: dict, node_mode: NodeMode) -> None: compose_up(env=env, node_type=NodeType.SKALE, node_mode=node_mode) -@checked_host -def init_fair_boot(env_filepath: str, env: dict, node_mode: NodeMode = NodeMode.ACTIVE) -> None: - sync_skale_node() - cleanup_volume_artifacts(env['BLOCK_DEVICE']) - - ensure_btrfs_kernel_module_autoloaded() - if env.get('SKIP_DOCKER_CONFIG') != 'True': - configure_docker() - - enable_monitoring = str_to_bool(env.get('MONITORING_CONTAINERS', 'False')) - configure_nftables(enable_monitoring=enable_monitoring) - - prepare_host(env_filepath, env_type=env['ENV_TYPE']) - link_env_file() - mark_active_node() - - configure_filebeat() - configure_flask() - generate_nginx_config() - prepare_block_device(env['BLOCK_DEVICE'], force=env['ENFORCE_BTRFS'] == 'True') - - meta_manager = FairCliMetaManager() - meta_manager.update_meta( - VERSION, - env['NODE_VERSION'], - distro.id(), - distro.version(), - ) - update_images(env=env, node_type=NodeType.FAIR, node_mode=NodeMode.ACTIVE) - - compose_up(env=env, node_type=NodeType.FAIR, node_mode=NodeMode.ACTIVE, is_fair_boot=True) - - def init_passive( env_filepath: str, env: dict, diff --git a/node_cli/operations/fair.py b/node_cli/operations/fair.py index ca7baef5..f1e62305 100644 --- a/node_cli/operations/fair.py +++ b/node_cli/operations/fair.py @@ -38,7 +38,7 @@ from node_cli.core.nginx import generate_nginx_config from node_cli.core.schains import cleanup_no_lvm_datadir from node_cli.core.static_config import get_fair_chain_name -from node_cli.core.node_options import set_passive_node_options, upsert_node_mode +from node_cli.core.node_options import mark_active_node, set_passive_node_options, upsert_node_mode from node_cli.fair.record.chain_record import ( get_fair_chain_record, migrate_chain_record, @@ -80,6 +80,39 @@ class FairUpdateType(Enum): FROM_BOOT = 'from_boot' +@checked_host +def init_fair_boot(env_filepath: str, env: dict) -> None: + sync_skale_node() + cleanup_volume_artifacts(env['BLOCK_DEVICE']) + + ensure_btrfs_kernel_module_autoloaded() + if env.get('SKIP_DOCKER_CONFIG') != 'True': + configure_docker() + + enable_monitoring = str_to_bool(env.get('MONITORING_CONTAINERS', 'False')) + configure_nftables(enable_monitoring=enable_monitoring) + + prepare_host(env_filepath, env_type=env['ENV_TYPE']) + link_env_file() + mark_active_node() + + configure_filebeat() + configure_flask() + generate_nginx_config() + prepare_block_device(env['BLOCK_DEVICE'], force=env['ENFORCE_BTRFS'] == 'True') + + meta_manager = FairCliMetaManager() + meta_manager.update_meta( + VERSION, + env['NODE_VERSION'], + distro.id(), + distro.version(), + ) + update_images(env=env, node_type=NodeType.FAIR, node_mode=NodeMode.ACTIVE) + + compose_up(env=env, node_type=NodeType.FAIR, node_mode=NodeMode.ACTIVE, is_fair_boot=True) + + @checked_host def init( env_filepath: str, From 3b0e92dd31c0dbe1355fbf08b3242be0f88950db Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 12:36:01 +0000 Subject: [PATCH 07/17] Delete unused constant `BASE_CONTAINERS_AMOUNT` --- node_cli/core/node.py | 1 - 1 file changed, 1 deletion(-) diff --git a/node_cli/core/node.py b/node_cli/core/node.py index 725deee3..43df3c3a 100644 --- a/node_cli/core/node.py +++ b/node_cli/core/node.py @@ -94,7 +94,6 @@ logger = logging.getLogger(__name__) TEXTS = safe_load_texts() -BASE_CONTAINERS_AMOUNT = 5 BLUEPRINT_NAME = 'node' From 05d1251e88e722e6bece8371ca7c719dbfb8e324 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 13:03:19 +0000 Subject: [PATCH 08/17] Delete unused parameter `unsafe_ok` --- node_cli/cli/passive_node.py | 2 +- node_cli/core/node.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/node_cli/cli/passive_node.py b/node_cli/cli/passive_node.py index 9c92c767..c1f406da 100644 --- a/node_cli/cli/passive_node.py +++ b/node_cli/cli/passive_node.py @@ -69,7 +69,7 @@ def _init_passive( @click.option('--unsafe', 'unsafe_ok', help='Allow unsafe update', hidden=True, is_flag=True) @click.argument('env_file') @streamed_cmd -def _update_passive(env_file, unsafe_ok): +def _update_passive(env_file): update_passive(env_file) diff --git a/node_cli/core/node.py b/node_cli/core/node.py index 43df3c3a..c1264346 100644 --- a/node_cli/core/node.py +++ b/node_cli/core/node.py @@ -206,7 +206,7 @@ def init_passive( @check_inited @check_user -def update_passive(env_filepath: str, unsafe_ok: bool = False) -> None: +def update_passive(env_filepath: str) -> None: logger.info('Node update started') prev_version = CliMetaManager().get_meta_info().version if (__version__ == 'test' or __version__.startswith('2.6')) and prev_version == '2.5.0': From e63a42d9aa86366727e219f48e805a926dd6dff0 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 13:59:25 +0000 Subject: [PATCH 09/17] Remove redundant parentheses --- node_cli/core/resources.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node_cli/core/resources.py b/node_cli/core/resources.py index 68686738..f75a5c1c 100644 --- a/node_cli/core/resources.py +++ b/node_cli/core/resources.py @@ -151,7 +151,7 @@ def get_cpu_alloc(common_config: Dict) -> ResourceAlloc: cpu_proportions = common_config['schain']['cpu'] schain_max_cpu_shares = int(cpu_proportions['skaled'] * MAX_CPU_SHARES) ima_max_cpu_shares = int(cpu_proportions['ima'] * MAX_CPU_SHARES) - return (ResourceAlloc(schain_max_cpu_shares), ResourceAlloc(ima_max_cpu_shares)) + return ResourceAlloc(schain_max_cpu_shares), ResourceAlloc(ima_max_cpu_shares) def verify_disk_size( From 5ba2a8cd111d66289a3754e919ccb6c11fa5d315 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 15:24:22 +0000 Subject: [PATCH 10/17] Fix `tail` parameter type --- node_cli/utils/docker_utils.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/node_cli/utils/docker_utils.py b/node_cli/utils/docker_utils.py index 098a61e7..96e1c10a 100644 --- a/node_cli/utils/docker_utils.py +++ b/node_cli/utils/docker_utils.py @@ -211,12 +211,11 @@ def remove_schain_container_by_name( def backup_container_logs( container: Container, - head: int = DOCKER_DEFAULT_HEAD_LINES, - tail: int = DOCKER_DEFAULT_TAIL_LINES, + tail: int | str = DOCKER_DEFAULT_TAIL_LINES, ) -> None: logger.info(f'Going to backup container logs: {container.name}') logs_backup_filepath = get_logs_backup_filepath(container) - save_container_logs(container, logs_backup_filepath, tail) + save_container_logs(container, logs_backup_filepath, tail=tail) logger.info(f'Old container logs saved to {logs_backup_filepath}, tail: {tail}') @@ -224,7 +223,7 @@ def save_container_logs( container: Container, log_filepath: str, head: int = DOCKER_DEFAULT_HEAD_LINES, - tail: int = DOCKER_DEFAULT_TAIL_LINES, + tail: int | str = DOCKER_DEFAULT_TAIL_LINES, ) -> None: separator = b'=' * 80 + b'\n' tail_lines = container.logs(tail=tail) From 5debc47cff5ce916394a20be420a66c5b26c8232 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 15:25:05 +0000 Subject: [PATCH 11/17] Add `node_mode` parameter --- node_cli/core/node.py | 1 + 1 file changed, 1 insertion(+) diff --git a/node_cli/core/node.py b/node_cli/core/node.py index c1264346..2128d43f 100644 --- a/node_cli/core/node.py +++ b/node_cli/core/node.py @@ -262,6 +262,7 @@ def compose_node_env( else: user_config = get_validated_user_config( node_type=node_type, + node_mode=node_mode, env_filepath=INIT_ENV_FILEPATH, is_fair_boot=is_fair_boot, skip_user_conf_validation=skip_user_conf_validation, From afc79eea94288fce7226f83ca66b51f3fb8c8cf8 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 15:25:35 +0000 Subject: [PATCH 12/17] Clean code --- node_cli/core/checks.py | 1 - node_cli/core/resources.py | 5 +---- node_cli/fair/staking.py | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/node_cli/core/checks.py b/node_cli/core/checks.py index 9c312476..a4c439c9 100644 --- a/node_cli/core/checks.py +++ b/node_cli/core/checks.py @@ -385,7 +385,6 @@ def docker_compose(self) -> CheckResult: ) output = v_cmd_result.stdout.decode('utf-8').rstrip() if v_cmd_result.returncode != 0: - info = f'Checking docker compose version failed with: {output}' return self._failed(name=name, info=output) actual_version = output.split(',')[0].split()[-1].strip() diff --git a/node_cli/core/resources.py b/node_cli/core/resources.py index f75a5c1c..430eee86 100644 --- a/node_cli/core/resources.py +++ b/node_cli/core/resources.py @@ -154,10 +154,7 @@ def get_cpu_alloc(common_config: Dict) -> ResourceAlloc: return ResourceAlloc(schain_max_cpu_shares), ResourceAlloc(ima_max_cpu_shares) -def verify_disk_size( - disk_device: str, - env_configs: dict, -) -> Dict: +def verify_disk_size(disk_device: str, env_configs: dict): disk_size = get_disk_size(disk_device) env_disk_size = env_configs['server']['disk'] check_disk_size(disk_size, env_disk_size) diff --git a/node_cli/fair/staking.py b/node_cli/fair/staking.py index 4b7a4008..95b93adf 100644 --- a/node_cli/fair/staking.py +++ b/node_cli/fair/staking.py @@ -109,7 +109,6 @@ def get_exit_requests(raw: bool = False) -> None: exit_requests = payload.get('exit_requests') if not isinstance(exit_requests, list): error_exit(payload, exit_code=CLIExitCodes.BAD_API_RESPONSE) - return if raw: print(json.dumps(exit_requests, indent=2)) return From 88f6959a6612b95dbcac97e173c2a0656b250d3e Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 15:47:06 +0000 Subject: [PATCH 13/17] Delete duplicated function `ensure_filestorage_mapping` --- node_cli/operations/docker_lvmpy.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/node_cli/operations/docker_lvmpy.py b/node_cli/operations/docker_lvmpy.py index fb70e480..c21328f8 100644 --- a/node_cli/operations/docker_lvmpy.py +++ b/node_cli/operations/docker_lvmpy.py @@ -35,6 +35,7 @@ SCHAINS_MNT_DIR_REGULAR, VOLUME_GROUP, ) +from node_cli.operations.volume import ensure_filestorage_mapping from lvmpy.src.install import setup as setup_lvmpy logger = logging.getLogger(__name__) @@ -49,11 +50,6 @@ def update_docker_lvmpy_env(env): return env -def ensure_filestorage_mapping(mapping_dir=FILESTORAGE_MAPPING): - if not os.path.isdir(FILESTORAGE_MAPPING): - os.makedirs(FILESTORAGE_MAPPING) - - def sync_docker_lvmpy_repo(env): if os.path.isdir(DOCKER_LVMPY_PATH): shutil.rmtree(DOCKER_LVMPY_PATH) From 795f1a363037a0701a17710e79e024c47f3a7841 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 16:38:56 +0000 Subject: [PATCH 14/17] Clean code --- node_cli/core/nftables.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/node_cli/core/nftables.py b/node_cli/core/nftables.py index 042ff2e1..e0059fff 100644 --- a/node_cli/core/nftables.py +++ b/node_cli/core/nftables.py @@ -529,7 +529,6 @@ def add_loopback_rule(self, chain) -> None: def get_base_ruleset(self) -> str: self.nft.set_json_output(False) - output = '' try: cmd = f'list chain {self.family} {self.table} {self.chain}' rc, output, error = self.nft.cmd(cmd) @@ -539,7 +538,6 @@ def get_base_ruleset(self) -> str: finally: self.nft.set_json_output(True) - return output def setup_firewall(self, enable_monitoring: bool = False) -> None: """Setup firewall rules.""" From 6ba32375bad95775dc537e01b85db323e85601ac Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 19:15:34 +0000 Subject: [PATCH 15/17] Fix `get_containers` and `create_logs_dump` functions --- node_cli/core/logs.py | 2 +- node_cli/utils/docker_utils.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/node_cli/core/logs.py b/node_cli/core/logs.py index 67472e96..1563ddfc 100644 --- a/node_cli/core/logs.py +++ b/node_cli/core/logs.py @@ -42,7 +42,7 @@ def create_logs_dump(path, filter_container=None): if filter_container: containers = get_containers(filter_container) else: - containers = get_containers('skale') + containers = get_containers('sk_*') for container in containers: log_filepath = os.path.join(containers_logs_path, f'{container.name}.log') diff --git a/node_cli/utils/docker_utils.py b/node_cli/utils/docker_utils.py index 96e1c10a..e30092a8 100644 --- a/node_cli/utils/docker_utils.py +++ b/node_cli/utils/docker_utils.py @@ -118,8 +118,7 @@ def get_sanitized_container_name(container_info: dict) -> str: def get_containers(container_name_filter=None, _all=True) -> list: - return docker_client().containers.list(all=_all) - + return docker_client().containers.list(all=_all, filters={'name': container_name_filter}) def get_all_schain_containers(_all=True) -> list: return docker_client().containers.list(all=_all, filters={'name': 'sk_skaled_*'}) From 475a2117ae2d47ea65ed49dd943ecff2d5d3d5a2 Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 19:48:23 +0000 Subject: [PATCH 16/17] Delete unused optional parameter `unsafe_ok` --- node_cli/cli/passive_node.py | 1 - 1 file changed, 1 deletion(-) diff --git a/node_cli/cli/passive_node.py b/node_cli/cli/passive_node.py index c1f406da..f86ba99b 100644 --- a/node_cli/cli/passive_node.py +++ b/node_cli/cli/passive_node.py @@ -66,7 +66,6 @@ def _init_passive( expose_value=False, prompt='Are you sure you want to update SKALE node software?', ) -@click.option('--unsafe', 'unsafe_ok', help='Allow unsafe update', hidden=True, is_flag=True) @click.argument('env_file') @streamed_cmd def _update_passive(env_file): From b8dca6562a119d889c6351a235f8720605f9cc7e Mon Sep 17 00:00:00 2001 From: Alex Sheverdin Date: Tue, 13 Jan 2026 19:50:29 +0000 Subject: [PATCH 17/17] Fix `get_containers` function --- node_cli/utils/docker_utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/node_cli/utils/docker_utils.py b/node_cli/utils/docker_utils.py index e30092a8..695a1253 100644 --- a/node_cli/utils/docker_utils.py +++ b/node_cli/utils/docker_utils.py @@ -118,7 +118,11 @@ def get_sanitized_container_name(container_info: dict) -> str: def get_containers(container_name_filter=None, _all=True) -> list: - return docker_client().containers.list(all=_all, filters={'name': container_name_filter}) + filters = {} + if container_name_filter: + filters['name'] = container_name_filter + return docker_client().containers.list(all=_all, filters=filters) + def get_all_schain_containers(_all=True) -> list: return docker_client().containers.list(all=_all, filters={'name': 'sk_skaled_*'})