Skip to content

Instantly share code, notes, and snippets.

@sm1ky
Last active December 23, 2025 11:28
Show Gist options
  • Select an option

  • Save sm1ky/e600917e97327e8efd7b7ebbffa256e7 to your computer and use it in GitHub Desktop.

Select an option

Save sm1ky/e600917e97327e8efd7b7ebbffa256e7 to your computer and use it in GitHub Desktop.
Install wireguard & awg
#!/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
#!/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