Мониторинг прода
ranklint audit --url https://prod --mode monitor — для крона/schedule. Exit всегда 0: прод-мониторинг не роняет пайплайн, вместо этого алертит. Флоу: аудит → обогащение → diff против последнего сохранённого отчёта → сохранение по timestamp → алерты только при newIssues > 0.
- CrUX (
RANKLINT_CRUX_API_KEY) — полевые Core Web Vitals origin'а: LCP, CLS, INP реальных пользователей. - Search Console URL Inspection — до 10 страниц: verdict, coverageState, indexingState, rich-results issues. Авторизация: готовый токен
RANKLINT_GSC_TOKENили сервис-аккаунтRANKLINT_GSC_KEY_FILE(RS256-JWT собирается на node:crypto без зависимостей, iat со сдвигом −30с на clock skew). - Алерты: Slack webhook и/или Telegram (bot token + chat id) — payload'ы собирают
slackPayload/telegramText. - Хранилище: fs (default) или s3 с ротацией
keep; тренд —ranklint history.
Отдельный репо, любой стек. CLI не зависит от Nuxt: репо с package.json (devDependency ranklint), ranklint.config.ts (site.url, robots.mode: 'external', monitor) и джобой по расписанию мониторит весь домен. GitHub: uses: aakazancev/ranklint/.github/workflows/monitor.yml@main с pages: true публикует html-отчёт на GitHub Pages; GitLab: extends: .ranklint-monitor + job pages с extends: .ranklint-pages на pipeline schedule. --html-output / --json-output пишут полный отчёт рядом с diff.
Отдельный репо монитора (любой стек)
CLI не зависит от Nuxt: крошечный репо с конфигом и джобой по расписанию мониторит целый домен, на чём бы тот ни был собран, и публикует последний отчёт на Pages.
seo-monitor/
package.json { "devDependencies": { "ranklint": "^0.5.0" } }
ranklint.config.ts
.github/workflows/monitor.yml or .gitlab-ci.yml
import { defineRanklintConfig } from '@ranklint/core'
export default defineRanklintConfig({
site: { url: 'https://example.com' },
crawl: { maxPages: 2000, ignore: ['/admin/**', '/api/**'] },
robots: { mode: 'external', expect: { indexable: true, sitemaps: ['https://example.com/sitemap.xml'] } },
monitor: { storage: 'fs', dir: '.ranklint/reports', keep: 60 },
})
GitHub Actions (отчёт по адресу https://<owner>.github.io/<repo>/, один раз включить Pages → Source: GitHub Actions):
on:
schedule: [{ cron: '0 6 * * *' }]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
jobs:
seo:
uses: aakazancev/ranklint/.github/workflows/monitor.yml@main
with: { url: 'https://example.com', pages: true }
secrets: inherit
GitLab CI (отчёт по Pages-адресу проекта; джоба обязана называться pages):
include:
- remote: 'https://raw.githubusercontent.com/aakazancev/ranklint/main/presets/gitlab-ci/seo.yml'
seo:monitor:
extends: .ranklint-monitor
variables:
RANKLINT_URL: https://example.com
pages:
extends: .ranklint-pages
needs: [seo:monitor]
Добавьте pipeline schedule (CI/CD → Schedules) — обе джобы запускаются только по schedule. Режим монитора никогда не роняет пайплайн: он делает diff против предыдущего сохранённого отчёта и алертит (Slack/Telegram через RANKLINT_SLACK_WEBHOOK, RANKLINT_TELEGRAM_BOT_TOKEN + RANKLINT_TELEGRAM_CHAT_ID) только при новых проблемах. --html-output / --json-output пишут полный отчёт рядом с diff; ranklint history --dir .ranklint/reports печатает тренд. ranklint dashboard собирает трендовый сайт с графиками, см. ниже.
Трендовый дашборд
ranklint dashboard собирает из сохранённых monitor-отчётов статический сайт: <out>/index.html с трендом и <out>/runs/<key>.html с полным html-отчётом каждого прогона. Каждая страница — один файл, данные, стили и скрипт встроены. Снаружи подключаются только шрифты Google Fonts, без них страницы показываются системными шрифтами. Тёмная тема, на ширине телефона без горизонтальной прокрутки.
| Флаг | По умолчанию | Что делает |
|---|---|---|
--dir | monitor.dir или .ranklint/reports | сохранённые отчёты (fs-хранилище) |
--out | ranklint-dashboard | каталог для результата |
--limit | все | взять только N последних отчётов |
--run-url | — | кнопка «Run audit», например страница CI для запуска пайплайна |
--logo | — | ваш логотип вместо wordmark ranklint: локальный файл .png, .svg, .jpg, .jpeg или .webp до 200 КБ (встраивается как data URI) или http(s) URL. Внизу страницы тогда появляется небольшая ссылка «powered by ranklint» |
--brand-name | — | название рядом с логотипом, оно же alt картинки |
--accent | #b4f13c | акцентный цвет #rgb или #rrggbb: кнопки, активные фильтры, ссылки, линии графиков, подсказки по исправлению. Цвета severity не меняются, текст на кнопке становится чёрным или белым по контрасту |
--cwd | — | где искать ranklint.config |
Со своим брендом и кнопкой запуска пайплайна в CI:
ranklint dashboard --dir public/reports --out public \
--logo brand/logo.svg --brand-name "Example Inc." --accent "#3b82f6" \
--run-url "$CI_PROJECT_URL/-/pipelines/new"
В левой панели: сайт, время последнего прогона, кнопка «Run audit» и показатели: errors, warnings, info, страницы и средний Lighthouse performance. У каждого дельта к предыдущему прогону и полоса с засечкой на прошлом значении. Справа панели:
- новые и исправленные проблемы с прошлого прогона, по правилам, ошибки первыми;
- графики по времени: errors и warnings, средние баллы Lighthouse, CrUX LCP и INP. Без данных CrUX панель подсказывает, как их включить через
RANKLINT_CRUX_API_KEY; - топ правил и Lighthouse performance по страницам;
- обозреватель проблем последнего прогона;
- архив прогонов со ссылками на их отчёты.

Графики появляются со второго прогона. Клик по правилу или странице в любой панели открывает его в обозревателе.
Обозреватель группирует проблемы по правилу или по странице и фильтрует по severity, тексту, разделу сайта, локали и «только новые». Локаль — первый сегмент пути, если он похож на код языка (de, pt-br). В фильтре разделов видно число страниц и проблем в каждом. Блок «Fix once» собирает проблемы, которые повторяются минимум на 5 страницах и занимают не меньше 40% сайта или 80% раздела: обычно это один шаблон или компонент. Карточка страницы — чек-лист по правилам: как исправить, ссылка на документацию, отметки NEW и затронутые элементы с кнопкой копирования. Без JavaScript обозреватель остаётся статическим списком блоков <details>.


В runs/<key>.html тот же обозреватель, по умолчанию сгруппированный по страницам. Отметки NEW и дельты там считаются относительно предыдущего сохранённого прогона. Ещё в html-отчёте CrUX p75 с оценкой по порогам Google и Lighthouse по страницам.
GitLab Pages с историей: отчёты лежат в public/reports, а перед прогоном джоба восстанавливает прошлый public/ из артефактов последней джобы pages — архив растёт без отдельного хранилища. keep ограничивает его размер.
monitor: { storage: 'fs', dir: 'public/reports', keep: 90 },
include:
- remote: 'https://raw.githubusercontent.com/aakazancev/ranklint/main/presets/gitlab-ci/seo.yml'
pages:
extends: .ranklint-base
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_PIPELINE_SOURCE == "web"
script:
- command -v unzip > /dev/null || (apt-get update -qq && apt-get install -y -qq unzip)
- >
curl --fail --silent --location --output public.zip
--header "JOB-TOKEN: $CI_JOB_TOKEN"
"$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/$CI_DEFAULT_BRANCH/download?job=pages"
&& unzip -q -o public.zip || true
- ranklint audit --url https://example.com --mode monitor
- ranklint dashboard --dir public/reports --out public --run-url "$CI_PROJECT_URL/-/pipelines/new"
artifacts:
paths:
- public
|| true нужен для первого прогона, когда артефактов ещё нет. Ссылка «Run audit» открывает страницу GitLab «Run pipeline», правило web разрешает джобе запуск из вручную созданного пайплайна. На странице только ссылка, никаких токенов. Вместе с дашбордом публикуются и JSON-отчёты из public/reports.