Run HAPI FHIR remote server using Docker

561 views
Skip to first unread message

Tomás Jofré Barría

unread,
Nov 14, 2023, 1:16:30 PM11/14/23
to HAPI FHIR
Hello! I'm trying to run a HAPI server remotely. I have an Ubuntu server created on Digital Ocean and I assume I have to use Docker, how do I put my server's IP in the Docker project? There are concepts like image, droplet or ssh root that I can't understand

AJH Mohammed

unread,
Nov 14, 2023, 11:46:59 PM11/14/23
to HAPI FHIR
Hello, 

I am using the same as you have described. I am also running my services on Digital Ocean Droplet on a docker container. I have shared a sample docker-compose.yaml file which will help you to setup the server. In my case I am using openSRP fhir server which is very identical, but they have done some extensions for practitioner and location. You can change to what ever version you like. And also I am using keycloak as well. If don't want you can omit the part.


version: "3.9"
services:
  hapi-fhir:
    restart: unless-stopped
    image: opensrp/hapi-fhir-jpaserver-starter:v6.1.2-SNAPSHOT #CHANGE THE FHIR SERVER I AM USING OPEN SRP ONE
    ports:
      - "8082:8080"
    volumes:
      - ./application.yaml:/data/hapi-fhir/config/application.yaml
    depends_on:
      - postgres
    environment:
      - "SPRING_CONFIG_LOCATION=/data/hapi-fhir/config/application.yaml"
 
  postgres:
    restart: unless-stopped
    image: postgres:14
    ports:
      - "5432:5432"
    environment:
      - "POSTGRES_PASSWORD=QAAoFJMfM95C3e"
      - "POSTGRES_USER=postgres"
      - "POSTGRES_DB=hapi_fhir"
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:


Configuration: application.yaml file

#Adds the option to go to eg. http://localhost:8080/actuator/health for seeing the running configuration
management:
  endpoints:
    web:
      exposure:
        include: "health,prometheus"
spring:
  main:
    allow-circular-references: true
    #allow-bean-definition-overriding: true
  flyway:
    enabled: false
    check-location: false
    baselineOnMigrate: true
  datasource:
    url: 'jdbc:postgresql://postgres:5432/hapi_fhir'
    username: DBUSERNAME
    password: YOURPASSWORD
    driverClassName: org.postgresql.Driver
    max-active: 15

    # database connection pool size
    hikari:
      maximum-pool-size: 10
  jpa:
    properties:
      hibernate.format_sql: false
      hibernate.show_sql: false
      #Hibernate dialect is automatically detected except Postgres and H2.
      #If using H2, then supply the value of ca.uhn.fhir.jpa.model.dialect.HapiFhirH2Dialect
      #If using postgres, then supply the value of ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgres94Dialect

      hibernate.dialect: ca.uhn.fhir.jpa.model.dialect.HapiFhirPostgres94Dialect #THIS IS FOR POSTGRESQL DB
      #      hibernate.hbm2ddl.auto: update
      #      hibernate.jdbc.batch_size: 20
      #      hibernate.cache.use_query_cache: false
      #      hibernate.cache.use_second_level_cache: false
      #      hibernate.cache.use_structured_entries: false
      #      hibernate.cache.use_minimal_puts: false
      ###    These settings will enable fulltext search with lucene
      hibernate.search.enabled: false
  #      hibernate.search.backend.type: lucene
  #      hibernate.search.backend.analysis.configurer: ca.uhn.fhir.jpa.search.HapiHSearchAnalysisConfigurers$HapiLuceneAnalysisConfigurer
  #      hibernate.search.backend.directory.type: local-filesystem
  #      hibernate.search.backend.directory.root: target/lucenefiles
  #      hibernate.search.backend.lucene_version: lucene_current
  batch:
    job:
      enabled: false
hapi:
  fhir:
    ### This enables the swagger-ui at /fhir/swagger-ui/index.html as well as the /fhir/api-docs (see https://hapifhir.io/hapi-fhir/docs/server_plain/openapi.html)
    openapi_enabled: true
    ### This is the FHIR version. Choose between, DSTU2, DSTU3, R4 or R5
    fhir_version: R4
    ### enable to use the ApacheProxyAddressStrategy which uses X-Forwarded-* headers
    ### to determine the FHIR server address
    #   use_apache_address_strategy: false
    ### forces the use of the https:// protocol for the returned server address.
    ### alternatively, it may be set using the X-Forwarded-Proto header.
    #   use_apache_address_strategy_https: false
    ### enable to set the Server URL
    #    server_address: http://hapi.fhir.org/baseR4
    #    defer_indexing_for_codesystems_of_size: 101
    #    install_transitive_ig_dependencies: true
    #    implementationguides:
    ###    example from registry (packages.fhir.org)
    #      swiss:
    #        name: swiss.mednet.fhir
    #        version: 0.8.0
    #      example not from registry
    #      ips_1_0_0:
    #        name: hl7.fhir.uv.ips
    #        version: 1.0.0
    #    supported_resource_types:
    #      - Patient
    #      - Observation
    ##################################################
    # Allowed Bundle Types for persistence (defaults are: COLLECTION,DOCUMENT,MESSAGE)
    ##################################################
    #    allowed_bundle_types: COLLECTION,DOCUMENT,MESSAGE,TRANSACTION,TRANSACTIONRESPONSE,BATCH,BATCHRESPONSE,HISTORY,SEARCHSET
    #    allow_cascading_deletes: true
    #    allow_contains_searches: true
    #    allow_external_references: true
    #    allow_multiple_delete: true
    #    allow_override_default_search_params: true
    #    auto_create_placeholder_reference_targets: false
    #    cql_enabled: true
    #    default_encoding: JSON
    #    default_pretty_print: true
    #    default_page_size: 20
    #    delete_expunge_enabled: true
    #    enable_repository_validating_interceptor: true
    #    enable_index_missing_fields: false
    #    enable_index_of_type: true
    #    enable_index_contained_resource: false
    ###  !!Extended Lucene/Elasticsearch Indexing is still a experimental feature, expect some features (e.g. _total=accurate) to not work as expected!!
    advanced_lucene_indexing: false
    bulk_export_enabled: false
    bulk_import_enabled: false
    #    enforce_referential_integrity_on_delete: false
    # This is an experimental feature, and does not fully support _total and other FHIR features.
    #    enforce_referential_integrity_on_delete: false
    #    enforce_referential_integrity_on_write: false
    #    etag_support_enabled: true
    #    expunge_enabled: true
    #    client_id_strategy: ALPHANUMERIC
    #    fhirpath_interceptor_enabled: false
    #    filter_search_enabled: true
    #    graphql_enabled: true
    #    narrative_enabled: true
    #    mdm_enabled: true
    #    local_base_urls:
    mdm_enabled: false
    #    partitioning:
    #      allow_references_across_partitions: false
    #      partitioning_include_in_search_hashes: false
    cors:
      allow_Credentials: true
      allowed_origin:
        - '*'

    # Search coordinator thread pool sizes
    search-coord-core-pool-size: 20
    search-coord-max-pool-size: 100
    search-coord-queue-capacity: 200

    # Threadpool size for BATCH'ed GETs in a bundle.
    #    bundle_batch_pool_size: 10
    #    bundle_batch_pool_max_size: 50

    #    logger:
    #      error_format: 'ERROR - ${requestVerb} ${requestUrl}'
    #      format: >-
    #        Path[${servletPath}] Source[${requestHeader.x-forwarded-for}]
    #        Operation[${operationType} ${operationName} ${idOrResourceName}]
    #        UA[${requestHeader.user-agent}] Params[${requestParameters}]
    #        ResponseEncoding[${responseEncodingNoDefault}]
    #      log_exceptions: true
    #      name: fhirtest.access
    #    max_binary_size: 104857600
    #    max_page_size: 200
    #    retain_cached_searches_mins: 60
    #    reuse_cached_search_results_millis: 60000
    tester:
      home:
        name: Local Tester
        server_address: 'http://localhost:8080/fhir'
        refuse_to_fetch_third_party_urls: false
        fhir_version: R4
      global:
        name: Global Tester
        server_address: "http://hapi.fhir.org/baseR4"
        refuse_to_fetch_third_party_urls: false
        fhir_version: R4
    #    validation:
    #      requests_enabled: true
    #      responses_enabled: true
    #    binary_storage_enabled: true
    inline_resource_storage_below_size: 4000
#    bulk_export_enabled: true
#    subscription:
#      resthook_enabled: true
#      websocket_enabled: false
#      email:
#        from: so...@test.com
#        host: google.com
#        port:
#        username:
#        password:
#        auth:
#        startTlsEnable:
#        startTlsRequired:
#        quitWait:
#    lastn_enabled: true
#    store_resource_in_lucene_index_enabled: true
###  This is configuration for normalized quantity serach level default is 0
###   0: NORMALIZED_QUANTITY_SEARCH_NOT_SUPPORTED - default
###   1: NORMALIZED_QUANTITY_STORAGE_SUPPORTED
###   2: NORMALIZED_QUANTITY_SEARCH_SUPPORTED
#    normalized_quantity_search_level: 2
#elasticsearch:
#  debug:
#    pretty_print_json_log: false
#    refresh_after_write: false
#  enabled: false
#  password: SomePassword
#  required_index_status: YELLOW
#  rest_url: 'localhost:9200'
#  protocol: 'http'
#  schema_management_strategy: CREATE
#  username: SomeUsername
#security:
#  ignored: none
keycloak:
  enabled: true
  realm: REALM_KEYCLOAK
  resource: CLIENT_KEYCLOAK
  credentials:
    secret: SECRET_KEYCLOAK
#    pretty_print_json_log: false
  ssl-required: none
#  use-resource-role-mappings: true,
logging.level.org.springframework.web: trace
logging.level.org.apache: trace

#sentry:
#  enabled: false
#  options:
#    dsn:
#    release:
#    environment:
#    tags:
#    debug: false
#  minimumEventLevel: ERROR
#  minimumBreadcrumbLevel: INFO
Reply all
Reply to author
Forward
0 new messages