deployment improved

This commit is contained in:
Christoph K.
2026-03-21 15:10:12 +01:00
parent dfd66e43c6
commit 150ebe7d1d
5 changed files with 123 additions and 0 deletions

9
.dockerignore Normal file
View File

@@ -0,0 +1,9 @@
krafttrainer
krafttrainer.db
krafttrainer.db-shm
krafttrainer.db-wal
frontend/node_modules/
frontend/dist/
backend/static/assets/
.git/
.claude/

31
Dockerfile Normal file
View File

@@ -0,0 +1,31 @@
# Stage 1: Frontend bauen
FROM node:22-slim AS frontend-builder
WORKDIR /app/frontend
RUN corepack enable
COPY frontend/package.json frontend/pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY frontend/ ./
RUN pnpm build
# Stage 2: Go-Binary bauen (CGO nötig für go-sqlite3)
FROM golang:1.24-bookworm AS go-builder
WORKDIR /app
COPY backend/go.mod backend/go.sum ./
RUN go mod download
COPY backend/ ./
# Frontend-Build in static/ einhängen (wird per embed eingebettet)
COPY --from=frontend-builder /app/frontend/dist/ ./static/
RUN CGO_ENABLED=1 go build -ldflags="-s -w" -o krafttrainer ./cmd/server
# Stage 3: Minimales Runtime-Image
FROM debian:bookworm-slim
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# DB landet im Volume /data (hardcodierter Pfad "krafttrainer.db" → WORKDIR)
WORKDIR /data
COPY --from=go-builder /app/krafttrainer /usr/local/bin/krafttrainer
EXPOSE 8090
CMD ["krafttrainer"]

BIN
backend/server Executable file

Binary file not shown.

72
deployment.md Normal file
View File

@@ -0,0 +1,72 @@
# 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) |

11
docker-compose.yml Normal file
View File

@@ -0,0 +1,11 @@
services:
krafttrainer:
build: .
ports:
- "8090:8090"
volumes:
- db-data:/data
restart: unless-stopped
volumes:
db-data: