Last active
December 23, 2025 11:28
-
-
Save sm1ky/e600917e97327e8efd7b7ebbffa256e7 to your computer and use it in GitHub Desktop.
Install wireguard & awg
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| set -e | |
| export DEBIAN_FRONTEND=noninteractive | |
| LOG_FILE="/tmp/amneziawg_install.log" | |
| RESULT_FILE="/tmp/amneziawg_install_result.log" | |
| AWG_WORKDIR=~/awg | |
| echo "Начало установки AmneziaWG" > $LOG_FILE | |
| echo "Не завершено" > $RESULT_FILE | |
| # Универсальная функция удаления пакетов | |
| remove_package() { | |
| local package="$1" | |
| if dpkg -l | grep -q $package; then | |
| echo "[INFO] Удаляем пакет: $package" >> $LOG_FILE | |
| apt-get purge -y $package >> $LOG_FILE 2>&1 || true | |
| echo "[INFO] Пакет $package успешно удален." >> $LOG_FILE | |
| fi | |
| } | |
| # Удаление старой версии AmneziaWG | |
| if dpkg -l | grep -q amneziawg; then | |
| echo "[INFO] Найдена старая версия AmneziaWG, удаляем..." >> $LOG_FILE | |
| if systemctl list-units --type=service --all | grep -q awg-quick@awg0.service; then | |
| systemctl stop awg-quick@awg0.service >> $LOG_FILE 2>&1 || true | |
| fi | |
| remove_package "amneziawg" | |
| remove_package "amneziawg-dkms" | |
| rm -rf /etc/amnezia /etc/sysctl.d/00-amnezia.conf >> $LOG_FILE 2>&1 | |
| echo "[INFO] Старая версия AmneziaWG успешно удалена." >> $LOG_FILE | |
| fi | |
| # Удаляем старую рабочую папку, если она есть | |
| if [ -d "$AWG_WORKDIR" ]; then | |
| echo "[INFO] Удаляем старую рабочую папку: $AWG_WORKDIR" >> $LOG_FILE | |
| rm -rf $AWG_WORKDIR | |
| echo "[INFO] Рабочая папка успешно удалена." >> $LOG_FILE | |
| fi | |
| # Резервное копирование sources.list | |
| cp -f /etc/apt/sources.list /etc/apt/sources.list.backup >> $LOG_FILE 2>&1 | |
| # Добавление deb-src, если отсутствуют | |
| if ! grep -q '^deb-src' /etc/apt/sources.list.backup; then | |
| echo '[INFO] Добавляем базовые deb-src записи...' >> $LOG_FILE | |
| codename=$(lsb_release -sc) | |
| cat <<EOF >> /etc/apt/sources.list | |
| deb-src http://archive.ubuntu.com/ubuntu $codename main restricted | |
| deb-src http://archive.ubuntu.com/ubuntu $codename-updates main restricted | |
| deb-src http://archive.ubuntu.com/ubuntu $codename universe | |
| deb-src http://archive.ubuntu.com/ubuntu $codename-updates universe | |
| deb-src http://archive.ubuntu.com/ubuntu $codename multiverse | |
| deb-src http://archive.ubuntu.com/ubuntu $codename-updates multiverse | |
| deb-src http://archive.ubuntu.com/ubuntu $codename-backports main restricted universe multiverse | |
| deb-src http://security.ubuntu.com/ubuntu $codename-security main restricted | |
| deb-src http://security.ubuntu.com/ubuntu $codename-security universe | |
| deb-src http://security.ubuntu.com/ubuntu $codename-security multiverse | |
| EOF | |
| fi | |
| # Функция обновления системы | |
| update_system() { | |
| echo "[INFO] Обновляем систему и ядро..." >> $LOG_FILE | |
| apt update >> $LOG_FILE 2>&1 | |
| apt upgrade -y >> $LOG_FILE 2>&1 | |
| apt dist-upgrade -y >> $LOG_FILE 2>&1 | |
| } | |
| # Функция установки пакетов с автоматическим обновлением | |
| install_packages() { | |
| local packages="$1" | |
| echo "[INFO] Устанавливаем пакеты: $packages" >> $LOG_FILE | |
| if ! apt install -y $packages >> $LOG_FILE 2>&1; then | |
| echo "[WARNING] Ошибка при установке пакетов: $packages. Обновляем систему." >> $LOG_FILE | |
| update_system | |
| apt install -y $packages >> $LOG_FILE 2>&1 | |
| fi | |
| } | |
| # Установка необходимых инструментов | |
| install_packages "curl wget python3 python3-pip software-properties-common iptables linux-source" | |
| # Обновление PIP с безопасностью | |
| safe_upgrade_pip() { | |
| if ! pip install --upgrade pip --break-system-packages >> $LOG_FILE 2>&1; then | |
| echo "[WARNING] Ошибка обновления pip. Пробуем через apt." >> $LOG_FILE | |
| apt-get install --reinstall -y python3-pip >> $LOG_FILE 2>&1 | |
| fi | |
| } | |
| # Обновляем pip | |
| safe_upgrade_pip | |
| # Установка Python-зависимостей | |
| # Функция установки Python-зависимостей | |
| install_python_packages() { | |
| local packages="$1" | |
| echo "[INFO] Устанавливаем Python-зависимости: $packages" >> $LOG_FILE | |
| # Пробуем установить без --break-system-packages | |
| if pip install $packages >> $LOG_FILE 2>&1; then | |
| echo "[INFO] Установка Python-зависимостей успешна (без --break-system-packages)." >> $LOG_FILE | |
| return 0 | |
| fi | |
| # Пробуем с --break-system-packages | |
| if pip install $packages --break-system-packages >> $LOG_FILE 2>&1; then | |
| echo "[INFO] Установка Python-зависимостей успешна (с --break-system-packages)." >> $LOG_FILE | |
| return 0 | |
| fi | |
| # Ошибка установки | |
| echo "[ERROR] Ошибка установки Python-зависимостей: $packages" >> $LOG_FILE | |
| echo "Ошибка" > $RESULT_FILE | |
| return 1 | |
| } | |
| # Установка Python-зависимостей | |
| if ! install_python_packages "qrcode pillow"; then | |
| echo "[ERROR] Ошибка установки Python-зависимостей." >> $LOG_FILE | |
| exit 1 | |
| fi | |
| # Добавляем репозиторий Amnezia | |
| if ! add-apt-repository -y ppa:amnezia/ppa >> $LOG_FILE 2>&1; then | |
| echo '[ERROR] Ошибка добавления репозитория Amnezia.' >> $LOG_FILE | |
| exit 1 | |
| fi | |
| # Обновление после добавления репозитория | |
| apt update -y >> $LOG_FILE 2>&1 | |
| # Установка AmneziaWG | |
| install_packages "amneziawg" | |
| # Включаем IP forwarding | |
| echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/00-amnezia.conf | |
| sysctl -w net.ipv4.ip_forward=1 >> $LOG_FILE 2>&1 | |
| sysctl --system >> $LOG_FILE 2>&1 | |
| # Подготовка рабочей папки | |
| mkdir -p $AWG_WORKDIR >> $LOG_FILE 2>&1 | |
| # Загрузка конфигуратора | |
| cd $AWG_WORKDIR | |
| wget -O awgcfg.py https://gist.githubusercontent.com/sm1ky/7b3ba5b44e8f8da6f5abe297df9a05bd/raw/19ef6c724c877bc2a79ba95c547807688bbe74a9/awgcfg.py >> $LOG_FILE 2>&1 | |
| chmod +x awgcfg.py | |
| # Генерация порта | |
| PORT=$((1024 + RANDOM % 64512)) | |
| # Функция для проверки и загрузки модуля AmneziaWG | |
| load_amnezia_module() { | |
| if ! lsmod | grep -q amneziawg; then | |
| echo "[INFO] Загрузка модуля amneziawg..." >> $LOG_FILE | |
| if modprobe amneziawg >> $LOG_FILE 2>&1; then | |
| echo "[INFO] Модуль amneziawg успешно загружен." >> $LOG_FILE | |
| else | |
| echo "[ERROR] Не удалось загрузить модуль amneziawg." >> $LOG_FILE | |
| exit 1 | |
| fi | |
| else | |
| echo "[INFO] Модуль amneziawg уже загружен." >> $LOG_FILE | |
| fi | |
| } | |
| # Проверка и создание папки конфигурации | |
| prepare_amnezia_directory() { | |
| if [ ! -d "/etc/amnezia/amneziawg" ]; then | |
| echo "[INFO] Папка /etc/amnezia/amneziawg отсутствует. Пытаемся создать..." >> $LOG_FILE | |
| load_amnezia_module | |
| mkdir -p /etc/amnezia/amneziawg | |
| echo "[INFO] Папка /etc/amnezia/amneziawg успешно создана." >> $LOG_FILE | |
| else | |
| echo "[INFO] Папка /etc/amnezia/amneziawg уже существует." >> $LOG_FILE | |
| fi | |
| } | |
| # Подготовка папки Amnezia и модуля | |
| prepare_amnezia_directory | |
| # Создание конфигурации | |
| if ! python3 awgcfg.py --make /etc/amnezia/amneziawg/awg0.conf -i 10.10.8.1/24 -p $PORT >> $LOG_FILE 2>&1; then | |
| echo "[ERROR] Ошибка создания конфигурации." >> $LOG_FILE | |
| echo "Ошибка" > $RESULT_FILE | |
| exit 1 | |
| fi | |
| if ! python3 awgcfg.py --create>> $LOG_FILE 2>&1; then | |
| echo "[ERROR] Ошибка создания _defclient.config." >> $LOG_FILE | |
| echo "Ошибка" > $RESULT_FILE | |
| exit 1 | |
| fi | |
| # Запуск службы AmneziaWG | |
| start_amnezia_service() { | |
| echo "[INFO] Запуск службы AmneziaWG..." >> $LOG_FILE | |
| systemctl enable --now awg-quick@awg0 >> $LOG_FILE 2>&1 || true | |
| systemctl restart awg-quick@awg0 >> $LOG_FILE 2>&1 || true | |
| if systemctl is-active --quiet awg-quick@awg0; then | |
| echo "[SUCCESS] Служба AmneziaWG успешно запущена." >> $LOG_FILE | |
| else | |
| echo "[ERROR] Служба AmneziaWG не запущена." >> $LOG_FILE | |
| exit 1 | |
| fi | |
| } | |
| # Запуск службы AmneziaWG | |
| start_amnezia_service | |
| echo "[SUCCESS] Установка AmneziaWG завершена успешно." >> $LOG_FILE | |
| echo "Успех" > $RESULT_FILE | |
| exit 0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| set -e | |
| export DEBIAN_FRONTEND=noninteractive | |
| LOG_FILE="/tmp/wg_install.log" | |
| RESULT_FILE="/tmp/wg_install_result.log" | |
| echo "Начало установки WireGuard" > $LOG_FILE | |
| echo "Не завершено" > $RESULT_FILE | |
| # Получаем пароль из аргумента | |
| if [ -z "$1" ]; then | |
| echo "[ERROR] Пароль администратора не передан!" >> $LOG_FILE | |
| echo "Ошибка" > $RESULT_FILE | |
| exit 1 | |
| fi | |
| ADMIN_PASSWORD="$1" | |
| if docker ps -a --format '{{.Names}}' | grep -wq wg-easy; then | |
| echo "[WARNING] Контейнер wg-easy уже существует." >> $LOG_FILE | |
| docker stop wg-easy >> $LOG_FILE 2>&1 || echo "[ERROR] Не удалось остановить контейнер wg-easy." >> $LOG_FILE | |
| docker rm wg-easy >> $LOG_FILE 2>&1 || echo "[ERROR] Не удалось удалить контейнер wg-easy." >> $LOG_FILE | |
| rm -rf ~/.wg-easy >> $LOG_FILE 2>&1 || echo "[ERROR] Не удалось удалить старые данные связанные с wg-easy." >> $LOG_FILE | |
| fi | |
| apt-get update -y >> $LOG_FILE 2>&1 | |
| apt-get install -y ca-certificates curl apache2-utils >> $LOG_FILE 2>&1 | |
| # Установка Docker | |
| curl -fsSL https://get.docker.com | sh >> $LOG_FILE 2>&1 | |
| # Получение IP сервера | |
| SERVER_IP=$(hostname -I | awk '{print $1}') | |
| if [ -z "$SERVER_IP" ]; then | |
| echo "[ERROR] Не удалось получить IP сервера." >> $LOG_FILE | |
| echo "Ошибка" > $RESULT_FILE | |
| exit 1 | |
| fi | |
| # Генерация хэша пароля | |
| PASSWORD_HASH=$(htpasswd -nbB admin "$ADMIN_PASSWORD" | cut -d ":" -f 2) | |
| if [ -z "$PASSWORD_HASH" ]; then | |
| echo "[ERROR] Не удалось сгенерировать хэш пароля." >> $LOG_FILE | |
| echo "Ошибка" > $RESULT_FILE | |
| exit 1 | |
| fi | |
| # Запуск контейнера wg-easy | |
| docker run -d \ | |
| --name=wg-easy \ | |
| -e LANG=ru \ | |
| -e WG_HOST="$SERVER_IP" \ | |
| -e PASSWORD_HASH="$PASSWORD_HASH" \ | |
| -e PORT=51821 \ | |
| -e WG_PORT=51820 \ | |
| -v ~/.wg-easy:/etc/wireguard \ | |
| -p 51820:51820/udp \ | |
| -p 51821:51821/tcp \ | |
| --cap-add=NET_ADMIN \ | |
| --cap-add=SYS_MODULE \ | |
| --sysctl="net.ipv4.conf.all.src_valid_mark=1" \ | |
| --sysctl="net.ipv4.ip_forward=1" \ | |
| --restart unless-stopped \ | |
| ghcr.io/wg-easy/wg-easy@sha256:66352ccb4b5095992550aa567df5118a5152b6ed31be34b0a8e118a3c3a35bf5 >> $LOG_FILE 2>&1 | |
| # Проверка статуса контейнера | |
| if docker ps --format '{{.Names}}' | grep -wq wg-easy; then | |
| echo "[SUCCESS] Контейнер wg-easy успешно запущен." >> $LOG_FILE | |
| echo "Успех" > $RESULT_FILE | |
| else | |
| echo "[ERROR] Не удалось запустить контейнер wg-easy." >> $LOG_FILE | |
| echo "Ошибка" > $RESULT_FILE | |
| exit 1 | |
| fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment