Skip to content

Repository files navigation

RSLive Content — контент энциклопедии «Инструкция по Сербии»

Статус rslive.ru Статьи Стикеры Контрибьюторы

Этот репозиторий — основная точка редактирования и source of truth для статей сайта rslive.ru.

Движок, компоненты, стили, сборка и деплой находятся в приватном репозитории Antiokh/rslive.ru. Здесь хранятся только материалы энциклопедии и относящаяся к ним редакционная документация.

Лицензия редакционного контента

First-party редакционный контент в src/content/docs/**, если для конкретного материала не указаны другие условия, распространяется по Creative Commons Attribution-ShareAlike 4.0 International (CC-BY-SA-4.0).

Материал можно свободно копировать, распространять и адаптировать, в том числе коммерчески, при соблюдении Attribution и ShareAlike. Предоставленная RSLive общая атрибуция:

Инструкция по Сербии — RSLive.ru
https://rslive.ru/

Для конкретной статьи сохраняйте также её канонический URL, насколько это практически возможно, и отмечайте изменения в соответствии с CC BY-SA 4.0.

Почему здесь CC BY-SA, а не прежняя GPLv3: rslive_content фактически является контентным репозиторием, а основная программная реализация вынесена в Antiokh/rslive.ru. GPLv3 юридически может применяться и к не-программным произведениям, но её software/source-code модель плохо выражала нужные энциклопедии Attribution + ShareAlike и требовала лишних пояснений. CC BY-SA 4.0 задаёт эти условия непосредственно и понятнее для текстового коллективного корпуса.

Лицензии разделены по типу материала, но GitHub намеренно видит только одну основную root-level лицензию:

  • LICENSE — стандартный текст CC BY-SA 4.0, чтобы GitHub однозначно показывал эту лицензию как основную;
  • NOTICE.md — атрибуция, scope, исключения и переход с прежней GPLv3;
  • docs/licensing/gpl-3.0-only.txt — полный текст GPLv3 для небольшого first-party программного слоя;
  • map-data/**, сторонние материалы и provider snapshots — по собственным provenance/licensing rules.

Где редактировать

Редактируйте статьи только здесь:

src/content/docs/

Каталог движка:

Antiokh/rslive.ru: astro/src/content/docs/

— синхронизируемое зеркало. Не используйте его как штатную точку редактирования: импорт из этого репозитория выполняется через rsync --delete, поэтому несогласованные изменения в зеркале могут быть перезаписаны.

Автоматической обратной синхронизации из rslive.ru в rslive_content нет. Это намеренно: публичный репозиторий является source of truth, а зеркало в движке — только runtime-копией.

Быстрый старт для агента

Перед изменением контента:

  1. Прочитайте этот README.
  2. Откройте docs/CONTENT_INDEX.md и при необходимости generated-проекцию src/content/docs/CONTENT_INDEX.yml.
  3. Найдите существующую статью, соседние страницы раздела и подходящие внутренние ссылки.
  4. Проверьте факты, даты, юридические термины и внешние источники.
  5. Внесите минимальное связное изменение в src/content/docs/**.
  6. Не редактируйте CONTENT_INDEX.yml вручную: маршруты выводятся из дерева, а дополнительный контекст перелинковки задаётся через frontmatter.linking.
  7. Проверьте MDX-синтаксис, сноски, ссылки и компоненты.
  8. После push в main дождитесь статуса rslive.ru / Публикация на исходном коммите.

Если задача касается компонента, CSS, sidebar, поиска, API, PWA, редиректа, сборки или Cloudflare — это задача для Antiokh/rslive.ru, а не для этого репозитория.

Редакционный стандарт

RSLive — веб-энциклопедия по переезду и жизни в Сербии.

Текст должен быть:

  • энциклопедическим, конкретным и практичным;
  • написанным преимущественно в императивной форме там, где описывается порядок действий;
  • пригодным для человека, который впервые сталкивается с процедурой;
  • связанным с другими статьями внутренними ссылками;
  • снабжённым внешними источниками для проверяемых фактических и юридических утверждений.

Не превращайте статьи в блоговые заметки, рекламу, пересказ слухов или набор общих советов.

Разделяйте типы информации

Не смешивайте без маркировки:

  • норму закона;
  • официальную инструкцию ведомства;
  • установленный административный порядок;
  • практику конкретного отделения или инспектора;
  • пользовательский опыт;
  • оценку, прогноз или рекомендацию редакции.

Если официальное правило и наблюдаемая практика отличаются, опишите оба уровня отдельно.

Не выдавайте пользовательский опыт за обязательное правило и не делайте юридический вывод только из того, что «так обычно принимают».

Источники и фактчекинг

Для существенных утверждений используйте источники в таком порядке:

  1. законы и подзаконные акты Сербии;
  2. официальные сайты министерств, ведомств, муниципалитетов и государственных организаций;
  3. официальные инструкции, тарифы, формы и реестры;
  4. сайты регулируемых организаций и поставщиков услуг;
  5. надёжные вторичные источники;
  6. пользовательский опыт — только как практическое дополнение.

Для юридических утверждений по возможности ссылайтесь не только на документ целиком, но и на конкретную статью, раздел или официальный фрагмент процедуры.

Проверяйте:

  • актуальность редакции закона;
  • дату тарифа, суммы или административного сбора;
  • компетенцию органа;
  • территориальные различия;
  • исключения и переходные положения;
  • отличается ли правило для граждан, иностранцев, резидентов, нерезидентов, предпринимателей или членов семьи.

Не придумывайте отсутствующие сроки, документы, основания отказа, обязанности ведомств или правоприменительную практику.

Если надёжного ответа нет, прямо укажите границу известного и не превращайте предположение в факт.

Структура репозитория

.github/workflows/
  notify-rslive-ru.yml       # публикует content/stickers/map-data в движок и возвращает статус Cloudflare

src/content/docs/
  CONTENT_INDEX.yml          # автоматически сгенерированный семантический индекс
  index.mdx                  # главная страница
  arrival/
  move/
  adaptation/
  integration/
  lifestyle/
  med/
  edu/
  gov/
  map/
  tools/
  about/
  blog/

Статья обычно находится в папке с index.mdx:

src/content/docs/arrival/boravak/index.mdx      -> https://rslive.ru/arrival/boravak/
src/content/docs/move/visa/index.mdx            -> https://rslive.ru/move/visa/
src/content/docs/integration/euprava/index.mdx  -> https://rslive.ru/integration/euprava/

Главная страница раздела также называется index.mdx:

src/content/docs/move/index.mdx -> https://rslive.ru/move/

Персональный навигатор

Статья может опционально объявить, при каких ответах персонального навигатора её показывать. Для этого используется отдельное поле navigator; поисковый keywords для этой задачи не применяется.

Один набор условий:

navigator:
  now: [traveling, pets]

означает: показать статью в фазе now, если одновременно активны теги traveling И pets.

Несколько альтернатив:

navigator:
  now:
    - [traveling, pets]
    - [car, pets]

означают: показать статью, если выполнен первый набор ИЛИ второй. Внутри каждого массива по-прежнему действует И.

Допустимые фазы, полный словарь тегов, производные теги и правила редактирования перечислены в docs/RELOCATION_WIZARD.md. Не добавляйте произвольный новый тег только в статью: неизвестный тег должен останавливать линтер и Astro schema validation.

Обновление существующей статьи

  1. Найдите страницу через файловую структуру; generated CONTENT_INDEX.yml используйте как вспомогательную семантическую карту.
  2. Прочитайте статью целиком, а не только изменяемый абзац.
  3. Проверьте соседние статьи на дублирование и возможную перелинковку.
  4. Сохраните тезис, структуру и полезные детали, если задача не требует полного переписывания.
  5. Обновите источники и даты проверки.
  6. Проверьте, не противоречит ли новое утверждение другим страницам.
  7. Если меняется смысл страницы, обновите description, keywords и при необходимости linking; индекс перегенерируется автоматически.

Добавление новой статьи

Создайте папку и файл по ожидаемому URL:

src/content/docs/arrival/new-topic/index.mdx

Минимальный шаблон:

---
title: "Название статьи"
description: "Короткое описание содержания страницы для поиска и превью."
keywords: ["ключевая фраза 1", "ключевая фраза 2"]
sourceCheckedAt: 2026-07-31
live: "https://rslive.ru/arrival/new-topic/"
---

Коротко объясните, кому нужна эта статья и какой результат получит читатель.

## Что нужно знать

Основные правила, ограничения и условия.

## Порядок действий

<Steps>

1. Выполните первый шаг.
2. Подготовьте документы.
3. Подайте заявление.
4. Проверьте результат.

</Steps>

## Практические особенности

Отдельно опишите различия между официальным порядком и наблюдаемой практикой.

## Примечания

[^1]: [Официальный источник](https://example.com)

После добавления страницы внесите её в CONTENT_INDEX.yml и добавьте ссылки из релевантных существующих статей.

Frontmatter

Каждая статья должна начинаться с frontmatter. Поле title обязательно по схеме. Для новых и существенно переработанных публичных страниц также указывайте description и канонический URL live.

live содержит абсолютный канонический URL опубликованной страницы на https://rslive.ru. Значение выводится из пути файла: src/content/docs/index.mdx соответствует https://rslive.ru/, а src/content/docs/arrival/boravak/index.mdx — https://rslive.ru/arrival/boravak/. Для файлов не с именем index.mdx используйте маршрут с именем файла без расширения и завершающим /.

Поле source относится к завершённой миграции с DokuWiki и больше не используется. Не добавляйте его в новые или существующие статьи; при обнаружении заменяйте его на live с фактическим URL страницы.

---
title: "Визы и документы"
seoTitle: "Визы в Сербию: виды, правила въезда и документы"
description: "Виды виз, правила въезда и документы для переезда в Сербию."
ogTitle: "Визы и документы для въезда в Сербию"
ogDescription: "Какая виза нужна, как подготовить документы и проверить условия въезда."
ogSticker: passport
keywords: ["виза в Сербию", "въезд в Сербию", "документы"]
sourceCheckedAt: 2026-07-31
live: "https://rslive.ru/move/visa/"
---

Поддерживаемые дополнительные поля:

seoTitle: "Отдельный заголовок для поисковой выдачи"
ogTitle: "Короткий заголовок для соцсетей"
ogDescription: "Короткое описание для OG-карточки"
ogSticker: passport
author: "Автор"
reviewedBy: "Проверяющий"
sourceCheckedAt: 2026-07-31
live: "https://rslive.ru/arrival/boravak/"
  • seoTitle позволяет задать SEO-заголовок, не меняя видимый title статьи.
  • ogTitle и ogDescription переопределяют текст сгенерированной Open Graph-карточки; без них используются title и description.
  • ogSticker задаёт стикер для широкой Open Graph-карточки. Указывайте техническое английское имя без .svg или .png; доступные значения собраны на странице /about/stickers/.
  • reviewedBy может быть строкой или массивом.

Для управления боковым меню:

---
title: "Контентные компоненты"
description: "Примеры компонентов, доступных в статьях."
sidebar:
  label: "Компоненты"
  order: 60
---

Не добавляйте новое поле frontmatter без поддержки в схеме движка. Схема находится в Antiokh/rslive.ru/astro/src/content.config.ts.

Markdown и MDX

Используйте обычный Markdown и MDX:

## Раздел
### Подраздел

Текст со [ссылкой](/arrival/boravak/).

- Пункт списка
- Ещё пункт

1. Первый шаг
2. Второй шаг

Внутренние ссылки должны быть абсолютными путями от корня сайта и обычно заканчиваться /:

[боравак](/arrival/boravak/)

Не используйте относительные переходы вроде ../boravak/, если можно указать канонический маршрут.

Сноски

Используйте цифровые Markdown-сноски:

Утверждение, требующее подтверждения.[^1]

[^1]: [Официальный источник](https://example.com)

Для нескольких источников:

Требование установлено законом и официальной инструкцией.[^1][^2]

[^1]: [Текст закона](https://example.com/law)
[^2]: [Инструкция ведомства](https://example.com/instruction)

Не используйте именованные labels вместо цифровых [^1], [^2] и далее.

Ставьте сноску рядом с утверждением, которое она подтверждает. Не прикрепляйте одну ссылку ко всему разделу, если из неё не следует каждое утверждение раздела.

URL в угловых скобках

MDX может принять Markdown-autolink за JSX.

Плохо:

<http://onelink.to/q9p3q2>

Правильно:

[http://onelink.to/q9p3q2](http://onelink.to/q9p3q2)

CONTENT_INDEX.yml

src/content/docs/CONTENT_INDEX.yml — семантическая карта сайта для поиска страниц и внутренней перелинковки.

Типичная запись:

- url: /arrival/beli-karton/
  title: "Белый картон: регистрация иностранца в Сербии"
  tags: [боравак, регистрация, документ, адрес]
  aliases: [белый картон, prijava boravka, регистрация иностранца]
  link_when:
    - нужно оформить регистрацию после приезда
    - требуется подтверждение адреса
  anchors: []

Обновляйте индекс, когда:

  • добавлена или удалена страница;
  • изменён URL;
  • изменено название или основная тема статьи;
  • появились важные aliases или варианты терминов;
  • изменился контекст, в котором на страницу нужно ссылаться;
  • добавлен проверенный стабильный anchor.

Не добавляйте anchor по памяти. Заголовок MDX и итоговый Astro ID могут различаться. Оставляйте anchors: [], пока anchor не проверен по собранной странице.

CONTENT_INDEX.yml не заменяет ссылки в статьях. Он помогает находить правильные страницы, но фактическую перелинковку нужно добавлять в MDX.

Компоненты MDX

Точный публичный MDX surface определяется движком в Antiokh/rslive.ru: astro/config/mdx-components.config.mjs. Запись с autoImport: true доступна в обычной статье без локального import; исключения с autoImport: false сохраняют явный импорт. Не поддерживайте второй полный список компонентов в этом README.

Подробный синтаксис и редакторские правила находятся в docs/MDX_COMPONENTS.md. Перед использованием редкого компонента сверяйте registry и текущий исходник компонента в движке.

Aside

<Aside type="tip" title="Совет">

Текст подсказки.

</Aside>

Используйте tip для практического совета, note для пояснения и caution для существенного риска или ограничения.

Steps

<Steps>

1. Подготовьте документы.
2. Оплатите сбор.
3. Подайте заявление.

</Steps>

Accordion

<Accordion title="Частые вопросы">
  <AccordionItem title="Нужна ли запись?">
    Ответ с пояснением и источником.
  </AccordionItem>
  <AccordionItem title="Сколько длится процедура?">
    Ответ.
  </AccordionItem>
</Accordion>

Spoiler

<Spoiler title="Показать подробности">
  Скрытый дополнительный материал.
</Spoiler>

UplatnicaGenerator

<UplatnicaGenerator
  payer="Ваше имя и адрес"
  subject="Название услуги или назначение платежа"
  recipient={`Назив примаоца
Адрес примаоца`}
  code="153"
  sum="11745.00"
  account="840-1848-16"
  model="97"
  target="Позив на број"
/>

Не публикуйте квитанцию как актуальную без проверки суммы, счёта, модели и позива на број по официальному источнику. Если реквизиты зависят от муниципалитета или заявителя, укажите это рядом с компонентом.

Медиа

<YouTube id="NHkCfZjIEV4" title="Название видео" />

<MapEmbed
  src="https://www.google.com/maps/d/embed?mid=..."
  title="Карта"
  caption="Описание карты"
/>

Перед добавлением внешнего embed проверьте, что он доступен без авторизации и не содержит секретных параметров.

Таблицы

Небольшие таблицы пишите обычным Markdown:

| Город | Адрес | Очередь |
| --- | --- | ---: |
| Белград | Bulevar Zorana Đinđića 64a | 18 |
| Нови-Сад | Bulevar oslobođenja 56a | 7 |

Для фильтрации, сортировки, длинного текста, ссылок и иконок используйте SmartTable:

<SmartTable
  id="branches-demo"
  title="Подразделения"
  stretchColumn="address"
  columns={[
    { key: 'name', label: 'Название' },
    { key: 'address', label: 'Адрес', stretch: true },
    { key: 'city', label: 'Город' },
    { key: 'queue', label: 'Очередь', numeric: true },
    { key: 'website', label: 'Сайт', icon: 'website', iconOnly: true },
  ]}
  rows={[
    {
      name: 'GTC',
      address: 'Bulevar Zorana Đinđića 64a',
      city: 'Beograd',
      queue: 18,
      website: 'https://example.com',
    },
  ]}
/>

Поддерживаемые значения icon:

telegram | whatsapp | website | facebook | email | link

Для управляемых таблиц используются:

<SanityTable
  tableId="banks_raiffeisen"
  title="Список подразделений Raiffeisen"
  limit={100}
  pageSize={25}
/>

<SupabaseTable
  table="data_banks_raiffeisen"
  title="Supabase: Raiffeisen"
  select="rid,name,address,city,website"
  order="rid"
  limit={100}
  pageSize={25}
/>

<StructTable schema="banks_raiffeisen" pageSize={25} />

Не угадывайте имя таблицы, schema или колонки. Проверьте реализацию компонента и источник данных в репозитории движка.

Старый синтаксис

Не добавляйте DokuWiki-синтаксис в новые или обновляемые статьи:

[[page:name|Текст]]
{{section>page#anchor}}
+++ Спойлер|
<barcode ... />
<do ...>
<autott>...</autott>

Используйте Markdown или MDX-компоненты:

[Текст](/page/name/)

<Spoiler title="Спойлер">
  Текст.
</Spoiler>

При встрече legacy-синтаксиса заменяйте только после проверки, что новая конструкция сохраняет смысл и поведение исходной вставки.

Синхронизация и автодеплой

Основной поток публикации при наличии изменений в зеркалируемых путях:

push в Antiokh/rslive_content:main
→ .github/workflows/notify-rslive-ru.yml (public GitHub Actions runner)
→ validation map-data
→ checkout Antiokh/rslive.ru:main с RSLIVE_CONTENT_SYNC_TOKEN
→ rsync content + sticker SVG + allowlisted map-data в runtime-пути движка
→ sync-коммит в Antiokh/rslive.ru:main
→ Cloudflare Pages Git integration / npm run build
→ public workflow ждёт check run Cloudflare Pages
→ статус rslive.ru / Публикация на исходном контентном коммите

Если после rsync в зеркалируемых путях нет фактических изменений, workflow не создаёт sync-коммит и не ждёт Cloudflare Pages. Вместо этого исходный content-коммит сразу получает успешный status rslive.ru / Публикация с описанием Публикация не требуется: изменений для сайта нет.

Несмотря на legacy-имя notify-rslive-ru.yml, workflow не отправляет repository_dispatch. Он сам выполняет полный public-runner publication flow и является действующим production workflow.

Синхронизируются, в частности:

rslive_content/src/content/docs/
→ rslive.ru/astro/src/content/docs/

rslive_content/src/content/docs/about/stickers/assets/svg/
→ rslive.ru/astro/src/assets/stickers/

allowlisted файлы из rslive_content/map-data/core/
→ rslive.ru/astro/public/maps/core/ и build-only map boundaries

rslive_content/map-data/basemaps/**
→ rslive.ru/astro/public/maps/basemaps/

allowlisted файлы из rslive_content/map-data/packs/cities/
→ rslive.ru/astro/public/maps/packs/cities/

rslive_content/map-data/snapshots/**
→ rslive.ru/astro/public/maps/snapshots/

Точный allowlist map-data и правила --delete определяет актуальный .github/workflows/notify-rslive-ru.yml; не дублируйте их по памяти в других документах.

Файлы уровня репозитория — README.md, LICENSE, .gitignore, .github/ и другие — в движок не копируются.

Синхронизационные коммиты содержат:

[skip content-sync]

Маркер сохраняется для совместимости и явной маркировки generated sync-коммитов. Не используйте его в обычных редакционных коммитах.

Активный Actions secret находится в этом публичном репозитории:

RSLIVE_CONTENT_SYNC_TOKEN

Он должен позволять workflow читать и изменять приватный rslive.ru, читать checks созданных engine-коммитов и публиковать commit statuses в rslive_content. Routine publication не зависит от одноимённого secret в приватном репозитории.

Если публикация не произошла, проверьте:

  1. workflow rslive.ru в этом репозитории;
  2. RSLIVE_CONTENT_SYNC_TOKEN и его permissions;
  3. validation map-data в начале workflow;
  4. если зеркалируемые пути изменились — появился ли sync-коммит в rslive.ru/main; если изменений нет — получил ли исходный commit success-status с описанием Публикация не требуется: изменений для сайта нет;
  5. для созданного engine-коммита — check run Cloudflare Pages;
  6. commit status rslive.ru / Публикация на исходном content-коммите;
  7. MDX/build-ошибку в изменённых материалах;
  8. конфликтующий push в rslive.ru/main во время retry/rebase.

Проверка сборки

Этот репозиторий не содержит Astro-приложение и сам по себе не может выполнить полный production build.

Обычная удалённая проверка выполняется автоматически после push через rslive.ru и Cloudflare Pages. Результат возвращается в исходный коммит как:

rslive.ru / Публикация

Для локальной полной проверки нужен приватный репозиторий движка. Если оба репозитория клонированы рядом:

rsync -a --delete \
  ../rslive_content/src/content/docs/ \
  ./astro/src/content/docs/

cd astro
npm ci
npm run check

Не коммитьте результат локального копирования в зеркало движка как альтернативный редакционный поток.

Правила для агента

  1. Работайте с контентом в этом репозитории, а не в зеркале движка.
  2. Не меняйте маршрут страницы без проверки ссылок и необходимости редиректа в rslive.ru.
  3. Не удаляйте факты, источники и полезные детали только ради сокращения текста.
  4. Не добавляйте фактические или юридические утверждения без проверки.
  5. Не используйте один вторичный источник там, где доступен официальный.
  6. Не называйте практический опыт обязательным правилом.
  7. Не создавайте дублирующую статью до проверки CONTENT_INDEX.yml и соседних разделов.
  8. Не придумывайте component props. Найдите существующее использование или проверьте компонент в движке.
  9. При добавлении компонента движка обновите этот README или профильную документацию для авторов.
  10. При изменении страницы проверьте входящие и исходящие внутренние ссылки.
  11. При значимом обновлении фактов измените sourceCheckedAt.
  12. Перед завершением перечитайте diff целиком и убедитесь, что CONTENT_INDEX.yml остаётся актуальным.

Контрольный список перед merge или push в main

  • изменён правильный файл в src/content/docs;
  • title и description соответствуют содержанию;
  • фактические и юридические утверждения подтверждены;
  • официальные источники имеют приоритет;
  • суммы, сроки и процедуры датированы или проверены;
  • сноски цифровые и стоят рядом с утверждениями;
  • внутренние ссылки ведут на существующие канонические маршруты;
  • CONTENT_INDEX.yml обновлён при необходимости;
  • MDX не содержит autolink в угловых скобках;
  • legacy DokuWiki-синтаксис не добавлен;
  • component props проверены по существующим примерам или коду движка;
  • новая страница связана с соседними статьями;
  • после push получен результат rslive.ru / Публикация.

Связанная документация

About

Публичный контент RSLive: MDX-статьи и материалы для rslive.ru

Topics

Resources

Contributing

Stars

2 stars

Watchers

1 watching

Forks

Contributors

Languages