
Овцеводческая CRM, Узбекистан и .NET 10: семь инженерных историй с граблями
AlexMorOR 14 часов назад Овцеводческая CRM, Узбекистан и .NET 10: семь инженерных историй с граблями Средний 15 мин 6.8K .NET * C# * ASP * TypeScript * ReactJS * Туториал Мы делаем QoyHunter — учётную систему для...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. AlexMorOR 14 часов назад Овцеводческая CRM, Узбекистан и . NET 10: семь инженерных историй с граблями Средний 15 мин 6. NET * C# * ASP * TypeScript * ReactJS * Туториал Мы делаем QoyHunter — учётную систему для овцеводческих хозяйств Узбекистана, с витриной животных, доставкой и блогом на соседних поддоменах.
С точки зрения бизнес-логики ничего экзотического: CRM как CRM. Экзотика начинается там, где эта CRM встречается с реальностью рынка. А реальность такая: основной канал пользователей — Telegram, а не браузер; основной язык — не всегда русский (узбекский обязателен, английский — по явному выбору); часовой пояс один (Ташкент, UTC+5, без перехода на летнее время — тоже давало баги, но об этом ниже); а разработка идёт на Windows-ноутбуках без сервера БД под рукой.
Технические детали
Из этих фактов вытекает добрая половина решений ниже. NET 10), фронт на React + Vite, админка на react-admin, всё за nginx в docker compose. Скрыть продукт целиком, а не просто спрятать кнопку в интерфейсеСам продукт ещё не запущен публично: на проде сейчас живут только публичные поверхности — лендинг «скоро открытие» с формой сбора лидов, витрина, доставка и блог.
При этом CRM целиком (учёт, аналитика, финансы) уже написана и задеплоена на тот же самый бэкенд, потому что раскатывать отдельную сборку «без продукта» и потом накатывать вторую «с продуктом» — двойная работа и двойной риск разъехаться. Первая идея была наивной: спрятать соответствующие пункты меню на фронте. Она не выдерживает пяти минут критики — весь API уже стоит на проде, и достаточно открыть DevTools или просто угадать URL, чтобы увидеть, что «скоро» на самом деле уже готово.
Прятать нужно бэкенд, а не фронт. Решили через default-deny middleware: пока включён флаг StubMode, публично доступен только явный allowlist префиксов /api/*, всё остальное возвращает 404 — как будто маршрута не существует вовсе. Ключевое свойство: allowlist явный и короткий, а не блеклист.
Отраслевые последствия
Если завтра кто-то добавит новый контроллер AnimalHealthController, он окажется скрытым автоматически, просто по факту существования флага, — не нужно помнить «а, точно, надо ещё и этот эндпоинт спрятать». // backend/src/QoyHunter. Api/Middleware/StubModeGateMiddleware.
cs private static readonly string AllowedApiPrefixes = [ "/api/public", // публичная конфигурация фронта (StubMode, botUsername, языки) "/api/legal", // публичные юр-документы "/api/client-logs", // приём клиентских ошибок лендинга-заглушки "/api/feedback", // публичная форма обратной связи Этапа 0 "/api/delivery", // второй публичный сервис: заявки на доставку животных "/api/market", // третий публичный сервис: маркет — витрина, породы, заказы "/api/blog", // блог: публичное чтение, комментарии/реакции // …плюс пара служебных префиксов, вырезанных из листинга ]; public async Task InvokeAsync(HttpContext context) { if (!
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





