diff --git a/README.md b/README.md index 59fb87b..0e460e6 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ A community app store for [Umbrel](https://umbrel.com), store id `whatsnext`. Ad | **Evolu Relay** | Run the sync relay behind Trezor Suite's labels on your own Umbrel, with an owner allowlist. | | **Atreides Assets** | A self-hosted overview of your crypto and precious metals. | | **Atreides Services** | Your own price feed for Atreides Assets, recorded around the clock. Early version. | +| **Schoolbord** | Tenants, agreements and monthly invoices for a small venue, in Dutch. Early version. | The image recipes for the first two are in [tools/](tools/); the tests are in [tests/](tests/). diff --git a/whatsnext-schoolbord/data/app/.gitkeep b/whatsnext-schoolbord/data/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/whatsnext-schoolbord/docker-compose.yml b/whatsnext-schoolbord/docker-compose.yml new file mode 100644 index 0000000..cc0a1d0 --- /dev/null +++ b/whatsnext-schoolbord/docker-compose.yml @@ -0,0 +1,44 @@ +# ═══════════════════════════════════════════════════════════════════════════════ +# Schoolbord - huurders, afspraken en maandfacturen voor Schooltje Boschoord. +# +# Eén container: de Node-server serveert de app én bezit de database. Het recept +# staat NIET in deze repo maar in `HomeGit/Schoolbord` (de Dockerfile in de root +# daar), net als bij Atreides Assets en Atreides Services. +# +# Een web-UI zonder eigen login: hij hangt volledig achter app_proxy, zonder +# `ports:`. De inlog van umbrelOS is het slot. +# ═══════════════════════════════════════════════════════════════════════════════ + +services: + # umbrelOS genereert deze service zelf; wij vullen alleen in waar hij heen moet + # wijzen. De hostnaam heeft de vorm __1. PROXY_AUTH_ADD + # blijft weg, dus de inlog van umbrelOS staat ervoor. + app_proxy: + environment: + APP_HOST: whatsnext-schoolbord_server_1 + APP_PORT: 8095 + + server: + # De eerste release zet `node tools/release-bump.mjs whatsnext-schoolbord + # ` hier neer, met de digest erbij. Push deze repo niet + # vóór die stap: dan staat hier een tag die het register nog niet kent. + # + # DE TAG IS DE VERSIE VAN DE IMAGE EN NIET DIE VAN DE APP: `version` in + # umbrel-app.yml moet bij élke wijziging omhoog, ook als alleen dit bestand + # verandert. + image: sc.kamenier-hamer.nl/sysop/schoolbord:0.0.1 + restart: on-failure + # Geen `user:` nodig: de image zet zelf `USER node` (uid 1000), en umbrelOS + # maakt de datamap aan als `umbrel`, ook uid 1000 (gemeten bij Atreides + # Services op 09-10-2026). Geen healthcheck hier: die zit in de image. + environment: + # ZONDER DIT IS DE APP ONBEREIKBAAR. De server bindt op 127.0.0.1, en in een + # container is dat de loopback van de container: app_proxy komt er dan niet + # bij. De netwerkgrens is hier de afwezigheid van `ports:` plus de proxy. + SCHOOLBORD_HOST: "0.0.0.0" + volumes: + # De datamap: db.sqlite, de hele administratie. Dit is de map die in de + # back-up van umbrelOS hoort. Met `storage: dataRoot: data` in het manifest + # kan umbrelOS 2.0 hem naar een USB-schijf verplaatsen; daarom staat + # data/app in de repo (.gitkeep) en staat hier geen mount-optie bij. + - ${APP_DATA_DIR}/data/app:/data diff --git a/whatsnext-schoolbord/icon.png b/whatsnext-schoolbord/icon.png new file mode 100644 index 0000000..23828c0 Binary files /dev/null and b/whatsnext-schoolbord/icon.png differ diff --git a/whatsnext-schoolbord/umbrel-app.yml b/whatsnext-schoolbord/umbrel-app.yml new file mode 100644 index 0000000..a06fdb3 --- /dev/null +++ b/whatsnext-schoolbord/umbrel-app.yml @@ -0,0 +1,52 @@ +# De veldvolgorde hieronder is niet vrij: de packaging-documentatie van de +# officiele appstore schrijft hem voor. Zie de tabel in +# HomeGit/Docs/Referenties/UmbrelApps/Umbrel-appstore-spec.md, en de toets in +# tests/test_appstore_vorm.py die hem vasthoudt. +# +# Wat de spec niet noemt, staat onderaan dit bestand en niet ertussen. +manifestVersion: 1 +id: whatsnext-schoolbord +# umbrelOS 2.0: de gebruiker kan de datamap naar een USB-schijf (ext4) verplaatsen. +# Het veld kan er niet meer uit: een installatie die al verplaatst is, start dan +# niet meer. Zie Umbrel-appstore-spec.md §7. +storage: + dataRoot: data +category: finance +name: Schoolbord +version: "0.0.1" +tagline: Tenants, agreements and monthly invoices for a small venue +description: >- + Schoolbord keeps the tenants of a small venue, the agreements made with them, and what follows + from those: every lesson, workshop and booking of a month, with cancellations, moves and extra + bookings. The overview shows this month's revenue, the coming week and revenue per month. + + + It was made for Schooltje Boschoord and speaks Dutch. Everything stays in your app folder on your + Umbrel and goes along with your Umbrel backup. +releaseNotes: >- + The first version: tenants, agreements with weekly, fortnightly, monthly and one-off patterns, the + month with cancelling and moving, rates, and the overview. Invoices follow in a next version. +developer: "WhatsNext?" +website: https://sc.kamenier-hamer.nl/sysop/UmbrelApps +dependencies: [] +repo: https://sc.kamenier-hamer.nl/sysop/UmbrelApps +support: https://sc.kamenier-hamer.nl/sysop/UmbrelApps/issues +# De poort waarop umbrelOS de app aanbiedt. 3850 tot en met 3855 zijn van de +# andere apps in deze store (3852 en 3855 als eigen poorten van de Relay en van +# de API van Atreides Services). +port: 3856 +# Leeg laten bij een nieuw pakket; de plaatjes doet het store-team zelf. +gallery: [] +path: "" +submitter: "WhatsNext?" +submission: https://sc.kamenier-hamer.nl/sysop/UmbrelApps + +# ── Hieronder staat wat de voorgeschreven volgorde niet noemt ──────────────── +# +# GEEN defaultPassword: de app heeft geen eigen login; de inlog van umbrelOS is +# het slot. + +# Het icoon hoort bij een eigen store en moet bij inlevering in de officiele +# store juist weg: die host iconen apart. Daarom staat het als laatste. De boom +# van het Schooltje op beige, van de website. +icon: https://sc.kamenier-hamer.nl/sysop/UmbrelApps/raw/branch/main/whatsnext-schoolbord/icon.png