Adds apps/podsteadr (main Fastify+Vue app, container.build from the podsteadr repo), apps/podsteadr-mediamtx (RTMP/WHIP ingest, HLS, recording), and apps/podsteadr-blossom (BUD-02 media blobs), wired together on a dedicated podsteadr-net bridge network per the multi-container pattern documented in docs/app-developer-guide.md (indeedhub's api/relay/minio/redis/postgres siblings). All podsteadr ports are auth: none with a rationale, since it's a public podcast/livestream server whose RSS feeds, HLS playback, and blob reads must stay reachable by third-party clients with no Archipelago session — the app already gates its own sensitive routes with NIP-98 and per-stream secret keys. Also updates apps/PORTS.md, apps/README.md, and bumps the reviewed unauthenticated-port count in core/container/src/manifest.rs's unauthenticated_ports_are_all_accounted_for test (25 -> 31) to acknowledge the six new auth:none ports. Regenerated catalog-derived files (core/archipelago/src/fips/app_ports.rs, neode-ui/src/views/appSession/generatedAppSessionConfig.ts) via scripts/generate-app-catalog.py. All three manifests pass scripts/validate-app-manifest.sh and `cargo test -p archipelago-container manifest`.
86 lines
3.4 KiB
Markdown
86 lines
3.4 KiB
Markdown
# podsteadr — Nostr-native Podcasting & Livestreaming
|
|
|
|
Self-hosted, nostr-native podcast publishing and livestreaming. Log in with a
|
|
NIP-07 nostr identity (no passwords, no email), upload an mp4 to publish an
|
|
RSS 2.0 feed with Podcasting 2.0 lightning payment info, or go live via OBS
|
|
(RTMP) or the browser (WebRTC/WHIP) — the stream is announced on nostr as a
|
|
NIP-53 live event and viewers watch over HLS.
|
|
|
|
This is a three-container stack:
|
|
|
|
| App | Manifest | Role |
|
|
|---|---|---|
|
|
| `podsteadr` | `apps/podsteadr/manifest.yml` | Fastify API + built Vue UI + RSS feeds |
|
|
| `podsteadr-mediamtx` | `apps/podsteadr-mediamtx/manifest.yml` | RTMP/WHIP ingest, HLS output, recording |
|
|
| `podsteadr-blossom` | `apps/podsteadr-blossom/manifest.yml` | BUD-02 sha256-addressed media blobs |
|
|
|
|
All three join a dedicated `podsteadr-net` bridge network and resolve each
|
|
other by short DNS aliases (`podsteadr-app`, `mediamtx`, `blossom`).
|
|
|
|
## Building the Image
|
|
|
|
The app image is built from the **podsteadr** repo, source of truth at
|
|
`http://146.59.87.168:3000/ssmithx/podsteadr`.
|
|
|
|
### Option 1: Use the build script
|
|
|
|
```bash
|
|
# From archy repo root
|
|
./apps/podsteadr/build-from-prototype.sh
|
|
```
|
|
|
|
### Option 2: Build from source directory
|
|
|
|
```bash
|
|
cd ~/podsteadr
|
|
podman build -t localhost/podsteadr:1.0.0 -f ~/archy/apps/podsteadr/Dockerfile .
|
|
```
|
|
|
|
### Publishing to the shared registry
|
|
|
|
```bash
|
|
./apps/podsteadr/push-to-registry.sh 1.0.0
|
|
```
|
|
|
|
Then update `apps/podsteadr/manifest.yml`'s `container.image` to the pushed
|
|
tag so other nodes pull instead of building locally.
|
|
|
|
## Ports
|
|
|
|
See `apps/PORTS.md`. Summary: 8095 (web UI/API/RSS), 1935 (RTMP), 8889
|
|
(WebRTC/WHIP), 8189/udp (WebRTC ICE), 8890 (HLS), 8098 (Blossom).
|
|
|
|
All of podsteadr's ports are `auth: none` — this is a public podcast/livestream
|
|
server, not a private personal app; RSS feeds, HLS playback, and blob reads
|
|
must stay reachable by third-party clients with no Archipelago session, and
|
|
the app enforces its own NIP-98 signed-request auth for sensitive routes and
|
|
per-stream secret keys for RTMP/WHIP publish. See the `auth_rationale` on each
|
|
port mapping.
|
|
|
|
## Nostr Identity
|
|
|
|
podsteadr's frontend vendors a copy of Archipelago's `nostr-provider.js` shim
|
|
and references it directly from `index.html` (its Fastify server isn't the
|
|
nginx-served SPA shape the platform auto-patches — see "Nostr Signer Bridge"
|
|
in `docs/app-developer-guide.md`). `apps/podsteadr/manifest.yml` declares a
|
|
`post_install` hook that re-copies the canonical
|
|
`/opt/archipelago/web-ui/nostr-provider.js` over the vendored copy on every
|
|
install/reinstall, so it doesn't go stale across OTA releases.
|
|
|
|
## Data
|
|
|
|
- `/var/lib/archipelago/podsteadr` — SQLite DB, server's own nostr key,
|
|
covers, and (read-only here) shared stream recordings.
|
|
- `/var/lib/archipelago/podsteadr/recordings` — stream recordings (writable
|
|
by `podsteadr-mediamtx`, read-only for `podsteadr`), 7-day retention.
|
|
- `/var/lib/archipelago/podsteadr-blossom/data` — media blobs.
|
|
|
|
## Known gotchas
|
|
|
|
See the podsteadr repo's `docs/STATUS.md` for the full list (blossom v4
|
|
config `rules:` nesting, no HTTP range support in blossom 4.x, split-horizon
|
|
blossom URL, MediaMTX has no shell so status is polled not hooked, standard
|
|
vs. low-latency HLS). The blossom and mediamtx config files embedded in
|
|
`apps/podsteadr-blossom/manifest.yml` / `apps/podsteadr-mediamtx/manifest.yml`
|
|
already carry the load-bearing ones inline as comments.
|