# ═══════════════════════════════════════════════════════════════════════════════ # 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. # # 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. 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 tools/evolu-relay/package.json ./ RUN npm install --omit=dev --no-audit --no-fund 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. 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 # 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 ENV PYTHONUNBUFFERED=1 EXPOSE 4000 80 CMD ["node", "src/index.js"]