Инфраструктура
Docker Compose
Локальное окружение поднимается одной командой из корня проекта:
docker-compose up -d
Сервисы
| Сервис | Docker Image | Внешний порт | Назначение |
|---|---|---|---|
| postgres | postgres:15-alpine | 45432 | Основная БД |
| seaweedfs | chrislusf/seaweedfs:3.91 | 8333 (S3), 8888 (Filer), 9333 (Master) | Файловое хранилище |
| mock-api | Собирается из ./mock-api | 8010 | Мок 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-test | application-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/** открыты без авторизации.