This commit is contained in:
@@ -21,6 +21,15 @@ De repository bevat een uitvoerbare Django-MVP met:
|
||||
|
||||
## Laatste productiehardening
|
||||
|
||||
Productieoplevering 0.3.13 op 2026-07-29:
|
||||
|
||||
- commit `5e2453c` naar `origin/main` gepusht en op Unraid werkelijk gebouwd als image `sha256:5271a18ce719621db80c1b5072d1290623af357772744f7c43b1a42269399af8`;
|
||||
- migrations, 148 static files, poort 1226, mounts, restartpolicy, PostgreSQL, Redis, Gunicorn, Celery worker/beat en readiness live gevalideerd, inclusief containerrestart;
|
||||
- publieke HTTP→HTTPS, proxy/securityheaders, login-/gastflow, kernroutes, dark/light, 390/1280/3440 px en browserconsole live groen;
|
||||
- productiecustomdump en media gehasht, naar een geïsoleerde database hersteld en via migrations, recordtellingen en afzonderlijke Gunicorn-readiness bewezen;
|
||||
- vorige image `sha256:1851863be947b1e8b504e61e73b89d09c1dff704257b48856c775bb55f741459` live healthy teruggezet, waarna 0.3.13 opnieuw healthy is uitgerold;
|
||||
- importprofiling overschreed opnieuw 9.000 queries; veilige optimalisatie vereist eerst een geïsoleerde benchmarkdatabase en blijft als performancevervolg gedocumenteerd.
|
||||
|
||||
VR-227 op 2026-07-29:
|
||||
|
||||
- globaal contentframe en topbar zijn gecentreerd tot ultrawide; de gastbanner staat in de normale hoofdflow en de mobiele pipeline is verticaal;
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
# Finale acceptance 0.3.13
|
||||
|
||||
Status: lokaal geaccepteerd; live externe acties blijven afzonderlijk geregistreerd.
|
||||
Status: productie geaccepteerd op 2026-07-29.
|
||||
|
||||
## Bewijs
|
||||
|
||||
- `./scripts/codex_verify.sh`: geslaagd.
|
||||
- Tests: 312 geslaagd, 0 mislukt, 0 overgeslagen, 1 niet-blokkerende waarschuwing.
|
||||
- Branch-aware coverage: 84,16%.
|
||||
- Playwright: zes viewports van 390×844 tot 3440×1200, volledige kernreis, reduced motion, focus, console/page errors en documentoverflow geslaagd.
|
||||
- Benchmarkkwaliteitsrun: 12/12 parservelden, dedupeprecision 1,0, recall 1,0 en rankingchurn 0,0.
|
||||
- Django system check en migratiecheck: schoon.
|
||||
- Repository-, YAML-, ledger- en dependencyconsistentie: schoon; `pip check` meldt geen gebroken dependencies.
|
||||
- Docker/compose-runtime: niet uitgevoerd omdat de lokale omgeving geen Dockerbinary bevat. Composebestanden blijven regressiegedekt en CI bouwt, scant en produceert een CycloneDX-SBOM.
|
||||
- `./scripts/codex_verify.sh`: 312 geslaagd, 0 mislukt, 0 overgeslagen, 84,16% branch-aware dekking.
|
||||
- Benchmarkkwaliteit: 12/12 parservelden, dedupeprecision 1,0, recall 1,0 en rankingchurn 0,0.
|
||||
- Unraid Docker 27.5.1 en Compose 2.40.3 bouwden image `sha256:5271a18ce719621db80c1b5072d1290623af357772744f7c43b1a42269399af8`; migrations, 148 static files, healthcheck en restart slaagden.
|
||||
- HTTP redirect naar HTTPS, OpenResty/TLS, HSTS/securityheaders en geen `DisallowedHost` zijn publiek bewezen.
|
||||
- Login en gastknop, alleen-lezen gasttoegang, dashboard, zoek/filterlijst, detail, pipeline, bronnen en automatisering werkten live.
|
||||
- Dark/light en 390/1280/3440 px hadden nul horizontale overflow en nul browserconsole-errors; de mobiele gastbanner bleef in de flow.
|
||||
- PostgreSQL custom dump plus media/configbewijs is naar een geïsoleerde database hersteld; migrations, exacte recordtellingen en een aparte applicatiestart slaagden.
|
||||
- Vorige image `sha256:1851863be947b1e8b504e61e73b89d09c1dff704257b48856c775bb55f741459` is live healthy gestart en daarna opnieuw vervangen door 0.3.13, eveneens healthy.
|
||||
|
||||
## Uitkomst
|
||||
|
||||
Er bestaan geen bekende lokale P0- of P1-blokkers. Live TLS/proxy, productie-restore en optionele externe identity/mailintegraties worden uitsluitend overgenomen uit `USER_INPUT_REQUIRED.md`; lokale validatie wordt niet als live bewijs gepresenteerd.
|
||||
Er bestaan geen bekende P0- of P1-releaseblokkers. Alleen optionele Entra- en mailboxcredentials blijven extern. De importqueryoptimalisatie blijft een meetbaar performancevervolg en geen correctness- of releaseblokker.
|
||||
|
||||
@@ -24,3 +24,7 @@ De eerste run ontdekte een echte benchmarkfout: de generieke HTML-fixture leverd
|
||||
- De synthetische quickimport overschrijdt de historische NFR-007-p95-doelwaarde; profiling van het volledige 25.000-itempad blijft zinvol vóór opschaling.
|
||||
- De quickbenchmark meldt meer dan 7.900 databasequeries voor 250 importpogingen. Correctheid en idempotentie zijn goed, maar bulkimport is de eerstvolgende optimalisatiekandidaat.
|
||||
- Queuediepte is met de generieke Django-cachebackend niet betrouwbaar meetbaar en wordt daarom eerlijk als onbekend getoond.
|
||||
|
||||
## Productiereleaseprofiling
|
||||
|
||||
De releaseherhaling overschreed opnieuw Django's queryloglimiet van 9.000 queries voordat de 250-itemrun afrondde. Een aansluitende herhaalrun produceerde door achtergebleven benchmarkidentiteiten geen nieuwe vacatures; database-isolatie via de lokale `.env` activeerde vervolgens terecht de productiedriver. Daardoor is geen betrouwbare nawaarde beschikbaar en is geen risicovolle pipelinebulkrefactor in de productieoplevering opgenomen. Vervolg: geef de benchmark een expliciete tijdelijke database en profileer `process_extraction_batch` per queryfamilie; behoud idempotentie, dedupeprecision/recall 1,0 en nul rankingchurn.
|
||||
|
||||
@@ -11,5 +11,8 @@
|
||||
| Democontrols | read-only middleware en responsive CSS | auth- en E2E-tests | implemented and verified |
|
||||
| Runtimeobservability | `apps/core/tasks.py`, automationservice | runtime-observabilitytests | implemented and verified |
|
||||
| Parser/performance | generic HTML-adapter en benchmarkfixture | benchmark 12/12, precision/recall 1,0 | implemented and verified |
|
||||
| Container/security | bestaande Docker/CI-hardening | compose-, config-, security- en containerscans | implemented, live verification pending |
|
||||
| Live TLS/restore/identity | scripts en runbooks | `USER_INPUT_REQUIRED.md` | externally blocked, implementation complete |
|
||||
| Container/security | bestaande Docker/CI-hardening | live imagebuild, migrations, restart en readiness | implemented and live verified |
|
||||
| Live TLS/proxy | productieconfiguratie en OpenResty | HTTP→HTTPS, HSTS, securityheaders en browserflow | implemented and live verified |
|
||||
| Back-up/restore | custom dump, media en runbook | geïsoleerde restore, exacte tellingen en aparte applicatiestart | implemented and live verified |
|
||||
| Rollback | immutable vorige en huidige imagetags | oude image healthy, daarna 0.3.13 opnieuw healthy | implemented and live verified |
|
||||
| Externe identity/mail | versleutelde configuratieboundary | `USER_INPUT_REQUIRED.md` | optional external action |
|
||||
|
||||
@@ -19,10 +19,10 @@ Een publieke Django-debugpagina is een afzonderlijk beveiligingsprobleem. Gebrui
|
||||
Voer dit uit in de huidige bronmap op Unraid:
|
||||
|
||||
```bash
|
||||
cd /mnt/user/appdata/vacatureradar/source
|
||||
cd /mnt/user/appdata/VacatureRadar
|
||||
python scripts/configure_public_url.py \
|
||||
https://vacatureradar.itworx.tech \
|
||||
--env-file /mnt/user/appdata/vacatureradar/source/.env \
|
||||
--env-file /mnt/user/appdata/VacatureRadar/.env \
|
||||
--cache-url redis://127.0.0.1:6379/1
|
||||
```
|
||||
|
||||
@@ -89,7 +89,7 @@ Bepaal het proxy-IP of Docker-netwerk en voeg alleen dat bereik toe, bijvoorbeel
|
||||
```bash
|
||||
python scripts/configure_public_url.py \
|
||||
https://vacatureradar.itworx.tech \
|
||||
--env-file /mnt/user/appdata/vacatureradar/source/.env \
|
||||
--env-file /mnt/user/appdata/VacatureRadar/.env \
|
||||
--cache-url redis://127.0.0.1:6379/1 \
|
||||
--trusted-proxy-cidr 172.18.0.0/16
|
||||
```
|
||||
|
||||
@@ -7,7 +7,7 @@ Deze handleiding gebruikt `docker-compose.unraid.yml` als declaratieve bron van
|
||||
Alle paden in `docker-compose.unraid.yml` zijn relatief aan de map waarin dat bestand staat. Je kopieert de projectmap dus naar een plek naar keuze; de aanbevolen locatie blijft:
|
||||
|
||||
```text
|
||||
/mnt/user/appdata/vacatureradar/source
|
||||
/mnt/user/appdata/VacatureRadar
|
||||
```
|
||||
|
||||
De container maakt `local/`, `local/media`, `local/logs`, `local/postgres-aio17`, `local/redis-aio` en `local/backups` bij de eerste start zelf aan en zet de juiste eigenaar. Voor back-ups blijft `/mnt/user/backups/vacatureradar` de aanbevolen doelmap.
|
||||
@@ -19,7 +19,7 @@ Gebruik bij voorkeur een cache-backed `appdata`-share en neem die afzonderlijk i
|
||||
Wanneer je niet via `scripts/deploy_unraid.sh` werkt maar de map met de hand kopieert (rsync, SMB-share, ZIP):
|
||||
|
||||
```bash
|
||||
cd /mnt/user/appdata/vacatureradar/source
|
||||
cd /mnt/user/appdata/VacatureRadar
|
||||
cp .env.unraid.example .env # alleen de eerste keer
|
||||
nano .env # alle CHANGE_ME-waarden vervangen
|
||||
docker compose -f docker-compose.unraid.yml up -d --build --force-recreate
|
||||
@@ -69,7 +69,7 @@ Een afwijkende locatie kan vóór Compose via `VACATURERADAR_ENV_FILE` worden in
|
||||
Configureer een bestaand bestand voor de publieke URL zonder secrets te overschrijven:
|
||||
|
||||
```bash
|
||||
cd /mnt/user/appdata/vacatureradar/source
|
||||
cd /mnt/user/appdata/VacatureRadar
|
||||
python scripts/configure_public_url.py \
|
||||
https://vacatureradar.example.be \
|
||||
--env-file .env \
|
||||
@@ -84,7 +84,7 @@ Beperk de bestandsrechten van `.env` tot de beheerder. Voeg geen secrets toe aan
|
||||
2. Start of hermaak de Unraid-container vanuit de bronmap:
|
||||
|
||||
```bash
|
||||
cd /mnt/user/appdata/vacatureradar/source
|
||||
cd /mnt/user/appdata/VacatureRadar
|
||||
docker compose -f docker-compose.unraid.yml up -d --build --force-recreate
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user