Compare commits

..

No commits in common. "master" and "agomez_feature_gdhcn_activo" have entirely different histories.

15 changed files with 180 additions and 364 deletions

View File

@ -4,35 +4,29 @@
# ============================================================================= # =============================================================================
# ============================================================================= # =============================================================================
# VARIABLES DE ENTORNO REQUERIDAS # NODO
# ============================================================================= # =============================================================================
# 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
@ -63,6 +57,19 @@ 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)
# ============================================================================= # =============================================================================

View File

@ -14,6 +14,7 @@ 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 │
└──────────────────────────────────────────────┘ └──────────────────────────────────────────────┘
``` ```
@ -25,11 +26,13 @@ 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). **Volúmenes persistentes**: `hapi-data` (PostgreSQL de HAPI), `gdhcn-data` (PostgreSQL de GDHCN).
## Transacciones IHE implementadas ## Transacciones IHE implementadas
@ -47,21 +50,9 @@ 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
@ -79,13 +70,8 @@ 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) |
> **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: | `./certs/signature.key` | Clave privada para firma de documentos (DSC) |
>
> ```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.
@ -119,17 +105,7 @@ 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 **3040 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: HAPI FHIR tarda aproximadamente **3040 segundos** en inicializar. El `bus-gateway` espera activamente a que el servidor FHIR esté listo antes de aceptar conexiones (hasta ~3 minutos de reintentos).
```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
@ -140,8 +116,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
# Verificación de llegada al Bus mediante la consulta de un paciente. # Health check del Bus Gateway a través de nginx
curl --location 'http://localhost/fhir/Patient?identifier=http%3A%2F%2Fwww.renaper.gob.ar%2Fdni%7C30945027' curl http://localhost/fhir/Patient?_summary=count
# Logs de un servicio específico # Logs de un servicio específico
docker compose logs -f bus-gateway docker compose logs -f bus-gateway
@ -183,6 +159,7 @@ 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 |
@ -200,6 +177,14 @@ 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 |
@ -218,7 +203,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 (4 servicios) ├── docker-compose.yml # Orquestación principal (6 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)

View File

@ -1,4 +1,4 @@
NODO_URL_BASE=localhost NODO_BASE_URL=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

View File

@ -24,7 +24,7 @@ const config = {
errorKey: 'err', errorKey: 'err',
nestedKey: null, nestedKey: null,
}, },
baseURL: process.env.NODO_URL_BASE || 'http://localhost', baseURL: process.env.NODO_BASE_URL || 'http://localhost',
debug: process.env.BUS_DEBUG === 'true', debug: process.env.BUS_DEBUG === 'true',
}; };

View File

@ -1,2 +0,0 @@
*.png
*.pdf

View File

@ -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 participant NodoDominio as NodoDominio (HIS_A)
box rgb(237,233,254) PINS participant BusNacion as BusNacion
participant FederadorNacion as Federador participant FederadorNacion as Federador
end Note over HIS_A,FederadorNacion: Gestion de Identidad (PIXm/PDQm)
Note over HIS_A,FederadorNacion: Gestion de Identidad HIS_A->>NodoDominio: ITI-104 (Crea/Actualiza)
HIS_A->>NodoDominio: ITI-104: Federa un nuevo paciente en el MPI <br /> [POST /Patient] NodoDominio->>BusNacion: Enruta petición FHIR (POST /Patient)
NodoDominio->>FederadorNacion: Federa un nuevo paciente en el Federador <br /> [POST /Patient] BusNacion->>FederadorNacion: Ejecuta operación en el Federador
FederadorNacion-->>NodoDominio: 201 (Created) FederadorNacion-->>BusNacion: 201 Created (Recurso)
NodoDominio-->>HIS_A: 200 OK (Patient) BusNacion-->>NodoDominio: Retorna Respuesta FHIR
NodoDominio-->>HIS_A: Confirma Operación

View File

@ -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 (Emisor) participant NodoDominio as "Nodo Dominio (emisor)"
box rgb(237,233,254) PINS participant BusNacion as "Bus Nacion"
participant FederadorNacion as Federador participant FederadorNacion as "Federador Nacion"
participant IndiceNacion as Indice Documentos participant IndiceNacion as "Indice Nacion"
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: ITI65: Provee un nuevo documento IPS (bundle) HIS_A->>NodoDominio: ITI-65 (Crea/Actualiza)
Note right of NodoDominio: El Nodo almacena físicamente el documento y extrae la metadata. Note over NodoDominio,FederadorNacion: 2. Resolución de Identidad (ITI-83)
Note over NodoDominio,FederadorNacion: 2. Resolución de Identidad NodoDominio->>BusNacion: Get /Patient/$ihe-pix?sourceIdentifier=[ID_Local]
NodoDominio->>FederadorNacion: Busca al paciente por el su identificador local [GET /Patient?identifier=<ID_Local>] BusNacion->>FederadorNacion: Consulta correspondencia
FederadorNacion-->>NodoDominio: 200 OK (Patient Searchset) FederadorNacion-->>BusNacion: 200 OK (Retorna ID Nacional)
Note over NodoDominio,IndiceNacion: 3. Enrutamiento de la Petición BusNacion-->>NodoDominio: Entrega ID Nacional
Note right of NodoDominio: El Nodo genera la referencia al IPS y la asocia al identificador nacional del paciente. Note over NodoDominio,IndiceNacion: 3. Enrutamiento de la Petición (POST /Bundle)
NodoDominio->>IndiceNacion: Guarda la referencia al IPS en el índice de documentos [POST /DocumentReference] NodoDominio->>BusNacion: Publica Document Reference (GET /DocumentRefereence?subject=[ID_Nacional])
IndiceNacion-->>NodoDominio: 201 (Created) BusNacion->>IndiceNacion: Registra Referencia
NodoDominio-->>HIS_A: 200 OK (DocumentReference) IndiceNacion-->>BusNacion: 201 (Created)
BusNacion-->>NodoDominio: Confirma operación
NodoDominio-->>HIS_A: 200 OK (Publicación exitosa)

View File

@ -1,22 +1,27 @@
%%{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 A participant NodoDominio as "Nodo Dominio (emisor)"
box rgb(237,233,254) PINS participant BusNacion as "Bus Nacion"
participant FederadorNacion as Federador participant FederadorNacion as "Federador Nacion"
participant IndiceNacion as Indice Documentos participant IndiceNacion as "Indice Nacion"
end participant NodoDominio2 as "Nodo Dominio (receptor)"
participant NodoDominio2 as Nodo B Note over HIS_A,FederadorNacion: 1. Busqueda y resolución de Identidad (PIXm ITI-83)
Note over HIS_A,FederadorNacion: 1. Busqueda y resolución de Identidad HIS_A->>NodoDominio: ITI-67: GET /DocumentReference?subject=[ID_Lcocal]
HIS_A->>NodoDominio: ITI67: Solicita los IPS asociados al paciente por su identificador local <br /> [GET /DocumentReference?patient.identifier=<ID_Local>] NodoDominio->>BusNacion: GET /Patient/$ihe-pix?sourceIdentifier=[ID_Local]
NodoDominio->>FederadorNacion: Busca el paciente por su identificador local <br /> [GET /Patient?identifier=<ID_Local>] BusNacion->>FederadorNacion: Consulta correspondencia en MPI
FederadorNacion-->>NodoDominio: 200 OK (Patient Searchset) FederadorNacion-->>BusNacion: 200 OK (Retorna ID Nacional)
Note over NodoDominio,IndiceNacion: 2. Busqueda de Metadatos BusNacion-->>NodoDominio: Entrega ID Nacional
Note right of NodoDominio: El Nodo obtiene el identificador nacional del paciente Note over NodoDominio,IndiceNacion: 2. Busqueda de Metadatos (MHD ITI-67 adaptada)
NodoDominio->>IndiceNacion: Busca los IPS asociados al paciente por su identificador nacional <br /> [GET /DocumentReference?patient=<ID_Nacional>] NodoDominio->>BusNacion: GET /DocumentReference?subject=[ID_Nacional]
IndiceNacion-->>NodoDominio: 200 OK (DocumentReference Searchset) BusNacion->>IndiceNacion: Consulta en el índice de referencias
NodoDominio-->>HIS_A: 200 OK (DocumentReference Searchset) IndiceNacion-->>BusNacion: 200 OK (Bundle "searchset")
Note over HIS_A,NodoDominio2: 3. Descarga del documento (ITI-68) BusNacion-->>NodoDominio: Retorna Bundle con Document Reference
HIS_A->>NodoDominio2: Obtiene el documento IPS <br /> [GET <URL_IPSBundle>] Note over HIS_A,NodoDominio2: 3. Descarga del documento (ITI-68 P2P)
NodoDominio2-->>HIS_A: 200 OK (IPS Bundle) 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

View File

@ -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 participant NodoDominio as "Nodo Dominio (Repositorio Local)"
box rgb(237,233,254) PINS participant BusNacion as "Bus Nacion"
participant FederadorNacion as Federador participant FederadorNacion as "Federador Nacion"
end Note over HIS_A,FederadorNacion: Gestion de Identidad (PIXm/PDQm)
Note over HIS_A,FederadorNacion: Gestion de Identidad HIS_A->>NodoDominio: ITI-78 (Consulta)
HIS_A->>NodoDominio: ITI-78: Busca un paciente en el MPI <br /> [GET /Patient?identifier=<ID_Local>] NodoDominio->>BusNacion: Enruta petición FHIR (GET /Partient)
NodoDominio->>FederadorNacion: Busca un paciente en el Federador <br /> [GET /Patient?identifier=<ID_Local>] BusNacion->>FederadorNacion: Ejecuta operación en el Federador
FederadorNacion-->>NodoDominio: 200 OK (PatientSearchset) FederadorNacion-->>BusNacion: 200 OK (Bundle)
NodoDominio-->>HIS_A: 200 OK (Patient Searchset) BusNacion-->>NodoDominio: Retorna Respuesta FHIR
NodoDominio-->>HIS_A: Confirma Operación

View File

@ -7,7 +7,7 @@
"test": "jest" "test": "jest"
}, },
"dependencies": { "dependencies": {
"axios": "1.14.0", "axios": "^1.3.5",
"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,15 +16,13 @@
"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": "9.0.1" "uuid": "^14.0.0"
}, },
"devDependencies": { "devDependencies": {
"jest": "^30.3.0" "jest": "^30.3.0"
}, },
"jest": { "jest": {
"testEnvironment": "node", "testEnvironment": "node",
"setupFiles": [ "setupFiles": ["./tests/setup.js"]
"./tests/setup.js"
]
} }
} }

View File

@ -1,43 +0,0 @@
@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

View File

@ -3,8 +3,7 @@ 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:
@ -38,11 +37,47 @@ services:
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:
@ -67,10 +102,8 @@ services:
container_name: nginx container_name: nginx
image: nginx:alpine image: nginx:alpine
depends_on: depends_on:
hapi-fhir: - hapi-fhir
condition: service_started - bus-gateway
bus-gateway:
condition: service_started
environment: environment:
TZ: ${TZ:-America/Argentina/Buenos_Aires} TZ: ${TZ:-America/Argentina/Buenos_Aires}
ports: ports:
@ -93,8 +126,17 @@ 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}

View File

@ -66,6 +66,15 @@ 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;

View File

@ -82,6 +82,15 @@ 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;

File diff suppressed because one or more lines are too long