Zum Inhalt

Polycrate API 0.13.0

Release-Datum: 25. Februar 2026
Typ: Feature-Release

Highlights

Version 0.13.0 fuehrt den Pricing & Business Layer als Ersatz fuer Baserow ein, ermoegliche RocketChat-Integration fuer automatisches Channel-Management und vervollstaendigt die Region Default Products-Logik fuer S3 und Loadbalancer.

  • Pricing & Business Layer — Abloesung von Baserow: Product-Katalog, PricingRule, PricingQuote, OrganizationProduct, SLO Pre-Computation
  • RocketChat Integration — Automatisches Channel-Management und OIDC Channel-Mapping fuer Organizations mit Premium/Priority Support
  • Region Default Products — S3Cluster und LoadbalancerInstance erhalten automatisch Products aus konfigurierbaren Systemdefaults
  • Mattermost Native API — Bot-Token-Modus mit Rich Messaging, Action Buttons und Rueck-Aktionen
  • Operator Deployment Dashboard — Systemuebergreifender Ueberblick ueber Operator-Rollout-Status
  • Condition-gesteuerte Note Lifecycleadd_condition/remove_condition optional an Todos/Notes gebunden
  • SLO/SLA Pre-Computation — Celery-Task fuer vorberechnete Uebersichten via Redis-Cache
  • System Owner & Health Banner — Explizite UI fuer System Owner, Health-Checkliste in System Insights

Artefakte

Docker Images

docker pull cargo.ayedo.cloud/polycrate/polycrate-api:0.13.0

Deployment

polycrate run polycrate-api install

Neue Features

Pricing & Business Layer

Abloesung von Baserow als Backend fuer den Pricing Calculator. Preisdaten, Angebote und Verkaufshistorie werden jetzt nativ in der Polycrate API verwaltet.

Product-Katalog:

  • Product-Model mit kind-Differenzierung: host, support, object-storage, loadbalancer, k8sapp, k8scluster
  • PricingRule-Model fuer Preisregeln (flat/usage-based, Einheit, Waehrung)
  • OrganizationProduct-Model fuer Verkaufshistorie (was, an wen, zu welchem Preis, ab wann)
  • CostStatement-Model fuer monatliche Abrechnungseinheiten
  • PricingQuote-Model fuer Angebote (ersetzt Baserow-Tabellen)

Migration aus Baserow:

# Products migrieren (NodeTypes + SupportPackages + K8sApp-Preise)
python manage.py migrate_products --token <BASEROW_TOKEN>

# Quotes migrieren
python manage.py migrate_pricing_quotes --token <BASEROW_TOKEN>

# Hosts mit Products verknuepfen
python manage.py match_host_products --reconcile

Berechnete Kosten:

  • S3Bucket.computed_cost: Nutzungsbasiert (KB → GB × Preis/GB)
  • LoadbalancerInstance.computed_cost: Flat-Rate (1 Instanz × Monatspreis)
  • Host.computed_cost: Ueber match_host_products Command zugewiesen

RocketChat Integration

Jede Organization mit einem aktiven Support-Product, das features.rocketchat_channel=true traegt, erhaelt automatisch einen privaten RocketChat Channel.

Funktionsumfang:

  • Automatische Channel-Erstellung bei Organization-Reconciliation
  • OIDC Channel-Mapping Sync via Celery Task sync_rocketchat_channel_mappings
  • System-Org hat Zugriff auf alle Channels (Array-Format im Mapping)
  • Channel-Archivierung bei Organization-Archivierung
  • Condition ORGANIZATION_ROCKETCHAT_CHANNEL_MISSING bei fehlgeschlagener Erstellung
  • Auto-Discovery des OAuth-Provider-Settings via RocketChat Settings API

Konfiguration (System Config → Integration: RocketChat):

ROCKETCHAT_ENABLED = true
ROCKETCHAT_API_ENDPOINT = https://chat.example.com/api/v1
ROCKETCHAT_ADMIN_USER_ID = <admin-user-id>
ROCKETCHAT_ADMIN_AUTH_TOKEN = <personal-access-token>
ROCKETCHAT_CHANNEL_PREFIX = (optional, z.B. "org-")

Feature Flag am Product:

{
  "features": {
    "rocketchat_channel": true
  }
}

Region Default Products

S3-Buckets und LoadbalancerInstances erhalten jetzt automatisch ein Product-Assignment, sobald ein Default auf Cluster- oder Systemebene konfiguriert ist.

S3Cluster:

  • Neues default_product-FK-Feld (kind=object-storage) auf S3Cluster
  • Beim Anlegen neuer Buckets wird das Product automatisch aus dem Cluster vorbelegt
  • Backfill bei Reconciliation: alle Buckets ohne Product erhalten das Cluster-Default
  • S3BucketForm.clean() blockiert Bucket-Erstellung wenn kein Default konfiguriert ist
  • Condition S3_CLUSTER_DEFAULT_PRODUCT_MISSING als Warning

LoadbalancerInstance:

  • Auto-Assignment aus SystemConfig.default_loadbalancer_product
  • Wird bei save() und run_reconciliation() gesetzt (deckt historischen Backfill ab)

SystemConfig:

  • default_s3_product: Vorschlag fuer neue S3 Cluster
  • default_loadbalancer_product: Direktes Auto-Assignment auf alle LBIs

DrawerTable:

  • S3ClusterDrawerTable: Neue Spalte Default Product mit Link
  • S3BucketDrawerTable: Neue Spalten Product (Link auf OrganizationProduct) + Computed Cost
  • LoadbalancerInstanceDrawerTable: Neue Spalten Product + Computed Cost

Mattermost Native API

Mattermost-Benachrichtigungen koennen jetzt neben dem klassischen Webhook-Modus auch ueber die native Mattermost Bot-API versendet werden.

Vorteile des API-Modus:

  • Rich Formatting (Attachments mit Feldern)
  • Action Buttons (z.B. "Downtime bestaetigen", "Snooze")
  • Message-Updates (bestehende Nachricht wird aktualisiert statt neu gepostet)
  • Thread-Replies fuer Note-Updates

Konfiguration (Notification Sink → Edit):

  • mattermost_mode: webhook (Standard) oder api
  • Im API-Modus: bot_token (Mattermost Bot Account), integration_token fuer Callback-Verifikation

Operator Deployment Dashboard

Neues System-Dashboard unter System → Operator Rollout, das den Operator-Deployment-Status ueber alle Workspaces und Cluster visualisiert.

Inhalt:

  • Pro Workspace/Cluster: aktuell deployete Operator-Version vs. verfuegbare Version
  • Update-Verfuegbarkeit und Rollout-Gating
  • Blockierungen und ausstehende Konfigurationsschritte

Condition-gesteuerte Note Lifecycle

add_condition und remove_condition koennen optional mit einer Note/Todo verknuepft werden.

Beispiel K8sCluster Cert-Expiry:

  • Bei Hinzufuegen der Condition K8S_CLUSTER_CERT_EXPIRY wird automatisch ein Todo-Note erstellt
  • Bei Entfernen der Condition wird die Note automatisch geschlossen
  • Abloesung der bisherigen "Geburtstag"-Policy fuer Zertifikatsablauf

SLO/SLA Pre-Computation

SLO-Uebersichten werden jetzt im 5-Minuten-Intervall via Celery vorberechnet und in Redis gecacht.

Cache-Ebenen:

  • Global (systemweit)
  • Per-Organization
  • Per-Workspace

Der View-seitige Cache-Lookup ersetzt die bisherige On-Demand-Berechnung und eliminiert Timeouts bei grossen Datenmengen.

System Owner & Health Banner

  • Explizite UI fuer die Zuweisung des System Owners (keine automatische Zuweisung mehr)
  • Health-Banner in der Topbar bei aktiven System-Warnings
  • System Insights Umbau mit metricChart-Widget und Health-Checkliste

Verbesserungen

BackupSchedule Name-Validierung

BackupScheduleSerializer validiert den name-Parameter jetzt analog zu BackupSerializer via validate_name(). Verhindert Konflikte bei identischen Namen innerhalb einer Organization.

K8sAppInstance Bereinigung

Migration 0190 loescht alle K8sAppInstance-Datensaetze als Vorbereitung fuer das Model-Removal in 0.14.0.

Provider & PoP Seed Data

Globale Hyperscaler (AWS, Azure, GCP, DigitalOcean, OCI, IBM Cloud, Alibaba Cloud) und europaeische Cloud-Provider mit ihren PoPs als Seed Data verfuegbar:

python manage.py seed --providers --pops --datasources

UI-Verbesserungen

  • Alle rounded-*-Klassen entfernt: Forms, Widgets, Auth-Seiten, Error Pages — konsequent kantige Labels
  • Dashboard PoP-Map-Widget: Weltkarte mit Workspace-zugeordneten PoPs als oberstes Dashboard-Element
  • Dependent Select Fields: Alpine.js-basierte generische Loesung fuer kaskadierte Select-Felder (Org → Workspace u.a.)
  • Topbar Todo-Indikator: Icon + Count-Badge + Alpine.js-Dropdown fuer dem User zugewiesene offene Todos
  • Catalogue App Sortierung: Default-Sortierung nach Serial Number, Draft-Filter

Migration

Django Migrations laufen automatisch beim Container-Start. Manuelle Post-Deployment-Schritte sind erforderlich — siehe:

Post-Deployment Anleitung (intern)

Migrations-Uebersicht:

App Migration Beschreibung
organizations 0077 rocketchat_channel_id, rocketchat_channel_name Felder
organizations 0076 Cached Product Cost Fields
s3 0062 S3Cluster.default_product FK
s3 0061 S3Cluster.default_product (weitere Felder)
loadbalancers 0035 LoadbalancerInstance.product FK
polycrate_api 0061 SystemConfig.default_s3_product, default_loadbalancer_product
polycrate_api 0060 SystemConfig.default_support_product
polycrate_api 0059 Activity.kind Anpassung
notes 0035 Note.condition Feld
workspaces 0123 Cached Product Cost Fields
k8s 0190 K8sAppInstance Datensaetze loeschen
k8s 0189 K8sApp.product FK
k8s 0188 K8sCluster.product FK
hosts 0074 Host.product FK
artifacts 0041 CatalogueApp + Product FKs

polycrate-api Block

Block-Version: 0.8.0 (app_version: 0.13.0)

polycrate pull cargo.ayedo.cloud/ayedo/k8s/polycrate-api
polycrate run polycrate-api install