feat: add Docker/OpenTofu deployment and DE/NL routing
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
# 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 <server_ipv4>
|
||||
```
|
||||
|
||||
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
|
||||
```
|
||||
Reference in New Issue
Block a user