From a4a71ebc23f66b7f5e8333135e918515ef5f6298 Mon Sep 17 00:00:00 2001 From: Jens Date: Wed, 29 Jul 2026 17:36:03 +0200 Subject: [PATCH] fix: harden production release deployment --- BACKUP_RESTORE.md | 6 +++- CURRENT_STATE.md | 2 +- DEPLOYMENT.md | 10 +++++++ Dockerfile | 5 +++- Dockerfile.unraid | 5 +++- OPERATIONS.md | 4 +++ USER_INPUT_REQUIRED.md | 33 ++++----------------- docs/ai/PROJECT_STATE.md | 9 ++++++ docs/audit/FINAL_ACCEPTANCE.md | 20 ++++++------- docs/audit/PERFORMANCE.md | 4 +++ docs/audit/TRACEABILITY.md | 7 +++-- docs/operations/NGINX_PROXY_MANAGER.md | 6 ++-- docs/operations/UNRAID_DEPLOYMENT.md | 8 ++--- scripts/deploy_unraid.sh | 2 +- tests/unit/test_deployment_configuration.py | 4 +++ 15 files changed, 74 insertions(+), 51 deletions(-) diff --git a/BACKUP_RESTORE.md b/BACKUP_RESTORE.md index cd1071b..1480136 100644 --- a/BACKUP_RESTORE.md +++ b/BACKUP_RESTORE.md @@ -1,3 +1,7 @@ # 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. diff --git a/CURRENT_STATE.md b/CURRENT_STATE.md index 6285e6c..e9bb3a8 100644 --- a/CURRENT_STATE.md +++ b/CURRENT_STATE.md @@ -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). -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). diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index 2498a73..108b478 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -8,3 +8,13 @@ De standaard productieopstelling gebruikt afzonderlijke web-, worker-, scheduler - [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. + +## 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. diff --git a/Dockerfile b/Dockerfile index ee96343..48fbadf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,7 +26,10 @@ RUN uv sync --frozen --no-dev --no-install-project COPY . . RUN uv sync --frozen --no-dev \ && 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 \ && chown -R app:app /app \ && chmod -R 0775 /app/media /app/logs /app/local /app/staticfiles /app/.venv diff --git a/Dockerfile.unraid b/Dockerfile.unraid index 35f3b00..55b1c38 100644 --- a/Dockerfile.unraid +++ b/Dockerfile.unraid @@ -24,7 +24,10 @@ RUN uv sync --frozen --no-dev --no-install-project COPY . . RUN uv sync --frozen --no-dev \ && 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 \ && chown -R app:app /app diff --git a/OPERATIONS.md b/OPERATIONS.md index cfbb328..c4e611a 100644 --- a/OPERATIONS.md +++ b/OPERATIONS.md @@ -6,3 +6,7 @@ Dagelijks beheer omvat readiness, worker/beat-heartbeat, bronruns, notificatie-o - [Broncatalogus](docs/operations/LIVE_SOURCE_CATALOG.md) - [Back-up en herstel](docs/operations/BACKUP_RESTORE.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. diff --git a/USER_INPUT_REQUIRED.md b/USER_INPUT_REQUIRED.md index c410b67..1583f20 100644 --- a/USER_INPUT_REQUIRED.md +++ b/USER_INPUT_REQUIRED.md @@ -1,33 +1,12 @@ # 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. - -## 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. +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-003 — Externe identity- en mailcredentials -- Waarom menselijke/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. +- Waarom externe toegang nodig is: Entra-appregistratie en mailboxcredentials zijn accountgebonden secrets. +- Veilige standaard: integraties blijven uitgeschakeld zonder volledige configuratie; lokale login en gastdemo blijven werken. - 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. -- Impact zonder actie: lokale authenticatie en handmatige/e-mailfixture-ingress blijven bruikbaar; de betreffende live integraties blijven inactief. -- Prioriteit: P2, alleen wanneer deze integraties gewenst zijn. -- Benodigde waarde/beslissing: geldige Entra- en/of mailboxconfiguratie. +- Resterende handeling: vul alleen wanneer gewenst de bestaande productievariabelen en appregistratie in en voer de beschreven smoke tests uit. +- Impact zonder actie: de kernapplicatie blijft production-ready; alleen de optionele Entra- en mailboxintegraties blijven inactief. +- Prioriteit: P2. diff --git a/docs/ai/PROJECT_STATE.md b/docs/ai/PROJECT_STATE.md index 108e8be..a151239 100644 --- a/docs/ai/PROJECT_STATE.md +++ b/docs/ai/PROJECT_STATE.md @@ -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; diff --git a/docs/audit/FINAL_ACCEPTANCE.md b/docs/audit/FINAL_ACCEPTANCE.md index 0127238..209ca04 100644 --- a/docs/audit/FINAL_ACCEPTANCE.md +++ b/docs/audit/FINAL_ACCEPTANCE.md @@ -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. diff --git a/docs/audit/PERFORMANCE.md b/docs/audit/PERFORMANCE.md index ae5bb30..d0612ba 100644 --- a/docs/audit/PERFORMANCE.md +++ b/docs/audit/PERFORMANCE.md @@ -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. diff --git a/docs/audit/TRACEABILITY.md b/docs/audit/TRACEABILITY.md index a943bbc..fa532e1 100644 --- a/docs/audit/TRACEABILITY.md +++ b/docs/audit/TRACEABILITY.md @@ -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 | diff --git a/docs/operations/NGINX_PROXY_MANAGER.md b/docs/operations/NGINX_PROXY_MANAGER.md index 40b1e6c..d178270 100644 --- a/docs/operations/NGINX_PROXY_MANAGER.md +++ b/docs/operations/NGINX_PROXY_MANAGER.md @@ -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 ``` diff --git a/docs/operations/UNRAID_DEPLOYMENT.md b/docs/operations/UNRAID_DEPLOYMENT.md index 20674a9..87d3dac 100644 --- a/docs/operations/UNRAID_DEPLOYMENT.md +++ b/docs/operations/UNRAID_DEPLOYMENT.md @@ -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 ``` diff --git a/scripts/deploy_unraid.sh b/scripts/deploy_unraid.sh index f3ff429..afa71b9 100644 --- a/scripts/deploy_unraid.sh +++ b/scripts/deploy_unraid.sh @@ -4,7 +4,7 @@ set -euo pipefail cd "$(dirname "$0")/.." 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" local_archive="$(mktemp -t "${archive_name}.XXXXXX")" trap 'rm -f "$local_archive"' EXIT diff --git a/tests/unit/test_deployment_configuration.py b/tests/unit/test_deployment_configuration.py index f445244..ca77302 100644 --- a/tests/unit/test_deployment_configuration.py +++ b/tests/unit/test_deployment_configuration.py @@ -38,6 +38,8 @@ def test_unraid_uses_one_dockerman_container_with_ui_metadata() -> None: dockerfile = (ROOT / "Dockerfile.unraid").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 "DJANGO_DEBUG=0" in dockerfile + assert "PUBLIC_BASE_URL=https://build.invalid" in dockerfile assert "postgres-aio17" 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") 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 "for required_host in 127.0.0.1 localhost" in deploy_script