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:
8001bis8004 - 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
usermit UID/GID1000: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_grantsjeweils 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_keysind auf0400 1000:1000gesetzt, 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_grantsanlegen. - 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:
14Tage
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:
- Backup ausführen.
- Image
ghcr.io/open-webui/open-terminal:latestpullen. open-terminal.serviceneu starten.- Healthchecks auf Ports
8001bis8004prü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
8001bis8004liefern nach RestartHTTP 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.connectionsaktualisiert. - Open Terminal und Open WebUI wurden kontrolliert neu gestartet.
- Open WebUI initialisiert nach der Rotation wieder
4Terminal-Server. - Ports
8001bis8004liefernHTTP 200auf/health. /openapi.jsonwurde je User mit dem neuen Bearer Token erfolgreich getestet.
Entschärfung alter Backup-Kopien:
- Alle gefundenen
api_key-Dateien unter/root/open-terminal-backupsund/root/backupswurden auf0600 root:rootgesetzt. - Zusätzlich wurde die sensible Datei
new-token-map.jsonim Rotationsbackup auf0600 root:rootgesetzt. - Nachprüfung: keine
api_key- odernew-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