23 apps (MetaCore, the library/network/client tiers and 13 MetaFeeder*) move out of the general-purpose Worph/AppStore into their own store so the MetaMesh family releases on its own cadence. - asset URLs repointed to cdn.jsdelivr.net/gh/Worph/MetaAppStore@main - store scaffolding added (category/recommend/featured lists, licence, contributing, gitattributes) - psd-source/meta-icons-v2 icon generator follows the apps MetaMCP stays in Worph/AppStore: it is third-party metatool-ai software, not part of MetaMesh.
2.5 KiB
2.5 KiB
MetaSort — Rationale
What deviation / exception is being requested
metasort-apprunsuser: 0:0.- It mounts the Docker socket,
/var/run/docker.sock, read-only. - It mounts
/DATA/AppData/metacore/meta-core— another app's AppData directory.
Why it is necessary
- MetaSort writes its service registration into
/meta-core/services/, a directory created and owned by MetaCore's root-running container, and runs nginx internally. - MetaSort's enrichment plugins are containers. It lists, starts and stops them on the
pcsnetwork (CONTAINER_NETWORK=pcs), and receives their results onCONTAINER_CALLBACK_URL. Driving container lifecycle requires the Docker API. /meta-coreis the shared leader-election and service-discovery directory. MetaCore is a hard prerequisite of this app.
Security mitigations in place
- The socket is mounted
:ro. That limits the bind, not the API — a read-only socket bind still permits write calls — so the meaningful control is the perimeter: the container carries no Caddy labels, publishes no host port, and is reachable only from thepcsnetwork. - Public ingress terminates at the AppShield sidecar (
ghcr.io/yundera/appshield:2.0.9) behind Authelia SSO; only/healthis exempt. - MetaSort's own state is confined to
/DATA/AppData/metasort/cache/, declared inx-compose-app.folders. cpu_sharesset on both services; image tags pinned.
Alternatives considered and rejected
- A Docker-socket proxy (e.g. tecnativa/docker-socket-proxy) allowing only the endpoints
MetaSort uses. This is the right long-term shape and is the intended follow-up. It is
not shipped here because plugin lifecycle needs
containers,images,execandnetworkswrite access, which is most of the API surface anyway; the proxy would narrow the blast radius without eliminating it. - Run plugins as sibling compose services instead of on-demand containers. Plugins are installed and removed by the user at runtime; a static compose file cannot express that.
- Run as
$PUID:$PGID. Fails writing into MetaCore's root-owned/meta-core/services/.
Data protection
MetaSort holds no user media — it reads metadata through MetaCore and caches derived data
under /DATA/AppData/metasort/cache/, which Maison archives and restores. Its access to the
user's files is indirect, through MetaCore's WebDAV endpoint, and is bounded by what
MetaCore itself exposes (read-only mounts of /DATA/Downloads and /DATA/Media).