FastAPI-сервис для автоматического обнаружения секретов в репозиториях с использованием машинного обучения.
Сервис предназначен для сканирования репозиториев на предмет утечек секретов (API ключи, пароли, токены и т.д.). Поддерживает работу с GitHub и Azure DevOps, обеспечивает высокую производительность за счет multiproccess архитектуры.
Для работы сервиса требуется поднятый Redis. Самый простой вариант поднять docker:
docker run -d --name my-redis -p 6379:6379 redis:7 redis-server --maxmemory 256mb --maxmemory-policy allkeys-lruСистема использует Redis-based архитектуру с отдельными worker процессами для обработки задач сканирования кода. Основные компоненты:
- FastAPI сервер - HTTP API для приема запросов
- Redis - очередь задач и хранилище состояний
- Worker процессы - выполнение задач сканирования
- Admin API - управление воркерами и мониторинг
POST /scan
POST /multi_scan
POST /local_scan
Этапы обработки запроса:
- Валидация API ключа
- Проверка заполненности очереди (лимит:
MAX_WORKERS * 3) - Валидация существования
ref/branchв репозитории (для remote сканирования) - Резолв
commitизref - Создание задачи в
Redisс приоритетом
{
"task_id": "task-abc12345",
"status": "pending",
"project_name": "MyProject",
"repo_url": "https://github.com/user/repo",
"commit": "a1b2c3d4...",
"ref": "main",
"ref_type": "branch",
"callback_url": "https://callback.example.com",
"task_type": "scan|local_scan|multi_scan",
"created_at": 1234567890,
"timeout_at": 1234569690,
"priority": 1,
"original_data": {...}
}Redis структуры:
tasks:queue- Sorted Set с приоритетами (score = priority * 1000000 + timestamp)tasks:all- Hash со всеми данными задачindex:tasks:{status}- Sets для быстрого поиска по статусам
Приоритеты:
1- обычные scan запросы2- задачи из multi_scan (пониженный приоритет)
worker_main(worker_id) ->
├── register_worker() # Регистрация в Redis
├── heartbeat_loop() # Фоновые heartbeat'ы
└── main_loop() # Основной цикл обработкиpending -> downloading -> unpacking -> scanning -> ml_validation -> completed/failed
pending- задача в очередиdownloading- скачивание репозиторияunpacking- распаковка архиваscanning- сканирование правиламиml_validation- ML проверка результатовcompleted- отправка результатов на callbackfailed- ошибка на любом этапе
Для обеспечения консистентности используются Lua скрипты:
- pop_task() - атомарное получение задачи воркером
- update_task_status() - обновление статуса с индексами
- retry_task() - возврат failed задачи в очередь
background_maintenance():
├── timeout_check() # Проверка просроченных задач
├── worker_health() # Проверка статусов воркеров
└── cleanup_tasks() # Удаление старых задачheartbeat_thread():
├── update_worker_heartbeat() # Обновление last_heartbeat
├── check_worker_commands() # Проверка команд (pause/shutdown)
└── cleanup_temp_files() # Очистка временных файловGET /admin/workers # Список всех воркеров
POST /admin/workers/add # Добавить воркер (с проверкой MAX_WORKERS)
POST /admin/workers/{id}/stop # Graceful shutdown
POST /admin/workers/{id}/kill # Force terminate
POST /admin/workers/{id}/pause # Приостановить обработку
POST /admin/workers/{id}/resume # Возобновить обработкуКоманды передаются через Redis ключи worker_commands:{worker_id}:
shutdown- graceful остановкаpause- прекратить брать новые задачиresume- возобновить обработку
# Тип хаба и сетевые настройки
HubType='Azure' # Azure | GitHub - тип репозитория
HOST='127.0.0.1' # Хост сервиса
PORT='8001' # Порт сервиса
REDIS_URL='redis://127.0.0.1:6379' # URL до поднятого Redis
TEMP_DIR='tmp/' # Папка для распаковки архивов (автоудаление)API_KEY='***' # API ключ для доступа к сервису
ADMIN_API_KEY='***' # Ключ для /admin эндпоинтов (X-API-Key)
LOGIN_KEY='***' # Ключ шифрования логина NTLM Auth
PASSWORD_KEY='***' # Ключ шифрования пароля NTLM Auth
PAT_KEY='***' # Ключ шифрования PAT токенаMAX_WORKERS='10' # Максимальное количество воркеров
STARTUP_WORKERS='2' # Воркеров при старте сервиса
VALIDATION_THREADS_NUMBER='5' # Потоки для валидации запросов в main.py# Задачи и их жизненный цикл
TASK_TIMEOUT_SECONDS='1800' # Таймаут задач (30 минут)
TASK_RETENTION_DAYS='7' # Срок хранения завершенных задач
WORKER_HEARTBEAT_INTERVAL='20' # Интервал heartbeat воркеров
# Background процессы maintenance
CLEANUP_INTERVAL_SECONDS='600' # Очистка зависших/старых задач (10 мин)
TIMEOUT_CHECK_INTERVAL='120' # Проверка таймаутов задач (2 мин)
WORKER_CHECK_INTERVAL='240' # Проверка состояния воркеров (4 мин)python run.py