Files
SkillSpector-Web/README.md
T

3.7 KiB
Raw Blame History

SkillSpector Web – Setup-Anleitung

Web-Oberfläche für SkillSpector, gehärtet für den Betrieb auf einem eigenen Server via Portainer.

1. Repository in Gitea anlegen

  1. Neues Repo z. B. unter git.obraasch.de/olli1986/skillspector-web anlegen.
  2. Diese vier Dateien hochladen/pushen: Dockerfile, requirements.txt, app.py, docker-compose.yml.
  3. Nicht committen: Passwörter oder API-Keys – die kommen später als Umgebungsvariablen in Portainer, nie ins Repo.

2. Stack in Portainer anlegen

  1. Stacks → Add stack
  2. Build method: Repository
    • Repository URL: https://git.obraasch.de/olli1986/skillspector-web
    • Reference: refs/heads/main
    • Compose path: docker-compose.yml
  3. Environment variables (im Portainer-UI, nicht im Repo):
    • WEBUI_USER = z. B. admin
    • WEBUI_PASSWORD = ein starkes Passwort
    • optional ANTHROPIC_API_KEY, falls du später LLM-Analyse willst
  4. Deploy the stack

Ohne gesetztes WEBUI_PASSWORD verweigert die WebUI jeden Zugriff (Absicherung gegen offen erreichbare Instanzen).

3. Automatische Updates einrichten

Der Trick: Im Dockerfile ist SkillSpector ohne Versions-Pin installiert (git+https://github.com/NVIDIA/skillspector.git). Jeder Rebuild des Images holt also automatisch den aktuellen main-Branch. Damit das regelmäßig passiert, ohne dass du selbst etwas anfassen musst:

  1. Stack öffnen → Abschnitt GitOps updates

  2. Enable GitOps updates aktivieren

  3. Mechanismus: Polling, Intervall z. B. 24h

  4. Force redeployment UND Re-pull image / rebuild aktivieren

    → Auch wenn sich in deinem Repo nichts ändert, baut Portainer das Image alle 24h neu und zieht damit automatisch die neueste SkillSpector-Version.

  5. Speichern.

Falls deine Portainer-Version "Force redeployment" beim reinen Repository-Build nicht anbietet: alternativ einfach den Stack alle paar Wochen manuell über "Pull and redeploy" neu bauen – dauert 10 Sekunden und holt ebenfalls die neueste Version.

4. Öffentlich erreichbar machen (optional)

Der Container bindet bewusst nur an 127.0.0.1:8000, ist also von außen gar nicht erreichbar. Wenn du ihn z. B. unter skillspector.obraasch.de nutzen willst, richte in CloudPanel einen Reverse Proxy auf 127.0.0.1:8000 ein – mit TLS (Let's Encrypt) und idealerweise IP-Beschränkung, da die App zusätzlich zur Basic-Auth Angriffsfläche für einen Web-Client darstellt (auch wenn sie selbst sehr klein ist).

5. Warum das deinen Server nicht gefährden kann

  • Kein Docker-Socket-Mount – der Container kann keine anderen Container oder den Host steuern.
  • read_only: true – das Root-Dateisystem im Container ist unveränderlich, nur /tmp und das Scan-Verzeichnis sind (flüchtiger) RAM-Speicher (tmpfs).
  • cap_drop: ALL und no-new-privileges – keine erweiterten Linux-Rechte.
  • Ressourcenlimits (mem_limit, cpus) – ein hängender oder böswilliger Scan kann den restlichen Server nicht in die Knie zwingen.
  • SkillSpector führt den gescannten Skill nie aus – nur statische Analyse (Regex/AST/YARA) plus optionale LLM-Bewertung von Dateiinhalten.
  • --no-llm ist Standard – ohne dein explizites Häkchen verlässt kein gescannter Dateiinhalt den Container.
  • Jeder Scan läuft in einem eigenen Temp-Ordner, der danach gelöscht wird.

Nutzung

WebUI öffnen (z. B. http://<server>:8000 lokal oder deine Subdomain), Basic-Auth eingeben, Git-URL des Skills eintragen oder ZIP hochladen, "Scan starten" klicken. Das Ergebnis zeigt Risk Score, Severity und Empfehlung (SAFE / CAUTION / DO_NOT_INSTALL) sowie den vollständigen JSON-Report.