Skip to content

Von Storyblok zu Peacock migrieren

Peacock spricht denselben Geist wie Storyblok — Stories, ComponentBlueprints, Multi-Locale, Visual-Editor. Migration ist deshalb ein Mapping, kein Rewrite.

CLI-Importer

bash
npx @peacock/cli import storyblok \
  --space-id <storyblok-space-id> \
  --token <storyblok-management-token> \
  --target https://peacock-cms.webhoch.com \
  --target-token <peacock-management-token> \
  --target-space <peacock-space-slug>

Der Importer macht in drei Phasen:

1. Components → ComponentBlueprints

Jeder Storyblok-Component wird in eine ComponentBlueprint (JSON Schema) übersetzt. Field-Types werden 1:1 gemappt:

Storyblok-TypePeacock-Schema
text / textareastring
richtextstring mit format: "richtext-html"
markdownstring mit format: "markdown"
numberinteger / number
booleanboolean
datetimestring mit format: "date-time"
assetobject mit $ref: "asset"
linkobject mit url + target
option / optionsenum
bloks (nested)array von oneOf

2. Stories → Stories

Jede Storyblok-Story wird mit allen Versionen importiert. Der Importer schreibt:

  • slug + full_path (Tree-Struktur)
  • lang (pro Locale eine Story-Row in Peacock — Storyblok hat Übersetzungen am selben Story-Objekt, Peacock pro Locale eigene Story-Records)
  • content (kompatibles JSON-Shape — _component statt Storyblok's component, sonst identisch)
  • published_version_id zeigt auf die aktuell-publishte Version

3. Assets → Assets

Storyblok-CDN-URLs werden zu Peacock-Assets:

  • Original-Datei wird heruntergeladen + zu Peacock hochgeladen (S3-kompatibler MinIO bzw. Hetzner Object Storage).
  • Alt-Texte + Focal-Point + Crop-Hints werden mitgenommen.
  • Content-Felder mit Asset-Referenzen werden umgeschrieben (alte URL → neue Peacock-Asset-UUID).

Was NICHT migriert wird

  • Storyblok Datasources → Peacock-Datasources haben eine andere Konfiguration. Du legst sie nach dem Import manuell neu an.
  • Storyblok Workflows + Approval-Stages → Peacock-Workflows sind pro-Space individuell.
  • Storyblok Visual-Editor Bridge → Peacock nutzt eine eigene Postmessage-Bridge (@peacock/sdk-astro enthält sie).

Frontend-Code anpassen

Wenn dein Frontend storyblok-js-client verwendet:

diff
- import StoryblokClient from 'storyblok-js-client';
- const sb = new StoryblokClient({ accessToken: '...' });
- const { data } = await sb.get('cdn/stories/about');

+ import { createClient } from '@peacock/sdk-js';
+ const peacock = createClient({
+   baseUrl: 'https://peacock-cms.webhoch.com',
+   spaceSlug: 'mein-space',
+ });
+ const result = await peacock.getStory('/about');
+ if (result.status === 'ok') {
+   const story = result.story;
+ }

Re-Run / Idempotenz

Der Importer ist idempotent: wenn du ihn ein zweites Mal startest, werden vorhandene Stories/Blueprints aktualisiert (nicht dupliziert). Praktisch für "Storyblok ist noch live, ich migriere schrittweise" — du synchronisierst regelmäßig, bis du Peacock verlassen-fertig hast und Storyblok abdrehst.

Siehe auch