Конфигурация¶
Все настройки — через переменные окружения (.env или .env.production).
Обязательные¶
| Переменная | Описание | Пример |
|---|---|---|
SECRET_KEY |
JWT и криптография (≥32 символа) | openssl rand -hex 32 |
DATABASE_URL |
SQLite или PostgreSQL | sqlite:///./medinsight.db |
REDIS_URL |
Брокер Celery и кэш | redis://redis:6379/0 |
Приложение¶
| Переменная | По умолчанию | Описание |
|---|---|---|
ENVIRONMENT |
development |
development / production |
APP_PORT |
8001 |
Порт uvicorn |
REDIS_HOST_PORT |
6380 |
Порт Redis на хосте (compose) |
APP_VERSION |
1.0.0 |
Версия в /health |
CORS_ORIGINS |
* |
Разрешённые origins (через запятую) |
LOG_LEVEL |
INFO |
Уровень логов |
DEFAULT_LANGUAGE |
en |
Язык UI/контента по умолчанию |
AI Medical Assistant / RAG¶
| Переменная | По умолчанию | Описание |
|---|---|---|
MEDICAL_ASSISTANT_ENABLED |
true |
Включить модули обучения |
RAG_ENABLED |
true |
Включить RAG для репетитора |
RAG_COLLECTION_NAME |
medical_knowledge |
Коллекция Chroma |
RAG_MODE |
local |
local / external / hybrid |
RAG_EXTERNAL_URL |
— | Base URL внешнего search API |
RAG_EXTERNAL_API_KEY |
— | Bearer для внешнего RAG |
RAG_EXTERNAL_TIMEOUT_SECONDS |
8.0 |
Таймаут внешнего поиска |
RAG_HYBRID_LOCAL_WEIGHT |
0.5 |
Вес локального поиска в hybrid |
CHROMA_PERSIST_DIR |
./chroma_data |
Каталог Chroma |
MOCK_RAG_API_KEY |
— | Ключ для scripts/mock_rag_server.py |
Compose-профиль демо-RAG: docker compose --profile mock-rag up -d mock_rag (контейнер aima-mock-rag).
Безопасность и шифрование¶
| Переменная | Описание |
|---|---|
ENVIRONMENT |
development или production (fail-fast на дефолтных секретах в prod) |
AGE_PUBLIC_KEY |
Публичный ключ age для шифрования файлов |
AGE_SECRET_KEY |
Приватный ключ (только на сервере!) |
ENCRYPTION_ENABLED |
true / false |
MFA_ENFORCED |
true — требовать 2FA; false — временно отключить (см. ниже) |
MFA_REQUIRED_ROLES |
Роли, для которых обязателен TOTP (admin,doctor по умолчанию) |
PASSWORD_MIN_LENGTH |
Мин. длина пароля (12) |
LOGIN_LOCKOUT_MAX_ATTEMPTS |
Попыток до блокировки аккаунта (5) |
2FA (TOTP)¶
Пользователь включает TOTP в настройках аккаунта (/api/totp/*). При входе API может вернуть
totp_required: true — тогда повторите POST /api/auth/login с полем totp_code.
Временное отключение 2FA на сервере:
# в .env на VPS
MFA_ENFORCED=false
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --force-recreate app celery_worker
Note
docker restart не подхватывает новые переменные из .env — нужен --force-recreate
или полный ./deploy.sh production.
Генерация ключей:
age-keygen -o age-key.txt
# AGE_PUBLIC_KEY = age1...
# AGE_SECRET_KEY = AGE-SECRET-KEY-1...
GPT / ProxyAPI¶
| Переменная | Описание |
|---|---|
OPENAI_API_KEY / PROXYAPI_KEY |
Ключ ProxyAPI (OpenAI-совместимый) |
OPENAI_BASE_URL / PROXYAPI_BASE_URL |
Базовый URL API |
OPENAI_MODEL / GPT_MODEL |
Модель, напр. gpt-4o-mini |
Без ключа работает rule-based fallback.
Email (SMTP)¶
| Переменная | Описание |
|---|---|
SMTP_HOST, SMTP_PORT |
Сервер SMTP |
SMTP_USER, SMTP_PASSWORD |
Учётные данные |
SMTP_FROM |
Адрес отправителя |
FRONTEND_URL |
Базовый URL для ссылок в письмах |
Telegram¶
| Переменная | Описание |
|---|---|
TELEGRAM_BOT_TOKEN |
Токен @BotFather |
TELEGRAM_WEBHOOK_SECRET |
Секрет вебхука |
DICOM¶
| Переменная | По умолчанию | Описание |
|---|---|---|
DICOM_MAX_FILE_SIZE_MB |
500 |
Лимит загрузки |
DICOM_STORAGE_PATH |
storage/dicom |
Каталог хранения |
Резервное копирование¶
| Переменная | Описание |
|---|---|
BACKUP_ENABLED |
true / false |
BACKUP_SCHEDULE_CRON |
Расписание (Celery Beat) |
BACKUP_RETENTION_DAYS |
Срок хранения архивов |
Мультитенантность¶
| Переменная | Описание |
|---|---|
DEFAULT_TENANT_SUBDOMAIN |
Subdomain по умолчанию |
TENANT_HEADER |
Заголовок для API (опционально) |
Celery¶
| Переменная | Описание |
|---|---|
CELERY_BROKER_URL |
Обычно = REDIS_URL |
CELERY_RESULT_BACKEND |
Backend результатов |
Docker Compose (имена)¶
Контейнеры и volumes префиксуются aima-* (aima-app, aima-redis, aima-postgres, aima-chroma, …).
Применение изменений¶
Переменные из .env передаются в контейнер через env_file при создании контейнера.
# Недостаточно — старые env останутся в контейнере:
docker compose restart app
# Правильно — пересоздать app и worker:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --force-recreate app celery_worker
# Или полный деплой (рекомендуется):
./deploy.sh production
Добавить недостающие ключи из .env.example без потери секретов:
python scripts/sync_env_from_example.py
Полный список: environment-variables.md.