Centraal platform voor Nederlandse gemeenten, samenwerkingsverbanden en leveranciers om software-applicaties te registreren, vergelijken en raadplegen. Het platform maakt deel uit van de VNG Realisatie dienstverlening en is geïntegreerd met de GEMMA-referentiearchitectuur.
Aanbesteding: VNG Realisatie TN492936 — Vernieuwing Softwarecatalogus Opvolger van: softwarecatalogus.nl (Drupal)
- Functionaliteit
- Tech stack
- Snel starten
- Ontwikkeling
- Testdata en accounts
- API
- Deployen
- Bijdragen
- Licentie
| Module | Beschrijving |
|---|---|
| Pakketcatalogus | Zoeken, filteren en raadplegen van softwarepakketten |
| Gebruik-overzicht | Gemeenten registreren welke pakketten zij gebruiken |
| "Gluren bij de buren" | Pakketlandschap van andere gemeenten inzien |
| GEMMA-integratie | Pakketten koppelen aan ArchiMate-referentiecomponenten |
| Standaarden | Koppelen van pakketten aan Forum Standaardisatie-standaarden |
| Export | CSV, Excel (.xlsx) en AMEFF (ArchiMate Exchange) export |
| Documenten | DPIA's, verwerkersovereenkomsten en pentesten per pakket |
| Gebruikersbeheer | Rollen, 2FA (TOTP), organisatiefiattering |
| CMS | Nieuws en informatieapgina's beheren |
| Laag | Technologie |
|---|---|
| Backend | Python 3.12 · Django 5 · Django REST Framework · drf-spectacular |
| Database | PostgreSQL 16 |
| Zoeken | Meilisearch |
| Async | Celery · Redis |
| Auth | JWT · TOTP (django-otp) · django-allauth |
| Frontend | Next.js 14 (App Router) · TypeScript · Tailwind CSS · shadcn/ui |
| State | TanStack Query · Zustand |
| Infra | Docker · Kubernetes (Helm) · Nginx |
| CI/CD | GitHub Actions → ghcr.io → Helm deploy |
- Docker Desktop ≥ 4.x
- Git
git clone https://github.com/vng-realisatie/softwarecatalogus.git
cd softwarecataloguscp .env.example .env
# Pas indien gewenst waarden aan in .envdocker-compose up -dDit start: PostgreSQL, Redis, Meilisearch, Django (backend), Next.js (frontend) en Nginx.
docker-compose exec backend python manage.py migrate
docker-compose exec backend python manage.py seed_data| URL | Omschrijving |
|---|---|
| http://localhost | Softwarecatalogus (frontend) |
| http://localhost/api/v1/docs/ | Swagger UI (API documentatie) |
| http://localhost:8000/admin/ | Django Admin |
# Shell in de backend-container
docker-compose exec backend bash
# Tests draaien
docker-compose exec backend pytest
# Tests met coverage
docker-compose exec backend pytest --cov=apps --cov-report=term-missing
# Nieuwe migraties genereren
docker-compose exec backend python manage.py makemigrations
# Meilisearch herindexeren
docker-compose exec backend python manage.py reindex_searchDe frontend draait in dev-modus met hot reload. Bestanden in frontend/src/ worden automatisch opgepikt.
# Logs bekijken
docker-compose logs -f frontend
# Frontend container herstarten (na nieuwe route-bestanden)
docker-compose up -d --force-recreate frontendsoftwarecatalogus/
├── backend/ # Django applicatie
│ ├── apps/
│ │ ├── api/ # DRF views, serializers, routers
│ │ ├── architectuur/ # GEMMA/ArchiMate import/export
│ │ ├── content/ # CMS (nieuws, pagina's)
│ │ ├── documenten/ # Document uploads
│ │ ├── gebruikers/ # User model, 2FA
│ │ ├── migratie/ # Drupal-migratie tools
│ │ ├── organisaties/ # Organisatie, contactpersonen
│ │ ├── pakketten/ # Pakket, PakketGebruik, Koppeling
│ │ └── standaarden/ # Standaard, PakketStandaard
│ └── config/ # Django settings (base/dev/prod/test)
├── frontend/ # Next.js applicatie
│ └── src/
│ ├── app/ # App Router pagina's
│ │ ├── (public)/ # Publieke cataloguspagina's
│ │ ├── (auth)/ # Login, registratie, 2FA
│ │ └── (dashboard)/ # Beheer-dashboards
│ ├── components/ # React-componenten
│ ├── hooks/ # Custom React hooks
│ └── types/ # TypeScript types
├── demo/ # Playwright demo-opnames
├── infra/
│ ├── k8s/helm/ # Kubernetes Helm chart
│ └── nginx/ # Nginx configuratie
└── docs/ # Technische documentatie
Na python manage.py seed_data zijn de volgende accounts beschikbaar (wachtwoord overal: Welkom01!):
| Rol | E-mailadres | Organisatie |
|---|---|---|
| Functioneel beheerder | admin@vngrealisatie.nl | VNG Realisatie |
| Gebruik-beheerder (gemeente) | j.jansen@utrecht.nl | Gemeente Utrecht |
| Aanbod-beheerder (leverancier) | verkoop@centric.eu | Centric |
Let op: 2FA (TOTP) is standaard uitgeschakeld voor demo-accounts. In productie is 2FA verplicht voor beheeraccounts.
De API volgt de NL API Strategie.
- Base URL:
/api/v1/ - Authenticatie: JWT Bearer token
- Documentatie:
/api/v1/docs/(Swagger UI) - Schema:
/api/v1/schema/(OpenAPI 3.x YAML)
GET /api/v1/pakketten/ # Lijst + zoeken/filteren
GET /api/v1/pakketten/{id}/ # Pakketdetail
GET /api/v1/organisaties/ # Organisaties
GET /api/v1/standaarden/ # Standaarden
GET /api/v1/gemma/componenten/ # GEMMA-componenten
POST /api/v1/auth/login/ # Email + wachtwoord → temp token
POST /api/v1/auth/token/verify-totp/ # TOTP verificatie → JWT
POST /api/v1/auth/logout/
POST /api/v1/auth/registreer/
Het project is Kubernetes-ready en Haven-compatibel.
| Omgeving | Trigger |
|---|---|
| Test | Push naar main branch |
| Acceptatie | Handmatige trigger in GitHub Actions |
| Productie | Handmatige trigger in GitHub Actions |
helm upgrade --install softwarecatalogus infra/k8s/helm \
--namespace softwarecatalogus \
--values infra/k8s/helm/values.yaml \
--set image.tag=<versie>| Secret | Beschrijving |
|---|---|
REGISTRY_TOKEN |
GitHub Container Registry token |
KUBE_CONFIG |
Kubernetes kubeconfig (base64) |
SECRET_KEY |
Django SECRET_KEY (productie) |
DATABASE_URL |
PostgreSQL connection string |
MEILISEARCH_API_KEY |
Meilisearch master key |
Issues en pull requests zijn welkom. Gebruik de GitHub Issues voor bugs en feature requests.
- Fork de repository
- Maak een feature branch:
git checkout -b feature/mijn-feature - Commit met duidelijke berichten
- Open een Pull Request naar
main
Alle bijdragen vallen onder de EUPL-1.2 licentie.
Copyright © 2024 VNG Realisatie BV
Dit project is gelicenseerd onder de European Union Public Licence (EUPL) versie 1.2. Zie het LICENSE bestand voor de volledige licentietekst.
De EUPL-1.2 is compatibel met GPL v2/v3, AGPL v3, MPL v2 en andere open source licenties. Meer informatie: eupl.eu