diff --git a/README.md b/README.md index ae607dc..59fb87b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ A community app store for [Umbrel](https://umbrel.com), store id `whatsnext`. Ad | **Electrum Gate** | Reach your own Electrum server from outside your network, over TLS. | | **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. | The image recipes for the first two are in [tools/](tools/); the tests are in [tests/](tests/). diff --git a/whatsnext-atreides-services/data/app/.gitkeep b/whatsnext-atreides-services/data/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/whatsnext-atreides-services/docker-compose.yml b/whatsnext-atreides-services/docker-compose.yml new file mode 100644 index 0000000..c4562df --- /dev/null +++ b/whatsnext-atreides-services/docker-compose.yml @@ -0,0 +1,58 @@ +# ═══════════════════════════════════════════════════════════════════════════════ +# Atreides Services - een eigen koersdienst: legt dag en nacht koersen vast en +# levert ze straks via een API aan Atreides Assets. +# +# Eén container: de Node-server serveert de beheer-app én bezit de database. Het +# recept staat NIET in deze repo maar in `HomeGit/AtreidesServices` (de Dockerfile +# in de root daar), net als bij Atreides Assets; deze store draagt alleen de +# app-definitie. +# +# Geen `ports:` hier. De beheer-app is een web-UI en hangt volledig achter +# app_proxy. De API voor afnemers krijgt later een eigen poort, en pas DIE wordt +# eventueel gepubliceerd; daar staat nu nog niets voor. +# ═══════════════════════════════════════════════════════════════════════════════ + +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: dit is de + # beheer-app en geen dienst voor een cliënt zonder browsersessie. + app_proxy: + environment: + APP_HOST: whatsnext-atreides-services_server_1 + APP_PORT: 8090 + + server: + # NOG NIET GEPIND: er is nog geen image geduwd. Na de eerste release zet + # `node tools/release-bump.mjs whatsnext-atreides-services ` + # de tag en de digest hier neer; dat script vervangt de hele regel en + # controleert anoniem bij het register dat de digest onder die tag hangt. + # + # DE TAG IS DE VERSIE VAN DE IMAGE EN NIET DIE VAN DE APP, net als bij Atreides + # Assets: `version` in umbrel-app.yml moet bij élke wijziging omhoog, ook als + # alleen dit bestand verandert. + image: sc.kamenier-hamer.nl/sysop/atreides-services:0.0.1 + restart: on-failure + # Geen `user:` nodig: de image zet zelf `USER node` (uid 1000). Of die in een + # door umbrelOS aangemaakte datamap mag schrijven, is nog niet bewezen; zie + # de werkafspraken van UmbrelApps, sectie Atreides Assets. + # + # Geen healthcheck hier: die zit in de image (GET /api/health, ook zonder + # login bereikbaar). + environment: + # ZONDER DIT IS DE APP ONBEREIKBAAR. De server bindt op 127.0.0.1 zolang TLS + # én wachtwoord ontbreken, en in een container is dat de loopback van de + # container: app_proxy komt er dan niet bij. De waarschuwing over TLS bij het + # opstarten is daardoor verwacht. De netwerkgrens is hier de afwezigheid van + # een `ports:`-regel plus de proxy. + ATREIDES_SERVICES_HOST: "0.0.0.0" + # HIER STAAT MET OPZET GEEN `ATREIDES_SERVICES_PASSWORD`. De login is + # optioneel en wordt in de app zelf gezet, op de pagina Systeem. Een + # wachtwoord uit de omgeving wint van dat scherm, en dan is het alleen nog + # via dit bestand te veranderen: de les van Atreides Assets 0.1.0. + volumes: + # De datamap: db.sqlite, de minuutbestanden per maand en secrets.json. Een + # koersreeks per moment is niet opnieuw op te halen, dus dit is de map die + # in de back-up van umbrelOS hoort. + - ${APP_DATA_DIR}/data/app:/data diff --git a/whatsnext-atreides-services/icon.png b/whatsnext-atreides-services/icon.png new file mode 100644 index 0000000..669fe30 Binary files /dev/null and b/whatsnext-atreides-services/icon.png differ diff --git a/whatsnext-atreides-services/umbrel-app.yml b/whatsnext-atreides-services/umbrel-app.yml new file mode 100644 index 0000000..088f479 --- /dev/null +++ b/whatsnext-atreides-services/umbrel-app.yml @@ -0,0 +1,51 @@ +# 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-atreides-services +category: finance +name: Atreides Services +version: "0.0.1" +tagline: Your own price feed, recorded around the clock +description: >- + A price service that runs on your Umbrel and keeps what it records. It is built to fetch + prices from the sources you configure, day and night, and to store every point with where + it came from and when it was fetched. A price series per moment cannot be fetched again + later, so this one is kept, in your app folder, and goes along with your Umbrel backup. + + + It is the companion of Atreides Assets: that app will read its prices from here instead + of every portfolio asking the providers on its own. The service knows instruments and + prices, never what anyone owns. + + + This is an early version. It brings the administration app with its System page and an + optional login of its own; collecting prices and the API for other apps follow in later + versions. +releaseNotes: >- + First version in this store: the administration app, without price collection yet. +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 beheer-app aanbiedt. 3850, 3851 en 3853 zijn van de +# andere drie apps in deze store, 3852 is de eigen poort van de relay. +port: 3854 +# 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 login van de beheer-app is optioneel en wordt in de +# app zelf gezet, op de pagina Systeem; zie het commentaar in docker-compose.yml. + +# 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. +icon: https://sc.kamenier-hamer.nl/sysop/UmbrelApps/raw/branch/main/whatsnext-atreides-services/icon.png