diff --git a/deployment.md b/deployment.md index d62f9b8..8acf9bb 100644 --- a/deployment.md +++ b/deployment.md @@ -1,10 +1,89 @@ # Deployment -Es gibt zwei Deployment-Varianten: **systemd** (empfohlen für einzelne Server) und **Docker**. +Es gibt zwei Deployment-Varianten: **systemd** (Binary direkt) und **Docker** (empfohlen). --- -## Variante 1: systemd (Binary direkt) +## 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 @@ -70,73 +149,6 @@ 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 |