architecture.md opens on the three services, how a trace crosses them, and the directory's modules; sso.md's diagram and config show ipx-web in front, trusting Caddy and passing headers only from TUNNEL_PEER; configuration.md has ipx-web's variables and the Directory as the service's; cli.md and users.md stop describing the old local Directory; directory.md has its traces and version. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,27 @@
|
||||
# How it works
|
||||
|
||||
One binary, `ipx`. `ipx daemon` runs three things in one process: a scheduler, a Unix-socket
|
||||
control server, and the web UI. Everything else is a CLI that either does the work itself or hands
|
||||
it to a running daemon.
|
||||
Three services, each a container of its own with its own version and changelog (#207):
|
||||
|
||||
The repo is a Cargo workspace (#202): `crates/ipx` is the daemon and CLI, and `crates/feed`
|
||||
(`ipx-feed`) fetches and parses feeds, shared with `crates/directory` (`ipx-directory`), the
|
||||
directory of public podcasts that ipx servers share ([directory.md](directory.md)).
|
||||
The version is the workspace's, in the root `Cargo.toml`.
|
||||
| Service | What it is | Source | Image |
|
||||
|---|---|---|---|
|
||||
| ipx-web | Caddy: serves the page, a static site built from `web/`, and passes `/api` and `/media` to ipx on the same address. It asks ipx before it serves the app or the admin page (`/api/page-check`) | `web/`, `web/Caddyfile` | `Dockerfile.web` |
|
||||
| ipx | The daemon and CLI, one binary. `ipx daemon` runs a scheduler, a Unix-socket control server and the HTTP API in one process; everything else is a CLI that either does the work itself or hands it to a running daemon | `crates/ipx` | `Dockerfile` |
|
||||
| ipx-directory | The directory of public podcasts that ipx servers share. ipx asks it on its people's behalf; the page never talks to it ([directory.md](directory.md)) | `crates/directory` | `Dockerfile.directory` |
|
||||
|
||||
The Rust source is a Cargo workspace (#202); `crates/feed` (`ipx-feed`) fetches and parses feeds
|
||||
for both Rust services. Versions: ipx's in `crates/ipx/Cargo.toml`, the directory's in
|
||||
`crates/directory/Cargo.toml`, the page's in `package.json`; CLAUDE.md has the release steps.
|
||||
|
||||
## Traces and logs
|
||||
|
||||
A request is one trace (#213). The page starts one for each tap and sends `traceparent` with its
|
||||
requests (#190); Caddy's span continues it and passes it on to ipx; ipx's request span, its steps
|
||||
and its calls to the directory follow, and the directory's request span joins it. Scans,
|
||||
downloads, DeadAir's work, shares with the directory and the directory's refresher rounds are
|
||||
traces of their own. All three log one JSON object a line, for Loki; ipx's lines carry their trace
|
||||
id, and Caddy's request lines theirs. ipx also serves Prometheus metrics (`[web] metrics_bind`,
|
||||
#194). The exporter and the `traceparent` handling both Rust services use are in
|
||||
`crates/directory/src/otel.rs`.
|
||||
|
||||
## Modules
|
||||
|
||||
@@ -25,6 +39,12 @@ The version is the workspace's, in the root `Cargo.toml`.
|
||||
| `crates/ipx/src/auth.rs` | Argon2id hashing, session tokens, header names | — |
|
||||
| `crates/ipx/src/web.rs` | axum: HTTP API, auth, SSE, media streaming | — |
|
||||
| `crates/ipx/src/logbuf.rs` | Ring buffer behind the UI's Log view | — |
|
||||
| `crates/ipx/src/directory.rs` | Asking the directory service, and sharing this server's public feeds with it | — |
|
||||
| `crates/ipx/src/metrics.rs` | `/metrics` for Prometheus | — |
|
||||
| `crates/directory/src/lib.rs` | The directory's HTTP API, its token check, the refresher | — |
|
||||
| `crates/directory/src/store.rs` | The directory's database: feeds, snapshots, blocked | — |
|
||||
| `crates/directory/src/config.rs` | The directory's config file: its tokens and their access | — |
|
||||
| `crates/directory/src/otel.rs` | Traces for both Rust services: the exporter, `traceparent` in and out | — |
|
||||
| `web/index.html` | The app's markup | — |
|
||||
| `web/admin.html` | The admin page's markup: server settings, accounts, the log. Sent to admins only | — |
|
||||
| `web/app.css` | The stylesheet both pages share | — |
|
||||
|
||||
Reference in New Issue
Block a user