Monday, 9 November 2026

Snowstorm - Local Snomed CT terminology server

If you want to do some development against Snomed CT terminology server, you can download Snowstorm, an open source terminogy server with support for Snomed CT. It is primarily written in Java and built on top of ElasticSerach. The easiest way of getting Snowstorm running in your local development server (or on an actual server if desired), is to download the Docker images for Elasticsearch and Snowstorm. I have added a Yaml file on my Github repo for installing both Elasticsearch and Snowstorm here:

docker-compose.yml
docker-compose.yml

The Yaml file sets up the following for Elastsearch and Snowstorm :

Elasticsearch

  • Sets up Elasticsearch as a service that Snowstorm depends upon on port 9200
  • Pulls Elasticsearch version 8.19.8. You obviously want to test out even newer versions of Elasticsearch later on
  • Sets up a durable volume for Elasticseachon elastic:/usr/share/elasticsearch/data
  • Snomed depends upon Elasticsearch and the condition must be healthy of Elasticsearch from the healthchecks
  • Memory reservation is set to 4 GB for ElasticSearch
  • Since in this example Elasticsearch is set up to run in LocalDEV, xpack.security.enabled is set to false. This turns off authorization, authentication, TLS and audit since the example setup in this docker compose file is meant for development environments, not for production.

Snowstorm

  • Sets up Snowstorm to use Elasticsearch as a service on port 9200
  • Snowstorm is set up to run on 8080 (HTTP)
  • A bind mount is set up on ./rf2 that is on the host computer and mapped to the ./rf2 folder in the container. We use this bind mount to import the Rf2 file later on

docker-compose.yml



# https://github.com/IHTSDO/snowstorm/blob/master/docker-compose.yml

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.19.8
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - node.name=snowstorm
      - cluster.name=snowstorm-cluster
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
    volumes:
      - elastic:/usr/share/elasticsearch/data
    networks:
      elastic:
        aliases:
         - es
    healthcheck:
      test: ["CMD", "curl", "-f", "http://es:9200"]
      interval: 1s
      timeout: 1s
      retries: 60
    ports:
      - 127.0.0.1:9200:9200
    mem_reservation: 4g

  snowstorm:
    image: snomedinternational/snowstorm:latest
    depends_on:
      elasticsearch:
        condition: service_healthy
    environment:
      - elasticsearch.urls=http://elasticsearch:9200
      - JAVA_TOOL_OPTIONS=-Xms2g -Xmx4g --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED
    command: [
      "--elasticsearch.urls=http://es:9200",
    ]
    networks:
      elastic:
        aliases:
         - snowstorm
    ports:
      - "8080:8080"
    volumes:
      - ./rf2:/rf2

networks:
  elastic:
    name: elastic

volumes:
  elastic:


A component diagram (UML) of the Rf2 format is shown below. Note that RefsetItem is extensible and contain additional fields depending on the refset type.