Synology: Isometrische Minecraft-Karten mit Docker rendern


Overviewer Minecraft mit Docker und Synology

Hinweis: Overviewer ist tot. Aber es gibt etwas Besseres: BlueMap.

Unsere Minecraft Welt gibt es nun als isometrische Karte à la Google Maps. Der Weg dahin führt über eine Open-Source-Software namens Overviewer. Das ist ein Kommandozeilentool auf Basis von Python. Was hat das alles mit Docker und einem Synology NAS zu tun, fragst Du Dich? Hier folgt eine erklärende Anleitung, um diese Karten selber zu generieren.

Minecraft Overviewer
Minecraft Overviewer

Overviewer läuft nicht auf dem Mac

Mein Problem ist, dass Overviewer nicht so einfach auf dem Mac läuft. Schon gar nicht, wenn man Karten mit der neusten Minecraft-Version 1.13.2 verarbeiten möchte. Die ersten Versuche, Overviewer für MacOS zu kompilieren, endeten mit einem zugemüllten MacOS-System.

Emulation durch VirtualBox

Mit wenigen Befehlen lässt sich Overviewer für 1.13.2 unter Ubuntu builden und starten. Natürlich will ich kein Ubuntu nativ auf meinem Mac parallel zu MacOS installieren. Das würde viel zu lange dauern.

Also habe ich mir VirtualBox installiert, das ubuntu.iso Image runtergeladen, mich angemeldet, Overviewer kompiliert, usw.

In- und Output festlegen

Das System bestehend aus Ubuntu und Overviewer kann man als eine Funktion mit zwei Eingabe- und einem Ausgabewert verstehen:

  1. Lesen: Die Minecraft Map
  2. Lesen: Die Overviewer-Konfigurationsdatei „config.py“
  3. Schreiben: Das Exportverzeichnis für die isometrische Karte

Mit VirtualBox und der Ubuntu-Installation ist das schwierig umzusetzen. Besonders wenn man das System später auf einem Synology DS218+ (günstig kaufen) nachts automatisch laufen lassen möchte. Zudem zieht die die Emulation mit VirtualBox auch Leistung.

Docker ist die Lösung

Docker ist einfach. Zuerst installiert man die Docker-App für sein jeweiliges Betriebssystem. In einem Dockerfile definiert man, was gemacht werden soll. Am Beispiel von meinem Anwendungsfall mit Overviewer sah es dann so aus:

FROM ubuntu:18.04
RUN apt-get update
RUN apt-get update && apt-get install -y \
build-essential \
python-pil \
python-dev \
python-numpy \
git \
wget \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir /tmp/overviewer
WORKDIR /tmp/overviewer
RUN git clone https://github.com/gmcnew/Minecraft-Overviewer.git .
RUN git checkout minecraft113
RUN python2 setup.py build
RUN wget https://launcher.mojang.com/mc/game/1.13.1/client/8de235e5ec3a7fce168056ea395d21cbdec18d7c/client.jar
RUN mkdir /tmp/world
RUN mkdir /tmp/export
RUN mkdir /tmp/config
RUN useradd -ms /bin/bash bob
USER bob
ENTRYPOINT ["/bin/bash", "-c","/tmp/overviewer/overviewer.py --config=/tmp/config/config.py"]
  1. FROM bedeutet: Starte mit einem frischen Ubuntu 18.04 Image.
  2. RUN apt-get: Die Pakete werden geladen und installiert.
  3. Der Befehl RUN mkdir und WORKDIR wird ein neues Verzeichnis erzeugt und das Arbeitsverzeichnis für die nächsten Befehle festgelegt.
  4. Die Zeilen mit RUN git clone und checkout holt sich den aktuellen Stand des minecraft113 branches von GitHub.
  5. RUN python setup.py build führt die Kompilierung aus.
  6. Nun holt RUN wget die aktuellen Texturen von Mojang.
  7. RUN mkdir legt die Verzeichnisse an, mit denen nachher gearbeitet wird.
  8. Damit overviewer nicht rumweint, weil es zu viele Rechte hat, wechseln wir mir mit USER von root auf bob.
  9. Der ENTRYPOINT Befehl wird erst dann ausgeführt, sobald das Image gestartet wird. Das bitte nicht mit dem Build verwechseln.

Das Image wird gebaut und mit dem Tag „overviewer113“ versehen. Auf dem Weg findet man es nachher einfacher wieder.

docker build -t overviewer113 .

Die Schönheit von Containern: Geschwindigkeit

Die einzelnen Zeilen im Dockerfile werden in Containern persistiert und gecached. Das ist eine tolle Eigenschaft die sich folgendermaßen auswirkt: Beim ersten Mal dauert das erste Bauen etwa 8 Minuten. Das ist schon ein beachtlicher Unterschied zur Lösung mit der VirtualBox.

Wenn allerdings neue Zeilen im Dockerfile hinzufüge, dann dauert der Build-Vorgang wenige Sekunden. Die bereits gebauten Zeilen werden als zustandslose Container gespeichert und können jederzeit blitzschnell abgerufen werden. Das fertige Image kann man sogar auf hub.docker.com kostenfrei hochladen.

Rohre rein und Rohre raus

Das Image kann man auf der Shell ausführen. Das sieht mit Volumes mit den Mount-Points dann so aus:

docker run \
--rm \
-v /Users/marc/Documents/mcserver/:/tmp/world/:ro \
-v /Users/marc/Documents/config/:/tmp/config/:ro \
-v /Users/marc/Documents/export/:/tmp/export/:rw \
-it marctv/minecraft-overviewer

So werden die folgenden lokalen Order auf die Ordner im Image und werden dynamisch wie ein SymLink behandelt:

  • mcserver
  • config
  • export

Was macht Docker nun also anders als eine VM?

Docker spart den Overhead der virtuellen Machine ein.
Docker spart den Overhead der virtuellen Machine ein.

Docker ist keine Virtual Machine

Mit Docker spart man sich also neben der Zeit auch die virtuelle Machine die Leistung frisst. Docker arbeitet direkt auf der Hardware und ist über den Docker Daemon davon getrennt. Hierdurch hat man die Vorteile der Performance zusammen mit der Sicherheit, einfach in Sekunden wieder alles einzureißen und neu aufzubauen.

Man spart sich den Overhead eines kompletten Betriebsystem mit Virtualisierungsebenen und gewinnt dank Containerisierung Geschwindigkeit beim Entwickeln und Bauen.

Docker auf dem Synology NAS

Overviewer schreibt auf meinem neuen Synology DS218+ NAS (kaufen) innerhalb von 12 Stunden über Docker 24 GB (!) isometrisches Kartenmaterial auf die Platte. Dank der Intel CPU kann dort im Gegensatz zu meinem alten Synology 216j NAS Docker als Paket installieren. Dort kann man mein fertiges Docker-Image unter dieser URL runterladen: https://hub.docker.com/r/marctv/minecraft-overviewer

Konfiguration von Overviewer über die Oberfläche von DSM
Meine Installation

Konfiguration von Overviewer über DSM

Wir konfigurieren den Overviewer-Container über die Docker Oberfläche in DSM. In der Docker App in DSM wählt man unter „Image“ marctv/minecraft-overviewer aus und drückt auf „Launch“ Dort vergibt man den Container-Namen „overviewer“ und setzt die CPU Priority auf „low“. Sonst schießt man mit dem Overviewer gerne mal den Minecraft-Server auf dem NAS ab.

Wichtig ist die „Advanced Configuration“. Dort gibt man unter „Volume“ drei Verzeichnisse an:

Lokale VerzeichnisseVerzeichnis im Container
Ordner mit dem Server. Darin muss ein Verzeichnis namens „world“ liegen das eine Datei namens level.dat enthält./tmp/server/
Ein für Docker schreibbares Verzeichnis für den Export/tmp/export/
(optional) Hier liegt die config.py drin. Ein Beispiel liegt in GitHub/tmp/config/

Wichtig ist, dass die Berechtigungen stimmen. Bei Problemen mit „permission error“ testweise alle Verzeichnisse für „everyone“ les- und schreibbar machen. Die Dokumentation Overviewer findet man auf overviewer.org. Hier steht unter anderem, wie man die config.py aufbaut.

Ein minimales Beispiel

Die Karte Nachts per Scheduler Task rendern

Wenn der konfigurierte Container funktioniert, dann kann man das Starten in ein Script auslagern, dass wir über den DSM Task Scheduler starten können. Hier der Inhalt meines Scriptes namens generate-mc-map.sh, dass in meinem Home-Verzeichnis /var/services/homes/marc liegt.

rsync -ahW --no-compress /volume1/mounts/mcserver/ /volume1/docker/world/
docker start overviewer -a
rsync -ahW --no-compress /volume1/docker/export/ ssh-user@marc.tv:/www/htdocs/web/mc/iso/
  1. Die erste Zeile synchronisiert das lokale Verzeichnis der MC Karte auf dem NAS mit einem Verzeichnis, in dem Docker Leserechte hat.
  2. Die zweite Zeile startet den Cocker container, den wir vorher mit den entsprechenden Verzeichnissen konfiguriert haben.
  3. Die dritte und letzte Zeile synchronisiert das Export-Verzeichnis der errechneten Minecraft Karte auf dem NAS mit einem Verzeichnis auf meinem Webserver. Mein NAS nutzt dafür die Public Key Authentication.

Der erste Durchlauf kann unter Umständen über 24 Stunden dauern. Nach dem ersten Durchlauf müssen nur noch die Unterschiede der Karte berechnet werden. Das geht dann deutlich schneller.

genPOI Beispiel

Wenn man die Marker auf der Karte generieren möchte, dann muss man die Environment Variable „overviewerParam“ auf „–genpoi“ gesetzt werden.

# sync SSD to HD
rsync -ahW --no-compress --delete --exclude '@eaDir' /volume2/SSD/mcserver/ /volume2/SSD/mcserver-static/
# run Overviewer and render map
docker start overviewer -a
docker start overviewer-genpoi -a
# sync markers to web
rsync -ahW --no-compress --stats --delete --exclude '@eaDir' /volume1/docker/export/ ssh-user@marc.tv:/www/htdocs/web/mc/iso/

Docker Container automatisch aktualisieren

Man kann Docker Container auch automatisch mit Watchtower aktualisieren. Das bietet sich vor allem bei mehreren laufenden Containern an. Sonst kann es passieren, dass sich die Client nicht mit dem Server verbinden können, weil die Versionen nicht übereinstimmen.

Der Dunning-Kruger-Effekt

Ich beanspruche nicht, dass ich Docker vollständig verstanden habe. Deswegen habe ich meinen Ex-Ex-Ex-Arbeitskollegen und Freund Ron gefragt, ob ich völlig daneben liege. Die Antwort war: „Sieht ganz ok aus..

Trotzdem kann ich sicherlich noch einige Kleinigkeiten optimieren. Zum Beispiel sollte man Dateien von git und den Mojang-Servern lieber von außen mit COPY hinzufügen.


Beitrag veröffentlicht

in

von

Kommentare

119 Antworten zu „Synology: Isometrische Minecraft-Karten mit Docker rendern“

  1. Avatar von Rudi Ratlos
    Rudi Ratlos

    Moin, ich nochmal ;)
    Nachdem jetzt alles soweit ganz gut und zu meiner Zufriedenheit läuft, kam ich auf den Gedanken, anstelle der Overview Karte das Plugin Dynmap zu installieren und dann die Dynmap mal zu testen. Das Plugin läuft und die Karten werden wohl auch generiert (der Ordner „web“ im Dynmap-Ordner ist jedenfalls schon ca. 6 GB groß und mit jeder Menge *.png Dateien befüllt. Wenn ich jedoch die index.html im webordner aufrufe, bekomme ich nur ein schwarzes Bild. Auch über http: // yourserverip: 8123 klappt es nicht.
    Hast du, oder jemand anderes damit schon Erfahrungen gemacht? Klappt das mit dem Dockerimage gar nicht, oder stelle ich mich wieder zu blöd an?
    P.S. : Die gleiche Vorgehensweise auf einem Raspi4 funktioniert einwandfrei. Allerdings ist der Raspi dafür wohl etwas zu rechenschwach und das Ganze nicht wirklich sinnvoll nutzbar.

    1. Avatar von Marc
      Marc

      Super spannend. Hast Erfahrungen damit? Link zum Dockerimage? Denn Overviewer ist zwar gut aber irgendwie geht es da auch nicht so richtig vorwärts.

  2. Avatar von Rudi_Ratlos
    Rudi_Ratlos

    Erfahrungen? Also meine Erfahrungen erstrecken sich auf mehrmaliges probieren mit verschiedenen Ports, auslagerung der von Dynmap erzeugten Dateien auf einen anderen Ordner und ein zaghafter Versuch das Ganze mit MariaDB 10 und phpMyAdmin auf der Synology zu realisieren. Alles erfolglos. Der MCServer hat ja auf dem Dockerimage einen Port um erreichbar zu sein. Das Plugin Dynmap, welches ja unter dem Serverport läuft, benötigt ja selber nochmals einen Port (8123) um erreichbar zu sein. Ich vermute, dass da das Problem liegt. Und mit der Auslagerung der Daten auf Mysql auf der Synology bin ich auch mittelschwer überfordert ;)
    Ich bin überzeugt, dass das jemand mit Ahnung von der Materie hinbekommen könnte. Leider kenne ich niemanden.

    1. Avatar von Marc
      Marc

      Hi,
      ich habe mir DynMaps mal angesehen. Ich persönlich finde die mobile Ausgabe vom Overviewer besser. Dafür hat DynMaps diese verschiedenen Layer und scheint Echtzeit-Postionen der Spieler eingebaut zu haben. Ich teste mal wie schnell er die Karte rendert.
      Mit dem hier beschriebenen Dockerimage kommst du mit dem Overviewer aber auch zum Ziel.

  3. Avatar von Rudi_Ratlos
    Rudi_Ratlos

    Ja, die Layer und gerade die Echtzeit-Position finde ich an Dynmap so super. Ich bin mal gespannt, ob du das auf dem Docker image zum laufen bekommst… ?

    1. Avatar von Marc
      Marc

      war kein Problem:
      Allerdings ist das ja nur ein Plugin. Das macht keinen Sinn, das Plugin im Dockercontainer mitzuführen. Einfach das DynMap JAR Plugin normal installieren und ggf. den Port komplett durchreichen.

  4. Avatar von Rudi_Ratlos
    Rudi_Ratlos

    Das klappt bei dir? Du hast das Plugin Dynmap in deinem Plugins-Ordner auf deinem Docker Image installiert, die Portadresse im Router durchgereicht und es lief sofort? Welche Version von dem Plugin hast du genommenen (Link?)

    1. Avatar von Marc
      Marc

      Sie aktuelle Beta10 für 1.15.2 habe ich genommen.

      Und nein, nicht im Container sondern in dem gemountetem Volume auf meinem NAS im Plugins Ordner. Siehe meine Anleitung. Es dauert eben halt 24 Stunden bis alles fertig gerendert ist.

  5. Avatar von Rudi_Ratlos
    Rudi_Ratlos

    Ok, an der Version kann es nicht liegen, die habe ich auch.
    Also: Mein MC-Server läuft auf meiner Synology. Diese hat intern die IP 192.168.178.40.
    Diese IP habe ich in meiner Fritzbox unter Portfreigabe 25565 als TCP und UDP freigegeben.
    In der Loginmaske von MC kann ich auch über diese IP meinen Server betreten.
    Das Plugin Dynmap hat doch für mein Verständnis die gleiche IP. Also auch 192.168.178.40. Aber eben mit dem Port 8123. Auch diesen Port habe ich in der Fritzbox für die 192.168.178.40 als TCP freigegeben. (Ist TCP richtig?) Ich habe es auch als Fritzfreigabe probiert, mit dem gleichen Fehler.
    Wenn ich nun also in einem Browser die IP 192.168.178:8123 eingebe, müsste doch meine Dynmap-Seite aufgerufen werden. Ich bekomme aber nur ein „403“ Fehler zurück.

    1. Avatar von Rudi_Ratlos
      Rudi_Ratlos

      Wenn ich nun also in einem Browser die IP 192.168.178:8123 eingebe

      Es muss natürlich 192.168.178.40:8123 heißen.
      Ich habe fast die Befürchtung, dass es genau wie mit dem Overviewer etwas mit den Berechtigungen auf der Synology zu tun hat. Aber ich weiß wirklich nicht mehr, was ich da noch freigeben soll. Wie gesagt: Mit einem Raspi (die gleiche Vorgehensweise) klappt das sofort. Dann kann es doch nur noch an der Synology liegen.

    2. Avatar von Marc
      Marc

      Du nutzt mein Image und meine Anleitung für den Minecraft Server?

    3. Avatar von Rudi_Ratlos
      Rudi_Ratlos

      Ja, natürlich. Sowohl auf dem raspberry als auch auf dem NAS

    4. Avatar von Marc
      Marc

      Also ich habe nur das gemacht, was ich oben im Kommentar geschrieben habe. Ggf. hast Du eine Firewall Beschränkung oder einfach im Docker statt 8123 zu 8123 dies stehen:
      auto zu 8123

  6. Avatar von Rudi_Ratlos
    Rudi_Ratlos

    oder einfach im Docker statt 8123 zu 8123 dies stehen:
    auto zu 8123

    Dieser letzte Satz hat mich auf meinen Fehler gebracht! Ich hatte im Dockerfile zwar als Ein- und Ausgangsport manuell jeweils 8123 angegeben, als ich jetzt jedoch nochmal nachgeschaut habe stand dort tatsächlich Auto —> 8123. Als ich nun versuchte nochmals dort 8123 einzugeben, meckerte die Synology, dass der Port schon anderweitig vergeben wäre und stellt ihn wieder auf auto.
    Ich habe jetzt erstmal einen anderen freien Port benutzt und diesen auch in der config.txt von Dynmap eingetragen. Was soll ich sagen? beim ersten Aufruf kam sofort die Dynmapkarte!
    Du hast mir (mal wieder) sehr geholfen! Vielen Dank dafür.
    LG
    Rudi

  7. Avatar von Zoli
    Zoli

    Hallo Marc,

    Erstmal danke für dein super tutorials.
    Ich hab dank dein hilfe ein minecraft server für mein schüler hinnbekomman :)
    Ich wahr neugierig wie overviewer aussieht.
    Aber leider bin ich kein tech guru, und bin auf ein hinderniss geschtosen.
    Ich kann nur die „World“ karte generieren, und ich weis nicht wie es ändern kann auf eigene karten namen.
    Ich glaub ich muss die config.py file modifizieren, aber ich Weiss nicht wie/oder wo ich es finden kann.
    Könte ich dabei ein bischen hilfe bekommen?

    Danke!!

    Zoli
    ps
    Sorry for my bad German.

    1. Avatar von Marc
      Marc

      Hi Zoli,
      das sind alles Dinge, die man in der Dokumentation von overviewer.org findet:

  8. Avatar von Zoli
    Zoli

    Hi Marc,

    Konnte mein fehler heute morgen bemerken.
    Ich bin nicht so gut mit Linux (überhaubt nicht) und wusste nicht wie mann richtig die /temp/config/ folder configuriert im docker.
    Dank dein config.py example hat alles dann funkzioniert.

    Danke nochmals für dein tolles tutorials.

    Zoli

    ps.:
    Is it possible in docker to have an e-mail notification if someone joins the minecraft server?

  9. Avatar von Perez
    Perez

    Hallo Marc,
    ich habe mal eine Frage die nur bedingt mit der Karte zu tun hat. Ich hatte vor meine alte Bedrock-Welt (mit 1.14 gestartet, nun 1.16) in eine Java Welt zu konvertieren.
    Das hat auch danke MCC Toolchest PE gut funktioniert.
    Leider ist mir während des Spielens bereits aufgefallen, dass scheinbar Chunks, die noch nie geladen wurde rein gar nicht zum Rest jetzt passen. Z.B. ein 16×16 Berg im Meer mit flacher Kante. Kann man dies irgendwie verhindern (ggf. die Chunks mit einen Programm vorher laden oder beim konvertieren was einstellen, damit die spätere Konvertierung passt?

    Grüße

    1. Avatar von Marc
      Marc

      Nein, wir leben auch damit.

    2. Avatar von Perez
      Perez

      Hi Marc,
      Ich habe eine Methode gefunden um die Karte zumindest vorzuladen. (15.000 x 15.000)
      Es handelt sich hierbei um eine Redstone/Commandblock Schaltung. Ich musste die nur ins „bedrockische“ übersetzen und man sollte daran denken, dass in der Bedrock Version die Chunks als Kreis um einen herum geladen werden und in der Java als Viereck (was das Vorladen in der Bedrock noch etwas länger dauern lässt)

    3. Avatar von Perez
      Perez

      PS: Ich weiß, dass ich somit auf neue Features (Kupfer) einen direkten Zugriff mehr haben werden, da die Chunks schon geladen wurden, daher benutze ich noch Multiverse um mir eine Farmwelt zu generieren.
      Dank Paper und Plugins ja möglich.

  10. Avatar von Death_Killers21
    Death_Killers21

    Hey Danke Für Die Anleitung^^alles funktioniert so Weit…Meine Frage ist wie Mach ich aus der (index.html)Download Datei ein Link Jedes mall wenn ich Da Drauf Klicke Heist es immer wo wollen sie Es Downloaden Ich Habe Es auch Mit Einigen anderen Suchmaschinen (Opera Gx/Edge/Crome)Ausprobieren jedes Mall die Gleiche Meldung wie Kann ich das Problem am besten Lösen bzw Habe ich Irgendwas vergessen?………………….und wollte noch mall Fragen ob das Normal ist das der Container nach dem Anschalte (5/10sec) wider Ausgeht?

    1. Avatar von Marc
      Marc

      Du musst das alles auf einen Webserver hochladen oder aus dem NAS einen Webserver machen. Letzteres würde ich dir nicht empfehlen so lange du solche Fragen wie oben stellst. Wenn der Container sich abschaltet, schau ins log. Bei mir läuft er für einen initialen Rendervorgang der gesamten Karte fast 20 Stunden. Für inkrementelle Renderdurchläufe 20 Min.

    2. Avatar von Death_Killers21
      Death_Killers21

      Oooo ok danke Für Die Schnelle Antwort…des hat jetzt so weit meine 2Fragen beantwortet..dann muss ich ein anderes mal wegen den Webserver schauen funktionieren ja so weit bekomme im Produkol ja angezeigt das es Fertig ist

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert