Update install.sh
Этот коммит содержится в:
+106
-94
@@ -5,6 +5,9 @@ SERVICE_NAME="awg_bot"
|
|||||||
REPO_URL="https://github.com/stevefoxru/amnezia-bot.git"
|
REPO_URL="https://github.com/stevefoxru/amnezia-bot.git"
|
||||||
REPO_API="https://api.github.com/repos/stevefoxru/amnezia-bot"
|
REPO_API="https://api.github.com/repos/stevefoxru/amnezia-bot"
|
||||||
LOCAL_VERSION_FILE="/root/amnezia-bot/.version"
|
LOCAL_VERSION_FILE="/root/amnezia-bot/.version"
|
||||||
|
BOT_DIR="/root/amnezia-bot"
|
||||||
|
AWG_DIR="$BOT_DIR/awg"
|
||||||
|
FILES_DIR="$AWG_DIR/files"
|
||||||
|
|
||||||
# Цвета для вывода
|
# Цвета для вывода
|
||||||
GREEN=$'\033[0;32m'
|
GREEN=$'\033[0;32m'
|
||||||
@@ -30,35 +33,45 @@ run_with_spinner() {
|
|||||||
local cmd="$@"
|
local cmd="$@"
|
||||||
if [ "$ENABLE_LOGS" = true ]; then
|
if [ "$ENABLE_LOGS" = true ]; then
|
||||||
echo -e "${BLUE}${description}...${NC}"
|
echo -e "${BLUE}${description}...${NC}"
|
||||||
eval "$cmd"
|
eval "$cmd" || error_exit "Не удалось выполнить: $cmd"
|
||||||
local stat=$?
|
echo -e "${GREEN}${description}... Done!${NC}\n"
|
||||||
if [ $stat -eq 0 ]; then echo -e "${GREEN}${description}... Done!${NC}\n"; else echo -e "${RED}${description}... Failed!${NC}\n"; error_exit "$cmd"; fi
|
|
||||||
else
|
else
|
||||||
local out=$(mktemp) err=$(mktemp)
|
local out=$(mktemp) err=$(mktemp)
|
||||||
eval "$cmd" >"$out" 2>"$err" & pid=$!
|
eval "$cmd" >"$out" 2>"$err" & pid=$!
|
||||||
local spinner='|/-\\' i=0
|
local spinner='|/-\\' i=0
|
||||||
while kill -0 "$pid" 2>/dev/null; do printf "\r${BLUE}${description}...${NC} ${spinner:i++%${#spinner}:1}"; sleep 0.1; done
|
while kill -0 "$pid" 2>/dev/null; do
|
||||||
|
printf "\r${BLUE}${description}...${NC} ${spinner:i++%${#spinner}:1}"
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
wait "$pid"; stat=$?
|
wait "$pid"; stat=$?
|
||||||
if [ $stat -eq 0 ]; then printf "\r${BLUE}${description}...${NC} ${GREEN}Done!${NC}\n\n"; else printf "\r${BLUE}${description}...${NC} ${RED}Failed!${NC}\n\n"; echo -e "${RED}Ошибка: $cmd${NC}"; cat "$err"; rm -f "$out" "$err"; error_exit "$cmd"; fi
|
if [ $stat -eq 0 ]; then
|
||||||
|
printf "\r${BLUE}${description}...${NC} ${GREEN}Done!${NC}\n\n"
|
||||||
|
else
|
||||||
|
printf "\r${BLUE}${description}...${NC} ${RED}Failed!${NC}\n\n"
|
||||||
|
echo -e "${RED}Ошибка: $cmd${NC}"
|
||||||
|
cat "$err"
|
||||||
|
rm -f "$out" "$err"
|
||||||
|
error_exit "$cmd"
|
||||||
|
fi
|
||||||
rm -f "$out" "$err"
|
rm -f "$out" "$err"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Функция проверки обновлений на GitHub
|
# Функция проверки обновлений на GitHub
|
||||||
check_github_updates() {
|
check_github_updates() {
|
||||||
local current_sha local_sha latest_sha auto_mode="$1"
|
local auto_mode="$1"
|
||||||
cd /root/amnezia-bot || { echo -e "${RED}Каталог amnezia-bot не найден${NC}"; return 1; }
|
cd "$BOT_DIR" || error_exit "Каталог $BOT_DIR не найден"
|
||||||
|
|
||||||
|
# Проверка наличия git
|
||||||
|
command -v git &>/dev/null || error_exit "git не установлен"
|
||||||
|
|
||||||
# Получение текущего SHA коммита
|
# Получение текущего SHA коммита
|
||||||
local_sha=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
|
local_sha=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
|
||||||
|
|
||||||
# Получение последнего коммита через GitHub API
|
# Получение последнего коммита через GitHub API
|
||||||
if command -v curl &>/dev/null; then
|
command -v curl &>/dev/null || error_exit "curl не установлен"
|
||||||
latest_sha=$(curl -s "$REPO_API/commits/main" | jq -r '.sha' 2>/dev/null)
|
latest_sha=$(curl -s "$REPO_API/commits/main" | jq -r '.sha' 2>/dev/null)
|
||||||
[[ -z "$latest_sha" ]] && { echo -e "${RED}Не удалось получить данные с GitHub${NC}"; cd ..; return 1; }
|
[[ -z "$latest_sha" ]] && { echo -e "${RED}Не удалось получить данные с GitHub${NC}"; cd ..; return 1; }
|
||||||
else
|
|
||||||
echo -e "${RED}curl не установлен${NC}"; cd ..; return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Сравнение версий
|
# Сравнение версий
|
||||||
if [[ "$local_sha" == "$latest_sha" ]]; then
|
if [[ "$local_sha" == "$latest_sha" ]]; then
|
||||||
@@ -68,7 +81,6 @@ check_github_updates() {
|
|||||||
|
|
||||||
echo -e "${YELLOW}Доступно обновление (текущий SHA: $local_sha, последний SHA: $latest_sha)${NC}"
|
echo -e "${YELLOW}Доступно обновление (текущий SHA: $local_sha, последний SHA: $latest_sha)${NC}"
|
||||||
if [[ "$auto_mode" == "--auto" ]]; then
|
if [[ "$auto_mode" == "--auto" ]]; then
|
||||||
# Проверка на наличие локальных изменений
|
|
||||||
if git status --porcelain | grep -q .; then
|
if git status --porcelain | grep -q .; then
|
||||||
echo -e "${YELLOW}Обнаружены локальные изменения. Сбрасываем их...${NC}"
|
echo -e "${YELLOW}Обнаружены локальные изменения. Сбрасываем их...${NC}"
|
||||||
run_with_spinner "Сброс локальных изменений" "git reset --hard && git clean -fd"
|
run_with_spinner "Сброс локальных изменений" "git reset --hard && git clean -fd"
|
||||||
@@ -103,10 +115,7 @@ check_github_updates() {
|
|||||||
|
|
||||||
# Проверка и применение обновлений
|
# Проверка и применение обновлений
|
||||||
check_updates() {
|
check_updates() {
|
||||||
if [[ ! -d "/root/amnezia-bot/.git" ]]; then
|
[[ ! -d "$BOT_DIR/.git" ]] && error_exit "Репозиторий не найден. Пожалуйста, установите бот сначала."
|
||||||
echo -e "${RED}Репозиторий не найден. Пожалуйста, установите бот сначала.${NC}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
check_github_updates --auto
|
check_github_updates --auto
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,8 +137,8 @@ done
|
|||||||
# Проверка обновления самого скрипта
|
# Проверка обновления самого скрипта
|
||||||
check_script_update() {
|
check_script_update() {
|
||||||
local temp_script=$(mktemp)
|
local temp_script=$(mktemp)
|
||||||
if [[ -f "/root/amnezia-bot/install.sh" ]]; then
|
if [[ -f "$BOT_DIR/install.sh" ]]; then
|
||||||
cp "/root/amnezia-bot/install.sh" "$temp_script"
|
cp "$BOT_DIR/install.sh" "$temp_script"
|
||||||
if ! cmp -s "$SCRIPT_PATH" "$temp_script"; then
|
if ! cmp -s "$SCRIPT_PATH" "$temp_script"; then
|
||||||
echo -e "${YELLOW}Обнаружено обновление скрипта install.sh${NC}"
|
echo -e "${YELLOW}Обнаружено обновление скрипта install.sh${NC}"
|
||||||
run_with_spinner "Обновление скрипта" "mv $temp_script $SCRIPT_PATH && chmod +x $SCRIPT_PATH"
|
run_with_spinner "Обновление скрипта" "mv $temp_script $SCRIPT_PATH && chmod +x $SCRIPT_PATH"
|
||||||
@@ -140,90 +149,87 @@ check_script_update() {
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo -e "${YELLOW}Скрипт install.sh не найден в репозитории, копируем локальную версию${NC}"
|
echo -e "${YELLOW}Скрипт install.sh не найден в репозитории, копируем локальную версию${NC}"
|
||||||
cp "$SCRIPT_PATH" "/root/amnezia-bot/install.sh"
|
cp "$SCRIPT_PATH" "$BOT_DIR/install.sh"
|
||||||
chmod +x "/root/amnezia-bot/install.sh"
|
chmod +x "$BOT_DIR/install.sh"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Получение версии Ubuntu
|
# Получение версии Ubuntu
|
||||||
get_ubuntu_version() {
|
get_ubuntu_version() {
|
||||||
if command -v lsb_release &>/dev/null; then
|
command -v lsb_release &>/dev/null || error_exit "lsb_release не установлен. Установите пакет lsb-release."
|
||||||
UBUNTU_VERSION=$(lsb_release -rs)
|
UBUNTU_VERSION=$(lsb_release -rs)
|
||||||
UBUNTU_CODENAME=$(lsb_release -cs)
|
UBUNTU_CODENAME=$(lsb_release -cs)
|
||||||
DISTRIB_ID=$(lsb_release -is)
|
DISTRIB_ID=$(lsb_release -is)
|
||||||
[[ "$DISTRIB_ID" != "Ubuntu" ]] && error_exit "Скрипт поддерживает только Ubuntu. Обнаружена система: $DISTRIB_ID"
|
[[ "$DISTRIB_ID" != "Ubuntu" ]] && error_exit "Скрипт поддерживает только Ubuntu. Обнаружена система: $DISTRIB_ID"
|
||||||
else
|
|
||||||
error_exit "lsb_release не установлен. Установите пакет lsb-release."
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Обновление и очистка системы
|
# Обновление и очистка системы
|
||||||
update_and_clean_system() {
|
update_and_clean_system() {
|
||||||
|
local max_attempts=30 attempt=1
|
||||||
while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
|
while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
|
||||||
echo -e "${YELLOW}APT занят. Ждём...${NC}"; sleep 2
|
echo -e "${YELLOW}APT занят. Ждём ($attempt/$max_attempts)...${NC}"
|
||||||
|
((attempt++))
|
||||||
|
[[ $attempt -gt $max_attempts ]] && error_exit "Таймаут ожидания dpkg lock"
|
||||||
|
sleep 2
|
||||||
done
|
done
|
||||||
run_with_spinner "Обновление системы" "apt-get update -qq && apt-get upgrade -y -qq"
|
run_with_spinner "Обновление системы" "apt-get update -qq && apt-get upgrade -y -qq"
|
||||||
run_with_spinner "Очистка системы" "apt-get autoclean -qq && apt-get autoremove --purge -y -qq"
|
run_with_spinner "Очистка системы" "apt-get autoclean -qq && apt-get autoremove --purge -y -qq"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Обязательная установка Python 3.11
|
# Проверка и установка Python 3.11
|
||||||
check_python() {
|
check_python() {
|
||||||
if command -v python3.11 &>/dev/null; then
|
if command -v python3.11 &>/dev/null; then
|
||||||
echo -e "${GREEN}Python 3.11 уже установлен${NC}"
|
echo -e "${GREEN}Python 3.11 уже установлен${NC}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
echo -e "${YELLOW}Устанавливаю Python 3.11...${NC}"
|
echo -e "${YELLOW}Устанавливаю Python 3.11...${NC}"
|
||||||
if [[ "$UBUNTU_VERSION" == "24.04" ]]; then
|
|
||||||
local max=30 cnt=1
|
|
||||||
while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
|
|
||||||
echo -e "${YELLOW}Ожидание dpkg lock ($cnt/$max)${NC}"; ((cnt++))
|
|
||||||
[ $cnt -gt $max ] && error_exit "Таймаут ожидания dpkg lock"
|
|
||||||
sleep 10
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
run_with_spinner "Установка Python 3.11" "apt-get install -y software-properties-common && add-apt-repository -y ppa:deadsnakes/ppa && apt-get update -qq && apt-get install -y python3.11 python3.11-venv python3.11-dev -qq"
|
run_with_spinner "Установка Python 3.11" "apt-get install -y software-properties-common && add-apt-repository -y ppa:deadsnakes/ppa && apt-get update -qq && apt-get install -y python3.11 python3.11-venv python3.11-dev -qq"
|
||||||
command -v python3.11 &>/dev/null || error_exit "Не удалось установить Python 3.11"
|
command -v python3.11 &>/dev/null || error_exit "Не удалось установить Python 3.11"
|
||||||
echo -e "${GREEN}Python 3.11 успешно установлен${NC}"
|
echo -e "${GREEN}Python 3.11 успешно установлен${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Установка зависимостей VPN-бота
|
# Установка зависимостей
|
||||||
install_dependencies() {
|
install_dependencies() {
|
||||||
run_with_spinner "Установка зависимостей" "apt-get install -y jq net-tools iptables resolvconf git curl sqlite3 docker.io -qq"
|
local packages=("jq" "net-tools" "iptables" "resolvconf" "git" "curl" "sqlite3" "docker.io")
|
||||||
|
local to_install=()
|
||||||
|
for pkg in "${packages[@]}"; do
|
||||||
|
dpkg -s "$pkg" &>/dev/null || to_install+=("$pkg")
|
||||||
|
done
|
||||||
|
[[ ${#to_install[@]} -gt 0 ]] && run_with_spinner "Установка зависимостей" "apt-get install -y ${to_install[*]} -qq"
|
||||||
run_with_spinner "Включение Docker" "systemctl enable docker && systemctl start docker"
|
run_with_spinner "Включение Docker" "systemctl enable docker && systemctl start docker"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Установка и конфигурация needrestart
|
# Установка и конфигурация needrestart
|
||||||
install_and_configure_needrestart() {
|
install_and_configure_needrestart() {
|
||||||
run_with_spinner "Установка needrestart" "apt-get install -y needrestart -qq"
|
dpkg -s needrestart &>/dev/null || run_with_spinner "Установка needrestart" "apt-get install -y needrestart -qq"
|
||||||
sed -i 's/^#\?\(nrconf{restart} = \"\).*$/\1a\";/' /etc/needrestart/needrestart.conf
|
sed -i 's/^#\?\(nrconf{restart} = \"\).*$/\1a\";/' /etc/needrestart/needrestart.conf
|
||||||
grep -q 'nrconf{restart} = "a";' /etc/needrestart/needrestart.conf || echo 'nrconf{restart} = "a";' >> /etc/needrestart/needrestart.conf
|
grep -q 'nrconf{restart} = "a";' /etc/needrestart/needrestart.conf || echo 'nrconf{restart} = "a";' >> /etc/needrestart/needrestart.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
# Клонирование репозитория
|
# Клонирование репозитория
|
||||||
clone_repository() {
|
clone_repository() {
|
||||||
cd /root
|
cd /root || error_exit "Не удалось перейти в /root"
|
||||||
if [[ -d "amnezia-bot/.git" ]]; then
|
if [[ -d "$BOT_DIR/.git" ]]; then
|
||||||
echo -e "${YELLOW}Репозиторий уже присутствует, пропускаем клонирование...${NC}"
|
echo -e "${YELLOW}Репозиторий уже присутствует, пропускаем клонирование...${NC}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
run_with_spinner "Клонирование репозитория" "git clone $REPO_URL -q"
|
run_with_spinner "Клонирование репозитория" "git clone $REPO_URL -q $BOT_DIR"
|
||||||
cd amnezia-bot || error_exit "Не удалось перейти в каталог amnezia-bot"
|
cd "$BOT_DIR" || error_exit "Не удалось перейти в каталог $BOT_DIR"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Настройка виртуального окружения
|
# Настройка виртуального окружения
|
||||||
setup_python_env() {
|
setup_python_env() {
|
||||||
echo -e "${BLUE}Настройка Python окружения...${NC}"
|
echo -e "${BLUE}Настройка Python окружения...${NC}"
|
||||||
if [[ -d "myenv" ]]; then
|
cd "$BOT_DIR" || error_exit "Каталог $BOT_DIR не найден"
|
||||||
rm -rf myenv
|
[[ -d "myenv" ]] && rm -rf myenv
|
||||||
fi
|
|
||||||
run_with_spinner "Создание virtualenv" "python3.11 -m venv myenv"
|
run_with_spinner "Создание virtualenv" "python3.11 -m venv myenv"
|
||||||
source myenv/bin/activate
|
source myenv/bin/activate || error_exit "Не удалось активировать виртуальное окружение"
|
||||||
run_with_spinner "Установка Python-зависимостей" "pip install --upgrade pip"
|
run_with_spinner "Обновление pip" "pip install --upgrade pip -q"
|
||||||
if [[ -f "requirements.txt" ]]; then
|
if [[ -f "requirements.txt" ]]; then
|
||||||
run_with_spinner "Установка зависимостей из requirements.txt" "pip install -r requirements.txt"
|
run_with_spinner "Установка зависимостей из requirements.txt" "pip install -r requirements.txt -q"
|
||||||
else
|
else
|
||||||
echo -e "${YELLOW}Файл requirements.txt не найден. Устанавливаем минимальные зависимости...${NC}"
|
echo -e "${YELLOW}Файл requirements.txt не найден. Устанавливаем минимальные зависимости...${NC}"
|
||||||
run_with_spinner "Установка минимальных зависимостей" "pip install aiogram==2.25.1 aiohttp==3.8.6 apscheduler==3.10.4 humanize==4.9.0 pytz==2023.3.post1"
|
run_with_spinner "Установка минимальных зависимостей" "pip install aiogram==2.25.1 aiohttp==3.8.6 apscheduler==3.10.4 humanize==4.9.0 pytz==2023.3.post1 yoomoney==0.1.0 -q"
|
||||||
fi
|
fi
|
||||||
deactivate
|
deactivate
|
||||||
echo -e "${GREEN}Настройка Python окружения... Done!${NC}"
|
echo -e "${GREEN}Настройка Python окружения... Done!${NC}"
|
||||||
@@ -231,70 +237,71 @@ setup_python_env() {
|
|||||||
|
|
||||||
# Проверка наличия bot_manager.py и настройка структуры
|
# Проверка наличия bot_manager.py и настройка структуры
|
||||||
check_bot_files() {
|
check_bot_files() {
|
||||||
|
cd "$AWG_DIR" || error_exit "Каталог $AWG_DIR не найден"
|
||||||
echo -e "${BLUE}Проверка наличия bot_manager.py...${NC}"
|
echo -e "${BLUE}Проверка наличия bot_manager.py...${NC}"
|
||||||
echo -e "${YELLOW}Текущая директория: $(pwd)${NC}"
|
|
||||||
echo -e "${YELLOW}Содержимое корня:${NC}"
|
|
||||||
ls -la
|
|
||||||
if [[ ! -d "awg" ]]; then
|
if [[ ! -d "awg" ]]; then
|
||||||
echo -e "${YELLOW}Каталог awg не найден. Создаём...${NC}"
|
echo -e "${YELLOW}Каталог awg не найден. Создаём...${NC}"
|
||||||
mkdir -p awg || error_exit "Не удалось создать каталог awg"
|
mkdir -p awg || error_exit "Не удалось создать каталог awg"
|
||||||
fi
|
fi
|
||||||
echo -e "${YELLOW}Содержимое awg:${NC}"
|
|
||||||
ls -la awg
|
|
||||||
if [[ -f "awg/bot_manager.py" ]]; then
|
|
||||||
echo -e "${GREEN}Найден bot_manager.py в awg${NC}"
|
|
||||||
else
|
|
||||||
if [[ -f "bot_manager.py" ]]; then
|
if [[ -f "bot_manager.py" ]]; then
|
||||||
echo -e "${YELLOW}Найден bot_manager.py в корне. Перемещаем в awg...${NC}"
|
echo -e "${YELLOW}Найден bot_manager.py в корне. Перемещаем в awg...${NC}"
|
||||||
mv bot_manager.py awg/ || error_exit "Не удалось переместить bot_manager.py в awg"
|
mv bot_manager.py awg/ || error_exit "Не удалось переместить bot_manager.py в awg"
|
||||||
for file in db.py awg-decode.py newclient.sh removeclient.sh; do
|
for file in db.py awg-decode.py newclient.sh removeclient.sh; do
|
||||||
if [[ -f "$file" ]]; then
|
[[ -f "$file" ]] && mv "$file" awg/ || echo -e "${YELLOW}Не удалось переместить $file в awg${NC}"
|
||||||
mv "$file" awg/ || echo -e "${YELLOW}Не удалось переместить $file в awg${NC}"
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
else
|
|
||||||
echo -e "${RED}Файл bot_manager.py не найден ни в awg, ни в корне репозитория${NC}"
|
|
||||||
echo -e "${RED}Проверьте содержимое репозитория: $REPO_URL${NC}"
|
|
||||||
echo -e "${YELLOW}Вы можете указать путь к файлу bot_manager.py или загрузить его в репозиторий.${NC}"
|
|
||||||
read -p "Введите путь к файлу bot_manager.py (оставьте пустым для выхода): " bot_manager_path
|
|
||||||
if [[ -n "$bot_manager_path" && -f "$bot_manager_path" ]]; then
|
|
||||||
echo -e "${YELLOW}Копирую bot_manager.py из $bot_manager_path в awg...${NC}"
|
|
||||||
cp "$bot_manager_path" awg/bot_manager.py || error_exit "Не удалось скопировать bot_manager.py в awg"
|
|
||||||
echo -e "${GREEN}Файл bot_manager.py успешно скопирован в awg${NC}"
|
|
||||||
else
|
|
||||||
error_exit "Файл bot_manager.py не найден по указанному пути или путь не указан"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
if [[ ! -f "awg/bot_manager.py" ]]; then
|
||||||
|
error_exit "Файл bot_manager.py не найден в $AWG_DIR/awg. Проверьте репозиторий: $REPO_URL"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Проверка и создание конфигурации
|
# Проверка и создание конфигурации
|
||||||
check_config() {
|
check_config() {
|
||||||
cd awg || error_exit "Не удалось перейти в каталог awg"
|
cd "$AWG_DIR" || error_exit "Не удалось перейти в каталог $AWG_DIR"
|
||||||
echo -e "${BLUE}Проверка конфигурации...${NC}"
|
echo -e "${BLUE}Проверка конфигурации...${NC}"
|
||||||
if [[ ! -f "files/setting.ini" ]]; then
|
mkdir -p files || error_exit "Не удалось создать директорию files"
|
||||||
|
if [[ ! -f "$FILES_DIR/setting.ini" ]]; then
|
||||||
echo -e "${YELLOW}Файл setting.ini не найден. Запрашиваем конфигурацию...${NC}"
|
echo -e "${YELLOW}Файл setting.ini не найден. Запрашиваем конфигурацию...${NC}"
|
||||||
read -p "Введите токен Telegram бота: " bot_token
|
read -p "Введите токен Telegram бота: " bot_token
|
||||||
|
[[ -z "$bot_token" ]] && error_exit "Токен бота не может быть пустым"
|
||||||
read -p "Введите Telegram ID администраторов через запятую (например, 12345,67890): " admin_ids
|
read -p "Введите Telegram ID администраторов через запятую (например, 12345,67890): " admin_ids
|
||||||
|
[[ -z "$admin_ids" ]] && error_exit "ID администраторов не могут быть пустыми"
|
||||||
read -p "Введите endpoint VPN (например, vpn.example.com:51820): " endpoint
|
read -p "Введите endpoint VPN (например, vpn.example.com:51820): " endpoint
|
||||||
mkdir -p files || error_exit "Не удалось создать директорию files"
|
[[ -z "$endpoint" ]] && error_exit "Endpoint не может быть пустым"
|
||||||
cat << EOF > files/setting.ini
|
# Валидация формата admin_ids
|
||||||
|
if ! echo "$admin_ids" | grep -qE '^[0-9]+(,[0-9]+)*$'; then
|
||||||
|
error_exit "Некорректный формат admin_ids. Используйте числа, разделённые запятыми (например, 12345,67890)"
|
||||||
|
fi
|
||||||
|
# Валидация формата endpoint
|
||||||
|
if ! echo "$endpoint" | grep -qE '^[^:]+:[0-9]+$'; then
|
||||||
|
error_exit "Некорректный формат endpoint. Используйте формат host:port (например, vpn.example.com:51820)"
|
||||||
|
fi
|
||||||
|
cat << EOF > "$FILES_DIR/setting.ini"
|
||||||
[Settings]
|
[Settings]
|
||||||
bot_token = $bot_token
|
bot_token = $bot_token
|
||||||
admin_ids = $admin_ids
|
admin_ids = $admin_ids
|
||||||
wg_config_file = /root/amnezia-bot/awg/files/wg0.conf
|
wg_config_file = $FILES_DIR/wg0.conf
|
||||||
docker_container = amnezia-awg
|
docker_container = amnezia-awg
|
||||||
endpoint = $endpoint
|
endpoint = $endpoint
|
||||||
EOF
|
EOF
|
||||||
echo -e "${GREEN}Конфигурация сохранена в files/setting.ini${NC}"
|
chmod 600 "$FILES_DIR/setting.ini"
|
||||||
|
echo -e "${GREEN}Конфигурация сохранена в $FILES_DIR/setting.ini${NC}"
|
||||||
fi
|
fi
|
||||||
if docker ps -q -f name=amnezia-awg >/dev/null; then
|
if docker ps -q -f name=amnezia-awg >/dev/null; then
|
||||||
echo -e "${GREEN}Найден Docker-контейнер: amnezia-awg${NC}"
|
echo -e "${GREEN}Найден Docker-контейнер: amnezia-awg${NC}"
|
||||||
else
|
else
|
||||||
echo -e "${YELLOW}ВНИМАНИЕ: Docker-контейнер amnezia-awg не найден. Убедитесь, что он настроен.${NC}"
|
echo -e "${YELLOW}ВНИМАНИЕ: Docker-контейнер amnezia-awg не найден. Попытка запуска...${NC}"
|
||||||
|
docker pull amneziawg/amnezia-wg &>/dev/null || echo -e "${YELLOW}Не удалось загрузить образ amneziawg/amnezia-wg${NC}"
|
||||||
|
docker run -d --name amnezia-awg \
|
||||||
|
--cap-add=NET_ADMIN \
|
||||||
|
--cap-add=SYS_MODULE \
|
||||||
|
-v "$FILES_DIR:/etc/wireguard" \
|
||||||
|
-p 51820:51820/udp \
|
||||||
|
--restart=always \
|
||||||
|
amneziawg/amnezia-wg &>/dev/null || echo -e "${YELLOW}Не удалось запустить контейнер amnezia-awg${NC}"
|
||||||
fi
|
fi
|
||||||
if [[ ! -f "files/wg0.conf" ]]; then
|
if [[ ! -f "$FILES_DIR/wg0.conf" ]]; then
|
||||||
echo -e "${YELLOW}ВНИМАНИЕ: Файл wg0.conf не найден. Убедитесь, что WireGuard настроен.${NC}"
|
echo -e "${YELLOW}ВНИМАНИЕ: Файл wg0.conf не найден. Создайте $FILES_DIR/wg0.conf для WireGuard.${NC}"
|
||||||
fi
|
fi
|
||||||
cd ..
|
cd ..
|
||||||
echo -e "${GREEN}Проверка конфигурации... Done!${NC}"
|
echo -e "${GREEN}Проверка конфигурации... Done!${NC}"
|
||||||
@@ -302,26 +309,30 @@ EOF
|
|||||||
|
|
||||||
# Права на скрипты
|
# Права на скрипты
|
||||||
set_permissions() {
|
set_permissions() {
|
||||||
|
cd "$AWG_DIR" || error_exit "Каталог $AWG_DIR не найден"
|
||||||
find . -type f -name "*.sh" -exec chmod +x {} \; || error_exit "Не удалось установить права на скрипты"
|
find . -type f -name "*.sh" -exec chmod +x {} \; || error_exit "Не удалось установить права на скрипты"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Инициализация бота для генерации config
|
# Инициализация бота для генерации config
|
||||||
initialize_bot() {
|
initialize_bot() {
|
||||||
cd awg || error_exit "Не удалось перейти в каталог awg"
|
cd "$AWG_DIR" || error_exit "Не удалось перейти в каталог $AWG_DIR"
|
||||||
if [[ ! -f "files/setting.ini" ]]; then
|
if [[ ! -f "$FILES_DIR/setting.ini" ]]; then
|
||||||
if [[ -f "bot_manager.py" ]]; then
|
if [[ -f "bot_manager.py" ]]; then
|
||||||
../myenv/bin/python3.11 bot_manager.py < /dev/tty &
|
timeout 30s ../myenv/bin/python3.11 bot_manager.py < /dev/tty &
|
||||||
local PID=$!
|
local PID=$!
|
||||||
while [[ ! -f "files/setting.ini" ]]; do
|
local max_wait=30 wait_count=0
|
||||||
sleep 2
|
while [[ ! -f "$FILES_DIR/setting.ini" && $wait_count -lt $max_wait ]]; do
|
||||||
kill -0 "$PID" 2>/dev/null || error_exit "Ошибка инициализации бота"
|
sleep 1
|
||||||
|
((wait_count++))
|
||||||
|
kill -0 "$PID" 2>/dev/null || error_exit "Ошибка инициализации бота: bot_manager.py завершился с ошибкой"
|
||||||
done
|
done
|
||||||
|
[[ -f "$FILES_DIR/setting.ini" ]] || error_exit "Файл setting.ini не был создан после запуска bot_manager.py"
|
||||||
kill "$PID" && wait "$PID" 2>/dev/null
|
kill "$PID" && wait "$PID" 2>/dev/null
|
||||||
else
|
else
|
||||||
echo -e "${RED}Файл bot_manager.py не найден в awg${NC}"
|
error_exit "Файл bot_manager.py не найден в $AWG_DIR"
|
||||||
error_exit "Отсутствует необходимый файл bot_manager.py"
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
chmod 600 "$FILES_DIR/setting.ini"
|
||||||
cd ..
|
cd ..
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,15 +345,15 @@ After=network.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
User=root
|
User=root
|
||||||
WorkingDirectory=/root/amnezia-bot/awg
|
WorkingDirectory=$AWG_DIR
|
||||||
ExecStart=/root/amnezia-bot/myenv/bin/python3.11 bot_manager.py
|
ExecStart=$BOT_DIR/myenv/bin/python3.11 bot_manager.py
|
||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=10
|
RestartSec=10
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
run_with_spinner "Установка службы" "mv /tmp/service_file /etc/systemd/system/$SERVICE_NAME.service"
|
run_with_spinner "Установка службы" "mv /tmp/service_file /etc/systemd/system/$SERVICE_NAME.service && chmod 644 /etc/systemd/system/$SERVICE_NAME.service"
|
||||||
run_with_spinner "Обновление systemd" "systemctl daemon-reload"
|
run_with_spinner "Обновление systemd" "systemctl daemon-reload"
|
||||||
run_with_spinner "Запуск службы" "systemctl start $SERVICE_NAME"
|
run_with_spinner "Запуск службы" "systemctl start $SERVICE_NAME"
|
||||||
run_with_spinner "Включение автозапуска" "systemctl enable $SERVICE_NAME"
|
run_with_spinner "Включение автозапуска" "systemctl enable $SERVICE_NAME"
|
||||||
@@ -355,7 +366,7 @@ remove_amneziawg() {
|
|||||||
systemctl is-active --quiet "$SERVICE_NAME" && run_with_spinner "Остановка" "systemctl stop $SERVICE_NAME"
|
systemctl is-active --quiet "$SERVICE_NAME" && run_with_spinner "Остановка" "systemctl stop $SERVICE_NAME"
|
||||||
run_with_spinner "Удаление контейнеров" "docker ps -aq -f name=amnezia-wg | xargs -r docker rm -f"
|
run_with_spinner "Удаление контейнеров" "docker ps -aq -f name=amnezia-wg | xargs -r docker rm -f"
|
||||||
run_with_spinner "Удаление образов" "docker images -q amneziawg/amnezia-wg | uniq | xargs -r docker rmi -f"
|
run_with_spinner "Удаление образов" "docker images -q amneziawg/amnezia-wg | uniq | xargs -r docker rmi -f"
|
||||||
run_with_spinner "Удаление конфигов" "rm -rf /root/amnezia-bot/awg/files"
|
run_with_spinner "Удаление конфигов" "rm -rf $FILES_DIR"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Меню управления службой
|
# Меню управления службой
|
||||||
@@ -384,7 +395,7 @@ reinstall_bot() {
|
|||||||
[[ "$ans" =~ ^[Yy]$ ]] || return
|
[[ "$ans" =~ ^[Yy]$ ]] || return
|
||||||
systemctl is-active --quiet "$SERVICE_NAME" && run_with_spinner "Остановка" "systemctl stop $SERVICE_NAME"
|
systemctl is-active --quiet "$SERVICE_NAME" && run_with_spinner "Остановка" "systemctl stop $SERVICE_NAME"
|
||||||
systemctl list-units --type=service --all | grep -q "$SERVICE_NAME.service" && run_with_spinner "Удаление службы" "systemctl disable $SERVICE_NAME && rm /etc/systemd/system/$SERVICE_NAME.service && systemctl daemon-reload"
|
systemctl list-units --type=service --all | grep -q "$SERVICE_NAME.service" && run_with_spinner "Удаление службы" "systemctl disable $SERVICE_NAME && rm /etc/systemd/system/$SERVICE_NAME.service && systemctl daemon-reload"
|
||||||
run_with_spinner "Удаление файлов" "rm -rf /root/amnezia-bot"
|
run_with_spinner "Удаление файлов" "rm -rf $BOT_DIR"
|
||||||
install_bot
|
install_bot
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -414,9 +425,10 @@ install_bot() {
|
|||||||
check_bot_files
|
check_bot_files
|
||||||
setup_python_env
|
setup_python_env
|
||||||
set_permissions
|
set_permissions
|
||||||
|
check_config
|
||||||
initialize_bot
|
initialize_bot
|
||||||
create_service
|
create_service
|
||||||
cp "$SCRIPT_PATH" "/root/amnezia-bot/install.sh" && chmod +x "/root/amnezia-bot/install.sh"
|
cp "$SCRIPT_PATH" "$BOT_DIR/install.sh" && chmod +x "$BOT_DIR/install.sh"
|
||||||
echo -e "${GREEN}Установка завершена!${NC}"
|
echo -e "${GREEN}Установка завершена!${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user