diff --git a/bus-gateway/bin/www b/bus-gateway/bin/www index c57792a..6f3bc12 100755 --- a/bus-gateway/bin/www +++ b/bus-gateway/bin/www @@ -1,90 +1,68 @@ #!/usr/bin/env node -/** - * Module dependencies. - */ - var app = require('../app'); var debug = require('debug')('bus-gateway:server'); var http = require('http'); - -/** - * Get port from environment and store in Express. - */ +var axios = require('axios'); +var config = require('../config'); var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); -/** - * Create HTTP server. - */ - var server = http.createServer(app); -/** - * Listen on provided port, on all network interfaces. - */ +const HAPI_HEALTH_URL = `${config.fhir.url}/metadata`; +const RETRY_DELAY_MS = 5000; +const MAX_ATTEMPTS = 36; // 3 minutos máximo -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); +async function waitForHapi() { + for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) { + try { + await axios.get(HAPI_HEALTH_URL, { timeout: 5000 }); + console.log(`[${new Date().toISOString()}] HAPI FHIR está listo`); + return; + } catch { + console.log(`[${new Date().toISOString()}] Esperando HAPI FHIR (intento ${attempt}/${MAX_ATTEMPTS})...`); + await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS)); + } + } + console.error(`[${new Date().toISOString()}] HAPI FHIR no respondió en el tiempo máximo de espera`); + process.exit(1); +} -/** - * Normalize a port into a number, string, or false. - */ +waitForHapi().then(() => { + server.listen(port); + server.on('error', onError); + server.on('listening', onListening); +}); function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; + var port = parseInt(val, 10); + if (isNaN(port)) return val; + if (port >= 0) return port; + return false; } -/** - * Event listener for HTTP server "error" event. - */ - function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } + if (error.syscall !== 'listen') throw error; + var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } } -/** - * Event listener for HTTP server "listening" event. - */ - function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); + var addr = server.address(); + var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; + debug('Listening on ' + bind); + console.log(`[${new Date().toISOString()}] bus-gateway escuchando en ${bind}`); } diff --git a/docker-compose.yml b/docker-compose.yml index f2bab9b..1b66307 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,6 @@ services: hapi-fhir: + container_name: hapi-fhir image: "hapiproject/hapi:latest" depends_on: - hapi-db @@ -15,8 +16,8 @@ services: SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT: ${SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT} networks: - hapi-network - hapi-db: + container_name: hapi-db image: "postgres:14.6" restart: always user: root @@ -42,9 +43,9 @@ services: ports: - 8182:8080 secrets: - - signature-cert + - trust-network-cert + - trust-network-key - signature-key - - dsc-key environment: - POSTGRES_DB=gdhcn-validator - SERVER_PORT=8080 @@ -52,9 +53,9 @@ services: - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=root - TNG_TLS_PEM=/run/secrets/trust-network-cert - - TNG_TLS_KEY=/run/secrets/trust-netowrk-key + - TNG_TLS_KEY=/run/secrets/trust-network-key - TNG_DSC_PRIVATEKEY=/run/secrets/signature-key - - TNG_COUNTRY=XJ + - TNG_COUNTRY=AR - TNG_DSC_PRIVATEKEY_KID=I1BAX8FATLs= - GDHCN_BASEURL=${NODO_BASE_URL:-http://localhost}/gdhcn networks: @@ -63,6 +64,7 @@ services: - ./json:/json gdhcn-db: + container_name: gdhcn-db image: postgres:16-alpine restart: always volumes: @@ -75,6 +77,7 @@ services: - POSTGRES_PASSWORD=root bus-gateway: + container_name: bus-gateway build: context: ./bus-gateway environment: @@ -96,6 +99,7 @@ services: command: node --inspect=0.0.0.0:9229 ./bin/www nginx: + container_name: nginx image: nginx:alpine depends_on: - hapi-fhir @@ -133,6 +137,6 @@ secrets: trust-network-cert: file: ${SIGNATURE_CERT_PATH:-./certs/trust-network.pem} trust-network-key: - file: ${SIGNATURE_KEY_PATH:-./certs/trust-netowrk.key} + file: ${SIGNATURE_KEY_PATH:-./certs/trust-network.key} signature-key: file: ${SSL_DCC_KEY_PATH:-./certs/signature.key}