MetaShare 2.1.0 hull-only; transport plugins as their own apps: MetaTransportTorrent/Nzb/Ipfs 1.1.0

This commit is contained in:
Worph
2026-10-04 09:57:44 +00:00
parent c9d136e424
commit 26de32ae9a
10 changed files with 523 additions and 132 deletions
+22 -132
View File
@@ -6,12 +6,14 @@ services:
# #
# meta-share is the protocol-agnostic hull since 2.0.0: HTTP API + dashboard, # meta-share is the protocol-agnostic hull since 2.0.0: HTTP API + dashboard,
# material index, seed manifest, eviction, playback focus, meta-core. The # material index, seed manifest, eviction, playback focus, meta-core. The
# byte-moving protocols run as the three transport plugins below (the # byte-moving protocols are transport plugins — each its OWN store app since
# `meta_feeder_sdk::transport` contract) and share its data volume: # 2.1.0 (MetaTransportTorrent / MetaTransportNzb / MetaTransportIpfs), found
# by hostname (`metashare-<tier>:3000`) and managed live from the dashboard's
# Plugins view. A plugin app that isn't installed is simply skipped.
# - 3000 HTTP API + dashboard (proxied through the hash-lock + Caddy) # - 3000 HTTP API + dashboard (proxied through the hash-lock + Caddy)
# - 3001 plugin callback API — internal only, never published # - 3001 plugin callback API — internal only, never published
metashare-app: metashare-app:
image: ghcr.io/worph/meta-share:2.0.1 image: ghcr.io/worph/meta-share:2.1.0
container_name: metashare-app container_name: metashare-app
# Hard RAM cap, swap disabled (memswap_limit == mem_limit) → OOM instead of # Hard RAM cap, swap disabled (memswap_limit == mem_limit) → OOM instead of
# swap. The swarm, blockstore and torrent session moved to the plugins, so # swap. The swarm, blockstore and torrent session moved to the plugins, so
@@ -30,21 +32,18 @@ services:
- 3001 # plugin callback API (internal) - 3001 # plugin callback API (internal)
volumes: volumes:
# Operator settings (META_SHARE_CONFIG_DIR): settings.json holds the NNTP # Operator settings (META_SHARE_CONFIG_DIR): settings.json holds the
# credentials and network endpoints. MUST be persisted (else lost on every # network endpoints and the plugin list. MUST be persisted (else lost on
# image bump). The nzb and ipfs plugins mount it read-only. # every image bump). Plugins keep their own settings in their own app.
- ${DATA_ROOT:-/DATA}/AppData/metashare/config:/config:rw - ${DATA_ROOT:-/DATA}/AppData/metashare/config:/config:rw
# The shared data volume (META_SHARE_DATA): cache/, tmp/, seeds.json and # The shared data volume (META_SHARE_DATA): cache/, tmp/, seeds.json and
# material.redb are the hull's; bt-temp/ (torrent), tmp/<cid> jobs (nzb) # material.redb are the hull's; bt-temp/ (torrent), tmp/<cid> jobs (nzb)
# and ipfs/blocks.redb (ipfs) are the plugins' corners of the SAME mount — # and ipfs/blocks.redb (ipfs) are the plugin apps' corners of the SAME
# one mount, so the tmp/ → cache/ rename(2) stays atomic. Layout unchanged # host folder, which they mount too — so the tmp/ → cache/ rename(2) stays
# from the monolith: existing caches carry over. # atomic. Layout unchanged from the monolith: existing caches carry over.
- ${DATA_ROOT:-/DATA}/AppData/metashare/data:/data:rw - ${DATA_ROOT:-/DATA}/AppData/metashare/data:/data:rw
environment: environment:
- META_SHARE_PLUGIN_TORRENT_URL=http://metashare-torrent:3000
- META_SHARE_PLUGIN_NZB_URL=http://metashare-nzb:3000
- META_SHARE_PLUGIN_IPFS_URL=http://metashare-ipfs:3000
# Service registration / neighbour announce. # Service registration / neighbour announce.
- BASE_URL=https://metashare-$APP_DOMAIN - BASE_URL=https://metashare-$APP_DOMAIN
# meta-core ingestion — the local archivist's library. # meta-core ingestion — the local archivist's library.
@@ -66,118 +65,6 @@ services:
networks: networks:
- pcs - pcs
# BitTorrent tier (librqbit, streaming-only fork). Its peer listener must be
# host-published so the swarm can dial in (idle seeding without a dial storm).
metashare-torrent:
image: ghcr.io/worph/meta-transport-torrent:1.0.1
container_name: metashare-torrent
hostname: metashare-torrent
restart: unless-stopped
mem_limit: 1g
memswap_limit: 1g
cpu_shares: 20
stop_grace_period: 30s
expose:
- 3000
ports:
- "4240:4240"
volumes:
- ${DATA_ROOT:-/DATA}/AppData/metashare/data:/data:rw
environment:
- META_SHARE_HULL_URL=http://metashare-app:3001
- TZ=$TZ
user: 0:0
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:3000/health"]
interval: 10s
timeout: 3s
retries: 10
start_period: 30s
networks:
- pcs
# Usenet tier (NNTP, yEnc, par2/RAR). Reads the NNTP credentials from the
# hull's settings.json; the hull restarts it when they change.
metashare-nzb:
image: ghcr.io/worph/meta-transport-nzb:1.0.1
container_name: metashare-nzb
hostname: metashare-nzb
restart: unless-stopped
mem_limit: 3g
memswap_limit: 3g
cpu_shares: 20
stop_grace_period: 30s
expose:
- 3000
volumes:
- ${DATA_ROOT:-/DATA}/AppData/metashare/config:/config:ro
- ${DATA_ROOT:-/DATA}/AppData/metashare/data:/data:rw
environment:
- META_SHARE_HULL_URL=http://metashare-app:3001
- TZ=$TZ
user: 0:0
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:3000/health"]
interval: 10s
timeout: 3s
retries: 10
start_period: 30s
networks:
- pcs
# IPFS tier: the libp2p host (identify/kad/mdns/bitswap), the blockstore and
# bitswap ingress. libp2p TCP must be host-published — Caddy can't proxy it and
# other peers' kad lookups dial the public multiaddr directly.
metashare-ipfs:
image: ghcr.io/worph/meta-transport-ipfs:1.0.1
container_name: metashare-ipfs
hostname: metashare-ipfs
restart: unless-stopped
# The blockstore's redb page cache + the swarm live here now.
mem_limit: 2g
memswap_limit: 2g
cpu_shares: 20
stop_grace_period: 30s
expose:
- 3000
ports:
- "4001:4001"
volumes:
- ${DATA_ROOT:-/DATA}/AppData/metashare/config:/config:ro
- ${DATA_ROOT:-/DATA}/AppData/metashare/data:/data:rw
environment:
- META_SHARE_HULL_URL=http://metashare-app:3001
- P2P_LISTEN=/ip4/0.0.0.0/tcp/4001
# Advertise the routable address so kad provider records + identify carry
# a dialable multiaddr. ${APP_PUBLIC_IPV4}, NOT ${APP_PUBLIC_IP}: on an
# IPv6-primary PCS the latter is v6 and `/ip4/<v6>/…` won't parse (the
# plugin refuses to start rather than announce a lie).
- PUBLIC_ADDR=/ip4/${APP_PUBLIC_IPV4}/tcp/4001
# Public IPFS DHT bootstraps by explicit /dns4/…/tcp/4001 (the nested
# dnsaddr form resolves to wss-only in some container resolvers), plus
# mars.i.ipfs.io — the four IPFS-Foundation bootstrappers can refuse an
# individual IP (watch.nsl.sh 2026-09-01: 2 connections → 126 with a fifth).
- KAD_BOOTSTRAP_PEERS=/dns4/sg1.bootstrap.libp2p.io/tcp/4001/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt,/dns4/sv15.bootstrap.libp2p.io/tcp/4001/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN,/dns4/ny5.bootstrap.libp2p.io/tcp/4001/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa,/dns4/am6.bootstrap.libp2p.io/tcp/4001/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb,/dns4/mars.i.ipfs.io/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
# Seed fallbacks when the hull's settings.json doesn't exist yet.
- META_CORE_URL=http://metacore-app:80
- INTERNAL_BASE_URL=https://metashare-$APP_DOMAIN
- TZ=$TZ
user: 0:0
# The hull migrates its material index out of ipfs/blocks.redb on its first
# 2.x boot; redb is single-process, so the plugin waits for it.
depends_on:
metashare-app:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:3000/health"]
interval: 10s
timeout: 3s
retries: 10
start_period: 30s
networks:
- pcs
# OIDC perimeter for the MetaShare dashboard. Self-registers as an OIDC client # OIDC perimeter for the MetaShare dashboard. Self-registers as an OIDC client
# with the platform's auth-registrar on first login (no secrets to manage). # with the platform's auth-registrar on first login (no secrets to manage).
# #
@@ -280,7 +167,7 @@ x-casaos:
# `needs-public-ip` is the reserved functional tag: this app publishes a raw # `needs-public-ip` is the reserved functional tag: this app publishes a raw
# libp2p TCP port that remote peers must dial inbound. Behind CGNAT or the # libp2p TCP port that remote peers must dial inbound. Behind CGNAT or the
# mesh-router tunnel it still installs and starts, but peers cannot reach it. # mesh-router tunnel it still installs and starts, but peers cannot reach it.
tags: ["media", "needs-public-ip"] tags: ["media"]
developer: Aptero Team developer: Aptero Team
description: description:
@@ -348,16 +235,19 @@ x-casaos:
en_us: | en_us: |
**Requires MetaCore** - Install MetaCore first. **Requires MetaCore** - Install MetaCore first.
**Port 4001 must be reachable from the public internet.** MetaShare's libp2p **Then install the transport plugins you want** — each is its own app:
TCP listener is host-published on port 4001 so other archivists' peers **MetaTransport · IPFS** (the mesh: peers, seeding — install this one),
(and the public IPFS kad-DHT) can dial this node directly. If your Yundera **MetaTransport · BitTorrent** and **MetaTransport · Usenet**. MetaShare
host is behind a strict firewall, open TCP/4001 inbound — without it, this picks each up within ~10 s; see and configure them in the dashboard's
peer can still *find* others but won't be findable by them. **Plugins** view. Without any plugin MetaShare can fetch nothing.
**Ports** are published by the plugin apps, not here: 4001 (IPFS) must be
reachable from the internet so other peers can dial you; 4240 (BitTorrent)
for seeding.
**Cohort scoping (optional).** Out of the box, MetaShare joins the global **Cohort scoping (optional).** Out of the box, MetaShare joins the global
`metamesh-share-default` cohort. To run a private group of archivists, `metamesh-share-default` cohort. To run a private group of archivists,
change `KAD_NAMESPACE` to a shared secret string on every node in the set the same namespace on every node: **Plugins → ipfs → configure**.
group — only nodes with the matching namespace will see each other.
**POC status.** v0.2 has an in-memory record store (rebuilt from MetaCore **POC status.** v0.2 has an in-memory record store (rebuilt from MetaCore
on every restart, ~2.5s for ~500 records) and no announcement signing yet. on every restart, ~2.5s for ~500 records) and no announcement signing yet.
+176
View File
@@ -0,0 +1,176 @@
name: metatransportipfs
# One of MetaShare's transport plugins (meta-transport-ipfs). MetaShare (the
# hull) reaches it at http://metashare-ipfs:3000 over `pcs` — the default entry
# in its plugin list — and probes it every 10 s, so installing or removing this
# app takes effect with no other step. Manage it from MetaShare → Plugins.
#
# It shares MetaShare's data volume (same /data layout the monolith used: the
# `tmp/` → `cache/` promote is one rename(2), and the hull reads plugin-written
# files directly). Its own settings live in its state dir (config.json), edited
# through MetaShare's dashboard.
services:
metashare-ipfs:
image: ghcr.io/worph/meta-transport-ipfs:1.1.0
container_name: metashare-ipfs
hostname: metashare-ipfs
restart: unless-stopped
cpu_shares: 20
# Hard RAM cap, swap disabled (memswap_limit == mem_limit) → OOM instead of swap.
mem_limit: 2g
memswap_limit: 2g
# Clean redb / session shutdown on SIGTERM before docker escalates.
stop_grace_period: 30s
# Root, like MetaShare: the shared data volume is root-owned.
user: 0:0
expose:
- 3000 # transport contract (internal, reached by MetaShare only)
# libp2p TCP must be host-published: other peers' kad-DHT lookups dial
# the public multiaddr directly, and Caddy cannot proxy it (not HTTP).
ports:
- "4001:4001"
volumes:
- ${DATA_ROOT:-/DATA}/AppData/metashare/data:/data:rw
- ${DATA_ROOT:-/DATA}/AppData/metatransportipfs/state:/state:rw
environment:
- META_SHARE_HULL_URL=http://metashare-app:3001
# Advertise the routable address so provider records + identify carry a
# dialable multiaddr. ${APP_PUBLIC_IPV4}, NOT ${APP_PUBLIC_IP}: on an
# IPv6-primary PCS the latter holds a v6 address, and /ip4/<v6>/… is not a
# parseable multiaddr (the plugin refuses to start rather than announce a lie).
- PUBLIC_ADDR=/ip4/${APP_PUBLIC_IPV4}/tcp/4001
# Public IPFS DHT bootstraps by explicit /dns4/.../tcp/4001 (the nested
# dnsaddr default resolves to wss-only in some container resolvers), plus
# mars.i.ipfs.io as a fifth in case the foundation four refuse this IP.
# Editable later from MetaShare → Plugins → ipfs → configure.
- KAD_BOOTSTRAP_PEERS=/dns4/sg1.bootstrap.libp2p.io/tcp/4001/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt,/dns4/sv15.bootstrap.libp2p.io/tcp/4001/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN,/dns4/ny5.bootstrap.libp2p.io/tcp/4001/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa,/dns4/am6.bootstrap.libp2p.io/tcp/4001/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb,/dns4/mars.i.ipfs.io/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
- TZ=$TZ
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:3000/health"]
interval: 10s
timeout: 3s
retries: 10
start_period: 30s
networks:
- metatransportipfs
- pcs
# OIDC perimeter in front of the plugin's own config page (the tile link).
# MetaShare's dashboard embeds the same page through its own proxy.
metatransportipfs:
image: ghcr.io/yundera/appshield:2.0.9
cpu_shares: 80
container_name: metatransportipfs
hostname: metatransportipfs
restart: unless-stopped
user: "0:0"
expose:
- 80
environment:
OIDC_REGISTRAR_URL: "http://auth-registrar:9092"
REDIRECT_HOST_SUFFIXES: "${APP_DOMAIN},${APP_PUBLIC_IP_DASH}.nip.io,${APP_PUBLIC_IP_DASH}.sslip.io"
BACKEND_HOST: "metashare-ipfs"
BACKEND_PORT: "3000"
LISTEN_PORT: "80"
labels:
caddy_0: metatransportipfs-${APP_DOMAIN}
caddy_0.import: gateway_tls
caddy_0.reverse_proxy: "{{upstreams 80}}"
caddy_1: metatransportipfs-${APP_PUBLIC_IP_DASH}.nip.io
caddy_1.import: gateway_tls
caddy_1.reverse_proxy: "{{upstreams 80}}"
caddy_2: metatransportipfs-${APP_PUBLIC_IP_DASH}.sslip.io
caddy_2.reverse_proxy: "{{upstreams 80}}"
depends_on:
- metashare-ipfs
networks:
- metatransportipfs
- pcs
networks:
metatransportipfs:
name: metatransportipfs
driver: bridge
pcs:
name: ${APP_NET:-pcs}
external: true
x-casaos:
architectures:
- amd64
- arm64
author: Worph Team
category: Media
tags: ["media", "needs-public-ip"]
developer: Aptero Team
main: metatransportipfs
webui_port: 80
index: /config
description:
en_us: |
**IPFS transport for MetaShare — the mesh itself.**
Runs MetaShare's libp2p node: peer discovery (public IPFS DHT, mDNS on the
LAN), bitswap block exchange, and seeding of your library and of what you
fetched, without a second copy on disk. It is also how MetaShare finds the
gateways on the mesh.
**One of MetaShare's transport plugins** — without it MetaShare can still
use BitTorrent and Usenet, but has no swarm. Configure it from
**MetaShare → Plugins → ipfs → configure** (cohort namespace, bootstrap
peers, DHT announce).
**Requires:** **MetaShare** (it shares MetaShare's storage).
**Port 4001 must be reachable from the internet** so other peers can dial
you. Behind CGNAT it still works, but peers cannot reach you.
fr_fr: |
**Transport IPFS pour MetaShare — le mesh lui-même.**
Fait tourner le nœud libp2p de MetaShare : découverte des pairs (DHT IPFS
public, mDNS sur le LAN), échange de blocs bitswap et partage de votre
bibliothèque sans seconde copie. C'est aussi par lui que MetaShare trouve les
passerelles du mesh.
**Un des plugins de transport de MetaShare.** Réglages dans
**MetaShare → Plugins → ipfs → configure**.
**Nécessite :** **MetaShare**. Le **port 4001** doit être joignable depuis
Internet.
tagline:
en_us: IPFS for MetaShare — find and share content with peers by CID
fr_fr: IPFS pour MetaShare — trouver et partager du contenu par CID
title:
en_us: MetaTransport · IPFS
icon: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaTransportIpfs/icon.png
thumbnail: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaTransportIpfs/thumbnail.png
store_app_id: metatransportipfs
is_uncontrolled: false
tips:
before_install:
en_us: |
**Install MetaShare first** — this plugin shares its storage and is
driven by it. MetaShare picks it up automatically within ~10 s; check
**MetaShare → Plugins**, where it shows as *live*.
Settings: **MetaShare → Plugins → ipfs → configure** (or this app's own
tile). Saving restarts the plugin to apply.
# Maison (Yundera dashboard) configuration. Read in preference to x-casaos.
x-compose-app:
schema_version: 2
folders:
- path: /DATA/AppData/metatransportipfs/state
user: $PUID
group: $PGID
# Same string as the caddy_0 label, so the tile link and the route agree.
webui-host: metatransportipfs-${domain}
webui-path: "/config"
Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

+158
View File
@@ -0,0 +1,158 @@
name: metatransportnzb
# One of MetaShare's transport plugins (meta-transport-nzb). MetaShare (the
# hull) reaches it at http://metashare-nzb:3000 over `pcs` — the default entry
# in its plugin list — and probes it every 10 s, so installing or removing this
# app takes effect with no other step. Manage it from MetaShare → Plugins.
#
# It shares MetaShare's data volume (same /data layout the monolith used: the
# `tmp/` → `cache/` promote is one rename(2), and the hull reads plugin-written
# files directly). Its own settings live in its state dir (config.json), edited
# through MetaShare's dashboard.
services:
metashare-nzb:
image: ghcr.io/worph/meta-transport-nzb:1.1.0
container_name: metashare-nzb
hostname: metashare-nzb
restart: unless-stopped
cpu_shares: 20
# Hard RAM cap, swap disabled (memswap_limit == mem_limit) → OOM instead of swap.
mem_limit: 3g
memswap_limit: 3g
# Clean redb / session shutdown on SIGTERM before docker escalates.
stop_grace_period: 30s
# Root, like MetaShare: the shared data volume is root-owned.
user: 0:0
expose:
- 3000 # transport contract (internal, reached by MetaShare only)
volumes:
- ${DATA_ROOT:-/DATA}/AppData/metashare/data:/data:rw
- ${DATA_ROOT:-/DATA}/AppData/metatransportnzb/state:/state:rw
environment:
- META_SHARE_HULL_URL=http://metashare-app:3001
- TZ=$TZ
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:3000/health"]
interval: 10s
timeout: 3s
retries: 10
start_period: 30s
networks:
- metatransportnzb
- pcs
# OIDC perimeter in front of the plugin's own config page (the tile link).
# MetaShare's dashboard embeds the same page through its own proxy.
metatransportnzb:
image: ghcr.io/yundera/appshield:2.0.9
cpu_shares: 80
container_name: metatransportnzb
hostname: metatransportnzb
restart: unless-stopped
user: "0:0"
expose:
- 80
environment:
OIDC_REGISTRAR_URL: "http://auth-registrar:9092"
REDIRECT_HOST_SUFFIXES: "${APP_DOMAIN},${APP_PUBLIC_IP_DASH}.nip.io,${APP_PUBLIC_IP_DASH}.sslip.io"
BACKEND_HOST: "metashare-nzb"
BACKEND_PORT: "3000"
LISTEN_PORT: "80"
labels:
caddy_0: metatransportnzb-${APP_DOMAIN}
caddy_0.import: gateway_tls
caddy_0.reverse_proxy: "{{upstreams 80}}"
caddy_1: metatransportnzb-${APP_PUBLIC_IP_DASH}.nip.io
caddy_1.import: gateway_tls
caddy_1.reverse_proxy: "{{upstreams 80}}"
caddy_2: metatransportnzb-${APP_PUBLIC_IP_DASH}.sslip.io
caddy_2.reverse_proxy: "{{upstreams 80}}"
depends_on:
- metashare-nzb
networks:
- metatransportnzb
- pcs
networks:
metatransportnzb:
name: metatransportnzb
driver: bridge
pcs:
name: ${APP_NET:-pcs}
external: true
x-casaos:
architectures:
- amd64
- arm64
author: Worph Team
category: Media
tags: ["media"]
developer: Aptero Team
main: metatransportnzb
webui_port: 80
index: /config
description:
en_us: |
**Usenet (NZB) transport for MetaShare.**
Streams Usenet releases progressively over **your NNTP provider** (yEnc,
par2 repair, RAR sets), so playback starts before the download ends.
**One of MetaShare's transport plugins.** Configure your provider from
**MetaShare → Plugins → nzb → configure** (host, port, user, password,
connections). Without a provider it stays installed but idle, and MetaShare
forwards Usenet requests to a gateway on the mesh instead. An existing
MetaShare's provider settings are imported automatically on first start.
**Requires:** **MetaShare** (it shares MetaShare's storage). Usenet is
fetch-only: this plugin does not seed. Uses up to ~3 GB RAM while a
release downloads.
fr_fr: |
**Transport Usenet (NZB) pour MetaShare.**
Lit les releases Usenet progressivement via **votre fournisseur NNTP** (yEnc,
réparation par2, archives RAR).
**Un des plugins de transport de MetaShare.** Le fournisseur se configure dans
**MetaShare → Plugins → nzb → configure**. Les réglages d'un MetaShare existant
sont importés au premier démarrage.
**Nécessite :** **MetaShare**. Jusqu'à ~3 Go de RAM pendant un téléchargement.
tagline:
en_us: Usenet for MetaShare — stream NZB releases from your provider
fr_fr: Usenet pour MetaShare — lecture des releases NZB depuis votre fournisseur
title:
en_us: MetaTransport · Usenet
icon: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaTransportNzb/icon.png
thumbnail: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaTransportNzb/thumbnail.png
store_app_id: metatransportnzb
is_uncontrolled: false
tips:
before_install:
en_us: |
**Install MetaShare first** — this plugin shares its storage and is
driven by it. MetaShare picks it up automatically within ~10 s; check
**MetaShare → Plugins**, where it shows as *live*.
Settings: **MetaShare → Plugins → nzb → configure** (or this app's own
tile). Saving restarts the plugin to apply.
# Maison (Yundera dashboard) configuration. Read in preference to x-casaos.
x-compose-app:
schema_version: 2
folders:
- path: /DATA/AppData/metatransportnzb/state
user: $PUID
group: $PGID
# Same string as the caddy_0 label, so the tile link and the route agree.
webui-host: metatransportnzb-${domain}
webui-path: "/config"
Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

@@ -0,0 +1,167 @@
name: metatransporttorrent
# One of MetaShare's transport plugins (meta-transport-torrent). MetaShare (the
# hull) reaches it at http://metashare-torrent:3000 over `pcs` — the default entry
# in its plugin list — and probes it every 10 s, so installing or removing this
# app takes effect with no other step. Manage it from MetaShare → Plugins.
#
# It shares MetaShare's data volume (same /data layout the monolith used: the
# `tmp/` → `cache/` promote is one rename(2), and the hull reads plugin-written
# files directly). Its own settings live in its state dir (config.json), edited
# through MetaShare's dashboard.
services:
metashare-torrent:
image: ghcr.io/worph/meta-transport-torrent:1.1.0
container_name: metashare-torrent
hostname: metashare-torrent
restart: unless-stopped
cpu_shares: 20
# Hard RAM cap, swap disabled (memswap_limit == mem_limit) → OOM instead of swap.
mem_limit: 1g
memswap_limit: 1g
# Clean redb / session shutdown on SIGTERM before docker escalates.
stop_grace_period: 30s
# Root, like MetaShare: the shared data volume is root-owned.
user: 0:0
expose:
- 3000 # transport contract (internal, reached by MetaShare only)
# BitTorrent peer port (librqbit). Must stay published on the host so
# other peers can connect for the torrents this node seeds.
ports:
- "4240:4240"
volumes:
- ${DATA_ROOT:-/DATA}/AppData/metashare/data:/data:rw
- ${DATA_ROOT:-/DATA}/AppData/metatransporttorrent/state:/state:rw
environment:
- META_SHARE_HULL_URL=http://metashare-app:3001
- TZ=$TZ
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:3000/health"]
interval: 10s
timeout: 3s
retries: 10
start_period: 30s
networks:
- metatransporttorrent
- pcs
# OIDC perimeter in front of the plugin's own config page (the tile link).
# MetaShare's dashboard embeds the same page through its own proxy.
metatransporttorrent:
image: ghcr.io/yundera/appshield:2.0.9
cpu_shares: 80
container_name: metatransporttorrent
hostname: metatransporttorrent
restart: unless-stopped
user: "0:0"
expose:
- 80
environment:
OIDC_REGISTRAR_URL: "http://auth-registrar:9092"
REDIRECT_HOST_SUFFIXES: "${APP_DOMAIN},${APP_PUBLIC_IP_DASH}.nip.io,${APP_PUBLIC_IP_DASH}.sslip.io"
BACKEND_HOST: "metashare-torrent"
BACKEND_PORT: "3000"
LISTEN_PORT: "80"
labels:
caddy_0: metatransporttorrent-${APP_DOMAIN}
caddy_0.import: gateway_tls
caddy_0.reverse_proxy: "{{upstreams 80}}"
caddy_1: metatransporttorrent-${APP_PUBLIC_IP_DASH}.nip.io
caddy_1.import: gateway_tls
caddy_1.reverse_proxy: "{{upstreams 80}}"
caddy_2: metatransporttorrent-${APP_PUBLIC_IP_DASH}.sslip.io
caddy_2.reverse_proxy: "{{upstreams 80}}"
depends_on:
- metashare-torrent
networks:
- metatransporttorrent
- pcs
networks:
metatransporttorrent:
name: metatransporttorrent
driver: bridge
pcs:
name: ${APP_NET:-pcs}
external: true
x-casaos:
architectures:
- amd64
- arm64
author: Worph Team
category: Media
tags: ["media"]
developer: Aptero Team
main: metatransporttorrent
webui_port: 80
index: /config
description:
en_us: |
**BitTorrent transport for MetaShare.**
Lets MetaShare fetch torrent content **by byte range**, so a video starts
playing in seconds and seeks without downloading the whole file first. What
a viewer genuinely watches is completed in the background and **seeded**
back to the swarm (watch-commit).
**One of MetaShare's transport plugins** — each protocol is its own app, so
you install only the ones you want, and a competing implementation can
replace this one. MetaShare finds it automatically once installed; manage
and configure it from **MetaShare → Plugins** (watch-commit, disk floor,
timeouts).
**Requires:** **MetaShare** (it shares MetaShare's storage).
**Port 4240 (TCP)** is published so other peers can reach the torrents
you seed.
fr_fr: |
**Transport BitTorrent pour MetaShare.**
Permet à MetaShare de récupérer un torrent **par plages d'octets** : la vidéo
démarre en quelques secondes et se parcourt sans tout télécharger. Ce qui est
réellement regardé est complété en arrière-plan puis **partagé** sur le swarm.
**Un des plugins de transport de MetaShare** — chaque protocole est une app à
part. MetaShare le détecte dès l'installation ; gestion et réglages dans
**MetaShare → Plugins**.
**Nécessite :** **MetaShare** (il partage son stockage). Le **port 4240** est
publié pour les pairs distants.
tagline:
en_us: BitTorrent for MetaShare — stream torrents by range, seed what you watch
fr_fr: BitTorrent pour MetaShare — lecture de torrents par plages, partage de ce que vous regardez
title:
en_us: MetaTransport · BitTorrent
icon: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaTransportTorrent/icon.png
thumbnail: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaTransportTorrent/thumbnail.png
store_app_id: metatransporttorrent
is_uncontrolled: false
tips:
before_install:
en_us: |
**Install MetaShare first** — this plugin shares its storage and is
driven by it. MetaShare picks it up automatically within ~10 s; check
**MetaShare → Plugins**, where it shows as *live*.
Settings: **MetaShare → Plugins → torrent → configure** (or this app's own
tile). Saving restarts the plugin to apply.
# Maison (Yundera dashboard) configuration. Read in preference to x-casaos.
x-compose-app:
schema_version: 2
folders:
- path: /DATA/AppData/metatransporttorrent/state
user: $PUID
group: $PGID
# Same string as the caddy_0 label, so the tile link and the route agree.
webui-host: metatransporttorrent-${domain}
webui-path: "/config"
Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB