# Watermaps-Produktion Dieser Stack hostet die Watermaps-App und die lokalen Fahrrouten für Deutschland und die Niederlande. Die sichtbaren Kartenkacheln bleiben externe Dienste. Öffentlich gebunden werden ausschließlich TCP 80 und 443; die Watermaps-App ist nur im internen Docker-Netz erreichbar. ## Konfiguration ```bash cp deploy/.env.production.example deploy/.env.production editor deploy/.env.production ``` Mindestens `WATERMAPS_ACME_EMAIL` muss angepasst werden. Der Hetzner-API-Token gehört **nicht** in diese Datei. Er bleibt lokal in der ignorierten Datei `infra/opentofu/terraform.tfvars` (alternativ kann der Provider `TF_VAR_hcloud_token` lesen). Der Upload schließt Terraform-Variablen, Pläne, State, lokale Env-Dateien und `.terraform` in jeder Verzeichnistiefe aus. Die private SSH-Keydatei wird ebenfalls nicht gespeichert. Sie kann beim Deployment mit `--identity` oder über `WATERMAPS_SSH_KEY` angegeben werden. Falls OpenTofu keinen Output `ssh_private_key_path` bereitstellt und der Key nicht bereits über den SSH-Agenten verfügbar ist, ist eine dieser beiden Angaben erforderlich. Der vorbereitete SSH-Benutzer heißt standardmäßig `deploy`; die privilegierten Installationsschritte laufen über dessen passwortloses `sudo`. ## Deployment Nach `tofu apply` liest dieses Skript standardmäßig den Output `server_ipv4`, überträgt das Projekt ohne State, lokale Daten oder Node-Module und startet den Serverbootstrap sowie den Docker-Stack: ```bash ./deploy/scripts/upload-and-deploy.sh --identity ~/.ssh/watermaps_hetzner_ed25519 ``` Alternativ: ```bash WATERMAPS_SERVER_IPV4=203.0.113.10 \ WATERMAPS_SSH_KEY=~/.ssh/watermaps_hetzner_ed25519 \ ./deploy/scripts/upload-and-deploy.sh ``` Der erste Datenaufbau lädt die Geofabrik-Extrakte für Deutschland und die Niederlande herunter und kann entsprechend der Serverleistung längere Zeit dauern. Der produktive Index liegt auf dem Server unter: ```text /srv/watermaps-data/local/germany-netherlands-fairways.json ``` Der Upload wartet zuerst auf SSH und den Abschluss von Cloud-init. Anschließend startet und prüft er `watermaps-volume-setup.service`. Ohne tatsächlich unter `/srv/watermaps-data` eingehängtes Volume wird kein Download gestartet, damit die großen PBF-Dateien nicht versehentlich auf dem Root-Dateisystem landen. Für den kurzzeitigen Speicherpeak beim kombinierten Indexaufbau richtet der Bootstrap zusätzlich die über `WATERMAPS_SWAP_SIZE_GB` konfigurierte, persistente Swap-Reserve ein. Vor dem Livegang antwortet Nginx nur für ACME-Challenges. Alle anderen HTTP-Anfragen erhalten 404. ## DNS und SSL-Livegang Sobald der OpenTofu-Output bekannt ist, kann folgender DNS-Eintrag gesetzt werden: ```text A watermaps.incoso.eu ``` Nach der DNS-Propagation wird der Livegang lokal ausgelöst: ```bash ./deploy/scripts/remote-go-live.sh --identity ~/.ssh/watermaps_hetzner_ed25519 ``` Das Serverskript prüft, dass sämtliche A-Records ausschließlich auf die erwartete IPv4 zeigen, testet den Routingindex mit je einer Route in Deutschland und den Niederlanden, prüft den ACME-Webroot, fordert das Zertifikat an und aktiviert erst anschließend HTTPS. HTTP leitet danach auf HTTPS um. ## Automatik `bootstrap-server.sh` installiert zwei systemd-Timer: - `watermaps-route-update.timer`: täglich neue Deutschland- und Niederlande-Daten; bei Build- oder Routentestfehler bleibt der vorherige Index aktiv. - `watermaps-certbot-renew.timer`: zweimal täglich Certbot-Prüfung mit anschließendem Nginx-Reload. Status und Logs: ```bash systemctl list-timers 'watermaps-*' journalctl -u watermaps-route-update.service journalctl -u watermaps-certbot-renew.service docker compose \ --project-directory /opt/watermaps \ --env-file /opt/watermaps/deploy/.env.production \ -f /opt/watermaps/deploy/compose.production.yml ps ```