Architektur
Wie die Services zusammenhängen — und warum der Storage-Service hinter der API sitzt statt daneben.
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)
Routet nach Pfad: / → Admin, /api/* → API (Prefix entfernt), /storage/* → Storage (Prefix entfernt). Terminiert TLS in Produktion.
Admin (Nuxt 4)
Nuxt 4 Admin-UI: Story-Editor, Component-Schema-Editor, Datasources, Assets, Access-Tokens, Audit-Log.
API (Hono)
Hono + Bun. Stellt CDN v2 (Storyblok-kompatibel), Management v1, MCP (/v1/mcp), Auth und Webhooks bereit. Einziger Service mit Postgres-Schema-Zugriff.
Storage (Hono)
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
Kanonischer Store. Stories, Drafts, Versionen, Components, Datasources, Assets, Tokens, Audit-Log. Schema liegt in Drizzle.
Minio (S3)
S3-kompatibler Object-Store für Asset-Blobs. Bucket-Layout: spaces/<id>/assets/<n>/<filename>. Transforms unter /m/. Nie nach aussen exponiert.
Redis (optional)
Optionaler CDN-Cache. Ist REDIS_URL leer, verhält sich der Cache-Client als stiller No-Op — kein try/catch, keine Fehler, nur langsamer.