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
Итоги: контейнер для приложения
План: docs/plan-app-container.md.
Сделано
Dockerfile:python:3.11-slim, зависимости отдельным слоем, копируются только рабочие файлы, пользовательripe(uid 10001),VOLUME /data,CMDв exec-форме (uvicorn).docker-compose.yml: сервисыapi(порт${API_PORT:-8000}, токен из.env) иcollector(collector_daemon.py,stop_grace_period: 60s), общий томripe_data,read_only,tmpfs /tmp,cap_drop: ALL,no-new-privileges, ротация логов, healthcheck обоих сервисов,TZдля расписания.healthcheck.py:api(GET/health, 200) иcollector(heartbeat вstatus.jsonмоложеSTATUS_STALE_AFTER).- Код:
RIPE_DATA_DIR(cidr_collector.DATA_DIR) для путей данных иLOCK_FILEдемона; без переменной поведение прежнее. .env.example,.envв.gitignoreи.dockerignore; README, раздел 8 (запуск, настройки, миграция данных, эксплуатация, риски).
Проверка (стенд в scratchpad, реальные данные не менялись)
- Регрессия: 13 тестов в
Dockerfile.testпроходят. docker compose up -d: оба сервисаhealthyчерез ~45 с.- Миграция копий данных в том по инструкции: API видит те же адреса (24 CIDR), после
down/up -dданные на месте. /health:collector_alive: true; POST без ключа 401, с ключом 201;format=nftablesработает.- Пользователь в контейнере
uid=10001, запись вне/dataдаётRead-only file system;TZ=Europe/Moscowприменился. - Демон в контейнере выполнил плановый сбор (
CIDR data saved to /data/data.json). docker compose stop collector: штатное завершение за 1 с, через ~2 минуты/health=degraded,collector_alive: false.- После проверки удалены тестовые контейнеры, том и образы.
Замечания
- Порт публикуется наружу без TLS (решение пользователя): токен идёт открытым текстом.
- Файлы
config.jsonиstatus.json, записанные сервисами, получают режим 600 (создаются черезmkstemp); оба сервиса работают под одним пользователем, но сторонние читатели тома этих файлов не прочитают. - Зависимости в образе не закреплены (риск воспроизводимости сборки).
- Строка
google.comв текущих данных не входит в конфигурацию и будет стареть по TTL (актуально и при миграции в том). - Для миграции нужно знать имя тома
<проект>_ripe_data(docker volume ls), в README это описано.