# Анализ проекта: сделано и осталось (2026-09-20) Состояние проекта после трёх доработок: надёжность и безопасность, тесты в контейнере, форматы вывода. Планы и итоги лежат рядом в `docs/`. ## Сделано | Направление | Результат | |---|---| | Токен на `POST /schedule` | Заголовок `X-API-Key`, токен из `RIPE_API_TOKEN`, без токена запись отключена (503). Читающие эндпоинты открыты намеренно. | | TTL записей | `ttl_days` (по умолчанию 90, `0` = бессрочно), `first_seen`/`last_seen`, авто-миграция старых данных. | | Надёжность хранения | Атомарная запись, `flock`, битый JSON переименовывается в `*.corrupt-*`, API отвечает 503. | | Логирование и `/health` | `logging` вместо `print`, `/health` со статусом заданий. | | Агрегация CIDR, `ip_version` | Параметры `aggregate`, `ip_version` в `GET /addresses`; ответ по умолчанию побайтно прежний. | | Форматы вывода | `nftables`, `mikrotik`, `bird`, `frr` (`format`, `name`). Проверены `bird -p` и `nft -c`. | | Тесты | 9 тестов, запуск в контейнере (`Dockerfile.test`). | | Развёртывание | Запуск не от root в systemd и OpenRC (документация в README). | ## Не сделано | Направление | Комментарий | |---|---| | Метрики Prometheus (`/metrics`), алерты | Не начато | | Управление ASN и FQDN через API | Сейчас только CLI | | Diff-эндпоинт (`?since=`), уведомления (webhook, Telegram) | Не начато | | Хранение в SQLite | Не начато | | Разделение сборщика и API на два процесса | Не начато | | Контейнер для самого приложения (Dockerfile, compose) | Не начато | | Форматы `text`, `ipset` | Пользователь не выбрал | ## Остаточные риски | # | Риск | Статус | |---|---|---| | 1 | После порчи файла API отдаёт пустой список, резервной копии нет | Не закрыт | | 2 | Токен только на `POST`, читать список может любой | Осознанный выбор | | 3 | CLI `add`/`remove` меняет конфиг без общей блокировки | Не закрыт | | 4 | Версии в `requirements.txt` не закреплены | Не закрыт | | 5 | Запросы к RIPE без повторов | Не закрыт | | 6 | Нет репозитория git, истории изменений нет | Не закрыт | | 7 | MikroTik и FRR не проверены на реальном ПО | Не закрыт | | 8 | Тесты не покрывают `/health` и параллельную запись | По правилам проекта минимум | Для FRR отдельно проверить: не выдаёт ли `no ip prefix-list ` ошибку, если список ещё не создан. ## Новые наблюдения 1. Реальные `data.json` и `fqdn_data.json` ещё в старом формате (нет блока `seen`). Миграция и TTL заработают после первого запуска сборщика. 2. Невалидные адреса при `aggregate=true` и в форматах пропускаются с предупреждением в логе, клиент об этом не узнаёт. 3. В данных нет версии схемы, что осложнит следующую миграцию (например, на SQLite). 4. `/addresses` читает и разбирает JSON при каждом запросе. Для текущих объёмов это нормально, при росте списков понадобится кэш. ## Рекомендуемый порядок 1. **Гигиена:** `git init` с первым коммитом, закрепление версий (`pip freeze` внутри контейнера), резервная копия `data.json.bak` (риски 1, 4, 6). 2. **Dockerfile и compose для приложения** (продолжение работы с контейнерами). 3. **Управление ASN и FQDN через API с токеном и `/metrics`.** 4. **SQLite и diff/уведомления**, если понадобится история изменений. ## Связанные документы - `plan-reliability-security.md`, `summary-reliability-security.md` - `plan-tests-in-container.md`, `summary-tests-in-container.md` - `plan-output-formats.md`, `summary-output-formats.md`