Vier punten van de gebruiker, opgekomen tijdens het beproeven met de testclient. De getimede leerstand is eruit; de wachtlijst is de enige weg naar binnen. Zijn redenering: allebei de wegen vragen iemand die bij de app kan, dus het is dubbelop, en het venster is de zwakste omdat het iedereen toelaat die er toevallig in verbindt. Dat weegt zwaarder nu de relay op een publiek wss-adres kan staan. De oorspronkelijke reden voor de leerstand, dat je je eigen OwnerId nergens kon aflezen, verviel toen de weigerlijst dat id ging tonen. Daarmee verdwijnt ook de bug die hij dezelfde dag meldde: een geleerde eigenaar bleef in de weigerlijst staan terwijl hij al kon schrijven en lezen, want decideOwner haalde hem niet van die lijst af en de knop allow wel. "Refused owners" heet "Waiting list", met de badge Waiting en een teller waar de widget van het tijdvenster stond. Het veld op schijf blijft rejected: hernoemen zou een migratie zijn voor een woord dat niemand ziet. Het adres onderaan zei http:// en dat kan nergens werken, want de relay spreekt WebSocket en nooit HTTP. Nu ws://<host>:3852, met een regel over wss://<domein> zonder poort achter een reverse proxy. Dat is precies de fout die diezelfde dag een ronde kostte bij het koppelen van de testclient. De melding bij elke klik is weg. Die stond in de gewone stroom van de pagina, dus alles eronder schoof omlaag en weer omhoog. Nu gaan de knoppen in de lijsten even op slot tot de ronde de nieuwe stand heeft; foutmeldingen blijven wel staan, want die zeggen iets wat je nergens anders ziet. STATE_VERSION blijft 1 en een owners.json van 0.6.0 leest door: learning en learningUntil worden gelezen, genegeerd en niet teruggeschreven. Een verhoging zou store.js de allowlist van een werkende installatie opzij laten schuiven. Twee toetsen bewaken dat de leerstand niet terugsluipt: een onbekende eigenaar wordt geweigerd ook met learning: true in het bestand, en set-learning is een onbekende actie. Beide mutatie-getest. De compose staat op 0.7.0 zonder digest, zodat het hard faalt tot de image bestaat. Bouwen, duwen en pinnen ligt bij de gebruiker. Suite: 424 goed, 0 fout. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
127 lines
6.4 KiB
Bash
127 lines
6.4 KiB
Bash
#!/bin/sh
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# Bouwt de image voor de app whatsnext-evolu-relay.
|
|
#
|
|
# Eén image voor de drie containers van de app: de relay (ons `src/index.js` om
|
|
# `@evolu/nodejs` heen), de agent (`agent.py`) en nginx met de pagina. De relay
|
|
# zelf komt uit npm en wordt niet nagebouwd of aangepast. Tot 0.5.6 zat alleen de
|
|
# relay in deze image; sinds 0.6.0 alles, zie de Dockerfile.
|
|
#
|
|
# Dit verving op 28-08-2026 het vorige recept, dat de repo van Trezor kloonde en
|
|
# hun Dockerfile bouwde. Dat pakket had een Postgres en een quota-manager nodig en
|
|
# kon als zelf-gehoste relay in de kern niet werken; zie het plan Umbrelapp,
|
|
# OPEN.md punt 6.
|
|
#
|
|
# Waarom dit NIET in de app-map staat: umbreld kopieert de hele app-map naar het
|
|
# apparaat, en bij een update wordt alleen een whitelist ververst waar een
|
|
# Dockerfile niet in zit. Bouwen tijdens het starten van de app zou de installatie
|
|
# bovendien minuten laten hangen. Het recept hoort dus in de repo en het resultaat
|
|
# in een register; de app verwijst alleen naar de tag.
|
|
#
|
|
# Draaien: sh tools/evolu-relay/build.sh
|
|
# Vereist: docker op de machine waar je bouwt. Op de Umbrel is dat met sudo.
|
|
#
|
|
# Multi-arch: PLATFORMS="linux/amd64,linux/arm64" sh tools/evolu-relay/build.sh
|
|
# Vraagt buildx met QEMU en duwt meteen. Nog nooit geprobeerd; zie het masterplan
|
|
# Publicatie-Relay. Zonder PLATFORMS bouwt dit één architectuur, die van de
|
|
# machine waarop je staat.
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
set -eu
|
|
|
|
# ── De pin ────────────────────────────────────────────────────────────────────
|
|
# De versies van `@evolu/common` en `@evolu/nodejs` staan exact in package.json en
|
|
# zijn dáár de pin. Hier staat alleen het etiket op de uitkomst.
|
|
#
|
|
# Dit is het etiket op de IMAGE. Verhoog het als de image verandert, dus als er
|
|
# iets in deze map of in icon.png wijzigt, en zet dan dezelfde waarde achter
|
|
# `image:` in de compose (drie keer: relay, agent en server delen hem).
|
|
#
|
|
# `version` in umbrel-app.yml is een ander nummer en mag hierop vooruitlopen: dat
|
|
# moet bij élke wijziging aan de app omhoog, ook als alleen de compose verandert,
|
|
# want anders rolt umbrelOS hem niet uit. Dat heeft hier een keer een dag gekost.
|
|
# Sinds alles in de image zit lopen ze meestal gelijk; de regel blijft: verhoog je
|
|
# VERSION, dan ook het manifest.
|
|
VERSION="0.7.0"
|
|
|
|
# Het register staat er expres in en dit is geen smaakkwestie: umbreld haalt élke
|
|
# image op via de Docker Engine API, dus een tag die alleen lokaal bestaat is voor
|
|
# hem onbereikbaar en de installatie faalt met "pull access denied". Dat is op
|
|
# 25-08-2026 op het apparaat vastgesteld. Zie Umbrel-appstore-spec.md.
|
|
IMAGE="sc.kamenier-hamer.nl/sysop/evolu-relay:${VERSION}"
|
|
|
|
RECEPT="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
|
# De bouwcontext is de repo-root, want icon.png komt uit de app-map. Zie de kop
|
|
# van de Dockerfile.
|
|
REPO="$(CDPATH= cd -- "${RECEPT}/../.." && pwd)"
|
|
|
|
# ── Controles vooraf ──────────────────────────────────────────────────────────
|
|
# Beter hier hard falen dan een image bouwen die iets anders bevat dan je denkt.
|
|
|
|
for bestand in Dockerfile package.json src/index.js agent.py nginx.conf index.html; do
|
|
if [ ! -f "${RECEPT}/${bestand}" ]; then
|
|
echo "FOUT: ${bestand} ontbreekt in ${RECEPT}" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [ ! -f "${REPO}/whatsnext-evolu-relay/icon.png" ]; then
|
|
echo "FOUT: whatsnext-evolu-relay/icon.png ontbreekt in ${REPO}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "${RECEPT}/package-lock.json" ]; then
|
|
echo "LET OP: er is geen package-lock.json, dus npm kiest zelf de onderliggende"
|
|
echo " afhankelijkheden. De twee pakketten van Evolu staan exact vast in"
|
|
echo " package.json, maar wat daaronder hangt kan meebewegen. Draai eenmalig"
|
|
echo " 'npm install' in deze map, commit het lock-bestand, en zet dan in de"
|
|
echo " Dockerfile 'npm install' om naar 'npm ci'."
|
|
echo
|
|
fi
|
|
|
|
# Een accolade-variabele hoort hier nergens meer in: deze bestanden gaan niet
|
|
# meer door envsubst, dus wat er staat is wat er draait. Staat er tóch een, dan
|
|
# is dat een restant van de template-tijd en zou hij letterlijk in de pagina of
|
|
# de configuratie terechtkomen.
|
|
if grep -l '\${' "${RECEPT}/nginx.conf" "${RECEPT}/index.html" "${RECEPT}/agent.py" 2>/dev/null; then
|
|
echo "FOUT: de bestanden hierboven bevatten nog een \${...}; die wordt niet meer ingevuld." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# ── Bouwen ────────────────────────────────────────────────────────────────────
|
|
|
|
PLATFORMS="${PLATFORMS:-}"
|
|
|
|
if [ -n "$PLATFORMS" ]; then
|
|
echo "Bouwen als ${IMAGE} voor ${PLATFORMS}, en meteen duwen"
|
|
docker buildx build --platform "$PLATFORMS" --tag "$IMAGE" --push \
|
|
--file "${RECEPT}/Dockerfile" "$REPO"
|
|
echo
|
|
echo "Geduwd. De index-digest:"
|
|
docker buildx imagetools inspect "$IMAGE" | head -3
|
|
else
|
|
echo "Bouwen als ${IMAGE}"
|
|
docker build --tag "$IMAGE" --file "${RECEPT}/Dockerfile" "$REPO"
|
|
echo
|
|
echo "Klaar:"
|
|
docker image inspect --format '{{.RepoTags}} {{.Id}}' "$IMAGE"
|
|
echo
|
|
echo "Bouwen is niet genoeg: de app verwijst naar het register, want umbreld kan"
|
|
echo "niet bij een image die alleen lokaal staat. Nog te doen:"
|
|
echo
|
|
echo " docker login sc.kamenier-hamer.nl"
|
|
echo " docker push ${IMAGE}"
|
|
fi
|
|
|
|
echo
|
|
echo "Zet daarna de digest uit de push-uitvoer achter de tag in"
|
|
echo "whatsnext-evolu-relay/docker-compose.yml (drie keer: relay, agent en server),"
|
|
echo "en zet \`version\` in het manifest op ${VERSION}. Zonder die verhoging rolt"
|
|
echo "umbrelOS het niet uit."
|
|
echo
|
|
echo "Controleer dat het anoniem te halen is, want umbreld krijgt geen"
|
|
echo "inloggegevens mee. Log uit in dezelfde context waarin je inlogde, anders"
|
|
echo "meet je je eigen sessie:"
|
|
echo
|
|
echo " docker logout sc.kamenier-hamer.nl && docker pull ${IMAGE}"
|