1. Git
1.1. git Architektur und Kommandos Foundation
-
Skizzieren Sie die Architektur von git und erklären Sie die wichtigsten Kommandos.
Lösung
1.2. Erstellung eines Repositories Foundation
-
Wie kann ich ein neues Repository lokal erstellen?
Lösung
git init
1.3. Den vorletzten Commit aus-checken Foundation
-
Wie kann man aus einem git-repo einen Commit auschecken, der nicht der letzte ist? Geben Sie die genauen Befehle an.
Lösung
git checkout <Commit-Hash>
oder
git checkout HEAD~1
HEAD zeigt auf den aktuellsten Commit. |
HEAD~1 ist der eine Commit davor, also der vorletzte (ident mit HEAD^). |
HEAD~2 wäre der drittletzte, usw. |
HEAD^ Der Vorgänger (also ein Commit zurück). HEAD^ wird verwendet, wenn es mehrere Vorgänger gibt, zB bei einem Merge-Commit → HEAD^1 ist der erste Vorgänger, HEAD^2 der zweite Vorgänger. |
1.4. git in Teams Foundation
-
Welcher Befehl ist zu Beginn jeder Arbeit und auch zwischendurch mit git notwendig und warum?
Lösung
git pull
-
Damit alle Änderungen der anderen Teammitglieder in den eigenen Branch übernommen werden.
1.5. .gitignore Foundation
-
Was bewirkt ein Eintrag in der Datei
.gitignore? Warum ist es wichtig,.gitignorezu verwenden?
Lösung
Ein Eintrag in .gitignore sorgt dafür, dass bestimmte Dateien nicht mit ins Git Repository aufgenommen werden. Das ist wichtig,
-
weil man sonst generierte Dateien oder Dependencies wie
node_moduleshochladen würde, wodurchgit pushundgit pulllangsamer sind. -
Außerdem ist es sicherheitstechnisch verboten, vertrauliche Daten (z.B. in
.envDateien) in einem öffentlichen Repository zu speichern.
| Grundsatz: Dateien, die generiert werden (zB durch kompilieren, durch npm install), sollten nicht im Repository sein. Dateien, die nicht erstellt werden (zB Konfigurationsdateien, Dokumentation, Programmcode) sind im Repository zu speichern. Aber keine privaten Daten wie Passwörter, API-Keys, etc.! |
1.6. ssh in github Foundation
-
Wie kann ich mich mit ssh in github einloggen?
Lösung
-
ssh-key in
~/.sshgenerierenssh-keygen -t ed25519 -
folgendes in
~/.ssh/configeinfügen:Host github.com Hostname github.com User <user of the remote server> IdentityFile ~/.ssh/id_ed25519 -
public-key in Developer-Settings in github einfügen
gh-profile → Settings → SSH and GPG keys → New SSH key
1.7. git pull vs git fetch Advanced
-
Was ist der Unterschied zwischen
git pullundgit fetch?
Lösung
git pull ist eine Kombination aus git fetch und git merge. Es lädt die neuesten Änderungen vom Remote-Repository herunter und integriert sie in den aktuellen Branch. git fetch hingegen lädt nur die Änderungen herunter, ohne sie zu integrieren. Dies ermöglicht es Ihnen, die Änderungen zu überprüfen, bevor Sie sie in Ihren Branch übernehmen.
1.8. Cherry Picking Foundation
-
Erläutern Sie Cherry Picking und geben Sie ein konkretes Bsp. mit den git-cli-Kommandos an.
Lösung
Cherry Picking bedeutet, einzelne Commits aus einem Branch (z.B. Feature-Branch) in den derzeitigen (z.B. main-Branch) zu übernehmen, ohne den ganzen Feature-Branch zu mergen. Dabei wird der ausgewählte Commit auf den aktuellen Branch übernommen, und der HEAD zeigt anschließend auf den neuen Commit.
Anwendung: z.B. wenn man im Feature-Branch einen Bug gefixt hat, aber das Feature noch nicht fertig ist.
git switch main
git cherry-pick -x <Commit-Hash>
-x wird empfohlen, damit im Commit-Message der Original-Commit-Hash vermerkt wird, damit man später nachvollziehen kann, woher der Commit stammt.
❯ git switch log
commit cb6a74f7c7b49499c9b5087a6d43ae2b67ab60b1 (HEAD -> main)
Author: htl-leonding <t.stuetz@htl-leonding.ac.at>
Date: Sun Feb 15 12:15:30 2026 +0100
restructured dependencies
(cherry picked from commit 587a53a23ac5e1b689c8a9e170a227eae0b1afb8)
1.9. gh-pages aktivieren Foundation
-
Wie kann man für ein repo gh-pages aktivieren?
Lösung
-
Erstelle einen Branch
gh-pagesund pushe ihn auf GitHub. -
Gehe zu den Einstellungen (Settings) des Repositories auf GitHub.
-
Settings - Pages - Deploy from a branch - gh-pages / root
1.10. git Konfiguration 1 Foundation
-
Wie kann man sich die git-Konfiguration des aktuellen Repositories anzeigen lassen? Annahme: Sie befinden sich im Projektverzeichnis.
Lösung
git config list
credential.helper=osxkeychain user.name=maxmustermann user.email=m.mustermann@students.htl-leonding.ac.at core.autocrlf=input init.defaultbranch=main (END)
1.11. git Konfiguration 2 Foundation
-
Welche Scopes gibt es bei der Konfiguration in git? Welchen Vorteil haben Scopes?
Lösung
-
--global: Gilt für alle Repositories des Benutzers. -
--local: Gilt nur für das aktuelle Repository.
Man kann zB grundsätzlich alle Repositories (zB für die Firma) mit public credentials (user.name, user.email) versehen und nur für gewisse Projekte (zB privat) andere credentials verwenden.
1.12. git Konfiguration 3 Foundation
-
Wie kann man den lokalen Git-Benutzernamen und E-Mail-Adresse einsehen?
Lösung
git config user.name
git config user.email
mmustermann m.mustermann@private-mail.at
1.13. git Konfiguration 4 Foundation
-
Wie kann man den globalen Git-Benutzernamen und E-Mail-Adresse einsehen?
Lösung
git config --global user.name
git config --global user.email
maxmustermann m.mustermann@students.htl-leonding.ac.at
1.14. git Konfiguration 5 Foundation
-
Wie kann man seine git-credentials lokal setzen
Lösung
git config --local user.name "Dein Name"
git config --local user.email "deine.email@beispiel.com"
1.15. git Konfiguration 6 Foundation
-
Wie kann man seine git-credentials global setzen
Lösung
git config --global user.name "Dein Name"
git config --global user.email "deine.email@beispiel.com"
1.16. git Konfiguration 7 Foundation
-
Wie kann man seine git-credentials wieder vom System (aus der Keychain) löschen? zB im EDV-Saal
Lösung
git config --global --unset-all user.name
git config --global --unset-all user.email
2. Docker und Docker Compose
2.1. Auflisten aller Container Foundation
Lösung
docker container ls -a (1)
docker ps -a (2)
| 1 | -a zeigt alle Container (laufend + gestoppt) |
| 2 | deprecated, daher nicht mehr verwenden |
2.2. Auflisten aller Images Foundation
Lösung
docker image ls
docker images (1)
| 1 | deprecated, daher nicht mehr verwenden |
2.3. Container starten Foundation
Lösung
docker run [optionen] image-name (1)
docker start container-name-or-id (2)
| 1 | Neuen Container starten |
| 2 | Gestoppten Container erneut starten |
2.4. Container stoppen Foundation
Lösung
docker stop <container-name-or-id>
-
Beispiel
docker stop a1b2c3d4e5f6
2.5. Container löschen Foundation
Lösung
docker rm <container-name-or-id>
| Man kann nur gestoppte Container löschen. Falls er noch läuft, bekommt man einen Fehler. |
-
Optional: Container erzwingen löschen
docker rm -f <container-name-or-id> (1)
| 1 | Mit -f(force) wird der Container auch gelöscht, wenn er läuft - das wirkt wie ein harter Kill + Löschung. |
2.6. Volumes löschen Foundation
Lösung
docker volume rm <volume-name>
docker volume rm mein-volume
| Man muss zuerst den Container, mit dem das Volume verbunden ist, stoppen und löschen. |
2.7. Alle Docker-Elemente löschen Foundation
Löschen von Containern, Images, Networks und Volumes.
Lösung
#!/usr/bin/env bash
docker compose down
docker container prune -f
docker image prune -f
docker volume prune -f
docker builder prune --all --force #build cache löschen
IMAGES=$(docker images -q)
for image in $IMAGES
do
docker image rm -f $image
done
VOLUMES=$(docker volume ls -q)
for volume in $VOLUMES
do
docker volume rm $volume
done
docker container ls
docker volume ls
docker image ls
2.8. Image bauen Foundation
Lösung
-
Um ein Docker-Image zu bauen, braucht man eine Datei namens Dockerfile und einen Build-Befehl
-
Die wichtigsten Dockerfile Instruktionen:
| Instruction | Description |
|---|---|
|
Add local or remote files and directories. Use with care. |
|
Use build-time variables. |
|
Specify default commands. |
|
Copy files and directories. |
|
Specify default executable. |
|
Set environment variables. |
|
Describe which ports your application is listening on. |
|
Create a new build stage from a base image. |
|
Check a container’s health on startup. |
|
Add metadata to an image. |
|
Specify the author of an image. |
|
Specify instructions for when the image is used in a build. |
|
Execute build commands. |
|
Set the default shell of an image. |
|
Specify the system call signal for exiting a container. |
|
Set user and group ID. |
|
Create volume mounts. |
|
Change working directory. |
-
Beispiel
-
Dockerfile im Projektordner erstellen
-
# Dockerfile
FROM node:18 (1)
WORKDIR /app (2)
COPY . . (3)
RUN npm install (4)
CMD ["node", "index.js"] (5)
| 1 | Legt Node.js 18 als Basis-Image fest |
| 2 | Wechselt in den Arbeitsordner /app im Container |
| 3 | Kopiert alle Dateien vom Host ins Containerverzeichnis |
| 4 | Führt npm install beim Build aus (Abhängigkeiten installieren) |
| 5 | Definiert, was beim Containerstart ausgeführt wird |
-
Image bauen
docker build -t mein-node-image . (1)
2.9. COPY im Dockerfile Foundation
-
In einem Dockerfile kann das Kommando COPY verwendet werden. Schreiben Sie beispielhaft, wie dieses Kommando aussieht und von wo nach wohin kopiert wird.
2.10. Image nach ghcr.io pushen Foundation
-
Wie kann man ein Image in eine andere Registry als
hub.docker.compushen?
Lösung
docker tag <image_name> ghcr.io/<user>/<repo>:<tag>
docker push ghcr.io/<user>/<repo>:<tag>
-
Beispiel:
docker tag my-image ghcr.io/htl-leonding-college/my-image:latest docker push ghcr.io/htl-leonding-college/my-image:latest
Der Name des Images beinhaltet den Namen des Repositories, in dem das Image gespeichert werden soll. Der Tag ist optional, aber es ist eine gute Praxis, ihn zu verwenden, um verschiedene Versionen des Images zu kennzeichnen.
2.11. docker exec Foundation
-
Wie kann ich in einen laufenden Container ein Programm zB die shell starten?
Lösung
docker exec -it <container_id> /bin/bash
2.12. Starten von Docker Compose im Vordergrund Foundation
Lösung
docker compose -f my-docker-compose-file.yaml up
2.13. Starten von Docker Compose im Hintergrund Foundation
Lösung
docker compose -f my-docker-compose-file.yaml up -d
-d … detached mode
2.14. Stoppen von Docker Compose Foundation
Lösung
docker compose -f my-docker-compose-file.yaml stop
-
Links:
2.15. Beenden von Docker Compose Foundation
Lösung
docker compose -f my-docker-compose-file.yaml down
2.16. Anzeigen der Logs von Docker Compose Foundation
Lösung
docker compose -f my-docker-compose-file.yaml logs -f
-
Links:
2.17. postgres-Backup eines Containers Foundation
-
Wie kann man ein Backup einer gedockerten postgres DB erstellen?
Lösung
docker compose --file=docker-compose.yaml exec -it postgres pg_dump --username=app db | gzip > sql.gz
docker exec -t <container_id> pg_dumpall -c -U <user> > dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql
Ein mögliches Script wäre:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
# Configuration
BACKUP_DIR="$(dirname "$0")/backups"
CONTAINER_NAME="my-container"
DB_USER="my-user"
DB_NAME="db"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/myapp_backup_${DATE}.sql"
RETENTION_DAYS=7
# Ensure backup directory exists
mkdir -p "${BACKUP_DIR}"
echo "Starting database backup for ${DB_NAME}..."
# Execute pg_dump inside the container
# We use -it or just docker exec. For scripts, no -t is better.
if docker exec ${CONTAINER_NAME} pg_dump -U ${DB_USER} ${DB_NAME} > "${BACKUP_FILE}"; then
echo "Backup successful: ${BACKUP_FILE}"
# Compress the backup to save space
gzip "${BACKUP_FILE}"
echo "Backup compressed: ${BACKUP_FILE}.gz"
# Cleanup old backups (older than RETENTION_DAYS)
echo "Cleaning up backups older than ${RETENTION_DAYS} days..."
find "${BACKUP_DIR}" -name "payments_backup_*.sql.gz" -mtime +${RETENTION_DAYS} -exec rm {} \;
echo "Cleanup finished."
else
echo "ERROR: Backup failed! Check if container ${CONTAINER_NAME} is running."
exit 1
fi
-
Was passiert hier?
-
Welche Ergänzung wäre hier sinnvoll?
2.18. postgres-Backup in Container wiederherstellen Foundation
-
Wie kann ein SQL-Backup einer (gedockerten) postgres DB wiederhergestellt werden?
Lösung
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
# Configuration
BACKUP_DIR="$(dirname "$0")/backups"
CONTAINER_NAME="my-db"
DB_USER="my-user"
DB_NAME="db"
# Check if a backup file was provided
if [ -z "$1" ]; then
echo "Usage: ./restore.sh <backup_file.sql.gz>"
echo "Available backups in ${BACKUP_DIR}:"
ls -1 "${BACKUP_DIR}"
exit 1
fi
BACKUP_FILE=$1
# Ensure the container is running
if ! docker ps | grep -q "${CONTAINER_NAME}"; then
echo "ERROR: Container ${CONTAINER_NAME} is not running! Please start it first with ./start-db.sh"
exit 1
fi
echo "Restoring database ${DB_NAME} from ${BACKUP_FILE}..."
# Decompress and restore
# We use 'cat' and pipe to 'docker exec' to avoid needing to copy the file into the container
gunzip -c "${BACKUP_FILE}" | docker exec -i ${CONTAINER_NAME} psql -U ${DB_USER} -d ${DB_NAME}
if [ $? -eq 0 ]; then
echo "------------------------------------------------------------"
echo "SUCCESS: Database has been restored."
echo "------------------------------------------------------------"
else
echo "ERROR: Restore failed!"
exit 1
fi
-
Welche Voraussetzungen müssen bei diesem Script erfüllt sein?
-
zB das Vorhandensein eines scripts namens
start-db.sh, das den Container mit der DB startet, damit er für die Wiederherstellung läuft.
-
Siehe auch:
2.19. .dockerignore Foundation
-
Was bewirkt ein Eintrag in der Datei
.dockerignore? Warum ist es wichtig,.dockerignorezu verwenden?
Lösung
-
Ein Eintrag in der Datei .dockerignore bewirkt, dass bestimmte Dateien oder Ordner vom Docker-Build Kontext ausgeschlossen werden - also nicht ins Image kopiert werden.
-
Typische Beispiele für Dateien und Ordner, die nicht ins Docker-Image übernommen werden:
-
.git/ -
node_modules/ -
*.log
-
Vorteile:
-
Schnellerer Build - Docker verarbeitet weniger Daten
-
Saubereres Image - nur relevante Dateien landen im Image
-
Mehr Sicherheit - keine sensiblen Daten wie
.env, SSH-Keys usw. gelangen ins Image -
Weniger Speicherverbrauch - kleinere und effizientere Images
2.20. Umgebungsvariable in Docker-Compose setzen Foundation
-
Warum werden Umgebungsvariablen in docker compose verwendet?
2.21. Health Check in Docker Compose Foundation
-
Warum und wie wird in docker compose ein health-check durchgeführt? Zeigen Sie dies am Bsp einer postgres-Datenbank.
Lösung
Ein Healthcheck wird zB für die Datenbank durchgeführt, damit andere Container, die von der Datenbank abhängen, erst gestartet werden, wenn die Datenbank bereit ist.
2.22. docker compose stop vs. down Foundation
-
Was ist der Unterschied zwischen
docker compose stopunddocker compose down?
Lösung
-
docker compose stopstoppt die laufenden Container, aber behält die Daten und Konfigurationen bei. Die Container können später wieder gestartet werden. -
docker compose downstoppt die Container und löscht die Container zusammen mit den zugehörigen Netzwerken und Volumes. Es ist eine vollständige Bereinigung der Umgebung.
3. Kubernetes
3.1. Imperativ vs. deklarativ Advanced
-
Was ist der Unterschied zwischen imperativem und deklarativem Management in Kubernetes?
Lösung
-
Beim imperativen Management werden die Kommandos direkt ausgeführt, um den gewünschten Zustand zu erreichen (z.B.
kubectl create deployment …). Vergleichbar mit Programmieren: Befehle werden nacheinander ausgeführt. Es wird der Weg zur Erreichung des gewünschten Zustands definiert. -
Beim deklarativen Management definiert man den gewünschten Zustand in einer YAML-Datei (Manifest) und wenden diese mit
kubectl apply -f …an. Kubernetes sorgt dann dafür, dass der tatsächliche Zustand dem gewünschten Zustand entspricht. Es wird nur der Zielzustand definiert, nicht der Weg dorthin.
3.3. Was versteht man unter einem "sidecar container"? Advanced
Lösung
In einem Pod (der kleinsten Einheit in Kubernetes) können mehrere Container gleichzeitig laufen. Während der Hauptcontainer die eigentliche Anwendung beherbergt (z. B. eine Web-App), übernimmt der Sidecar-Container unterstützende Aufgaben.
Beide teilen sich die gleichen Ressourcen, wie zum Beispiel das Netzwerk (localhost) und den Speicherplatz (Volumes).
Typische Aufgaben eines Sidecars
-
Logging & Monitoring: Der Sidecar sammelt Log-Dateien der App und schickt sie an einen zentralen Server (z. B. Splunk oder Elasticsearch).
-
Proxies & Sicherheit: Ein Sidecar kann den Netzwerkverkehr verschlüsseln (TLS-Terminierung) oder als Botschafter für die Kommunikation mit anderen Diensten fungieren (Service Mesh).
-
Konfigurations-Update: Der Sidecar beobachtet, ob sich Konfigurationsdateien ändern, und lädt sie für die Haupt-App neu.
-
Daten-Synchronisation: Ein Sidecar könnte regelmäßig Daten aus einem Repository (wie GitHub) ziehen und in ein Verzeichnis legen, auf das die Web-App zugreift.
Warum trennt man das überhaupt? Weil man so die Hauptanwendung "sauber" hält und Funktionen hinzufügen kann, ohne den Code der App zu ändern.
3.5. Wie funktioniert ein "liveness probe" und ein "readiness probe"? Advanced
Lösung
Beide sind Health-Checks, die das Kubelet auf Containern ausführt:
Liveness Probe: Prüft, ob der Container noch läuft. Schlägt dieser Check fehl, killt Kubernetes den Container und startet ihn (gemäß der Restart-Policy) neu. Er hilft bei Deadlocks oder wenn die Applikation "eingefroren" ist.
Readiness Probe: Prüft, ob der Container bereit ist, Traffic zu empfangen. Schlägt dieser Check fehl, wird der Pod aus den Endpoints des zugehörigen Services entfernt. Es wird kein Neustart erzwungen. Dies ist wichtig während der Startphase oder wenn eine Applikation temporär überlastet ist.
4. Shell / Netzwerke
4.2. Kopieren auf einen entfernten Server Foundation
-
Wie kann ich eine Datei auf einen entfernten Server kopieren?
-
[TODO]: Bei dieser Frage sollte noch unterschieden werden, ob bereits ssh-key-Paare existieren oder nicht.
Lösung
scp -i ~/.ssh/id_ed25519 <file> <user>@<remote-server>:<path>
4.3. Port Forwarding Foundation
-
Wie kann ich einen Port eines entfernten Servers auf einen lokalen Port weiterleiten? zB Port 5432 von einem Server mit laufenden docker-compose - Containern auf Port 5432 auf localhost?
-
Nenne Anwendungsfälle für Port-Forwarding
-
Lösung
ssh -L 5432:localhost:5432 <user>@<remote-server>
Wenn der Port 5432 auf lokalhost nicht verfügbar ist (da zB eine lokale db bereits läuft), kann ich den Port 5432 vom Server auch auf einen anderen Port von localhost weiterleiten, zB 5433.
-
Anwendungsfälle:
-
Zugriff auf eine Datenbank, die auf einem entfernten Server oder in einem Container läuft, als wäre sie lokal
-
Zugriff auf einen Webserver, der auf einem entfernten Server oder in einem Container läuft, über localhost:8080
-
Man kann oft auch IDE’s so konfigurieren, dass sie über Port-Forwarding auf entfernte Debugging-Ports zugreifen können, um Remote-Debugging zu ermöglichen oder mit dem Datenbank-Client der IDE direkt auf eine entfernte Datenbank zuzugreifen.
-
| Port-Forwarding ist grundsätzlich eine sichere Methode, um auf Dienste zuzugreifen, die hinter einer Firewall oder in einem privaten Netzwerk laufen. Trotzdem wird empfohlen zB für den Zugriff auf das (private) Heim-Netzwerk entweder einen VPN-Tunnel (zB WireGuard) oder einen Cloudflare-Tunnel zu verwenden, da Ports nicht nach außen geöffnet werden müssen, sondern der Zugriff über den Tunnel erfolgt. |
4.4. Umgebungsvariable für Aufruf mitgeben Foundation
-
Wie kann ich nur für einen Aufruf eine Umgebungsvariable setzen?
Lösung
MY_ENV_VAR=1234 ./my_script.sh
PGPASSWORD=app pg_dump --username=app db
4.5. Umgebungsvariable setzen Foundation
-
Wie kann ich eine Umgebungsvariable für alle Aufrufe setzen?
Lösung
-
Umgebungsvariablen gibt es sowohl für Linux, MacOS und auch für Windows.
-
Environment - Variablen die nicht nur für den aktuellen Aufruf, sondern für alle Aufrufe gesetzt werden, ist bspw. die PATH-Variable, die angibt, wo nach ausführbaren Dateien gesucht wird.
-
In Linux uns MacOS werden Umgebungsvariable wie folgt gesetzt:
export MY_ENV_VAR=1234 -
In Windows ist das unterschiedlich je nach Shell. Falls das wen interessiert, soll er/sie sich das recherchieren.
Figure 1. In Windows kann man Umgebungsvariablen auch über die Systemsteuerung setzen: -
In Linux uns MacOS werden Umgebungsvariable wie folgt verwendet:
echo $MY_ENV_VAR -
In Windows
echo %MY_ENV_VAR%
4.6. Prozess mit Port Foundation
-
Wie kann ich eine Prozess-ID mit Port 8080 finden?
Lösung
netstat -tulpn | grep 8080
| Parameter | Beschreibung |
|---|---|
t |
Zeigt TCP-Verbindungen an. |
u |
Zeigt UDP-Verbindungen an. |
l |
Zeigt nur lauschende (listening) Ports an. |
p |
Zeigt die Prozess-ID (PID) und den Programmnamen an, der den Port nutzt. |
n |
Zeigt numerische Adressen und Portnummern an, anstatt Hostnamen oder Dienstnamen aufzulösen. |
lsof -i :8080
4.7. Troubleshooting: netstat nicht gefunden Foundation
-
Wenn der Befehl
netstatnicht gefunden wird, was kann ich tun?
Lösung
sudo apt install net-tools
4.8. Was ist ein Reverse Proxy? Foundation
Lösung
Ein Reverse Proxy ist ein Server, der Anfragen aus dem Internet entgegennimmt und sie an interne Server weiterleitet. Er fungiert als „Schutzschild“ und „Verteiler“ vor deiner eigentlichen Infrastruktur. Die Kernfunktionen
-
Sicherheit: Die IP-Adressen deiner eigentlichen Server bleibt verborgen.
-
Lastverteilung (Load Balancing): Er verteilt Anfragen auf mehrere Server, um Überlastung zu vermeiden.
-
SSL-Terminierung: Er übernimmt die HTTPS-Verschlüsselung. Im internen Netzwerk können die Verbindungen unverschlüsselt sein, was die Leistung verbessert.
-
Caching: Er speichert Kopien von Inhalten, um sie schneller auszuliefern.
Kurzunterschied: Ein normaler Proxy schützt den Nutzer, ein Reverse Proxy schützt den Server.
4.9. Den Status für nginx anzeigen lassen Foundation
Lösung
-
Zeigt den Status des nginx-Dienstes an, einschließlich Informationen über den Dienststatus, die letzten Protokolleinträge und ob der Dienst läuft oder gestoppt ist.
systemctl status nginxresult● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled) Active: active (running) since Thu 2025-06-05 12:10:20 UTC; 17h ago Docs: man:nginx(8) Process: 316744 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 316783 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 316811 (nginx) Tasks: 3 (limit: 4609) Memory: 10.9M (peak: 21.9M) CPU: 10.494s CGroup: /system.slice/nginx.service ├─316811 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;" ├─316812 "nginx: worker process" └─316813 "nginx: worker process" -
Überprüft die Konfiguration von nginx und zeigt an, ob sie gültig ist.
nginx -tresultnginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
4.10. Wie kann man Tasks unter Linux zeitgesteuert automatisieren? Foundation
Lösung
-
Cronjobs sind zeitgesteuerte Aufgaben, die unter Linux und Unix-basierten Systemen verwendet werden, um Skripte oder Befehle zu bestimmten Zeiten oder in regelmäßigen Abständen automatisch auszuführen.
5. Asciidoctor
5.2. Präambel / Preamble Foundation
-
Was ist eine Präambel?
Lösung
-
In AsciiDoc ist eine Präambel der Abschnitt vor der ersten Überschrift. Sie dient dazu, Einleitungstext, Metadaten oder Kontext anzugeben, der nicht Teil eines Kapitels ist.
-
Beispiel
= Fragenkatalog
Thomas W. Stütz
1.0.0, {docdate}: Basiswissen für Programmieren und Projektentwicklung
:icons: font
:experimental:
:sectnums:
:source-highlighter: rouge
:docinfo: shared
:toc:
// https://fontawesome.com/v4.7.0/icons/
icon:file-text-o[link=https://github.com/2324-4bhif-wmc/2324-4bhif-wmc-lecture-notes/main/asciidocs/{docname}.adoc]
icon:github-square[link=https://github.com/htl-leonding-college/fragenkatalog]
icon:home[link=http://edufs.edu.htl-leonding.ac.at/~t.stuetz/hugo/2021/01/lecture-notes/]
:toc:
5.3. Admonitions Foundation
-
Was sind Admonitions?
Lösung
-
Admonitions (auch Hinweisboxen genannt) sind auffällige Informationsblöcke in AsciiDoc, die besondere Inhalte wie Warnungen, Tipps oder wichtige Hinweise hervorheben. Sie helfen, wichtige Stellen optisch hervorzuheben und besser verständlich zu machen.
Typische Admonitions sind:
-
NOTE: allgemeiner Hinweis -
TIP: nützlicher Tipp -
IMPORTANT: wichtige Info -
WARNING: mögliche Probleme -
CAUTION: Gefahr oder kritischer Fehler
| Damit die Icons angezeigt werden, muss man in der Präambel setzen: |
:icons: font
5.4. Callouts Foundation
-
Was sind Callouts?
Lösung
Kommentare für Code im Source-Block
Man unterscheidet zwischen:
-
automatische Callouts
public class Main { public static void main(String[] args) { System.out.println("Hallo Welt"); // <.> } }<.> Print-Statement
-
manuelle Callouts
public class Main { public static void main(String[] args) { System.out.println("Hallo Welt"); // <1> } }<1> Print-Statement
Manuelle Callouts sind an verschiedenen Stellen wiederverwendbar.
| Verwende die Kommentarzeichen der jeweiligen Programmiersprache. |
5.5. Callouts und Kommentarzeichen Foundation
-
Wieso sind Callouts im Code mit einem Kommentarzeichen zu verwenden
Lösung
-
Wenn im Code eines Projektes Callouts verwendet werden, dann sind diese mit einem Kommentarzeichen zu kennzeichnen. Sonst würde der Code nicht mehr ausführbar sein.
-
Es sind die Kommentarzeichen der jeweiligen Programmiersprache zu verwenden.
docker compose -f docker-compose.yaml up #<.>
<.> Callout-Text
docker compose -f docker-compose.yaml up (1)
| 1 | Callout-Text |
5.6. adoc in github-Environment Foundation
-
Wie kann man die Admonitions in github in einem
README.adocanzeigen lassen?
Lösung
ifdef::env-github[]
:tip-caption: :bulb:
:note-caption: :information_source:
:important-caption: :heavy_exclamation_mark:
:caution-caption: :fire:
:warning-caption: :warning:
endif::[]
5.7. Nummerierung vermeiden Foundation
-
Wie kann man eine Überschrift von der Nummerierung ausnehmen?
Lösung
[discrete]
== Überschrift
5.8. Nummerierung der Überschriften Foundation
-
wie kann man die Überschriften nummerieren?
Lösung
:sectnums:
5.9. Links in neuen Tabs öffnen Foundation
-
Wie werden Links in einem Asciidoctor-Dokument in neuen Tabs geöffnet?
Lösung
Man muss ein Caret (^) nach dem Link-Text einfügen.
Link[Text^]
5.10. Keyboard-Macro Foundation
-
Wie kann man ein Keyboard-Macro in Asciidoctor erstellen?
Lösung
experimental aktivieren:experimental:
Drücken Sie die kbd:[RETURN]-Taste
Drücken Sie die RETURN-Taste
5.11. Seitenumbrüche in pdf-Dokumenten Foundation
-
Wie kann man einen Seitenumbruch in einem pdf-Dokument erzeugen?
Lösung
5.12. Tabellen Foundation
-
Wie erstellt man eine dreispaltige Tabelle mit Kopfzeilen im asciidoctor-Format?
Lösung
|===
|Spalte 1 |Spalte 2 |Spalte 3
|Wert 1 - Spalte 1
|Wert 2 - Spalte 2
|Wert 3 - Spalte 3
|Wert 4 - Spalte 1
|Wert 5 - Spalte 2
|Wert 6 - Spalte 3
|===
| Spalte 1 | Spalte 2 | Spalte 3 |
|---|---|---|
Wert 1 - Spalte 1 |
Wert 2 - Spalte 2 |
Wert 3 - Spalte 3 |
Wert 4 - Spalte 1 |
Wert 5 - Spalte 2 |
Wert 6 - Spalte 3 |
| Ohne Leerzeilen zwischen den Zeilen der Tabelle wird die Tabelle nicht korrekt dargestellt. Auch wird der Header ohne Leerzeile nicht erkannt. |
[cols="3,3,3", options="header"]
|===
|Spalte 1 |Spalte 2 |Spalte 3
|Wert 1 |Wert 2 |Wert 3
|Wert 4 |Wert 5 |Wert 6
|===
| Spalte 1 | Spalte 2 | Spalte 3 |
|---|---|---|
Wert 1 |
Wert 2 |
Wert 3 |
Wert 4 |
Wert 5 |
Wert 6 |
8. Quarkus (Jakarta EE)
8.2. JPA - Lifecycle einer entity Advanced
Lösung
-
An entity instance may be characterized as being new, managed, detached, or removed.
-
A new entity instance has no persistent identity, and is not yet associated with a persistence context.
-
A managed entity instance is an instance with a persistent identity that is currently associated with a persistence context.
-
A detached entity instance is an instance with a persistent identity that is not (or no longer) associated with a persistence context.
-
A removed entity instance is an instance with a persistent identity, associated with a persistence context, that is scheduled for removal from the database.
-
9. GitHub Classroom
9.1. Wie kann man ein GitHub Classroom Assignment erstellen? Foundation
Lösung
-
Erstellen eines Repositories auf GitHub, das als Vorlage für das Assignment dienen soll. Dabei ist zu beachten:
-
Dieses Repo muss sich in der GitHub-Organisation befinden, in der die Assignments erstellt werden sollen. z.B. Organisation
2526-4ahitm-itp, Repository-Name:01-lab-keycloak -
Das Repository
01-lab-keycloakmuss ein Template-Repository sein.
-
-
Anschließend wird ein neues Assignment in GitHub Classroom erstellt. Das Template-Repository
01-lab-keycloakwird Vorlage ausgewählt.
9.2. Wie kann man in ein GitHub Classroom Assignment, das bereits von Schülern angenommen wurde, Änderungen einpflegen? Foundation
Lösung
-
Änderungen im Template-Repository vornehmen, zB
01-lab-keycloak -
Anschließend das vom Template-Repository abgeleitete Repository clonen, zB
2526-4ahitm-itp-01-lab-keycloak-01-lab-keycloak -
In diesem Repository wird das Template als "upstream" hinzugefügt:
git remote add template git@github.com:2526-4ahitm-itp/01-lab-keycloak.git -
Nun können die Änderungen aus dem Template-Repository in das Original-Repo zB
2526-4ahitm-itp-01-lab-keycloak-01-lab-keycloakgeholt werden, von dem die Schüler das Assignment angenommen (fork) haben:git fetch template git status git merge template/main --allow-unrelated-histories git status git add . git commit -m "fix instructions" git push origin mainEs muss --allow-unrelated-historiesangegeben werden, da die Historie des Template-Repositories und des Original-Repositories nicht zusammengeführt werden kann, da sie unterschiedliche Wurzeln haben. Es handelt sich ja um zwei verschiedene Repositories, die nicht voneinander abgeleitet sind, sondern nur den gleichen Code enthalten. -
Erstellen von Pull-Requests für die Schüler-Repositories, damit die Schüler die Änderungen in ihre Repositories übernehmen können.
-
Jetzt könnnen die Schüler die Pull-Requests in ihren Repositories annehmen, um die Änderungen aus dem Template-Repository in ihre Repositories zu übernehmen.