server-up/docs/updates.md
Ramon 576ee17a61
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 41s
Duidelijker maken waarom de updateknop uit staat bij een zelfgebouwd image
Op een server die zelf bouwt (SU_IMAGE leeg, zoals de dev-server na een
deploy-run) draait het image als 'server-up:<versie>'. Zonder registry-pad valt
er niets op te halen, dus de knop staat uit. De melding verwees alleen naar
UPDATE_IMAGE, terwijl het juiste antwoord daar is: die server werkt al bij via
Git.

- status() geeft nu een 'mode' terug (registry / local-build / no-compose /
  no-container) en de melding bij local-build noemt beide routes: pushen naar
  de branch of de deploy-workflow starten, en als alternatief SU_IMAGE.
- De UI toont dat geval als informatie in plaats van als waarschuwing; het is
  de normale opzet, geen storing.
- docs/updates.md: tabel met de twee manieren van bijwerken en de waarschuwing
  om ze niet door elkaar te gebruiken op dezelfde server, omdat de
  deploy-workflow en de updateknop allebei SU_TAG in .env schrijven.

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

300 lines
11 KiB
Markdown

# 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.
### Twee manieren van bijwerken — kies er één per server
| | Hoe je bijwerkt | Knop in de interface |
|---|---|---|
| **Git-gestuurd** (`SU_IMAGE` leeg) | Push naar de branch, de deploy-workflow bouwt en herstart | Uit, met uitleg |
| **Registry** (`SU_IMAGE` gezet) | Knop "Nu bijwerken", of een tag pushen | Aan |
Een server die zelf bouwt kán niet uit een registry bijwerken: het image
`server-up:0.5.40-beta` heeft geen registry-pad, dus er is niets om op te halen.
De interface meldt dat en verwijst naar de Git-route. **Dat is geen storing**
zo is een dev-server die na elke push opnieuw bouwt precies bedoeld.
> **Gebruik ze niet door elkaar op dezelfde server.** De deploy-workflow schrijft
> `SU_TAG` in `.env`, en de updateknop doet dat ook. Werk je in de interface bij
> naar 0.5.50 en pusht daarna iemand naar die branch, dan zet de workflow
> `SU_TAG` terug naar wat de branch bevat. Voor een server die aan een branch
> hangt is dat juist goed — git is daar de bron — maar verwacht dan geen effect
> van de knop.
>
> In de praktijk: **dev-server op Git**, en de registry-route voor productie of
> voor installaties die geen toegang tot je repository hebben.
### 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:
```ini
[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`:
>
> ```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:
```bash
# 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`):
```bash
# .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:
```bash
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
```bash
# 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:
```bash
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:
```bash
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
```bash
# 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
```