seo: GA4, breadcrumbs JSON-LD, IndexNow post-deploy, llms.txt

- Add GA4 (G-C9J0D8FFH3) to root layout alongside Yandex.Metrika
- Add BreadcrumbList JSON-LD schema to all inner pages
- Add scripts/indexnow.mjs — submits 30 URLs to IndexNow + Yandex on deploy
- Add indexnow to postdeploy step in package.json
- Update llms.txt with all 8 services and new pages (about/clients/partners)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-16 04:04:50 +03:00
parent 21596c278b
commit 9f53641f16
12 changed files with 151 additions and 11 deletions

68
scripts/indexnow.mjs Normal file
View File

@@ -0,0 +1,68 @@
#!/usr/bin/env node
// IndexNow — уведомляем поисковики об обновлении сайта после деплоя
// https://www.indexnow.org/
const KEY = '40c65b722891b81d944f2c3fea6cab95'
const HOST = 'sag24.ru'
const URLS = [
'https://sag24.ru/ru/',
'https://sag24.ru/en/',
'https://sag24.ru/ru/about/',
'https://sag24.ru/en/about/',
'https://sag24.ru/ru/clients/',
'https://sag24.ru/en/clients/',
'https://sag24.ru/ru/partners/',
'https://sag24.ru/en/partners/',
'https://sag24.ru/ru/uslugi/',
'https://sag24.ru/en/uslugi/',
'https://sag24.ru/ru/uslugi/it-autsorsing/',
'https://sag24.ru/en/uslugi/it-autsorsing/',
'https://sag24.ru/ru/uslugi/kiberbezopasnost/',
'https://sag24.ru/en/uslugi/kiberbezopasnost/',
'https://sag24.ru/ru/uslugi/tehpodderzhka/',
'https://sag24.ru/en/uslugi/tehpodderzhka/',
'https://sag24.ru/ru/uslugi/videonablyudenie/',
'https://sag24.ru/en/uslugi/videonablyudenie/',
'https://sag24.ru/ru/uslugi/seti/',
'https://sag24.ru/en/uslugi/seti/',
'https://sag24.ru/ru/uslugi/servery/',
'https://sag24.ru/en/uslugi/servery/',
'https://sag24.ru/ru/uslugi/telefoniya/',
'https://sag24.ru/en/uslugi/telefoniya/',
'https://sag24.ru/ru/uslugi/oblako/',
'https://sag24.ru/en/uslugi/oblako/',
'https://sag24.ru/ru/faq/',
'https://sag24.ru/en/faq/',
'https://sag24.ru/ru/kontakty/',
'https://sag24.ru/en/kontakty/',
]
const ENDPOINTS = [
'https://api.indexnow.org/indexnow',
'https://yandex.com/indexnow',
]
async function submit(endpoint) {
const res = await fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json; charset=utf-8' },
body: JSON.stringify({
host: HOST,
key: KEY,
keyLocation: `https://${HOST}/${KEY}.txt`,
urlList: URLS,
}),
})
return res.status
}
console.log(`IndexNow: submitting ${URLS.length} URLs...`)
const results = await Promise.allSettled(ENDPOINTS.map(async ep => {
const status = await submit(ep)
console.log(` ${ep}${status}`)
return status
}))
const ok = results.every(r => r.status === 'fulfilled' && (r.value === 200 || r.value === 202))
console.log(ok ? 'IndexNow: done.' : 'IndexNow: some errors (non-critical).')