# SkillSpector Web – Setup-Anleitung Web-Oberfläche für [SkillSpector](https://github.com/NVIDIA/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://: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.