# Серверная часть и база данных медицинского приложения

> Что должна обрабатывать серверная часть медицинского приложения и его база данных, какие части предоставляет Anpheros в качестве управляемой базы данных для здравоохранения, что остается в вашей серверной части, три способа подключения и как оставаться в синхронизации с помощью веб-хуков.

Source: https://developers.anpheros.com/ru/guides/medical-app-backend

**Серверная часть медицинского приложения — это серверная сторона приложения для здравоохранения: она хранит данные пациентов, контролирует доступ к ним, ведет историю изменений и взаимодействует с лабораториями, клиниками и другими службами.** С Anpheros медицинская часть этой серверной части — база данных для здравоохранения, которая хранит записи каждого пациента с его историей, согласиями, источниками данных, аудитом, импортом лабораторных данных и событиями — предоставляется платформой через API, а ваша собственная серверная часть хранит только то, что специфично для вашего продукта.

## Что должен обрабатывать медицинский бэкенд

| Ответственность | Почему это сложно в здравоохранении | С Anpheros |
|---|---|---|
| Медицинская модель данных | десятки видов данных, каждый со стандартными кодами | HL7 FHIR R4, 26 типов ресурсов, LOINC / ICD-10 / ATC / UCUM |
| Версионирование | медицинские данные корректируются, никогда не перезаписываются молча | каждое обновление — новая версия; `If-Match` для условных обновлений |
| Документы | оригиналы должны оставаться неизменными и отслеживаемыми | неизменяемые оригиналы с SHA-256, хранилище ЕС, зашифрованное ключом, управляемым клиентом |
| Контроль доступа | на пациента, на приложение, на тип данных | изоляция проектов, парные идентификаторы, OAuth-области с фильтрами категорий |
| Согласие | пациент решает и может передумать | разрешения на 30–365 дней, отзывные, зеркалируются как FHIR `Consent` |
| Аудит | пациенты и регуляторы спрашивают, кто что видел | каждое чтение и запись регистрируются и видны пациенту |
| Происхождение | значение из лаборатории — это не значение, введенное пациентом | тип автора, организация, практикующий врач и исходная система при каждой записи |
| Интеграции | лаборатории отправляют CSV, HL7 v2, JSON; приложениям нужны события | импорт из лаборатории, транзакции FHIR, подписанные веб-хуки |
| Безопасные повторные попытки | дублирование лекарства или результата — клиническая ошибка | `Idempotency-Key` при каждом создании |
| Тестовые данные | реальные пациенты никогда не должны быть в разработке | база данных песочницы с синтетическими пациентами |

## Что хранится в вашем бэкенде

- ваши **пользователи и аккаунты**, а также сопоставление каждого пользователя с его идентификатором пациента Anpheros (парный идентификатор, который видит ваш проект);
- **данные продукта**, не являющиеся медицинскими: настройки, подписки, контент, расписания напоминаний;
- **бизнес-правила** — кто из вашего персонала может видеть какого пациента в вашем продукте;
- **API-ключ**, который никогда не должен быть включен в мобильное или веб-приложение.

## Три способа подключения

**1. Ваш бэкенд хранит API-ключ (наиболее распространенный вариант).** Ваше приложение вызывает ваш бэкенд; ваш бэкенд вызывает Anpheros с ключом `sk_live_` и видит пациентов, созданных вашим проектом.

```ts
import { Anpheros, apiKey } from '@anpheros/sdk';
const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });

// GET /api/me/vitals in your backend, after your own authentication
export async function myVitals(user: { anpherosPatientId: string }) {
  const page = await anpheros.observations.list(user.anpherosPatientId, { category: 'vital-signs', limit: 50 });
  return page.data;
}
```

**2. Приложение действует от имени пациента с помощью OAuth.** Для людей, у которых уже есть запись в Anpheros, мобильное или веб-приложение является *публичным* OAuth-клиентом с PKCE: человек дает согласие на размещенной странице, и приложение получает 30-минутный токен доступа и вращающийся токен обновления для этой одной записи. SDK реализуют этот поток (`OAuthFlow`).

**3. Партнеры "сервер-сервер".** Конфиденциальный клиент (с секретом, хранящимся на сервере) может использовать поток авторизационного кода или `client_credentials`, который ведет себя как API-ключ для данного проекта.

## Поддержание синхронизации вашего бэкенда

Подписывайтесь на веб-хуки вместо опроса. Доставки подписаны (`Anpheros-Signature`, HMAC-SHA256 по временной метке и телу сообщения), доставляются как минимум один раз и, возможно, не по порядку; дедуплицируйте по идентификатору события и игнорируйте устаревшие версии.

```ts
import { verifyWebhookSignature } from '@anpheros/sdk';

app.post('/anpheros/hook', express.raw({ type: 'application/json' }), async (req, res) => {
  const ok = await verifyWebhookSignature({ secret: process.env.ANPHEROS_WEBHOOK_SECRET!, header: req.header('anpheros-signature'), body: req.body });
  if (!ok) return res.status(400).end();
  const event = JSON.parse(req.body.toString());   // ids and versions only — read the resource if you need it
  res.status(204).end();
});
```

## Обработка ошибок и ограничений

- Рассматривайте `404` как "невидимый для вас", но никогда как доказательство того, что запись не существует.
- `403` означает, что учетные данные существуют, но могут не позволять выполнить это действие — отсутствует область действия (scope) или ресурс был записан другой организацией.
- `429` сопровождается `Retry-After`; SDK автоматически ожидают и повторяют попытки, как и в случае с `5xx`.
- Сохраняйте `Anpheros-Request-Id` неудачных вызовов для службы поддержки.

[Ошибки](https://developers.anpheros.com/ru/guides/errors) · [Ограничения и лимиты запросов](https://developers.anpheros.com/ru/guides/limits)

## Часто задаваемые вопросы

### Какую базу данных следует использовать медицинскому приложению?
Базу данных, которая хранит медицинские данные в стандартной, версионированной форме и контролирует доступ для каждого пациента. Anpheros — это управляемая база данных для здравоохранения, построенная на основе HL7 FHIR R4: запись каждого пациента версионируется и доступна для поиска, каждая запись содержит информацию о происхождении, и приложение видит пациента только в том случае, если оно создало запись или пациент дал согласие. Ваша собственная база данных будет хранить остальные данные вашего продукта — учетные записи, биллинг, контент. О компромиссах при проектировании собственных таблиц см. [FHIR против пользовательской медицинской базы данных](https://developers.anpheros.com/ru/guides/fhir-vs-custom-database).

### Существует ли бесплатная база данных для медицинских приложений?
Да. Песочница Anpheros бесплатна: войдите через Google, получите ключ в один клик, и ваш проект получит 30 синтетических пациентов и до 10 000 записей в день. Производство начинается с 49 евро в месяц за 2500 пациентов, первый месяц бесплатно; доступ к производству предоставляется проверенным организациям с подписанным соглашением об обработке данных. См. [Цены](https://developers.anpheros.com/ru/guides/pricing).

### Могу ли я хранить реальные данные пациентов в бесплатной песочнице?
Нет. Песочница предназначена только для синтетических данных: каждый проект песочницы получает своих синтетических пациентов, а ключи песочницы не могут получить доступ к производству. Записи реальных пациентов должны храниться в производственном проекте.

## Связанные материалы

- [FHIR против пользовательской медицинской базы данных](https://developers.anpheros.com/ru/guides/fhir-vs-custom-database): когда проектировать собственные таблицы, а когда использовать FHIR
- [Как создать API для здравоохранения с помощью TypeScript](https://developers.anpheros.com/ru/guides/healthcare-api-typescript): пошаговое руководство с Express
- [Как создать приложение для здравоохранения с помощью Flutter](https://developers.anpheros.com/ru/guides/healthcare-app-flutter): пошаговое руководство с Dart SDK
- [Разработка программного обеспечения для здравоохранения](https://developers.anpheros.com/ru/guides/healthcare-software)
- [Создание приложения для здравоохранения](https://developers.anpheros.com/ru/guides/build-a-healthcare-app)
- [Архитектура](https://developers.anpheros.com/ru/guides/architecture)
- [API медицинских данных](https://developers.anpheros.com/ru/guides/medical-data-api)
- [SDK](https://developers.anpheros.com/ru/guides/sdks)
