Compare commits
25 Commits
agomez_fea
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 2919873247 | |||
| 099b2109aa | |||
| eaa41f4d68 | |||
| 2019e440c8 | |||
| d49074ac09 | |||
| 6d1b3ad8c9 | |||
| 5e35029a2e | |||
| 1e71f833ca | |||
| 13319cdd37 | |||
| 3774a44573 | |||
| 8363da2869 | |||
| f5f8da077b | |||
| 2a51a870f9 | |||
| 18ea7f1153 | |||
| 8f8a864b15 | |||
| 4b722deed5 | |||
| 02e338c32a | |||
| 885e05e1bd | |||
| ffd47954d1 | |||
| ba87e83d71 | |||
| 8c7525758e | |||
| 14e0284cd9 | |||
| 17ab0cdf03 | |||
| 9e24000992 | |||
| ca043aa7b4 |
43
.env.example
43
.env.example
@ -4,29 +4,35 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# NODO
|
# VARIABLES DE ENTORNO REQUERIDAS
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
|
|
||||||
# URL base del nodo (usada por bus-gateway internamente)
|
# URL base del nodo (usada por bus-gateway internamente)
|
||||||
NODO_URL_BASE=http://localhost
|
NODO_URL_BASE=http://localhost
|
||||||
|
|
||||||
# Zona horaria para todos los servicios
|
|
||||||
TZ=America/Argentina/Buenos_Aires
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# BUS DE SALUD — Requeridas
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
# URL base del Bus de salud nacional
|
|
||||||
BUS_URL=https://bus-test.msal.gob.ar
|
|
||||||
|
|
||||||
# Secreto compartido para firmar tokens JWT (HS256) contra el Bus
|
# Secreto compartido para firmar tokens JWT (HS256) contra el Bus
|
||||||
BUS_JWT_SECRET=your-shared-secret
|
BUS_JWT_SECRET=your-shared-secret
|
||||||
|
|
||||||
# Identificador del emisor JWT (ej.: URL del repositorio del nodo)
|
# Identificador del emisor JWT (ej.: URL del repositorio del nodo)
|
||||||
BUS_ISSUER=https://your-repositorio-url
|
BUS_ISSUER=https://your-repositorio-url
|
||||||
|
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# INFRAESTRUCTURA
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Zona horaria para todos los servicios
|
||||||
|
TZ=America/Argentina/Buenos_Aires
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# BUS DE SALUD
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# URL base del Bus de salud nacional
|
||||||
|
BUS_URL=https://bus-test.msal.gob.ar
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Scopes OAuth para el Master Patient Index
|
# Scopes OAuth para el Master Patient Index
|
||||||
MPI_SCOPE=Patient/*.read,Patient/*.write
|
MPI_SCOPE=Patient/*.read,Patient/*.write
|
||||||
|
|
||||||
@ -57,19 +63,6 @@ NGINX_CONF=http
|
|||||||
# SSL_CERT_PATH=./certs/server.crt
|
# SSL_CERT_PATH=./certs/server.crt
|
||||||
# SSL_KEY_PATH=./certs/server.key
|
# SSL_KEY_PATH=./certs/server.key
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# CERTIFICADOS / DOCKER SECRETS
|
|
||||||
# Los archivos se inyectan como Docker secrets.
|
|
||||||
# Los valores por defecto apuntan a ./certs/ — reemplazar en producción.
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
# Certificado de la red de confianza (TNG/GDHCN)
|
|
||||||
SIGNATURE_CERT_PATH=./certs/trust-network.pem
|
|
||||||
SIGNATURE_KEY_PATH=./certs/trust-network.key
|
|
||||||
|
|
||||||
# Clave privada para firma de documentos (Document Signing Certificate)
|
|
||||||
SSL_DCC_KEY_PATH=./certs/signature.key
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# HAPI FHIR (Spring Boot)
|
# HAPI FHIR (Spring Boot)
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|||||||
53
README.md
53
README.md
@ -14,7 +14,6 @@ Internet / Red interna
|
|||||||
│ /fhir/IPSDocument → bus-gateway:3000 │
|
│ /fhir/IPSDocument → bus-gateway:3000 │
|
||||||
│ /fhir/DocumentReference→ bus-gateway:3000 │
|
│ /fhir/DocumentReference→ bus-gateway:3000 │
|
||||||
│ /fhir/Patient → bus-gateway:3000 │
|
│ /fhir/Patient → bus-gateway:3000 │
|
||||||
│ /gdhcn/* → gdhcn-validator-service │
|
|
||||||
│ /fhir/* (resto) → hapi-fhir:8080 │
|
│ /fhir/* (resto) → hapi-fhir:8080 │
|
||||||
└──────────────────────────────────────────────┘
|
└──────────────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
@ -26,13 +25,11 @@ Internet / Red interna
|
|||||||
| `hapi-fhir` | `hapiproject/hapi:latest` | 8080 (interno) | Servidor FHIR R4 (Spring Boot) con búsqueda Lucene |
|
| `hapi-fhir` | `hapiproject/hapi:latest` | 8080 (interno) | Servidor FHIR R4 (Spring Boot) con búsqueda Lucene |
|
||||||
| `hapi-db` | `postgres:14.6` | 5433 (interno) | Base de datos PostgreSQL para HAPI FHIR |
|
| `hapi-db` | `postgres:14.6` | 5433 (interno) | Base de datos PostgreSQL para HAPI FHIR |
|
||||||
| `bus-gateway` | `./bus-gateway` (Node.js) | 3000 (interno) | Gateway al Bus de salud nacional (MPI + Document Registry) |
|
| `bus-gateway` | `./bus-gateway` (Node.js) | 3000 (interno) | Gateway al Bus de salud nacional (MPI + Document Registry) |
|
||||||
| `gdhcn-validator-service` | `createchile/gdhcn-validator_backend:v1.1` | 8182 | Validador de documentos de salud verificables (firmas digitales) |
|
|
||||||
| `gdhcn-db` | `postgres:16-alpine` | 5432 (interno) | Base de datos PostgreSQL para el validador GDHCN |
|
|
||||||
| `nginx` | `nginx:alpine` | 80 / 443 | Proxy inverso — punto de entrada HTTP/HTTPS |
|
| `nginx` | `nginx:alpine` | 80 / 443 | Proxy inverso — punto de entrada HTTP/HTTPS |
|
||||||
|
|
||||||
**Red interna**: todos los servicios se comunican a través de la red Docker `hapi-network`.
|
**Red interna**: todos los servicios se comunican a través de la red Docker `hapi-network`.
|
||||||
|
|
||||||
**Volúmenes persistentes**: `hapi-data` (PostgreSQL de HAPI), `gdhcn-data` (PostgreSQL de GDHCN).
|
**Volúmenes persistentes**: `hapi-data` (PostgreSQL de HAPI).
|
||||||
|
|
||||||
## Transacciones IHE implementadas
|
## Transacciones IHE implementadas
|
||||||
|
|
||||||
@ -50,9 +47,21 @@ El `bus-gateway` implementa los siguientes perfiles de interoperabilidad:
|
|||||||
|
|
||||||
## Requisitos
|
## Requisitos
|
||||||
|
|
||||||
|
### Software
|
||||||
|
|
||||||
- Docker >= 20.10.8
|
- Docker >= 20.10.8
|
||||||
- Docker Compose >= 1.29.2
|
- Docker Compose >= 1.29.2
|
||||||
|
|
||||||
|
### Hardware del servidor
|
||||||
|
|
||||||
|
| Recurso | Mínimo | Recomendado |
|
||||||
|
|---|---|---|
|
||||||
|
| CPU | 2 núcleos | 4 núcleos |
|
||||||
|
| Memoria RAM | 4 GB | 8 GB |
|
||||||
|
| Disco | 10 GB | 30 GB |
|
||||||
|
|
||||||
|
> El mayor consumo de recursos corresponde a **HAPI FHIR** (JVM + índice Lucene), que requiere al menos 2 GB de RAM para arrancar correctamente. El volumen de disco recomendado contempla el crecimiento de los datos clínicos almacenados en PostgreSQL.
|
||||||
|
|
||||||
## Instalación y configuración
|
## Instalación y configuración
|
||||||
|
|
||||||
### 1. Variables de entorno
|
### 1. Variables de entorno
|
||||||
@ -70,8 +79,13 @@ Los certificados se inyectan como **Docker secrets**. Las rutas se configuran en
|
|||||||
| Archivo por defecto | Descripción |
|
| Archivo por defecto | Descripción |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `./certs/server.crt` / `./certs/server.key` | Certificado TLS para nginx (solo modo HTTPS) |
|
| `./certs/server.crt` / `./certs/server.key` | Certificado TLS para nginx (solo modo HTTPS) |
|
||||||
| `./certs/trust-network.pem` / `./certs/trust-network.key` | Certificado de la red de confianza (GDHCN/TNG) |
|
|
||||||
| `./certs/signature.key` | Clave privada para firma de documentos (DSC) |
|
> **Importante:** Los archivos `ssl_cert` y `ssl_key` deben existir en el sistema de archivos para que Docker pueda montarlos como secrets, incluso si se usa el modo HTTP. Si no se cuenta con certificados reales, crear archivos vacíos:
|
||||||
|
>
|
||||||
|
> ```bash
|
||||||
|
> touch ./certs/server.crt
|
||||||
|
> touch ./certs/server.key
|
||||||
|
> ```
|
||||||
|
|
||||||
> Ver [certs/README.md](certs/README.md) para instrucciones de generación de certificados de prueba.
|
> Ver [certs/README.md](certs/README.md) para instrucciones de generación de certificados de prueba.
|
||||||
|
|
||||||
@ -105,7 +119,17 @@ Los parámetros del servidor FHIR se ajustan en [hapi-config/application.yaml](h
|
|||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
HAPI FHIR tarda aproximadamente **30–40 segundos** en inicializar. El `bus-gateway` espera activamente a que el servidor FHIR esté listo antes de aceptar conexiones (hasta ~3 minutos de reintentos).
|
HAPI FHIR tarda aproximadamente **30–40 segundos** en inicializar. El `bus-gateway` espera a que el contenedor `hapi-fhir` esté iniciado, pero no verifica que el servidor FHIR haya completado su arranque. Antes de usar los servicios, verificar que HAPI FHIR inicializó correctamente:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose logs -f hapi-fhir
|
||||||
|
```
|
||||||
|
|
||||||
|
Buscar la línea que confirma el inicio exitoso:
|
||||||
|
|
||||||
|
```
|
||||||
|
Started Application in XX seconds
|
||||||
|
```
|
||||||
|
|
||||||
## Verificar el despliegue
|
## Verificar el despliegue
|
||||||
|
|
||||||
@ -116,8 +140,8 @@ docker compose ps
|
|||||||
# CapabilityStatement FHIR a través de nginx
|
# CapabilityStatement FHIR a través de nginx
|
||||||
curl http://localhost/fhir/metadata
|
curl http://localhost/fhir/metadata
|
||||||
|
|
||||||
# Health check del Bus Gateway a través de nginx
|
# Verificación de llegada al Bus mediante la consulta de un paciente.
|
||||||
curl http://localhost/fhir/Patient?_summary=count
|
curl --location 'http://localhost/fhir/Patient?identifier=http%3A%2F%2Fwww.renaper.gob.ar%2Fdni%7C30945027'
|
||||||
|
|
||||||
# Logs de un servicio específico
|
# Logs de un servicio específico
|
||||||
docker compose logs -f bus-gateway
|
docker compose logs -f bus-gateway
|
||||||
@ -159,7 +183,6 @@ Todas las variables se definen en el archivo `.env` de la raíz del proyecto.
|
|||||||
|
|
||||||
| Variable | Default | Descripción |
|
| Variable | Default | Descripción |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `NODO_BASE_URL` | `http://localhost` | URL pública del nodo (usada por GDHCN para construir URLs) |
|
|
||||||
| `NODO_URL_BASE` | `http://localhost` | URL base del nodo (usada por bus-gateway) |
|
| `NODO_URL_BASE` | `http://localhost` | URL base del nodo (usada por bus-gateway) |
|
||||||
| `TZ` | `America/Argentina/Buenos_Aires` | Zona horaria para todos los servicios |
|
| `TZ` | `America/Argentina/Buenos_Aires` | Zona horaria para todos los servicios |
|
||||||
|
|
||||||
@ -177,14 +200,6 @@ Todas las variables se definen en el archivo `.env` de la raíz del proyecto.
|
|||||||
| `SSL_CERT_PATH` | `./certs/server.crt` | Ruta al certificado TLS del servidor |
|
| `SSL_CERT_PATH` | `./certs/server.crt` | Ruta al certificado TLS del servidor |
|
||||||
| `SSL_KEY_PATH` | `./certs/server.key` | Ruta a la clave privada TLS del servidor |
|
| `SSL_KEY_PATH` | `./certs/server.key` | Ruta a la clave privada TLS del servidor |
|
||||||
|
|
||||||
### Certificados / Secrets
|
|
||||||
|
|
||||||
| Variable | Default | Descripción |
|
|
||||||
|---|---|---|
|
|
||||||
| `SIGNATURE_CERT_PATH` | `./certs/trust-network.pem` | Certificado de la red de confianza (TNG/GDHCN) |
|
|
||||||
| `SIGNATURE_KEY_PATH` | `./certs/trust-network.key` | Clave privada de la red de confianza |
|
|
||||||
| `SSL_DCC_KEY_PATH` | `./certs/signature.key` | Clave privada para firma de documentos (DSC) |
|
|
||||||
|
|
||||||
### HAPI FHIR / PostgreSQL
|
### HAPI FHIR / PostgreSQL
|
||||||
|
|
||||||
| Variable | Default | Descripción |
|
| Variable | Default | Descripción |
|
||||||
@ -203,7 +218,7 @@ Todas las variables se definen en el archivo `.env` de la raíz del proyecto.
|
|||||||
|
|
||||||
```
|
```
|
||||||
ips-nodo-dominio/
|
ips-nodo-dominio/
|
||||||
├── docker-compose.yml # Orquestación principal (6 servicios)
|
├── docker-compose.yml # Orquestación principal (4 servicios)
|
||||||
├── .env.example # Plantilla de variables de entorno
|
├── .env.example # Plantilla de variables de entorno
|
||||||
├── hapi-config/
|
├── hapi-config/
|
||||||
│ └── application.yaml # Configuración de HAPI FHIR (Spring Boot)
|
│ └── application.yaml # Configuración de HAPI FHIR (Spring Boot)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
NODO_BASE_URL=localhost
|
NODO_URL_BASE=localhost
|
||||||
|
|
||||||
# Bus FHIR (base, usado como fallback si no se definen MPI_URL o DOCUMENT_REGISTRY_URL)
|
# Bus FHIR (base, usado como fallback si no se definen MPI_URL o DOCUMENT_REGISTRY_URL)
|
||||||
BUS_URL=http://bus-host:8080
|
BUS_URL=http://bus-host:8080
|
||||||
|
|||||||
@ -24,7 +24,7 @@ const config = {
|
|||||||
errorKey: 'err',
|
errorKey: 'err',
|
||||||
nestedKey: null,
|
nestedKey: null,
|
||||||
},
|
},
|
||||||
baseURL: process.env.NODO_BASE_URL || 'http://localhost',
|
baseURL: process.env.NODO_URL_BASE || 'http://localhost',
|
||||||
debug: process.env.BUS_DEBUG === 'true',
|
debug: process.env.BUS_DEBUG === 'true',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
2
bus-gateway/docs/.gitignore
vendored
Normal file
2
bus-gateway/docs/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*.png
|
||||||
|
*.pdf
|
||||||
@ -1,13 +1,13 @@
|
|||||||
|
%%{init: {'theme': 'base', 'themeVariables': {'actorBkg': '#1D4ED8', 'actorBorder': '#1E3A8A', 'actorTextColor': '#FFFFFF', 'actorLineColor': '#93C5FD', 'noteBkgColor': '#FEF3C7', 'noteTextColor': '#92400E', 'noteBorderColor': '#F59E0B', 'signalColor': '#1E293B', 'signalTextColor': '#1E293B', 'labelBoxBkgColor': '#7C3AED', 'labelBoxBorderColor': '#5B21B6', 'labelTextColor': '#FFFFFF'}}}%%
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
autonumber
|
autonumber
|
||||||
participant HIS_A
|
participant HIS_A
|
||||||
participant NodoDominio as NodoDominio (HIS_A)
|
participant NodoDominio as Nodo
|
||||||
participant BusNacion as BusNacion
|
box rgb(237,233,254) PINS
|
||||||
participant FederadorNacion as Federador
|
participant FederadorNacion as Federador
|
||||||
Note over HIS_A,FederadorNacion: Gestion de Identidad (PIXm/PDQm)
|
end
|
||||||
HIS_A->>NodoDominio: ITI-104 (Crea/Actualiza)
|
Note over HIS_A,FederadorNacion: Gestion de Identidad
|
||||||
NodoDominio->>BusNacion: Enruta petición FHIR (POST /Patient)
|
HIS_A->>NodoDominio: ITI-104: Federa un nuevo paciente en el MPI <br /> [POST /Patient]
|
||||||
BusNacion->>FederadorNacion: Ejecuta operación en el Federador
|
NodoDominio->>FederadorNacion: Federa un nuevo paciente en el Federador <br /> [POST /Patient]
|
||||||
FederadorNacion-->>BusNacion: 201 Created (Recurso)
|
FederadorNacion-->>NodoDominio: 201 (Created)
|
||||||
BusNacion-->>NodoDominio: Retorna Respuesta FHIR
|
NodoDominio-->>HIS_A: 200 OK (Patient)
|
||||||
NodoDominio-->>HIS_A: Confirma Operación
|
|
||||||
|
|||||||
@ -1,20 +1,20 @@
|
|||||||
|
%%{init: {'theme': 'base', 'themeVariables': {'actorBkg': '#1D4ED8', 'actorBorder': '#1E3A8A', 'actorTextColor': '#FFFFFF', 'actorLineColor': '#93C5FD', 'noteBkgColor': '#FEF3C7', 'noteTextColor': '#92400E', 'noteBorderColor': '#F59E0B', 'signalColor': '#1E293B', 'signalTextColor': '#1E293B', 'labelBoxBkgColor': '#7C3AED', 'labelBoxBorderColor': '#5B21B6', 'labelTextColor': '#FFFFFF'}}}%%
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
autonumber
|
autonumber
|
||||||
participant HIS_A
|
participant HIS_A
|
||||||
participant NodoDominio as "Nodo Dominio (emisor)"
|
participant NodoDominio as Nodo (Emisor)
|
||||||
participant BusNacion as "Bus Nacion"
|
box rgb(237,233,254) PINS
|
||||||
participant FederadorNacion as "Federador Nacion"
|
participant FederadorNacion as Federador
|
||||||
participant IndiceNacion as "Indice Nacion"
|
participant IndiceNacion as Indice Documentos
|
||||||
|
end
|
||||||
Note over HIS_A,IndiceNacion: 1. Recepcion Local del Documento Bundle (POST /Bundle)
|
Note over HIS_A,IndiceNacion: 1. Recepcion Local del Documento Bundle (POST /Bundle)
|
||||||
HIS_A->>NodoDominio: ITI-65 (Crea/Actualiza)
|
HIS_A->>NodoDominio: ITI65: Provee un nuevo documento IPS (bundle)
|
||||||
Note over NodoDominio,FederadorNacion: 2. Resolución de Identidad (ITI-83)
|
Note right of NodoDominio: El Nodo almacena físicamente el documento y extrae la metadata.
|
||||||
NodoDominio->>BusNacion: Get /Patient/$ihe-pix?sourceIdentifier=[ID_Local]
|
Note over NodoDominio,FederadorNacion: 2. Resolución de Identidad
|
||||||
BusNacion->>FederadorNacion: Consulta correspondencia
|
NodoDominio->>FederadorNacion: Busca al paciente por el su identificador local [GET /Patient?identifier=<ID_Local>]
|
||||||
FederadorNacion-->>BusNacion: 200 OK (Retorna ID Nacional)
|
FederadorNacion-->>NodoDominio: 200 OK (Patient Searchset)
|
||||||
BusNacion-->>NodoDominio: Entrega ID Nacional
|
Note over NodoDominio,IndiceNacion: 3. Enrutamiento de la Petición
|
||||||
Note over NodoDominio,IndiceNacion: 3. Enrutamiento de la Petición (POST /Bundle)
|
Note right of NodoDominio: El Nodo genera la referencia al IPS y la asocia al identificador nacional del paciente.
|
||||||
NodoDominio->>BusNacion: Publica Document Reference (GET /DocumentRefereence?subject=[ID_Nacional])
|
NodoDominio->>IndiceNacion: Guarda la referencia al IPS en el índice de documentos [POST /DocumentReference]
|
||||||
BusNacion->>IndiceNacion: Registra Referencia
|
IndiceNacion-->>NodoDominio: 201 (Created)
|
||||||
IndiceNacion-->>BusNacion: 201 (Created)
|
NodoDominio-->>HIS_A: 200 OK (DocumentReference)
|
||||||
BusNacion-->>NodoDominio: Confirma operación
|
|
||||||
NodoDominio-->>HIS_A: 200 OK (Publicación exitosa)
|
|
||||||
|
|||||||
@ -1,27 +1,22 @@
|
|||||||
|
%%{init: {'theme': 'base', 'themeVariables': {'actorBkg': '#1D4ED8', 'actorBorder': '#1E3A8A', 'actorTextColor': '#FFFFFF', 'actorLineColor': '#93C5FD', 'noteBkgColor': '#FEF3C7', 'noteTextColor': '#92400E', 'noteBorderColor': '#F59E0B', 'signalColor': '#1E293B', 'signalTextColor': '#1E293B', 'labelBoxBkgColor': '#7C3AED', 'labelBoxBorderColor': '#5B21B6', 'labelTextColor': '#FFFFFF'}}}%%
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
autonumber
|
autonumber
|
||||||
participant HIS_A
|
participant HIS_A
|
||||||
participant NodoDominio as "Nodo Dominio (emisor)"
|
participant NodoDominio as Nodo A
|
||||||
participant BusNacion as "Bus Nacion"
|
box rgb(237,233,254) PINS
|
||||||
participant FederadorNacion as "Federador Nacion"
|
participant FederadorNacion as Federador
|
||||||
participant IndiceNacion as "Indice Nacion"
|
participant IndiceNacion as Indice Documentos
|
||||||
participant NodoDominio2 as "Nodo Dominio (receptor)"
|
end
|
||||||
Note over HIS_A,FederadorNacion: 1. Busqueda y resolución de Identidad (PIXm ITI-83)
|
participant NodoDominio2 as Nodo B
|
||||||
HIS_A->>NodoDominio: ITI-67: GET /DocumentReference?subject=[ID_Lcocal]
|
Note over HIS_A,FederadorNacion: 1. Busqueda y resolución de Identidad
|
||||||
NodoDominio->>BusNacion: GET /Patient/$ihe-pix?sourceIdentifier=[ID_Local]
|
HIS_A->>NodoDominio: ITI67: Solicita los IPS asociados al paciente por su identificador local <br /> [GET /DocumentReference?patient.identifier=<ID_Local>]
|
||||||
BusNacion->>FederadorNacion: Consulta correspondencia en MPI
|
NodoDominio->>FederadorNacion: Busca el paciente por su identificador local <br /> [GET /Patient?identifier=<ID_Local>]
|
||||||
FederadorNacion-->>BusNacion: 200 OK (Retorna ID Nacional)
|
FederadorNacion-->>NodoDominio: 200 OK (Patient Searchset)
|
||||||
BusNacion-->>NodoDominio: Entrega ID Nacional
|
Note over NodoDominio,IndiceNacion: 2. Busqueda de Metadatos
|
||||||
Note over NodoDominio,IndiceNacion: 2. Busqueda de Metadatos (MHD ITI-67 adaptada)
|
Note right of NodoDominio: El Nodo obtiene el identificador nacional del paciente
|
||||||
NodoDominio->>BusNacion: GET /DocumentReference?subject=[ID_Nacional]
|
NodoDominio->>IndiceNacion: Busca los IPS asociados al paciente por su identificador nacional <br /> [GET /DocumentReference?patient=<ID_Nacional>]
|
||||||
BusNacion->>IndiceNacion: Consulta en el índice de referencias
|
IndiceNacion-->>NodoDominio: 200 OK (DocumentReference Searchset)
|
||||||
IndiceNacion-->>BusNacion: 200 OK (Bundle "searchset")
|
NodoDominio-->>HIS_A: 200 OK (DocumentReference Searchset)
|
||||||
BusNacion-->>NodoDominio: Retorna Bundle con Document Reference
|
Note over HIS_A,NodoDominio2: 3. Descarga del documento (ITI-68)
|
||||||
Note over HIS_A,NodoDominio2: 3. Descarga del documento (ITI-68 P2P)
|
HIS_A->>NodoDominio2: Obtiene el documento IPS <br /> [GET <URL_IPSBundle>]
|
||||||
HIS_A->>NodoDominio: Solicitar descarga de [URL_Directa]
|
NodoDominio2-->>HIS_A: 200 OK (IPS Bundle)
|
||||||
NodoDominio->>NodoDominio2: GET [URL_Directa] (Conexión P2P, bypass BusNación)
|
|
||||||
NodoDominio2-->>NodoDominio: 200 OK (Retorna el documento clinico)
|
|
||||||
NodoDominio-->>HIS_A: Entrega documento fisico
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
|
%%{init: {'theme': 'base', 'themeVariables': {'actorBkg': '#1D4ED8', 'actorBorder': '#1E3A8A', 'actorTextColor': '#FFFFFF', 'actorLineColor': '#93C5FD', 'noteBkgColor': '#FEF3C7', 'noteTextColor': '#92400E', 'noteBorderColor': '#F59E0B', 'signalColor': '#1E293B', 'signalTextColor': '#1E293B', 'labelBoxBkgColor': '#7C3AED', 'labelBoxBorderColor': '#5B21B6', 'labelTextColor': '#FFFFFF'}}}%%
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
autonumber
|
autonumber
|
||||||
participant HIS_A
|
participant HIS_A
|
||||||
participant NodoDominio as "Nodo Dominio (Repositorio Local)"
|
participant NodoDominio as Nodo
|
||||||
participant BusNacion as "Bus Nacion"
|
box rgb(237,233,254) PINS
|
||||||
participant FederadorNacion as "Federador Nacion"
|
participant FederadorNacion as Federador
|
||||||
Note over HIS_A,FederadorNacion: Gestion de Identidad (PIXm/PDQm)
|
end
|
||||||
HIS_A->>NodoDominio: ITI-78 (Consulta)
|
Note over HIS_A,FederadorNacion: Gestion de Identidad
|
||||||
NodoDominio->>BusNacion: Enruta petición FHIR (GET /Partient)
|
HIS_A->>NodoDominio: ITI-78: Busca un paciente en el MPI <br /> [GET /Patient?identifier=<ID_Local>]
|
||||||
BusNacion->>FederadorNacion: Ejecuta operación en el Federador
|
NodoDominio->>FederadorNacion: Busca un paciente en el Federador <br /> [GET /Patient?identifier=<ID_Local>]
|
||||||
FederadorNacion-->>BusNacion: 200 OK (Bundle)
|
FederadorNacion-->>NodoDominio: 200 OK (PatientSearchset)
|
||||||
BusNacion-->>NodoDominio: Retorna Respuesta FHIR
|
NodoDominio-->>HIS_A: 200 OK (Patient Searchset)
|
||||||
NodoDominio-->>HIS_A: Confirma Operación
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
"test": "jest"
|
"test": "jest"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.3.5",
|
"axios": "1.14.0",
|
||||||
"cookie-parser": "~1.4.4",
|
"cookie-parser": "~1.4.4",
|
||||||
"debug": "~2.6.9",
|
"debug": "~2.6.9",
|
||||||
"dotenv": "^16.0.0",
|
"dotenv": "^16.0.0",
|
||||||
@ -16,13 +16,15 @@
|
|||||||
"jade": "~1.11.0",
|
"jade": "~1.11.0",
|
||||||
"morgan": "~1.9.1",
|
"morgan": "~1.9.1",
|
||||||
"pino": "^10.3.1",
|
"pino": "^10.3.1",
|
||||||
"uuid": "^14.0.0"
|
"uuid": "9.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"jest": "^30.3.0"
|
"jest": "^30.3.0"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"testEnvironment": "node",
|
"testEnvironment": "node",
|
||||||
"setupFiles": ["./tests/setup.js"]
|
"setupFiles": [
|
||||||
|
"./tests/setup.js"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
43
diagramaContenedores.puml
Normal file
43
diagramaContenedores.puml
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
@startuml
|
||||||
|
|
||||||
|
skinparam backgroundColor #FFFFFF
|
||||||
|
|
||||||
|
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
|
||||||
|
|
||||||
|
title Diagrama de Contenedores para la Conectatón Argentina
|
||||||
|
|
||||||
|
System_Ext(historiaClinica, 'HCI', 'Registtra la historia clinica y genera resumenes de historia clinica (IPS)')
|
||||||
|
|
||||||
|
|
||||||
|
System_Boundary(nodo, 'Nodo'){
|
||||||
|
Container(nginx, 'nginx', 'Nginx', 'Direcciona las llamadas a los contenedores correspondientes')
|
||||||
|
Container(hapiFHIR, 'hapi-fhir', 'Java', 'Servidor HAPI FHIR. Brinda soporte para el almacenamiento de documentos IPS')
|
||||||
|
Container(busGateway, 'bus-gateway', 'NodeJS/Express', 'Orquesta la comunicación con los servicios del Ministerio de Salud de la nación')
|
||||||
|
ContainerDb(hapiDB, 'hapi-db', 'Postgres', 'Almacena datos del servidor HAPI FHIR')
|
||||||
|
}
|
||||||
|
|
||||||
|
System_Boundary(pins, 'PINS'){
|
||||||
|
Container(federador, 'Federador', 'Java/SpringBoot', 'Brinda la funcionalidad para la federación, busqueda y obtención de pacientes')
|
||||||
|
Container(indiceDocumentos, 'Indice de Documentos', 'Java/SpringBoot', 'Servicio de registro, busqueda y obtencion de referencias a documentos de salud')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Rel(historiaClinica, nginx, 'Provee documento IPS')
|
||||||
|
Rel(historiaClinica, nginx, 'Consulta el indice de documentos')
|
||||||
|
Rel(historiaClinica, nginx, 'Obtiene documentos IPS')
|
||||||
|
Rel(historiaClinica, nginx, 'Federa pacientes')
|
||||||
|
|
||||||
|
Rel(nginx, busGateway, 'Delega ITI65, ITI67, ITI104 e ITI78')
|
||||||
|
Rel(nginx, hapiFHIR, 'Delega ITI68')
|
||||||
|
|
||||||
|
Rel(busGateway, hapiFHIR, 'Guarda documento IPS')
|
||||||
|
|
||||||
|
Rel(hapiFHIR, hapiDB, 'Persiste datos')
|
||||||
|
|
||||||
|
Rel(busGateway, federador, 'Federa, busca y recupera pacientes')
|
||||||
|
Rel(busGateway, indiceDocumentos, 'Registra, busca y repuera referencias a documentos')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@enduml
|
||||||
@ -3,7 +3,8 @@ services:
|
|||||||
container_name: hapi-fhir
|
container_name: hapi-fhir
|
||||||
image: "hapiproject/hapi:latest"
|
image: "hapiproject/hapi:latest"
|
||||||
depends_on:
|
depends_on:
|
||||||
- hapi-db
|
hapi-db:
|
||||||
|
condition: service_healthy
|
||||||
volumes:
|
volumes:
|
||||||
- ./hapi-config:/data/hapi
|
- ./hapi-config:/data/hapi
|
||||||
environment:
|
environment:
|
||||||
@ -31,53 +32,17 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- hapi-network
|
- hapi-network
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: [ "CMD-SHELL", "pg_isready -p 5433" ]
|
test: ["CMD-SHELL", "pg_isready -p 5433"]
|
||||||
interval: 20s
|
interval: 20s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 5
|
retries: 5
|
||||||
command: -p 5433
|
command: -p 5433
|
||||||
|
|
||||||
gdhcn-validator-service:
|
|
||||||
container_name: gdhcn-validator-service
|
|
||||||
image: createchile/gdhcn-validator_backend:v1.1
|
|
||||||
ports:
|
|
||||||
- 8182:8080
|
|
||||||
secrets:
|
|
||||||
- trust-network-cert
|
|
||||||
- trust-network-key
|
|
||||||
- signature-key
|
|
||||||
environment:
|
|
||||||
- POSTGRES_DB=gdhcn-validator
|
|
||||||
- SERVER_PORT=8080
|
|
||||||
- SPRING_DATASOURCE_URL=jdbc:postgresql://gdhcn-db:5432/gdhcn-validator
|
|
||||||
- SPRING_DATASOURCE_USERNAME=root
|
|
||||||
- SPRING_DATASOURCE_PASSWORD=root
|
|
||||||
- TNG_TLS_PEM=/run/secrets/trust-network-cert
|
|
||||||
- TNG_TLS_KEY=/run/secrets/trust-network-key
|
|
||||||
- TNG_DSC_PRIVATEKEY=/run/secrets/signature-key
|
|
||||||
- TNG_COUNTRY=AR
|
|
||||||
- TNG_DSC_PRIVATEKEY_KID=I1BAX8FATLs=
|
|
||||||
- GDHCN_BASEURL=${NODO_URL_BASE:-http://localhost}/gdhcn
|
|
||||||
networks:
|
|
||||||
- hapi-network
|
|
||||||
volumes:
|
|
||||||
- ./json:/json
|
|
||||||
|
|
||||||
gdhcn-db:
|
|
||||||
container_name: gdhcn-db
|
|
||||||
image: postgres:16-alpine
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- gdhcn-data:/var/lib/postgresql/data
|
|
||||||
networks:
|
|
||||||
- hapi-network
|
|
||||||
environment:
|
|
||||||
- POSTGRES_DB=gdhcn-validator
|
|
||||||
- POSTGRES_USER=root
|
|
||||||
- POSTGRES_PASSWORD=root
|
|
||||||
|
|
||||||
bus-gateway:
|
bus-gateway:
|
||||||
container_name: bus-gateway
|
container_name: bus-gateway
|
||||||
|
depends_on:
|
||||||
|
hapi-fhir:
|
||||||
|
condition: service_started
|
||||||
build:
|
build:
|
||||||
context: ./bus-gateway
|
context: ./bus-gateway
|
||||||
environment:
|
environment:
|
||||||
@ -102,8 +67,10 @@ services:
|
|||||||
container_name: nginx
|
container_name: nginx
|
||||||
image: nginx:alpine
|
image: nginx:alpine
|
||||||
depends_on:
|
depends_on:
|
||||||
- hapi-fhir
|
hapi-fhir:
|
||||||
- bus-gateway
|
condition: service_started
|
||||||
|
bus-gateway:
|
||||||
|
condition: service_started
|
||||||
environment:
|
environment:
|
||||||
TZ: ${TZ:-America/Argentina/Buenos_Aires}
|
TZ: ${TZ:-America/Argentina/Buenos_Aires}
|
||||||
ports:
|
ports:
|
||||||
@ -126,17 +93,8 @@ volumes:
|
|||||||
hapi-data:
|
hapi-data:
|
||||||
name: hapi-data
|
name: hapi-data
|
||||||
driver: local
|
driver: local
|
||||||
gdhcn-data:
|
|
||||||
name: gdhcn-data
|
|
||||||
driver: local
|
|
||||||
secrets:
|
secrets:
|
||||||
ssl_cert:
|
ssl_cert:
|
||||||
file: ${SSL_CERT_PATH:-./certs/server.crt}
|
file: ${SSL_CERT_PATH:-./certs/server.crt}
|
||||||
ssl_key:
|
ssl_key:
|
||||||
file: ${SSL_KEY_PATH:-./certs/server.key}
|
file: ${SSL_KEY_PATH:-./certs/server.key}
|
||||||
trust-network-cert:
|
|
||||||
file: ${SIGNATURE_CERT_PATH:-./certs/trust-network.pem}
|
|
||||||
trust-network-key:
|
|
||||||
file: ${SIGNATURE_KEY_PATH:-./certs/trust-network.key}
|
|
||||||
signature-key:
|
|
||||||
file: ${SSL_DCC_KEY_PATH:-./certs/signature.key}
|
|
||||||
|
|||||||
@ -66,15 +66,6 @@ http {
|
|||||||
proxy_read_timeout 90s;
|
proxy_read_timeout 90s;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /gdhcn/ {
|
|
||||||
proxy_pass http://gdhcn-validator-service:8080/;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_read_timeout 90s;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Todo lo demás va a hapi-fhir
|
# Todo lo demás va a hapi-fhir
|
||||||
location / {
|
location / {
|
||||||
proxy_pass http://hapi_fhir;
|
proxy_pass http://hapi_fhir;
|
||||||
|
|||||||
@ -82,15 +82,6 @@ http {
|
|||||||
proxy_read_timeout 90s;
|
proxy_read_timeout 90s;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /gdhcn/ {
|
|
||||||
proxy_pass http://gdhcn-validator-service:8080/;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_read_timeout 90s;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Todo lo demás va a hapi-fhir
|
# Todo lo demás va a hapi-fhir
|
||||||
location / {
|
location / {
|
||||||
proxy_pass http://hapi_fhir;
|
proxy_pass http://hapi_fhir;
|
||||||
|
|||||||
194
postman/Conectaton Argentina.postman_collection.json
Normal file
194
postman/Conectaton Argentina.postman_collection.json
Normal file
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user