Initial import: vesti.nixg.ru — новостной апрув-проект (web, crawler, classifier, publisher, openspec)

This commit is contained in:
kpa39l
2026-09-13 15:58:32 +00:00
commit c3f59f7b7a
113 changed files with 7065 additions and 0 deletions
@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-09-11
@@ -0,0 +1,27 @@
## Дизайн
### 1. Убрать HTMX (unpkg.com)
`web/templates/candidates.html`:
- Строки 50-65: `<form class="d-inline" method="post" action="/posts/{{ p.id }}/approve" hx-post=... hx-target=... hx-swap=...>` →
`<form class="d-inline" method="post" action="/posts/{{ p.id }}/approve">`. Кнопка остаётся `type="submit"`.
- Строка 66: `<button ... hx-post="/posts/{{ p.id }}/reject" hx-target="..." hx-swap="outerHTML">` →
обернуть в `<form class="d-inline" method="post" action="/posts/{{ p.id }}/reject">` + `<button type="submit">`.
- Убрать все `hx-*` атрибуты по проекту.
### 2. Локализовать Bootstrap
- Скачать: `curl -sL https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css -o web/static/bootstrap.min.css`
- В `base.html` и `login.html` заменить `<link href="https://cdn.jsdelivr.net/...">` →
`<link href="/static/bootstrap.min.css" rel="stylesheet">`.
- FastAPI уже монтирует `/static` (app.mount в web/app.py:27) — STATIC_DIR существует
(`web/static/`), сейчас пустой.
### 3. Проверка
- `grep -rn "unpkg\|jsdelivr\|cdn\." web/` → пусто.
- `curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8400/login` → 200.
- Страница рендерится с локальным CSS (визуально не отличается).
- Approve/reject работают POST-формами (редирект на /published / /candidates?status=rejected).
- network-панель браузера: нет запросов к unpkg.com/jsdelivr.net.
@@ -0,0 +1,38 @@
## Why
Веб-интерфейс VESTI (`web/`) зависит от двух внешних CDN:
- `https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css` (base.html:7, login.html:7)
- `https://unpkg.com/htmx.org@1.9.12` (base.html:8)
При фильтрации/действиях страница ждёт ответа от `unpkg.com` — если CDN недоступен или
замедлен (а в РФ это распространённая проблема), браузер висит в ожидании скрипта.
Это внешняя зависимость, которая не нужна локальному сервису: VESTI работает на bigbox
за Caddy/TLS и не должна зависеть от сторонних доменов. Пользователь явно против ожидания
ответа от `unpkg.com`.
## What Changes
- Убрать `https://unpkg.com/htmx.org@1.9.12` из `web/templates/base.html`.
- Убрать `https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css` из
`web/templates/base.html` и `web/templates/login.html`.
- Отказаться от HTMX: кнопки «Опубликовать»/«Отклонить» перевести с `hx-post` на
обычные `<form method="post">` (полная перезагрузка страницы — приемлемо для прототипа,
снимает зависимость от JS).
- Bootstrap: скачать CSS локально в `web/static/` (или, если критично, минимизировать
использование классов и обойтись собственным минимальным CSS). Рекомендуемый вариант —
локальный файл `web/static/bootstrap.min.css` из той же версии 5.3.3.
- Все ссылки на внешние CDN удалить; в шаблонах не останется ни одного `http(s)://` на
сторонние домены.
- JS в страницах — только свой (если нужен), без `unpkg`/`jsdelivr`/`cdn.*`.
## Impact
- Файлы: `web/templates/base.html`, `web/templates/login.html`, `web/templates/candidates.html`
(замена hx-post на form), возможно `web/templates/published.html`/`metrics.html` (если там
есть hx-атрибуты).
- Добавится `web/static/bootstrap.min.css` (~230 KB).
- Поведение: approve/reject больше не будут ajax-без-перезагрузки, а будут обычными POST
с редиректом. Для прототипа это нормально.
- Снимается зависимость от интернета/CDN при работе веб-UI.
- Rollback: вернуть две строки CDN в base.html + вернуть hx-post — ничего больше не меняется.
@@ -0,0 +1,18 @@
## 1. Локализовать Bootstrap
- [x] 1.1 Скачать `bootstrap@5.3.3/dist/css/bootstrap.min.css` в `web/static/`
- [x] 1.2 Заменить CDN-ссылку на `/static/bootstrap.min.css` в `base.html` и `login.html`
- [x] 1.3 Проверка: страница рендерится с локальным CSS, нет запросов к jsdelivr.net
## 2. Убрать HTMX (unpkg.com)
- [x] 2.1 В `candidates.html` заменить `hx-post` на обычные `<form method="post">` (approve/reject)
- [x] 2.2 Убрать `<script src="https://unpkg.com/htmx.org@1.9.12">` из `base.html`
- [x] 2.3 Убрать все `hx-*` атрибуты из шаблонов (grep подтверждает отсутствие)
- [x] 2.4 Проверка: approve и reject работают полной перезагрузкой (POST + RedirectResponse)
## 3. Итоговая проверка
- [x] 3.1 `grep -rn "unpkg\|jsdelivr\|cdn\." web/` — пусто
- [x] 3.2 В браузере network-панель: 0 внешних доменов (только свой хост и статика)
- [x] 3.3 Полный цикл: фильтр → approve → опубликовано, без ожидания от третьих серверов