Sitzung 5 — Auto-Deploy, Python & Flask
Gut gelaufen
Stolpersteine
Wenn VS Code beim Sync „Permission denied“ meldet, obwohl der Key stimmt — meist liegt es an der Passphrase, die nicht abgefragt werden kann. Einmalig in der PowerShell:
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
Danach VS Code neu starten — die Passphrase wird einmal gefragt und gemerkt.
Bevor wir Neues bauen — kurz den Workflow auffrischen:
index.html) → Commit → Syncgit pull auf dem Server nötig: Auto-Deploy erledigt das automatisch. Schauen wir, wie das funktioniert.
Ziel: Sobald ihr nach Forgejo pusht, aktualisiert sich die Website von selbst — kein manueller Pull mehr auf dem Server.
ändern · commit · Sync
Sync →git.md-phw.de
zentraler Speicher
alle 60s→holt sich selbst
den neuen Stand
Der Server prüft im Hintergrund regelmäßig, ob es etwas Neues gibt — und zieht es automatisch.
| Webhook | Forgejo ruft bei jedem Push den Server an. Echtzeit, aber: eigener Dienst + offener Port + Secret pro Repo → viel Infrastruktur |
| Polling (wir) | Der Server schaut alle 60 Sekunden selbst nach. Kein Setup beim Studierenden, keine Konflikte, einheitlich für alle |
Polling gewinnt hier klar — max. 1 Minute Verzögerung, dafür robust und einfach.
Ein Cronjob (eine solche Zeitplan-Regel) auf dem Server führt alle 60 Sekunden aus:
cd ~/public_html
git fetch origin
git reset --hard origin/main
fetch holt den neuesten Stand von Forgejoreset --hard macht den Server zu einem exakten Spiegel des Repospull → keine Merge-Konflikte. Der Server wird nie von Hand bearbeitet („Schaufenster“)Damit der Server ohne Passwort ziehen kann, muss sein öffentlicher Schlüssel in Forgejo liegen (Deploy Key, Lesezugriff genügt). So sieht der Schlüssel aus:
cat ~/.ssh/id_ed25519.pub # auf dem Server
Permission denied (publickey).)
Für eure Server läuft der Cronjob bereits. Ihr müsst nichts aktivieren — einfach pushen:
Beispielprojekt: ein kleines Escape Game — der Server prüft, ob eine Rätselantwort stimmt.
Einsteiger-Tutorials (aus OOP WiSe): Installation · erstes Programm · print & Zahlen · Strings · Datentypen
.pypython3 datei.pyprint(...) gibt etwas ausprint("Hallo Welt")
print(3 + 5)
Ausgabe: Hallo Welt und 8 — Text in "...", Zahlen ohne werden berechnet.
input(...) fragt etwas ab und speichert die Antwortname = input("Wie heißt du? ")
alter = input("Wie alt bist du? ")
print(name + " ist " + alter + " Jahre alt.")
→ Übung dazu Schritt für Schritt: u16
/ oder /raetsel. Ein Aufruf im Browser startet eine Funktion — sie zeigt z. B. eine HTML-Seite an oder prüft, ob eine Antwort richtig ist.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def start():
return "Hallo aus Flask!"
@app.route("/raetsel")
def raetsel():
return "Wie lautet das Passwort?"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=9012)
Jede @app.route(...) verbindet eine URL mit einer Funktion.
python3 -m venv venv
source venv/bin/activate # (venv) erscheint vor der Eingabezeile
pip install flask
# ... arbeiten ...
deactivate # Umgebung verlassen
public_html/ # euer Git-Repo (wird auto-deployed)
├── index.html # statische Seite -> /
├── css/ js/ img/
└── app/ # Flask-App -> /app/
├── app.py # Haupt-Logik (Routen)
├── venv/ # virtuelle Umgebung (in .gitignore)
└── templates/ # spaeter: HTML-Templates (Jinja2)
Alles liegt in public_html → Auto-Deploy nimmt es mit. Der Unterordner app/ ist trotzdem nicht öffentlich lesbar: Der Server leitet jede /app/-Adresse direkt an Flask weiter.
isa##.edumake.de ist wie ein Haus90##): die Flask-App/app/ automatisch zur Flask-Tür weiterEure Flask-App läuft im Hintergrund auf einem eigenen Port und ist über /app/ erreichbar. Beispiel Gruppe isa12:
https://isa12.edumake.de/app/
| Statische Seite | https://isa12.edumake.de/ | aus public_html |
| Flask-App | https://isa12.edumake.de/app/ | vom Server weitergeleitet |
| Flask-Port | 9012 | eindeutig pro Gruppe (90 + Raumnr.) |
| Flask-Code | app.run(host="0.0.0.0", port=9012) | muss zum Port passen |
Die statische Landing Page bleibt unter /, die Anwendung liegt unter /app/.
Für alle — Schritt für Schritt:
/app/ im BrowserFür Schnellere:
/frage mit Formular & AntwortprüfungNächstes Mal: Flask vertiefen — Templates, Formulare und eine kleine Datenbank.