replay:corpus runs edge-bench --group over a group's complete corpus ranges in article order (one window, carried from range to range, finished after the last range; edge/src/lease.rs holds the lease JSON the worker and the bench share) and stores every batch through BatchStore as the worker would, then reports releases finished, provisional, complete and the bytes per header of the NVMe and HDD tables. Refuses a database not named *_replay or *_scratch. The app image carries edge-bench; compose gets a replay profile for homelab. Design amended (REBUILD.md 1, 2, 5): the window is carried by one worker a group, no block leases and no block merger; provisional writes stay for the lease ends. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Deploying voyager 2
Voyager 2 (branch rebuild) runs on homelab as the compose project
usenet-rebuild, separate from voyager 1's (usenet-indexer, branch
master): its own Postgres, network, images and directory.
A push to rebuild that passes CI is deployed: the deploy job SSHes to
homelab with the deploy key, whose forced command
(~/bin/deploy-usenet-indexer) passes deploy-rebuild <sha> on to
~/bin/deploy-usenet-rebuild (this directory's deploy.sh).
What runs
| Service | Image | Does |
|---|---|---|
postgres |
postgres:17 | the catalog (tablespace nvme) and the WAL (PG_WAL_DIR, data/pg_wal a symlink to it) on the NVMe; the chunks (HDD) |
migrate |
usenet-rebuild (target app) |
migration:run, before every deploy |
web |
usenet-rebuild |
catalog API, Newznab, web interface; port 3334 (HTTP_ROUTES=public) |
node-api |
usenet-rebuild |
the edge workers' API (leases, streams, batches); port 3335 on the compose network only (HTTP_ROUTES=node) |
coordinator |
usenet-rebuild |
prefetching (all NNTP connections), planning, the tail, merging, settling |
prober |
usenet-rebuild |
phase 2: reads the probe queue's articles over PROBE_CONNECTIONS (6) connections, stores what they show |
merger |
usenet-rebuild |
the par2 merge: releases whose files one par2 set describes become one (no NNTP) |
judge |
usenet-rebuild |
the junk judge: releases judged hourly by what their probes showed (dead, fake, repeated, locked, unusable); verdicts in release_verdicts hide them from search (no NNTP) |
spotter |
usenet-rebuild |
Spotnet: free.pt's spots into spots, signatures checked, the passwords they name kept; 1 connection |
spot-inspector |
usenet-rebuild |
each spot's NZB: its files in spot_files, linked to the releases they match (release_spots), passwords in release_passwords; 1 connection |
edge |
usenet-rebuild-edge (target edge) |
the Rust worker, --threads $EDGE_THREADS (8) |
edge-ts |
usenet-rebuild |
the TypeScript worker, profile edge-ts, not started |
ace |
usenet-rebuild |
one-off ace commands, profile tools |
On homelab
/mnt/bulk/usenet-rebuild (/home is nearly full):
| Path | |
|---|---|
compose.yaml |
copied from src/deploy/compose.yaml on every deploy |
.env |
credentials and tuning, mode 600; not in git (below) |
src/ |
the code at the deployed commit (the build context) |
pg/ |
Postgres data (HDD) |
spool/ |
prefetched XOVER chunks |
corpus/ |
stored XOVER chunks of ranges marked capture, for the grouping sweeps (up to 300 GB) |
corpus-out/ |
the sweeps' replays, per edge image (python3 src/deploy/corpus_sweep.py) |
deployed.log |
one line per deploy: sha, time (local) |
.cache/repo.git |
bare clone the deploys fetch into |
app/ |
an older copy of the code with dev dependencies, for tools/*.ts (r.sh); not what runs |
The catalog's tablespace is /var/lib/usenet-rebuild-catalog on the NVMe
(PG_NVME_DIR). Keep 10 GB free on the root filesystem.
.env holds APP_KEY, DB_USER, DB_PASSWORD, DB_DATABASE, the NNTP_*
account, NODE_TOKEN (the edge worker's token, from nodes:create),
CHUNK_TABLESPACE=pg_default, TZ, LOG_LEVEL, SESSION_DRIVER and
optional tuning (NNTP_CONNECTIONS, EDGE_THREADS, PG_SHARED_BUFFERS,
anything in start/env.ts). Hosts, ports and paths are set in compose.yaml.
By hand
cd /mnt/bulk/usenet-rebuild
~/bin/deploy-usenet-rebuild <sha> # what CI runs
docker compose ps
docker compose logs -f --since 5m coordinator
docker compose run --rm ace releases:duplicates
docker compose stop edge coordinator # pause indexing (the worker first)
docker compose up -d --no-deps edge coordinator
- Recreate app services only, with
--no-deps; Postgres only on purpose, with the worker and coordinator stopped first. - Stop
edgebeforenode-api: a worker holding a stream keeps the server from exiting. - The NNTP account is shared with voyager 1 and downloads:
NNTP_CONNECTIONS(40) plus one plain connection, plus the prober'sPROBE_CONNECTIONS(6), out of 50. deploy.shdoesn't update itself: after changing it, install it again (install -m 755 src/deploy/deploy.sh ~/bin/deploy-usenet-rebuild).