add configs

This commit is contained in:
prixod
2025-10-24 23:55:10 +04:00
parent 6cead15a5f
commit dee93134ae
11 changed files with 648 additions and 45 deletions

237
README.md Normal file
View File

@@ -0,0 +1,237 @@
# LiquidCode Tester
Система автоматической проверки решений задач по программированию (Online Judge) для платформы LiquidCode.
## Архитектура
Проект состоит из трёх основных компонентов:
### 1. Gateway (Шлюз)
- **Технология**: ASP.NET Core Web API
- **Функции**:
- Приём запросов на тестирование через REST API
- Скачивание пакетов задач из Polygon
- Маршрутизация запросов к соответствующим Worker'ам по языку программирования
### 2. Worker (Тестировщик)
- **Технология**: ASP.NET Core Web API + компиляторы языков
- **Функции**:
- Компиляция пользовательского кода
- Запуск в изолированной среде
- Тестирование на наборе тестов
- Контроль ограничений по времени и памяти
- Отправка статусов на callback URL
### 3. Common (Общая библиотека)
- **Технология**: .NET Class Library
- **Функции**: Общие модели данных для Gateway и Worker
## Поддерживаемые языки
- **C++** (текущая реализация)
- Java (планируется)
- Kotlin (планируется)
- C# (планируется)
## Модель данных
### SubmitForTesterModel (запрос на тестирование)
```csharp
public record SubmitForTesterModel(
long Id,
long MissionId,
string Language,
string LanguageVersion,
string SourceCode,
string PackageUrl,
string CallbackUrl
);
```
### TesterResponseModel (результат тестирования)
```csharp
public record TesterResponseModel(
long SubmitId,
State State, // Waiting, Compiling, Testing, Done
ErrorCode ErrorCode, // None, CompileError, RuntimeError, etc.
string Message,
int CurrentTest,
int AmountOfTests
);
```
## Быстрый старт
### Локальная разработка (Docker Compose)
```bash
# Сборка и запуск всех сервисов
docker-compose up --build
# Gateway доступен на http://localhost:8080
# Worker доступен на http://localhost:8081
```
### Разработка без Docker
```bash
# Сборка всего решения
dotnet build
# Запуск Gateway
cd src/LiquidCode.Tester.Gateway
dotnet run
# Запуск Worker (в другом терминале)
cd src/LiquidCode.Tester.Worker
dotnet run
```
## API Endpoints
### Gateway
**POST /api/tester/submit**
```json
{
"id": 123,
"missionId": 456,
"language": "C++",
"languageVersion": "17",
"sourceCode": "#include <iostream>\nint main() { ... }",
"packageUrl": "https://example.com/package.zip",
"callbackUrl": "https://example.com/api/submit/callback"
}
```
**GET /api/tester/health**
- Проверка состояния Gateway
### Worker
**POST /api/test**
- Принимает multipart/form-data с метаданными и ZIP файлом пакета
**GET /api/test/health**
- Проверка состояния Worker
## Процесс тестирования
1. **Приём запроса**: Gateway получает запрос с кодом и URL пакета
2. **Скачивание пакета**: Gateway скачивает Polygon пакет
3. **Маршрутизация**: Gateway отправляет запрос в Worker для нужного языка
4. **Парсинг**: Worker распаковывает и парсит пакет (тесты, лимиты)
5. **Компиляция**: Worker компилирует код (g++ для C++)
6. **Тестирование**: Worker последовательно запускает все тесты
7. **Callback**: Worker отправляет статусы на callback URL на каждом этапе
8. **Cleanup**: Worker удаляет временные файлы
## Изоляция и безопасность
### Текущая реализация
- Процессы запускаются с ограничением по времени
- Контроль памяти через PeakWorkingSet64
- Процессы убиваются при превышении лимитов
### Production рекомендации
- Linux namespaces (PID, network, mount)
- cgroups для контроля CPU и памяти
- seccomp для ограничения системных вызовов
- AppArmor/SELinux профили
- chroot окружение
- Отключение доступа к сети для тестируемого кода
## Деплой в Kubernetes
См. [k8s/README.md](k8s/README.md) для подробной инструкции.
```bash
# Быстрый деплой
kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/configmap.yaml
kubectl apply -f k8s/worker-cpp-deployment.yaml
kubectl apply -f k8s/gateway-deployment.yaml
```
## Конфигурация
### Gateway (appsettings.json)
```json
{
"PackageDownloadDirectory": "/tmp/packages",
"Workers": {
"Cpp": "http://liquidcode-tester-worker-cpp:8080"
}
}
```
### Worker (appsettings.json)
```json
{
"Cpp": {
"Compiler": "g++",
"CompilerFlags": "-O2 -std=c++17 -Wall"
}
}
```
## Структура проекта
```
LiquidCode.Tester/
├── src/
│ ├── LiquidCode.Tester.Common/ # Общие модели
│ │ └── Models/
│ ├── LiquidCode.Tester.Gateway/ # API Gateway
│ │ ├── Controllers/
│ │ ├── Services/
│ │ └── Dockerfile
│ └── LiquidCode.Tester.Worker/ # C++ Worker
│ ├── Controllers/
│ ├── Services/
│ └── Dockerfile
├── k8s/ # Kubernetes манифесты
├── compose.yaml # Docker Compose
└── README.md
```
## Требования
- .NET 9.0 SDK
- Docker & Docker Compose (для контейнеризации)
- g++ (для C++ Worker)
- Kubernetes cluster (для production)
## Расширение на другие языки
Для добавления поддержки нового языка:
1. Создайте новый Worker проект (или расширьте существующий)
2. Реализуйте `ICompilationService` для языка
3. Реализуйте `IExecutionService` для языка
4. Обновите конфигурацию Gateway
5. Создайте Dockerfile с нужным компилятором/runtime
6. Добавьте Kubernetes манифесты
## Разработка
### Структура кода
- **Controllers**: REST API endpoints
- **Services**: Бизнес-логика (компиляция, тестирование, callback)
- **Models**: Модели данных
### Логирование
Используется встроенный ILogger ASP.NET Core.
### Тестирование
```bash
dotnet test
```
## Лицензия
[Укажите лицензию]
## Авторы
LiquidCode Team