Форум RelaxDev
Задавайте вопросы, делитесь опытом и помогайте другим
Telegram Чат
Быстрые ответы и обсуждения в реальном времени
Telegram Канал
Новости платформы и важные анонсы
Настройка сайта для SEO
# SEO для Next.js на RelaxDev — полный гайд Всё что нужно сделать чтобы сайт попал в поисковики. Специфика Next.js App Router — robots и sitemap через TypeScript файлы в папке `app/`, файлы верификации — в `public/`. --- ## 1. robots.txt Создайте `src/app/robots.ts` — Next.js автоматически отдаст его по адресу `/robots.txt`: ```ts // src/app/robots.ts import type { MetadataRoute } from 'next'; export default function robots(): MetadataRoute.Robots { return { rules: [ { userAgent: '*', allow: '/', disallow: [ '/api/', '/dashboard/', '/profile/', '/admin/', '/login/', '/auth/', ], }, ], sitemap: 'https://ваш-домен.ru/sitemap.xml', }; } ``` **Проверка:** откройте `https://ваш-домен.ru/robots.txt` — должен открыться как текст со списком правил. --- ## 2. sitemap.xml Создайте `src/app/sitemap.ts`: ```ts // src/app/sitemap.ts export const dynamic = 'force-dynamic'; import { MetadataRoute } from 'next'; export default function sitemap(): MetadataRoute.Sitemap { return [ { url: 'https://ваш-домен.ru', lastModified: new Date(), changeFrequency: 'weekly', priority: 1, }, { url: 'https://ваш-домен.ru/about', lastModified: new Date(), changeFrequency: 'monthly', priority: 0.8, }, ]; } ``` С динамическим контентом из БД (Prisma): ```ts export const dynamic = 'force-dynamic'; import { MetadataRoute } from 'next'; import { prisma } from '@/lib/prisma'; export default async function sitemap(): Promise<MetadataRoute.Sitemap> { const baseUrl = 'https://ваш-домен.ru'; const posts = await prisma.post.findMany({ where: { published: true }, select: { slug: true, updatedAt: true }, }); const staticPages: MetadataRoute.Sitemap = [ { url: baseUrl, lastModified: new Date(), changeFrequency: 'weekly', priority: 1 }, { url: `${baseUrl}/about`, changeFrequency: 'monthly', priority: 0.8 }, ]; const dynamicPages: MetadataRoute.Sitemap = posts.map(p => ({ url: `${baseUrl}/blog/${p.slug}`, lastModified: p.updatedAt, changeFrequency: 'weekly' as const, priority: 0.7, })); return [...staticPages, ...dynamicPages]; } ``` **Проверка:** откройте `https://ваш-домен.ru/sitemap.xml` — должен открыться XML со списком страниц. --- ## 3. Закрыть закрытые страницы от индексации Страницы с авторизацией и личными данными нельзя пускать в поисковики. В Next.js App Router закрыть целый раздел можно одной строкой в `layout.tsx` — тогда все вложенные страницы автоматически получат `noindex`: ```ts // src/app/(dashboard)/layout.tsx export const metadata: Metadata = { robots: { index: false, follow: false }, }; ``` Это закрывает `/dashboard`, `/profile`, `/settings` и всё что внутри сразу. Для отдельных страниц — то же самое в `page.tsx`: ```ts // src/app/admin/page.tsx export const metadata = { robots: { index: false, follow: false }, }; ``` Проверить что страница закрыта можно в браузере через `Ctrl+U` → найти `<meta name="robots" content="noindex">`. Или через Google Search Console → Проверка URL. --- ## 4. Подтверждение сайта ### Шаг 1 — скачать файл верификации В Google Search Console и Яндекс Вебмастер выберите метод **«HTML-файл»** и скачайте файл. ### Шаг 2 — положить в public/ ``` public/ google123abc456def.html ← Google yandex_12345abcdef.html ← Яндекс favicon.svg favicon.ico ``` Файлы из `public/` доступны по корневому URL автоматически — никакой настройки не нужно. После деплоя `https://ваш-домен.ru/google123abc456def.html` откроется сразу. ### Шаг 3 — задеплоить и подтвердить 1. Закоммитить файлы → задеплоить 2. Нажать **«Подтвердить»** в панели каждого поисковика --- ## 5. Яндекс.Метрика — ускоряет индексацию Счётчик Метрики не просто аналитика — Яндекс заметно быстрее индексирует сайты где он установлен, потому что видит реальный трафик. Без счётчика индексация может занять 1–2 недели, с ним — 1–3 дня. ```tsx // src/app/layout.tsx import Script from 'next/script'; // Внутри <body>: <Script id="yandex-metrika" strategy="lazyOnload"> {`(function(m,e,t,r,i,k,a){ m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); k=e.createElement(t),a=e.getElementsByTagName(t)[0]; k.async=1;k.src=r;a.parentNode.insertBefore(k,a) })(window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym"); ym(XXXXXXXX,"init",{ clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true });`} </Script> ``` Где `XXXXXXXX` — номер счётчика из [metrika.yandex.ru](https://metrika.yandex.ru). --- ## 6. Отправить Sitemap в индексацию Самый важный шаг — без этого поисковики могут неделями не находить страницы. **Google Search Console:** Индексирование → Файлы Sitemap → Добавить `https://ваш-домен.ru/sitemap.xml` → **Отправить** **Яндекс Вебмастер:** Индексирование → Файлы Sitemap → Добавить → `https://ваш-домен.ru/sitemap.xml` → **Добавить** --- ## Чеклист - `https://ваш-домен.ru/robots.txt` открывается - `https://ваш-домен.ru/sitemap.xml` открывается с нужными страницами - Закрытые разделы (`/dashboard/`, `/admin/`) имеют `robots: { index: false }` - HTML-файлы верификации в `public/` и задеплоены - Сайт подтверждён в Google Search Console - Сайт подтверждён в Яндекс Вебмастер - Счётчик Яндекс.Метрики установлен - Sitemap отправлен в обе панели в разделе **Индексирование** **Сроки:** Google ~1–7 дней, Яндекс ~1–3 дня (быстрее если есть Метрика). --- Вопросы — пишите в комментарии 👇
Подключение Datalens к Relaxdev: пошаговая инструкция
Показываю, как работает настройка Datalens из нового функционала Relaxdev. Скриншоты и последовательность как пример рабочей конфигурации прилагаю ниже. Как подключить RelaxDev к DataLens Шаг 1. В RelaxDev открой вкладку База данных → переключись на таб DataLens. Шаг 2. Скопируй ссылку из блока «Ссылка для DataLens» — это CSV-эндпоинт с токеном. При необходимости отредактируй SQL-запрос для экспорта и нажми «Обновить данные вручную». Шаг 3. Открой Google Sheets → Extensions → Apps Script. Шаг 4. В редакторе вставь скрипт syncFromRelaxDev() — он забирает CSV по ссылке и записывает данные в активный лист. Нажми Run для проверки. Шаг 5. Перейди в Triggers → Add Trigger. Выбери функцию syncFromRelaxDev, событие — From spreadsheet / On open (данные будут обновляться при открытии файла). Сохрани. Шаг 6. В Yandex DataLens открой нужную коллекцию → Подключения → Создать подключение. Шаг 7. Выбери Google Sheets, подключи таблицу — готово.
Поддержка развития
Здесь отображаются донаты и сообщения от участников, напрмер за помощь в деплое, просьба добавить новую фичу или поделиться нашими технологиями
Deploy из под-папки
Часто в репе может быть несколько проектов, он лежит не в root, тогда очень удобно при импорте указать рабочий folder..
DNS
А надо ли удалять старые записи
Ошибки деплоя
Проверяйте выбранный стек, порт 8080, не забывайте переменные, если не получается пишите
CDN для сайта или Хранилища
Как лучше провести через CDN статику - HTML страницу ?