#!/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 probe_https() { local label="$1" local url="$2" shift 2 local code code="$(curl -4sS -o /dev/null -w '%{http_code}' \ --connect-timeout 8 --max-time 15 "$url" || true)" local expected for expected in "$@"; do if [[ "$code" == "$expected" ]]; then ok "доступен $label" return 0 fi done fail "нет доступа к $label (HTTP ${code:-нет ответа})" } # Сайты отвечают 2xx/3xx. Docker Registry API на /v2/ без токена штатно # отдаёт 401; корень registry-1.docker.io часто даёт 404 — это не отказ сети. probe_https https://archive.ubuntu.com https://archive.ubuntu.com \ 200 301 302 303 307 308 probe_https https://download.docker.com https://download.docker.com \ 200 301 302 303 307 308 probe_https https://registry-1.docker.io https://registry-1.docker.io/v2/ \ 200 401 probe_https https://github.com https://github.com \ 200 301 302 303 307 308 probe_https https://signoz.io https://signoz.io \ 200 301 302 303 307 308 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 "Проверка завершена успешно."