#!/usr/bin/env bash set -euo pipefail # ──────────────────────────────────────────────────────────────────────────────── # Назначение: регистрация / deregistration сервиса SeaweedFS master в Consul # Использование: # seaweedfs-consul-register.sh register [SVC_NM] [port] [tags...] # seaweedfs-consul-register.sh deregister [SVC_NM] # ──────────────────────────────────────────────────────────────────────────────── CONSUL_ADDR="${CONSUL_HTTP_ADDR:-http://127.0.0.1:8500}" CONSUL_ADDR="${CONSUL_ADDR:-http://consul.service.lan:8500}" HOST_IP="" for ip in $(hostname -I); do # берём первую "нормальную" IP (не 127.0.0.1, не docker bridge и т.п.) if [[ "$ip" =~ ^10\. || "$ip" =~ ^192\.168\. || "$ip" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]]; then HOST_IP="$ip" break fi done HOST_IP="${HOST_IP:-$(hostname -I | awk '{print $1}')}" # ─── Параметры ─────────────────────────────────────────────────────────────────── ACTION="${1:-}" SVC_NM="${2:-}" SVC_PORT="${3:-}" SVC_ID="${SVC_NM}_$(hostname)" # Если переданы дополнительные теги shift 3 2>/dev/null || true TAGS=("$@") if [[ ${#TAGS[@]} -eq 0 ]]; then TAGS=("prod") fi # ─── Функции ───────────────────────────────────────────────────────────────────── wait_for_consul_leader() { for i in {1..20}; do if curl -k -sf --connect-timeout 3 "${CONSUL_ADDR}/v1/status/leader" | grep -qE ':[0-9]+'; then return 0 fi sleep 1 done echo "ERROR: Consul leader не появился за 20 секунд" >&2 return 1 } register() { wait_for_consul_leader || exit 10 local payload payload="{ \"ID\": \"$SVC_ID\", \"Name\": \"$SVC_NM\", \"Tags\": $(printf '%s\n' "${TAGS[@]}" | awk ' BEGIN { printf "[" } { if (NR > 1) printf "," printf "\"%s\"", $0 } END { printf "]\n" } '), \"Address\": \"$HOST_IP\", \"Port\": $SVC_PORT, \"Check\": { \"TCP\": \"$HOST_IP:$SVC_PORT\", \"Interval\": \"20s\", \"Timeout\": \"4s\", \"DeregisterCriticalServiceAfter\": \"90s\" } }" echo $payload curl -sf -X PUT \ -H "Content-Type: application/json" \ -d "$payload" \ "${CONSUL_ADDR}/v1/agent/service/register" || { echo "Ошибка регистрации сервиса в Consul" >&2 exit 11 } echo "Сервис $SVC_NM ($SVC_ID) → $HOST_IP:$SVC_PORT успешно зарегистрирован" } deregister() { curl -k -sf -X PUT "${CONSUL_ADDR}/v1/agent/service/deregister/$SVC_ID" || true echo "Сервис $SVC_ID удалён из Consul (или уже отсутствовал)" } # ─── Main ──────────────────────────────────────────────────────────────────────── case "$ACTION" in register) register ;; deregister) deregister ;; *) echo "Использование:" echo " $0 register [имя] [порт] [тег1 тег2 ...]" echo " $0 deregister [имя]" exit 1 ;; esac