mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 09:55:03 +00:00
6.3 KiB
6.3 KiB
AGENT.MD — Правила проекта VESTI
Правило №1: ВСЕ изменения — через OpenSpec
- Любое изменение проекта (багфикс, фича, рефакторинг, конфиг, деплой, docs) оформляется как отдельный change в
/opt/vesti/openspec/changes/<change-name>/. - НЕ начинать правки кода/файлов, пока change не создан и не провалидирован (
openspec validateчисто). Это обязательное требование (у VESTI нет бэкапа — OpenSpec фиксирует состояние и откат). - Сразу после правок — обновить STATUS.md/TODO.md и сделать бэкап (см. «Бэкап» ниже).
- Формат change (как в образцах
tg-crawler-publisher-prototype,publisher-service):.openspec.yaml(schema: spec-driven, created: дата)proposal.md— зачем (проблема пользователя)design.md— как (дизайн, точные правки)tasks.md— чеклист задач; отмечать[x]при выполнении
- CLI
openspec change newНЕ существует → change создаётся вручную (mkdir + файлы по образцу). - Проверка:
openspec validate <change-name>— должно быть чисто. - После подтверждения пользователем change архивируется.
- Не начинать правки кода, пока change не создан и не провалидирован.
Стек и архитектура
- Новостной агрегатор: TG-краулер → классификатор (Ollama qwen3:8b-nothink) → веб-модерация → публикация в Telegram.
vesti-web(FastAPI+Jinja2, :8400, systemd-юнит) --HTTP POST-->publisher-service(FastAPI, Docker-контейнер, :8410) --Bot API (SOCKS5 127.0.0.1:1080)--> Telegram @dedinit_vesti.- БД: SQLite
/opt/vesti/db/vesti.db— открывать с WAL + busy_timeout (иначеdatabase is lockedпри фоновом классификаторе). - Фронтенд: без внешних CDN (никаких unpkg/jsdelivr). Bootstrap локален:
web/static/bootstrap.min.css, htmx запрещён. approve/reject — обычные POST-формы. - Markdown в шаблонах — фильтр
| markdown(XSS-safe: escape → nl2br → sane_lists). Сырой вывод текста запрещён. - Даты в UI — фильтр
| dt→ЧЧ:ММ ДД.ММ.ГГГГ(не ISO[:16]). - Пути бандлов: в БД
published.bundle_pathхранится относительный путь отbundles/(напр.linux/2026-09/slug.md), ссылка в UI/bundle/<rel>. Абсолютные пути запрещены (баг двойного слэша — исправлен).
Секреты и .env
.envв корне (chmod 600). Переменные:ADMIN_USER,ADMIN_PASSWORD(веб-логин),VESTI_BOT_TOKEN,VESTI_BOT_CHANNELS,TG_PROXY,PUBLISHER_URL, api_id/api_hash.- Значения секретов НЕ показывать, НЕ сохранять, НЕ коммитить (пишется только имя переменной).
.env.example— всегда актуализировать при добавлении переменной.
Правила работы
- Не удалять пользовательские файлы. Перезапись/перемещение — только после явного подтверждения пользователя.
- Дедуп постов: sha256(text) + url. Физически ничего не удаляем — только смена
status. - Общение с пользователем — на русском, кратко (статусы), без «всё ок».
- Все ресурсы проекта — в
/opt/vesti(ничего в домашней директории). - Документация проекта: STATUS.md (живой), PRD.md, TODO.md, WALKTHROUGH.md — поддерживать актуальными; при закрытии сессии обновлять.
- Ссылки и доступы к ресурсам (URL/SSH/пути) фиксировать в файлах проекта.
Запуск / проверка
cd /opt/vesti
sudo systemctl restart vesti-web # веб :8400 (0.0.0.0, uvicorn web.app:app)
docker compose -f services/publisher/docker-compose.yml up -d --build # publisher :8410
curl -s http://127.0.0.1:8410/healthz # ok, bot=dedinit_controller_bot, proxy, channels
.venv/bin/python -m crawler.telegram_crawler --all # краулер (инкрементально)
CLASSIFY_TIMEOUT=20 .venv/bin/python -m classifier.classify --db db/vesti.db --limit 200
openspec validate <change-name> # валидация change
- Внешний доступ: https://vesti.nixg.ru (Caddy на VPS02: /opt/caddy/Caddyfile, reverse_proxy 10.8.0.2:8400).
Направления (directions)
linux, tech, politics, games, electronics, llm. Свой канал @dedinit — источник own: true, посты is_own=1, fan-out по направлениям с атрибуцией «Дед в АйТи».
Бэкап (ОБЯЗАТЕЛЬНО, у VESTI нет собственного бэкапа)
- Скрипт:
/opt/vesti/backup.sh(по образцу/opt/icq/backup.sh): архивирует проект →/opt/vesti/backups/vesti_<дата>.tar.gz, копирует на Яндекс.Диск/mnt/yandex-disk/backup/vesti-backups/. - Хранение: локально 7 дней, на ЯД 30 дней (ротация в скрипте).
- Запуск: root cron
45 2 * * *(как у icq). ЯД монтируется автоматически (fstab davfs + @reboot). - После ЛЮБЫХ изменений проекта (или по требованию) — запустить
sudo /opt/vesti/backup.shи проверить, что архив появился в/mnt/yandex-disk/backup/vesti-backups/. - Проверка:
ls -lh /opt/vesti/backups/ | tail -3иls -lh /mnt/yandex-disk/backup/vesti-backups/ | tail -3.