- fix(member-management): Zod v4 .partial() on refined schema crash
Separated CreateMemberBaseSchema from superRefine so .partial()
works for UpdateMemberSchema. Fixes members-cms page crash.
- fix(course-management): snake_case→camelCase stats normalization
getQuickStats RPC returns snake_case keys but templates expect
camelCase. Added normalization layer so stats cards display values.
- fix(blog): add missing cover images for 5 German blog posts
Posts referenced /images/posts/*.webp that didn't exist.
- fix(docker): remove non-existent catch_entries table from bootstrap
dev-bootstrap.sh granted permissions on catch_entries which has no
migration. Removed the stale reference.
- docs: add qa-checklist.md with full test report
The REVOKE+GRANT pattern in migrations can fail if a previous migration run
partially succeeded. Adding explicit GRANTs to dev-bootstrap.sh ensures all
tables have correct permissions on every deploy. Fixes 500 error on
Sitzungsprotokolle (meeting_protocol_items permission denied).
Dokploy injects 'networks' into all compose services for Traefik routing,
which is mutually exclusive with 'network_mode: service:supabase-kong'.
Changes:
- Remove network_mode from app service
- App server-side Supabase URL: http://supabase-kong:8000 (Docker DNS)
- App browser-side Supabase URL: ${API_EXTERNAL_URL} (external domain)
- Kong catch-all route: app:3000 instead of localhost:3000
Dokploy deployment fixes:
- Remove all host port bindings (Kong 8000/8443/3000, Studio 54323, Inbucket 54324,
DB 5432) — Traefik handles external routing in Dokploy, host ports conflict
with other services on the shared server
- Add idempotent ALTER ROLE password commands to db-migrate service — ensures
role passwords are set even when DB volume persists across deployments
(docker-entrypoint-initdb.d only runs on empty data dirs)
- Add catch-all app route to Kong config — proxies / to localhost:3000
(Next.js app via network_mode: service:supabase-kong)