zisco 158311a329
Deploy PBT / deploy (push) Failing after 16s
Init stops-import, DB-Env
2026-09-10 21:58:22 +02:00
2026-09-10 21:44:45 +02:00
2026-09-10 21:44:45 +02:00
2026-09-10 21:44:45 +02:00
2026-09-10 21:44:45 +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-10 21:44:45 +02:00
2026-09-09 17:39:25 +02:00
2026-09-10 21:17:34 +02:00
2026-09-09 17:39:25 +02:00
2026-09-09 17:39:25 +02:00
2026-09-09 17:39:25 +02:00
2026-09-10 21:44:45 +02:00
2026-09-10 21:58:22 +02:00
2026-09-10 21:58:22 +02:00
2026-09-10 21:58:22 +02:00
2026-09-09 17:39:25 +02:00
2026-09-09 19:54:42 +02:00
2026-09-10 21:44:45 +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).

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 (dauert 12 min, braucht Netzugang):

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