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