Студент vs Мікросервіси: Як я поєднав NestJS та Python, щоб не писати черговий інтернет-магазин
Всім привіт! Мене звати Богдан, мені 18 років, і я студент Львівської Політехніки.
Поки мої одногрупники здавали лабораторні, я вирішив піти складнішим шляхом. Замість того, щоб писати черговий To-Do List чи інтернет-магазин на React (яких і так мільйон), я захотів розібратися, як будуються справжні, масштабовані системи.
Я поставив собі челендж: створити платформу SkillSwapAI — сервіс для обміну навичками та пошуку менторів, де «під капотом» працює повноцінна мікросервісна архітектура.
Спойлер: це було боляче, я витратив усю стипендію на сервери, але воно того варте.
Чому я обрав такий стек?
Я міг би написати все на Node.js. Але Python — це стандарт для AI. Я хотів використати найкращі інструменти для кожної задачі:
- Frontend: Next.js 14 (App Router) — для SEO та зручного рендерингу.
- Core Backend: NestJS — для стабільності, типізації та чіткої структури (модулі, гарди, DI).
- AI Engine: Python (FastAPI) — окремий мікросервіс для генерації персональних планів навчання та рекомендацій скілів (інтеграція з OpenAI).
- Infrastructure: Docker, Docker Compose, AWS S3 (для файлів), PostgreSQL (Neon.tech).
Архітектура: Як це працює

Основна ідея в розподілі відповідальності:
- Клієнт (Next.js) відправляє запити на API Gateway (NestJS).
- NestJS обробляє бізнес-логіку (автентифікація, робота з базою).
- Якщо користувачу потрібен план навчання або рекомендація, NestJS робить внутрішній запит до Python-сервісу.
- Python обробляє дані, звертається до OpenAI і повертає результат.
- Всі файли (аватарки) завантажуються прямо в AWS S3, щоб не забивати контейнери.
Головний біль: Real-time та WebSockets
Найбільшим викликом став реал-тайм чат. Здавалося б, просто підключи Socket.io і все. Але синхронізувати стан між клієнтом і сервером виявилося складніше.
Я зіткнувся з класичним Race Condition: повідомлення відправлялося швидше, ніж встановлювалося стабільне з’єднання сокета при першому завантаженні. Іноді доводилося оновлювати сторінку, щоб побачити історію. Довелося глибоко закопатися в життєвий цикл Socket.io та React useEffect, щоб зрозуміти, як правильно ініціалізувати з’єднання і обробляти події.
Що в результаті?
Зараз проект задеплоєний і працює (хоч і в стадії MVP).
Це був шалений досвід, який навчив мене думати не функціями («як написати цикл»), а системами («як один сервіс поговорить з іншим, якщо один з них впаде»).
Я продовжую вдосконалювати код (планую додати черги повідомлень через Redis) і паралельно шукаю свою першу команду (Junior Full-Stack), де зможу рости далі як інженер.
Якщо вам цікаво глянути код, покритикувати архітектуру або дати пораду — буду дуже вдячний!
👉 GitHub: github.com/3cgbdg/SkillSwapAI
👉 Відео-демо роботи (5 хв): www.loom.com/...6dc9c42b580b802bd0dc3c7ed
Дякую, що дочитали! Буду радий фідбеку в коментарях.

10 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів