63 lines
5.0 KiB
Markdown
63 lines
5.0 KiB
Markdown
# Анализ проекта: сделано и осталось (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 <name>` ошибку, если список ещё не создан.
|
|||
|
|
|
|||
|
|
## Новые наблюдения
|
|||
|
|
|
|||
|
|
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`
|