From d30bb4024a3ae0e3f359bc60ed836cc38a649248 Mon Sep 17 00:00:00 2001 From: ochenstarik-ui Date: Thu, 16 Jul 2026 22:31:38 +0700 Subject: [PATCH 1/2] Add uninstall option to installer menu --- README.md | 4 ++-- docs/readme/README.ar.md | 2 +- docs/readme/README.de.md | 2 +- docs/readme/README.es.md | 2 +- docs/readme/README.fr.md | 2 +- docs/readme/README.hi.md | 2 +- docs/readme/README.ja.md | 2 +- docs/readme/README.pt.md | 2 +- docs/readme/README.ru.md | 6 +++--- docs/readme/README.zh-CN.md | 2 +- ochenstarik-server-install.sh | 35 +++++++++++++++++++++++++++++------ tests/test-master-language.sh | 4 ++++ 12 files changed, 46 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 0b09115..c050990 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ chmod 700 ./*.sh sudo ./ochenstarik-server-install.sh ``` -The first wizard prompt selects the dialog language. English is the default; Russian, Spanish, German, French, Portuguese, Simplified Chinese, Japanese, Arabic, and Hindi are also available. The wizard then opens the main menu with steps 1–8. Select any step, run it, and the wizard returns to the main menu. +The first wizard prompt selects the dialog language. English is the default; Russian, Spanish, German, French, Portuguese, Simplified Chinese, Japanese, Arabic, and Hindi are also available. The wizard then opens the main menu with steps 1–8 plus the uninstall/reset option. Select any item, run it, and the wizard returns to the main menu. Keep the current SSH session open while changing the SSH port. Test the new login in a second terminal before disconnecting. @@ -51,7 +51,7 @@ The wizard intentionally requires all module scripts to be present locally. Use | `ochenstarik-server-panel-warp-6.sh` | 3x-ui panel and local Cloudflare WARP proxy | Optional | | `ochenstarik-server-backup-7.sh` | Protected initial snapshot and selected daily, weekly, or monthly schedules | Optional | | `ochenstarik-server-ai-agents-8.sh` | Installs selected AI agents: Hermes, OpenClaw, OpenHands, OpenCode, Aider, AutoGPT, or Pi Coding Agent | Optional | -| `ochenstarik-server-uninstall.sh` | Removes project-managed settings so installation can start again | Use carefully | +| `ochenstarik-server-uninstall.sh` | Removes project-managed settings so installation can start again | Available from the wizard; use carefully | Every module can be run independently from the full archive or cloned repository: diff --git a/docs/readme/README.ar.md b/docs/readme/README.ar.md index e7ad69b..117638f 100644 --- a/docs/readme/README.ar.md +++ b/docs/readme/README.ar.md @@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh ``` -السؤال الأول يحدد لغة المثبت، واللغة الافتراضية هي English. بعد ذلك يمكن تشغيل كل مرحلة من المراحل الثماني أو تخطيها أو إنهاء المثبت. +السؤال الأول يحدد لغة المثبت، واللغة الافتراضية هي English. بعد ذلك تظهر القائمة الرئيسية وفيها المراحل الثماني وخيار الإزالة/إعادة الضبط. ## المراحل diff --git a/docs/readme/README.de.md b/docs/readme/README.de.md index d662b7e..b5e91e0 100644 --- a/docs/readme/README.de.md +++ b/docs/readme/README.de.md @@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh ``` -Die erste Frage wählt die Sprache des Installers; English ist voreingestellt. Danach kann jeder der acht Schritte ausgeführt, übersprungen oder zum Beenden verwendet werden. +Die erste Frage wählt die Sprache des Installers; English ist voreingestellt. Danach öffnet sich das Hauptmenü mit den acht Schritten und der Option zum Deinstallieren/Zurücksetzen. ## Schritte diff --git a/docs/readme/README.es.md b/docs/readme/README.es.md index 81bb8ca..cfeb6ef 100644 --- a/docs/readme/README.es.md +++ b/docs/readme/README.es.md @@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh ``` -La primera pregunta selecciona el idioma del instalador; English es el valor predeterminado. Después puede instalar, omitir o detener cada una de las ocho etapas. +La primera pregunta selecciona el idioma del instalador; English es el valor predeterminado. Después se abre el menú principal con las ocho etapas y la opción de desinstalación/restablecimiento. ## Etapas diff --git a/docs/readme/README.fr.md b/docs/readme/README.fr.md index 39cf2d5..e112ea0 100644 --- a/docs/readme/README.fr.md +++ b/docs/readme/README.fr.md @@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh ``` -La première question sélectionne la langue de l’installateur ; English est la valeur par défaut. Chacune des huit étapes peut ensuite être installée, ignorée ou utilisée pour quitter. +La première question sélectionne la langue de l’installateur ; English est la valeur par défaut. Le menu principal s’ouvre ensuite avec les huit étapes et l’option de désinstallation/réinitialisation. ## Étapes diff --git a/docs/readme/README.hi.md b/docs/readme/README.hi.md index 6d40873..7474d4f 100644 --- a/docs/readme/README.hi.md +++ b/docs/readme/README.hi.md @@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh ``` -पहला प्रश्न इंस्टॉलर की भाषा चुनता है; डिफ़ॉल्ट English है। इसके बाद आठों चरणों को चलाया, छोड़ा या इंस्टॉलर बंद किया जा सकता है। +पहला प्रश्न इंस्टॉलर की भाषा चुनता है; डिफ़ॉल्ट English है। इसके बाद मुख्य मेनू में आठों चरण और uninstall/reset विकल्प दिखता है। ## चरण diff --git a/docs/readme/README.ja.md b/docs/readme/README.ja.md index 9788e28..a288844 100644 --- a/docs/readme/README.ja.md +++ b/docs/readme/README.ja.md @@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh ``` -最初の質問でインストーラーの言語を選択します。既定値は English です。その後、8 つの各ステップを実行、スキップ、または終了できます。 +最初の質問でインストーラーの言語を選択します。既定値は English です。その後、メインメニューに 8 つのステップとアンインストール/リセット項目が表示されます。 ## ステップ diff --git a/docs/readme/README.pt.md b/docs/readme/README.pt.md index 07da52f..9b97851 100644 --- a/docs/readme/README.pt.md +++ b/docs/readme/README.pt.md @@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh ``` -A primeira pergunta seleciona o idioma do instalador; English é o padrão. Depois, cada uma das oito etapas pode ser instalada, ignorada ou usada para sair. +A primeira pergunta seleciona o idioma do instalador; English é o padrão. Depois, o menu principal mostra as oito etapas e a opção de desinstalação/redefinição. ## Etapas diff --git a/docs/readme/README.ru.md b/docs/readme/README.ru.md index 1c76adf..86f1543 100644 --- a/docs/readme/README.ru.md +++ b/docs/readme/README.ru.md @@ -32,7 +32,7 @@ chmod 700 ./*.sh sudo ./ochenstarik-server-install.sh ``` -Первым запросом мастер предлагает выбрать язык диалога и только затем открывает главное меню со всеми этапами 1–8. Выберите нужный этап, установите его, и после завершения мастер вернётся обратно в главное меню. В первом этапе пустой ввод устанавливает все рекомендуемые наборы программ. Во время изменения SSH-порта не закрывайте текущую сессию — сначала проверьте новый вход во втором терминале. +Первым запросом мастер предлагает выбрать язык диалога и только затем открывает главное меню со всеми этапами 1–8 и пунктом удаления/сброса. Выберите нужный пункт, выполните его, и после завершения мастер вернётся обратно в главное меню. В первом этапе пустой ввод устанавливает все рекомендуемые наборы программ. Во время изменения SSH-порта не закрывайте текущую сессию — сначала проверьте новый вход во втором терминале. Мастер намеренно требует, чтобы все скрипты этапов уже лежали рядом локально. Используйте полный архив или `git clone`; одиночный файл мастера больше не подкачивает недостающие этапы из изменяемой ветки `main`. @@ -40,7 +40,7 @@ sudo ./ochenstarik-server-install.sh | Файл | Назначение | Можно запускать отдельно | | --- | --- | --- | -| `ochenstarik-server-install.sh` | Сначала выбирает язык диалога, затем последовательно предлагает установить, пропустить или завершить каждый этап | Да; рекомендуемый способ полной настройки | +| `ochenstarik-server-install.sh` | Сначала выбирает язык диалога, затем показывает главное меню установки и удаления | Да; рекомендуемый способ полной настройки | | `ochenstarik-server-1.sh` | Предлагает выбрать часовой пояс, язык терминала и наборы программ, создаёт swap-файл 2 ГБ | Да | | `ochenstarik-server-2.sh` | Предлагает будущий SSH-порт и IPv4/IPv6, обновляет систему, ставит обязательные пакеты и настраивает UFW | Да | | `ochenstarik-server-user-3.sh` | Создаёт администратора, переносит SSH на порт из этапа 2, проверяет права и включает fail2ban | После установки необходимых пакетов; проще всего сначала запустить скрипт 2 | @@ -49,7 +49,7 @@ sudo ./ochenstarik-server-install.sh | `ochenstarik-server-panel-warp-6.sh` | Устанавливает 3x-ui и Cloudflare WARP, настраивает и проверяет их порты | Ubuntu 22.04/24.04/26.04 или Debian 12/13 | | `ochenstarik-server-backup-7.sh` | Создаёт неизменяемый первичный снимок и настраивает выбранные расписания резервного копирования | Да; зависимости устанавливаются автоматически | | `ochenstarik-server-ai-agents-8.sh` | Устанавливает выбранных AI-агентов: Hermes, OpenClaw, OpenHands, OpenCode, Aider, AutoGPT или Pi Coding Agent | Да; API-ключи настраиваются отдельно | -| `ochenstarik-server-uninstall.sh` | Удаляет настройки, службы и данные проекта для повторной установки с начала | Да; запускать только из сохранённой SSH-сессии | +| `ochenstarik-server-uninstall.sh` | Удаляет настройки, службы и данные проекта для повторной установки с начала | Доступен из мастера; запускать только из сохранённой SSH-сессии | Файлы `*.env.example` являются только примерами. Не записывайте настоящие пароли, токены и приватные SSH-ключи в Git. diff --git a/docs/readme/README.zh-CN.md b/docs/readme/README.zh-CN.md index af38f14..386f0f1 100644 --- a/docs/readme/README.zh-CN.md +++ b/docs/readme/README.zh-CN.md @@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh ``` -安装程序的第一个问题用于选择界面语言,默认是 English。随后八个步骤都可以运行、跳过或用于退出安装程序。 +安装程序的第一个问题用于选择界面语言,默认是 English。随后主菜单会显示八个步骤以及卸载/重置选项。 ## 安装步骤 diff --git a/ochenstarik-server-install.sh b/ochenstarik-server-install.sh index 4229128..06d8138 100755 --- a/ochenstarik-server-install.sh +++ b/ochenstarik-server-install.sh @@ -2,6 +2,7 @@ set -Eeuo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +readonly UNINSTALL_FILE="ochenstarik-server-uninstall.sh" declare -a STEP_FILES=( "ochenstarik-server-1.sh" @@ -27,6 +28,7 @@ declare -a STEP_TITLES=( TEMP_FILE="" UI_LANG=en +UNINSTALL_TITLE="Complete reset / uninstall project-managed settings" declare -A MASTER_TEXT=() load_master_text() { @@ -37,6 +39,7 @@ load_master_text() { [main_menu]="Main menu" [select_step]="Enter a step number to install it, or 0 to exit: " [exit]="Exit" + [uninstall]="Uninstall / reset server settings" [install]="Install / run this step" [skip]="Skip and continue to the next step" [finish]="Exit the installer" @@ -61,6 +64,7 @@ load_master_text() { [intro_body]="Выберите любой этап установки в главном меню. После завершения этапа мастер вернётся обратно в это меню. Не закрывайте текущую SSH-сессию при изменении порта и проверьте новый вход во втором терминале." [step]="Этап %s из %s: %s" [install]="Установить / запустить этот этап" [main_menu]="Главное меню" [select_step]="Введите номер этапа для установки или 0 для выхода: " [exit]="Выход" + [uninstall]="Удаление / сброс настроек сервера" [skip]="Пропустить и перейти к следующему" [finish]="Завершить мастер" [action]="Выберите действие: " [invalid]="Введите 1, 2 или 3" [interrupted]="Ввод прерван" [failed]="Этап завершился с ошибкой." [retry]="Запустить этот этап повторно" @@ -160,8 +164,20 @@ master_msg() { } localize_step_titles() { + STEP_TITLES=( + "Timezone, terminal language, programs, and swap" + "Base packages, SSH port, IPv4/IPv6, and UFW" + "Administrator, SSH migration, and fail2ban" + "Telegram notifications for SSH logins" + "System VPN through Xray" + "3x-ui panel and Cloudflare WARP" + "Initial snapshot and backup schedules" + "Optional AI agents for a regular user" + ) + UNINSTALL_TITLE="Complete reset / uninstall project-managed settings" + case "$UI_LANG" in - ru) STEP_TITLES=("Часовой пояс, язык терминала, программы и swap" "Базовые пакеты, SSH-порт, IPv4/IPv6 и UFW" "Администратор, перенос SSH и fail2ban" "Telegram-уведомления о входах по SSH" "Системный VPN через Xray" "Панель 3x-ui и Cloudflare WARP" "Первичный снимок и расписания бэкапов" "AI-агенты на выбор для обычного пользователя") ;; + ru) STEP_TITLES=("Часовой пояс, язык терминала, программы и swap" "Базовые пакеты, SSH-порт, IPv4/IPv6 и UFW" "Администратор, перенос SSH и fail2ban" "Telegram-уведомления о входах по SSH" "Системный VPN через Xray" "Панель 3x-ui и Cloudflare WARP" "Первичный снимок и расписания бэкапов" "AI-агенты на выбор для обычного пользователя"); UNINSTALL_TITLE="Полное удаление / сброс настроек сервера" ;; es) STEP_TITLES=("Zona horaria, idioma del terminal, programas y swap" "Paquetes base, puerto SSH, IPv4/IPv6 y UFW" "Administrador, migración SSH y fail2ban" "Notificaciones de Telegram para accesos SSH" "VPN del sistema mediante Xray" "Panel 3x-ui y Cloudflare WARP" "Instantánea inicial y copias programadas" "Agentes de IA opcionales para un usuario normal") ;; de) STEP_TITLES=("Zeitzone, Terminalsprache, Programme und Swap" "Basispakete, SSH-Port, IPv4/IPv6 und UFW" "Administrator, SSH-Umstellung und fail2ban" "Telegram-Benachrichtigungen für SSH-Anmeldungen" "System-VPN über Xray" "3x-ui und Cloudflare WARP" "Erstsicherung und Sicherungspläne" "Optionale KI-Agenten für einen normalen Benutzer") ;; fr) STEP_TITLES=("Fuseau horaire, langue du terminal, programmes et swap" "Paquets de base, port SSH, IPv4/IPv6 et UFW" "Administrateur, migration SSH et fail2ban" "Notifications Telegram des connexions SSH" "VPN système via Xray" "Panneau 3x-ui et Cloudflare WARP" "Instantané initial et sauvegardes planifiées" "Agents IA facultatifs pour un utilisateur standard") ;; @@ -227,6 +243,7 @@ choose_main_menu_action() { for index in "${!STEP_FILES[@]}"; do printf ' %s) %s\n' "$((index + 1))" "${STEP_TITLES[index]}" done + printf ' %s) %s\n' "$(( ${#STEP_FILES[@]} + 1 ))" "$UNINSTALL_TITLE" printf ' 0) %s\n' "$(master_msg exit)" read -rp "$(master_msg select_step)" answer || die "$(master_msg interrupted)" answer="${answer:-}" @@ -234,11 +251,11 @@ choose_main_menu_action() { printf -v "$result_variable" '%s' 0 return 0 fi - if [[ "$answer" =~ ^[0-9]+$ ]] && ((10#$answer >= 1 && 10#$answer <= ${#STEP_FILES[@]})); then + if [[ "$answer" =~ ^[0-9]+$ ]] && ((10#$answer >= 1 && 10#$answer <= ${#STEP_FILES[@]} + 1)); then printf -v "$result_variable" '%s' "$((10#$answer))" return 0 fi - warn "Введите число от 0 до ${#STEP_FILES[@]}" + warn "Введите число от 0 до $(( ${#STEP_FILES[@]} + 1 ))" done } @@ -301,11 +318,17 @@ while :; do exit 0 fi step_number="$menu_action" - index="$((step_number - 1))" script_path="" - ensure_step_script "${STEP_FILES[index]}" script_path + if ((step_number == ${#STEP_FILES[@]} + 1)); then + ensure_step_script "$UNINSTALL_FILE" script_path + title="$UNINSTALL_TITLE" + else + index="$((step_number - 1))" + ensure_step_script "${STEP_FILES[index]}" script_path + title="${STEP_TITLES[index]}" + fi while :; do - log "$(master_msg launch "$step_number" "${STEP_TITLES[index]}")" + log "$(master_msg launch "$step_number" "$title")" if bash -- "$script_path"; then completed="$((completed + 1))" log "$(master_msg success "$step_number")" diff --git a/tests/test-master-language.sh b/tests/test-master-language.sh index 27ffd52..3966d01 100755 --- a/tests/test-master-language.sh +++ b/tests/test-master-language.sh @@ -23,8 +23,12 @@ choose_dialog_language <<< '2' >/dev/null [[ "${STEP_FILES[7]}" == 'ochenstarik-server-ai-agents-8.sh' ]] [[ "${STEP_TITLES[7]}" == 'AI-агенты на выбор для обычного пользователя' ]] [[ "$(master_msg main_menu)" == 'Главное меню' ]] +[[ "$(master_msg uninstall)" == 'Удаление / сброс настроек сервера' ]] +[[ "$UNINSTALL_TITLE" == 'Полное удаление / сброс настроек сервера' ]] choose_main_menu_action selected_step <<< '8' >/dev/null [[ "$selected_step" == 8 ]] +choose_main_menu_action selected_step <<< '9' >/dev/null +[[ "$selected_step" == 9 ]] choose_main_menu_action selected_step <<< '0' >/dev/null [[ "$selected_step" == 0 ]] From a1dbce6c0c9fa1abad12d41459e6ac6775cd10f5 Mon Sep 17 00:00:00 2001 From: ochenstarik-ui Date: Thu, 16 Jul 2026 22:38:13 +0700 Subject: [PATCH 2/2] Add MIT license --- LICENSE | 21 +++++++++++++++++++++ README.md | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d2443f7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ochenstarik-ui + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index c050990..abdaa3a 100644 --- a/README.md +++ b/README.md @@ -152,3 +152,7 @@ sudo ./ochenstarik-server-uninstall.sh ``` Read every confirmation carefully. The reset script preserves critical Ubuntu packages and avoids removing access until explicitly confirmed. + +## License + +This project is licensed under the MIT License. See [LICENSE](LICENSE).