++ primo caricamento

This commit is contained in:
2026-03-03 13:47:34 +01:00
commit ac495c31dc
5 changed files with 220 additions and 0 deletions

148
bootstrap-garage-layout.sh Normal file
View File

@@ -0,0 +1,148 @@
#!/usr/bin/env bash
set -euo pipefail
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$PROJECT_DIR"
COMPOSE="docker compose"
SERVICE="garage"
GARAGE_BIN="/garage"
GARAGE_CMD="$COMPOSE exec -T $SERVICE $GARAGE_BIN"
ZONE="${GARAGE_LAYOUT_ZONE:-dc1}"
FORCE_CAPACITY_UPDATE=false
for arg in "$@"; do
case "$arg" in
--force-capacity-update)
FORCE_CAPACITY_UPDATE=true
;;
-h|--help)
echo "Uso: $0 [--force-capacity-update]"
echo
echo " --force-capacity-update Riapplica layout se la capacità rilevata differisce da quella attuale del nodo"
exit 0
;;
*)
echo "Errore: opzione non riconosciuta: $arg" >&2
echo "Usa --help per vedere le opzioni disponibili." >&2
exit 1
;;
esac
done
get_env_value() {
local key="$1"
local env_file="$PROJECT_DIR/.env"
if [[ -n "${!key:-}" ]]; then
printf '%s' "${!key}"
return 0
fi
if [[ -f "$env_file" ]]; then
awk -F= -v k="$key" '$1==k {print $2; exit}' "$env_file"
return 0
fi
return 1
}
detect_capacity_gb() {
local data_path="$1"
local normalized_path="$data_path"
if [[ "$data_path" != /* ]]; then
normalized_path="$PROJECT_DIR/$data_path"
fi
if [[ ! -d "$normalized_path" ]]; then
return 1
fi
local size_gb
size_gb="$(df -BG --output=size "$normalized_path" 2>/dev/null | awk 'NR==2 {gsub(/G/,"",$1); print $1}')"
if [[ "$size_gb" =~ ^[0-9]+$ ]] && [[ "$size_gb" -gt 0 ]]; then
printf '%sG' "$size_gb"
return 0
fi
local used_gb
used_gb="$(du -sBG "$normalized_path" 2>/dev/null | awk '{gsub(/G/,"",$1); print $1}')"
if [[ "$used_gb" =~ ^[0-9]+$ ]] && [[ "$used_gb" -gt 0 ]]; then
printf '%sG' "$used_gb"
return 0
fi
return 1
}
if [[ -n "${GARAGE_LAYOUT_CAPACITY:-}" ]]; then
CAPACITY="$GARAGE_LAYOUT_CAPACITY"
else
DATA_PATH="$(get_env_value "GARAGE_DATA_PATH")"
if CAPACITY="$(detect_capacity_gb "$DATA_PATH")"; then
echo "Capacità auto-rilevata da GARAGE_DATA_PATH ($DATA_PATH): $CAPACITY"
else
CAPACITY="100G"
echo "Avviso: capacità non rilevabile da GARAGE_DATA_PATH (${DATA_PATH:-unset}), uso fallback $CAPACITY" >&2
fi
fi
if ! command -v docker >/dev/null 2>&1; then
echo "Errore: docker non trovato nel PATH." >&2
exit 1
fi
if ! $COMPOSE ps --status running "$SERVICE" >/dev/null 2>&1; then
echo "Errore: il servizio '$SERVICE' non risulta avviato. Esegui: docker compose up -d" >&2
exit 1
fi
LAYOUT_OUTPUT="$($GARAGE_CMD layout show)"
LAYOUT_VERSION="$(printf '%s\n' "$LAYOUT_OUTPUT" | sed -n 's/^Current cluster layout version: \([0-9][0-9]*\)$/\1/p')"
LAYOUT_VERSION="${LAYOUT_VERSION:-0}"
STATUS_OUTPUT="$($GARAGE_CMD status)"
NODE_ID="$(printf '%s\n' "$STATUS_OUTPUT" | awk '
/==== HEALTHY NODES ====/ {in_table=1; next}
in_table && /^ID[[:space:]]+/ {next}
in_table && /^[0-9a-f]{8,}/ {print $1; exit}
')"
if [[ -z "$NODE_ID" ]]; then
echo "Errore: nessun nodo healthy trovato su cui applicare il layout." >&2
exit 1
fi
CURRENT_CAPACITY_GB="$(printf '%s\n' "$STATUS_OUTPUT" | awk -v id="$NODE_ID" '$1==id {for (i=1;i<=NF;i++) if ($i ~ /^[0-9.]+$/) {print int($i); exit}}')"
TARGET_CAPACITY_GB="$(printf '%s\n' "$CAPACITY" | sed -n 's/^\([0-9][0-9]*\)G$/\1/p')"
NEEDS_LAYOUT_APPLY=false
if printf '%s\n' "$STATUS_OUTPUT" | grep -q 'NO ROLE ASSIGNED' || [[ "$LAYOUT_VERSION" -eq 0 ]]; then
NEEDS_LAYOUT_APPLY=true
elif [[ "$FORCE_CAPACITY_UPDATE" == true ]] && [[ -n "$CURRENT_CAPACITY_GB" ]] && [[ -n "$TARGET_CAPACITY_GB" ]] && [[ "$CURRENT_CAPACITY_GB" -ne "$TARGET_CAPACITY_GB" ]]; then
NEEDS_LAYOUT_APPLY=true
fi
if [[ "$NEEDS_LAYOUT_APPLY" == true ]]; then
NEXT_VERSION=$((LAYOUT_VERSION + 1))
if [[ "$FORCE_CAPACITY_UPDATE" == true ]] && [[ "$LAYOUT_VERSION" -gt 0 ]]; then
echo "Aggiornamento capacità forzato richiesto (attuale=${CURRENT_CAPACITY_GB:-unknown}G, target=$CAPACITY)."
else
echo "Layout non pronto (version=$LAYOUT_VERSION)."
fi
echo "Applico ruolo al nodo $NODE_ID (zone=$ZONE, capacity=$CAPACITY)..."
$GARAGE_CMD layout assign -z "$ZONE" -c "$CAPACITY" "$NODE_ID" >/dev/null
$GARAGE_CMD layout apply --version "$NEXT_VERSION" >/dev/null
echo "Layout applicato (version=$NEXT_VERSION)."
else
echo "Layout già pronto (version=$LAYOUT_VERSION), nessuna modifica necessaria."
fi
echo
$GARAGE_CMD status