veroeffentliche_04.py: Upload mit rsync --delete und Nachpruefung
Der Anlass war messbar. Der Live-Stand vor dem Skript:
/OR/ 200
/OR/anhang-glossar-literatur.html 200 <- Leiche des vorigen Stands
/OR/anhang-glossar.html 404
/OR/notebooks.html 404
/OR/Notebooks_04.zip 404
/OR/Notebooks_04/ 403
scp -r ueberschreibt nur, es loescht nie - die alte Glossar-Seite bliebe
dauerhaft erreichbar. Das Zielverzeichnis vorher zu leeren waere die grobe
Antwort: Bricht die Uebertragung von 23 MB in 213 Dateien ab, ist die Website
tot. rsync --delete uebertraegt nur Geaendertes und entfernt genau das, was
verschwunden ist.
Der zweite Grund wiegt schwerer: Die Website hing wochenlang einen Bau
zurueck, ohne dass es auffiel. Vier Schritte:
1. Vorpruefung - ist eine Quelldatei neuer als die gebaute Website, Abbruch.
Ebenso: PDF der Website byte-genau wie das gebaute, Verzeichnis-
Weiterleitungen vorhanden (der Grund fuer den 403).
2. Probelauf - zaehlt Uebertragungen und Loeschungen. Mehr als 30 Loeschungen
brechen ab; das ist der Schutz gegen einen falschen Zielpfad, mit dem
--delete sonst ein fremdes Verzeichnis ausraeumt. --loeschgrenze hebt an.
3. Uebertragung (rsync -rltz --chmod=D755,F644 ueber ssh).
4. Nachpruefung - 14 Adressen per HTTP, Statuscode gegen Erwartung. Darunter
die Probe, dass die entfernte Seite wirklich 404 liefert.
Anmeldung per SSH-Schluessel, nicht per Passwort in der .env: rsync und scp
haben keine Passwort-Option, ein Passwort braeuchte sshpass und staende
waehrend der Uebertragung in der Prozessliste. Die .env (in .gitignore,
Vorlage .env.beispiel) enthaelt nur Host, Benutzer, Zielpfad und URL.
Beim ersten Test lief die Pruefung in eine irrefuehrende Meldung ("kein rsync
installiert"), waehrend in Wahrheit schon die Anmeldung fehlschlug. Die
Pruefung unterscheidet die Faelle jetzt am ssh-Rueckgabewert 255 und nennt
ssh-copy-id.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
567bfa799a
commit
d566cf8dac
5 changed files with 450 additions and 2 deletions
46
README.md
46
README.md
|
|
@ -115,6 +115,7 @@ pip install -r Operations_Research_mit_Python_Version_04_Programme/requirements.
|
|||
| --- | --- |
|
||||
| `Operations_Research_mit_Python_Version_04/` | **Quelle**: 37 Kapiteldateien (inkl. 5 Teil-Synthesen) + Build-Skripte |
|
||||
| `bilder_04/` | **Quelle**: 33 Diagramme (SVG) + 16 `erzeuge_*.py`-Generatoren |
|
||||
| `web_04/` | **Quelle**: `site.css`, `site.js`, `icons.svg`, `plotly.min.js`, `katex/` — die statischen Bestandteile der Website |
|
||||
| `Kritik_und_Verbesserungsvorschlaege/` | **Quelle**: die Rezensionen und Vorschläge, die den Umbau ausgelöst haben |
|
||||
| `pyproject.toml`, `Dockerfile`, `.dockerignore` | **Quelle**: Abhängigkeitsgruppen und Kurs-Image |
|
||||
| `pandoc-defaults-*.yaml`, `pandoc/` | **Quelle**: Konfiguration des PDF-Baus |
|
||||
|
|
@ -166,8 +167,9 @@ Prüfung hinterlassen.
|
|||
| `inkscape` | SVG-Grafiken im PDF | LaTeX bricht bei `\includesvg` ab |
|
||||
| `dot` (Graphviz) | 5 der 16 Bildgeneratoren | nur beim Neuerzeugen dieser Diagramme nötig |
|
||||
|
||||
**`OR_HTML_04/katex/`** ist externes Material und wird von keinem Skript erzeugt. Fehlt es,
|
||||
bleiben die Formeln auf der Website ungesetzt.
|
||||
**`web_04/katex/`** ist externes Material und wird von keinem Skript erzeugt — es liegt
|
||||
deshalb als Quelle im Repository und wird bei jedem Bau nach `OR_HTML_04/katex/` kopiert.
|
||||
Fehlt es, bleiben die Formeln auf der Website ungesetzt.
|
||||
|
||||
**Warum die PDF-Konfiguration doppelt vorliegt:** `pandoc-defaults-basis.yaml` ist eine Kopie
|
||||
der Benutzerdatei `~/.config/pandoc/defaults.yaml` — mit **relativem** Pfad auf
|
||||
|
|
@ -177,6 +179,46 @@ Benutzerdatei zurück, falls sie fehlt.
|
|||
|
||||
---
|
||||
|
||||
## Veröffentlichen
|
||||
|
||||
`OR_HTML_04/` ist selbstgenügsam: Der Ordner lässt sich direkt auf einen Webserver kopieren.
|
||||
Für den regelmäßigen Fall gibt es ein Skript.
|
||||
|
||||
```bash
|
||||
# einmalig: den eigenen SSH-Schlüssel auf den Server legen
|
||||
ssh-copy-id benutzer@example.org
|
||||
|
||||
# einmalig: Ziel eintragen
|
||||
cp .env.beispiel .env && chmod 600 .env # dann .env ausfüllen
|
||||
|
||||
# jedes Mal
|
||||
python3 Operations_Research_mit_Python_Version_04/veroeffentliche_04.py
|
||||
```
|
||||
|
||||
Das Skript benutzt **`rsync --delete`, nicht `scp`** — und das ist der entscheidende
|
||||
Unterschied: `scp` überschreibt nur, es entfernt nie. Eine Seite, die aus dem Buch
|
||||
verschwindet, bliebe sonst dauerhaft online erreichbar. `rsync` überträgt zudem nur, was sich
|
||||
geändert hat; ein zweiter Lauf direkt danach überträgt nichts.
|
||||
|
||||
Vier Schritte, jeder mit einer eigenen Aufgabe:
|
||||
|
||||
1. **Vorprüfung.** Ist eine Quelldatei neuer als die gebaute Website, bricht das Skript ab —
|
||||
ein alter Stand soll gar nicht erst hochgeladen werden. Ebenso geprüft: dass das PDF der
|
||||
Website byte-genau dem gebauten entspricht und dass die Verzeichnis-Weiterleitungen da
|
||||
sind.
|
||||
2. **Probelauf.** Zählt und zeigt, was übertragen und was gelöscht würde. Über 30 Löschungen
|
||||
ist der Lauf verdächtig (falscher Zielpfad, halb gebautes Verzeichnis) und bricht ab;
|
||||
`--loeschgrenze N` hebt die Grenze an.
|
||||
3. **Übertragung.**
|
||||
4. **Nachprüfung per HTTP.** Vierzehn Adressen werden abgerufen und ihr Statuscode mit der
|
||||
Erwartung verglichen — einschließlich der Probe, dass eine entfernte Seite wirklich 404
|
||||
liefert.
|
||||
|
||||
`--probelauf` führt nur die Schritte 1 und 2 aus. In der `.env` steht **kein Geheimnis**:
|
||||
`rsync` und `scp` haben keine Passwort-Option, die Anmeldung läuft über den SSH-Schlüssel.
|
||||
|
||||
---
|
||||
|
||||
## Notebooks und Google Colab
|
||||
|
||||
Jedes Kapitel hat ein Notebook in `Notebooks_04/`, und die Website verlinkt es zum
|
||||
|
|
|
|||
Loading…
Reference in a new issue