Logo
Published on

Einrichten eines lokalen SNOMED CT Snowstorm Servers

Authors
  • avatar
    Name
    Till Heller
    Twitter

Ein lokaler Snowstorm-Server stellt SNOMED CT über REST und FHIR bereit. Im Folgenden findest du einen kompakten Ablauf von der Klonung des Repositories bis zum Import eines Release-Zip-Archivs.

Repository klonen und Ordner vorbereiten

Klonen des offiziellen Repositories, Wechsel in den Ordner, Anlegen des Import-Verzeichnisses.

git clone https://github.com/IHTSDO/snowstorm
cd snowstorm
mkdir import

Docker-Compose ersetzen

Ersetze die bestehende docker-compose.yml vollständig durch diese minimale, erprobte Variante. Sie startet Elasticsearch und Snowstorm und setzt sinnvolle Default-Werte für lokale Tests.

version: "3.8"
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - ES_JAVA_OPTS=-Xms2g -Xmx2g
    ports:
      - "9200:9200"
    healthcheck:
      test: ["CMD-SHELL", "curl -s http://localhost:9200 >/dev/null || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 30

  snowstorm:
    image: snomedinternational/snowstorm:latest
    container_name: snowstorm
    depends_on:
      elasticsearch:
        condition: service_healthy
    environment:
      - JAVA_OPTS=-Xms2g -Xmx2g
      - ELASTICSEARCH_HOST=elasticsearch
      - ELASTICSEARCH_PORT=9200
      - SERVER_PORT=8070
      - IMPORT_DEFAULT_CODESYSTEM=SNOMEDCT
    ports:
      - "8070:8070"
    volumes:
      - ./import:/opt/snowstorm/import

Warten bis Elasticsearch bereit ist (optional)

Falls dein System langsam startet, kannst du eine kleine Wartelogik ergänzen. Lege im gleichen Ordner wie die docker-compose.yml die Datei wait-for-elasticsearch.sh ab und mache sie ausführbar.

#!/usr/bin/env bash
set -euo pipefail
host="${ELASTICSEARCH_HOST:-localhost}"
port="${ELASTICSEARCH_PORT:-9200}"
until curl -s "http://$host:$port" >/dev/null; do
  echo "Waiting for Elasticsearch at $host:$port..."
  sleep 3
done
echo "Elasticsearch is up."

Du kannst dieses Script als command der Snowstorm-Service-Definition verwenden, wenn nötig. In vielen Fällen reicht jedoch das oben definierte Healthcheck-gestützte depends_on.

Release-Datei beschaffen und ablegen

Melde dich auf mlds.ihtsdotools.org an und lade das gewünschte Release unter https://mlds.ihtsdotools.org/#/viewReleases/viewRelease/1102614 herunter. Lege die Datei in den Ordner import und benenne sie dort in import.zip um, sodass sie im Container unter /opt/snowstorm/import/import.zip verfügbar ist.

Container starten

Starte die Umgebung eine Ebene über dem Projektordner oder direkt im Projekt mit Docker Compose.

docker compose up -d

Sobald die Container laufen, erreichst du die Swagger UI unter http://localhost:8070.

Lokalen Import starten (Swagger UI)

Öffne in Swagger den Endpunkt /imports/start-local-file-import und passe den Request-Body an. Wichtig ist der Pfad zur Datei sowie Branch und Importtyp. Ein funktionierendes Minimalbeispiel sieht so aus:

{
  "branchPath": "MAIN",
  "createCodeSystemVersion": true,
  "codeSystemShortName": "SNOMEDCT",
  "type": "SNAPSHOT",
  "file": "import.zip"
}

Jetzt kannst du den Import über die Oberfläche starten. Alternativ ist der Aufruf per curl möglich.

Import überwachen

Verfolge den Fortschritt der Indizierung und Validierung im Log des Snowstorm-Containers. Je nach Hardware kann der Import über anderthalb Stunden dauern.

docker logs -f snowstorm

REST-Beispiele

Kompakte Beispiele für typische REST-Abfragen findest du im Projekt „SNOMED in 5 minutes“. Die curl-Sammlung ist hier dokumentiert: https://github.com/IHTSDO/SNOMED-in-5-minutes/blob/master/curl-examples/snomed-in-5-min-curl.md.

FHIR-Abfragen

Der FHIR-Endpunkt ist unter /fhir/ erreichbar. Ein Beispiel für die CodeSystem-Lookup-Operation lautet:

http://localhost:8070/fhir/CodeSystem/$lookup?system=http://snomed.info/sct&code=427623005

Eine typische Antwort im Browser enthält die Parameter des Konzepts. Je nach Release und Serverversion kann die Struktur variieren, z. B. in dieser kompakten Form:

{
  "resourceType": "Parameters",
  "parameter": [
    { "name": "name", "valueString": "SNOMED CT" },
    { "name": "version", "valueString": "<release-version>" },
    { "name": "display", "valueString": "[Bezeichnung des Codes]" }
  ]
}