zisco 039e2905dd
Deploy PBT / deploy (push) Successful in 16s
Toggle map-show
2026-09-11 16:04:53 +02:00
2026-09-10 22:51:46 +02:00
2026-09-10 22:51:46 +02:00
2026-09-11 14:54:40 +02:00
2026-09-11 16:04:53 +02:00
2026-09-09 21:43:24 +02:00
2026-09-10 21:58:22 +02:00
2026-09-09 17:39:25 +02:00
2026-09-11 16:04:53 +02:00
2026-09-09 17:39:25 +02:00
2026-09-10 21:17:34 +02:00
2026-09-11 16:04:53 +02:00
2026-09-09 17:39:25 +02:00
2026-09-09 17:39:25 +02:00
2026-09-11 16:04:53 +02:00
2026-09-10 22:45:12 +02:00
2026-09-11 16:04:53 +02:00
2026-09-09 17:39:25 +02:00
2026-09-09 19:54:42 +02:00
2026-09-10 22:45:12 +02:00

PBT Öffi-Erfahrungen (pbt.zisco.at)

Lokal auf der LXC einrichten

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 allen österreichischen Haltestellen. Die Daten stammen aus OpenStreetMap (© OpenStreetMap-Mitwirkende, ODbL) und liegen als Snapshot im Repo (data/stops_at.csv.gz, ~37 000 Haltestellen).

Zusätzlich ist pro Haltestelle die Menge der Linien hinterlegt (aus den OSM-route-Relationen, ~87 % der Halte). 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.

Nach dem Anlegen der Tabellen den Snapshot in die DB laden:

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 neu von OpenStreetMap holen (Halte + Linien, ~5 min, braucht Netzugang und ~1 GB RAM):

python scripts/fetch_stops.py   # überschreibt data/stops_at.csv.gz
flask import-stops

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:

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):
    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):
    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:

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.

S
Description
No description provided
Readme
10 MiB
Languages
Python 43%
HTML 35.4%
JavaScript 21.6%