Registry¶
Was ist die Polycrate Registry?¶
Polycrate-Blöcke können in OCI-kompatible Registries gepusht und von ihnen gepullt werden, ähnlich wie Docker-Images. Dies ermöglicht die Verteilung und Wiederverwendung von Blocks über Teams und Organisationen hinweg.
Als Standard-Registry verwendet Polycrate cargo.ayedo.cloud, um Blöcke zu pullen oder zu pushen.
Registry-Architektur¶
flowchart TB
Dev("Entwickler") --> Push["polycrate blocks push"]
Push --> Package["Block wird gepackt"]
Package --> OCI(("OCI Artifact"))
OCI --> Registry(("OCI Registry"))
Registry --> Pull["polycrate blocks pull"]
Pull --> Extract["Block entpacken"]
Extract --> Workspace["Workspace blocks/"]
User("Nutzer") --> AutoPull["polycrate run --blocks-auto-pull"]
AutoPull --> Check{Block lokal?}
Check -->|Nein| Pull
Check -->|Ja| Run["Action ausführen"] Authentifizierung¶
Polycrate implementiert keine eigene Authentifizierung mit der Registry, sondern nutzt stattdessen Ihren lokalen Docker Credential Helper.
Um sich bei einer Registry zu authentifizieren:
# Bei Registry anmelden
docker login cargo.ayedo.cloud
# Oder bei custom Registry
docker login my-registry.com
# Credentials werden in ~/.docker/config.json gespeichert
# Polycrate nutzt diese automatisch
Registry-Konfiguration¶
Registry-URL im Block-Namen¶
Die Registry-URL muss immer im Block-Namen angegeben werden – sowohl bei pull als auch bei push:
# Vollständiger Registry-Pfad (PFLICHT)
polycrate blocks pull registry.my-org.com/team/my-block:1.0.0
# Von cargo.ayedo.cloud
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
Kein Kurzname-Support
Anders als bei Docker gibt es keine Standard-Registry. Kurznamen wie my-block:1.0.0 funktionieren nicht – Polycrate würde sie als lokale Blocks interpretieren.
Registry-Proxying für Airgapped Umgebungen¶
Für airgapped/on-premise Umgebungen, in denen externe Registries nicht erreichbar sind, können Sie Registry-Proxies auf Workspace-Level konfigurieren. Dies ermöglicht es, Block-Referenzen transparent von einer Registry zu einer anderen umzuleiten.
Anwendungsfall:
In einer airgapped Umgebung ohne Zugriff auf cargo.ayedo.cloud können Sie eine lokale OCI Registry wie Harbor als Proxy verwenden, die die Blocks gespiegelt hat.
Konfiguration in workspace.poly:
name: my-workspace
registry:
endpoint: registry.enterprise.com
# Credentials in secrets.poly auslagern (siehe unten)
proxy:
# Pattern-basierte Registry-Rewrites
- from: cargo.ayedo.cloud/ayedo
to: registry.enterprise.com/cargo-proxy/ayedo
- from: hub.polycrate.io
to: registry.enterprise.com/polyhub-mirror
- from: ghcr.io/company
to: registry.enterprise.com/github-mirror/company
blocks:
# Diese Referenz wird automatisch umgeschrieben
- name: k8s-nginx
from: cargo.ayedo.cloud/ayedo/k8s/haproxy:2.0.4
# → wird zu: registry.enterprise.com/cargo-proxy/ayedo/k8s/nginx:1.0.0
Credentials in secrets.poly:
# secrets.poly (wird bei workspace encrypt verschlüsselt)
registry:
username: admin
password: geheim123
proxy:
- from: cargo.ayedo.cloud/ayedo
username: proxy-user
password: proxy-geheim
Alternative: Docker Login
Statt Credentials in Polycrate zu hinterlegen, können Sie sich vorab mit docker login registry.enterprise.com authentifizieren. Polycrate nutzt dann automatisch die Docker-Credentials.
Wie es funktioniert:
- Polycrate prüft jede Block-Registry-URL gegen alle
proxy-Einträge - Bei Match wird
fromdurchtoin der URL ersetzt - Optional können Pro-Proxy Credentials angegeben werden
- Falls kein Match, wird die Original-URL verwendet
Beispiel-Rewrite-Logik:
Original: cargo.ayedo.cloud/ayedo/k8s/haproxy:2.0.4
From: cargo.ayedo.cloud/ayedo
To: registry.enterprise.com/cargo-proxy/ayedo
Result: registry.enterprise.com/cargo-proxy/ayedo/k8s/nginx:1.0.0
Mehrere Proxy-Patterns:
registry:
proxy:
# Spezifische Namespace-Proxies (werden zuerst geprüft)
- from: cargo.ayedo.cloud/ayedo/k8s
to: registry.enterprise.com/kubernetes-blocks
# Catch-all für restliche ayedo-Blocks
- from: cargo.ayedo.cloud/ayedo
to: registry.enterprise.com/ayedo-mirror
# Andere Registries
- from: docker.io/library
to: registry.enterprise.com/dockerhub-library
Best Practices für Registry-Proxying:
- Spezifische Patterns zuerst: Sortieren Sie Proxies von spezifisch zu generisch
- Credentials Management: Nutzen Sie
secrets.polyfür Passwörter oderdocker login - Registry-Spiegelung: Stellen Sie sicher, dass die Proxy-Registry die Blocks enthält
- Testing: Testen Sie die Proxy-Konfiguration mit
--loglevel 2für Debug-Output
Harbor als Registry-Proxy einrichten:
Harbor ist eine beliebte OCI-Registry für on-premise Deployments:
# workspace.poly - Harbor Proxy-Setup
registry:
endpoint: harbor.company.com
proxy:
- from: cargo.ayedo.cloud
to: harbor.company.com/proxy-cache
# secrets.poly - Credentials (verschlüsselt speichern!)
registry:
username: admin
password: harbor-admin-password
proxy:
- from: cargo.ayedo.cloud
username: proxy-bot
password: proxy-bot-password
In Harbor: 1. Erstellen Sie ein Projekt proxy-cache 2. Konfigurieren Sie einen Proxy-Cache-Endpoint zu cargo.ayedo.cloud 3. Harbor lädt Blocks on-demand und cached sie lokal
Troubleshooting:
# Debug-Modus aktivieren für Registry-Resolution
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/haproxy:2.0.4 --loglevel 2
# Ausgabe zeigt:
# INFO: Registry proxy match found: cargo.ayedo.cloud/ayedo/k8s/haproxy -> registry.enterprise.com/cargo-proxy/ayedo/k8s/nginx
# DEBUG: Using proxy credentials for registry: registry.enterprise.com/cargo-proxy
Blocks pullen¶
Manuelles Pullen¶
Um Blocks dynamisch aus der Registry zum Workspace hinzuzufügen:
# Block mit spezifischer Version pullen
polycrate blocks pull registry.my-org.com/infra/postgres:1.2.0
# Von cargo.ayedo.cloud pullen
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
# Von Docker Hub pullen (falls Blocks dort gehostet)
polycrate blocks pull index.docker.io/myuser/my-block:1.0.0
Vollständiger Registry-Pfad erforderlich
Kurznamen wie postgres-base:1.2.0 funktionieren nicht. Sie müssen immer den vollständigen Registry-Pfad angeben.
Der Block wird nach blocks/<block-name>/ im Workspace heruntergeladen.
Automatisches Pullen mit --blocks-auto-pull¶
Statt Blocks manuell zu pullen, können Sie das --blocks-auto-pull Flag verwenden:
# Bei Action-Ausführung
polycrate run my-app install --blocks-auto-pull
# Bei Workflow-Ausführung
polycrate workflows run deploy-stack --blocks-auto-pull
# Bei Block-Inspection
polycrate blocks inspect my-app --blocks-auto-pull
Polycrate pulled dann automatisch alle fehlenden Dependencies.
Pull-Prozess¶
sequenceDiagram
participant CLI
participant Docker
participant Registry
participant Workspace
CLI->>CLI: Parse block name & Version
CLI->>Docker: Check credentials
Docker-->>CLI: Credentials OK
CLI->>Registry: Request manifest
Registry-->>CLI: Manifest & Layers
CLI->>Registry: Download layers
Registry-->>CLI: Layer data
CLI->>CLI: Extract package
CLI->>Workspace: Write blocks/<name>/
CLI-->>CLI: Pull complete Blocks deinstallieren¶
# Block aus Workspace entfernen
polycrate blocks uninstall postgres-base
# Oder manuell löschen
rm -rf blocks/postgres-base
Blocks pushen¶
Basic Push¶
Um einen Block in eine OCI-kompatible Registry zu pushen:
# Vollständiger Registry-Pfad (PFLICHT)
polycrate blocks push registry.my-org.com/team/my-block
# Zu cargo.ayedo.cloud pushen
polycrate blocks push cargo.ayedo.cloud/my-org/k8s/my-block
Kein Kurzname-Support
Kurznamen wie polycrate blocks push my-block funktionieren nicht. Sie müssen immer den vollständigen Registry-Pfad angeben.
Versionierung beim Push
Beim Pushen eines Blocks lässt du das Tag (also alles nach dem Doppelpunkt) weg – Polycrate ergänzt automatisch die in block.poly definierte Version.
Beispiel:
Push-Prozess¶
sequenceDiagram
participant CLI
participant Workspace
participant Docker
participant Registry
CLI->>Workspace: Read block.poly
Workspace-->>CLI: Name & Version
CLI->>CLI: Package block
CLI->>Docker: Check credentials
Docker-->>CLI: Credentials OK
CLI->>Registry: Push manifest
CLI->>Registry: Push layers
Registry-->>CLI: Push complete
CLI-->>CLI: Success Beispiele¶
# Zu eigener Registry pushen
polycrate blocks push registry.my-org.com/team/my-block
# Zu cargo.ayedo.cloud pushen
polycrate blocks push cargo.ayedo.cloud/my-org/k8s/my-block
# Zu Docker Hub pushen
polycrate blocks push index.docker.io/myuser/my-block
Praktische Beispiele¶
Beispiel 1: Team-Library aufbauen¶
# 1. Basis-Block erstellen (Name = vollständiger Registry-Pfad)
mkdir -p my-workspace/blocks/registry.mycompany.com/infra/postgres
cd my-workspace/blocks/registry.mycompany.com/infra/postgres
cat > block.poly <<EOF
name: registry.mycompany.com/infra/postgres
version: 1.0.0
kind: k8sapp
actions:
- name: install
playbook: playbooks/install.yml
EOF
# 2. Zur Team-Registry pushen
polycrate blocks push registry.mycompany.com/infra/postgres
# 3. Team-Mitglieder können pullen
polycrate blocks pull registry.mycompany.com/infra/postgres:1.0.0
Block-Name = Registry-Pfad
Wenn ein Block für eine Registry erstellt wird, muss name: in block.poly dem vollständigen Registry-Pfad entsprechen (ohne Version).
Beispiel 2: Multi-Registry Setup¶
# workspace.poly mit mehreren Registries
name: my-workspace
blocks:
# Von cargo.ayedo.cloud (ayedo Blocks)
- name: postgres
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
# Von privater Company Registry
- name: company-base
from: registry.mycompany.com/infra/base:2.0.0
# Von Docker Hub
- name: some-tool
from: index.docker.io/someuser/tool:1.0.0
Beispiel 3: CI/CD Pipeline¶
# .github/workflows/publish-block.yml
name: Publish Block
on:
push:
tags:
- 'v*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install Polycrate
run: curl -sSL https://get.polycrate.io | bash
- name: Docker Login
run: echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login registry.mycompany.com -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
- name: Push Block
run: polycrate blocks push registry.mycompany.com/infra/my-block
Beispiel 4: Versionierte Releases¶
# Version in block.poly erhöhen
sed -i 's/version: 1.0.0/version: 1.1.0/' blocks/my-block/block.poly
# Git Commit und Tag
git add blocks/my-block/block.poly
git commit -m "Bump my-block to v1.1.0"
git tag v1.1.0
git push --tags
# Push zur Registry
polycrate blocks push registry.mycompany.com/infra/my-block
# Pushed als my-block:1.1.0
OCI-Kompatible Registries¶
Polycrate unterstützt alle OCI-kompatiblen Registries:
Öffentliche Registries¶
- cargo.ayedo.cloud: ayedo-betriebene Registry für Polycrate Blocks
- Docker Hub:
index.docker.io - GitHub Container Registry:
ghcr.io - Quay.io:
quay.io
Hub vs Registry
hub.polycrate.io ist keine Registry, sondern der Showroom/Marketplace. Die tatsächliche Block-Registry ist cargo.ayedo.cloud.
Self-Hosted Registries¶
- Harbor: Open-Source Enterprise Registry
- GitLab Container Registry: Integriert in GitLab
- Artifactory: JFrog Artifactory
- Nexus Repository: Sonatype Nexus
- Distribution: Docker Registry (Distribution)
Cloud Provider Registries¶
- AWS ECR:
<account-id>.dkr.ecr.<region>.amazonaws.com - Azure ACR:
<registry-name>.azurecr.io - Google GCR:
gcr.io,eu.gcr.io,us.gcr.io - DigitalOcean Registry:
registry.digitalocean.com
Block Packaging¶
Wenn Sie einen Block pushen, erstellt Polycrate ein OCI Artifact mit folgender Struktur:
OCI Artifact: my-block:1.2.3
├── Manifest
│ ├── Config Layer (block.poly Metadata)
│ └── Content Layers
│ ├── block.poly
│ ├── templates/*
│ ├── playbooks/*
│ ├── scripts/*
│ ├── README.md
│ └── CHANGELOG.poly
Nicht gepackt werden:
.git/Verzeichnisartifacts/Verzeichnis- Temporäre Dateien
Best Practices¶
1. Semantische Versionierung verwenden¶
- MAJOR: Breaking Changes (1.x.x → 2.0.0)
- MINOR: Neue Features, rückwärtskompatibel (1.2.x → 1.3.0)
- PATCH: Bugfixes (1.2.3 → 1.2.4)
2. Versionierte Tags in from: verwenden¶
# workspace.poly
blocks:
# ✅ Gut: Pinned version mit vollem Registry-Pfad
- name: my-postgres
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
# ❌ Schlecht: Latest (kann unerwartet brechen)
- name: my-postgres-bad
from: cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:latest
3. Private Registries für proprietäre Blocks¶
# Company-interne Blocks
polycrate blocks push registry.mycompany.com/infra/proprietary-block
# Öffentliche Basis-Blocks (von cargo.ayedo.cloud)
polycrate blocks pull cargo.ayedo.cloud/ayedo/k8s/cloudnative-pg:1.3.1
4. Namespace-Organisation¶
registry.mycompany.com/
├── infra/ # Infrastructure Blocks
│ ├── postgres-base
│ ├── redis-base
│ └── nginx-base
├── apps/ # Application Blocks
│ ├── webapp-base
│ └── api-base
└── tools/ # Utility Blocks
├── backup-tools
└── monitoring-base
Troubleshooting¶
Authentication failed¶
Error: authentication required
# Lösung: Docker Login
docker login cargo.ayedo.cloud
# Oder für custom Registry
docker login my-registry.com
Block not found¶
Error: block 'my-block:1.0.0' not found in registry
# Prüfen ob Block existiert
docker manifest inspect cargo.ayedo.cloud/my-org/my-block:1.0.0
# Prüfen verfügbare Tags
docker search cargo.ayedo.cloud/my-org/my-block
# Richtigen Namen verwenden
polycrate blocks pull cargo.ayedo.cloud/my-org/my-block:1.0.0
Push permissions denied¶
Error: denied: insufficient permissions
# Lösung 1: Mit richtigen Credentials einloggen
docker login registry.mycompany.com -u myuser
# Lösung 2: Prüfen ob Namespace existiert
# Namespace muss existieren: registry.mycompany.com/namespace/block
# Lösung 3: Registry-Admin kontaktieren für Permissions
Version conflict¶
Error: block 'my-block' already exists with different version
# Lösung: Version in block.poly erhöhen
sed -i 's/version: 1.0.0/version: 1.0.1/' blocks/my-block/block.poly
# Dann erneut pushen
polycrate blocks push registry.mycompany.com/infra/my-block
Registry nicht erreichbar¶
Error: failed to connect to registry
# Prüfen Netzwerk-Verbindung
ping registry.mycompany.com
curl https://registry.mycompany.com/v2/
# Prüfen Docker Konfiguration
cat ~/.docker/config.json
# Prüfen Proxy-Einstellungen
echo $HTTP_PROXY
echo $HTTPS_PROXY
Zusammenhang mit anderen Konzepten¶
- Polycrate Hub: Öffentliche Registry für Community-Blocks
- Dependencies: Blocks können Dependencies aus Registry pullen
- Vererbung:
from:stanza referenziert Registry-Blocks - Blocks: Registry verteilt Blocks
Registry Best Practice
Nutzen Sie private Registries für interne Blocks und den Polycrate Hub für öffentliche, wiederverwendbare Blocks. Versionieren Sie alle Blocks semantisch und pflegen Sie ein CHANGELOG.poly!