name: metafuse services: # Backend service. Reachable on the pcs network as `metafuse-app`. # Public ingress goes through the `metafuse` hash-lock proxy below. metafuse-app: image: ipcr-watch.nsl.sh/ipns/metadec.eth/metadec.eth/meta-fuse:1.1.6 cpu_shares: 50 container_name: metafuse-app hostname: metafuse-app restart: unless-stopped privileged: true expose: - 80 # FUSE capabilities required for virtual filesystem devices: - /dev/fuse:/dev/fuse cap_add: - SYS_ADMIN - DAC_READ_SEARCH - DAC_OVERRIDE security_opt: - apparmor:unconfined volumes: # Shared infrastructure state (leader election, Redis dump, service discovery) # Owned by MetaCore; mounted rw here for service registration + leader reads. # No /meta-core mount: this service locates meta-core over UDP # (beacon v2) instead of reading kv-leader.info off a shared # volume. See docs/project-architecture/beacon-v2.md. # FUSE virtual filesystem mount point - ${DATA_ROOT:-/DATA}/MetaFuse/Library:/mnt/virtual:shared # Configuration storage - ${DATA_ROOT:-/DATA}/AppData/metafuse/config:/meta-fuse/config:rw # Note: no /files mounts — files are accessed via WebDAV from MetaCore # (Architecture V3). MetaCore is the single source of truth for media files. environment: - NODE_ENV=production - CONFIG_DIR=/meta-fuse/config - SERVICE_NAME=meta-fuse - SERVICE_VERSION=1.0.0 - BASE_URL=https://metafuse-$APP_DOMAIN - TZ=$TZ # Note: Runs as root for FUSE mount operations user: 0:0 networks: - pcs # OIDC perimeter for the MetaFuse dashboard. Self-registers as an OIDC client # with the platform's auth-registrar on first login (no secrets to manage). # # Naming: container_name MUST equal the URL-prefix of the public hostname so # the registrar's redirect-URI allowlist accepts `metafuse-.`. metafuse: image: ghcr.io/yundera/appshield:2.0.9 cpu_shares: 80 container_name: metafuse hostname: metafuse restart: unless-stopped user: "0:0" expose: - 80 environment: OIDC_REGISTRAR_URL: "http://auth-registrar:9092" BACKEND_HOST: "metafuse-app" BACKEND_PORT: "80" LISTEN_PORT: "80" REDIRECT_HOST_SUFFIXES: "${APP_HOST_SUFFIXES:-${APP_DOMAIN},${APP_PUBLIC_IP_DASH}.${APP_IP_ZONE},${APP_PUBLIC_IP_DASH}.sslip.io}" depends_on: - metafuse-app labels: # ---- metafuse-${APP_DOMAIN} (gateway TLS) ---- caddy_0: metafuse-${APP_DOMAIN} caddy_0.import: gateway_tls # Unauthenticated paths bypass the hash-lock proxy and hit the backend directly. caddy_0.0_handle: "/health" caddy_0.0_handle.reverse_proxy: "metafuse-app:80" caddy_0.1_handle: "/webdav*" caddy_0.1_handle.reverse_proxy: "metafuse-app:80" caddy_0.2_handle: "" caddy_0.2_handle.reverse_proxy: "{{upstreams 80}}" # ---- metafuse-IP. (gateway TLS) ---- caddy_1: metafuse-${APP_PUBLIC_IP_DASH}.${APP_IP_ZONE} caddy_1.import: gateway_tls caddy_1.0_handle: "/health" caddy_1.0_handle.reverse_proxy: "metafuse-app:80" caddy_1.1_handle: "/webdav*" caddy_1.1_handle.reverse_proxy: "metafuse-app:80" caddy_1.2_handle: "" caddy_1.2_handle.reverse_proxy: "{{upstreams 80}}" # ---- metafuse-IP.sslip.io (Let's Encrypt) ---- caddy_2: metafuse-${APP_PUBLIC_IP_DASH}.sslip.io caddy_2.0_handle: "/health" caddy_2.0_handle.reverse_proxy: "metafuse-app:80" caddy_2.1_handle: "/webdav*" caddy_2.1_handle.reverse_proxy: "metafuse-app:80" caddy_2.2_handle: "" caddy_2.2_handle.reverse_proxy: "{{upstreams 80}}" networks: - pcs networks: pcs: name: ${APP_NET:-pcs} external: true x-casaos: architectures: - amd64 - arm64 author: Worph Team category: Media developer: Aptero Team description: en_us: | **Access your media library through a beautifully organized virtual filesystem.** MetaFuse creates a virtual view of your media (Movies, TV Shows, Anime) organized by metadata - while your actual files stay exactly where they are. Access via FUSE mount or WebDAV network share. **Key Features:** - **Zero File Movement** - Your files stay in place, MetaFuse creates an organized virtual view - **FUSE Virtual Filesystem** - Mount as a local directory on your system - **WebDAV Network Access** - Access your organized library as a network drive from any device - **Smart Organization** - Files organized by title, year, season, episode automatically - **Real-time Updates** - Virtual filesystem updates instantly when MetaSort processes new files - **Plex/Jellyfin Ready** - Point your media server to the organized virtual library **Requires:** MetaCore (install first) **Perfect for:** Plex/Jellyfin users, media archivists, or anyone wanting an organized view without reorganizing files fr_fr: | **Accedez a votre bibliotheque multimedia via un systeme de fichiers virtuel magnifiquement organise.** MetaFuse cree une vue virtuelle de vos medias (Films, Series TV, Anime) organisee par metadonnees - pendant que vos fichiers restent exactement ou ils sont. Acces via montage FUSE ou partage reseau WebDAV. **Fonctionnalites Cles:** - **Zero Deplacement de Fichiers** - Vos fichiers restent en place, MetaFuse cree une vue virtuelle organisee - **Systeme de Fichiers Virtuel FUSE** - Montez comme un repertoire local sur votre systeme - **Acces Reseau WebDAV** - Accedez a votre bibliotheque organisee comme un lecteur reseau - **Organisation Intelligente** - Fichiers organises par titre, annee, saison, episode automatiquement - **Mises a Jour Temps Reel** - Le systeme virtuel se met a jour instantanement **Necessite:** MetaCore (installer en premier) tagline: en_us: Virtual filesystem for organized media access - FUSE mount and WebDAV without moving files fr_fr: Systeme de fichiers virtuel pour acces media organise - Montage FUSE et WebDAV sans deplacer de fichiers title: en_us: MetaFuse icon: https://gitea-watch.nsl.sh/metastar/MetaAppStore/raw/branch/main/Apps/MetaFuse/icon.png screenshot_link: - https://gitea-watch.nsl.sh/metastar/MetaAppStore/raw/branch/main/Apps/MetaFuse/screenshot-1.png - https://gitea-watch.nsl.sh/metastar/MetaAppStore/raw/branch/main/Apps/MetaFuse/screenshot-2.png - https://gitea-watch.nsl.sh/metastar/MetaAppStore/raw/branch/main/Apps/MetaFuse/screenshot-3.png thumbnail: https://gitea-watch.nsl.sh/metastar/MetaAppStore/raw/branch/main/Apps/MetaFuse/thumbnail.png index: / store_app_id: metafuse main: metafuse is_uncontrolled: false tips: before_install: en_us: | **Requires MetaCore** - Install MetaCore first. MetaFuse connects to MetaCore for metadata. The dashboard is protected by Yundera's built-in Authelia via OIDC — sign in with your existing Yundera account. **FUSE Mount:** Your organized virtual library is exposed on the host at `/DATA/MetaFuse/Library/` — deliberately outside `/DATA/AppData/` so you and other apps (Jellyfin, Plex, Samba, …) can browse it. It is a *virtual* view of records MetaCore already holds, not a second copy of your files. See `rationale.md`. # 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/metacore/meta-core user: $PUID group: $PGID - path: /DATA/AppData/metafuse/config user: $PUID group: $PGID - path: /DATA/MetaFuse/Library user: $PUID group: $PGID # Same string as the caddy_0 label, so the tile link and the route agree. webui-host: metafuse-${domain} webui-path: "/"