Konfigurieren einer Landscape
Eine Landscape definiert, wie Services bereitgestellt und verbunden werden. Du kannst Compute Runtimes (Reactives, Managed Containers, Cloud Native Deployments) und Managed Services hinzufügen und deren Ressourcen, Netzwerk und Umgebung konfigurieren. Für einen tieferen technischen Überblick siehe Landscapes & Workspaces.
Jede Konfiguration beginnt im Landscape Config Editor:
- Klicke im Workspace in der Seitenleiste auf Deploy, um die Deployment- und Ausführungsseite 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 Verwenden von CI Profiles. - Klicke auf der rechten Seite des Bereichs Landscape Deployment auf die Schaltfläche + Add New Service und wähle den gewünschten Servicetyp aus.
Von hier aus kannst du deine Landscape über den visuellen Editor oder durch direktes Bearbeiten der Datei ci.yml konfigurieren.
Die Landscape-Config-UI 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.
Ein Profil mit schemaVersion: v0.5 kann als statischer Build exportiert werden: eine Sammlung von Container-Images plus einer reinen Run-Konfiguration, die in eine Registry gepusht wird und ohne das Source-Repository bereitgestellt werden kann. Siehe Static Builds.
Codesphere Reactives
Codesphere Reactives sind die Flaggschiff-Runtime von Codesphere und lassen sich am besten als zustandsbehaftetes Serverless beschreiben. Sie kombinieren persistenten Dateisystemzugriff mit automatischer Freigabe von Ressourcen während inaktiver Phasen und nahezu sofortigem Start (im Millisekundenbereich). Für einen detaillierten Überblick siehe Runtimes.
Um ein Reactive hinzuzufügen, wähle Reactive Service im Servicetyp-Auswahlmenü aus und konfiguriere es anschließend 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 sequenziell ab 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 benötigt werden
Der letzte Schritt sollte in der Regel ein langlaufender Prozess sein (wie ein Webserver). Wenn alle Befehle beendet werden, wird der Service als „unhealthy“ markiert: Der Service läuft zwar, aber seine Pipeline wird nicht mehr ausgeführt.
Basis-Image-Konfiguration
Reactives verwenden standardmäßig ein von Codesphere gepflegtes, gemeinsames Ubuntu-Basis-Image (Codesphere Defaults). Dieses Image ist vorgewärmt und gepoolt, um nahezu sofortigen Start (im Millisekundenbereich) zu ermöglichen. Du kannst die Runtime-Umgebung anpassen, indem du Abhängigkeiten über Nix installierst. Für fortgeschrittene Anwendungsfälle gibt es zudem die Option Custom Base Image, 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. Mithilfe der 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
- Verbesserte 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 zwischen allen Services geteilt. Dateien, die an anderer Stelle geschrieben werden, existieren nur auf der lokalen Festplatte des jeweiligen Pods und stehen anderen Services oder Replicas nicht zur Verfügung. Diese lokalen Dateien gehen auch bei Workspace-Neustarts verloren, die etwa 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 werden beim Start des Services sequenziell ausgeführt. - 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 verfügt über einen Ressourcenplan, der die zugewiesenen vCPUs, den Arbeitsspeicher und den Speicherplatz festlegt. Die verfügbaren Pläne und ihre Preise werden vom Cluster-Administrator konfiguriert und können je nach Installation variieren.
So konfigurierst du Ressourcen:
- Wähle einen Plan aus der Liste aus (jeder Plan zeigt seine vCPU-, Arbeitsspeicher- und Speicherzuteilung)
- Lege den Availability-Modus fest:
- Always on: Der Service läuft kontinuierlich, ideal für Produktions-Workloads
- Off when unused: Der Service stoppt automatisch nach einer Phase der Inaktivität und startet neu, sobald auf die Domain oder den Workspace zugegriffen wird – ideal für Preview-Deployments oder Entwicklungsumgebungen
- Lege die Default Replicas-Anzahl 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. Dies ist möglicherweise nicht bei jeder Installation 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/Arbeitsspeicher durch Auswahl eines höheren Plans | Rechen- oder speicherintensive Workloads |
| Horizontale Skalierung | Hinzufügen mehrerer Replicas desselben Services | 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 Arbeitsspeicherzuteilung festlegt.
- replicas (optional): Anzahl der Service-Instanzen für horizontale Skalierung. Standardwert ist 1.
Für Entwicklungsumgebungen bieten kleinere Pläne mit aktivierter Option „Off when unused“ erhebliche Kosteneinsparungen. Reserviere größere Pläne und mehrere Replicas für Produktions-Workloads.
Netzwerkeinstellungen
- UI
- YAML

Health Check
Standardmäßig pingt Codesphere deine Reactive Services auf Port 3000 an, um deren Zustand zu prüfen. Du kannst einen benutzerdefinierten Health-Endpoint konfigurieren, z. B. http://localhost:8080/health, falls deine Anwendung einen anderen Port oder Pfad für Health Checks verwendet. Die Anfrage wird zudem aus dem Service-Container heraus ausgeführt, sodass die Anwendung unter localhost erreichbar sein muss. Ist sie an eine andere Schnittstelle gebunden, gib stattdessen die passende IP-Adresse oder den Hostnamen an.
Ein Service ist von außerhalb der Landscape nur erreichbar, wenn Traffic zu ihm geroutet wird – entweder weil er das Landscape-Gateway ist oder weil eine Pfadzuordnung im Workspace Router auf ihn verweist. Services ohne Route bleiben für die anderen Services innerhalb der Landscape erreichbar.
Ports konfigurieren
Dieser Abschnitt definiert die Ports, die dein Service exponiert. Andere Services innerhalb derselben Landscape erreichen diesen Service über diese Ports unter seinem internen Hostnamen. Siehe Landscape Networking für Details.
Den internen Hostnamen eines Services kannst du über die Copy-Schaltfläche auf der rechten Seite kopieren.
So exponierst du einen neuen Port:
- Klicke rechts auf + Add New Port
- Gib die Port-Nummer ein, auf der deine Anwendung lauscht
Workspace Router
In der UI des Services kannst du die Pfadzuordnungen des Services im Workspace Router konfigurieren. Jede Zuordnung leitet ein eingehendes HTTP-Pfadpräfix an einen der Ports des Services weiter.
Der Abschnitt Routing for Other Services am unteren Rand zeigt Routen, die von anderen Services innerhalb derselben Landscape definiert wurden – hilfreich, um Konflikte zu erkennen oder einen Überblick über die gesamte Routing-Tabelle zu erhalten.
Das vollständige Routing-Modell, einschließlich benutzerdefiniertem Zielrouting, des Landscape-Gateways und der stripPath-Option, findest du unter Landscape Networking.
run:
backend:
healthEndpoint: http://localhost:8080/health
network:
ports: [8080]
steps:
- command: npm run start:backend
- healthEndpoint (optional): Benutzerdefinierte Health-Check-URL. Standardwert ist
http://localhost:3000/. Die Anfrage wird aus dem Service-Container heraus ausgeführt, sodass die Anwendung unter localhost erreichbar sein muss. Ist sie an eine andere Schnittstelle gebunden, gib stattdessen die passende IP-Adresse oder den Hostnamen an. - network.ports: Liste der Ports, die der Service anderen Services innerhalb der Landscape zur Verfügung stellt.
Umgebungsvariablen
- UI
- YAML

Mit Umgebungsvariablen kannst du Konfigurationswerte an deine Services übergeben, ohne diese 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 ein (Variablenname)
- Gib den Value entweder als Klartext ein oder wähle aus den Dropdown-Kategorien: User Inputs, Global Values, Secrets, Global Constants, Resource Group 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 |
${{ resourceGroup.id }} | Wird zur Resource-Group-ID aufgelöst |
${{ workspace.env['KEY'] }} | Referenziert eine globale Workspace-Umgebungsvariable |
${{ team.id }} funktioniert weiterhin als Alias für ${{ resourceGroup.id }}.
Secrets werden verschlüsselt gespeichert und erst zur Laufzeit injiziert. Siehe Secret Management für Details.
Managed Containers
Managed Containers basieren im Kern auf Reactives, erlauben dir jedoch, ein eigenes Docker-Image mitzubringen, anstatt das von Codesphere gepflegte Basis-Image zu verwenden. Das bedeutet, du erhältst dieselbe Plattform-Orchestrierung, Netzwerkanbindung und Überwachung, während ein eigener Container ausgeführt wird. Für einen detaillierten Überblick siehe Runtimes.
Um einen Managed Container hinzuzufügen, wähle Managed Container im Servicetyp-Auswahlmenü aus.
- UI
- YAML
Entsprechende barrierefreie Textbeschreibung
Basis-Image-Konfiguration:
- Gib die vollständige Image-Referenz ein (z. B.
nginx:1.25-alpine,node:20-slim) - Stelle bei privaten Registries sicher, dass entsprechende Zugangsdaten konfiguriert sind
- Lege Startup Args fest, um den Standardbefehl des Containers bei Bedarf zu überschreiben. Der Entrypoint bleibt der Standard des Images. Möchtest du den Entrypoint überschreiben, musst du stattdessen Codesphere Reactives verwenden und dein Image als Custom Base Image einsetzen.
- Lege Mounting Paths (
volumeMounts) fest, um zu steuern, welche Verzeichnisse oder Dateien aus dem Workspace in den Container gemountet werden und wohin.
Run As User/Group:
- Lege die User ID (
runAsUser) fest, um zu bestimmen, unter welchem Benutzerkonto der Service im Container läuft. - Lege die Group ID (
runAsGroup) fest, um zu bestimmen, welcher Benutzergruppe der Service im Container angehört. - Diese Einstellungen steuern den Dateizugriff und die Berechtigungen auf Prozessebene und sollten den Eigentumserwartungen deiner Anwendung und der gemounteten Dateien entsprechen.
Die Zugriffsebene 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 Stammverzeichnis des gemounteten Volumes, jedoch nicht auf Unterverzeichnisse.
- Unabhängig von der konfigurierten Group ID fügt Codesphere für das Workspace-Dateisystem direkt die GID
1010hinzu. Die festgelegte GID beeinflusst die Eigentümergruppe der von deinen Services erstellten Dateien. - Du kannst Schreibzugriff auf ein bestimmtes Unterverzeichnis für die Group ID einrichten, indem du im Prepare-Stage
chmod g+w some-dirausführst.
Managed Containers haben aufgrund des Image-Pulls und der Initialisierung Startzeiten im Sekundenbereich (im Vergleich zu Millisekunden bei Reactives). Die tatsächliche Geschwindigkeit hängt von der Image-Größe und der Netzwerkleistung zur Registry ab.
Alle übrigen Konfigurationsoptionen (Ressourcen, Ports, Routen, Umgebungsvariablen) funktionieren genauso wie bei Codesphere Reactives — siehe die Abschnitte oben.
run:
alpine-image:
image: alpine:latest
steps:
- name: Run Alpine
command: echo "Hello from Alpine!"
plan: 21
network:
ports: [80]
nginx-server:
image: nginx-unprivileged:1.25-alpine
command: ["-g", "daemon off;"]
plan: 21
healthEndpoint: http://localhost/
network:
ports: [80]
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. Als Array von Argumenten angeben (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): Du kannst Dateien und Verzeichnisse aus dem Workspace in beliebige Pfade innerhalb des Containers mounten.
- Alle übrigen Felder (
plan,network,envusw.) funktionieren genauso wie bei Reactives.
Cloud Native Deployments
Cloud Native Deployments stellen einen virtuellen, verwalteten Kubernetes-Cluster mit vollständigem kubectl-Zugriff bereit, konzipiert für fortgeschrittene Orchestrierungsszenarien. Für einen detaillierten Überblick siehe Virtual Clusters.
Diese Runtime richtet sich an Nutzer mit vorheriger Kubernetes-Erfahrung. Wenn du neu in der Container-Orchestrierung bist, solltest du mit Codesphere Reactives oder Managed Containers beginnen.
Einrichten eines Cloud Native Deployments
- UI
- YAML
- Cluster bereitstellen: Füge im Bereich Managed Services der UI oder API einen virtuellen Kubernetes-Cluster hinzu. Beachte, dass jede Resource Group jeweils nur einen virtuellen Cluster haben kann.
- Auf den Cluster zugreifen: Nach der Bereitstellung kannst du die kubeconfig über die API abrufen, um dich mit
kubectlzu verbinden. - Workloads bereitstellen: Verwende
kubectl-Befehle in den Prepare- oder Run-Schritten, oder interagiere direkt über das Terminal.
K8s-Manifeste per kubectl bereitstellen:
prepare:
steps:
- name: Deploy Application
command: |
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
Ein Helm Chart bereitstellen:
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
Eine tiefe Integration des Lebenszyklus in die Codesphere-ci.yml befindet sich derzeit in Entwicklung. Verfügbare Funktionen:
| Funktion | Status |
|---|---|
| Bereitstellung virtueller Cluster | ✅ Verfügbar |
| kubectl-Zugriff | ✅ Verfügbar |
| Helm-Deployments | ✅ Verfügbar |
| Monitoring-Integration | Manuelle Konfiguration erforderlich |
| Netzwerkintegration | Manuelle Konfiguration erforderlich |
Für volle Plattformfunktionen (automatisches Monitoring, integrierte Netzwerkanbindung, Off-when-unused) verwende Reactives oder Managed Containers.
Managed Services in Landscapes
Obwohl du eigenständige Managed Services erstellen kannst, die dauerhaft bestehen bleiben, ist es für viele Anwendungsfälle Best Practice, Managed Services als Teil deiner Landscape-Konfiguration zu definieren. So stellst du sicher, dass deine Anwendungsumgebungen eigenständig 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 abbauen, 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 bestimmten 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 im Dropdown/Modal Databases & More aus.
- Anbieter auswählen: Wähle den benötigten Service aus (z. B. PostgreSQL, Redis, S3).
- Konfigurieren: Lege Version, Plan und Konfigurationsparameter fest.
- Name: Gib einen Namen an (z. B.
primary-db). Dieser Name wird verwendet, um den Service innerhalb deiner Landscape zu referenzieren.
- Name: Gib einen Namen an (z. B.
- Secrets: Definiere die vom Service benötigten Secrets (z. B. Passwörter). Du kannst auf projektweite Secrets verweisen oder neue erstellen.
- Speichern: Der Service wird nun zu deinem Landscape-Profil hinzugefügt. Er wird beim nächsten Deployment dieser Landscape bereitgestellt.
Du kannst Managed Services in deiner ci.yml-Datei definieren. Das ist nützlich für „Infrastructure as Code“-Praktiken. Die UI generiert dieses YAML ebenfalls automatisch für dich, du kannst es aber auch manuell schreiben, wenn du möchtest.
-
Profil bearbeiten: Klicke oben rechts auf Edit as File und bearbeite die Profildefinition, um dem
run-Abschnitt einen 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 }}"- Key (z. B.
my-postgres-db): Der Name und die eindeutige Kennung dieses Services innerhalb der Landscape.warnungDas Umbenennen eines Services erfordert, dass das System ihn neu erstellt, was zu Datenverlust führen kann. Gehe hier mit Vorsicht vor.
- provider: Der Typ des Services (entspricht dem Anbieternamen im Katalog).
- secrets: Kann auf Codesphere-Vault-Secrets über die Syntax
${{ vault.NAME }}verweisen.
infoDie Managed-Service-Definition muss eine gültige Provider-Konfiguration für den bereitzustellenden Service verwenden (z. B. Plan-IDs, Versionen und Konfigurationsparameter). Die zulässigen Werte findest du über den
get provider-Endpoint in der Codesphere Public API, oder indem du das initiale Grundgerüst über die UI erstellst, bevor du dieYAML-Datei manuell bearbeitest. - Key (z. B.
-
Speichern: Speichere das Profil (Strg + S oder Cmd + S)
-
Landscape synchronisieren: Gehe zum Tab Execution Manager und klicke oben in der Mitte des Bereichs Landscape Deployment auf Sync Landscape. Bestätige den Ressourcenverbrauch. Dadurch werden die Änderungen am Profil übernommen und die Bereitstellung der Managed Services ausgelöst.

-
Secrets: Gib die zuvor zur Definition des Managed Service verwendeten Secrets ein. 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 bereitstellst.
Verbindung mit dem Service herstellen
Sobald ein Managed Service bereitgestellt wurde, kann sich deine Anwendung mit ihm verbinden. Anbieterspezifische Verbindungsdetails findest du in der Managed Service Provider Reference.
Service Discovery & Umgebungsvariablen
Mit Codesphere kannst du Verbindungsdetails über Umgebungsvariablen in deine Anwendung injizieren.
- Secrets: Du kannst die im Managed Service definierten Secrets direkt an die Umgebungsvariablen deiner Anwendung übergeben.
- Hostnamen: Konkrete Beispiele für die Konstruktion von Hostnamen für einen bestimmten Service findest du auf der entsprechenden Anbieterseite in der Provider Reference.
Lebenszyklusverwaltung
- Erstellung: Der Managed Service wird erstellt, wenn das jeweilige Landscape Profile (z. B.
dev) bereitgestellt wird. - Aktualisierungen: Änderungen an der
ci.yml-Konfiguration (z. B. Änderung des Plans oder der Konfiguration) aktualisieren den Service beim nächsten Deployment. - Pausieren: Unterstützt die Landscape „Off when unused“, 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
| Funktion | Landscape Managed Service | Eigenständiger Managed Service |
|---|---|---|
| Definition | Definiert in ci.yml | Manuell über UI/API erstellt |
| Lebenszyklus | An Landscape gebunden (wird mit ihr erstellt/gelöscht) | Unabhängig (bleibt bis zur manuellen Löschung bestehen) |
| Anwendungsfall | Dev-, Test-, Review-Umgebungen | Produktion, langlaufende gemeinsam genutzte Datenbanken |
| Konfiguration | Infrastructure as Code (Git-verfolgt) | Manuelle Konfiguration |
Versionierte ci.yml-Schemas
- v0.5
- v0.3
- v0.2
- v0.1
# Example fixture for the current schema with the Landscape gateway and the Workspace Router.
# `schemaVersion` pins the fixture to the current pipeline schema.
schemaVersion: v0.5
# `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
# `network` defines the ports other services in the Landscape can reach.
network:
# `ports` exposes raw runtime ports.
ports: [3000, 9229]
# `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
# `network` defines the ports other services in the Landscape can reach.
network:
# `ports` exposes raw runtime ports.
ports: [8080]
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: ""
# Workspace Router:
# - identified by `type: router`
# - image and startup commands are managed by Codesphere
# - holds all path mappings of the Landscape
cs-router:
# `type: router` deploys the Codesphere Workspace Router.
type: router
# `plan` selects the workspace plan for the router.
plan: 101
# `replicaCount` sets the number of router instances.
replicaCount: 1
network:
# `isLandscapeGateway` routes all external traffic to the router.
isLandscapeGateway: true
# `paths` maps HTTP prefixes to services and ports in the Landscape.
paths:
# Route `/` to port `3000` of `reactive-app`.
- path: /
service: reactive-app
port: 3000
stripPath: false
# Route `/container` to port `8080` of `container-app` and keep the prefix.
- path: /container
service: container-app
port: 8080
stripPath: false
# `externalTargets` maps HTTP prefixes to URLs outside the Landscape.
externalTargets:
# Forward `/dashboard` to an endpoint in a Virtual Cluster.
- path: /dashboard
target: http://my-headlamp-x-kube-system-x-k8s.rg-${{ resourceGroup.id }}.svc.cluster.local
stripPath: false
# Managed service runtime (since 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
# `network` configures public ports and HTTP routes.
network:
# `ports` exposes runtime ports directly.
ports: [3000, 9229]
# `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
# 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
# Advanced network config:
# - `ports` defines TCP ports
# - `paths` defines routed HTTP paths
network:
# `ports` exposes raw TCP ports on the runtime.
ports: [3000, 9229]
# 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
# 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