docs: 3 стенда (test/dev/prod), приоритет curated-примеров, инцидент генератора nav

This commit is contained in:
2026-10-07 20:33:44 +03:00
parent 382b7b0e9b
commit f1a774d6ef
3 changed files with 139 additions and 97 deletions
+44 -2
View File
@@ -18,6 +18,22 @@
--- ---
## 1.1 Стенды
Ассистент **stand-aware**: `stand` берётся из первого сегмента пути, индекс —
из `VM_DOCS_BASE_URL/<stand>/search/search_index.json`. Включён на всех трёх стендах:
| Стенд | URL | Виджет | Эндпоинт |
|---|---|---|---|
| `nubes-test` | `/nubes-test/` | ✅ | ✅ |
| `nubes-dev` | `/nubes-dev/` | ✅ | ✅ |
| `nubes` (prod) | `/nubes/` | ✅ | ✅ |
Каждый стенд отвечает по **своему** индексу. Кэш индекса/ответов и лимиты
ключуются по стенду.
---
## 2. Архитектура ## 2. Архитектура
``` ```
@@ -154,8 +170,11 @@ tf_docs (Node.js, кластер nodejsk8s) [orchestrator.js]
отбрасывание стоп-слов (рус. + англ.). отбрасывание стоп-слов (рус. + англ.).
- **Транслит** (`TRANSLIT` в `search.js`): «постгрес»→`postgres`, «бакет»→`bucket`, - **Транслит** (`TRANSLIT` в `search.js`): «постгрес»→`postgres`, «бакет»→`bucket`,
«топик»→`topic` и т.д. «топик»→`topic` и т.д.
- **Буст по типу страницы**: страница ресурса ×2.0, руководство (`_manual`) ×0.6, - **Буст по типу страницы** (приоритет — «примеры в первую очередь»):
служебная (`curated`/`30_registry`) ×0.4. - `curated/*` (готовые примеры, проверенные на реальных деплоях) — **×2.4**;
- страница ресурса — ×2.0;
- руководство (`_manual`) — ×0.6;
- служебная (`30_registry`) — ×0.4.
- **Подресурс → родитель**: `nubes_postgres_database` при поиске дополняется - **Подресурс → родитель**: `nubes_postgres_database` при поиске дополняется
токеном `postgres` (`resourceBaseSegment`). токеном `postgres` (`resourceBaseSegment`).
- **Предтокенизация**: токены всех 823 документов считаются один раз при загрузке - **Предтокенизация**: токены всех 823 документов считаются один раз при загрузке
@@ -283,3 +302,26 @@ tf_docs (Node.js, кластер nodejsk8s) [orchestrator.js]
6. Один под (replicas=1) — лимиты/кэш не шарятся между репликами (принято в брифе 7.4). 6. Один под (replicas=1) — лимиты/кэш не шарятся между репликами (принято в брифе 7.4).
7. Задержка доминируется LLM; ускоряется стримингом (SSE) или параллелизацией 7. Задержка доминируется LLM; ускоряется стримингом (SSE) или параллелизацией
этапа 1 с поиском (v2). этапа 1 с поиском (v2).
---
## 14. Исправленный инцидент: сборка `nubes-dev`
При публикации dev-документации сборка падала на YAML-ошибке nav:
```
- [DEPRECATED] Публичные IP адреса: ← невалидный YAML
```
**Причина:** генератор `TOOLS/docs-generator/internal/writers/writers.go`
(`WriteNavFragment`) писал `ServiceDisplayName` без кавычек. У `vcexternalip` в
dev имя = `[DEPRECATED] Публичные IP адреса` → ломал парсер.
**Фикс (корень):** в генератор добавлен `yamlScalar()` — заголовки с спецсимволами
(`[ ] : # & *` и др.) кавычатся. Затронул все стенды на будущее.
**Разовый обход:** для немедленной публикации dev строка в
`generated/dev/docs/_nav_fragment.yml` закавычена вручную (файл генерируемый,
перезапишется корректно после фикса генератора).
Коммит фикса: `tf_provider` `322235c`.
+2 -2
View File
@@ -51,7 +51,7 @@ function sleep(ms) { return new Promise((r) => setTimeout(r, ms)); }
async function main() { async function main() {
console.log('Инстанс:', UID, '| операция:', ACTION); console.log('Инстанс:', UID, '| операция:', ACTION);
// 1) Состояние инстанса: доступные операции + текущие params. // 1) Состояние инстанса: доступные операции + текущие params.
const st = await api('GET', `/instances/${UID}`); const st = await api('GET', `/instances/${UID}`);
if (st.status !== 200) { if (st.status !== 200) {
console.error('Ошибка GET /instances:', st.status, st.text.slice(0, 300)); console.error('Ошибка GET /instances:', st.status, st.text.slice(0, 300));
@@ -81,7 +81,7 @@ async function main() {
} }
if (!opUid) opUid = uidFromLocation(created.location); if (!opUid) opUid = uidFromLocation(created.location);
if (!opUid) opUid = created.text.replace(/^"|"$/g, '').trim(); if (!opUid) opUid = created.text.replace(/^"|"$/g, '').trim();
console.log('Создана операция:', created.status, '| opUid:', opUid); console.log('Создана операция:', created.status, '| opUid:', opUid);
if (!opUid || opUid.length < 8) { if (!opUid || opUid.length < 8) {
console.error('Не удалось получить opUid. Ответ:', created.text.slice(0, 300)); console.error('Не удалось получить opUid. Ответ:', created.text.slice(0, 300));
process.exit(1); process.exit(1);