# 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). 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 (dauert 1–2 min, braucht Netzugang): ```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.