Выпуск версий и обновления
NetTrace распространяется через GitHub Releases. Установленные копии сами находят новую версию, предлагают её установить и перезапускаются. Сервер не нужен.
Как выпустить новую версию
- Опишите изменения в
CHANGELOG.mdв разделе## [Unreleased]. Этот текст увидят пользователи в окне «Обновление NetTrace» и на странице релиза. - Закоммитьте всё в
main. -
Выполните в
apps/desktop:npm run release -- 1.0.1(или из корня:
node scripts/release.mjs 1.0.1)
Скрипт проверяет, что дерево чистое, ветка main не отстаёт от GitHub,
тега ещё нет, версия больше текущей и раздел Unreleased не пустой. Затем он
обновляет версию в Cargo.toml, Cargo.lock, package.json,
package-lock.json, tauri.conf.json, проверяет Cargo.lock через
cargo metadata --locked, переносит заметки под заголовок
## [1.0.1] - дата, делает коммит и тег v1.0.1 и отправляет их на GitHub.
Если что-то пошло не так до отправки, файлы, коммит и тег откатываются.
Дальше всё делает GitHub Actions (.github/workflows/release.yml), тремя задачами:
- preflight — тег стоит на коммите из
main, совпадает с версией во всех файлах, есть заметки к версии и секреты подписи; - build — тесты Rust и фронтенда, clippy и сборка установщика NSIS. Эта
задача не видит ключ подписи: ни один скрипт сборки зависимостей не может
его прочитать (обновляемые артефакты отключены в
tauri.release.conf.json); - sign-publish — проверяет хэш установщика, подписывает его одним шагом
(
tauri signer sign --app-version; ключ есть только в этом шаге), пишетlatest.json(scripts/release-ci.mjs latest) и загружает в черновик релизаNetTrace_X.Y.Z_x64-setup.exe,.sigиlatest.json; - проверяет
latest.json: версия, ссылка на этот релиз, подпись сделана ключом, которому доверяет приложение, и подписана именно эта версия; - только после этого публикует релиз.
Если сборка упала, релиз остаётся черновиком (пользователи его не видят).
Собранный установщик хранится между задачами одни сутки: перезапуск только
задачи подписи (Re-run failed jobs) возможен в этот срок, позже — весь workflow.
Исправьте причину и либо перезапустите workflow (Actions → Re-run jobs),
либо удалите черновик и тег (git push --delete origin vX.Y.Z,
git tag -d vX.Y.Z) и выпустите следующую версию.
Ход сборки: https://github.com/Focusniks/NetTrace-desktop/actions (≈15–25 минут). Как только релиз опубликован, установленные копии предложат обновиться при следующем запуске (или через «Помощь → Проверить обновления»).
Опции скрипта: --no-push — только локальный коммит и тег;
--no-git — только правка файлов (для локальных тестовых сборок).
Ключ подписи обновлений
Каждый пакет обновления подписывается ключом minisign. Публичный ключ
встроен в приложение (plugins.updater.pubkey в tauri.conf.json), поэтому
подменённый или повреждённый файл не установится.
- Закрытый ключ:
%USERPROFILE%\.tauri\nettrace-updater.key - Пароль: сгенерирован в
%USERPROFILE%\.tauri\nettrace-updater.password.txt. Перенесите его в менеджер паролей и удалите этот файл: ключ зашифрован паролем, и хранить их рядом — всё равно что не шифровать. - В GitHub: Settings → Environments →
release→ Environment secrets —TAURI_SIGNING_PRIVATE_KEY(содержимое файла ключа) иTAURI_SIGNING_PRIVATE_KEY_PASSWORD. Окружениеreleaseдоступно только запускам для теговv*, поэтому workflow из другой ветки секретов не получит. Секретов с этими именами на уровне репозитория быть не должно.
Сохраните ключ и пароль в надёжном месте (менеджер паролей, офлайн-копия).
Если ключ потерян, уже установленные копии больше не смогут обновиться:
пользователям придётся вручную скачать установщик с новым ключом.
Никогда не коммитьте ключ в репозиторий (*.key в .gitignore).
Приложение принимает обновление, только если версия записана в саму подпись
(requireSignedVersion), поэтому подменённый latest.json не может подсунуть
старую уязвимую сборку под видом новой.
Если ключ скомпрометирован: сгенерируйте новый (npx tauri signer generate),
выпустите версию с новым pubkey, подписанную ещё старым ключом, — после
обновления копии будут доверять только новому. Затем замените секреты.
Рекомендуемые настройки репозитория (Settings):
- Rules → Rulesets: защитить теги
v*от удаления и перезаписи; - Code security: включить Secret scanning и Push protection;
- по желанию — включить в Environment
releaseобязательное подтверждение (тогда каждый релиз нужно одобрить кнопкой).
Установщик
- NSIS, установка для текущего пользователя в
%LOCALAPPDATA%\NetTraceбез прав администратора; обновления ставятся без запроса UAC. - Языки: русский и английский — по языку Windows. Окна выбора языка нет: оно блокировало бы тихую установку обновлений.
- Оформление:
apps/desktop/src-tauri/installer/—header.bmp,sidebar.bmpгенерируютсяpython apps/desktop/scripts/gen-installer-images.py(Pillow). - Лицензия:
installer/LICENSE.txt(MIT или Apache 2.0). installer/hooks.nsh: после обычной установки, если нет драйвера Npcap, предлагает открыть npcap.com. Npcap нельзя включать в установщик по его бесплатной лицензии. При тихой установке и обновлениях вопрос не задаётся.- Установщик не подписан сертификатом Authenticode, поэтому при первом запуске Windows SmartScreen может показать предупреждение: «Подробнее» → «Выполнить в любом случае». Обновления это не затрагивает.
Локальная сборка установщика
cd apps/desktop
npm run tauri -- build --config src-tauri/tauri.release.conf.json
Ключ для сборки не нужен. Результат: target/release/bundle/nsis/. Подписать
установщик вручную (для своих тестов обновления):
npx tauri signer sign --app-version X.Y.Z -f путь/к/ключу target/release/bundle/nsis/NetTrace_X.Y.Z_x64-setup.exe
Проверка зависимостей
Dependabot обновляет GitHub Actions, Rust-крейты и npm-пакеты (Tauri — вручную:
версии крейта и npm-пакета должны совпадать). В CI задача «Dependency audit»
запускает cargo audit и npm audit --omit=dev при каждом изменении и раз в неделю.
Конфиденциальность
Приложение обращается к сети только для проверки обновлений:
скачивание файла latest.json с GitHub; сведения о пользователе, системе и
захватах не передаются. Проверку при запуске можно отключить в меню «Помощь».
Телеметрии нет.