Перейти к основному содержимому

Инфраструктура

Docker Compose

Локальное окружение поднимается одной командой из корня проекта:

docker-compose up -d

Сервисы

СервисDocker ImageВнешний портНазначение
postgrespostgres:15-alpine45432Основная БД
seaweedfschrislusf/seaweedfs:3.918333 (S3), 8888 (Filer), 9333 (Master)Файловое хранилище
mock-apiСобирается из ./mock-api8010Мок mphone API

Бэкенд, Grafana и Prometheus закомментированы в docker-compose.yml — запускаются вручную через Gradle или IDE.

PostgreSQL

environment:
POSTGRES_DB: dm_shop
POSTGRES_USER: dm_shop_user
POSTGRES_PASSWORD: dm_shop_password
ports:
- "45432:5432"
volumes:
- pgdata:/var/lib/postgresql/data

Нестандартный внешний порт 45432 позволяет не конфликтовать с локальным PostgreSQL.

SeaweedFS

SeaweedFS — распределённое S3-совместимое хранилище. В локальном режиме используется single-node конфигурация:

Master (9333) — координация кластера
Filer (8888) — файловая система поверх Master
S3 API (8333) — S3-совместимый эндпоинт

Конфигурация S3 (infrastructure/seaweedfs/s3-config.json):

{
"identities": [{
"name": "local-dev",
"credentials": [{
"accessKey": "dm_seaweed_access_key",
"secretKey": "dm_seaweed_secret_key"
}],
"actions": ["Read", "Write", "List", "Tagging", "Admin"]
}]
}

Бакет dm-shop-bucket должен существовать при старте бэкенда. Создаётся автоматически S3Config при первом запуске, если S3Client настроен с path-style access (что необходимо для SeaweedFS).

mock-api

FastAPI-сервер, имитирующий mphone API. Собирается из исходников в ./mock-api/:

# Внутри контейнера
uvicorn main:app --host 0.0.0.0 --port 8010

Полезные команды для разработки:

# Заполнить тестовыми данными
curl -X POST http://localhost:8010/dev/seed \
-d '{"mode": "reset"}'

# Добавить товары
curl -X POST http://localhost:8010/dev/seed \
-d '{"mode": "grow", "add_products": 200}'

# Доступные эндпоинты
GET http://localhost:8010/docs # Swagger UI mock-api

Конфигурационные профили Spring Boot

ПрофильФайлКогда используется
local (default)application-local.yamlЛокальная разработка с Docker Compose
remote-testapplication-remote-test.yamlТестирование с реальным mphone

Активный профиль устанавливается через:

SPRING_PROFILES_ACTIVE=local ./gradlew bootRun
# или в application.yaml:
spring.profiles.default: local

Переменные окружения (продакшн)

Все настройки в application.yaml имеют ${ENV_VAR:default} — значения по умолчанию для локальной разработки, переопределяются в продакшн через переменные окружения.

База данных

DB_URL=jdbc:postgresql://db-host:5432/dm_shop
DB_USERNAME=dm_shop_user
DB_PASSWORD=<секрет>

JWT

JWT_SECRET=<64-байтный hex>
JWT_EXPIRATION_MS=86400000

S3 / SeaweedFS

S3_ENDPOINT=http://seaweedfs:8333
S3_ACCESS_KEY=<ключ>
S3_SECRET_KEY=<секрет>
S3_REGION=us-east-1
S3_BUCKET=dm-shop-bucket

mphone API

MPHONE_BASE_URL=https://mphone.su/api
MPHONE_TOKEN=<токен>
MPHONE_USERNAME=<пользователь>
MPHONE_PASSWORD=<пароль>
MPHONE_AUTH_TYPE=BASIC
MPHONE_REQUEST_DELAY_MS=2000

CORS

CORS_ALLOWED_ORIGINS=https://shop.example.com

XML-фид

XML_FEED_URL=https://gbstore.ru/yamarket.xml

Testcontainers (тесты)

Интеграционные тесты используют Testcontainers — автоматически поднимают контейнер PostgreSQL для тестов:

# Требует запущенный Docker
cd back && ./gradlew test

Конфигурация: TestcontainersConfiguration.java — создаёт контейнер postgres:15-alpine, применяет все Liquibase changesets перед запуском тестов.

Моки баз данных не используются: тесты работают с реальным PostgreSQL.

API-документация

Swagger UI доступен при запущенном бэкенде:

http://localhost:8080/swagger-ui.html
http://localhost:8080/v3/api-docs # OpenAPI JSON

Конфигурация через Springdoc (@Tag, @Operation на контроллерах). Эндпоинты /swagger-ui/** и /v3/api-docs/** открыты без авторизации.