6.0 KiB
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
Regressietest (draait tegen de draaiende stack; maakt testartikelen en drukt een proefeditie):
scripts/e2e-test.sh
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, uploads (volume-mounted)
├── deploy/
│ ├── Dockerfile # Build + runtime met texlive (gecachete laag)
│ └── mysql/init.sql # Database-initialisatie
├── compose.yml # app + mysql stack
├── app/ # (legacy) PHP-versie — niet verwijderd, zie hieronder
└── Latex/ # (legacy) origineel krantenontwerp ter referentie
De artikel- en profielfoto's uit de PHP-versie worden hergebruikt via volumes:
app/public/images/articles en app/public/images/profiles worden gekoppeld aan de
uploadmappen van de Blazor-app. De gedrukte PDF's landen in app/storage/latex.
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:
resources/(repo),app/public/images/(foto'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!)
Legacy PHP-versie
De oude PHP-applicatie staat nog in app/ en is niet verwijderd; de oude
docker-compose-bestanden zijn verplaatst naar legacy/ zodat Compose automatisch
de Blazor-stack (compose.yml) pakt. Zodra de Blazor-versie goedgekeurd is, kunnen
app/, docker/ en legacy/ worden opgeruimd.