- compose: keep DataProtection keys in a named volume so redeploying no longer logs everybody out - seed default family members at startup (init.sql only runs on a fresh MySQL volume, existing databases never got new members like Mattis) - editors no longer need the paszin to submit an article or edit their own article; the editor session now survives submitting/editing (previously the paszin flow replaced or signed out the editor cookie)
ProostenKrant 3.0 — Blazor
De ProostenKrant is een webkrant van en voor de familie Proosten: familieleden leveren artikelen in via de website, de redactie publiceert ze per seizoeneditie en drukt de krant als PDF via LaTeX.
Deze versie vervangt de PHP/MySQL-applicatie door een Blazor Server-applicatie (.NET 10) met dezelfde database en hetzelfde LaTeX-krantenontwerp.
Architectuur
| Onderdeel | Keuze |
|---|---|
| Framework | Blazor Web App (static SSR, geen JavaScript nodig) |
| Database | MySQL 8 (zelfde schema als voorheen, Dapper) |
| Authenticatie | Cookie-auth met universeel wachtwoord + paszin |
| PDF-generatie | LaTeX (newspaper-pakket) aangeroepen vanuit .NET |
| Hosting | Docker Compose: app (Blazor + texlive) + mysql |
Waarom Blazor Server en niet WebAssembly? De applicatie is servergebonden: MySQL-toegang, bestandsuploads en LaTeX-compilatie gebeuren allemaal op de server. Met WASM zou je een aparte REST-API met token-authenticatie moeten bouwen en dezelfde werkzaamheden toch op de server doen. Server-side rendering is bovendien sneller voor een kleine gebruikersgroep en werkt zonder JavaScript.
Waarom LaTeX en niet een .NET PDF-bibliotheek? .NET kan goede PDF's genereren (bijv. met QuestPDF, gratis Community-licentie), maar echte krantenzetting — automatische tekstverdeling over drie kolommen, microtype, woordafbreking, kopbalancering — is waar TeX in uitblinkt. De krant blijft daarom met LaTeX gedrukt, nu aangestuurd vanuit .NET.
Snel starten
docker compose up -d --build
Daarna:
- Website: http://localhost:8080
- Inloggen redactie: kies je naam + universel wachtwoord (standaard
ProostenKrant2024!, viaUNIVERSAL_PASSWORDin.env) - Paszin voor inzendingen: hetzelfde wachtwoord
De eerste build duurt lang (de texlive-installatie is ±2 GB). Daarna cachet Docker de
LaTeX-laag: hertesten vraagt geen herinstallatie meer, zolang je niet
--no-cache gebruikt.
Gebruik
| Route | Doel |
|---|---|
/ |
Voorpagina (krantenstijl) |
/indienen |
Artikel inleveren via paszin |
/indienen/bewerken |
Kladartikel bewerken (alleen de schrijver) |
/archief |
Gedrukte edities + gepubliceerde artikelen |
/login |
Redactie-login |
/dashboard |
Overzicht, statistieken, krant drukken |
/artikelen, /artikelen/nieuw, /artikelen/{id} |
Artikelbeheer (redactie) |
/seizoenen, /seizoenen/{id} |
Edities drukken (redactie) |
/edities/{bestand} |
PDF-download |
Werkstroom: familie dient in via /indienen (status klad) → redactie publiceert
via /artikelen/{id} → redactie drukt de editie via /seizoenen of /dashboard.
Projectstructuur
proostenkrant.net/
├── src/ProostenKrant/ # Blazor-applicatie
│ ├── Components/Pages/ # Alle pagina's (Razor, static SSR)
│ ├── Services/ # Db, ArticleService, LatexService, auth, uploads
│ └── wwwroot/ # css, fonts, EU-vlag (resources volume-mounted)
├── deploy/
│ ├── Dockerfile # Build + runtime met texlive (gecachete laag)
│ └── mysql/init.sql # Database-initialisatie
├── resources/
│ ├── archive/ # Gedrukte edities (PDF's)
│ ├── images/
│ │ ├── profiles/ # Profielfoto's (naam = weergavenaam)
│ │ └── articles/ # Artikelafbeeldingen (via website geüpload)
│ └── templates/latex/ # LaTeX-ontwerp ter referentie
└── compose.yml # app + mysql stack
De volledige resources-map wordt via volumes aan de app gekoppeld:
resources/images→wwwroot/resources/images— profielfoto's en artikelafbeeldingen. Een profielfoto hoort bij een familielid als de bestandsnaam (zonder extensie) overeenkomt met de weergavenaam (Geert.jpg→ Geert). Een later toegevoegde foto wordt dus automatisch gekoppeld; een verwijderde foto valt terug opUnknown.jpg.resources/archive→/app/archive— de bestaande archief-edities worden getoond en pas gedrukte kranten worden hier bewaard.
De Europese vlag in de voettekst is een SVG (src/ProostenKrant/wwwroot/images/european-flag.svg)
volgens de officiële specificaties (12 gouden sterren, cirkelradius ⅓ van de hoogte).
Deployen op een server
- Vereiste: Docker + Docker Compose op de server.
- Clone de repository en zet in
.enveen sterk wachtwoord voordat je live gaat:UNIVERSAL_PASSWORD— inlogwachtwoord én paszin (standaardProostenKrant2024!)DB_PASSWORD/MYSQL_ROOT_PASSWORD— database (MYSQL_ROOT_PASSWORDstaat incompose.yml)
- Start:
docker compose up -d --build— de database wordt automatisch geïnitialiseerd (users incl. Kevin, Luc en Tilde; seizoenen). - Zet eventueel een reverse proxy met HTTPS (Caddy/nginx) voor
http://server:8080. Overweeg de MySQL-poort (3306) dicht te zetten incompose.ymlals de database niet van buitenaf benodigd is. - Backups: de
resources/-map (foto's, artikelafbeeldingen, archief-PDF's) en de mysql-data volume bevatten alles;docker compose down -vverwijdert de data definitief.
De eerste build installeert texlive eenmalig (±2 GB, enkele minuten); daarna pakken Docker-lagen alles en duurt een rebuild seconden.
Configuratie
Omgevingsvariabelen (of .env):
DB_HOST,DB_NAME,DB_USER,DB_PASSWORD— database (standaardmysql/proostenkrant)UNIVERSAL_PASSWORD— inlogwachtwoord en paszin (standaardProostenKrant2024!)
Paden (standaarden in appsettings.json, sectie Paths):
StaticArchive/LatexOutput— map voor archief-edities én pas gedrukte kranten (archive, gekoppeld aanresources/archive)ResourceImages— map voor afbeeldingen uit de resources (resources/images, gekoppeld aanresources/images; submappenprofilesenarticles)
Legacy PHP-versie
De oude PHP-applicatie is opgeruimd; de foto's en archief-PDF's zijn verplaatst
naar de resources/-map. Alleen de oude docker/-map (nginx/php-config van de
PHP-versie) staat nog in de repo en kan verwijderd worden — de Blazor-stack
gebruikt enkel compose.yml en deploy/Dockerfile.