feat: multi-arch Docker образы (amd64+arm64), CI/CD, registry
- Dockerfile с multi-stage сборкой для linux/amd64 и linux/arm64 - Gitea Actions CI/CD для автоматической сборки и пуша в registry - docker-compose с поддержкой multi-arch образов - install.sh с автоопределением архитектуры и выбором: pull vs build - uninstall.sh обновлён для Docker-деинсталляции - README.md обновлён: multi-arch, CI/CD, Gitea registry
This commit is contained in:
199
uninstall.sh
199
uninstall.sh
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# =============================================================================
|
||||
# WireGuard VPS Tunnel — Деинсталлятор
|
||||
# Полное удаление туннеля, сервисов и правил iptables
|
||||
# WireGuard VPS Tunnel — Деинсталлятор (Docker)
|
||||
# Останавливает и удаляет Docker-контейнеры, образы и конфигурацию.
|
||||
# =============================================================================
|
||||
set -euo pipefail
|
||||
|
||||
@@ -17,31 +17,29 @@ success() { echo -e "${GREEN}[OK]${NC} $*"; }
|
||||
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||
error() { echo -e "${RED}[ERROR]${NC} $*"; }
|
||||
|
||||
CONFIG_DIR="/etc/wireguard-vps-tunnel"
|
||||
CONFIG_FILE="$CONFIG_DIR/config"
|
||||
WG_CONF="/etc/wireguard/wg0.conf"
|
||||
WATCHDOG_BIN="/usr/local/bin/wg-watchdog.sh"
|
||||
WATCHDOG_SERVICE="/etc/systemd/system/wg-watchdog.service"
|
||||
SYSCTL_CONF="/etc/sysctl.d/99-wireguard-vps-tunnel.conf"
|
||||
REMOVE_PACKAGE=false
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REMOVE_IMAGES=false
|
||||
REMOVE_CONFIG=false
|
||||
|
||||
usage() {
|
||||
echo "Использование: $0 [ОПЦИИ]"
|
||||
echo ""
|
||||
echo "Опции:"
|
||||
echo " --remove-package Также удалить пакет wireguard-tools"
|
||||
echo " --remove-images Также удалить Docker-образы"
|
||||
echo " --remove-config Также удалить директорию config/ с ключами"
|
||||
echo " --help, -h Показать эту справку"
|
||||
echo ""
|
||||
echo "Пример:"
|
||||
echo " sudo $0"
|
||||
echo " sudo $0 --remove-package"
|
||||
echo " sudo $0 --remove-images --remove-config"
|
||||
exit 0
|
||||
}
|
||||
|
||||
parse_args() {
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--remove-package) REMOVE_PACKAGE=true; shift ;;
|
||||
--remove-images) REMOVE_IMAGES=true; shift ;;
|
||||
--remove-config) REMOVE_CONFIG=true; shift ;;
|
||||
--help|-h) usage ;;
|
||||
*) error "Неизвестный аргумент: $1"; usage ;;
|
||||
esac
|
||||
@@ -55,168 +53,70 @@ check_root() {
|
||||
fi
|
||||
}
|
||||
|
||||
stop_services() {
|
||||
stop_containers() {
|
||||
echo ""
|
||||
info "Остановка сервисов..."
|
||||
info "Остановка Docker-контейнеров..."
|
||||
|
||||
# Останавливаем watchdog
|
||||
if systemctl is-active --quiet wg-watchdog 2>/dev/null; then
|
||||
systemctl stop wg-watchdog
|
||||
success "Watchdog остановлен"
|
||||
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 "Watchdog не запущен"
|
||||
info "Контейнер wireguard-server не найден"
|
||||
fi
|
||||
|
||||
# Отключаем watchdog
|
||||
if systemctl is-enabled --quiet wg-watchdog 2>/dev/null; then
|
||||
systemctl disable wg-watchdog &>/dev/null
|
||||
success "Watchdog отключён из автозагрузки"
|
||||
fi
|
||||
|
||||
# Останавливаем WireGuard
|
||||
if systemctl is-active --quiet wg-quick@wg0 2>/dev/null; then
|
||||
systemctl stop wg-quick@wg0
|
||||
success "WireGuard остановлен"
|
||||
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 не запущен"
|
||||
fi
|
||||
|
||||
# Отключаем WireGuard
|
||||
if systemctl is-enabled --quiet wg-quick@wg0 2>/dev/null; then
|
||||
systemctl disable wg-quick@wg0 &>/dev/null
|
||||
success "WireGuard отключён из автозагрузки"
|
||||
info "Контейнер wireguard-client не найден"
|
||||
fi
|
||||
}
|
||||
|
||||
remove_interface() {
|
||||
info "Удаление интерфейса wg0..."
|
||||
remove_images() {
|
||||
if [[ "$REMOVE_IMAGES" != true ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
if ip link show wg0 &>/dev/null; then
|
||||
ip link delete wg0 2>/dev/null || true
|
||||
success "Интерфейс wg0 удалён"
|
||||
else
|
||||
info "Интерфейс wg0 не существует"
|
||||
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_iptables_rules() {
|
||||
info "Очистка правил iptables..."
|
||||
|
||||
# Удаляем правила DNAT и FORWARD, связанные с wg0
|
||||
local rules_removed=0
|
||||
|
||||
# Удаляем DNAT правила
|
||||
while iptables -t nat -L PREROUTING -n 2>/dev/null | grep -q "10\.0\.0\."; do
|
||||
local rule_num
|
||||
rule_num=$(iptables -t nat -L PREROUTING -n --line-numbers 2>/dev/null | grep "10\.0\.0\." | head -1 | awk '{print $1}')
|
||||
if [[ -n "$rule_num" ]]; then
|
||||
iptables -t nat -D PREROUTING "$rule_num" 2>/dev/null || true
|
||||
((rules_removed++)) || true
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Удаляем MASQUERADE правила
|
||||
while iptables -t nat -L POSTROUTING -n 2>/dev/null | grep -q "10\.0\.0\."; do
|
||||
local rule_num
|
||||
rule_num=$(iptables -t nat -L POSTROUTING -n --line-numbers 2>/dev/null | grep "10\.0\.0\." | head -1 | awk '{print $1}')
|
||||
if [[ -n "$rule_num" ]]; then
|
||||
iptables -t nat -D POSTROUTING "$rule_num" 2>/dev/null || true
|
||||
((rules_removed++)) || true
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Удаляем FORWARD правила для wg0
|
||||
while iptables -L FORWARD -n 2>/dev/null | grep -q "wg0"; do
|
||||
local rule_num
|
||||
rule_num=$(iptables -L FORWARD -n --line-numbers 2>/dev/null | grep "wg0" | head -1 | awk '{print $1}')
|
||||
if [[ -n "$rule_num" ]]; then
|
||||
iptables -D FORWARD "$rule_num" 2>/dev/null || true
|
||||
((rules_removed++)) || true
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $rules_removed -gt 0 ]]; then
|
||||
success "Удалено правил iptables: ${rules_removed}"
|
||||
else
|
||||
info "Правила iptables не найдены"
|
||||
fi
|
||||
}
|
||||
|
||||
remove_files() {
|
||||
info "Удаление файлов..."
|
||||
|
||||
# Удаляем конфигурацию WireGuard
|
||||
if [[ -f "$WG_CONF" ]]; then
|
||||
rm -f "$WG_CONF"
|
||||
success "Удалён: $WG_CONF"
|
||||
remove_config() {
|
||||
if [[ "$REMOVE_CONFIG" != true ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Удаляем watchdog
|
||||
if [[ -f "$WATCHDOG_BIN" ]]; then
|
||||
rm -f "$WATCHDOG_BIN"
|
||||
success "Удалён: $WATCHDOG_BIN"
|
||||
if [[ -d "$SCRIPT_DIR/config" ]]; then
|
||||
rm -rf "$SCRIPT_DIR/config"
|
||||
success "Директория config/ удалена"
|
||||
fi
|
||||
|
||||
# Удаляем systemd-сервис watchdog
|
||||
if [[ -f "$WATCHDOG_SERVICE" ]]; then
|
||||
rm -f "$WATCHDOG_SERVICE"
|
||||
systemctl daemon-reload
|
||||
success "Удалён: $WATCHDOG_SERVICE"
|
||||
fi
|
||||
|
||||
# Удаляем sysctl конфигурацию
|
||||
if [[ -f "$SYSCTL_CONF" ]]; then
|
||||
rm -f "$SYSCTL_CONF"
|
||||
sysctl --system &>/dev/null
|
||||
success "Удалён: $SYSCTL_CONF"
|
||||
fi
|
||||
|
||||
# Удаляем директорию с ключами и конфигом
|
||||
if [[ -d "$CONFIG_DIR" ]]; then
|
||||
rm -rf "$CONFIG_DIR"
|
||||
success "Удалён: $CONFIG_DIR/"
|
||||
fi
|
||||
|
||||
# Удаляем лог watchdog
|
||||
if [[ -f /var/log/wg-watchdog.log ]]; then
|
||||
rm -f /var/log/wg-watchdog.log
|
||||
success "Удалён: /var/log/wg-watchdog.log"
|
||||
fi
|
||||
}
|
||||
|
||||
remove_package() {
|
||||
if [[ "$REMOVE_PACKAGE" == true ]]; then
|
||||
echo ""
|
||||
warn "Удаление пакета wireguard-tools..."
|
||||
read -r -p "Вы уверены? Это удалит WireGuard полностью [y/N]: " confirm
|
||||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
||||
apt-get remove -y --purge wireguard-tools 2>/dev/null || true
|
||||
apt-get autoremove -y 2>/dev/null || true
|
||||
success "Пакет wireguard-tools удалён"
|
||||
else
|
||||
info "Пакет wireguard-tools оставлен"
|
||||
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 — ДЕИНСТАЛЛЯТОР ║"
|
||||
echo "║ WireGuard VPS Tunnel — ДЕИНСТАЛЛЯТОР (Docker) ║"
|
||||
echo "╚══════════════════════════════════════════════════════════╝"
|
||||
echo -e "${NC}"
|
||||
|
||||
check_root
|
||||
parse_args "$@"
|
||||
|
||||
warn "Этот скрипт полностью удалит WireGuard VPS Tunnel."
|
||||
warn "Будут удалены: туннель, сервисы, правила iptables, ключи."
|
||||
warn "Этот скрипт остановит и удалит Docker-контейнеры WireGuard VPS Tunnel."
|
||||
echo ""
|
||||
read -r -p "Продолжить? [y/N]: " confirm
|
||||
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
|
||||
@@ -224,17 +124,16 @@ main() {
|
||||
exit 0
|
||||
fi
|
||||
|
||||
stop_services
|
||||
remove_interface
|
||||
remove_iptables_rules
|
||||
remove_files
|
||||
remove_package
|
||||
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 "$@"
|
||||
|
||||
Reference in New Issue
Block a user