Der DomJudge ist ein Jury System für das automatische Testen der Abgaben von Programmierwettbewerben. Will man jedoch selbst Aufgaben entwerfen oder als Training alte Wettbewerbe simulieren, dann ist der Installationsaufwand unverhältnismäßig hoch. DomJudge bietet zwar Docker an, der Umgang ist allerdings etwas gewöhnungsbedürftig. Docker ist aber hier auch ein Ausweg, denn wenn die Docker einmal korrekt eingerichtet sind, dann funktioniert das System sehr zuverlässig. Dazu habe ich die Stärken von docker-compose mit denen des Docker Swarm Mode kombiniert. So kann der Domjudge sogar einfach über mehrere Server skaliert werden.

Disclaimer: Das Projekt wurde mit dem Hauptziel erstellt, möglichst schnell eine Domjudge-Instanz aufzusetzen. Es bietet zwar die Möglichkeit diesen auch für das lokale Netzwerk freizugeben, von dem Einsatz in einem Wettbewerb würde ich dennoch abraten – aus Performance und Sicherheitsaspekten!

Einrichtung

Die Einrichtung setzt eine funktionierende Docker-Installation mit docker-compose vorraus und passiert hauptsächlich auf der Kommandozeile:

# In den Ordner springen, wo später die DomJudge Daten abegelgt werden sollen
cd /.../.../...
# Das domjudge-docker-compose repository clonen
git clone https://github.com/LDAP/domjudge-docker-stack
# Mit einem beliebigen Editor sollte jetzt in der .env Datei der Wert von DB_PASS zu einer zufälligen Sequenz geändert werden
# Die Docker starten
docker swarm init
docker stack deploy -c <(docker-compose -f docker-compose.yml config) <beliebiger Stack-Name>
# Die Logs beobachten
docker service logs -f <beliebiger Stack-Name>_domserver

Docker lädt nun die Docker-Images herunter und startet dann nacheinander eine MariaDB Instanz, einen DomServer und einen Judgehost. Der DomServer und JudgeHost starten in dem Zeitraum einige Male neu bis die Datenbank online ist und bis der Judgehost konfiguriert wurde, da die Docker vom Domjudge-Team so konfiguriert sind, dass sich im Fehlerfall beenden – Docker startet diese in dem Fall einfach neu.

Sobald die Datenbank online ist, verbindet sich der Domserver als root und richtet die Datenbank ein. Anschließend gibt er auf der Kommandozeile zwei Zeilen aus:

XXXXXXXXXXX | Initial admin password is XXXXXXXXXX
XXXXXXXXXXX |
XXXXXXXXXXX | Initial judgehost password is XXXXXXXXXX

Diese Passwörter muss man sich zwingend notieren. Bei den zukünftigen Starts wird der Domserver zwar wieder Passwörter ausgeben, diese sind aber nicht gültig. Das scheint ein Bug von Domserver zu sein. (Stand 07.08.2020)

Jetzt stoppt man die Docker für den letzten Schritt indem man Ctrl+C drückt und anschließend in der Kommandozeile folgenden Befehl ausführt:

docker stack rm <beliebiger Stack-Name>

Jetzt öffnet man erneut die .env Datei und schreibt das notierte JudgeHost Passwort hinter JUDGE_PASS.

Danach ein letztes Mal noch

docker stack deploy -c <(docker-compose -f docker-compose.yml config) <beliebiger Stack-Name>

Ab jetzt sollte der DomJudge erreichbar sein über http://localhost, in dem man sich dann mit dem notierten Admin Passwort anmelden kann.

Skalieren

Noch läuft der DomJudge nur auf einem Server. Docker ermöglicht aber einfach weitere Server hinzuzufügen und den JudgeHost hochzuskalieren.

Dazu benötigt man den Output des docker swarm init Befehls in Form eines Tokens und einer IP sowie einem Port. Falls diese Informationen gerade nicht mehr zur Hand sind, kann man diese erneut abfragen:

docker swarm join-token worker

Danach kann man eine weitere Maschiene zu dem bestehenden Docker Swarm mit:

docker swarm join --token <token> IP:Port

hinzufügen.

Jetzt muss nur noch die Anzahl der JudgeHosts erhöht werden. Diese werden dann automatisch auf die hinzugefügten Worker verteilt. Um <Anzahl> JudgeHosts zu erzeugen verwendet man den folgenden Befehl:

docker service scale Domjudge_judge=<Anzahl>

Support

Aktuelle Informationen gibt es immer auf der GitHub Seite:

https://github.com/LDAP/domjudge-docker-stack