Backend API на ASP.NET Core для платформы с миссиями, сабмитами, группами, конкурсами и статьями.
- .NET 8 (
ASP.NET Core Web API) - PostgreSQL +
EntityFramework Core - S3-совместимое хранилище (MinIO/AWS S3)
- JWT-аутентификация
- Swagger/OpenAPI
- xUnit + Testcontainers (интеграционные тесты)
LiquidCode- основной Web API проектLiquidCode.IntegrationTests- интеграционные тестыdocker-compose.yml- локальные сервисы (PostgreSQL, MinIO, опционально PgAdmin)
dotnetSDK 8.0+- Docker + Docker Compose
- Поднять инфраструктуру:
docker compose up -d postgres minio minio-setup- Установить переменные окружения (минимальный набор для локального запуска):
export PG_URI="postgresql://postgres:qwef@localhost:5432/dev-db"
export JWT_ISSUER="liquid"
export JWT_AUDIENCE="audience"
export JWT_SINGING_KEY="supersecretkey_supersecretkey_supersecretkey_supersecretkey"
export S3_ACCESS_KEY="minioadmin"
export S3_SECRET_KEY="minioadmin"
export S3_ENDPOINT="http://localhost:9000"
export S3_PRIVATE_BUCKET="problems"
export S3_PUBLIC_BUCKET="problems-public"
export SERVICE_BASE_URL="http://localhost:8081"
export TESTING_MODULE_URL="http://localhost:8080/"
export SUBMIT_CALLBACK_SECRET="dev-submit-secret"- Применить миграции:
MIGRATE_ONLY=1 dotnet run --project LiquidCode- Запустить API:
dotnet run --project LiquidCode- Swagger UI будет доступен по адресу:
http://localhost:8081/swagger
- Применить миграции:
MIGRATE_ONLY=1 dotnet run --project LiquidCode - Удалить БД:
DROP_DATABASE=1 dotnet run --project LiquidCode
dotnet test LiquidCode.IntegrationTestsТесты поднимают временный PostgreSQL контейнер через Testcontainers.
- Восстановить зависимости:
dotnet restore - Собрать решение:
dotnet build - Запустить все сервисы из compose:
docker compose up -d - Запустить PgAdmin (опционально):
docker compose --profile tools up -d pgadmin
- Конфигурация читается из переменных окружения.
- В
appsettings.Development.jsonесть дефолтные значения для разработки, но для стабильного локального окружения удобнее задавать их явно через env-переменные. - Для локального MinIO имена бакетов должны соответствовать тем, что создаются в
minio-setup(problems,problems-public).