# 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@/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: ```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 neu von OpenStreetMap holen (Halte + Linien, ~5 min, braucht Netzugang und ~1 GB RAM): ```bash python scripts/fetch_stops.py # überschreibt data/stops_at.csv.gz flask import-stops ``` ## 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.