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