ec-node: add relay CAS archiver and nix auto-archive service
This commit is contained in:
parent
f70d4a02fd
commit
656ec11c73
4 changed files with 823 additions and 6 deletions
62
evolution/proposals/ECP-0070-relay-cas-archival.md
Normal file
62
evolution/proposals/ECP-0070-relay-cas-archival.md
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
# ECP-0070: Relay-Native CAS Archival + NixOS Auto-Archive Service
|
||||
|
||||
## Summary
|
||||
|
||||
Add a first-party archival path for MoQ relay streams:
|
||||
|
||||
1. `ec-node wt-archive`:
|
||||
- Subscribe to a relay broadcast over WebTransport/MoQ.
|
||||
- Persist each received group payload as a content-addressed object (BLAKE3).
|
||||
- Append per-track JSONL index records ("manifests") that reference CAS object hashes/paths.
|
||||
|
||||
2. Extend the NixOS `services.every-channel.ec-node` module with `archive.*` options:
|
||||
- Poll `every.channel` public stream directory.
|
||||
- Auto-start one `wt-archive` worker per discovered broadcast.
|
||||
- Store large CAS blobs and manifest indices in separately configurable roots.
|
||||
|
||||
## Motivation
|
||||
|
||||
We need durable, low-duplication TV archive storage on dedicated storage hosts.
|
||||
|
||||
- Relay ingestion makes archive nodes location-agnostic.
|
||||
- CAS enables deduplication and integrity-friendly storage semantics.
|
||||
- Separate manifest/index storage allows faster metadata operations and simpler backup policy.
|
||||
- Nix-managed host config keeps archival behavior immutable and repeatable.
|
||||
|
||||
## Decision
|
||||
|
||||
- Introduce `ec-node wt-archive` as the minimal relay subscriber for archival.
|
||||
- Use BLAKE3 object IDs and a sharded filesystem layout (`<cas-root>/objects/blake3/aa/<hash>.bin`).
|
||||
- Write append-only JSONL records per `broadcast/track` under a configurable manifest directory.
|
||||
- Add `services.every-channel.ec-node.archive.*` in the Nix module to auto-discover and archive public streams.
|
||||
|
||||
Initial default archived tracks target current relay publisher output:
|
||||
- `catalog.json`
|
||||
- `init.mp4`
|
||||
- `video0.m4s`
|
||||
- `audio0.m4s`
|
||||
|
||||
## Consequences
|
||||
|
||||
Pros:
|
||||
- Immediate archival path without requiring browser components.
|
||||
- Works with current Cloudflare relay + WebTransport deployment.
|
||||
- Fully declarative deployment via existing Nix input wiring.
|
||||
|
||||
Tradeoffs:
|
||||
- First version archives raw group payloads and does not yet normalize across track schema variants.
|
||||
- Discovery source is the web public stream list (not full control-topic gossip ingestion).
|
||||
- Per-broadcast workers are process-based and best-effort supervised.
|
||||
|
||||
## Rollout
|
||||
|
||||
1. Ship `wt-archive` command in `ec-node`.
|
||||
2. Extend Nix module with `archive.*`.
|
||||
3. Enable on storage host(s) with:
|
||||
- CAS root on large ZFS pool.
|
||||
- manifest root on separate filesystem/dataset.
|
||||
|
||||
## Reversibility
|
||||
|
||||
- Disable `services.every-channel.ec-node.archive.enable`.
|
||||
- Existing CAS/manifests remain inert on disk and can be pruned independently.
|
||||
Loading…
Add table
Add a link
Reference in a new issue