Монорепозиторий для самых маленьких: как разделить бэкенд и фронтенд для удобного управления проектом
Салимжанов Р.
Разделение бэкенда и фронтенда — ключевой шаг для создания масштабируемых и поддерживаемых приложений. Но как организовать их так, чтобы не запутаться в десятках файлов и сервисов? В этой статье вы узнаете, как использовать монорепозиторий и Docker для изоляции компонентов, упрощения разработки и быстрого развёртывания.
Зачем разделять бэкенд и фронтенд?
Изоляция кода: Бэкенд (логика) и фронтенд (интерфейс) работают независимо.
Масштабируемость: Легко добавлять новые сервисы или обновлять существующие.
Упрощение CI/CD: Каждый компонент можно тестировать и деплоить отдельно.
Но чтобы это работало, важно правильно организовать структуру проекта. Здесь на помощь приходит монорепозиторий. Кстати сразу хочу оговорится, это статья скажем так путеводитель для начинающих. Здесь содержится идея, а не готовый продукт для всего и вся, поэтому помидорами не кидайтесь.
Структура монорепозитория
Монорепозиторий — это единое хранилище для всех частей проекта. Вот как может выглядеть структура для двух приложений (app1 и app2):
Преимущества:
1)Все компоненты в одном месте.
2)Общие библиотеки (например, UI-компоненты) можно использовать в нескольких приложениях.
3)Упрощённая настройка зависимостей.
Настраиваем тестовой бэкенд и фронтенд
Для примера создадим два приложения (app1 и app2), где бэкенд будет возвращать строку, а фронтенд — отображать её. Код будет одинаковым для обоих приложений — разница только в названиях и строках.
1. Бэкенд (Java Spring Boot)
Для app1
Файл: apps/app1/backend/demo/src/main/java/com/example/demo1/HelloController.java
Для app2
Файл: apps/app2/backend/demo/src/main/java/com/example/demo2/HelloController.java
Что здесь происходит?
Каждый бэкенд запускается на своём порту(server.port=8082 - для app1 server.port=8081 - для app2).
По пути /api возвращается уникальная строка для каждого приложения.
А да точно еще следует сделать WebConfig для портов, а то будет возникать ошибка.
2. Фронтенд (React)
Для app1
Файл: apps/app1/frontend/demofront1/src/App.tsx
Для app2
Файл: apps/app2/frontend/demofront/src/App.tsx
Что здесь происходит?
Фронтенд отправляет запрос к /api и отображает ответ бэкенда.
Настраиваем Docker
1. Dockerfile для бэкенда
Для каждого приложения создайте файл Dockerfile в папке бэкенда:
2. Dockerfile для фронтенда
3. Настройка Nginx (nginx.conf)
Для каждого фронтенда создайте файл nginx.conf:
Связываем всё через docker-compose.yml
Чтобы связать все компоненты вашего приложения с помощью Docker Compose, вам нужно создать файл docker-compose.yml. Этот файл обычно размещается в mono-repo/.
Файл: docker-compose.yml
Как это работает?
Каждое приложение работает в своей «паре» (бэкенд + фронтенд).
Сервисы общаются через общую сеть app-network.
Фронтенд app1 доступен на http://localhost:3002 , app2 — на http://localhost:3000.
Запускаем проект
Перейдите в корневую папку (mono-repo).
Выполните:
docker-compose up --build
Проверьте:
app1: http://localhost:3002 → Должно отобразиться:
app2: http://localhost:3000 → Должно отобразиться:
Как это влияет на безопасность
Изоляция контейнеров Каждый сервис работает в своей «песочнице». Даже если злоумышленник взломает фронтенд, он не сможет напрямую получить доступ к данным бэкенда.
Минимальные права Nginx во фронтенде имеет доступ только к статическим файлам, а бэкенд не имеет доступа к файловой системе фронтенда.
Сетевые ограничения Сервисы общаются через внутреннюю сеть Docker, которая недоступна из внешнего мира. Порт бэкенда (8081/8082) открыт только для фронтенда.
Лёгкое обновление Если в одном из компонентов обнаружена уязвимость, можно быстро пересобрать только его контейнер, не затрагивая остальные части системы.
Итог
Используя монорепозиторий и Docker, вы:
Упрощаете разработку — все компоненты под рукой.
Ускоряете деплой — одна команда запускает весь проект.
Повышаете безопасность — изоляция и минимальные права сводят риски к минимуму.
Это как конструктор: каждый модуль на своём месте, а Docker — инструкция по сборке. Начните с малого, и вы быстро освоите этот подход!