diff --git a/.env b/.env index 7c50188d..39649bcb 100644 --- a/.env +++ b/.env @@ -259,6 +259,10 @@ MYSQL_DATADIR= POSTGRES_DATADIR= ODOO_FILESTORE= ODOO_CONFIG_CHECKSUMS_PATH= +OPENELIS_TRUST_STORE= +OPENELIS_KEYS= +OPENELIS_CERTS= +OPENELIS_LUCENE_INDEX= # # Public Hostnames @@ -271,6 +275,7 @@ SUPERSET_HOSTNAME=${HOST_NAME}:8088 FHIR_ODOO_HOSTNAME=${HOST_NAME}:8083 KEYCLOAK_HOSTNAME=${HOST_NAME}:8084 ORTHANC_HOSTNAME=${HOST_NAME}:8889 +OPENELIS_HOSTNAME=${HOST_NAME}:8090 # # Sample SSO Client Secrets used in the demo script @@ -324,3 +329,12 @@ AWS_SECRET_ACCESS_KEY= # Backup path for local restic repository BACKUP_PATH= + +# OEG +ADMIN_PASSWORD=superuser +OE_DB_PASSWORD=clinlims + +SSL_TRUSTSTORE_PATH=/etc/openelis-global/truststore +SSL_TRUSTSTORE_PASSWORD=tspass +SSL_KEYSTORE_PATH=/etc/openelis-global/keystore +SSL_KEYSTORE_PASSWORD=kspass diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e942fc4d..bc83d582 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [ "main" ] + branches: [ main, dev ] pull_request: - branches: [ "main" ] + branches: [ main, dev ] release: types: [published] @@ -17,8 +17,8 @@ jobs: NEXUS_USERNAME: ${{ secrets.NEXUS_USERNAME }} NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} - release: - if: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event_name == 'release' }} + publish: + if: ${{ (github.event_name == 'push' && ( github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' )) || github.event_name == 'release' }} needs: validate uses: mekomsolutions/shared-github-workflow/.github/workflows/maven-publish.yml@main secrets: diff --git a/bundled-docker/pom.xml b/bundled-docker/pom.xml index 7af79b0d..92e252e8 100644 --- a/bundled-docker/pom.xml +++ b/bundled-docker/pom.xml @@ -4,7 +4,7 @@ com.ozonehis bundled-docker Bundled Docker - 1.0.0-SNAPSHOT + 1.0.0-dev-SNAPSHOT pom @@ -20,7 +20,7 @@ UTF-8 - 1.0.0-SNAPSHOT + 1.0.0-dev-SNAPSHOT true diff --git a/docker-compose-common.yml b/docker-compose-common.yml index 50103e37..3a867134 100644 --- a/docker-compose-common.yml +++ b/docker-compose-common.yml @@ -41,7 +41,7 @@ services: restic-compose-backup.mariadb: true postgresql: - command: postgres -c wal_level=logical -c max_wal_senders=10 -c max_replication_slots=10 -c max_connections=200 + command: postgres -c wal_level=logical -c max_wal_senders=10 -c max_replication_slots=10 -c max_connections=200 -c max_slot_wal_keep_size=2GB environment: POSTGRES_DB: postgres POSTGRES_USER: ${POSTGRES_USER} diff --git a/docker-compose-demo.yml b/docker-compose-demo.yml index 259d6ea7..d53492df 100644 --- a/docker-compose-demo.yml +++ b/docker-compose-demo.yml @@ -16,6 +16,7 @@ services: - KEYCLOAK_USER_CREATION_ENABLED=${ENABLE_SSO} - KEYCLOAK_DEMO_DATA_CLIENT_ID=keycloak-admin-sa - KEYCLOAK_DEMO_DATA_CLIENT_SECRET=${KEYCLOAK_ADMIN_SA_CLIENT_SECRET} + - KEYCLOAK_HEALTHCHECK_ENDPOINT=http://keycloak:9000/health/ready restart: on-failure networks: ozone: diff --git a/docker-compose-eip-odoo-openmrs-sso.yml b/docker-compose-eip-odoo-openmrs-sso.yml new file mode 100644 index 00000000..05a7e20a --- /dev/null +++ b/docker-compose-eip-odoo-openmrs-sso.yml @@ -0,0 +1,9 @@ +services: + + eip-odoo-openmrs: + environment: + OAUTH_ACCESS_TOKEN_URL: ${OAUTH_ACCESS_TOKEN_URL} + OAUTH_ENABLED: ${ENABLE_SSO} + OAUTH_CLIENT_ID: ${OAUTH_CLIENT_ID} + OAUTH_CLIENT_SECRET: ${OAUTH_CLIENT_SECRET} + OAUTH_CLIENT_SCOPE: ${OAUTH_CLIENT_SCOPE} diff --git a/docker-compose-eip-odoo-openmrs.yml b/docker-compose-eip-odoo-openmrs.yml new file mode 100644 index 00000000..fb6eb222 --- /dev/null +++ b/docker-compose-eip-odoo-openmrs.yml @@ -0,0 +1,63 @@ +services: + + # Odoo - OpenMRS integration service + eip-odoo-openmrs: + depends_on: + env-substitution: + condition: service_completed_successfully + openmrs: + condition: service_healthy + mysql: + condition: service_started + odoo: + condition: service_started + environment: + - EIP_DB_NAME_ODOO=${EIP_DB_NAME_ODOO} + - EIP_DB_USER_ODOO=${EIP_DB_USER_ODOO} + - EIP_DB_PASSWORD_ODOO=${EIP_DB_PASSWORD_ODOO} + - ODOO_DATABASE=${ODOO_DATABASE} + - ODOO_USER=${ODOO_USER} + - ODOO_PASSWORD=${ODOO_PASSWORD} + - ODOO_URL=http://odoo:8069 + - OPENMRS_URL=http://openmrs:8080/openmrs + - EIP_PROFILE=prod + - MYSQL_ADMIN_USER=root + - MYSQL_ADMIN_USER_PASSWORD=${MYSQL_ROOT_PASSWORD} + - OPENMRS_DB_HOST=${OPENMRS_DB_HOST} + - OPENMRS_DB_PORT=${OPENMRS_DB_PORT} + - OPENMRS_DB_NAME=${OPENMRS_DB_NAME} + - OPENMRS_DB_USER=${OPENMRS_DB_USER} + - OPENMRS_DB_PASSWORD=${OPENMRS_DB_PASSWORD} + - OPENMRS_USER=${OPENMRS_USER} + - OPENMRS_PASSWORD=${OPENMRS_PASSWORD} + - EIP_FHIR_RESOURCES=Patient,ServiceRequest,MedicationRequest + - EIP_FHIR_SERVER_URL=http://openmrs:8080/openmrs/ws/fhir2/R4 + - EIP_FHIR_USERNAME=${OPENMRS_USER} + - EIP_FHIR_PASSWORD=${OPENMRS_PASSWORD} + - EIP_TEST_ORDER_TYPE_UUID=${EIP_TEST_ORDER_TYPE_UUID} + - EIP_ODOO_FHIR_SERVER_URL=${EIP_ODOO_FHIR_SERVER_URL} + - EIP_ODOO_FHIR_USERNAME=${ODOO_USER} + - EIP_ODOO_FHIR_PASSWORD=${ODOO_PASSWORD} + - EIP_PRODUCT_SYNC_INITIAL_DELAY=${EIP_PRODUCT_SYNC_INITIAL_DELAY} + - EIP_PRODUCT_SYNC_DELAY=${EIP_PRODUCT_SYNC_DELAY} + image: mekomsolutions/eip-client + networks: + ozone: + aliases: + - eip-client-odoo + - eip-odoo-openmrs + restart: unless-stopped + volumes: + - "${EIP_ODOO_OPENMRS_ROUTES_PATH}:/eip-client/routes" + - eip-home-odoo:/eip-home + + mysql: + environment: + EIP_DB_NAME_ODOO: ${EIP_DB_NAME_ODOO} + EIP_DB_USER_ODOO: ${EIP_DB_USER_ODOO} + EIP_DB_PASSWORD_ODOO: ${EIP_DB_PASSWORD_ODOO} + volumes: + - "${SQL_SCRIPTS_PATH}/mysql/eip-odoo-openmrs:/docker-entrypoint-initdb.d/db/eip-odoo-openmrs" + +volumes: + eip-home-odoo: ~ diff --git a/docker-compose-eip-openmrs-senaite-sso.yml b/docker-compose-eip-openmrs-senaite-sso.yml new file mode 100644 index 00000000..381bb294 --- /dev/null +++ b/docker-compose-eip-openmrs-senaite-sso.yml @@ -0,0 +1,9 @@ +services: + + eip-openmrs-senaite: + environment: + OAUTH_ACCESS_TOKEN_URL: ${OAUTH_ACCESS_TOKEN_URL} + OAUTH_ENABLED: ${ENABLE_SSO} + OAUTH_CLIENT_ID: ${OAUTH_CLIENT_ID} + OAUTH_CLIENT_SECRET: ${OAUTH_CLIENT_SECRET} + OAUTH_CLIENT_SCOPE: ${OAUTH_CLIENT_SCOPE} diff --git a/docker-compose-eip-openmrs-senaite.yml b/docker-compose-eip-openmrs-senaite.yml new file mode 100644 index 00000000..416e9396 --- /dev/null +++ b/docker-compose-eip-openmrs-senaite.yml @@ -0,0 +1,57 @@ +services: + + # OpenMRS - SENAITE integration service + eip-openmrs-senaite: + depends_on: + env-substitution: + condition: service_completed_successfully + openmrs: + condition: service_healthy + mysql: + condition: service_started + senaite: + condition: service_started + environment: + - SENAITE_SERVER_URL=http://senaite:8080/senaite + - SENAITE_SERVER_USER=${SENAITE_ADMIN_USER} + - SENAITE_SERVER_PASSWORD=${SENAITE_ADMIN_PASSWORD} + - OPENMRS_SERVER_URL=http://openmrs:8080/openmrs + - OPENMRS_SERVER_USER=${OPENMRS_USER} + - OPENMRS_SERVER_PASSWORD=${OPENMRS_PASSWORD} + - OPENMRS_RESULTS_ENCOUNTER_TYPE_UUID=${RESULTS_ENCOUNTER_TYPE_UUID} + - EIP_PROFILE=prod + - EIP_DB_NAME_SENAITE=${EIP_DB_NAME_SENAITE} + - EIP_DB_USER_SENAITE=${EIP_DB_USER_SENAITE} + - EIP_DB_PASSWORD_SENAITE=${EIP_DB_PASSWORD_SENAITE} + - MYSQL_ADMIN_USER=root + - MYSQL_ADMIN_USER_PASSWORD=${MYSQL_ROOT_PASSWORD} + - OPENMRS_DB_HOST=${OPENMRS_DB_HOST} + - OPENMRS_DB_PORT=${OPENMRS_DB_PORT} + - OPENMRS_DB_NAME=${OPENMRS_DB_NAME} + - OPENMRS_DB_USER=${OPENMRS_DB_USER} + - OPENMRS_DB_PASSWORD=${OPENMRS_DB_PASSWORD} + - OPENMRS_USER=${OPENMRS_USER} + - OPENMRS_PASSWORD=${OPENMRS_PASSWORD} + - EIP_FHIR_RESOURCES=Patient,ServiceRequest + - EIP_FHIR_SERVER_URL=http://openmrs:8080/openmrs/ws/fhir2/R4 + - EIP_FHIR_USERNAME=${OPENMRS_USER} + - EIP_FHIR_PASSWORD=${OPENMRS_PASSWORD} + - RUN_WITH_BAHMNI_EMR=${RUN_WITH_BAHMNI_EMR} + - EIP_TEST_ORDER_TYPE_UUID=${EIP_TEST_ORDER_TYPE_UUID} + image: mekomsolutions/eip-client + networks: + ozone: + aliases: + - eip-client-senaite + restart: unless-stopped + volumes: + - "${EIP_OPENMRS_SENAITE_ROUTES_PATH}:/eip-client/routes" + - eip-home-senaite:/eip-home + + mysql: + environment: + EIP_DB_NAME_SENAITE: ${EIP_DB_NAME_SENAITE} + EIP_DB_USER_SENAITE: ${EIP_DB_USER_SENAITE} + EIP_DB_PASSWORD_SENAITE: ${EIP_DB_PASSWORD_SENAITE} + volumes: + - "${SQL_SCRIPTS_PATH}/mysql/eip-openmrs-senaite:/docker-entrypoint-initdb.d/db/eip-openmrs-senaite" diff --git a/docker-compose-keycloak.yml b/docker-compose-keycloak.yml index afbb6ca3..4feb1928 100644 --- a/docker-compose-keycloak.yml +++ b/docker-compose-keycloak.yml @@ -1,39 +1,34 @@ services: keycloak: - image: docker.io/bitnamilegacy/keycloak:22.0.5 + image: quay.io/keycloak/keycloak:26.4.5 restart: unless-stopped + entrypoint: [ "/bin/bash", "-c" ] + command: > + "/opt/keycloak/bin/kc.sh build --health-enabled=true --metrics-enabled=true && + /opt/keycloak/bin/kc.sh start --optimized --import-realm" volumes: - - ${KEYCLOAK_CONFIG_PATH}/realms:/keycloak-files/realm-config - - ${KEYCLOAK_CONFIG_PATH}/themes/carbon:/opt/bitnami/keycloak/themes/carbon + - ${KEYCLOAK_CONFIG_PATH}/realms:/opt/keycloak/data/import + - ${KEYCLOAK_CONFIG_PATH}/themes/carbon:/opt/keycloak/themes/carbon environment: - KC_HOSTNAME_URL: ${SERVER_SCHEME}://${KEYCLOAK_HOSTNAME} - KC_HOSTNAME_ADMIN_URL: ${SERVER_SCHEME}://${KEYCLOAK_HOSTNAME} - PROXY_ADDRESS_FORWARDING: "true" - KC_HTTP_ENABLED: 'true' - KC_HOSTNAME_STRICT_BACKCHANNEL: "true" - KC_PROXY: reencrypt - KC_HEALTH_ENABLED: 'true' - KC_METRICS_ENABLED: 'true' - KEYCLOAK_DATABASE_VENDOR: postgresql - KEYCLOAK_DATABASE_HOST: postgresql - KEYCLOAK_DATABASE_PORT_NUMBER: 5432 - KEYCLOAK_DATABASE_NAME: ${KEYCLOAK_DB} - KEYCLOAK_DATABASE_USER: ${KEYCLOAK_DB_USER} - KEYCLOAK_DATABASE_PASSWORD: ${KEYCLOAK_DB_PASSWORD} - KEYCLOAK_DATABASE_SCHEMA: ${KEYCLOAK_DB_SCHEMA} - KEYCLOAK_CREATE_ADMIN_USER: "true" - KEYCLOAK_ADMIN_USER: ${KEYCLOAK_USER} - KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_PASSWORD} - KEYCLOAK_EXTRA_ARGS: " - -Dkeycloak.profile.feature.scripts=enabled - -Dkeycloak.migration.action=import - -Dkeycloak.migration.provider=dir - -Dkeycloak.migration.dir=/keycloak-files/realm-config - -Dkeycloak.migration.strategy=IGNORE_EXISTING - --log-console-output=json" + KC_HOSTNAME: ${SERVER_SCHEME}://${KEYCLOAK_HOSTNAME} + KC_HOSTNAME_ADMIN: ${SERVER_SCHEME}://${KEYCLOAK_HOSTNAME} + KC_HOSTNAME_STRICT: 'false' + KC_HOSTNAME_BACKCHANNEL_DYNAMIC: 'true' + KC_HEALTH_ENABLED: true + KC_METRICS_ENABLED: true + KC_HTTP_ENABLED: true + KC_DB: postgres + KC_DB_URL: jdbc:postgresql://postgresql:5432/${KEYCLOAK_DB} + KC_DB_USERNAME: ${KEYCLOAK_DB_USER} + KC_DB_PASSWORD: ${KEYCLOAK_DB_PASSWORD} + KC_BOOTSTRAP_ADMIN_USERNAME: ${KEYCLOAK_USER} + KC_BOOTSTRAP_ADMIN_PASSWORD: ${KEYCLOAK_PASSWORD} + KC_DIR: /opt/keycloak/data/import + KC_OVERRIDE: 'false' + KC_LOG_CONSOLE_OUTPUT: json healthcheck: - test: ["CMD", "curl", "-f", "http://0.0.0.0:8080/health/ready"] + test: ["CMD-SHELL", "{ printf 'HEAD /health/ready HTTP/1.0\\r\\n\\r\\n' >&0; grep 'HTTP/1.0 200'; } 0<>/dev/tcp/localhost/9000"] interval: 15s timeout: 3s retries: 5 diff --git a/docker-compose-odoo-sso.yml b/docker-compose-odoo-sso.yml index bad0ab5c..a5a26700 100644 --- a/docker-compose-odoo-sso.yml +++ b/docker-compose-odoo-sso.yml @@ -2,11 +2,3 @@ services: odoo: environment: - ADDONS=${ODOO_ADDONS},auth_oidc,auth_oauth_autologin - - eip-odoo-openmrs: - environment: - OAUTH_ACCESS_TOKEN_URL: ${OAUTH_ACCESS_TOKEN_URL} - OAUTH_ENABLED: ${ENABLE_SSO} - OAUTH_CLIENT_ID: ${OAUTH_CLIENT_ID} - OAUTH_CLIENT_SECRET: ${OAUTH_CLIENT_SECRET} - OAUTH_CLIENT_SCOPE: ${OAUTH_CLIENT_SCOPE} diff --git a/docker-compose-odoo.yml b/docker-compose-odoo.yml index 53884e66..9c477ea3 100644 --- a/docker-compose-odoo.yml +++ b/docker-compose-odoo.yml @@ -60,57 +60,6 @@ services: - "${ODOO_CONFIG_FILE_PATH:-odoo-config}:/etc/properties/odoo.conf" - "${ODOO_CONFIG_CHECKSUMS_PATH:-odoo-checksums}:/mnt/checksums" - # Odoo - OpenMRS integration service - eip-odoo-openmrs: - depends_on: - env-substitution: - condition: service_completed_successfully - openmrs: - condition: service_healthy - mysql: - condition: service_started - odoo: - condition: service_started - environment: - - EIP_DB_NAME_ODOO=${EIP_DB_NAME_ODOO} - - EIP_DB_USER_ODOO=${EIP_DB_USER_ODOO} - - EIP_DB_PASSWORD_ODOO=${EIP_DB_PASSWORD_ODOO} - - ODOO_DATABASE=${ODOO_DATABASE} - - ODOO_USER=${ODOO_USER} - - ODOO_PASSWORD=${ODOO_PASSWORD} - - ODOO_URL=http://odoo:8069 - - OPENMRS_URL=http://openmrs:8080/openmrs - - EIP_PROFILE=prod - - MYSQL_ADMIN_USER=root - - MYSQL_ADMIN_USER_PASSWORD=${MYSQL_ROOT_PASSWORD} - - OPENMRS_DB_HOST=${OPENMRS_DB_HOST} - - OPENMRS_DB_PORT=${OPENMRS_DB_PORT} - - OPENMRS_DB_NAME=${OPENMRS_DB_NAME} - - OPENMRS_DB_USER=${OPENMRS_DB_USER} - - OPENMRS_DB_PASSWORD=${OPENMRS_DB_PASSWORD} - - OPENMRS_USER=${OPENMRS_USER} - - OPENMRS_PASSWORD=${OPENMRS_PASSWORD} - - EIP_FHIR_RESOURCES=Patient,ServiceRequest,MedicationRequest - - EIP_FHIR_SERVER_URL=http://openmrs:8080/openmrs/ws/fhir2/R4 - - EIP_FHIR_USERNAME=${OPENMRS_USER} - - EIP_FHIR_PASSWORD=${OPENMRS_PASSWORD} - - EIP_TEST_ORDER_TYPE_UUID=${EIP_TEST_ORDER_TYPE_UUID} - - EIP_ODOO_FHIR_SERVER_URL=${EIP_ODOO_FHIR_SERVER_URL} - - EIP_ODOO_FHIR_USERNAME=${ODOO_USER} - - EIP_ODOO_FHIR_PASSWORD=${ODOO_PASSWORD} - - EIP_PRODUCT_SYNC_INITIAL_DELAY=${EIP_PRODUCT_SYNC_INITIAL_DELAY} - - EIP_PRODUCT_SYNC_DELAY=${EIP_PRODUCT_SYNC_DELAY} - image: mekomsolutions/eip-client - networks: - ozone: - aliases: - - eip-client-odoo - - eip-odoo-openmrs - restart: unless-stopped - volumes: - - "${EIP_ODOO_OPENMRS_ROUTES_PATH}:/eip-client/routes" - - eip-home-odoo:/eip-home - fhir-odoo: depends_on: env-substitution: @@ -145,14 +94,6 @@ services: volumes: - "${SQL_SCRIPTS_PATH}/postgresql/odoo:/docker-entrypoint-initdb.d/db/odoo" - mysql: - environment: - EIP_DB_NAME_ODOO: ${EIP_DB_NAME_ODOO} - EIP_DB_USER_ODOO: ${EIP_DB_USER_ODOO} - EIP_DB_PASSWORD_ODOO: ${EIP_DB_PASSWORD_ODOO} - volumes: - - "${SQL_SCRIPTS_PATH}/mysql/eip-odoo-openmrs:/docker-entrypoint-initdb.d/db/eip-odoo-openmrs" - env-substitution: environment: - ODOO_PUBLIC_URL=${SERVER_SCHEME}://${ODOO_HOSTNAME} @@ -161,7 +102,6 @@ services: - EXTERNAL_FHIR_API_PASSWORD=${ODOO_PASSWORD} volumes: - eip-home-odoo: ~ odoo-checksums: ~ odoo-config: ~ odoo-extra-addons: ~ diff --git a/docker-compose-openelis.yml b/docker-compose-openelis.yml new file mode 100644 index 00000000..e9ecc5a9 --- /dev/null +++ b/docker-compose-openelis.yml @@ -0,0 +1,165 @@ +services: + certs: + container_name: oe-certs + image: itechuw/certgen:main + platform: linux/amd64 + restart: always + environment: + - KEYSTORE_PW="kspass" + - TRUSTSTORE_PW="tspass" + networks: + - ozone + volumes: + - "${OPENELIS_TRUST_STORE:-key_trust-store-volume}:/etc/openelis-global" + - "${OPENELIS_KEYS:-keys-vol}:/etc/ssl/private/" + - "${OPENELIS_CERTS:-certs-vol}:/etc/ssl/certs/" + + db.openelis.org: + container_name: openelisglobal-database + image: itechuw/openelis-global-2-database:develop + platform: linux/amd64 + ports: + - "15432:5432" + restart: always + env_file: + - "${OPENELIS_CONFIG_PATH}/database/database.env" + environment: + - DB_PASSWORD=${OE_DB_PASSWORD} + - DB_SUPERUSER_PASSWORD=${ADMIN_PASSWORD} + volumes: + # preserves the database between containers + - "${OPENELIS_CONFIG_PATH}/database/data:/var/lib/postgresql/data" + networks: + - ozone + healthcheck: + test: [ "CMD", "pg_isready", "-q", "-d", "clinlims", "-U", "clinlims" ] + timeout: 45s + interval: 10s + retries: 10 + + oe.openelis.org: + container_name: openelisglobal-webapp + image: itechuw/openelis-global-2:develop + platform: linux/amd64 + depends_on: + - db.openelis.org + - certs + ports: + - "8085:8080" + - "8443:8443" + restart: always + networks: + ozone: + web: + environment: + - DEFAULT_PW=adminADMIN! + - TZ=America/New_York + # Config variables loaded through Tomacat server.xml + - CATALINA_OPTS= -Ddatasource.url=jdbc:postgresql://db.openelis.org:5432/clinlims -Ddatasource.username=clinlims -Ddatasource.password=${OE_DB_PASSWORD} -Doe.ssl.truststorepath=${SSL_TRUSTSTORE_PATH} -Doe.ssl.truststorepassword=${SSL_TRUSTSTORE_PASSWORD} -Doe.ssl.keystorepath=${SSL_KEYSTORE_PATH} -Doe.ssl.keystorepassword=${SSL_KEYSTORE_PASSWORD} + # Env variables passed to the common properties file + - SSL_KEYSTORE_PATH + - SSL_KEYSTORE_PASSWORD + - SSL_TRUSTSTORE_PATH + - SSL_TRUSTSTORE_PASSWORD + volumes: + - "${OPENELIS_TRUST_STORE:-key_trust-store-volume}:/etc/openelis-global" + - "${OPENELIS_CONFIG_PATH}/plugins/:/var/lib/openelis-global/plugins" + - "${OPENELIS_CONFIG_PATH}/properties/SystemConfiguration.properties:/var/lib/openelis-global/properties/SystemConfiguration.properties" + - "${OPENELIS_CONFIG_PATH}/analyzer/analyzer-test-map.csv:/var/lib/openelis-global/analyzer/analyzer-test-map.csv" + - "${OPENELIS_CONFIG_PATH}/odoo/odoo-test-product-mapping.csv:/var/lib/openelis-global/odoo/odoo-test-product-mapping.csv" + - "${OPENELIS_CONFIG_PATH}/ocl:/var/lib/openelis-global/ocl" + - "${OPENELIS_LUCENE_INDEX:-lucene_index-vol}:/var/lib/lucene_index" + secrets: + - source: common.properties + + fhir.openelis.org: + container_name: external-fhir-api + image: itechuw/openelis-global-2-fhir:develop + platform: linux/amd64 + ports: + - "8086:8080" + - "8444:8443" + depends_on: + - db.openelis.org + - certs + networks: + ozone: + web: + restart: always + labels: + - "traefik.enable=true" + - "traefik.http.routers.fhir.rule=Host(`${FHIR_OPENELIS_HOSTNAME}`)" + - "traefik.http.routers.fhir.entrypoints=websecure" + - "traefik.http.services.fhir.loadbalancer.server.port=8080" + environment: + TZ: America/New_York + + JAVA_OPTS: "-Djavax.net.ssl.trustStore=${SSL_TRUSTSTORE_PATH} + -Djavax.net.ssl.trustStorePassword=${SSL_TRUSTSTORE_PASSWORD} + -Djavax.net.ssl.trustStoreType=pkcs12 + -Djavax.net.ssl.keyStore=${SSL_KEYSTORE_PATH} + -Djavax.net.ssl.keyStorePassword=${SSL_KEYSTORE_PASSWORD} + -Djavax.net.ssl.keyStoreType=pkcs12" + # Config variables loaded through Tomacat server.xml + CATALINA_OPTS: "-Dhapi.ssl.truststorepath=${SSL_TRUSTSTORE_PATH} -Dhapi.ssl.truststorepassword=${SSL_TRUSTSTORE_PASSWORD} -Dhapi.ssl.keystorepath=${SSL_KEYSTORE_PATH} -Dhapi.ssl.keystorepassword=${SSL_KEYSTORE_PASSWORD}" + # Config variables loaded through Hapi application.yml + FHIR_DATASOURCE_URL: "jdbc:postgresql://db.openelis.org:5432/clinlims?currentSchema=clinlims" + FHIR_DATASOURCE_USERNAME: "clinlims" + FHIR_DATASOURCE_PASSWORD: ${OE_DB_PASSWORD} + FHIR_SERVER_ADRESS: "http://${FHIR_OPENELIS_HOSTNAME}/fhir/" + volumes: + - "${OPENELIS_TRUST_STORE:-key_trust-store-volume}:/etc/openelis-global" + - "./openelis/tomcat/hapi_server.xml:/opt/bitnami/tomcat/conf/server.xml" + + proxy: + image: nginx:1.15-alpine + container_name: openelisglobal-proxy + networks: + ozone: + web: + volumes: + - "./proxy/openelis/nginx.conf:/etc/nginx/nginx.conf:ro" + labels: + traefik.enable: "true" + traefik.http.routers.openelis.rule: "Host(`${OPENELIS_HOSTNAME}`)" + traefik.http.routers.openelis.entrypoints: "websecure" + traefik.http.services.openelis.loadbalancer.server.port: 80 + + frontend.openelis.org: + image: itechuw/openelis-global-2-frontend:develop + container_name: openelisglobal-front-end + platform: linux/amd64 + networks: + ozone: + web: + environment: + - CHOKIDAR_USEPOLLING=true + tty: true + + autoheal: + container_name: autoheal-oe + image: willfarrell/autoheal:1.2.0 + tty: true + restart: always + networks: + - ozone + environment: + AUTOHEAL_CONTAINER_LABEL: all + TZ: America/New_York + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + + env-substitution: + environment: + - OPENELIS_PUBLIC_URL=https://${HOST_NAME} + +secrets: + common.properties: + file: "${OPENELIS_CONFIG_PATH}/properties/common.properties" + +volumes: + db-data: ~ + key_trust-store-volume: ~ + certs-vol: ~ + keys-vol: ~ + lucene_index-vol: ~ diff --git a/docker-compose-senaite-sso.yml b/docker-compose-senaite-sso.yml index 16921d50..95a4fbdf 100644 --- a/docker-compose-senaite-sso.yml +++ b/docker-compose-senaite-sso.yml @@ -7,11 +7,3 @@ services: - OAUTH_CONFIG_FILE=/data/oidc/client.json volumes: - ${SENAITE_OIDC_CONFIG_PATH}/:/data/oidc - - eip-openmrs-senaite: - environment: - OAUTH_ACCESS_TOKEN_URL: ${OAUTH_ACCESS_TOKEN_URL} - OAUTH_ENABLED: ${ENABLE_SSO} - OAUTH_CLIENT_ID: ${OAUTH_CLIENT_ID} - OAUTH_CLIENT_SECRET: ${OAUTH_CLIENT_SECRET} - OAUTH_CLIENT_SCOPE: ${OAUTH_CLIENT_SCOPE} diff --git a/docker-compose-senaite.yml b/docker-compose-senaite.yml index 0194d628..0a5455ef 100644 --- a/docker-compose-senaite.yml +++ b/docker-compose-senaite.yml @@ -32,62 +32,7 @@ services: - ${SENAITE_CONFIG_PATH}:/data/importdata/senaite - ${SENAITE_BLOBSTORAGE_PATH:-senaite-blobstorage}:/home/senaite/senaitelims/blobstorage - # OpenMRS - SENAITE integration service - eip-openmrs-senaite: - depends_on: - env-substitution: - condition: service_completed_successfully - openmrs: - condition: service_healthy - mysql: - condition: service_started - senaite: - condition: service_started - environment: - - SENAITE_SERVER_URL=http://senaite:8080/senaite - - SENAITE_SERVER_USER=${SENAITE_ADMIN_USER} - - SENAITE_SERVER_PASSWORD=${SENAITE_ADMIN_PASSWORD} - - OPENMRS_SERVER_URL=http://openmrs:8080/openmrs - - OPENMRS_SERVER_USER=${OPENMRS_USER} - - OPENMRS_SERVER_PASSWORD=${OPENMRS_PASSWORD} - - OPENMRS_RESULTS_ENCOUNTER_TYPE_UUID=${RESULTS_ENCOUNTER_TYPE_UUID} - - EIP_PROFILE=prod - - EIP_DB_NAME_SENAITE=${EIP_DB_NAME_SENAITE} - - EIP_DB_USER_SENAITE=${EIP_DB_USER_SENAITE} - - EIP_DB_PASSWORD_SENAITE=${EIP_DB_PASSWORD_SENAITE} - - MYSQL_ADMIN_USER=root - - MYSQL_ADMIN_USER_PASSWORD=${MYSQL_ROOT_PASSWORD} - - OPENMRS_DB_HOST=${OPENMRS_DB_HOST} - - OPENMRS_DB_PORT=${OPENMRS_DB_PORT} - - OPENMRS_DB_NAME=${OPENMRS_DB_NAME} - - OPENMRS_DB_USER=${OPENMRS_DB_USER} - - OPENMRS_DB_PASSWORD=${OPENMRS_DB_PASSWORD} - - OPENMRS_USER=${OPENMRS_USER} - - OPENMRS_PASSWORD=${OPENMRS_PASSWORD} - - EIP_FHIR_RESOURCES=Patient,ServiceRequest - - EIP_FHIR_SERVER_URL=http://openmrs:8080/openmrs/ws/fhir2/R4 - - EIP_FHIR_USERNAME=${OPENMRS_USER} - - EIP_FHIR_PASSWORD=${OPENMRS_PASSWORD} - - RUN_WITH_BAHMNI_EMR=${RUN_WITH_BAHMNI_EMR} - - EIP_TEST_ORDER_TYPE_UUID=${EIP_TEST_ORDER_TYPE_UUID} - image: mekomsolutions/eip-client - networks: - ozone: - aliases: - - eip-client-senaite - restart: unless-stopped - volumes: - - "${EIP_OPENMRS_SENAITE_ROUTES_PATH}:/eip-client/routes" - - eip-home-senaite:/eip-home - - mysql: - environment: - EIP_DB_NAME_SENAITE: ${EIP_DB_NAME_SENAITE} - EIP_DB_USER_SENAITE: ${EIP_DB_USER_SENAITE} - EIP_DB_PASSWORD_SENAITE: ${EIP_DB_PASSWORD_SENAITE} - volumes: - - "${SQL_SCRIPTS_PATH}/mysql/eip-openmrs-senaite:/docker-entrypoint-initdb.d/db/eip-openmrs-senaite" - + postgresql: environment: SENAITE_DB_NAME: ${SENAITE_DB_NAME} diff --git a/openelis/tomcat/hapi_server.xml b/openelis/tomcat/hapi_server.xml new file mode 100644 index 00000000..19c35e31 --- /dev/null +++ b/openelis/tomcat/hapi_server.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0128908b..16747d27 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.ozonehis ozone-docker-compose Ozone Docker Compose - 1.0.0-SNAPSHOT + 1.0.0-dev-SNAPSHOT pom @@ -20,7 +20,7 @@ UTF-8 - 1.0.0-SNAPSHOT + 1.0.0-dev-SNAPSHOT true diff --git a/proxy/default.conf.template b/proxy/default.conf.template index 5e6e002a..6e47d6ad 100644 --- a/proxy/default.conf.template +++ b/proxy/default.conf.template @@ -342,3 +342,27 @@ server { proxy_pass http://$keycloak; } } + +server { + listen 8585; + + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $forwarded_proto; + proxy_set_header Host $host; + + absolute_redirect off; + + location / { + proxy_pass http://frontend.openelis.org; + proxy_redirect off; + } + + location /api/ { + proxy_pass https://oe.openelis.org:8443/api/; + proxy_redirect off; + 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-Host $server_name; + } +} diff --git a/proxy/openelis/nginx.conf b/proxy/openelis/nginx.conf new file mode 100644 index 00000000..d5eaf3f9 --- /dev/null +++ b/proxy/openelis/nginx.conf @@ -0,0 +1,33 @@ +worker_processes 1; + +events { worker_connections 1024; } +http { + server { + listen 80; + server_name _; + ##### Comment to run on HTTP + #return 301 https://$host$request_uri; + + #### Uncomment to run on HTTP + location / { + proxy_pass http://frontend.openelis.org; + proxy_redirect off; + + 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; + } + location /api/ { + proxy_pass https://oe.openelis.org:8443/api/; + proxy_redirect off; + + 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-Host $server_name; + proxy_set_header X-Forwarded-Proto $scheme; + } + } + +} diff --git a/scripts/docker-compose-files.txt b/scripts/docker-compose-files.txt index 723d993c..f15e9259 100755 --- a/scripts/docker-compose-files.txt +++ b/scripts/docker-compose-files.txt @@ -7,3 +7,8 @@ docker-compose-openmrs-sso.yml docker-compose-senaite.yml docker-compose-senaite-sso.yml docker-compose-backup.yml +docker-compose-eip-odoo-openmrs.yml +docker-compose-eip-odoo-openmrs-sso.yml +docker-compose-eip-openmrs-senaite.yml +docker-compose-eip-openmrs-senaite-sso.yml +docker-compose-openelis.yml diff --git a/scripts/utils.sh b/scripts/utils.sh index c3ecd69b..93ffe5a6 100644 --- a/scripts/utils.sh +++ b/scripts/utils.sh @@ -46,6 +46,7 @@ function exportPaths () { export ORTHANC_CONFIG_PATH=$DISTRO_PATH/configs/orthanc/initializer_config export BAHMNI_OPENMRS_MODULES_PATH=$DISTRO_PATH/binaries/bahmniemr/modules export BAHMNI_CONFIG_OVERRIDE_PATH=$DISTRO_PATH/configs/bahmniemr + export OPENELIS_CONFIG_PATH=$DISTRO_PATH/binaries/openelis/volumes echo "→ OPENMRS_CONFIG_PATH=$OPENMRS_CONFIG_PATH" echo "→ OPENMRS_PROPERTIES_PATH=$OPENMRS_PROPERTIES_PATH" @@ -70,6 +71,7 @@ function exportPaths () { echo "→ ORTHANC_CONFIG_PATH=$ORTHANC_CONFIG_PATH" echo "→ BAHMNI_OPENMRS_MODULES_PATH=$BAHMNI_OPENMRS_MODULES_PATH" echo "→ BAHMNI_CONFIG_OVERRIDE_PATH=$BAHMNI_CONFIG_OVERRIDE_PATH" + echo "→ OPENELIS_CONFIG_PATH=$OPENELIS_CONFIG_PATH" } function setDockerComposeCLIOptions () { @@ -156,13 +158,15 @@ function setTraefikHostnames { echo "$INFO Exporting Traefik hostnames..." export USE_HTTPS="true" - export O3_HOSTNAME=emr-"${IP_WITH_DASHES}.traefik.me" - export ODOO_HOSTNAME=erp-"${IP_WITH_DASHES}.traefik.me" - export SENAITE_HOSTNAME=lims-"${IP_WITH_DASHES}.traefik.me" - export ERPNEXT_HOSTNAME=erpnext-"${IP_WITH_DASHES}.traefik.me" - export KEYCLOAK_HOSTNAME=auth-"${IP_WITH_DASHES}.traefik.me" - export FHIR_ODOO_HOSTNAME=fhir-erp-"${IP_WITH_DASHES}.traefik.me" - export ORTHANC_HOSTNAME=pacs-"${IP_WITH_DASHES}.traefik.me" + export O3_HOSTNAME="openmrs.ozonelocal.com" + export ODOO_HOSTNAME="erp.ozonelocal.com" + export SENAITE_HOSTNAME="lims.ozonelocal.com" + export ERPNEXT_HOSTNAME="erpnext.ozonelocal.com" + export KEYCLOAK_HOSTNAME="auth.ozonelocal.com" + export FHIR_ODOO_HOSTNAME="fhir-erp.ozonelocal.com" + export ORTHANC_HOSTNAME="pacs.ozonelocal.com" + export OPENELIS_HOSTNAME="openelis.ozonelocal.com" + export FHIR_OPENELIS_HOSTNAME="fhir-openelis.ozonelocal.com" echo "→ O3_HOSTNAME=$O3_HOSTNAME" echo "→ ODOO_HOSTNAME=$ODOO_HOSTNAME" echo "→ SENAITE_HOSTNAME=$SENAITE_HOSTNAME" @@ -170,6 +174,8 @@ function setTraefikHostnames { echo "→ KEYCLOAK_HOSTNAME=$KEYCLOAK_HOSTNAME" echo "→ FHIR_ODOO_HOSTNAME=$FHIR_ODOO_HOSTNAME" echo "→ ORTHANC_HOSTNAME=$ORTHANC_HOSTNAME" + echo "→ OPENELIS_HOSTNAME=$OPENELIS_HOSTNAME" + echo "→ FHIR_OPENELIS_HOSTNAME=$FHIR_OPENELIS_HOSTNAME" }