Read in:
Русский

Подграфы

Подграф — именованная группа заметок со своим правилом доступа: добавьте subgraph: paid во frontmatter, и заметку откроют только читатели с доступом к paid. Одно хранилище — несколько аудиторий: публичный блог, платный курс, внутренняя вики — без деления на отдельные сайты.

По умолчанию заметки закрыты. Заметку за подграфом видят только три категории читателей: администратор, тот, кто купил доступ (оффер или подписка), и пользователь, которому администратор выдал доступ вручную. Остальные упираются в пейвол.

Что такое подграф

Метка во frontmatter. Заметка может нести одну или несколько:

subgraph: paid
subgraphs: [team, paid]

Работают оба ключа (subgraph и subgraphs, строка или список); заметка с несколькими метками входит во все эти подграфы. Сам подграф создаётся автоматически, как только синхронизируется первая заметка с его именем — отдельного шага «создать подграф» нет.

Проверка доступа идёт в таком порядке:

  1. Администраторы видят всё.
  2. free: true открывает заметку всем, включая анонимных посетителей, независимо от подграфов. Это отдельная ось: подграф группирует заметку, free публикует её.
  3. Подграф с флагом Require sign-in (в админке) открывает свои заметки любому авторизованному пользователю, подписка не нужна.
  4. Всем остальным нужен активный доступ хотя бы к одному подграфу заметки. Нет доступа — посетитель видит пейвол или форму входа.

Что такое «активный доступ». Это непросроченная и неотозванная запись доступа пользователя к подграфу. Появляется она двумя путями: либо человек оплатил доступ (см. Монетизацию), либо вы выдали его вручную в админке (без оплаты, точечно). «Активный» = срок ещё не истёк и доступ не отозван.

То есть заметка в подграфе закрыта по умолчанию. Открыть её можно тремя способами: выдать доступ конкретному человеку, открыть аудитории через оффер или Telegram-группу, либо сделать публичной через free: true.

Важный нюанс. Заметка без подграфа видна каждому авторизованному пользователю, у которого есть хоть один доступ. Если аудитории смешаны — помечайте всё либо поставьте frontmatter-патч, который складывает непомеченные заметки в подграф, доступ к которому никому не выдан. Рецепт патча — в разделе Сделать всё хранилище закрытым по умолчанию ниже.

Зачем нужны

Публичный блог плюс платный раздел. Постам блога — free: true. Главам курса — subgraph: paid. Подписчики, купившие оффер paid, читают курс; остальные читают блог и упираются в пейвол на главах.

Внутренний раздел. Сложите рабочие инструкции в subgraph: internal и выдайте доступ только команде. Заметки лежат в том же хранилище, что и публичная документация, но наружу не утекают.

Разделы под разные аудитории. subgraphs: [beta, paid] — заметку читают и бета-тестеры, и платящие; у каждой группы свой грант.

Ограниченное окно для агента или пира. Секреты федерации привязаны к подграфам: агент партнёра, ищущий по вашей базе, видит только те подграфы, которые вы выдали его ключу. Это основа ru/user/context-separation; механика — в ru/user/federation.

Как настроить

1. Пометьте заметки. Добавьте subgraph: в свойствах Obsidian или во frontmatter и синхронизируйте. Можно пометить целую папку при синхронизации: --meta subgraph=team (см. ru/user/advanced).

2. Настройте подграф. Админка → Notes & Content → Subgraphs. У подграфа есть цвет, флаг Hidden и Require sign-in — включите его, чтобы открыть подграф любому авторизованному пользователю без подписки.

3. Выдайте доступ. Выберите подходящий путь:

Путь Где
Продать Админка → Monetization → Offers: оффер перечисляет подграфы, которые открывает; покупка выдаёт доступ
Выдать человеку напрямую Админка → Users или мутация createUserSubgraphAccess (ru/user/user_management)
Участникам Telegram-группы Привяжите группу к подграфу в настройках бота — участники получают доступ автоматически (ru/user/telegram-access)
Федеративному пиру Ограничьте его входящий секрет нужным подграфом (ru/user/federation)

Пометить целую папку

Редактировать frontmatter в каждой заметке вручную неудобно, когда в папке course/ сорок уроков. Frontmatter-патч помечает всю папку одним правилом. Создайте заметку в любом месте хранилища:

---
type: frontmatter-patch
include: ["course/**"]
---

```jsonnet
{ subgraph: "course" }
```

Каждая заметка в course/ получает subgraph: course при загрузке — отдельные файлы трогать не нужно, а новые уроки, добавленные в папку, помечаются автоматически. Полный синтаксис (glob-шаблоны, exclude, priority, несколько правил в одном файле) — в frontmatter-патчах.

Файлы и папки с _ скрыты из листинга

Любой файл или папка, чьё имя начинается с _, считается системным: он скрыт из листинга журнала, поиска по сайту, RSS и блока «похожие заметки». Прямой URL заметки продолжает работать — она скрыта от обнаружения, но не от доступа.

Правило применяется к любому компоненту пути, не только к имени файла:

Путь Скрыт?
_sidebar.md Да — имя файла начинается с _
_layouts/base.html Да — папка начинается с _
docs/_internal/note.md Да — подпапка _internal начинается с _
docs/note.md Нет
prefix_word/note.md Нет — _ не в начале компонента пути

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

Скрыта, но её можно встроить. Скрытая заметка спрятана от листингов, но не от других заметок. Её содержимое можно подтянуть в видимую заметку — встройте её явно:

![[_my_hidden_note]]

Встроенная заметка отрисуется прямо в тексте страницы-хоста. Так _-заметки удобно держать как переиспользуемые куски: общий заголовок, сниппет, шаблонный блок — встраиваете во многих местах, но нигде не публикуете отдельно. Оговорка: встраивание показывает содержимое, поэтому «скрыта» — это про обнаружение, а не про доступ. Чтобы правда ограничить, кто прочитает заметку, используйте подграф, а не подчёркивание.

Сделать всё хранилище закрытым по умолчанию

Заметка без подграфа видна каждому авторизованному пользователю с хотя бы одним активным доступом на сайте (оплаченным через монетизацию или выданным вручную в админке). На сайте со смешанной аудиторией это означает утечку контента между разделами. Frontmatter-патч закрывает брешь: он отправляет каждую непомеченную заметку в резервный подграф, к которому никому не выдан доступ.

В админке откройте Notes & Content → Frontmatter Patches и создайте правило:

Поле Значение
Description Private by default
Include patterns **
Priority 0
Jsonnet (см. ниже)
if std.objectHas(meta, "subgraph") || std.objectHas(meta, "subgraphs")
then {}
else { subgraph: "private" }

Логика jsonnet: если у заметки уже объявлен подграф — вернуть {} (без изменений); иначе присвоить subgraph: "private". Дальше создайте подграф private в Админка → Notes & Content → Subgraphs и не выдавайте к нему доступ никому. Результат:

  • Заметки с явным subgraph: работают по своему правилу — условие оставляет их без изменений.
  • Заметки с free: true остаются публичными — free всегда сильнее (см. Что такое подграф).
  • Всё остальное невидимо, пока вы не пометите заметку и не выдадите доступ.

Это рекомендуемая отправная точка для сайта, где контент должен быть закрыт, если его явно не опубликовали.

Сделать все заметки бесплатными для публичного сайта

Симметричный случай: полностью публичный сайт, где каждую заметку должен читать любой посетитель без входа. Один frontmatter-патч ставит free: true на всё хранилище.

В админке откройте Notes & Content → Frontmatter Patches и создайте правило:

Поле Значение
Description Public site — all notes free
Include patterns **
Priority 0
Jsonnet { free: true }

Все заметки становятся публичными, включая анонимных посетителей. free — отдельная ось, независимая от управления доступом через подграфы: она открывает заметку до проверки субграфных грантов. Как два механизма взаимодействуют — в разделе Что такое подграф.

Если часть заметок должна оставаться закрытой, используйте условную форму — она пропускает заметки, у которых free: уже явно прописан во frontmatter:

if std.objectHas(meta, "free") then {} else { free: true }

Правила применяются по приоритету (меньше — раньше). Специфичное правило с бо́льшим номером приоритета может переопределить этот общий дефолт для любого подмножества путей.

Выдать доступ пользователю вручную (без оплаты)

Для коллеги, клиента или любого, с кого вы не берёте денег:

  1. Админка → Users → Create user. Введите email. Пароль задавать не нужно — вход в trip2g без пароля.
  2. Пользователь входит. Он заходит на сайт, вводит email и получает одноразовый код (или входит через OAuth, если настроен Google/GitHub). Ни покупки, ни оффера.
  3. Админка → Users → выбрать пользователя → выдать доступ к подграфу. Отметьте подграф(ы) и, при желании, срок действия. Под капотом это мутация createUserSubgraphAccess — та же, что вызвал бы агент через admin GraphQL API; шаги — в ru/user/user_management.

Теперь пользователь читает все заметки этого подграфа и только их.

Свой сайдбар и главная у подграфа

Подграф может выглядеть как отдельный раздел сайта:

  • _sidebar_<имя>.md — сайдбар на каждой заметке подграфа (если его нет, используется общий _sidebar.md).
  • Главная — заметка _index_<имя>.md, _home_<имя>.md или просто заметка с адресом /<имя>.

Например, у подграфа course_sidebar_course.md со списком уроков и лендинг по адресу /course.

Пример: платный курс с бесплатным лендингом

course.md              ← лендинг: free: true
_sidebar_course.md     ← навигация по урокам
lessons/lesson-1.md    ← subgraph: course
lessons/lesson-2.md    ← subgraph: course

course.md:

---
free: true
---

lessons/lesson-1.md:

---
subgraph: course
---

Дальше в админке: создайте оффер, открывающий подграф course. Лендинг читают все и видят, что покупают; уроки остаются за пейволом до покупки. Лендингу можно тоже добавить subgraph: course ради сайдбара — free: true всё равно сильнее и оставит его публичным.

Для агентов: агент с доступом к admin GraphQL может создать подграф и выдать доступ пользователю, минуя админку, — см. ru/user/subgraph_for_agents.

Смотрите также

  • ru/user/monetization — офферы, Patreon, Boosty, крипта, доступ через Telegram-группу
  • ru/user/user_management — выдача доступа мутациями, предупреждение про непомеченные заметки
  • ru/user/context-separation — подграфы как границы контекста между базами
  • ru/user/federation — как ограничить поиск пира вашими подграфами
  • ru/user/subgraph_for_agents — управление подграфами из агента через GraphQL