The VPS runs Caddy inside Docker as part of the Hephaestus stack (not system-wide angie as the earlier deploy/README assumed), so the shape of the deploy is: Prometheus runs as its own small docker-compose that attaches to Hephaestus's existing network, and Hephaestus's Caddy reverse-proxies prometheus.x → prometheus:3700. Dockerfile: node:22-alpine base (keeps the image ~55 MB and gives us node:sqlite stable), tini for signal handling, non-root `node` user, one /data volume holding the DB + ed25519 service key + uploads + snapshot build output. docker-compose: one service, attaches hephaestus_default as external network, env sourced from an .env file alongside the compose. The .env is NOT committed (contains ADMIN_PUBLISHER, optional VirusTotal key, optional payment config). Healthcheck polls /healthz. The deploy/prometheus-service.service systemd unit from the earlier commit is now unused on this host (kept for anyone deploying natively on a non-dockered box). |
||
|---|---|---|
| deploy | ||
| public | ||
| scripts | ||
| service | ||
| .gitignore | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
Prometheus
The service behind prometheus.x — a standalone website that accepts app
listings, scans the binaries, generates APS1 records for publishers to sign,
and serves the browse pages.
The architecture decisions and the reasoning behind them live at
_coordination/sessions/prometheus-x-architecture.md.
Read that before touching the code; it answers the questions this directory
otherwise invites ("why isn't this on Sia?", "why isn't the admin on another
subdomain?", "why Node?").
service/ Node HTTP server, templates, scanner, storage, payments
public/ Static assets served under /static/
content/ Prose content in a form the templates render into pages
Run it locally
cd Prometheus
npm install # none yet; placeholder for when deps show up
node service/server.js
Opens on http://127.0.0.1:3700 by default. Override with PORT=xxxx.
Layout
The server is one node:http listener behind a trivial map-based router.
Pages are plain functions that return {title, description, body} and
layout() wraps them in the common document shell. Static files under
public/ are served directly.
There's no framework and no templating engine on purpose — a site this small does not earn a dependency surface, and the response-rendering path is short enough to read at a glance.