# Gitea immutable releasepad Een push naar `main` publiceert geen productiecode. Alleen een expliciete semantische tag `v*.*.*` start `.gitea/workflows/release.yml`. De runner: 1. verifieert de volledige repository; 2. bouwt de Unraid-image met commit- en versielabels; 3. publiceert die image naar de private Gitea-containerregistry; 4. genereert een SPDX-SBOM, digestbestand, checksums en release notes. Productie wordt daarna expliciet op de volledige `versie@sha256:digest` gepind. Hierdoor kan een gewone documentatie- of codepush nooit ongemerkt productie overschrijven en bestaat geen parallel mutable push-to-deploypad meer. ## Vereiste runnerconfiguratie - De Gitea-runner accepteert label `ubuntu-latest` en kan jobcontainers starten. - `REGISTRY_USER` en `REGISTRY_TOKEN` zijn repositorysecrets met uitsluitend de noodzakelijke package-schrijfrechten. - Unraid gebruikt een afzonderlijk `read:package`-token om gepubliceerde images te pullen; dat token staat alleen in de root-Dockerconfig op de server. - De runnerhost heeft voldoende vrije Docker-address-pools voor tijdelijke jobnetwerken; volg daarvoor de netwerksectie in [Unraid-deployment](UNRAID_DEPLOYMENT.md#docker-netwerkcapaciteit). ## Publiceren en uitrollen 1. Maak en verifieer een database- en configuratieback-up. 2. Push de geverifieerde releasecommit naar `main`. 3. Maak en push de semantische tag. 4. Wacht tot de Gitea-releasejob groen is en verifieer de artifactchecksums. 5. Pull op Unraid de gepubliceerde volledige digest. 6. Zet `VACATURERADAR_IMAGE` op `versie@sha256:digest` en herstart Compose met `--no-build --force-recreate`. 7. Controleer intern en publiek `/health/live/` en `/health/ready/`, runtimeversie, containerhealth en restartteller. PostgreSQL, Redis en Ollama blijven niet publiek bereikbaar. Bewaar de vorige digest totdat minstens één volledige schedulercyclus groen is.