Author SHA1 Message Date
Piotr Mankowski 4f8cfe86c9 Server updates 2023-07-12 16:04:09 +00:00
Piotr Mankowski fb91d5dd90 First pass at config variable consolidation in .env
Fixes
2022-11-08 01:34:22 +00:00
Piotr Mankowski 7def1d9dda Merge pull request #1 from I-TECH-UW/pmanko-patch-openelis
Testing of single-command setup
2022-10-17 14:11:01 -07:00
Piotr Mankowski 5b392ded8a CI fix 2022-09-30 15:32:12 -07:00
Piotr Mankowski e8fdec42ff CI fix 2022-09-30 15:08:56 -07:00
Piotr Mankowski 650ce61800 CI fix 2022-09-30 14:54:54 -07:00
Piotr Mankowski 401338f63c CI and setup updates 2022-09-30 14:52:05 -07:00
Piotr Mankowski 8740a8590d Config additions 2022-09-30 13:55:09 -07:00
Piotr Mankowski 8f61cc7544 Readme update 2022-09-30 13:42:34 -07:00
mozzy11 567d61448e update openelis setup 2022-09-27 21:35:22 +03:00
Piotr Mankowski c29df81fe8 OpenELIS 2022-09-25 21:46:39 -07:00
20 changed files with 22836 additions and 31 deletions

No files matched your search

+34
View File
@@ -0,0 +1,34 @@
ISANTEPLUS_VERSION=v2.3.7
ISANTEPLUS_DB_VERSION=v2.2.1
# Global
TZ=America/Los_Angeles
RESTART=unless-stopped
# COMPOSE_PROJECT_NAME="hie-botswana"
ROOT_URL=uwdigi.org
# Traefik
VERSION=latest
LOG=DEBUG
# ACME DNS-01 challenge
PROVIDER=route53
RESOLVER=1.1.1.1:53,8.8.8.8:53
EMAIL=pmanko@uw.edu
# ISANTEPLUS
ADMIN_PASSWORD=Admin123
#ISANTEPLUS_DB
DB_SERVER_NAME=isanteplus-mysql
DB_HOST_NAME=isanteplus-mysql
DB_PORT=3306
DB_ROOT_USER=root
DB_ROOT_PASSWORD=debezium
DB_USER=mysqluser
DB_PASSWORD=mysqlpw
DB_NAME=openmrs
DB_BINLOG_SERVER_ID=223344
DB_BINLOG_EXPIRE_DAYS=1
#
+61
View File
@@ -0,0 +1,61 @@
name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
release:
types: [published]
workflow_dispatch:
env:
IPLUS_DB_PW: mysqlpw
jobs:
CI:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Pull containers
run: docker-compose pull
- name: Cache containers
uses: satackey/action-docker-layer-caching@v0.0.11
continue-on-error: true
- name: Start all containers
run: docker-compose up -d
- name: Sleep for 120 seconds
run: sleep 120
shell: bash
- name: Display docker logs for openhim config
run: docker-compose logs openhim-config
- name: Show docker logs for isanteplus
run: docker logs isanteplus
- name: Wait For OpenMRS
run: docker-compose -f test.docker-compose.yml up --exit-code-from wait wait
- name: Restart streaming pipeline
run: docker-compose up -d --force-recreate streaming-pipeline
- name: Sleep for 30 seconds
run: sleep 30
shell: bash
- name: Run Basic API Tests (https://www.postman.com/itechuw/workspace/haiti-sedish/collection/1525496-192e3c9f-caea-4056-8077-b67af442f01c)
env:
POSTMAN_COLLECTION: https://www.getpostman.com/collections/22647ce67595a103f9c1
run: docker-compose -f test.docker-compose.yml up --exit-code-from newman newman
- name: Run iSantePlus QA Framework (https://github.com/IsantePlus/isanteplus-qaframework)
run: docker-compose -f test.docker-compose.yml up --exit-code-from qa qa
continue-on-error: false
+11
View File
@@ -0,0 +1,11 @@
{
"name": "ci",
"values": [
{
"key": "isanteplus-url",
"value": "http://isanteplus:8080",
"enabled": true
}
],
"_postman_variable_scope": "environment"
}
+46
View File
@@ -1,2 +1,48 @@
# HaitiHealthBox
An all-inclusive health information system setup for health facilities in Haiti
# Setup Instructions
## Step One: Install Docker
See https://docs.docker.com/engine/install/
Test to make sure both of these commands work:
```sh
docker -v
docker compose version
```
**Note: If your docker version does not support the `docker compose` syntax,
install `docker-compose` using the instructions here: https://docs.docker.com/compose/install/**
## Step Two: Get HaitiHealthBox from GitHub
Run the following command:
```sh
git clone https://github.com/I-TECH-UW/HaitiHealthBox.git
```
If you want to use a specific version from the [version list](https://github.com/I-TECH-UW/HaitiHealthBox/releases), you can check out the corresponding tag. For example, to use version `0.0.0-alpha`, run:
```sh
git checkout v0.0.0-alpha
```
Otherwise, you can use the latest `main` branch that is the default.
## Step Three: Set some configurations
Set some temporary variables to store your desired iSantePlus Database and iSantePlus admin passwords:
```sh
export IPLUS_ADMIN_PW=<your-password>
export IPLUS_DB_PW=<your-password>
```
## Step Four: Boot up Docker Enviornment
Navigate to the `HaitiHealthBox` directory on your machine and run the following command:
```sh
docker-compose up -d
```
## Step Five: Register instance in Sedish
## Step Six: test SHR pipe
+247 -31
View File
@@ -5,39 +5,91 @@ services:
# reverse proxy
###
traefik:
image: traefik:v2.6.1
image: traefik:${VERSION}
container_name: traefik
restart: ${RESTART}
ports:
- '80:80'
- '443:443'
- '8080:8080'
- "80:80"
- "443:443"
volumes:
- ./certs/:/etc/certs/
- ./volume/networking/certs.yml:/etc/traefik/dynamic_conf/certs.yml
- /var/run/docker.sock:/var/run/docker.sock
- ./configs/conf.yaml:/conf/conf.yaml
- ./configs/traefik.yaml:/etc/traefik/traefik.yaml
- certs:/etc/certs
command:
- --api.insecure=false
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.file.watch=true
- --providers.file.directory=/etc/traefik/dynamic_conf
- --log.level=${LOG}
- --entrypoints.web.address=:80
- --entrypoints.web-secure.address=:443
- --entrypoints.web.http.redirections.entrypoint.to=web-secure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --serversTransport.insecureSkipVerify=true
labels:
- 'traefik.enable=true'
- 'traefik.docker.network=haitihealthbox_local_facility'
- "traefik.http.routers.api.rule=Host(`traefik.${ROOT_URL}`)"
- "traefik.http.routers.api.service=api@internal"
- 'traefik.http.routers.api.tls=true'
- 'traefik.http.routers.api.entrypoints=web-secure'
networks:
- local_facility
environment:
- TZ
###
# Certs
###
certbot:
image: ghcr.io/i-tech-uw/certbot-route53-cron:pr-2
container_name: certbot
environment:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- ROOT_URL=${ROOT_URL-localhost}
- EMAIL=${EMAIL-example@email.org}
volumes:
- certs:/etc/letsencrypt/
- letsencrypt:/var/lib/letsencrypt
networks:
- local_facility
###
# iSantePlus Server
###
isanteplus:
container_name: isanteplus
hostname: isanteplus
image: ghcr.io/isanteplus/docker-isanteplus-server:v2.3.0
image: ghcr.io/isanteplus/docker-isanteplus-server:${ISANTEPLUS_VERSION-latest}
restart: unless-stopped
env_file:
- ./isanteplus.env
environment:
- OMRS_CONFIG_CREATE_TABLES=false
- OMRS_CONFIG_ADD_DEMO_DATA=false
- OMRS_CONFIG_CONNECTION_URL=jdbc:mysql://${DB_HOST_NAME-isanteplus-mysql}:${DB_PORT-3306}/openmrs?autoReconnect=true
- OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=true
- OMRS_JAVA_SERVER_OPTS="-Dfile.encoding=UTF-8 -server -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Djava.awt.headlesslib=true"
- OMRS_CONFIG_CONNECTION_USERNAME=${DB_USER-mysqluser}
- OMRS_CONFIG_CONNECTION_PASSWORD=${DB_PASSWORD-mysqlpw}
- OMRS_CONFIG_CONNECTION_SERVER=isanteplus-mysql
- OMRS_DEV_DEBUG_PORT=1044
volumes:
- /openmrs/data
- ./custom_modules:/custom_modules
- ./dist:/openmrs/data/frontend
logging:
driver: "json-file"
options:
max-size: "10m"
ports:
- 8080:8080
networks:
- local_facility
isanteplus-mysql:
image: ghcr.io/isanteplus/docker-isanteplus-db:v2.2.1
image: ghcr.io/isanteplus/docker-isanteplus-db:${ISANTEPLUS_DB_VERSION-latest}
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --sql_mode=""
restart: unless-stopped
container_name: isanteplus-mysql
@@ -45,17 +97,40 @@ services:
healthcheck:
test: "exit 0"
environment:
- MYSQL_DATABASE=openmrs
- MYSQL_ROOT_PASSWORD=debezium
- MYSQL_USER=mysqluser
- MYSQL_PASSWORD=mysqlpw
- MYSQL_DATABASE=${DB_NAME-openmrs}
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD-debezium}
- MYSQL_USER=${DB_USER-mysqluser}
- MYSQL_PASSWORD=${DB_PASSWORD-mysqlpw}
- MYSQL_ROOT_HOST=% # Allow docker containers to connect to mysql
volumes:
- ./mysql.cnf:/etc/mysql/conf.d/custom.cnf # mysql config preconfigured to allow binlog/debezium
- ./volume/database/isanteplus/mysql.cnf:/etc/mysql/conf.d/custom.cnf # mysql config preconfigured to allow binlog/debezium
- /var/lib/mysql
ports:
- "3306:3306"
networks:
- local_facility
streaming-pipeline:
image: ghcr.io/i-tech-uw/openmrs-fhir-analytics/streaming-binlog:latest
container_name: streaming-pipeline
healthcheck:
test: "exit 0"
volumes:
- ./configs/streaming-pipeline/config.json:/deployments/config.json
# data is the directory which you want to persist the generated parquet files
- ./tmp:/tmp
environment:
- OPENMRS_URL=http://isanteplus:8080/openmrs
- OPENMRS_USERNAME=admin
- OPENMRS_PASSWORD=${IPLUS_ADMIN_PW-Admin123}
- SINK_URL=https://openhim.sedish-haiti.org/SHR/fhir
- SINK_USERNAME=${OPENHIM_STREAMING_CLIENT-streaming}
- SINK_PASSWORD=${OPENHIM_STREAMING_PW-streaming}
- JDBC_FETCH_SIZE=10000
- JDBC_MAX_POOL_SIZE=50
- JDBC_INITIAL_POOL_SIZE=10
- JDBC_DRIVER_CLASS=com.mysql.cj.jdbc.Driver
# the 2 variable below should be same as volume mappings above
- PARQUET_PATH=/tmp
- FHIR_DEBEZIUM_CONFIG_PATH=/deployments/config.json
###
# OpenHIM
###
@@ -73,10 +148,47 @@ services:
interval: 20s
timeout: 20s
retries: 2
networks:
- hie
volumes:
- ./configs/openhim/healthcheck.js:/healthcheck.js
- ./volume/openhim/healthcheck.js:/healthcheck.js
- ./volume/openhim/config.json:/app/config/default.json
- certs:/etc/certs
networks:
- local_facility
ports:
- 8090:8080
- 5000:5000
- 5001:5001
labels:
- 'traefik.enable=true'
- 'traefik.docker.network=haitihealthbox_local_facility'
- 'traefik.http.services.openhim-api.loadbalancer.server.port=8080'
- 'traefik.http.services.openhim-api.loadbalancer.server.scheme=https'
- 'traefik.http.routers.openhim-api.service=openhim-api'
- 'traefik.http.routers.openhim-api.tls=true'
- 'traefik.http.routers.openhim-api.entrypoints=web-secure'
- 'traefik.http.routers.openhim-api.rule=Host(`openhim-api.${ROOT_URL}`)'
- 'traefik.http.services.openhim-ssl.loadbalancer.server.port=5000'
- 'traefik.http.services.openhim-ssl.loadbalancer.server.scheme=https'
- 'traefik.http.routers.openhim-ssl.service=openhim-ssl'
- 'traefik.http.routers.openhim-ssl.tls=true'
- 'traefik.http.routers.openhim-ssl.entrypoints=web-secure'
- 'traefik.http.routers.openhim-ssl.rule=Host(`${ROOT_URL}`) && PathPrefix(`/openhim-ssl`)'
- 'traefik.http.routers.openhim-ssl.middlewares=openhim-ssl'
- 'traefik.http.middlewares.openhim-ssl.stripprefix.prefixes=/openhim-ssl'
- 'traefik.http.middlewares.openhim-ssl.stripprefix.forceSlash=false'
- 'traefik.http.services.openhim-http.loadbalancer.server.port=5001'
- 'traefik.http.services.openhim-http.loadbalancer.server.scheme=http'
- 'traefik.http.routers.openhim-http.service=openhim-http'
- 'traefik.http.routers.openhim-http.tls=false'
- 'traefik.http.routers.openhim-http.entrypoints=web'
- 'traefik.http.routers.openhim-http.rule=Host(`${ROOT_URL}`) && PathPrefix(`/openhim-http`)'
- 'traefik.http.routers.openhim-http.middlewares=openhim-http'
- 'traefik.http.middlewares.openhim-http.stripprefix.prefixes=/openhim-http'
- 'traefik.http.middlewares.openhim-http.stripprefix.forceSlash=false'
openhim-console:
container_name: openhim-console
@@ -84,24 +196,30 @@ services:
image: jembi/openhim-console:latest
restart: unless-stopped
volumes:
- ./configs/openhim-console/default.json:/usr/share/nginx/html/config/default.json
- ./volume/openhim/console.json:/usr/share/nginx/html/config/default.json
healthcheck:
test: "curl -sS http://openhim-console || exit 1"
interval: 10s
timeout: 60s
retries: 3
ports:
- 3000:80
networks:
- hie
- local_facility
labels:
- 'traefik.enable=true'
- 'traefik.docker.network=haitihealthbox_local_facility'
- 'traefik.http.routers.openhim-console.tls=true'
- 'traefik.http.routers.openhim-console.entrypoints=web-secure'
- 'traefik.http.routers.openhim-console.rule=Host(`${ROOT_URL}`)'
# Loads Default OpenHIM Config
openhim-config:
container_name: openhim-config
image: ghcr.io/i-tech-uw/openhim-config:v0.0.0
volumes:
- ./configs/openhim/test-openhim-config.json:/app/test-openhim-config.json
- ./volume/openhim/initial-config.json:/app/test-openhim-config.json
networks:
- hie
- local_facility
mongo-db:
container_name: mongo-db
image: mongo:3.4
@@ -109,4 +227,102 @@ services:
- /data/db
restart: unless-stopped
networks:
- hie
- local_facility
####
# OpenELIS
####
certs:
container_name: oe-certs
image: ghcr.io/i-tech-uw/certgen:main
restart: always
environment:
- KEYSTORE_PW="kspass"
- TRUSTSTORE_PW="tspass"
volumes:
- cert-volume:/etc/openelis-global
networks:
- local_facility
database:
container_name: openelisglobal-database
image: postgres:9.5
ports:
- "15432:5432"
restart: always
env_file:
- ./volume/database/database.env
volumes:
# preserves the database between containers
- db-data:/var/lib/postgresql/data
# files here will run on install
- ./volume/database/dbInit:/docker-entrypoint-initdb.d
networks:
- local_facility
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "clinlims", "-U", "clinlims"]
timeout: 45s
interval: 10s
retries: 10
oe.openelis.org:
container_name: openelisglobal-webapp
image: ghcr.io/i-tech-uw/openelis-global-2@sha256:abc0916a3c61176571eb2e771cfeb399d0f29c9e02857879d0e12471d3ebf8f3
depends_on:
- database
ports:
#- "8095:8080"
- "8443:8443"
restart: always
environment:
- TZ=Africa/Nairobi
# context.xml doesn't seem to be able to pick up environment variables directly, so we are passing them in as CATALINA_OPTS
- CATALINA_OPTS= -Ddatasource.url=jdbc:postgresql://database:5432/clinlims -Ddatasource.username=clinlims -Ddatasource.password=clinlims
volumes:
- cert-volume:/etc/openelis-global
# - openelis-plugins-data:/var/lib/openelis-global/plugins
- ./volume/tomcat/oe_server.xml:/usr/local/tomcat/conf/server.xml
secrets:
- source: datasource.password
- source: common.properties
networks:
- local_facility
fhir.openelis.org:
container_name: external-fhir-api
image: hapiproject/hapi:v5.5.1
# ports:
# - "8081:8080"
restart: always
environment:
- hapi.fhir.auto_create_placeholder_reference_targets=true
- hapi.fhir.allow_placeholder_references=true
- hapi.fhir.allow_external_references=true
networks:
- local_facility
fhir.openelis.org.remote:
container_name: openelis-remote-source
image: hapiproject/hapi:v5.5.1
ports:
- "8081:8080"
restart: always
environment:
- hapi.fhir.auto_create_placeholder_reference_targets=true
- hapi.fhir.allow_placeholder_references=true
- hapi.fhir.allow_external_references=true
networks:
- local_facility
secrets:
datasource.password:
file: ./volume/properties/datasource.password
common.properties:
file: ./volume/properties/common.properties
volumes:
db-data:
cert-volume:
certs:
letsencrypt:
networks:
local_facility:
+48
View File
@@ -0,0 +1,48 @@
version: "3.8"
services:
# QA Framework
qa:
image: ghcr.io/isanteplus/isanteplus-qaframework:latest
container_name: qa
environment:
- ISANTEPLUS_URL=http://isanteplus:8080/openmrs
- ISANTEPLUS_USER=admin
- ISANTEPLUS_PW=Admin123
- REMOTE_URL_CHROME=http://chrome:4444/wd/hub
- TEST_OPTIONS="-Dcucumber.filter.tags=@login"
networks:
- local_facility
chrome:
image: selenium/standalone-chrome:latest
hostname: chrome
container_name: chrome
ports:
- "4444:4444"
- "7900:7900"
networks:
- local_facility
# Newman Tests
newman:
image: postman/newman
volumes:
- ./.postman:/.postman
entrypoint: newman run $POSTMAN_COLLECTION -e /.postman/env.json --insecure --timeout-request 20000 --delay-request 1000
networks:
- local_facility
wait:
container_name: wait
image: ghcr.io/i-tech-uw/wait-for-openmrs-action:v0.4.0
command:
- "http://isanteplus:8080/openmrs"
- "20"
- "10000"
networks:
- local_facility
networks:
local_facility:
external: true
name: haitihealthbox_local_facility
+4
View File
@@ -0,0 +1,4 @@
POSTGRES_USER=postgres
POSTGRES_PASSWORD=admin
POSTGRES_DB=clinlims
POSTGRES_INITDB_ARGS="--auth-host=md5"
@@ -0,0 +1,4 @@
CREATE USER clinlims PASSWORD 'clinlims';
CREATE USER admin SUPERUSER PASSWORD 'cPATaahXJlSj';
ALTER DATABASE clinlims OWNER TO clinlims;
File diff suppressed because it is too large. Load diff
+6
View File
@@ -0,0 +1,6 @@
DELETE from clinlims.site_information where name = 'siteNumber';
INSERT INTO clinlims.site_information( id, lastupdated, "name", description, "value") VALUES ( nextval('clinlims.site_information_seq'), now(), 'siteNumber', 'The site number of the this lab', 'DEV01' );
DELETE from clinlims.site_information where name = 'Accession number prefix';
INSERT INTO clinlims.site_information( id, lastupdated, "name", description, "value") VALUES ( nextval('clinlims.site_information_seq'), now(), 'Accession number prefix', 'Prefix for SITEYEARNUM format. Can not be changed if there are samples', 'DEV01' );
@@ -0,0 +1,246 @@
{
"debeziumConfigurations": {
"databaseServerName" : "$DB_SERVER_NAME",
"databaseHostName" : "$DB_HOST_NAME",
"databaseServerId" : "$DB_SERVER_ID",
"databasePort" : "$DB_PORT",
"databaseUser" : "$DB_USER",
"databasePassword" : "$DB_PASSWORD",
"databaseName" : "$DB_NAME",
"databaseOffsetStorage" : "data/offset.dat",
"databaseHistory" : "data/dbhistory.dat",
"snapshotMode" : "schema_only"
},
"eventConfigurations": {
"location": {
"enabled": "false",
"title": "Location",
"parentTable": "location",
"linkTemplates": {
"rest": "/ws/rest/v1/location/{uuid}?v=full",
"fhir": "/Location/{uuid}"
}
},
"concept": {
"enabled": "false",
"title": "Concept",
"parentTable": "concept",
"linkTemplates": {
"rest": "/ws/rest/v1/concept/{uuid}?v=full"
}
},
"cohort": {
"enabled": "true",
"title": "Cohort",
"parentTable": "cohort",
"linkTemplates": {
"rest": "/ws/rest/v1/cohort/{uuid}?v=full",
"fhir": "/Group/{uuid}"
}
},
"visittype": {
"enabled": "false",
"title": "Visit Type",
"parentTable": "visittype",
"linkTemplates": {
"rest": "/ws/rest/v1/visittype/{uuid}?v=full"
}
},
"person_address": {
"enabled": "false",
"title": "PersonAddress",
"parentTable": "person_address",
"linkTemplates": {
"rest": "/ws/rest/v1/person/{parent-uuid}/address/{uuid}?v=full"
}
},
"person_name": {
"enabled": "false",
"title": "PersonName",
"parentTable": "person_name",
"linkTemplates": {
"rest": "/ws/rest/v1/person/{parent-uuid}/name/{uuid}?v=full"
}
},
"patient_identifier": {
"enabled": "false",
"title": "PatientIdentifier",
"parentTable": "patient_identifier",
"linkTemplates": {
"rest": "/ws/rest/v1/patient/{parent-uuid}/identifier/{uuid}?v=full"
}
},
"person_attribute": {
"enabled": "false",
"title": "PersonAttribute",
"parentTable": "person_attribute",
"linkTemplates": {
"rest": "/ws/rest/v1/person/{parent-uuid}/attribute/{uuid}?v=full"
}
},
"person": {
"enabled": "true",
"title": "Person",
"parentTable": "person",
"linkTemplates": {
"rest": "/ws/rest/v1/person/{uuid}?v=full",
"fhir": "/Person/{uuid}"
}
},
"provider": {
"enabled": "true",
"title": "Provider",
"parentTable": "provider",
"linkTemplates": {
"rest": "/ws/rest/v1/provider/{uuid}?v=full",
"fhir": "/Provider/{uuid}"
}
},
"user": {
"enabled": "false",
"title": "User",
"parentTable": "user",
"linkTemplates": {
"rest": "/ws/rest/v1/user/{uuid}?v=full"
}
},
"patient": {
"enabled": "true",
"title": "Patient",
"parentTable": "person",
"parentForeignKey": "person_id",
"childPrimaryKey":"patient_id",
"linkTemplates": {
"rest": "/ws/rest/v1/patient/{uuid}?v=full",
"fhir": "/Patient/{uuid}"
}
},
"relationship": {
"enabled": "true",
"title": "Relationship",
"parentTable": "relationship",
"linkTemplates": {
"rest": "/ws/rest/v1/relationship/{uuid}?v=full",
"fhir": "/Relationship/{uuid}"
}
},
"drug": {
"enabled": "true",
"title": "Drug",
"parentTable": "drug",
"linkTemplates": {
"rest": "/ws/rest/v1/drug/{uuid}?v=full",
"fhir": "/Drug/{uuid}"
}
},
"allergy": {
"enabled": "true",
"title": "Allergy",
"parentTable": "allergy",
"linkTemplates": {
"rest": "/ws/rest/v1/allergy/{uuid}?v=full",
"fhir": "/AllergyIntolerance/{uuid}"
}
},
"form":{
"enabled": "true",
"title": "Form",
"parentTable": "form",
"linkTemplates": {
"rest": "/ws/rest/v1/form/{uuid}?v=full"
}
},
"order": {
"enabled": "true",
"title": "Order",
"parentTable": "order",
"linkTemplates": {
"rest": "/ws/rest/v1/order/{uuid}?v=full",
"fhir": "/Order/{uuid}"
}
},
"drug_order":{
"enabled": "true",
"title": "DrugOrder",
"parentTable": "drug_order",
"parentForeignKey": "order_id",
"childPrimaryKey":"order_id",
"linkTemplates": {
"rest": "/ws/rest/v1/drug_order/{uuid}?v=full",
"fhir": "/MedicationRequest/{uuid}"
}
},
"test_order": {
"enabled": "true",
"title": "TestOrder",
"parentTable": "test_order",
"parentForeignKey": "order_id",
"childPrimaryKey":"order_id",
"linkTemplates": {
"rest": "/ws/rest/v1/test_order/{uuid}?v=full",
"fhir": "/ProcedureRequest/{uuid}"
}
},
"obs": {
"enabled": "true",
"title": "Observation",
"parentTable": "obs",
"linkTemplates": {
"rest": "/ws/rest/v1/obs/{uuid}?v=full",
"fhir": "/Observation/{uuid}"
}
},
"encounter":{
"enabled": "true",
"title": "Encounter",
"parentTable": "encounter",
"linkTemplates": {
"rest": "/ws/rest/v1/encounter/{uuid}?v=full",
"fhir": "/Encounter/{uuid}"
}
},
"visit":{
"enabled": "false",
"title": "Visit",
"parentTable": "visit",
"linkTemplates": {
"rest": "/ws/rest/v1/visit/{uuid}?v=full",
"fhir": "/Encounter/{uuid}"
}
},
"program":{
"enabled": "true",
"title": "Program",
"parentTable": "program",
"linkTemplates": {
"rest": "/ws/rest/v1/program/{uuid}?v=full",
"fhir": "/Program/{uuid}"
}
},
"programenrollment":{
"enabled": "true",
"title": "Program Enrollment",
"parentTable": "programenrollment",
"linkTemplates": {
"rest": "/ws/rest/v1/programenrollment/{uuid}?v=full",
"fhir": "/Programenrollment/{uuid}"
}
},
"privilege":{
"enabled": "true",
"title": "Privilege",
"parentTable": "privilege",
"linkTemplates": {
"rest": "/ws/rest/v1/privilege/{uuid}?v=full"
}
},
"audit_message":{
"enabled": "true",
"title": "AuditMessage",
"parentTable": "audit_message",
"linkTemplates": {
"rest": "/ws/rest/sync2/messages/{uuid}"
}
}
}
}
@@ -0,0 +1,62 @@
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This is a pre-configuration for Docker MySQL to allow BinLog and replication necessary configurations for Debezium to work
# see ./openmrs-compose.yaml
# REF: https://github.com/debezium/debezium/blob/master/debezium-connector-mysql/src/test/docker/server-gtids/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
#datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
#secure-file-priv=/var/lib/mysql-files
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-error=/var/log/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid
# ----------------------------------------------
# Enable the binlog for replication & CDC
# ----------------------------------------------
# Enable binary replication log and set the prefix, expiration, and log format.
# The prefix is arbitrary, expiration can be short for integration tests but would
# be longer on a production system. Row-level info is required for ingest to work.
# Server ID is required, but this will vary on production systems
server-id = $DB_BINLOG_SERVER_ID
log_bin = mysql-bin
expire_logs_days = $DB_BINLOG_EXPIRE_DAYS
binlog_format = row
+11
View File
@@ -0,0 +1,11 @@
tls:
certificates:
- certFile: /etc/certs/live/default/fullchain.pem
keyFile: /etc/certs/live/default/privkey.pem
stores:
- default
stores:
default:
defaultCertificate:
certFile: /etc/certs/live/default/fullchain.pem
keyFile: /etc/certs/live/default/privkey.pem
+155
View File
@@ -0,0 +1,155 @@
{
"bindAddress": "0.0.0.0",
"mongo": {
"url": "mongodb://localhost/openhim",
"atnaUrl": "mongodb://localhost/openhim",
"connectionOptions": {},
"openHIMApiReadPreference": "primaryPreferred",
"openHIMApiWriteConcern": 1,
"openHIMApiReadConcern": "local"
},
"logger": {
"level": "info",
"logToDB": true,
"capDBLogs": true,
"capSize": 10000000
},
"mongoLogger": {
"options": {
"w": 0,
"useNewUrlParser": true
}
},
"router": {
"externalHostname": "uwdigi.org",
"httpPort": 5001,
"httpsPort": 5000,
"timeout": 60000
},
"bodyCull":{
"enabled":true,
"pollPeriodMins": 60
},
"api": {
"enabled": true,
"protocol": "https",
"port": 8080,
"authWindowSeconds": 10,
"maxBodiesSizeMB": 15,
"maxPayloadSizeMB": 50,
"truncateSize": 15000,
"truncateAppend": "\n[truncated ...]",
"authenticationTypes": ["basic", "token"]
},
"rerun": {
"httpPort": 7786,
"host": "localhost",
"processor": {
"enabled": false,
"pollPeriodMillis": 2000
},
"taskTransactionsLength": 50,
"activeConcurrentTasks": 3
},
"tcpAdapter": {
"httpReceiver": {
"httpPort": 7787,
"host": "localhost"
}
},
"polling": {
"enabled": false,
"pollingPort": 7788,
"host": "localhost"
},
"authentication": {
"enableMutualTLSAuthentication": true,
"enableBasicAuthentication": true,
"enableCustomTokenAuthentication": true,
"enableJWTAuthentication": false,
"jwt": {
"secretOrPublicKey": "",
"algorithms": "",
"audience": "",
"issuer": ""
}
},
"email": {
"fromAddress": "address@example.com",
"nodemailer": {
"service": "Gmail",
"auth": {
"user": "user@gmail.com",
"pass": "password"
}
}
},
"smsGateway": {
"provider": "clickatell",
"config": {
"user": "user",
"pass": "pass",
"apiID": "apiID"
}
},
"alerts": {
"enableAlerts": true,
"pollPeriodMinutes": 1,
"himInstance": "Haiti Health Box OpenHIM",
"consoleURL": "http://localhost:9000"
},
"reports": {
"enableReports": false,
"dailyReportAt": "0 7 * * *",
"weeklyReportAt": "0 7 * * 1",
"utcOffset": null
},
"events": {
"enableTSNormalization": true
},
"newUserExpiry": {
"duration": 7,
"durationType": "days"
},
"userPasswordResetExpiry": {
"duration": 1,
"durationType": "hours"
},
"auditing": {
"servers": {
"udp": {
"enabled": false,
"port": 5050
},
"tls": {
"enabled": false,
"port": 5051
},
"tcp": {
"enabled": false,
"port": 5052
}
},
"auditEvents": {
"interface": "internal",
"host": "localhost",
"port": 5051,
"auditSourceID": "OpenHIM"
}
},
"caching": {
"enabled": true,
"refreshMillis": 1000
},
"tlsClientLookup": {
"type": "in-chain"
},
"agenda": {
"startupDelay": 500
},
"certificateManagement": {
"watchFSForCert": true,
"certPath": "/etc/certs/live/default/fullchain.pem",
"keyPath": "/etc/certs/live/default/privkey.pem"
}
}
+14
View File
@@ -0,0 +1,14 @@
{
"version": "1.14.4",
"minimumCoreVersion": "5.0.0",
"protocol": "https",
"host": "52.11.216.56",
"hostPath": "",
"port": 8090,
"title": "Haiti Health Box Console",
"footerTitle": "Haiti Health Box Console",
"footerPoweredBy": "<a href='http://openhim.org/' target='_blank'>Powered by OpenHIM</a>",
"loginBanner": "",
"mediatorLastHeartbeatWarningSeconds": 60,
"mediatorLastHeartbeatDangerSeconds": 120
}
+25
View File
@@ -0,0 +1,25 @@
var http = require("https");
var options = {
host : "0.0.0.0",
port : "8080",
timeout : 1000,
rejectUnauthorized: false
};
var request = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
if (res.statusCode == 200 || res.statusCode == 401) {
process.exit(0);
}
else {
process.exit(1);
}
});
request.on('error', function(err) {
console.log('ERROR');
process.exit(1);
});
request.end();
+85
View File
@@ -0,0 +1,85 @@
{
"Users": [
{
"groups": [
"admin"
],
"firstname": "Super",
"surname": "User",
"email": "root@openhim.org",
"passwordAlgorithm": "sha512",
"passwordHash": "e12ea7a5468925ab2b6d839e5b0566c8d8e68d9dd48241282ec1c448c0b11386b499be64011c88060b241ed5a143fea90992dabb0d91a334daecd96e20156c24",
"passwordSalt": "5f49ab7df7fac0fd7860d3b1be95cbf4",
"expiry": null,
"locked": false,
"tokenType": null,
"token": null
}
],
"Clients": [],
"Channels": [
{
"methods": [
"GET",
"POST",
"DELETE",
"PUT",
"OPTIONS",
"HEAD",
"TRACE",
"CONNECT",
"PATCH"
],
"type": "http",
"allow": [],
"whitelist": [],
"authType": "public",
"matchContentTypes": [],
"properties": [],
"txViewAcl": [],
"txViewFullAcl": [],
"txRerunAcl": [],
"status": "enabled",
"rewriteUrls": false,
"addAutoRewriteRules": true,
"autoRetryEnabled": false,
"autoRetryPeriodMinutes": 60,
"routes": [
{
"type": "http",
"status": "enabled",
"forwardAuthHeader": false,
"name": "Central FHIR server",
"secured": false,
"host": "52.11.216.56",
"port": 8081,
"path": "",
"pathTransform": "",
"primary": true,
"username": "",
"password": ""
}
],
"requestBody": true,
"responseBody": true,
"rewriteUrlsConfig": [],
"name": "central fhir server",
"description": "Access to the central FHIR server",
"pollingSchedule": null,
"matchContentRegex": null,
"matchContentXpath": null,
"matchContentValue": null,
"matchContentJson": null,
"urlPattern": "^/fhir/.*$",
"tcpHost": null,
"tcpPort": null,
"updatedBy": {
"id": "6374bbabba26d10013784480",
"name": "Super User"
},
"alerts": []
}
],
"Mediators": [],
"ContactGroups": []
}
+35
View File
@@ -0,0 +1,35 @@
server.ssl.key-store = file:/etc/openelis-global/keystore
server.ssl.key-store-password = kspass
server.ssl.key-password = kspass
server.ssl.trust-store= file:/etc/openelis-global/truststore
server.ssl.trust-store-password=tspass
#/usr/local/tomcat/webapps/OpenELIS-Global/certs
encryption.general.password=kspass
spring.datasource.driver=org.postgresql.Driver
spring.datasource.url= jdbc:postgresql://172.17.0.1:5432/clinlims?currentSchema=clinlims
spring.datasource.username=clinlims
spring.datasource.password=MIvfOkcLgzPA
spring.jpa.hibernate.ddl-auto=update
org.openelisglobal.fhirstore.uri=http://fhir.openelis.org:8080/fhir/
org.openelisglobal.remote.source.uri=http://52.11.216.56:5001/fhir/
org.openelisglobal.remote.source.updateStatus=true
org.openelisglobal.remote.source.identifier=Practitioner/f9badd80-ab76-11e2-9e96-0800200c9a66
org.openelisglobal.task.useBasedOn=true
org.openelisglobal.fhir.subscriber=http://52.11.216.56:5001/fhir/
org.openelisglobal.fhir.subscriber.resources=Task,Patient,ServiceRequest,DiagnosticReport,Observation,Specimen,Practitioner,Encounter
#org.openelisglobal.facilitylist.fhirstore = http://localhost:4000/fhir/DEFAULT
# org.openelisglobal.facilitylist.authurl= http://localhost:4000/auth/token
# org.openelisglobal.facilitylist.username= root@gofr.org
# org.openelisglobal.facilitylist.password= gofr
# org.openelisglobal.facilitylist.auth= token
facilitylist.schedule.fixedRate=864000000
#provider List
org.openelisglobal.providerlist.fhirstore=http://52.11.216.56:5001/fhir/
org.openelisglobal.requester.identifier=Practitioner/f9badd80-ab76-11e2-9e96-0800200c9a66
+1
View File
@@ -0,0 +1 @@
clinlims
+167
View File
@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- Note: A "Server" is not itself a "Container", so you may not
define subcomponents such as "Valves" at this level.
Documentation at /docs/config/server.html
-->
<Server port="-1" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<!--<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />-->
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!-- A "Service" is a collection of one or more "Connectors" that share
a single "Container" Note: A "Service" is not itself a "Container",
so you may not define subcomponents such as "Valves" at this level.
Documentation at /docs/config/service.html
-->
<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<Connector port="8443" minProcessors="5" maxProcessors="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https" secure="true"
sslProtocol="TLS" SSLEnabled="true"
keystoreFile="/etc/openelis-global/keystore" keystoreType="PKCS12" keystorePass="kspass"
truststoreFile="/etc/openelis-global/truststore" truststoreType="PKCS12" truststorePass="tspass"
URIEncoding="UTF-8" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
This connector uses the NIO implementation. The default
SSLImplementation will depend on the presence of the APR/native
library and the useOpenSSL attribute of the
AprLifecycleListener.
Either JSSE or OpenSSL style configuration may be used regardless of
the SSLImplementation selected. JSSE style configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
This connector uses the APR/native implementation which always uses
OpenSSL for TLS.
Either JSSE or OpenSSL style configuration may be used. OpenSSL style
configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
certificateFile="conf/localhost-rsa-cert.pem"
certificateChainFile="conf/localhost-rsa-chain.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host).
Documentation at /docs/config/engine.html -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine name="Catalina" defaultHost="localhost">
<!--For clustering, please take a look at documentation at:
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack -->
<!-- <Realm className="org.apache.catalina.realm.LockOutRealm"> -->
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<!-- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" -->
<!-- resourceName="UserDatabase"/> -->
<!-- </Realm> -->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<!-- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" -->
<!-- prefix="localhost_access_log" suffix=".txt" -->
<!-- pattern="%h %l %u %t &quot;%r&quot; %s %b" /> -->
</Host>
</Engine>
</Service>
</Server>