Настольное приложение
LV24 SEO Optimizer Desktop — локальная офлайн-оболочка Tauri v2 вокруг движка lv24-seo. Python CLI остаётся основным движком: он отвечает за клиенты провайдеров, правила обхода, анализ, сборку отчётов и доставку. Приложение добавляет React-интерфейс и мост к процессам на Rust, а не вторую реализацию SEO.
Hardening-патч 0.2.2 включает lv24-seo 0.5.2 как сайдкар PyInstaller onedir. Здесь нет облачного аккаунта, телеметрии, локального HTTP API и парсинга выдачи. Приложение общается с движком через фиксированный мост к дочернему процессу с белым списком команд.
Что оно добавляет
- Выбор рабочей области. Выберите
seo.toml, который должен использовать движок, через нативный диалог в Settings. Выбранный путь конфига — идентичность рабочей области. Перемещённый или удалённый конфиг показывается как отсутствующий, его можно выбрать заново, а не блокировать запуск. - Панель статистики. Рендерит ограниченный конверт
stats: одна карточка на настроенного провайдера, текущие значения, сравнение с предыдущим окном, покрытие, возраст данных, усечение и ограничения. Изменения CTR показываются в процентных пунктах. Нет заполнения нулями и межмоторного итога; неизвестное остаётся неизвестным. - Форма настроек и вывод конфигурации. Экран Settings — редактируемая форма. Экран Configuration — только чтение, с вкладками Overview, Effective, Source TOML, Diff, Validation, Doctor и Environment. Source TOML отредактирован и доступен только для чтения; сырого редактора TOML нет. Сохранение использует field-level патчи, сохраняет комментарии и порядок ключей, валидирует движком, создаёт резервную копию с меткой времени (последние пять) и атомарно заменяет файл. В
0.2.2временный файл и резервная копия имеют режим0600и fsync, а родительский каталог fsync после переименования. Чтение ограничено 8 MiB; настройки загружаются по полям; зарезервированные имена Windows и завершающие точки/пробелы отклоняются в каждом компоненте пути. - Отчёты. Запускает недельный отчёт локально, записывает
report.jsonиreport.htmlв каталог данных приложения и открывает HTML в браузере по умолчанию. HTML отчёта никогда не встраивается в webview приложения. Неудачный отчёт или экспорт объясняет, что именно не удалось и что делать. - Рекомендации и очередь агента. Превращает находки отчётов и статистики в ограниченные Markdown-промпты. Промпт можно скопировать, экспортировать как
.mdили сохранить в локальной очереди агента со статусом. Очередь хранится в локальном хранилище webview; ничего не отправляется автоматически. - Секреты через stdin. Поле токена — это поле пароля, которое один раз отправляется по IPC. Слой Rust передаёт его в
lv24-seo auth set --provider <p> --stdin, обнуляет свой буфер и никогда не пишет значение в лог, хранилище MobX, localStorage, буфер обмена или диагностический пакет. После сохранения интерфейс показывает только наличие и источник. - Токен Яндекс Метрики. В
0.2.2отдельный провайдерmetrika(yandex_metrika_token) сохранён в списках TypeScript и Rust, бейдже Settings, окне секретов и подписях en/ru/zh. Счётчик Метрики никогда не берёт токен Webmaster. - Одно хранилище секретов с CLI. Приложение запускает тот же движок под тем же пользователем ОС, поэтому токен, сохранённый через
lv24-seo auth setв терминале, виден в приложении, а токен, сохранённый в приложении, виден CLI. Запись в keychain использует сервисlv24-seoи то же имя секрета. ПеременныеLV24_SEO_*наследуются, но в UI показываются как read-only: приложение не может удалить переменную окружения и говорит об этом, а не предлагает кнопку удаления, которая ничего не делает. Резервный файл<data-dir>/secrets.json(только при явном включении) общий, если оба интерфейса открывают тот же workspace/data-каталог. - Панель обновлений. Проверяет подписанный
latest.jsonпри запуске и по запросу, показывает заметки к релизу и устанавливает обновление только после подтверждения. Перед запуском установщика останавливаются только те PID sidecar движка, которые зарегистрировал этот экземпляр приложения; если остановить не удалось, установка блокируется сUPDATE_ENGINE_BUSY.
Панель и экран отчётов построены на тех же командах движка, что и терминал:
lv24-seo stats --days 7 --lag-days 2 --json
lv24-seo report weekly --days 7 --lag-days 2 --jsonТипы установки
Скачивайте артефакты приложения со страницы Releases проекта. Приложение отдельно от установки Python-движка; оболочка может использовать встроенный sidecar, явный LV24_SEO_BIN, соседнюю portable-раскладку или дерево Linux AppImage в $APPDIR/usr/lib/<product>/engine/lv24-seo/.
| Пакет | Как устанавливается | Обновление в приложении |
|---|---|---|
| Windows NSIS | LV24.SEO.Optimizer_0.2.2_x64-setup.exe | Да |
| Windows portable ZIP | LV24-SEO-Optimizer_0.2.2_x64-portable.zip; распакуйте всю папку и запустите lv24-seo-desktop.exe | Нет |
| Linux AppImage | LV24.SEO.Optimizer_0.2.2_amd64.AppImage; chmod +x и запуск | Да |
| Linux deb | LV24.SEO.Optimizer_0.2.2_amd64.deb; sudo apt install ./*_amd64.deb | Нет |
| Linux rpm | LV24.SEO.Optimizer-0.2.2-1.x86_64.rpm; sudo dnf install ./*_amd64.rpm | Нет |
macOS .app из DMG | LV24.SEO.Optimizer_0.2.2_aarch64.dmg или LV24.SEO.Optimizer_0.2.2_x64.dmg; перетащите в Applications | Да |
| MSI | Не производится этим проектом | Нет |
Windows требует Windows 10/11 x64 и WebView2. Linux только x64 и собран на Ubuntu 22.04 с базой glibc 2.35. macOS требует 13 или новее; используйте arm64 DMG на Apple silicon и x64 DMG на Intel. Пакеты ОС не подписаны или подписаны ad-hoc, поэтому предупреждения SmartScreen и Gatekeeper ожидаемы. Перед запуском установщика сверьте SHA256SUMS.txt.
Как работают обновления
Обновлятор читает подписанный latest.json с endpoint GitHub Releases проекта. Пакеты подписаны ключом minisign/Ed25519, публичный ключ встроен в приложение. Включён requireSignedVersion, поэтому объявленная версия привязана к подписанному пакету.
- Приложение проверяет обновления один раз при запуске, молча, с таймаутом 30 секунд, и по нажатию Check for updates.
- Ничего не скачивается и не устанавливается автоматически. Панель показывает версию и заметки; Download and install запускает обновление. Несохранённый черновик конфигурации отключает кнопку.
- Принимается только версия выше текущей. Обновлятор не может понизить версию приложения.
- Ошибка подписи блокирует артефакт, помечает ошибку как non-retryable и ведёт на страницу релиза. Она не повторяется и не превращается в offline-предупреждение.
- Непосредственно перед запуском установщика
prepare_updateостанавливает только те PID sidecar движка, которые запустил этот экземпляр приложения. Ничего не сопоставляется по имени образа, поэтому другая установленная копия, portable-сборка или запуск в терминале не затрагиваются. Если очистка не удалась, установка блокируется сUPDATE_ENGINE_BUSY; закройте запуск, удерживающий sidecar, и повторите. - Windows запускает подписанный установщик NSIS в пассивном режиме; macOS заменяет
.app; Linux заменяет AppImage. После установки приложение перезапускается; перезапуск в Windows выполняет установщик NSIS.
Матрица автообновления
| Пакет | Автообновление | Что происходит |
|---|---|---|
| Windows NSIS | Да | Скачивает подписанный setup .exe, останавливает отслеживаемые PID sidecar, запускает в passive-режиме, перезапускает |
macOS .app | Да | Скачивает подписанный .app.tar.gz, заменяет приложение, перезапускает |
| Linux AppImage | Да | Скачивает подписанный AppImage, заменяет его, перезапускает |
| Windows portable ZIP | Нет | Панель обновления ведёт на страницу релиза; скачайте и распакуйте новый ZIP |
| Linux deb | Нет | Панель обновления ведёт на страницу релиза; обновление менеджером пакетов |
| Linux rpm | Нет | Панель обновления ведёт на страницу релиза; обновление менеджером пакетов |
| MSI | Нет | MSI не производится; установка MSI считается ручной |
| Неизвестный пакет | Нет | Панель обновления ведёт на страницу релиза |
Manual-only — намеренно. Пакет deb/rpm принадлежит базе пакетов дистрибутива, MSI этим проектом не производится, а portable ZIP не имеет установщика, который можно заменить. Приложение сообщает тип установленного пакета и отключает встроенный установщик для таких случаев; оно не делает вид, что ручной пакет был обновлён.
Обновление 0.2.0 → 0.2.1 проверено end-to-end. Обновление 0.2.1 → 0.2.2 также проверено в Windows: установленная сборка 0.2.1 обнаружила 0.2.2, скачала и проверила подписанный пакет, установила его в passive-режиме, перезапустилась и сообщила 0.2.2 с готовым движком 0.5.2. 0.2.2 обновляется напрямую с 0.2.0.
Обновление 0.2.1 → 0.2.2 выполняет старый обновлятор 0.2.1, в котором нет новой очистки отслеживаемых PID. Если во время первого обновления активен sidecar, повторите после его выхода или установите 0.2.2 вручную. 0.2.2 → later использует очистку отслеживаемых PID и блокируется с UPDATE_ENGINE_BUSY, если отслеживаемый sidecar не удаётся остановить.
Переключение рабочей области и устаревшее состояние
Активный путь seo.toml — идентичность рабочей области. При переключении на другой конфиг или переходе движка в offline приложение очищает статистику, отчёты, doctor и состояние секретов до того, как какой-либо экран покажет данные предыдущего проекта. Первая загрузка только записывает путь; последующее изменение считается переключением. Несохранённые черновики конфигурации общие между Settings и Configuration и живут только в сессии, поэтому сохраните их перед закрытием приложения.
Действия, которые не могут работать, отключаются, а не падают по клику: нет выбранной рабочей области, движок offline или ниже минимальной версии. Фокус возвращается на управляющий элемент при закрытии модального окна или панели. Каталоги сообщений en/ru/zh согласованы; отсутствующий ключ — ошибка теста, а не молчаливый английский fallback.
Keychain в Linux
В Linux CLI-раннер наследует переменные session bus и XDG runtime, которые нужны Secret Service (DBUS_SESSION_BUS_ADDRESS, XDG_RUNTIME_DIR, TMPDIR и связанные пути), но отфильтровывает посторонние переменные хоста. Это делает системный keychain доступным из процесса приложения. Само значение секрета по-прежнему передаётся только через stdin. Если keychain недоступен, используйте переменные окружения LV24_SEO_* или явно включённый файловый fallback движка.
Обход в версии 0.2.2
Приложение показывает настройки обхода в форме Settings и выводит находки обхода в отчётах и рекомендациях. В интерфейсе 0.2.2 нет отдельного экрана Crawl, а у долгих вызовов движка нет прогресса задания и кнопки отмены. Запускайте lv24-seo crawl в терминале, когда нужен полный вывод обхода и сравнение покрытия sitemap.
Основы устранения неполадок
| Симптом | Вероятная причина | Что делать |
|---|---|---|
| Нет рабочей области | Не выбран seo.toml или сохранённый путь перемещён/удалён | Запустите lv24-seo init, затем выберите файл в Settings |
| Движок помечен как офлайн | Движок отсутствует или ниже минимальной версии оболочки (0.5.2) | Используйте встроенный движок или укажите совместимый движок в LV24_SEO_BIN |
| Предупреждение SmartScreen или Gatekeeper | Сборка ОС не подписана или подписана ad-hoc | Проверьте SHA256SUMS.txt, затем используйте документированный путь Run anyway или Open Anyway |
| AppImage не запускается | Нет FUSE 2 | Установите libfuse2 или используйте deb/rpm |
| Проверка обновлений не работает | Endpoint GitHub заблокирован или нет сети | Останьтесь на текущей версии; молчаливая проверка при запуске не показывает ошибку |
| Кнопка обновления недоступна | Несохранённый черновик конфигурации или ручная сборка | Сохраните или отмените черновик либо скачайте пакет со страницы релиза |
| Ошибка подписи обновления | Пакет не соответствует встроенному ключу | Артефакт заблокирован; скачайте заново со страницы релиза и проверьте контрольную сумму |
UPDATE_ENGINE_BUSY | Процесс sidecar, который приложение не может остановить, удерживает установленный файл движка | Закройте терминал или запуск приложения, удерживающий lv24-seo, и снова нажмите Download and install |
missing_token на карточке | Нет токена провайдера | Запустите lv24-seo auth set --provider <p> --stdin |
no_data на карточке | Провайдер доступен, но строк за окно нет | Расширьте окно или проверьте ресурс и задержку данных |
| Долгий вызов выглядит зависшим | В 0.2.2 нет прогресса и отмены | Дождитесь таймаута команды; интерфейс показывает неопределённое состояние занятости |
Известные ограничения
- У
0.1.0нет обновлятора, поэтому один раз нужно обновиться вручную. Автообновление работает с0.2.0и далее. - deb, rpm, MSI и portable ZIP обновляются только вручную. Сборок для Windows arm64 и Linux arm64 нет.
- Требуются macOS 13+ и glibc 2.35+. На более старых системах сборки могут не запуститься.
- Обновлятор устанавливает только более новую версию; для отката нужна ручная установка старого релиза.
- Обновлятору нужен доступ к endpoint GitHub Releases. Если endpoint заблокирован или сети нет, приложение остаётся на текущей версии.
- Обновлятор может остановить только те sidecar, которые запустил сам. Движок, запущенный из терминала или другой копии приложения, не убивается; если он удерживает установленный sidecar, установка блокируется с
UPDATE_ENGINE_BUSY. - Обновление
0.2.1 → 0.2.2выполняет старый обновлятор0.2.1, в котором нет очистки отслеживаемых PID. Если во время первого обновления активен sidecar, повторите после его выхода или установите0.2.2вручную.0.2.2 → laterиспользует очистку. - Внешний движок проверяется по версии и не входит в сборку. Интерфейс помечает его как внешний и проверяет минимальную версию.
- Заголовки, действия и шаги проверки рекомендаций приходят из движка и остаются на английском; переводится только окружающий интерфейс (en/ru/zh).
- Это превью
0.x: вывод конфигурации, поведение обновлятора и детали интерфейса могут измениться до 1.0.
Source: _source/desktop-README.md, _source/desktop-releases-0.2.2.md, _source/desktop-releases-0.2.1.md, _source/desktop-releases-0.2.0.md, _source/desktop-security.md, _source/desktop-architecture.md.