Перейти к содержанию

Переменные окружения

Полный справочник переменных из .env.example.

Безопасность и JWT

Переменная По умолчанию Описание
SECRET_KEY Секрет JWT (≥32 символа). Обязательно
ALGORITHM HS256 Алгоритм JWT
ACCESS_TOKEN_EXPIRE_HOURS 1 Срок жизни access JWT (часы)
REFRESH_TOKEN_EXPIRE_DAYS 7 Срок жизни refresh JWT (дни)
ACCESS_TOKEN_EXPIRE_DAYS 7 Legacy alias (deprecated)

База данных и хранилище

Переменная По умолчанию Описание
DATABASE_URL sqlite:///./medinsight.db SQLite или PostgreSQL URL
STORAGE_PATH ./storage Каталог зашифрованных документов

Приложение

Переменная По умолчанию Описание
APP_PORT 8001 Порт uvicorn
REDIS_HOST_PORT 6380 Порт Redis на хосте (compose)
ENVIRONMENT development development / production
APP_VERSION 1.0.0 Версия в /health
CORS_ORIGINS localhost Origins через запятую
DEFAULT_LANGUAGE en Язык UI/контента по умолчанию
SPACY_MODEL ru_core_news_lg NLP-модель spaCy
LOG_LEVEL INFO Уровень логирования
LOG_JSON_FORMAT true JSON-логи
GRACEFUL_SHUTDOWN_TIMEOUT 30 Drain при остановке (сек)

MEDICAL_ASSISTANT / RAG

Переменная По умолчанию Описание
MEDICAL_ASSISTANT_ENABLED true Модули обучения (tutor, cases, exam, progress)
RAG_ENABLED true RAG для AI‑репетитора
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
MOCK_RAG_API_KEY Ключ для scripts/mock_rag_server.py / profile mock-rag

Traefik / HTTPS (prod)

Переменная Описание
DOMAIN Домен для Let's Encrypt
ACME_EMAIL Email для ACME

Redis и Celery

Переменная По умолчанию Описание
REDIS_URL redis://redis:6379/0 Брокер Celery
CELERY_RESULT_BACKEND redis://redis:6379/1 Backend результатов

GPT (ProxyAPI)

Переменная Описание
OPENAI_API_KEY Ключ ProxyAPI
OPENAI_BASE_URL https://api.proxyapi.ru/openai/v1
OPENAI_MODEL gpt-4o-mini

Мультитенантность и шифрование

Переменная По умолчанию Описание
TENANT_MODE true Включить multi-tenant
ENCRYPTION_ENABLED true Шифрование файлов
ENCRYPTION_KEY Ключ age (или через файл)
ENCRYPTION_KEY_PATH secrets/encryption_key.txt Путь к ключу
SUPER_ADMIN_EMAIL Email суперадмина
SUPER_ADMIN_PASSWORD Пароль (первый запуск)
DEFAULT_TENANT_NAME Default Clinic Имя tenant по умолчанию
DEFAULT_TENANT_SUBDOMAIN default Subdomain по умолчанию

Self-healing RAG

Переменная По умолчанию Описание
SELF_HEALING_ENABLED true Автовосстановление
CHROMA_PERSIST_DIR ./chroma_data ChromaDB
EMBEDDING_MODEL all-MiniLM-L6-v2 Embeddings
SIMILARITY_THRESHOLD 0.75 Порог similarity
MAX_RETRY_ATTEMPTS 2 Retry GPT

Webhooks

Переменная По умолчанию Описание
WEBHOOK_ENABLED true Исходящие webhooks
WEBHOOK_TIMEOUT_SECONDS 10 Таймаут HTTP
WEBHOOK_RETRY_COUNT 3 Повторы
WEBHOOK_PUBLIC_BASE_URL Базовый URL для callbacks

Биллинг

Переменная Описание
BILLING_ENABLED false = без лимитов (тест)
STRIPE_* Stripe keys и price IDs
YOOKASSA_* ЮKassa
FREEMIUM_ANALYSIS_LIMIT 5
PRO_ANALYSIS_LIMIT 100
ENTERPRISE_ANALYSIS_LIMIT 999999
PRO_PRICE_RUB/USD Цены в коп/центах

Экспорт

Переменная По умолчанию Описание
EXPORT_MAX_ROWS 10000 Лимит строк Excel
EXPORT_MAX_COLUMNS 50 Лимит колонок
EXPORT_TEMP_DIR ./storage/exports Временные файлы

Бэкап

Переменная По умолчанию Описание
BACKUP_ENABLED true Автобэкап
BACKUP_DIR /backups Каталог архивов
BACKUP_RETENTION_DAYS 7 Дни
BACKUP_RETENTION_WEEKS 4 Недели
BACKUP_RETENTION_MONTHS 12 Месяцы
BACKUP_SCHEDULE_FULL 0 2 * * * Полный бэкап (cron)
BACKUP_SCHEDULE_DB 0 * * * * БД каждый час
BACKUP_ENCRYPTION_ENABLED false Шифрование архива
BACKUP_ALERT_MAX_AGE_HOURS 48 Алерт если нет бэкапа

Telegram

Переменная Описание
TELEGRAM_BOT_TOKEN Токен бота
TELEGRAM_CHAT_ID Chat для алертов
TELEGRAM_BOT_ENABLED false
TELEGRAM_BOT_WEBHOOK_URL URL вебхука
TELEGRAM_LINK_CODE_TTL 600 сек

UI

Переменная По умолчанию Описание
DEFAULT_THEME light light / dark / system

DICOM

Переменная По умолчанию Описание
DICOM_ENABLED true Модуль DICOM
DICOM_MAX_FILE_SIZE_MB 500 Лимит загрузки
DICOM_STORAGE_PATH ./storage/dicom Хранилище
DICOM_THUMBNAIL_SIZE 256x256 Размер превью

OpenTelemetry

Переменная Описание
OTEL_ENABLED Трейсинг
OTEL_SERVICE_NAME medinsight
OTEL_EXPORTER_OTLP_ENDPOINT Collector URL

WebSocket

Переменная По умолчанию Описание
WEBSOCKET_ENABLED true Real-time
WEBSOCKET_HEARTBEAT_INTERVAL 30 Heartbeat (сек)
WEBSOCKET_MAX_CONNECTIONS 1000 Лимит соединений

Rate limiting

Переменная По умолчанию Описание
RATE_LIMIT_ENABLED true Лимиты
RATE_LIMIT_LOGIN_PER_MINUTE 10 Логин
RATE_LIMIT_REGISTER_PER_HOUR 5 Регистрация
RATE_LIMIT_RESET_PER_HOUR 3 Сброс пароля

Политика паролей и блокировка входа

Переменная По умолчанию Описание
PASSWORD_MIN_LENGTH 12 Минимальная длина пароля
PASSWORD_REQUIRE_COMPLEXITY true Требовать буквы, цифры и спецсимволы
PASSWORD_HIBP_CHECK_ENABLED false Проверка пароля через Have I Been Pwned
LOGIN_LOCKOUT_MAX_ATTEMPTS 5 Неудачных попыток до блокировки
LOGIN_LOCKOUT_DURATION_SECONDS 900 Длительность блокировки (15 мин)

Блокировка хранится в Redis (login_lock:{user_id}). Сбрасывается при успешном входе.

Двухфакторная аутентификация (2FA / TOTP)

Переменная По умолчанию Описание
MFA_ENFORCED true Глобально требовать 2FA для ролей из политики
MFA_REQUIRED_ROLES admin,doctor Роли через запятую (tenant может переопределить в settings.mfa_required_roles)

Поведение:

  • При MFA_ENFORCED=true в production super_admin всегда обязан включить TOTP.
  • Роли из MFA_REQUIRED_ROLES (или tenant override) не могут войти, пока не включат TOTP в настройках аккаунта.
  • При MFA_ENFORCED=false проверка TOTP отключена (временный обход для обслуживания). Включите снова после работ.

Проверка в контейнере:

docker compose exec app python -c "from app.config import settings; print(settings.MFA_ENFORCED)"

Изменения .env и Docker

Переменные из env_file: .env попадают в контейнер при создании контейнера. docker restart не подхватывает новые ключи из .env. После правки .env пересоздайте сервисы:

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --force-recreate app celery_worker

Полный ./deploy.sh production делает compose down + up и тоже применяет .env.

Синхронизация .env с шаблоном

Скрипт scripts/sync_env_from_example.py добавляет в .env ключи из .env.example, не перезаписывая существующие значения. Перед изменением создаётся бэкап .env.backup.<timestamp>.

python scripts/sync_env_from_example.py
# или на VPS:
docker compose exec app python scripts/sync_env_from_example.py

Email

Переменная Описание
SMTP_HOST, SMTP_PORT SMTP сервер
SMTP_USER, SMTP_PASSWORD Auth
SMTP_FROM From address
EMAIL_ENABLED Включить email
FRONTEND_URL Базовый URL фронта

Пример .env.production

SECRET_KEY=$(openssl rand -hex 32)
ENVIRONMENT=production
POSTGRES_PASSWORD=<надёжный-пароль>
DATABASE_URL=postgresql://medinsight:<пароль>@postgres:5432/medinsight
REDIS_URL=redis://redis:6379/0
CORS_ORIGINS=https://fileguardian.com.ru
ENCRYPTION_ENABLED=true
OPENAI_API_KEY=sk-...
FRONTEND_URL=https://fileguardian.com.ru
MFA_ENFORCED=true

deploy.sh production собирает DATABASE_URL из POSTGRES_PASSWORD и не затирает пароль при повторных деплоях (volume PostgreSQL сохраняет учётные данные).