#!/usr/bin/env bash set -euo pipefail C_GR="\033[32m"; C_YE="\033[33m"; C_RD="\033[31m"; C_BL="\033[34m"; C_OF="\033[0m" say() { echo -e "${C_BL}▸${C_OF} $*"; } ok() { echo -e "${C_GR}✓${C_OF} $*"; } err() { echo -e "${C_RD}✗${C_OF} $*" >&2; } [ "$(id -u)" -eq 0 ] || { err "Запусти под root"; exit 1; } INVENTORY=/etc/log-collector/inventory.yaml [ -f "$INVENTORY" ] || { err "Сначала установи collector (install-collector.sh)"; exit 1; } NAME=""; IP=""; COUNTRY=""; ROLE="vpn" for arg in "$@"; do case "$arg" in --name=*) NAME="${arg#*=}" ;; --ip=*) IP="${arg#*=}" ;; --country=*) COUNTRY="${arg#*=}" ;; --role=*) ROLE="${arg#*=}" ;; esac done ask() { local var=$1 prompt=$2 default=${3:-} val="" if [ -z "${!var+x}" ]; then if ! { exec 3/dev/null; then err "Нет TTY и '${var}' не задано. Передай --${var,,}=VALUE" exit 1 fi exec 3<&- if [ -n "$default" ]; then if ! read -rp "$prompt [$default]: " val /dev/null; then err "Эта нода (ip=$IP) уже в inventory:" grep -n "ip: $IP" "$INVENTORY" exit 1 fi if grep -q "name: $NAME[ ,]" "$INVENTORY" 2>/dev/null; then err "Имя $NAME уже занято" exit 1 fi cp "$INVENTORY" "${INVENTORY}.bak_$(date +%s)" echo " - { country: $COUNTRY, name: $NAME, ip: $IP, role: $ROLE }" >> "$INVENTORY" ok "добавлено в /etc/log-collector/inventory.yaml" ok "теперь collector будет ожидать логи от ноды $NAME ($IP)" echo "" echo "═══ что делать дальше ═══" echo "" echo "Зайди на саму ноду $NAME по своему SSH и запусти uploader:" echo "" echo -e " ${C_BL}ssh root@${IP}${C_OF}" echo -e " ${C_BL}curl -fsSL https://logs.killu.net/install-uploader.sh | bash -s -- \\${C_OF}" . /etc/log-collector/secrets.env echo -e " ${C_BL} --bucket=${S3_BUCKET} \\${C_OF}" echo -e " ${C_BL} --endpoint=${S3_ENDPOINT} \\${C_OF}" echo -e " ${C_BL} --access=${AWS_ACCESS_KEY_ID} \\${C_OF}" echo -e " ${C_BL} --secret=${AWS_SECRET_ACCESS_KEY} \\${C_OF}" echo -e " ${C_BL} --node-name=${NAME}${C_OF}" echo "" echo "Через 5 мин новая нода появится в Telegram-отчёте."