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)
|
||||
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
|
||||
BUS_JWT_SECRET=your-shared-secret
|
||||
|
||||
# Identificador del emisor JWT (ej.: URL del repositorio del nodo)
|
||||
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
|
||||
MPI_SCOPE=Patient/*.read,Patient/*.write
|
||||
|
||||
@ -57,19 +63,6 @@ NGINX_CONF=http
|
||||
# SSL_CERT_PATH=./certs/server.crt
|
||||
# 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)
|
||||
# =============================================================================
|
||||
|
||||
53
README.md
53
README.md
@ -14,7 +14,6 @@ Internet / Red interna
|
||||
│ /fhir/IPSDocument → bus-gateway:3000 │
|
||||
│ /fhir/DocumentReference→ bus-gateway:3000 │
|
||||
│ /fhir/Patient → bus-gateway:3000 │
|
||||
│ /gdhcn/* → gdhcn-validator-service │
|
||||
│ /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-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) |
|
||||
| `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 |
|
||||
|
||||
**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
|
||||
|
||||
@ -50,9 +47,21 @@ El `bus-gateway` implementa los siguientes perfiles de interoperabilidad:
|
||||
|
||||
## Requisitos
|
||||
|
||||
### Software
|
||||
|
||||
- Docker >= 20.10.8
|
||||
- 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
|
||||
|
||||
### 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 |
|
||||
|---|---|
|
||||
| `./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.
|
||||
|
||||
@ -105,7 +119,17 @@ Los parámetros del servidor FHIR se ajustan en [hapi-config/application.yaml](h
|
||||
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
|
||||
|
||||
@ -116,8 +140,8 @@ docker compose ps
|
||||
# CapabilityStatement FHIR a través de nginx
|
||||
curl http://localhost/fhir/metadata
|
||||
|
||||
# Health check del Bus Gateway a través de nginx
|
||||
curl http://localhost/fhir/Patient?_summary=count
|
||||
# Verificación de llegada al Bus mediante la consulta de un paciente.
|
||||
curl --location 'http://localhost/fhir/Patient?identifier=http%3A%2F%2Fwww.renaper.gob.ar%2Fdni%7C30945027'
|
||||
|
||||
# Logs de un servicio específico
|
||||
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 |
|
||||
|---|---|---|
|
||||
| `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) |
|
||||
| `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_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
|
||||
|
||||
| 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/
|
||||
├── docker-compose.yml # Orquestación principal (6 servicios)
|
||||
├── docker-compose.yml # Orquestación principal (4 servicios)
|
||||
├── .env.example # Plantilla de variables de entorno
|
||||
├── hapi-config/
|
||||
│ └── 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_URL=http://bus-host:8080
|
||||
|
||||
@ -24,7 +24,7 @@ const config = {
|
||||
errorKey: 'err',
|
||||
nestedKey: null,
|
||||
},
|
||||
baseURL: process.env.NODO_BASE_URL || 'http://localhost',
|
||||
baseURL: process.env.NODO_URL_BASE || 'http://localhost',
|
||||
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
|
||||
autonumber
|
||||
participant HIS_A
|
||||
participant NodoDominio as NodoDominio (HIS_A)
|
||||
participant BusNacion as BusNacion
|
||||
participant FederadorNacion as Federador
|
||||
Note over HIS_A,FederadorNacion: Gestion de Identidad (PIXm/PDQm)
|
||||
HIS_A->>NodoDominio: ITI-104 (Crea/Actualiza)
|
||||
NodoDominio->>BusNacion: Enruta petición FHIR (POST /Patient)
|
||||
BusNacion->>FederadorNacion: Ejecuta operación en el Federador
|
||||
FederadorNacion-->>BusNacion: 201 Created (Recurso)
|
||||
BusNacion-->>NodoDominio: Retorna Respuesta FHIR
|
||||
NodoDominio-->>HIS_A: Confirma Operación
|
||||
participant NodoDominio as Nodo
|
||||
box rgb(237,233,254) PINS
|
||||
participant FederadorNacion as Federador
|
||||
end
|
||||
Note over HIS_A,FederadorNacion: Gestion de Identidad
|
||||
HIS_A->>NodoDominio: ITI-104: Federa un nuevo paciente en el MPI <br /> [POST /Patient]
|
||||
NodoDominio->>FederadorNacion: Federa un nuevo paciente en el Federador <br /> [POST /Patient]
|
||||
FederadorNacion-->>NodoDominio: 201 (Created)
|
||||
NodoDominio-->>HIS_A: 200 OK (Patient)
|
||||
|
||||
@ -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
|
||||
autonumber
|
||||
participant HIS_A
|
||||
participant NodoDominio as "Nodo Dominio (emisor)"
|
||||
participant BusNacion as "Bus Nacion"
|
||||
participant FederadorNacion as "Federador Nacion"
|
||||
participant IndiceNacion as "Indice Nacion"
|
||||
participant NodoDominio as Nodo (Emisor)
|
||||
box rgb(237,233,254) PINS
|
||||
participant FederadorNacion as Federador
|
||||
participant IndiceNacion as Indice Documentos
|
||||
end
|
||||
Note over HIS_A,IndiceNacion: 1. Recepcion Local del Documento Bundle (POST /Bundle)
|
||||
HIS_A->>NodoDominio: ITI-65 (Crea/Actualiza)
|
||||
Note over NodoDominio,FederadorNacion: 2. Resolución de Identidad (ITI-83)
|
||||
NodoDominio->>BusNacion: Get /Patient/$ihe-pix?sourceIdentifier=[ID_Local]
|
||||
BusNacion->>FederadorNacion: Consulta correspondencia
|
||||
FederadorNacion-->>BusNacion: 200 OK (Retorna ID Nacional)
|
||||
BusNacion-->>NodoDominio: Entrega ID Nacional
|
||||
Note over NodoDominio,IndiceNacion: 3. Enrutamiento de la Petición (POST /Bundle)
|
||||
NodoDominio->>BusNacion: Publica Document Reference (GET /DocumentRefereence?subject=[ID_Nacional])
|
||||
BusNacion->>IndiceNacion: Registra Referencia
|
||||
IndiceNacion-->>BusNacion: 201 (Created)
|
||||
BusNacion-->>NodoDominio: Confirma operación
|
||||
NodoDominio-->>HIS_A: 200 OK (Publicación exitosa)
|
||||
HIS_A->>NodoDominio: ITI65: Provee un nuevo documento IPS (bundle)
|
||||
Note right of NodoDominio: El Nodo almacena físicamente el documento y extrae la metadata.
|
||||
Note over NodoDominio,FederadorNacion: 2. Resolución de Identidad
|
||||
NodoDominio->>FederadorNacion: Busca al paciente por el su identificador local [GET /Patient?identifier=<ID_Local>]
|
||||
FederadorNacion-->>NodoDominio: 200 OK (Patient Searchset)
|
||||
Note over NodoDominio,IndiceNacion: 3. Enrutamiento de la Petición
|
||||
Note right of NodoDominio: El Nodo genera la referencia al IPS y la asocia al identificador nacional del paciente.
|
||||
NodoDominio->>IndiceNacion: Guarda la referencia al IPS en el índice de documentos [POST /DocumentReference]
|
||||
IndiceNacion-->>NodoDominio: 201 (Created)
|
||||
NodoDominio-->>HIS_A: 200 OK (DocumentReference)
|
||||
|
||||
@ -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
|
||||
autonumber
|
||||
participant HIS_A
|
||||
participant NodoDominio as "Nodo Dominio (emisor)"
|
||||
participant BusNacion as "Bus Nacion"
|
||||
participant FederadorNacion as "Federador Nacion"
|
||||
participant IndiceNacion as "Indice Nacion"
|
||||
participant NodoDominio2 as "Nodo Dominio (receptor)"
|
||||
Note over HIS_A,FederadorNacion: 1. Busqueda y resolución de Identidad (PIXm ITI-83)
|
||||
HIS_A->>NodoDominio: ITI-67: GET /DocumentReference?subject=[ID_Lcocal]
|
||||
NodoDominio->>BusNacion: GET /Patient/$ihe-pix?sourceIdentifier=[ID_Local]
|
||||
BusNacion->>FederadorNacion: Consulta correspondencia en MPI
|
||||
FederadorNacion-->>BusNacion: 200 OK (Retorna ID Nacional)
|
||||
BusNacion-->>NodoDominio: Entrega ID Nacional
|
||||
Note over NodoDominio,IndiceNacion: 2. Busqueda de Metadatos (MHD ITI-67 adaptada)
|
||||
NodoDominio->>BusNacion: GET /DocumentReference?subject=[ID_Nacional]
|
||||
BusNacion->>IndiceNacion: Consulta en el índice de referencias
|
||||
IndiceNacion-->>BusNacion: 200 OK (Bundle "searchset")
|
||||
BusNacion-->>NodoDominio: Retorna Bundle con Document Reference
|
||||
Note over HIS_A,NodoDominio2: 3. Descarga del documento (ITI-68 P2P)
|
||||
HIS_A->>NodoDominio: Solicitar descarga de [URL_Directa]
|
||||
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
|
||||
|
||||
|
||||
|
||||
participant NodoDominio as Nodo A
|
||||
box rgb(237,233,254) PINS
|
||||
participant FederadorNacion as Federador
|
||||
participant IndiceNacion as Indice Documentos
|
||||
end
|
||||
participant NodoDominio2 as Nodo B
|
||||
Note over HIS_A,FederadorNacion: 1. Busqueda y resolución de Identidad
|
||||
HIS_A->>NodoDominio: ITI67: Solicita los IPS asociados al paciente por su identificador local <br /> [GET /DocumentReference?patient.identifier=<ID_Local>]
|
||||
NodoDominio->>FederadorNacion: Busca el paciente por su identificador local <br /> [GET /Patient?identifier=<ID_Local>]
|
||||
FederadorNacion-->>NodoDominio: 200 OK (Patient Searchset)
|
||||
Note over NodoDominio,IndiceNacion: 2. Busqueda de Metadatos
|
||||
Note right of NodoDominio: El Nodo obtiene el identificador nacional del paciente
|
||||
NodoDominio->>IndiceNacion: Busca los IPS asociados al paciente por su identificador nacional <br /> [GET /DocumentReference?patient=<ID_Nacional>]
|
||||
IndiceNacion-->>NodoDominio: 200 OK (DocumentReference Searchset)
|
||||
NodoDominio-->>HIS_A: 200 OK (DocumentReference Searchset)
|
||||
Note over HIS_A,NodoDominio2: 3. Descarga del documento (ITI-68)
|
||||
HIS_A->>NodoDominio2: Obtiene el documento IPS <br /> [GET <URL_IPSBundle>]
|
||||
NodoDominio2-->>HIS_A: 200 OK (IPS Bundle)
|
||||
|
||||
@ -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
|
||||
autonumber
|
||||
participant HIS_A
|
||||
participant NodoDominio as "Nodo Dominio (Repositorio Local)"
|
||||
participant BusNacion as "Bus Nacion"
|
||||
participant FederadorNacion as "Federador Nacion"
|
||||
Note over HIS_A,FederadorNacion: Gestion de Identidad (PIXm/PDQm)
|
||||
HIS_A->>NodoDominio: ITI-78 (Consulta)
|
||||
NodoDominio->>BusNacion: Enruta petición FHIR (GET /Partient)
|
||||
BusNacion->>FederadorNacion: Ejecuta operación en el Federador
|
||||
FederadorNacion-->>BusNacion: 200 OK (Bundle)
|
||||
BusNacion-->>NodoDominio: Retorna Respuesta FHIR
|
||||
NodoDominio-->>HIS_A: Confirma Operación
|
||||
participant NodoDominio as Nodo
|
||||
box rgb(237,233,254) PINS
|
||||
participant FederadorNacion as Federador
|
||||
end
|
||||
Note over HIS_A,FederadorNacion: Gestion de Identidad
|
||||
HIS_A->>NodoDominio: ITI-78: Busca un paciente en el MPI <br /> [GET /Patient?identifier=<ID_Local>]
|
||||
NodoDominio->>FederadorNacion: Busca un paciente en el Federador <br /> [GET /Patient?identifier=<ID_Local>]
|
||||
FederadorNacion-->>NodoDominio: 200 OK (PatientSearchset)
|
||||
NodoDominio-->>HIS_A: 200 OK (Patient Searchset)
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
"test": "jest"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^1.3.5",
|
||||
"axios": "1.14.0",
|
||||
"cookie-parser": "~1.4.4",
|
||||
"debug": "~2.6.9",
|
||||
"dotenv": "^16.0.0",
|
||||
@ -16,13 +16,15 @@
|
||||
"jade": "~1.11.0",
|
||||
"morgan": "~1.9.1",
|
||||
"pino": "^10.3.1",
|
||||
"uuid": "^14.0.0"
|
||||
"uuid": "9.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jest": "^30.3.0"
|
||||
},
|
||||
"jest": {
|
||||
"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
|
||||
image: "hapiproject/hapi:latest"
|
||||
depends_on:
|
||||
- hapi-db
|
||||
hapi-db:
|
||||
condition: service_healthy
|
||||
volumes:
|
||||
- ./hapi-config:/data/hapi
|
||||
environment:
|
||||
@ -31,53 +32,17 @@ services:
|
||||
networks:
|
||||
- hapi-network
|
||||
healthcheck:
|
||||
test: [ "CMD-SHELL", "pg_isready -p 5433" ]
|
||||
test: ["CMD-SHELL", "pg_isready -p 5433"]
|
||||
interval: 20s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
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:
|
||||
container_name: bus-gateway
|
||||
depends_on:
|
||||
hapi-fhir:
|
||||
condition: service_started
|
||||
build:
|
||||
context: ./bus-gateway
|
||||
environment:
|
||||
@ -102,8 +67,10 @@ services:
|
||||
container_name: nginx
|
||||
image: nginx:alpine
|
||||
depends_on:
|
||||
- hapi-fhir
|
||||
- bus-gateway
|
||||
hapi-fhir:
|
||||
condition: service_started
|
||||
bus-gateway:
|
||||
condition: service_started
|
||||
environment:
|
||||
TZ: ${TZ:-America/Argentina/Buenos_Aires}
|
||||
ports:
|
||||
@ -126,17 +93,8 @@ volumes:
|
||||
hapi-data:
|
||||
name: hapi-data
|
||||
driver: local
|
||||
gdhcn-data:
|
||||
name: gdhcn-data
|
||||
driver: local
|
||||
secrets:
|
||||
ssl_cert:
|
||||
file: ${SSL_CERT_PATH:-./certs/server.crt}
|
||||
ssl_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;
|
||||
}
|
||||
|
||||
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
|
||||
location / {
|
||||
proxy_pass http://hapi_fhir;
|
||||
|
||||
@ -82,15 +82,6 @@ http {
|
||||
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
|
||||
location / {
|
||||
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