Kapitel 13/Tutorial.md aktualisiert
This commit is contained in:
@@ -61,165 +61,166 @@ Damit ist das Fundament gelegt: Der LXC ist vorbereitet, das System auf Stand, u
|
||||
|
||||
---
|
||||
|
||||
## Abschnitt 2 – Clipper‑LXC einrichten (Basisdienste & Service‑Skelett)
|
||||
## Abschnitt 2 – Clipper-LXC einrichten (Basisdienste & Service-Skelett)
|
||||
|
||||
Ziel: Der LXC enthält alles Nötige, damit n8n ihn bei Bedarf starten kann und klare Einstiegspunkte zum **Analysieren** und **Schneiden** vorhanden sind. Die eigentliche Logik füllen wir später (Abschnitt 4/5) – jetzt legen wir nur das **saubere Gerüst** an.
|
||||
In diesem Abschnitt bereiten wir den Container so vor, dass der Benutzer **clipper** alle Arbeiten übernimmt. Root wird nur für die Installation und Systemaufgaben genutzt. Danach wechseln wir bewusst in die Session von **clipper** und arbeiten dort weiter. So bleibt das System sauber getrennt und sicher.
|
||||
|
||||
---
|
||||
|
||||
### Schritt 1: Benutzer und Verzeichnisse anlegen
|
||||
Zuerst legen wir den Benutzer `clipper` an und bereiten die Arbeitsverzeichnisse vor.
|
||||
|
||||
### 2.1 Service‑Benutzer & Verzeichnisse
|
||||
```bash
|
||||
# Systemnutzer ohne Login
|
||||
useradd --system --create-home --shell /usr/sbin/nologin clipper
|
||||
adduser clipper
|
||||
# Passwort vergeben und die Standardfragen beantworten
|
||||
|
||||
mkdir -p /srv/clipper/{watch,out,temp,logs,bin}
|
||||
chown -R clipper:clipper /srv/clipper
|
||||
|
||||
# Ort für Konfiguration/Secrets
|
||||
mkdir -p /etc/clipper
|
||||
chmod 750 /etc/clipper
|
||||
```
|
||||
|
||||
### 2.2 Pakete installieren
|
||||
```bash
|
||||
apt update && apt install -y ffmpeg jq python3 python3-venv curl unzip inotify-tools
|
||||
chmod 750 /srv/clipper
|
||||
```
|
||||
|
||||
> **Warum diese Pakete?**
|
||||
> **ffmpeg** für Analyse/Schnitt, **jq** für JSON‑Handling, **python3/venv** für optionale Analyse‑Hilfen (z. B. Szenen/Facedetect in Abschnitt 4), **inotify-tools** für eventuelle lokale Hooks.
|
||||
Damit ist der Benutzer angelegt und besitzt alle notwendigen Verzeichnisse.
|
||||
|
||||
---
|
||||
|
||||
### Schritt 2: Notwendige Pakete installieren
|
||||
Als root installieren wir die benötigten Pakete.
|
||||
|
||||
### 2.3 Konfiguration (env)
|
||||
```bash
|
||||
nano /etc/clipper/clipper.env
|
||||
apt update && apt install -y ffmpeg jq python3 python3-venv curl unzip inotify-tools sudo
|
||||
```
|
||||
Inhalt (minimal, erweiterbar in späteren Abschnitten):
|
||||
|
||||
- **ffmpeg**: Kernwerkzeug für Analyse und Schnitt
|
||||
- **jq**: JSON-Handling
|
||||
- **python3/venv**: Virtuelle Umgebung für spätere Analyse-Tools
|
||||
- **inotify-tools**: optional für lokale Hooks
|
||||
- **sudo**: erlaubt clipper bei Bedarf Systembefehle auszuführen
|
||||
|
||||
---
|
||||
|
||||
### Schritt 3: Benutzer clipper für sudo freischalten
|
||||
Damit `clipper` bei Bedarf Befehle mit Administratorrechten ausführen kann, geben wir ihm Zugang zur Gruppe **sudo**.
|
||||
|
||||
```bash
|
||||
usermod -aG sudo clipper
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Schritt 4: In die Session des Benutzers clipper wechseln
|
||||
Ab hier arbeiten wir direkt als Benutzer `clipper`.
|
||||
|
||||
```bash
|
||||
su - clipper
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Schritt 5: Konfigurationsdatei anlegen
|
||||
Wir erstellen die Umgebungsvariablen-Datei, die später von allen Skripten genutzt wird.
|
||||
|
||||
```bash
|
||||
nano /srv/clipper/clipper.env
|
||||
```
|
||||
Inhalt:
|
||||
```
|
||||
CLIPPER_IN=/srv/clipper/watch
|
||||
CLIPPER_OUT=/srv/clipper/out
|
||||
CLIPPER_TMP=/srv/clipper/temp
|
||||
CLIPPER_LOG=/srv/clipper/logs/clipper.log
|
||||
# Standard-Exportformate; Details folgen in Abschnitt 5/6
|
||||
EXPORT_VARIANTS="16x9,9x16"
|
||||
```
|
||||
|
||||
Speichern mit **Strg+O**, bestätigen mit **Enter**, beenden mit **Strg+X**.
|
||||
|
||||
---
|
||||
|
||||
### Schritt 6: Virtuelle Python-Umgebung vorbereiten
|
||||
Noch immer als Benutzer `clipper` legen wir die virtuelle Umgebung an und installieren die ersten Pakete.
|
||||
|
||||
```bash
|
||||
python3 -m venv /srv/clipper/.venv
|
||||
source /srv/clipper/.venv/bin/activate
|
||||
pip install --upgrade pip
|
||||
pip install numpy opencv-python-headless
|
||||
```
|
||||
|
||||
Damit ist die Grundlage für spätere Analysen geschaffen. KI und STT binden wir später in Abschnitt 4 ein.
|
||||
|
||||
---
|
||||
|
||||
### Schritt 7: Einstiegsskripte erstellen
|
||||
Jetzt erstellen wir die beiden Einstiegspunkte `clipper-analyze` und `clipper-cut`. Sie liegen im Verzeichnis `/srv/clipper/bin/` und dienen n8n als Schnittstelle.
|
||||
|
||||
**Analyse-Skript**
|
||||
```bash
|
||||
nano /srv/clipper/bin/clipper-analyze
|
||||
```
|
||||
Inhalt:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
ENV_FILE="/srv/clipper/clipper.env"; [ -r "$ENV_FILE" ] || { echo "ENV nicht lesbar: $ENV_FILE" >&2; exit 1; }; source "$ENV_FILE"
|
||||
IN="$1"
|
||||
JOBID="${2:-manual}"
|
||||
mkdir -p "$CLIPPER_TMP/$JOBID"
|
||||
echo "$(date '+%F %T') [ANALYZE] job=$JOBID file=$IN" | tee -a "$CLIPPER_LOG"
|
||||
OUT_JSON="$CLIPPER_TMP/$JOBID/candidates.json"
|
||||
echo '[]' > "$OUT_JSON"
|
||||
echo "$OUT_JSON"
|
||||
```
|
||||
|
||||
**Schnitt-Skript**
|
||||
```bash
|
||||
nano /srv/clipper/bin/clipper-cut
|
||||
```
|
||||
Inhalt:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
ENV_FILE="/srv/clipper/clipper.env"; [ -r "$ENV_FILE" ] || { echo "ENV nicht lesbar: $ENV_FILE" >&2; exit 1; }; source "$ENV_FILE"
|
||||
IN="$1"
|
||||
RANGES_JSON="$2"
|
||||
JOBID="${3:-manual}"
|
||||
mkdir -p "$CLIPPER_OUT/$JOBID"
|
||||
echo "$(date '+%F %T') [CUT] job=$JOBID file=$IN ranges=$RANGES_JSON" | tee -a "$CLIPPER_LOG"
|
||||
exit 0
|
||||
```
|
||||
|
||||
Speichern beide Male mit **Strg+O**, bestätigen mit **Enter**, beenden mit **Strg+X**.
|
||||
|
||||
Rechte setzen:
|
||||
```bash
|
||||
chown root:clipper /etc/clipper/clipper.env
|
||||
chmod 640 /etc/clipper/clipper.env
|
||||
```
|
||||
|
||||
### 2.4 Python-Umgebung vorbereiten (für Analyse-Tools, Abschnitt 4)
|
||||
```bash
|
||||
# Virtuelle Umgebung als Benutzer "clipper" anlegen
|
||||
runuser -u clipper -- python3 -m venv /srv/clipper/.venv
|
||||
runuser -u clipper -- /srv/clipper/.venv/bin/pip install --upgrade pip
|
||||
# Pakete für spätere Analyse; konkrete Libs folgen in Abschnitt 4
|
||||
runuser -u clipper -- /srv/clipper/.venv/bin/pip install numpy opencv-python-headless
|
||||
```
|
||||
> Hinweis: Wir arbeiten im LXC als root, deshalb **kein `sudo`** – stattdessen `runuser -u clipper -- …`.
|
||||
|
||||
### 2.5 Entrypoints (noch „stubs“)
|
||||
Wir erstellen zwei **CLI-Einstiegspunkte**, die n8n aufruft. Sie tun jetzt noch nichts Schweres – nur Validierung & Logging. Die echte Logik folgt in Abschnitt 4/5.
|
||||
|
||||
**Analyse-Stub**
|
||||
```bash
|
||||
nano /srv/clipper/bin/clipper-analyze
|
||||
```
|
||||
Inhalt:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
source /etc/clipper/clipper.env
|
||||
IN="$1" # absolute Datei
|
||||
JOBID="${2:-manual}"
|
||||
mkdir -p "$CLIPPER_TMP/$JOBID"
|
||||
echo "$(date '+%F %T') [ANALYZE] job=$JOBID file=$IN" | tee -a "$CLIPPER_LOG"
|
||||
# Platzhalter: Wir erzeugen vorerst nur eine leere Kandidatenliste
|
||||
OUT_JSON="$CLIPPER_TMP/$JOBID/candidates.json"
|
||||
echo '[]' > "$OUT_JSON"
|
||||
echo "$OUT_JSON"
|
||||
```
|
||||
|
||||
**Schneid-Stub**
|
||||
```bash
|
||||
nano /srv/clipper/bin/clipper-cut
|
||||
```
|
||||
Inhalt:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
source /etc/clipper/clipper.env
|
||||
IN="$1" # absolute Datei
|
||||
RANGES_JSON="$2" # Zeitbereiche (kommt später aus Abschnitt 4)
|
||||
JOBID="${3:-manual}"
|
||||
mkdir -p "$CLIPPER_OUT/$JOBID"
|
||||
echo "$(date '+%F %T') [CUT] job=$JOBID file=$IN ranges=$RANGES_JSON" | tee -a "$CLIPPER_LOG"
|
||||
# Platzhalter: noch kein Schnitt; wir protokollieren nur
|
||||
exit 0
|
||||
``` Entrypoints (noch „stubs“)
|
||||
Wir erstellen zwei **CLI‑Einstiegspunkte**, die n8n aufruft. Sie tun jetzt noch nichts Schweres – nur Validierung & Logging. Die echte Logik folgt in Abschnitt 4/5.
|
||||
|
||||
**Analyse‑Stub**
|
||||
```bash
|
||||
nano /srv/clipper/bin/clipper-analyze
|
||||
```
|
||||
Inhalt:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
source /etc/clipper/clipper.env
|
||||
IN="$1" # absolute Datei
|
||||
JOBID="${2:-manual}"
|
||||
mkdir -p "$CLIPPER_TMP/$JOBID"
|
||||
echo "$(date '+%F %T') [ANALYZE] job=$JOBID file=$IN" | tee -a "$CLIPPER_LOG"
|
||||
# Platzhalter: Wir erzeugen vorerst nur eine leere Kandidatenliste
|
||||
OUT_JSON="$CLIPPER_TMP/$JOBID/candidates.json"
|
||||
echo '[]' > "$OUT_JSON"
|
||||
echo "$OUT_JSON"
|
||||
```
|
||||
|
||||
**Schneid‑Stub**
|
||||
```bash
|
||||
nano /srv/clipper/bin/clipper-cut
|
||||
```
|
||||
Inhalt:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
source /etc/clipper/clipper.env
|
||||
IN="$1" # absolute Datei
|
||||
RANGES_JSON="$2" # Zeitbereiche (kommt später aus Abschnitt 4)
|
||||
JOBID="${3:-manual}"
|
||||
mkdir -p "$CLIPPER_OUT/$JOBID"
|
||||
echo "$(date '+%F %T') [CUT] job=$JOBID file=$IN ranges=$RANGES_JSON" | tee -a "$CLIPPER_LOG"
|
||||
# Platzhalter: noch kein Schnitt; wir protokollieren nur
|
||||
exit 0
|
||||
```
|
||||
|
||||
Ausführbar machen:
|
||||
```bash
|
||||
chmod +x /srv/clipper/bin/clipper-*
|
||||
chown -R clipper:clipper /srv/clipper/bin
|
||||
```
|
||||
|
||||
### 2.6 Direktaufruf (ohne systemd)
|
||||
Um Fehler durch fehlende Parameter zu vermeiden, verzichten wir fürs Job-Handling auf systemd-Templates. **n8n ruft die Skripte direkt** auf (per SSH „Execute Command“). So übergeben wir Dateipfad & JOBID explizit.
|
||||
---
|
||||
|
||||
**Beispiele:**
|
||||
### Schritt 8: Skripte testen
|
||||
Wir testen die beiden Einstiegspunkte.
|
||||
|
||||
**Analyse-Test:**
|
||||
```bash
|
||||
# Analyse starten (Pfad anpassen)
|
||||
runuser -u clipper -- /srv/clipper/bin/clipper-analyze \
|
||||
"/srv/clipper/watch/demo.mp4" "job-001"
|
||||
|
||||
# Schneiden mit zuvor ermittelten Bereichen
|
||||
runuser -u clipper -- /srv/clipper/bin/clipper-cut \
|
||||
"/srv/clipper/watch/demo.mp4" "/srv/clipper/temp/job-001/ranges.json" "job-001"
|
||||
/srv/clipper/bin/clipper-analyze /srv/clipper/watch/demo.mp4 job-001
|
||||
```
|
||||
|
||||
**Prüfen:**
|
||||
**Schnitt-Test:**
|
||||
```bash
|
||||
/srv/clipper/bin/clipper-cut /srv/clipper/watch/demo.mp4 /srv/clipper/temp/job-001/ranges.json job-001
|
||||
```
|
||||
|
||||
Logs prüfen:
|
||||
```bash
|
||||
tail -n 50 /srv/clipper/logs/clipper.log
|
||||
```
|
||||
→ Du solltest die [ANALYZE] bzw. [CUT] Zeilen mit Job-ID sehen.
|
||||
|
||||
### 2.7 Log-Rotation Log‑Rotation
|
||||
---
|
||||
|
||||
### Schritt 9: Logrotation einrichten
|
||||
Zum Abschluss richten wir die automatische Log-Rotation ein. Dafür wechseln wir kurz zurück zu root.
|
||||
|
||||
```bash
|
||||
exit # zurück zu root
|
||||
nano /etc/logrotate.d/clipper
|
||||
```
|
||||
Inhalt:
|
||||
@@ -235,4 +236,9 @@ Inhalt:
|
||||
}
|
||||
```
|
||||
|
||||
Damit ist der **Clipper‑LXC** vorbereitet: Benutzer, Verzeichnisse, Pakete, Konfiguration und Systemd‑Skelett sind vorhanden. In den nächsten Abschnitten hängen wir **Twitch/n8n** an, füllen die **Analyse‑Logik** (inkl. Facecam/Hochformat/Untertitel‑Option) und implementieren das **Schneiden** samt sauberer Ablage in Nextcloud.
|
||||
---
|
||||
|
||||
**Ergebnis Abschnitt 2:**
|
||||
- Benutzer **clipper** ist vollständig eingerichtet und übernimmt die Arbeit.
|
||||
- Skripte `clipper-analyze` und `clipper-cut` laufen fehlerfrei in seiner Session.
|
||||
- n8n kann später direkt als Benutzer `clipper` per SSH einsteigen und die Skripte aufrufen.
|
||||
|
||||
Reference in New Issue
Block a user