This commit is contained in:
user 2025-07-25 15:42:44 +03:00
parent 47db638ea6
commit ecaa2ad132
1 changed files with 170 additions and 59 deletions

229
start.sh
View File

@ -108,15 +108,50 @@ detect_os() {
;; ;;
*) *)
log_warn "Операционная система может быть не полностью поддержана" log_warn "Операционная система может быть не полностью поддержана"
read -p "Продолжить установку? [y/N]: " -n 1 -r if check_interactive; then
echo echo -n "Продолжить установку? [y/N]: " >&2
if [[ ! $REPLY =~ ^[Yy]$ ]]; then read -r REPLY < /dev/tty
exit 1 if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
else
log_info "Неинтерактивный режим: продолжаем с неподдерживаемой ОС"
fi fi
;; ;;
esac esac
} }
# Проверка доступности TTY для интерактивного ввода
check_interactive() {
if [ -t 0 ] && [ -t 1 ]; then
return 0 # TTY доступен
else
return 1 # TTY недоступен
fi
}
# Безопасное чтение ввода
safe_read() {
local prompt="$1"
local default="$2"
local var_name="$3"
if check_interactive; then
# Интерактивный режим - используем /dev/tty
echo -n "$prompt" >&2
read -r input < /dev/tty
if [ -n "$input" ]; then
eval "$var_name='$input'"
else
eval "$var_name='$default'"
fi
else
# Неинтерактивный режим - используем значения по умолчанию
log_info "Неинтерактивный режим: $prompt -> используется значение по умолчанию: $default"
eval "$var_name='$default'"
fi
}
# Интерактивная настройка # Интерактивная настройка
interactive_setup() { interactive_setup() {
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
@ -124,31 +159,47 @@ interactive_setup() {
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo "" echo ""
# Проверяем режим
if ! check_interactive; then
log_warn "Обнаружен неинтерактивный режим (curl | bash)"
log_info "Используются настройки по умолчанию. Для интерактивной настройки скачайте и запустите скрипт локально:"
log_info "wget https://git.projscale.dev/my-dev/uploader-bot/raw/branch/main/start.sh && chmod +x start.sh && sudo ./start.sh"
echo ""
fi
# 1. Тип сети # 1. Тип сети
echo -e "${PURPLE}❓ Выберите режим работы сети:${NC}" echo -e "${PURPLE}❓ Выберите режим работы сети:${NC}"
echo " 1) Создать новую сеть (Bootstrap нода)" echo " 1) Создать новую сеть (Bootstrap нода)"
echo " 2) Подключиться к существующей сети" echo " 2) Подключиться к существующей сети"
echo "" echo ""
while true; do if check_interactive; then
read -p "Введите номер [1-2]: " network_choice while true; do
case $network_choice in echo -n "Введите номер [1-2]: " >&2
1) read -r network_choice < /dev/tty
NETWORK_MODE="bootstrap" case $network_choice in
NODE_TYPE="bootstrap" 1)
log_info "Режим: Создание новой сети (Bootstrap нода)" NETWORK_MODE="bootstrap"
break NODE_TYPE="bootstrap"
;; log_info "Режим: Создание новой сети (Bootstrap нода)"
2) break
NETWORK_MODE="existing" ;;
log_info "Режим: Подключение к существующей сети" 2)
break NETWORK_MODE="existing"
;; log_info "Режим: Подключение к существующей сети"
*) break
log_error "Неверный выбор. Введите 1 или 2." ;;
;; *)
esac log_error "Неверный выбор. Введите 1 или 2."
done ;;
esac
done
else
# Неинтерактивный режим - создаем новую сеть по умолчанию
NETWORK_MODE="bootstrap"
NODE_TYPE="bootstrap"
log_info "Неинтерактивный режим: используется режим создания новой сети (Bootstrap нода)"
fi
# 2. Тип ноды (если подключаемся к существующей) # 2. Тип ноды (если подключаемся к существующей)
if [ "$NETWORK_MODE" = "existing" ]; then if [ "$NETWORK_MODE" = "existing" ]; then
@ -158,26 +209,34 @@ interactive_setup() {
echo " 2) Приватная нода (только исходящие соединения)" echo " 2) Приватная нода (только исходящие соединения)"
echo "" echo ""
while true; do if check_interactive; then
read -p "Введите номер [1-2]: " node_choice while true; do
case $node_choice in echo -n "Введите номер [1-2]: " >&2
1) read -r node_choice < /dev/tty
NODE_TYPE="public" case $node_choice in
ALLOW_INCOMING="true" 1)
log_info "Тип ноды: Публичная (открытые порты)" NODE_TYPE="public"
break ALLOW_INCOMING="true"
;; log_info "Тип ноды: Публичная (открытые порты)"
2) break
NODE_TYPE="private" ;;
ALLOW_INCOMING="false" 2)
log_info "Тип ноды: Приватная (закрытые порты)" NODE_TYPE="private"
break ALLOW_INCOMING="false"
;; log_info "Тип ноды: Приватная (закрытые порты)"
*) break
log_error "Неверный выбор. Введите 1 или 2." ;;
;; *)
esac log_error "Неверный выбор. Введите 1 или 2."
done ;;
esac
done
else
# Неинтерактивный режим - публичная нода по умолчанию
NODE_TYPE="public"
ALLOW_INCOMING="true"
log_info "Неинтерактивный режим: используется публичная нода по умолчанию"
fi
else else
ALLOW_INCOMING="true" # Bootstrap нода всегда принимает подключения ALLOW_INCOMING="true" # Bootstrap нода всегда принимает подключения
fi fi
@ -189,7 +248,14 @@ interactive_setup() {
log_info "Bootstrap нода будет создавать новую сеть" log_info "Bootstrap нода будет создавать новую сеть"
BOOTSTRAP_CONFIG="new" BOOTSTRAP_CONFIG="new"
else else
read -p "Путь до bootstrap.json [Enter для дефолтного]: " custom_bootstrap if check_interactive; then
echo -n "Путь до bootstrap.json [Enter для дефолтного]: " >&2
read -r custom_bootstrap < /dev/tty
else
custom_bootstrap=""
log_info "Неинтерактивный режим: используется дефолтный bootstrap.json"
fi
if [ -n "$custom_bootstrap" ] && [ -f "$custom_bootstrap" ]; then if [ -n "$custom_bootstrap" ] && [ -f "$custom_bootstrap" ]; then
BOOTSTRAP_CONFIG="$custom_bootstrap" BOOTSTRAP_CONFIG="$custom_bootstrap"
log_success "Использован кастомный bootstrap.json: $custom_bootstrap" log_success "Использован кастомный bootstrap.json: $custom_bootstrap"
@ -202,7 +268,14 @@ interactive_setup() {
# 4. Docker socket # 4. Docker socket
echo "" echo ""
echo -e "${PURPLE}❓ Настройка Docker для конвертации:${NC}" echo -e "${PURPLE}❓ Настройка Docker для конвертации:${NC}"
read -p "Путь до docker.sock [$DOCKER_SOCK_PATH]: " custom_docker_sock if check_interactive; then
echo -n "Путь до docker.sock [$DOCKER_SOCK_PATH]: " >&2
read -r custom_docker_sock < /dev/tty
else
custom_docker_sock=""
log_info "Неинтерактивный режим: используется дефолтный путь $DOCKER_SOCK_PATH"
fi
if [ -n "$custom_docker_sock" ]; then if [ -n "$custom_docker_sock" ]; then
DOCKER_SOCK_PATH="$custom_docker_sock" DOCKER_SOCK_PATH="$custom_docker_sock"
fi fi
@ -217,7 +290,14 @@ interactive_setup() {
# 5. Настройка веб-клиента # 5. Настройка веб-клиента
echo "" echo ""
echo -e "${PURPLE}❓ Настройка веб-интерфейса:${NC}" echo -e "${PURPLE}❓ Настройка веб-интерфейса:${NC}"
read -p "Развернуть веб-клиент для управления нодой? [Y/n]: " web_choice if check_interactive; then
echo -n "Развернуть веб-клиент для управления нодой? [Y/n]: " >&2
read -r web_choice < /dev/tty
else
web_choice="Y"
log_info "Неинтерактивный режим: веб-клиент включен по умолчанию"
fi
if [[ ! $web_choice =~ ^[Nn]$ ]]; then if [[ ! $web_choice =~ ^[Nn]$ ]]; then
ENABLE_WEB_CLIENT="true" ENABLE_WEB_CLIENT="true"
log_success "Веб-клиент будет развернут" log_success "Веб-клиент будет развернут"
@ -230,11 +310,20 @@ interactive_setup() {
if [ "$ALLOW_INCOMING" = "true" ] && [ "$ENABLE_WEB_CLIENT" = "true" ]; then if [ "$ALLOW_INCOMING" = "true" ] && [ "$ENABLE_WEB_CLIENT" = "true" ]; then
echo "" echo ""
echo -e "${PURPLE}❓ Настройка SSL сертификата:${NC}" echo -e "${PURPLE}❓ Настройка SSL сертификата:${NC}"
read -p "Настроить SSL сертификат? [y/N]: " ssl_choice if check_interactive; then
echo -n "Настроить SSL сертификат? [y/N]: " >&2
read -r ssl_choice < /dev/tty
else
ssl_choice="N"
log_info "Неинтерактивный режим: SSL отключен (требует ручной настройки)"
fi
if [[ $ssl_choice =~ ^[Yy]$ ]]; then if [[ $ssl_choice =~ ^[Yy]$ ]]; then
read -p "Доменное имя: " DOMAIN echo -n "Доменное имя: " >&2
read -r DOMAIN < /dev/tty
if [ -n "$DOMAIN" ]; then if [ -n "$DOMAIN" ]; then
read -p "Email для уведомлений SSL: " EMAIL echo -n "Email для уведомлений SSL: " >&2
read -r EMAIL < /dev/tty
if [ -n "$EMAIL" ]; then if [ -n "$EMAIL" ]; then
ENABLE_SSL="true" ENABLE_SSL="true"
log_success "SSL будет настроен для домена: $DOMAIN" log_success "SSL будет настроен для домена: $DOMAIN"
@ -252,11 +341,22 @@ interactive_setup() {
# 7. Telegram API ключи # 7. Telegram API ключи
echo "" echo ""
echo -e "${PURPLE}❓ Настройка Telegram ботов (необязательно):${NC}" echo -e "${PURPLE}❓ Настройка Telegram ботов (необязательно):${NC}"
read -p "TELEGRAM_API_KEY (основной бот) [Enter для пропуска]: " TELEGRAM_API_KEY if check_interactive; then
echo -n "TELEGRAM_API_KEY (основной бот) [Enter для пропуска]: " >&2
read -r TELEGRAM_API_KEY < /dev/tty
else
TELEGRAM_API_KEY=""
log_info "Неинтерактивный режим: Telegram боты отключены"
fi
if [ -n "$TELEGRAM_API_KEY" ]; then if [ -n "$TELEGRAM_API_KEY" ]; then
log_success "TELEGRAM_API_KEY настроен" log_success "TELEGRAM_API_KEY настроен"
read -p "CLIENT_TELEGRAM_API_KEY (клиентский бот) [Enter для пропуска]: " CLIENT_TELEGRAM_API_KEY if check_interactive; then
echo -n "CLIENT_TELEGRAM_API_KEY (клиентский бот) [Enter для пропуска]: " >&2
read -r CLIENT_TELEGRAM_API_KEY < /dev/tty
else
CLIENT_TELEGRAM_API_KEY=""
fi
if [ -n "$CLIENT_TELEGRAM_API_KEY" ]; then if [ -n "$CLIENT_TELEGRAM_API_KEY" ]; then
log_success "CLIENT_TELEGRAM_API_KEY настроен" log_success "CLIENT_TELEGRAM_API_KEY настроен"
@ -284,11 +384,16 @@ interactive_setup() {
echo -e "${WHITE}Telegram клиентский:${NC} $([ -n "$CLIENT_TELEGRAM_API_KEY" ] && echo "настроен" || echo "отключен")" echo -e "${WHITE}Telegram клиентский:${NC} $([ -n "$CLIENT_TELEGRAM_API_KEY" ] && echo "настроен" || echo "отключен")"
echo "" echo ""
read -p "Продолжить установку с этими настройками? [Y/n]: " -n 1 -r if check_interactive; then
echo echo -n "Продолжить установку с этими настройками? [Y/n]: " >&2
if [[ $REPLY =~ ^[Nn]$ ]]; then read -r REPLY < /dev/tty
log_info "Установка отменена пользователем" if [[ $REPLY =~ ^[Nn]$ ]]; then
exit 0 log_info "Установка отменена пользователем"
exit 0
fi
else
log_info "Неинтерактивный режим: продолжаем установку с настройками по умолчанию"
sleep 3
fi fi
} }
@ -1004,9 +1109,15 @@ install_ssl_certificates() {
if ! host "$DOMAIN" > /dev/null 2>&1; then if ! host "$DOMAIN" > /dev/null 2>&1; then
log_warn "DNS запись для $DOMAIN не найдена" log_warn "DNS запись для $DOMAIN не найдена"
log_info "Убедитесь что домен указывает на этот сервер" log_info "Убедитесь что домен указывает на этот сервер"
read -p "Продолжить установку SSL? [y/N]: " ssl_continue if check_interactive; then
if [[ ! $ssl_continue =~ ^[Yy]$ ]]; then echo -n "Продолжить установку SSL? [y/N]: " >&2
log_info "Установка SSL пропущена" read -r ssl_continue < /dev/tty
if [[ ! $ssl_continue =~ ^[Yy]$ ]]; then
log_info "Установка SSL пропущена"
return 0
fi
else
log_info "Неинтерактивный режим: пропускаем SSL (требует ручной настройки)"
return 0 return 0
fi fi
fi fi