#!/usr/bin/env bash set -Eeuo pipefail PRIVATE_IP="${PRIVATE_IP:-192.168.0.5}" MIN_MEMORY_KIB=$((4 * 1024 * 1024)) MIN_DISK_KIB=$((30 * 1024 * 1024)) errors=0 ok() { printf 'OK %s\n' "$*"; } warn() { printf 'WARN %s\n' "$*" >&2; } fail() { printf 'FAIL %s\n' "$*" >&2; errors=$((errors + 1)); } echo "=== ОС и ресурсы ===" . /etc/os-release [[ "${ID:-}" == ubuntu && "${VERSION_ID:-}" == "24.04" ]] \ && ok "Ubuntu ${VERSION_ID}" || warn "Проверено для Ubuntu 24.04; найдено ${PRETTY_NAME:-unknown}" memory_kib="$(awk '/MemTotal/ {print $2}' /proc/meminfo)" ((memory_kib >= MIN_MEMORY_KIB)) && ok "RAM не менее 4 GiB" || fail "SigNoz требует не менее 4 GiB RAM" disk_kib="$(df -Pk /opt 2>/dev/null | awk 'NR==2 {print $4}')" ((disk_kib >= MIN_DISK_KIB)) && ok "/opt: свободно не менее 30 GiB" \ || fail "Для начальной установки рекомендуется не менее 30 GiB свободно в /opt" echo echo "=== Сеть ===" ip -br -4 address ip -4 route ip -4 addr show | grep -Fq "inet ${PRIVATE_IP}/" \ && ok "Приватный адрес ${PRIVATE_IP} назначен" \ || fail "Адрес ${PRIVATE_IP} не найден ни на одном интерфейсе" if getent hosts archive.ubuntu.com registry-1.docker.io ghcr.io >/dev/null; then ok "DNS работает" else fail "DNS не разрешает адреса репозиториев" fi for url in \ https://archive.ubuntu.com \ https://download.docker.com \ https://registry-1.docker.io \ https://github.com \ https://signoz.io; do if curl -4fsSI --connect-timeout 8 --max-time 15 "$url" >/dev/null; then ok "доступен $url" else fail "нет доступа к $url" fi done echo echo "=== Занятость портов ===" for port in 8080 4317 4318; do if ss -H -lnt "( sport = :$port )" | grep -q .; then fail "TCP-порт $port уже занят: $(ss -H -lntp "( sport = :$port )")" else ok "TCP-порт $port свободен" fi done echo timedatectl show --property=NTPSynchronized --property=Timezone --no-pager if ((errors)); then printf '\nОбнаружено ошибок: %d\n' "$errors" >&2 exit 1 fi echo "Проверка завершена успешно."