9.9 KiB
Overdracht racket-wiki
Bijgewerkt: 22 augustus 2026
Project in het kort
racket-wiki is een kleine, zelfgehoste wiki met:
- een Racket-backend op
web-server-lib; - PostgreSQL als opslag voor gebruikers, sessies, pagina's, versies, bijlagen en concept maps (CMaps);
- een frontend in gewone HTML, CSS en JavaScript, zonder npm- of bundlerstap;
- EasyMDE/Marked voor Markdown, DOMPurify voor sanitizing, highlight.js voor code en diff2html voor versieverschillen;
- lokale, tijdens setup gedownloade frontendbibliotheken, zodat normaal gebruik geen CDN nodig heeft.
De ontwikkelversie is 0.2.99 (info.rkt). De huidige PostgreSQL-schemaversie is 12 (private/migrations.rkt).
Belangrijk: huidige werkboom
De branch is main en volgt origin/main. De laatste commit is:
63b7ca0 cmap functions, email, architecture documentation.
Er staan belangrijke, nog niet gecommitte wijzigingen in de werkboom. Die vormen samen de ontwikkeling van 0.2.95 t/m 0.2.99 en moeten worden behouden. Bij de laatste inventarisatie waren gewijzigd:
README.md
architecture/pages/data-en-versies.md
architecture/pages/gedrag.md
architecture/pages/testbaarheid.md
info.rkt
private/cmap-storage.rkt
private/migrations.rkt
server.rkt
static/cmap/cmap-racket-wiki.js
static/cmap/cmap.css
static/cmap/cmap.js
static/css/wiki.css
static/index.html
static/js/wiki.js
translate.rkt
Nieuw en nog untracked:
migrate-cmap-subpages.rkt
Voer dus geen reset, checkout of brede formattering uit voordat deze wijzigingen zijn beoordeeld en veilig gecommitte. wiki-data/ en compiled/ zijn lokale/gegenereerde directories en staan in .gitignore.
Snel starten
Benodigd:
- Racket met de dependencies uit
info.rkt(crypto-lib,db-lib,net-lib,net-cookies-lib,openssl-libenweb-server-lib); - PostgreSQL; de database moet vooraf bestaan en de opgegeven rol moet tabellen en indexen mogen maken;
- internettoegang tijdens de eerste setup om de vastgepinde browserbibliotheken te downloaden.
In deze ontwikkelomgeving is Racket 9.1 gebruikt. Start vanuit de projectroot:
racket main.rkt --data ./wiki-data --port 8080
Open daarna http://127.0.0.1:8080/. Een incomplete installatie gaat automatisch naar /setup. Daar worden de databaseverbinding, migraties, frontendbestanden en eerste administrator geregeld. Luisteren op alle interfaces kan met:
racket main.rkt --data ./wiki-data --listen '*' --port 8080
Gebruik achter HTTPS altijd --secure-cookie. Andere relevante opties zijn --title, --language en|nl en de hersteloptie --create-admin USER PASSWORD.
De database-instellingen, inclusief eventueel het wachtwoord, staan in wiki-data/database.rktd. Dit bestand hoort niet in Git of in logs. De applicatie probeert het bestand met mode 0600 aan te maken.
Als alleen de browserdependencies hersteld moeten worden:
racket setup-vendor.rkt --data ./wiki-data
Codekaart
| Pad | Verantwoordelijkheid |
|---|---|
main.rkt |
CLI en programmatische entrypoints start en start-wiki |
server.rkt |
HTTP-routering, setup/loginpagina's en alle JSON/API-handlers |
private/config.rkt |
runtimeconfiguratie en paden onder de datadirectory |
private/setup.rkt |
eerste websetup en herstelcontrole |
private/database.rkt |
PostgreSQL-configuratie, verbindingen en migratiestart |
private/migrations.rkt |
geordende, transactionele databaseschemamigraties |
private/storage.rkt |
pagina's, historie, zoeken, todo's, bookmarks, aliassen en uploads |
private/cmap-storage.rkt |
opslag, historie, zoeken en gebruikstellingen voor CMaps |
private/auth.rkt |
wachtwoorden, sessies, CSRF, rollen en password-reset-tokens |
private/mail.rkt |
SMTP-instellingen en resetmails |
translate.rkt |
Engelse/Nederlandse server- en frontendvertalingen |
static/index.html |
skelet van de ingelogde single-page-interface |
static/js/wiki.js |
applicatiestatus, API-calls, pagina-editor en CMap-hostintegratie |
static/cmap/ |
lokaal onderhouden CMap-renderer, editorlaag en styling |
architecture/ |
importeerbare Nederlandse architectuurpagina's en twee CMaps |
scrbl/racket-wiki.scrbl |
package/API-documentatie in Scribble |
De browserfrontend heeft bewust geen buildstap. Wijzig bronbestanden rechtstreeks en test ze in de browser. Externe browserlibraries staan runtime onder wiki-data/static/vendor/; wijzig die niet als applicatiebron.
Belangrijke invarianten
- Er is geen anonieme wiki-toegang.
readerleest,editorschrijft enadminbeheert gebruikers en instellingen. - Schrijvende API-calls vereisen naast een sessie ook de CSRF-token.
- Pagina's hebben een aparte
namespaceen stabieleslug; de combinatie is uniek. Een titelwijziging verandert de slug niet. - Elke paginasave wijzigt
pagesen schrijft in dezelfde transactie een onveranderlijkepage_versions-rij. - Pagina-updates en CMap-updates gebruiken optimistic locking en horen bij een verouderde basisversie HTTP 409 te geven.
- Pagina's en CMaps worden gearchiveerd (soft delete); histories blijven behouden.
- Bijlagen staan als
BYTEAin PostgreSQL. Alleen vertrouwde rasterformaten worden inline geserveerd; andere bestanden worden downloads. - Markdown gaat vóór invoegen in de DOM door DOMPurify.
- Verhoog
current-schema-versionalleen samen met een nieuwe, opeenvolgende migratie. Een database met een nieuwer schema dan de code moet geweigerd blijven.
Lopend werk: 0.2.95–0.2.99
De niet-gecommitte reeks bouwt vooral de persistente CMap-functionaliteit uit:
- stabiele, wiki-brede
conceptId-identiteiten en gekoppelde plaatsingen met een eigen layout; - conceptaspecten, beschrijvingspagina's, stijlpresets, afzonderlijke titel-/synopsisopmaak en een bewerkbaar kleurenpalet;
- directe relaties met Alt, gelinkte copy/paste en robuust herstel bij relaties met ontbrekende eindpunten;
- afgeleide, opgeslagen sub-CMapweergaven die naar de canonieke parentgraph verwijzen;
- keuze van een start-CMap en per-view verborgen concepten;
- autosave zonder historievervuiling, maximaal vijf handmatige saves en onbeperkte snapshots;
- verwijderen van afzonderlijke handmatige CMap-history-items/snapshots;
- een paneel op wikipagina's met alle gekoppelde CMap-concepten en plaatsingstellingen.
Migratie 12 schoont oude CMap-autosavehistorie op en beperkt herkenbare handmatige saves tot vijf. migrate-cmap-subpages.rkt is een aparte contentmigratie voor oudere inline sub-CMaps; dit is geen databaseschemamigratie.
Gebruik die contentmigratie altijd eerst als dry-run:
racket migrate-cmap-subpages.rkt --data ./wiki-data
racket migrate-cmap-subpages.rkt --data ./wiki-data --apply
Zonder --apply wordt niets gewijzigd. Met --apply gebeurt de omzetting in één PostgreSQL-transactie. Maak desondanks eerst een databasebackup en beoordeel de gemelde slugs.
Testen en huidige verificatiestatus
De automatische testdekking is beperkt. Op 22 augustus 2026 zijn de volgende controles succesvol uitgevoerd:
raco test architecture/import.rkt
# 12 tests passed
raco make main.rkt server.rkt setup-vendor.rkt \
migrate-cmap-subpages.rkt architecture/import.rkt
node --check static/js/wiki.js
node --check static/js/combobox.js
node --check static/cmap/cmap.js
node --check static/cmap/cmap-racket-wiki.js
Er is nog geen geautomatiseerde backendintegratietest tegen PostgreSQL en geen browsertestsuite. De huidige 0.2.95–0.2.99-werkboom is dus wel compileerbaar en syntactisch geldig, maar nog niet in deze overdracht end-to-end gevalideerd.
Voer vóór commit/release minimaal deze smoke tests uit op een kopie of aparte testdatabase:
- Verse
/setup, login/logout en de drie rollen. - Pagina maken, wijzigen, hernoemen, history bekijken, conflict (409), namespace-link en upload.
- CMap maken, autosave, expliciet opslaan, snapshot maken/verwijderen en historylimiet controleren.
- Een concept meerdere keren en in meerdere CMaps plaatsen; controleer tellingen en het paneel op de gekoppelde wikipagina.
- Een inline sub-CMap met de dry-run en daarna
--applymigreren; controleer parent, derived view en oude histories. - Start-CMap, verborgen concepten, linked copy/paste, undo/redo en beschadigde relatie zonder endpoint controleren.
- Zoekresultaten, bookmarks, todo's, aliassen en adminoverzichten nalopen.
- Indien mail relevant is: SMTP-test en de volledige vergeten-wachtwoordflow.
Architectuurdocumentatie importeren
Valideren en wijzigingen vooraf bekijken:
racket architecture/import.rkt --data ./wiki-data --dry-run
Importeren:
racket architecture/import.rkt --data ./wiki-data --author "Naam ontwikkelaar"
De import is herhaalbaar en gebruikt source hashes. Lokaal aangepaste geïmporteerde pagina's/CMaps worden standaard overgeslagen. Gebruik --overwrite-modified alleen na controle van hun histories.
Mailconfiguratie
Password-resetmail kan via de admininterface/database of via omgevingsvariabelen worden ingesteld. Ondersteund zijn:
RACKET_WIKI_PUBLIC_URL
RACKET_WIKI_SMTP_HOST
RACKET_WIKI_SMTP_PORT
RACKET_WIKI_SMTP_FROM
RACKET_WIKI_SMTP_USER
RACKET_WIKI_SMTP_PASSWORD
RACKET_WIKI_SMTP_TLS
RACKET_WIKI_SMTP_ACCEPT_UNTRUSTED_CERTIFICATES
RACKET_WIKI_RESET_LIMIT
Accepteer onbetrouwbare certificaten alleen bewust voor een vertrouwde lokale SMTP-server. Zet secrets nooit in documentatie, commits of testoutput.
Aanbevolen eerstvolgende stap
Maak eerst een databasebackup en test de volledige niet-gecommitte 0.2.95–0.2.99-reeks met bovenstaande smoke tests. Beoordeel daarna de diff als één samenhangende CMap-wijziging, werk zo nodig README.md, Scribble-documentatie en architectuurpagina's gelijk bij, en commit pas wanneer migratie 12 en migrate-cmap-subpages.rkt op representatieve data zijn geverifieerd.
Voor functionele details en releasehistorie is README.md de uitgebreidste bron. De bestanden onder architecture/pages/ beschrijven ontwerpbeslissingen en kwaliteitsafspraken; architecture/pages/code-regels.md is de beste start voor projectconventies.