Compare commits

..

2 commits

Author SHA1 Message Date
ochenstarik-ui
a1dbce6c0c Add MIT license 2026-07-16 22:38:13 +07:00
ochenstarik-ui
d30bb4024a Add uninstall option to installer menu 2026-07-16 22:31:38 +07:00
13 changed files with 71 additions and 19 deletions

21
LICENSE Normal file
View file

@ -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.

View file

@ -32,7 +32,7 @@ chmod 700 ./*.sh
sudo ./ochenstarik-server-install.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 18. 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 18 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. 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-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-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-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: Every module can be run independently from the full archive or cloned repository:
@ -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. 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).

View file

@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh
sudo ./ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh
``` ```
السؤال الأول يحدد لغة المثبت، واللغة الافتراضية هي English. بعد ذلك يمكن تشغيل كل مرحلة من المراحل الثماني أو تخطيها أو إنهاء المثبت. السؤال الأول يحدد لغة المثبت، واللغة الافتراضية هي English. بعد ذلك تظهر القائمة الرئيسية وفيها المراحل الثماني وخيار الإزالة/إعادة الضبط.
## المراحل ## المراحل

View file

@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh
sudo ./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 ## Schritte

View file

@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh
sudo ./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 ## Etapas

View file

@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh
sudo ./ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh
``` ```
La première question sélectionne la langue de linstallateur ; 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 linstallateur ; English est la valeur par défaut. Le menu principal souvre ensuite avec les huit étapes et loption de désinstallation/réinitialisation.
## Étapes ## Étapes

View file

@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh
sudo ./ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh
``` ```
पहला प्रश्न इंस्टॉलर की भाषा चुनता है; डिफ़ॉल्ट English है। इसके बाद आठों चरणों को चलाया, छोड़ा या इंस्टॉलर बंद किया जा सकता है। पहला प्रश्न इंस्टॉलर की भाषा चुनता है; डिफ़ॉल्ट English है। इसके बाद मुख्य मेनू में आठों चरण और uninstall/reset विकल्प दिखता है।
## चरण ## चरण

View file

@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh
sudo ./ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh
``` ```
最初の質問でインストーラーの言語を選択します。既定値は English です。その後、8 つの各ステップを実行、スキップ、または終了できます。 最初の質問でインストーラーの言語を選択します。既定値は English です。その後、メインメニューに 8 つのステップとアンインストール/リセット項目が表示されます。
## ステップ ## ステップ

View file

@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh
sudo ./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 ## Etapas

View file

@ -32,7 +32,7 @@ chmod 700 ./*.sh
sudo ./ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh
``` ```
Первым запросом мастер предлагает выбрать язык диалога и только затем открывает главное меню со всеми этапами 18. Выберите нужный этап, установите его, и после завершения мастер вернётся обратно в главное меню. В первом этапе пустой ввод устанавливает все рекомендуемые наборы программ. Во время изменения SSH-порта не закрывайте текущую сессию — сначала проверьте новый вход во втором терминале. Первым запросом мастер предлагает выбрать язык диалога и только затем открывает главное меню со всеми этапами 18 и пунктом удаления/сброса. Выберите нужный пункт, выполните его, и после завершения мастер вернётся обратно в главное меню. В первом этапе пустой ввод устанавливает все рекомендуемые наборы программ. Во время изменения SSH-порта не закрывайте текущую сессию — сначала проверьте новый вход во втором терминале.
Мастер намеренно требует, чтобы все скрипты этапов уже лежали рядом локально. Используйте полный архив или `git clone`; одиночный файл мастера больше не подкачивает недостающие этапы из изменяемой ветки `main`. Мастер намеренно требует, чтобы все скрипты этапов уже лежали рядом локально. Используйте полный архив или `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-1.sh` | Предлагает выбрать часовой пояс, язык терминала и наборы программ, создаёт swap-файл 2 ГБ | Да |
| `ochenstarik-server-2.sh` | Предлагает будущий SSH-порт и IPv4/IPv6, обновляет систему, ставит обязательные пакеты и настраивает UFW | Да | | `ochenstarik-server-2.sh` | Предлагает будущий SSH-порт и IPv4/IPv6, обновляет систему, ставит обязательные пакеты и настраивает UFW | Да |
| `ochenstarik-server-user-3.sh` | Создаёт администратора, переносит SSH на порт из этапа 2, проверяет права и включает fail2ban | После установки необходимых пакетов; проще всего сначала запустить скрипт 2 | | `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-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-backup-7.sh` | Создаёт неизменяемый первичный снимок и настраивает выбранные расписания резервного копирования | Да; зависимости устанавливаются автоматически |
| `ochenstarik-server-ai-agents-8.sh` | Устанавливает выбранных AI-агентов: Hermes, OpenClaw, OpenHands, OpenCode, Aider, AutoGPT или Pi Coding Agent | Да; API-ключи настраиваются отдельно | | `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. Файлы `*.env.example` являются только примерами. Не записывайте настоящие пароли, токены и приватные SSH-ключи в Git.

View file

@ -17,7 +17,7 @@ chmod 700 ochenstarik-server-install.sh
sudo ./ochenstarik-server-install.sh sudo ./ochenstarik-server-install.sh
``` ```
安装程序的第一个问题用于选择界面语言,默认是 English。随后八个步骤都可以运行、跳过或用于退出安装程序 安装程序的第一个问题用于选择界面语言,默认是 English。随后主菜单会显示八个步骤以及卸载/重置选项
## 安装步骤 ## 安装步骤

View file

@ -2,6 +2,7 @@
set -Eeuo pipefail set -Eeuo pipefail
readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
readonly UNINSTALL_FILE="ochenstarik-server-uninstall.sh"
declare -a STEP_FILES=( declare -a STEP_FILES=(
"ochenstarik-server-1.sh" "ochenstarik-server-1.sh"
@ -27,6 +28,7 @@ declare -a STEP_TITLES=(
TEMP_FILE="" TEMP_FILE=""
UI_LANG=en UI_LANG=en
UNINSTALL_TITLE="Complete reset / uninstall project-managed settings"
declare -A MASTER_TEXT=() declare -A MASTER_TEXT=()
load_master_text() { load_master_text() {
@ -37,6 +39,7 @@ load_master_text() {
[main_menu]="Main menu" [main_menu]="Main menu"
[select_step]="Enter a step number to install it, or 0 to exit: " [select_step]="Enter a step number to install it, or 0 to exit: "
[exit]="Exit" [exit]="Exit"
[uninstall]="Uninstall / reset server settings"
[install]="Install / run this step" [install]="Install / run this step"
[skip]="Skip and continue to the next step" [skip]="Skip and continue to the next step"
[finish]="Exit the installer" [finish]="Exit the installer"
@ -61,6 +64,7 @@ load_master_text() {
[intro_body]="Выберите любой этап установки в главном меню. После завершения этапа мастер вернётся обратно в это меню. Не закрывайте текущую SSH-сессию при изменении порта и проверьте новый вход во втором терминале." [intro_body]="Выберите любой этап установки в главном меню. После завершения этапа мастер вернётся обратно в это меню. Не закрывайте текущую SSH-сессию при изменении порта и проверьте новый вход во втором терминале."
[step]="Этап %s из %s: %s" [install]="Установить / запустить этот этап" [step]="Этап %s из %s: %s" [install]="Установить / запустить этот этап"
[main_menu]="Главное меню" [select_step]="Введите номер этапа для установки или 0 для выхода: " [exit]="Выход" [main_menu]="Главное меню" [select_step]="Введите номер этапа для установки или 0 для выхода: " [exit]="Выход"
[uninstall]="Удаление / сброс настроек сервера"
[skip]="Пропустить и перейти к следующему" [finish]="Завершить мастер" [skip]="Пропустить и перейти к следующему" [finish]="Завершить мастер"
[action]="Выберите действие: " [invalid]="Введите 1, 2 или 3" [interrupted]="Ввод прерван" [action]="Выберите действие: " [invalid]="Введите 1, 2 или 3" [interrupted]="Ввод прерван"
[failed]="Этап завершился с ошибкой." [retry]="Запустить этот этап повторно" [failed]="Этап завершился с ошибкой." [retry]="Запустить этот этап повторно"
@ -160,8 +164,20 @@ master_msg() {
} }
localize_step_titles() { 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 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") ;; 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") ;; 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") ;; 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 for index in "${!STEP_FILES[@]}"; do
printf ' %s) %s\n' "$((index + 1))" "${STEP_TITLES[index]}" printf ' %s) %s\n' "$((index + 1))" "${STEP_TITLES[index]}"
done done
printf ' %s) %s\n' "$(( ${#STEP_FILES[@]} + 1 ))" "$UNINSTALL_TITLE"
printf ' 0) %s\n' "$(master_msg exit)" printf ' 0) %s\n' "$(master_msg exit)"
read -rp "$(master_msg select_step)" answer || die "$(master_msg interrupted)" read -rp "$(master_msg select_step)" answer || die "$(master_msg interrupted)"
answer="${answer:-}" answer="${answer:-}"
@ -234,11 +251,11 @@ choose_main_menu_action() {
printf -v "$result_variable" '%s' 0 printf -v "$result_variable" '%s' 0
return 0 return 0
fi 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))" printf -v "$result_variable" '%s' "$((10#$answer))"
return 0 return 0
fi fi
warn "Введите число от 0 до ${#STEP_FILES[@]}" warn "Введите число от 0 до $(( ${#STEP_FILES[@]} + 1 ))"
done done
} }
@ -301,11 +318,17 @@ while :; do
exit 0 exit 0
fi fi
step_number="$menu_action" step_number="$menu_action"
index="$((step_number - 1))"
script_path="" 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 while :; do
log "$(master_msg launch "$step_number" "${STEP_TITLES[index]}")" log "$(master_msg launch "$step_number" "$title")"
if bash -- "$script_path"; then if bash -- "$script_path"; then
completed="$((completed + 1))" completed="$((completed + 1))"
log "$(master_msg success "$step_number")" log "$(master_msg success "$step_number")"

View file

@ -23,8 +23,12 @@ choose_dialog_language <<< '2' >/dev/null
[[ "${STEP_FILES[7]}" == 'ochenstarik-server-ai-agents-8.sh' ]] [[ "${STEP_FILES[7]}" == 'ochenstarik-server-ai-agents-8.sh' ]]
[[ "${STEP_TITLES[7]}" == 'AI-агенты на выбор для обычного пользователя' ]] [[ "${STEP_TITLES[7]}" == 'AI-агенты на выбор для обычного пользователя' ]]
[[ "$(master_msg main_menu)" == 'Главное меню' ]] [[ "$(master_msg main_menu)" == 'Главное меню' ]]
[[ "$(master_msg uninstall)" == 'Удаление / сброс настроек сервера' ]]
[[ "$UNINSTALL_TITLE" == 'Полное удаление / сброс настроек сервера' ]]
choose_main_menu_action selected_step <<< '8' >/dev/null choose_main_menu_action selected_step <<< '8' >/dev/null
[[ "$selected_step" == 8 ]] [[ "$selected_step" == 8 ]]
choose_main_menu_action selected_step <<< '9' >/dev/null
[[ "$selected_step" == 9 ]]
choose_main_menu_action selected_step <<< '0' >/dev/null choose_main_menu_action selected_step <<< '0' >/dev/null
[[ "$selected_step" == 0 ]] [[ "$selected_step" == 0 ]]