Документация
Docs/ru/contributing/decisions/0001-github-pages-markdown-publication.md
ADR-0001: публикация Markdown через GitHub Pages и структура локалей
- Статус: принято
- Дата: 2026-07-10
- Изменено: 2026-08-01 после внедрения локализованного сайта и проверок собранных страниц в браузере
- Владельцы: документация, сборка и выпуск
Контекст
FOnline уже публикует сайт репозитория через GitHub Pages, использует конфигурацию Jekyll из _config.yml и привязывает производственный домен корневым файлом CNAME = fonline.ru. Исходником документации служит Markdown в репозитории движка. Он должен оставаться читаемым как в интерфейсе репозитория GitHub, так и на публичном сайте.
Программа вывода документации на производственный уровень также требует:
- самостоятельную документацию движка без файловой зависимости от подключающего проекта;
- канонический английский текст и полное русское зеркало для страниц, предназначенных людям;
- стабильные URL, перенаправления, навигацию, поиск и машиночитаемые индексы;
- проверку pull request по тем же ограничениям, которые действуют в production;
- отсутствие второго дерева содержимого, сгенерированный результат которого может разойтись с Markdown в репозитории.
Отдельное приложение сайта продублировало бы владение и вынесло бы контракт публикации за пределы системы, которая уже обслуживает fonline.ru.
Решение
- GitHub Pages остаётся производственным издателем, а Jekyll остаётся рендерером.
- Канонический источник документации для людей представляет собой Markdown, зафиксированный в этом репозитории.
- Корневые
_config.ymlиCNAMEостаются частью проверяемого контракта публикации.Docs/documentation-manifest.jsonзадаёт провайдера, генератор, формат исходников, домен и владеющие пути. - Не вводить Docusaurus, параллельное дерево содержимого
website/или зафиксированный в репозитории сгенерированный HTML. - Макеты, include-файлы, данные, поддерживаемые плагины, переопределения темы и статические ресурсы Jekyll могут обеспечивать представление и навигацию, но должны оставаться тонким слоем рендеринга поверх Markdown.
-
Целевая публичная структура локалей:
Docs/ en/ # canonical English human docs ru/ # Russian mirror with identical relative paths and stable document IDs assets/ # shared published media, styles, and search assets _meta/ # internal plans/reports, excluded from public navigation - Публичные страницы используют стабильные идентификаторы и совпадающие относительные пути в обеих локалях. Переключатель языка разрешает страницу по идентификатору документа и пути, а не по тексту заголовка.
- Английский язык каноничен для синхронизации с исходным кодом, поскольку идентификаторы движка, комментарии в коде, символы и upstream-взаимодействие ведутся на английском. Русские страницы являются цельными зеркалами документов, а не смешанными языковыми фрагментами.
- Актуальность перевода отслеживается по хешу канонического содержимого. Производственная публикация не должна выдавать устаревшую русскую страницу за актуальную.
- До перемещения исходных файлов существующие публичные URL получают совместимые с GitHub Pages перенаправления либо долговечные маршрутные страницы Markdown.
- Реструктуризация документации не меняет существующую ветку и папку-источник Pages. Перед производственной миграцией администраторы репозитория должны проверить и записать эту настройку и владельца DNS.
- Pull request выполняют быстрые проверки Markdown, манифеста и ссылок, а на этапе сайта также совместимую с GitHub Pages сборку Jekyll, которая сохраняет
_siteкак артефакт для проверки. Production продолжает развёртываться через существующий маршрут Pages.
Последствия
Положительные
- GitHub и
fonline.ruотображают одни и те же авторские файлы. - Документация остаётся переносимой и полезной без Node или клиентского приложения.
- ИИ-системы могут напрямую использовать чистый Markdown и сгенерированный JSON.
- Пользовательский домен и стек публикации проверяются в обычном diff репозитория.
- Паритет локалей можно контролировать по стабильным путям и идентификаторам без реестра переводов, привязанного к отдельному фреймворку.
Издержки
- Навигацию, статический поиск, переключение языка и индикаторы версии необходимо реализовать в пределах возможностей Jekyll, поддерживаемых GitHub Pages.
- Перенос текущего плоского английского дерева требует заранее спланировать маршруты до того, как
Docs/en/станет каноническим для соответствующих страниц. - GitHub Pages предоставляет один производственный сайт; предварительный просмотр pull request остаётся артефактом сборки, пока не появится отдельно одобренная среда просмотра.
- После фиксации английской информационной архитектуры паритет переводов добавляет работу в процесс выпуска.
Отклонённые варианты
- Docusaurus или другое отдельное приложение сайта: отклонено, поскольку создаёт второй контракт фреймворка и содержимого и не соответствует действующему производственному маршруту.
- Зафиксированный в репозитории сгенерированный HTML: отклонено, поскольку результат генерации конкурировал бы с Markdown за роль источника истины.
- Соседние корни
Docs.ENиDocs.RU: отклонено в пользу общепринятых каталогов локалей в нижнем регистре под единым корнем документации. - Смешанные англо-русские страницы: отклонено, поскольку ослабляет маршрутизацию, поиск, контроль актуальности перевода и машинный поиск информации.
- Немедленные снимки версий: отложено до появления у движка тегов выпусков и явной политики поддержки.
Проверка
python BuildTools/docs_validate.pyпроверяет параметры публикации в манифесте,_config.ymlи согласованностьCNAMEс доменом.python BuildTools/docs_site.py --checkпроверяет локализованную навигацию и ограниченный по размеру поиск, полученные из манифеста.python BuildTools/docs_site_artifact.py --site-dir _siteпроверяет собранные маршруты Jekyll и статические endpoint.npm --prefix BuildTools/docs-browser run auditпроверяет страницы в desktop/mobile-профилях, взаимодействия, скриншоты и результаты axe-core.- Задания
Validate documentationиBuild documentation siteвыполняются без подключающего проекта и нативной сборки и сохраняют_siteкак артефакт проверки. - Самостоятельное отображение Markdown в GitHub остаётся обязательным маршрутом наряду с Jekyll.