# Deployment Es gibt zwei Deployment-Varianten: **systemd** (Binary direkt) und **Docker** (empfohlen). --- ## Variante 1: Docker (empfohlen) ### Voraussetzungen - Docker + Docker Compose auf dem Zielrechner - SSH-Zugang zum Zielrechner ### Aktuelle Konfiguration (192.168.1.118) | Parameter | Wert | |-----------|------| | User | `christoph` | | Quellcode | `/home/christoph/krafttrainer-src/` | | Datenbank | `/home/christoph/fitnesspad/krafttrainer.db` | | Port | `8090` | Die `docker-compose.yml` mountet `/home/christoph/fitnesspad` als Bind-Mount in den Container (`/data`). Die DB liegt damit direkt auf dem Dateisystem des Servers — kein Docker-Volume. ### Erstinstallation ```bash # 1. Quellcode auf den Server übertragen ssh christoph@192.168.1.118 "mkdir -p ~/krafttrainer-src ~/fitnesspad" git archive --format=tar HEAD | ssh christoph@192.168.1.118 "tar -x -C ~/krafttrainer-src" # 2. Container bauen und starten (~2-3 Min. beim ersten Mal) ssh christoph@192.168.1.118 "cd ~/krafttrainer-src && docker compose up --build -d" ``` Beim ersten Start laufen die Datenbankmigrationen automatisch. ### Update deployen ```bash git archive --format=tar HEAD | ssh christoph@192.168.1.118 "tar -x -C ~/krafttrainer-src" ssh christoph@192.168.1.118 "cd ~/krafttrainer-src && docker compose up --build -d" ``` ### Datenbank einspielen ```bash # Lokale DB auf den Server kopieren (überschreibt bestehende Daten!) scp backend/krafttrainer.db christoph@192.168.1.118:/home/christoph/fitnesspad/krafttrainer.db # Container neu starten (Migrationen laufen automatisch) ssh christoph@192.168.1.118 "cd ~/krafttrainer-src && docker compose down && docker compose up -d" ``` > **Wichtig:** Immer `docker compose down && docker compose up -d` verwenden (nicht `docker restart`), damit Änderungen an der `docker-compose.yml` übernommen werden. ### Logs ```bash ssh christoph@192.168.1.118 "docker logs krafttrainer-src-krafttrainer-1 -f" ``` ### Stoppen / Neustarten ```bash ssh christoph@192.168.1.118 "cd ~/krafttrainer-src && docker compose down" ssh christoph@192.168.1.118 "cd ~/krafttrainer-src && docker compose up -d" ``` ### Datenbank-Backup ```bash scp christoph@192.168.1.118:/home/christoph/fitnesspad/krafttrainer.db ./krafttrainer.db.bak ``` ### Image-Aufbau (3-Stage-Build) | Stage | Basis | Aufgabe | |-------|-------|---------| | 1 | `node:22-slim` | `pnpm build` → `frontend/dist/` | | 2 | `golang:1.26-bookworm` | Frontend einbetten + `go build` (CGO für SQLite) | | 3 | `debian:bookworm-slim` | Nur Binary + glibc, ~100MB finales Image | --- ## Variante 2: systemd (Binary direkt) ### Voraussetzungen - Linux mit systemd - GCC/glibc (für CGO/SQLite) auf dem Build-Rechner - SSH-Zugang zum Zielrechner ### Erstinstallation ```bash # 1. Binary bauen (auf dem Entwicklungsrechner) make build # 2. Verzeichnis auf dem Zielrechner anlegen ssh christoph@192.168.1.118 "mkdir -p ~/krafttrainer" # 3. Binary übertragen scp krafttrainer christoph@192.168.1.118:~/krafttrainer/ # 4. Service-Datei installieren sudo cp krafttrainer.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable krafttrainer sudo systemctl start krafttrainer ``` Die Service-Datei (`krafttrainer.service`) liegt im Repo-Root und geht von folgendem aus: | Parameter | Wert | |-----------|------| | User | `christoph` | | Binary | `/home/christoph/krafttrainer/krafttrainer` | | Datenbank | `/home/christoph/krafttrainer/krafttrainer.db` | | Port | `8090` | Anpassen falls User oder Pfade abweichen. ### Update deployen ```bash make build scp krafttrainer christoph@192.168.1.118:~/krafttrainer/ ssh christoph@192.168.1.118 "sudo systemctl restart krafttrainer" ``` ### Service verwalten ```bash sudo systemctl status krafttrainer # Status sudo journalctl -u krafttrainer -f # Logs live sudo systemctl stop krafttrainer # Stoppen sudo systemctl restart krafttrainer # Neustarten ``` ### Service entfernen ```bash sudo systemctl stop krafttrainer sudo systemctl disable krafttrainer sudo rm /etc/systemd/system/krafttrainer.service sudo systemctl daemon-reload ``` --- ## Ports | Port | Dienst | |------|--------| | `8090` | HTTP-Server (API + Frontend) |