diff --git a/online-werkzeuge-admin.pdf b/online-werkzeuge-admin.pdf
index 2c351b5ec22639f0389abda12f5df8616033a0cc..185396ba3d1da906527296d34d0b52d1e0bc0ecd 100644
Binary files a/online-werkzeuge-admin.pdf and b/online-werkzeuge-admin.pdf differ
diff --git a/online-werkzeuge-admin.tex b/online-werkzeuge-admin.tex
index 90b76385d90d57f2606395b9ad144af1e8b51b7d..127975ee79e595be19b27070d17b92640d285a6f 100644
--- a/online-werkzeuge-admin.tex
+++ b/online-werkzeuge-admin.tex
@@ -28,6 +28,13 @@
 \newcommand{\sep}{~$\cdot$~}
 \newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)}
 
+\lstdefinestyle{terminal}{basicstyle=\small\ttfamily\color{darkgreen},
+                          language={},
+                          columns=fixed,
+                          moredelim=**[is][\color{darkred}]{¡}{¿},
+                          moredelim=**[is][\color{blendedblue}]{°}{¿},
+                          moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}}
+
 \begin{document}
 
   \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
@@ -104,7 +111,7 @@
     \item
       Wir haben einige proprietäre Online-Kommunikationswerkzeuge ausprobiert
       und können das oft behauptete Plus an Funktionsumfang und Stabilität
-      unter gleichen Bedingungen nicht bestätigen.
+      \emph{unter gleichen Bedingungen\/} nicht bestätigen.
       (So darf man zum Beispiel ein Web-Interface
       nur mit einem anderen Web-Interface vergleichen,
       nicht jedoch mit einer installierten Software.)
@@ -165,8 +172,8 @@
 
   \section{Let's Encrypt}
 
-  Die diversen Online-Dienste benötigen X.509-Zertifikate.
-%  Oft laufen die Dienste auf separaten (virtuellen) Rechnern.
+  Für sichere Verbindungen mittels TLS
+  benötigen die Online-Dienste X.509-Zertifikate.
   Wir zeigen hier, wie man mit Hilfe von \newterm{Let's Encrypt}
   sichere Zertifikate erhält.
 
@@ -181,7 +188,7 @@
 
   In unserem Beispiel läuft der DNS-Server auf einem Rechner \file{comm-0},
   der \term{Let's Encrypt\/}-Client hingegen auf einem anderen Rechner \file{main-1},
-  auf dem letztlich das Zertifikat benötigt wird.
+  auf dem tatsächlich das Zertifikat benötigt wird.
 
   Die Installation erfolgt mittels:
   \begin{lstlisting}[style=terminal]
@@ -225,12 +232,27 @@
   Zum Aktualisieren des DNS-Records wird einmalig \file{dnssec-keygen}
   (Installation mittels \lstinline[style=cmd]{apt install bind9utils}) und
   jedesmal \file{nsupdate} (\lstinline[style=cmd]{apt install dnsutils}) benötigt.
-  Nach dem Erstellen des Schlüssels in \file{/etc/bind} (Kommando s.\,u.)
-  und der Konfiguration des Rechners \file{comm-0} kann das Update erfolgen.
+
+  \goodbreak
+  
+  Wir erstellen zunächst im Verzeichnis \file{/etc/bind}
+  mit \file{dnssec-keygen} einen Schlüssel:
+  \begin{lstlisting}[style=terminal]
+    root@main-1:/etc/bind# ¡dnssec-keygen -a hmac-sha512 -b 512 -n host \
+                           main-1.$DOMAIN¿
+  \end{lstlisting}
+  (Auch hier muß \lstinline[style=cmd]{$DOMAIN} durch
+  die von Ihnen verwendete Internet-Domain ersetzt werden.)
+
+%  Nach dem Erstellen des Schlüssels in \file{/etc/bind} (Kommando s.\,u.)
+%  und der Konfiguration des Rechners \file{comm-0} kann das Update erfolgen.
+
+  Für das dynamische DNS-Update verwenden wir das folgende Shell-Skript:
   \begin{lstlisting}[style=terminal]
     root@main-1:~# ¡cat /usr/local/sbin/letsencrypt_dns_update¿
     #!/bin/bash
-    # Generate key using: dnssec-keygen -a hmac-sha512 -b 512 -n host ¡main-1.$DOMAIN¿
+    # Generate key using:
+    # dnssec-keygen -a hmac-sha512 -b 512 -n host ¡main-1.$DOMAIN¿
 
     if [ -z "$CERTBOT_DOMAIN" ] || [ -z "$CERTBOT_VALIDATION" ]
     then
@@ -240,7 +262,8 @@
 
     HOST="_acme-challenge"
 
-    /usr/bin/nsupdate -k /etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private << EOM
+    /usr/bin/nsupdate -k \
+      /etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private << EOM
     server comm-0.¡$DOMAIN¿
     zone ${HOST}.${CERTBOT_DOMAIN}
     update delete ${HOST}.${CERTBOT_DOMAIN} TXT
@@ -249,43 +272,43 @@
     EOM
     echo ""
   \end{lstlisting}
+  Der auf \file{main-1} erzeugte Schlüssel
+  muß natürlich von \file{comm-0} auch akzeptiert werden.
+  Hierzu tragen wir in die Datei \file{/etc/bind/named.conf.local} folgendes ein:
+  \begin{lstlisting}[style=terminal]
+    zone "_acme-challenge.mumble.¡$DOMAIN¿" {
+            type master;
+            file "/etc/bind/dynamic/db._acme-challenge.mumble.¡$DOMAIN¿";
 
-\iffalse
-
-## comm-0
-
-Der auf main-1 erzeugte Key muss natürlich von comm-0 auch akzeptiert werden:
+            # look for dnssec keys here:
+            key-directory "/etc/bind";
 
-root@comm-0:~# grep -A6 -F mumble.¡$DOMAIN¿ /etc/bind/named.conf.local; grep '^include .*main-1' /etc/bind/named.conf.local
-zone "_acme-challenge.mumble.¡$DOMAIN¿" {
-        type master;
-        file "/etc/bind/dynamic/db._acme-challenge.mumble.¡$DOMAIN¿";
+            allow-update { key main-1.¡$DOMAIN¿; };
+    };
 
-        # look for dnssec keys here:
-        key-directory "/etc/bind";
+    include "/etc/bind/keys/key.main-1.¡$DOMAIN¿";
 
-        allow-update { key main-1.¡$DOMAIN¿; };
-};
-include "/etc/bind/keys/key.main-1.¡$DOMAIN¿";
+    root@comm-0:~# cat /etc/bind/keys/key.main-1.¡$DOMAIN¿
+    key main-1.¡$DOMAIN¿. {
+            algorithm HMAC-SHA512;
+            secret "$KEY_AUS_/etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private_AUF_MAIN-1";
+    };
+  \end{lstlisting}
 
-root@comm-0:~# cat /etc/bind/keys/key.main-1.¡$DOMAIN¿
-key main-1.¡$DOMAIN¿. {
-        algorithm HMAC-SHA512;
-        secret "$KEY_AUS_/etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private_AUF_MAIN-1";
-};
+\iffalse
 
 Damit die eigentliche Challenge direkt beim eigenem DNS-Server abgefragt
 wird (um Verzögerungen durch den nötigen AXFR-Transfer zu umgehen, wird
 der entsprechende DNS-Eintrag auf den sonst für cvh-server.de benutzten
 Servern auf unseren eigenen Server delegiert), außerdem muss
-mumble.¡$DOMAIN¿ natürlich einen CNAME oder A-Eintrag erhalten:
+mumble.cvh-server.de natürlich einen CNAME oder A-Eintrag erhalten:
 
-root@comm-0:~# grep -F mumble /var/lib/bind/db.¡$DOMAIN¿
+root@comm-0:~# grep -F mumble /var/lib/bind/db.cvh-server.de
 mumble                  IN CNAME        main-0
 _acme-challenge.mumble  IN NS dns-0
 
 Aus Sicherheitsgründen wollen wir Port 53 aber von dort nicht allgemein
-beantworten, sondern uns eigentlich auf die \term{Let's Encrypt\/}-Server
+beantworten, sondern uns eigentlich auf die Letsencrypt-Server
 beschränken. Leider scheinen deren Anfragen nun von sehr vielen
 verschiedenen Amazon-Servern zu kommen (siehe root@root-1:~# grep -F
 letsencrypt /etc/iptables.rules, welches aktuell unvollständig ist),
@@ -296,6 +319,285 @@ außen erlaubt.
 
 TODO: Schöner lösen!
 
+# Mumble
+
+Läuft auf main-1.cvh-server.de.
+
+apt install mumble-server
+
+Standardmäßig besetzt Mumble den Port 64738. Da ich zwei unabhängige
+Server haben wollte, läuft auf der VM eine zweite Instanz auf Port
+64739. Die Hardware auf der die VM läuft, hat zwei offizielle
+IP-Adressen, dort wird das jeweils wieder nach außen unter Port 64738 angeboten.
+
+## root-0:
+root@jitsi:~# grep mumble /etc/iptables.rules
+-A PREROUTING -d 88.99.194.201/32 -p tcp -m multiport --dports 1191,1935,8888,64738 -m comment --comment main-1,..,fex,mumble -j DNAT --to-destination 192.168.137.11
+-A PREROUTING -s 130.180.23.228/30 -d 88.99.194.201/32 -p udp -m multiport --dports 5060,64738 -m comment --comment sip,mumble -j DNAT --to-destination 192.168.137.11
+-A PREROUTING -d 88.99.194.245/32 -p tcp -m tcp --dport 64738 -m comment --comment second-0-mumble -j DNAT --to-destination 192.168.137.11:64739
+-A PREROUTING -d 88.99.194.245/32 -p udp -m udp --dport 64738 -m comment --comment second-0-mumble -j DNAT --to-destination 192.168.137.11:64739
+
+## Konfiguration auf main-0
+Konfiguration der vorkonfigurierten Instanz geschieht durch /etc/mumble-server.ini.
+
+Die Zweit-Instanz wird durch /etc/mumble-server2.ini konfiguriert. Ich habe zum Starten das Init-Skript kopiert und angepasst:
+
+root@main-1:~# diff --unified /etc/init.d/mumble-server{,2}
+--- /etc/init.d/mumble-server   2019-02-28 17:36:21.000000000 +0100
++++ /etc/init.d/mumble-server2  2020-03-17 13:59:37.916856121 +0100
+@@ -1,7 +1,7 @@
+ #! /bin/sh
+ #
+ ### BEGIN INIT INFO
+-# Provides:             mumble-server
++# Provides:             mumble-server2
+ # Required-Start:       $network $local_fs $remote_fs
+ # Required-Stop:       $network $local_fs $remote_fs
+ # Should-Start:         $mysql dbus
+@@ -13,7 +13,7 @@
+ ### END INIT INFO
+
+ PATH=/sbin:/bin:/usr/sbin:/usr/bin
+-NAME=mumble-server
++NAME=mumble-server2
+ DESC="Mumble VoIP Server"
+ PIDDIR=/run/$NAME
+ PIDFILE=$PIDDIR/$NAME.pid
+@@ -23,7 +23,7 @@
+
+ test -x $DAEMON || exit 0
+
+-INIFILE=/etc/mumble-server.ini
++INIFILE=/etc/mumble-server2.ini
+ DAEMON_OPTS="-ini $INIFILE"
+ MURMUR_USE_CAPABILITIES=0
+ MURMUR_LIMIT_NOFILE=0
+
+Wichtig: Es reicht nicht, die Angabe des PIDFILE dort anzupassen. Dies
+muss auch in der ini-Datei passieren, wichtig ist es auch eine getrennte
+Datenbank zu benutzen:
+
+--- /etc/mumble-server.ini      2020-03-15 23:45:20.694309575 +0100
++++ /etc/mumble-server2.ini     2020-03-15 23:44:17.324835415 +0100
+@@ -13,7 +13,7 @@
+
+ ; Path to database. If blank, will search for
+ ; murmur.sqlite in default locations or create it if not found.
+-database=/var/lib/mumble-server/mumble-server.sqlite
++database=/var/lib/mumble-server/mumble-server2.sqlite
+
+ ; Murmur defaults to using SQLite with its default rollback journal.
+ ; In some situations, using SQLite's write-ahead log (WAL) can be
+@@ -102,13 +102,13 @@
+ ; logs to the file 'murmur.log'. If you leave this field blank
+ ; on Unix-like systems, Murmur will force itself into foreground
+ ; mode which logs to the console.
+-logfile=/var/log/mumble-server/mumble-server.log
++logfile=/var/log/mumble-server/mumble-server2.log
+
+ ; If set, Murmur will write its process ID to this file
+ ; when running in daemon mode (when the -fg flag is not
+ ; specified on the command line). Only available on
+ ; Unix-like systems.
+-pidfile=/run/mumble-server/mumble-server.pid
++pidfile=/run/mumble-server2/mumble-server2.pid
+
+ ; The below will be used as defaults for new configured servers.
+ ; If you're just running one server (the default), it's easier to
+@@ -120,7 +120,7 @@
+ welcometext="<br />Welcome to this server running <b>Murmur</b>.<br />Enjoy your stay!<br />"
+
+ ; Port to bind TCP and UDP sockets to.
+-port=64738
++port=64739
+
+## Letsencrypt
+Standardmäßig läuft Mumble mit einem selbst-signiertem Zertifikat, was
+zu Warnmeldungen beim ersten Verbinden führt und dem damit verbundenen
+Sicherheitsverlust. Die Erlangung eines entsprechenden Zertifikats wurde
+bereits oben beschrieben. Um das Zertifikat und den Schlüssel für Mumble
+zu nutzen, wird es mit dem folgenden Skript installiert:
+root@main-1:~# cat /usr/local/sbin/letsencrypt-install-new-keys
+#!/bin/sh
+
+install -m 644 -o root -g mumble-server /etc/letsencrypt/live/mumble.cvh-server.de/fullchain.pem /var/lib/mumble-server/cert.pem
+install -m 640 -o root -g mumble-server /etc/letsencrypt/live/mumble.cvh-server.de/privkey.pem /var/lib/mumble-server/privkey.pem
+
+systemctl force-reload mumble-server
+
+## Benutzerverwaltung
+
+Zu Beginn existiert in Mumble lediglich der Benutzer SuperUser. Neue
+Benutzer*innen können sich direkt mit dem Mumble-Server verbinden und
+dann mittels des Menüpunktes Self->Register ihr beim Starten des
+Mumble-Clients erzeugtes (oder von einem anderen Rechner importiertes)
+Zertifikat mit dem aktuell verwendeten Benutzernamen verknüpfen.
+
+Mit dem Mumble-Client kann der SuperUser dann genutzt werden, um die
+entsprechenden Personen in eine neu erstellte privilegierte Gruppe
+"lehrende" aufzunemen und diesen Rechte zu geben, die es z.B.
+ermöglichen, störende Teilnehmer*innen eines Gesprächs ggf.
+stummzuschalten oder auszuschließen.
+
+
+# OpenMeetings
+
+Da die Installationsanleitungen für OpenMeetings von der Installation
+auf einem Ubuntu-System ausgehen und andere Softwarepakete (insb. ros)
+gezeigt haben, dass für Ubuntu vorgesehene Software u.U. nur
+problematisch auf einem Debian GNU/Linux zum Laufen zu bringen ist,
+wurde hierfür eine VM auf Ubuntu-Basis installiert:
+
+root@root-1:~# xen-create-image  --size=15Gb --swap=4096Mb --memory=4096Mb --maxmem=4096Mb --dist=bionic --ip=192.168.137.90 --no-pygrub --hostname=ubuntu-0.cvh-server.de --mirror=http://mirror.hetzner.de/ubuntu/packages
+
+Bei der Anleitung wurde im Wesentlichen
+https://cwiki.apache.org/confluence/display/OPENMEETINGS/Tutorials+for+installing+OpenMeetings+and+Tools?preview=/27838216/140774282/Installation%20OpenMeetings%205.0.0-M3%20on%20Ubuntu%2018.04%20LTS.pdf
+gefolgt, allerdings wurde ffmpeg nicht selbst kompiliert, sondern aus
+den Paketquellen installiert.
+
+## Kurento Media Server
+
+Der Kurento-Media-Server ist für die Verarbeitung von Medienströmen
+(Audio-, Video- und Screensharing-Streams) notwendig und wird von
+OpenMeetings verwendet. Damit Medienströme weitergeleitet werden können,
+obwohl sich sowohl OpenMeetings als auch i.d.R. die Teilnehmenden hinter
+einem NAT befinden, wird dieser so konfiguriert, dass er Zugriff auf
+einen TURN-Server besitzt.
+
+root@ubuntu-0:~# grep ^turnURL /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
+turnURL=kurento:$TURN_PASSWORT@88.99.194.201:3478
+
+### Coturn
+
+Dieser TURN-Server wird außerhalb einer VM direkt auf dom0 (siehe
+https://en.wikipedia.org/wiki/Xen) mittels 'apt install coturn'
+installiert, die verwendete Konfiguration lautet:
+
+root@root-1:~# cat /etc/turnserver.conf
+listening-port=3478
+tls-listening-port=5349
+fingerprint
+lt-cred-mech
+user=kurento:$TURN_PASSWORT
+realm=root-0.cvh-server.de
+total-quota=100
+stale-nonce
+cert=/etc/ssl/le/fullchain.pem
+pkey=/etc/ssl/le/privkey.pem
+cipher-list="ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5"
+no-loopback-peers
+no-multicast-peers
+verbose
+
+## Raumkonfiguration
+
+Räume und Benutzer wurden über die Weboberfläche angelegt, da keine
+einfache Möglichkeit gefunden wurde, die Lehrenden jeweils automatisch
+zu Moderatoren zu machen, wurden diese jeweils über ein Shellskript zu
+Moderatoren jeden Raumes ernannt. Nach Anwendung ist einmalig
+root@ubuntu-0:~# /etc/init.d/tomcat3 restart
+auszuführen.
+
+root@ubuntu-0:~# cat  /usr/local/sbin/give_rights_to_all_lecture_rooms
+#!/bin/sh
+(for user in 2 5 6 7 8 12 30 31 32 33 34 35; do
+for room in $(seq 21 32); do
+echo "insert into room_moderator (roomId, user_id) values ($room, $user);"
+done
+done) | mysql --database=open503 -B
+
+# NoVNC
+
+Installation mittels 'apt install novnc'.
+
+## systemd
+
+Um mehrere Räume bereitstellen zu können, wird ein entsprechendes Skript
+für systemd geschrieben. Dies lässt NoVNC dauerhaft laufen, alternativ
+wäre auch eine Aktivierung beim Kontaktaufbau zum entsprechenden
+TCP-Socket denkbar.
+
+root@main-0:~# cat /etc/systemd/system/novnc@.service
+[Unit]
+Description = start noVNC service %i
+After=syslog.target network.target
+
+[Service]
+Type=simple
+User=novnc
+ExecStart = /usr/local/sbin/hsbo_novnc %i
+
+[Install]
+WantedBy=multi-user.target
+
+root@main-0:~# cat /usr/local/sbin/hsbo_novnc
+#!/bin/bash
+
+i=$1; shift
+exec /usr/share/novnc/utils/launch.sh --listen $((6080 + $i)) --vnc localhost:$((5900 + $i)) $*
+
+Wir wollen 13 Instanzen, diese werden mittels
+root@main-0:~# for i in $(seq 0 12); do systemctl start novnc@$i; systemctl enable novnc@$i;done
+gestartet und dauerhaft aktiviert (sodass sie nach einem Reboot wieder zur Verfügung stehen).
+
+## Apache
+
+NoVNC soll hinter einem Apache-Proxy bleiben. Zur Kommunikation werden WSS (secure Websockets) benötigt.
+Daher müssen mittels 'a2enmod proxy_wstunnel proxy_http' die entsprechenden Module aktiviert werden.
+
+Die entsprechende Apache-Konfiguration sieht so aus, die Verbindungen sollen grundsätzlich verschlüsselt passieren:
+
+root@main-0:~# cat /etc/apache2/sites-enabled/novnc.cvh-server.de.conf
+<VirtualHost _default_:80>
+        ServerAdmin webmaster@cvh-server.de
+        ServerName novnc.cvh-server.de
+        ServerAlias www.novnc.cvh-server.de
+
+        Redirect / https://novnc.cvh-server.de/
+
+        ErrorLog ${APACHE_LOG_DIR}/novnc.cvh-server.de-error.log
+        LogLevel warn
+        CustomLog ${APACHE_LOG_DIR}/novnc.cvh-server.de-access.log combined
+
+</VirtualHost>
+
+<VirtualHost _default_:443 _default_:8443>
+        ServerAdmin webmaster@cvh-server.de
+        ServerName novnc.cvh-server.de
+        ServerAlias www.novnc.cvh-server.de
+
+        ProxyPass /websockify ws://localhost:6080/websockify
+        ProxyPassReverse /websockify ws://localhost:6080/websockify
+
+        ProxyPass /websock/0/ ws://localhost:6080/websockify
+        ProxyPassReverse /websock/0/ ws://localhost:6080/websockify
+
+        ProxyPass /websock/1/ ws://localhost:6081/websockify
+        ProxyPassReverse /websock/1/ ws://localhost:6081/websockify
+
+…
+        ProxyPass /websock/12/ ws://localhost:6092/websockify
+        ProxyPassReverse /websock/12/ ws://localhost:6092/websockify
+
+        ProxyPass / http://localhost:6080/
+	ProxyPassReverse / http://localhost:6080/
+
+        ErrorLog ${APACHE_LOG_DIR}/novnc.cvh-server.de-error.log
+        LogLevel warn
+        CustomLog ${APACHE_LOG_DIR}/novnc.cvh-server.de-access.log combined
+        SSLEngine on
+</VirtualHost>
+
+
+Auf die einzelnen Räume kann jetzt über URLs der Form
+
+https://novnc.cvh-server.de/vnc.html?host=novnc.cvh-server.de&port=443&path=websock/0/&reconnect=1&resize=scale
+https://novnc.cvh-server.de/vnc.html?host=novnc.cvh-server.de&port=443&path=websock/1/&reconnect=1&resize=scale
+…
+https://novnc.cvh-server.de/vnc.html?host=novnc.cvh-server.de&port=443&path=websock/12/&reconnect=1&resize=scale
+
+zugegriffen werden.
+
   \fi
 
   \emph{(Fortsetzung folgt.)}