Files
streamdock/docs/entwicklung.md
2026-04-12 22:50:50 +02:00

4.6 KiB
Raw Permalink Blame History

Entwicklung

Voraussetzungen

Werkzeug Version Pflicht
Go 1.23+ Ja
FFmpeg Aktuell Optional (für Aufnahmen & Video-Proxy)
Docker Aktuell Für Container-Build
Make Aktuell Für Build-Automatisierung

Projekt einrichten

# Repository klonen
git clone <repo-url> streamdock
cd streamdock

# Abhängigkeiten herunterladen
go mod download
# Oder:
make deps

Makefile-Targets

Target Beschreibung
make build Go-Binary kompilieren
make run Bauen und lokal ausführen
make deps Abhängigkeiten herunterladen
make test Unit-Tests ausführen
make lint Code-Analyse mit golangci-lint
make clean Binary entfernen, Datenbank zurücksetzen
make docker Docker-Image bauen
make docker-run Container mit docker-compose starten
make docker-stop Container stoppen
make docker-logs Container-Logs verfolgen
make db-reset Datenbank löschen und neu erstellen

Lokal starten

# Direkt mit Go
go run ./cmd/streamdock

# Mit Make
make run

# Mit angepasster Konfiguration
STREAMDOCK_PORT=3000 STREAMDOCK_JWT_SECRET=dev-secret go run ./cmd/streamdock

Die Anwendung ist standardmäßig unter http://localhost:8080 erreichbar.


Tests ausführen

# Alle Tests
make test

# Oder direkt:
go test ./...

# Mit Verbose-Output
go test -v ./...

# Einzelnes Paket testen
go test -v ./internal/auth/
go test -v ./internal/db/
go test -v ./internal/recorder/

Vorhandene Tests

Paket Datei Beschreibung
internal/auth auth_test.go JWT-Generierung, Passwort-Hashing
internal/db db_test.go Datenbankoperationen, Schema
internal/recorder recorder_test.go Aufnahme-Logik

Code-Analyse

# Mit golangci-lint
make lint

# Oder manuell:
golangci-lint run ./...

Docker-Image lokal bauen

# Image bauen
make docker
# Oder:
docker compose build

# Ohne Cache (nach Dependency-Änderungen)
docker compose build --no-cache

# Container starten
make docker-run
# Oder:
docker compose up -d

# Logs verfolgen
make docker-logs
# Oder:
docker compose logs -f

Projektstruktur-Konventionen

Go-Code

  • cmd/ Einstiegspunkte (main-Packages)
  • internal/ Interne Pakete (nicht von außen importierbar)
    • Ein Paket pro Verantwortungsbereich
    • models/ enthält nur Datenstrukturen, keine Logik
    • api/ enthält Handler und Router
  • Keine globalen Variablen Dependency Injection über Structs

Frontend

  • Kein Build-Step Vanilla JS + Alpine.js (direkt auslieferbar)
  • Single Page Application Eine index.html, Routing über Alpine.js State
  • CSS-Variablen Design-Tokens in :root

Datenbank

  • Schema-Migration Automatisch beim Start (db.go)
  • Parametrisierte Queries Kein String-Concatenation
  • Benannte Queries sqlx Tags in Structs

Neue Funktionen hinzufügen

Neuen API-Endpunkt

  1. Model definieren in internal/models/models.go
  2. Query schreiben in internal/db/queries.go
  3. Handler erstellen in internal/api/handlers.go
  4. Route registrieren in internal/api/router.go
  5. Frontend anbinden in web/static/js/app.js

Neue Integration

  1. Client-Paket erstellen unter internal/{integration}/
  2. Konfiguration in internal/config/config.go ergänzen
  3. API-Endpunkte hinzufügen
  4. Benutzer-Einstellungen in der DB erweitern (Schema-Migration)

Deployment-Workflow

# Lokale Änderungen auf den Server übertragen und deployen
scp -r ./* .env entrypoint.sh user@server:/pfad/zum/projekt/
ssh user@server "cd /pfad/zum/projekt && docker compose down && docker compose build --no-cache && docker compose up -d"

Abhängigkeiten (go.mod)

Direkte Abhängigkeiten

Modul Zweck
github.com/go-chi/chi/v5 HTTP-Router
github.com/go-chi/cors CORS-Middleware
github.com/golang-jwt/jwt/v5 JWT-Authentifizierung
github.com/jmoiron/sqlx SQL-Datenbank-Wrapper
github.com/robfig/cron/v3 Cron-Scheduler
golang.org/x/crypto bcrypt Passwort-Hashing
modernc.org/sqlite Pure-Go SQLite-Treiber

Wichtige Charakteristiken

  • Kein CGO Reine Go-Kompilierung, maximale Portabilität
  • Minimale Abhängigkeiten Leichtgewichtiger Dependency-Tree
  • Keine ORM Direkte SQL-Queries via sqlx

Zurück zur Dokumentationsübersicht