Проблема
TopSec существует, чтобы агрегировать, синхронизировать и визуализировать данные в реальном времени, не опираясь на гигантскую инфраструктуру и не используя стеки, перегруженные для нужд продукта. Бриф был прост в формулировке и труден в исполнении: держать данные живыми, быстрыми и согласованными, пока несколько сервисов разговаривают друг с другом одновременно.
Самое сложное решение
Провести чёткую линию между тем, что живёт в бэкенде .NET 8, и тем, что решается со стороны Next.js. Один тонкий случай сделал эту линию очевидной: маршруты /api плюс middleware next-intl генерировали 307-редиректы на /es/api/*. Технически валидно, на практике сломано. Реалтайм-эндпоинты и stat-эндпоинты молча падали на определённых локалях.
Патч, о котором тебя никто не просит, — это тот, что оправдывает ставку инженера: вместо того чтобы править правила редиректов поштучно, я переписал matcher middleware так, чтобы исключить /api полностью. Маленькое визуальное изменение, огромное архитектурное.
Оптимизировать слишком рано — плохо. Игнорировать производительность с первого дня — хуже.
Рабочий принцип
Другое решение — оставить PostgreSQL единственным источником истины. Для этого продукта согласованность и возможность писать сложные запросы стоили больше любых выигрышей в скорости, которые можно было выжать из NoSQL. «Скучно» — это нормально, когда «скучно» — это правильно.
Что я сломал
Прод однажды лёг, потому что я допустил, что Docker-образ действительно был пересобран. «Новый» код вёл себя как старый. На самом деле виноват был npm ci, который молча падал, потому что отсутствовал package-lock, оставляя билд в неконсистентном состоянии. Я потратил часы на отладку логики приложения для того, что было проблемой пайплайна.
Урок
Не доверяй ни одному деплою, пока своими глазами не убедился, какой именно артефакт реально запущен. SHA образа, хеш контейнера, лог коммита билда при старте. Самая дешёвая минута, которую ты когда-либо потратишь.
Результат
- Стабильная многосервисная архитектура на VPS: бэкенд, фронтенд, Redis, PostgreSQL, nginx — всё скоординировано.
- Большое снижение ошибок маршрутизации и реалтайма после переписывания middleware.
- Время отклика улучшено за счёт точечного кэширования и чистого разделения ответственностей.
- Архитектура готова расти новыми модулями без переписывания ядра.
- Публичная часть: mkir.es. Более глубокие технические разборы — по запросу.