Erstellen von Service Providern
Codesphere ermöglicht es dir, bestehende Codesphere-Landscapes als Managed Service Provider zu veröffentlichen. Dadurch können andere Entwickler deine individuellen Lösungen entdecken und einsetzen.
Landscape-basierte Service Provider
Ein Landscape-basierter Service Provider ermöglicht es anderen, deine Codesphere-Landscape als vorkonfigurierten Managed Service zu instanziieren, den sie über den Servicekatalog bereitstellen und verwalten können.
info
Das Veröffentlichen von Providern erfordert Cluster-Admin-Berechtigungen. Team-Admins können beantragen, dass Provider auf bestimmte Teams beschränkt werden.
Voraussetzungen
Bevor du einen Landscape-basierten Service Provider erstellst, benötigst du:
- Ein Git-Repository, das eine gültige Codesphere-Landscape mit einer
ci.yml-Datei enthält. - Eine Provider-Definition, entweder als
provider.yml-Datei im Root-Verzeichnis des Repositorys oder direkt in der API-Anfrage angegeben. - Git-Zugriff auf das Landscape-Repository. Codesphere zieht das Repository über deine Git-Verbindung, daher muss das Konto, mit dem du den Provider erstellst, über die entsprechende Zugriffsberechtigung verfügen. Deine Git-Verbindungen kannst du in deinen Benutzereinstellungen verwalten.
Der Git-Zugriff ist an einen Benutzer gebunden
Für das Abrufen des Landscape-Repositorys wird die Git-Verbindung des Benutzers verwendet, der den Provider erstellt (oder zuletzt aktualisiert) hat. Verliert dieser Benutzer den Zugriff auf das Repository, schlagen Deployments des Providers fehl. Um den Provider auf die Git-Verbindung eines anderen Benutzers zu übertragen, sendet dieser Benutzer eine PUT- oder PATCH-Anfrage für den Provider — anschließend wird dessen Verbindung für das Abrufen verwendet. Bei langlebigen Providern empfiehlt sich die Veröffentlichung über einen technischen Benutzer.
Provider-Definition
Die Datei provider.yml definiert alle Metadaten und Konfigurationsschemas für deinen Service Provider.
name: mattermost
schemaVersion: v1
author: Your Team
displayName: Mattermost
iconUrl: https://example.com/mattermost-icon.png
category: collaboration
description: |
Open-source team messaging and collaboration platform.
Supports channels, direct messaging, and file sharing.
backend:
landscape:
gitUrl: https://github.com/your-org/mattermost-landscape
configSchema:
type: object
properties:
SITE_NAME:
type: string
description: Display name for your Mattermost instance
default: mattermost
readOnly: false
MAX_USERS:
type: integer
description: Maximum number of users allowed
x-update-constraint: increase-only
required: ['MAX_USERS']
secretsSchema:
type: object
properties:
ADMIN_PASSWORD:
type: string
format: password
detailsSchema:
type: object
properties:
hostname:
type: string
port:
type: integer
plans:
# The plan has no influence on the resource usage, so you should only define one.
# You can also set plans to an empty array to disable the plan selection UI.
- id: 0
name: Default Plan
description: Resource usage depends on the ci-profile of the landscape.
parameters: {}
versions:
0.0.1:
ciProfile: debug
# gitRef can be a commit-hash, branch or tag
gitRef: 1a410efbd13591db07496601ebc7a059dd55cfe9
description: Initial release
1.0.0-rc:
appVersion: Nextcloud v33
ciProfile: prod
gitRef: release-branches/1-0-0-rc
description: |
Release Candidate.
Changelog:
- Feature X
- Feature Y
- Fix Z
1.0.0:
appVersion: Nextcloud v33
ciProfile: prod
gitRef: release-tags/1-0-0
description: Long Term Support Release
scope:
type: team
teamIds: [4008]
Provider-Felder
| Feld | Beschreibung |
|---|---|
name | Eindeutige Kennung für den Provider. Muss dem Muster ^[-a-z0-9_]+$ entsprechen. |
version | Versionsstring im Format v[0-9]+ (z. B. v1, v2). |
displayName | Menschenlesbarer Name, der im Marketplace UI angezeigt wird. |
iconUrl | URL zum Provider-Icon (absoluter oder relativer Pfad). |
category | Kategorisierung (z. B. databases, messaging, monitoring). |
author | Organisation oder Einzelperson, die für den Provider verantwortlich ist. |
description | Markdown-formatierte Beschreibung des Services. |
backend.landscape.gitUrl | Git-Repository-URL, die die Landscape-Konfiguration enthält. |
configSchema | JSON Schema, das die vom Benutzer konfigurierbaren Optionen definiert. Diese Werte werden der Landscape als Umgebungsvariablen übergeben. |
secretsSchema | JSON Schema, das geheime Werte definiert (z. B. Passwörter). Diese Werte werden im Secrets Vault der Landscape gesetzt. |
detailsSchema | JSON Schema, das die nach der Provisionierung bereitgestellten Runtime-Details definiert. |
versions | Versionen des Services, die Benutzer deployen können. Mindestens eine Version ist erforderlich. Siehe Provider-Versionen. |
scope | Sichtbarkeit des Providers: global macht ihn für alle verfügbar, team beschränkt ihn auf die aufgeführten teamIds. Siehe Provider-Scopes. |
configSchema, secretsSchema und detailsSchema erfüllen unterschiedliche Zwecke, verwenden aber dasselbe Format: Jedes muss ein gültiges OpenAPI-Schema-Objekt sein, da Codesphere sie auf dieser Basis parst. Wie in OpenAPI können Eigenschaften als required markiert oder mit sinnvollen default-Werten versehen werden.
Nachfolgend siehst du, wo die jeweiligen Schema-Typen in der Codesphere-UI erscheinen:
- ConfigSchema
- SecretsSchema
- DetailsSchema
Das configSchema definiert die Konfigurationseigenschaften, die der Benutzer beim Erstellen eines Services festlegt — zum Beispiel die zu deployende PostgreSQL-Version. Nach der Erstellung des Services kann die Konfiguration in den Service-Einstellungen eingesehen werden. Eigenschaften, die nicht als readOnly markiert sind, können später aktualisiert werden (siehe Update-Einschränkungen).

vorsicht
Das Aktualisieren von Konfigurationsparametern kann zu einem kurzen Ausfall des Services führen.
Im secretsSchema definierte Secrets erscheinen als Formularfelder im Dialog zum Erstellen eines Services und müssen vom Benutzer ausgefüllt werden — zum Beispiel das PostgreSQL-Superuser-Passwort. Die Werte werden bei der Erstellung in den Service eingefügt.

Im detailsSchema definierte Eigenschaften werden zur Laufzeit vom Service bereitgestellt — zum Beispiel der PostgreSQL-Hostname. Sie sind nur lesbar und können im Details-Bereich der Service-Einstellungen eingesehen werden.

Provider-Versionen
Jeder Provider muss mindestens einen Eintrag in versions definieren. Jede Version legt den exakten Zustand der zu deployenden Landscape fest:
gitRef: Ein Commit-Hash, Branch oder Tag des Landscape-Repositorys.ciProfile: Das CI-Profil aus derci.yml-Datei der Landscape, das für das Deployment verwendet wird.appVersion(optional): Eine menschenlesbare Bezeichnung für die deployte Anwendungsversion.description(optional): Markdown-formatierte Release-Notes, die dem Benutzer angezeigt werden.
Beim Erstellen eines Services wählt der Benutzer aus, welche Version deployt werden soll.
Veraltete Felder
backend.landscape.ciProfile und backend.landscape.gitRef wurden früher verwendet, um diese Werte einmalig für den gesamten Provider zu definieren. Sie sind veraltet — ciProfile und gitRef werden nun pro Version definiert — bleiben jedoch aus Gründen der Abwärtskompatibilität verfügbar.
Veröffentlichen und Aktualisieren eines Landscape-basierten Providers
Der empfohlene Weg, einen Provider zu veröffentlichen und zu aktualisieren, ist der idempotente Upsert-Endpunkt der Codesphere Public API. Sende eine PUT-Anfrage an /managed-services/providers:
- Existiert noch kein Provider mit demselben
nameund derselbenschemaVersion, wird er erstellt. - Existiert bereits einer, werden alle veränderbaren Felder direkt aktualisiert.
Das bedeutet, du kannst dieselbe Anfrage verwenden, um einen Provider zu erstellen und um spätere Änderungen auszurollen — du musst nicht nachverfolgen, ob der Provider bereits existiert. Das ist zum Beispiel in CI/CD-Pipelines nützlich.
Du kannst entweder eine Git-URL angeben, die die provider.yml-Datei enthält, oder die vollständige Provider-Spezifikation direkt im Payload bereitstellen.
tipp
Es gibt weiterhin dedizierte Endpunkte für Erstellung (POST) und Aktualisierung (PATCH) für partielle Updates und explizitere Workflows. Für die meisten Fälle ist der Upsert-Endpunkt jedoch die einfachste Wahl.
Versionen können nur ergänzt werden
Du kannst neue Einträge zu versions hinzufügen, aber bestehende Versionseinträge können über einen Upsert nicht geändert oder entfernt werden. Alle anderen Provider-Felder werden direkt aktualisiert.
- provider.yml aus Git abrufen
- Vollständige Spezifikation angeben
Der einfachste Ansatz ist die Angabe der Git-Repository-URL. Codesphere ruft die provider.yml-Datei automatisch aus deinem Repository ab und validiert sie.
hinweis
Wird gitRef nicht angegeben, wird der Standard-Branch des Repositorys verwendet, um die provider.yml-Datei abzurufen.
curl -X PUT "https://<your-codesphere-url>/api/managed-services/providers" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"gitUrl": "https://github.com/your-org/mattermost-landscape",
"gitRef": "my-branch",
"scope": {
"type": "global"
}
}'
Für mehr Kontrolle, oder wenn du keine provider.yml-Datei in dein Repository aufnehmen möchtest, kannst du die vollständige Provider-Spezifikation direkt in der API-Anfrage angeben:
curl -X PUT "https://<your-codesphere-instance-url>/api/managed-services/providers" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "mattermost",
"schemaVersion": "v1",
"author": "Your Team",
"displayName": "Mattermost",
"iconUrl": "https://example.com/mattermost-icon.png",
"category": "collaboration",
"description": "Open-source team messaging platform.",
"backend": {
"landscape": {
"gitUrl": "https://github.com/your-org/mattermost-landscape",
"ciProfile": "production"
}
},
"configSchema": {
"type": "object",
"properties": {
"SITE_NAME": {
"type": "string",
"description": "Display name for your Mattermost instance"
},
"MAX_USERS": {
"type": "integer",
"description": "Maximum number of users allowed"
}
}
},
"secretsSchema": {
"type": "object",
"properties": {
"ADMIN_PASSWORD": {
"type": "string",
"format": "password"
}
}
},
"detailsSchema": {
"type": "object",
"properties": {
"hostname": { "type": "string" },
"port": { "type": "integer" }
}
},
"plans": [],
"scope": {
"type": "team",
"teamIds": [42, 43]
},
"versions": {
"0.0.1": {
"ciProfile": "debug",
"gitRef": "1a410efbd13591db07496601ebc7a059dd55cfe9",
"description": "Initial release"
},
"1.0.0-rc": {
"appVersion": "Nextcloud v33",
"ciProfile": "prod",
"gitRef": "release-branches/1-0-0-rc",
"description": "Release Candidate.\nChangelog:\n - Feature X\n - Feature Y\n - Fix Z\n"
},
"1.0.0": {
"appVersion": "Nextcloud v33",
"ciProfile": "prod",
"gitRef": "release-tags/1-0-0",
"description": "Long Term Support Release"
}
}
}'
Provider-Scopes
Beim Erstellen eines Providers kannst du dessen Sichtbarkeitsbereich festlegen:
| Scope-Typ | Beschreibung |
|---|---|
global | Für alle Teams der Codesphere-Instanz verfügbar. Erfordert Cluster-Admin-Berechtigungen. |
team | Nur für die angegebenen Teams verfügbar. Ein Array von teamIds wird angegeben. |
Übergabe von Konfiguration an Landscapes
Wird ein Service aus einem Landscape-basierten Provider erstellt, werden die Eingaben des Benutzers an die Landscape weitergegeben: Eigenschaften aus dem configSchema werden als Umgebungsvariablen gesetzt, und Secrets aus dem secretsSchema werden in den Vault der Landscape eingefügt. Beide können in der ci.yml-Datei der Landscape referenziert werden:
schemaVersion: v0.2
run:
my-service:
steps:
- command: ./start.sh
env:
APP_VERSION: ${{ workspace.env['APP_VERSION'] }}
ADMIN_PASSWORD: ${{ vault.ADMIN_PASSWORD }}
In diesem Beispiel ist APP_VERSION eine Eigenschaft des configSchema des Providers und ADMIN_PASSWORD eine Eigenschaft des secretsSchema des Providers.
Update-Einschränkungen mit x-update-constraint
Das configSchema unterstützt eine benutzerdefinierte Erweiterung x-update-constraint, mit der du einschränken kannst, wie einzelne Eigenschaften
nach der Erstellung eines Services geändert werden können. Das ist nützlich, um betriebliche Regeln durchzusetzen — zum Beispiel um zu verhindern, dass Speicherplatz
verringert wird, oder um die Version einer Datenbank-Engine nach der Ersteinrichtung festzuschreiben.
Füge das Schlüsselwort x-update-constraint zu einer beliebigen Eigenschaft in deinem configSchema hinzu:
configSchema:
type: object
properties:
storage:
type: integer
description: Storage allocation in GB
x-update-constraint: increase-only
version:
type: string,
description: Version of the Postgres DB.
enum: ['17.6', '16.10', '15.14', '14.19', '13.22']
x-update-constraint: immutable,
Verfügbare Einschränkungen
| Einschränkung | Verhalten |
|---|---|
increase-only | Der neue Wert muss größer oder gleich dem aktuellen Wert sein. Gilt nur für numerische Felder. |
immutable | Die Eigenschaft kann nach dem Setzen nicht mehr geändert werden. |
info
Update-Einschränkungen greifen nur beim Aktualisieren eines bestehenden Services. Bei der Ersterstellung werden alle Werte akzeptiert, solange sie die Standard-Schemavalidierung bestehen.
Unterstützte Formate
Provider-Schemas verwenden die JSON Schema-Validierung. Die folgenden format-Werte werden in Schema-Eigenschaften unterstützt:
int32, int64, float, double, byte, binary, date, date-time, password, uri, hostname
Dynamische Details mit x-endpoint
Das detailsSchema unterstützt eine benutzerdefinierte OpenAPI-Erweiterung x-endpoint, mit der du Runtime-Details dynamisch von deinem Service abrufen kannst. Das ist nützlich, um Live-Statusinformationen, Metriken oder andere Daten abzurufen, die sich nach der Provisionierung ändern.
Ist x-endpoint für eine Eigenschaft gesetzt, ruft Codesphere den Wert vom angegebenen Endpunkt ab. Die Endpunkt-URL unterstützt Interpolation mithilfe anderer Details-Felder.
detailsSchema:
type: object
properties:
hostname:
type: string
port:
type: integer
status:
type: object
properties:
state:
type: string
uptime:
type: number
x-endpoint: "https://{{hostname}}:{{port}}/status"
In diesem Beispiel wird die Eigenschaft status dynamisch über den /status-Endpunkt des Services abgerufen, unter Verwendung der Werte hostname und port.
info
Für x-endpoint werden nur GET-Anfragen unterstützt. Der Endpunkt muss JSON zurückgeben, das der Schema-Definition der Eigenschaft entspricht.
Benutzerdefinierte REST-Backends
Die Managed-Services-Architektur von Codesphere ist erweiterbar konzipiert. Falls Landscape-basierte Provider deinen spezifischen Anforderungen nicht entsprechen, kannst du dein eigenes benutzerdefiniertes REST-Backend implementieren.
tipp
Eine vollständige Anleitung zur Implementierung der Managed Service Adapter API-Spezifikation findest du unter Ein benutzerdefiniertes REST-Backend erstellen.