Русский
Подграфы
Подграф — именованная группа заметок со своим правилом доступа: добавьте subgraph: paid во frontmatter, и заметку откроют только читатели с доступом к paid. Одно хранилище — несколько аудиторий: публичный блог, платный курс, внутренняя вики — без деления на отдельные сайты.
По умолчанию заметки закрыты. Заметку за подграфом видят только три категории читателей: администратор, тот, кто купил доступ (оффер или подписка), и пользователь, которому администратор выдал доступ вручную. Остальные упираются в пейвол.
Что такое подграф
Метка во frontmatter. Заметка может нести одну или несколько:
subgraph: paid
subgraphs: [team, paid]
Работают оба ключа (subgraph и subgraphs, строка или список); заметка с несколькими метками входит во все эти подграфы. Сам подграф создаётся автоматически, как только синхронизируется первая заметка с его именем — отдельного шага «создать подграф» нет.
Проверка доступа идёт в таком порядке:
- Администраторы видят всё.
free: trueоткрывает заметку всем, включая анонимных посетителей, независимо от подграфов. Это отдельная ось: подграф группирует заметку,freeпубликует её.- Подграф с флагом Require sign-in (в админке) открывает свои заметки любому авторизованному пользователю, подписка не нужна.
- Всем остальным нужен активный доступ хотя бы к одному подграфу заметки. Нет доступа — посетитель видит пейвол или форму входа.
Что такое «активный доступ». Это непросроченная и неотозванная запись доступа пользователя к подграфу. Появляется она двумя путями: либо человек оплатил доступ (см. Монетизацию), либо вы выдали его вручную в админке (без оплаты, точечно). «Активный» = срок ещё не истёк и доступ не отозван.
То есть заметка в подграфе закрыта по умолчанию. Открыть её можно тремя способами: выдать доступ конкретному человеку, открыть аудитории через оффер или 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 }
Правила применяются по приоритету (меньше — раньше). Специфичное правило с бо́льшим номером приоритета может переопределить этот общий дефолт для любого подмножества путей.
Выдать доступ пользователю вручную (без оплаты)
Для коллеги, клиента или любого, с кого вы не берёте денег:
- Админка → Users → Create user. Введите email. Пароль задавать не нужно — вход в trip2g без пароля.
- Пользователь входит. Он заходит на сайт, вводит email и получает одноразовый код (или входит через OAuth, если настроен Google/GitHub). Ни покупки, ни оффера.
- Админка → 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