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.4 KiB
3.4 KiB
План: POST /collect (немедленный сбор)
Цель
После добавления источника (или по необходимости) запускать сбор сразу, не дожидаясь расписания. API и сборщик - разные процессы, поэтому API не собирает сам, а передаёт демону запрос через файл.
Дизайн
POST /collect(токенX-API-Key), тело необязательно:{"type": "asn" | "fqdn" | "all"}, по умолчаниюall. Ответ202с перечнем запрошенных типов; ход выполнения видно вGET /health.- Если демон не жив (heartbeat старше 120 с или его не было), API отвечает
503, запрос не ставится в очередь «в пустоту». - Запрос передаётся файлом
collect_request.jsonвDATA_DIR(запись атомарная, под блокировкой): повторныеPOSTобъединяются (типы складываются), лишних сборов не будет. - Демон: задание
check_collect_requestsкаждые 5 секунд (TRIGGER_POLL_INTERVAL) забирает и удаляет файл и ставит разовое задание<type>_manual(не блокирует опрос). - Защита от наложения: на каждый тип один запуск за раз (неблокирующая блокировка в
run_job); если такой сбор уже идёт (по расписанию или ручной), повторный запуск пропускается с записью в лог. status.json: для каждого задания добавляютсяrunningиlast_finished, чтобы клиент мог дождаться завершения через/health.
Изменения
cidr_collector.py:COLLECT_REQUEST_FILE,TRIGGER_POLL_INTERVAL,request_collection(types),pop_collection_requests().collector_daemon.py: блокировки запусков, поляrunning/last_finished,check_collect_requests(scheduler), регистрация задания вbuild_scheduler.api_server.py: общий помощник состояния демона (используется/healthи/collect), эндпоинтPOST /collect.README.md: описание эндпоинта, поля/health;.gitignore/.dockerignore:collect_request.json.- Тесты (2): API (401 без ключа, 503 без демона, 202 с объединением типов, 422 на неверный тип); демон (запрос превращается в разовые задания, файл удалён, повторный вызов ничего не делает).
Проверка
Тесты в контейнере; вручную на копии данных: демон и API отдельными процессами с редким расписанием, POST /collect запускает сбор за несколько секунд, /health показывает running и last_finished; при остановленном демоне 503; два быстрых запроса дают один сбор; проверка в Docker Compose (общий том).