Move entire Go tree to archive/go/ preserving history. Add Rust implementation: axum HTTP server, nostr-sdk relay reader, sqlx/SQLite storage, Torznab caps+search endpoints, figment config, clap CLI. Update spec.md tech stack and repo layout to reflect Rust. Add docs/FIPS.md with Mode A/B/C deployment walkthrough. Add Phase 6 (FIPS deployment) to phase plan.
2.8 KiB
FIPS Deployment
kindexr can run on a FIPS-networked host so that peers reach it over a private overlay without exposing the Torznab port to the public internet. Three deployment modes are defined; operators choose the one that matches their network topology.
Prerequisites
- FIPS daemon installed and running on the operator host.
- A node identity established (
fips idor equivalent — consult your FIPS daemon docs). - kindexr Phase 0/1 installed and passing its smoke tests (
/healthreturnsdb_ok: true).
Mode A — kindexr bound to a FIPS address (recommended)
Sonarr/Radarr on a peer host resolve kindexr.fips over the overlay and connect
directly to kindexr's HTTP port. No public port is opened.
Step by step
-
Find your FIPS address (example:
fd00::1:2:3:4). Add it toserver.listenin/etc/kindexr/config.yaml:server: listen: "[fd00::1:2:3:4]:9117" base_url: "http://kindexr.fips:9117" -
Register the hostname with the FIPS daemon:
# /etc/fips/hosts (or equivalent for your FIPS implementation) kindexr.fips fd00::1:2:3:4 -
Restart kindexr:
systemctl restart kindexr -
On the peer host, confirm resolution and reachability:
curl http://kindexr.fips:9117/health -
Generate an API key for the peer:
kindexr-cli apikey create --label sonarr-peerThe key is printed to stdout. Copy it.
-
In Sonarr (or Radarr/Prowlarr), add a Torznab indexer:
- URL:
http://kindexr.fips:9117 - API Key:
<key from step 5> - Click Test — it should return green.
- URL:
Mode B — private relay paths via FIPS WSS endpoints
Use FIPS-resolvable relay URLs so both the relay subscription traffic and the publisher outbox travel over the overlay rather than the public internet.
Example config.yaml snippet:
relays:
- "wss://relay.fips:7777"
- "wss://relay2.fips:7777"
publisher:
enabled: false # set true when Phase 4 is in use
outbox:
- "wss://outbox.fips:7778"
Replace the hostnames with whatever your FIPS daemon resolves. The kindexr process itself does not need to bind a FIPS address in Mode B — only the relay connections use the overlay.
Mode C — direct fips Rust crate integration (deferred)
Direct integration via a fips Rust crate would let kindexr register as a FIPS
service and resolve peers programmatically, without relying on the system resolver.
This is deferred until the FIPS Rust crate stabilizes past 0.x. When it lands:
- Add
fips = "x.y"toCargo.toml. - Wire
fips::Nodeintosrc/main.rsalongside the axum server. - Bind the Torznab listener to the FIPS-assigned address automatically.
- Expose the FIPS node ID in
/healthfor peer discovery.
No code changes are needed in Phases 0–5 for Mode C; it will be a Phase 6 task.