Die eigentliche Website liegt auf einem Hetzner-Webhosting-S-Paket. Ein separater Ubuntu-Proxmox-CT aktualisiert im Hintergrund die Öffnungsdaten per FTPS.
Das Webhosting-S-Paket kann keine dauerhaft laufende Python-Anwendung bereitstellen. Deshalb werden Darstellung und Daten getrennt:
Besucher -> index.html + app.js auf Hetzner
|
+-> lädt /data/status_data.json
bfgnet.de -> Ubuntu-CT -> erzeugt status_data.json + calendar.ics -> FTPS -> Hetzner
- HTML, CSS und JavaScript werden nur bei Installation oder Projektupdates hochgeladen.
- Der Browser lädt bei jedem Seitenaufruf die eigenständige Datei
/data/status_data.jsonmit deaktiviertem Cache und baut Status, Tagesliste und Kalender daraus. - Der CT aktualisiert täglich ausschließlich
data/status_data.jsonundcalendar.ics. - Flask dient auf dem CT nur zum einmaligen Erzeugen des HTML-Grundgerüsts; auf dem Webhosting läuft kein Python-Prozess.
Damit ist nicht die ganze Website täglich neu zu bauen. Nur die kleine Datendatei und der Kalender-Feed werden übertragen.
Empfehlung: Ubuntu 24.04, mindestens 512 MB RAM, Internetzugriff und aktiviertes systemd.
Im frischen CT als root ausführen:
apt update && apt install -y curl
curl -fsSL https://raw.githubusercontent.com/dataklo/Sennelager-Strasse/main/scripts/install.sh -o /tmp/install-sennelager.sh
bash /tmp/install-sennelager.shDas Installationsskript erledigt vollständig:
- Installation von Git, Python, Virtualenv und Zertifikaten.
- Klonen nach
/opt/sennelager-range. - Installation aller Python-Abhängigkeiten.
- Auswahl von FTPS auf Port 21 oder SFTP auf Port 22 und Abfrage der Zugangsdaten.
- Geschützte Speicherung in
/etc/sennelager-range.env. - Abruf der Quelldaten, vollständigen Erst-Build und verschlüsselten FTPS-/SFTP-Upload.
- Installation und Aktivierung des täglichen Systemd-Timers.
Benötigt werden die Werte aus dem Hetzner-/konsoleH-Webhostingbereich:
- öffentliche URL, z. B.
https://senne.example.de - vollständige Upload-URL, z. B.
ftps://server:21/public_htmlodersftp://server:22/public_html - Benutzer und Passwort
Für automatisches Provisioning können alle Werte vorgegeben werden:
PUBLIC_BASE_URL=https://senne.example.de \
FTP_URL=sftp://wwwXXX.your-server.de:22/public_html \
FTP_USER=usr_webXXX_1 \
FTP_PASSWORD='GEHEIM' \
bash /tmp/install-sennelager.shEine FTP_URL mit ftps:// verwendet explizites, TLS-verschlüsseltes FTP auf Port 21 und prüft
das Serverzertifikat. Eine URL mit sftp:// verwendet SSH/SFTP auf Port 22. Beim ersten SFTP-Lauf
wird der SSH-Hostschlüssel nach /etc/sennelager-range-known-hosts geschrieben und bei allen
weiteren Verbindungen geprüft. Unverschlüsseltes FTP wird nicht unterstützt.
# Nur Daten und Kalender jetzt aktualisieren
systemctl start sennelager-fetch.service
# Ergebnis/Fehler ansehen
systemctl status sennelager-fetch.service
journalctl -u sennelager-fetch.service -n 100 --no-pager
# Nächsten geplanten Lauf anzeigen
systemctl list-timers sennelager-fetch.timer
# Gesamte Website einschließlich HTML/CSS/JavaScript erneut hochladen
/opt/sennelager-range/scripts/deploy_full.sh
# Git-Projekt aktualisieren und vollständige Website veröffentlichen
/opt/sennelager-range/scripts/update.shDer Timer läuft täglich ab 00:01 Uhr mit einer zufälligen Verzögerung von höchstens 5 Stunden
und 58 Minuten. Bei einem ausgeschalteten CT wird der Lauf dank Persistent=true nachgeholt.
Die beiden bisherigen Seitenflächen sind für PNG-Dateien vorbereitet:
static/ads/left.png
static/ads/right.png
Auf großen Desktop-Bildschirmen bleiben die Flächen dezent mit 160 Pixel Breite seitlich angeordnet. Auf kleineren Desktop- und Tablet-Bildschirmen wandern sie unter den Hauptinhalt; auf Smartphones stehen sie dort untereinander. Die Höhe ergibt sich automatisch und unverzerrt aus dem Seitenverhältnis der PNG-Datei. Fehlt eine Datei, erscheint ein neutraler Werbeplatzhalter.
Nach dem Hinzufügen oder Austauschen der PNG-Dateien ins Git-Repository muss einmal die vollständige Veröffentlichung laufen:
/opt/sennelager-range/scripts/update.shstatic/app.js: lädt JSON und rendert Status/Kalender im Browser.app/fetch_status.py: liest ausschließlich die Tabelle der BFG-Quellseite.app/build_data.py: erzeugt nur JSON und ICS für den täglichen Upload.app/build_static.py: erzeugt bei Installation/Update die gesamte Website.app/deploy_ftp.py: FTPS- oder SFTP-Upload über temporäre Dateien.scripts/publish.sh: täglicher Datenlauf.scripts/deploy_full.sh: vollständige Veröffentlichung.config/ftp.env.example: Beispiel der CT-Konfiguration.
Projektfremde Dateien auf dem Webspace werden vom Uploader nicht gelöscht.
530 Login incorrect: FTP-Benutzer oder Passwort kontrollieren.550 ...:FTP_REMOTE_DIRund Schreibrechte kontrollieren.- TLS-Fehler: den Hetzner-Hostnamen statt einer IP-Adresse verwenden.
- Seite lädt, bleibt aber grau: Im Browser prüfen, ob
/data/status_data.jsonerreichbar ist. - Änderungen an CSS/JS/PNG fehlen:
deploy_full.shstatt nur des täglichen Dienstes ausführen.
Privates Projekt ohne Gewähr. Maßgeblich ist immer die Originalquelle auf bfgnet.de.