Аудит и стабилизация МИС для сети клиник
Подрядчик ушёл, код передан «как есть». За шесть недель закрыли риски 152-ФЗ, убрали падения базы в утренний пик и снизили облачный бюджет почти вдвое.
О проекте
Федеральная сеть частных медицинских клиник (десятки филиалов, сотни врачей, тысячи приёмов в день). Веб-интерфейс МИС — запись, электронная медкарта, интеграции с лабораториями и 1С — около полутора лет разрабатывал местный подрядчик. Команда распалась, исходники передали без сопровождения. Бизнес получил систему, которая в пик «тупила», иногда ложилась по блокировкам БД и не проходила внутренний аудит по персональным данным.
Боль до старта
Облако дороже плана
Инфраструктура в Yandex Cloud обходилась ≈320 тыс. ₽/мес при ожидании бизнеса около 180 тыс. ₽.
Утренний пик записи
По понедельникам открытие карточки пациента и расписания врача занимало больше 8 секунд — врачи жаловались, что «система тупит».
Падения БД
Раз в месяц в часы пик база упиралась в блокировки: регистраторы не могли провести пациента.
Риски и деньги
Двойные записи на один слот, замечания внутреннего аудита по 152-ФЗ и врачебной тайне, ошибки синхронизации оплат с 1С:Бухгалтерия с дублями платежей.
Итоги после 6 недель
−48%
стоимость Yandex Cloud: 320 → 165 тыс. ₽/мес
0,6 с
p95 открытия карточки в утренний пик (было 8,2 с)
152-ФЗ
повторный внутренний аудит пройден
×4,5
ускорение CI/CD: сборка 18 → 4 мин
Стек на момент аудита
Backend
Основной API на FastAPI, админка и пользователи — Django REST Framework. Очереди через RabbitMQ, фоновые задачи — Celery.
Frontend
SPA для регистратуры и врачей на Angular с UI-китом на базе Angular Material.
Данные и инфраструктура
PostgreSQL для оперативных данных, ClickHouse для отчётов главврачам. Контур в Yandex Cloud: Managed Kubernetes, Managed PostgreSQL, Object Storage. CI — GitLab CE, мониторинг — VictoriaMetrics + Grafana + EFK.
Что нашли в аудите
Критичные находки по производительности, 152-ФЗ и DevOps.
Архитектура и производительность
Синхронный requests.post() к 1С блокировал event loop FastAPI: задержка 1С валила ответы всего API.
N+1 в Django ORM в списке пациентов: для 100 записей — 300+ запросов к БД.
Нет PgBouncer: новое соединение на каждый запрос, пик упирался в max_connections.
Отчёт «Загрузка врачей» в ClickHouse — 40 секунд из‑за full scan в обход materialized views.
Безопасность и 152-ФЗ
В Kibana в открытом виде писались ФИО, полисы ОМС/ДМС и диагнозы ICD-10.
RBAC только на фронте: через API врач мог читать карты и расписания коллег.
JWT в localStorage — уязвимость к XSS.
Инфраструктура и DevOps
Over-provisioning нод K8s (16 vCPU / 64 GB) при утилизации ≤20%.
Бэкапы Postgres самописным cron без алертов — три недели без актуальных копий.
Сборка Angular в CI ~18 минут без кэша node_modules и со старым Webpack.
Что сделали
Три этапа по две недели: сначала безопасность и бэкапы, затем БД и интеграции, затем right-sizing и CI.
Этап 1 · Безопасность, 152-ФЗ, бэкапы
Middleware FastAPI/Django: маскирование СНИЛС, паспортов и ФИО в логах; парсинг в Fluentd.
Жёсткий RBAC: doctor_id в токене проверяется на доступ к patient_id (главврач — все, врач — свои).
JWT перенесён в HttpOnly / Secure / SameSite=Strict cookies; Angular-интерсептор шлёт cookie автоматически.
Managed PostgreSQL backups в Object Storage с шифрованием и ротацией 30 дней; алерт в Telegram при сбое.
Этап 2 · БД и интеграции
Интеграция с 1С: httpx.AsyncClient + событие в RabbitMQ; Celery-воркер с exponential backoff — UI регистратора не ждёт 1С.
select_related / prefetch_related и точечный RawSQL — убрали N+1.
PgBouncer перед Postgres: ошибки Too many clients исчезли.
Materialized Views в ClickHouse: отчёт по врачам 40 с → 0,8 с.
Этап 3 · Инфраструктура и CI/CD
Right-sizing нод: 8 vCPU / 32 GB; часть дисков бэкапов и логов — network-hdd.
esbuild вместо Webpack, кэш Docker-слоёв и node_modules в GitLab CI: 18 → 4 минуты.
Дашборды VictoriaMetrics и алерты на длину очередей RabbitMQ — сбой интеграции с 1С виден до жалоб пациентов.
Ключевые эффекты
Предсказуемый облачный бюджет
Сняли метрики за месяц и подогнали типы ВМ под реальную утилизацию — без потери SLA в пик записи.
Стабильный утренний пик
Асинхронная 1С, пул соединений и оптимизация ORM убрали «тупёж» карточек и падения по locks.
Контур под 152-ФЗ
Маскирование ПДн в логах, серверный RBAC и безопасные сессии закрыли замечания внутреннего аудита.
Дубли платежей в 1С сведены к нулю
Бэкапы гарантированно создаются и шифруются
XSS и горизонтальное повышение привилегий закрыты