0.40.0

Added

  • Автообновление приложения через хост taigaclaw.ru/updates/:
  • Пакет internal/updater/ — Service, Manifest, Checker, Downloader, Installer, Rollback
  • Полный цикл: проверка манифеста → Ed25519-подпись → скачивание + SHA256 → атомарная подмена бинарника (через github.com/minio/selfupdate) → рестарт через supervisor (exit code 11)
  • Background-проверка обновлений раз в 6 ч, первая через 30 с после старта
  • Watchdog первого запуска: <dataDir>/.update_pending создаётся перед рестартом, удаляется через 30 с после успешного старта новой версии
  • Persistent-тост о rollback при наличии <dataDir>/.update_failed
  • Безопасность:
  • HTTPS only для манифеста и бинарников
  • SHA256 каждого артефакта
  • Ed25519-подпись манифеста, проверка против PublicKeys из internal/updater/keys.go
  • Защита от downgrade (через semver.Compare)
  • Pinned URL манифеста — захардкожен в бинарнике, не из БД/конфига
  • Лимит размера манифеста (1 MiB), Content-Length-проверка для бинарников
  • API:
  • GET /api/v1/updates/status — снимок состояния (любой авторизованный)
  • POST /api/v1/updates/check — форсированная проверка
  • POST /api/v1/updates/install (RequireGlobalAdmin) — установка с защитой от race по version
  • POST /api/v1/updates/dismiss-rollback (RequireGlobalAdmin) — удаление флага после показа тоста
  • WebUI (раздел Settings → Система):
  • Карточка «Обновления»: текущая версия, версия на сервере, канал, последняя проверка
  • Кнопка «↻ Проверить обновления» — всегда видима
  • Карточка «Доступно обновление: X → Y» с release notes и кнопкой «⬇ Обновить»
  • Условия enabled-кнопки: has_update, supervised, auto_update_supported, не in_progress
  • Прогресс-бар установки (poll /status каждые 2 сек): downloading → verifying → installing → restarting
  • Confirm-диалог с указанием версии, размера, ссылкой на release notes
  • Persistent-тост о rollback с кнопкой «Закрыть»
  • Релизный пайплайн:
  • scripts/genkeys/ — генерация Ed25519 ключевой пары (одноразово)
  • scripts/sign/ — подписание манифеста приватным ключом
  • scripts/genmanifest/ — сборка stable.json (sha256 + size + url для 6 платформ)
  • bash deploy.sh release [vX.Y.Z] — единая команда:
  1. make build-cross — 6 бинарников
  2. Копирование в ~/Projects/taigaclaw.ru/static/updates/binaries/<version>/
  3. Symlink binaries/latest → <version>
  4. Генерация stable.json + stable.sig в static/updates/
  5. Обновление hugo.toml (version) и content/download.md (HTTP-ссылки)
  6. Запуск ~/Projects/taigaclaw.ru/deploy.sh (Hugo build + rsync на VPS 95.163.232.9)
  • Юнит-тесты: 14 тестов на manifest parsing, Ed25519 verification, version compare, platform detection, system path heuristics

Changed

  • cmd/taigaclaw/main.go: инициализация updater.Service с background-проверкой
  • deploy.sh: новый режим release, не ломает существующие режимы (systemd/launchd/stop/status)
  • Зависимости: добавлены github.com/minio/selfupdate v0.6.0, golang.org/x/mod v0.36.0

Security

  • Приватный ключ Ed25519 хранится в ~/.taigaclaw-updater-key (mode 0600), вне git
  • Публичный ключ — в исходниках (internal/updater/keys.go), доступен для аудита
  • Любые изменения манифеста на хосте без переподписания приватным ключом будут отклонены клиентом