Files
proostenkrant.net/README.md
T

137 lines
6.7 KiB
Markdown

# 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
```bash
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`.