# Deployment ## 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) |