Сервер обновлений Windows
Получение скрипта
Для получения файлов, необходимых на сервере обновлений, мы предлагаем использовать PowerShell-скрипт. Вы можете скачать его из браузера или из терминала:
- PowerShell
(New-Object System.Net.WebClient).DownloadFile("https://repos.passwork.ru/repository/powershell/get_desktops.ps1", "$pwd\get_desktops.ps1")
Преимущества использования
- Скачивает из нашего репозитория только нужную версию — согласованную с бэкендом. Удалённый репозиторий используется как источник файлов, но не как источник версии: в нём располагаются все версии десктопного приложения. Какую именно
XXYYскачивать, скрипт определяет из API или локального файла. - Поддерживает прокси (
HTTP_PROXY), что важно в закрытых сетях с выходом в интернет через прокси. - Можно запускать по расписанию (cron / Task Scheduler), чтобы сервер обновлений содержал актуальную для вашего бэкенда версию.
Откуда берётся версия (какой XXYY качать):
- API бэкенда — если задан
PASSWORK_DOMAIN, скрипт запрашивает доступную версию десктопа через API вашего сервера Пассворк и скачивает соответствующийXXYY. - Локальный файл — файл
LOCAL_VERSIONS_FILEсодержит строку с версией.
Других источников версии нет: репозиторий с файлами используется только для скачивания, не для определения версии.
За один запуск скачивается только одна версия XXYY. Если бэкенд переключился на новую версию — при следующем запуске скрипт получит новый XXYY (из API или обновлённого файла) и скачает файлы обновлений.
Основные переменные
| Переме нная | Описание |
|---|---|
REPO_BASE_URL | URL репозитория с собранными десктопами (источник файлов). |
OUTPUT_DIR | Каталог для сохраняемых файлов (корень сервера обновлений или его копия). |
PASSWORK_DOMAIN | URL бэкенда для запроса версии через API (рекомендуется, если есть доступ). |
LOCAL_VERSIONS_FILE | Путь к файлу версий, если API не используется. |
HTTP_PROXY | Прокси для исходящих запросов (например http://proxy:3128). |
LOG_FILE | Путь к файлу лога (необязательно). |
STATUS_FILE | Путь к файлу статуса для мониторинга (необязательно, см. раздел «Мониторинг»). |
KEEP_RELEASES | Сколько старых каталогов XXYY хранить в OUTPUT_DIR (по умолчанию 2). |
LOCK_FILE | Файл блокировки для предотвращения параллельного запуска (Планировщик заданий); пустая строка — отключить. |
Тестовый запуск
- PowerShell
.\get_desktop.ps1 --dry-run
Запуск
- PowerShell
# Один раз или по расписа нию (Планировщик заданий)
$env:PASSWORK_DOMAIN = "https://your-backend.example.com"
$env:OUTPUT_DIR = "C:\inetpub\wwwroot\passwork\updates"
$env:HTTP_PROXY = "http://proxy.example.com:3128" # при необходимости
.\get_desktop.ps1
Скрипт проверяет место на диске, при необходимости создаёт блокировку, чтобы не запускались два экземпляра скрипта одновременно (например, из Планировщика заданий), сравнивает манифесты с уже скачанными и качает только при изменениях.
Мониторинг
Чтобы проверять, что синхронизация отработала и контент актуален:
-
Код выхода скрипта
0— успех, обновление не требовалось или успешно выполнено, либо режим--dry-run.1— ошибка (сеть, репозиторий, место на диске и т.д.).
Системы мониторинга (Планировщик заданий + скрипт проверки, Zabbix, Prometheus и т.п.) могут анализировать коды выходы скрипта.
-
Файл статуса (STATUS_FILE)
Если задана переменнаяSTATUS_FILE, скрипт после каждого запуска перезаписывает этот файл строками форматаkey=value:status—okилиerror;version— актуальная версия XXYY (или пусто при ошибке до определения версии);timestamp— время в UTC (ISO);message— краткое сообщение (например «Update complete for version 0002» или «All latest YAML unchanged»).
Пример содержимого после успешного запуска:
- shell
status=ok
version=0002
timestamp=2025-02-17T12:00:00Z
message=Update complete for version 0002
При ошибке (в том числе до определения версии) скрипт пишет status=error и при необходимости message=exit N. Проверка в мониторинге: читать STATUS_FILE, убедиться, что status=ok, и при желании проверить актуальность по timestamp или наличие каталога OUTPUT_DIR\<version>\latest.yml.
- Лог (LOG_FILE)
Если заданLOG_FILE, туда пишутся все сообщения скрипта. Можно анализировать лог на наличие ошибок или строк вроде «Update complete» / «Repository unreachable».
Пример проверки для мониторинга (PowerShell):
- PowerShell
$env:STATUS_FILE = "C:\inetpub\wwwroot\passwork\updates\.sync_status"
.\get_desktop.ps1
# Проверка после запуска (или из другого скрипта по расписанию):
$status = (Get-Content $env:STATUS_FILE | Where-Object { $_ -match '^status=' }) -replace '^status=', ''
if ($status -eq 'ok') { Write-Host "Sync OK" } else { Write-Host "Sync FAIL" }
# или по актуальности (например, не старше 25 часов):
$tsLine = Get-Content $env:STATUS_FILE | Where-Object { $_ -match '^timestamp=' }
$tsStr = ($tsLine -split '=', 2)[1]
$syncTime = [DateTime]::ParseExact($tsStr.Trim(), "yyyy-MM-ddTHH:mm:ss'Z'", [Globalization.CultureInfo]::InvariantCulture, [Globalization.DateTimeStyles]::AssumeUniversal)
$hoursOld = (Get-Date).ToUniversalTime().Subtract($syncTime).TotalHours
if ($hoursOld -le 25) { Write-Host "Sync recent" } else { Write-Host "Sync may be stale" }