Перейти к содержимому

Настольное приложение ​

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.

Панель и экран отчётов построены на тех же командах движка, что и терминал:

bash
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 NSISLV24.SEO.Optimizer_0.2.2_x64-setup.exeДа
Windows portable ZIPLV24-SEO-Optimizer_0.2.2_x64-portable.zip; распакуйте всю папку и запустите lv24-seo-desktop.exeНет
Linux AppImageLV24.SEO.Optimizer_0.2.2_amd64.AppImage; chmod +x и запускДа
Linux debLV24.SEO.Optimizer_0.2.2_amd64.deb; sudo apt install ./*_amd64.debНет
Linux rpmLV24.SEO.Optimizer-0.2.2-1.x86_64.rpm; sudo dnf install ./*_amd64.rpmНет
macOS .app из DMGLV24.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.