Развертывание и конфигурация
Развертывание и конфигурация
Docker Compose
В корне проекта есть два основных compose-файла:
docker-compose.yml- основной вариант с GPU reservation для training-сервиса.docker-compose.mac.yml- вариант для macOS без GPU reservation.
Запуск основного окружения:
docker compose up --buildЗапуск macOS-варианта:
docker compose -f docker-compose.mac.yml up --buildСервисы и порты
nginx
- image:
nginx:1.27-alpine - порт:
80:80 - проксирует
/api/вserver:8000 - раздает фронтенд из
nginx/dist
server
- build context:
./schemion-api - порт:
8000:8000 - команда запуска:
alembic upgrade head && uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 1Перед стартом ждет PostgreSQL через wait-for-it.sh.
trainer
- build context:
./schemion-training - команда запуска:
python -m app.main - зависит от PostgreSQL, MinIO и Bobber.
В docker-compose.yml запрашивает один NVIDIA GPU:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]inference
- build context:
./schemion-inference - команда запуска:
python -m app.infrastructure.main - зависит от PostgreSQL, MinIO и Bobber.
bob-the-broker
- image:
ghcr.io/schemion/bob-the-broker:v2.2 - порт:
50051:50051
database
- image:
postgres:16 - порт:
5432:5432 - база:
schemion - пользователь:
admin - пароль:
admin
minio
- image:
minio/minio:RELEASE.2025-09-07T16-13-09Z - API порт:
9000:9000 - console порт:
9001:9001 - пользователь:
minioadmin - пароль:
minioadmin
Переменные окружения API
schemion-api/app/infrastructure/config.py читает .env через Pydantic Settings.
Основные переменные:
DATABASE_URL=postgresql+asyncpg://admin:admin@database:5432/schemion
JWT_SECRET=supersecret
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=10
REFRESH_TOKEN_EXPIRE_MINUTES=10080
MINIO_ENDPOINT=minio:9000
MINIO_PUBLIC_ENDPOINT=files.localhost
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_SCHEMAS_BUCKET=schemas-images
MINIO_MODELS_BUCKET=models
MINIO_DATASETS_BUCKET=datasets
MINIO_METRICS_BUCKET=metrics
MINIO_INFERENCES_BUCKET=inference-results
BOBBER_HOST=bob-the-broker
BOBBER_PORT=50051Примечание: в реализации MinioStorage API presigned URLs подписываются через hardcoded public endpoint localhost:9000, а не через MINIO_PUBLIC_ENDPOINT.
Переменные окружения training-воркера
schemion-training/app/config.py читает .env через python-dotenv.
DATABASE_URL=postgresql://admin:admin@database:5432/schemion
MINIO_ENDPOINT=minio:9000
MINIO_PUBLIC_ENDPOINT=files.localhost
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_SCHEMAS_BUCKET=schemas-images
MINIO_MODELS_BUCKET=models
MINIO_DATASETS_BUCKET=datasets
MINIO_METRICS_BUCKET=metrics
BOBBER_HOST=bob-the-broker
BOBBER_PORT=50051Переменные окружения inference-воркера
schemion-inference/app/config.py:
DATABASE_URL=postgresql://admin:admin@database:5432/schemion
BOBBER_HOST=bob-the-broker
BOBBER_PORT=50051
JWT_SECRET=supersecret
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=60
MINIO_ENDPOINT=minio:9000
MINIO_PUBLIC_ENDPOINT=files.localhost
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_SCHEMAS_BUCKET=schemas-images
MINIO_MODELS_BUCKET=models
MINIO_DATASETS_BUCKET=datasets
MINIO_INFERENCE_RESULTS_BUCKET=inference-resultsNginx
Конфигурация находится в nginx/nginx.conf.
Важные правила:
location /api/ {
proxy_pass http://schemion/;
}
location / {
try_files $uri $uri/ /index.html;
}Поскольку proxy_pass заканчивается на /, префикс /api/ заменяется на / при проксировании.
Миграции
API-контейнер автоматически выполняет:
alembic upgrade headперед запуском Uvicorn. Конфигурация Alembic находится в:
schemion-api/alembic.ini
schemion-api/alembic/Загрузка системных моделей
Утилита system_model_importer/main.py рассчитана на локальную загрузку файлов из директории:
system_model_importer/modelsПо умолчанию она подключается к:
PostgreSQL: localhost:5432
MinIO: localhost:9000Файлы .pt и .pth загружаются в бакет models, затем создается запись в таблице models с:
is_system=True;architecture="yolo", если имя файла содержитyolo;architecture="faster_rcnn", если имя файла содержитfaster;architecture="unknown"иначе;architecture_profile="default".
Замечания по зависимостям
В корневом README.md указано, что в submodules Dockerfile использует китайское зеркало PyPI:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ ...Для возврата к стандартному PyPI используется:
pip install --no-cache-dir -r requirements.txtЭто важно учитывать при сборке контейнеров в сетях, где внешние индексы пакетов ограничены.