Zum Inhalt

Open Terminal

Stand: 2026-05-28

Zweck

Open Terminal stellt Open WebUI eine isolierte Terminal- und Datei-Werkzeugumgebung bereit. Der Dienst ist bewusst als eigener LXC gebaut und nicht auf dem Proxmox-Host oder im Open-WebUI-LXC selbst installiert.

Container

  • Proxmox CTID: 255
  • Hostname: open-terminal
  • IP: 10.222.70.13/24
  • Gateway: 10.222.70.1
  • Bridge: vmbr0
  • Storage: local-zfs
  • OS: Debian 13
  • Typ: unprivileged LXC
  • Ressourcen: 2 vCPU, 4096 MiB RAM, 1024 MiB Swap, 32 GB Disk
  • Features: keyctl=1,nesting=1
  • Tags: ai;open-terminal;openwebui
  • Autostart: aktiv

Laufzeit

  • Dienst im LXC: open-terminal.service
  • Container Runtime: Docker innerhalb des isolierten LXC
  • Image: ghcr.io/open-webui/open-terminal:latest
  • Open Terminal Version: 0.11.34
  • Interne Ports: 8001 bis 8004
  • Healthcheck je Container: http://10.222.70.13:<port>/health
  • Datenvolumes: je User eigenes Docker Volume
  • Max Sessions je Container: 8
  • CPU-/RAM-Limit je Docker-Container: 1.5 CPU, 2 GB RAM
  • Container-Prozess läuft im Image als User user mit UID/GID 1000:1000.

User-Isolation

Jeder bekannte Open-WebUI-User hat einen eigenen Open-Terminal-Container mit eigenem Docker-Volume und eigenem Bearer Token.

User Container Port Volume Open-WebUI Connection
Maximilian Eberhardt open-terminal-maximilian-eberhardt 8001 open-terminal-maximilian-eberhardt-data lanstyle-open-terminal-maximilian-eberhardt
Armin Harjung open-terminal-armin-harjung 8002 open-terminal-armin-harjung-data lanstyle-open-terminal-armin-harjung
Kevin Hartmann open-terminal-kevin-hartmann 8003 open-terminal-kevin-hartmann-data lanstyle-open-terminal-kevin-hartmann
Arne Biernath open-terminal-arne-biernath 8004 open-terminal-arne-biernath-data lanstyle-open-terminal-arne-biernath

Warum Docker im LXC?

Open Terminal wird offiziell als Container ausgeliefert. Der zusätzliche Docker-Layer läuft nicht auf dem Proxmox-Host, sondern in einem eigenen unprivilegierten LXC.

Vorteile dieser Struktur:

  • Open Terminal bleibt von Open WebUI, Gitea, Wiki und Proxmox getrennt.
  • Es gibt keine Host-Mounts, keinen Docker-Socket vom Proxmox-Host und keine privaten SSH-Keys im Terminal-Container.
  • Updates folgen dem offiziellen Open-WebUI/Open-Terminal-Image.
  • Ein kompromittiertes Terminal landet zuerst im Docker-Container und danach immer noch im isolierten LXC, nicht direkt auf dem Host.

Open WebUI Integration

Open WebUI wurde mit vier usergebundenen Terminal-Server-Verbindungen konfiguriert:

  • OpenAPI Spec: /openapi.json
  • Auth: Bearer Token
  • Zugriff: access_grants jeweils auf genau eine Open-WebUI-User-ID

Die Bearer Tokens liegen nur auf den Systemen und werden nicht in Git oder Markdown dokumentiert.

Aktiver Zielpfad seit VLAN70-only-Cleanup: Open WebUI nutzt die Open-Terminal-Container über 10.222.70.13:8001-8004. Der frühere Legacy-Pfad 10.0.1.253:8001-8004 ist nicht mehr produktiv aktiv und bleibt nur noch in historischen Audit-/Rollback-Kontexten erwähnt.

Sicherheit

  • Kein Reverse Proxy und keine öffentliche Domain für Open Terminal.
  • Zugriff nur intern über Open WebUI.
  • API-Keys nicht in Git, Wiki oder Skripten speichern.
  • Aktive API-Key-Dateien unter /root/open-terminal/**/api_key sind auf 0400 1000:1000 gesetzt, damit nur der Open-Terminal-Container-User sie lesen kann.
  • Keine privaten SSH-Keys in den Terminal-Container kopieren.
  • Keine Host-Verzeichnisse in den Terminal-Container mounten.
  • Keine Docker-Socket-Mounts verwenden.
  • Bei neuen Open-WebUI-Usern neuen Container, neues Volume, neuen Token und eigene access_grants anlegen.
  • Terminal-Nutzung regelmäßig prüfen, weil die Funktion bewusst mächtig ist.

Backup und Update

Aktiv seit 2026-05-25:

  • Backup-Script: /usr/local/sbin/open-terminal-backup
  • Update-Script: /usr/local/sbin/open-terminal-update
  • Backup-Timer: open-terminal-backup.timer
  • Update-Timer: open-terminal-update.timer
  • Backup-Ziel: /root/open-terminal-backups
  • Rotation: 14 Tage

Backup-Inhalt:

  • /etc/systemd/system/open-terminal.service
  • /root/open-terminal
  • Docker-Containerstatus
  • Docker-Image-Metadaten
  • je Open-Terminal-User ein komprimiertes Docker-Volume-Archiv

Update-Ablauf:

  1. Backup ausführen.
  2. Image ghcr.io/open-webui/open-terminal:latest pullen.
  3. open-terminal.service neu starten.
  4. Healthchecks auf Ports 8001 bis 8004 prüfen.

Erster manueller Backup-Test:

  • Status: erfolgreich
  • Beispielpfad: /root/open-terminal-backups/20260525-153939

Erster manueller Update-Test:

  • Status: erfolgreich nach retry-fähigem Healthcheck
  • Image-Digest unverändert, Image war aktuell
  • Ports 8001 bis 8004 liefern nach Restart HTTP 200

Token-Rotation und Secret-Backups

Prüfung am 2026-05-25:

  • Vor der Rotation wurde die aktive Open-Terminal-Konfiguration gesichert.
  • Rotation ausgeführt am 2026-05-25.
  • Backup der Rotation: /root/backups/20260525-191529-open-terminal-token-rotation
  • Open-WebUI-DB-Backup vor Token-Aktualisierung: /root/ai-stack-backups/20260525-191529-resume-open-terminal-token-rotation/webui.db
  • Die neuen Tokens wurden in Open WebUI unter terminal_server.connections aktualisiert.
  • Open Terminal und Open WebUI wurden kontrolliert neu gestartet.
  • Open WebUI initialisiert nach der Rotation wieder 4 Terminal-Server.
  • Ports 8001 bis 8004 liefern HTTP 200 auf /health.
  • /openapi.json wurde je User mit dem neuen Bearer Token erfolgreich getestet.

Entschärfung alter Backup-Kopien:

  • Alle gefundenen api_key-Dateien unter /root/open-terminal-backups und /root/backups wurden auf 0600 root:root gesetzt.
  • Zusätzlich wurde die sensible Datei new-token-map.json im Rotationsbackup auf 0600 root:root gesetzt.
  • Nachprüfung: keine api_key- oder new-token-map.json-Datei mit abweichenden Rechten gefunden.
  • Berechtigungsliste vor/nach der Entschärfung: /root/backups/20260525-171832-open-terminal-backup-secret-perms

Hinweis: Backup-Kopien wurden nicht gelöscht. Sie sind jetzt nicht mehr weltlesbar, enthalten aber weiterhin historische Tokenstände. Durch die Rotation sind diese Alt-Tokens für den laufenden Dienst nicht mehr gültig.

Prüfungen

pct status 255
pct config 255
pct exec 255 -- systemctl status open-terminal --no-pager
pct exec 255 -- systemctl list-timers --all | grep open-terminal
pct exec 255 -- docker ps --filter name=open-terminal
curl http://10.222.70.13:8001/health
curl http://10.222.70.13:8002/health
curl http://10.222.70.13:8003/health
curl http://10.222.70.13:8004/health

Aus dem Open-WebUI-LXC geprüft:

curl http://10.222.70.13:8001/health
curl http://10.222.70.13:8002/health
curl http://10.222.70.13:8003/health
curl http://10.222.70.13:8004/health