mana e.V. Apple-Developer-Team-ID QP3GLU8PH3 ins cards-web-Service-
Environment in docker-compose.production.yml. Wird zur Runtime von
$env/dynamic/public aufgelöst und in
/.well-known/apple-app-site-association eingesetzt — Apple matched
das mit dem applinks:cardecky.mana.how-Entitlement in cards-native
(Bundle ev.mana.cards).
Aktivierung: docker compose -f docker-compose.production.yml up -d cards-web
auf mana-server. Verify nach Deploy:
curl https://cardecky.mana.how/.well-known/apple-app-site-association
→ "appID":"QP3GLU8PH3.ev.mana.cards" statt XXXXXXXXXX.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Behebt live verifiziertes Auth-Bypass auf cardecky-api.mana.how
(X-User-Id → founder-Tier) und zieht im selben Patch das fehlende
Operations-/Compliance-Fundament nach.
* Auth-Middleware fail-secure: opt-in via CARDS_AUTH_DEV_STUB="true"
(war opt-out, Default true). Compose-Default flipped auf "false",
NODE_ENV="production" für cards-api ergänzt, env-Template
dokumentiert. vitest.config.ts + tests/setup.ts aktivieren den
Stub gezielt für Test-Suiten.
* Security-Headers: Hono secureHeaders() in apps/api,
SvelteKit hooks.server.ts mit X-Frame/X-Content-Type/Referrer/
HSTS in apps/web. CSP bewusst ausgelassen — eigener Sprint.
* CORS-localhost-Whitelist nur außerhalb Prod.
* Rate-Limiting (in-memory sliding window, dependency-frei) auf
share.receive 60/min/IP, media.upload 30/min/user,
decks.generate + decks.from-image 10/min/user, dsgvo.* 10/min/IP.
* Health-Endpoint mit echter DB- und MinIO-Probe; /healthz bleibt
Liveness, /healthz/details ist Readiness mit 503 bei Failure.
* DSGVO-Honesty: storage_ok + storage_error im Response (statt
schluckend console.warn), Account-UI zeigt Fehler-Toast.
* Audit-Log: strukturierte JSON-Zeile (kind: "audit") auf stdout
für /dsgvo/export, /dsgvo/delete, /me/export, /me/delete.
* Bug-Fix: duplizierte case "multiple-choice"-Clause in fsrs.ts.
Verifiziert: apps/api 17 Files / 104 Tests grün, apps/web check
0 errors. Deploy auf Mac Mini steht noch aus.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Deck schema, API routes, and SvelteKit UI for creating and browsing decks
(DeckStack component, inline creation, floating nav). Production compose
updated with PUBLIC_AUTH_WEB_URL so cards-web redirects to auth.mana.how
for login/register instead of the raw API.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bug: Browser-Client requested localhost:3081 statt cardecky-api.mana.how
nach Login. Ursache: API_BASE und authBaseUrl() lasen die Variable
über import.meta.env.PUBLIC_*, was unter SvelteKit nicht zuverlässig
inlined wird (Vite-direct, ohne SvelteKit-Wrapper-Hook).
Fix: \$env/dynamic/public liest die env zur Runtime aus den Node-
Server-Variablen (adapter-node) — Browser bekommt sie über den
SSR-Init-Snapshot. Damit muss die Variable nur als runtime-env am
Container hängen, nicht als Build-Arg.
docker-compose.production.yml: PUBLIC_CARDS_API_URL und
PUBLIC_MANA_AUTH_URL aus build.args nach environment verschoben.
Build-Pipeline: cards-web muss neu gebaut werden, sonst greift der
Wechsel von static→dynamic env nicht.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cards-web hatte den Arg, cards-api nicht — Build schlägt 401 gegen
Verdaccio fehl, weil das .npmrc im Container die env nicht aufgelöst
bekommt.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
infrastructure/docker-compose.production.yml mit 4 Services:
- cards-postgres :5436 (Plattform-Postgres :5432, Dev :5435 belegt)
- cards-minio :9110/9111 (Plattform-MinIO :9000/9001 belegt)
- cards-api :3091 (alt war :3072 — Cutover via Tunnel-Reroute)
- cards-web :5181 (alt war :5180)
Persistente Volumes auf /Volumes/ManaData/cards/{postgres,minio} —
außerhalb des Repo-Verzeichnisses (überlebt repo-wipes, gleicher
Pfad wie mana-platform-Daten).
Dockerfiles:
- apps/api: oven/bun:1.1-alpine, single-stage. pnpm via npm install.
Verdaccio-Auth via NPM_AUTH_TOKEN-Build-Arg + .npmrc.
- apps/web: 2-stage node:20-alpine. SvelteKit-build mit
PUBLIC_CARDS_API_URL als Build-Arg (kommt direkt in den
Client-Bundle via vite). Runtime startet adapter-node-Bundle
direkt mit `node build/index.js`.
infrastructure/.env.production.example als committable Skeleton —
echte .env.production bleibt git-ignored. Vier Secrets nötig:
CARDS_DB_PASSWORD, CARDS_S3_SECRET_KEY, CARDS_DSGVO_SERVICE_KEY,
NPM_AUTH_TOKEN.
Hard-Cutover-Plan: alte mana-app-cards-{server,web} bleiben kurz
parallel laufend, Tunnel zeigt nach dem Build/Verify-Cycle auf die
neuen Container, dann werden die alten gestoppt + entfernt.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>