Files
LaunchPad/README.md

5.3 KiB
Raw Blame History

LaunchPad

Ein moderner, minimalistischer Homelab-Launcher inspiriert von Raycast, Spotlight, Arc und Linear. Tippe wenige Buchstaben, finde sofort den gewünschten Dienst, drücke Enter.

Kein überladenes Dashboard. Keine Kacheln. Im Mittelpunkt steht eine extrem schnelle Suche.

Quickstart (Docker)

git clone <repo-url> LaunchPad
cd LaunchPad
docker compose up -d --build

Quickstart (lokale Entwicklung)

Voraussetzungen: Node.js ≥ 20, pnpm ≥ 9.

pnpm install
pnpm dev:backend   # startet Fastify auf :3001
pnpm dev:frontend  # startet Vite auf :5173 (proxyt /api zum Backend)

Projektstruktur

LaunchPad
│
├── apps
│   ├── frontend   React + Vite + TypeScript + TailwindCSS
│   └── backend    Fastify + TypeScript + Drizzle ORM + SQLite
│
├── packages
│   ├── shared     gemeinsame Typen (Device, Service) + Such-Ranking-Logik
│   └── ui         gemeinsame UI-Komponenten (SearchInput, StatusBadge)
│
├── docker         zusätzliche Docker-Hilfsdateien
├── docs           Projektdokumentation
├── pnpm-workspace.yaml
├── docker-compose.yml
└── tsconfig.base.json

Stand dieses Commits

Dieser erste Commit liefert ein lauffähiges Grundgerüst:

  • pnpm-Monorepo mit apps/* und packages/*
  • Fastify-Backend mit /api/health-Endpunkt
  • SQLite-Datenbank (better-sqlite3) inkl. Schema für devices, services, categories (Drizzle ORM), automatisch angelegt beim Start
  • React-Startseite mit Suchfeld, Dark-/Light-Mode und Live-Statusanzeige des Backends
  • Tastaturkürzel / und Strg+K zum Fokussieren der Suche
  • Docker-Compose-Setup: docker compose up -d --build startet Frontend + Backend
  • Persistentes Docker-Volume für die SQLite-Datenbank
  • REST-API für Geräte & Dienste (/api/devices, /api/services), Zod-validiert, mit Repository-Layer über Drizzle (siehe apps/backend/src/db/repositories)
  • Suche im Frontend gegen echte Backend-Daten (TanStack Query), inkl. Ranking-Logik aus packages/shared und Tastatur-Navigation (Pfeiltasten, Enter, Escape)
  • Kategorien-API (/api/categories), inkl. Umbenennen, Löschen (Dienste behalten ihre Zuordnung nicht, werden aber nicht gelöscht) und Bulk-Reorder für Drag & Drop
  • Favoriten-Toggle direkt in der Trefferliste (Stern anklicken)
  • Scanner-Engine + API (POST /api/scan/devices/:id, POST /api/scan/fritzbox): DNS-Kandidaten (hostname/.home/.local), Portscan (80, 443 + typische Ports), Titel-/Favicon-Auslesen, Softwareerkennung, FritzBox-Geräteliste per TR-064 (HTTP-Digest-Auth). Läuft ausschließlich manuell per API-Aufruf nie automatisch. Benutzeränderungen an Diensten (Name, Kategorie, Favorit, Alias, Icon, Reihenfolge) bleiben bei erneuten Scans garantiert erhalten.

Noch nicht enthalten (folgt in den nächsten Commits):

  • Adminbereich mit "Jetzt scannen"-Button und Kategorien-Verwaltungsoberfläche — beide Backend-APIs existieren bereits vollständig
  • TanStack Router, Plugin-System, PWA-Manifest, shadcn/ui, RHF

FritzBox-Scan konfigurieren

Der FritzBox-Scan benötigt drei Umgebungsvariablen (z. B. in docker-compose.yml beim backend-Service oder lokal per .env):

FRITZBOX_HOST=192.168.1.1
FRITZBOX_USERNAME=<TR-064-Benutzername>
FRITZBOX_PASSWORD=<TR-064-Passwort>
FRITZBOX_PORT=49000        # optional, Default 49000

TR-064-Zugriff muss in der FritzBox unter Heimnetz → Netzwerk → Netzwerkeinstellungen → „Zugriff für Anwendungen zulassen" aktiviert sein. Getestet wurde der komplette SOAP-/Digest-Auth-Ablauf gegen einen Mock-Server mit realistischer TR-064-Antwort (korrektes und falsches Passwort); ein Test gegen eine echte FritzBox war in dieser Entwicklungsumgebung nicht möglich (kein Netzwerkzugriff auf lokale Geräte).

Siehe docs/ROADMAP.md für die geplante Reihenfolge.

API-Endpunkte (Stand Commit 2)

GET    /api/health
GET    /api/devices              Liste aller Geräte inkl. ihrer Dienste
GET    /api/devices/:id
POST   /api/devices
PATCH  /api/devices/:id
DELETE /api/devices/:id          (löscht zugehörige Dienste per Cascade)

GET    /api/services             optional ?deviceId=&category=&favorite=true
GET    /api/services/:id
POST   /api/services              erfordert existierende deviceId
PATCH  /api/services/:id
DELETE /api/services/:id

GET    /api/categories
POST   /api/categories
PATCH  /api/categories/reorder    Body: [{ id, order }, ...]
PATCH  /api/categories/:id        Umbenennen
DELETE /api/categories/:id        Dienste behalten ihre category nicht mehr (null),
                                   werden aber nicht gelöscht

POST   /api/scan/devices/:id      Netzwerk-Scan für ein Gerät (DNS, Ports, Titel,
                                   Favicon, Softwareerkennung); legt/aktualisiert Dienste
POST   /api/scan/fritzbox         Liest Geräteliste der FritzBox per TR-064
                                   (erfordert FRITZBOX_HOST/USERNAME/PASSWORD)

Deployment auf dem Server (xlc-launchpad)

cd /opt/LaunchPad
git pull
docker compose up -d --build

Branching

Entwicklung erfolgt ausschließlich auf dev. main bleibt der stabile Branch.