# TrainPulse – Schweiz Live-Karte aller Züge in der Schweiz: Position entlang der echten Strecke, Linie, Zugnummer, Ziel, Verspätung und Fahrtverlauf mit Gleis. Hintergrund umschaltbar zwischen Karte (OpenStreetMap) und Satellit (swisstopo SWISSIMAGE, ausserhalb der Schweiz Sentinel-2). ## Wie es funktioniert ``` opentransportdata.swiss ──GTFS (Mo+Do)──▶ updater-Container (stündlich) ├─ Filter: nur Bahn (route_type 100–199) OpenStreetMap (Geofabrik) ─────────────────▶├─ pfaedle: echte Streckenverläufe └─▶ data/feeds// opentransportdata.swiss ──GTFS-RT (35 s)──▶ web-Container (Port 8080) ├─ Position = Fahrplan + Verspätung, entlang Strecke └─ /api/vehicles, /api/trip/…, /api/status, Weboberfläche ``` Es gibt in der Schweiz **keine offenen GPS-Positionen** der Züge. Die Position wird aus Fahrplan und gemeldeter Verspätung berechnet und auf den Streckenverlauf gelegt. Wechsel des Fahrplans: Neue Fahrpläne erscheinen Montag und Donnerstag zwischen 9 und 10 Uhr, die Echtzeitdaten stellen erst um 15 Uhr um. Der Server lädt deshalb immer den Fahrplan, auf den sich die Echtzeitdaten gerade beziehen (`feed_version`), und schaltet automatisch mit um. ## Installation auf Proxmox (Docker) TrainPulse läuft als zwei Docker-Container aus demselben Image: `web` (Webserver, Port 8080) und `updater` (holt stündlich neue Fahrpläne und beim ersten Start die Kartenkacheln). Alle Daten liegen im Ordner `data/` neben der `compose.yaml`. 1. **Container anlegen** (Proxmox-Oberfläche → *Create CT*): Debian 12 oder 13 Template, unprivileged, 2 Kerne, **4 GB RAM** (pfaedle braucht beim Aufbereiten bis ~2 GB, der Server ~0,5 GB), **20 GB Disk**, Netz per DHCP. Unter *Options → Features* **Nesting** und **keyctl** aktivieren – ohne das läuft Docker im LXC nicht. 2. **Installieren** (im Container als root): ```bash apt install -y git git clone https://git.scarriffle.com/Scarriffle/Trainpulse.git bash Trainpulse/deploy/install.sh ``` Das Skript installiert Docker, falls es fehlt, baut das Image und startet beide Container. 3. **Echtzeit freischalten:** Auf registrieren, eine Applikation anlegen, das Produkt *GTFS-RT* abonnieren und den API-Key in `Trainpulse/.env` bei `TRAINPULSE_RT_KEY=` eintragen. Dann `docker compose up -d`. Danach ist die Karte unter `http://:8080` erreichbar. Für den Zugriff von aussen einfach hinter deinen bestehenden Reverse Proxy hängen. **Update:** `git pull && bash deploy/install.sh` – baut das Image neu, Daten bleiben. ## Nützliche Befehle (im Ordner `Trainpulse`) | Was | Befehl | |---|---| | Status | `curl localhost:8080/api/status` | | Logs Webserver | `docker compose logs -f web` | | Logs Fahrplan-Update | `docker compose logs -f updater` | | Fahrplan sofort neu aufbereiten | `docker compose exec updater python -m trainpulse.prepare --force` | | Selbsttest | `docker compose exec web python tests/test_core.py` | | Stoppen / Starten | `docker compose down` / `docker compose up -d` | ## Datenquellen und Lizenzen Die Hinweise erscheinen unten rechts auf der Karte. - Fahrplan & Echtzeit: [opentransportdata.swiss](https://opentransportdata.swiss) (Quellenangabe Pflicht) - Karte: © OpenStreetMap-Mitwirkende (ODbL), Kacheln von [Protomaps](https://protomaps.com) - Streckenverläufe: berechnet mit [pfaedle](https://github.com/ad-freiburg/pfaedle) aus OpenStreetMap-Daten (ODbL) - Satellit Schweiz: © swisstopo (frei, Quellenangabe) - Satellit ausserhalb: Sentinel-2 cloudless 2024 von EOX – **nur nicht-kommerziell** frei ## Bekannte Grenzen - Nur Bahn. Busse, Trams und Schiffe sind im Fahrplan, werden aber noch herausgefiltert. - Der Schweizer Fahrplan enthält auch einige ausländische Züge (z. B. TGV, TER); deren Strecke ausserhalb der Schweiz ist nur Luftlinie, weil der OSM-Ausschnitt nur die Schweiz abdeckt. - Zwischen zwei Abfragen fahren die Züge auf gerader Linie; in engen Kurven schneiden sie für ein paar Sekunden minimal ab. - Zusätzliche Fahrten, die nur in den Echtzeitdaten vorkommen (Extrazüge), fehlen. - In der Nacht des Fahrplanwechsels (2. Sonntag im Dezember) fehlen bis zum nächsten stündlichen Lauf die Züge.