From fdf11f67c52e8e42ad57b6069e1a34e3e8fa5533 Mon Sep 17 00:00:00 2001 From: iqubik Date: Sat, 4 Apr 2026 22:41:14 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20delete-custom.sh=20=E2=80=94=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20custom-=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20(=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=B5=D0=B9=D0=BD=D0=B5=D1=80=D1=8B,=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D1=8B,=20=D0=B8=D1=81=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D0=B8=D0=BA=D0=B8,=20=D0=BE=D0=BF=D1=86?= =?UTF-8?q?=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=20Hysteria=202?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- delete-custom.sh | 237 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 delete-custom.sh diff --git a/delete-custom.sh b/delete-custom.sh new file mode 100644 index 0000000..0bd5513 --- /dev/null +++ b/delete-custom.sh @@ -0,0 +1,237 @@ +#!/usr/bin/env bash +set -euo pipefail + +################################# +# TRAP +################################# +trap 'echo -e "\033[1;31m[ERROR]\033[0m Ошибка в строке $LINENO"; exit 1' ERR + +################################# +# HELPERS +################################# +log() { echo -e "\033[1;32m[INFO]\033[0m $1"; } +warn() { echo -e "\033[1;33m[WARN]\033[0m $1"; } +die() { echo -e "\033[1;31m[ERROR]\033[0m $1"; exit 1; } + +need_root() { + [[ $EUID -eq 0 ]] || die "Запускать только от root" +} + +################################# +# PARSE ARGS +################################# +PROJECT_DIR="/opt/3dp-manager" +SOURCE_DIR="/opt/3dp-manager-src" +REMOVE_HYSTERIA=0 + +while getopts ":p:s:hH" opt; do + case "$opt" in + p) PROJECT_DIR="$OPTARG" ;; + s) SOURCE_DIR="$OPTARG" ;; + H) REMOVE_HYSTERIA=1 ;; + h) + echo "Удаление 3dp-manager (custom-ветка dp-custom)" + echo "" + echo "Использование:" + echo " delete-custom.sh [-p ] [-s ] [-H]" + echo "" + echo "Параметры:" + echo " -p Папка установки (по умолчанию: /opt/3dp-manager)" + echo " -s Папка исходников (по умолчанию: /opt/3dp-manager-src)" + echo " -H Удалить Hysteria 2 вместе с 3dp-manager" + echo " -h Показать эту справку" + echo "" + echo "Пример:" + echo " delete-custom.sh -H" + exit 0 + ;; + :) die "Параметр -$OPTARG требует значение" ;; + \?) die "Неизвестный параметр: -$OPTARG" ;; + esac +done + +################################# +# CONFIRMATION +################################# +read -r -p "Вы уверены, что хотите удалить 3dp-manager (custom)? (y/n): " answer + +case "$answer" in + y|Y) + log "Начинаю удаление..." + ;; + *) + log "Удаление отменено" + exit 1 + ;; +esac + +################################# +# START +################################# +need_root + +log "Удаляем 3dp-manager (custom-ветка)" + +################################# +# DOCKER COMPOSE DOWN +################################# +resolve_compose_cmd() { + if docker compose version >/dev/null 2>&1; then + COMPOSE_CMD=("docker" "compose") + elif command -v docker-compose >/dev/null 2>&1; then + COMPOSE_CMD=("docker-compose") + else + warn "Docker Compose не найден — пропуск" + COMPOSE_CMD=() + fi +} + +resolve_compose_cmd + +if [[ ${#COMPOSE_CMD[@]} -gt 0 ]]; then + # Попробуем с docker-compose.custom.yml (если есть) + if [[ -d "$PROJECT_DIR" ]] && [[ -f "$PROJECT_DIR/docker-compose.yml" ]]; then + cd "$PROJECT_DIR" + if [[ -f "$PROJECT_DIR/docker-compose.custom.yml" ]]; then + log "Останавливаем custom-контейнеры" + "${COMPOSE_CMD[@]}" -f docker-compose.yml -f docker-compose.custom.yml down --volumes --remove-orphans || warn "Ошибка при custom compose down" + else + log "Останавливаем контейнеры" + "${COMPOSE_CMD[@]}" down --volumes --remove-orphans || warn "Ошибка при docker compose down" + fi + else + # Попробуем остановить любые контейнеры 3dp-manager + running=$(docker ps --filter "name=3dp-" --format '{{.Names}}' 2>/dev/null || true) + if [[ -n "$running" ]]; then + log "Найдены запущенные контейнеры 3dp: $running" + docker stop $running || warn "Ошибка при остановке контейнеров" + docker rm $running || warn "Ошибка при удалении контейнеров" + fi + fi +fi + +################################# +# CLEAN IMAGES +################################# +log "Удаляем custom-образы (если есть)" +docker images --format '{{.Repository}}:{{.Tag}}' \ + | grep -E '3dp-manager-server:custom|3dp-manager-client:custom' \ + | xargs -r docker rmi -f 2>/dev/null || true + +log "Удаляем образы 3dp-manager (общие)" +docker images --format '{{.Repository}}:{{.Tag}}' \ + | grep '3dp-manager' \ + | xargs -r docker rmi -f 2>/dev/null || true + +# Dangling images +docker image prune -f 2>/dev/null || true + +################################# +# REMOVE HYSTERIA 2 (опционально) +################################# +if [[ $REMOVE_HYSTERIA -eq 1 ]]; then + log "Удаление Hysteria 2..." + + if systemctl is-active --quiet hysteria-server 2>/dev/null; then + systemctl stop hysteria-server || warn "Ошибка при остановке hysteria-server" + systemctl disable hysteria-server || true + fi + + # Удаляем systemd unit + if [[ -f /etc/systemd/system/hysteria-server.service ]]; then + rm -f /etc/systemd/system/hysteria-server.service + systemctl daemon-reload + log "Unit hysteria-server.service удалён" + fi + + # Удаляем бинарник + if command -v hysteria &>/dev/null; then + HYSTERIA_BIN="$(command -v hysteria)" + rm -f "$HYSTERIA_BIN" + log "Бинарник hysteria удалён: $HYSTERIA_BIN" + fi + + # Удаляем конфиг + if [[ -f /etc/hysteria/config.yaml ]]; then + rm -f /etc/hysteria/config.yaml + log "Конфиг Hysteria удалён" + fi + + # Удаляем firewall правила Hysteria + if command -v ufw &>/dev/null; then + # Удаляем правило для порта 8443 (если это только Hysteria) + warn "Правила UFW для Hysteria (UDP 8443) нужно удалить вручную: sudo ufw status numbered" + fi + + log "Hysteria 2 удалён" +else + warn "Hysteria 2 НЕ удалён. Для удаления: delete-custom.sh -H" +fi + +################################# +# FIREWALL — удалить правила 3dp-manager +################################# +if command -v ufw &>/dev/null; then + log "Удаляем правила UFW для 3dp-manager..." + # Удаляем правила для портов 443, 8443, 10000-20000, 30000-60000 (только те, что добавлял 3dp-manager) + # Это может затронуть и другие сервисы, поэтому просто предупреждаем + warn "Правила UFW (443, 8443, 10000-60000) нужно проверить/удалить вручную:" + warn "sudo ufw status numbered" +fi + +################################# +# REMOVE DIRECTORIES +################################# +log "Удаляем $PROJECT_DIR" +rm -rf "$PROJECT_DIR" + +log "Удаляем $SOURCE_DIR" +rm -rf "$SOURCE_DIR" + +################################# +# REMOVE SYSTEMD SERVICE (если есть) +################################# +if [[ -f /etc/systemd/system/3dp-manager.service ]]; then + systemctl stop 3dp-manager 2>/dev/null || true + systemctl disable 3dp-manager 2>/dev/null || true + rm -f /etc/systemd/system/3dp-manager.service + systemctl daemon-reload + log "Systemd unit 3dp-manager.service удалён" +fi + +################################# +# REMOVE CRON ENTRIES (если есть) +################################# +# Скрипты могли добавлять cron для автоматического обновления +# Проверяем cron текущего пользователя и root +for user in root "${SUDO_USER:-}"; do + if [[ -n "$user" ]]; then + cron_jobs=$(sudo -u "$user" crontab -l 2>/dev/null | grep -v '3dp-manager' || true) + if [[ -z "$cron_jobs" ]]; then + sudo -u "$user" crontab -r 2>/dev/null || true + log "Cron jobs для $user удалены" + else + echo "$cron_jobs" | sudo -u "$user" crontab - 2>/dev/null || true + fi + fi +done + +################################# +# DONE +################################# +log "✔ 3dp-manager (custom) полностью удалён" +log "" +log "Что было удалено:" +log " • Контейнеры и образы Docker" +log " • $PROJECT_DIR" +log " • $SOURCE_DIR" +log "" +if [[ $REMOVE_HYSTERIA -eq 1 ]]; then + log " • Hysteria 2" +else + warn " Hysteria 2 НЕ удалён (используйте -H для удаления)" +fi +warn "" +warn "Проверьте вручную:" +warn " • sudo ufw status numbered — правила firewall" +warn " • /etc/letsencrypt/live/ — SSL сертификаты (если были)"