feat: multi-arch Docker образы (amd64+arm64), CI/CD, registry
Some checks failed
Build and Push Docker Images / Сборка сервера (multi-arch) (push) Has been cancelled
Build and Push Docker Images / Сборка клиента (multi-arch) (push) Has been cancelled

- 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:
Deploy Bot
2026-07-29 20:38:47 +01:00
parent a4e80f712a
commit 5d618a04b5
15 changed files with 1131 additions and 710 deletions

View File

@@ -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 "$@"