- TypeScript 99.3%
- JavaScript 0.3%
- CSS 0.2%
- Dockerfile 0.1%
- API-sleutels worden niet meer in de webinterface of DB beheerd; ze komen uitsluitend uit omgevingsvariabelen (OPENAI_API_KEY, ANTHROPIC_API_KEY). De admin-pagina toont alleen de env-status (ingesteld/ontbreekt). - Alleen ADMIN kan providers in-/uitschakelen en de standaard kiezen, en in de zoekfunctie providers kiezen (vergelijken/consensus). - Niet-admins (EDITOR/VIEWER) worden server-side gedwongen naar Ollama (lokaal) voor álle AI: zoeken, puntextractie, mitigatie- en ISO-suggesties. Hun gegevens gaan dus nooit naar externe AI-diensten. - /api/ai/providers GET toont niet-admins uitsluitend Ollama. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| prisma | ||
| scripts | ||
| src | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yaml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| next.config.mjs | ||
| package.json | ||
| postcss.config.mjs | ||
| README.md | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
BeleidsportaalApp
Webapplicatie die beleids-PDF's omzet naar een toetsbare omgeving. De applicatie haalt met AI automatisch de beleidspunten uit een document, waarna je per punt de implementatiestatus, het risiconiveau, de verantwoordelijke, een streefdatum en mitigerende maatregelen vastlegt. Punten worden gekoppeld aan een vaste eisen-catalogus voor BIO, NIS2 en AVG.
Functionaliteit
- PDF's met beleid uploaden en de tekst automatisch laten inlezen.
- AI-extractie (OpenAI) die concrete beleidspunten voorstelt en koppelt aan BIO/NIS2/AVG-eisen.
- Per beleidspunt: status (niet gestart, in behandeling, uitgevoerd, on hold, n.v.t.), risiconiveau, verantwoordelijke, streefdatum, mitigerende maatregelen en notities.
- Vaste eisen-catalogus voor BIO, NIS2 en AVG (beheerder kan eisen toevoegen/verwijderen).
- Team met inlog en rollen: Beheerder, Bewerker, Lezer.
- Dashboard met voortgang per status, risico en compliancekader.
- Tweetalige interface (Nederlands / Engels).
Techniek
- Next.js 15 (App Router) + React 19 + TypeScript
- PostgreSQL via Prisma
- Sessie-authenticatie met JWT-cookie (
jose+bcryptjs) - OpenAI API voor de extractie
- Tailwind CSS
Omgevingsvariabelen
Zie .env.example. Belangrijkste variabelen:
| Variabele | Omschrijving | Coolify |
|---|---|---|
DATABASE_URL |
PostgreSQL-verbinding | automatisch (compose) |
AUTH_SECRET |
Geheime sleutel voor sessies (openssl rand -base64 32) |
automatisch gegenereerd |
OPENAI_API_KEY |
API-sleutel van OpenAI | zelf instellen |
OPENAI_MODEL |
Model, standaard gpt-4o-mini |
optioneel |
ADMIN_EMAIL |
E-mailadres van de eerste beheerder | zelf instellen |
ADMIN_PASSWORD |
Wachtwoord van de eerste beheerder | zelf instellen |
ADMIN_NAME |
Naam van de eerste beheerder | optioneel |
In Coolify worden het databasewachtwoord (SERVICE_PASSWORD_POSTGRES) en het
sessie-geheim (SERVICE_BASE64_AUTHSECRET) automatisch gegenereerd via de
magic-variabelen in docker-compose.yml.
Lokaal ontwikkelen
cp .env.example .env # vul de waarden in (lokale PostgreSQL nodig)
npm install
npx prisma db push # database-schema aanmaken
npm run db:seed # eisen-catalogus + beheerder aanmaken
npm run dev # http://localhost:3000
Deployen via Coolify
De repository bevat een Dockerfile en docker-compose.yml (met PostgreSQL).
-
Forgejo — push deze map naar je repository:
git add . git commit -m "BeleidsportaalApp" git push origin main -
Coolify — maak een nieuwe resource aan:
- Type: Docker Compose.
- Bron: je Forgejo-repository
code.vanmullemholding.eu/jesse-a/BeleidsportaalApp. - Coolify leest automatisch
docker-compose.yml.
-
Omgevingsvariabelen in Coolify instellen (tabblad Environment Variables):
OPENAI_API_KEY,ADMIN_EMAIL,ADMIN_PASSWORD— en optioneelOPENAI_MODELenADMIN_NAME. Het databasewachtwoord enAUTH_SECRETgenereert Coolify zelf. -
Deploy. Bij het opstarten worden automatisch het databaseschema gesynchroniseerd (
prisma db push) en de eisen-catalogus + beheerder geseed. -
Open de applicatie en log in met
ADMIN_EMAIL/ADMIN_PASSWORD.
De PDF-bestanden worden in de database opgeslagen; back-up dus het PostgreSQL-volume (
db_data).
Opmerkingen
- "Opnieuw extraheren" vervangt alle bestaande punten van een document — eerder ingevulde statussen van dat document gaan daarbij verloren.
- Gescande PDF's zonder tekstlaag kunnen niet worden geanalyseerd (geen OCR).
- Het wachtwoord van de seed-beheerder wordt alleen bij de eerste keer ingesteld; daarna wijzig je wachtwoorden via het scherm Gebruikers.