Plan Eigenimage, fase 5, op keuze van de gebruiker: een image met de relay erbij en geen tweede recept. agent.py, nginx.conf en index.html verhuizen naar tools/evolu-relay/ naast src/; de Dockerfile blijft op node:24-slim en haalt nginx en python3 uit apt. Drie containers uit een image: de relay als node via de compose, de agent en nginx als root. Anders dan alleen verplaatst: user www-data in nginx.conf (Debian heeft geen gebruiker nginx), geen USER meer in de image, de versie in de kop via api/status met RELAY_APP_VERSION. VERSION 0.6.0, manifest 0.6.0, drie keer dezelfde tag in de compose, ongepind tot de eerste push. Tests mee verhuisd; de vormtest toetst de drie tags tegen VERSION. Niet gebouwd: er is hier geen Docker. Co-Authored-By: Claude Fable 5.1 <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.6.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}"
|