Files
MetaAppStore/Apps/MetaFuse/docker-compose.yml
T

217 lines
8.1 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: ghcr.io/worph/meta-fuse:1.1.4
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
# (meta-discovery v1) instead of reading kv-leader.info off a shared
# volume. See docs/project-architecture/service-discovery.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_DOMAIN},${APP_PUBLIC_IP_DASH}.nip.io,${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.nip.io (gateway TLS) ----
caddy_1: metafuse-${APP_PUBLIC_IP_DASH}.nip.io
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://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFuse/icon.png
screenshot_link:
- https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFuse/screenshot-1.png
- https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFuse/screenshot-2.png
- https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFuse/screenshot-3.png
thumbnail: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@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: "/"