Sascha Schulz
2025-03-10 198067ddffd2bc8f90fc93410b1b00eb89e1e280
Merge branch 'draft'
1 Dateien geändert
2 Dateien hinzugefügt
388 ■■■■■ Geänderte Dateien
assets/images/administration-timeout-20s.png Patch | Ansicht | Raw | Blame | Historie
assets/images/ubuntu-installation.png Patch | Ansicht | Raw | Blame | Historie
index.html 388 ●●●●● Patch | Ansicht | Raw | Blame | Historie
assets/images/administration-timeout-20s.png
assets/images/ubuntu-installation.png
index.html
@@ -4484,6 +4484,394 @@
                            <li>Die gefundenen Primzahlen können ausgegeben werden, müssen aber nicht. In erster Linie geht es darum, die Arbeit auf mehrere Threads aufzuteilen.</li>
                        </ul>
                    </section>
                    <section>
                        <h3>Multi Page Applications</h3>
                    </section>
                    <section>
                        <p>Im Gegensatz zu einer SPA ("Single Page Application") teilt sich eine Multi Page Application in mehrere Unterseiten auf, die sich per URL z.B. im Browser adressieren lassen.</p>
                    </section>
                    <section>
                        <p>In einem neuen Ordner / Projekt:</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                npm init -y
                                npm install express pug
                                mkdir public
                            </code>
                        </pre>
                        <pre>
                            <code class="js" data-trim data-line-numbers>
                                // index.js (s. examples 010-nodejs/mpa.js)
                                const express = require("express");
                                const app = express();
                                app.use(express.static("public"));
                                app.listen(3002);
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Aufgabe</h3>
                        <p>Fülle das Verzeichnis "public" mit jeweis einer HTML-Datei für eine "Home"- und eine "About Us"-Seite, die beide eine einfache Navigations-Leiste enthalten (simple <code>span</code> mit Link (href)), um zwischen diesen beiden Seiten navigieren zu können.
                            Unterscheiden sollen sich diese beiden Seiten durch ihren "Inhalt", indem dort einfach "Home" und "About Us" enthalten ist.</p>
                    </section>
                    <section>
                        <h3>Serverseitiges Rendern</h3>
                    </section>
                    <section>
                        <p>Template-Engine "pug"</p>
                        <pre>
                            <code class="css" data-trim data-line-numbers>
                                html
                                    head
                                    body
                                        div This is a div with some text
                                        #main.my-class This is also a div with short-hands for id and class
                                        a(href="/") This is a link with href
                            </code>
                        </pre>
                    </section>
                    <section>
                        <p>Conditionals</p>
                        <pre>
                            <code class="css" data-trim data-line-numbers>
                                html
                                    head
                                    body
                                        if name
                                            div Hello #{name}!
                                        else
                                            div Hello Anonymous"
                            </code>
                        </pre>
                    </section>
                    <section>
                        <p>Extension / Inheritance</p>
                        <pre>
                            <code class="css" data-trim data-line-numbers>
                                // layout.pug
                                html
                                    head
                                    body
                                        div Some static content
                                        block content
                                // page.pug
                                extends layout.pug
                                block content
                                    div This is my home content
                            </code>
                        </pre>
                    </section>
                    <section>
                        <p>Pug in Express</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                mkdir views
                            </code>
                        </pre>
                        <pre>
                            <code class="js" data-trim data-line-numbers>
                                // ...
                                app.set('view engine', 'pug');
                                app.get('/', (req, res) => {
                                    // file name without .pug and some data passed to the template
                                    res.render('index', { title: 'Hey', message: 'Hello there!' })
                                });
                                app.listen(3002);
                            </code>
                        </pre>
                        <pre>
                            <code class="css" data-trim data-line-numbers>
                                // views/index.pug
                                html
                                    head
                                        title #{title}
                                    body #{message}
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Aufgabe</h3>
                        <p>Implementiere die Seiten aus dem vorherigen Beispiel mit Pug (nutze Vererbung, um die Navigationsleiste nicht doppelt implementieren zu müssen) und
                            baue einen Gruß im Seitentext mit dynamischen Namen ein, den man z.B. in der URL als Query-Parameter "?name=Joe" angibt und der im Server ausgewertet wird.</p>
                    </section>
                </section>
                <section>
                    <section>
                        <h2>Betrieb von Anwendungen</h2>
                    </section>
                    <section>
                        <p>Wichtige Aspekte beim produktiven Betrieb von Anwendungen</p>
                        <ul>
                            <li>Stabilität</li>
                            <li>Zugriffsschutz</li>
                            <li>Sicherheitsupdates</li>
                            <li>Ausfallsicherheit</li>
                        </ul>
                    </section>
                    <section>
                        <p>Typische Werkzeuge beim Betrieb</p>
                        <ul>
                            <li>Webserver</li>
                            <li>Proxies</li>
                            <li>Laufzeitumgebungen</li>
                            <li>Application-Server / Prozess-Manager</li>
                            <li>Remote-Zugänge</li>
                        </ul>
                    </section>
                    <section>
                        <h3>Beispielhafte Produktivumgebung mit lokaler VM</h3>
                    </section>
                    <section>
                        <p>Vorbereitungen</p>
                        <ul>
                            <li>Oracle VirtualBox</li>
                            <li>Ubuntu Server 24.04</li>
                        </ul>
                    </section>
                    <section>
                        <p>Eckdaten für die VM</p>
                        <ul>
                            <li>2048 MB Ram</li>
                            <li>Netzwerktyp "Brücke" / "Bridge"</li>
                            <li>Linux / Ubuntu (64-Bit)</li>
                            <li>20GB HDD</li>
                        </ul>
                    </section>
                    <section>
                        <img data-src="/assets/images/ubuntu-installation.png">
                    </section>
                    <section>
                        <p>Nach der Installation in der VM mit den bekannten Credentials anmelden und die IP in Erfahrung bringen:</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                ip a
                            </code>
                        </pre>
                    </section>
                    <section>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                2: enp0s3: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP [...]
                                    link/ether 08:00:27:43:e5:2c brd ff:ff:ff:ff:ff:ff
                                    inet 10.0.0.166/16 metric 100 brd 10.0.255.255 scope global dynamic enp0s3
                                        valid_lft 863191sec preferred_lft 863191sec
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Anmeldung am Server</h3>
                        <p>Nach der Installation am Server anmelden</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                ssh user@domain [-p 12345]
                            </code>
                        </pre>
                        <p>Beispiele für eine Domain: localhost, www.example.com, 127.0.0.1, [0:0:0:0:0:0:0:1], [::1]</p>
                    </section>
                    <section>
                        <p>Es kann auch der bei der Installation des Servers angegebene Host-Name verwendet werden, z.B.</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # "vm-ubuntu-server"
                                ssh user@vm-ubuntu-server
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Pakete aktualisieren</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # Paketlisten updaten
                                sudo apt update
                                # Pakete updaten
                                sudo apt upgrade
                            </code>
                        </pre>
                        <p>sonstige Werkzeuge installieren</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                sudo apt install vim git curl build-essential
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Ordner-Navigation</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # In einen Ordner gehen
                                cd [Ordner]
                                # Zum vorherigen Ordner gehen
                                cd -
                                # Längere Ordnerpfade sind auch möglich
                                # realtiv
                                cd a/b/c/d
                                # absolut
                                cd /var/www/html
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Ordner erstellen und löschen</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # Einen Ordner erstellen
                                mkdir my-folder
                                # Mehrere Hierarchien
                                mkdir -p a/b/c/d
                                # Mehrere Ordner
                                mkdir a b c
                                # Ordner rekrusiv löschen
                                rm -rf [Ordner]
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Ordner und Dateien kopieren und verschieben</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # Ordner kopieren
                                cp -r quelle ziel
                                # Datei kopieren
                                cp quelle ziel
                                # Ordner und Dateien verschieben
                                mv quelle ziel
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Eigenen User anlegen</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # User anlegen
                                # -m => Home Ordner anlegen
                                # -G => zur angegeben Gruppe hinzufügen
                                # -s => Pfad zur Shell, in diesem Fall /bin/bash
                                useradd [user] -m -G sudo -s /bin/bash
                                # Passwort setzen
                                passwd [user]
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Authentifizierung per SSH-Key-Pair</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # Schlüsselpaar lokal erzeugen, falls nicht vorhanden
                                ssh-keygen
                                # Inhalt aus Datei kopieren:
                                cat ~/.ssh/id_rsa.pub
                            </code>
                        </pre>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # Auf dem Server in folgenden Datei einfügen (Public Key pro Zeile):
                                ~/.ssh/authorized_keys
                            </code>
                        </pre>
                        <p>anschließend wird kein Passwort mehr beim Login benötigt</p>
                    </section>
                    <section>
                        <h3>Apache einrichten</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                sudo apt install apache2
                            </code>
                        </pre>
                        <p>Einrichtung überprüfen</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # Oder im Browser aufrufen:
                                curl http://vm-ubuntu-server
                            </code>
                        </pre>
                    </section>
                    <section>
                        <p>Aufbau der Apache-Konfiguration</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # Hauptdatei, selten gebraucht
                                /etc/apache2/apache2.conf
                                # Verfügbare vhosts
                                /etc/apache2/sites-available/*.conf
                                # Aktivierte vhosts, Symlinks auf obige verfügbare
                                /etc/apache2/sites-enabled/*.conf
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>vhost (virtual host) einrichten</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                cd /etc/apache/sites-available
                                # 000-default.conf als Vorlage nutzen
                                # vm-ubuntu-server durch eigenen Host ersetzen
                                sudo cp 000-default.conf www.vm-ubuntu-server
                                # 'ServerName' einkommentieren und mit eigenem Host anpassen
                                # Weitere Optionen je nach Fall anpassen, z.B. 'DocumentRoot'
                                sudo vim www.vm-ubuntu-server
                                # vhost / Site aktivieren
                                sudo a2ensite www.vm-ubuntu-server.conf
                            </code>
                        </pre>
                    </section>
                    <section>
                        <p>Domains lokal auf dem Entwicklungssystem bekannt machen:</p>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # Windows
                                # z.B. mit Notepadd++ editieren. Benötigt Administrator-Rechte
                                C:\Windows\System32\drivers\etc\hosts
                                # Unix
                                # z.B. mit vim editieren. Benötigt Administrator-Rechte
                                /etc/hosts
                            </code>
                        </pre>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # unten hinzufügen
                                [IP des Servers] www.vm-ubuntu-server
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Dateien zum Server kopieren</h3>
                        <pre>
                            <code class="bash" data-trim data-line-numbers>
                                # scp [Quelle] [Ziel], z.B.
                                scp index.html user@domain:~/html
                            </code>
                        </pre>
                    </section>
                    <section>
                        <h3>Aufgabe</h3>
                        <p>Richte die Sub-Domain <code>www.vm-ubuntu-server</code> ein und liefere unter dieser Adresse eine beliebige HTML-Seite aus. Dies kann eine minimale selbstgeschriebene oder eine beliebige komplexere aus den vergangenen Veranstaltungen sein, z.B. aus den CSS-Themen (jedoch keine NodeJS-Projekte).</p>
                    </section>
                </section>
            </div>
        </div>