- Published on
Einrichten eines lokalen SNOMED CT Snowstorm Servers
- Authors

- Name
- Till Heller
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]" }
]
}