#!/bin/bash # ============================================================ # PCA Phobos — updater / rollback # # phobos-update # обновить до последней версии (main) # phobos-update v1.1.0 # обновить до конкретной версии (git tag) # phobos-update --rollback # откатить на предыдущую версию (из бэкапа) # phobos-update --version # показать установленную и последнюю версию # phobos-update --list # список бэкапов для отката # # Обновляет ТОЛЬКО PCA-слой (панель + скрипты онбординга/служебные). # НЕ трогает ключи WireGuard, server.env, клиентов — они сохраняются. # Перед каждым обновлением делает бэкап; откат восстанавливает его. # ============================================================ set -e PHOBOS_DIR=/opt/Phobos PANEL_DIR=/opt/phobos-panel REPO=andrey271192/PCA_Phobos RAW="https://raw.githubusercontent.com/$REPO" BACKUPS="$PHOBOS_DIR/updates" VERFILE="$PANEL_DIR/.version" CUR=$(cat "$VERFILE" 2>/dev/null || echo "unknown") managed_files() { cat </dev/null | tr -d ' \r\n'; } do_backup() { local dir="$BACKUPS/${CUR}-$(date +%Y%m%d-%H%M%S)" mkdir -p "$dir" managed_files | while IFS='|' read -r lp rp; do [ -f "$lp" ] && install -D "$lp" "$dir/$rp" 2>/dev/null || true done echo "$CUR" > "$dir/.fromversion" echo "$dir" } apply_ref() { local ref="$1" managed_files | while IFS='|' read -r lp rp; do local tmp; tmp=$(mktemp) if curl -fsSL -m25 "$RAW/$ref/$rp" -o "$tmp" && [ -s "$tmp" ]; then mkdir -p "$(dirname "$lp")"; mv "$tmp" "$lp" case "$lp" in *.sh|*.py) chmod +x "$lp" 2>/dev/null || true;; esac else rm -f "$tmp"; echo " WARN: не удалось скачать $rp (пропуск)" fi done } ref_exists() { curl -fsSL -m12 "$RAW/$1/app.py" -o /dev/null 2>/dev/null; } case "${1:-}" in --version|-v|--check) echo "Установлено: $CUR" echo "Стабильная: $(latest_version)" beta=$(curl -fsSL -m8 "$RAW/beta/VERSION" 2>/dev/null | tr -d ' \r\n') [ -n "$beta" ] && echo "Бета (beta): $beta" ;; --versions|--tags) echo "Доступные версии (git tags):" curl -fsSL -m10 "https://api.github.com/repos/$REPO/tags?per_page=100" 2>/dev/null \ | grep -oE '"name": *"[^"]+"' | sed 's/.*"name": *"\(.*\)"/ \1/' || echo " (нет данных)" ;; --list) echo "Бэкапы (для отката):" ls -dt "$BACKUPS"/*/ 2>/dev/null | sed 's#.*/updates/##' || echo " нет" ;; --rollback) last=$(ls -dt "$BACKUPS"/*/ 2>/dev/null | head -1) [ -z "$last" ] && { echo "Нет бэкапа для отката."; exit 1; } fromver=$(cat "$last/.fromversion" 2>/dev/null || echo "?") echo "Откат на $fromver ($last)" managed_files | while IFS='|' read -r lp rp; do [ -f "$last/$rp" ] && { mkdir -p "$(dirname "$lp")"; cp "$last/$rp" "$lp"; chmod +x "$lp" 2>/dev/null || true; } done echo "$fromver" > "$VERFILE" systemctl restart phobos-panel 2>/dev/null || true echo "Откат выполнен -> $fromver" ;; *) ref="${1:-main}"; [ "$ref" = "latest" ] && ref="main" if ! ref_exists "$ref"; then echo "Версия/ветка '$ref' не найдена на GitHub. Обновление отменено (текущая $CUR не тронута)." echo "Доступные: phobos-update --versions · стабильная: $(latest_version)" exit 1 fi target=$(curl -fsSL -m10 "$RAW/$ref/VERSION" 2>/dev/null | tr -d ' \r\n'); [ -z "$target" ] && target="$ref" echo "Текущая: $CUR -> целевая: $target ($ref)" b=$(do_backup); echo "Бэкап: $b" apply_ref "$ref" echo "$target" > "$VERFILE" systemctl restart phobos-panel 2>/dev/null || true echo "Обновлено до $target. Откат: phobos-update --rollback" ;; esac