Лабораторные работы по предмету "Технологии сетевого программирования"
Roadmap.track — это веб-приложение для отслеживания дорожных карт и прогресса, разработанное с использованием микросервисной архитектуры. Проект объединяет SPA фронтенд на React, бэкенд на Python FastAPI и специализированный сервис на Java Spring Boot для работы с объектным хранилищем MinIO (S3-совместимое решение). Безопасность взаимодействия между компонентами и доступ пользователей обеспечиваются системой аутентификации на основе JWT (JSON Web Tokens). Все приложение контейнеризировано с помощью Docker для обеспечения согласованного развертывания. Для каждого бэкенд сервиса написана документация OpenAPI/Swagger.
- Фреймворк: React
- Инструмент сборки: Vite
- Язык: JavaScript
- Стилизация: Bootstrap
- Маршрутизация: React Router DOM
- HTTP клиент: Axios
- Состояние/Иконки: React Icons
- Язык: Python 3.13
- Фреймворк: FastAPI
- ORM базы данных: SQLAlchemy
- Миграции: Alembic
- Менеджер пакетов: uv
- Линтинг/Форматирование: Ruff
- Другие ключевые библиотеки:
pydantic: Валидация данныхpython-jose: Работа с JWT токенамиpasslib: Хеширование паролейredis: Кеширование и брокер сообщений
- Язык: Java 17
- Фреймворк: Spring Boot
- Инструмент сборки: Gradle
- Клиент хранилища: MinIO Java SDK
- Ключевые зависимости:
spring-boot-starter-webjjwt(JSON Web Token)springdoc-openapi(Swagger UI)
Проект полностью контейнеризирован, что гарантирует идентичность окружения разработки и продакшена. Каждый сервис (фронтенд, бэкенд, база данных, хранилище) упакован в отдельный контейнер.
- Контейнеризация: Docker
- Оркестрация: Docker Compose
- База данных: PostgreSQL (через драйвер
asyncpgв Python) - Объектное хранилище: MinIO (S3-совместимое)
- Кеш: Redis
Приложение состоит из нескольких взаимодействующих сервисов, определенных в docker-compose.yml:
- Backend (
fastapi_app): Основная логика приложения. Предоставляет REST API, подключается к базе данных PostgreSQL и взаимодействует с Redis. Служит основной точкой входа для операций с данными. - Frontend (
frontend): Клиентское приложение, обслуживаемое через Vite. Использует API бэкенда для отображения данных и управления взаимодействием с пользователем. - Image Service (
minio_img_service): Выделенный сервис для загрузки и получения изображений. Взаимодействует с сервером хранения MinIO. - PostgreSQL (
tcp_labs_db): Система управления реляционными базами данных, хранящая данные приложения. - Redis (
redis): Хранилище структур данных в памяти, используемое для кеширования и, возможно, очередей задач. - MinIO (
minio): Высокопроизводительное объектное хранилище, совместимое с API Amazon S3, используемое для хранения изображений и других статических ресурсов.
- Docker
- Docker Compose
-
Клонирование репозитория:
git clone https://github.com/DmitryDol/tcp_labs.git cd tcp-labs -
Настройка окружения: Убедитесь, что в корневом каталоге есть файл
.env. Вы можете использовать.env.exampleв качестве шаблона.cp .env.example .env
-
Сборка и запуск: Используйте Docker Compose для сборки и запуска всех сервисов.
docker-compose up --build
Эта команда выполнит следующее:
- Соберет образ Python бэкенда.
- Соберет образ Java сервиса изображений.
- Соберет образ Фронтенда.
- Загрузит необходимые образы для Postgres, Redis и MinIO.
- Запустит все контейнеры.
-
При первом запуске необходимо залить аватар пользователя по умолчанию в minio, накатить миграции alembic и по желанию заполнить базу данных тестовыми данными:
Накатить миграции (создать БД)
`` docker compose exec -w /app fastapi_app alembic upgrade head ``
Заполнить бд тестовыми данными
`` docker compose exec fastapi_app uv run fill_database.py ``
После в postman или в Swagger регистрируем пользователя, заливаем в бакет avatars фото, сервер в ответ вернет JSON с новым именем файла (оно меняется на сгенерированное по UUID). Далее вставляем ответ сервера в .env файл в переменную DEFAULT_AVATAR и пересобираем контейнеры
5. Доступ к приложению:
- Фронтенд
- Документация API Бэкенда:
- Консоль MinIO
Фронтенд представляет собой одностраничное приложение (SPA), созданное с помощью React и Vite.
-
src/: Исходный код.api/: Содержит файл, в котором прописана логика API запросов в бэкенд сервисы.assets/: Статические ресурсы (изображения, стили).components/: Переиспользуемые компоненты UI.pages/: Компоненты маршрутов, представляющие полные страницы.App.jsx: Главный компонент приложения.main.jsx: Точка входа.
-
vite.config.js: Конфигурация Vite. -
DockerFile: Докер файл с инструкциями сборки образа.
npm run dev: Запускает сервер разработки.npm run build: Собирает приложение для продакшена.npm run lint: Запускает ESLint для проверки качества кода.
Бэкенд создавался с использованием onion архитектуры.
api/: Содержит определения маршрутов API (роутеры).crud/: Реализует операции создания, чтения, обновления, удаления (CRUD) для моделей базы данных.models.py: Определения моделей базы данных SQLAlchemy.dto.py: Объекты передачи данных (модели Pydantic) для валидации запросов/ответов.services/: Слой бизнес-логики.repositories/: Реализация паттерна доступа к данным.migrations/: Скрипты миграции Alembic для версионирования схемы базы данных.config.py: Конфигурация приложения и управление переменными окружения.database.py: Настройка подключения к базе данных.main.py: Точка входа в приложение.
- Аутентификация: Аутентификация на основе JWT.
- База данных: Поддержка асинхронного PostgreSQL с использованием
asyncpg. - Внедрение зависимостей: Активное использование системы внедрения зависимостей FastAPI.
Приложение Spring Boot, предназначенное для управления изображениями.
- Интеграция с MinIO: Использует MinIO Java SDK для взаимодействия с объектным хранилищем.
- API: Предоставляет эндпоинты для загрузки и получения изображений.
- Безопасность: Включает поддержку JWT (
jjwt) для защиты эндпоинтов. - Документация: Встроенная документация OpenAPI/Swagger.
Проект использует Gradle с Kotlin DSL (build.gradle.kts).
- Обертка:
gradlew(Unix) /gradlew.bat(Windows) предоставляется для легкого запуска без глобальной установки Gradle.