#!/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 log "Unit hysteria-server.service удалён" fi # Удаляем шаблон unit'а (hysteria-server@.service) if [[ -f /etc/systemd/system/hysteria-server@.service ]]; then rm -f /etc/systemd/system/hysteria-server@.service log "Unit hysteria-server@.service удалён" fi # Перезагружаем systemd systemctl daemon-reload # Удаляем бинарник if command -v hysteria &>/dev/null; then HYSTERIA_BIN="$(command -v hysteria)" rm -f "$HYSTERIA_BIN" log "Бинарник hysteria удалён: $HYSTERIA_BIN" fi # Удаляем конфиг и пустую директорию if [[ -d /etc/hysteria ]]; then rm -rf /etc/hysteria log "Директория /etc/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 сертификаты (если были)"