server-up/docs/updates.md
Ramon 8ff5f4b1d3
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 4s
v0.5.10-beta - update-systeem met kanalen en een-klik bijwerken
- Update-kanalen stable/beta in plaats van het vinkje "pre-releases meenemen".
  Stable ziet alleen releases, beta ook pre-releases; een release telt hoger
  dan zijn eigen beta (0.5.10-beta1 < 0.5.10). UPDATE_INCLUDE_PRERELEASE
  migreert automatisch naar het beta-kanaal.
- Nieuw core/selfupdate.py: image uit de registry ophalen, SU_TAG wegschrijven
  en de eigen container laten hercreeren door een korte helper-container die op
  het nieuwe image draait (bevat de docker- en compose-CLI al). Een container
  kan zichzelf niet hercreeren, vandaar de helper.
- Deploy-map wordt uitgelezen uit de compose-labels van de eigen container.
  Ontbreken die, draait de container niet vanaf een registry-image of is de
  docker-socket er niet, dan meldt de UI waarom bijwerken niet kan.
- Vorige tag wordt onthouden; terugrolknop in de instellingen.
- Update-check een uur gecached, met geforceerde check via de knop; eerder deed
  elke paginalading een netwerkverzoek. Laatst-gecontroleerd zichtbaar.
- Registry-inloggegevens instelbaar; het token komt net als de git-tokens nooit
  terug via de API en leeg laten betekent ongewijzigd.
- docker-compose.yml gebruikt ${SU_IMAGE:-server-up}:${SU_TAG:-latest}; zonder
  SU_IMAGE blijft lokaal bouwen werken zoals voorheen.
- deploy-prod.yml bouwt en pusht het image in dezelfde job wanneer SU_IMAGE
  ingesteld is; build.yml is nu alleen handmatig. Bewust geen aparte
  build-workflow op dezelfde tag: bij een runner met een job tegelijk zou de
  deploy wachten op een build die zelf nog in de wachtrij staat.
- docs/updates.md: werking, complete Forgejo-instelling (registry, tokens,
  variables, secrets, runners), release-procedure voor stable en beta,
  terugrollen en probleemoplossing.
- Tests uitgebreid naar 148 (kanaallogica, cache, image-afleiding incl.
  registry-poortnummers, tag-validatie, .env-schrijven, tokenlek).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 15:13:18 +02:00

9.5 KiB

Updates en Forgejo-instelling

Server Up controleert zelf of er een nieuwere versie is en kan zichzelf bijwerken met één klik. Dit document beschrijft hoe dat werkt en hoe je Forgejo er precies voor inricht.


Hoe het werkt

Er zijn twee losse onderdelen:

Onderdeel Wat het doet Waar het vandaan komt
Detectie "Er is een v0.5.10" Forgejo Releases-API
Uitvoeren Het nieuwe image ophalen en de container vervangen Forgejo container-registry

Je hebt ze allebei nodig voor de updateknop. Alleen detectie werkt ook prima — dan zie je een melding en werk je bij met een git-tag, zoals voorheen.

Kanalen

Kanaal Ziet Voorbeeld
stable Alleen echte releases v0.5.10
beta Ook pre-releases v0.5.10-beta1 én v0.5.10

Een tag met een streepje erin (v0.5.10-beta1) wordt door release.yml automatisch als pre-release gemarkeerd. Semver bepaalt de volgorde, en een release telt hoger dan zijn eigen beta: 0.5.10-beta1 < 0.5.10. Zit je op beta en verschijnt de definitieve v0.5.10, dan krijg je die dus als update aangeboden.

Wat er gebeurt als je op "Nu bijwerken" klikt

1. docker pull git.example.com/bes-r/server-up:0.5.10
2. SU_TAG=0.5.10 wegschrijven in het .env van de deploy-map
3. helper-container starten:  sleep 5 && docker compose up -d server-up
4. Server Up wordt vervangen; de browser pollt /healthz tot de nieuwe versie leeft

Stap 3 is nodig omdat een container zichzelf niet kan hercreëren: het commando zou halverwege zijn eigen proces afbreken. De helper draait op het zojuist gehaalde image — dat bevat de docker- en compose-CLI al — en ruimt zichzelf op.

De deploy-map wordt niet geraden maar uitgelezen uit de compose-labels op de eigen container (com.docker.compose.project.working_dir). Draait Server Up niet via compose, dan meldt de interface dat bijwerken niet kan in plaats van iets te proberen.


Deel 1 — Forgejo inrichten

1.1 Container-registry aanzetten

De registry zit in Forgejo ingebouwd, maar staat niet altijd aan. Controleer in app.ini op je Forgejo-server:

[packages]
ENABLED = true

Herstart Forgejo na een wijziging. Ga daarna naar je profiel → Packages; als die pagina bestaat, werkt de registry.

Draai je Forgejo op een poort (bv. :3000) zonder TLS? Dan moet Docker die registry als "insecure" kennen. Zet op elke server die images ophaalt in /etc/docker/daemon.json:

{ "insecure-registries": ["10.0.20.22:3000"] }

en systemctl restart docker. Met HTTPS en een geldig certificaat is dit niet nodig — dat heeft de voorkeur.

1.2 Token aanmaken voor de registry

Instellingen → Applicaties → Nieuw token genereren

Veld Waarde
Naam server-up-packages
Rechten package: Read and Write

Kopieer het token meteen — je ziet het maar één keer. Je hebt het twee keer nodig: als repository-secret (voor de build) en in Server Up zelf (voor het ophalen).

Wil je scheiden: maak een tweede token met alleen package: Read voor de servers die enkel ophalen. Dat is netter, maar niet verplicht.

1.3 Repository-variabelen en -secrets

Ga naar de repository → Settings → Actions.

Variables (niet geheim, zichtbaar in logs):

Naam Waarde Toelichting
REGISTRY 10.0.20.22:3000 Host van je Forgejo, zonder http://
OWNER bes-r Je gebruikersnaam of organisatie

Secrets (versleuteld, gemaskeerd in logs):

Naam Waarde
PACKAGE_TOKEN het token uit 1.2
RELEASE_TOKEN (optioneel) token met repository: Read and Write, als het automatische GITHUB_TOKEN niet volstaat voor release.yml

1.4 Runners controleren

De workflows verwachten deze labels:

Workflow Draait op Trigger
deploy.yml [self-hosted, dev] push naar dev
deploy-prod.yml [self-hosted, prod] push naar main + v*-tags
release.yml [self-hosted, prod] v*-tags
build.yml [self-hosted, prod] alleen handmatig

Controleer je labels met:

# op de server waar act_runner draait
grep -A3 'labels:' /etc/act_runner/config.yaml

Staat er iets anders, pas dan runs-on: in de workflows aan óf hernoem de labels van de runner. De runner heeft toegang tot de docker-socket nodig.

Let op de volgorde. deploy-prod.yml bouwt én pusht het image in dezelfde job. Dat is bewust: een aparte build-workflow zou bij één runner met de deploy om dezelfde plek in de wachtrij strijden, waarbij de deploy wacht op een build die zelf nog in de rij staat. build.yml is er alleen voor handmatig herbouwen.


Deel 2 — De server instellen

Op de server waar Server Up draait, in de deploy-map (/opt/server-up):

# .env
SU_IMAGE=10.0.20.22:3000/bes-r/server-up
SU_TAG=0.5.10
BIND=127.0.0.1
PORT=5000

SU_IMAGE is het schakelaartje: staat het er, dan draait deze server vanaf de registry en werkt de updateknop. Staat het er niet, dan bouwt de server lokaal zoals voorheen en meldt de interface netjes waarom bijwerken niet kan.

Eerste keer overstappen van lokaal bouwen naar de registry:

cd /opt/server-up
docker login 10.0.20.22:3000 -u bes-r          # token uit 1.2 als wachtwoord
docker pull 10.0.20.22:3000/bes-r/server-up:0.5.10
docker compose up -d
docker compose ps                               # controleer de nieuwe image-naam

Deel 3 — Server Up instellen

Instellingen → Updates:

Veld Waarde
Kanaal Stable of Beta
Releases-API URL http://10.0.20.22:3000/api/v1/repos/bes-r/server-up/releases
Image 10.0.20.22:3000/bes-r/server-up
Registry-gebruiker bes-r (alleen bij een privé repo)
Registry-token het token uit 1.2 (idem)

Het registry-token wordt opgeslagen in config.json (0600) en komt nooit terug via de API — je ziet alleen of het ingesteld is. Leeg laten bij het opslaan betekent "niet wijzigen".

Klik op Controleren. Staat er een versie, dan werkt de detectie.


Een versie uitbrengen

# 1. Versienummer bijwerken
echo "0.5.10" > VERSION

# 2. Changelog-sectie schrijven (release.yml haalt de notes hieruit)
$EDITOR CHANGELOG.md          # begin met:  # v0.5.10 — Korte titel

# 3. Vastleggen en taggen
git add VERSION CHANGELOG.md
git commit -m "v0.5.10 - korte omschrijving"
git push origin dev

# 4. Via een pull request naar main, dan pas taggen
git checkout main && git pull
git tag v0.5.10
git push origin v0.5.10

Die tag zet drie dingen in gang:

  1. release.yml maakt de Forgejo-release met notes uit CHANGELOG.md plus een commitoverzicht sinds de vorige tag.
  2. deploy-prod.yml draait de tests, bouwt het image, pusht het als :0.5.10 én :latest, en herstart de prod-server.
  3. Elke Server Up-installatie ziet bij de volgende check de nieuwe versie.

Een beta uitbrengen

Precies hetzelfde, met een streepje in de tag:

echo "0.5.10-beta1" > VERSION
git commit -am "v0.5.10-beta1"
git tag v0.5.10-beta1
git push origin v0.5.10-beta1

release.yml markeert dit automatisch als pre-release, en het image krijgt de tags :0.5.10-beta1 en :beta (géén :latest). Alleen installaties op het beta-kanaal zien hem.

Volgens de projectafspraken toont de dev-branch altijd beta in het versienummer; die tags horen dus bij wat je vanuit dev uitbrengt.


Terugrollen

Server Up onthoudt bij elke update de vorige tag. Onder Instellingen → Updates verschijnt dan een knop "Terug naar deze versie", die precies hetzelfde doet met het oude image.

Start de nieuwe versie helemaal niet — dan is er ook geen interface om op te klikken — dan doe je het met de hand:

cd /opt/server-up
sed -i 's/^SU_TAG=.*/SU_TAG=0.5.00/' .env
docker compose up -d

Problemen oplossen

Symptoom Oorzaak en oplossing
Knop staat uit, "komt niet uit een registry" SU_IMAGE ontbreekt in .env, of de container draait nog op een lokaal gebouwd image. Zie deel 2.
Knop staat uit, "geen compose-labels" De container is met docker run gestart in plaats van met compose. Start hem via docker compose up -d.
Knop staat uit, "container niet te vinden" De docker-socket is niet gemount, of de containernaam wijkt af. Zet SU_CONTAINER op de juiste naam.
docker pull faalt met "unauthorized" Registry-gebruiker/token niet ingesteld in Server Up, of het token mist package: Read.
docker pull faalt met "http: server gave HTTP response to HTTPS client" Insecure registry niet geconfigureerd; zie 1.1.
"Geen releases gevonden in kanaal 'stable'" Er zijn alleen pre-releases. Zet het kanaal op Beta of breng een release zonder streepje uit.
Update-check geeft een netwerkfout De Releases-URL klopt niet, of Server Up kan Forgejo niet bereiken. Test met curl vanuit de container.
Interface komt na bijwerken niet terug Nieuwe image start niet. Kijk met docker compose logs server-up en rol handmatig terug (zie boven).
Nieuwe versie verschijnt niet De check cachet een uur. Klik op Controleren om te forceren.

Handmatig controleren of de registry werkt

# Is het image gepusht?
curl -s -u bes-r:<token> \
  http://10.0.20.22:3000/v2/bes-r/server-up/tags/list

# Geeft de Releases-API iets terug?
curl -s http://10.0.20.22:3000/api/v1/repos/bes-r/server-up/releases \
  | python3 -m json.tool | head -30