Konfigurieren einer Landscape
Eine Landscape definiert, wie deine Services bereitgestellt und miteinander verbunden werden. Du kannst Compute Runtimes (Reactives, Managed Containers, Cloud Native Deployments) und Managed Services hinzufügen sowie deren Ressourcen, Netzwerk und Umgebung konfigurieren. Einen tiefergehenden technischen Überblick findest du unter Landscapes & Workspaces.
Jede Konfiguration beginnt im Landscape Config Editor:
- Klicke im Workspace in der Seitenleiste auf Deploy, um die Seite „Deployment and Execution“ zu öffnen, und klicke dann auf Landscape Config Editor.
- Stelle sicher, dass das richtige CI Profile ausgewählt ist (z. B.
defaultoderdev). Falls du eines erstellen musst, siehe Using CI Profiles. - Klicke auf der rechten Seite des Bereichs „Landscape Deployment“ auf + Add New Service und wähle den gewünschten Service-Typ aus.
Von hier aus kannst du deine Landscape über den visuellen Editor konfigurieren oder die Datei ci.yml direkt bearbeiten.
Die Landscape-Config-Oberfläche verhält sich wie ein großes Formular, das deine ci.yml-Datei konfiguriert. Die Konfiguration kann nur auf der obersten Ebene des Formulars gespeichert werden.
Codesphere Reactives
Codesphere Reactives sind Codespheres Flaggschiff-Runtime, am besten beschrieben als zustandsbehaftetes Serverless. Sie kombinieren dauerhaften Dateisystemzugriff mit automatischer Ressourcenfreigabe während Leerlaufzeiten und nahezu sofortigem Start (Millisekunden). Einen ausführlichen Überblick findest du unter Runtimes.
Um ein Reactive hinzuzufügen, wähle Reactive Service aus der Service-Typ-Auswahl und konfiguriere es anhand der folgenden Abschnitte.
Runtime-Konfiguration
- UI
- YAML

Ausführungsschritte
Ausführungsschritte definieren die Befehle, die beim Start deines Services ausgeführt werden. Diese Befehle laufen nacheinander und sollten deinen Anwendungsprozess starten.
So fügst du Ausführungsschritte hinzu:
- Klicke auf + Add Execution Step
- Gib einen Namen für den Schritt ein (z. B. „Start Server“)
- Gib den auszuführenden Befehl ein (z. B.
npm startodernode server.js) - Wiederhole dies, falls weitere Schritte nötig sind
Der letzte Schritt sollte in der Regel ein langlaufender Prozess sein (z. B. ein Webserver). Wenn alle Befehle beendet werden, wird der Service als „unhealthy“ markiert: Der Service läuft zwar noch, seine Pipeline wird aber nicht mehr ausgeführt.
Base-Image-Konfiguration
Reactives verwenden standardmäßig ein gemeinsames, von Codesphere gepflegtes Ubuntu-Base-Image (Codesphere Defaults). Dieses Image ist vorgewärmt und gepoolt, um einen nahezu sofortigen Start (Millisekunden) zu ermöglichen. Du kannst die Runtime-Umgebung anpassen, indem du Abhängigkeiten über Nix installierst. Für fortgeschrittene Anwendungsfälle steht außerdem die Option Custom Base Image zur Verfügung, die als Grundlage für Managed Containers dient.
Mounting-Pfade
Standardmäßig mounten alle Reactive Services das gesamte Verzeichnis /home/user/app aus dem gemeinsamen Netzwerkdateisystem. Über die Einstellung Mounting Paths kannst du einen Service so einschränken, dass nur ein bestimmtes Unterverzeichnis gemountet wird.
Anwendungsfälle für Mount-Unterpfade:
- Isolierung des Dateizugriffs zwischen Services, um versehentliches Überschreiben zu verhindern
- Verbesserung der Sicherheit durch Einschränkung des Dateisystemzugriffs je Service
- Organisation von Multi-Service-Architekturen mit dedizierten Verzeichnissen
Nur Dateien, die unter /home/user/app geschrieben werden, werden im Netzwerkdateisystem persistiert und über alle Services hinweg geteilt. Dateien, die an anderer Stelle geschrieben werden, existieren nur auf der lokalen Festplatte des jeweiligen Pods und sind für andere Services oder Replicas nicht verfügbar. Diese lokalen Dateien gehen außerdem bei Workspace-Neustarts verloren, die z. B. durch Skalierung oder Codesphere-Updates ausgelöst werden können.
run:
my-service:
# Only mounts /home/user/app/uploads
volumeMounts:
- name: _workspace
mountPath: /home/user/app
workspacePath: uploads
steps:
- name: Start Server
command: npm start
- steps: Liste der Ausführungsschritte, jeweils mit
nameundcommand. Die Befehle laufen beim Start des Services nacheinander. - volumeMounts (optional): Beschränkt den Service auf ein Unterverzeichnis von
/home/user/app.
Beispielbefehle:
npm start— Node.js-Anwendunguv run uvicorn main:app --port 3000 --host 0.0.0.0— Python-Anwendung./gradlew bootRun— Spring-Boot-Anwendung
Ressourcen
- UI
- YAML

Jeder Service besitzt einen Resource Plan, der die zugewiesenen vCPUs, den Speicher und den Storage bestimmt. Die verfügbaren Pläne und deren Preise werden vom Cluster-Administrator konfiguriert und können je nach Installation variieren.
So konfigurierst du Ressourcen:
- Wähle aus der Liste einen Plan aus (jeder Plan zeigt seine Zuteilung von vCPU, Speicher und Storage)
- Lege den Availability-Modus fest:
- Always on: Der Service läuft dauerhaft – ideal für Produktions-Workloads
- Off when unused: Der Service stoppt automatisch nach einer Phase der Inaktivität und startet neu, sobald die Domain oder der Workspace aufgerufen wird – ideal für Preview-Deployments oder Entwicklungsumgebungen
- Lege die Anzahl der Default Replicas für horizontale Skalierung über die Steuerelemente
−/+fest
Der Screenshot zeigt unten eine Kostenübersicht mit geschätzten Kosten pro Ressource und den monatlichen Gesamtkosten. Diese ist möglicherweise nicht bei allen Installationen sichtbar.
Details zur Definition und Anpassung von Plänen findest du unter Workspace and Hosting Plans.
Skalierungsstrategien:
| Typ | Beschreibung | Am besten geeignet für |
|---|---|---|
| Vertikale Skalierung | Erhöhung von vCPUs/Speicher durch Auswahl eines höheren Plans | Rechen- oder speicherintensive Workloads |
| Horizontale Skalierung | Mehrere Replicas desselben Services hinzufügen | Bewältigung eines erhöhten Anfragevolumens |
run:
api-server:
plan: 21 # Resource tier (determines CPU/memory)
replicas: 3 # Number of instances
steps:
- name: Start Server
command: node server.js
- plan: Die Ressourcen-Stufe (ID), die CPU- und Speicherzuteilung bestimmt.
- replicas (optional): Anzahl der Service-Instanzen für horizontale Skalierung. Standardwert ist 1.
Für Entwicklungsumgebungen bieten kleinere Pläne mit aktiviertem „Off when unused“ erhebliche Kosteneinsparungen. Reserviere größere Pläne und mehrere Replicas für Produktions-Workloads.
Ports & Routen
- UI
- YAML

Health Check
Standardmäßig pingt der Landscape Router deine Reactive Services auf Port 3000, um deren Zustand zu prüfen. Du kannst einen benutzerdefinierten Health-Endpunkt konfigurieren, z. B. http://localhost:8080/health, falls deine Anwendung einen anderen Port oder Pfad für Health Checks verwendet. Die Anfrage wird zudem innerhalb des Service-Containers ausgeführt, weshalb die Anwendung unter localhost erreichbar sein muss. Ist sie an eine andere Schnittstelle gebunden, gib stattdessen die entsprechende IP-Adresse oder den Hostnamen an.
Für jeden Service muss mindestens eine Route definiert sein. Ohne Route erkennt der Workspace Router den Service nicht – er gilt dann nicht als „healthy“ und ist von außerhalb der Landscape nicht erreichbar.
Konfigurieren von Ports
Dieser Abschnitt definiert die Ports, die dein Service bereitstellt. Für die interne Kommunikation zwischen Services sollten interne Port-URLs verwendet werden, während Ports über den Workspace Router unten öffentlich zugänglich gemacht werden können. Das Routing kann zudem über benutzerdefinierte Domains weiter angepasst werden.
Reactives innerhalb einer Landscape kommunizieren über interne URLs: http://ws-server-[WorkspaceId]-[serviceName].workspaces:[port]. Du kannst die interne URL eines Services über die Schaltfläche Copy auf der rechten Seite kopieren.
So gibst du einen neuen Port frei:
- Klicke rechts auf + Add New Port
- Gib die Port-Nummer ein, auf der deine Anwendung lauscht
- Optional kannst du über das Aktionsmenü (Drei-Punkte-Symbol) in der Portzeile eine Public Port URL freigeben. Dadurch wird direkt eine öffentliche URL für den Port exponiert, die über das Kontextmenü kopiert werden kann. Dies ist weniger sicher als die Verwendung von Path Routing und wird in der Regel nur bei älteren Legacy-Frameworks benötigt.
Workspace Router
Routen ordnen eingehende HTTP-Anfragen anhand von URL-Pfadpräfixen deinen Services zu. Der Router unterstützt zudem eine Strip Path-Option, die das übereinstimmende Präfix entfernt, bevor die Anfrage an deinen Service weitergeleitet wird.
So fügst du eine Route hinzu:
- Klicke auf + Add New Route
- Gib das Path-Präfix ein (z. B.
/,/api,/admin) - Wähle den Port aus, an den der Traffic geleitet werden soll
- Aktiviere optional Strip Path, um das Präfix vor der Weiterleitung zu entfernen
Der Bereich Routing for Other Services unten zeigt Routen, die von anderen Services in derselben Landscape definiert wurden – hilfreich, um Konflikte zu erkennen oder einen Überblick über die gesamte Routing-Tabelle zu erhalten.
run:
backend:
healthEndpoint: http://localhost:8080/health
network:
ports:
- port: 8080
isPublic: false
paths:
- port: 8080
path: /api
steps:
- command: npm run start:backend
- healthEndpoint (optional): Benutzerdefinierte Health-Check-URL. Standardwert ist
http://localhost:3000/. Die Anfrage wird innerhalb des Service-Containers ausgeführt, weshalb die Anwendung unter localhost erreichbar sein muss. Ist sie an eine andere Schnittstelle gebunden, gib stattdessen die entsprechende IP-Adresse oder den Hostnamen an. - network.ports: Liste der Ports, die der Service bereitstellt. Setze
isPublic: true, um eine direkte öffentliche URL bereitzustellen (nicht empfohlen). - network.paths: Ordnet URL-Pfadpräfixe für den Workspace Router den Ports zu.
Beispiel für eine Routing-Konfiguration:
| Pfad | Service | Beschreibung |
|---|---|---|
/ | frontend | Hauptanwendungs-UI |
/api | backend | REST-API-Endpunkte |
/ws | websocket-server | WebSocket-Verbindungen |
Umgebungsvariablen
- UI
- YAML

Mit Umgebungsvariablen kannst du Konfigurationen an deine Services übergeben, ohne Werte fest im Code zu hinterlegen. Sie werden zur Laufzeit injiziert.
So fügst du Umgebungsvariablen hinzu:
- Öffne den Abschnitt Environment Variables in der Service-Konfiguration
- Klicke auf + Add New Variable
- Gib den Key (Variablenname) ein
- Gib den Value ein – entweder als reinen Text oder durch Auswahl aus den Dropdown-Kategorien: User Inputs, Global Values, Secrets, Global Constants, Team ID oder Workspace ID
Weitere Details findest du unter Environment Variables.
run:
my-service:
env:
NODE_ENV: production
SECRET_KEY: ${{ vault.secretFoo }}
DB_PASSWORD: ${{ vault.dbPassword }}
PG_USER: ${{ workspace.env['BACKEND_PG_USER'] }}
- env: Schlüssel-Wert-Paare, die zur Laufzeit als Umgebungsvariablen injiziert werden.
Template-Syntax für Werte:
| Template | Beschreibung |
|---|---|
${{ vault.NAME }} | Referenziert ein Secret aus dem Codesphere-Vault |
${{ workspace.id }} | Wird zur Workspace-ID aufgelöst |
${{ team.id }} | Wird zur Team-ID aufgelöst |
${{ workspace.env['KEY'] }} | Referenziert eine globale Workspace-Umgebungsvariable |
Secrets werden verschlüsselt gespeichert und erst zur Laufzeit injiziert. Details siehe Secret Management.
Managed Containers
Managed Containers basieren im Kern auf Reactives, ermöglichen dir aber, ein eigenes Docker-Image mitzubringen, anstatt das von Codesphere gepflegte Base-Image zu verwenden. Das bedeutet, du erhältst dieselbe Plattform-Orchestrierung, Netzwerk- und Monitoring-Funktionalität, während du einen eigenen Container betreibst. Einen ausführlichen Überblick findest du unter Runtimes.
Um einen Managed Container hinzuzufügen, wähle Managed Container aus der Service-Typ-Auswahl.
- UI
- YAML
Entsprechende barrierefreie Textbeschreibung
Base-Image-Konfiguration:
- Gib die vollständige Image-Referenz ein (z. B.
nginx:1.25-alpine,node:20-slim) - Stelle bei privaten Registries sicher, dass die entsprechenden Zugangsdaten konfiguriert sind
- Setze Startup Args, um bei Bedarf den Standardbefehl des Containers zu überschreiben. Der Entrypoint bleibt der Standard des Images. Wenn du den Entrypoint überschreiben möchtest, musst du stattdessen Codesphere Reactives verwenden und dein Image als Custom Base Image einsetzen.
- Setze Mounting Paths (
volumeMounts), um zu steuern, welche Verzeichnisse oder Dateien aus dem Workspace in den Container gemountet werden und wohin.
Run As User/Group:
- Setze die User ID (
runAsUser), um festzulegen, unter welchem Benutzerkonto der Service innerhalb des Containers läuft. - Setze die Group ID (
runAsGroup), um festzulegen, zu welcher Benutzergruppe der Service innerhalb des Containers gehört. - Diese Einstellungen steuern den Dateizugriff und die Berechtigungen auf Prozessebene und sollten den Besitzverhältnissen deiner Anwendung und der gemounteten Dateien entsprechen.
Der Zugriffslevel auf das Workspace-Dateisystem hängt davon ab, welche User ID oder Group ID hier festgelegt wird:
- Bei Verwendung der User ID
1501erhält der Container-Prozess denselben Lese-/Schreibzugriff auf die Workspace-Dateien. - Bei Verwendung einer anderen User ID erhält der Container-Prozess Lesezugriff auf alle Dateien sowie Schreibzugriff auf das Root-Verzeichnis des gemounteten Volumes, jedoch nicht auf Unterverzeichnisse.
- Unabhängig von der konfigurierten Group ID fügt Codesphere für das Workspace-FS direkt die GID
1010hinzu. Die definierte GID beeinflusst die Besitzergruppe der von deinen Services erstellten Dateien. - Du kannst den Schreibzugriff auf ein bestimmtes Unterverzeichnis für die Group ID setzen, indem du im Prepare-Stage
chmod g+w some-dirausführst.
Managed Containers haben Startzeiten im Sekundenbereich (im Vergleich zu Millisekunden bei Reactives), bedingt durch das Pullen und Initialisieren des Images. Die tatsächliche Geschwindigkeit hängt von der Image-Größe und der Netzwerkperformance zur Registry ab.
Alle weiteren Konfigurationsoptionen (Ressourcen, Ports, Routen, Umgebungsvariablen) funktionieren genauso wie bei Codesphere Reactives – siehe die obigen Abschnitte.
run:
alpine-image:
image: alpine:latest
steps:
- name: Run Alpine
command: echo "Hello from Alpine!"
plan: 21
network:
ports:
- port: 80
isPublic: false
paths:
- port: 80
path: /
nginx-server:
image: nginx-unprivileged:1.25-alpine
command: ["-g", "daemon off;"]
plan: 21
healthEndpoint: http://localhost/
network:
ports:
- port: 80
isPublic: false
paths:
- port: 80
path: /
env:
NGINX_HOST: example.com
volumeMounts:
- name: _workspace
mountPath: /etc/nginx/nginx.conf
workspacePath: custom-nginx.conf
runAsUser: 1000
runAsGroup: 1000
- image: Das zu verwendende Docker-Image (z. B.
nginx-unprivileged:1.25-alpine,node:20-slim,myregistry.com/repo/myimage:tag). - runAsUser / runAsGroup (optional): Legt die User- und Group-ID fest, unter der der Container läuft.
- command (optional): Überschreibt den Standardbefehl des Containers. Anzugeben als Array von Argumenten (z. B.
["-g", "daemon off;"]). Der Entrypoint bleibt der Standard des Images. Dieses Feld schließt sich mitstepsgegenseitig aus und kann nicht im selben Service verwendet werden. - volumeMounts (optional): Ermöglicht das Mounten von Dateien und Ordnern aus dem Workspace in beliebige Pfade im Container.
- Alle weiteren Felder (
plan,network,envusw.) funktionieren genauso wie bei Reactives.
Cloud Native Deployments
Cloud Native Deployments stellen einen virtuellen Managed Kubernetes-Cluster mit vollständigem kubectl-Zugriff bereit, konzipiert für fortgeschrittene Orchestrierungsszenarien. Einen ausführlichen Überblick findest du unter Virtual Clusters.
Diese Runtime richtet sich an Nutzer mit Vorerfahrung in Kubernetes. Wenn du neu in der Container-Orchestrierung bist, empfiehlt sich der Einstieg über Codesphere Reactives oder Managed Containers.
Einrichten eines Cloud Native Deployments
- UI
- YAML
- Cluster bereitstellen: Füge über den Bereich „Managed Services“ der UI oder API einen virtuellen Kubernetes-Cluster hinzu. Beachte, dass jedes Team nur jeweils einen virtuellen Cluster besitzen kann.
- Auf den Cluster zugreifen: Nach der Bereitstellung kannst du die kubeconfig über die API abrufen, um dich mit
kubectlzu verbinden. - Workloads bereitstellen: Nutze
kubectl-Befehle in den Prepare- oder Run-Schritten oder interagiere direkt über das Terminal.
Deployen von K8s-Manifesten über kubectl:
prepare:
steps:
- name: Deploy Application
command: |
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
Deployen eines Helm Charts:
prepare:
steps:
- name: Deploy with Helm
command: |
helm repo add corp42 https://charts.corp42.net
helm repo update
helm install my-release corp42/my-awesome-app -n app --create-namespace -f values-codesphere.yaml
Plattformintegration
Die tiefe Lifecycle-Integration in die Codesphere ci.yml befindet sich derzeit in Entwicklung. Verfügbare Funktionen:
| Funktion | Status |
|---|---|
| Bereitstellung eines virtuellen Clusters | ✅ Verfügbar |
| kubectl-Zugriff | ✅ Verfügbar |
| Helm-Deployments | ✅ Verfügbar |
| Monitoring-Integration | Manuelle Konfiguration erforderlich |
| Netzwerkintegration | Manuelle Konfiguration erforderlich |
Für den vollen Funktionsumfang der Plattform (automatisches Monitoring, integriertes Netzwerk, „Off when unused“) verwende Reactives oder Managed Containers.
Managed Services in Landscapes
Du kannst zwar eigenständige Managed Services erstellen, die unbegrenzt bestehen bleiben, für viele Anwendungsfälle ist es jedoch Best Practice, Managed Services als Teil deiner Landscape-Konfiguration zu definieren. Dies stellt sicher, dass deine Anwendungsumgebungen in sich geschlossen und reproduzierbar sind.
Wenn du beispielsweise eine Development- oder Staging-Landscape startest, kann Codesphere automatisch eine dedizierte PostgreSQL-Datenbank für diese spezifische Umgebung bereitstellen und sie wieder entfernen, sobald die Landscape nicht mehr benötigt wird.
Hinzufügen eines Managed Service zu einer Landscape
Du kannst Managed Services in deiner ci.yml (oder einem spezifischen CI Profile wie ci.dev.yml) über den Landscape Config Editor definieren oder die YAML-Datei direkt bearbeiten.
- UI
- YAML

- Typ auswählen: Wähle Databases & More aus dem Dropdown-/Modal-Menü.
- Provider auswählen: Wähle den benötigten Service aus (z. B. PostgreSQL, Redis, S3).
- Konfigurieren: Lege Version, Plan und Konfigurationsparameter fest.
- Name: Vergib einen Namen (z. B.
primary-db). Dieser Name wird verwendet, um den Service innerhalb deiner Landscape zu referenzieren.
- Name: Vergib einen Namen (z. B.
- Secrets: Definiere die vom Service benötigten Secrets (z. B. Passwörter). Du kannst Secrets auf Projektebene referenzieren oder neue generieren.
- Speichern: Der Service ist nun deinem Landscape-Profil hinzugefügt. Er wird beim nächsten Deployment dieser Landscape bereitgestellt.
Du kannst Managed Services in deiner ci.yml-Datei definieren. Dies eignet sich gut für „Infrastructure as Code“-Praktiken. Die UI generiert dieses YAML zwar automatisch für dich, du kannst es aber auch manuell schreiben, falls du das bevorzugst.
-
Profil bearbeiten: Klicke oben rechts auf Edit as File und bearbeite die Profildefinition, um dem Abschnitt
runeinen neuen Service hinzuzufügen. Dieses Beispiel definiert eine PostgreSQL-Datenbank.schemaVersion: v0.2# ... existing prepare and run stages ...run:my-postgres-db:provider:name: postgresversion: v1plan:id: 0parameters:storage: 10000cpu: 5memory: 500config:version: "17.6"userName: "${{ workspace.env.pgUser }}"databaseName: "${{ workspace.env.pgDb }}"secrets:userPassword: "${{ vault.pgPassword }}"superuserPassword: "${{ vault.pgSuperuserPassword }}"- Schlüssel (z. B.
my-postgres-db): Der Name und eindeutige Bezeichner für diesen Service innerhalb der Landscape.warnungDas Umbenennen eines Services erfordert, dass das System ihn neu erstellt, was zu Datenverlust führen kann. Gehe hierbei mit Vorsicht vor.
- provider: Der Typ des Services (entspricht dem Providernamen im Katalog).
- secrets: Kann Codesphere-Vault-Secrets über die Syntax
${{ vault.NAME }}referenzieren.
infoDie Managed-Service-Definition muss eine gültige Provider-Konfiguration für den bereitgestellten Service verwenden (z. B. Plan-IDs, Versionen und Konfigurationsparameter). Die zulässigen Werte findest du, indem du den Endpunkt
get providerin der Codesphere Public API aufrufst, oder indem du das anfängliche Grundgerüst über die UI erstellst, bevor du dieYAML-Datei manuell bearbeitest. - Schlüssel (z. B.
-
Speichern: Speichere das Profil (Strg + S bzw. Cmd + S)
-
Landscape synchronisieren: Wechsle zum Tab Execution Manager und klicke oben in der Mitte des Bereichs „Landscape Deployment“ auf Sync Landscape. Bestätige die Ressourcennutzung. Dadurch werden die Änderungen am Profil übernommen und die Bereitstellung der Managed Services ausgelöst.

-
Secrets: Gib die erforderlichen Secrets ein, die du zuvor bei der Definition des Managed Service verwendet hast. In diesem Beispiel
pgPasswordundpgSuperuserPassword. Diese werden sicher im Codesphere-Vault gespeichert und bei der Bereitstellung in den Service injiziert.
Der Service wird nun erstellt und steht deiner Anwendung zur Verbindung zur Verfügung, sobald du diese Landscape deployst.
Verbinden mit dem Service
Sobald ein Managed Service bereitgestellt ist, kann sich deine Anwendung damit verbinden. Siehe die Managed Service Provider Reference für providerspezifische Verbindungsdetails.
Service Discovery & Umgebungsvariablen
Codesphere ermöglicht es dir, Verbindungsdetails über Umgebungsvariablen in deine Anwendung zu injizieren.
- Secrets: Die im Managed Service definierten Secrets können direkt an die Umgebungsvariablen deiner Anwendung übergeben werden.
- Hostnamen: Konkrete Beispiele zur Hostnamen-Konstruktion für einen bestimmten Service findest du auf der jeweiligen Provider-Seite in der Provider-Referenz.
Lifecycle-Management
- Erstellung: Der Managed Service wird erstellt, wenn das jeweilige Landscape-Profil (z. B.
dev) deployt wird. - Updates: Änderungen an der
ci.yml-Konfiguration (z. B. Änderung des Plans oder der Konfiguration) aktualisieren den Service beim nächsten Deployment. - Pausieren: Falls die Landscape „Off when unused“ unterstützt, können auch die Managed Services pausiert werden, um Kosten zu sparen (abhängig von den Fähigkeiten des jeweiligen Services).
- Löschen: Wird die Landscape gelöscht, werden die zugehörigen Managed Services automatisch entfernt, um verwaiste Ressourcen und zusätzliche Kosten zu vermeiden.
Das Umbenennen eines Managed Service in der ci.yml-Datei erfordert, dass das System ihn neu erstellt, was zu Datenverlust führen kann.
Unterschiede zu eigenständigen Services
| Merkmal | Landscape Managed Service | Eigenständiger Managed Service |
|---|---|---|
| Definition | In ci.yml definiert | Manuell über UI/API erstellt |
| Lifecycle | An die Landscape gebunden (wird mit ihr erstellt/gelöscht) | Unabhängig (bleibt bestehen, bis manuell gelöscht) |
| Anwendungsfall | Dev-, Test-, Review-Umgebungen | Produktion, langlebige gemeinsam genutzte Datenbanken |
| Konfiguration | Infrastructure as Code (Git-verfolgt) | Manuelle Konfiguration |
Versionierte ci.yml-Schemas
- v0.4
- v0.3
- v0.2
- v0.1
# Example fixture for the current schema after the managed-service provider schemaVersion rename.
# `schemaVersion` pins the fixture to the current pipeline schema.
schemaVersion: v0.4
# `prepare` runs setup before tests and deploys.
prepare:
# `steps` lists sequential setup commands.
steps:
# `name` is a descriptive label only.
- name: Install dependencies
# `command` is the shell command to execute.
command: yarn install
# `test` runs verification commands after setup.
test:
# `steps` keeps the same stage shape as `prepare`.
steps:
# `name` documents the test step.
- name: Run unit tests
# `command` runs the example test suite.
command: yarn test --run
# `run` contains the named deploy targets for the workspace.
run:
# Reactive runtime with the full set of supported server fields.
reactive-app:
# `steps` defines the lifecycle commands for a reactive runtime.
steps:
# Build the app before startup.
- name: Build app
# Produce deployable build output.
command: yarn build
# Start the application process.
- name: Start app
# Launch the runtime server.
command: yarn start
# `image` optionally customizes the reactive base image.
image: ghcr.io/codesphere-cloud/example-reactive:latest
# `healthEndpoint` is probed to determine readiness.
healthEndpoint: http://127.0.0.1:3000/healthz/app
# `plan` selects the workspace plan.
plan: 20
# `replicas` requests horizontal scaling.
replicas: 2
# `isPublic` is ignored when advanced `network` settings are present.
isPublic: true
# `network` defines exposed ports and routed paths.
network:
# `ports` exposes raw runtime ports.
ports:
# `port` is the runtime port number to expose.
- port: 3000
# `isPublic` makes the port reachable from outside the workspace.
isPublic: true
- port: 9229
isPublic: false
# `paths` maps HTTP prefixes onto runtime ports.
paths:
# Route the root path to port `3000`.
- port: 3000
path: /
stripPath: false
# Route `/api` to port `3000` and strip the prefix.
- port: 3000
path: /api
stripPath: true
# `env` injects runtime environment variables.
env:
# Example string env var.
NODE_ENV: production
# Example numeric env var.
PORT: 3000
# `runAsUser` sets the runtime UID.
runAsUser: 1000
# `runAsGroup` sets the runtime GID.
runAsGroup: 1000
# `volumeMounts` attaches workspace storage into the runtime.
volumeMounts:
# `name` selects the workspace volume.
- name: _workspace
# `mountPath` is the destination inside the runtime.
mountPath: /home/user/app
# `workspacePath` selects which subdirectory to mount.
workspacePath: ""
# Container runtime with the full set of supported server fields.
container-app:
# `image` is required for container runtimes.
image: ghcr.io/codesphere-cloud/example-container:latest
# `command` overrides the image entrypoint/command.
command:
# First argv entry.
- node
# Second argv entry.
- server.js
# The rest of the fields are shared with reactive runtimes.
healthEndpoint: http://127.0.0.1:8080/healthz/app
# `plan` selects the workspace plan.
plan: 20
# `replicas` requests horizontal scaling for this runtime.
replicas: 1
# `isPublic` allows the routed service to be reachable externally.
isPublic: true
# This simple network shape publishes one routed path.
network:
# `path` is the public prefix for this service.
path: /container
# `stripPath` controls whether the prefix is preserved upstream.
stripPath: false
env:
# Example string env var.
NODE_ENV: production
# Example numeric env var.
PORT: 8080
# `runAsUser` sets the runtime UID.
runAsUser: 1000
# `runAsGroup` sets the runtime GID.
runAsGroup: 1000
# `volumeMounts` attaches workspace storage into the runtime.
volumeMounts:
# `name` selects the workspace volume.
- name: _workspace
# `mountPath` is the destination inside the runtime.
mountPath: /home/user/app
# `workspacePath` selects which subdirectory to mount.
workspacePath: ""
# Managed service runtime in v0.4:
# - `provider.version` was renamed to `provider.schemaVersion`
# This key names the managed service instance.
postgres:
# `provider` identifies the catalog entry to provision.
provider:
# `name` selects the managed service type.
name: postgres
# `schemaVersion` is the renamed provider version field in v0.4.
schemaVersion: "14"
# `plan` selects the service plan and sizing.
plan:
# `id` identifies the chosen catalog plan.
id: 1
# `parameters` contains provider-specific numeric options.
parameters:
# `storage` requests disk capacity.
storage: 1024
# `cpu` requests compute capacity.
cpu: 1
# `memory` requests RAM capacity.
memory: 512
# `config` contains non-secret provider configuration.
config:
# `database` is an example provider config key.
database: app
# `extensions` shows that lists are allowed in config payloads.
extensions:
- pgcrypto
# `secrets` contains secret provider configuration.
secrets:
# `password` is an example secret key.
password: secret
# Example fixture for the v0.2 -> v0.3 migration where workspace mounts become explicit.
# `schemaVersion` selects the v0.3 parser rules.
schemaVersion: v0.3
# `prepare` runs setup work before tests and deploys.
prepare:
# `steps` lists the stage commands in execution order.
steps:
# `name` labels the step for humans.
- name: Install dependencies
# `command` is the shell command to run.
command: yarn install
# `test` runs verification after `prepare`.
test:
# `steps` keeps the same shape across all single-running stages.
steps:
# `name` documents the purpose of the test step.
- name: Run unit tests
# `command` runs the tests.
command: yarn test --run
# `run` contains named deploy targets.
run:
# v0.3 keeps the v0.2 deploy shapes, but makes workspace mounts explicit.
reactive-app:
# `steps` marks this target as a reactive runtime.
steps:
# Build before startup.
- name: Build app
# Produce the deployable app bundle.
command: yarn build
# Start the runtime process.
- name: Start app
# Launch the application server.
command: yarn start
# `image` optionally customizes the reactive base image.
image: ghcr.io/codesphere-cloud/example-reactive:latest
# `healthEndpoint` is polled after deployment.
healthEndpoint: http://127.0.0.1:3000/healthz/app
# `plan` selects the workspace plan for this runtime.
plan: 20
# `replicas` requests multiple runtime instances.
replicas: 2
# `isPublic` is ignored here because the advanced network shape is used below.
isPublic: true
# `network` configures public ports and HTTP routes.
network:
# `ports` exposes runtime ports directly.
ports:
# `port` is the runtime port number.
- port: 3000
# `isPublic` exposes this port externally.
isPublic: true
- port: 9229
isPublic: false
# `paths` maps HTTP routes to runtime ports.
paths:
# Route `/` to port `3000`.
- port: 3000
path: /
stripPath: false
# Route `/api` to the same port and strip the prefix.
- port: 3000
path: /api
stripPath: true
# `env` provides environment variables to the runtime.
env:
# String env var example.
NODE_ENV: production
# Numeric env var example.
PORT: 3000
# `runAsUser` sets the effective UID inside the runtime.
runAsUser: 1000
# `runAsGroup` sets the effective GID inside the runtime.
runAsGroup: 1000
# In v0.3 this commonly explicit mount becomes important.
volumeMounts:
# `name` refers to the workspace volume.
- name: _workspace
# `mountPath` is the in-container destination.
mountPath: /home/user/app
# `workspacePath` of `""` mounts the workspace root.
workspacePath: ""
# This target demonstrates the container-runtime branch of the schema.
container-app:
# `image` is the required runtime image.
image: ghcr.io/codesphere-cloud/example-container:latest
# `command` overrides the image startup command.
command:
# First argv segment.
- node
# Second argv segment.
- server.js
# Common deploy-server fields are shared with reactive runtimes.
healthEndpoint: http://127.0.0.1:8080/healthz/app
# `plan` selects the workspace plan for this runtime.
plan: 20
# `replicas` requests the instance count.
replicas: 1
# `isPublic` allows the simple network route to be exposed publicly.
isPublic: true
# This simple network shape publishes a single HTTP route.
network:
# `path` is the public route prefix.
path: /container
# `stripPath: false` forwards the full incoming path.
stripPath: false
env:
# String env var example.
NODE_ENV: production
# Numeric env var example.
PORT: 8080
# `runAsUser` sets the effective UID inside the runtime.
runAsUser: 1000
# `runAsGroup` sets the effective GID inside the runtime.
runAsGroup: 1000
# `volumeMounts` makes the workspace available inside the container.
volumeMounts:
# `name` refers to the workspace volume.
- name: _workspace
# `mountPath` is the in-container destination.
mountPath: /home/user/app
# `workspacePath` of `""` mounts the workspace root.
workspacePath: ""
# Managed service runtime in v0.3 still uses `provider.version`.
# This key names the service instance.
postgres:
# `provider` identifies the managed service type and version.
provider:
# `name` selects the provider implementation.
name: postgres
# `version` is still the field name before v0.4.
version: "14"
# `plan` chooses the service plan and parameters.
plan:
# `id` identifies the selected plan.
id: 1
# `parameters` carries provider-defined numeric sizing inputs.
parameters:
# `storage` requests persistent disk capacity.
storage: 1024
# `cpu` requests compute units for the service.
cpu: 1
# `memory` requests RAM for the service.
memory: 512
# `config` carries non-secret provider inputs.
config:
# `database` is a provider-defined config field.
database: app
# `extensions` shows that provider config can include lists.
extensions:
- pgcrypto
# `secrets` carries sensitive provider inputs.
secrets:
# `password` is a provider-defined secret value.
password: secret
# Example fixture for the first versioned pipeline schema with deploy runtimes.
# `schemaVersion` selects the parser rules for this fixture.
schemaVersion: v0.2
# `prepare` runs initial setup before tests and deployment.
prepare:
# Steps are executed sequentially inside the stage.
steps:
# Step names are descriptive only.
- name: Install dependencies
# Commands contain the shell instruction to execute.
command: yarn install
# `test` runs verification work after `prepare`.
test:
# Test steps use the same stage shape as `prepare`.
steps:
# This name explains what the test step does.
- name: Run unit tests
# The command launches the test suite.
command: yarn test --run
# `run` becomes a map of named deploy runtimes in v0.2.
run:
# Reactive runtime:
# - identified by `steps`
# - may optionally set `image`
# - all common deploy-server fields are supported
# The map key names this deploy target.
reactive-app:
# `steps` marks this as a reactive runtime and defines its lifecycle commands.
steps:
# This step builds the app before it starts.
- name: Build app
# The build command prepares production assets.
command: yarn build
# This step names the runtime startup command.
- name: Start app
# The start command launches the reactive process.
command: yarn start
# Optional custom base image for reactive execution.
image: ghcr.io/codesphere-cloud/example-reactive:latest
# Optional health endpoint used by the platform.
healthEndpoint: http://127.0.0.1:3000/healthz/app
# Optional workspace plan id.
plan: 20
# Optional replica count.
replicas: 2
# `isPublic` is ignored when `network` uses the advanced shape.
isPublic: true
# Advanced network config:
# - `ports` defines public/private TCP ports
# - `paths` defines routed HTTP paths
network:
# `ports` exposes raw TCP ports on the runtime.
ports:
# `port` is the container port that the platform should expose.
- port: 3000
# `isPublic` controls whether the port is reachable externally.
isPublic: true
- port: 9229
isPublic: false
# `paths` configures HTTP routing rules on top of the ports.
paths:
# `port` selects which runtime port receives this HTTP path.
- port: 3000
# `path` is the incoming route prefix to match.
path: /
# `stripPath` controls whether the prefix is removed before proxying.
stripPath: false
- port: 3000
path: /api
stripPath: true
# Environment values may be strings or numbers.
env:
# `NODE_ENV` is a representative string environment variable.
NODE_ENV: production
# `PORT` shows that numeric env values are accepted too.
PORT: 3000
# Optional user/group to run the process as.
runAsUser: 1000
# `runAsGroup` pairs with `runAsUser` for filesystem permissions.
runAsGroup: 1000
# Optional workspace mounts.
volumeMounts:
# `name` currently supports the workspace volume only.
- name: _workspace
# `mountPath` is where the workspace appears inside the runtime.
mountPath: /home/user/app
# `workspacePath` narrows the mounted subdirectory; empty means the root.
workspacePath: ""
# Container runtime:
# - identified by `image`
# - must not define `steps`
# - may optionally set `command`
# This second deploy target demonstrates the container-runtime shape.
container-app:
# `image` is required for container runtimes.
image: ghcr.io/codesphere-cloud/example-container:latest
# `command` overrides the image default entrypoint/command.
command:
# Command arrays are passed through as ordered argv segments.
- node
- server.js
# The remaining fields share the common deploy-server schema.
healthEndpoint: http://127.0.0.1:8080/healthz/app
plan: 20
replicas: 1
isPublic: true
# Simple network config routes one path to the main port.
network:
# `path` exposes the service under a single HTTP prefix.
path: /container
# `stripPath` keeps the `/container` prefix when forwarding requests.
stripPath: false
env:
NODE_ENV: production
PORT: 8080
runAsUser: 1000
runAsGroup: 1000
volumeMounts:
- name: _workspace
mountPath: /home/user/app
workspacePath: ""
# Managed service runtime in v0.2:
# - uses `provider.version`
# This key names the managed service instance.
postgres:
# `provider` identifies which service catalog entry to provision.
provider:
# `name` selects the provider type.
name: postgres
# `version` selects the provider schema version in v0.2/v0.3.
version: "14"
# `plan` selects a service plan and its numeric parameters.
plan:
# `id` identifies the chosen plan in the marketplace catalog.
id: 1
# Provider-specific integer parameters.
parameters:
# `storage` requests persistent disk capacity.
storage: 1024
# `cpu` requests compute units for the service.
cpu: 1
# `memory` requests RAM for the service.
memory: 512
# Arbitrary provider config payload.
config:
# `database` is a provider-defined config field.
database: app
# `extensions` shows that provider config can include lists.
extensions:
- pgcrypto
# Arbitrary provider secrets payload.
secrets:
# `password` is a provider-defined secret value.
password: secret
# Example fixture for the legacy pre-versioned parser shape.
# v0.1 has no top-level schemaVersion field yet.
# All three top-level entries are plain stages, not deploy-runtime maps.
# `prepare` runs setup work before tests or app startup.
prepare:
# Steps are executed sequentially.
steps:
# Step names are optional and only descriptive.
- name: Install dependencies
# Command is the only required field on a step.
command: yarn install
# `test` runs verification commands after `prepare`.
test:
# Test steps still use the same sequential stage shape as `prepare`.
steps:
# This label only helps readers identify the step in UIs or logs.
- name: Run unit tests
# The command contains the shell instruction to execute.
command: yarn test --run
# `run` executes the main workload for this legacy schema version.
run:
# In v0.1, `run` is still just a plain stage.
# Deploy runtimes such as reactive servers, container runtimes,
# and managed services are introduced in later versions.
# The run stage can also define a health endpoint.
healthEndpoint: http://127.0.0.1:3000/healthz/app
# Runtime steps are executed in order, just like any other stage.
steps:
# The step name documents the intent of the runtime command.
- name: Start dev server
# The command starts the long-running application process.
command: yarn start