# Karch Baumkataster – Installation auf dev2.karch-service.de

Version 1.2 · Stand September 2026

---

## 1. Verzeichnisaufbau

```
karch-baumkataster/
├── public/                     Die App (wird vom Browser geladen)
│   ├── index.html              komplette Anwendung, eine Datei
│   ├── sw.js                   Service Worker – Offline-Betrieb
│   ├── manifest.json           macht die App auf dem Handy installierbar
│   ├── icon-192.png
│   ├── icon-512.png
│   └── apple-touch-icon.png
├── data/                       Datenbestand (wird angelegt/gefüllt)
│   ├── baeume.json             alle Bäume
│   ├── fotos.json              Fotoverzeichnis
│   ├── fotos/                  die Bilddateien
│   └── backup-JJJJ-MM-TT.json  tägliche Sicherung, 14 Tage Vorhalt
├── server.js                   Node-Dienst, ohne npm-Abhängigkeiten
├── karch-baumkataster.service  systemd-Unit (Referenz)
├── install.sh                  Installationsskript
├── .htaccess                   nur für den rein statischen Betrieb
├── INSTALLATION.md             diese Datei
└── ANLEITUNG.md                Bedienung für die Kollegen
```

## 2. Hochladen

Per WinSCP den kompletten Ordner `karch-baumkataster` nach

```
/var/www/html/karch-baumkataster
```

kopieren – also genauso wie `karch-geraetemanager` und `objektservice`.

## 3. Installieren

In der WinSCP-Konsole (Befehle → Konsole öffnen):

```bash
cd /var/www/html/karch-baumkataster
chmod +x install.sh
sudo bash install.sh
```

Das Skript

- ermittelt sein eigenes Verzeichnis selbst (Groß-/Kleinschreibung ist damit egal),
- sucht einen freien Port ab 3025,
- legt `/etc/systemd/system/karch-baumkataster.service` an,
- startet den Dienst und aktiviert ihn für den Systemstart,
- prüft, ob der Dienst antwortet,
- und gibt am Ende den Apache-Block aus.

## 4. Apache

Der Block muss **von Hand** in die SSL-vHost-Datei, er wird nicht automatisch erzeugt.

```bash
sudo cp /etc/apache2/sites-available/000-default-le-ssl.conf \
        /etc/apache2/sites-available/000-default-le-ssl.conf.bak-$(date +%F)
```

Datei bearbeiten und **innerhalb** von `<VirtualHost *:443>` einfügen:

```apache
    RedirectMatch permanent ^/baumkataster$ /baumkataster/
    ProxyPreserveHost On
    ProxyPass        /baumkataster/  http://127.0.0.1:3025/
    ProxyPassReverse /baumkataster/  http://127.0.0.1:3025/
    <Location /baumkataster/>
        Require all granted
    </Location>
```

Falls `install.sh` einen anderen Port gewählt hat (Meldung „Port 3025 ist belegt“), dort die
tatsächliche Nummer eintragen. Da nano in der WinSCP-Konsole nicht läuft, geht es auch per sed:

```bash
sudo sed -i 's|</VirtualHost>|    RedirectMatch permanent ^/baumkataster$ /baumkataster/\n    ProxyPreserveHost On\n    ProxyPass        /baumkataster/  http://127.0.0.1:3025/\n    ProxyPassReverse /baumkataster/  http://127.0.0.1:3025/\n</VirtualHost>|' /etc/apache2/sites-available/000-default-le-ssl.conf
```

Dann aktivieren:

```bash
sudo a2enmod proxy proxy_http
sudo apache2ctl configtest && sudo systemctl reload apache2
```

**Aufruf:** https://dev2.karch-service.de/baumkataster/

> HTTPS ist Pflicht. Über `http://` oder eine IP-Adresse gibt der Browser weder GPS noch
> Kamera frei – die Positionsanzeige bliebe leer. Auf dev2 ist das durch das vorhandene
> Zertifikat erfüllt.

## 5. Betrieb

```bash
systemctl status karch-baumkataster      # Zustand
journalctl -u karch-baumkataster -f      # Protokoll mitlesen
systemctl restart karch-baumkataster     # Neustart, z. B. nach Update
curl -s http://127.0.0.1:3025/api/health # Kurztest
```

**Update einspielen:** nur `public/index.html` per WinSCP ersetzen und im Handy-Browser einmal
neu laden. Ein Dienstneustart ist dafür nicht nötig. Nur wenn `server.js` getauscht wurde:
`sudo systemctl restart karch-baumkataster`.

## 6. Datensicherung

Der Dienst legt jeden Tag automatisch `data/backup-JJJJ-MM-TT.json` an und hält 14 Tage vor.
Für die Nachweisführung der Verkehrssicherungspflicht sollte `data/` zusätzlich in die
normale Serversicherung aufgenommen werden.

Schnelle Handsicherung:

```bash
cd /var/www/html && sudo tar czf ~/baumkataster-$(date +%F).tar.gz karch-baumkataster/data
```

## 7. Schnittstellen

| Aufruf | Zweck |
|---|---|
| `GET /baumkataster/api/health` | Zustand und Bestandszahlen |
| `GET /baumkataster/api/baeume` | alle Bäume als JSON |
| `POST /baumkataster/api/sync` | Abgleich Handy ↔ Server |
| `GET /baumkataster/api/fotos/<id>` | einzelnes Foto |
| `GET /baumkataster/api/adresse?lat=..&lon=..` | Adresse zu einer Koordinate |
| `GET /baumkataster/api/export/geojson` | kompletter Bestand für QGIS |

### Adressauflösung

Aus den GPS-Koordinaten ermittelt der Dienst Straße, Hausnummer, PLZ und Ort über Nominatim
(OpenStreetMap). Jeder Treffer wird dauerhaft in `data/adressen.json` zwischengespeichert –
dieselbe Stelle wird also nur einmal nachgeschlagen. Anfragen sind auf eine pro Sekunde
begrenzt, wie es die Nutzungsbedingungen verlangen. Bäume, die ohne Netz erfasst wurden,
bekommen ihre Adresse automatisch beim nächsten Abgleich.

Voraussetzung: dev2 muss ausgehend nach `https://nominatim.openstreetmap.org` dürfen. Test:

```bash
curl -s -A "KarchBaumkataster" "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=50.1988&lon=10.0776" | head -c 200
```

Kommt hier nichts zurück, blockiert die Firewall den Zugriff – dann bleiben die Adressfelder
leer und werden wie bisher von Hand gefüllt. Alternativ lässt sich ein anderer Dienst
einsetzen, z. B. eine eigene Nominatim-Instanz:

```bash
sudo systemctl edit karch-baumkataster    # oder Environment=GEO_URL=... in die .service-Datei
# Environment=GEO_URL=http://mein-dienst/reverse?lat={lat}&lon={lon}
```

Der GeoJSON-Link lässt sich in QGIS direkt als Layer einbinden – dann ist die Kartenansicht
im Büro immer auf dem aktuellen Stand, ohne Export von Hand.

## 8. Zugriffsschutz

Der Dienst lauscht nur auf `127.0.0.1`, erreichbar ist er ausschließlich über Apache.
Eine Anmeldung gibt es wie bei den übrigen internen Werkzeugen nicht. Falls gewünscht:

```bash
sudo htpasswd -c /etc/apache2/.htpasswd-baumkataster karch
```

und im Apache-Block ergänzen:

```apache
    <Location /baumkataster/>
        AuthType Basic
        AuthName "Karch Baumkataster"
        AuthUserFile /etc/apache2/.htpasswd-baumkataster
        Require valid-user
    </Location>
```

## 9. Betrieb ohne Node-Dienst

Soll es zunächst ohne Server laufen: nur den Inhalt von `public/` nach
`/var/www/html/baumkataster/` legen und per `Alias` einbinden. Die App funktioniert dann
vollständig, aber jedes Handy hat seinen eigenen Bestand; Austausch nur über Export/Import.

---

Karch Service GmbH & Co. KG · Ebenhäuser Str. 1 · 97714 Oerlenbach
