Zum Inhalt

Targets und Bereitstellungsziele

BaseHarbor trennt wo eine Anwendung betrieben wird von was sie benötigt und welche Umgebung ausgewählt ist.

Eine konkrete Bereitstellungsidentität ist:

target + application + environment

Beispiele:

docker-dev / demo     / dev
podman-dev / demo     / dev
laptop-k3s / demo     / dev
prod-ocp   / mailflow / prod

Das Target-Modell

Ein BaseHarbor Target ist ein benanntes Deployment-Ziel.

Target
├── Runtime Provider
├── Runtime Access Reference
└── Target Scope

Die Begriffe bleiben getrennt:

Target
  where BaseHarbor operates

Runtime Provider
  which runtime implementation realizes workloads

Access
  how BaseHarbor reaches/authenticates to that runtime

Scope
  which logical area inside that runtime is selected

Ein Target-Name trägt keine Runtime-Semantik. Ein Target bedeutet weder automatisch lokal/entfernt noch Docker/Podman/Kubernetes/OpenShift.

K3s, k3d, kind, minikube, MicroK8s und aehnliche Distributionen sind Kubernetes-Targets und keine eigenen BaseHarbor Runtime Provider.

Beispiele:

Target              Provider      Access          Scope
------------------------------------------------------------
docker-dev          docker        local-docker    default
podman-dev          podman        local-podman    default
laptop-k3s          kubernetes    laptop-k3s      dev
homelab-k3s         kubernetes    homelab         dev
homelab-k3s-test    kubernetes    homelab         test
customer-prod       openshift     customer-a      project-x

Mehrere Targets dürfen dieselbe Zugriffsdefinition verwenden und unterschiedliche Bereiche wählen.

Repository und installierter BaseHarbor-Zustand

Das Repository bleibt die maßgebliche Quelle für die portable Anwendungsanforderung:

baseharbor.yaml
envs/<environment>/baseharbor.yaml

Das aktuelle Verzeichnis darf beim Erkennen von Anwendung und Umgebung helfen, aber niemals festlegen, welche Bereitstellungen die installierte BaseHarbor-Instanz kennt.

Konfiguration und Target-Zustand

Die Benutzerkonfiguration ist global:

cwd may answer "which application do I mean?"
cwd must not answer "which applications does BaseHarbor know?"

Sie enthaelt Target-Definitionen, Zugriffsdefinitionen, Vorgaben und Prompt-Präferenzen. Auch Target-eigene Provider-Lifecycle-Referenzen koennen hier liegen; fuer managed OpenBao speichert der optionale Eintrag target.openbao.recovery-file nur den absoluten Pfad zur vom Betreiber verwahrten Wiederherstellungsdatei, niemals das Recovery-Material selbst.

Veränderlicher Runtime-/Bereitstellungszustand ist Target-bezogen:

$XDG_CONFIG_HOME/baseharbor/config.yaml
~/.config/baseharbor/config.yaml

Damit koennen Docker-, Podman- und lokale Kubernetes/K3s-Targets unabhaengig parallel existieren, ohne versehentlich denselben BaseHarbor-State zu teilen. Gemeinsam genutzte Provider gehören zum Target-/Provider-Lebenszyklus und nicht zu einer einzelnen Anwendung. Insbesondere duerfen Löschen oder Umbenennen einer Anwendung weder die Target-weite OpenBao-Recovery-Referenz noch die gemeinsam genutzte OpenBao-Provider-Instanz entfernen.

Ein lokales K3s/Kubernetes-Target ist kein Sonderfall: es ist ein Kubernetes-Target, dessen Access-Definition einen lokalen Cluster erreicht.

Target-Auswahl

Das effektive Target wird so aufgelöst:

$XDG_DATA_HOME/baseharbor/targets/<target>/
~/.local/share/baseharbor/targets/<target>/

Anwendung und Umgebung bleiben unabhängige Achsen.

Shell-Aktivierung und Prompt-Anzeige

Targets können nur für die aktuelle Shell ähnlich wie eine Python-Umgebung aktiviert werden. Verschiedene Terminals koennen dadurch gleichzeitig unterschiedliche Targets verwenden.

Die optionale Prompt-Anzeige macht das Target sichtbar, bevor ein baha-Befehl eingegeben wird:

~/.local/share/baseharbor/
└── targets/
    ├── docker-dev/
    │   ├── runtime/
    │   ├── provider-registry.json
    │   └── deployments/
    ├── podman-dev/
    │   ├── runtime/
    │   ├── provider-registry.json
    │   └── deployments/
    └── laptop-k3s/
        ├── runtime/
        ├── provider-registry.json
        └── deployments/

Darstellung, Position, Farben und Barrierefreiheit sind konfigurierbar. Produktion darf niemals nur über Farbe erkennbar sein.

Lifecycle und Sicherheit

Ein Wechsel des aktiven/Standard-Targets verschiebt oder benennt bestehende Deployments niemals um.

Ein Target mit registrierten Deployments oder BaseHarbor-eigenen Runtime-Ressourcen darf nicht implizit geloescht werden.

Mutierende/destruktive Operationen zeigen die volle effektive Identitaet:

application workload   <app>.<dev-domain>
application UI         <app>-<service>.<dev-domain>
shared provider UI     <service>.<dev-domain>
external               provider-owned URL

baha app list liest Target-/Global-State statt repository-lokalen Zustand. baha app list --all-targets liefert die installationsweite Sicht.

CLI, JSON und MCP verwenden dieselbe Target-/Bereitstellungsidentität.

Diese v0.4.15-Foundation wird in Issue #408 umgesetzt und bildet die Grundlage fuer #396 sowie spaetere Kubernetes-/OpenShift-Runtimes.

Frei definierbare Prompt-Beschriftung

Die Prompt-Anzeige ist reine Darstellung und darf vom eigentlichen Target-Namen abweichen.

Beispiel:

explicit --target
        ↓
activated BASEHARBOR_TARGET
        ↓
configured default target
        ↓
first-run/local target selection

Die Beschriftung ist nur ein visueller Alias. Sie verändert weder Target-Identität noch Bereitstellungsschlüssel, Besitz noch Target-Auflösung.

Der Wizard erlaubt deshalb neben Presets auch:

  • freie Prompt-Beschriftung;
  • frei waehlbare Farbe;
  • Position vor oder hinter dem Pfad beziehungsweise als rechter Prompt, wenn unterstützt;
  • Live-Vorschau der exakten Darstellung.

Produktion bleibt standardmäßig auch ohne Farberkennung eindeutig sichtbar.

Tenant-Zuordnung für Connector-Einschreibung

Die vertrauenswürdige Core-Konfiguration eines Connector-Targets benötigt tenant-id als kanonische Tenant-UUID. Die Access-Definition verwendet provider: baseharbor-node-connector und als reference die stabile Node-ID. Nur eine aufgelöste Editor-Mitgliedschaft desselben Tenants darf eine Einschreibungsberechtigung erstellen; Runtime und Zuordnung stammen aus Core. Ein nicht zugeordnetes oder fremdes Target wird abgewiesen.

Die CA wird an ein ausdrücklich ausgewähltes lokales Core-Target gebunden. HTTPS-Einschreibung allein belegt noch keine ausführbare Remote-Verbindung. Der optionale öffentliche BaseHarbor Node Connector implementiert diesen outbound-initiierten Target-Access-Transport für entfernte Nicht-Kubernetes-Hosts. Er ist weder Control Plane noch Runtime Provider und öffnet keinen unauthentifizierten eingehenden Management-Port.

Connector-eigene Tests und CI begründen allein noch keinen BaseHarbor-Supportstatus. Live-Zulassung, Erneuerung, Widerruf und Docker-/Podman-Support erfordern gepinnte Core -> Connector -> Runtime-Evidenz. Details stehen im Target-Access-Vertrag und in der englischen Plattform-Supportmatrix.

Weitere unveränderte technische Beispiele

eval "$(baha target activate docker-dev)"
baha target -o json
baha config prompt
source <(baha shell-init bash)
[homelab] ~/projects/demo $
[prod-ocp PROD] ~/projects/mailflow $
target + application + environment
Target: laptop-docker-12
Prompt label: ld12
Color: soft green

[ld12] ~/projects/demo $

Technische Kennungen: baha.localhost, auth.<domain>, auth-admin.<domain>, secrets.<domain>, metrics.<domain>, baha shell-init zsh, baha shell-init fish.

Isoliertes State-Verzeichnis

BASEHARBOR_STATE_DIR ist der autoritative Datenstamm der isolierten Installation. Target-, Deployment-, Provider- und TLS-State liegen darunter; die Target-Konfiguration liegt darin unter config/config.yaml. Organisationsauswahl und Konfigurationscache liegen unter config/organization/ und cache/organization/; geschützte Operator-Sessions liegen unter cache/sessions/. Eine fremde Installation kann dadurch weder das isolierte Target verändern noch ihren Login bereitstellen. Der Override hat Vorrang vor XDG-Daten- und Konfigurationspfaden. Ein isolierter Test kann dadurch die Target-Auswahl der normalen Benutzerinstallation weder entdecken noch überschreiben. Recovery-Material des Operators liegt im benachbarten <state-root>-recovery/<target>/ und überlebt das Löschen des Installations-State. Explizite Recovery-Pfade bleiben unverändert. Verwende ein eigenes absolutes Verzeichnis und niemals den State einer fremden Installation.