prometheus/deploy
Local Dev 998d0b0fca prometheus: add ClamAV sidecar — real uploads can scan now
Before this: service's /healthz always 503'd and the upload endpoint
rejected every submission with scan verdict=error, because clamd was not
installed anywhere reachable. Service worked for the seeded browse view
but no publisher could POST a listing.

Now: a `clamav` sibling container runs the official clamav/clamav:stable
image on an internal docker network only Prometheus can reach. The
Prometheus service connects via CLAMD_HOST=clamav. Signatures live in a
dedicated volume so restarts reuse the ~250 MB freshclam downloaded on
first start.

Two networks on the Prometheus container now:
  prometheus-internal   bridge, service + clamav only; clamd never exposed
  hephaestus            external hephaestus_default, so Hephaestus's Caddy
                        continues to route prometheus.x → prometheus:3700

depends_on with condition=service_healthy means Prometheus waits for
clamd's healthcheck to pass before starting. clamav's start_period is
5 min to accommodate the signature download; the healthcheck itself
is clamdcheck.sh / clamdscan --ping with a 10s timeout per probe.

Deploy on the VPS:
  cd ~/prometheus && git pull && cd deploy
  docker compose pull clamav   # first time, 500+ MB
  docker compose up -d         # Prometheus will wait for clamav healthy
2026-10-09 21:58:56 +02:00
..
apps-silentmode-st.conf prometheus: SEO polish and the apps.silentmode.st mirror vhost 2026-10-08 21:45:59 +02:00
docker-compose.yml prometheus: add ClamAV sidecar — real uploads can scan now 2026-10-09 21:58:56 +02:00
Dockerfile prometheus: Dockerfile + docker-compose for the sidecar deploy 2026-10-09 00:47:40 +02:00
make-tls-cert.sh prometheus: deploy — systemd unit, angie vhost, TLS pin, deploy recipe 2026-10-08 21:53:40 +02:00
prometheus-service.service prometheus: deploy — systemd unit, angie vhost, TLS pin, deploy recipe 2026-10-08 21:53:40 +02:00
prometheus-snapshot.service prometheus: weekly s3 snapshot of the browse surface to bns/prometheus 2026-10-08 21:42:54 +02:00
prometheus-snapshot.timer prometheus: weekly s3 snapshot of the browse surface to bns/prometheus 2026-10-08 21:42:54 +02:00
prometheus-x.conf prometheus: deploy — systemd unit, angie vhost, TLS pin, deploy recipe 2026-10-08 21:53:40 +02:00
README.md prometheus: deploy — systemd unit, angie vhost, TLS pin, deploy recipe 2026-10-08 21:53:40 +02:00

Prometheus — deploy

Everything in this directory lands on a VPS the first time Prometheus is set up on it, plus files that get swapped out on each release.

deploy/
  prometheus-service.service        systemd unit — the Node service on :3700
  prometheus-x.conf                 angie vhost — TLS-terminated reverse proxy
  prometheus-snapshot.service       systemd unit — weekly snapshot job
  prometheus-snapshot.timer         systemd timer — Sunday 04:00 UTC
  apps-silentmode-st.conf           angie vhost — SEO mirror (apps.silentmode.st)
  make-tls-cert.sh                  (re-)generate the self-signed cert, print the pin

First-time install (VPS, root)

# Code
useradd -r -s /usr/sbin/nologin -d /opt/prometheus prometheus
mkdir -p /opt/prometheus
rsync -av --exclude=node_modules --exclude=db.sqlite\* --exclude=uploads \
          --exclude=.keys --exclude=build \
          <workstation>:Prometheus/ /opt/prometheus/
cd /opt/prometheus && npm install --omit=dev
chown -R prometheus:prometheus /opt/prometheus
mkdir -p /opt/prometheus/{uploads,.keys,build}
chown prometheus:prometheus /opt/prometheus/{uploads,.keys,build}

# TLS cert for prometheus.x (prints the fingerprint — save it for #6)
sudo bash /opt/prometheus/deploy/make-tls-cert.sh

# angie
install -m644 /opt/prometheus/deploy/prometheus-x.conf     /etc/angie/http.d/
install -m644 /opt/prometheus/deploy/apps-silentmode-st.conf /etc/angie/http.d/
angie -t && systemctl reload angie

# systemd
install -m644 /opt/prometheus/deploy/prometheus-service.service   /etc/systemd/system/
install -m644 /opt/prometheus/deploy/prometheus-snapshot.service  /etc/systemd/system/
install -m644 /opt/prometheus/deploy/prometheus-snapshot.timer    /etc/systemd/system/

# Instance-specific environment (NOT in the repo)
cat > /etc/default/prometheus <<EOF
ADMIN_PUBLISHER=<a BNS name you own>
# VIRUSTOTAL_API_KEY=<key>              # optional
# PAYMENT_REQUIRED=1                    # enable paid wave
# PROMETHEUS_PAYMENT_ADDRESS=<cashaddr> # required when PAYMENT_REQUIRED=1
# PROMETHEUS_LISTING_FEE_USD=1
EOF
chmod 600 /etc/default/prometheus

systemctl daemon-reload
systemctl enable --now prometheus-service.service
systemctl enable --now prometheus-snapshot.timer

# Verify
curl -k https://127.0.0.1/healthz    # should return 200 and {ok:true,…}

Register the on-chain record (workstation)

IP=$(curl -s https://ifconfig.io)       # or the VPS's public IP as you know it
TLS=<the fingerprint make-tls-cert.sh printed>

node Argus/src/register.js prometheus.x "{\"ip\":\"$IP\",\"tls\":\"$TLS\"}"
# Prompts for the chipnet keystore password (or set DEVIANT_KEYSTORE_PASSWORD).

The current record (as of 2026-10-08) is {"u":"https://silentmode.st/prometheus/"}. The register command above replaces it. Within a few minutes of the TX confirming on chipnet, Theseus and Ariadne resolve prometheus.x to the live service rather than the silentmode.st teaser.

Updates

Code: rsync Prometheus/ again, npm install --omit=dev (safe no-op if deps unchanged), systemctl restart prometheus-service.

Snapshot: nothing to do — the timer runs itself.

Cert rotation: re-run make-tls-cert.sh, grab the new fingerprint, re-register the tls record, reload angie. Theseus and Ariadne pick up the new cert as soon as the record TX confirms.

Rollback

Code: rsync the previous checkout, restart. There is no "schema down migration" discipline yet — the DB file is append-only in practice (new columns, new tables); if a rollback hits a schema change you have to decide what to do with the newer rows.

Record: node Argus/src/register.js prometheus.x '{"u":"https://silentmode.st/prometheus/"}' puts the name back to redirecting at the ICANN mirror. Takes the same few minutes as any other record change.