Adds krafttrainer.service for running as a systemd unit and expands deployment.md with step-by-step instructions for both systemd and Docker deployment. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
145 lines
3.3 KiB
Markdown
145 lines
3.3 KiB
Markdown
# 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) |
|