Skip to main content

Center-Website von Cockpit nach v0 migrieren

Für wen: Entwickler, IT, Agentur — plus Projektleitung, die den Unterschied zu „neues Design in v0“ verstehen muss.
Referenz-Implementierung: ILG-Template → Repo smg-ilg-template-website (Ordner website-ilg/ im Monorepo).

Das ist der Zielweg. WordPress, die Center-Website-SPA und die Signage-App sind veraltet — bestehende Instanzen bleiben, bis dieser Umzug fertig ist.

Redaktion pflegt weiterhin alle Inhalte und Optionen im Cockpit (Webseiten-Reiter, Shops, Aktuelles). Es werden keine Center-Daten migriert oder überschrieben — nur das Frontend wechselt zu einem eigenen Next.js-Deploy (v0 + GitHub + Vercel).


Was / Warum / Wer / Wo

WasEin bestehendes Center-Template (z. B. ILG) wird als Standalone-Repo exportiert, in v0 importiert und auf Vercel deployed. Live-Daten kommen über die öffentliche Cockpit-API.
WarumEigenes Design-Hosting (v0), ein Vercel-Projekt für viele Center (Shared Layout), weniger Render-Last der Monorepo-Website, schnellere Template-Iteration ohne Full-Monorepo-Deploy.
WerDev/IT: Repo, Routen, Env, Domains. Redaktion: unverändert Cockpit. v0: Feintuning am Layout — keine erfundenen Shop-Namen.
Wo (Cockpit)Center → Webseite · Website-Management → Frontend-Kanäle (v0) · Custom Domain
Wo (Code)Monorepo: apps/center-website/components/templates/<template>/ · Export: website-<template>/ · GitHub: sawmuedev/smg-*-template-website

Zwei v0-Wege — nicht verwechseln

WegRichtungErgebnis
ZIP-Templatev0 → CockpitDesign wird ins Dashboard hochgeladen, läuft in bestehender center-websiteTemplates Intro, V0-TEMPLATE-WORKFLOW
Standalone v0-Repo (diese Seite)Cockpit-Template → v0Eigenes Next.js-Projekt, eigene Domain, liest Cockpit per API → ILG-Referenz unten

Merksatz: ZIP = Template in die Plattform. Migration = Frontend neben der Plattform, gleiche Datenquelle.


Architektur (kurz)

  1. Center-Auflösung: Hostname → GET /api/centers/by-domain?domain=… (Prod) oder DEFAULT_CENTER_SLUG (Preview: *.vercel.run, v0).
  2. Stammdaten + Template: GET /api/centers/{centerId}/public-visitor-surfacetemplatePublicContent.content (= templateContent.ilg o. Ä.), pagesConfig, Logo, Social, Öffnungszeiten.
  3. Seiten-Inhalte: GET /api/centers/{centerId}/page-content?pageType=shops|kontakt|…
  4. Listen/Details: Shops, Aktuelles-Bundle, Services, Offices, Kontakte — siehe Public API Vertrag.

Nicht nutzen für v0: GET …/website-config (Auth/401). Redaktion arbeitet im Dashboard; die Website liest nur öffentliche Endpunkte.


Migrations-Checkliste (Entwickler)

Phase 1 — Repo vorbereiten

  • Template-Ordner aus apps/center-website/components/templates/<name>/ in Standalone-Struktur bringen (Referenz: website-ilg/ilg/).
  • lib/cockpit/resolve-center.tsby-domain + Preview-Fallback (DEFAULT_CENTER_SLUG, Preview-Hosts).
  • Shared Helfer mitziehen: website-pages-defaults, Template-Sichtbarkeit (pageVisibility, pagesConfig), ggf. Export-Skript (scripts/export-website-ilg-v0-repo.mjs).
  • middleware.ts — Legacy-Pfade (z. B. /geschaefte/shops) für Bookmarks.
  • API-Routen: /api/kontakt (Proxy zum Dashboard), optional /api/revalidate.

Phase 2 — App Router

  • Listenseiten unter app/ (Shops, Kontakt, Aktuelles, …) — zentraler Loader (ILG: lib/ilg/ilg-route-page.tsx).
  • Detail-Routen (News, Events, Angebote, Jobs, Shops, Services, freie CMS-Seiten).
  • Route-Generator (scripts/generate-ilg-routes.mjs + pnpm routes:generate) — hält v0-Branch und main konsistent.
  • pagesConfig + SichtbarkeitnotFound() wenn Seite im Cockpit deaktiviert; Navigation filtert mit (mergeIlgLayout, Header).

Phase 3 — Parität zur Monorepo-Website

BereichSoll-Stand (ILG Referenz)
Webseiten-Reiter StartseiteHero, Info-Kacheln, Header/Footer aus templateContent
SEOgenerateMetadata pro Route, lib/seo-utils.ts
JSON-LDHomepage, Shops, Details, Breadcrumbs
Service-Details/services/[serviceSlug]
CenterplanStatisches Fallback-Bild (lageplan.fallbackImage) — ohne interaktives Wayfinding
Chatbot / KIBewusst optional / separater Schritt
KontaktProxy-API; Turnstile optional wie Monorepo

Phase 4 — v0 & Vercel

  • GitHub-Repo (Organisation sawmuedev) anlegen oder syncen.
  • v0: Import from GitHub — Instructions A, B, C, D, E, J; bei Multi-Center zusätzlich GInstructions A–J.
  • Zwei Branchs pflegen: main und v0-Branch (z. B. v0/iamsaad82-55cde441) — v0 deployed oft nicht main.
  • Env (Shared ILG-Beispiel):
NEXT_PUBLIC_DASHBOARD_URL=https://dashboard.cockpit-os.de
COCKPIT_VERCEL_PROJECT_MODE=shared
EXPECTED_WEBSITE_TEMPLATE=ilg
DEFAULT_CENTER_SLUG=<referenz-center-für-preview>
REVALIDATION_SECRET=<team-secret>
COCKPIT_DASHBOARD_URL=https://dashboard.cockpit-os.de
COCKPIT_FRONTEND_CHANNEL=website

Phase 5 — Go-Live

  • Cockpit: Center mit passendem websiteTemplate, Custom Domain pflegen.
  • Vercel: Domain am Shared-Projekt hinterlegen (nicht pro Center ein neues Projekt, wenn Instruction G).
  • cockpit_register_frontend_deployment oder Dashboard Frontend-Kanäle (v0)Go-Live DNS.
  • Smoke: Startseite, Shop-Liste, eine Detailseite, deaktivierte Seite → 404, Kontaktformular.

ILG-Referenz (konkret)

ThemaOrt
Standalone-Repowebsite-ilg/ im Monorepo · GitHub sawmuedev/smg-ilg-template-website
Export aus Monoreponode scripts/export-website-ilg-v0-repo.mjs
Routen neu erzeugencd website-ilg && pnpm routes:generate
Center-Loaderlib/cockpit/resolve-center.ts
Listenseitenlib/ilg/ilg-route-page.tsx
Detailseitenlib/ilg/ilg-detail-page.tsx
Sichtbarkeitlib/ilg-page-visibility.ts
v0-Einstieg (Chat-Text)website-ilg/V0_IMPORT.md
Kurz-README im Repowebsite-ilg/README.md

Webseiten-Reiter → API (ILG):

ReiterSpeicherv0 liest
StartseitetemplateContent.ilg.hero, infoTilespublic-visitor-surface
Header & FootertemplateContent.ilg.header/footer + StammdatenmergeIlgLayout
Optionen / Seiten ein-auspageVisibility, pagesConfigRoute-Guards + Navigation
Unterseiten-TextePage-Contentpage-content?pageType=…
Centerplanlageplan.fallbackImage/centerplan (statisch)

Sync nach Template-Änderungen im Monorepo

Wenn ILG-Komponenten in apps/center-website angepasst wurden:

# Im Monorepo-Root
node scripts/export-website-ilg-v0-repo.mjs
cd website-ilg
pnpm routes:generate # falls Routen-Metadaten geändert
git add -A && git commit -m "sync: ILG aus Monorepo"
git push origin main
git push origin v0/<euer-v0-branch> # v0-Branch nicht vergessen

Integrationsschicht (lib/ilg/, lib/cockpit/, app/) bleibt im website-ilg-Repo und wird nicht vom Export überschrieben — nur ilg/ UI und Shared-Libs laut Skript.


So testen

  1. Lokal: DEFAULT_CENTER_SLUG auf ein echtes ILG-Center · pnpm dev · /shops, /aktuelles, /services/<slug>.
  2. Preview: v0/Vercel-URL — gleiches Center über Env-Slug; keine leeren Listen, wenn Cockpit befüllt ist.
  3. Multi-Center: Zweite Domain am Vercel-Projekt · Cockpit by-domain · andere Farben/Logo ohne Code-Deploy.
  4. Seite deaktivieren: Im Cockpit pagesConfig.shops = false → Route 404, Nav-Eintrag weg.
  5. SEO: Seiten-Titel im Browser-Tab, Canonical in Seitenquelltext prüfen.

Betrieb

Variable / ThemaHinweis
NEXT_PUBLIC_DASHBOARD_URLÖffentliche Dashboard-URL (Prod)
DEFAULT_CENTER_SLUGNur Preview / lokale Entwicklung
EXPECTED_WEBSITE_TEMPLATESchutz: falsches Template → Fehlerseite
REVALIDATION_SECRETOn-Demand-Revalidate nach Cockpit-Publish
Render Monorepo-WebsiteKann parallel laufen, bis DNS auf v0 umgestellt ist
Bandwidthv0 entlastet apps/center-website auf Render — siehe Changelog (Bandwidth Phase 2)

Cron/Webhooks: On-Demand-Revalidate über Cockpit-Hook oder MCP — Details v0 Recast Deploy.


Häufige Fehler

SymptomUrsacheFix
v0 zeigt alten StandDeploy auf v0-Branch, nicht mainBeide Branchs pushen, in v0 Sync
404 auf allen UnterseitenFehlende app/…/page.tsxpnpm routes:generate
Leere ListenCenter leer oder falscher SlugCockpit befüllen / DEFAULT_CENTER_SLUG
Webseiten-Reiter ignoriertCode liest Hardcoding statt APIpublic-visitor-surface + page-content prüfen
website-config 401Falscher EndpunktNur public-visitor-surface
Nav zeigt deaktivierte SeitepagesConfig nicht in HeadermergeIlgLayout + Header-Filter

Nächste Seiten

Nutzungsstatistik: Seitenaufrufe werden anonymisiert erfasst. Im Umami-Dashboard nach diesem Pfad filtern: /en/developer-guide/cockpit-zu-v0-migration