diff --git a/install_bot.sh b/install_bot.sh index 4c2d4c12..7c14c73c 100755 --- a/install_bot.sh +++ b/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" <> "$env_file" <> "$env_file" <> "$env_file" <> "$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