name: metafeederusenet # ============================================================================= # MetaFeeder · Usenet — publishes YOUR OWN Usenet indexer to MetaMesh. # # ⚠ NNTmux is a SEPARATE app (worph/AppStore) — install it first. This feeder # reaches it on the shared `pcs` network at `http://nntmux` over its Newznab # API (`/api/v1/api` + `/getnzb`), with the API key of NNTmux's `metamesh` # user — the same contract MetaFeeder · Prowlarr uses with Prowlarr. It never # touches NNTmux's database or storage. # # Unlike MetaFeeder · Prowlarr (which proxies EXTERNAL indexers and mints an # `nzb-release` (0x1005) cid embedding that indexer's host), every release # here comes from a scan you run, so the feeder downloads its .nzb once and # mints a PORTABLE `nzb-posting` (0x1003) cid: a digest over the article # Message-ID set, redeemable by ANY peer with a plain NNTP provider account. # It also redeems external `nzb-release` locators with per-indexer keys set on # its config page. # # A headless service: no web UI of its own. Configure it from MetaGateway → # this feeder → *configure* (nntmux URL + API key, indexer keys). # # It needs, over `pcs`: **NNTmux** (`nntmux`), the shared **MetaCore** # (`metacore-app:9000`, records + TMDB posters) and **MetaGateway**, which must # list `http://metafeederusenet-feeder:8080` in its feeders config. # # Design record (meta-gateway repo): docs/others/self-hosted-usenet-indexer-study.md # Feeder repo: github.com/worph/meta-feeder-usenet # ============================================================================= services: # --------------------------------------------------------------------------- # metafeederusenet-feeder — the usenet feeder sidecar (meta-feeder-usenet). # Searches NNTmux over its Newznab API; self-publishes resolved records + # seeds the `.nzb` manifest to the shared MetaCore. The # gateway reaches it directly on `pcs`; the human configures it from # the MetaGateway dashboard (configure panel). # --------------------------------------------------------------------------- metafeederusenet-feeder: image: ghcr.io/worph/meta-feeder-usenet:1.1.1 cpu_shares: 30 container_name: metafeederusenet-feeder # Hard RAM cap, swap disabled (memswap_limit == mem_limit) → OOM instead # of swap. Mirrors the dev sub-stack limits. mem_limit: 256m memswap_limit: 256m hostname: metafeederusenet-feeder restart: unless-stopped user: "0:0" expose: - 8080 environment: # INFRA-ONLY env (the "config: no env if in webui" rule). Operator # config beyond the NNTmux URL seed below — TMDB token / language, # meta-core URL — is read from the persisted config.json (this # feeder's config page, opened from the MetaGateway dashboard (configure panel)). These env vars are # wiring only: the enrichment sidecars, the enrich callback, the peer id. RUST_LOG: "info,meta_feeder=info" # The peer id stamped into provenance.gateway_peer on every record this # feeder self-publishes — names the GATEWAY this feeder serves, not the # feeder itself (analytics group by it). Without it, falls back to HOSTNAME. META_GATEWAY_PEER_ID: "metagateway" FILENAME_PARSER_URL: "http://metafeederusenet-filename-parser:8080" TMDB_PLUGIN_URL: "http://metafeederusenet-tmdb:8080" META_FEEDER_CALLBACK_URL: "http://metafeederusenet-feeder:8080/enrich/callback" # First-boot SEED only (the persisted config.json wins on every later # restart — change these on the /config page after first boot, not here). # The API key has no env seed: paste NNTmux's `metamesh` key on the page. NNTMUX_URL: "http://nntmux" TZ: "$TZ" volumes: # Persist feeder config (config.json saved via the config UI), the redb # cache, and the per-release .nzb cache (gateway/usenet/nntmux-nzb/). - ${DATA_ROOT:-/DATA}/AppData/metafeederusenet/feeder-state:/data/meta-feeder:rw healthcheck: test: ["CMD", "curl", "-sf", "http://localhost:8080/health"] interval: 5s timeout: 3s retries: 10 start_period: 5s depends_on: metafeederusenet-filename-parser: condition: service_started metafeederusenet-tmdb: condition: service_started networks: - metafeederusenet - pcs # --------------------------------------------------------------------------- # Bundled enrichment plugins (self-contained). filename-parser per file; tmdb # once per release — tmdb writes posters/backdrops to the shared meta-core's # WebDAV (over pcs) so the ingester seeds them. No healthcheck: these plugin # images don't ship one (curl absent). # --------------------------------------------------------------------------- metafeederusenet-filename-parser: image: ghcr.io/worph/metamesh-plugin-filename-parser:1.0.4 cpu_shares: 30 container_name: metafeederusenet-filename-parser mem_limit: 256m memswap_limit: 256m hostname: metafeederusenet-filename-parser restart: unless-stopped expose: - 8080 environment: # Beacon v2: this sidecar serves metafeederusenet-feeder only; another consumer # (meta-sort's Scan card) sees it as bound elsewhere, never addable. BEACON_BINDS: "metafeederusenet-feeder" EMIT_TITLE_TAGS: "true" networks: - metafeederusenet metafeederusenet-tmdb: image: ghcr.io/worph/metamesh-plugin-tmdb:1.0.4 cpu_shares: 30 container_name: metafeederusenet-tmdb mem_limit: 384m memswap_limit: 384m hostname: metafeederusenet-tmdb restart: unless-stopped expose: - 8080 environment: # Beacon v2: this sidecar serves metafeederusenet-feeder only; another consumer # (meta-sort's Scan card) sees it as bound elsewhere, never addable. BEACON_BINDS: "metafeederusenet-feeder" # Posters land in the shared meta-core (over pcs) so the ingester seeds # them. LOAD-BEARING at metamesh-plugin-tmdb:1.0.0 — do NOT remove (see # the sibling feeder apps' identical note: the published image needs # this, unlike the source build the dev stack runs). WEBDAV_URL: "http://metacore-app:9000/webdav" volumes: - ${DATA_ROOT:-/DATA}/AppData/metafeederusenet/tmdb-cache:/cache networks: - metafeederusenet - pcs networks: metafeederusenet: name: metafeederusenet driver: bridge pcs: name: ${APP_NET:-pcs} external: true x-casaos: architectures: - amd64 author: Worph Team category: Media developer: Aptero Team description: en_us: | **Publish your own Usenet indexer to the MetaMesh network.** MetaFeeder · Usenet searches your **NNTmux** app (worph/AppStore) over its Newznab API and turns each release into a **portable** MetaMesh posting — no indexer host baked in, redeemable by any peer with a plain NNTP provider account — with a clean title, poster and plot from the bundled filename-parser + TMDB enrichment. It adds a Usenet source alongside **MetaFeeder · Prowlarr**; it doesn't replace it. It also **redeems** releases found through Prowlarr's Newznab indexers, with the indexer keys you set on its config page. **Install NNTmux first.** No web UI of its own: configure it from the **MetaGateway** dashboard (nntmux URL + the `metamesh` API key). **Also requires:** **MetaGateway** — its meta-core stores the resolved records and announces them to the swarm. fr_fr: | **Publiez votre propre indexeur Usenet sur le réseau MetaMesh.** MetaFeeder · Usenet interroge votre app **NNTmux** (worph/AppStore) via son API Newznab et transforme chaque release en posting MetaMesh **portable**, exploitable par n'importe quel pair disposant d'un simple compte NNTP. Il ajoute une source Usenet en plus de **MetaFeeder · Prowlarr**. **Installez NNTmux d'abord.** Pas d'interface propre : configuration depuis le tableau de bord **MetaGateway** (URL nntmux + clé API `metamesh`). **Nécessite aussi** l'app **MetaGateway**. tagline: en_us: Publishes your NNTmux Usenet indexer to MetaMesh as portable postings fr_fr: Publie votre indexeur Usenet NNTmux sur MetaMesh title: en_us: MetaFeeder · Usenet icon: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederUsenet/icon.png screenshot_link: - https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederUsenet/screenshot-1.png - https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederUsenet/screenshot-2.png - https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederUsenet/screenshot-3.png thumbnail: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederUsenet/thumbnail.png store_app_id: metafeederusenet is_uncontrolled: false tips: before_install: en_us: | **Install order:** **NNTmux** (worph/AppStore) and **MetaGateway** first. **After installing:** 1. Read NNTmux's `metamesh` API key (the NNTmux app provisions this user, with raised daily API/download caps): ``` docker exec nntmux php artisan tinker --execute="echo App\Models\User::where('username','metamesh')->value('api_token');" ``` 2. In **MetaGateway**, make sure this feeder is listed in its feeders config (`http://metafeederusenet-feeder:8080`), then open its config panel (*configure*): paste the key into **nntmux API key** (the URL defaults to `http://nntmux`) and Save — the feeder restarts itself. 3. Optionally add **indexer keys** there too, to redeem releases found through Prowlarr's Newznab indexers, and a TMDB token for posters. **Searches must be typed** (`fileType:video`, `contentKind:episode`…) to reach this feeder — a plain search-box query never fans out to it. Each release's .nzb is downloaded from NNTmux once and cached here (`feeder-state/gateway/usenet/nntmux-nzb/`). # Maison (Yundera dashboard) configuration. Read in preference to x-casaos. # schema_version 2 is required for `folders`: an older Maison refuses the app # outright rather than starting it without its directories. x-compose-app: schema_version: 2 # Created and chowned by Maison before any image is pulled, before any hook # runs and before the containers start — on the first boot and every one after. # Compose would otherwise create a missing bind source as a root-owned dir. folders: - path: /DATA/AppData/metafeederusenet/feeder-state user: $PUID group: $PGID - path: /DATA/AppData/metafeederusenet/tmdb-cache user: $PUID group: $PGID # No web UI: Maison files it under Services. Configured from MetaGateway.