Проект: PySentry  Публичный пост
28 августа 2025  1479
PySentry
https://github.com/nyudenkov/pysentry

Шалом алейкум! Это мой первый серьезный вклад в опенсорс (не считая коммитов в игрушку Space Station 13).

PySentry - это CLI тулза написанная на Rust, которая берет твой питонячий проект, анализирует зависимости и говорит "вот эти библиотеки уязвимы, обнови". Основная фишка: он в 15-30 раз быстрее существующих решений типа pip-audit, умеет работать с lock файлами (uv.lock, poetry.lock, pylock.toml, Pipfile.lock), поддерживает несколько баз уязвимостей и имеет систему кеширования.

Как появилась идея? Что вдохновило?

Я активно использую uv и решил подумать, чем я могу помочь проекту. Полистал иссуи на гитхабе и нашел фичреквест на добавление команды для аудита. Подумал че б и нет, и сделал им пулл реквест.

Написал рабочий код, тесты пройдены, но мейнтейнеры в итоге сказали, что не могут взять на себя долгосрочную поддержку этой фичи. Потому что большое. Понять их можно.

Но код уже был написан, работал хорошо и поэтому я решил выделить эту фичу в отдельный проект.

Что вошло в прототип и сколько времени на него было потрачено?

От идеи до релиза текущей версии - примерно два месяца.

В тот код, что я пульнул в uv, вошло:

  • Парсинг основных форматов: uv.lock и pyproject.toml
  • Интеграция с PyPA Advisory Database
  • Базовый кеш для хранения уязвимостей

Какой технологический стек вы использовали? Почему?

Rust - основной выбор, вдохновленный успехом uv и ruff. У меня есть опыт с растом с 2016 года, периодически писал всяческие пет-проекты на нём.

Почему не Python? Производительность.

Архитектурные решения:

  • Асинхронное получение данных из баз уязвимостей
  • Кеширование уязвимостей и заивисимостей отдельно
  • Потоковая обработка больших наборов данных

Интеграции:

  • Несколько баз данных уязвимостей: PyPA Advisory, OSV.dev, PyPI JSON API
  • Внешние инструменты для разрешения зависимостей: uv и pip-tools для requirements.txt
  • Форматы вывода: JSON, SARIF, Markdown для разных рабочих процессов

Как вы запускались и искали первых пользователей?

Честно? Почти никак специально не искал. Пользователи приходили сами:

  • Часть нашла проект через мой PR в uv и связанный иссуй (мейнтейнеры дали добро оставить ссылочки)
  • Написал пару твитов, которые получились довольно нелепыми (я плохо их пишу и не разбираюсь в твиттере), они не особо взлетели (но, вастрик, спасибо за репост!)
  • Недавно о проекте рассказали в подкасте PythonBytes

Самый значимый фидбек получил от Jonathan'a Dekhtiar'a из NVIDIA (тимлид TensorFlow-RT и WheelNext) - "Let's just say than in one week since the project got its first release, there is not one mention of pip-audit in any of my projects anywhere. Boom nada gone."

С какими самыми неожиданными трудностями пришлось столкнуться?

Отклонение PRа в uv было не очень приятным. Потратил кучу времени, но в итоге "спасибо, но не будем это поддерживать". Это конечно моя ошибка (моей гиперфиксации и импульсивности), что я не посоветовался с ребятами, окей ли вообще будет взять это в работу. Зато вон, теперь своей опенсорс проектик. Кайфёж.

Из технических:

  • Сборка wheels под винду: до сих пор нет колёс под винду из-за сложностей с компиляцией. Юзерам приходится использовать уже скомпиленные бинары из релиза или устанавливать через cargo.
  • Интеграция резолверов: интеграция с uv и pip-tools оказалась сложнее, чем ожидал. Нужно было обеспечить изолированное выполнение, правильную работу кеша.
  • Performance tuning: казалось бы, Rust = быстро, но пришлось много заниматься оптимизацией: асинхронность, кеширование, использование памяти (которое пока что в процессе оптимизации)

Сколько потратили и заработали? Есть идеи как это можно монетизировать? А заодно планы на будущее.

Потратил: в деньгах - ничего. Человекочасов - около двух месяцев интенсивной разработки в свободное время.

Заработал: $0. Проект полностью опенсорсный и бесплатный.

Планы монетизации: у меня есть план по развитию SaaS модели:

  • CLI останется бесплатным
  • SaaS платформа: real-time мониторинг уязвимостей и в будущем думаю развивать статический анализатор кода (скорее всего тоже в опенсорс), привязывая и тренируя к этому всему нейронки для распознавания/подтверждения уязвимостей.

Но сначала нужно добиться релиза 1.0.0 и получить хорошую узнаваемость в сообществе. Без качественной опенсорсной основы SaaS скорее всего не взлетит.

Нужны ли какие-то советы или помощь Клуба?

Дап! Есть вопросики.

Продуктовые моменты:

  • Кто использует сканеры уязвимостей в своих проектах? Какие проблемы с существующими решениями?
  • Что было бы классно видеть в SaaS решении?

Бизнесовые:

  • Как правильно строить freemium (если это можно так назвать) модель в B2B секурности?
  • Продажи энтерпрайзу
  • Стратегии для прайсинга

Сообщество(нные):

  • Как эффективно рассказывать о подобных продуктах?
  • Какой должен быть подход к маркетингу?
  • Поставите звёздочку, если проект нравится?

Какой совет вы бы сами могли дать идущим по вашим стопам?

Пара наблюдений:

Отказ - это не провал: отклоненный PR в uv стал началом более интересного самостоятельного проекта. Иногда "нет" открывает новые возможности.

Реальные отзывы пользователей > показатели: один отзыв от крутого разраба оказался важнее сотни звездочек на гитхабе (но вы оставляйте <3)


Проект активно развивается, всегда рад фидбеку. GitHub: https://github.com/nyudenkov/pysentry, сайт: https://pysentry.com

25 комментариев 👇

Кстати, а ещё я ищу работу питонистом-бекендером.
У меня 6+ лет опыта, за спиной самые разные проекты и довольно крутой опыт. Посмотреть мою сивишку можно на гитхабе - тык

Maxim Syabro Стартапы, вебдев, фото, техно 26 сентября в 12:23

За проект лайк!

А вот с неймингом кмк получилось не очень.
Мне кажется у всех питонистов при слове "sentry"триггер на https://sentry.io/welcome/

Пока не раскрутились я бы подумал в эту сторону

  Развернуть 1 комментарий
Danil Ineev Программист-универсал 29 августа в 22:04

Проект, наверное, хороший. Но модель монетизации не вижу. Большие конторы используют Mend и подобное, конторы поменьше просто воспользуются вашим сканером напрямую.

Не очень понятно, как привязать анализатор зависимостей к реалтайму. Они всё же меняются только от релиза к релизу.

Так что совет номер один такой: провести анализ конкурентов прежде чем идти в SaaS

  Развернуть 1 комментарий

@Ineev, привет!

Не очень понятно, как привязать анализатор зависимостей к реалтайму. Они всё же меняются только от релиза к релизу.

Флоу следующий:
Загружаешь в клауд (SaaS) манифест зависимостей с каждым их изменением > получаешь уведомление, если появилась новая CVE'шка для какой-то из зависимостей.

Так что совет номер один такой: провести анализ конкурентов прежде чем идти в SaaS

Это безусловно так. Кроме некоторых вещей, моя картинка +- сходится с тем, что происходит у них.
За Mend спасибо, его ещё не замечал, посмотрю. В основном смотрю на Snyk, Safety и ещё пару проектов.

  Развернуть 1 комментарий

@nyudenkov,

Загружаешь в клауд (SaaS) манифест

Ну вот это как раз и не реалтайм. Тогда точно всё уже изобретено до нас. У Tenable ещё похожий продукт был, емнип

  Развернуть 1 комментарий

@Ineev, пардон, а что ты подразумеваешь под реалтайм сканированием, в таком случае? Возможность скана с машины разработчика или на этапе CI/CD никуда не исключается. А так, конечно изобретено. У Snyk и Safety это есть.
Суть в том, как оно дальше будет расширяться с SAST и нейросетями чтобы уменьшать процент false-positive отчетов, и прайсинге, который будет человечнее, чем у конкурентов (как минимум моё решение содержать дешевле, чем тот же CLI Safety). Ну и заточенности под питонячьи проекты, в отличии от конкурентов.

  Развернуть 1 комментарий

pysentry-rs нашел 0 уязвимостей, pip-audit - 4

$ time docker compose run -T --rm web pysentry-rs
PYSENTRY SECURITY AUDIT
=======================

SUMMARY: 131 packages scanned • 0 vulnerable • 0 vulnerabilities found

✓ No vulnerabilities found!
Scan completed 2025-09-03 12:21:17 UTC


💬 Found a bug? Have ideas for improvements? Or maybe PySentry saved you some time?
   I welcome all feedback, suggestions, and collaboration ideas at nikita@pysentry.com

real    0m3,782s
user    0m0,071s
sys 0m0,044s
$ time docker compose run -T --rm web pip-audit
Found 4 known vulnerabilities in 3 packages
Name    Version ID                  Fix Versions
------- ------- ------------------- ------------
aiohttp 3.12.13 GHSA-9548-qrrj-x5pj 3.12.14
urllib3 2.4.0   GHSA-48p4-8xcf-vxj5 2.5.0
urllib3 2.4.0   GHSA-pq67-6m6q-mj2v 2.5.0
uv      0.7.21  GHSA-8qf3-x8v5-2pj8 0.8.6


real    0m22,200s
user    0m0,067s
sys 0m0,048s
  Развернуть 1 комментарий

@ishalyapin, Привет! Попробуй использовать больше источников
--sources osv,pypi,pypa

  Развернуть 1 комментарий

@nyudenkov, так уже лучше, но все равно на 1 меньше

$ time docker compose run -T --rm web pysentry-rs --sources osv,pypi,pypa
[+] Creating 2/2
 ✔ Container bukedo-memcached-1  Running                                                                                      0.0s 
 ✔ Container bukedo-postgres-1   Running                                                                                      0.0s 
Merging vulnerability data from 3 sources...
PYSENTRY SECURITY AUDIT
=======================

SUMMARY: 131 packages scanned • 2 vulnerable • 3 vulnerabilities found

SEVERITY:  3 MEDIUM

FIXABLE: 3 vulnerabilities can be fixed by upgrading packages

VULNERABILITIES
---------------

 1. GHSA-9548-qrrj-x5pj  aiohttp v3.12.13  [MEDIUM] [source: osv,pypi]
     AIOHTTP is vulnerable to HTTP Request/Response Smuggling through incorrect parsing of chunked trailer sections
    → Fix: Upgrade to 3.12.14+

 2. GHSA-48p4-8xcf-vxj5  urllib3 v2.4.0  [MEDIUM] [source: osv,pypi]
    urllib3 does not control redirects in browsers and Node.js
    → Fix: Upgrade to 2.5.0+

 3. GHSA-pq67-6m6q-mj2v  urllib3 v2.4.0  [MEDIUM] [source: osv,pypi]
    urllib3 redirects are not disabled when retries are disabled on PoolManager instantiation
    → Fix: Upgrade to 2.5.0+

FIX SUGGESTIONS
---------------
urllib3: 2.4.0 → 2.5.0 (fixes 2 vulnerabilities)
aiohttp: 3.12.13 → 3.12.14

Scan completed 2025-09-03 12:27:29 UTC


💬 Found a bug? Have ideas for improvements? Or maybe PySentry saved you some time?
   I welcome all feedback, suggestions, and collaboration ideas at nikita@pysentry.com


real	0m4,749s
user	0m0,077s
sys	0m0,053s
  Развернуть 1 комментарий

@ishalyapin, Странное. А сможешь отправить свои зависимости, пожалуйста, чтобы я мог глянуть почему так возникает? Можно на почту которая вон в конце вывода написана

  Развернуть 1 комментарий

@nyudenkov, отправил

  Развернуть 1 комментарий

@ishalyapin, Спасибо, посмотрю!

  Развернуть 1 комментарий

Крутой проект!

Я немного не по делу, но после того как увидел твой Шалом алейкум! пошел смотреть связаны ли шалом и салам, а они блин и правда происходят от одного слова! У меня все.

  Развернуть 1 комментарий

@alexkhismatulin, всё так!

  Развернуть 1 комментарий

@alexkhismatulin, Салам от Тимофея Соломоновича!
(тут скорее всего связи нет, просто абсурда ради)

  Развернуть 1 комментарий

А ещё из прикольных решений (мне это предложил как раз тот чувак из нвидии) - автоматические бенчмарки с каждым релизом и создание actions-ботом ПРа для обновления результатов в репе.
https://github.com/nyudenkov/pysentry/tree/main/benchmarks/results

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

прикольный проект, спасибо :)

возможно, причина по которой ты получил rejected на свой PR в том что они выпустили pyx: https://astral.sh/blog/introducing-pyx

  Развернуть 1 комментарий

@marinegor, привет, спасибо!
Очень вряд ли pyx стал причиной отказа. У меня был вот такой диалог с одним из мейнтейнеров:

[12:56 AM]zanie: Hey! So... in general we don't accept big feature pull requests like that. I'm in the process of adding that to our contributing guide right now explaining our reasoning, because this has been happening more often as we grow in popularity.
[12:56 AM]zanie: The tldr is that we need to design these kinds of features to ensure they're coherent with everything else we're doing / planning to do and external contributors rarely have the context to do so.
[12:57 AM]Flux: whoops
[12:58 AM]zanie: And we're a very small team with a ton of work to do, so it's challenging for us to find the time to do the research and design work around a feature like this just because someone opens a pull request
[12:58 AM]zanie: Not that it's not helpful, like, we might be able to use this as a starting point or maybe it matches what we would actually do and it could move forward.
[12:58 AM]zanie: I just want to set realistic expectations about us reviewing and merging the work
[12:59 AM]zanie: because once we merge it we have to maintain it in perpetuity
  Развернуть 1 комментарий

@nyudenkov, а, так даже проще :)

ну в любом случае, надеюсь что проект будет жить🙏

  Развернуть 1 комментарий

@marinegor, ну, пока что меня драйвит им заниматься - первый взлетевший опенсорс, приятно :D

  Развернуть 1 комментарий

Круто! Держи звезду!

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб