Files
pbt/README.md
T
zisco 039e2905dd
Deploy PBT / deploy (push) Successful in 16s
Toggle map-show
2026-09-11 16:04:53 +02:00

109 lines
3.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 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
```
## 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.