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!, via UNIVERSAL_PASSWORD in .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 op Unknown.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

  1. Vereiste: Docker + Docker Compose op de server.
  2. Clone de repository en zet in .env een sterk wachtwoord voordat je live gaat:
    • UNIVERSAL_PASSWORD — inlogwachtwoord én paszin (standaard ProostenKrant2024!)
    • DB_PASSWORD / MYSQL_ROOT_PASSWORD — database (MYSQL_ROOT_PASSWORD staat in compose.yml)
  3. Start: docker compose up -d --build — de database wordt automatisch geïnitialiseerd (users incl. Kevin, Luc en Tilde; seizoenen).
  4. Zet eventueel een reverse proxy met HTTPS (Caddy/nginx) voor http://server:8080. Overweeg de MySQL-poort (3306) dicht te zetten in compose.yml als de database niet van buitenaf benodigd is.
  5. Backups: de resources/-map (foto's, artikelafbeeldingen, archief-PDF's) en de mysql-data volume bevatten alles; docker compose down -v verwijdert 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 (standaard mysql/proostenkrant)
  • UNIVERSAL_PASSWORD — inlogwachtwoord en paszin (standaard ProostenKrant2024!)

Paden (standaarden in appsettings.json, sectie Paths):

  • StaticArchive / LatexOutput — map voor archief-edities én pas gedrukte kranten (archive, gekoppeld aan resources/archive)
  • ResourceImages — map voor afbeeldingen uit de resources (resources/images, gekoppeld aan resources/images; submappen profiles en articles)

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.

S
Description
No description provided
Readme MIT
187 MiB
Languages
HTML 41.9%
C# 33.2%
CSS 12.9%
TeX 8.1%
Dockerfile 1.8%
Other 2.1%