diff --git a/deploy/vps/install.sh b/deploy/vps/install.sh index 1425a05..703c9d7 100644 --- a/deploy/vps/install.sh +++ b/deploy/vps/install.sh @@ -34,6 +34,9 @@ API_DOMAIN="${API_DOMAIN:-api.example.ru}" WIDGET_WEBROOT="${WIDGET_WEBROOT:-}" TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}" JWT_SECRET="${JWT_SECRET:-}" +INSTALL_STATE_FILE="" +REUSE_SAVED_SETTINGS=false +NON_INTERACTIVE=false RED='\033[0;31m' GREEN='\033[0;32m' @@ -78,10 +81,87 @@ on_error() { } trap on_error ERR +usage() { + cat <&2 - printf "%s" "$result" + if [[ -z "$result" ]]; then + printf "%s" "$default_value" + else + printf "%s" "$result" + fi } generate_secret() { @@ -106,6 +195,20 @@ generate_secret() { fi } +read_existing_backend_secret() { + local env_file="$SOURCE_PATH/backend/.env" + [[ -f "$env_file" ]] || return 0 + local value + value="$(grep -E '^JWT_SECRET=' "$env_file" | head -n1 | cut -d= -f2- || true)" + if [[ -n "$value" && -z "$JWT_SECRET" ]]; then + JWT_SECRET="$value" + fi + value="$(grep -E '^TELEGRAM_BOT_TOKEN=' "$env_file" | head -n1 | cut -d= -f2- || true)" + if [[ -n "$value" && -z "$TELEGRAM_BOT_TOKEN" ]]; then + TELEGRAM_BOT_TOKEN="$value" + fi +} + require_root() { if [[ "${EUID}" -ne 0 ]]; then fail "Запусти установщик от root: bash deploy/vps/install.sh" @@ -161,6 +264,7 @@ EOF } write_install_state() { + mkdir -p "$PROJECT_ROOT" cat > "$PROJECT_ROOT/install-state.env" </admin/\n" + if [[ "$REUSE_SAVED_SETTINGS" == true ]]; then + printf "Найдены сохранённые настройки: %s\n" "$INSTALL_STATE_FILE" + fi printf "Файл лога: %s\n\n" "$LOG_FILE" } @@ -205,6 +312,7 @@ PM2-процесс: ${PM2_PROCESS_NAME} Webroot виджета: ${WIDGET_WEBROOT:-не указан} Каталог админки: ${WIDGET_WEBROOT:-не указан}/admin Telegram token: $(if [[ -n "$TELEGRAM_BOT_TOKEN" ]]; then echo "указан"; else echo "пусто"; fi) +Сохранённые настройки: ${PROJECT_ROOT}/install-state.env EOF } @@ -292,29 +400,44 @@ publish_static_if_configured() { } main() { + parse_args "$@" + find_saved_settings print_header require_root current_step "Сбор настроек установки" - PROJECT_ROOT="$(ask "Каталог проекта" "$PROJECT_ROOT")" - SOURCE_PATH="${PROJECT_ROOT}/source" - DATA_PATH="${PROJECT_ROOT}/data" - LOGS_PATH="${PROJECT_ROOT}/logs" - BACKUPS_PATH="${PROJECT_ROOT}/backups" - UPDATES_PATH="${PROJECT_ROOT}/updates" + if [[ "$REUSE_SAVED_SETTINGS" == true && "$NON_INTERACTIVE" != true ]]; then + read -r -p "Использовать сохранённые настройки? [Y/n]: " use_saved + if [[ "$use_saved" =~ ^[Nn]$ ]]; then + REUSE_SAVED_SETTINGS=false + fi + fi - WIDGET_DOMAIN="$(ask "Домен виджета и админки" "$WIDGET_DOMAIN")" - API_DOMAIN="$(ask "Домен API" "$API_DOMAIN")" - WIDGET_WEBROOT="$(ask "Webroot сайта виджета в FastPanel, оставь пустым чтобы пропустить публикацию" "$WIDGET_WEBROOT")" - TELEGRAM_BOT_TOKEN="$(ask_secret "Telegram bot token, можно оставить пустым")" - JWT_SECRET="$(ask "JWT secret" "$(generate_secret)")" + if [[ "$REUSE_SAVED_SETTINGS" != true ]]; then + PROJECT_ROOT="$(ask "Каталог проекта" "$PROJECT_ROOT")" + SOURCE_PATH="${PROJECT_ROOT}/source" + DATA_PATH="${PROJECT_ROOT}/data" + LOGS_PATH="${PROJECT_ROOT}/logs" + BACKUPS_PATH="${PROJECT_ROOT}/backups" + UPDATES_PATH="${PROJECT_ROOT}/updates" + + WIDGET_DOMAIN="$(ask "Домен виджета и админки" "$WIDGET_DOMAIN")" + API_DOMAIN="$(ask "Домен API" "$API_DOMAIN")" + WIDGET_WEBROOT="$(ask "Webroot сайта виджета в FastPanel, оставь пустым чтобы пропустить публикацию" "$WIDGET_WEBROOT")" + fi + + read_existing_backend_secret + TELEGRAM_BOT_TOKEN="$(ask_secret "Telegram bot token, можно оставить пустым" "$TELEGRAM_BOT_TOKEN")" + JWT_SECRET="$(ask "JWT secret" "${JWT_SECRET:-$(generate_secret)}")" validate_fastpanel_path "Widget" "$WIDGET_WEBROOT" print_summary - read -r -p "Продолжить установку? [Y/n]: " confirm - if [[ "$confirm" =~ ^[Nn]$ ]]; then - warn "Установка отменена." - exit 0 + if [[ "$NON_INTERACTIVE" != true ]]; then + read -r -p "Продолжить установку? [Y/n]: " confirm + if [[ "$confirm" =~ ^[Nn]$ ]]; then + warn "Установка отменена." + exit 0 + fi fi current_step "Установка базовых пакетов" @@ -336,7 +459,7 @@ main() { current_step "Установка зависимостей проекта" install_dependencies - current_step "Запись backend .env" + current_step "Запись backend .env и сохранение настроек" write_backend_env write_install_state ok "Backend .env записан: $SOURCE_PATH/backend/.env" @@ -399,6 +522,7 @@ EOF ok "Админка: https://${WIDGET_DOMAIN}/admin/" ok "PM2-процесс: ${PM2_PROCESS_NAME}" ok "Файл лога: ${LOG_FILE}" + ok "Сохранённые настройки: ${PROJECT_ROOT}/install-state.env" warn "Следующий шаг: настрой proxy API-домена в FastPanel и проверь https://${API_DOMAIN}/health" }