Бэкенд платформы Picrete: API, фоновые воркеры OCR/LLM/авто-сабмита и Telegram-бот для загрузки фото в активные работы.
- Мультикурсовая модель (
/courses/:course_id/...) с изоляцией данных по курсу. - Роли на membership-уровне:
teacher,student(+ platform admin). - Работы
controlиhomework, попытки, тайминги, дедлайны. - OCR + OCR review + LLM precheck pipeline.
- Единая загрузка изображений на сессию:
- без привязки к номеру задачи,
- immediate upload в S3 + БД,
- серверный
order_index(клиентскийorder_indexигнорируется), GET /sessions/:session_id/images,DELETE /sessions/:session_id/images/:image_id.
- Серверный fail-safe авто-сабмит просроченных активных сессий (worker цикл каждые 30 секунд).
- Telegram-бот:
- логин по Picrete username/password,
- выбор уже начатой на сайте активной работы,
- загрузка фото в ту же
submission_imagespipeline (upload_source=telegram).
В репозитории 3 исполняемых процесса:
picrete-rust— HTTP API.picrete-worker— OCR/LLM/background maintenance.picrete-telegram-bot— Telegram polling bot.
Все 3 используют общий Settings::load() и общую валидацию конфига.
- Rust, Axum, Tokio
- PostgreSQL + SQLx
- Redis
- S3-compatible object storage
- OpenAI-compatible API
- DataLab OCR API
cp .env.example .envМинимум для полноценной работы API/worker/bot:
- DB:
POSTGRES_*илиDATABASE_URL - Redis:
REDIS_* - Security:
SECRET_KEY - S3:
S3_* - AI:
OPENAI_API_KEY,OPENAI_BASE_URL - OCR:
DATALAB_API_KEY,DATALAB_BASE_URL - Bootstrap admin:
FIRST_SUPERUSER_USERNAME,FIRST_SUPERUSER_PASSWORD - Telegram (если нужен бот):
TELEGRAM_BOT_ENABLED=true,TG_TOKEN=...
cargo run --bin picrete-rust
cargo run --bin worker
cargo run --bin telegram_botcargo check
cargo testDockerfile копирует готовые release-бинарники из target/release, поэтому перед docker compose ... --build нужно собрать все три бинарника:
cargo build --release --bin picrete-rust --bin worker --bin telegram_botДальше:
docker compose -f docker-compose.prod.yml up -d --buildСервисы в compose:
apiworkertelegram-bot
Префикс API: API_V1_STR (по умолчанию /api/v1).
/api/v1/auth/api/v1/users/api/v1/courses/api/v1/courses/:course_id/exams/api/v1/courses/:course_id/submissions/api/v1/courses/:course_id/task-bank/api/v1/courses/:course_id/trainer/api/v1/courses/:course_id/materials
Ключевые новые student endpoints:
POST /api/v1/courses/:course_id/submissions/sessions/:session_id/uploadGET /api/v1/courses/:course_id/submissions/sessions/:session_id/imagesDELETE /api/v1/courses/:course_id/submissions/sessions/:session_id/images/:image_id
Команды:
/start/login/works/use <номер|session_id>/logout
Особенности:
- чувствительные действия только в
privatechat; - login rate-limit через Redis;
- проверяется
user.is_active; - offset
getUpdatesсохраняется в БД (telegram_bot_offsets), чтобы не дублировать обработку после рестартов.
Примеры ключевых метрик:
uploads_total{source=web|telegram}telegram_auth_fail_totalauto_submit_totalexpired_sessions_closed_totalocr_jobs_total,llm_precheck_jobs_total