Files
ripe-cidr-collector/docs/summary-process-split.md
T
ayurishchevandClaude Sonnet 5 bcf8156085 Initial commit: RIPE CIDR/FQDN collector
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>
2026-09-21 07:29:38 +03:00

3.1 KiB

Итоги: разделение сборщика и API на два процесса

План: docs/plan-process-split.md. Часть B (управление ASN/FQDN через API) не реализована, план: docs/plan-asn-fqdn-api.md.

Сделано

  • collector_daemon.py (новый): отдельный процесс с BlockingScheduler. Расписание берёт из config.json, раз в 30 с сверяет его и перепланирует задания без перезапуска (невалидный cron игнорируется). Пишет status.json (состояние заданий и heartbeat). Один экземпляр гарантируется блокировкой collector.daemon.lock. По SIGTERM завершается штатно после текущего сбора.
  • api_server.py: планировщик, lifespan и состояние заданий удалены. POST /schedule только валидирует cron и пишет конфиг (в ответе applied_within_seconds). GET /health читает status.json: collector_alive (heartbeat моложе 120 с), задания, счётчики; без демона status = degraded.
  • storage.py: try_lock (неблокирующая блокировка для singleton). cidr_collector.py: STATUS_FILE, SYNC_INTERVAL, STATUS_STALE_AFTER.
  • README: два сервиса (systemd и OpenRC), примечание об обновлении, переписаны «Scheduler Logic» и описание /health; cron оставлен как альтернатива демону. status.json добавлен в .gitignore и .dockerignore.
  • Тесты: tests/test_daemon.py (2 теста: перепланирование и heartbeat в /health). Всего 11, в контейнере: 11 passed.

Проверка (два реальных процесса на копии данных)

  • Сбор идёт демоном без участия API; /health: ok, collector_alive: true.
  • Второй запуск демона завершается с ошибкой singleton (exit 1).
  • POST /schedule (*/1 -> */2): демон перепланировал задание через 19 с, /health показал новый cron.
  • Перезапуск API не повлиял на демон.
  • SIGTERM: демон остановился штатно.
  • Через ~130 с после остановки: status = degraded, collector_alive = false.

Замечания

  • Обязательное действие при обновлении: нужно запустить сервис ripe-collector, одного ripe-api больше недостаточно.
  • Изменение расписания применяется с задержкой до 30 с.
  • Демон пишет status.json каждые 30 с (маленький файл, атомарная запись).
  • Реальные data.json, fqdn_data.json, config.json не менялись.