217 lines
8.2 KiB
YAML
217 lines
8.2 KiB
YAML
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-<user>.<domain>`.
|
|
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.<IP_ZONE> (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: "/"
|