feat: delete-custom.sh — удаление custom-установки (контейнеры, образы, исходники, опционально Hysteria 2)

This commit is contained in:
iqubik
2026-04-04 22:41:14 +03:00
parent 8057f3079b
commit fdf11f67c5
+237
View File
@@ -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 <project_dir>] [-s <source_dir>] [-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 сертификаты (если были)"