#!/usr/bin/env bash # ============================================================================= # WireGuard VPS Tunnel — Деинсталлятор (Docker) # Останавливает и удаляет Docker-контейнеры, образы и конфигурацию. # ============================================================================= set -euo pipefail RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' BOLD='\033[1m' NC='\033[0m' info() { echo -e "${BLUE}[INFO]${NC} $*"; } success() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERROR]${NC} $*"; } SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REMOVE_IMAGES=false REMOVE_CONFIG=false usage() { echo "Использование: $0 [ОПЦИИ]" echo "" echo "Опции:" echo " --remove-images Также удалить Docker-образы" echo " --remove-config Также удалить директорию config/ с ключами" echo " --help, -h Показать эту справку" echo "" echo "Пример:" echo " sudo $0" echo " sudo $0 --remove-images --remove-config" exit 0 } parse_args() { while [[ $# -gt 0 ]]; do case "$1" in --remove-images) REMOVE_IMAGES=true; shift ;; --remove-config) REMOVE_CONFIG=true; shift ;; --help|-h) usage ;; *) error "Неизвестный аргумент: $1"; usage ;; esac done } check_root() { if [[ $EUID -ne 0 ]]; then error "Скрипт должен выполняться от root. Используйте: sudo $0" exit 1 fi } stop_containers() { echo "" info "Остановка Docker-контейнеров..." if docker ps -a --format '{{.Names}}' | grep -q "wireguard-server"; then docker compose -f "$SCRIPT_DIR/docker-compose.server.yml" down 2>/dev/null || true success "Контейнер wireguard-server остановлен и удалён" else info "Контейнер wireguard-server не найден" fi if docker ps -a --format '{{.Names}}' | grep -q "wireguard-client"; then docker compose -f "$SCRIPT_DIR/docker-compose.client.yml" down 2>/dev/null || true success "Контейнер wireguard-client остановлен и удалён" else info "Контейнер wireguard-client не найден" fi } remove_images() { if [[ "$REMOVE_IMAGES" != true ]]; then return 0 fi info "Удаление Docker-образов..." if docker images --format '{{.Repository}}' | grep -q "wireguard-vps-tunnel-server"; then docker rmi wireguard-vps-tunnel-server 2>/dev/null || true success "Образ wireguard-vps-tunnel-server удалён" fi if docker images --format '{{.Repository}}' | grep -q "wireguard-vps-tunnel-client"; then docker rmi wireguard-vps-tunnel-client 2>/dev/null || true success "Образ wireguard-vps-tunnel-client удалён" fi } remove_config() { if [[ "$REMOVE_CONFIG" != true ]]; then return 0 fi if [[ -d "$SCRIPT_DIR/config" ]]; then rm -rf "$SCRIPT_DIR/config" success "Директория config/ удалена" fi if [[ -f "$SCRIPT_DIR/.env" ]]; then rm -f "$SCRIPT_DIR/.env" success "Файл .env удалён" fi } main() { echo -e "${RED}${BOLD}" echo "╔══════════════════════════════════════════════════════════╗" echo "║ WireGuard VPS Tunnel — ДЕИНСТАЛЛЯТОР (Docker) ║" echo "╚══════════════════════════════════════════════════════════╝" echo -e "${NC}" check_root parse_args "$@" warn "Этот скрипт остановит и удалит Docker-контейнеры WireGuard VPS Tunnel." echo "" read -r -p "Продолжить? [y/N]: " confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then info "Отмена." exit 0 fi stop_containers remove_images remove_config echo "" success "WireGuard VPS Tunnel полностью удалён." echo "" echo -e "${YELLOW}${BOLD}Примечание:${NC} ${YELLOW}SSH-сервер и другие сервисы не были затронуты.${NC}" echo -e "${YELLOW}PasswordAuthentication в sshd_config НЕ изменялся.${NC}" echo -e "${YELLOW}Docker и wireguard-tools (на хосте) не удалялись.${NC}" } main "$@"