112 lines
5.7 KiB
Bash
112 lines
5.7 KiB
Bash
#!/bin/sh
|
|||
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||
|
|
# Bouwt de image voor de app whatsnext-electrum-gate.
|
||
|
|
#
|
||
|
|
# Eén image voor de twee containers van de app: nginx met de pagina en het
|
||
|
|
# stream-blok, en python3 met de agent. Wat erin gaat staat in de Dockerfile
|
||
|
|
# hiernaast; de bestanden zelf staan in deze map, behalve icon.png, dat in de
|
||
|
|
# app-map blijft omdat het manifest ernaar wijst.
|
||
|
|
#
|
||
|
|
# 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/electrum-gate/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/electrum-gate/build.sh
|
||
|
|
# Dat vraagt buildx met QEMU en duwt meteen naar het register, want een
|
||
|
|
# multi-arch-manifest bestaat niet lokaal. Nog nooit geprobeerd; zie het plan
|
||
|
|
# Eigenimage, PLAN.md §4. Zonder PLATFORMS bouwt dit één architectuur, die van
|
||
|
|
# de machine waarop je staat, en dat is voor eigen gebruik op een amd64-Umbrel
|
||
|
|
# genoeg.
|
||
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
||
|
|
|
||
|
|
set -eu
|
||
|
|
|
||
|
|
# ── De pin ────────────────────────────────────────────────────────────────────
|
||
|
|
# 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 (twee keer: 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 de eigen image raakt vrijwel elke wijziging de image, dus ze lopen
|
||
|
|
# meestal gelijk; de regel blijft: verhoog je VERSION, dan ook het manifest.
|
||
|
|
VERSION="0.1.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 bij Evolu Relay op het apparaat vastgesteld.
|
||
|
|
IMAGE="sc.kamenier-hamer.nl/sysop/electrum-gate:${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 entrypoint.sh agent.py nginx.conf stream.conf index.html; do
|
||
|
|
if [ ! -f "${RECEPT}/${bestand}" ]; then
|
||
|
|
echo "FOUT: ${bestand} ontbreekt in ${RECEPT}" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ ! -f "${REPO}/whatsnext-electrum-gate/icon.png" ]; then
|
||
|
|
echo "FOUT: whatsnext-electrum-gate/icon.png ontbreekt in ${REPO}" >&2
|
||
|
|
exit 1
|
||
|
|
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}/stream.conf" "${RECEPT}/index.html" 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-electrum-gate/docker-compose.yml (twee keer, agent en server), en"
|
||
|
|
echo "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}"
|