refactor: move user-facing scripts to repo root; fix set-password ordering

- install-autostart.bat, uninstall-autostart.bat, restart-autostart.bat,
  open-firewall.bat moved from scripts/ to the repo root (next to run.bat and
  set-password.bat). Internal helpers (autostart-run.bat, ensure-vnc-password.ps1,
  get-novnc.*, get-vnc.ps1, list-ips.ps1) stay in scripts/. autostart-run.bat is
  kept in scripts/ because the scheduled task /TR points at it; moving it would
  break already-installed tasks.
- Updated all references (set-password.bat, run.bat, install/restart-autostart.bat,
  AGENTS.md, README.md).
- set-password.bat: write webvnc.conf BEFORE the UltraVNC sync so the web password
  is configured even if ensure-vnc-password.ps1 fails / its UAC is dismissed
  (previously 'Password is not configured' from install-autostart.bat when the
  sync blocked before conf was written).
- AGENTS.md / README.md structure + autostart sections updated for the new layout.
This commit is contained in:
Codex
2026-08-05 15:38:39 +03:00
parent 754f77a8d0
commit 9b8ee94dd5
8 changed files with 64 additions and 50 deletions
+20 -15
View File
@@ -59,18 +59,22 @@ internal/relay websocket.go — RFC6455 на stdlib; relay.go — WS
internal/vncspawner кросс-ОС поиск/запуск VNC-сервера (build-теги по ОС)
internal/server HTTP-роуты, /api/status, middleware сессии, embed.FS
internal/server/static встроенные ассеты (vnc.html, favicon.ico + noVNC core/app/vendor)
Все пользовательские точки входа лежат в корне репозитория:
set-password.bat настройка пароля: спрашивает пароль, генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored) — ДО синхронизации UltraVNC, чтобы веб-пароль был настроен даже если синк упадёт или UAC отменят; затем синхронизирует VNC-пароль UltraVNC (scripts/ensure-vnc-password.ps1). Если установлено задание «web-vnc» — перезапускает его через restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс).
run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONSTART /RU SYSTEM /RL HIGHEST), запускающее scripts/autostart-run.bat при загрузке ОС; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf.
uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа).
restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную.
open-firewall.bat открыть порт 8080 в Windows Firewall (от админа, один раз).
webvnc.conf создаётся set-password.bat; содержит HASH=<pbkdf2-хэш> и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore).
Внутренние помощники (вызываются другими скриптами, не пользователем) — в scripts/:
scripts/autostart-run.bat НЕинтерактивный launcher для автостарта (нет пауз/запросов): читает webvnc.conf, ищет только ЛОКАЛЬНЫЙ VNC-сервер (ничего не качает), запускает web-vnc.exe в foreground. Вызывается плановым заданием из install-autostart.bat.
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat.
scripts/get-novnc.{ps1,sh} скачать noVNC
scripts/get-vnc.ps1 скачать портативный UltraVNC в vnc/ (с верификацией zip)
scripts/list-ips.ps1 список IPv4 машины (используется run.bat)
scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (от админа)
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat
set-password.bat настройка пароля: спрашивает пароль, синхронизирует VNC-пароль UltraVNC (ensure-vnc-password.ps1), генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored). Если установлено задание «web-vnc» — перезапускает его через scripts/restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс).
webvnc.conf создаётся set-password.bat; содержит HASH=<pbkdf2-хэш> и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore).
run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
scripts/autostart-run.bat НЕинтерактивный launcher для автостарта (нет пауз/запросов): читает webvnc.conf, ищет только ЛОКАЛЬНЫЙ VNC-сервер (ничего не качает), запускает web-vnc.exe в foreground. Вызывается плановым заданием из install-autostart.bat.
scripts/install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONSTART /RU SYSTEM /RL HIGHEST), запускающее scripts/autostart-run.bat при загрузке ОС; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf.
scripts/uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа).
scripts/restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную.
```
## Соглашения и подводные камни
@@ -125,11 +129,12 @@ scripts/restart-autostart.bat перезапускает задание «web-vn
Чтобы gateway поднимался сам при включении машины (а не интерактивно через `run.bat`),
пароль должен быть настроен заранее и не запрашиваться при старте. Поэтому процедура:
1. **Один раз** запустить `set-password.bat` — он спрашивает пароль, синхронизирует
VNC-пароль UltraVNC (`scripts/ensure-vnc-password.ps1`), генерирует хэш и пишет
`webvnc.conf` (HASH + VNC_PASSWORD). Файл `webvnc.conf`**секрет**, в git не
1. **Один раз** запустить `set-password.bat` — он спрашивает пароль, генерирует хэш
и пишет `webvnc.conf` (HASH + VNC_PASSWORD), а уже ПОТОМ синхронизирует VNC-пароль
UltraVNC (`scripts/ensure-vnc-password.ps1`)так веб-пароль оказывается настроен,
даже если синк упадёт или UAC отменят. Файл `webvnc.conf`**секрет**, в git не
коммитится (см. `.gitignore`).
2. **Один раз (от админа)** запустить `scripts/install-autostart.bat` — регистрирует
2. **Один раз (от админа)** запустить `install-autostart.bat` — регистрирует
плановое задание `web-vnc` через `schtasks /Create /SC ONSTART /RU SYSTEM /RL HIGHEST`,
которое при загрузке ОС запускает `scripts/autostart-run.bat`.
3. `scripts/autostart-run.bat`**неинтерактивный** launcher: читает `webvnc.conf`,
@@ -139,7 +144,7 @@ scripts/restart-autostart.bat перезапускает задание «web-vn
процесс живым). Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) — запускает
**без** `--spawn` и **без** `--spawn-command`, подключаясь к существующему серверу
(иначе попытка породить второй VNC-сервер конфликтовала бы с сервисом).
4. Снять автостарт: `scripts/uninstall-autostart.bat` (от админа) — `schtasks /Delete`.
4. Снять автостарт: `uninstall-autostart.bat` (от админа) — `schtasks /Delete`.
Замечания:
- Задание выполняется от `SYSTEM`, поэтому VNC-сервер, отдавающий рабочий стол, должен
@@ -149,7 +154,7 @@ scripts/restart-autostart.bat перезапускает задание «web-vn
- **Смена пароля на ходу:** `web-vnc.exe` читает хэш и `WEBVNC_VNC_PASSWORD` **один раз
при старте** (`config.Parse`/`auth.New`) и никогда не перечитывает `webvnc.conf`. Поэтому
`set-password.bat` после перезаписи `webvnc.conf` сам перезапускает задание «web-vnc» через
`scripts\restart-autostart.bat` (elevation): тот проверяет `tasklist`, запущен ли
`restart-autostart.bat` (elevation): тот проверяет `tasklist`, запущен ли
`web-vnc.exe`, и делает `schtasks /End` + `/Run` (или только `/Run`, если процесс не
запущен). Рестарт пропускается, если пароль не изменился (детект по старому `VNC_PASSWORD`
из `webvnc.conf`, т.к. PBKDF2-хэш всегда новый из-за соли). Если задание не установлено —
+21 -15
View File
@@ -27,9 +27,10 @@ gateway без запросов.
```bat
set-password.bat
```
Спросит пароль доступа, синхронизирует им пароль UltraVNC-сервиса
(`scripts\ensure-vnc-password.ps1`, UAC только при смене), сгенерирует хэш и
сохранит его вместе с паролем в `webvnc.conf` (секрет, в git не коммитится).
Спросит пароль доступа, сгенерирует хэш и сохранит его вместе с паролем в
`webvnc.conf` (секрет, в git не коммитится), а затем синхронизирует им пароль
UltraVNC-сервиса (`scripts\ensure-vnc-password.ps1`, UAC только при смене).
Веб-пароль оказывается настроен, даже если синк UltraVNC упадёт или UAC отменят.
Используйте ASCII-пароль длиной до 8 символов (VNC-пароль = первые 8 байт).
2. **Запустите gateway**:
@@ -50,17 +51,17 @@ gateway без запросов.
```bat
set-password.bat :: один раз: пароль -> webvnc.conf
scripts\install-autostart.bat :: один раз (от админа): плановое задание «web-vnc»
install-autostart.bat :: один раз (от админа): плановое задание «web-vnc»
```
`install-autostart.bat` регистрирует через `schtasks` задание (`ONSTART`, `SYSTEM`,
`HIGHEST`), которое при загрузке запускает `scripts\autostart-run.bat` —
неинтерактивный launcher, читающий `webvnc.conf` и не качающий ничего на старте.
Запустить сразу без перезагрузки: `schtasks /Run /TN "web-vnc"`.
Снять автостарт: `scripts\uninstall-autostart.bat` (от админа).
Снять автостарт: `uninstall-autostart.bat` (от админа).
**Смена пароля:** `web-vnc.exe` читает пароль из `webvnc.conf` только при старте и не
перечитывает его в runtime. Поэтому `set-password.bat` (если задание «web-vnc» установлено)
перезапускает его через `scripts\restart-autostart.bat` (с elevation) — тот проверяет,
перезапускает его через `restart-autostart.bat` (с elevation) — тот проверяет,
запущен ли `web-vnc.exe` (если да — стоп + старт, если нет — только старт). Рестарт
пропускается, если пароль не изменился. Для интерактивного `run.bat` просто перезапустите
его вручную.
@@ -190,7 +191,7 @@ web-vnc --gen-hash "ваш-пароль"
По умолчанию Windows Firewall блокирует входящие подключения. Один раз
выполните от имени администратора:
```bat
scripts\open-firewall.bat
open-firewall.bat
```
Это откроет входящий TCP-порт 8080. (`run.bat` выводит адреса и подсказку.)
@@ -206,17 +207,22 @@ internal/relay WebSocket на stdlib (RFC 6455) + мост WS↔TCP
internal/vncspawner кросс-ОС поиск и запуск VNC-сервера
internal/server HTTP-роуты, middleware сессии, встроенная статика
internal/server/static встроенные веб-ассеты (vnc.html + core/app/vendor noVNC)
Пользовательские точки входа — в корне репозитория:
run.bat интерактивный запуск: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (не спрашивает)
set-password.bat разовая настройка пароля -> webvnc.conf (хэш + VNC-пароль); синхронизирует UltraVNC
install-autostart.bat автостарт при загрузке ОС (schtasks ONSTART/SYSTEM) — от админа
uninstall-autostart.bat снять автостарт — от админа
restart-autostart.bat перезапустить задание «web-vnc» (чтобы применить новый пароль) — от админа
open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа)
webvnc.conf секрет: HASH= + VNC_PASSWORD= (создаётся set-password.bat, gitignored)
Внутренние помощники — в scripts/ (вызываются другими скриптами):
scripts/autostart-run.bat неинтерактивный launcher для автостарта (читает webvnc.conf)
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC (вызывается из set-password.bat)
scripts/get-novnc.{ps1,sh} скачать noVNC во встроенную статику
scripts/get-vnc.ps1 скачать портативный VNC-сервер (UltraVNC) в папку vnc/
scripts/list-ips.ps1 список IPv4 машины (используется run.bat)
scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа)
run.bat интерактивный запуск: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (не спрашивает)
set-password.bat разовая настройка пароля -> webvnc.conf (хэш + VNC-пароль); синхронизирует UltraVNC
webvnc.conf секрет: HASH= + VNC_PASSWORD= (создаётся set-password.bat, gitignored)
scripts/autostart-run.bat неинтерактивный launcher для автостарта (читает webvnc.conf)
scripts/install-autostart.bat автостарт при загрузке ОС (schtasks ONSTART/SYSTEM) — от админа
scripts/uninstall-autostart.bat снять автостарт — от админа
scripts/restart-autostart.bat перезапустить задание «web-vnc» (чтобы применить новый пароль) — от админа
```
## Кросс-компиляция под другую ОС
@@ -43,6 +43,6 @@ echo.
echo Done. web-vnc will start automatically on every boot.
echo Start it now (without rebooting):
echo schtasks /Run /TN "%TASK%"
echo Remove it with: scripts\uninstall-autostart.bat
echo Remove it with: uninstall-autostart.bat
echo.
pause
@@ -25,7 +25,7 @@ set "TASK=web-vnc"
schtasks /Query /TN "%TASK%" >nul 2>nul
if errorlevel 1 (
echo [error] Task "%TASK%" is not installed. Run scripts\install-autostart.bat first.
echo [error] Task "%TASK%" is not installed. Run install-autostart.bat first.
pause
exit /b 1
)
+1 -1
View File
@@ -102,7 +102,7 @@ echo http://localhost:8080
for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\list-ips.ps1"') do echo http://%%a:8080
echo.
echo If it does not open from another machine, run once as administrator:
echo scripts\open-firewall.bat
echo open-firewall.bat
echo.
REM --- 6. Launch ---
+20 -17
View File
@@ -1,16 +1,17 @@
@echo off
REM ============================================================
REM set-password.bat - setup of the web access password.
REM Asks for the password, syncs the UltraVNC service password,
REM generates a hash and saves both to webvnc.conf (gitignored).
REM After this, run.bat and the autostart task start without asking.
REM Asks for the password, generates a hash and saves it together
REM with the VNC password to webvnc.conf (gitignored). AFTER that
REM (so the web password is configured even if the next step fails)
REM it syncs the UltraVNC service password via ensure-vnc-password.ps1.
REM
REM If the "web-vnc" autostart task is installed, this script also
REM restarts it (elevated, via scripts\restart-autostart.bat) so the
REM restarts it (elevated, via restart-autostart.bat) so the
REM running gateway reloads the new password. The restart is skipped
REM only when the password did not actually change (the running gateway
REM already accepts it). restart-autostart.bat checks whether
REM web-vnc.exe is running and stops+starts it, or just starts it.
REM only when the password did not actually change. restart-autostart.bat
REM checks whether web-vnc.exe is running and stops+starts it, or just
REM starts it.
REM ============================================================
cd /d "%~dp0"
@@ -52,12 +53,7 @@ if "%PW%"=="" (
goto getpw
)
REM --- 4. Sync UltraVNC service password (UAC only if it differs) ---
echo Syncing UltraVNC password with the one entered ...
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%"
if errorlevel 1 echo [warning] Could not sync the UltraVNC password - continuing.
REM --- 5. Generate hash ---
REM --- 4. Generate hash ---
echo Generating password hash ...
set "HASH="
for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i"
@@ -67,12 +63,19 @@ if "%HASH%"=="" (
exit /b 1
)
REM --- 6. Save to webvnc.conf (overwrite) ---
REM --- 5. Save to webvnc.conf (overwrite) ---
REM Done BEFORE the UltraVNC sync so the web password is configured
REM even if the sync below fails or is cancelled (UAC).
echo HASH=%HASH%> "webvnc.conf"
echo VNC_PASSWORD=%PW%>> "webvnc.conf"
set "HASH="
echo Saved to webvnc.conf.
REM --- 6. Sync UltraVNC service password (UAC only if it differs) ---
echo Syncing UltraVNC password with the one entered ...
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%"
if errorlevel 1 echo [warning] Could not sync the UltraVNC password - the web password is still saved.
REM --- 7. Apply to the running gateway (if the autostart task is installed) ---
REM web-vnc.exe reads the hash + VNC password only at startup, so a
REM restart is required for the new password to take effect.
@@ -86,20 +89,20 @@ if not defined OLD_PW goto do_restart
if /i not "%OLD_PW%"=="%PW%" goto do_restart
echo.
echo Password unchanged - the running gateway keeps accepting it. No restart needed.
echo If the gateway is not running, start it with: scripts\restart-autostart.bat ^(admin^)
echo If the gateway is not running, start it with: restart-autostart.bat ^(admin^)
goto cleanup
:do_restart
echo.
echo Applying the new password to the "web-vnc" task ^(needs admin^) ...
powershell -NoProfile -Command "Start-Process -FilePath '%~dp0scripts\restart-autostart.bat' -Verb RunAs -Wait"
powershell -NoProfile -Command "Start-Process -FilePath '%~dp0restart-autostart.bat' -Verb RunAs -Wait"
goto cleanup
:no_task
echo.
echo Autostart task "web-vnc" is not installed.
echo To start on every boot, run once as administrator:
echo scripts\install-autostart.bat
echo install-autostart.bat
:cleanup
set "PW="