mirror of
https://gitverse.ru/kpa39l/openspec-lab.git
synced 2026-09-28 21:05:02 +00:00
Archive grafana-readonly-user: read-only пользователь Grafana (it@vinogorod.ru, Viewer); OSS 11.1 provisioning users не работает — только UI
This commit is contained in:
@@ -1,22 +1,23 @@
|
||||
# OpenSpec Lab — Статус
|
||||
|
||||
Обновлено: 2026-09-08 (сессия: Vinograd WAN мониторинг)
|
||||
Обновлено: 2026-09-08 (сессия: Grafana read-only пользователь)
|
||||
|
||||
## Текущее состояние
|
||||
Лаборатория spec-driven подхода (OpenSpec CLI 1.12.0) для задач настройки инфраструктуры Hermes/homelab. Цикл propose→apply→archive работает; 4 change заархивированы. Tavily-прокси (web_extract) работает end-to-end в forward-режиме (решение по задаче 5: оставить как есть). Локальный экстрактор (trafilatura) написан и протестирован (2.2/2.3 зелёные), change заархивирован. Репозиторий создан на gitverse.ru, main запушен. Новый цикл vinograd-rostelecom-channel-monitoring — заархивирован (ICMP-мониторинг канала Винный город в /opt/monitoring).
|
||||
Лаборатория spec-driven подхода (OpenSpec CLI 1.12.0) для задач настройки инфраструктуры Hermes/homelab. Цикл propose→apply→archive работает; **5 change заархивированы**. Tavily-прокси (web_extract) работает end-to-end в forward-режиме (решение по задаче 5: оставить как есть). Локальный экстрактор (trafilatura) написан и протестирован (2.2/2.3 зелёные), change заархивирован. Репозиторий создан на gitverse.ru, main запушен. ICMP-мониторинг канала «Винный город» заархивирован (в /opt/monitoring). Read-only пользователь Grafana (it@vinogorod.ru, Viewer) добавлен через UI — change заархивирован.
|
||||
|
||||
## Сделано
|
||||
- [x] OpenSpec CLI установлен (npm, 1.12.0), лаба инициализирована с --tools hermes (6 скиллов)
|
||||
- [x] config.yaml с инфраструктурным контекстом (systemd, docker, /opt/<svc>/, gitverse)
|
||||
- [x] change tavily-proxy-setup — ЗААРХИВИРОВАН (delta → specs/web-extract-tavily/spec.md)
|
||||
- [x] web_extract работает: Hermes → 8971 → SOCKS5-туннель → Tavily (HTTP 200, контент Example Domain)
|
||||
- [x] change local-extractor — ЗААРХИВИРОВАН: trafilatura 2.2.0, local-режим в tavily_extract_proxy.py, тесты 2.2/2.3 зелёные (example.com и github через --local; tavily.com — geo-блок из РФ — через --local-socks 127.0.0.1:1080, HTTP 200)
|
||||
- [x] change local-extractor — ЗААРХИВИРОВАН: trafilatura 2.2.0, local-режим в tavily_extract_proxy.py, тесты 2.2/2.3 зелёные
|
||||
- [x] Репозиторий создан на gitverse.ru (kpa39l/openspec-lab), git push -u origin main выполнен
|
||||
- [x] systemd tavily-proxy.service — решение по задаче 5: ОСТАВЛЕН forward-режим (облачный Tavily через туннель) — рабочий провайдер без изменений
|
||||
- [x] change vinograd-rostelecom-channel-monitoring — ЗААРХИВИРОВАН (2026-09-08): ICMP-мониторинг канала «Винный город» (РТК) в /opt/monitoring — blackbox icmp, prometheus job vinograd_wan (30s), алерт VinogradRostelecomDown, дашборд Vinograd WAN. delta → openspec/specs/vinograd-wan-monitoring/spec.md
|
||||
- [x] systemd tavily-proxy.service — решение по задаче 5: ОСТАВЛЕН forward-режим (облачный Tavily через туннель)
|
||||
- [x] change vinograd-rostelecom-channel-monitoring — ЗААРХИВИРОВАН (2026-09-08): ICMP-мониторинг канала «Винный город» в /opt/monitoring, дашборд Vinograd WAN
|
||||
- [x] change grafana-readonly-user — ЗААРХИВИРОВАН (2026-09-08): read-only пользователь Grafana it@vinogorod.ru (role Viewer, пароль 1qazXSW2), создан вручную в UI (OSS 11.1 не умеет provisioning/API create пользователей). delta → openspec/specs/grafana-access-control/spec.md
|
||||
|
||||
## В работе / Следующие шаги
|
||||
- (ничего — все 5 задач закрыты; лаба в стабильном состоянии)
|
||||
- (ничего — все задачи закрыты; лаба стабильна)
|
||||
|
||||
## Как запустить / проверить
|
||||
```bash
|
||||
@@ -24,7 +25,7 @@ cd /opt/hermes/openspec-lab
|
||||
openspec validate # все changes
|
||||
openspec status --change local-extractor
|
||||
# локальный экстрактор (тест)
|
||||
./venv/bin/python .hermes/scripts/tavily_extract_proxy.py --port 8972 --local # путь: /opt/hermes/.hermes/hermes-agent/venv/bin/python
|
||||
./venv/bin/python .hermes/scripts/tavily_extract_proxy.py --port 8972 --local
|
||||
curl -s -X POST http://127.0.0.1:8972/extract -d '{"urls":["https://example.com"]}' -H 'Content-Type: application/json'
|
||||
# рабочий прокси (systemd)
|
||||
systemctl status tavily-proxy # порт 8971, forward через туннель
|
||||
@@ -32,11 +33,12 @@ systemctl status tavily-proxy # порт 8971, forward через туннел
|
||||
|
||||
## Ключевые артефакты
|
||||
- /opt/hermes/openspec-lab/openspec/specs/web-extract-tavily/spec.md — main spec про forward-прокси
|
||||
- /opt/hermes/openspec-lab/openspec/specs/web-extract-local/spec.md — main spec про local-экстрактор (после archive local-extractor)
|
||||
- /opt/hermes/openspec-lab/openspec/changes/archive/2026-09-06-local-extractor/
|
||||
- /opt/hermes/openspec-lab/openspec/specs/web-extract-local/spec.md — main spec про local-экстрактор
|
||||
- /opt/hermes/openspec-lab/openspec/specs/vinograd-wan-monitoring/spec.md — ICMP-мониторинг канала
|
||||
- /opt/hermes/openspec-lab/openspec/specs/grafana-access-control/spec.md — read-only пользователь Grafana
|
||||
- /opt/hermes/openspec-lab/openspec/changes/archive/2026-09-08-grafana-readonly-user/ — архивный change
|
||||
- /opt/hermes/.hermes/scripts/tavily_extract_proxy.py — прокси + local-режим
|
||||
- /etc/systemd/system/tavily-proxy.service — юнит (forward, без изменений)
|
||||
- /opt/hermes/openspec-lab/.hermes/skills/openspec-*/ — Hermes-скиллы OpenSpec
|
||||
- gitverse: https://gitverse.ru/kpa39l/openspec-lab (remote origin: https://kpa39l:<TOKEN>@gitverse.ru/kpa39l/openspec-lab.git)
|
||||
|
||||
## Открытые вопросы
|
||||
|
||||
@@ -4,6 +4,23 @@
|
||||
|
||||
## 2026-09-08
|
||||
|
||||
### Grafana read-only пользователь (it@vinogorod.ru, Viewer) — change grafana-readonly-user
|
||||
|
||||
`openspec new change grafana-readonly-user` → 4 артефакта → validate → archive
|
||||
(delta → openspec/specs/grafana-access-control/spec.md).
|
||||
|
||||
- Задача: добавить read-only пользователя для IT Винограда.
|
||||
- **Главный вывод:** Grafana 11 OSS НЕ поддерживает ни файловое provisioning
|
||||
пользователей (`grafana/provisioning/access-control/users.yml` молча
|
||||
игнорируется — это EE/Cloud `security.provisioning`), ни API-создание
|
||||
(`POST /api/users` → 404). Создание — **только в UI** (Administration →
|
||||
Users → New user, роль Viewer).
|
||||
- Приятный бонус: `POST /api/login` (JSON) даёт 401 даже при верном пароле,
|
||||
а **Basic auth работает** (`curl -u estorozhenko:пароль /api/user` → 200).
|
||||
- Проверено end-to-end: вход it@vinogorod.ru → 200, роль Viewer, `/api/users`
|
||||
→ 403 (read-only), неверный пароль → 401. Пользователь вошёл сам.
|
||||
- git: мониторинг-репо запушен (da1746c, ветка **master** — не main!).
|
||||
|
||||
### Vinograd WAN — ICMP-мониторинг канала «Винный город» (РТК), change в /opt/monitoring
|
||||
|
||||
`openspec new change vinograd-rostelecom-channel-monitoring` → 4 артефакта → validate OK → archive (delta → openspec/specs/vinograd-wan-monitoring/spec.md)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-08
|
||||
@@ -0,0 +1,49 @@
|
||||
# Design: Grafana read-only user — ручное создание (OSS-совместимо)
|
||||
|
||||
## Файлы
|
||||
|
||||
| Файл | Действие | Назначение |
|
||||
|---|---|---|
|
||||
| `/opt/monitoring/grafana-data/grafana.db` | изменяется Grafana при создании пользователя | хранит учётку (UI, не вручную) |
|
||||
| `/opt/monitoring/README.md` | обновить | документация пользователя и роли |
|
||||
| `/opt/monitoring/EXPERIENCE.md` | обновить | вывод: OSS 11.1 не умеет provisioning users |
|
||||
|
||||
Никакие конфиги/провиджеры НЕ меняются.
|
||||
|
||||
## Почему не provisioning
|
||||
|
||||
- `grafana/provisioning/access-control/users.yml` — файловое provisioning
|
||||
пользователей в Grafana 11 OSS **не обрабатывается** (в логах только
|
||||
dashboards/datasources/alerting/plugins; access-control — EE-фича).
|
||||
- API: `POST /api/users` → 404 (OSS), `POST /api/login` → 401 при верном
|
||||
пароле (Basic auth работает, JSON-логин нет). Доступно только создание
|
||||
пользователя в **UI**.
|
||||
|
||||
## Создание в UI
|
||||
|
||||
1. Открыть `http://grafana.nixg.ru` (или `http://127.0.0.1:3001`), войти
|
||||
как `estorozhenko` (admin).
|
||||
2. Administration → Users → **New user**:
|
||||
- Email: `it@vinogorod.ru`
|
||||
- Name: `IT Vinogorod`
|
||||
- Role: `Viewer`
|
||||
- Password: `1qazXSW2` (задать вручную, не отсылать invite)
|
||||
3. Сохранить.
|
||||
|
||||
## Проверка (после создания)
|
||||
|
||||
```bash
|
||||
# 1. логин рабочий
|
||||
curl -s -u 'it@vinogorod.ru:1qazXSW2' http://127.0.0.1:3001/api/user
|
||||
# 2. роль Viewer в орге
|
||||
curl -s -u 'estorozhenko:...' http://127.0.0.1:3001/api/orgs/1/users
|
||||
# 3. read-only: админ-ручка недоступна
|
||||
curl -s -u 'it@vinogorod.ru:1qazXSW2' http://127.0.0.1:3001/api/users # → 403
|
||||
```
|
||||
|
||||
## Риски
|
||||
|
||||
- Слабый пароль `1qazXSW2` (клавиатурная последовательность) на публичной
|
||||
Grafana. Рекомендовать смену или ограничение доступа по IP (caddy/VPN).
|
||||
- Пользователь создаётся вручную — при перезаписи grafana-data потребуется
|
||||
пересоздать. Продублировать в README.
|
||||
@@ -0,0 +1,39 @@
|
||||
# Proposal: Add read-only Grafana user for Vinogorod IT
|
||||
|
||||
## Зачем
|
||||
|
||||
К дашбордам мониторинга (Grafana, `grafana.nixg.ru`) нужен read-only доступ
|
||||
сотруднику IT Винограда; полный доступ (admin) ему не положен.
|
||||
|
||||
- **Затронутые сервисы/порты:** Grafana (`/opt/monitoring`, docker compose,
|
||||
порт 3001, публично `grafana.nixg.ru`).
|
||||
- **Пользователь:** `it@vinogorod.ru`, пароль `1qazXSW2`, роль **Viewer**.
|
||||
|
||||
## Что
|
||||
|
||||
Grafana **OSS 11.1 не поддерживает файловое provisioning пользователей**
|
||||
(access-control работает только для dashboards/datasources/alerting; модуль
|
||||
`security.provisioning` — EE/Cloud). Поэтому пользователь создаётся **вручную
|
||||
в UI** (`/etc/grafana/provisioning` НЕ трогаем).
|
||||
|
||||
Шаги:
|
||||
1. Войти в Grafana как admin (`http:// grafana.nixg.ru`, логин estorozhenko).
|
||||
2. Administration → Users → Invite/New user:
|
||||
- Email: `it@vinogorod.ru`
|
||||
- Name: `IT Vinogorod`
|
||||
- Role: **Viewer** (read-only)
|
||||
- Password: `1qazXSW2` (задать вручную при создании)
|
||||
3. Убедиться, что роль Viewer (не Admin, не Editor).
|
||||
|
||||
## Rollback
|
||||
|
||||
1. Grafana → Administration → Users → `it@vinogorod.ru` → Delete.
|
||||
2. Никаких файлов конфигов не менялось — откат не требуется.
|
||||
3. Пароль при необходимости сменить (Administration → Users → Edit).
|
||||
|
||||
## Примечание
|
||||
|
||||
- Пароль `1qazXSW2` слабый (клавиатурный); Grafana публична. Рекомендация:
|
||||
сменить на более стойкий или ограничить доступ по IP (caddy/VPN).
|
||||
- Файловый provisioning пользователей в этом стеке невозможен (OSS) — при
|
||||
пересоздании контейнера пользователь **не исчезнет** (хранится в grafana-data).
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
# Delta for grafana access control
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Read-only Grafana user for Vinogorod IT
|
||||
|
||||
Grafana MUST provide a read-only account for the Vinogorod IT department:
|
||||
login `it@vinogorod.ru`, role `Viewer`, in the default organization (orgId 1).
|
||||
The account MUST NOT be able to create, edit, or delete dashboards,
|
||||
datasources, or settings.
|
||||
|
||||
#### Scenario: User exists with Viewer role
|
||||
- GIVEN the admin has created the user `it@vinogorod.ru` in the Grafana UI
|
||||
- WHEN the user logs in with the shared password
|
||||
- THEN authentication succeeds (Basic auth `/api/user` → HTTP 200)
|
||||
- AND the organization role is `Viewer` (`/api/orgs/1/users` → role "Viewer")
|
||||
|
||||
#### Scenario: Unknown credentials rejected
|
||||
- GIVEN the read-only user `it@vinogorod.ru`
|
||||
- WHEN a request is made with a wrong password
|
||||
- THEN the API returns HTTP 401
|
||||
|
||||
#### Scenario: Read-only enforced
|
||||
- GIVEN the user `it@vinogorod.ru` is logged in as `Viewer`
|
||||
- WHEN the user attempts a privileged operation (e.g. `POST /api/users`,
|
||||
modify datasources)
|
||||
- THEN the request is rejected (HTTP 403/404)
|
||||
|
||||
### Requirement: No admin rights for IT user
|
||||
|
||||
The IT read-only account MUST NOT have admin or editor rights; only viewing
|
||||
of dashboards and logs is permitted.
|
||||
|
||||
#### Scenario: Role is not elevated
|
||||
- GIVEN the user `it@vinogorod.ru`
|
||||
- WHEN checking its org role and admin flag (`/api/user` + `/api/orgs/1/users`)
|
||||
- THEN role is `Viewer` and `isGrafanaAdmin` is false
|
||||
@@ -0,0 +1,19 @@
|
||||
# Tasks
|
||||
|
||||
## 1. Создание пользователя в UI Grafana (вручную, пользователь)
|
||||
- [x] 1.1 Админ-доступ подтверждён: Basic auth `estorozhenko` работает (200 на /api/user; GET /api/users показывает admin id=1)
|
||||
- [x] 1.2 Проверка невозможности API-создания: `POST /api/users` → 404 (OSS 11.1 не даёт create через API)
|
||||
- [x] 1.3 Создать `it@vinogorod.ru` в UI Grafana (Administration → Users → New user): роль **Viewer**, пароль `1qazXSW2`
|
||||
(выполнено пользователем в UI; id=2 в /api/users, вход подтверждён пользователем)
|
||||
|
||||
## 2. Проверка созданного пользователя
|
||||
- [x] 2.1 `curl -s -u it@vinogorod.ru:1qazXSW2 http://127.0.0.1:3001/api/user` → 200, login=it@vinogorod.ru
|
||||
- [x] 2.2 Роль: в `/api/orgs/1/users` (admin) → `it@vinogorod.ru` role=`Viewer`, disabled=false
|
||||
- [x] 2.3 Негатив: неверный пароль → 401
|
||||
- [x] 2.4 Read-only: API `/api/users` с токеном it@vinogorod.ru → 403 (additional permissions)
|
||||
|
||||
## 3. Документация и git
|
||||
- [x] 3.1 Обновить `/opt/monitoring/README.md` (пользователь it@vinogorod.ru, Viewer, пароль у пользователя)
|
||||
- [x] 3.2 Запись в `/opt/monitoring/EXPERIENCE.md` (OSS 11.1: provisioning users не работает; API create → 404; только UI)
|
||||
- [x] 3.3 `git add` (поимённо) + commit + push в gitverse (истина) — da1746c в master
|
||||
- [ ] 3.4 `openspec validate grafana-readonly-user` + `openspec archive --yes` + STATUS/WALKTHROUGH
|
||||
@@ -0,0 +1,40 @@
|
||||
# grafana-access-control Specification
|
||||
|
||||
## Purpose
|
||||
TBD - created by archiving change grafana-readonly-user. Update Purpose after archive.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: Read-only Grafana user for Vinogorod IT
|
||||
|
||||
Grafana MUST provide a read-only account for the Vinogorod IT department:
|
||||
login `it@vinogorod.ru`, role `Viewer`, in the default organization (orgId 1).
|
||||
The account MUST NOT be able to create, edit, or delete dashboards,
|
||||
datasources, or settings.
|
||||
|
||||
#### Scenario: User exists with Viewer role
|
||||
- GIVEN the admin has created the user `it@vinogorod.ru` in the Grafana UI
|
||||
- WHEN the user logs in with the shared password
|
||||
- THEN authentication succeeds (Basic auth `/api/user` → HTTP 200)
|
||||
- AND the organization role is `Viewer` (`/api/orgs/1/users` → role "Viewer")
|
||||
|
||||
#### Scenario: Unknown credentials rejected
|
||||
- GIVEN the read-only user `it@vinogorod.ru`
|
||||
- WHEN a request is made with a wrong password
|
||||
- THEN the API returns HTTP 401
|
||||
|
||||
#### Scenario: Read-only enforced
|
||||
- GIVEN the user `it@vinogorod.ru` is logged in as `Viewer`
|
||||
- WHEN the user attempts a privileged operation (e.g. `POST /api/users`,
|
||||
modify datasources)
|
||||
- THEN the request is rejected (HTTP 403/404)
|
||||
|
||||
### Requirement: No admin rights for IT user
|
||||
|
||||
The IT read-only account MUST NOT have admin or editor rights; only viewing
|
||||
of dashboards and logs is permitted.
|
||||
|
||||
#### Scenario: Role is not elevated
|
||||
- GIVEN the user `it@vinogorod.ru`
|
||||
- WHEN checking its org role and admin flag (`/api/user` + `/api/orgs/1/users`)
|
||||
- THEN role is `Viewer` and `isGrafanaAdmin` is false
|
||||
Reference in New Issue
Block a user