Skip to content
This repository has been archived by the owner on Apr 23, 2021. It is now read-only.
Morris Jobke edited this page Oct 31, 2016 · 14 revisions

Diese Anleitung ist lediglich für die Administratoren des Host-Systems. Dies muss nicht von den Labs getätigt werden.

Konzept

  • einzelne VMs für Labs/einzelne Projekte der Labs - je nachdem, wie es vom Lab gewünscht ist (im #codeforde-server Slack-Channel anfragen)
  • Port-Forwarding nur für SSH an die VM - die Anwendung selbst soll dann über Nginx laufen, damit z.B. das SSL-Offloading einheitlich auf dem Host stattfinden kann (siehe weiter unten)

Shortcuts

./create-new-machine.sh NAME
./add-domain.sh DOMAIN INTERNAL_URL

https://gist.github.com/MorrisJobke/79646f88396213e24d08ea7ec8f219fc

Neue virtuelle Maschine bereitstellen

Folgender Befehl erstellt eine virtuelle Maschine mit 10 GB Speicher (unter /var/lib/libvirt/images), 1 CPU, 512 MB Arbeitsspeicher und einem Ubuntu 14.04.4 Image. Dabei wird ein VNC-Server erstellt der öffentlich unter Port 5900 erreichbar ist und mit einem Passwort gesichert ist. Dieser sollte nur zur Installation genutzt werden.

$ NAME=leipzig_projekt1 virt-install --connect qemu:///system -n $NAME -r 512 --vcpus=1 -f /var/lib/libvirt/images/$NAME.img -s 10 --network network=default,model=virtio -c /opt/images/ubuntu-14.04.4-server-amd64.iso --graphics vnc,listen=0.0.0.0,password=SUPERGEHEIMESPASSWORT --autostart --noautoconsole -v

Installation des Gast-Systems

Der obige Befehl erstellt einen VNC-Server, der nun die Installation des Servers ermöglicht. Hierbei ist darauf zu achten, dass stets auch ein SSH-Server installiert wird.

Port-Forwarding

Für das Port-Forwarding an die neue Instanz einfach in der Datei /etc/libvirt/hooks/qemu.json einen Eintrag wie folgt hinterlegen:

{
    "leipzig_projekt1": {
        "interface": "virbr0",
        "private_ip": "192.168.122.234",
        "port_map": {
            "tcp": [[34567, 22]]
        }
    }
}

Dies leitet am Host den Port 34567 auf den Port 22 des internen Hosts 192.168.122.234 weiter. Der Name muss mit dem beim virt-install angegebenen übereinstimmen. Die IP-Adress erhält man, in dem man sich noch einmal über die VNC-Session in den neuen Server einloggt und dort ip addr ausführt oder auf dem Host die vergebenen IP-Adressen mittels arp -an -i virbr0 listet.

Das benutzte Tool für das Port-Forwarding ist libvirt-hook-qemu.

Installation abschließen

Anschließend sollte noch der VNC-Server geschlossen werden. Hierzu virsh edit leipzig_projekt1 ausführen und folgenden Eintrag aus dem XML-Dokument entfernen:

    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' passwd='SUPERGEHEIMESPASSWORT'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>

Nun muss die virtuelle Maschine einmal angehalten und erneut gestartet werden - ein reboot stoppt den VNC-Server nicht:

$ virsh shutdown leipzig_projekt1
$ virsh start leipzig_projekt1

Am besten jetzt noch einen Shortcut für diesen Host in /etc/hosts hinterlegen, dass man nicht immer wieder die IP nachschlagen muss (folgende Zeile hinzufügen):

192.168.122.234 leipzig_projekt1

Einloggen auf der virtuellen Maschine

Es kann sich nun mittels folgenden Befehl und dem Port aus dem Schritt "Port-Forwarding" (in diesem Fahl 34567) eingeloggt werden:

$ ssh [email protected] -p 34567

Virtuelle Maschine löschen

Um einen virtuelle Maschine zu löschen den Port-Forwarding-Eintrag in /etc/libvirt/hooks/qemu.json entfernen und folgende Befehle ausführen:

$ virsh destroy leipzig_projekt1
$ virsh undefine leipzig_projekt1
$ rm /var/lib/libvirt/images/leipzig_projekt1.img

Let's Encrypt

Wichtig: Vorab natürlich die neue Domain ins DNS eintragen. ;)

Folgende Befehle kopieren eine Nginx-Konfiguration, setzen die URL/Domain, registrieren die Domain in der Letsencrypt.sh-Konfiguration, beziehen die SSL-Zertifikate, und starten den Nginx neu.

DOMAIN=projekt1.leipzig.codefor.de
INTERNAL=leipzig_projekt1:8080
cp /etc/nginx/sites-available/TEMPLATE /etc/nginx/sites-available/$DOMAIN
sed -i -e "s/EXTERNAL_DOMAIN/$DOMAIN/" /etc/nginx/sites-available/$DOMAIN
sed -i -e "s/INTERNAL_URL/$INTERNAL/" /etc/nginx/sites-available/$DOMAIN
echo $DOMAIN >> /etc/letsencrypt.sh/domains.txt
ln -s ../sites-available/$DOMAIN /etc/nginx/sites-enabled/$DOMAIN
service nginx reload
su letsencrypt -c "~/letsencrypt.sh/letsencrypt.sh -c"
service nginx reload

Passwort Recovery