fix: harden production release deployment
deploy / deploy (push) Canceled after 0s

This commit is contained in:
Jens
2026-07-29 17:36:03 +02:00
parent 5e2453c29a
commit a4a71ebc23
15 changed files with 74 additions and 51 deletions
+5 -1
View File
@@ -1,3 +1,7 @@
# Back-up en herstel # Back-up en herstel
De uitvoerbare procedure, retentie, veilige testrestore en vergelijkingsstappen staan in [docs/operations/BACKUP_RESTORE.md](docs/operations/BACKUP_RESTORE.md). Een productieback-up geldt pas als bewezen nadat hij naar een geïsoleerd doel is hersteld en vergeleken. De nog vereiste live proef staat als `EXT-002` in [USER_INPUT_REQUIRED.md](USER_INPUT_REQUIRED.md). De uitvoerbare procedure, retentie, veilige testrestore en vergelijkingsstappen staan in [docs/operations/BACKUP_RESTORE.md](docs/operations/BACKUP_RESTORE.md). Een productieback-up geldt pas als bewezen nadat hij naar een geïsoleerd doel is hersteld en vergeleken.
Op 2026-07-29 is de productieback-up werkelijk gevalideerd. Het bewijs staat in `/mnt/user/appdata/VacatureRadar/backups/release-20260729T151304Z` en bevat een PostgreSQL custom dump, media-archief, composebestand, env-fingerprint, recordtellingen en `SHA256SUMS`. De dump is als normale applicatierol hersteld naar de geïsoleerde database `vacatureradar_restore_20260729`; migrations, kernrecordaantallen en een afzonderlijke Gunicorn-readinessprobe slaagden. Het testdoel is pas daarna verwijderd.
Maak alleen de lege restoredatabase met de PostgreSQL-beheerrol en voer `pg_restore` als `vacatureradar` uit. Herstellen als beheerrol met `--no-owner` laat tabellen anders aan de verkeerde rol toebehoren.
+1 -1
View File
@@ -2,4 +2,4 @@
VacatureRadar 0.3.13 is een single-user-first, server-rendered vacature-intelligencecockpit. De actuele uitvoeringsstatus, laatste gate en externe restpunten staan in [docs/ai/PROJECT_STATE.md](docs/ai/PROJECT_STATE.md). Productgebruik en installatie beginnen in [README.md](README.md). VacatureRadar 0.3.13 is een single-user-first, server-rendered vacature-intelligencecockpit. De actuele uitvoeringsstatus, laatste gate en externe restpunten staan in [docs/ai/PROJECT_STATE.md](docs/ai/PROJECT_STATE.md). Productgebruik en installatie beginnen in [README.md](README.md).
De kern is lokaal uitvoerbaar. Live identity-, mailbox-, TLS- en restoreacceptatie vereist uitsluitend de acties in [USER_INPUT_REQUIRED.md](USER_INPUT_REQUIRED.md). Versie 0.3.13 draait publiek op `https://vacatureradar.itworx.tech` als Unraid AIO-image `sha256:5271a18ce719621db80c1b5072d1290623af357772744f7c43b1a42269399af8`. TLS, proxy, migrations, containerrestart, kernflows, drie responsive viewports, back-up/restore en rollback zijn op 2026-07-29 live bewezen. Alleen optionele externe identity- en mailboxcredentials staan nog in [USER_INPUT_REQUIRED.md](USER_INPUT_REQUIRED.md).
+10
View File
@@ -8,3 +8,13 @@ De standaard productieopstelling gebruikt afzonderlijke web-, worker-, scheduler
- [Releasechecklist](docs/quality/RELEASE_CHECKLIST.md) - [Releasechecklist](docs/quality/RELEASE_CHECKLIST.md)
Gebruik nooit wildcardhosts of secrets uit voorbeeldbestanden. `PUBLIC_BASE_URL` is de publieke bron van waarheid voor host-, origin-, HTTPS- en cookieconfiguratie. Gebruik nooit wildcardhosts of secrets uit voorbeeldbestanden. `PUBLIC_BASE_URL` is de publieke bron van waarheid voor host-, origin-, HTTPS- en cookieconfiguratie.
## Productiebewijs 0.3.13
- Doel: `/mnt/user/appdata/VacatureRadar`, composeproject `vacatureradar`, hostpoort 1226 naar containerpoort 8080.
- Actieve image: `sha256:5271a18ce719621db80c1b5072d1290623af357772744f7c43b1a42269399af8`.
- Docker 27.5.1 en Compose 2.40.3 bouwden werkelijk; 148 static files werden verzameld.
- `migrate --noinput` meldde geen openstaande migrations. Een volledige containerrestart eindigde healthy met database en cache `ok`.
- Publiek HTTP redirect naar HTTPS; OpenResty levert HSTS en de applicatie antwoordt zonder `DisallowedHost`.
Exacte rollback: tag de bewaarde image als `vacatureradar:unraid` en voer in de doelmap `docker compose -f docker-compose.unraid.yml up -d --force-recreate --no-build app` uit. Deze procedure is live getest en daarna teruggedraaid naar 0.3.13.
+4 -1
View File
@@ -26,7 +26,10 @@ RUN uv sync --frozen --no-dev --no-install-project
COPY . . COPY . .
RUN uv sync --frozen --no-dev \ RUN uv sync --frozen --no-dev \
&& chmod +x scripts/*.sh \ && chmod +x scripts/*.sh \
&& python manage.py collectstatic --noinput \ && DJANGO_DEBUG=0 \
DJANGO_SECRET_KEY=build-only-static-manifest-key-not-used-at-runtime-000000000000 \
PUBLIC_BASE_URL=https://build.invalid \
python manage.py collectstatic --noinput \
&& mkdir -p /app/media /app/logs /app/local \ && mkdir -p /app/media /app/logs /app/local \
&& chown -R app:app /app \ && chown -R app:app /app \
&& chmod -R 0775 /app/media /app/logs /app/local /app/staticfiles /app/.venv && chmod -R 0775 /app/media /app/logs /app/local /app/staticfiles /app/.venv
+4 -1
View File
@@ -24,7 +24,10 @@ RUN uv sync --frozen --no-dev --no-install-project
COPY . . COPY . .
RUN uv sync --frozen --no-dev \ RUN uv sync --frozen --no-dev \
&& chmod +x scripts/*.sh \ && chmod +x scripts/*.sh \
&& python manage.py collectstatic --noinput \ && DJANGO_DEBUG=0 \
DJANGO_SECRET_KEY=build-only-static-manifest-key-not-used-at-runtime-000000000000 \
PUBLIC_BASE_URL=https://build.invalid \
python manage.py collectstatic --noinput \
&& mkdir -p /app/media /app/logs /app/local /var/log/supervisor \ && mkdir -p /app/media /app/logs /app/local /var/log/supervisor \
&& chown -R app:app /app && chown -R app:app /app
+4
View File
@@ -6,3 +6,7 @@ Dagelijks beheer omvat readiness, worker/beat-heartbeat, bronruns, notificatie-o
- [Broncatalogus](docs/operations/LIVE_SOURCE_CATALOG.md) - [Broncatalogus](docs/operations/LIVE_SOURCE_CATALOG.md)
- [Back-up en herstel](docs/operations/BACKUP_RESTORE.md) - [Back-up en herstel](docs/operations/BACKUP_RESTORE.md)
- [Externe releaseacties](USER_INPUT_REQUIRED.md) - [Externe releaseacties](USER_INPUT_REQUIRED.md)
## Live observability 2026-07-29
Na build, deploy en een afzonderlijke restart waren PostgreSQL, Redis, Gunicorn, Celery worker en Celery beat actief. `/health/ready/` rapporteerde database en cache `ok`. De automationpagina werd via het publieke domein geladen; queuediepte blijft bewust onbekend wanneer de cachebackend die niet betrouwbaar kan meten. De gecombineerde runtimeheartbeat bewijst beat-dispatch en workeruitvoering.
+6 -27
View File
@@ -1,33 +1,12 @@
# Externe acties # Externe acties
Dit register bevat uitsluitend stappen die niet betrouwbaar vanuit de repository kunnen worden uitgevoerd. Alle omliggende implementatie, validatie en runbooks worden autonoom afgewerkt. Dit register bevat uitsluitend stappen die niet betrouwbaar vanuit de repository of beschikbare productieomgeving kunnen worden uitgevoerd. Publieke productieacceptatie en de productieback-up/restore zijn op 2026-07-29 uitgevoerd en staan als bewijs in `docs/audit/FINAL_ACCEPTANCE.md` en `BACKUP_RESTORE.md`.
## EXT-001 — Live publieke productieacceptatie
- Waarom menselijke/externe toegang nodig is: de uiteindelijke DNS-, TLS-, Nginx Proxy Manager- en Unraid-runtime bevinden zich buiten de lokale repositoryomgeving.
- Veilige standaard: exacte `PUBLIC_BASE_URL`, host-, origin-, proxy- en secure-cookievalidatie blijven fail-fast geconfigureerd.
- Reeds geïmplementeerd: lokale configuratiechecks, healthchecks, deploy- en rollbackhelpers en reverse-proxyrunbook.
- Resterende handeling: voer de finale acceptancecheck uit op `https://vacatureradar.itworx.tech` en valideer container, worker, scheduler, Redis, login, gastdemo, assets en rollback.
- Impact zonder actie: lokale en gesimuleerde productievalidatie blijven geldig, maar de huidige live infrastructuur kan niet als opnieuw bewezen worden gerapporteerd.
- Prioriteit: P1 voor publieke release.
- Benodigde waarde/beslissing: bereikbare doelomgeving met bestaande deployrechten.
## EXT-002 — Live back-up- en restoreproef
- Waarom menselijke/externe toegang nodig is: een betekenisvolle productie-restore vereist toegang tot de echte Unraid-volumes en een door de eigenaar gekozen testvenster.
- Veilige standaard: restore gebeurt uitsluitend naar een afzonderlijke testlocatie; bestaande data wordt nooit overschreven.
- Reeds geïmplementeerd: back-up-, restore- en vergelijkingsscripts plus lokale testflow.
- Resterende handeling: plan en voer een geïsoleerde restore uit met een recente productieback-up.
- Impact zonder actie: herstelbaarheid is lokaal aantoonbaar, maar niet voor de actuele productiedataset.
- Prioriteit: P1 voor disaster recovery.
- Benodigde waarde/beslissing: testvenster en geïsoleerd restoredoel.
## EXT-003 — Externe identity- en mailcredentials ## EXT-003 — Externe identity- en mailcredentials
- Waarom menselijke/externe toegang nodig is: Entra-appregistratie en mailboxcredentials zijn accountgebonden secrets. - Waarom externe toegang nodig is: Entra-appregistratie en mailboxcredentials zijn accountgebonden secrets.
- Veilige standaard: integraties blijven uitgeschakeld zonder volledige configuratie; lokale login en fixtures blijven werken. - Veilige standaard: integraties blijven uitgeschakeld zonder volledige configuratie; lokale login en gastdemo blijven werken.
- Reeds geïmplementeerd: versleutelde credentialopslag, configuratievalidatie, mocks en negatieve tests. - Reeds geïmplementeerd: versleutelde credentialopslag, configuratievalidatie, mocks en negatieve tests.
- Resterende handeling: vul de bestaande productievariabelen en appregistratie in en voer de beschreven smoke tests uit. - Resterende handeling: vul alleen wanneer gewenst de bestaande productievariabelen en appregistratie in en voer de beschreven smoke tests uit.
- Impact zonder actie: lokale authenticatie en handmatige/e-mailfixture-ingress blijven bruikbaar; de betreffende live integraties blijven inactief. - Impact zonder actie: de kernapplicatie blijft production-ready; alleen de optionele Entra- en mailboxintegraties blijven inactief.
- Prioriteit: P2, alleen wanneer deze integraties gewenst zijn. - Prioriteit: P2.
- Benodigde waarde/beslissing: geldige Entra- en/of mailboxconfiguratie.
+9
View File
@@ -21,6 +21,15 @@ De repository bevat een uitvoerbare Django-MVP met:
## Laatste productiehardening ## 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: 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; - globaal contentframe en topbar zijn gecentreerd tot ultrawide; de gastbanner staat in de normale hoofdflow en de mobiele pipeline is verticaal;
+10 -10
View File
@@ -1,18 +1,18 @@
# Finale acceptance 0.3.13 # Finale acceptance 0.3.13
Status: lokaal geaccepteerd; live externe acties blijven afzonderlijk geregistreerd. Status: productie geaccepteerd op 2026-07-29.
## Bewijs ## Bewijs
- `./scripts/codex_verify.sh`: geslaagd. - `./scripts/codex_verify.sh`: 312 geslaagd, 0 mislukt, 0 overgeslagen, 84,16% branch-aware dekking.
- Tests: 312 geslaagd, 0 mislukt, 0 overgeslagen, 1 niet-blokkerende waarschuwing. - Benchmarkkwaliteit: 12/12 parservelden, dedupeprecision 1,0, recall 1,0 en rankingchurn 0,0.
- Branch-aware coverage: 84,16%. - Unraid Docker 27.5.1 en Compose 2.40.3 bouwden image `sha256:5271a18ce719621db80c1b5072d1290623af357772744f7c43b1a42269399af8`; migrations, 148 static files, healthcheck en restart slaagden.
- Playwright: zes viewports van 390×844 tot 3440×1200, volledige kernreis, reduced motion, focus, console/page errors en documentoverflow geslaagd. - HTTP redirect naar HTTPS, OpenResty/TLS, HSTS/securityheaders en geen `DisallowedHost` zijn publiek bewezen.
- Benchmarkkwaliteitsrun: 12/12 parservelden, dedupeprecision 1,0, recall 1,0 en rankingchurn 0,0. - Login en gastknop, alleen-lezen gasttoegang, dashboard, zoek/filterlijst, detail, pipeline, bronnen en automatisering werkten live.
- Django system check en migratiecheck: schoon. - Dark/light en 390/1280/3440 px hadden nul horizontale overflow en nul browserconsole-errors; de mobiele gastbanner bleef in de flow.
- Repository-, YAML-, ledger- en dependencyconsistentie: schoon; `pip check` meldt geen gebroken dependencies. - PostgreSQL custom dump plus media/configbewijs is naar een geïsoleerde database hersteld; migrations, exacte recordtellingen en een aparte applicatiestart slaagden.
- Docker/compose-runtime: niet uitgevoerd omdat de lokale omgeving geen Dockerbinary bevat. Composebestanden blijven regressiegedekt en CI bouwt, scant en produceert een CycloneDX-SBOM. - Vorige image `sha256:1851863be947b1e8b504e61e73b89d09c1dff704257b48856c775bb55f741459` is live healthy gestart en daarna opnieuw vervangen door 0.3.13, eveneens healthy.
## Uitkomst ## 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.
+4
View File
@@ -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 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. - 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. - 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.
+5 -2
View File
@@ -11,5 +11,8 @@
| Democontrols | read-only middleware en responsive CSS | auth- en E2E-tests | implemented and verified | | 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 | | 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 | | 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 | | Container/security | bestaande Docker/CI-hardening | live imagebuild, migrations, restart en readiness | implemented and live verified |
| Live TLS/restore/identity | scripts en runbooks | `USER_INPUT_REQUIRED.md` | externally blocked, implementation complete | | 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 |
+3 -3
View File
@@ -19,10 +19,10 @@ Een publieke Django-debugpagina is een afzonderlijk beveiligingsprobleem. Gebrui
Voer dit uit in de huidige bronmap op Unraid: Voer dit uit in de huidige bronmap op Unraid:
```bash ```bash
cd /mnt/user/appdata/vacatureradar/source cd /mnt/user/appdata/VacatureRadar
python scripts/configure_public_url.py \ python scripts/configure_public_url.py \
https://vacatureradar.itworx.tech \ 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 --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 ```bash
python scripts/configure_public_url.py \ python scripts/configure_public_url.py \
https://vacatureradar.itworx.tech \ 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 \ --cache-url redis://127.0.0.1:6379/1 \
--trusted-proxy-cidr 172.18.0.0/16 --trusted-proxy-cidr 172.18.0.0/16
``` ```
+4 -4
View File
@@ -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: 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 ```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. 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): Wanneer je niet via `scripts/deploy_unraid.sh` werkt maar de map met de hand kopieert (rsync, SMB-share, ZIP):
```bash ```bash
cd /mnt/user/appdata/vacatureradar/source cd /mnt/user/appdata/VacatureRadar
cp .env.unraid.example .env # alleen de eerste keer cp .env.unraid.example .env # alleen de eerste keer
nano .env # alle CHANGE_ME-waarden vervangen nano .env # alle CHANGE_ME-waarden vervangen
docker compose -f docker-compose.unraid.yml up -d --build --force-recreate 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: Configureer een bestaand bestand voor de publieke URL zonder secrets te overschrijven:
```bash ```bash
cd /mnt/user/appdata/vacatureradar/source cd /mnt/user/appdata/VacatureRadar
python scripts/configure_public_url.py \ python scripts/configure_public_url.py \
https://vacatureradar.example.be \ https://vacatureradar.example.be \
--env-file .env \ --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: 2. Start of hermaak de Unraid-container vanuit de bronmap:
```bash ```bash
cd /mnt/user/appdata/vacatureradar/source cd /mnt/user/appdata/VacatureRadar
docker compose -f docker-compose.unraid.yml up -d --build --force-recreate docker compose -f docker-compose.unraid.yml up -d --build --force-recreate
``` ```
+1 -1
View File
@@ -4,7 +4,7 @@ set -euo pipefail
cd "$(dirname "$0")/.." cd "$(dirname "$0")/.."
unraid_host="${UNRAID_SSH_HOST:-unraid-itworx}" unraid_host="${UNRAID_SSH_HOST:-unraid-itworx}"
remote_root="${UNRAID_APP_ROOT:-/mnt/user/appdata/vacatureradar/source}" remote_root="${UNRAID_APP_ROOT:-/mnt/user/appdata/VacatureRadar}"
archive_name="vacatureradar-deploy-$$.tar.gz" archive_name="vacatureradar-deploy-$$.tar.gz"
local_archive="$(mktemp -t "${archive_name}.XXXXXX")" local_archive="$(mktemp -t "${archive_name}.XXXXXX")"
trap 'rm -f "$local_archive"' EXIT trap 'rm -f "$local_archive"' EXIT
@@ -38,6 +38,8 @@ def test_unraid_uses_one_dockerman_container_with_ui_metadata() -> None:
dockerfile = (ROOT / "Dockerfile.unraid").read_text(encoding="utf-8") dockerfile = (ROOT / "Dockerfile.unraid").read_text(encoding="utf-8")
entrypoint = (ROOT / "scripts" / "unraid_aio_entrypoint.sh").read_text(encoding="utf-8") entrypoint = (ROOT / "scripts" / "unraid_aio_entrypoint.sh").read_text(encoding="utf-8")
assert "python:3.13-slim-trixie" in dockerfile assert "python:3.13-slim-trixie" in dockerfile
assert "DJANGO_DEBUG=0" in dockerfile
assert "PUBLIC_BASE_URL=https://build.invalid" in dockerfile
assert "postgres-aio17" in entrypoint assert "postgres-aio17" in entrypoint
assert "pg_config --bindir" in entrypoint assert "pg_config --bindir" in entrypoint
@@ -47,6 +49,8 @@ def test_runtime_is_compatible_with_read_only_container() -> None:
deploy_script = (ROOT / "scripts" / "deploy_docker.sh").read_text(encoding="utf-8") deploy_script = (ROOT / "scripts" / "deploy_docker.sh").read_text(encoding="utf-8")
assert '"--no-control-socket"' in dockerfile assert '"--no-control-socket"' in dockerfile
assert "DJANGO_DEBUG=0" in dockerfile
assert "PUBLIC_BASE_URL=https://build.invalid" in dockerfile
assert "exec -T web python manage.py collectstatic" not in deploy_script assert "exec -T web python manage.py collectstatic" not in deploy_script
assert "for required_host in 127.0.0.1 localhost" in deploy_script assert "for required_host in 127.0.0.1 localhost" in deploy_script