Add preflight system requirements checks

Этот коммит содержится в:
Виктор
2026-05-06 20:20:44 +09:00
родитель 2260002ca0
Коммит 7c466b698b
+64
Просмотреть файл
@@ -16,6 +16,11 @@ RUN_TEST_VM="${VIRTUALITY_CREATE_TEST_VM:-0}"
WEB_PORT="${VIRTUALITY_WEB_PORT:-8088}" WEB_PORT="${VIRTUALITY_WEB_PORT:-8088}"
LOG_DIR="/var/log/virtuality" LOG_DIR="/var/log/virtuality"
LOG_FILE="${LOG_DIR}/bootstrap_$(date +%Y%m%d_%H%M%S).log" 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" ESC="\033"
RESET="${ESC}[0m" RESET="${ESC}[0m"
@@ -55,6 +60,56 @@ require_root() {
[[ "$EUID" -eq 0 ]] || fail "Запусти от root: curl ... | sudo bash" [[ "$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() { ensure_user() {
if id "$INSTALL_USER" >/dev/null 2>&1; then if id "$INSTALL_USER" >/dev/null 2>&1; then
ok "Пользователь уже существует: ${INSTALL_USER}" ok "Пользователь уже существует: ${INSTALL_USER}"
@@ -78,6 +133,8 @@ command -v apt >/dev/null 2>&1 || fail "apt не найден. Нужен Debian
ok "root подтверждён" ok "root подтверждён"
ok "apt найден" ok "apt найден"
check_requirements
step "Устанавливаем базовые пакеты" step "Устанавливаем базовые пакеты"
run_logged "apt update выполнен" apt update 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 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 "Создаём или проверяем пользователя" step "Создаём или проверяем пользователя"
ensure_user 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 "Клонируем или обновляем репозиторий" step "Клонируем или обновляем репозиторий"
if [[ -d "$PROJECT_DIR/.git" ]]; then if [[ -d "$PROJECT_DIR/.git" ]]; then
run_logged "Репозиторий обновлён" run_as_user "cd '$PROJECT_DIR' && git reset --hard origin/main && git pull" run_logged "Репозиторий обновлён" run_as_user "cd '$PROJECT_DIR' && git reset --hard origin/main && git pull"