Collector daemon, FastAPI server (addresses, diff, collect, sources), SQLite storage with change journal, Docker Compose deployment, tests, documentation and project rules. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.3 KiB
3.3 KiB
Итоги: POST /collect (немедленный сбор)
План: docs/plan-collect-endpoint.md. Результат анализа сохранён отдельно: docs/analysis-2026-09-21.md.
Сделано
POST /collect(api_server.py, токенX-API-Key): тело необязательно (type:asn/fqdn/all, по умолчаниюall), ответ202. Если демон не жив (нет свежего heartbeat), ответ503и запрос не ставится в очередь.- Передача запроса демону (
cidr_collector.py):request_collection/pop_collection_requestsчерез файлcollect_request.jsonвDATA_DIR(атомарная запись под блокировкой); повторные запросы объединяются. - Демон (
collector_daemon.py): заданиеcheck_collect_requestsкаждые 5 с ставит разовые задания<type>_manual; на каждый тип один запуск за раз (наложение планового и ручного сбора пропускается с записью в лог); вstatus.jsonдобавленыrunningиlast_finished; служебные запуски опроса скрыты из лога. /health: общий помощникcollector_state()(используется и/collect), в заданиях новые поля.- README: описание эндпоинта,
/health, логика планировщика;collect_request.jsonв.gitignore/.dockerignore. - Тесты: 2 новых (API
/collect; демон ставит задания и пропускает наложение). Всего 16, в контейнере 16 passed.
Проверка
- Отдельные процессы на копии данных (расписание
0 4 * * *, чтобы плановых запусков не было): без демона503;POST /collect {"type":"asn"}запустил сбор через ~1 с (24 -> 42 CIDR),/healthпоказалrunning: true, затемlast_finished; два быстрых запроса дали один запуск; запрос без тела запустилasnиfqdn. - Docker Compose (API и демон в разных контейнерах, общий том): запрос принят, сбор выполнен, данные сохранены в
/data/ripe.db, оба сервисаhealthy; стенд убран.
Замечания
- Сбор стартует не мгновенно, а в пределах 5 секунд (интервал опроса демона).
- Любой владелец токена может запускать сбор без ограничения частоты; повторные запросы во время идущего сбора пропускаются, но защиты от частых запросов к RIPE нет.
- Ручной сбор не сбрасывает и не сдвигает расписание.
POST /collectне ждёт результата: итог виден в/health(last_errorпоказывает только исключение сбора, но не сбои отдельных источников - это остаётся в списке улучшений).