Memoriums aanmaken en beheren

Deze pagina beschrijft het beheerproces. Met database (productie) gelden servercookies en optioneel tweestaps authenticator.

0. Inloggen (globaal beheer vs familie)

  • Hoofdbeheerder (alle memoriums): /beheer/inloggen. Met database: wachtwoord = ADMIN_PASSWORD op de server. Optioneel 6-cijfercode = ADMIN_TOTP_SECRET (genereer met node scripts/generate-admin-totp.mjs). Zonder database: demo-wachtwoord memoriah-beheer (of NEXT_PUBLIC_MEMORIAH_ADMIN_PASSWORD).
  • Familie (één memorium): /familie-beheer/inloggen. De hoofdbeheerder stelt dit in bij bewerken onder Familie-login (wachtwoord + optioneel authenticator). Nabestaanden zien alleen hun eigen pagina en moderatie voor die pagina.

0b. Eerste memorium aanmaken

  1. Log in op globaal beheer (hierboven).
  2. Ga naar Nieuw memorium, vul naam, slug en inhoud in, sla op.
  3. De publieke URL is /m/uw-slug (te vinden op het dashboard en bij bewerken).
  4. Optioneel: onder Privacy & interactieFamilie-login een apart wachtwoord instellen en authenticator inschakelen; deel slug + wachtwoord met de familie.

1. Inloggen op beheer (globaal)

Zie sectie 0 hierboven. Sessie blijft geldig tot u uitlogt (cookie op productie, sessionStorage in demo-modus).

2. Nieuw memorium

Kies Nieuw memorium. Vul naam, unieke URL-slug, levensverhaal en optioneel afscheidsinformatie in. Sla op — de publieke pagina staat op /m/uw-slug. Deel deze link via rouwkaart, e-mail of social media.

3. Privacy-instellingen

  • Openbaar — zichtbaar in zoeken en op de startpagina.
  • Niet gelist — alleen bereikbaar met de directe link.
  • Privé — bezoekers hebben een wachtwoord nodig (stel dit in bij bewerken).
  • Optioneel kunt u óók een wachtwoord zetten bij openbare of unlisted memoriums voor een extra slot.

4. Moderatie

Als “nieuwe berichten eerst modereren” aan staat, komen bijdragen in de wachtrij. Onder Moderatie per memorium kunt u goedkeuren, afwijzen of verwijderen. Uitgelichte berichten stelt u in bij bewerken.

5. Export en back-up

Op het beheer-dashboard kunt u alle lokale data als JSON exporteren. Bezoekers kunnen goedgekeurde herinneringen afdrukken of als PDF opslaan via “Versie voor afdrukken”.

6. Vercel — 404 of lege site

  • Zorg dat de root van de Git-repo de map is waar package.json staat (Project Settings → Root Directory).
  • Framework preset: Next.js. Build command wordt via vercel.json ingesteld op migraties + build.
  • Environment variables op Vercel: Project → Settings → Environment Variables (minimaal Production). Zet DATABASE_URL, DIRECT_URL, ADMIN_PASSWORD, MEMORIAH_JWT_SECRET (≥16 tekens). Opslaan en daarna opnieuw deployen.
  • Waar vind je de Postgres-URL’s (Supabase)? In het Supabase-dashboard: kies je project. De connection strings staan niet onder het tandwiel (Project settings) — daar zie je geen Database-menu-item. Klik links in de hoofdbalk op Database (cilinder-icoon) en open Connect (knop bovenaan). Kies Postgres; onder Connection string / tabs: voor DATABASE_URL Connection pooling met method Transaction — URI kopiëren; voeg indien nodig ?pgbouncer=true&connection_limit=1&sslmode=require toe. Voor DIRECT_URL (Prisma-migraties, o.a. tijdens de Vercel-build): onder Connection pooling kies Session en kopieer de URI — host *.pooler.supabase.com, poort 5432. Zo voorkom je P1001 op Vercel: de directe host db.*.supabase.co is vaak alleen via IPv6 bereikbaar en vanaf de build-omgeving niet te bereiken. Alternatief: Supabase IPv4 add-on en dan Direct connection. Controleer ook dat het project niet gepauzeerd is. Database-wachtwoord: in het Connect-venster of onder Database → Settings.
  • Lokaal zonder pooler: zet DIRECT_URL exact gelijk aan DATABASE_URL. Demo-seed na deploy: lokaal npm run db:seed met je productie- DATABASE_URL als je voorbeelddata wilt.

Build faalt met P3005 (schema is not empty)

Let op: alleen je database-URL’s op Vercel zetten lost P3005 niet op — de build blijft falen tot Prisma één keer weet dat de init-migratie al „gedaan” is. Dat doe je met npm run db:baseline hieronder (tegen de echte productiedatabase), daarna opnieuw deployen.

De database heeft al tabellen (bijvoorbeeld na scripts/supabase-memoriah-schema.sql), maar Prisma heeft nog geen rij in _prisma_migrations. Dan weigert migrate deploy. Los eenmalig op op een machine met je productie-DATABASE_URL en DIRECT_URL (zelfde als Vercel), in de projectmap. In .env of .env.local volstaat met DATABASE_URL — ontbreekt DIRECT_URL, dan zet het script die gelijk aan DATABASE_URL (geen P1012). Zonder enige DATABASE_URL lokaal krijg je een duidelijke foutmelding. Op Vercel blijven beide vars gewoon gezet.

Optie A — lokaal (aanbevolen als je CLI al werkend hebt)

npm run db:baseline

Optie B — Supabase SQL Editor (geen terminal; één keer per database)

Open in de repo het bestand scripts/supabase-prisma-baseline-once.sql, kopieer de volledige inhoud, plak in Supabase → SQL Editor → Run. Daarmee wordt de migratie 20260512000000_init als al toegepast geregistreerd. Daarna opnieuw deployen op Vercel.

Optie A voert (via een wrapper) prisma migrate resolve --applied 20260512000000_init uit — hetzelfde effect als optie B. Doe dit alleen als je bestaande tabellen overeenkomen met prisma/migrations/…/migration.sql. Is de DB leeg? Gebruik dan geen baseline — alleen opnieuw deployen. Past het schema niet? Eerst DB afstemmen of hulp van een ontwikkelaar.

Voorbeeld: hoe URL’s eruitzien op Vercel

Vervang YOUR_PROJECT_REF, regio, wachtwoord en secrets door jouw echte waarden. De host aws-0-…pooler.supabase.com en poorten 6543 / 5432 moeten kloppen met wat Supabase in Connect toont. Belangrijk: bij elke pooler-URL moet de gebruiker postgres.YOUR_PROJECT_REF zijn (zoals in Connect) — niet alleen postgres. Die korte naam hoort bij de Direct host db.*.supabase.co; op de pooler geeft dat FATAL: Tenant or user not found.

Name: DATABASE_URL
Value:
postgresql://postgres.YOUR_PROJECT_REF:YOUR_DB_PASSWORD@aws-0-eu-central-1.pooler.supabase.com:6543/postgres?pgbouncer=true&connection_limit=1&sslmode=require

Name: DIRECT_URL
Value:
postgresql://postgres.YOUR_PROJECT_REF:YOUR_DB_PASSWORD@aws-0-eu-central-1.pooler.supabase.com:5432/postgres?sslmode=require

Name: ADMIN_PASSWORD
Value: (een sterk wachtwoord voor /beheer/inloggen)

Name: MEMORIAH_JWT_SECRET
Value: (minimaal 16 willekeurige tekens)

In het Vercel-scherm vul je per regel alleen de Value-inhoud in; geen Name: prefix in het value-veld. Plak DIRECT_URL het liefst rechtstreeks uit Supabase Connect → Session, zodat gebruikersnaam en host gegarandeerd bij elkaar horen.

7. Productie-architectuur (aanbevolen)

Vervang localStorage door een API met database (bijv. PostgreSQL), gehashte wachtwoorden, rolgebaseerde toegang voor families, e-mail voor moderatie-alerts, virusscan op uploads, CDN voor afbeeldingen en rate-limiting op formulieren. Houd een duidelijke bewaartermijn en verwijderprocedure aan voor de AVG.

← Terug naar overzicht