Перейти к содержимому

Стенд команды на своём компьютере

Стенд — это ветка main, которая сама пересобирается при каждом новом коммите и открыта команде по постоянному адресу с HTTPS. Нужен всегда включённый компьютер с Windows, Node.js 24+, Git и Tailscale.

GitHub main ──(раз в 5 минут git fetch)──▶ D:\Work\TSMC\TSMC-stand\slot-a | slot-b сборки по очереди
│ новый коммит: install → build → резервная копия → переключение
▼
node, порт 3400 ◀── D:\Work\TSMC\TSMC-stand\data база и вложения
▲
Tailscale Funnel ─────────────┘ https://<компьютер>.<сеть>.ts.net
  • Новый коммит собирается в свободном слоте, пока работает старая версия. Если сборка упала, стенд остаётся на прежней версии. Если новая версия не ответила за 2 минуты, запускается прежняя.
  • Перед каждым переключением делается резервная копия данных (D:\Work\TSMC\TSMC-stand\backups, последние 10).
  • В шапке стенда — плашка «Стенд · abc1234», при наведении — коммит и время сборки.
  • Данные — демо-проекты с историей прогонов, но без демо-аккаунтов: их пароль публичный, на стенде они заблокированы и остаются только авторами истории. Войти можно администратором стенда, он создаёт аккаунты команды («Пользователи» в шапке).
  1. Сон. Параметры → Система → Питание: «Переводить в спящий режим» — «Никогда». Иначе компьютер включён, а стенд спит.

  2. Стенд. Из папки репозитория:

    Окно терминала
    pwsh -File scripts\stand\stand.ps1 install

    Скрипт клонирует репозиторий в D:\Work\TSMC\TSMC-stand\repo, записывает настройки в D:\Work\TSMC\TSMC-stand\stand.json, регистрирует задачу планировщика «TSMC stand» (запуск при входе в Windows) и запускает её. Первая сборка занимает минуту-две. В конце он показывает адрес и пароль администратора стенда — он же лежит в stand.json; после первого входа смените его в профиле.

    Параметры: -Root (папка, по умолчанию D:\Work\TSMC\TSMC-stand), -Port (3400), -Branch (main), -NodeDir (папка с node.exe; по умолчанию текущий Node из nvm), -AdminEmail.

  3. Публичный адрес. Tailscale должен быть установлен и войти в вашу сеть. Один раз:

    Окно терминала
    & 'C:\Program Files\Tailscale\tailscale.exe' funnel --bg 3400

    Если Funnel в сети ещё не включён, команда покажет ссылку на страницу администрирования Tailscale: откройте её и разрешите HTTPS-сертификаты и Funnel для этого компьютера, затем повторите команду. Настройка сохраняется службой Tailscale и переживает перезагрузки. Проверка: tailscale funnel status.

Окно терминала
D:\Work\TSMC\TSMC-stand\stand.ps1 status # что запущено, какой коммит, отвечает ли
D:\Work\TSMC\TSMC-stand\stand.ps1 update # проверить main сейчас, не дожидаясь 5 минут
D:\Work\TSMC\TSMC-stand\stand.ps1 logs # журнал стенда и ошибки сервера
D:\Work\TSMC\TSMC-stand\stand.ps1 stop # остановить (задача запустит снова при следующем входе)
D:\Work\TSMC\TSMC-stand\stand.ps1 uninstall # убрать задачу; данные и сборки остаются

Копия скрипта в папке стенда сама находит свою папку (по stand.json рядом), поэтому -Root этим командам не нужен, даже если стенд установлен не в папку по умолчанию.

Журналы — в D:\Work\TSMC\TSMC-stand\logs: stand.log (переключения версий), build.log (вывод сборок), server-<время>-<коммит>.out.log и .err.log (сервер, свой файл на каждый запуск, последние 20). Если новая версия не запустилась, имя файла с её ошибками стоит в stand.log.

stand.json перечитывается при каждой проверке, поэтому смена порта или ветки применяется без перезапуска (новый порт — после следующего переключения). После изменения самого stand.ps1 в репозитории повторите install: задача запускает копию скрипта из папки стенда, чтобы обновление репозитория не меняло работающий надзиратель. Настройки и пароль при повторной установке сохраняются.

  • Стенд не открывается после перезагрузки. Задача запускается при входе в Windows: войдите в систему.
  • Сломанный коммит в main. Стенд остаётся на прежней версии и не пересобирает этот коммит снова; следующий коммит соберётся как обычно. stand.ps1 update пробует сломанный коммит ещё раз.
  • Вернуть данные из копии. stand.ps1 stop, затем из папки текущего слота (D:\Work\TSMC\TSMC-stand\slot-a или slot-b, см. status): node packages\server\bin\tsmc-server.js restore D:\Work\TSMC\TSMC-stand\backups\tsmc-backup-<время> с переменной TSMC_DB=D:\Work\TSMC\TSMC-stand\data\tsmc.db, и снова запустить задачу «TSMC stand».
  • Начать с чистых демо-данных. stand.ps1 stop, удалить D:\Work\TSMC\TSMC-stand\data, запустить задачу. Администратор создаётся заново с паролем из stand.json.

Стенд открыт в интернет. Вход обязателен для всего, кроме страницы входа и /api/health; после пяти неудачных попыток пара «адрес + email» блокируется на 15 минут. Не давайте на стенде паролей, которые используются где-то ещё. Funnel можно выключить в любой момент: tailscale funnel --bg 3400 off (локально стенд продолжит работать).