From 7c466b698b18fe38e49e85d518c405a745c5fba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?= <78488229+viktor138irk@users.noreply.github.com> Date: Wed, 6 May 2026 20:20:44 +0900 Subject: [PATCH] Add preflight system requirements checks --- bootstrap.sh | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/bootstrap.sh b/bootstrap.sh index 9436e4c..c572a80 100644 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -16,6 +16,11 @@ RUN_TEST_VM="${VIRTUALITY_CREATE_TEST_VM:-0}" WEB_PORT="${VIRTUALITY_WEB_PORT:-8088}" LOG_DIR="/var/log/virtuality" LOG_FILE="${LOG_DIR}/bootstrap_$(date +%Y%m%d_%H%M%S).log" +MIN_ROOT_FREE_MB="${VIRTUALITY_MIN_ROOT_FREE_MB:-8192}" +MIN_VAR_FREE_MB="${VIRTUALITY_MIN_VAR_FREE_MB:-20480}" +MIN_RAM_MB="${VIRTUALITY_MIN_RAM_MB:-4096}" +MIN_CPU_CORES="${VIRTUALITY_MIN_CPU_CORES:-2}" +SKIP_REQUIREMENTS="${VIRTUALITY_SKIP_REQUIREMENTS:-0}" ESC="\033" RESET="${ESC}[0m" @@ -55,6 +60,56 @@ require_root() { [[ "$EUID" -eq 0 ]] || fail "Запусти от root: curl ... | sudo bash" } +free_mb_for_path() { + local path="$1" + mkdir -p "$path" 2>/dev/null || true + df -Pm "$path" | awk 'NR==2 {print $4}' +} + +check_requirements() { + step "Проверяем минимальные системные требования" + if [[ "$SKIP_REQUIREMENTS" == "1" ]]; then + warn "Проверка требований отключена через VIRTUALITY_SKIP_REQUIREMENTS=1" + return 0 + fi + + local root_free var_free ram_mb cpu_cores + root_free="$(free_mb_for_path /)" + var_free="$(free_mb_for_path /var/lib 2>/dev/null || free_mb_for_path /)" + ram_mb="$(awk '/MemTotal/ {printf "%d", $2/1024}' /proc/meminfo)" + cpu_cores="$(nproc 2>/dev/null || echo 1)" + + if (( root_free >= MIN_ROOT_FREE_MB )); then + ok "Свободно на /: ${root_free} MB минимум ${MIN_ROOT_FREE_MB} MB" + else + fail "Недостаточно места на /: ${root_free} MB. Нужно минимум ${MIN_ROOT_FREE_MB} MB. Очисти диск: apt clean; journalctl --vacuum-time=3d" + fi + + if (( var_free >= MIN_VAR_FREE_MB )); then + ok "Свободно для /var/lib: ${var_free} MB минимум ${MIN_VAR_FREE_MB} MB" + else + fail "Недостаточно места для VM-хранилища /var/lib: ${var_free} MB. Нужно минимум ${MIN_VAR_FREE_MB} MB" + fi + + if (( ram_mb >= MIN_RAM_MB )); then + ok "RAM: ${ram_mb} MB минимум ${MIN_RAM_MB} MB" + else + warn "RAM: ${ram_mb} MB меньше рекомендуемых ${MIN_RAM_MB} MB. Установка возможна, но VM будут ограничены" + fi + + if (( cpu_cores >= MIN_CPU_CORES )); then + ok "CPU cores: ${cpu_cores} минимум ${MIN_CPU_CORES}" + else + warn "CPU cores: ${cpu_cores} меньше рекомендуемых ${MIN_CPU_CORES}" + fi + + if grep -E -q '(vmx|svm)' /proc/cpuinfo; then + ok "CPU virtualization vmx/svm найдена" + else + warn "CPU virtualization vmx/svm не найдена. Проверь BIOS/UEFI или настройки VPS" + fi +} + ensure_user() { if id "$INSTALL_USER" >/dev/null 2>&1; then ok "Пользователь уже существует: ${INSTALL_USER}" @@ -78,6 +133,8 @@ command -v apt >/dev/null 2>&1 || fail "apt не найден. Нужен Debian ok "root подтверждён" ok "apt найден" +check_requirements + step "Устанавливаем базовые пакеты" run_logged "apt update выполнен" apt update run_logged "Установлены sudo/git/curl/ca-certificates" apt install -y sudo git curl ca-certificates openssh-client nano htop @@ -85,6 +142,13 @@ run_logged "Установлены sudo/git/curl/ca-certificates" apt install -y step "Создаём или проверяем пользователя" ensure_user +step "Проверяем место после создания пользователя" +root_free_after="$(free_mb_for_path /)" +if (( root_free_after < MIN_ROOT_FREE_MB )); then + fail "После подготовки пользователя свободного места стало мало: ${root_free_after} MB на /. Очисти диск и повтори установку" +fi +ok "Место после подготовки пользователя: ${root_free_after} MB на /" + step "Клонируем или обновляем репозиторий" if [[ -d "$PROJECT_DIR/.git" ]]; then run_logged "Репозиторий обновлён" run_as_user "cd '$PROJECT_DIR' && git reset --hard origin/main && git pull"