mirror of
https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot.git
synced 2026-03-02 00:03:05 +00:00
Update install_bot.sh
This commit is contained in:
386
install_bot.sh
386
install_bot.sh
@@ -180,10 +180,384 @@ load_state() {
|
||||
initialize_state missing
|
||||
fi
|
||||
|
||||
# Проверяем наличие .env файла
|
||||
if [[ ! -f "$INSTALL_PATH/.env" ]]; then
|
||||
print_warning ".env файл не найден!"
|
||||
read -rp "Выполнить первичную настройку .env? [Y/n]: " setup_env_confirm
|
||||
if [[ "${setup_env_confirm,,}" != "n" ]]; then
|
||||
setup_env
|
||||
else
|
||||
print_error "Бот не может работать без .env файла!"
|
||||
print_info "Вы можете настроить его позже через пункт меню [9]"
|
||||
fi
|
||||
fi
|
||||
|
||||
BACKUP_DIR="$INSTALL_PATH/backups"
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
}
|
||||
|
||||
# Функция проверки существования .env
|
||||
check_env_exists() {
|
||||
[[ -f "$INSTALL_PATH/.env" ]]
|
||||
}
|
||||
|
||||
# Функция первичной настройки .env
|
||||
setup_env() {
|
||||
print_header "ПЕРВИЧНАЯ НАСТРОЙКА КОНФИГУРАЦИИ (.env)"
|
||||
|
||||
local env_file="$INSTALL_PATH/.env"
|
||||
|
||||
# Создаем резервную копию если файл существует
|
||||
if [[ -f "$env_file" ]]; then
|
||||
cp "$env_file" "$env_file.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
print_info "Создана резервная копия существующего .env"
|
||||
fi
|
||||
|
||||
print_section "Обязательные параметры"
|
||||
|
||||
# BOT_TOKEN
|
||||
local bot_token=""
|
||||
while [[ -z "$bot_token" ]]; do
|
||||
read -rp "Введите токен бота (BOT_TOKEN): " bot_token
|
||||
if [[ -z "$bot_token" ]]; then
|
||||
print_error "Токен бота обязателен!"
|
||||
fi
|
||||
done
|
||||
|
||||
# ADMIN_IDS
|
||||
local admin_ids=""
|
||||
while [[ -z "$admin_ids" ]]; do
|
||||
read -rp "Введите ID администраторов через запятую (ADMIN_IDS): " admin_ids
|
||||
if [[ -z "$admin_ids" ]]; then
|
||||
print_error "Хотя бы один ID администратора обязателен!"
|
||||
fi
|
||||
done
|
||||
|
||||
# WEB_API_DEFAULT_TOKEN
|
||||
local web_api_token=""
|
||||
read -rp "Введите токен для Web API (WEB_API_DEFAULT_TOKEN, Enter для автогенерации): " web_api_token
|
||||
if [[ -z "$web_api_token" ]]; then
|
||||
print_warning "Токен Web API не указан, будет сгенерирован случайный"
|
||||
web_api_token=$(openssl rand -hex 32 2>/dev/null || head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 64)
|
||||
print_success "Сгенерирован токен: ${web_api_token:0:16}..."
|
||||
fi
|
||||
|
||||
# REMNAWAVE_API_URL
|
||||
local remnawave_url=""
|
||||
while [[ -z "$remnawave_url" ]]; do
|
||||
read -rp "Введите URL API Remnawave (REMNAWAVE_API_URL): " remnawave_url
|
||||
if [[ -z "$remnawave_url" ]]; then
|
||||
print_error "URL API Remnawave обязателен!"
|
||||
fi
|
||||
done
|
||||
|
||||
# REMNAWAVE_API_KEY
|
||||
local remnawave_key=""
|
||||
while [[ -z "$remnawave_key" ]]; do
|
||||
read -rp "Введите ключ API Remnawave (REMNAWAVE_API_KEY): " remnawave_key
|
||||
if [[ -z "$remnawave_key" ]]; then
|
||||
print_error "Ключ API Remnawave обязателен!"
|
||||
fi
|
||||
done
|
||||
|
||||
print_section "Дополнительные параметры авторизации"
|
||||
|
||||
# Спрашиваем про тип авторизации
|
||||
echo -e "${CYAN}[1]${NC} API Key (по умолчанию)"
|
||||
echo -e "${CYAN}[2]${NC} Basic Auth"
|
||||
echo ""
|
||||
read -rp "Выберите тип авторизации [1]: " auth_choice
|
||||
auth_choice=${auth_choice:-1}
|
||||
|
||||
local auth_type="api_key"
|
||||
local remnawave_username=""
|
||||
local remnawave_password=""
|
||||
local remnawave_secret=""
|
||||
|
||||
if [[ "$auth_choice" == "2" ]]; then
|
||||
auth_type="basic_auth"
|
||||
read -rp "Введите имя пользователя для Basic Auth (REMNAWAVE_USERNAME): " remnawave_username
|
||||
read -rsp "Введите пароль для Basic Auth (REMNAWAVE_PASSWORD): " remnawave_password
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Secret key для панелей eGames
|
||||
echo ""
|
||||
read -rp "Используете панель, установленную скриптом eGames? [y/N]: " use_egames
|
||||
if [[ "${use_egames,,}" == "y" ]]; then
|
||||
read -rp "Введите секретный ключ в формате XXXXXXX:DDDDDDDD (REMNAWAVE_SECRET_KEY): " remnawave_secret
|
||||
fi
|
||||
|
||||
# Пароль PostgreSQL
|
||||
local postgres_password=""
|
||||
read -rp "Введите пароль для PostgreSQL (Enter для генерации): " postgres_password
|
||||
if [[ -z "$postgres_password" ]]; then
|
||||
postgres_password=$(openssl rand -base64 24 2>/dev/null || head -c 24 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 32)
|
||||
print_success "Сгенерирован пароль PostgreSQL"
|
||||
fi
|
||||
|
||||
# Создаем .env файл
|
||||
print_section "Создание .env файла"
|
||||
|
||||
cat > "$env_file" <<EOF
|
||||
# Telegram Bot Configuration
|
||||
BOT_TOKEN=$bot_token
|
||||
ADMIN_IDS=$admin_ids
|
||||
|
||||
# Web API Configuration
|
||||
WEB_API_DEFAULT_TOKEN=$web_api_token
|
||||
|
||||
# Remnawave API Configuration
|
||||
REMNAWAVE_API_URL=$remnawave_url
|
||||
REMNAWAVE_API_KEY=$remnawave_key
|
||||
|
||||
# Authentication Type: "api_key" or "basic_auth"
|
||||
REMNAWAVE_AUTH_TYPE=$auth_type
|
||||
EOF
|
||||
|
||||
if [[ "$auth_type" == "basic_auth" ]]; then
|
||||
cat >> "$env_file" <<EOF
|
||||
|
||||
# Basic Auth Credentials (for panels with Basic Auth)
|
||||
REMNAWAVE_USERNAME=$remnawave_username
|
||||
REMNAWAVE_PASSWORD=$remnawave_password
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [[ -n "$remnawave_secret" ]]; then
|
||||
cat >> "$env_file" <<EOF
|
||||
|
||||
# Secret Key for eGames panels (format: XXXXXXX:DDDDDDDD)
|
||||
REMNAWAVE_SECRET_KEY=$remnawave_secret
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Добавляем остальные стандартные параметры
|
||||
cat >> "$env_file" <<EOF
|
||||
|
||||
# Database Configuration
|
||||
POSTGRES_USER=postgres
|
||||
POSTGRES_PASSWORD=$postgres_password
|
||||
POSTGRES_DB=remnawave_bot
|
||||
|
||||
# Redis Configuration
|
||||
REDIS_HOST=redis
|
||||
REDIS_PORT=6379
|
||||
|
||||
# Application Settings
|
||||
NODE_ENV=production
|
||||
LOG_LEVEL=info
|
||||
EOF
|
||||
|
||||
chmod 600 "$env_file"
|
||||
print_success ".env файл создан: $env_file"
|
||||
print_info "Конфигурация сохранена, файл защищён (права 600)"
|
||||
}
|
||||
|
||||
# Функция редактирования .env
|
||||
edit_env() {
|
||||
print_header "РЕДАКТИРОВАНИЕ КОНФИГУРАЦИИ (.env)"
|
||||
|
||||
local env_file="$INSTALL_PATH/.env"
|
||||
|
||||
if [[ ! -f "$env_file" ]]; then
|
||||
print_error ".env файл не найден!"
|
||||
read -rp "Создать новый .env файл? [Y/n]: " create_new
|
||||
if [[ "${create_new,,}" != "n" ]]; then
|
||||
setup_env
|
||||
fi
|
||||
return
|
||||
fi
|
||||
|
||||
echo -e "${CYAN}[1]${NC} Редактировать в текстовом редакторе"
|
||||
echo -e "${CYAN}[2]${NC} Изменить конкретные параметры"
|
||||
echo -e "${CYAN}[3]${NC} Показать текущую конфигурацию"
|
||||
echo -e "${CYAN}[4]${NC} Пересоздать .env с нуля"
|
||||
echo -e "${CYAN}[0]${NC} Вернуться назад"
|
||||
|
||||
echo ""
|
||||
read -rp "Выберите опцию: " choice
|
||||
|
||||
case $choice in
|
||||
1)
|
||||
# Создаем резервную копию
|
||||
cp "$env_file" "$env_file.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
print_info "Создана резервная копия"
|
||||
|
||||
# Открываем в редакторе
|
||||
${EDITOR:-nano} "$env_file"
|
||||
|
||||
print_success "Файл сохранен"
|
||||
print_warning "Необходимо перезапустить сервисы для применения изменений"
|
||||
|
||||
read -rp "Перезапустить сервисы сейчас? [Y/n]: " restart_now
|
||||
if [[ "${restart_now,,}" != "n" ]]; then
|
||||
run_compose restart
|
||||
print_success "Сервисы перезапущены"
|
||||
fi
|
||||
;;
|
||||
|
||||
2)
|
||||
edit_specific_env_params
|
||||
;;
|
||||
|
||||
3)
|
||||
print_section "Текущая конфигурация"
|
||||
# Показываем .env с маскировкой чувствительных данных
|
||||
cat "$env_file" | while IFS='=' read -r key value; do
|
||||
if [[ "$key" =~ (TOKEN|PASSWORD|SECRET|KEY)$ ]] && [[ ! "$key" =~ ^# ]]; then
|
||||
echo -e "${CYAN}$key${NC}=${YELLOW}****${NC}"
|
||||
elif [[ ! "$key" =~ ^# ]] && [[ -n "$key" ]]; then
|
||||
echo -e "${CYAN}$key${NC}=${GREEN}$value${NC}"
|
||||
else
|
||||
echo -e "${PURPLE}$key${NC}"
|
||||
fi
|
||||
done
|
||||
;;
|
||||
|
||||
4)
|
||||
print_warning "Текущий .env будет перезаписан!"
|
||||
read -rp "Продолжить? [y/N]: " confirm
|
||||
if [[ "${confirm,,}" == "y" ]]; then
|
||||
setup_env
|
||||
fi
|
||||
;;
|
||||
|
||||
0)
|
||||
return
|
||||
;;
|
||||
|
||||
*)
|
||||
print_error "Неверный выбор"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Функция изменения конкретных параметров
|
||||
edit_specific_env_params() {
|
||||
local env_file="$INSTALL_PATH/.env"
|
||||
|
||||
print_section "Изменение параметров"
|
||||
|
||||
echo -e "${CYAN}[1]${NC} BOT_TOKEN"
|
||||
echo -e "${CYAN}[2]${NC} ADMIN_IDS"
|
||||
echo -e "${CYAN}[3]${NC} WEB_API_DEFAULT_TOKEN"
|
||||
echo -e "${CYAN}[4]${NC} REMNAWAVE_API_URL"
|
||||
echo -e "${CYAN}[5]${NC} REMNAWAVE_API_KEY"
|
||||
echo -e "${CYAN}[6]${NC} REMNAWAVE_AUTH_TYPE"
|
||||
echo -e "${CYAN}[7]${NC} REMNAWAVE_USERNAME (Basic Auth)"
|
||||
echo -e "${CYAN}[8]${NC} REMNAWAVE_PASSWORD (Basic Auth)"
|
||||
echo -e "${CYAN}[9]${NC} REMNAWAVE_SECRET_KEY (eGames)"
|
||||
echo -e "${CYAN}[10]${NC} Пароль PostgreSQL"
|
||||
echo -e "${CYAN}[0]${NC} Назад"
|
||||
|
||||
echo ""
|
||||
read -rp "Выберите параметр для изменения: " param_choice
|
||||
|
||||
local param_name=""
|
||||
local param_prompt=""
|
||||
local param_value=""
|
||||
local is_secret=false
|
||||
|
||||
case $param_choice in
|
||||
1)
|
||||
param_name="BOT_TOKEN"
|
||||
param_prompt="Введите новый токен бота"
|
||||
is_secret=true
|
||||
;;
|
||||
2)
|
||||
param_name="ADMIN_IDS"
|
||||
param_prompt="Введите ID администраторов через запятую"
|
||||
;;
|
||||
3)
|
||||
param_name="WEB_API_DEFAULT_TOKEN"
|
||||
param_prompt="Введите новый токен Web API"
|
||||
is_secret=true
|
||||
;;
|
||||
4)
|
||||
param_name="REMNAWAVE_API_URL"
|
||||
param_prompt="Введите URL API Remnawave"
|
||||
;;
|
||||
5)
|
||||
param_name="REMNAWAVE_API_KEY"
|
||||
param_prompt="Введите ключ API Remnawave"
|
||||
is_secret=true
|
||||
;;
|
||||
6)
|
||||
param_name="REMNAWAVE_AUTH_TYPE"
|
||||
echo -e "${CYAN}[1]${NC} api_key"
|
||||
echo -e "${CYAN}[2]${NC} basic_auth"
|
||||
read -rp "Выберите тип авторизации: " auth_choice
|
||||
if [[ "$auth_choice" == "1" ]]; then
|
||||
param_value="api_key"
|
||||
else
|
||||
param_value="basic_auth"
|
||||
fi
|
||||
;;
|
||||
7)
|
||||
param_name="REMNAWAVE_USERNAME"
|
||||
param_prompt="Введите имя пользователя для Basic Auth"
|
||||
;;
|
||||
8)
|
||||
param_name="REMNAWAVE_PASSWORD"
|
||||
param_prompt="Введите пароль для Basic Auth"
|
||||
is_secret=true
|
||||
;;
|
||||
9)
|
||||
param_name="REMNAWAVE_SECRET_KEY"
|
||||
param_prompt="Введите секретный ключ (формат: XXXXXXX:DDDDDDDD)"
|
||||
is_secret=true
|
||||
;;
|
||||
10)
|
||||
param_name="POSTGRES_PASSWORD"
|
||||
param_prompt="Введите новый пароль PostgreSQL"
|
||||
is_secret=true
|
||||
;;
|
||||
0)
|
||||
return
|
||||
;;
|
||||
*)
|
||||
print_error "Неверный выбор"
|
||||
return
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -z "$param_value" ]]; then
|
||||
if $is_secret; then
|
||||
read -rsp "$param_prompt: " param_value
|
||||
echo ""
|
||||
else
|
||||
read -rp "$param_prompt: " param_value
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z "$param_value" ]]; then
|
||||
print_warning "Значение не указано, изменения не внесены"
|
||||
return
|
||||
fi
|
||||
|
||||
# Создаем резервную копию
|
||||
cp "$env_file" "$env_file.backup.$(date +%Y%m%d_%H%M%S)"
|
||||
|
||||
# Обновляем параметр
|
||||
if grep -q "^$param_name=" "$env_file"; then
|
||||
# Параметр существует - обновляем
|
||||
sed -i "s|^$param_name=.*|$param_name=$param_value|" "$env_file"
|
||||
print_success "Параметр $param_name обновлен"
|
||||
else
|
||||
# Параметр не существует - добавляем
|
||||
echo "$param_name=$param_value" >> "$env_file"
|
||||
print_success "Параметр $param_name добавлен"
|
||||
fi
|
||||
|
||||
print_warning "Необходимо перезапустить сервисы для применения изменений"
|
||||
read -rp "Перезапустить сервисы сейчас? [Y/n]: " restart_now
|
||||
if [[ "${restart_now,,}" != "n" ]]; then
|
||||
run_compose restart
|
||||
print_success "Сервисы перезапущены"
|
||||
fi
|
||||
}
|
||||
|
||||
# Определение команды docker compose
|
||||
resolve_compose_command() {
|
||||
if docker compose version >/dev/null 2>&1; then
|
||||
@@ -683,7 +1057,7 @@ PY
|
||||
|
||||
# Обеспечиваем перевод строки в конце файла
|
||||
if [[ -s "$caddy_file" ]]; then
|
||||
if [[ $(tail -c1 "$caddy_file" 2>/dev/null || echo '') != $'\n' ]]; then
|
||||
if [[ $(tail -c1 "$caddy_file" 2>/dev/null | od -An -tx1) != "0a" ]]; then
|
||||
echo >> "$caddy_file"
|
||||
fi
|
||||
# Добавляем пустую строку для отделения блоков, если файл не пуст
|
||||
@@ -1183,7 +1557,7 @@ show_monitoring() {
|
||||
|
||||
if [[ -n "$stats" ]]; then
|
||||
echo -e "${WHITE}${BOLD}КОНТЕЙНЕР CPU ПАМЯТЬ${NC}"
|
||||
echo "$stats" | tail -n+2 | while IFS=$'\t' read -r name cpu mem; do
|
||||
echo "$stats" | tail -n+2 | while IFS="$(printf '\t')" read -r name cpu mem; do
|
||||
echo -e "${CYAN}${name}${NC} ${YELLOW}${cpu}${NC} ${PURPLE}${mem}${NC}"
|
||||
done
|
||||
else
|
||||
@@ -1613,6 +1987,7 @@ EOF
|
||||
echo -e "${YELLOW}${BOLD}[6]${NC} 📦 Восстановить из резервной копии"
|
||||
echo -e "${RED}${BOLD}[7]${NC} 🧹 Очистка системы"
|
||||
echo -e "${PURPLE}${BOLD}[8]${NC} 🌐 Настройка обратного прокси (Caddy/Nginx)"
|
||||
echo -e "${GREEN}${BOLD}[9]${NC} ⚙️ Настройка конфигурации (.env)"
|
||||
echo -e "${WHITE}${BOLD}[0]${NC} 🚪 Выход"
|
||||
|
||||
echo ""
|
||||
@@ -1651,6 +2026,13 @@ main() {
|
||||
8)
|
||||
configure_reverse_proxy
|
||||
;;
|
||||
9)
|
||||
if check_env_exists; then
|
||||
edit_env
|
||||
else
|
||||
setup_env
|
||||
fi
|
||||
;;
|
||||
0)
|
||||
print_success "До свидания!"
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user