From c7ef5c04487b5196ddcf7c3dbb6eebe4006f81bb Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 19 Jun 2026 16:25:15 +0300 Subject: [PATCH] =?UTF-8?q?chore(tools):=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C-=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20(st?= =?UTF-8?q?art-server.bat=20+=20tools/launch-server.ps1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Двойной клик по start-server.bat → окно-консоль с шапкой (URL/порт/режим/статус), авто-применением миграций (идемпотентно), освобождением порта от старого экземпляра, живыми логами и меню перезапуска при остановке/падении. Флаг -Dev → nodemon (авто-перезапуск при правках кода), -NoMigrate → без миграций. ps1 в UTF-8 с BOM (корректная кириллица в PowerShell 5.1). Co-Authored-By: Claude Opus 4.8 (1M context) --- start-server.bat | 8 ++++ tools/launch-server.ps1 | 82 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 start-server.bat create mode 100644 tools/launch-server.ps1 diff --git a/start-server.bat b/start-server.bat new file mode 100644 index 0000000..5a706b5 --- /dev/null +++ b/start-server.bat @@ -0,0 +1,8 @@ +@echo off +rem ── LearnSpace / BQ-System — запуск сервера в консоли с живыми логами ── +rem Двойной клик = обычный запуск (prod). Параметры: +rem start-server.bat - prod (node), применит миграции +rem start-server.bat -Dev - dev (nodemon, авто-перезапуск при правках кода) +rem start-server.bat -NoMigrate - без применения миграций +chcp 65001 >nul +powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0tools\launch-server.ps1" %* diff --git a/tools/launch-server.ps1 b/tools/launch-server.ps1 new file mode 100644 index 0000000..5fd35fe --- /dev/null +++ b/tools/launch-server.ps1 @@ -0,0 +1,82 @@ +param( + [switch]$Dev, # nodemon — авто-перезапуск при изменении кода + [switch]$NoMigrate # не применять миграции на старте +) +# LearnSpace / BQ-System — консоль-запускатор сервера. +# Запуск: двойной клик по start-server.bat (или: powershell -File tools\launch-server.ps1 [-Dev] [-NoMigrate]) + +$ErrorActionPreference = 'Continue' +try { chcp 65001 > $null } catch {} +try { [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new() } catch {} + +$root = Split-Path -Parent $PSScriptRoot +$backend = Join-Path $root 'backend' +Set-Location $backend + +function Get-Port { + try { + $p = & node -e 'try{process.stdout.write(String(require("./src/config").PORT||3000))}catch(e){process.stdout.write("3000")}' 2>$null + if ("$p" -match '^\d+$') { return [int]"$p" } + } catch {} + return 3000 +} +$script:Port = Get-Port + +function Show-Banner($status, $color) { + Clear-Host + $bar = ' ' + ('=' * 52) + if ($Dev) { $mode = 'dev (nodemon — авто-перезапуск при правках)' } else { $mode = 'prod (node)' } + Write-Host '' + Write-Host $bar -ForegroundColor DarkCyan + Write-Host ' LearnSpace / BQ-System — сервер' -ForegroundColor Cyan + Write-Host $bar -ForegroundColor DarkCyan + Write-Host (' URL: http://localhost:' + $script:Port) -ForegroundColor White + Write-Host (' Порт: ' + $script:Port) + Write-Host (' Режим: ' + $mode) + Write-Host (' Папка: ' + $backend) -ForegroundColor DarkGray + Write-Host (' Статус: ' + $status) -ForegroundColor $color + Write-Host ' Остановить: Ctrl+C (после — меню перезапуска / выхода)' -ForegroundColor DarkGray + Write-Host $bar -ForegroundColor DarkCyan + Write-Host '' +} + +function Free-Port { + try { + $conns = Get-NetTCPConnection -LocalPort $script:Port -State Listen -ErrorAction Stop + foreach ($c in $conns) { + $procId = $c.OwningProcess + Write-Host (' Порт ' + $script:Port + ' занят процессом PID ' + $procId + ' — останавливаю старый экземпляр...') -ForegroundColor Yellow + Stop-Process -Id $procId -Force -ErrorAction SilentlyContinue + } + Start-Sleep -Milliseconds 700 + } catch { } # никто не слушает — ок +} + +# ── Миграции БД (идемпотентно: применятся только новые) ── +if (-not $NoMigrate) { + Show-Banner 'применяю миграции базы данных...' Yellow + try { & node src/db/migrations-runner.js } catch { Write-Host (' Миграции: ' + $_.Exception.Message) -ForegroundColor Red } + Write-Host '' + Write-Host ' Миграции готовы. Запускаю сервер...' -ForegroundColor Green + Start-Sleep -Milliseconds 600 +} + +# ── Цикл: запуск → (остановка/падение) → меню ── +$running = $true +while ($running) { + Free-Port + Show-Banner 'РАБОТАЕТ — логи ниже (Ctrl+C для остановки)' Green + try { $Host.UI.RawUI.WindowTitle = "LearnSpace :$($script:Port) — running" } catch {} + + if ($Dev) { & npm run dev } else { & node src/server.js } + $code = $LASTEXITCODE + + try { $Host.UI.RawUI.WindowTitle = "LearnSpace :$($script:Port) — STOPPED" } catch {} + Write-Host '' + Write-Host (' Сервер остановлен (код выхода ' + $code + ').') -ForegroundColor Yellow + $ans = Read-Host ' [R] перезапустить / [Q] выход (Enter = перезапустить)' + if ($ans -match '^[QqЙй]') { $running = $false } # Q (лат.) или Й (рус. раскладка на той же клавише) +} +Write-Host ' Запускатор закрыт.' -ForegroundColor Cyan + +