#!/usr/bin/env bash set -Eeuo pipefail PRIVATE_IP="${PRIVATE_IP:-192.168.0.5}" ROOT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" CASTING="${ROOT_DIR}/casting.yaml" COMPOSE="${ROOT_DIR}/pours/deployment/compose.yaml" if [[ $EUID -ne 0 ]]; then echo "Запустите через sudo: sudo $0" >&2 exit 1 fi command -v docker >/dev/null || { echo "Сначала установите Docker." >&2; exit 1; } ip -4 addr show | grep -Fq "inet ${PRIVATE_IP}/" || { echo "На ВМ отсутствует приватный адрес ${PRIVATE_IP}." >&2 exit 1 } grep -Fq "${PRIVATE_IP}:4317:4317" "$CASTING" || { echo "PRIVATE_IP не совпадает с адресом в casting.yaml." >&2 exit 1 } if ! command -v foundryctl >/dev/null; then installer="$(mktemp)" trap 'rm -f "$installer"' EXIT curl -fsSL https://signoz.io/foundry.sh -o "$installer" bash "$installer" if [[ -x /root/.local/bin/foundryctl ]]; then install -m 0755 /root/.local/bin/foundryctl /usr/local/bin/foundryctl elif [[ ! -x /usr/local/bin/foundryctl ]]; then echo "foundryctl не найден после установки." >&2 exit 1 fi fi cd "$ROOT_DIR" foundryctl gauge -f "$CASTING" foundryctl forge -f "$CASTING" [[ -f "$COMPOSE" ]] || { echo "Foundry не создал $COMPOSE" >&2; exit 1; } docker compose -f "$COMPOSE" config --quiet # Защита от случайной публикации UI или OTLP на всех интерфейсах. grep -Fq "${PRIVATE_IP}:4317:4317" "$COMPOSE" grep -Fq "${PRIVATE_IP}:4318:4318" "$COMPOSE" grep -Fq "127.0.0.1:8080:8080" "$COMPOSE" if grep -Eq '(^|[[:space:]"-])0\.0\.0\.0:(8080|4317|4318):' "$COMPOSE"; then echo "Остановка: обнаружена публикация служебного порта на 0.0.0.0." >&2 exit 1 fi docker compose -f "$COMPOSE" pull docker compose -f "$COMPOSE" up -d --remove-orphans echo "Ожидание SigNoz UI..." deadline=$((SECONDS + 300)) until curl -fsS --max-time 5 http://127.0.0.1:8080/api/v1/health >/dev/null 2>&1; do if ((SECONDS >= deadline)); then echo "UI не стал готов за 5 минут." >&2 docker compose -f "$COMPOSE" ps -a exit 1 fi sleep 5 done docker compose -f "$COMPOSE" ps -a cat <<'EOF' Базовый SigNoz запущен, но первичная настройка ещё не завершена. Откройте UI через SSH-туннель и создайте первого администратора/организацию. После этого перезапустите ingester и выполните scripts/30-verify-signoz.sh. EOF