# Deployment Es gibt zwei Deployment-Varianten: **systemd** (empfohlen für einzelne Server) und **Docker**. --- ## Variante 1: 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 ``` --- ## Variante 2: Docker ### Voraussetzungen - Docker + Docker Compose auf dem Zielrechner - Quellcode (git clone) ## Starten ```bash docker compose up --build -d ``` Beim ersten Start: - Docker baut das Image (Frontend + Go-Binary, dauert ~2 Min.) - Migrations laufen automatisch beim Start - Server lauscht auf Port `8090` ## Nach Code-Änderungen ```bash docker compose up --build -d ``` Docker-Layer-Cache beschleunigt den Rebuild: - `go.mod` unverändert → `go mod download` wird nicht wiederholt - `pnpm-lock.yaml` unverändert → `pnpm install` wird nicht wiederholt ## Logs ```bash docker compose logs -f ``` ## Stoppen ```bash docker compose down # Container stoppen (DB bleibt erhalten) docker compose down -v # Container + DB-Volume löschen (Datenverlust!) ``` ## Datenbank Die SQLite-DB liegt im Docker-Volume `db-data` → `/data/krafttrainer.db` im Container. **Backup:** ```bash docker run --rm -v krafttrainer_db-data:/data -v $(pwd):/backup \ debian:bookworm-slim cp /data/krafttrainer.db /backup/krafttrainer.db.bak ``` **Restore:** ```bash docker compose down docker run --rm -v krafttrainer_db-data:/data -v $(pwd):/backup \ debian:bookworm-slim cp /backup/krafttrainer.db.bak /data/krafttrainer.db docker compose up -d ``` ## Image-Aufbau (3-Stage-Build) | Stage | Basis | Aufgabe | |-------|-------|---------| | 1 | `node:22-slim` | `pnpm build` → `frontend/dist/` | | 2 | `golang:1.24-bookworm` | Frontend einbetten + `go build` (CGO für SQLite) | | 3 | `debian:bookworm-slim` | Nur Binary + glibc, ~100MB finales Image | ## Ports | Port | Dienst | |------|--------| | `8090` | HTTP-Server (API + Frontend) |