Der Entry Point

Ein einziger Caddy-Proxy auf Port 8080 ist die einzige nach aussen sichtbare Fläche. Er routet nach Pfad: / geht an das Nuxt-Admin, /api/* wird zur Hono-API umgeschrieben, /storage/* zum Storage-Service. S3/Minio ist von aussen nie erreichbar — nur der Storage-Service spricht mit dem Bucket.

Proxy (Caddy)

:8080

Routet nach Pfad: / → Admin, /api/* → API (Prefix entfernt), /storage/* → Storage (Prefix entfernt). Terminiert TLS in Produktion.

Admin (Nuxt 4)

:3000nur intern

Nuxt 4 Admin-UI: Story-Editor, Component-Schema-Editor, Datasources, Assets, Access-Tokens, Audit-Log.

API (Hono)

:3001nur intern

Hono + Bun. Stellt CDN v2 (Storyblok-kompatibel), Management v1, MCP (/v1/mcp), Auth und Webhooks bereit. Einziger Service mit Postgres-Schema-Zugriff.

Storage (Hono)

:3002nur intern

Hono + Bun. Upload, Download, Delete sowie /m/ On-the-fly-Bildtransformationen. Einziger Service mit S3-Credentials. Nutzt HMAC-Tokens der API für Upload-Auth.

Postgres

:5432nur intern

Kanonischer Store. Stories, Drafts, Versionen, Components, Datasources, Assets, Tokens, Audit-Log. Schema liegt in Drizzle.

Minio (S3)

:9000nur intern

S3-kompatibler Object-Store für Asset-Blobs. Bucket-Layout: spaces/<id>/assets/<n>/<filename>. Transforms unter /m/. Nie nach aussen exponiert.

Redis (optional)

:6379nur intern

Optionaler CDN-Cache. Ist REDIS_URL leer, verhält sich der Cache-Client als stiller No-Op — kein try/catch, keine Fehler, nur langsamer.