Новую версию приложения не обязательно возить на флешке. Вы кладёте в публичную папку Яндекс.Диска два файла — архив сборки и крошечный указатель manifest.json — а стенды забирают их сами, проверяют контрольную сумму и подменяют работающее приложение. Если новая версия окажется плохой, стенд откатится на предыдущую рабочую сам.
Что нужно: аккаунт Яндекс.Диска (хватит бесплатного) и одна опубликованная папка. Чего не нужно: своего сервера, базы данных, токена на стендах, открытых портов, белого IP, VPN и доменного имени. Стенд читает публичную папку анонимно — ни логина, ни токена в его настройках нет.
Про установку самого Watchdog — Установка и настройка. Про то, как он следит за приложением, — Когда Watchdog перезапускает приложение.
museum-builds. Через сайт или десктоп-клиент, неважно.https://disk.yandex.ru/d/AbC123XyZ. Эта ссылка целиком и есть то, что вставляется в Watchdog.manifest.json.Аккаунт нужен только вам как публикатору: заливка и публикация — это запись. Стендам учётка не нужна.
Раскладка внутри папки плоская, подпапок нет:
museum-builds/ ← опубликована, её ссылка вставляется в Watchdog
manifest.json ← перезаписывается каждым релизом
Chess-1.4.3.zip
Если приложений несколько — каждому нужна своя публичная папка: поля «Канал» и «Путь к манифесту» в интерфейсе сейчас скрыты, читается всегда manifest.json в корне.
Заархивируйте папку сборки. Годятся оба варианта — Watchdog нормализует распаковку сам:
# с обёрткой (корень zip = папка сборки) — обычное «Отправить → Сжатая папка»
Compress-Archive -Path .\Chess-1.4.3 -DestinationPath .\Chess-1.4.3.zip
# или плоско (в корне zip сразу exe и папка _Data)
Compress-Archive -Path .\Chess-1.4.3\* -DestinationPath .\Chess-1.4.3.zip
Правила:
__MACOSX/, .DS_Store, Thumbs.db игнорируется — актуально, если архив собирали на macOS;Chess.exe, а не Chess-1.4.3/Chess.exe.Если в архиве по указанному пути exe не находится, это структурная ошибка: обновление не применяется, а версия уходит в карантин. Перекачка тут не поможет — нужно исправить архив или манифест.
Манифест — это указатель на актуальную версию. Файл крошечный:
{
"version": "1.4.3",
"name": "Chess",
"path": "Chess-1.4.3.zip",
"sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"sizeBytes": 734003200,
"exeRelativePath": "Chess.exe",
"rolloutAfter": ""
}
Три способа его получить — любой:
а) Генератор в браузере. Выбираете zip — инструмент считает контрольную сумму с прогресс-баром, берёт размер, читает список файлов из архива без распаковки и подставляет путь к exe, предзаполняет версию и имя из имени файла. Архив никуда не загружается и машину не покидает. Кнопки «Скачать manifest.json» и «Скопировать» становятся активны, только когда манифест проходит проверку.
б) Автоматически при сборке — см. Для разработчиков билдов.
в) Руками. Посчитайте контрольную сумму и размер в PowerShell и положите файл рядом с zip:
(Get-FileHash .\Chess-1.4.3.zip -Algorithm SHA256).Hash # привести к нижнему регистру
(Get-Item .\Chess-1.4.3.zip).Length # размер в байтах
Поля манифеста:
| Поле | Обязательное | Что это |
|---|---|---|
version | да | Версия сборки. Уникальна для каждого релиза — именно по ней различаются версии |
name | нет | Имя продукта, идёт в имя папки на диске стенда. Пусто — выведется из имени exe |
path | да | Имя zip рядом с манифестом, не ссылка |
sha256 | да | Контрольная сумма архива: 64 шестнадцатеричных символа в нижнем регистре. Сверяется до любого действия с приложением |
sizeBytes | да | Размер архива в байтах |
exeRelativePath | да | Путь к exe от корня сборки, без обёрточной папки |
rolloutAfter | нет | Момент в формате 2026-07-01T03:00:00Z (UTC): применять не раньше. Пусто — сразу |
Манифест проверяется до скачивания: контрольная сумма должна быть ровно 64 символа, размер — больше нуля, путь к exe — непустой и без ... Битый манифест не приводит к скачиванию: в журнал уходит «манифест невалиден: <причина>» не чаще раза в час, а цикл продолжает работать. Так одна опечатка не заставит парк качать многогигабайтный архив каждые 15 минут.
ПОРЯДОК ЗАЛИВКИ: 1) zip 2) manifest.json — ПОСЛЕДНИМ
Манифест, указывающий на ещё не залитый архив, — это жёсткая ошибка скачивания на каждом стенде до конца заливки, а не тихий пропуск. Старые архивы можно удалять после того, как парк раскатился.
На стенде:
Качать Watchdog начнёт, только если включены оба выключателя: общий «Включить автообновление билдов» и «Обновления включены» у этого приложения.
Если стенд настраивается с нуля, проще пройти мастер: источник «Скачать с Яндекс.Диска» → вставить ссылку → «Проверить» → «Начать». Мастер сам скачает архив, сверит контрольную сумму, распакует и настроит мониторинг. Галочка «Автоматически обновлять с этой папки» в мастере включена по умолчанию; если её снять, установка будет разовой, но ссылка всё равно сохранится — включить автообновление позже можно из настроек, не вводя её заново.
Если вкладок «Обновления» нет ни в главном окне, ни в настройках — это старый стенд: его настройки созданы до 8 июля 2026, когда показ вкладки стал поведением по умолчанию. Включается правкой config.json (update.featureVisible) при закрытом Watchdog.
На вкладке «Обновления» главного окна строка версии пройдёт путь:
«В облаке» → «Качается 42 %» → «Подтверждается 1/3 … 3/3» → «Активная» с бейджем «текущая».

В журнале — вкладка «Логи watchdog» и файл logs\watchdog.log:
На диске рядом с exe появится папка builds\…\Chess-1.4.3-9f86d0\, а во время закачки — .staging\.
version — она обязана быть новой и уникальной.version, path, sha256, sizeBytes и перезапишите manifest.json последним.Следующий опрос накатит версию сам. Предыдущая останется на диске со статусом «На диске» — для отката, пока её не подрежет лимит «Хранить версий».
Если перезалить архив под той же версией с другим содержимым, стенд обновление не применит: в диагностический лог уйдёт предупреждение «поднимите версию, чтобы раскатать». Сравнение идёт только на равенство: понятий «новее» и «старее» у Watchdog нет.
Одну машину откатывают из интерфейса: вкладка «Обновления» → правый клик по нужной версии → «Откатиться на эту» в автоматическом режиме (отвергнутая версия уйдёт в карантин) или «Перейти на эту версию» в ручном (без карантина).
Весь парк — вернуть в manifest.json предыдущую версию: version, path, sha256 и sizeBytes от старого архива, сам архив должен лежать в папке. Поскольку сравнение идёт на равенство, стенды увидят «версия не совпадает с текущей» и перейдут на старую. Если она уже лежит у них на диске, установка пройдёт без повторной закачки.
Оговорка: версия, ранее провалившая апробацию, лежит в карантине по контрольной сумме — её сначала придётся разкарантинить вручную.
Новая версия сразу становится текущей, но считается непроверенной, пока не отработает 3 здоровых тика подряд: процесс жив, окно отвечает, детектор зависания молчит.
| Параметр | По умолчанию |
|---|---|
| Здоровых тиков для подтверждения | 3 |
| Длительность тика | равна интервалу опроса мониторинга, по умолчанию 10 секунд |
| Итого испытательный срок | около 30 секунд |
| Предельный срок апробации | 30 минут |
Апробацию валят краш, перезапуск, зависание и срабатывание защиты от петли рестартов в это окно. Преднамеренная остановка — ручной стоп, плановый перезапуск — её не валит: счётчик тиков ставится на паузу и продолжается после запуска. Это закрывает случай «апробация не прошла, потому что стенд выключили на ночь».
Апробация не блокирует конвейер: манифест продолжает опрашиваться, и более новая версия, вышедшая тем временем, качается на диск — её установка просто ждёт исхода.
Цель отката — последняя версия, которая работала. Её папка уже на диске, поэтому откат мгновенный и без сети. В журнале: «Откат с 1.4.5 на 1.4.4: апробация не пройдена».
Откат спасает от плохого билда, а не от сломанной машины: если и предыдущая версия не стартует, работает штатный сценарий «пауза и сигнал человеку».
Карантин блокирует содержимое: ключ — контрольная сумма, а не номер версии.
Стенд не встаёт колом: он просто пропускает плохую версию и спокойно накатит следующую.
Хрупкий экспонат можно перевести в ручной режим: тумблер «Авто | Ручное» в шапке вкладки «Обновления».
| Карантин | Ручной режим | |
|---|---|---|
| На что действует | одна версия | всё приложение |
| Закачка | заблокирована | работает |
| Установка | заблокирована | только вручную |
| Возврат в норму | автоматически при новой версии | только действием оператора |
В ручном режиме новые версии всё равно скачиваются на диск и ждут команды «Перейти на эту версию». Мониторинг при этом не трогается: закреплённый билд упал — Watchdog перезапустит его как обычно. Состояние ручного режима переживает перезапуск Watchdog и отключение питания. При снятии пина стенд сверится с манифестом и перейдёт на ту версию, которая в нём сейчас; карантины при этом не сбрасываются.
Переключать режим безопасно в любой момент: пин во время закачки — архив докачается и останется на диске, пин во время апробации — апробация доиграет, блокируются только будущие установки.
Чтобы стенд не перезагружался при посетителях, установку можно ограничить по времени. Два независимых механизма:
03:00 и 06:00;rolloutAfter в манифесте — «не раньше такого-то момента», задаётся публикатором на конкретный релиз.Окно гейтит только установку. Архив всё равно качается и ложится на диск, а встаёт при первом цикле после открытия окна — уже без повторной закачки.
Закачка и установка — независимые половины. Новая версия ложится на диск всегда: под пином, на паузе мониторинга, при закрытом окне раската и даже пока другая версия проходит апробацию. Ждать может только установка, и вот когда:
Если процесс мёртв, а мониторинг на паузе (обычный ночной случай), версия ставится сразу, но своей паузы Watchdog не снимает: новый билд поднимется утром кнопкой ▶.
Указатель версии переключается атомарно и пишется последним, поэтому при отключении питания на диске всегда либо старая версия, либо новая — «половины» не бывает.
Правый клик по строке или кнопка «⋮» в конце строки:
| Действие | Для какого статуса | Что делает |
|---|---|---|
| Откатиться на эту | «На диске», в автоматическом режиме | Переключает указатель; отвергнутая версия уходит в карантин. Всегда спрашивает подтверждение |
| Перейти на эту версию | «На диске», в ручном режиме | Нейтральный переход: без карантина и без апробации, закрепление переезжает на новую версию |
| Считать рабочей | «Подтверждается» | Засчитать апробацию вручную — например, если стенд держали выключенным |
| Скачать сейчас | «В облаке» | Обойти окно раската; в ручном режиме — скачать без установки |
| В карантин | «Активная», «В облаке» | Пометить версию плохой вручную |
| Снять карантин | «В карантине» | Разрешить новую попытку |
| Удалить с диска | любая неактивная | Освободить место. Всегда спрашивает подтверждение |
| Открыть папку | любая версия на диске | Открывает папку билда в проводнике |
Тексты подтверждений: «Откатиться на версию X? Текущая версия уйдёт в карантин, экспонат перезапустится.» · «Перейти на версию X? Текущая версия останется на диске (без карантина), экспонат перезапустится.» · «Удалить версию X с диска? Откатиться на неё будет нельзя.»
«Перейти на эту версию» спрашивает подтверждение только тогда, когда есть что перезапускать: если стенд стоит и процесса нет, версия переключается сразу. Отдельный случай, который спрашивает всегда, — мониторинг на паузе, но процесс жив.
| Статус | Значит |
|---|---|
| В облаке | Манифест указывает сюда, ещё не качали |
| Качается 42 % | Идёт загрузка |
| Подтверждается 2/3 | Установлена как текущая, копит здоровые тики |
| Активная | Текущая рабочая версия — её запускает и наблюдает Watchdog |
| На диске | Скачана и лежит на диске: для мгновенного отката или ручного перехода |
| В карантине | Провалила апробацию, эта сборка заблокирована |
Строка активной версии помечена трижды: подложкой, полоской слева и бейджем «текущая». В шапке таблицы справа — «Проверено: 16.09.2026 14:32» и кнопка, которая будит опрос немедленно.
Общее на весь Watchdog — Настройки → «Обновления»:
| Настройка | По умолчанию | Диапазон |
|---|---|---|
| «Включить автообновление билдов» | выключено | — |
| «Опрос, мин» | 15 | 1…1440 |
| «Тиков апробации» | 3 | 1…60 |
| «Хранить версий» | 2 (текущая + одна для отката) | 1…20 |
| «Применять обновления только в окне» | выключено | поля 03:00–06:00 |
Своё у каждого приложения — Настройки → «Приложения» → «Источник обновлений»: публичная ссылка на папку, папка для билдов (по умолчанию .\builds\<id>), тумблер «Обновления включены (для этого приложения)». Своими у приложения остаются также история версий, апробация и карантины: обновление одного экспоната не трогает соседний.
Хранится столько версий, сколько задано в «Хранить версий»; сломанные сюда не попадают — провалившая апробацию удаляется сразу, а текущая рабочая при чистке всегда защищена.
| Симптом | Причина | Что делать |
|---|---|---|
| «Скачивание обновления X не удалось (повтор позже): контрольная сумма не совпала» | Архив перезалили, а sha256 и sizeBytes в манифесте забыли обновить | Пересчитать сумму и размер, перезаписать манифест. После трёх провалов подряд по одной сумме закачка уходит в часовую паузу |
| «Файл … не найден на Я.Диске (манифест ссылается на отсутствующий zip)» | Манифест залит раньше архива или архив перезалит под другим именем | Соблюдать порядок: сначала zip, манифест последним. Проверить поле path |
| «структура архива: exe не найден», версия в карантине | Путь к exe в манифесте не совпадает с тем, что реально в архиве | Указать имя exe от корня сборки, без обёрточной папки. Исправить манифест и поднять версию |
| «манифест невалиден: …» | Манифест собран руками с ошибкой | Пересобрать генератором |
| Ничего не качается | Папка не опубликована; вставлена не та ссылка; выключен один из двух выключателей; в манифесте та же версия, что уже стоит | Проверить по очереди |
| Апробация не проходит на заведомо рабочем билде | Приложению нужно прожить около 30 секунд и отвечать, то есть иметь окно. Консольный exe без окна может считаться «не отвечает» | Проверить, что билд открывает окно |
| «недостаточно места: нужно ~1400 МБ, свободно 900 МБ» | Нужно не меньше двух размеров архива: сам zip плюс распакованная копия | Освободить место или вынести папку для билдов на другой диск |
| SmartScreen или антивирус придерживает скачанный exe | Штатное поведение Windows | Добавить папку builds\ в исключения |
Со стороны разработчика сборки от обновлений нужно немного: поднимать версию на каждый релиз и класть рядом с архивом корректный manifest.json.
Чеклист перед заливкой:
manifest.json лежит рядом с zip;Это можно автоматизировать. Для Unity есть шаг сборочного конвейера, который после архивации сам кладёт рядом с архивом готовый manifest.json: считает контрольную сумму, берёт размер, версию и имя продукта из настроек проекта и путь к exe от корня сборки. Разработчику не нужно считать ничего руками — собрал билд и залил два файла. Шаг ставится после шага архивации, у архивации при этом должен быть выключен фоновый режим, иначе к моменту генерации манифеста архива ещё не существует. Единственный параметр шага — отложенное применение (rolloutAfter) в формате UTC.
Ограничения, о которых лучше знать заранее:
Watchdog обновляется тем же способом — из отдельной публичной папки релизов, не из той, где лежат билды экспоната.
Наблюдаемое приложение при обновлении не закрывается. Новый экземпляр Watchdog подхватывает уже работающий процесс на первом же тике: второй копии приложения не появляется, статуса «Конфликт цели» не возникает. Если стенд стоял на паузе, после обновления он на паузе и останется.
Обновление откладывается, пока открыт мастер первого запуска или пока любое из приложений качает или апробирует свою версию. Отложенное повторится на следующем опросе.
Что происходит по шагам: проверка свободного места (нужно не меньше четырёх размеров архива) → скачивание с прогрессом в окне «О программе» → сверка контрольной суммы → короткий самопроверочный запуск новой версии, невидимый для оператора → подмена файла exe → перезапуск. Подменяется только файл exe, путь не меняется, поэтому автозапуск, ярлыки, исключения антивируса и сохранённые пароли не ломаются. Новый экземпляр ждёт, пока освободится замок одиночного запуска, — до минуты, поэтому значок в трее может появиться не мгновенно.
Как откатиться руками. Прежний файл лежит рядом:
Watchdog.exe (на стендах, поставленных до 16 сентября 2026, — UnidayWatchdog.exe).<имя>.exe.old в <имя>.exe.Чтобы стенд не забрал релиз обратно на следующем опросе, верните манифест на старую версию или снимите галочку автообновления.
Если файл .old остался рядом надолго, а версия в подвале окна новая — просто не удалился хвост, обновление применилось.
Как отключить. Настройки → «Обновления» → снять «Включить автообновление Watchdog».
КОНТАКТЫ
ООО «Юнидэй»
г. Саратов, ул. Бахметьевская 44/64, оф. 72
ИНН: 6454142737
КПП: 645401001
ОКВЭД: 62.01 Разработка компьютерного программного обеспечения.
Код вида деятельности: 22.01
© UNIDAY, 2014-2025
ООО «Юнидэй»
г. Саратов, ул. Бахметьевская 44/64, оф. 72
ИНН: 6454142737
КПП: 645401001
ОКВЭД: 62.01 Разработка компьютерного программного обеспечения.
Код вида деятельности: 22.01