#!/usr/bin/env bash # Applica soft-limit capacity phases su infra/.env (qualità-first). # Uso (sul server, in /opt/matchlivetv/infra): # bash ../scripts/deploy/../infra/scripts/stream_capacity_phase.sh A|B|C # Fase B/C solo DOPO misure QoS/costi — non saltare. set -euo pipefail PHASE="${1:-}" INFRA="$(cd "$(dirname "$0")/.." && pwd)" ENV_FILE="${INFRA}/.env" if [[ ! -f "$ENV_FILE" ]]; then echo "Manca $ENV_FILE" >&2 exit 1 fi case "$PHASE" in A) HOME_MAX=4; CLOUD_MAX=6; MAX_NODES=12; BUDGET=150; SOFT_FREE=2; WARM=1; RELAY=6 ;; B) HOME_MAX=4; CLOUD_MAX=6; MAX_NODES=22; BUDGET=250; SOFT_FREE=3; WARM=2; RELAY=6 ;; C) HOME_MAX=4; CLOUD_MAX=6; MAX_NODES=33; BUDGET=360; SOFT_FREE=4; WARM=2; RELAY=6 ;; *) echo "Uso: $0 A|B|C" >&2 echo " A → soft ~76 (home4 + 12×6)" >&2 echo " B → soft ~136 (dopo misure)" >&2 echo " C → soft ~202 (tetto ≥200)" >&2 exit 1 ;; esac cp -a "$ENV_FILE" "${ENV_FILE}.bak.phase${PHASE}-$(date +%Y%m%d%H%M%S)" set_kv() { local key="$1" val="$2" if grep -qE "^${key}=" "$ENV_FILE"; then sed -i "s|^${key}=.*|${key}=${val}|" "$ENV_FILE" else printf '%s=%s\n' "$key" "$val" >> "$ENV_FILE" fi } set_kv STREAM_NODE_HOME_MAX_PUBLISHERS "$HOME_MAX" set_kv STREAM_CLOUD_MAX_PUBLISHERS "$CLOUD_MAX" set_kv STREAM_AUTOSCALE_MAX_NODES "$MAX_NODES" set_kv STREAM_AUTOSCALE_MONTHLY_BUDGET_EUR "$BUDGET" set_kv STREAM_AUTOSCALE_SOFT_FREE_SLOTS "$SOFT_FREE" set_kv STREAM_AUTOSCALE_WARM_SPARE "$WARM" set_kv RELAY_MAX_CONCURRENT "$RELAY" set_kv STREAM_AUTOSCALE_QUIET_HOURS "02:00-07:00" set_kv STREAM_AUTOSCALE_QUIET_TZ "Europe/Rome" set_kv STREAM_NIGHT_SWEEP_ENABLED "1" echo "Fase $PHASE applicata su $ENV_FILE" echo " home=$HOME_MAX cloud=$CLOUD_MAX max_nodes=$MAX_NODES budget=$BUDGET soft≈$((HOME_MAX + MAX_NODES * CLOUD_MAX))" echo "Riavvia rails+sidekiq e: rails runner 'Streams::NodeRegistry.ensure_home_from_env!'"