Relay 0.6.0: alles in een image, de app-map is leeg

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>
This commit is contained in:
Harmen
2026-09-08 16:36:30 +02:00
co-authored by Claude Fable 5.1
parent 0e824a6354
commit a694a9cbd1
18 changed files with 327 additions and 177 deletions
+39 -7
View File
@@ -1,6 +1,14 @@
# ═══════════════════════════════════════════════════════════════════════════════
# De image voor de app whatsnext-evolu-relay.
#
# Eén image voor drie containers. De compose start hem drie keer: als `relay`
# met het standaardcommando (`node src/index.js`, als gebruiker node), als
# `agent` met `python3 /app/agent.py` en als `server` met nginx. Tot 0.5.6 zat
# alleen de relay in deze image en draaiden de agent en de pagina als *.template
# op python:3-alpine en nginx:alpine; sinds 0.6.0 zit alles hier. Beslist door de
# gebruiker op 08-09-2026, na dezelfde stap bij Electrum Gate: één image scheelt
# een tweede recept en een tweede pin. Zie het plan Eigenimage, PLAN.md §8.
#
# Dit bouwt niet de relay van Evolu na: het installeert `@evolu/nodejs` uit npm
# en start ons eigen `src/index.js`, dat alleen de twee terugroepfuncties voor de
# toegangscontrole toevoegt.
@@ -8,28 +16,52 @@
# Waarom `slim` en niet `alpine`: `better-sqlite3` zit onder `@evolu/nodejs` en
# heeft kant-en-klare binaries voor glibc, niet voor musl. Op alpine zou hij bij
# elke bouw opnieuw gecompileerd moeten worden, met een bouwketen erbij in de
# image.
# image. Dat is ook de reden dat nginx en python3 hier uit apt komen en niet
# andersom node in een nginx-image gezet is.
#
# De bouwcontext is de REPO-ROOT, niet deze map: icon.png blijft in de app-map
# staan (het manifest wijst ernaar voor de tegel in de winkel) en wordt van daar
# gekopieerd, zodat er niet twee exemplaren zijn. build.sh geeft die context mee.
# ═══════════════════════════════════════════════════════════════════════════════
FROM node:24-slim
# nginx en python3 uit Debian. Geen aanbevolen pakketten: die halen bij nginx
# onder meer een set modules binnen die de pagina niet gebruikt. De agent heeft
# alleen de standaardbibliotheek nodig.
RUN apt-get update \
&& apt-get install -y --no-install-recommends nginx python3 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Eerst alleen het manifest, zodat een wijziging in `src/` de installatielaag niet
# ongeldig maakt.
COPY package.json ./
COPY tools/evolu-relay/package.json ./
RUN npm install --omit=dev --no-audit --no-fund
COPY src ./src
COPY tools/evolu-relay/src ./src
COPY tools/evolu-relay/agent.py ./agent.py
# De relay maakt zelf `data/` aan bij de start, maar dan als de gebruiker die op
# dat moment draait. Vooraf aanmaken met de juiste eigenaar voorkomt dat een
# gemounte map van de host als root wordt aangeraakt.
RUN mkdir -p /app/data && chown -R node:node /app
# gemounte map van de host als root wordt aangeraakt. Alleen `data/` en `src/` zijn
# van node; agent.py en de rest blijven van root, want die worden alleen gelezen.
RUN mkdir -p /app/data && chown -R node:node /app/data /app/src
USER node
# De pagina. Debian zet nginx' eigen voorbeeldpagina onder /var/www/html; wij
# gebruiken het pad dat de nginx-image ook gebruikt, zodat nginx.conf gelijk kan
# blijven aan die van Electrum Gate.
COPY tools/evolu-relay/nginx.conf /etc/nginx/nginx.conf
COPY tools/evolu-relay/index.html /usr/share/nginx/html/index.html
COPY whatsnext-evolu-relay/icon.png /usr/share/nginx/html/icon.png
# Geen USER hier, en dat is met opzet: nginx moet als root beginnen om poort 80 te
# nemen, en de agent schrijft in de gedeelde map. De relay hoort wél als node te
# draaien, zoals hij tot 0.5.6 deed, en dat regelt de compose met `user: node`.
ENV NODE_ENV=production
EXPOSE 4000
ENV PYTHONUNBUFFERED=1
EXPOSE 4000 80
CMD ["node", "src/index.js"]