diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100644 index 0000000..872d6c7 --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -euo pipefail + +REPO="grendervilll/mitactl" +BRANCH="main" +ARCHIVE_URL="https://github.com/${REPO}/archive/refs/heads/${BRANCH}.tar.gz" +INSTALL_DIR="/opt/mitactl-install" + +RED='\033[0;31m'; GREEN='\033[0;32m'; CYAN='\033[0;36m'; NC='\033[0m' +info() { echo -e "${CYAN}[INFO]${NC} $*"; } +ok() { echo -e "${GREEN}[OK]${NC} $*"; } +err() { echo -e "${RED}[ERROR]${NC} $*"; exit 1; } + +[[ $EUID -ne 0 ]] && err "Запустите от root: sudo bash <(curl -Ls ...)" + +command -v curl &>/dev/null || apt-get install -y -qq curl +command -v tar &>/dev/null || apt-get install -y -qq tar + +info "Загрузка репозитория ${REPO}..." +rm -rf "$INSTALL_DIR" +mkdir -p "$INSTALL_DIR" + +curl -Ls "$ARCHIVE_URL" | tar -xz -C "$INSTALL_DIR" --strip-components=1 \ + || err "Не удалось скачать или распаковать архив с GitHub" + +ok "Файлы загружены в $INSTALL_DIR" + +chmod +x "$INSTALL_DIR/install.sh" +cd "$INSTALL_DIR" +exec bash install.sh diff --git a/install.sh b/install.sh index eefead3..933fff3 100755 --- a/install.sh +++ b/install.sh @@ -120,15 +120,17 @@ fi # ============================================================================= section "Установка зависимостей" -apt-get update -qq +apt-get update -qq || { warn "apt-get update завершился с ошибкой, продолжаем..."; true; } DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \ curl wget jq cron \ ca-certificates gnupg lsb-release \ - iptables ipset ufw iptables-persistent \ + iptables ufw \ fail2ban openssl \ net-tools \ python3 python3-yaml \ - 2>/dev/null + || error "Ошибка установки зависимостей. Запустите вручную: apt-get install -y curl wget jq cron iptables ufw fail2ban python3 python3-yaml" +# ipset и iptables-persistent — опциональные, не прерываем при ошибке +DEBIAN_FRONTEND=noninteractive apt-get install -y -qq ipset iptables-persistent 2>/dev/null || true ok "Базовые пакеты установлены (включая fail2ban, ufw, ipset, iptables-persistent, python3-yaml)" # ============================================================================= diff --git a/mita-ctl.sh b/mita-ctl.sh index 1df891a..886ca70 100755 --- a/mita-ctl.sh +++ b/mita-ctl.sh @@ -1103,11 +1103,13 @@ except: print('2100-2110') fi _PANEL_PORT="8080" - [[ -f "$PANEL_ENV" ]] && _PANEL_PORT=$(grep "^PANEL_PORT=" "$PANEL_ENV" | cut -d= -f2 || echo "8080") + if [[ -f "$PANEL_ENV" ]]; then + _PANEL_PORT=$(grep "^PANEL_PORT=" "$PANEL_ENV" 2>/dev/null | cut -d= -f2 || true) + fi _PANEL_PORT=${_PANEL_PORT:-8080} # Автодетект текущего SSH порта из sshd_config (чтобы не трогать его при чистке) - _SSH_PORT=$(grep -E "^[[:space:]]*Port[[:space:]]+" /etc/ssh/sshd_config 2>/dev/null | awk '{print $2}' | head -1) + _SSH_PORT=$(grep -E "^[[:space:]]*Port[[:space:]]+" /etc/ssh/sshd_config 2>/dev/null | awk '{print $2}' | head -1 || true) _SSH_PORT=${_SSH_PORT:-22} info "Обнаружен SSH порт: $_SSH_PORT (будет сохранён)" info "Порты mita для закрытия: $_MITA_RANGE" @@ -1128,7 +1130,7 @@ except: print('2100-2110') # Сначала пробуем штатное удаление через dpkg/apt — пока unit-файл # ещё на месте, иначе pre/post-removal скрипты пакета падают - DEB_PKG=$(dpkg -l 2>/dev/null | grep -i "^ii.*mita" | awk '{print $2}' | head -1) + DEB_PKG=$(dpkg -l 2>/dev/null | grep -i "^ii.*mita" | awk '{print $2}' | head -1 || true) if [[ -n "$DEB_PKG" ]]; then apt-get remove -y -qq "$DEB_PKG" 2>/dev/null \ || dpkg --remove --force-remove-reinstreq "$DEB_PKG" 2>/dev/null \ @@ -1162,7 +1164,7 @@ except: print('2100-2110') # ── 5. Удалить SSL-сертификаты Let's Encrypt (если выпускались) ─ if command -v certbot &>/dev/null; then local domains - domains=$(certbot certificates 2>/dev/null | grep "Domains:" | awk '{print $2}') + domains=$(certbot certificates 2>/dev/null | grep "Domains:" | awk '{print $2}' || true) if [[ -n "$domains" ]]; then info "Найдены сертификаты Let's Encrypt: $domains" read -r -p " Удалить их тоже? [y/N]: " del_certs @@ -1207,7 +1209,7 @@ except: print('2100-2110') # Удаляем правило панели ufw delete allow "$_PANEL_PORT/tcp" 2>/dev/null || true # Дополнительно: чистим правила по комментарию (совместимость с разными версиями) - ufw status numbered 2>/dev/null | grep -iE "mita|panel" | awk -F'[][]' '{print $2}' | sort -rn | while read -r num; do + ufw status numbered 2>/dev/null | { grep -iE "mita|panel" || true; } | awk -F'[][]' '{print $2}' | sort -rn | while read -r num; do [[ -n "$num" ]] && yes | ufw delete "$num" 2>/dev/null || true done ok "UFW: правила удалены"