Files
pbt/README.md
T
zisco a52e233c31
Deploy PBT / deploy (push) Failing after 2m53s
Extend stops to DACH-region
2026-09-12 07:06:29 +02:00

126 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PBT Öffi-Erfahrungen (pbt.zisco.at)
## Lokal auf der LXC einrichten
```bash
cd /opt/pbt # oder wohin du die Dateien kopierst
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
export PBT_DATABASE_URL="postgresql://pbt_app:DEIN_PASSWORT@<postgres-ip-oder-hostname>/pbt"
export PBT_SECRET_KEY="ein-langer-zufaelliger-string"
python app.py # Testlauf auf Port 5000
```
Beim ersten Start legt die App die Tabellen (`users`, `trips`, `stops`) automatisch per
`db.create_all()` an dafür braucht der User `pbt_app` `CREATE`-Rechte in der DB
(sollte durch `GRANT ALL PRIVILEGES ON DATABASE pbt TO pbt_app;` bereits gegeben sein).
## Haltestellen-Lookup
Die Felder „Von" und „Nach" haben eine Autovervollständigung aus den
Haltestellen in Österreich, Deutschland und der Schweiz (DACH) aktuell
**306 954 Haltestellen** (DE 243 278, AT 37 454, CH 26 222). Die Daten stammen
aus OpenStreetMap (© OpenStreetMap-Mitwirkende, ODbL) und liegen als Snapshot
im Repo (`data/stops_dach.csv.gz`, ~7,5 MB gepackt).
Zusätzlich ist pro Haltestelle die Menge der Linien hinterlegt (aus den
OSM-`route`-Relationen). Das Feld „Linie" schlägt daraus die Linien vor, die
an den gewählten Halten verkehren, und füllt sich selbst aus, wenn nur eine
Linie in Frage kommt. Freitext bleibt immer möglich. Da mehrere Länder
gleichnamige Haltestellen haben können (mehrere „Hauptbahnhof"), zeigt die
Vorschlagsliste zusätzlich das Land.
Nach dem Anlegen der Tabellen den Snapshot in die DB laden:
```bash
flask import-stops # FLASK_APP=app.py bzw. im Projektverzeichnis
```
Der Import ist idempotent (Upsert) und braucht kein Internet. Im Produktivbetrieb
übernimmt das die Unit `pbt-import-stops.service` (wird bei jedem Deploy
angestoßen, s. u.).
### Snapshot aktualisieren
Bei dieser Größenordnung (AT+DE+CH) geht sich das nicht mehr über die
öffentliche Overpass-API aus schon eine reine Zählabfrage für Deutschland
oder auch nur die Schweiz läuft dort in den Timeout. Stattdessen lädt
`fetch_stops.py` die offiziellen Geofabrik-Extrakte pro Land herunter
(`data/.osm-cache/`, nicht committed, ~6 GB) und wertet sie lokal mit
`pyosmium` aus keine Last auf einer geteilten API.
```bash
pip install osmium # einmalig, nur für dieses Script
python scripts/fetch_stops.py # überschreibt data/stops_dach.csv.gz
flask import-stops
```
Braucht Netzugang zum Download, ein paar GB RAM und in der Praxis eher
11,5 Stunden als die 5 Minuten von früher (der Großteil davon ist
Deutschland Österreich allein dauert ca. 11 Minuten). Bereits
heruntergeladene Extrakte werden für spätere Läufe wiederverwendet, solange
sie in `data/.osm-cache/` liegen (~6 GB, `rm -rf data/.osm-cache/` gibt den
Platz wieder frei).
## Kartenvorschau (optional, standardmäßig aus)
Trip-Formular und „Meine Fahrten" können eine kleine Leaflet/OSM-Karte mit den
gewählten Halten zeigen (Luftlinie, keine echte Streckenführung dafür fehlen
uns die Routengeometrien). Standardmäßig **aus**, da das ohne echte Strecken
wenig Mehrwert bringt. Aktivieren mit:
```bash
export PBT_SHOW_MAP=true
```
bzw. in `/etc/pbt/pbt.env` die Zeile `PBT_SHOW_MAP=true` setzen (s. u.).
## Produktivbetrieb mit systemd + Gunicorn
1. Projekt nach `/opt/pbt` kopieren, virtuelle Umgebung dort anlegen (s. oben).
2. Secrets anlegen (nicht im Repo):
```bash
sudo install -d -m 750 -o root -g root /etc/pbt
sudo cp /opt/pbt/pbt.env.example /etc/pbt/pbt.env
sudo chmod 640 /etc/pbt/pbt.env
sudo $EDITOR /etc/pbt/pbt.env # echte PBT_DATABASE_URL + PBT_SECRET_KEY
```
3. Beide Units installieren (lesen `/etc/pbt/pbt.env`):
```bash
sudo cp /opt/pbt/pbt.service /opt/pbt/pbt-import-stops.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now pbt
sudo systemctl start pbt-import-stops.service # Haltestellen laden
systemctl status pbt
```
Die App lauscht dann intern auf `127.0.0.1:8000`.
4. Damit der Deploy-User (`deploy`) beim CI-Deploy neu starten und den
Haltestellen-Import anstoßen darf, in `/etc/sudoers.d/pbt-deploy`:
```
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart pbt, /usr/bin/systemctl start pbt-import-stops.service
```
Der Import selbst läuft als `www-data` und bekommt die DB-URL aus
`/etc/pbt/pbt.env` die Credentials liegen nie beim Deploy-User.
## Caddy-Eintrag
In der Caddy-LXC in der Caddyfile ergänzen:
```
pbt.zisco.at {
reverse_proxy 10.10.10.24:8000
}
```
(IP durch die tatsächliche Adresse der `pbt`-LXC ersetzen.) Danach:
```bash
systemctl reload caddy
```
Caddy holt sich das TLS-Zertifikat für `pbt.zisco.at` automatisch über Let's Encrypt,
sofern die Domain öffentlich auf die Caddy-LXC zeigt.