Panel full reload — fixed MAIN/LB mirror (native, NO supervisor).

BUILD mirror (lab MAIN 192.168.1.155):
  sudo CMS_PASS=123852 bash /home/pack-mirror.sh

PANEL Full Reload (wait OK each):
  MAIN → LB001 → LB002 → LB003 → CACHE

AUTOMATIC (CMS cron → post_full_reload_cluster.sh):
  1. DB firewall
  2. deploy_abr_cache_fix → run_cluster_sync:
     - relink ABR from existing parent+child rows (FHD/HD/SD)
     - adaptive nginx map
     - NO ffprobe overwrite (keeps M3U children)
  3. push LB credentials
  4. start all LB streams:
     - panel API (start_cluster_abr_streams.php)
     - native_lb_start_streams.sh on each LB (ffmpeg + pid/monitor_pid sync)
  5. verify_cluster_abr.py

LB install hook (post_full_reload_lb.py — runs on each LB right after extract):
  - lib/legacy + libGeoIP.so.1 (real file, not symlink)
  - GeoLite2 from MAIN
  - lb_restore_native.sh (signal_receiver ON, no supervisor)
  - native_lb_start_streams.sh (ffmpeg boot — ionCube stream_monitor broken)

LB.tar.gz includes:
  php.real, lib/legacy, libGeoIP.so.1, lb_restore_native.sh,
  native_ffmpeg_boot.php, native_lb_start_streams.sh, xtream_decoy.php,
  lb_streams_tmpfs_cleanup.sh, install_lb_streams_tmpfs_cron.sh
  (cron every 10 min — purge stale .ts on tmpfs /streams)

CMS must stay online (no CMS reload needed if already deployed):
  balancer.py triggers post_full_reload_cluster.sh after each node reload.
  Manual fallback on CMS: bash pytools/post_full_reload_cluster.sh

Fast Reload (panel — no reinstall):
  bash pytools/fast_reload.sh   → kill nginx/ffmpeg/xtream + start_services
  LB: then native_lb_start_streams.sh (streams restart, brief outage)
  Full Reload keeps streams running; Fast Reload restarts them.

Test: http://CACHE_IP:8880/live/USER/PASS/PARENT_ID.m3u8
