126 lines
4.7 KiB
Markdown
126 lines
4.7 KiB
Markdown
# 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
|
||
1–1,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.
|