From e18ff82eeaeb26d8d7f3daab30790d5656760e1d Mon Sep 17 00:00:00 2001 From: VAIO73 <50487331+Vaso73@users.noreply.github.com> Date: Tue, 29 Sep 2026 18:55:18 +0200 Subject: [PATCH] fix(oci): prepare managed volumes across stack installs --- oci/catalog/apps/2fauth.json | 12 +- oci/catalog/apps/actualbudget.json | 12 +- oci/catalog/apps/adguard-home.json | 18 +- oci/catalog/apps/adguardhome-sync.json | 12 +- oci/catalog/apps/airsonic-advanced.json | 32 ++ oci/catalog/apps/albyhub.json | 10 +- oci/catalog/apps/alist-sync.json | 12 +- oci/catalog/apps/alist.json | 12 +- oci/catalog/apps/altus.json | 10 +- oci/catalog/apps/amule.json | 16 +- oci/catalog/apps/anaconda3.json | 10 +- oci/catalog/apps/apprise-api.json | 18 +- oci/catalog/apps/archivebox.json | 10 +- oci/catalog/apps/ardour.json | 10 +- oci/catalog/apps/audacity.json | 10 +- oci/catalog/apps/audiobookshelf.json | 30 +- oci/catalog/apps/autobrr.json | 12 +- oci/catalog/apps/azahar.json | 8 + oci/catalog/apps/babybuddy.json | 12 +- oci/catalog/apps/bambustudio.json | 8 + oci/catalog/apps/bazarr.json | 24 +- oci/catalog/apps/beets.json | 24 +- oci/catalog/apps/bitcoin-knots.json | 12 +- oci/catalog/apps/blade-of-agony.json | 8 + oci/catalog/apps/blender.json | 10 +- oci/catalog/apps/blinko.json | 10 +- oci/catalog/apps/boinc.json | 10 +- oci/catalog/apps/bookstack.json | 12 +- oci/catalog/apps/brave.json | 8 + oci/catalog/apps/budge.json | 12 +- oci/catalog/apps/calibre-web.json | 18 +- oci/catalog/apps/calibre.json | 10 +- oci/catalog/apps/calligra.json | 10 +- oci/catalog/apps/changedetection.io.json | 12 +- oci/catalog/apps/chrome.json | 8 + oci/catalog/apps/chromium.json | 8 + oci/catalog/apps/cloudbeaver.json | 12 +- oci/catalog/apps/cloudflared.json | 12 +- oci/catalog/apps/code-server.json | 12 +- oci/catalog/apps/codeproject-ai.json | 16 +- oci/catalog/apps/convertx.json | 12 +- oci/catalog/apps/cops.json | 18 +- oci/catalog/apps/crafty.json | 36 +- oci/catalog/apps/cura.json | 10 +- oci/catalog/apps/darktable.json | 10 +- oci/catalog/apps/databag.json | 12 +- oci/catalog/apps/davos.json | 18 +- oci/catalog/apps/ddclient.json | 12 +- oci/catalog/apps/ddns-go.json | 12 +- oci/catalog/apps/deluge.json | 18 +- oci/catalog/apps/digikam.json | 8 + oci/catalog/apps/diskover.json | 16 +- oci/catalog/apps/docker-volume-backup.json | 17 +- oci/catalog/apps/dogwalk.json | 8 + oci/catalog/apps/dokuwiki.json | 12 +- oci/catalog/apps/dolphin.json | 8 + oci/catalog/apps/doplarr.json | 12 +- oci/catalog/apps/doplarr_rs.json | 12 +- oci/catalog/apps/dosbox-staging.json | 8 + oci/catalog/apps/doublecommander.json | 16 +- oci/catalog/apps/downtify.json | 18 +- oci/catalog/apps/dsh-harness.json | 12 +- oci/catalog/apps/duckdns.json | 10 +- oci/catalog/apps/duckstation.json | 8 + oci/catalog/apps/duplicati.json | 22 +- oci/catalog/apps/eden.json | 8 + oci/catalog/apps/emby-official.json | 12 + oci/catalog/apps/emby.json | 28 +- oci/catalog/apps/embystat.json | 12 +- oci/catalog/apps/emulatorjs.json | 22 +- oci/catalog/apps/esphome.json | 12 +- oci/catalog/apps/faster-whisper.json | 12 +- oci/catalog/apps/ferdium.json | 10 +- oci/catalog/apps/filedrop.json | 12 +- oci/catalog/apps/fileflows.json | 34 +- oci/catalog/apps/filezilla.json | 10 +- oci/catalog/apps/firefly.json | 10 +- oci/catalog/apps/firefox.json | 8 + oci/catalog/apps/flexget.json | 18 +- oci/catalog/apps/flycast.json | 8 + oci/catalog/apps/foldingathome.json | 12 +- oci/catalog/apps/freecad.json | 10 +- oci/catalog/apps/freshrss-official.json | 18 +- oci/catalog/apps/freshrss.json | 12 +- oci/catalog/apps/frigate.json | 14 + oci/catalog/apps/gateway-go.json | 12 +- oci/catalog/apps/gimp.json | 10 +- oci/catalog/apps/gitea.json | 12 +- oci/catalog/apps/github-desktop.json | 10 +- oci/catalog/apps/gitqlient.json | 10 +- oci/catalog/apps/gopeed.json | 18 +- oci/catalog/apps/grav.json | 12 +- oci/catalog/apps/grocy.json | 12 +- oci/catalog/apps/gzdoom.json | 8 + oci/catalog/apps/habridge.json | 12 +- oci/catalog/apps/healthchecks.json | 12 +- oci/catalog/apps/hedgedoc.json | 12 +- oci/catalog/apps/heimdall.json | 12 +- oci/catalog/apps/helium.json | 8 + oci/catalog/apps/hermes.json | 10 +- oci/catalog/apps/homeassistant-official.json | 10 +- oci/catalog/apps/homeassistant.json | 10 +- oci/catalog/apps/homebridge.json | 12 +- oci/catalog/apps/htpcmanager.json | 12 +- oci/catalog/apps/immich.json | 10 + oci/catalog/apps/inkscape.json | 10 +- oci/catalog/apps/intellij-idea.json | 8 + oci/catalog/apps/jackett.json | 18 +- oci/catalog/apps/jdownloader.json | 6 + oci/catalog/apps/jellyfin-official.json | 22 +- oci/catalog/apps/jellyfin.json | 22 +- oci/catalog/apps/jellyseerr.json | 10 +- oci/catalog/apps/joplin.json | 8 + oci/catalog/apps/kali-linux.json | 10 +- oci/catalog/apps/karakeep.json | 12 +- oci/catalog/apps/kasm.json | 16 +- oci/catalog/apps/kavita-jvmilazz0.json | 18 +- oci/catalog/apps/kavita.json | 18 +- oci/catalog/apps/kdenlive.json | 10 +- oci/catalog/apps/keepassxc.json | 10 +- oci/catalog/apps/kicad.json | 10 +- oci/catalog/apps/kimai.json | 10 +- oci/catalog/apps/kometa.json | 12 +- oci/catalog/apps/komga.json | 24 +- oci/catalog/apps/krita.json | 10 +- oci/catalog/apps/label-studio.json | 12 +- oci/catalog/apps/lazylibrarian.json | 24 +- oci/catalog/apps/libredb-studio.json | 10 +- oci/catalog/apps/libreoffice.json | 10 +- oci/catalog/apps/librespeed.json | 12 +- oci/catalog/apps/librewolf.json | 10 +- oci/catalog/apps/lidarr.json | 24 +- oci/catalog/apps/limnoria.json | 12 +- oci/catalog/apps/linkwarden.json | 10 +- oci/catalog/apps/lm-studio.json | 8 + oci/catalog/apps/logseq.json | 16 +- oci/catalog/apps/lollypop.json | 10 +- oci/catalog/apps/luanti.json | 12 +- oci/catalog/apps/lucky.json | 12 +- oci/catalog/apps/lychee.json | 18 +- oci/catalog/apps/lyrionmusicserver.json | 36 +- oci/catalog/apps/mame.json | 14 + oci/catalog/apps/manyfold.json | 18 +- oci/catalog/apps/mariadb.json | 12 +- oci/catalog/apps/mastodon.json | 12 +- oci/catalog/apps/mediaelch.json | 10 +- oci/catalog/apps/medusa-official.json | 24 +- oci/catalog/apps/medusa.json | 24 +- oci/catalog/apps/melonds.json | 8 + oci/catalog/apps/memos.json | 12 +- oci/catalog/apps/mineos-node.json | 12 +- oci/catalog/apps/minisatip.json | 8 + oci/catalog/apps/mongodb.json | 18 +- oci/catalog/apps/mongodb4.json | 18 +- oci/catalog/apps/monica-official.json | 10 +- oci/catalog/apps/monica.json | 12 +- oci/catalog/apps/msedge.json | 10 +- oci/catalog/apps/mstream.json | 18 +- oci/catalog/apps/mullvad-browser.json | 10 +- oci/catalog/apps/mylar3.json | 24 +- oci/catalog/apps/myspeed.json | 12 +- oci/catalog/apps/mysql-workbench.json | 10 +- oci/catalog/apps/navidrome.json | 18 +- oci/catalog/apps/netbird.json | 10 +- oci/catalog/apps/netbox.json | 12 +- oci/catalog/apps/netdata.json | 22 +- oci/catalog/apps/nextcloud-official.json | 12 +- oci/catalog/apps/nextcloud-stack.json | 10 + oci/catalog/apps/nextcloud.json | 18 +- oci/catalog/apps/nginx.json | 12 +- oci/catalog/apps/nginxproxymanager.json | 18 +- oci/catalog/apps/ngircd.json | 12 +- oci/catalog/apps/nzbfast.json | 24 +- oci/catalog/apps/nzbget.json | 18 +- oci/catalog/apps/nzbhydra2.json | 18 +- oci/catalog/apps/obsidian.json | 10 +- oci/catalog/apps/ollama.json | 10 +- oci/catalog/apps/ombi.json | 12 +- oci/catalog/apps/onlyoffice.json | 8 + oci/catalog/apps/open-webui-cuda.json | 10 +- oci/catalog/apps/open-webui-ollama.json | 14 + oci/catalog/apps/open-webui.json | 8 + oci/catalog/apps/openhab.json | 36 +- oci/catalog/apps/openhands.json | 14 + oci/catalog/apps/openshot.json | 10 +- oci/catalog/apps/openssh-server.json | 10 +- oci/catalog/apps/openvscode-server.json | 12 +- oci/catalog/apps/opera.json | 10 +- oci/catalog/apps/opodsync.json | 12 +- oci/catalog/apps/orcaslicer.json | 8 + oci/catalog/apps/oscam.json | 8 + oci/catalog/apps/overseerr.json | 12 +- oci/catalog/apps/paperless-ngx.json | 28 ++ oci/catalog/apps/pcsx2.json | 8 + oci/catalog/apps/pelorus.json | 10 +- oci/catalog/apps/petio.json | 16 +- oci/catalog/apps/photoprism.json | 18 +- oci/catalog/apps/phpmyadmin.json | 12 +- oci/catalog/apps/pidgin.json | 10 +- oci/catalog/apps/pihole.json | 10 +- oci/catalog/apps/pinchflat.json | 18 +- oci/catalog/apps/pingvin-share.json | 18 +- oci/catalog/apps/piper.json | 12 +- oci/catalog/apps/piwigo.json | 18 +- oci/catalog/apps/planka.json | 12 +- oci/catalog/apps/plex-official.json | 22 +- oci/catalog/apps/plex.json | 22 +- oci/catalog/apps/pocketbase.json | 12 +- oci/catalog/apps/podfetch.json | 18 +- oci/catalog/apps/portainer.json | 12 +- oci/catalog/apps/postgresql.json | 12 +- oci/catalog/apps/ppsspp.json | 8 + oci/catalog/apps/projectsend.json | 18 +- oci/catalog/apps/prowlarr.json | 12 +- oci/catalog/apps/pwndrop.json | 12 +- oci/catalog/apps/pycharm.json | 8 + oci/catalog/apps/pydio-cells.json | 10 +- oci/catalog/apps/pyload-ng.json | 18 +- oci/catalog/apps/qbittorrent-hotio.json | 18 +- oci/catalog/apps/qbittorrent.json | 18 +- oci/catalog/apps/qdirstat.json | 16 +- oci/catalog/apps/qui.json | 10 +- oci/catalog/apps/radarr.json | 24 +- oci/catalog/apps/raneto.json | 12 +- oci/catalog/apps/rawtherapee.json | 10 +- oci/catalog/apps/rclone.json | 6 + oci/catalog/apps/rdtclient.json | 16 +- oci/catalog/apps/readarr.json | 24 +- oci/catalog/apps/remmina.json | 8 + oci/catalog/apps/resilio-sync.json | 24 +- oci/catalog/apps/retroarch.json | 8 + oci/catalog/apps/romm.json | 34 +- oci/catalog/apps/roonserver.json | 22 +- oci/catalog/apps/rpcs3.json | 8 + oci/catalog/apps/rsnapshot.json | 24 +- oci/catalog/apps/rustdesk.json | 10 +- oci/catalog/apps/sabnzbd.json | 24 +- oci/catalog/apps/scummvm.json | 10 +- oci/catalog/apps/sealskin.json | 24 +- oci/catalog/apps/shadps4.json | 8 + oci/catalog/apps/shotcut.json | 10 +- oci/catalog/apps/sickchill.json | 24 +- oci/catalog/apps/sickgear.json | 24 +- oci/catalog/apps/signal.json | 8 + oci/catalog/apps/siyuan-note.json | 10 +- oci/catalog/apps/smokeping.json | 16 +- oci/catalog/apps/snapdrop.json | 12 +- oci/catalog/apps/snapotter.json | 16 +- oci/catalog/apps/sonarr.json | 24 +- oci/catalog/apps/speedtest-tracker.json | 12 +- oci/catalog/apps/spotube.json | 10 +- oci/catalog/apps/sqlitebrowser.json | 10 +- .../apps/stable-diffusion-webui-nvidia.json | 22 +- oci/catalog/apps/steam.json | 10 +- oci/catalog/apps/stremio.json | 10 +- oci/catalog/apps/suite-arr.json | 10 +- oci/catalog/apps/swag.json | 10 +- oci/catalog/apps/swingmusic.json | 18 +- oci/catalog/apps/syncthing.json | 22 +- oci/catalog/apps/syslog-ng.json | 18 +- oci/catalog/apps/tailscale.json | 10 +- oci/catalog/apps/tandoor.json | 17 +- oci/catalog/apps/tautulli.json | 12 +- oci/catalog/apps/tdarr.json | 28 +- oci/catalog/apps/teable.json | 10 +- oci/catalog/apps/telegram.json | 8 + oci/catalog/apps/thelounge.json | 12 +- oci/catalog/apps/threadfin.json | 18 +- oci/catalog/apps/thunderbird.json | 8 + oci/catalog/apps/transmission.json | 24 +- oci/catalog/apps/trilium.json | 10 +- oci/catalog/apps/tvheadend.json | 16 +- oci/catalog/apps/ubooquity.json | 30 +- oci/catalog/apps/ungoogled-chromium.json | 10 +- oci/catalog/apps/unifi-controller.json | 12 +- .../apps/unifi-network-application.json | 12 +- oci/catalog/apps/unpackerr.json | 14 + oci/catalog/apps/uptimekuma.json | 12 +- oci/catalog/apps/v2raya.json | 10 +- oci/catalog/apps/vaultwarden.json | 10 +- oci/catalog/apps/virt-manager.json | 20 + oci/catalog/apps/vivaldi.json | 8 + oci/catalog/apps/vlc.json | 8 + oci/catalog/apps/vocechat.json | 12 +- oci/catalog/apps/vscode.json | 10 +- oci/catalog/apps/vscodium-web.json | 12 +- oci/catalog/apps/vscodium.json | 10 +- oci/catalog/apps/wallabag.json | 10 +- oci/catalog/apps/webcord.json | 10 +- oci/catalog/apps/webgrabplus.json | 16 +- oci/catalog/apps/webstation.json | 10 +- oci/catalog/apps/webtop.json | 8 + oci/catalog/apps/weixin.json | 8 + oci/catalog/apps/wg-easy.json | 10 +- oci/catalog/apps/wikijs.json | 18 +- oci/catalog/apps/winegui.json | 8 + oci/catalog/apps/wireguard.json | 10 +- oci/catalog/apps/wireshark.json | 10 +- oci/catalog/apps/wps-office.json | 10 +- oci/catalog/apps/xbackbone.json | 12 +- oci/catalog/apps/xemu.json | 8 + oci/catalog/apps/yaak.json | 10 +- oci/catalog/apps/zen.json | 8 + oci/catalog/apps/znc.json | 12 +- oci/catalog/apps/zotero.json | 10 +- oci/catalog/apps/ztnet.json | 10 +- oci/catalog/curated/amule.json | 16 +- oci/catalog/curated/codeproject-ai.json | 16 +- oci/catalog/curated/docker-volume-backup.json | 17 +- oci/catalog/curated/emby-official.json | 12 + oci/catalog/curated/fileflows.json | 34 +- oci/catalog/curated/frigate.json | 14 + oci/catalog/curated/jdownloader.json | 6 + oci/catalog/curated/jellyfin-official.json | 22 +- oci/catalog/curated/open-webui-cuda.json | 10 +- oci/catalog/curated/open-webui-ollama.json | 16 +- oci/catalog/curated/open-webui.json | 10 +- oci/catalog/curated/plex-official.json | 22 +- oci/catalog/curated/rclone.json | 6 + oci/catalog/curated/roonserver.json | 20 + oci/catalog/curated/stremio.json | 10 +- oci/catalog/curated/suite-arr.json | 10 +- oci/catalog/curated/tandoor.json | 17 +- oci/catalog/curated/tdarr.json | 28 +- oci/catalog/curated/unpackerr.json | 14 + oci/catalog/overlays/actualbudget.json | 14 + oci/catalog/overlays/adguard-home.json | 20 + oci/catalog/overlays/adguardhome-sync.json | 10 +- oci/catalog/overlays/airsonic-advanced.json | 36 ++ oci/catalog/overlays/albyhub.json | 14 + oci/catalog/overlays/alist-sync.json | 12 + oci/catalog/overlays/alist.json | 12 + oci/catalog/overlays/altus.json | 10 +- oci/catalog/overlays/amule.json | 18 +- oci/catalog/overlays/anaconda3.json | 10 +- oci/catalog/overlays/apprise-api.json | 20 + oci/catalog/overlays/archivebox.json | 12 + oci/catalog/overlays/ardour.json | 10 +- oci/catalog/overlays/audacity.json | 10 +- oci/catalog/overlays/audiobookshelf.json | 32 ++ oci/catalog/overlays/autobrr.json | 14 + oci/catalog/overlays/azahar.json | 14 + oci/catalog/overlays/babybuddy.json | 12 + oci/catalog/overlays/bambustudio.json | 14 + oci/catalog/overlays/bazarr.json | 26 ++ oci/catalog/overlays/beets.json | 26 ++ oci/catalog/overlays/bitcoin-knots.json | 14 + oci/catalog/overlays/blade-of-agony.json | 14 + oci/catalog/overlays/blender.json | 10 +- oci/catalog/overlays/blinko.json | 14 + oci/catalog/overlays/boinc.json | 10 +- oci/catalog/overlays/bookstack.json | 10 +- oci/catalog/overlays/brave.json | 14 + oci/catalog/overlays/budge.json | 14 + oci/catalog/overlays/calibre-web.json | 20 + oci/catalog/overlays/calibre.json | 10 +- oci/catalog/overlays/calligra.json | 10 +- oci/catalog/overlays/changedetection.io.json | 14 + oci/catalog/overlays/chrome.json | 14 + oci/catalog/overlays/chromium.json | 14 + oci/catalog/overlays/cloudbeaver.json | 14 + oci/catalog/overlays/cloudflared.json | 14 + oci/catalog/overlays/code-server.json | 14 + oci/catalog/overlays/codeproject-ai.json | 20 + oci/catalog/overlays/convertx.json | 14 + oci/catalog/overlays/cops.json | 20 + oci/catalog/overlays/cura.json | 10 +- oci/catalog/overlays/darktable.json | 10 +- oci/catalog/overlays/databag.json | 14 + oci/catalog/overlays/davos.json | 20 + oci/catalog/overlays/ddclient.json | 8 + oci/catalog/overlays/ddns-go.json | 14 + oci/catalog/overlays/deluge.json | 20 + oci/catalog/overlays/digikam.json | 14 + oci/catalog/overlays/diskover.json | 18 +- .../overlays/docker-volume-backup.json | 20 + oci/catalog/overlays/dogwalk.json | 14 + oci/catalog/overlays/dokuwiki.json | 14 + oci/catalog/overlays/dolphin.json | 14 + oci/catalog/overlays/doplarr.json | 12 + oci/catalog/overlays/doplarr_rs.json | 8 + oci/catalog/overlays/dosbox-staging.json | 14 + oci/catalog/overlays/doublecommander.json | 16 +- oci/catalog/overlays/downtify.json | 20 + oci/catalog/overlays/dsh-harness.json | 14 + oci/catalog/overlays/duckdns.json | 8 + oci/catalog/overlays/duckstation.json | 14 + oci/catalog/overlays/duplicati.json | 22 +- oci/catalog/overlays/eden.json | 14 + oci/catalog/overlays/emby-official.json | 20 + oci/catalog/overlays/emby.json | 32 ++ oci/catalog/overlays/embystat.json | 14 + oci/catalog/overlays/emulatorjs.json | 26 ++ oci/catalog/overlays/esphome.json | 14 + oci/catalog/overlays/faster-whisper.json | 14 + oci/catalog/overlays/ferdium.json | 10 +- oci/catalog/overlays/filedrop.json | 14 + oci/catalog/overlays/fileflows.json | 38 ++ oci/catalog/overlays/filezilla.json | 10 +- oci/catalog/overlays/firefly.json | 14 + oci/catalog/overlays/firefox.json | 14 + oci/catalog/overlays/flexget.json | 16 +- oci/catalog/overlays/flycast.json | 14 + oci/catalog/overlays/foldingathome.json | 14 + oci/catalog/overlays/freecad.json | 10 +- oci/catalog/overlays/freshrss-official.json | 20 + oci/catalog/overlays/freshrss.json | 14 + oci/catalog/overlays/frigate.json | 20 + oci/catalog/overlays/gateway-go.json | 14 + oci/catalog/overlays/gimp.json | 10 +- oci/catalog/overlays/gitea.json | 14 + oci/catalog/overlays/github-desktop.json | 10 +- oci/catalog/overlays/gitqlient.json | 10 +- oci/catalog/overlays/gopeed.json | 20 + oci/catalog/overlays/grav.json | 14 + oci/catalog/overlays/grocy.json | 12 + oci/catalog/overlays/gzdoom.json | 14 + oci/catalog/overlays/habridge.json | 14 + oci/catalog/overlays/healthchecks.json | 14 + oci/catalog/overlays/hedgedoc.json | 12 + oci/catalog/overlays/heimdall.json | 14 + oci/catalog/overlays/helium.json | 14 + oci/catalog/overlays/hermes.json | 10 +- .../overlays/homeassistant-official.json | 14 + oci/catalog/overlays/homeassistant.json | 14 + oci/catalog/overlays/homebridge.json | 12 + oci/catalog/overlays/htpcmanager.json | 14 + oci/catalog/overlays/immich.json | 14 + oci/catalog/overlays/inkscape.json | 10 +- oci/catalog/overlays/intellij-idea.json | 14 + oci/catalog/overlays/jackett.json | 20 + oci/catalog/overlays/jdownloader.json | 14 + oci/catalog/overlays/jellyfin-official.json | 26 ++ oci/catalog/overlays/jellyfin.json | 22 +- oci/catalog/overlays/jellyseerr.json | 14 + oci/catalog/overlays/joplin.json | 14 + oci/catalog/overlays/kali-linux.json | 10 +- oci/catalog/overlays/karakeep.json | 12 + oci/catalog/overlays/kasm.json | 20 + oci/catalog/overlays/kavita-jvmilazz0.json | 20 + oci/catalog/overlays/kavita.json | 20 + oci/catalog/overlays/kdenlive.json | 10 +- oci/catalog/overlays/keepassxc.json | 10 +- oci/catalog/overlays/kicad.json | 10 +- oci/catalog/overlays/kimai.json | 15 +- oci/catalog/overlays/kometa.json | 8 + oci/catalog/overlays/komga.json | 26 ++ oci/catalog/overlays/krita.json | 10 +- oci/catalog/overlays/label-studio.json | 14 + oci/catalog/overlays/lazylibrarian.json | 26 ++ oci/catalog/overlays/libredb-studio.json | 10 +- oci/catalog/overlays/libreoffice.json | 10 +- oci/catalog/overlays/librespeed.json | 14 + oci/catalog/overlays/librewolf.json | 10 +- oci/catalog/overlays/lidarr.json | 26 ++ oci/catalog/overlays/limnoria.json | 8 + oci/catalog/overlays/linkwarden.json | 21 +- oci/catalog/overlays/lm-studio.json | 14 + oci/catalog/overlays/logseq.json | 20 + oci/catalog/overlays/lollypop.json | 10 +- oci/catalog/overlays/luanti.json | 14 + oci/catalog/overlays/lucky.json | 12 + oci/catalog/overlays/lychee.json | 20 + oci/catalog/overlays/lyrionmusicserver.json | 38 ++ oci/catalog/overlays/mame.json | 20 + oci/catalog/overlays/manyfold.json | 20 + oci/catalog/overlays/mariadb.json | 14 + oci/catalog/overlays/mastodon.json | 12 + oci/catalog/overlays/mediaelch.json | 10 +- oci/catalog/overlays/medusa-official.json | 26 ++ oci/catalog/overlays/medusa.json | 26 ++ oci/catalog/overlays/melonds.json | 14 + oci/catalog/overlays/memos.json | 12 + oci/catalog/overlays/mineos-node.json | 10 +- oci/catalog/overlays/minisatip.json | 14 + oci/catalog/overlays/mongodb.json | 20 + oci/catalog/overlays/mongodb4.json | 18 +- oci/catalog/overlays/monica-official.json | 30 +- oci/catalog/overlays/monica.json | 12 + oci/catalog/overlays/msedge.json | 10 +- oci/catalog/overlays/mstream.json | 20 + oci/catalog/overlays/mullvad-browser.json | 10 +- oci/catalog/overlays/mylar3.json | 26 ++ oci/catalog/overlays/myspeed.json | 14 + oci/catalog/overlays/mysql-workbench.json | 10 +- oci/catalog/overlays/navidrome.json | 20 + oci/catalog/overlays/netbird.json | 14 + oci/catalog/overlays/netbox.json | 12 + oci/catalog/overlays/netdata.json | 22 +- oci/catalog/overlays/nextcloud-official.json | 14 + oci/catalog/overlays/nextcloud-stack.json | 14 + oci/catalog/overlays/nextcloud.json | 20 + oci/catalog/overlays/nginx.json | 14 + oci/catalog/overlays/nginxproxymanager.json | 20 + oci/catalog/overlays/ngircd.json | 14 + oci/catalog/overlays/nzbfast.json | 26 ++ oci/catalog/overlays/nzbget.json | 18 + oci/catalog/overlays/nzbhydra2.json | 20 + oci/catalog/overlays/obsidian.json | 10 +- oci/catalog/overlays/ollama.json | 43 +- oci/catalog/overlays/ombi.json | 14 + oci/catalog/overlays/onlyoffice.json | 14 + oci/catalog/overlays/open-webui-cuda.json | 14 + oci/catalog/overlays/open-webui-ollama.json | 20 + oci/catalog/overlays/open-webui.json | 14 + oci/catalog/overlays/openhab.json | 38 ++ oci/catalog/overlays/openhands.json | 18 + oci/catalog/overlays/openshot.json | 10 +- oci/catalog/overlays/openssh-server.json | 10 +- oci/catalog/overlays/openvscode-server.json | 12 + oci/catalog/overlays/opera.json | 10 +- oci/catalog/overlays/opodsync.json | 14 + oci/catalog/overlays/orcaslicer.json | 14 + oci/catalog/overlays/oscam.json | 14 + oci/catalog/overlays/overseerr.json | 14 + oci/catalog/overlays/paperless-ngx.json | 32 ++ oci/catalog/overlays/pcsx2.json | 14 + oci/catalog/overlays/pelorus.json | 10 +- oci/catalog/overlays/petio.json | 21 +- oci/catalog/overlays/photoprism.json | 16 +- oci/catalog/overlays/phpmyadmin.json | 8 + oci/catalog/overlays/pidgin.json | 10 +- oci/catalog/overlays/pihole.json | 14 + oci/catalog/overlays/pinchflat.json | 20 + oci/catalog/overlays/pingvin-share.json | 20 + oci/catalog/overlays/piper.json | 14 + oci/catalog/overlays/piwigo.json | 20 + oci/catalog/overlays/planka.json | 12 + oci/catalog/overlays/plex-official.json | 26 ++ oci/catalog/overlays/plex.json | 114 ++++-- oci/catalog/overlays/pocketbase.json | 8 + oci/catalog/overlays/podfetch.json | 20 + oci/catalog/overlays/portainer.json | 12 + oci/catalog/overlays/postgresql.json | 8 + oci/catalog/overlays/ppsspp.json | 14 + oci/catalog/overlays/projectsend.json | 20 + oci/catalog/overlays/prowlarr.json | 14 + oci/catalog/overlays/pwndrop.json | 14 + oci/catalog/overlays/pycharm.json | 14 + oci/catalog/overlays/pydio-cells.json | 8 + oci/catalog/overlays/pyload-ng.json | 18 + oci/catalog/overlays/qbittorrent-hotio.json | 18 + oci/catalog/overlays/qbittorrent.json | 20 + oci/catalog/overlays/qdirstat.json | 16 +- oci/catalog/overlays/qui.json | 14 + oci/catalog/overlays/radarr.json | 26 ++ oci/catalog/overlays/raneto.json | 12 + oci/catalog/overlays/rawtherapee.json | 10 +- oci/catalog/overlays/rclone.json | 14 + oci/catalog/overlays/rdtclient.json | 20 + oci/catalog/overlays/readarr.json | 24 ++ oci/catalog/overlays/remmina.json | 14 + oci/catalog/overlays/resilio-sync.json | 26 ++ oci/catalog/overlays/retroarch.json | 14 + oci/catalog/overlays/romm.json | 93 ++++- oci/catalog/overlays/roonserver.json | 26 ++ oci/catalog/overlays/rpcs3.json | 14 + oci/catalog/overlays/rsnapshot.json | 20 + oci/catalog/overlays/rustdesk.json | 10 +- oci/catalog/overlays/sabnzbd.json | 26 ++ oci/catalog/overlays/scummvm.json | 14 + oci/catalog/overlays/sealskin.json | 24 ++ oci/catalog/overlays/shadps4.json | 14 + oci/catalog/overlays/shotcut.json | 10 +- oci/catalog/overlays/sickchill.json | 26 ++ oci/catalog/overlays/sickgear.json | 26 ++ oci/catalog/overlays/signal.json | 14 + oci/catalog/overlays/siyuan-note.json | 12 + oci/catalog/overlays/smokeping.json | 20 + oci/catalog/overlays/snapdrop.json | 14 + oci/catalog/overlays/snapotter.json | 16 +- oci/catalog/overlays/sonarr.json | 26 ++ oci/catalog/overlays/speedtest-tracker.json | 10 +- oci/catalog/overlays/spotube.json | 10 +- oci/catalog/overlays/sqlitebrowser.json | 10 +- .../stable-diffusion-webui-nvidia.json | 26 ++ oci/catalog/overlays/steam.json | 14 + oci/catalog/overlays/stremio.json | 14 + oci/catalog/overlays/suite-arr.json | 14 + oci/catalog/overlays/swag.json | 8 + oci/catalog/overlays/swingmusic.json | 20 + oci/catalog/overlays/syncthing.json | 26 ++ oci/catalog/overlays/syslog-ng.json | 20 + oci/catalog/overlays/tailscale.json | 14 + oci/catalog/overlays/tandoor.json | 20 + oci/catalog/overlays/tautulli.json | 14 + oci/catalog/overlays/tdarr.json | 32 ++ oci/catalog/overlays/teable.json | 29 +- oci/catalog/overlays/telegram.json | 14 + oci/catalog/overlays/thelounge.json | 8 + oci/catalog/overlays/threadfin.json | 20 + oci/catalog/overlays/thunderbird.json | 14 + oci/catalog/overlays/transmission.json | 26 ++ oci/catalog/overlays/trilium.json | 14 + oci/catalog/overlays/tvheadend.json | 20 + oci/catalog/overlays/ubooquity.json | 32 ++ oci/catalog/overlays/ungoogled-chromium.json | 10 +- oci/catalog/overlays/unifi-controller.json | 14 + .../overlays/unifi-network-application.json | 12 + oci/catalog/overlays/unpackerr.json | 14 + oci/catalog/overlays/uptimekuma.json | 14 + oci/catalog/overlays/v2raya.json | 14 + oci/catalog/overlays/vaultwarden.json | 10 +- oci/catalog/overlays/virt-manager.json | 24 ++ oci/catalog/overlays/vivaldi.json | 14 + oci/catalog/overlays/vlc.json | 14 + oci/catalog/overlays/vocechat.json | 14 + oci/catalog/overlays/vscode.json | 14 + oci/catalog/overlays/vscodium-web.json | 14 + oci/catalog/overlays/vscodium.json | 14 + oci/catalog/overlays/wallabag.json | 8 + oci/catalog/overlays/webcord.json | 10 +- oci/catalog/overlays/webgrabplus.json | 20 + oci/catalog/overlays/webstation.json | 10 +- oci/catalog/overlays/webtop.json | 14 + oci/catalog/overlays/weixin.json | 14 + oci/catalog/overlays/wg-easy.json | 8 + oci/catalog/overlays/wikijs.json | 20 + oci/catalog/overlays/winegui.json | 14 + oci/catalog/overlays/wireguard.json | 8 + oci/catalog/overlays/wireshark.json | 10 +- oci/catalog/overlays/wps-office.json | 10 +- oci/catalog/overlays/xbackbone.json | 14 + oci/catalog/overlays/xemu.json | 14 + oci/catalog/overlays/yaak.json | 10 +- oci/catalog/overlays/zen.json | 14 + oci/catalog/overlays/znc.json | 12 + oci/catalog/overlays/zotero.json | 10 +- oci/catalog/overlays/ztnet.json | 12 + oci/remote/install_generic_stack.py | 130 +++++- oci/remote/install_oci.sh | 12 +- oci/src/proxmenux_oci/stack.py | 33 +- ...stack_attach_mounts_volume_preparations.py | 373 ++++++++++++++++++ oci/tests/test_stack_volume_preparations.py | 140 +++++++ oci/tests/test_volume_preparations_curated.py | 80 ++++ 635 files changed, 9804 insertions(+), 400 deletions(-) create mode 100644 oci/catalog/overlays/actualbudget.json create mode 100644 oci/catalog/overlays/adguard-home.json create mode 100644 oci/catalog/overlays/albyhub.json create mode 100644 oci/catalog/overlays/apprise-api.json create mode 100644 oci/catalog/overlays/audiobookshelf.json create mode 100644 oci/catalog/overlays/autobrr.json create mode 100644 oci/catalog/overlays/azahar.json create mode 100644 oci/catalog/overlays/bambustudio.json create mode 100644 oci/catalog/overlays/bazarr.json create mode 100644 oci/catalog/overlays/beets.json create mode 100644 oci/catalog/overlays/bitcoin-knots.json create mode 100644 oci/catalog/overlays/blade-of-agony.json create mode 100644 oci/catalog/overlays/blinko.json create mode 100644 oci/catalog/overlays/brave.json create mode 100644 oci/catalog/overlays/budge.json create mode 100644 oci/catalog/overlays/calibre-web.json create mode 100644 oci/catalog/overlays/changedetection.io.json create mode 100644 oci/catalog/overlays/chrome.json create mode 100644 oci/catalog/overlays/chromium.json create mode 100644 oci/catalog/overlays/cloudbeaver.json create mode 100644 oci/catalog/overlays/cloudflared.json create mode 100644 oci/catalog/overlays/code-server.json create mode 100644 oci/catalog/overlays/codeproject-ai.json create mode 100644 oci/catalog/overlays/convertx.json create mode 100644 oci/catalog/overlays/cops.json create mode 100644 oci/catalog/overlays/databag.json create mode 100644 oci/catalog/overlays/davos.json create mode 100644 oci/catalog/overlays/ddns-go.json create mode 100644 oci/catalog/overlays/deluge.json create mode 100644 oci/catalog/overlays/digikam.json create mode 100644 oci/catalog/overlays/docker-volume-backup.json create mode 100644 oci/catalog/overlays/dogwalk.json create mode 100644 oci/catalog/overlays/dokuwiki.json create mode 100644 oci/catalog/overlays/dolphin.json create mode 100644 oci/catalog/overlays/dosbox-staging.json create mode 100644 oci/catalog/overlays/downtify.json create mode 100644 oci/catalog/overlays/dsh-harness.json create mode 100644 oci/catalog/overlays/duckstation.json create mode 100644 oci/catalog/overlays/eden.json create mode 100644 oci/catalog/overlays/emby-official.json create mode 100644 oci/catalog/overlays/emby.json create mode 100644 oci/catalog/overlays/embystat.json create mode 100644 oci/catalog/overlays/emulatorjs.json create mode 100644 oci/catalog/overlays/esphome.json create mode 100644 oci/catalog/overlays/faster-whisper.json create mode 100644 oci/catalog/overlays/filedrop.json create mode 100644 oci/catalog/overlays/fileflows.json create mode 100644 oci/catalog/overlays/firefly.json create mode 100644 oci/catalog/overlays/firefox.json create mode 100644 oci/catalog/overlays/flycast.json create mode 100644 oci/catalog/overlays/foldingathome.json create mode 100644 oci/catalog/overlays/freshrss-official.json create mode 100644 oci/catalog/overlays/freshrss.json create mode 100644 oci/catalog/overlays/frigate.json create mode 100644 oci/catalog/overlays/gateway-go.json create mode 100644 oci/catalog/overlays/gitea.json create mode 100644 oci/catalog/overlays/gopeed.json create mode 100644 oci/catalog/overlays/grav.json create mode 100644 oci/catalog/overlays/gzdoom.json create mode 100644 oci/catalog/overlays/habridge.json create mode 100644 oci/catalog/overlays/healthchecks.json create mode 100644 oci/catalog/overlays/heimdall.json create mode 100644 oci/catalog/overlays/helium.json create mode 100644 oci/catalog/overlays/homeassistant-official.json create mode 100644 oci/catalog/overlays/homeassistant.json create mode 100644 oci/catalog/overlays/htpcmanager.json create mode 100644 oci/catalog/overlays/immich.json create mode 100644 oci/catalog/overlays/intellij-idea.json create mode 100644 oci/catalog/overlays/jackett.json create mode 100644 oci/catalog/overlays/jdownloader.json create mode 100644 oci/catalog/overlays/jellyfin-official.json create mode 100644 oci/catalog/overlays/jellyseerr.json create mode 100644 oci/catalog/overlays/joplin.json create mode 100644 oci/catalog/overlays/kasm.json create mode 100644 oci/catalog/overlays/kavita-jvmilazz0.json create mode 100644 oci/catalog/overlays/kavita.json create mode 100644 oci/catalog/overlays/komga.json create mode 100644 oci/catalog/overlays/label-studio.json create mode 100644 oci/catalog/overlays/lazylibrarian.json create mode 100644 oci/catalog/overlays/librespeed.json create mode 100644 oci/catalog/overlays/lidarr.json create mode 100644 oci/catalog/overlays/lm-studio.json create mode 100644 oci/catalog/overlays/logseq.json create mode 100644 oci/catalog/overlays/luanti.json create mode 100644 oci/catalog/overlays/lychee.json create mode 100644 oci/catalog/overlays/lyrionmusicserver.json create mode 100644 oci/catalog/overlays/mame.json create mode 100644 oci/catalog/overlays/manyfold.json create mode 100644 oci/catalog/overlays/mariadb.json create mode 100644 oci/catalog/overlays/medusa-official.json create mode 100644 oci/catalog/overlays/medusa.json create mode 100644 oci/catalog/overlays/melonds.json create mode 100644 oci/catalog/overlays/minisatip.json create mode 100644 oci/catalog/overlays/mongodb.json create mode 100644 oci/catalog/overlays/mstream.json create mode 100644 oci/catalog/overlays/mylar3.json create mode 100644 oci/catalog/overlays/myspeed.json create mode 100644 oci/catalog/overlays/navidrome.json create mode 100644 oci/catalog/overlays/netbird.json create mode 100644 oci/catalog/overlays/nextcloud-official.json create mode 100644 oci/catalog/overlays/nextcloud-stack.json create mode 100644 oci/catalog/overlays/nextcloud.json create mode 100644 oci/catalog/overlays/nginx.json create mode 100644 oci/catalog/overlays/nginxproxymanager.json create mode 100644 oci/catalog/overlays/ngircd.json create mode 100644 oci/catalog/overlays/nzbfast.json create mode 100644 oci/catalog/overlays/nzbhydra2.json create mode 100644 oci/catalog/overlays/ombi.json create mode 100644 oci/catalog/overlays/onlyoffice.json create mode 100644 oci/catalog/overlays/open-webui-cuda.json create mode 100644 oci/catalog/overlays/open-webui-ollama.json create mode 100644 oci/catalog/overlays/open-webui.json create mode 100644 oci/catalog/overlays/openhab.json create mode 100644 oci/catalog/overlays/opodsync.json create mode 100644 oci/catalog/overlays/orcaslicer.json create mode 100644 oci/catalog/overlays/oscam.json create mode 100644 oci/catalog/overlays/overseerr.json create mode 100644 oci/catalog/overlays/paperless-ngx.json create mode 100644 oci/catalog/overlays/pcsx2.json create mode 100644 oci/catalog/overlays/pihole.json create mode 100644 oci/catalog/overlays/pinchflat.json create mode 100644 oci/catalog/overlays/pingvin-share.json create mode 100644 oci/catalog/overlays/piper.json create mode 100644 oci/catalog/overlays/piwigo.json create mode 100644 oci/catalog/overlays/plex-official.json create mode 100644 oci/catalog/overlays/podfetch.json create mode 100644 oci/catalog/overlays/ppsspp.json create mode 100644 oci/catalog/overlays/projectsend.json create mode 100644 oci/catalog/overlays/prowlarr.json create mode 100644 oci/catalog/overlays/pwndrop.json create mode 100644 oci/catalog/overlays/pycharm.json create mode 100644 oci/catalog/overlays/qbittorrent.json create mode 100644 oci/catalog/overlays/qui.json create mode 100644 oci/catalog/overlays/radarr.json create mode 100644 oci/catalog/overlays/rclone.json create mode 100644 oci/catalog/overlays/rdtclient.json create mode 100644 oci/catalog/overlays/remmina.json create mode 100644 oci/catalog/overlays/resilio-sync.json create mode 100644 oci/catalog/overlays/retroarch.json create mode 100644 oci/catalog/overlays/roonserver.json create mode 100644 oci/catalog/overlays/rpcs3.json create mode 100644 oci/catalog/overlays/sabnzbd.json create mode 100644 oci/catalog/overlays/scummvm.json create mode 100644 oci/catalog/overlays/shadps4.json create mode 100644 oci/catalog/overlays/sickchill.json create mode 100644 oci/catalog/overlays/sickgear.json create mode 100644 oci/catalog/overlays/signal.json create mode 100644 oci/catalog/overlays/smokeping.json create mode 100644 oci/catalog/overlays/snapdrop.json create mode 100644 oci/catalog/overlays/sonarr.json create mode 100644 oci/catalog/overlays/stable-diffusion-webui-nvidia.json create mode 100644 oci/catalog/overlays/steam.json create mode 100644 oci/catalog/overlays/stremio.json create mode 100644 oci/catalog/overlays/suite-arr.json create mode 100644 oci/catalog/overlays/swingmusic.json create mode 100644 oci/catalog/overlays/syncthing.json create mode 100644 oci/catalog/overlays/syslog-ng.json create mode 100644 oci/catalog/overlays/tailscale.json create mode 100644 oci/catalog/overlays/tandoor.json create mode 100644 oci/catalog/overlays/tautulli.json create mode 100644 oci/catalog/overlays/tdarr.json create mode 100644 oci/catalog/overlays/telegram.json create mode 100644 oci/catalog/overlays/threadfin.json create mode 100644 oci/catalog/overlays/thunderbird.json create mode 100644 oci/catalog/overlays/transmission.json create mode 100644 oci/catalog/overlays/trilium.json create mode 100644 oci/catalog/overlays/tvheadend.json create mode 100644 oci/catalog/overlays/ubooquity.json create mode 100644 oci/catalog/overlays/unifi-controller.json create mode 100644 oci/catalog/overlays/uptimekuma.json create mode 100644 oci/catalog/overlays/v2raya.json create mode 100644 oci/catalog/overlays/vivaldi.json create mode 100644 oci/catalog/overlays/vlc.json create mode 100644 oci/catalog/overlays/vocechat.json create mode 100644 oci/catalog/overlays/vscode.json create mode 100644 oci/catalog/overlays/vscodium-web.json create mode 100644 oci/catalog/overlays/vscodium.json create mode 100644 oci/catalog/overlays/webgrabplus.json create mode 100644 oci/catalog/overlays/webtop.json create mode 100644 oci/catalog/overlays/weixin.json create mode 100644 oci/catalog/overlays/wikijs.json create mode 100644 oci/catalog/overlays/winegui.json create mode 100644 oci/catalog/overlays/xbackbone.json create mode 100644 oci/catalog/overlays/xemu.json create mode 100644 oci/catalog/overlays/zen.json create mode 100644 oci/tests/test_stack_attach_mounts_volume_preparations.py create mode 100644 oci/tests/test_stack_volume_preparations.py create mode 100644 oci/tests/test_volume_preparations_curated.py diff --git a/oci/catalog/apps/2fauth.json b/oci/catalog/apps/2fauth.json index 65fc8b99..32aec4b5 100644 --- a/oci/catalog/apps/2fauth.json +++ b/oci/catalog/apps/2fauth.json @@ -362,7 +362,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/2fauth", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/actualbudget.json b/oci/catalog/apps/actualbudget.json index 7816157c..3ac8a4a6 100644 --- a/oci/catalog/apps/actualbudget.json +++ b/oci/catalog/apps/actualbudget.json @@ -339,7 +339,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/adguard-home.json b/oci/catalog/apps/adguard-home.json index c5410a5f..d811c81d 100644 --- a/oci/catalog/apps/adguard-home.json +++ b/oci/catalog/apps/adguard-home.json @@ -420,7 +420,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/adguardhome/work", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/adguardhome/conf", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/adguardhome-sync.json b/oci/catalog/apps/adguardhome-sync.json index 3b108990..89f1b592 100644 --- a/oci/catalog/apps/adguardhome-sync.json +++ b/oci/catalog/apps/adguardhome-sync.json @@ -209,7 +209,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/airsonic-advanced.json b/oci/catalog/apps/airsonic-advanced.json index 65a16480..ecfbd063 100644 --- a/oci/catalog/apps/airsonic-advanced.json +++ b/oci/catalog/apps/airsonic-advanced.json @@ -273,6 +273,38 @@ "gid_strategy": "host-device-gid", "source_mapping": "/dev/snd:/dev/snd" } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/playlists", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/podcasts", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/apps/albyhub.json b/oci/catalog/apps/albyhub.json index 9a371a4c..19e0d5c8 100644 --- a/oci/catalog/apps/albyhub.json +++ b/oci/catalog/apps/albyhub.json @@ -295,7 +295,15 @@ "installer_profile": { "runtime": { "command": [] - } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/alist-sync.json b/oci/catalog/apps/alist-sync.json index 9e1bfaec..13fecc17 100644 --- a/oci/catalog/apps/alist-sync.json +++ b/oci/catalog/apps/alist-sync.json @@ -339,7 +339,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/alist.json b/oci/catalog/apps/alist.json index 0ffa8691..11511147 100644 --- a/oci/catalog/apps/alist.json +++ b/oci/catalog/apps/alist.json @@ -340,7 +340,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/alist/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/altus.json b/oci/catalog/apps/altus.json index e9cfc613..48753fbd 100644 --- a/oci/catalog/apps/altus.json +++ b/oci/catalog/apps/altus.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/amule.json b/oci/catalog/apps/amule.json index c1850556..71e1d8a3 100644 --- a/oci/catalog/apps/amule.json +++ b/oci/catalog/apps/amule.json @@ -394,7 +394,21 @@ "request_timeout_seconds": 10, "stability_seconds": 4, "verify_tls": false - } + }, + "volume_preparations": [ + { + "container_path": "/home/amule/.aMule", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/anaconda3.json b/oci/catalog/apps/anaconda3.json index 6211fbb5..c4fb711e 100644 --- a/oci/catalog/apps/anaconda3.json +++ b/oci/catalog/apps/anaconda3.json @@ -266,7 +266,15 @@ "-c", "conda install -c conda-forge jupyterlab -y --quiet && jupyter lab --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser --allow-root" ] - } + }, + "volume_preparations": [ + { + "container_path": "/opt/notebooks", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/apprise-api.json b/oci/catalog/apps/apprise-api.json index 3411231a..13479b0f 100644 --- a/oci/catalog/apps/apprise-api.json +++ b/oci/catalog/apps/apprise-api.json @@ -226,7 +226,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/attachments", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/archivebox.json b/oci/catalog/apps/archivebox.json index fd47fd25..2f61a6cd 100644 --- a/oci/catalog/apps/archivebox.json +++ b/oci/catalog/apps/archivebox.json @@ -549,7 +549,15 @@ "verify_tls": true, "required": true, "source": "compose-healthcheck" - } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/ardour.json b/oci/catalog/apps/ardour.json index d5c19164..8148295a 100644 --- a/oci/catalog/apps/ardour.json +++ b/oci/catalog/apps/ardour.json @@ -328,7 +328,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/audacity.json b/oci/catalog/apps/audacity.json index 8f1ad44e..ccce3d9b 100644 --- a/oci/catalog/apps/audacity.json +++ b/oci/catalog/apps/audacity.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/audiobookshelf.json b/oci/catalog/apps/audiobookshelf.json index cd21b909..54203ad0 100644 --- a/oci/catalog/apps/audiobookshelf.json +++ b/oci/catalog/apps/audiobookshelf.json @@ -415,7 +415,35 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/audiobooks", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/podcasts", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/metadata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/autobrr.json b/oci/catalog/apps/autobrr.json index 41e8e6a5..62a80ab5 100644 --- a/oci/catalog/apps/autobrr.json +++ b/oci/catalog/apps/autobrr.json @@ -344,7 +344,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/azahar.json b/oci/catalog/apps/azahar.json index cf316c09..6281fdc7 100644 --- a/oci/catalog/apps/azahar.json +++ b/oci/catalog/apps/azahar.json @@ -223,6 +223,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/babybuddy.json b/oci/catalog/apps/babybuddy.json index 786fd283..b9d91379 100644 --- a/oci/catalog/apps/babybuddy.json +++ b/oci/catalog/apps/babybuddy.json @@ -209,7 +209,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/bambustudio.json b/oci/catalog/apps/bambustudio.json index 1286cda2..5645beaf 100644 --- a/oci/catalog/apps/bambustudio.json +++ b/oci/catalog/apps/bambustudio.json @@ -238,6 +238,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/bazarr.json b/oci/catalog/apps/bazarr.json index 89617e6a..fb648ca9 100644 --- a/oci/catalog/apps/bazarr.json +++ b/oci/catalog/apps/bazarr.json @@ -236,7 +236,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/beets.json b/oci/catalog/apps/beets.json index 0dd89731..14e141f1 100644 --- a/oci/catalog/apps/beets.json +++ b/oci/catalog/apps/beets.json @@ -234,7 +234,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/bitcoin-knots.json b/oci/catalog/apps/bitcoin-knots.json index 9102c2f1..17d8854c 100644 --- a/oci/catalog/apps/bitcoin-knots.json +++ b/oci/catalog/apps/bitcoin-knots.json @@ -208,7 +208,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/blade-of-agony.json b/oci/catalog/apps/blade-of-agony.json index f9851791..5afd7cde 100644 --- a/oci/catalog/apps/blade-of-agony.json +++ b/oci/catalog/apps/blade-of-agony.json @@ -215,6 +215,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/blender.json b/oci/catalog/apps/blender.json index 2f730698..10da1acf 100644 --- a/oci/catalog/apps/blender.json +++ b/oci/catalog/apps/blender.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/blinko.json b/oci/catalog/apps/blinko.json index cbfe3b9c..71bd6270 100644 --- a/oci/catalog/apps/blinko.json +++ b/oci/catalog/apps/blinko.json @@ -511,7 +511,15 @@ } ], "installer_profile": { - "stack_driver": "generic-multi-lxc-stack" + "stack_driver": "generic-multi-lxc-stack", + "volume_preparations": [ + { + "container_path": "/app/.blinko", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/boinc.json b/oci/catalog/apps/boinc.json index 8b0a1718..837c5fa7 100644 --- a/oci/catalog/apps/boinc.json +++ b/oci/catalog/apps/boinc.json @@ -263,7 +263,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/bookstack.json b/oci/catalog/apps/bookstack.json index 02325eea..6fcb5ef8 100644 --- a/oci/catalog/apps/bookstack.json +++ b/oci/catalog/apps/bookstack.json @@ -258,7 +258,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/brave.json b/oci/catalog/apps/brave.json index 9b420596..5cf421ea 100644 --- a/oci/catalog/apps/brave.json +++ b/oci/catalog/apps/brave.json @@ -232,6 +232,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/budge.json b/oci/catalog/apps/budge.json index 7cb00554..d2f125e5 100644 --- a/oci/catalog/apps/budge.json +++ b/oci/catalog/apps/budge.json @@ -209,7 +209,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/calibre-web.json b/oci/catalog/apps/calibre-web.json index ea7c2436..19fff1bd 100644 --- a/oci/catalog/apps/calibre-web.json +++ b/oci/catalog/apps/calibre-web.json @@ -240,7 +240,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/calibre.json b/oci/catalog/apps/calibre.json index 8c42b195..63541f86 100644 --- a/oci/catalog/apps/calibre.json +++ b/oci/catalog/apps/calibre.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/calligra.json b/oci/catalog/apps/calligra.json index 36a4dd92..a87f394e 100644 --- a/oci/catalog/apps/calligra.json +++ b/oci/catalog/apps/calligra.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/changedetection.io.json b/oci/catalog/apps/changedetection.io.json index 61a52fd8..950b1196 100644 --- a/oci/catalog/apps/changedetection.io.json +++ b/oci/catalog/apps/changedetection.io.json @@ -216,7 +216,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/chrome.json b/oci/catalog/apps/chrome.json index 6360ceeb..7b381972 100644 --- a/oci/catalog/apps/chrome.json +++ b/oci/catalog/apps/chrome.json @@ -239,6 +239,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/chromium.json b/oci/catalog/apps/chromium.json index ff381f8f..859de94a 100644 --- a/oci/catalog/apps/chromium.json +++ b/oci/catalog/apps/chromium.json @@ -239,6 +239,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/cloudbeaver.json b/oci/catalog/apps/cloudbeaver.json index 045d0d04..036e27a1 100644 --- a/oci/catalog/apps/cloudbeaver.json +++ b/oci/catalog/apps/cloudbeaver.json @@ -342,7 +342,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/cloudbeaver/workspace", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/cloudflared.json b/oci/catalog/apps/cloudflared.json index 1ee78081..b70cead6 100644 --- a/oci/catalog/apps/cloudflared.json +++ b/oci/catalog/apps/cloudflared.json @@ -333,7 +333,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/code-server.json b/oci/catalog/apps/code-server.json index e5338758..3c68c9cc 100644 --- a/oci/catalog/apps/code-server.json +++ b/oci/catalog/apps/code-server.json @@ -251,7 +251,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/codeproject-ai.json b/oci/catalog/apps/codeproject-ai.json index 65a3d51f..6d03bf08 100644 --- a/oci/catalog/apps/codeproject-ai.json +++ b/oci/catalog/apps/codeproject-ai.json @@ -353,7 +353,21 @@ ] } ] - } + }, + "volume_preparations": [ + { + "container_path": "/etc/codeproject/ai", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/modules", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/convertx.json b/oci/catalog/apps/convertx.json index 4d8f1ccf..ae1c7dc0 100644 --- a/oci/catalog/apps/convertx.json +++ b/oci/catalog/apps/convertx.json @@ -366,7 +366,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/cops.json b/oci/catalog/apps/cops.json index 16e94043..623efd1c 100644 --- a/oci/catalog/apps/cops.json +++ b/oci/catalog/apps/cops.json @@ -225,7 +225,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/crafty.json b/oci/catalog/apps/crafty.json index a2dd3fa5..b496cf91 100644 --- a/oci/catalog/apps/crafty.json +++ b/oci/catalog/apps/crafty.json @@ -474,7 +474,41 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/crafty/backups", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/crafty/logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/crafty/servers", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/crafty/app/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/crafty/import", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/cura.json b/oci/catalog/apps/cura.json index 03b82da0..4352a7b7 100644 --- a/oci/catalog/apps/cura.json +++ b/oci/catalog/apps/cura.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/darktable.json b/oci/catalog/apps/darktable.json index 17e052a7..d752a43b 100644 --- a/oci/catalog/apps/darktable.json +++ b/oci/catalog/apps/darktable.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/databag.json b/oci/catalog/apps/databag.json index cc72bb57..6cbf96fc 100644 --- a/oci/catalog/apps/databag.json +++ b/oci/catalog/apps/databag.json @@ -332,7 +332,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/lib/databag", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/davos.json b/oci/catalog/apps/davos.json index 1fc12ee5..c68440af 100644 --- a/oci/catalog/apps/davos.json +++ b/oci/catalog/apps/davos.json @@ -218,7 +218,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/download", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/ddclient.json b/oci/catalog/apps/ddclient.json index 58c007c9..44c2521e 100644 --- a/oci/catalog/apps/ddclient.json +++ b/oci/catalog/apps/ddclient.json @@ -186,7 +186,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/ddns-go.json b/oci/catalog/apps/ddns-go.json index 7ca5f72a..7f431509 100644 --- a/oci/catalog/apps/ddns-go.json +++ b/oci/catalog/apps/ddns-go.json @@ -340,7 +340,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/root", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/deluge.json b/oci/catalog/apps/deluge.json index aa8b5f79..c4213b99 100644 --- a/oci/catalog/apps/deluge.json +++ b/oci/catalog/apps/deluge.json @@ -254,7 +254,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/digikam.json b/oci/catalog/apps/digikam.json index 3239be08..7b7e89a9 100644 --- a/oci/catalog/apps/digikam.json +++ b/oci/catalog/apps/digikam.json @@ -231,6 +231,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/diskover.json b/oci/catalog/apps/diskover.json index 027cc917..ed52a69f 100644 --- a/oci/catalog/apps/diskover.json +++ b/oci/catalog/apps/diskover.json @@ -343,7 +343,21 @@ "installer_profile": { "resources": { "memory_default_mb": 4096 - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "generic_stack_review": [ "elasticsearch-helper: perfil de salud y persistencia pendiente", diff --git a/oci/catalog/apps/docker-volume-backup.json b/oci/catalog/apps/docker-volume-backup.json index 5be7e98d..2f3275a9 100644 --- a/oci/catalog/apps/docker-volume-backup.json +++ b/oci/catalog/apps/docker-volume-backup.json @@ -272,7 +272,22 @@ "validation": "not-required" } ], - "installer_profile": {}, + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/backup", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + }, "security_profile": { "requires_privileged_lxc": false, "source_requests_privileged_lxc": false, diff --git a/oci/catalog/apps/dogwalk.json b/oci/catalog/apps/dogwalk.json index 0c0b5d0f..84b12b7e 100644 --- a/oci/catalog/apps/dogwalk.json +++ b/oci/catalog/apps/dogwalk.json @@ -227,6 +227,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/dokuwiki.json b/oci/catalog/apps/dokuwiki.json index d7afa200..29c0bdc4 100644 --- a/oci/catalog/apps/dokuwiki.json +++ b/oci/catalog/apps/dokuwiki.json @@ -209,7 +209,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/dolphin.json b/oci/catalog/apps/dolphin.json index 3210d354..5e1613f7 100644 --- a/oci/catalog/apps/dolphin.json +++ b/oci/catalog/apps/dolphin.json @@ -231,6 +231,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/doplarr.json b/oci/catalog/apps/doplarr.json index b61350f3..c46b9c38 100644 --- a/oci/catalog/apps/doplarr.json +++ b/oci/catalog/apps/doplarr.json @@ -312,7 +312,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/doplarr_rs.json b/oci/catalog/apps/doplarr_rs.json index 9667d4a9..8c72ee25 100644 --- a/oci/catalog/apps/doplarr_rs.json +++ b/oci/catalog/apps/doplarr_rs.json @@ -170,7 +170,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/dosbox-staging.json b/oci/catalog/apps/dosbox-staging.json index cd36bfcd..b35bfe1a 100644 --- a/oci/catalog/apps/dosbox-staging.json +++ b/oci/catalog/apps/dosbox-staging.json @@ -223,6 +223,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/doublecommander.json b/oci/catalog/apps/doublecommander.json index 47fcc0e2..a75c9d43 100644 --- a/oci/catalog/apps/doublecommander.json +++ b/oci/catalog/apps/doublecommander.json @@ -348,7 +348,21 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/downtify.json b/oci/catalog/apps/downtify.json index 9b683aae..0d0e87c1 100644 --- a/oci/catalog/apps/downtify.json +++ b/oci/catalog/apps/downtify.json @@ -398,7 +398,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/dsh-harness.json b/oci/catalog/apps/dsh-harness.json index ce000c66..ce427576 100644 --- a/oci/catalog/apps/dsh-harness.json +++ b/oci/catalog/apps/dsh-harness.json @@ -344,7 +344,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/root/.dsh", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/duckdns.json b/oci/catalog/apps/duckdns.json index 69493528..c6837694 100644 --- a/oci/catalog/apps/duckdns.json +++ b/oci/catalog/apps/duckdns.json @@ -193,7 +193,15 @@ "installer_profile": { "network": { "compose_mode": "host" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/duckstation.json b/oci/catalog/apps/duckstation.json index 363f14c0..555cd3d7 100644 --- a/oci/catalog/apps/duckstation.json +++ b/oci/catalog/apps/duckstation.json @@ -228,6 +228,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/duplicati.json b/oci/catalog/apps/duplicati.json index ca971234..fac1cddc 100644 --- a/oci/catalog/apps/duplicati.json +++ b/oci/catalog/apps/duplicati.json @@ -237,7 +237,27 @@ "bytes": 16, "prompt": false } - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/backups", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/source", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/eden.json b/oci/catalog/apps/eden.json index aa7f551a..2517bab7 100644 --- a/oci/catalog/apps/eden.json +++ b/oci/catalog/apps/eden.json @@ -227,6 +227,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/emby-official.json b/oci/catalog/apps/emby-official.json index e8afeecf..5010933a 100644 --- a/oci/catalog/apps/emby-official.json +++ b/oci/catalog/apps/emby-official.json @@ -289,6 +289,18 @@ "remove_lost_found": true, "owner_strategy": "mapped-application-user", "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/mnt/share1", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/mnt/share2", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" } ], "gpu_validation": { diff --git a/oci/catalog/apps/emby.json b/oci/catalog/apps/emby.json index 5681a775..be5f080d 100644 --- a/oci/catalog/apps/emby.json +++ b/oci/catalog/apps/emby.json @@ -306,7 +306,33 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/tvshows", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/vc/lib", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/embystat.json b/oci/catalog/apps/embystat.json index f4dde925..30b1f655 100644 --- a/oci/catalog/apps/embystat.json +++ b/oci/catalog/apps/embystat.json @@ -367,7 +367,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/emulatorjs.json b/oci/catalog/apps/emulatorjs.json index b04ed50a..13718c52 100644 --- a/oci/catalog/apps/emulatorjs.json +++ b/oci/catalog/apps/emulatorjs.json @@ -355,7 +355,27 @@ "installer_profile": { "network": { "compose_mode": "bridge" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/nes/roms", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/esphome.json b/oci/catalog/apps/esphome.json index 854a5c03..f34a54f2 100644 --- a/oci/catalog/apps/esphome.json +++ b/oci/catalog/apps/esphome.json @@ -360,7 +360,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/faster-whisper.json b/oci/catalog/apps/faster-whisper.json index 67d5f824..804788d0 100644 --- a/oci/catalog/apps/faster-whisper.json +++ b/oci/catalog/apps/faster-whisper.json @@ -237,7 +237,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/ferdium.json b/oci/catalog/apps/ferdium.json index 3a048137..cd16a5a7 100644 --- a/oci/catalog/apps/ferdium.json +++ b/oci/catalog/apps/ferdium.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/filedrop.json b/oci/catalog/apps/filedrop.json index 0731d9e8..fb659a6a 100644 --- a/oci/catalog/apps/filedrop.json +++ b/oci/catalog/apps/filedrop.json @@ -366,7 +366,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/file_drop_files", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/fileflows.json b/oci/catalog/apps/fileflows.json index 911aba77..610d1eac 100644 --- a/oci/catalog/apps/fileflows.json +++ b/oci/catalog/apps/fileflows.json @@ -455,7 +455,39 @@ "device_inventory": "host-sysfs-and-stat", "application_acceleration": "requires-workload-test", "tone_mapping": "not-implied-by-device-access" - } + }, + "volume_preparations": [ + { + "container_path": "/app/Data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/Logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/common", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/temp", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/Media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/filezilla.json b/oci/catalog/apps/filezilla.json index f96a9bb4..e276e64c 100644 --- a/oci/catalog/apps/filezilla.json +++ b/oci/catalog/apps/filezilla.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/firefly.json b/oci/catalog/apps/firefly.json index 97e43171..81db99f2 100644 --- a/oci/catalog/apps/firefly.json +++ b/oci/catalog/apps/firefly.json @@ -307,7 +307,15 @@ "required_by_compose": true } ] - } + }, + "volume_preparations": [ + { + "container_path": "/firefly/conf", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/firefox.json b/oci/catalog/apps/firefox.json index 999ac33c..d3cbc951 100644 --- a/oci/catalog/apps/firefox.json +++ b/oci/catalog/apps/firefox.json @@ -239,6 +239,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/flexget.json b/oci/catalog/apps/flexget.json index 11b9ca5c..2074cee9 100644 --- a/oci/catalog/apps/flexget.json +++ b/oci/catalog/apps/flexget.json @@ -247,7 +247,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/flycast.json b/oci/catalog/apps/flycast.json index 1474f41c..bf35df14 100644 --- a/oci/catalog/apps/flycast.json +++ b/oci/catalog/apps/flycast.json @@ -227,6 +227,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/foldingathome.json b/oci/catalog/apps/foldingathome.json index 03e4218a..a60c8532 100644 --- a/oci/catalog/apps/foldingathome.json +++ b/oci/catalog/apps/foldingathome.json @@ -223,7 +223,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/freecad.json b/oci/catalog/apps/freecad.json index 5c9f4ce5..fd67adab 100644 --- a/oci/catalog/apps/freecad.json +++ b/oci/catalog/apps/freecad.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/freshrss-official.json b/oci/catalog/apps/freshrss-official.json index 93767e83..a0c1ae48 100644 --- a/oci/catalog/apps/freshrss-official.json +++ b/oci/catalog/apps/freshrss-official.json @@ -384,7 +384,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/FreshRSS/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/www/FreshRSS/extensions", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/freshrss.json b/oci/catalog/apps/freshrss.json index e46d0740..5e3d5fe0 100644 --- a/oci/catalog/apps/freshrss.json +++ b/oci/catalog/apps/freshrss.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/frigate.json b/oci/catalog/apps/frigate.json index 6a28904d..3fe7cce1 100644 --- a/oci/catalog/apps/frigate.json +++ b/oci/catalog/apps/frigate.json @@ -949,6 +949,20 @@ } ] }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media/frigate", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ], "cpu_allocation": "quota" }, "image_channel_policy": { diff --git a/oci/catalog/apps/gateway-go.json b/oci/catalog/apps/gateway-go.json index 120b0745..fd4ccb11 100644 --- a/oci/catalog/apps/gateway-go.json +++ b/oci/catalog/apps/gateway-go.json @@ -340,7 +340,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/root", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/gimp.json b/oci/catalog/apps/gimp.json index b7a9d7f9..103f7094 100644 --- a/oci/catalog/apps/gimp.json +++ b/oci/catalog/apps/gimp.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/gitea.json b/oci/catalog/apps/gitea.json index cdd4a5bd..e8e3aa2e 100644 --- a/oci/catalog/apps/gitea.json +++ b/oci/catalog/apps/gitea.json @@ -371,7 +371,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/github-desktop.json b/oci/catalog/apps/github-desktop.json index e825cce5..1c9f1799 100644 --- a/oci/catalog/apps/github-desktop.json +++ b/oci/catalog/apps/github-desktop.json @@ -303,7 +303,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/gitqlient.json b/oci/catalog/apps/gitqlient.json index 76ca0fea..ebce8225 100644 --- a/oci/catalog/apps/gitqlient.json +++ b/oci/catalog/apps/gitqlient.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/gopeed.json b/oci/catalog/apps/gopeed.json index 68544692..38553a58 100644 --- a/oci/catalog/apps/gopeed.json +++ b/oci/catalog/apps/gopeed.json @@ -376,7 +376,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/Downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/grav.json b/oci/catalog/apps/grav.json index 0cf7be95..b40374af 100644 --- a/oci/catalog/apps/grav.json +++ b/oci/catalog/apps/grav.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/grocy.json b/oci/catalog/apps/grocy.json index e09659d4..59c8e8a7 100644 --- a/oci/catalog/apps/grocy.json +++ b/oci/catalog/apps/grocy.json @@ -211,7 +211,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/gzdoom.json b/oci/catalog/apps/gzdoom.json index 9985bc91..1a5934d9 100644 --- a/oci/catalog/apps/gzdoom.json +++ b/oci/catalog/apps/gzdoom.json @@ -228,6 +228,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/habridge.json b/oci/catalog/apps/habridge.json index 8e7b78b4..1c63169b 100644 --- a/oci/catalog/apps/habridge.json +++ b/oci/catalog/apps/habridge.json @@ -216,7 +216,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/healthchecks.json b/oci/catalog/apps/healthchecks.json index 51f25525..f6941949 100644 --- a/oci/catalog/apps/healthchecks.json +++ b/oci/catalog/apps/healthchecks.json @@ -342,7 +342,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/hedgedoc.json b/oci/catalog/apps/hedgedoc.json index 2030ad35..d82bb8c7 100644 --- a/oci/catalog/apps/hedgedoc.json +++ b/oci/catalog/apps/hedgedoc.json @@ -279,7 +279,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/heimdall.json b/oci/catalog/apps/heimdall.json index 5e2a82c0..7d0449b3 100644 --- a/oci/catalog/apps/heimdall.json +++ b/oci/catalog/apps/heimdall.json @@ -216,7 +216,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/helium.json b/oci/catalog/apps/helium.json index 0ea1b0c5..5b0c1aa5 100644 --- a/oci/catalog/apps/helium.json +++ b/oci/catalog/apps/helium.json @@ -223,6 +223,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/hermes.json b/oci/catalog/apps/hermes.json index ad3c6338..967dfca0 100644 --- a/oci/catalog/apps/hermes.json +++ b/oci/catalog/apps/hermes.json @@ -322,7 +322,15 @@ "timeout_seconds": 180, "request_timeout_seconds": 5, "stability_seconds": 4 - } + }, + "volume_preparations": [ + { + "container_path": "/opt/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/homeassistant-official.json b/oci/catalog/apps/homeassistant-official.json index b1969ff9..af324258 100644 --- a/oci/catalog/apps/homeassistant-official.json +++ b/oci/catalog/apps/homeassistant-official.json @@ -315,7 +315,15 @@ "installer_profile": { "network": { "compose_mode": "host" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/homeassistant.json b/oci/catalog/apps/homeassistant.json index 10563148..24bbf590 100644 --- a/oci/catalog/apps/homeassistant.json +++ b/oci/catalog/apps/homeassistant.json @@ -197,7 +197,15 @@ ], "network": { "compose_mode": "host" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/homebridge.json b/oci/catalog/apps/homebridge.json index 0ab58fad..2f400593 100644 --- a/oci/catalog/apps/homebridge.json +++ b/oci/catalog/apps/homebridge.json @@ -321,7 +321,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/homebridge", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/htpcmanager.json b/oci/catalog/apps/htpcmanager.json index 5fcc143e..622bca71 100644 --- a/oci/catalog/apps/htpcmanager.json +++ b/oci/catalog/apps/htpcmanager.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/immich.json b/oci/catalog/apps/immich.json index 948ff62d..5b0efb2f 100644 --- a/oci/catalog/apps/immich.json +++ b/oci/catalog/apps/immich.json @@ -1746,6 +1746,16 @@ "validated_on": "2026-08-27", "note": "Historical validation only; catalog installation resolves rolling latest images." } + }, + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/inkscape.json b/oci/catalog/apps/inkscape.json index 16156ee3..6cb7df4a 100644 --- a/oci/catalog/apps/inkscape.json +++ b/oci/catalog/apps/inkscape.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/intellij-idea.json b/oci/catalog/apps/intellij-idea.json index 74664814..e5b96e5e 100644 --- a/oci/catalog/apps/intellij-idea.json +++ b/oci/catalog/apps/intellij-idea.json @@ -231,6 +231,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/jackett.json b/oci/catalog/apps/jackett.json index f13c2703..dd18a665 100644 --- a/oci/catalog/apps/jackett.json +++ b/oci/catalog/apps/jackett.json @@ -232,7 +232,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/jdownloader.json b/oci/catalog/apps/jdownloader.json index c4befda3..1870658f 100644 --- a/oci/catalog/apps/jdownloader.json +++ b/oci/catalog/apps/jdownloader.json @@ -873,6 +873,12 @@ "container_path": "/config", "remove_lost_found": true, "owner_strategy": "mapped-root" + }, + { + "container_path": "/output", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" } ], "runtime": { diff --git a/oci/catalog/apps/jellyfin-official.json b/oci/catalog/apps/jellyfin-official.json index 48bf346b..0a13f4f0 100644 --- a/oci/catalog/apps/jellyfin-official.json +++ b/oci/catalog/apps/jellyfin-official.json @@ -448,7 +448,27 @@ "device_inventory": "host-sysfs-and-stat", "application_acceleration": "requires-workload-test", "tone_mapping": "not-implied-by-device-access" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/cache", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "application_options": { "hdr10_dolby_vision_tone_mapping": { diff --git a/oci/catalog/apps/jellyfin.json b/oci/catalog/apps/jellyfin.json index 6e2cbaef..841983ba 100644 --- a/oci/catalog/apps/jellyfin.json +++ b/oci/catalog/apps/jellyfin.json @@ -565,7 +565,27 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/tvshows", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "application_options": { "hdr10_dolby_vision_tone_mapping": { diff --git a/oci/catalog/apps/jellyseerr.json b/oci/catalog/apps/jellyseerr.json index 0a7ae716..98144f21 100644 --- a/oci/catalog/apps/jellyseerr.json +++ b/oci/catalog/apps/jellyseerr.json @@ -265,7 +265,15 @@ "installer_profile": { "resources": { "cpu_shares": 50 - } + }, + "volume_preparations": [ + { + "container_path": "/app/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/joplin.json b/oci/catalog/apps/joplin.json index 9021e14b..a86e0a36 100644 --- a/oci/catalog/apps/joplin.json +++ b/oci/catalog/apps/joplin.json @@ -227,6 +227,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/kali-linux.json b/oci/catalog/apps/kali-linux.json index b08d81a8..4f174a91 100644 --- a/oci/catalog/apps/kali-linux.json +++ b/oci/catalog/apps/kali-linux.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/karakeep.json b/oci/catalog/apps/karakeep.json index bb6a6b23..76e7dc1d 100644 --- a/oci/catalog/apps/karakeep.json +++ b/oci/catalog/apps/karakeep.json @@ -556,7 +556,17 @@ "generic_stack_review": [ "karakeep-chrome: perfil de salud y persistencia pendiente", "karakeep: credencial externa o booleano GENERATED_OPENAI_API_KEY pendiente" - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": false, diff --git a/oci/catalog/apps/kasm.json b/oci/catalog/apps/kasm.json index 566c62a1..bafb7a20 100644 --- a/oci/catalog/apps/kasm.json +++ b/oci/catalog/apps/kasm.json @@ -253,7 +253,21 @@ } } ] - } + }, + "volume_preparations": [ + { + "container_path": "/opt", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/profiles", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/kavita-jvmilazz0.json b/oci/catalog/apps/kavita-jvmilazz0.json index a128614b..ba19aa34 100644 --- a/oci/catalog/apps/kavita-jvmilazz0.json +++ b/oci/catalog/apps/kavita-jvmilazz0.json @@ -383,7 +383,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/kavita/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/manga", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/kavita.json b/oci/catalog/apps/kavita.json index f80041e9..a85a332f 100644 --- a/oci/catalog/apps/kavita.json +++ b/oci/catalog/apps/kavita.json @@ -219,7 +219,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/kdenlive.json b/oci/catalog/apps/kdenlive.json index 2504d87d..4d60529f 100644 --- a/oci/catalog/apps/kdenlive.json +++ b/oci/catalog/apps/kdenlive.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/keepassxc.json b/oci/catalog/apps/keepassxc.json index 7e401085..0eb90b72 100644 --- a/oci/catalog/apps/keepassxc.json +++ b/oci/catalog/apps/keepassxc.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/kicad.json b/oci/catalog/apps/kicad.json index dc705a72..6e963800 100644 --- a/oci/catalog/apps/kicad.json +++ b/oci/catalog/apps/kicad.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/kimai.json b/oci/catalog/apps/kimai.json index fd888a62..ce64c8fc 100644 --- a/oci/catalog/apps/kimai.json +++ b/oci/catalog/apps/kimai.json @@ -357,7 +357,15 @@ "https://docs.linuxserver.io/images/docker-mariadb/" ], "installer_profile": { - "stack_driver": "generic-multi-lxc-stack" + "stack_driver": "generic-multi-lxc-stack", + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "stack_completion_notes": [ "Kimai has no default account. Enter the container with: pct enter {main_vmid}", diff --git a/oci/catalog/apps/kometa.json b/oci/catalog/apps/kometa.json index 28b442f3..6617a044 100644 --- a/oci/catalog/apps/kometa.json +++ b/oci/catalog/apps/kometa.json @@ -221,7 +221,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/komga.json b/oci/catalog/apps/komga.json index 89daaec1..c258f5cb 100644 --- a/oci/catalog/apps/komga.json +++ b/oci/catalog/apps/komga.json @@ -423,7 +423,29 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/timezone", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/krita.json b/oci/catalog/apps/krita.json index a6562ae8..6d4422cf 100644 --- a/oci/catalog/apps/krita.json +++ b/oci/catalog/apps/krita.json @@ -338,7 +338,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/label-studio.json b/oci/catalog/apps/label-studio.json index 43a9379d..1b541fb8 100644 --- a/oci/catalog/apps/label-studio.json +++ b/oci/catalog/apps/label-studio.json @@ -366,7 +366,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/label-studio/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/lazylibrarian.json b/oci/catalog/apps/lazylibrarian.json index 95e097a5..bf00112d 100644 --- a/oci/catalog/apps/lazylibrarian.json +++ b/oci/catalog/apps/lazylibrarian.json @@ -242,7 +242,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/libredb-studio.json b/oci/catalog/apps/libredb-studio.json index ba7e0f00..ec034ab1 100644 --- a/oci/catalog/apps/libredb-studio.json +++ b/oci/catalog/apps/libredb-studio.json @@ -332,7 +332,15 @@ "verify_tls": true, "required": true, "source": "compose-healthcheck" - } + }, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/libreoffice.json b/oci/catalog/apps/libreoffice.json index 339f72d7..8cf78ecf 100644 --- a/oci/catalog/apps/libreoffice.json +++ b/oci/catalog/apps/libreoffice.json @@ -348,7 +348,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/librespeed.json b/oci/catalog/apps/librespeed.json index f7407c8b..f6be36b5 100644 --- a/oci/catalog/apps/librespeed.json +++ b/oci/catalog/apps/librespeed.json @@ -265,7 +265,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/librewolf.json b/oci/catalog/apps/librewolf.json index cbd24e92..ee9c00b7 100644 --- a/oci/catalog/apps/librewolf.json +++ b/oci/catalog/apps/librewolf.json @@ -339,7 +339,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/lidarr.json b/oci/catalog/apps/lidarr.json index ea9be5d5..25593a18 100644 --- a/oci/catalog/apps/lidarr.json +++ b/oci/catalog/apps/lidarr.json @@ -236,7 +236,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/limnoria.json b/oci/catalog/apps/limnoria.json index cfa79a05..41d9052f 100644 --- a/oci/catalog/apps/limnoria.json +++ b/oci/catalog/apps/limnoria.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/linkwarden.json b/oci/catalog/apps/linkwarden.json index 17b1e73d..cb04c3b8 100644 --- a/oci/catalog/apps/linkwarden.json +++ b/oci/catalog/apps/linkwarden.json @@ -631,7 +631,15 @@ "https://www.meilisearch.com/docs/reference/api/health/get-health" ], "installer_profile": { - "stack_driver": "generic-multi-lxc-stack" + "stack_driver": "generic-multi-lxc-stack", + "volume_preparations": [ + { + "container_path": "/data/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/lm-studio.json b/oci/catalog/apps/lm-studio.json index 2139ffcb..2ada8b66 100644 --- a/oci/catalog/apps/lm-studio.json +++ b/oci/catalog/apps/lm-studio.json @@ -215,6 +215,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/logseq.json b/oci/catalog/apps/logseq.json index 0ba6aada..0f5d9872 100644 --- a/oci/catalog/apps/logseq.json +++ b/oci/catalog/apps/logseq.json @@ -302,7 +302,21 @@ "installer_profile": { "network": { "compose_mode": "bridge" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/notes", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/lollypop.json b/oci/catalog/apps/lollypop.json index 32087a35..ee4fb2e2 100644 --- a/oci/catalog/apps/lollypop.json +++ b/oci/catalog/apps/lollypop.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/luanti.json b/oci/catalog/apps/luanti.json index 196886c1..f7aa6637 100644 --- a/oci/catalog/apps/luanti.json +++ b/oci/catalog/apps/luanti.json @@ -193,7 +193,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config/.minetest", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/lucky.json b/oci/catalog/apps/lucky.json index 29105706..6878f2b3 100644 --- a/oci/catalog/apps/lucky.json +++ b/oci/catalog/apps/lucky.json @@ -336,7 +336,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/goodluck", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/lychee.json b/oci/catalog/apps/lychee.json index 09e18b22..23bf2f5d 100644 --- a/oci/catalog/apps/lychee.json +++ b/oci/catalog/apps/lychee.json @@ -281,7 +281,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/pictures", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/lyrionmusicserver.json b/oci/catalog/apps/lyrionmusicserver.json index db080443..8b08c640 100644 --- a/oci/catalog/apps/lyrionmusicserver.json +++ b/oci/catalog/apps/lyrionmusicserver.json @@ -518,7 +518,41 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/playlist", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/localtime", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/timezone", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/mame.json b/oci/catalog/apps/mame.json index 5ccb1133..e7c6926d 100644 --- a/oci/catalog/apps/mame.json +++ b/oci/catalog/apps/mame.json @@ -244,6 +244,20 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/mame", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/manyfold.json b/oci/catalog/apps/manyfold.json index d8cdec21..d95cc90c 100644 --- a/oci/catalog/apps/manyfold.json +++ b/oci/catalog/apps/manyfold.json @@ -240,7 +240,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/libraries", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/mariadb.json b/oci/catalog/apps/mariadb.json index 9096a1dc..00dcc767 100644 --- a/oci/catalog/apps/mariadb.json +++ b/oci/catalog/apps/mariadb.json @@ -244,7 +244,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/mastodon.json b/oci/catalog/apps/mastodon.json index 0dbe6d5f..6098503b 100644 --- a/oci/catalog/apps/mastodon.json +++ b/oci/catalog/apps/mastodon.json @@ -482,7 +482,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/mediaelch.json b/oci/catalog/apps/mediaelch.json index ae5aa48a..de18fb41 100644 --- a/oci/catalog/apps/mediaelch.json +++ b/oci/catalog/apps/mediaelch.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/medusa-official.json b/oci/catalog/apps/medusa-official.json index 233f3534..c299a6eb 100644 --- a/oci/catalog/apps/medusa-official.json +++ b/oci/catalog/apps/medusa-official.json @@ -416,7 +416,29 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/medusa.json b/oci/catalog/apps/medusa.json index 0e84d01f..0a000e5c 100644 --- a/oci/catalog/apps/medusa.json +++ b/oci/catalog/apps/medusa.json @@ -234,7 +234,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/melonds.json b/oci/catalog/apps/melonds.json index 5e4e507b..1c4f2dc3 100644 --- a/oci/catalog/apps/melonds.json +++ b/oci/catalog/apps/melonds.json @@ -224,6 +224,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/memos.json b/oci/catalog/apps/memos.json index 48b2167f..e40a9227 100644 --- a/oci/catalog/apps/memos.json +++ b/oci/catalog/apps/memos.json @@ -367,7 +367,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/opt/memos", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/mineos-node.json b/oci/catalog/apps/mineos-node.json index f537883c..084ceddc 100644 --- a/oci/catalog/apps/mineos-node.json +++ b/oci/catalog/apps/mineos-node.json @@ -407,7 +407,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/games/minecraft", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/minisatip.json b/oci/catalog/apps/minisatip.json index 6d0b6a40..e25e8c6e 100644 --- a/oci/catalog/apps/minisatip.json +++ b/oci/catalog/apps/minisatip.json @@ -215,6 +215,14 @@ "gid_strategy": "host-device-gid", "source_mapping": "/dev/dvb:/dev/dvb" } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/apps/mongodb.json b/oci/catalog/apps/mongodb.json index 8181c134..c36865e8 100644 --- a/oci/catalog/apps/mongodb.json +++ b/oci/catalog/apps/mongodb.json @@ -383,7 +383,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data/configdb", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/mongodb4.json b/oci/catalog/apps/mongodb4.json index 2a55d7d1..0fe6e491 100644 --- a/oci/catalog/apps/mongodb4.json +++ b/oci/catalog/apps/mongodb4.json @@ -383,7 +383,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data/configdb", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/monica-official.json b/oci/catalog/apps/monica-official.json index b5d8014b..1e44bb2e 100644 --- a/oci/catalog/apps/monica-official.json +++ b/oci/catalog/apps/monica-official.json @@ -524,7 +524,15 @@ "https://github.com/MariaDB/mariadb-docker/blob/master/healthcheck.sh" ], "installer_profile": { - "stack_driver": "generic-multi-lxc-stack" + "stack_driver": "generic-multi-lxc-stack", + "volume_preparations": [ + { + "container_path": "/var/www/html/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/monica.json b/oci/catalog/apps/monica.json index adca760d..82c5959a 100644 --- a/oci/catalog/apps/monica.json +++ b/oci/catalog/apps/monica.json @@ -272,7 +272,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/msedge.json b/oci/catalog/apps/msedge.json index 445e2ff9..2b2b5506 100644 --- a/oci/catalog/apps/msedge.json +++ b/oci/catalog/apps/msedge.json @@ -345,7 +345,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/mstream.json b/oci/catalog/apps/mstream.json index 94454de4..40eeda57 100644 --- a/oci/catalog/apps/mstream.json +++ b/oci/catalog/apps/mstream.json @@ -218,7 +218,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/mullvad-browser.json b/oci/catalog/apps/mullvad-browser.json index df88964a..c4e64a2f 100644 --- a/oci/catalog/apps/mullvad-browser.json +++ b/oci/catalog/apps/mullvad-browser.json @@ -309,7 +309,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/mylar3.json b/oci/catalog/apps/mylar3.json index ab9b5cb8..206c72e8 100644 --- a/oci/catalog/apps/mylar3.json +++ b/oci/catalog/apps/mylar3.json @@ -234,7 +234,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/comics", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/myspeed.json b/oci/catalog/apps/myspeed.json index 13a41913..3e298a3a 100644 --- a/oci/catalog/apps/myspeed.json +++ b/oci/catalog/apps/myspeed.json @@ -341,7 +341,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/myspeed/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/mysql-workbench.json b/oci/catalog/apps/mysql-workbench.json index 511134a1..9f6fd76a 100644 --- a/oci/catalog/apps/mysql-workbench.json +++ b/oci/catalog/apps/mysql-workbench.json @@ -302,7 +302,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/navidrome.json b/oci/catalog/apps/navidrome.json index 74ccc9bd..756e3303 100644 --- a/oci/catalog/apps/navidrome.json +++ b/oci/catalog/apps/navidrome.json @@ -416,7 +416,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/netbird.json b/oci/catalog/apps/netbird.json index 721ac239..6ac9bdf0 100644 --- a/oci/catalog/apps/netbird.json +++ b/oci/catalog/apps/netbird.json @@ -281,7 +281,15 @@ "SYS_ADMIN", "SYS_RESOURCE" ] - } + }, + "volume_preparations": [ + { + "container_path": "/var/lib/netbird", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/netbox.json b/oci/catalog/apps/netbox.json index 9095a66a..d96fdfe3 100644 --- a/oci/catalog/apps/netbox.json +++ b/oci/catalog/apps/netbox.json @@ -356,7 +356,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/netdata.json b/oci/catalog/apps/netdata.json index 16bf9fa2..794c7ed2 100644 --- a/oci/catalog/apps/netdata.json +++ b/oci/catalog/apps/netdata.json @@ -460,7 +460,27 @@ "timeout_seconds": 180, "request_timeout_seconds": 5, "verify_tls": false - } + }, + "volume_preparations": [ + { + "container_path": "/etc/netdata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/lib/netdata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/cache/netdata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": true, diff --git a/oci/catalog/apps/nextcloud-official.json b/oci/catalog/apps/nextcloud-official.json index e5b633fa..ad64fdb8 100644 --- a/oci/catalog/apps/nextcloud-official.json +++ b/oci/catalog/apps/nextcloud-official.json @@ -352,7 +352,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/html", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/nextcloud-stack.json b/oci/catalog/apps/nextcloud-stack.json index 3f2049af..82a039f1 100644 --- a/oci/catalog/apps/nextcloud-stack.json +++ b/oci/catalog/apps/nextcloud-stack.json @@ -560,6 +560,16 @@ "database" ] } + }, + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/html", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/nextcloud.json b/oci/catalog/apps/nextcloud.json index 032f4885..5f055d67 100644 --- a/oci/catalog/apps/nextcloud.json +++ b/oci/catalog/apps/nextcloud.json @@ -218,7 +218,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/nginx.json b/oci/catalog/apps/nginx.json index 5a24917f..4f49fca5 100644 --- a/oci/catalog/apps/nginx.json +++ b/oci/catalog/apps/nginx.json @@ -223,7 +223,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/nginxproxymanager.json b/oci/catalog/apps/nginxproxymanager.json index aa9d9b6a..6c9dda62 100644 --- a/oci/catalog/apps/nginxproxymanager.json +++ b/oci/catalog/apps/nginxproxymanager.json @@ -396,7 +396,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/letsencrypt", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/ngircd.json b/oci/catalog/apps/ngircd.json index 17102f3c..17223ac4 100644 --- a/oci/catalog/apps/ngircd.json +++ b/oci/catalog/apps/ngircd.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/nzbfast.json b/oci/catalog/apps/nzbfast.json index 01f5a12a..5efed1c5 100644 --- a/oci/catalog/apps/nzbfast.json +++ b/oci/catalog/apps/nzbfast.json @@ -450,7 +450,29 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/watch", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/nzbget.json b/oci/catalog/apps/nzbget.json index 8a5f779d..a6cd5cb9 100644 --- a/oci/catalog/apps/nzbget.json +++ b/oci/catalog/apps/nzbget.json @@ -233,7 +233,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/nzbhydra2.json b/oci/catalog/apps/nzbhydra2.json index 41d9bcd6..4f75f953 100644 --- a/oci/catalog/apps/nzbhydra2.json +++ b/oci/catalog/apps/nzbhydra2.json @@ -219,7 +219,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/obsidian.json b/oci/catalog/apps/obsidian.json index 99b2f869..8710ab10 100644 --- a/oci/catalog/apps/obsidian.json +++ b/oci/catalog/apps/obsidian.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/ollama.json b/oci/catalog/apps/ollama.json index 527e23c3..c20a85dc 100644 --- a/oci/catalog/apps/ollama.json +++ b/oci/catalog/apps/ollama.json @@ -397,7 +397,15 @@ "device_inventory": "host-sysfs-and-stat", "application_acceleration": "requires-workload-test", "tone_mapping": "not-implied-by-device-access" - } + }, + "volume_preparations": [ + { + "container_path": "/root/.ollama", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/ombi.json b/oci/catalog/apps/ombi.json index a5257f36..e0b2dc71 100644 --- a/oci/catalog/apps/ombi.json +++ b/oci/catalog/apps/ombi.json @@ -209,7 +209,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/onlyoffice.json b/oci/catalog/apps/onlyoffice.json index 883df28f..f50db1d9 100644 --- a/oci/catalog/apps/onlyoffice.json +++ b/oci/catalog/apps/onlyoffice.json @@ -223,6 +223,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/open-webui-cuda.json b/oci/catalog/apps/open-webui-cuda.json index d8542450..2c34636d 100644 --- a/oci/catalog/apps/open-webui-cuda.json +++ b/oci/catalog/apps/open-webui-cuda.json @@ -288,7 +288,15 @@ "device_inventory": "host-sysfs-and-stat", "application_acceleration": "requires-workload-test", "tone_mapping": "not-implied-by-device-access" - } + }, + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/open-webui-ollama.json b/oci/catalog/apps/open-webui-ollama.json index d862b857..d057f636 100644 --- a/oci/catalog/apps/open-webui-ollama.json +++ b/oci/catalog/apps/open-webui-ollama.json @@ -287,6 +287,20 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/root/.ollama", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/apps/open-webui.json b/oci/catalog/apps/open-webui.json index 29be11c0..79b77b3a 100644 --- a/oci/catalog/apps/open-webui.json +++ b/oci/catalog/apps/open-webui.json @@ -271,6 +271,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/apps/openhab.json b/oci/catalog/apps/openhab.json index 5e7406da..203dc82c 100644 --- a/oci/catalog/apps/openhab.json +++ b/oci/catalog/apps/openhab.json @@ -482,7 +482,41 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/etc/localtime", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/timezone", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/openhab/addons", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/openhab/conf", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/openhab/userdata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/openhands.json b/oci/catalog/apps/openhands.json index 8402e3ce..a513bd0f 100644 --- a/oci/catalog/apps/openhands.json +++ b/oci/catalog/apps/openhands.json @@ -303,6 +303,20 @@ "hostname": "host.docker.internal", "address": "host-gateway" } + ], + "volume_preparations": [ + { + "container_path": "/.openhands", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/workspace_base", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/apps/openshot.json b/oci/catalog/apps/openshot.json index 86ead80d..e609569c 100644 --- a/oci/catalog/apps/openshot.json +++ b/oci/catalog/apps/openshot.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/openssh-server.json b/oci/catalog/apps/openssh-server.json index 10477795..3634f1c6 100644 --- a/oci/catalog/apps/openssh-server.json +++ b/oci/catalog/apps/openssh-server.json @@ -250,7 +250,15 @@ "installer_profile": { "runtime": { "hostname": "openssh-server" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/openvscode-server.json b/oci/catalog/apps/openvscode-server.json index 1c7a4557..b5c1f179 100644 --- a/oci/catalog/apps/openvscode-server.json +++ b/oci/catalog/apps/openvscode-server.json @@ -230,7 +230,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/opera.json b/oci/catalog/apps/opera.json index 54e4caf3..19ee57df 100644 --- a/oci/catalog/apps/opera.json +++ b/oci/catalog/apps/opera.json @@ -338,7 +338,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/opodsync.json b/oci/catalog/apps/opodsync.json index de2e8905..d2680e52 100644 --- a/oci/catalog/apps/opodsync.json +++ b/oci/catalog/apps/opodsync.json @@ -338,7 +338,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/server/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/orcaslicer.json b/oci/catalog/apps/orcaslicer.json index 969ed5ed..fec63881 100644 --- a/oci/catalog/apps/orcaslicer.json +++ b/oci/catalog/apps/orcaslicer.json @@ -232,6 +232,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/oscam.json b/oci/catalog/apps/oscam.json index e6dd5587..8bb86420 100644 --- a/oci/catalog/apps/oscam.json +++ b/oci/catalog/apps/oscam.json @@ -194,6 +194,14 @@ "gid_strategy": "host-device-gid", "source_mapping": "/dev/ttyUSB0:/dev/ttyUSB0" } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/apps/overseerr.json b/oci/catalog/apps/overseerr.json index c679ec36..171cace3 100644 --- a/oci/catalog/apps/overseerr.json +++ b/oci/catalog/apps/overseerr.json @@ -359,7 +359,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/paperless-ngx.json b/oci/catalog/apps/paperless-ngx.json index df247cb2..9fa7c826 100644 --- a/oci/catalog/apps/paperless-ngx.json +++ b/oci/catalog/apps/paperless-ngx.json @@ -613,6 +613,34 @@ "db" ] } + }, + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/usr/src/paperless/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/usr/src/paperless/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/usr/src/paperless/export", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/usr/src/paperless/consume", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/pcsx2.json b/oci/catalog/apps/pcsx2.json index e6fb4413..102ade97 100644 --- a/oci/catalog/apps/pcsx2.json +++ b/oci/catalog/apps/pcsx2.json @@ -231,6 +231,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/pelorus.json b/oci/catalog/apps/pelorus.json index 802aea27..399226a8 100644 --- a/oci/catalog/apps/pelorus.json +++ b/oci/catalog/apps/pelorus.json @@ -308,7 +308,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/petio.json b/oci/catalog/apps/petio.json index 6fb919de..4dc3c141 100644 --- a/oci/catalog/apps/petio.json +++ b/oci/catalog/apps/petio.json @@ -463,7 +463,21 @@ "https://github.com/petio-team/petio" ], "installer_profile": { - "stack_driver": "generic-multi-lxc-stack" + "stack_driver": "generic-multi-lxc-stack", + "volume_preparations": [ + { + "container_path": "/app/api/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/photoprism.json b/oci/catalog/apps/photoprism.json index 2ea12eca..e18061be 100644 --- a/oci/catalog/apps/photoprism.json +++ b/oci/catalog/apps/photoprism.json @@ -410,7 +410,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/photoprism/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/photoprism/originals", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/phpmyadmin.json b/oci/catalog/apps/phpmyadmin.json index 4d9ff85b..0a8e32a3 100644 --- a/oci/catalog/apps/phpmyadmin.json +++ b/oci/catalog/apps/phpmyadmin.json @@ -216,7 +216,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/pidgin.json b/oci/catalog/apps/pidgin.json index 774db58a..8cd22ace 100644 --- a/oci/catalog/apps/pidgin.json +++ b/oci/catalog/apps/pidgin.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/pihole.json b/oci/catalog/apps/pihole.json index a8ba7100..0cb42c98 100644 --- a/oci/catalog/apps/pihole.json +++ b/oci/catalog/apps/pihole.json @@ -320,7 +320,15 @@ "required_capabilities": [ "NET_ADMIN" ] - } + }, + "volume_preparations": [ + { + "container_path": "/etc/pihole", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/pinchflat.json b/oci/catalog/apps/pinchflat.json index 0528f63e..5a079d46 100644 --- a/oci/catalog/apps/pinchflat.json +++ b/oci/catalog/apps/pinchflat.json @@ -398,7 +398,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/pingvin-share.json b/oci/catalog/apps/pingvin-share.json index 02eb8def..41eda8ca 100644 --- a/oci/catalog/apps/pingvin-share.json +++ b/oci/catalog/apps/pingvin-share.json @@ -381,7 +381,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/app/frontend/public/img", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/piper.json b/oci/catalog/apps/piper.json index bcba278c..20d51eb0 100644 --- a/oci/catalog/apps/piper.json +++ b/oci/catalog/apps/piper.json @@ -251,7 +251,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/piwigo.json b/oci/catalog/apps/piwigo.json index b7bc97d7..5e89fee8 100644 --- a/oci/catalog/apps/piwigo.json +++ b/oci/catalog/apps/piwigo.json @@ -218,7 +218,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/gallery", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/planka.json b/oci/catalog/apps/planka.json index 9418a3dd..22e767c3 100644 --- a/oci/catalog/apps/planka.json +++ b/oci/catalog/apps/planka.json @@ -265,7 +265,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/plex-official.json b/oci/catalog/apps/plex-official.json index fa4d67c6..38e0ab64 100644 --- a/oci/catalog/apps/plex-official.json +++ b/oci/catalog/apps/plex-official.json @@ -334,7 +334,27 @@ "device_inventory": "host-sysfs-and-stat", "application_acceleration": "requires-workload-test", "tone_mapping": "not-implied-by-device-access" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/transcode", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/plex.json b/oci/catalog/apps/plex.json index 72a41503..2903e8a8 100644 --- a/oci/catalog/apps/plex.json +++ b/oci/catalog/apps/plex.json @@ -288,7 +288,27 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/pocketbase.json b/oci/catalog/apps/pocketbase.json index b143225c..4a968c53 100644 --- a/oci/catalog/apps/pocketbase.json +++ b/oci/catalog/apps/pocketbase.json @@ -339,7 +339,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/pb_data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/podfetch.json b/oci/catalog/apps/podfetch.json index 4fa554a7..b981c3c0 100644 --- a/oci/catalog/apps/podfetch.json +++ b/oci/catalog/apps/podfetch.json @@ -399,7 +399,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/podcasts", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/db", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/portainer.json b/oci/catalog/apps/portainer.json index 165c195c..7adf13e3 100644 --- a/oci/catalog/apps/portainer.json +++ b/oci/catalog/apps/portainer.json @@ -396,7 +396,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/postgresql.json b/oci/catalog/apps/postgresql.json index 09aaec0a..7a518df3 100644 --- a/oci/catalog/apps/postgresql.json +++ b/oci/catalog/apps/postgresql.json @@ -393,7 +393,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/lib/postgresql/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/ppsspp.json b/oci/catalog/apps/ppsspp.json index 295918db..bf82f921 100644 --- a/oci/catalog/apps/ppsspp.json +++ b/oci/catalog/apps/ppsspp.json @@ -215,6 +215,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/projectsend.json b/oci/catalog/apps/projectsend.json index 41111cec..b8c6b473 100644 --- a/oci/catalog/apps/projectsend.json +++ b/oci/catalog/apps/projectsend.json @@ -218,7 +218,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/prowlarr.json b/oci/catalog/apps/prowlarr.json index d52e6b8b..3d5cd228 100644 --- a/oci/catalog/apps/prowlarr.json +++ b/oci/catalog/apps/prowlarr.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/pwndrop.json b/oci/catalog/apps/pwndrop.json index a1a05a05..687e6332 100644 --- a/oci/catalog/apps/pwndrop.json +++ b/oci/catalog/apps/pwndrop.json @@ -209,7 +209,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/pycharm.json b/oci/catalog/apps/pycharm.json index 8c4931fe..ed161a03 100644 --- a/oci/catalog/apps/pycharm.json +++ b/oci/catalog/apps/pycharm.json @@ -223,6 +223,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/pydio-cells.json b/oci/catalog/apps/pydio-cells.json index b26c69bd..2f7b1ca8 100644 --- a/oci/catalog/apps/pydio-cells.json +++ b/oci/catalog/apps/pydio-cells.json @@ -194,7 +194,15 @@ "installer_profile": { "runtime": { "hostname": "pydio-cells" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/pyload-ng.json b/oci/catalog/apps/pyload-ng.json index fd568430..160bf1f0 100644 --- a/oci/catalog/apps/pyload-ng.json +++ b/oci/catalog/apps/pyload-ng.json @@ -225,7 +225,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/qbittorrent-hotio.json b/oci/catalog/apps/qbittorrent-hotio.json index c963f33d..ba4b2d8f 100644 --- a/oci/catalog/apps/qbittorrent-hotio.json +++ b/oci/catalog/apps/qbittorrent-hotio.json @@ -407,7 +407,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/DATA", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/qbittorrent.json b/oci/catalog/apps/qbittorrent.json index e8598bd9..fcddf7ac 100644 --- a/oci/catalog/apps/qbittorrent.json +++ b/oci/catalog/apps/qbittorrent.json @@ -261,7 +261,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "pending-per-application" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/qdirstat.json b/oci/catalog/apps/qdirstat.json index 72bfc0df..87d0b1fd 100644 --- a/oci/catalog/apps/qdirstat.json +++ b/oci/catalog/apps/qdirstat.json @@ -348,7 +348,21 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/qui.json b/oci/catalog/apps/qui.json index bfe2d58d..19dcf5e2 100644 --- a/oci/catalog/apps/qui.json +++ b/oci/catalog/apps/qui.json @@ -454,7 +454,15 @@ } ], "installer_profile": { - "stack_driver": "generic-multi-lxc-stack" + "stack_driver": "generic-multi-lxc-stack", + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/radarr.json b/oci/catalog/apps/radarr.json index 4bc1c2b2..301bab21 100644 --- a/oci/catalog/apps/radarr.json +++ b/oci/catalog/apps/radarr.json @@ -236,7 +236,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/raneto.json b/oci/catalog/apps/raneto.json index fbc78583..89a1027f 100644 --- a/oci/catalog/apps/raneto.json +++ b/oci/catalog/apps/raneto.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/rawtherapee.json b/oci/catalog/apps/rawtherapee.json index 42667d66..baf55102 100644 --- a/oci/catalog/apps/rawtherapee.json +++ b/oci/catalog/apps/rawtherapee.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/rclone.json b/oci/catalog/apps/rclone.json index befc74b1..eb384366 100644 --- a/oci/catalog/apps/rclone.json +++ b/oci/catalog/apps/rclone.json @@ -819,6 +819,12 @@ "container_path": "/config/rclone", "remove_lost_found": true, "owner_strategy": "mapped-root" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" } ], "runtime": { diff --git a/oci/catalog/apps/rdtclient.json b/oci/catalog/apps/rdtclient.json index 1db4f514..29447342 100644 --- a/oci/catalog/apps/rdtclient.json +++ b/oci/catalog/apps/rdtclient.json @@ -311,7 +311,21 @@ }, "resources": { "cpu_shares": 50 - } + }, + "volume_preparations": [ + { + "container_path": "/data/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/readarr.json b/oci/catalog/apps/readarr.json index ba0a0ff3..a1d42968 100644 --- a/oci/catalog/apps/readarr.json +++ b/oci/catalog/apps/readarr.json @@ -431,7 +431,29 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/remmina.json b/oci/catalog/apps/remmina.json index 4cd97cb9..d76f7eba 100644 --- a/oci/catalog/apps/remmina.json +++ b/oci/catalog/apps/remmina.json @@ -232,6 +232,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/resilio-sync.json b/oci/catalog/apps/resilio-sync.json index ae750126..9666cd25 100644 --- a/oci/catalog/apps/resilio-sync.json +++ b/oci/catalog/apps/resilio-sync.json @@ -241,7 +241,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/sync", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/retroarch.json b/oci/catalog/apps/retroarch.json index 1244330e..1bb0d307 100644 --- a/oci/catalog/apps/retroarch.json +++ b/oci/catalog/apps/retroarch.json @@ -228,6 +228,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/romm.json b/oci/catalog/apps/romm.json index af27d519..aebcbb3e 100644 --- a/oci/catalog/apps/romm.json +++ b/oci/catalog/apps/romm.json @@ -756,7 +756,39 @@ "https://docs.romm.app/5.2.0/reference/environment-variables/" ], "installer_profile": { - "stack_driver": "generic-multi-lxc-stack" + "stack_driver": "generic-multi-lxc-stack", + "volume_preparations": [ + { + "container_path": "/romm/resources", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/redis-data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/romm/library", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/romm/assets", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/romm/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/roonserver.json b/oci/catalog/apps/roonserver.json index 686391c8..dbd01b76 100644 --- a/oci/catalog/apps/roonserver.json +++ b/oci/catalog/apps/roonserver.json @@ -421,7 +421,27 @@ "device_inventory": "host-sysfs-and-stat", "application_acceleration": "requires-workload-test", "tone_mapping": "not-implied-by-device-access" - } + }, + "volume_preparations": [ + { + "container_path": "/Roon", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/Music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/RoonBackups", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/rpcs3.json b/oci/catalog/apps/rpcs3.json index a48644bc..802bcd2f 100644 --- a/oci/catalog/apps/rpcs3.json +++ b/oci/catalog/apps/rpcs3.json @@ -232,6 +232,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/rsnapshot.json b/oci/catalog/apps/rsnapshot.json index abb6e039..a6f75a34 100644 --- a/oci/catalog/apps/rsnapshot.json +++ b/oci/catalog/apps/rsnapshot.json @@ -220,7 +220,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/.snapshots", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/rustdesk.json b/oci/catalog/apps/rustdesk.json index fccc398e..6984bdee 100644 --- a/oci/catalog/apps/rustdesk.json +++ b/oci/catalog/apps/rustdesk.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/sabnzbd.json b/oci/catalog/apps/sabnzbd.json index e4a4dcc0..8fd1335d 100644 --- a/oci/catalog/apps/sabnzbd.json +++ b/oci/catalog/apps/sabnzbd.json @@ -236,7 +236,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/incomplete-downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/scummvm.json b/oci/catalog/apps/scummvm.json index 9edbc584..42979461 100644 --- a/oci/catalog/apps/scummvm.json +++ b/oci/catalog/apps/scummvm.json @@ -187,7 +187,15 @@ } } ] - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/sealskin.json b/oci/catalog/apps/sealskin.json index 32fabb71..87ea7cf1 100644 --- a/oci/catalog/apps/sealskin.json +++ b/oci/catalog/apps/sealskin.json @@ -248,7 +248,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/run/docker.sock", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/shadps4.json b/oci/catalog/apps/shadps4.json index c77ca896..ec775583 100644 --- a/oci/catalog/apps/shadps4.json +++ b/oci/catalog/apps/shadps4.json @@ -215,6 +215,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/shotcut.json b/oci/catalog/apps/shotcut.json index 0a6ccf6d..05b1ed77 100644 --- a/oci/catalog/apps/shotcut.json +++ b/oci/catalog/apps/shotcut.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/sickchill.json b/oci/catalog/apps/sickchill.json index 3cd687c1..0553892c 100644 --- a/oci/catalog/apps/sickchill.json +++ b/oci/catalog/apps/sickchill.json @@ -431,7 +431,29 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/sickgear.json b/oci/catalog/apps/sickgear.json index c683aa69..c7d4d52f 100644 --- a/oci/catalog/apps/sickgear.json +++ b/oci/catalog/apps/sickgear.json @@ -234,7 +234,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/signal.json b/oci/catalog/apps/signal.json index 486c54f6..293a3b5d 100644 --- a/oci/catalog/apps/signal.json +++ b/oci/catalog/apps/signal.json @@ -227,6 +227,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/siyuan-note.json b/oci/catalog/apps/siyuan-note.json index ec57c4f8..e2de9f5f 100644 --- a/oci/catalog/apps/siyuan-note.json +++ b/oci/catalog/apps/siyuan-note.json @@ -258,7 +258,15 @@ "installer_profile": { "runtime": { "command": "--accessAuthCode=casaos --workspace=/siyuan/workspace/" - } + }, + "volume_preparations": [ + { + "container_path": "/siyuan/workspace", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/smokeping.json b/oci/catalog/apps/smokeping.json index bc236052..8428fba1 100644 --- a/oci/catalog/apps/smokeping.json +++ b/oci/catalog/apps/smokeping.json @@ -217,7 +217,21 @@ "installer_profile": { "runtime": { "hostname": "smokeping" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/snapdrop.json b/oci/catalog/apps/snapdrop.json index 0cb1ed7d..e51acdfe 100644 --- a/oci/catalog/apps/snapdrop.json +++ b/oci/catalog/apps/snapdrop.json @@ -373,7 +373,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/snapotter.json b/oci/catalog/apps/snapotter.json index b40629eb..cebac63b 100644 --- a/oci/catalog/apps/snapotter.json +++ b/oci/catalog/apps/snapotter.json @@ -361,7 +361,21 @@ "verify_tls": true, "required": true, "source": "compose-healthcheck" - } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tmp/workspace", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/sonarr.json b/oci/catalog/apps/sonarr.json index 73c37068..1cf20349 100644 --- a/oci/catalog/apps/sonarr.json +++ b/oci/catalog/apps/sonarr.json @@ -236,7 +236,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/speedtest-tracker.json b/oci/catalog/apps/speedtest-tracker.json index eb201b15..6ef23b9c 100644 --- a/oci/catalog/apps/speedtest-tracker.json +++ b/oci/catalog/apps/speedtest-tracker.json @@ -286,7 +286,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/spotube.json b/oci/catalog/apps/spotube.json index 1b3ac878..e12fd65e 100644 --- a/oci/catalog/apps/spotube.json +++ b/oci/catalog/apps/spotube.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/sqlitebrowser.json b/oci/catalog/apps/sqlitebrowser.json index fb19cd88..6bc72a45 100644 --- a/oci/catalog/apps/sqlitebrowser.json +++ b/oci/catalog/apps/sqlitebrowser.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/stable-diffusion-webui-nvidia.json b/oci/catalog/apps/stable-diffusion-webui-nvidia.json index 97e982cd..b9f792f9 100644 --- a/oci/catalog/apps/stable-diffusion-webui-nvidia.json +++ b/oci/catalog/apps/stable-diffusion-webui-nvidia.json @@ -352,7 +352,27 @@ "device_inventory": "host-sysfs-and-stat", "application_acceleration": "requires-workload-test", "tone_mapping": "not-implied-by-device-access" - } + }, + "volume_preparations": [ + { + "container_path": "/data/models", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/outputs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/steam.json b/oci/catalog/apps/steam.json index 2c07b3e3..1d5cdefa 100644 --- a/oci/catalog/apps/steam.json +++ b/oci/catalog/apps/steam.json @@ -204,7 +204,15 @@ } } ] - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/stremio.json b/oci/catalog/apps/stremio.json index 538ebd16..a05c682e 100644 --- a/oci/catalog/apps/stremio.json +++ b/oci/catalog/apps/stremio.json @@ -303,7 +303,15 @@ "device_inventory": "host-sysfs-and-stat", "application_acceleration": "requires-workload-test", "tone_mapping": "not-implied-by-device-access" - } + }, + "volume_preparations": [ + { + "container_path": "/root/.stremio-server", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/suite-arr.json b/oci/catalog/apps/suite-arr.json index c31534d8..d3de36f8 100644 --- a/oci/catalog/apps/suite-arr.json +++ b/oci/catalog/apps/suite-arr.json @@ -295,7 +295,15 @@ "hookscript": false, "onboot": "user-choice-applied-to-each-lxc", "initial_start": "installer-only-for-first-configuration" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/swag.json b/oci/catalog/apps/swag.json index be4ece8a..f6d1521d 100644 --- a/oci/catalog/apps/swag.json +++ b/oci/catalog/apps/swag.json @@ -294,7 +294,15 @@ "required_capabilities": [ "NET_ADMIN" ] - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/swingmusic.json b/oci/catalog/apps/swingmusic.json index bae048e3..89b352cd 100644 --- a/oci/catalog/apps/swingmusic.json +++ b/oci/catalog/apps/swingmusic.json @@ -359,7 +359,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/syncthing.json b/oci/catalog/apps/syncthing.json index 2154aff2..b4552f6d 100644 --- a/oci/catalog/apps/syncthing.json +++ b/oci/catalog/apps/syncthing.json @@ -233,7 +233,27 @@ "installer_profile": { "runtime": { "hostname": "syncthing" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data1", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data2", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/syslog-ng.json b/oci/catalog/apps/syslog-ng.json index ac00e95f..97b8cfd2 100644 --- a/oci/catalog/apps/syslog-ng.json +++ b/oci/catalog/apps/syslog-ng.json @@ -240,7 +240,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/log", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/tailscale.json b/oci/catalog/apps/tailscale.json index 508748bf..774601a3 100644 --- a/oci/catalog/apps/tailscale.json +++ b/oci/catalog/apps/tailscale.json @@ -280,7 +280,15 @@ "NET_ADMIN", "NET_RAW" ] - } + }, + "volume_preparations": [ + { + "container_path": "/var/lib/tailscale", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/tandoor.json b/oci/catalog/apps/tandoor.json index 0fb29cf1..c2b488dd 100644 --- a/oci/catalog/apps/tandoor.json +++ b/oci/catalog/apps/tandoor.json @@ -391,7 +391,22 @@ "validation": "pending-clean-install" } ], - "installer_profile": {}, + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/recipes/staticfiles", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/recipes/mediafiles", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + }, "security_profile": { "requires_privileged_lxc": false, "source_requests_privileged_lxc": false, diff --git a/oci/catalog/apps/tautulli.json b/oci/catalog/apps/tautulli.json index d877ee98..c62e8320 100644 --- a/oci/catalog/apps/tautulli.json +++ b/oci/catalog/apps/tautulli.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/tdarr.json b/oci/catalog/apps/tdarr.json index d29934d1..43c27131 100644 --- a/oci/catalog/apps/tdarr.json +++ b/oci/catalog/apps/tdarr.json @@ -616,7 +616,33 @@ ] } ] - } + }, + "volume_preparations": [ + { + "container_path": "/app/configs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/temp", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/teable.json b/oci/catalog/apps/teable.json index 77492157..39b67beb 100644 --- a/oci/catalog/apps/teable.json +++ b/oci/catalog/apps/teable.json @@ -598,7 +598,15 @@ "https://redis.io/docs/latest/develop/tools/cli/" ], "installer_profile": { - "stack_driver": "generic-multi-lxc-stack" + "stack_driver": "generic-multi-lxc-stack", + "volume_preparations": [ + { + "container_path": "/app/.assets", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/telegram.json b/oci/catalog/apps/telegram.json index 48673bcc..2e002ffc 100644 --- a/oci/catalog/apps/telegram.json +++ b/oci/catalog/apps/telegram.json @@ -228,6 +228,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/thelounge.json b/oci/catalog/apps/thelounge.json index 53799074..ff12be9a 100644 --- a/oci/catalog/apps/thelounge.json +++ b/oci/catalog/apps/thelounge.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/threadfin.json b/oci/catalog/apps/threadfin.json index b9967732..3fc7ba8e 100644 --- a/oci/catalog/apps/threadfin.json +++ b/oci/catalog/apps/threadfin.json @@ -383,7 +383,23 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/home/threadfin/conf/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/home/threadfin/conf/backup", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/thunderbird.json b/oci/catalog/apps/thunderbird.json index d01cef9a..ff5e94ca 100644 --- a/oci/catalog/apps/thunderbird.json +++ b/oci/catalog/apps/thunderbird.json @@ -228,6 +228,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/transmission.json b/oci/catalog/apps/transmission.json index f6eb3014..0d6b6330 100644 --- a/oci/catalog/apps/transmission.json +++ b/oci/catalog/apps/transmission.json @@ -292,7 +292,29 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/watch", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/trilium.json b/oci/catalog/apps/trilium.json index 313c26b4..46879e05 100644 --- a/oci/catalog/apps/trilium.json +++ b/oci/catalog/apps/trilium.json @@ -240,7 +240,15 @@ "installer_profile": { "runtime": { "command": [] - } + }, + "volume_preparations": [ + { + "container_path": "/home/node/trilium-data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/tvheadend.json b/oci/catalog/apps/tvheadend.json index 5e968087..737f2aa7 100644 --- a/oci/catalog/apps/tvheadend.json +++ b/oci/catalog/apps/tvheadend.json @@ -250,7 +250,21 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/recordings", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/ubooquity.json b/oci/catalog/apps/ubooquity.json index ded21491..a946227b 100644 --- a/oci/catalog/apps/ubooquity.json +++ b/oci/catalog/apps/ubooquity.json @@ -264,7 +264,35 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/comics", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/files", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/ungoogled-chromium.json b/oci/catalog/apps/ungoogled-chromium.json index 28ca63c5..4d98676d 100644 --- a/oci/catalog/apps/ungoogled-chromium.json +++ b/oci/catalog/apps/ungoogled-chromium.json @@ -339,7 +339,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/unifi-controller.json b/oci/catalog/apps/unifi-controller.json index f4d651f0..2411d60f 100644 --- a/oci/catalog/apps/unifi-controller.json +++ b/oci/catalog/apps/unifi-controller.json @@ -471,7 +471,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/unifi-network-application.json b/oci/catalog/apps/unifi-network-application.json index dae265bd..997621c7 100644 --- a/oci/catalog/apps/unifi-network-application.json +++ b/oci/catalog/apps/unifi-network-application.json @@ -328,7 +328,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/unpackerr.json b/oci/catalog/apps/unpackerr.json index c9e9cc53..1a8c247e 100644 --- a/oci/catalog/apps/unpackerr.json +++ b/oci/catalog/apps/unpackerr.json @@ -248,6 +248,20 @@ }, "references": [ "https://unpackerr.zip/docs/install/docker/" + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/apps/uptimekuma.json b/oci/catalog/apps/uptimekuma.json index 90bc44ce..ea5cad0d 100644 --- a/oci/catalog/apps/uptimekuma.json +++ b/oci/catalog/apps/uptimekuma.json @@ -340,7 +340,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/v2raya.json b/oci/catalog/apps/v2raya.json index 23677f10..43487c68 100644 --- a/oci/catalog/apps/v2raya.json +++ b/oci/catalog/apps/v2raya.json @@ -287,7 +287,15 @@ "installer_profile": { "network": { "compose_mode": "host" - } + }, + "volume_preparations": [ + { + "container_path": "/etc/v2raya", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/apps/vaultwarden.json b/oci/catalog/apps/vaultwarden.json index f61e953a..2520d5cb 100644 --- a/oci/catalog/apps/vaultwarden.json +++ b/oci/catalog/apps/vaultwarden.json @@ -274,7 +274,15 @@ "request_timeout_seconds": 10, "stability_seconds": 4, "verify_tls": false - } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/virt-manager.json b/oci/catalog/apps/virt-manager.json index 256c6f30..9a5f9daf 100644 --- a/oci/catalog/apps/virt-manager.json +++ b/oci/catalog/apps/virt-manager.json @@ -331,6 +331,26 @@ "gid_strategy": "host-device-gid", "source_mapping": "/dev/kvm:/dev/kvm" } + ], + "volume_preparations": [ + { + "container_path": "/var/run/libvirt/libvirt-sock", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/lib/libvirt", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/DATA/Downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/apps/vivaldi.json b/oci/catalog/apps/vivaldi.json index fbe385d4..e7982a1b 100644 --- a/oci/catalog/apps/vivaldi.json +++ b/oci/catalog/apps/vivaldi.json @@ -231,6 +231,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/vlc.json b/oci/catalog/apps/vlc.json index 4276e64b..e3119763 100644 --- a/oci/catalog/apps/vlc.json +++ b/oci/catalog/apps/vlc.json @@ -231,6 +231,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/vocechat.json b/oci/catalog/apps/vocechat.json index fbaac38b..4d0d200e 100644 --- a/oci/catalog/apps/vocechat.json +++ b/oci/catalog/apps/vocechat.json @@ -350,7 +350,17 @@ "behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/home/vocechat-server/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/vscode.json b/oci/catalog/apps/vscode.json index c8b6d4e5..1c9cb8bc 100644 --- a/oci/catalog/apps/vscode.json +++ b/oci/catalog/apps/vscode.json @@ -191,7 +191,15 @@ "required_capabilities": [ "IPC_LOCK" ] - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/vscodium-web.json b/oci/catalog/apps/vscodium-web.json index 1592ff77..468e0c9d 100644 --- a/oci/catalog/apps/vscodium-web.json +++ b/oci/catalog/apps/vscodium-web.json @@ -229,7 +229,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/vscodium.json b/oci/catalog/apps/vscodium.json index cceadc6d..a939d311 100644 --- a/oci/catalog/apps/vscodium.json +++ b/oci/catalog/apps/vscodium.json @@ -203,7 +203,15 @@ "required_capabilities": [ "IPC_LOCK" ] - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/wallabag.json b/oci/catalog/apps/wallabag.json index 54de870f..99fe72ef 100644 --- a/oci/catalog/apps/wallabag.json +++ b/oci/catalog/apps/wallabag.json @@ -278,7 +278,15 @@ "verify_tls": true, "required": true, "source": "compose-healthcheck" - } + }, + "volume_preparations": [ + { + "container_path": "/var/www/wallabag/web/assets/images", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/webcord.json b/oci/catalog/apps/webcord.json index 8ac3cc21..ac81c421 100644 --- a/oci/catalog/apps/webcord.json +++ b/oci/catalog/apps/webcord.json @@ -332,7 +332,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/webgrabplus.json b/oci/catalog/apps/webgrabplus.json index b8bd9f4f..dccabb31 100644 --- a/oci/catalog/apps/webgrabplus.json +++ b/oci/catalog/apps/webgrabplus.json @@ -180,7 +180,21 @@ "installer_profile": { "runtime": { "hostname": "webgrabplus" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/webstation.json b/oci/catalog/apps/webstation.json index d30ce23e..f44ae2aa 100644 --- a/oci/catalog/apps/webstation.json +++ b/oci/catalog/apps/webstation.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/webtop.json b/oci/catalog/apps/webtop.json index be5ae880..cb88fd81 100644 --- a/oci/catalog/apps/webtop.json +++ b/oci/catalog/apps/webtop.json @@ -232,6 +232,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/weixin.json b/oci/catalog/apps/weixin.json index a1a6b9bf..ddd83486 100644 --- a/oci/catalog/apps/weixin.json +++ b/oci/catalog/apps/weixin.json @@ -228,6 +228,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/wg-easy.json b/oci/catalog/apps/wg-easy.json index 2811ba84..6c0083a3 100644 --- a/oci/catalog/apps/wg-easy.json +++ b/oci/catalog/apps/wg-easy.json @@ -321,7 +321,15 @@ "value": "1" } ] - } + }, + "volume_preparations": [ + { + "container_path": "/etc/wireguard", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/wikijs.json b/oci/catalog/apps/wikijs.json index 5479a33a..a92c7d57 100644 --- a/oci/catalog/apps/wikijs.json +++ b/oci/catalog/apps/wikijs.json @@ -260,7 +260,23 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/winegui.json b/oci/catalog/apps/winegui.json index 431ca136..7f3df656 100644 --- a/oci/catalog/apps/winegui.json +++ b/oci/catalog/apps/winegui.json @@ -215,6 +215,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/wireguard.json b/oci/catalog/apps/wireguard.json index 6ea1ced8..907fcb37 100644 --- a/oci/catalog/apps/wireguard.json +++ b/oci/catalog/apps/wireguard.json @@ -261,7 +261,15 @@ "value": "1" } ] - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/wireshark.json b/oci/catalog/apps/wireshark.json index 25400f66..9baf5ae7 100644 --- a/oci/catalog/apps/wireshark.json +++ b/oci/catalog/apps/wireshark.json @@ -306,7 +306,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/apps/wps-office.json b/oci/catalog/apps/wps-office.json index 258fa0ce..77435726 100644 --- a/oci/catalog/apps/wps-office.json +++ b/oci/catalog/apps/wps-office.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/xbackbone.json b/oci/catalog/apps/xbackbone.json index 90d228f2..8f75d450 100644 --- a/oci/catalog/apps/xbackbone.json +++ b/oci/catalog/apps/xbackbone.json @@ -209,7 +209,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/xemu.json b/oci/catalog/apps/xemu.json index bf4f4c3d..a960b57a 100644 --- a/oci/catalog/apps/xemu.json +++ b/oci/catalog/apps/xemu.json @@ -232,6 +232,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/yaak.json b/oci/catalog/apps/yaak.json index fce94c29..a6a73e47 100644 --- a/oci/catalog/apps/yaak.json +++ b/oci/catalog/apps/yaak.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/zen.json b/oci/catalog/apps/zen.json index 1e9981ed..e7d30eb7 100644 --- a/oci/catalog/apps/zen.json +++ b/oci/catalog/apps/zen.json @@ -224,6 +224,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/apps/znc.json b/oci/catalog/apps/znc.json index a504fc0f..d5353fbc 100644 --- a/oci/catalog/apps/znc.json +++ b/oci/catalog/apps/znc.json @@ -202,7 +202,17 @@ "behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.", "validation": "not-requested-by-compose" } - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "compatibility": { "automatic_install_candidate": true, diff --git a/oci/catalog/apps/zotero.json b/oci/catalog/apps/zotero.json index 865d7ffe..4facdf9f 100644 --- a/oci/catalog/apps/zotero.json +++ b/oci/catalog/apps/zotero.json @@ -331,7 +331,15 @@ "service_user": "abc", "environment": "ATTACHED_DEVICES_PERMS", "paths": "all-resolved-selected-character-devices" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/apps/ztnet.json b/oci/catalog/apps/ztnet.json index 08475574..ee269f9a 100644 --- a/oci/catalog/apps/ztnet.json +++ b/oci/catalog/apps/ztnet.json @@ -409,7 +409,15 @@ "installer_profile": { "runtime": { "working_directory": "/app" - } + }, + "volume_preparations": [ + { + "container_path": "/var/lib/zerotier-one", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/curated/amule.json b/oci/catalog/curated/amule.json index fa3df805..bb1aad93 100644 --- a/oci/catalog/curated/amule.json +++ b/oci/catalog/curated/amule.json @@ -394,7 +394,21 @@ "request_timeout_seconds": 10, "stability_seconds": 4, "verify_tls": false - } + }, + "volume_preparations": [ + { + "container_path": "/home/amule/.aMule", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/curated/codeproject-ai.json b/oci/catalog/curated/codeproject-ai.json index 4bace122..3fb238a1 100644 --- a/oci/catalog/curated/codeproject-ai.json +++ b/oci/catalog/curated/codeproject-ai.json @@ -353,7 +353,21 @@ ] } ] - } + }, + "volume_preparations": [ + { + "container_path": "/etc/codeproject/ai", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/modules", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "security_profile": { "requires_privileged_lxc": false, diff --git a/oci/catalog/curated/docker-volume-backup.json b/oci/catalog/curated/docker-volume-backup.json index 7bbb24bf..df9f508f 100644 --- a/oci/catalog/curated/docker-volume-backup.json +++ b/oci/catalog/curated/docker-volume-backup.json @@ -272,7 +272,22 @@ "validation": "not-required" } ], - "installer_profile": {}, + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/backup", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + }, "security_profile": { "requires_privileged_lxc": false, "source_requests_privileged_lxc": false, diff --git a/oci/catalog/curated/emby-official.json b/oci/catalog/curated/emby-official.json index 4ba13fca..ca474da2 100644 --- a/oci/catalog/curated/emby-official.json +++ b/oci/catalog/curated/emby-official.json @@ -289,6 +289,18 @@ "remove_lost_found": true, "owner_strategy": "mapped-application-user", "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/mnt/share1", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/mnt/share2", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" } ] }, diff --git a/oci/catalog/curated/fileflows.json b/oci/catalog/curated/fileflows.json index 1fe6b595..1d4aa4bc 100644 --- a/oci/catalog/curated/fileflows.json +++ b/oci/catalog/curated/fileflows.json @@ -450,7 +450,39 @@ ] } ] - } + }, + "volume_preparations": [ + { + "container_path": "/app/Data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/Logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/common", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/temp", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/Media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/curated/frigate.json b/oci/catalog/curated/frigate.json index 11d8bbe4..793d7c00 100644 --- a/oci/catalog/curated/frigate.json +++ b/oci/catalog/curated/frigate.json @@ -949,6 +949,20 @@ } ] }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media/frigate", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ], "cpu_allocation": "quota" }, "image_channel_policy": { diff --git a/oci/catalog/curated/jdownloader.json b/oci/catalog/curated/jdownloader.json index 6eb741f7..e040a7bd 100644 --- a/oci/catalog/curated/jdownloader.json +++ b/oci/catalog/curated/jdownloader.json @@ -873,6 +873,12 @@ "container_path": "/config", "remove_lost_found": true, "owner_strategy": "mapped-root" + }, + { + "container_path": "/output", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" } ], "runtime": { diff --git a/oci/catalog/curated/jellyfin-official.json b/oci/catalog/curated/jellyfin-official.json index 4242c9e8..df3ae44e 100644 --- a/oci/catalog/curated/jellyfin-official.json +++ b/oci/catalog/curated/jellyfin-official.json @@ -443,7 +443,27 @@ }, "network": { "compose_mode": "bridge" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/cache", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "application_options": { "hdr10_dolby_vision_tone_mapping": { diff --git a/oci/catalog/curated/open-webui-cuda.json b/oci/catalog/curated/open-webui-cuda.json index 50d7d60a..f2473ad9 100644 --- a/oci/catalog/curated/open-webui-cuda.json +++ b/oci/catalog/curated/open-webui-cuda.json @@ -11,7 +11,7 @@ "en_US": "User-friendly WebUI for LLMs (Formerly Ollama WebUI)" }, "description": { - "en_US": "Open WebUI is a feature-rich, user-friendly self-hosted AI platform designed for fully offline operation, supporting multiple large language model runners and API integration. Its intuitive Web interface provides powerful AI deployment capabilities, ideal for developers, researchers, and AI enthusiasts building localized intelligent applications.\n\nThe tool's core features include local model execution and Retrieval Augmented Generation (RAG). It supports Ollama and OpenAI-compatible APIs (e.g., LMStudio, GroqCloud), enabling seamless model switching and multi-model conversations. RAG enhances chat experiences through local document loading or web search integration (e.g., SearXNG, Google PSE). Granular permissions and role-based access control (RBAC) ensure security with customized user role management.\n\nIt supports Markdown and LaTeX for enriched interactions and offers hands-free voice and video call features for dynamic communication. Image generation integration (e.g., DALL-E, ComfyUI) enriches visual content, and a model builder enables creating and importing custom models via the interface. The Pipelines plugin framework supports Python plugins, extending functionality like function calling and real-time translation. The tool\u2019s offline privacy and flexibility deliver a modern AI interaction solution.\n\n**Key Features:**\n- Local execution of Ollama and OpenAI-compatible APIs with multi-model conversations\n- RAG support with local document and web search integration (e.g., SearXNG, Google PSE)\n- Granular permissions and role-based access control (RBAC)\n- Simultaneous interaction with multiple models, leveraging their strengths\n- Image generation integration with DALL-E, ComfyUI, and more\n- Full Markdown and LaTeX support\n- Hands-free voice and video call functionality\n- Pipelines plugin framework for custom Python functionality\n\n**Learn More:**\n- [Open WebUI Official Website](https://openwebui.com)\n- [Open WebUI Documentation](https://docs.openwebui.com)\n- [Open WebUI GitHub Repository](https://github.com/open-webui/open-webui)\n" + "en_US": "Open WebUI is a feature-rich, user-friendly self-hosted AI platform designed for fully offline operation, supporting multiple large language model runners and API integration. Its intuitive Web interface provides powerful AI deployment capabilities, ideal for developers, researchers, and AI enthusiasts building localized intelligent applications.\n\nThe tool's core features include local model execution and Retrieval Augmented Generation (RAG). It supports Ollama and OpenAI-compatible APIs (e.g., LMStudio, GroqCloud), enabling seamless model switching and multi-model conversations. RAG enhances chat experiences through local document loading or web search integration (e.g., SearXNG, Google PSE). Granular permissions and role-based access control (RBAC) ensure security with customized user role management.\n\nIt supports Markdown and LaTeX for enriched interactions and offers hands-free voice and video call features for dynamic communication. Image generation integration (e.g., DALL-E, ComfyUI) enriches visual content, and a model builder enables creating and importing custom models via the interface. The Pipelines plugin framework supports Python plugins, extending functionality like function calling and real-time translation. The tool’s offline privacy and flexibility deliver a modern AI interaction solution.\n\n**Key Features:**\n- Local execution of Ollama and OpenAI-compatible APIs with multi-model conversations\n- RAG support with local document and web search integration (e.g., SearXNG, Google PSE)\n- Granular permissions and role-based access control (RBAC)\n- Simultaneous interaction with multiple models, leveraging their strengths\n- Image generation integration with DALL-E, ComfyUI, and more\n- Full Markdown and LaTeX support\n- Hands-free voice and video call functionality\n- Pipelines plugin framework for custom Python functionality\n\n**Learn More:**\n- [Open WebUI Official Website](https://openwebui.com)\n- [Open WebUI Documentation](https://docs.openwebui.com)\n- [Open WebUI GitHub Repository](https://github.com/open-webui/open-webui)\n" }, "category": "ai", "category_label": "AI / Coding & Dev-Tools", @@ -283,6 +283,14 @@ "required_by_compose": true, "required_for_runtime": true } + ], + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/curated/open-webui-ollama.json b/oci/catalog/curated/open-webui-ollama.json index 30674282..58365f36 100644 --- a/oci/catalog/curated/open-webui-ollama.json +++ b/oci/catalog/curated/open-webui-ollama.json @@ -11,7 +11,7 @@ "en_US": "User-friendly WebUI for LLMs (Formerly Ollama WebUI)" }, "description": { - "en_US": "Open WebUI is a feature-rich, user-friendly self-hosted AI platform designed for fully offline operation, supporting multiple large language model runners and API integration. Its intuitive Web interface provides powerful AI deployment capabilities, ideal for developers, researchers, and AI enthusiasts building localized intelligent applications.\n\nThe tool's core features include local model execution and Retrieval Augmented Generation (RAG). It supports Ollama and OpenAI-compatible APIs (e.g., LMStudio, GroqCloud), enabling seamless model switching and multi-model conversations. RAG enhances chat experiences through local document loading or web search integration (e.g., SearXNG, Google PSE). Granular permissions and role-based access control (RBAC) ensure security with customized user role management.\n\nIt supports Markdown and LaTeX for enriched interactions and offers hands-free voice and video call features for dynamic communication. Image generation integration (e.g., DALL-E, ComfyUI) enriches visual content, and a model builder enables creating and importing custom models via the interface. The Pipelines plugin framework supports Python plugins, extending functionality like function calling and real-time translation. The tool\u2019s offline privacy and flexibility deliver a modern AI interaction solution.\n\n**Key Features:**\n- Local execution of Ollama and OpenAI-compatible APIs with multi-model conversations\n- RAG support with local document and web search integration (e.g., SearXNG, Google PSE)\n- Granular permissions and role-based access control (RBAC)\n- Simultaneous interaction with multiple models, leveraging their strengths\n- Image generation integration with DALL-E, ComfyUI, and more\n- Full Markdown and LaTeX support\n- Hands-free voice and video call functionality\n- Pipelines plugin framework for custom Python functionality\n\n**Learn More:**\n- [Open WebUI Official Website](https://openwebui.com)\n- [Open WebUI Documentation](https://docs.openwebui.com)\n- [Open WebUI GitHub Repository](https://github.com/open-webui/open-webui)\n" + "en_US": "Open WebUI is a feature-rich, user-friendly self-hosted AI platform designed for fully offline operation, supporting multiple large language model runners and API integration. Its intuitive Web interface provides powerful AI deployment capabilities, ideal for developers, researchers, and AI enthusiasts building localized intelligent applications.\n\nThe tool's core features include local model execution and Retrieval Augmented Generation (RAG). It supports Ollama and OpenAI-compatible APIs (e.g., LMStudio, GroqCloud), enabling seamless model switching and multi-model conversations. RAG enhances chat experiences through local document loading or web search integration (e.g., SearXNG, Google PSE). Granular permissions and role-based access control (RBAC) ensure security with customized user role management.\n\nIt supports Markdown and LaTeX for enriched interactions and offers hands-free voice and video call features for dynamic communication. Image generation integration (e.g., DALL-E, ComfyUI) enriches visual content, and a model builder enables creating and importing custom models via the interface. The Pipelines plugin framework supports Python plugins, extending functionality like function calling and real-time translation. The tool’s offline privacy and flexibility deliver a modern AI interaction solution.\n\n**Key Features:**\n- Local execution of Ollama and OpenAI-compatible APIs with multi-model conversations\n- RAG support with local document and web search integration (e.g., SearXNG, Google PSE)\n- Granular permissions and role-based access control (RBAC)\n- Simultaneous interaction with multiple models, leveraging their strengths\n- Image generation integration with DALL-E, ComfyUI, and more\n- Full Markdown and LaTeX support\n- Hands-free voice and video call functionality\n- Pipelines plugin framework for custom Python functionality\n\n**Learn More:**\n- [Open WebUI Official Website](https://openwebui.com)\n- [Open WebUI Documentation](https://docs.openwebui.com)\n- [Open WebUI GitHub Repository](https://github.com/open-webui/open-webui)\n" }, "category": "ai", "category_label": "AI / Coding & Dev-Tools", @@ -287,6 +287,20 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/root/.ollama", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/curated/open-webui.json b/oci/catalog/curated/open-webui.json index c7f93099..98ddbfb1 100644 --- a/oci/catalog/curated/open-webui.json +++ b/oci/catalog/curated/open-webui.json @@ -11,7 +11,7 @@ "en_US": "User-friendly WebUI for LLMs (Formerly Ollama WebUI)" }, "description": { - "en_US": "Open WebUI is a feature-rich, user-friendly self-hosted AI platform designed for fully offline operation, supporting multiple large language model runners and API integration. Its intuitive Web interface provides powerful AI deployment capabilities, ideal for developers, researchers, and AI enthusiasts building localized intelligent applications.\n\nThe tool's core features include local model execution and Retrieval Augmented Generation (RAG). It supports Ollama and OpenAI-compatible APIs (e.g., LMStudio, GroqCloud), enabling seamless model switching and multi-model conversations. RAG enhances chat experiences through local document loading or web search integration (e.g., SearXNG, Google PSE). Granular permissions and role-based access control (RBAC) ensure security with customized user role management.\n\nIt supports Markdown and LaTeX for enriched interactions and offers hands-free voice and video call features for dynamic communication. Image generation integration (e.g., DALL-E, ComfyUI) enriches visual content, and a model builder enables creating and importing custom models via the interface. The Pipelines plugin framework supports Python plugins, extending functionality like function calling and real-time translation. The tool\u2019s offline privacy and flexibility deliver a modern AI interaction solution.\n\n**Key Features:**\n- Local execution of Ollama and OpenAI-compatible APIs with multi-model conversations\n- RAG support with local document and web search integration (e.g., SearXNG, Google PSE)\n- Granular permissions and role-based access control (RBAC)\n- Simultaneous interaction with multiple models, leveraging their strengths\n- Image generation integration with DALL-E, ComfyUI, and more\n- Full Markdown and LaTeX support\n- Hands-free voice and video call functionality\n- Pipelines plugin framework for custom Python functionality\n\n**Learn More:**\n- [Open WebUI Official Website](https://openwebui.com)\n- [Open WebUI Documentation](https://docs.openwebui.com)\n- [Open WebUI GitHub Repository](https://github.com/open-webui/open-webui)\n" + "en_US": "Open WebUI is a feature-rich, user-friendly self-hosted AI platform designed for fully offline operation, supporting multiple large language model runners and API integration. Its intuitive Web interface provides powerful AI deployment capabilities, ideal for developers, researchers, and AI enthusiasts building localized intelligent applications.\n\nThe tool's core features include local model execution and Retrieval Augmented Generation (RAG). It supports Ollama and OpenAI-compatible APIs (e.g., LMStudio, GroqCloud), enabling seamless model switching and multi-model conversations. RAG enhances chat experiences through local document loading or web search integration (e.g., SearXNG, Google PSE). Granular permissions and role-based access control (RBAC) ensure security with customized user role management.\n\nIt supports Markdown and LaTeX for enriched interactions and offers hands-free voice and video call features for dynamic communication. Image generation integration (e.g., DALL-E, ComfyUI) enriches visual content, and a model builder enables creating and importing custom models via the interface. The Pipelines plugin framework supports Python plugins, extending functionality like function calling and real-time translation. The tool’s offline privacy and flexibility deliver a modern AI interaction solution.\n\n**Key Features:**\n- Local execution of Ollama and OpenAI-compatible APIs with multi-model conversations\n- RAG support with local document and web search integration (e.g., SearXNG, Google PSE)\n- Granular permissions and role-based access control (RBAC)\n- Simultaneous interaction with multiple models, leveraging their strengths\n- Image generation integration with DALL-E, ComfyUI, and more\n- Full Markdown and LaTeX support\n- Hands-free voice and video call functionality\n- Pipelines plugin framework for custom Python functionality\n\n**Learn More:**\n- [Open WebUI Official Website](https://openwebui.com)\n- [Open WebUI Documentation](https://docs.openwebui.com)\n- [Open WebUI GitHub Repository](https://github.com/open-webui/open-webui)\n" }, "category": "ai", "category_label": "AI / Coding & Dev-Tools", @@ -271,6 +271,14 @@ "nodev" ] } + ], + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/curated/plex-official.json b/oci/catalog/curated/plex-official.json index 338f1186..80f224a5 100644 --- a/oci/catalog/curated/plex-official.json +++ b/oci/catalog/curated/plex-official.json @@ -329,7 +329,27 @@ "request_timeout_seconds": 10, "stability_seconds": 4, "verify_tls": false - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/transcode", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/curated/rclone.json b/oci/catalog/curated/rclone.json index 4bc4f3ff..87ce6807 100644 --- a/oci/catalog/curated/rclone.json +++ b/oci/catalog/curated/rclone.json @@ -819,6 +819,12 @@ "container_path": "/config/rclone", "remove_lost_found": true, "owner_strategy": "mapped-root" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" } ], "runtime": { diff --git a/oci/catalog/curated/roonserver.json b/oci/catalog/curated/roonserver.json index 9d46d916..f51106ad 100644 --- a/oci/catalog/curated/roonserver.json +++ b/oci/catalog/curated/roonserver.json @@ -416,6 +416,26 @@ "gid_strategy": "host-device-gid", "source_mapping": "/dev/bus/usb:/dev/bus/usb" } + ], + "volume_preparations": [ + { + "container_path": "/Roon", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/Music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/RoonBackups", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "security_profile": { diff --git a/oci/catalog/curated/stremio.json b/oci/catalog/curated/stremio.json index 63288656..8caf5776 100644 --- a/oci/catalog/curated/stremio.json +++ b/oci/catalog/curated/stremio.json @@ -298,7 +298,15 @@ ] } ] - } + }, + "volume_preparations": [ + { + "container_path": "/root/.stremio-server", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "adaptations": [ { diff --git a/oci/catalog/curated/suite-arr.json b/oci/catalog/curated/suite-arr.json index c8c07c54..a89c8ef2 100644 --- a/oci/catalog/curated/suite-arr.json +++ b/oci/catalog/curated/suite-arr.json @@ -295,7 +295,15 @@ "hookscript": false, "onboot": "user-choice-applied-to-each-lxc", "initial_start": "installer-only-for-first-configuration" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/curated/tandoor.json b/oci/catalog/curated/tandoor.json index 4bc70d5c..1a05dbcf 100644 --- a/oci/catalog/curated/tandoor.json +++ b/oci/catalog/curated/tandoor.json @@ -391,7 +391,22 @@ "validation": "pending-clean-install" } ], - "installer_profile": {}, + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/recipes/staticfiles", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/recipes/mediafiles", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + }, "security_profile": { "requires_privileged_lxc": false, "source_requests_privileged_lxc": false, diff --git a/oci/catalog/curated/tdarr.json b/oci/catalog/curated/tdarr.json index 670674fd..acec6219 100644 --- a/oci/catalog/curated/tdarr.json +++ b/oci/catalog/curated/tdarr.json @@ -616,7 +616,33 @@ ] } ] - } + }, + "volume_preparations": [ + { + "container_path": "/app/configs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/temp", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/curated/unpackerr.json b/oci/catalog/curated/unpackerr.json index aaead7d1..d8eda322 100644 --- a/oci/catalog/curated/unpackerr.json +++ b/oci/catalog/curated/unpackerr.json @@ -248,6 +248,20 @@ }, "references": [ "https://unpackerr.zip/docs/install/docker/" + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] }, "adaptations": [ diff --git a/oci/catalog/overlays/actualbudget.json b/oci/catalog/overlays/actualbudget.json new file mode 100644 index 00000000..7348b622 --- /dev/null +++ b/oci/catalog/overlays/actualbudget.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/adguard-home.json b/oci/catalog/overlays/adguard-home.json new file mode 100644 index 00000000..c4feec31 --- /dev/null +++ b/oci/catalog/overlays/adguard-home.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/adguardhome/work", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/adguardhome/conf", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/adguardhome-sync.json b/oci/catalog/overlays/adguardhome-sync.json index bd49eb37..30209f7f 100644 --- a/oci/catalog/overlays/adguardhome-sync.json +++ b/oci/catalog/overlays/adguardhome-sync.json @@ -126,7 +126,15 @@ "bytes": 12, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/airsonic-advanced.json b/oci/catalog/overlays/airsonic-advanced.json index c1e815a5..38cdf5a3 100644 --- a/oci/catalog/overlays/airsonic-advanced.json +++ b/oci/catalog/overlays/airsonic-advanced.json @@ -11,5 +11,41 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/playlists", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/podcasts", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/albyhub.json b/oci/catalog/overlays/albyhub.json new file mode 100644 index 00000000..7348b622 --- /dev/null +++ b/oci/catalog/overlays/albyhub.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/alist-sync.json b/oci/catalog/overlays/alist-sync.json index cf77c635..2be4abcf 100644 --- a/oci/catalog/overlays/alist-sync.json +++ b/oci/catalog/overlays/alist-sync.json @@ -11,5 +11,17 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/alist.json b/oci/catalog/overlays/alist.json index 8f481fe2..a3b71cfd 100644 --- a/oci/catalog/overlays/alist.json +++ b/oci/catalog/overlays/alist.json @@ -15,5 +15,17 @@ } } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/alist/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/altus.json b/oci/catalog/overlays/altus.json index b38e50fc..d2d8bba4 100644 --- a/oci/catalog/overlays/altus.json +++ b/oci/catalog/overlays/altus.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/amule.json b/oci/catalog/overlays/amule.json index a051e99b..d759e1b2 100644 --- a/oci/catalog/overlays/amule.json +++ b/oci/catalog/overlays/amule.json @@ -6,6 +6,22 @@ } }, "proxmox": { - "image_selection_note": "The develop tag carries the current aMule build, which is the one this catalog installs. The latest tag still points at 3.0.1-2 (21 August 2026); move back to latest once that release includes what develop carries today (develop-20260919-13a8c9f)." + "image_selection_note": "The develop tag carries the current aMule build, which is the one this catalog installs. The latest tag still points at 3.0.1-2 (21 August 2026); move back to latest once that release includes what develop carries today (develop-20260919-13a8c9f).", + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/home/amule/.aMule", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/anaconda3.json b/oci/catalog/overlays/anaconda3.json index 064329c6..2b203bdc 100644 --- a/oci/catalog/overlays/anaconda3.json +++ b/oci/catalog/overlays/anaconda3.json @@ -54,7 +54,15 @@ "bytes": 16, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/opt/notebooks", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/apprise-api.json b/oci/catalog/overlays/apprise-api.json new file mode 100644 index 00000000..3f9bb7bf --- /dev/null +++ b/oci/catalog/overlays/apprise-api.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/attachments", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/archivebox.json b/oci/catalog/overlays/archivebox.json index cf30d72a..5891a9e1 100644 --- a/oci/catalog/overlays/archivebox.json +++ b/oci/catalog/overlays/archivebox.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Pending multi-container adaptation; retained for future work" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/ardour.json b/oci/catalog/overlays/ardour.json index cb6c9509..5ce2c81e 100644 --- a/oci/catalog/overlays/ardour.json +++ b/oci/catalog/overlays/ardour.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/audacity.json b/oci/catalog/overlays/audacity.json index 9c0bacb7..da663dcf 100644 --- a/oci/catalog/overlays/audacity.json +++ b/oci/catalog/overlays/audacity.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/audiobookshelf.json b/oci/catalog/overlays/audiobookshelf.json new file mode 100644 index 00000000..8018d098 --- /dev/null +++ b/oci/catalog/overlays/audiobookshelf.json @@ -0,0 +1,32 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/audiobooks", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/podcasts", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/metadata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/autobrr.json b/oci/catalog/overlays/autobrr.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/autobrr.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/azahar.json b/oci/catalog/overlays/azahar.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/azahar.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/babybuddy.json b/oci/catalog/overlays/babybuddy.json index b4fe0dfd..b1774b3a 100644 --- a/oci/catalog/overlays/babybuddy.json +++ b/oci/catalog/overlays/babybuddy.json @@ -11,5 +11,17 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/bambustudio.json b/oci/catalog/overlays/bambustudio.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/bambustudio.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/bazarr.json b/oci/catalog/overlays/bazarr.json new file mode 100644 index 00000000..5810c9c0 --- /dev/null +++ b/oci/catalog/overlays/bazarr.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/beets.json b/oci/catalog/overlays/beets.json new file mode 100644 index 00000000..3e7e15be --- /dev/null +++ b/oci/catalog/overlays/beets.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/bitcoin-knots.json b/oci/catalog/overlays/bitcoin-knots.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/bitcoin-knots.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/blade-of-agony.json b/oci/catalog/overlays/blade-of-agony.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/blade-of-agony.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/blender.json b/oci/catalog/overlays/blender.json index 6071c2b7..19eb642f 100644 --- a/oci/catalog/overlays/blender.json +++ b/oci/catalog/overlays/blender.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/blinko.json b/oci/catalog/overlays/blinko.json new file mode 100644 index 00000000..2cb5c471 --- /dev/null +++ b/oci/catalog/overlays/blinko.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/.blinko", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/boinc.json b/oci/catalog/overlays/boinc.json index efc944a5..7597f995 100644 --- a/oci/catalog/overlays/boinc.json +++ b/oci/catalog/overlays/boinc.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/bookstack.json b/oci/catalog/overlays/bookstack.json index 1d842cb2..f4c6870c 100644 --- a/oci/catalog/overlays/bookstack.json +++ b/oci/catalog/overlays/bookstack.json @@ -101,7 +101,15 @@ "bytes": 16, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/brave.json b/oci/catalog/overlays/brave.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/brave.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/budge.json b/oci/catalog/overlays/budge.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/budge.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/calibre-web.json b/oci/catalog/overlays/calibre-web.json new file mode 100644 index 00000000..6bfbd2fc --- /dev/null +++ b/oci/catalog/overlays/calibre-web.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/calibre.json b/oci/catalog/overlays/calibre.json index 5617194c..b71388aa 100644 --- a/oci/catalog/overlays/calibre.json +++ b/oci/catalog/overlays/calibre.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/calligra.json b/oci/catalog/overlays/calligra.json index 0ca4484e..b17cffe8 100644 --- a/oci/catalog/overlays/calligra.json +++ b/oci/catalog/overlays/calligra.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/changedetection.io.json b/oci/catalog/overlays/changedetection.io.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/changedetection.io.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/chrome.json b/oci/catalog/overlays/chrome.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/chrome.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/chromium.json b/oci/catalog/overlays/chromium.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/chromium.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/cloudbeaver.json b/oci/catalog/overlays/cloudbeaver.json new file mode 100644 index 00000000..d691a1f0 --- /dev/null +++ b/oci/catalog/overlays/cloudbeaver.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/cloudbeaver/workspace", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/cloudflared.json b/oci/catalog/overlays/cloudflared.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/cloudflared.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/code-server.json b/oci/catalog/overlays/code-server.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/code-server.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/codeproject-ai.json b/oci/catalog/overlays/codeproject-ai.json new file mode 100644 index 00000000..31d7be54 --- /dev/null +++ b/oci/catalog/overlays/codeproject-ai.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/etc/codeproject/ai", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/modules", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/convertx.json b/oci/catalog/overlays/convertx.json new file mode 100644 index 00000000..f766a3a4 --- /dev/null +++ b/oci/catalog/overlays/convertx.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/cops.json b/oci/catalog/overlays/cops.json new file mode 100644 index 00000000..6bfbd2fc --- /dev/null +++ b/oci/catalog/overlays/cops.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/cura.json b/oci/catalog/overlays/cura.json index 7515df59..11b1647d 100644 --- a/oci/catalog/overlays/cura.json +++ b/oci/catalog/overlays/cura.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/darktable.json b/oci/catalog/overlays/darktable.json index 1136afde..cdf89824 100644 --- a/oci/catalog/overlays/darktable.json +++ b/oci/catalog/overlays/darktable.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/databag.json b/oci/catalog/overlays/databag.json new file mode 100644 index 00000000..c06aba7e --- /dev/null +++ b/oci/catalog/overlays/databag.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/lib/databag", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/davos.json b/oci/catalog/overlays/davos.json new file mode 100644 index 00000000..8bef8b3f --- /dev/null +++ b/oci/catalog/overlays/davos.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/download", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/ddclient.json b/oci/catalog/overlays/ddclient.json index efa59e56..c318d34f 100644 --- a/oci/catalog/overlays/ddclient.json +++ b/oci/catalog/overlays/ddclient.json @@ -3,6 +3,14 @@ "installer_profile": { "completion_notes": [ "ddclient starts with the example configuration and updates nothing yet. Write your provider, login and domains in /config/ddclient.conf inside the container, then restart it." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/ddns-go.json b/oci/catalog/overlays/ddns-go.json new file mode 100644 index 00000000..ee2f4c15 --- /dev/null +++ b/oci/catalog/overlays/ddns-go.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/root", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/deluge.json b/oci/catalog/overlays/deluge.json new file mode 100644 index 00000000..b1103515 --- /dev/null +++ b/oci/catalog/overlays/deluge.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/digikam.json b/oci/catalog/overlays/digikam.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/digikam.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/diskover.json b/oci/catalog/overlays/diskover.json index 70a4f53c..542c71c4 100644 --- a/oci/catalog/overlays/diskover.json +++ b/oci/catalog/overlays/diskover.json @@ -5,7 +5,23 @@ "The upstream original_compose uses Elasticsearch 7.17.22. The normalized catalog candidate uses latest; tag availability and application compatibility must be reviewed before enabling installation.", "The privileged elasticsearch-helper modifies host vm.max_map_count. No host sysctl is changed and this helper must not be discarded silently.", "Elasticsearch persistence, healthchecks and host requirements still block the native stack." - ] + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } }, "catalog_ui": { "hidden": true, diff --git a/oci/catalog/overlays/docker-volume-backup.json b/oci/catalog/overlays/docker-volume-backup.json new file mode 100644 index 00000000..86c35140 --- /dev/null +++ b/oci/catalog/overlays/docker-volume-backup.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/backup", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/dogwalk.json b/oci/catalog/overlays/dogwalk.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/dogwalk.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/dokuwiki.json b/oci/catalog/overlays/dokuwiki.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/dokuwiki.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/dolphin.json b/oci/catalog/overlays/dolphin.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/dolphin.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/doplarr.json b/oci/catalog/overlays/doplarr.json index c70ab086..5e10b7e7 100644 --- a/oci/catalog/overlays/doplarr.json +++ b/oci/catalog/overlays/doplarr.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Deprecated upstream: the image no longer receives updates" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/doplarr_rs.json b/oci/catalog/overlays/doplarr_rs.json index c45e0206..239576a4 100644 --- a/oci/catalog/overlays/doplarr_rs.json +++ b/oci/catalog/overlays/doplarr_rs.json @@ -4,6 +4,14 @@ "completion_notes": [ "doplarr_rs starts from the example configuration and connects to nothing. Write the token of your Discord bot in discord_token in /config/config.toml inside the container.", "Each /request command needs a backend: add a [[backends]] block in the same file with the url and api_key of your Sonarr, Radarr or Seerr instance, then restart the container." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/dosbox-staging.json b/oci/catalog/overlays/dosbox-staging.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/dosbox-staging.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/doublecommander.json b/oci/catalog/overlays/doublecommander.json index 60368c1f..e3ed3ba3 100644 --- a/oci/catalog/overlays/doublecommander.json +++ b/oci/catalog/overlays/doublecommander.json @@ -9,7 +9,21 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/downtify.json b/oci/catalog/overlays/downtify.json new file mode 100644 index 00000000..cd649423 --- /dev/null +++ b/oci/catalog/overlays/downtify.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/dsh-harness.json b/oci/catalog/overlays/dsh-harness.json new file mode 100644 index 00000000..6f7d6603 --- /dev/null +++ b/oci/catalog/overlays/dsh-harness.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/root/.dsh", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/duckdns.json b/oci/catalog/overlays/duckdns.json index e5db75ae..4e45ce33 100644 --- a/oci/catalog/overlays/duckdns.json +++ b/oci/catalog/overlays/duckdns.json @@ -59,6 +59,14 @@ "installer_profile": { "completion_notes": [ "DuckDNS updates the subdomain every 5 minutes. Without UPDATE_IP, DuckDNS itself detects the public IPv4 address of the request." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/duckstation.json b/oci/catalog/overlays/duckstation.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/duckstation.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/duplicati.json b/oci/catalog/overlays/duplicati.json index a4c5ea28..70ffe056 100644 --- a/oci/catalog/overlays/duplicati.json +++ b/oci/catalog/overlays/duplicati.json @@ -73,7 +73,27 @@ "bytes": 12, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/backups", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/source", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/eden.json b/oci/catalog/overlays/eden.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/eden.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/emby-official.json b/oci/catalog/overlays/emby-official.json new file mode 100644 index 00000000..19708108 --- /dev/null +++ b/oci/catalog/overlays/emby-official.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/mnt/share1", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/mnt/share2", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/emby.json b/oci/catalog/overlays/emby.json new file mode 100644 index 00000000..3dfadfa5 --- /dev/null +++ b/oci/catalog/overlays/emby.json @@ -0,0 +1,32 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/tvshows", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/vc/lib", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/embystat.json b/oci/catalog/overlays/embystat.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/embystat.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/emulatorjs.json b/oci/catalog/overlays/emulatorjs.json new file mode 100644 index 00000000..cb0e91f2 --- /dev/null +++ b/oci/catalog/overlays/emulatorjs.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/nes/roms", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/esphome.json b/oci/catalog/overlays/esphome.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/esphome.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/faster-whisper.json b/oci/catalog/overlays/faster-whisper.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/faster-whisper.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/ferdium.json b/oci/catalog/overlays/ferdium.json index f6d3bf5c..72a36f64 100644 --- a/oci/catalog/overlays/ferdium.json +++ b/oci/catalog/overlays/ferdium.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/filedrop.json b/oci/catalog/overlays/filedrop.json new file mode 100644 index 00000000..66522829 --- /dev/null +++ b/oci/catalog/overlays/filedrop.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/file_drop_files", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/fileflows.json b/oci/catalog/overlays/fileflows.json new file mode 100644 index 00000000..1fa93185 --- /dev/null +++ b/oci/catalog/overlays/fileflows.json @@ -0,0 +1,38 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/Data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/Logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/common", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/temp", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/Media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/filezilla.json b/oci/catalog/overlays/filezilla.json index 7d8b15b0..3d773eb8 100644 --- a/oci/catalog/overlays/filezilla.json +++ b/oci/catalog/overlays/filezilla.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/firefly.json b/oci/catalog/overlays/firefly.json new file mode 100644 index 00000000..0e86a8c2 --- /dev/null +++ b/oci/catalog/overlays/firefly.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/firefly/conf", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/firefox.json b/oci/catalog/overlays/firefox.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/firefox.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/flexget.json b/oci/catalog/overlays/flexget.json index add488b7..7ea2c2cb 100644 --- a/oci/catalog/overlays/flexget.json +++ b/oci/catalog/overlays/flexget.json @@ -75,7 +75,21 @@ "bytes": 12, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/flycast.json b/oci/catalog/overlays/flycast.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/flycast.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/foldingathome.json b/oci/catalog/overlays/foldingathome.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/foldingathome.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/freecad.json b/oci/catalog/overlays/freecad.json index 066cd755..5b3d258e 100644 --- a/oci/catalog/overlays/freecad.json +++ b/oci/catalog/overlays/freecad.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/freshrss-official.json b/oci/catalog/overlays/freshrss-official.json new file mode 100644 index 00000000..b3811c4f --- /dev/null +++ b/oci/catalog/overlays/freshrss-official.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/FreshRSS/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/www/FreshRSS/extensions", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/freshrss.json b/oci/catalog/overlays/freshrss.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/freshrss.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/frigate.json b/oci/catalog/overlays/frigate.json new file mode 100644 index 00000000..46e4d898 --- /dev/null +++ b/oci/catalog/overlays/frigate.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media/frigate", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/gateway-go.json b/oci/catalog/overlays/gateway-go.json new file mode 100644 index 00000000..ee2f4c15 --- /dev/null +++ b/oci/catalog/overlays/gateway-go.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/root", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/gimp.json b/oci/catalog/overlays/gimp.json index 670201f4..1852d493 100644 --- a/oci/catalog/overlays/gimp.json +++ b/oci/catalog/overlays/gimp.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/gitea.json b/oci/catalog/overlays/gitea.json new file mode 100644 index 00000000..7348b622 --- /dev/null +++ b/oci/catalog/overlays/gitea.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/github-desktop.json b/oci/catalog/overlays/github-desktop.json index 65ff52bd..52c59944 100644 --- a/oci/catalog/overlays/github-desktop.json +++ b/oci/catalog/overlays/github-desktop.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/gitqlient.json b/oci/catalog/overlays/gitqlient.json index 0119bbcc..bdd85c9e 100644 --- a/oci/catalog/overlays/gitqlient.json +++ b/oci/catalog/overlays/gitqlient.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/gopeed.json b/oci/catalog/overlays/gopeed.json new file mode 100644 index 00000000..24127fc7 --- /dev/null +++ b/oci/catalog/overlays/gopeed.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/Downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/grav.json b/oci/catalog/overlays/grav.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/grav.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/grocy.json b/oci/catalog/overlays/grocy.json index 00ce39f2..5956bc92 100644 --- a/oci/catalog/overlays/grocy.json +++ b/oci/catalog/overlays/grocy.json @@ -10,5 +10,17 @@ "source": "https://docs.linuxserver.io/images/docker-grocy/" } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/gzdoom.json b/oci/catalog/overlays/gzdoom.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/gzdoom.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/habridge.json b/oci/catalog/overlays/habridge.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/habridge.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/healthchecks.json b/oci/catalog/overlays/healthchecks.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/healthchecks.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/hedgedoc.json b/oci/catalog/overlays/hedgedoc.json index 0b17a617..0f9f34b8 100644 --- a/oci/catalog/overlays/hedgedoc.json +++ b/oci/catalog/overlays/hedgedoc.json @@ -8,5 +8,17 @@ "description": { "en_US": "HedgeDoc is a self-hosted collaborative Markdown editor for notes." } + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/heimdall.json b/oci/catalog/overlays/heimdall.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/heimdall.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/helium.json b/oci/catalog/overlays/helium.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/helium.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/hermes.json b/oci/catalog/overlays/hermes.json index 9c65599b..cd7ab6ba 100644 --- a/oci/catalog/overlays/hermes.json +++ b/oci/catalog/overlays/hermes.json @@ -77,7 +77,15 @@ "timeout_seconds": 180, "request_timeout_seconds": 5, "stability_seconds": 4 - } + }, + "volume_preparations": [ + { + "container_path": "/opt/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/homeassistant-official.json b/oci/catalog/overlays/homeassistant-official.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/homeassistant-official.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/homeassistant.json b/oci/catalog/overlays/homeassistant.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/homeassistant.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/homebridge.json b/oci/catalog/overlays/homebridge.json index dcdbdd45..c073e588 100644 --- a/oci/catalog/overlays/homebridge.json +++ b/oci/catalog/overlays/homebridge.json @@ -11,5 +11,17 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/homebridge", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/htpcmanager.json b/oci/catalog/overlays/htpcmanager.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/htpcmanager.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/immich.json b/oci/catalog/overlays/immich.json new file mode 100644 index 00000000..7348b622 --- /dev/null +++ b/oci/catalog/overlays/immich.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/inkscape.json b/oci/catalog/overlays/inkscape.json index 984371ad..b2601fbf 100644 --- a/oci/catalog/overlays/inkscape.json +++ b/oci/catalog/overlays/inkscape.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/intellij-idea.json b/oci/catalog/overlays/intellij-idea.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/intellij-idea.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/jackett.json b/oci/catalog/overlays/jackett.json new file mode 100644 index 00000000..b1103515 --- /dev/null +++ b/oci/catalog/overlays/jackett.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/jdownloader.json b/oci/catalog/overlays/jdownloader.json new file mode 100644 index 00000000..8125de69 --- /dev/null +++ b/oci/catalog/overlays/jdownloader.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/output", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/jellyfin-official.json b/oci/catalog/overlays/jellyfin-official.json new file mode 100644 index 00000000..770aa62d --- /dev/null +++ b/oci/catalog/overlays/jellyfin-official.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/cache", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/jellyfin.json b/oci/catalog/overlays/jellyfin.json index e9bd06cd..45708d93 100644 --- a/oci/catalog/overlays/jellyfin.json +++ b/oci/catalog/overlays/jellyfin.json @@ -219,7 +219,27 @@ "request_timeout_seconds": 10, "stability_seconds": 4, "verify_tls": false - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/tvshows", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] }, "application_options": { "hdr10_dolby_vision_tone_mapping": { diff --git a/oci/catalog/overlays/jellyseerr.json b/oci/catalog/overlays/jellyseerr.json new file mode 100644 index 00000000..20a501cc --- /dev/null +++ b/oci/catalog/overlays/jellyseerr.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/joplin.json b/oci/catalog/overlays/joplin.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/joplin.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/kali-linux.json b/oci/catalog/overlays/kali-linux.json index 9011f653..cab03146 100644 --- a/oci/catalog/overlays/kali-linux.json +++ b/oci/catalog/overlays/kali-linux.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/karakeep.json b/oci/catalog/overlays/karakeep.json index cf30d72a..5891a9e1 100644 --- a/oci/catalog/overlays/karakeep.json +++ b/oci/catalog/overlays/karakeep.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Pending multi-container adaptation; retained for future work" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/kasm.json b/oci/catalog/overlays/kasm.json new file mode 100644 index 00000000..a4ca9dee --- /dev/null +++ b/oci/catalog/overlays/kasm.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/profiles", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/kavita-jvmilazz0.json b/oci/catalog/overlays/kavita-jvmilazz0.json new file mode 100644 index 00000000..3e0e8337 --- /dev/null +++ b/oci/catalog/overlays/kavita-jvmilazz0.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/kavita/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/manga", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/kavita.json b/oci/catalog/overlays/kavita.json new file mode 100644 index 00000000..75cceddc --- /dev/null +++ b/oci/catalog/overlays/kavita.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/kdenlive.json b/oci/catalog/overlays/kdenlive.json index 5131363c..39b4dd11 100644 --- a/oci/catalog/overlays/kdenlive.json +++ b/oci/catalog/overlays/kdenlive.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/keepassxc.json b/oci/catalog/overlays/keepassxc.json index ff078d56..24d13869 100644 --- a/oci/catalog/overlays/keepassxc.json +++ b/oci/catalog/overlays/keepassxc.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/kicad.json b/oci/catalog/overlays/kicad.json index c7ce5df7..64ad01eb 100644 --- a/oci/catalog/overlays/kicad.json +++ b/oci/catalog/overlays/kicad.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/kimai.json b/oci/catalog/overlays/kimai.json index 33dbb4e1..54854365 100644 --- a/oci/catalog/overlays/kimai.json +++ b/oci/catalog/overlays/kimai.json @@ -25,6 +25,19 @@ "Create the first administrator using the upstream console kimai:user:create command inside the Kimai LXC; no default account is fabricated.", "Installation, migrations, administrator creation and persistence remain unvalidated in a real OCI LXC." ], - "stack_references": ["https://docs.linuxserver.io/images/docker-kimai/", "https://docs.linuxserver.io/images/docker-mariadb/"] + "stack_references": [ + "https://docs.linuxserver.io/images/docker-kimai/", + "https://docs.linuxserver.io/images/docker-mariadb/" + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/kometa.json b/oci/catalog/overlays/kometa.json index 4acc2184..d0a25b2b 100644 --- a/oci/catalog/overlays/kometa.json +++ b/oci/catalog/overlays/kometa.json @@ -3,6 +3,14 @@ "installer_profile": { "completion_notes": [ "Kometa reads its configuration from /config/config.yml and the container only ships /config/config.yml.template. Copy the template to config.yml, fill in the required Plex and TMDb connections, then restart the container." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/komga.json b/oci/catalog/overlays/komga.json new file mode 100644 index 00000000..212b63ca --- /dev/null +++ b/oci/catalog/overlays/komga.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/timezone", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/krita.json b/oci/catalog/overlays/krita.json index 5c6b1c51..f3913373 100644 --- a/oci/catalog/overlays/krita.json +++ b/oci/catalog/overlays/krita.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/label-studio.json b/oci/catalog/overlays/label-studio.json new file mode 100644 index 00000000..c87421de --- /dev/null +++ b/oci/catalog/overlays/label-studio.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/label-studio/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/lazylibrarian.json b/oci/catalog/overlays/lazylibrarian.json new file mode 100644 index 00000000..727f9ffd --- /dev/null +++ b/oci/catalog/overlays/lazylibrarian.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/libredb-studio.json b/oci/catalog/overlays/libredb-studio.json index 6574e7e3..22577714 100644 --- a/oci/catalog/overlays/libredb-studio.json +++ b/oci/catalog/overlays/libredb-studio.json @@ -75,7 +75,15 @@ "bytes": 32, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/libreoffice.json b/oci/catalog/overlays/libreoffice.json index 267b3da4..63e569d2 100644 --- a/oci/catalog/overlays/libreoffice.json +++ b/oci/catalog/overlays/libreoffice.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/librespeed.json b/oci/catalog/overlays/librespeed.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/librespeed.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/librewolf.json b/oci/catalog/overlays/librewolf.json index 0db8d0a8..bab2a49f 100644 --- a/oci/catalog/overlays/librewolf.json +++ b/oci/catalog/overlays/librewolf.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/lidarr.json b/oci/catalog/overlays/lidarr.json new file mode 100644 index 00000000..3e7e15be --- /dev/null +++ b/oci/catalog/overlays/lidarr.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/limnoria.json b/oci/catalog/overlays/limnoria.json index d66444b7..c750338d 100644 --- a/oci/catalog/overlays/limnoria.json +++ b/oci/catalog/overlays/limnoria.json @@ -4,6 +4,14 @@ "completion_notes": [ "Limnoria joins no IRC network until its configuration file exists. Create it with the setup wizard from the Proxmox host: pct exec -- bash -c 'cd /config && limnoria-wizard'", "The wizard writes a .conf file in /config. Restart the container afterwards so the bot starts with that configuration." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/linkwarden.json b/oci/catalog/overlays/linkwarden.json index b03d9fac..b7f30bb4 100644 --- a/oci/catalog/overlays/linkwarden.json +++ b/oci/catalog/overlays/linkwarden.json @@ -1,7 +1,10 @@ { "proxmox": { "stack_environment_overrides": { - "linkwarden": {"NEXT_PUBLIC_CREDENTIALS_ENABLED": "true", "STORAGE_FOLDER": "/data/data"} + "linkwarden": { + "NEXT_PUBLIC_CREDENTIALS_ENABLED": "true", + "STORAGE_FOLDER": "/data/data" + } }, "stack_adaptation_notes": [ "Credential login is a boolean option, never a generated secret.", @@ -9,6 +12,20 @@ "The same generated MEILI_MASTER_KEY is used by Linkwarden and Meilisearch.", "Latest dependency tags remain selected; application compatibility must be checked by an actual installation." ], - "stack_references": ["https://github.com/linkwarden/linkwarden/blob/main/docker-compose.yml", "https://docs.linkwarden.app/self-hosting/environment-variables", "https://www.meilisearch.com/docs/reference/api/health/get-health"] + "stack_references": [ + "https://github.com/linkwarden/linkwarden/blob/main/docker-compose.yml", + "https://docs.linkwarden.app/self-hosting/environment-variables", + "https://www.meilisearch.com/docs/reference/api/health/get-health" + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/lm-studio.json b/oci/catalog/overlays/lm-studio.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/lm-studio.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/logseq.json b/oci/catalog/overlays/logseq.json new file mode 100644 index 00000000..a706ecf0 --- /dev/null +++ b/oci/catalog/overlays/logseq.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/notes", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/lollypop.json b/oci/catalog/overlays/lollypop.json index ef33f90f..0a5ffc4e 100644 --- a/oci/catalog/overlays/lollypop.json +++ b/oci/catalog/overlays/lollypop.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/luanti.json b/oci/catalog/overlays/luanti.json new file mode 100644 index 00000000..4e9815db --- /dev/null +++ b/oci/catalog/overlays/luanti.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config/.minetest", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/lucky.json b/oci/catalog/overlays/lucky.json index e486c3c6..efe02ece 100644 --- a/oci/catalog/overlays/lucky.json +++ b/oci/catalog/overlays/lucky.json @@ -11,5 +11,17 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/goodluck", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/lychee.json b/oci/catalog/overlays/lychee.json new file mode 100644 index 00000000..ae775b06 --- /dev/null +++ b/oci/catalog/overlays/lychee.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/pictures", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/lyrionmusicserver.json b/oci/catalog/overlays/lyrionmusicserver.json new file mode 100644 index 00000000..169e90db --- /dev/null +++ b/oci/catalog/overlays/lyrionmusicserver.json @@ -0,0 +1,38 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/playlist", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/localtime", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/timezone", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/mame.json b/oci/catalog/overlays/mame.json new file mode 100644 index 00000000..fde54f0c --- /dev/null +++ b/oci/catalog/overlays/mame.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/mame", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/manyfold.json b/oci/catalog/overlays/manyfold.json new file mode 100644 index 00000000..ab6d89e8 --- /dev/null +++ b/oci/catalog/overlays/manyfold.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/libraries", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/mariadb.json b/oci/catalog/overlays/mariadb.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/mariadb.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/mastodon.json b/oci/catalog/overlays/mastodon.json index 2eddd1fb..ae4310e2 100644 --- a/oci/catalog/overlays/mastodon.json +++ b/oci/catalog/overlays/mastodon.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Needs PostgreSQL and Redis in their own containers; planned as a multi-container application" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/mediaelch.json b/oci/catalog/overlays/mediaelch.json index 7dae83ee..b42093d4 100644 --- a/oci/catalog/overlays/mediaelch.json +++ b/oci/catalog/overlays/mediaelch.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/medusa-official.json b/oci/catalog/overlays/medusa-official.json new file mode 100644 index 00000000..f9414092 --- /dev/null +++ b/oci/catalog/overlays/medusa-official.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/medusa.json b/oci/catalog/overlays/medusa.json new file mode 100644 index 00000000..f9414092 --- /dev/null +++ b/oci/catalog/overlays/medusa.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/melonds.json b/oci/catalog/overlays/melonds.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/melonds.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/memos.json b/oci/catalog/overlays/memos.json index e6cdda52..f4779164 100644 --- a/oci/catalog/overlays/memos.json +++ b/oci/catalog/overlays/memos.json @@ -4,5 +4,17 @@ "reference": "neosmemo/memos:stable", "tag": "stable" } + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/opt/memos", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/mineos-node.json b/oci/catalog/overlays/mineos-node.json index 80854ce8..20c325f5 100644 --- a/oci/catalog/overlays/mineos-node.json +++ b/oci/catalog/overlays/mineos-node.json @@ -62,7 +62,15 @@ "bytes": 12, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/var/games/minecraft", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/minisatip.json b/oci/catalog/overlays/minisatip.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/minisatip.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/mongodb.json b/oci/catalog/overlays/mongodb.json new file mode 100644 index 00000000..cfd3fe42 --- /dev/null +++ b/oci/catalog/overlays/mongodb.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data/configdb", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/mongodb4.json b/oci/catalog/overlays/mongodb4.json index 18a235cb..5eda5cdf 100644 --- a/oci/catalog/overlays/mongodb4.json +++ b/oci/catalog/overlays/mongodb4.json @@ -14,6 +14,22 @@ } }, "proxmox": { - "image_selection_note": "The upstream recipe is named mongodb4 and points at mongo:latest, so the entry promised a series it did not install. It is pinned to mongo:4 here, which is what the name says and the only series a processor without AVX can run." + "image_selection_note": "The upstream recipe is named mongodb4 and points at mongo:latest, so the entry promised a series it did not install. It is pinned to mongo:4 here, which is what the name says and the only series a processor without AVX can run.", + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data/configdb", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/monica-official.json b/oci/catalog/overlays/monica-official.json index c53f49e9..db3c882a 100644 --- a/oci/catalog/overlays/monica-official.json +++ b/oci/catalog/overlays/monica-official.json @@ -1,17 +1,39 @@ { "proxmox": { "stack_environment_overrides": { - "monica-db": {"MARIADB_RANDOM_ROOT_PASSWORD": "yes"}, - "monica": {"DB_DATABASE": "monica", "APP_URL": "http://localhost"} + "monica-db": { + "MARIADB_RANDOM_ROOT_PASSWORD": "yes" + }, + "monica": { + "DB_DATABASE": "monica", + "APP_URL": "http://localhost" + } }, "stack_generators": { - "GENERATED_APP_KEY": {"encoding": "base64", "bytes": 32, "prefix": "base64:"} + "GENERATED_APP_KEY": { + "encoding": "base64", + "bytes": 32, + "prefix": "base64:" + } }, "stack_adaptation_notes": [ "APP_KEY follows the official base64: plus 32 random bytes format; it is generated once per deployment and persisted in the LXC environment.", "MARIADB_RANDOM_ROOT_PASSWORD is a boolean switch, not a password.", "Create the first Monica account through its web setup. Internet exposure requires HTTPS configuration." ], - "stack_references": ["https://github.com/monicahq/docker", "https://github.com/MariaDB/mariadb-docker/blob/master/healthcheck.sh"] + "stack_references": [ + "https://github.com/monicahq/docker", + "https://github.com/MariaDB/mariadb-docker/blob/master/healthcheck.sh" + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/html/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/monica.json b/oci/catalog/overlays/monica.json index c70ab086..5e10b7e7 100644 --- a/oci/catalog/overlays/monica.json +++ b/oci/catalog/overlays/monica.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Deprecated upstream: the image no longer receives updates" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/msedge.json b/oci/catalog/overlays/msedge.json index 2cda841c..f5287a04 100644 --- a/oci/catalog/overlays/msedge.json +++ b/oci/catalog/overlays/msedge.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/mstream.json b/oci/catalog/overlays/mstream.json new file mode 100644 index 00000000..5b9b2248 --- /dev/null +++ b/oci/catalog/overlays/mstream.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/mullvad-browser.json b/oci/catalog/overlays/mullvad-browser.json index a4230dfc..398b7de6 100644 --- a/oci/catalog/overlays/mullvad-browser.json +++ b/oci/catalog/overlays/mullvad-browser.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/mylar3.json b/oci/catalog/overlays/mylar3.json new file mode 100644 index 00000000..cef36a68 --- /dev/null +++ b/oci/catalog/overlays/mylar3.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/comics", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/myspeed.json b/oci/catalog/overlays/myspeed.json new file mode 100644 index 00000000..4351f059 --- /dev/null +++ b/oci/catalog/overlays/myspeed.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/myspeed/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/mysql-workbench.json b/oci/catalog/overlays/mysql-workbench.json index f7350b15..165cc8df 100644 --- a/oci/catalog/overlays/mysql-workbench.json +++ b/oci/catalog/overlays/mysql-workbench.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/navidrome.json b/oci/catalog/overlays/navidrome.json new file mode 100644 index 00000000..0708cb3d --- /dev/null +++ b/oci/catalog/overlays/navidrome.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/netbird.json b/oci/catalog/overlays/netbird.json new file mode 100644 index 00000000..00a4ca7c --- /dev/null +++ b/oci/catalog/overlays/netbird.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/lib/netbird", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/netbox.json b/oci/catalog/overlays/netbox.json index 9050c9c0..5a6986a1 100644 --- a/oci/catalog/overlays/netbox.json +++ b/oci/catalog/overlays/netbox.json @@ -193,5 +193,17 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/netdata.json b/oci/catalog/overlays/netdata.json index a20af428..9525f13c 100644 --- a/oci/catalog/overlays/netdata.json +++ b/oci/catalog/overlays/netdata.json @@ -127,7 +127,27 @@ "options": { "apparmor_profile": "unconfined" } - } + }, + "volume_preparations": [ + { + "container_path": "/etc/netdata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/lib/netdata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/cache/netdata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "compatibility": { diff --git a/oci/catalog/overlays/nextcloud-official.json b/oci/catalog/overlays/nextcloud-official.json new file mode 100644 index 00000000..6153eb12 --- /dev/null +++ b/oci/catalog/overlays/nextcloud-official.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/html", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/nextcloud-stack.json b/oci/catalog/overlays/nextcloud-stack.json new file mode 100644 index 00000000..6153eb12 --- /dev/null +++ b/oci/catalog/overlays/nextcloud-stack.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/html", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/nextcloud.json b/oci/catalog/overlays/nextcloud.json new file mode 100644 index 00000000..75cceddc --- /dev/null +++ b/oci/catalog/overlays/nextcloud.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/nginx.json b/oci/catalog/overlays/nginx.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/nginx.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/nginxproxymanager.json b/oci/catalog/overlays/nginxproxymanager.json new file mode 100644 index 00000000..690b1fe8 --- /dev/null +++ b/oci/catalog/overlays/nginxproxymanager.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/letsencrypt", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/ngircd.json b/oci/catalog/overlays/ngircd.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/ngircd.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/nzbfast.json b/oci/catalog/overlays/nzbfast.json new file mode 100644 index 00000000..be7f3274 --- /dev/null +++ b/oci/catalog/overlays/nzbfast.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/watch", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/nzbget.json b/oci/catalog/overlays/nzbget.json index 00d26a7c..cf6f8a5b 100644 --- a/oci/catalog/overlays/nzbget.json +++ b/oci/catalog/overlays/nzbget.json @@ -11,5 +11,23 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/nzbhydra2.json b/oci/catalog/overlays/nzbhydra2.json new file mode 100644 index 00000000..b1103515 --- /dev/null +++ b/oci/catalog/overlays/nzbhydra2.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/obsidian.json b/oci/catalog/overlays/obsidian.json index 39f50313..17c7fae0 100644 --- a/oci/catalog/overlays/obsidian.json +++ b/oci/catalog/overlays/obsidian.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/ollama.json b/oci/catalog/overlays/ollama.json index ccf7256b..97abd62c 100644 --- a/oci/catalog/overlays/ollama.json +++ b/oci/catalog/overlays/ollama.json @@ -1,22 +1,47 @@ { "proxmox": { - "deployment_profile": {"variant": "hardware-selectable", "gpu_passthrough": "installer-selection"}, + "deployment_profile": { + "variant": "hardware-selectable", + "gpu_passthrough": "installer-selection" + }, "installer_profile": { "hardware_acceleration": { "prompt": "Acceleration for Ollama", "default": "cpu", "profiles": [ - {"id": "cpu", "label": "CPU", "device_requests": []}, { - "id": "nvidia", "label": "NVIDIA (CUDA)", - "device_requests": [{ - "id": "nvidia-runtime", "kind": "nvidia-runtime", "purpose": "nvidia-cuda", - "device_selection": "all-requested-by-compose" - }], - "environment": [{"name": "NVIDIA_VISIBLE_DEVICES", "value": "all"}] + "id": "cpu", + "label": "CPU", + "device_requests": [] + }, + { + "id": "nvidia", + "label": "NVIDIA (CUDA)", + "device_requests": [ + { + "id": "nvidia-runtime", + "kind": "nvidia-runtime", + "purpose": "nvidia-cuda", + "device_selection": "all-requested-by-compose" + } + ], + "environment": [ + { + "name": "NVIDIA_VISIBLE_DEVICES", + "value": "all" + } + ] } ] - } + }, + "volume_preparations": [ + { + "container_path": "/root/.ollama", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/ombi.json b/oci/catalog/overlays/ombi.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/ombi.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/onlyoffice.json b/oci/catalog/overlays/onlyoffice.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/onlyoffice.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/open-webui-cuda.json b/oci/catalog/overlays/open-webui-cuda.json new file mode 100644 index 00000000..74c961b0 --- /dev/null +++ b/oci/catalog/overlays/open-webui-cuda.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/open-webui-ollama.json b/oci/catalog/overlays/open-webui-ollama.json new file mode 100644 index 00000000..7ee9e954 --- /dev/null +++ b/oci/catalog/overlays/open-webui-ollama.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/root/.ollama", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/open-webui.json b/oci/catalog/overlays/open-webui.json new file mode 100644 index 00000000..74c961b0 --- /dev/null +++ b/oci/catalog/overlays/open-webui.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/openhab.json b/oci/catalog/overlays/openhab.json new file mode 100644 index 00000000..4683ac95 --- /dev/null +++ b/oci/catalog/overlays/openhab.json @@ -0,0 +1,38 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/etc/localtime", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/etc/timezone", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/openhab/addons", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/openhab/conf", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/openhab/userdata", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/openhands.json b/oci/catalog/overlays/openhands.json index e9ec25f0..782e79f3 100644 --- a/oci/catalog/overlays/openhands.json +++ b/oci/catalog/overlays/openhands.json @@ -2,5 +2,23 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Needs a Docker engine; a native OCI LXC has none" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/.openhands", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/workspace_base", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/openshot.json b/oci/catalog/overlays/openshot.json index 21308f73..19fb5034 100644 --- a/oci/catalog/overlays/openshot.json +++ b/oci/catalog/overlays/openshot.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/openssh-server.json b/oci/catalog/overlays/openssh-server.json index 7b03e38c..e286c1e1 100644 --- a/oci/catalog/overlays/openssh-server.json +++ b/oci/catalog/overlays/openssh-server.json @@ -121,7 +121,15 @@ "bytes": 12, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "catalog_ui": { diff --git a/oci/catalog/overlays/openvscode-server.json b/oci/catalog/overlays/openvscode-server.json index c70ab086..5e10b7e7 100644 --- a/oci/catalog/overlays/openvscode-server.json +++ b/oci/catalog/overlays/openvscode-server.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Deprecated upstream: the image no longer receives updates" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/opera.json b/oci/catalog/overlays/opera.json index eeaddbb7..1669fec0 100644 --- a/oci/catalog/overlays/opera.json +++ b/oci/catalog/overlays/opera.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/opodsync.json b/oci/catalog/overlays/opodsync.json new file mode 100644 index 00000000..b3836a11 --- /dev/null +++ b/oci/catalog/overlays/opodsync.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/www/server/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/orcaslicer.json b/oci/catalog/overlays/orcaslicer.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/orcaslicer.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/oscam.json b/oci/catalog/overlays/oscam.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/oscam.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/overseerr.json b/oci/catalog/overlays/overseerr.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/overseerr.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/paperless-ngx.json b/oci/catalog/overlays/paperless-ngx.json new file mode 100644 index 00000000..3a9a8674 --- /dev/null +++ b/oci/catalog/overlays/paperless-ngx.json @@ -0,0 +1,32 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/usr/src/paperless/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/usr/src/paperless/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/usr/src/paperless/export", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/usr/src/paperless/consume", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/pcsx2.json b/oci/catalog/overlays/pcsx2.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/pcsx2.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/pelorus.json b/oci/catalog/overlays/pelorus.json index 034cbc90..0957bb5b 100644 --- a/oci/catalog/overlays/pelorus.json +++ b/oci/catalog/overlays/pelorus.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/petio.json b/oci/catalog/overlays/petio.json index e299a37a..398134d6 100644 --- a/oci/catalog/overlays/petio.json +++ b/oci/catalog/overlays/petio.json @@ -6,6 +6,25 @@ "Complete Petio web setup with MongoDB host mongo and port 27017. Plex credentials remain user-provided.", "The latest MongoDB image requires compatible CPU instructions; application and hardware compatibility remain unvalidated." ], - "stack_references": ["https://github.com/docker-library/docs/tree/master/mongo", "https://github.com/petio-team/petio"] + "stack_references": [ + "https://github.com/docker-library/docs/tree/master/mongo", + "https://github.com/petio-team/petio" + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/api/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/photoprism.json b/oci/catalog/overlays/photoprism.json index d4d8e6e8..6e5e5fe5 100644 --- a/oci/catalog/overlays/photoprism.json +++ b/oci/catalog/overlays/photoprism.json @@ -47,7 +47,21 @@ "bytes": 12, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/photoprism/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/photoprism/originals", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/phpmyadmin.json b/oci/catalog/overlays/phpmyadmin.json index 726b20a9..d77b0514 100644 --- a/oci/catalog/overlays/phpmyadmin.json +++ b/oci/catalog/overlays/phpmyadmin.json @@ -53,6 +53,14 @@ "completion_notes": [ "phpMyAdmin is installed with arbitrary server connections enabled: the login page has a Server field where the address of the MySQL or MariaDB server is entered, together with its user and password.", "The database server must accept connections from the IP address of this container, with a user that is not limited to localhost." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/pidgin.json b/oci/catalog/overlays/pidgin.json index 1ade8eef..423abd62 100644 --- a/oci/catalog/overlays/pidgin.json +++ b/oci/catalog/overlays/pidgin.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/pihole.json b/oci/catalog/overlays/pihole.json new file mode 100644 index 00000000..b7f4d38d --- /dev/null +++ b/oci/catalog/overlays/pihole.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/etc/pihole", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/pinchflat.json b/oci/catalog/overlays/pinchflat.json new file mode 100644 index 00000000..b1103515 --- /dev/null +++ b/oci/catalog/overlays/pinchflat.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/pingvin-share.json b/oci/catalog/overlays/pingvin-share.json new file mode 100644 index 00000000..51f2fb55 --- /dev/null +++ b/oci/catalog/overlays/pingvin-share.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/app/backend/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/app/frontend/public/img", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/piper.json b/oci/catalog/overlays/piper.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/piper.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/piwigo.json b/oci/catalog/overlays/piwigo.json new file mode 100644 index 00000000..dcbf9b1a --- /dev/null +++ b/oci/catalog/overlays/piwigo.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/gallery", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/planka.json b/oci/catalog/overlays/planka.json index 41a4953e..e2eecf5d 100644 --- a/oci/catalog/overlays/planka.json +++ b/oci/catalog/overlays/planka.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Needs PostgreSQL in its own container; planned as a multi-container application" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/plex-official.json b/oci/catalog/overlays/plex-official.json new file mode 100644 index 00000000..7c0a30a4 --- /dev/null +++ b/oci/catalog/overlays/plex-official.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/transcode", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/plex.json b/oci/catalog/overlays/plex.json index d849d938..d98be7c6 100644 --- a/oci/catalog/overlays/plex.json +++ b/oci/catalog/overlays/plex.json @@ -1,24 +1,32 @@ { "catalog_ui": { - "launch": {"scheme": "http", "port": 32400, "path": "/web"} - }, - "container_contract": { - "ports": [{ - "container_port": 32400, - "published_example": 32400, - "protocol": "tcp", - "required": true, - "proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat" - }] - }, - "first_run": { - "endpoints": [{ - "label": "Plex WebUI", + "launch": { "scheme": "http", "port": 32400, - "path": "/web", - "source": "linuxserver-application-setup" - }] + "path": "/web" + } + }, + "container_contract": { + "ports": [ + { + "container_port": 32400, + "published_example": 32400, + "protocol": "tcp", + "required": true, + "proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat" + } + ] + }, + "first_run": { + "endpoints": [ + { + "label": "Plex WebUI", + "scheme": "http", + "port": 32400, + "path": "/web", + "source": "linuxserver-application-setup" + } + ] }, "proxmox": { "deployment_profile": { @@ -30,29 +38,73 @@ "prompt": "Hardware acceleration for Plex", "default": "none", "profiles": [ - {"id": "none", "label": "No acceleration (CPU)", "device_requests": []}, + { + "id": "none", + "label": "No acceleration (CPU)", + "device_requests": [] + }, { "id": "vaapi", "label": "Intel/AMD (VA-API)", - "environment_from_devices": {"ATTACHED_DEVICES_PERMS": ["vaapi-render"]}, - "device_requests": [{ - "id": "vaapi-render", "kind": "character-device", "purpose": "vaapi", - "path_prompt": "GPU render device", "host_path_default": "/dev/dri/renderD128", - "container_path_strategy": "same-as-host", "mode": "0660", "deny_write": false, - "gid_strategy": "host-device-gid" - }] + "environment_from_devices": { + "ATTACHED_DEVICES_PERMS": [ + "vaapi-render" + ] + }, + "device_requests": [ + { + "id": "vaapi-render", + "kind": "character-device", + "purpose": "vaapi", + "path_prompt": "GPU render device", + "host_path_default": "/dev/dri/renderD128", + "container_path_strategy": "same-as-host", + "mode": "0660", + "deny_write": false, + "gid_strategy": "host-device-gid" + } + ] }, { "id": "nvidia", "label": "NVIDIA (NVENC/NVDEC)", - "device_requests": [{ - "id": "nvidia-runtime", "kind": "nvidia-runtime", - "purpose": "nvidia-cuda-nvenc-nvdec", "device_selection": "all-requested-by-compose" - }], - "environment": [{"name": "NVIDIA_VISIBLE_DEVICES", "value": "all"}] + "device_requests": [ + { + "id": "nvidia-runtime", + "kind": "nvidia-runtime", + "purpose": "nvidia-cuda-nvenc-nvdec", + "device_selection": "all-requested-by-compose" + } + ], + "environment": [ + { + "name": "NVIDIA_VISIBLE_DEVICES", + "value": "all" + } + ] } ] - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/pocketbase.json b/oci/catalog/overlays/pocketbase.json index 7c1be1ba..a9da25c2 100644 --- a/oci/catalog/overlays/pocketbase.json +++ b/oci/catalog/overlays/pocketbase.json @@ -30,6 +30,14 @@ "host-bind" ] } + ], + "volume_preparations": [ + { + "container_path": "/pocketbase/pb_data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } }, diff --git a/oci/catalog/overlays/podfetch.json b/oci/catalog/overlays/podfetch.json new file mode 100644 index 00000000..5db5ad23 --- /dev/null +++ b/oci/catalog/overlays/podfetch.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/podcasts", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/db", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/portainer.json b/oci/catalog/overlays/portainer.json index e9ec25f0..d8897d3f 100644 --- a/oci/catalog/overlays/portainer.json +++ b/oci/catalog/overlays/portainer.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Needs a Docker engine; a native OCI LXC has none" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/postgresql.json b/oci/catalog/overlays/postgresql.json index 20e949ed..d13969ee 100644 --- a/oci/catalog/overlays/postgresql.json +++ b/oci/catalog/overlays/postgresql.json @@ -74,6 +74,14 @@ }, "completion_notes": [ "PostgreSQL creates the database named in POSTGRES_DB on the first start. The installer default is postgresql." + ], + "volume_preparations": [ + { + "container_path": "/var/lib/postgresql/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/ppsspp.json b/oci/catalog/overlays/ppsspp.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/ppsspp.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/projectsend.json b/oci/catalog/overlays/projectsend.json new file mode 100644 index 00000000..75cceddc --- /dev/null +++ b/oci/catalog/overlays/projectsend.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/prowlarr.json b/oci/catalog/overlays/prowlarr.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/prowlarr.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/pwndrop.json b/oci/catalog/overlays/pwndrop.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/pwndrop.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/pycharm.json b/oci/catalog/overlays/pycharm.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/pycharm.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/pydio-cells.json b/oci/catalog/overlays/pydio-cells.json index 96d1200f..32870eae 100644 --- a/oci/catalog/overlays/pydio-cells.json +++ b/oci/catalog/overlays/pydio-cells.json @@ -46,6 +46,14 @@ "Pydio Cells needs an external MySQL or MariaDB database. The setup wizard asks for its address, database name and user on the first start.", "The web interface uses a self-signed certificate, so the browser shows a warning the first time.", "Pydio Cells redirects to the address given in EXTERNALURL. If the container changes address, edit lxc.environment.runtime: EXTERNALURL and SERVER_IP in /etc/pve/lxc/.conf with the container stopped, and delete /config/keys/cert.crt to regenerate the certificate." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/pyload-ng.json b/oci/catalog/overlays/pyload-ng.json index 47d84ccf..12e5c2d8 100644 --- a/oci/catalog/overlays/pyload-ng.json +++ b/oci/catalog/overlays/pyload-ng.json @@ -11,5 +11,23 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/qbittorrent-hotio.json b/oci/catalog/overlays/qbittorrent-hotio.json index 10587b07..2099a22d 100644 --- a/oci/catalog/overlays/qbittorrent-hotio.json +++ b/oci/catalog/overlays/qbittorrent-hotio.json @@ -15,5 +15,23 @@ } } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/DATA", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/qbittorrent.json b/oci/catalog/overlays/qbittorrent.json new file mode 100644 index 00000000..b1103515 --- /dev/null +++ b/oci/catalog/overlays/qbittorrent.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/qdirstat.json b/oci/catalog/overlays/qdirstat.json index 0c80d228..3243ce70 100644 --- a/oci/catalog/overlays/qdirstat.json +++ b/oci/catalog/overlays/qdirstat.json @@ -9,7 +9,21 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/qui.json b/oci/catalog/overlays/qui.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/qui.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/radarr.json b/oci/catalog/overlays/radarr.json new file mode 100644 index 00000000..28a55177 --- /dev/null +++ b/oci/catalog/overlays/radarr.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/movies", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/raneto.json b/oci/catalog/overlays/raneto.json index e37147c3..fd8b97c3 100644 --- a/oci/catalog/overlays/raneto.json +++ b/oci/catalog/overlays/raneto.json @@ -11,5 +11,17 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/rawtherapee.json b/oci/catalog/overlays/rawtherapee.json index 4e8db156..101e31de 100644 --- a/oci/catalog/overlays/rawtherapee.json +++ b/oci/catalog/overlays/rawtherapee.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/rclone.json b/oci/catalog/overlays/rclone.json new file mode 100644 index 00000000..7348b622 --- /dev/null +++ b/oci/catalog/overlays/rclone.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/rdtclient.json b/oci/catalog/overlays/rdtclient.json new file mode 100644 index 00000000..5aebd169 --- /dev/null +++ b/oci/catalog/overlays/rdtclient.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/db", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/readarr.json b/oci/catalog/overlays/readarr.json index 8ac340cc..e2c21ec5 100644 --- a/oci/catalog/overlays/readarr.json +++ b/oci/catalog/overlays/readarr.json @@ -2,5 +2,29 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Retired upstream: only nightly builds are published, with no stable release" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/remmina.json b/oci/catalog/overlays/remmina.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/remmina.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/resilio-sync.json b/oci/catalog/overlays/resilio-sync.json new file mode 100644 index 00000000..774fc1f5 --- /dev/null +++ b/oci/catalog/overlays/resilio-sync.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/sync", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/retroarch.json b/oci/catalog/overlays/retroarch.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/retroarch.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/romm.json b/oci/catalog/overlays/romm.json index a2c92958..444ee835 100644 --- a/oci/catalog/overlays/romm.json +++ b/oci/catalog/overlays/romm.json @@ -12,17 +12,49 @@ } }, "stack_optional_environment": [ - {"service": "romm", "label": "IGDB", "fields": [ - {"name": "IGDB_CLIENT_ID", "label": "IGDB Client ID", "sensitive": false}, - {"name": "IGDB_CLIENT_SECRET", "label": "IGDB Client Secret", "sensitive": true} - ]}, - {"service": "romm", "label": "ScreenScraper", "fields": [ - {"name": "SCREENSCRAPER_USER", "label": "ScreenScraper username", "sensitive": false}, - {"name": "SCREENSCRAPER_PASSWORD", "label": "ScreenScraper password", "sensitive": true} - ]}, - {"service": "romm", "label": "SteamGridDB", "fields": [ - {"name": "STEAMGRIDDB_API_KEY", "label": "SteamGridDB API key", "sensitive": true} - ]} + { + "service": "romm", + "label": "IGDB", + "fields": [ + { + "name": "IGDB_CLIENT_ID", + "label": "IGDB Client ID", + "sensitive": false + }, + { + "name": "IGDB_CLIENT_SECRET", + "label": "IGDB Client Secret", + "sensitive": true + } + ] + }, + { + "service": "romm", + "label": "ScreenScraper", + "fields": [ + { + "name": "SCREENSCRAPER_USER", + "label": "ScreenScraper username", + "sensitive": false + }, + { + "name": "SCREENSCRAPER_PASSWORD", + "label": "ScreenScraper password", + "sensitive": true + } + ] + }, + { + "service": "romm", + "label": "SteamGridDB", + "fields": [ + { + "name": "STEAMGRIDDB_API_KEY", + "label": "SteamGridDB API key", + "sensitive": true + } + ] + } ], "stack_adaptation_notes": [ "DB_PASSWD and MARIADB_PASSWORD share one generated secret. The MariaDB root password is independent.", @@ -31,6 +63,43 @@ "The hook starts stopped dependencies before RomM. It does not propagate manual dependency restarts to the application like Compose depends_on restart:true.", "Latest tags are retained; first boot, hardware and upstream version compatibility remain unvalidated." ], - "stack_references": ["https://docs.romm.app/5.2.0/install/databases/", "https://docs.romm.app/5.2.0/reference/environment-variables/"] + "stack_references": [ + "https://docs.romm.app/5.2.0/install/databases/", + "https://docs.romm.app/5.2.0/reference/environment-variables/" + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/romm/resources", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/redis-data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/romm/library", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/romm/assets", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/romm/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/roonserver.json b/oci/catalog/overlays/roonserver.json new file mode 100644 index 00000000..a66d73d3 --- /dev/null +++ b/oci/catalog/overlays/roonserver.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/Roon", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/Music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/RoonBackups", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/rpcs3.json b/oci/catalog/overlays/rpcs3.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/rpcs3.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/rsnapshot.json b/oci/catalog/overlays/rsnapshot.json index 54cac4cf..153c9cf8 100644 --- a/oci/catalog/overlays/rsnapshot.json +++ b/oci/catalog/overlays/rsnapshot.json @@ -4,6 +4,26 @@ "completion_notes": [ "rsnapshot starts with the default configuration, which backs up /data into /.snapshots. Edit /config/rsnapshot.conf inside the container to set your own backup points, snapshot root and retention intervals.", "No backup is scheduled: the rsnapshot lines in /config/crontabs/root are commented out. Uncomment or adjust the intervals you want, then restart the container." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/.snapshots", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/rustdesk.json b/oci/catalog/overlays/rustdesk.json index 9fa50650..78800c75 100644 --- a/oci/catalog/overlays/rustdesk.json +++ b/oci/catalog/overlays/rustdesk.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/sabnzbd.json b/oci/catalog/overlays/sabnzbd.json new file mode 100644 index 00000000..ec9fed6f --- /dev/null +++ b/oci/catalog/overlays/sabnzbd.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/incomplete-downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/scummvm.json b/oci/catalog/overlays/scummvm.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/scummvm.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/sealskin.json b/oci/catalog/overlays/sealskin.json index e9ec25f0..eceab031 100644 --- a/oci/catalog/overlays/sealskin.json +++ b/oci/catalog/overlays/sealskin.json @@ -2,5 +2,29 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Needs a Docker engine; a native OCI LXC has none" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/storage", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/run/docker.sock", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/shadps4.json b/oci/catalog/overlays/shadps4.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/shadps4.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/shotcut.json b/oci/catalog/overlays/shotcut.json index 8eccf0ed..5a7c267b 100644 --- a/oci/catalog/overlays/shotcut.json +++ b/oci/catalog/overlays/shotcut.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/sickchill.json b/oci/catalog/overlays/sickchill.json new file mode 100644 index 00000000..f9414092 --- /dev/null +++ b/oci/catalog/overlays/sickchill.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/sickgear.json b/oci/catalog/overlays/sickgear.json new file mode 100644 index 00000000..8910d5dc --- /dev/null +++ b/oci/catalog/overlays/sickgear.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/signal.json b/oci/catalog/overlays/signal.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/signal.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/siyuan-note.json b/oci/catalog/overlays/siyuan-note.json index 990261e2..a35d465b 100644 --- a/oci/catalog/overlays/siyuan-note.json +++ b/oci/catalog/overlays/siyuan-note.json @@ -11,5 +11,17 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/siyuan/workspace", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/smokeping.json b/oci/catalog/overlays/smokeping.json new file mode 100644 index 00000000..75cceddc --- /dev/null +++ b/oci/catalog/overlays/smokeping.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/snapdrop.json b/oci/catalog/overlays/snapdrop.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/snapdrop.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/snapotter.json b/oci/catalog/overlays/snapotter.json index 8e55f1fd..0ed52d18 100644 --- a/oci/catalog/overlays/snapotter.json +++ b/oci/catalog/overlays/snapotter.json @@ -76,7 +76,21 @@ "bytes": 12, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tmp/workspace", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/sonarr.json b/oci/catalog/overlays/sonarr.json new file mode 100644 index 00000000..8910d5dc --- /dev/null +++ b/oci/catalog/overlays/sonarr.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/tv", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/speedtest-tracker.json b/oci/catalog/overlays/speedtest-tracker.json index 7127efb2..959dbd87 100644 --- a/oci/catalog/overlays/speedtest-tracker.json +++ b/oci/catalog/overlays/speedtest-tracker.json @@ -129,7 +129,15 @@ "bytes": 16, "prompt": true } - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/spotube.json b/oci/catalog/overlays/spotube.json index c76601a1..d278eb8d 100644 --- a/oci/catalog/overlays/spotube.json +++ b/oci/catalog/overlays/spotube.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/sqlitebrowser.json b/oci/catalog/overlays/sqlitebrowser.json index 5002738b..c357859f 100644 --- a/oci/catalog/overlays/sqlitebrowser.json +++ b/oci/catalog/overlays/sqlitebrowser.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/stable-diffusion-webui-nvidia.json b/oci/catalog/overlays/stable-diffusion-webui-nvidia.json new file mode 100644 index 00000000..fb79f9ce --- /dev/null +++ b/oci/catalog/overlays/stable-diffusion-webui-nvidia.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/data/models", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/outputs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/steam.json b/oci/catalog/overlays/steam.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/steam.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/stremio.json b/oci/catalog/overlays/stremio.json new file mode 100644 index 00000000..792587c1 --- /dev/null +++ b/oci/catalog/overlays/stremio.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/root/.stremio-server", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/suite-arr.json b/oci/catalog/overlays/suite-arr.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/suite-arr.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/swag.json b/oci/catalog/overlays/swag.json index 020feea4..ac3658e6 100644 --- a/oci/catalog/overlays/swag.json +++ b/oci/catalog/overlays/swag.json @@ -139,6 +139,14 @@ "Certificate errors are logged in /config/log/letsencrypt inside the container.", "SWAG serves HTTPS on port 443. Plain HTTP on port 80 is disabled in /config/nginx/site-confs/default.conf.", "Reverse proxy samples for other applications are in /config/nginx/proxy_confs inside the container." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/swingmusic.json b/oci/catalog/overlays/swingmusic.json new file mode 100644 index 00000000..5b9b2248 --- /dev/null +++ b/oci/catalog/overlays/swingmusic.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/music", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/syncthing.json b/oci/catalog/overlays/syncthing.json new file mode 100644 index 00000000..e212be0e --- /dev/null +++ b/oci/catalog/overlays/syncthing.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data1", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data2", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/syslog-ng.json b/oci/catalog/overlays/syslog-ng.json new file mode 100644 index 00000000..1f599e80 --- /dev/null +++ b/oci/catalog/overlays/syslog-ng.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/log", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/tailscale.json b/oci/catalog/overlays/tailscale.json new file mode 100644 index 00000000..a7f6e8fa --- /dev/null +++ b/oci/catalog/overlays/tailscale.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/lib/tailscale", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/tandoor.json b/oci/catalog/overlays/tandoor.json new file mode 100644 index 00000000..83015fe5 --- /dev/null +++ b/oci/catalog/overlays/tandoor.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/opt/recipes/staticfiles", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/opt/recipes/mediafiles", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/tautulli.json b/oci/catalog/overlays/tautulli.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/tautulli.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/tdarr.json b/oci/catalog/overlays/tdarr.json new file mode 100644 index 00000000..dbedbecd --- /dev/null +++ b/oci/catalog/overlays/tdarr.json @@ -0,0 +1,32 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/configs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/app/logs", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/media", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/temp", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/teable.json b/oci/catalog/overlays/teable.json index 618bbdf7..1d8a94f0 100644 --- a/oci/catalog/overlays/teable.json +++ b/oci/catalog/overlays/teable.json @@ -1,11 +1,19 @@ { "proxmox": { "stack_environment_overrides": { - "teable-cache": {"REDISCLI_AUTH": "${GENERATED_REDIS_PASSWORD}"}, - "teable": {"BACKEND_CACHE_REDIS_URI": "redis://default:${GENERATED_REDIS_PASSWORD}@teable-cache:6379/0"} + "teable-cache": { + "REDISCLI_AUTH": "${GENERATED_REDIS_PASSWORD}" + }, + "teable": { + "BACKEND_CACHE_REDIS_URI": "redis://default:${GENERATED_REDIS_PASSWORD}@teable-cache:6379/0" + } }, "stack_command_overrides": { - "teable-cache": ["redis-server", "--requirepass", "${REDISCLI_AUTH}"] + "teable-cache": [ + "redis-server", + "--requirepass", + "${REDISCLI_AUTH}" + ] }, "stack_adaptation_notes": [ "The malformed imported '--requirepass password' argument is translated to separate Redis command arguments, preserving its upstream entrypoint.", @@ -14,6 +22,19 @@ "Redis readiness requires the exact PONG response, not only redis-cli exit status.", "Credentials persist in native LXC runtime metadata; administrator access can read them. Latest images and first boot remain unvalidated." ], - "stack_references": ["https://github.com/teableio/teable", "https://redis.io/docs/latest/develop/tools/cli/"] + "stack_references": [ + "https://github.com/teableio/teable", + "https://redis.io/docs/latest/develop/tools/cli/" + ], + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/.assets", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/telegram.json b/oci/catalog/overlays/telegram.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/telegram.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/thelounge.json b/oci/catalog/overlays/thelounge.json index d6c880f2..6dae14c7 100644 --- a/oci/catalog/overlays/thelounge.json +++ b/oci/catalog/overlays/thelounge.json @@ -5,6 +5,14 @@ "The Lounge starts in public mode: anyone who reaches the address opens the client without logging in, and the IRC networks added are lost when the session ends.", "Named accounts need private mode. Stop the container, set public: false in /config/config.js, start it again and create each user with: pct exec -- env THELOUNGE_HOME=/config s6-setuidgid abc thelounge add ", "The command asks for a password that is not echoed. After creating the users, the web interface asks for a user name and a password." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/threadfin.json b/oci/catalog/overlays/threadfin.json new file mode 100644 index 00000000..f394c501 --- /dev/null +++ b/oci/catalog/overlays/threadfin.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/home/threadfin/conf/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/home/threadfin/conf/backup", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/thunderbird.json b/oci/catalog/overlays/thunderbird.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/thunderbird.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/transmission.json b/oci/catalog/overlays/transmission.json new file mode 100644 index 00000000..f6f5a53a --- /dev/null +++ b/oci/catalog/overlays/transmission.json @@ -0,0 +1,26 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/watch", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/trilium.json b/oci/catalog/overlays/trilium.json new file mode 100644 index 00000000..c1b48c0e --- /dev/null +++ b/oci/catalog/overlays/trilium.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/home/node/trilium-data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/tvheadend.json b/oci/catalog/overlays/tvheadend.json new file mode 100644 index 00000000..c660adf3 --- /dev/null +++ b/oci/catalog/overlays/tvheadend.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/recordings", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/ubooquity.json b/oci/catalog/overlays/ubooquity.json new file mode 100644 index 00000000..4b6257f5 --- /dev/null +++ b/oci/catalog/overlays/ubooquity.json @@ -0,0 +1,32 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/books", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/comics", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/files", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/ungoogled-chromium.json b/oci/catalog/overlays/ungoogled-chromium.json index 532596f8..50d31ef4 100644 --- a/oci/catalog/overlays/ungoogled-chromium.json +++ b/oci/catalog/overlays/ungoogled-chromium.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/unifi-controller.json b/oci/catalog/overlays/unifi-controller.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/unifi-controller.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/unifi-network-application.json b/oci/catalog/overlays/unifi-network-application.json index b4665491..5bbd4bf5 100644 --- a/oci/catalog/overlays/unifi-network-application.json +++ b/oci/catalog/overlays/unifi-network-application.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Needs MongoDB in its own container; planned as a multi-container application" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/unpackerr.json b/oci/catalog/overlays/unpackerr.json index a8357120..6f7921ee 100644 --- a/oci/catalog/overlays/unpackerr.json +++ b/oci/catalog/overlays/unpackerr.json @@ -4,6 +4,20 @@ "completion_notes": [ "Unpackerr has no web interface and extracts nothing until it is pointed at a Starr application. Uncomment the [sonarr.0] or [radarr.0] section in /config/unpackerr.conf inside the container, set its url and api_key, then restart the container.", "The same connection can be given as container variables instead of the file: UN_SONARR_0_URL and UN_SONARR_0_API_KEY, or the UN_RADARR_0_ equivalents." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/uptimekuma.json b/oci/catalog/overlays/uptimekuma.json new file mode 100644 index 00000000..f766a3a4 --- /dev/null +++ b/oci/catalog/overlays/uptimekuma.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/app/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/v2raya.json b/oci/catalog/overlays/v2raya.json new file mode 100644 index 00000000..9ac17694 --- /dev/null +++ b/oci/catalog/overlays/v2raya.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/etc/v2raya", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/vaultwarden.json b/oci/catalog/overlays/vaultwarden.json index 49f7d047..beb29bae 100644 --- a/oci/catalog/overlays/vaultwarden.json +++ b/oci/catalog/overlays/vaultwarden.json @@ -56,7 +56,15 @@ "request_timeout_seconds": 10, "stability_seconds": 4, "verify_tls": false - } + }, + "volume_preparations": [ + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } }, "first_run": { diff --git a/oci/catalog/overlays/virt-manager.json b/oci/catalog/overlays/virt-manager.json index 66ed2f9e..43b4d99c 100644 --- a/oci/catalog/overlays/virt-manager.json +++ b/oci/catalog/overlays/virt-manager.json @@ -2,5 +2,29 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Manages libvirt hosts, and Proxmox VE does not use libvirt" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/run/libvirt/libvirt-sock", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/var/lib/libvirt", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/DATA/Downloads", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/vivaldi.json b/oci/catalog/overlays/vivaldi.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/vivaldi.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/vlc.json b/oci/catalog/overlays/vlc.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/vlc.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/vocechat.json b/oci/catalog/overlays/vocechat.json new file mode 100644 index 00000000..6f8c1749 --- /dev/null +++ b/oci/catalog/overlays/vocechat.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/home/vocechat-server/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/vscode.json b/oci/catalog/overlays/vscode.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/vscode.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/vscodium-web.json b/oci/catalog/overlays/vscodium-web.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/vscodium-web.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/vscodium.json b/oci/catalog/overlays/vscodium.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/vscodium.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/wallabag.json b/oci/catalog/overlays/wallabag.json index 03fd265e..3f92fb1b 100644 --- a/oci/catalog/overlays/wallabag.json +++ b/oci/catalog/overlays/wallabag.json @@ -37,6 +37,14 @@ "completion_notes": [ "wallabag listens on port 80 of the container and stores its data in SQLite.", "wallabag builds its links from the address given during the installation. If it does not match the address of the container, edit lxc.environment.runtime: SYMFONY__ENV__DOMAIN_NAME in /etc/pve/lxc/.conf with the container stopped, and start it again." + ], + "volume_preparations": [ + { + "container_path": "/var/www/wallabag/web/assets/images", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/webcord.json b/oci/catalog/overlays/webcord.json index 5be963dd..4352933e 100644 --- a/oci/catalog/overlays/webcord.json +++ b/oci/catalog/overlays/webcord.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/webgrabplus.json b/oci/catalog/overlays/webgrabplus.json new file mode 100644 index 00000000..75cceddc --- /dev/null +++ b/oci/catalog/overlays/webgrabplus.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/webstation.json b/oci/catalog/overlays/webstation.json index e19bc8e9..f4d1d23b 100644 --- a/oci/catalog/overlays/webstation.json +++ b/oci/catalog/overlays/webstation.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/webtop.json b/oci/catalog/overlays/webtop.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/webtop.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/weixin.json b/oci/catalog/overlays/weixin.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/weixin.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/wg-easy.json b/oci/catalog/overlays/wg-easy.json index 681474e9..eb1946f8 100644 --- a/oci/catalog/overlays/wg-easy.json +++ b/oci/catalog/overlays/wg-easy.json @@ -124,6 +124,14 @@ "The web interface is served over plain HTTP on port 51821 (INSECURE=true). Keep it inside the local network or publish it through a reverse proxy with TLS.", "The initial user name and password stay written in /etc/pve/lxc/.conf as INIT_USERNAME and INIT_PASSWORD. They can be removed after the first login, with the container stopped.", "Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container." + ], + "volume_preparations": [ + { + "container_path": "/etc/wireguard", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/wikijs.json b/oci/catalog/overlays/wikijs.json new file mode 100644 index 00000000..75cceddc --- /dev/null +++ b/oci/catalog/overlays/wikijs.json @@ -0,0 +1,20 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + }, + { + "container_path": "/data", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/winegui.json b/oci/catalog/overlays/winegui.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/winegui.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/wireguard.json b/oci/catalog/overlays/wireguard.json index 6ab6b619..4e413a71 100644 --- a/oci/catalog/overlays/wireguard.json +++ b/oci/catalog/overlays/wireguard.json @@ -94,6 +94,14 @@ "Copy a peer configuration to the host with: pct pull /config/peer1/peer1.conf peer1.conf", "Peers reach the server through the public address and the UDP port given during the installation, so that port must be forwarded to this container.", "Adding peers later means raising PEERS in /etc/pve/lxc/.conf and restarting the container. The existing peer keys are kept." + ], + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } ] } } diff --git a/oci/catalog/overlays/wireshark.json b/oci/catalog/overlays/wireshark.json index 4f34d0f3..45ccf542 100644 --- a/oci/catalog/overlays/wireshark.json +++ b/oci/catalog/overlays/wireshark.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/wps-office.json b/oci/catalog/overlays/wps-office.json index 0ba007f0..acc7561c 100644 --- a/oci/catalog/overlays/wps-office.json +++ b/oci/catalog/overlays/wps-office.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/xbackbone.json b/oci/catalog/overlays/xbackbone.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/xbackbone.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/xemu.json b/oci/catalog/overlays/xemu.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/xemu.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/yaak.json b/oci/catalog/overlays/yaak.json index 6c767fe8..c5e1ae35 100644 --- a/oci/catalog/overlays/yaak.json +++ b/oci/catalog/overlays/yaak.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/zen.json b/oci/catalog/overlays/zen.json new file mode 100644 index 00000000..b1cbf5eb --- /dev/null +++ b/oci/catalog/overlays/zen.json @@ -0,0 +1,14 @@ +{ + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } + } +} diff --git a/oci/catalog/overlays/znc.json b/oci/catalog/overlays/znc.json index c8a575cd..85832c22 100644 --- a/oci/catalog/overlays/znc.json +++ b/oci/catalog/overlays/znc.json @@ -11,5 +11,17 @@ "retrieval": null } ] + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/catalog/overlays/zotero.json b/oci/catalog/overlays/zotero.json index 513993bf..ad60be23 100644 --- a/oci/catalog/overlays/zotero.json +++ b/oci/catalog/overlays/zotero.json @@ -9,7 +9,15 @@ "documentation": "https://docs.linuxserver.io/images/docker-baseimage-selkies/", "nvidia": "not-offered-until-specific-host-and-image-validation", "validation": "profile-generated; real streaming workload pending" - } + }, + "volume_preparations": [ + { + "container_path": "/config", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] } } } diff --git a/oci/catalog/overlays/ztnet.json b/oci/catalog/overlays/ztnet.json index cf30d72a..2006ad9e 100644 --- a/oci/catalog/overlays/ztnet.json +++ b/oci/catalog/overlays/ztnet.json @@ -2,5 +2,17 @@ "catalog_ui": { "hidden": true, "hidden_reason": "Pending multi-container adaptation; retained for future work" + }, + "proxmox": { + "installer_profile": { + "volume_preparations": [ + { + "container_path": "/var/lib/zerotier-one", + "remove_lost_found": true, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume" + } + ] + } } } diff --git a/oci/remote/install_generic_stack.py b/oci/remote/install_generic_stack.py index 82e0c9c7..765b72b2 100644 --- a/oci/remote/install_generic_stack.py +++ b/oci/remote/install_generic_stack.py @@ -252,6 +252,121 @@ def lan_access_urls(services, subnet, strict=True): return urls +def _last_int_env(service, names): + """Last matching PUID/PGID-style value from deployment.environment, + or 0 if absent/unparsable — mirrors install_oci.sh's + `[.environment[]? | select(.name == ...) | .value] | last // "0"` + plus its numeric-guard `[[ $X =~ ^[0-9]+$ ]] || X=0`.""" + value = None + for entry in service['deployment'].get('environment', []): + if entry.get('name') in names: + value = entry.get('value') + try: + parsed = int(value) + except (TypeError, ValueError): + return 0 + return parsed if parsed >= 0 else 0 + + +def resolve_volume_owner(service, owner_strategy): + """(uid, gid) for a given volume_preparations owner_strategy, + mirroring install_oci.sh's HOST_ROOT_UID/HOST_ROOT_GID (mapped-root) + and HOST_BIND_UID/HOST_BIND_GID (mapped-application-user) — these + are deliberately DIFFERENT values, not the same computation: + + - mapped-root: 100000:100000 for an unprivileged container, 0:0 + otherwise. Never depends on PUID/PGID or volume_owner (matches + install_oci.sh's HOST_ROOT_UID/HOST_ROOT_GID, which are pinned + constants that do not read CONTAINER_PUID/CONTAINER_PGID at all). + - mapped-application-user: the container's own PUID/PGID (last of + PUID/USER_ID/UID and PGID/GROUP_ID/GID in deployment.environment, + overridden by the template's volume_owner.uid/gid when present — + matches install_oci.sh's IMAGE_VOLUME_UID/GID override of + CONTAINER_PUID/CONTAINER_PGID before the offset is applied), + offset by 100000 for an unprivileged container (matches + HOST_BIND_UID/HOST_BIND_GID). volume_owner only ever overrides + this application-user value, never mapped-root's. + + Any value that cannot be parsed as a non-negative integer is + treated as 0, matching install_oci.sh's `[[ ... =~ ^[0-9]+$ ]] || + ...=0` guard. + """ + unprivileged = bool(service['deployment']['security']['unprivileged']) + if owner_strategy == 'mapped-root': + return (100000, 100000) if unprivileged else (0, 0) + if owner_strategy != 'mapped-application-user': + raise RuntimeError(f"{translate('Unsupported owner strategy:')} {owner_strategy}") + + puid = _last_int_env(service, ('PUID', 'USER_ID', 'UID')) + pgid = _last_int_env(service, ('PGID', 'GROUP_ID', 'GID')) + + volume_owner = service.get('template', {}).get('proxmox', {}) \ + .get('installer_profile', {}).get('volume_owner') or {} + if 'uid' in volume_owner: + try: + parsed = int(volume_owner['uid']) + puid = parsed if parsed >= 0 else 0 + except (TypeError, ValueError): + puid = 0 + if 'gid' in volume_owner: + try: + parsed = int(volume_owner['gid']) + pgid = parsed if parsed >= 0 else 0 + except (TypeError, ValueError): + pgid = 0 + + offset = 100000 if unprivileged else 0 + return (puid + offset, pgid + offset) + + +def apply_volume_preparation(service, mount, target): + """Declarative volume_preparations for one already-attached (but + still empty/freshly-mounted) mount, mirroring install_oci.sh's + apply_installer_profile() semantics (only_when_mount_type / + remove_lost_found / owner_strategy) for the generic-multi-lxc-stack + path, where install_oci.sh's own volume_preparations loop never + sees the real mount (it is invoked per-service with an empty + DEPLOYMENT_FILE.mounts — see create_service()). container_path in + volume_preparations is always already the final, normalized path by + the time it reaches this service's own template (service_template() + in stack.py performs that normalization before this function ever + runs). + + remove_lost_found (if declared) is applied immediately, since it + must run before the image seed is copied back onto this mount. + owner_strategy is only RESOLVED here, not applied: attach_mounts() + must chown with this returned owner AFTER it copies the image seed + back and AFTER its own fallback `os.chown(target, *owner[:2])` — + otherwise that fallback (which always runs, to preserve the image's + ownership for mounts with no declared preparation) would silently + overwrite a declared owner_strategy's result. Returns (applied, + owner) where owner is an (uid, gid) tuple when applied is True, and + None when applied is False (no preparation declared for this mount, + or only_when_mount_type did not match the real mount type) — in + that case attach_mounts() must fall back to its own unconditional + lost+found removal and image-owner chown. + """ + preparations = service.get('template', {}).get('proxmox', {}) \ + .get('installer_profile', {}).get('volume_preparations', []) + match = next((p for p in preparations + if p.get('container_path') == mount['container_path']), None) + if match is None: + return False, None + only_when_mount_type = match.get('only_when_mount_type') + if only_when_mount_type and mount['type'] != only_when_mount_type: + log(LOG, f"Skipping the preparation of {mount['container_path']} " + f"for mount type {mount['type']}") + return False, None + if match.get('remove_lost_found'): + lost = target / 'lost+found' + if lost.is_dir() and not lost.is_symlink(): + lost.rmdir() + owner_strategy = match.get('owner_strategy') + owner = resolve_volume_owner(service, owner_strategy) + log(LOG, f"Volume prepared before the first start: {mount['container_path']}") + return True, owner + + def attach_mounts(service, temporary): """Populate new managed volumes from the image, preserving its ownership.""" vmid = service['vmid'] @@ -290,12 +405,21 @@ def attach_mounts(service, temporary): if mount['type']=='managed-volume': run('pct','mount',vmid) try: - lost=target/'lost+found' - if lost.is_dir() and not lost.is_symlink(): - lost.rmdir() + applied, declared_owner = apply_volume_preparation(service, mount, target) + if not applied: + lost=target/'lost+found' + if lost.is_dir() and not lost.is_symlink(): + lost.rmdir() run('cp','-a',str(seed)+'/.',str(target)) + # The image-owner chown always runs first, to preserve + # the seeded content's ownership for a mount with no + # declared preparation; a declared owner_strategy is + # applied last so it is the mount's final ownership, + # not silently overwritten by this fallback. os.chown(target,*owner[:2]) target.chmod(owner[2]) + if applied: + os.chown(target, *declared_owner) finally: run('pct','unmount',vmid) diff --git a/oci/remote/install_oci.sh b/oci/remote/install_oci.sh index f25bed23..8ae7f9a9 100755 --- a/oci/remote/install_oci.sh +++ b/oci/remote/install_oci.sh @@ -1107,7 +1107,17 @@ apply_installer_profile() { generated_created=$((generated_created + 1)) done < <(jq -r '.proxmox.installer_profile.generated_files[]? | @base64' "$TEMPLATE_FILE") - if (( failed == 0 )); then + # For a generic-multi-lxc-stack service (stack_managed: true in + # DEPLOYMENT_FILE), create_service() invokes this script per-service + # with an always-empty DEPLOYMENT_FILE.mounts (the real mount is + # attached afterwards, in Python, by attach_mounts()) — so + # only_when_mount_type here would never match, and this loop would + # always print a misleading "for mount type none" and skip. The stack + # path applies volume_preparations itself, after the real mount is + # attached (see apply_volume_preparation() in install_generic_stack.py). + # generated_files, self_signed_tls and everything else in this + # function are unaffected by this condition. + if (( failed == 0 )) && [[ $(jq -r '.stack_managed // false' "$DEPLOYMENT_FILE") != true ]]; then while IFS= read -r encoded; do [[ -n $encoded ]] || continue item=$(printf '%s' "$encoded" | base64 -d) diff --git a/oci/src/proxmenux_oci/stack.py b/oci/src/proxmenux_oci/stack.py index 8854e853..1a7a63ab 100644 --- a/oci/src/proxmenux_oci/stack.py +++ b/oci/src/proxmenux_oci/stack.py @@ -58,6 +58,18 @@ DEPENDENCY_VOLUMES = {'mariadb':['/var/lib/mysql'], 'linuxserver/mariadb':['/con 'getmeili/meilisearch':['/meili_data']} +def normalized_dependency_mount_path(container_path, image): + """PostgreSQL 18+ 'postgres:latest' stores versioned PGDATA directly + under /var/lib/postgresql instead of /var/lib/postgresql/data (the path + declared in the source Compose file). Both the volume rename below and + volume_preparations matching in service_template() must agree on this + one normalized path, or a preparation keyed to either form gets + silently dropped or ends up orphaned against the renamed mount.""" + if container_path == '/var/lib/postgresql/data' and str(image).endswith(':latest'): + return '/var/lib/postgresql' + return container_path + + def authenticated_redis(service): c = service['compose'] return (kind(service['image']) == 'redis' and not c.get('entrypoint') @@ -112,10 +124,11 @@ def ordered_services(template): def service_template(parent, service, main=False): c = copy.deepcopy(service['compose']) mounts = normalized_mounts(c.get('volumes', [])) - targets = {m['target'] for m in mounts} + explicit_targets = {m['target'] for m in mounts} for target in DEPENDENCY_VOLUMES.get(kind(service['image']), []): - if not any(target == t or target.startswith(t.rstrip('/')+'/') for t in targets): + if not any(target == t or target.startswith(t.rstrip('/')+'/') for t in explicit_targets): mounts.append({'type':'volume','target':target}) + targets = {m['target'] for m in mounts} c['volumes'] = mounts for key in ('depends_on', 'networks', 'healthcheck', 'expose'): c.pop(key, None) @@ -139,6 +152,17 @@ def service_template(parent, service, main=False): single['first_run'] = {'endpoints': [], 'credentials': copy.deepcopy(parent.get('first_run', {}).get('credentials', [])) if main else []} single['proxmox'].setdefault('installer_profile', {}).pop('startup_healthcheck', None) + parent_preparations = parent.get('proxmox', {}).get('installer_profile', {}).get('volume_preparations', []) + normalized_targets = {normalized_dependency_mount_path(t, service['image']) for t in targets} + own_preparations = [] + for p in parent_preparations: + normalized_path = normalized_dependency_mount_path(p.get('container_path'), service['image']) + if normalized_path in normalized_targets: + entry = copy.deepcopy(p) + entry['container_path'] = normalized_path + own_preparations.append(entry) + if own_preparations: + single['proxmox'].setdefault('installer_profile', {})['volume_preparations'] = own_preparations return single @@ -298,7 +322,7 @@ def build_stack(template, ui, mode='advanced'): # Official PostgreSQL 18+ stores versioned PGDATA under this parent. for m in single['container_contract']['volumes']: if m['container_path'] == '/var/lib/postgresql/data' and s['image'].endswith(':latest'): - m['container_path'] = '/var/lib/postgresql' + m['container_path'] = normalized_dependency_mount_path(m['container_path'], s['image']) for e in single['container_contract']['environment']: e['required'] = bool(e['example']) e['example'] = 'stack-resolved-value' if e['example'] else '' @@ -378,7 +402,10 @@ def apply_stack_support(template): template['status'] = 'generated-review-required' return template['proxmox'].pop('generic_stack_review',None) + preserved_preparations = template['proxmox'].get('installer_profile',{}).get('volume_preparations') template['proxmox']['installer_profile'] = {'stack_driver':'generic-multi-lxc-stack'} + if preserved_preparations: + template['proxmox']['installer_profile']['volume_preparations'] = preserved_preparations template['compatibility']['untranslated_blockers'] = [] template['compatibility']['automatic_install_candidate'] = True template['status'] = 'generated-unvalidated' diff --git a/oci/tests/test_stack_attach_mounts_volume_preparations.py b/oci/tests/test_stack_attach_mounts_volume_preparations.py new file mode 100644 index 00000000..77ba7b61 --- /dev/null +++ b/oci/tests/test_stack_attach_mounts_volume_preparations.py @@ -0,0 +1,373 @@ +"""Unit tests for the declarative volume_preparations application inside +install_generic_stack.py's attach_mounts() (Solution A, approved +2026-09-29): the stack path now runs volume_preparations itself, after +attach_mounts() has physically attached the real mount — instead of +relying on install_oci.sh's apply_installer_profile(), whose +only_when_mount_type check can never match for a stack service because +create_service() invokes install_oci.sh per-service with an +always-empty DEPLOYMENT_FILE.mounts. + +Corrected after review found two bugs in the first implementation: +1. resolve_volume_owner() originally computed ONE value shared by both + owner_strategy values, so mapped-root incorrectly picked up + PUID/PGID/volume_owner (it must always be 100000:100000 or 0:0, + independent of the container's application user). It now takes the + owner_strategy as an explicit argument and returns a genuinely + different value per strategy, mirroring install_oci.sh's + HOST_ROOT_UID/GID (mapped-root, fixed) vs. HOST_BIND_UID/GID + (mapped-application-user, PUID/PGID + offset). +2. apply_volume_preparation() no longer chowns directly — it only + resolves and returns the declared owner; attach_mounts() applies it + AFTER the seed copy and AFTER its own always-run fallback chown + (which preserves image ownership for mounts with no declared + preparation), so the declared owner is never silently overwritten. + +These tests exercise apply_volume_preparation()/resolve_volume_owner() +directly against a real filesystem fixture (a temp directory standing +in for the already-mounted container_path) — they do NOT touch pct, +LXC, or any real container; attach_mounts() itself (which does call +pct) is exercised only at the metadata/selection level by the existing +test_stack_volume_preparations.py tests (build_stack() output) and, for +the post-attach ordering fix, by a source-order guard test below — not +re-tested here at the pct/LXC level. +""" +from pathlib import Path +import sys +import tempfile +import unittest +from unittest.mock import patch + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "remote")) +sys.path.insert(0, str(ROOT / "src")) + +import install_generic_stack as igs # noqa: E402 + + +def make_service(*, unprivileged=True, environment=None, volume_owner=None, + volume_preparations=None): + return { + 'deployment': { + 'security': {'unprivileged': unprivileged}, + 'environment': environment or [], + }, + 'template': { + 'proxmox': { + 'installer_profile': { + **({'volume_owner': volume_owner} if volume_owner else {}), + 'volume_preparations': volume_preparations or [], + } + } + }, + } + + +class ResolveVolumeOwnerTests(unittest.TestCase): + def test_mapped_root_unprivileged_is_100000(self): + service = make_service(unprivileged=True) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-root'), (100000, 100000)) + + def test_mapped_root_privileged_is_0(self): + service = make_service(unprivileged=False) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-root'), (0, 0)) + + def test_mapped_root_ignores_puid_pgid(self): + """The bug this guards against: mapped-root with PUID/PGID=1000 + must still resolve to the fixed root mapping (100000:100000 for + unprivileged), NOT the application-user offset (101000:101000).""" + service = make_service(unprivileged=True, environment=[ + {'name': 'PUID', 'value': '1000'}, + {'name': 'PGID', 'value': '1000'}, + ]) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-root'), (100000, 100000)) + + def test_mapped_root_ignores_volume_owner_override(self): + service = make_service(unprivileged=True, volume_owner={'uid': 5000, 'gid': 6000}) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-root'), (100000, 100000)) + + def test_mapped_application_user_default_is_offset_zero(self): + service = make_service(unprivileged=True) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-application-user'), (100000, 100000)) + + def test_mapped_application_user_privileged_default_is_root(self): + service = make_service(unprivileged=False) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-application-user'), (0, 0)) + + def test_mapped_application_user_with_puid_pgid_unprivileged(self): + """The bug this guards against, other direction: mapped-root and + mapped-application-user with the SAME PUID/PGID=1000 must give + DIFFERENT results — this one gets the application offset.""" + service = make_service(unprivileged=True, environment=[ + {'name': 'PUID', 'value': '1000'}, + {'name': 'PGID', 'value': '1000'}, + ]) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-application-user'), (101000, 101000)) + + def test_mapped_application_user_with_puid_pgid_privileged(self): + service = make_service(unprivileged=False, environment=[ + {'name': 'PUID', 'value': '1000'}, + {'name': 'PGID', 'value': '1000'}, + ]) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-application-user'), (1000, 1000)) + + def test_mapped_application_user_last_matching_environment_name_wins(self): + service = make_service(unprivileged=False, environment=[ + {'name': 'PUID', 'value': '1000'}, + {'name': 'UID', 'value': '2000'}, + {'name': 'PGID', 'value': '1000'}, + {'name': 'GROUP_ID', 'value': '3000'}, + ]) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-application-user'), (2000, 3000)) + + def test_mapped_application_user_invalid_environment_value_is_safely_zero(self): + service = make_service(unprivileged=False, environment=[ + {'name': 'PUID', 'value': 'not-a-number'}, + {'name': 'PGID', 'value': '-5'}, + ]) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-application-user'), (0, 0)) + + def test_volume_owner_overrides_only_mapped_application_user(self): + """volume_owner must change only the application-user strategy, + never mapped-root — even when both are resolved for the same + service.""" + service = make_service(unprivileged=False, environment=[ + {'name': 'PUID', 'value': '1000'}, + {'name': 'PGID', 'value': '1000'}, + ], volume_owner={'uid': 5000, 'gid': 6000}) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-application-user'), (5000, 6000)) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-root'), (0, 0)) + + def test_invalid_volume_owner_override_is_safely_zero(self): + service = make_service(unprivileged=False, environment=[ + {'name': 'PUID', 'value': '1000'}, + ], volume_owner={'uid': 'bogus'}) + self.assertEqual(igs.resolve_volume_owner(service, 'mapped-application-user')[0], 0) + + def test_unknown_owner_strategy_fails_clearly(self): + service = make_service(unprivileged=True) + with self.assertRaises(RuntimeError): + igs.resolve_volume_owner(service, 'some-future-strategy') + + +class ApplyVolumePreparationTests(unittest.TestCase): + def _target(self, tmp, with_lost_found=True): + target = Path(tmp) / 'target' + target.mkdir() + if with_lost_found: + (target / 'lost+found').mkdir() + return target + + def test_managed_volume_preparation_removes_lost_found_and_resolves_owner(self): + """apply_volume_preparation() no longer chowns directly — it + resolves and returns the declared owner for the caller to apply + after the seed copy (see ApplyVolumePreparationOrderingTests).""" + with tempfile.TemporaryDirectory() as tmp: + target = self._target(tmp) + service = make_service(unprivileged=True, volume_preparations=[{ + 'container_path': '/app/.blinko', + 'remove_lost_found': True, + 'owner_strategy': 'mapped-root', + 'only_when_mount_type': 'managed-volume', + }]) + mount = {'container_path': '/app/.blinko', 'type': 'managed-volume'} + applied, owner = igs.apply_volume_preparation(service, mount, target) + self.assertTrue(applied) + self.assertEqual(owner, (100000, 100000)) + self.assertFalse((target / 'lost+found').exists()) + + def test_host_bind_mount_with_managed_volume_only_rule_is_not_applied(self): + """A declared preparation scoped to only_when_mount_type: + managed-volume must not run against a host-bind mount, even if + the container_path matches.""" + with tempfile.TemporaryDirectory() as tmp: + target = self._target(tmp) + lost_found_existed_before = (target / 'lost+found').exists() + service = make_service(unprivileged=True, volume_preparations=[{ + 'container_path': '/shared/data', + 'remove_lost_found': True, + 'owner_strategy': 'mapped-root', + 'only_when_mount_type': 'managed-volume', + }]) + mount = {'container_path': '/shared/data', 'type': 'host-bind'} + applied, owner = igs.apply_volume_preparation(service, mount, target) + self.assertFalse(applied) + self.assertIsNone(owner) + self.assertEqual((target / 'lost+found').exists(), lost_found_existed_before) + + def test_final_normalized_postgres_path_is_applied(self): + with tempfile.TemporaryDirectory() as tmp: + target = self._target(tmp) + service = make_service(unprivileged=True, volume_preparations=[{ + 'container_path': '/var/lib/postgresql', + 'remove_lost_found': True, + 'owner_strategy': 'mapped-root', + 'only_when_mount_type': 'managed-volume', + }]) + mount = {'container_path': '/var/lib/postgresql', 'type': 'managed-volume'} + applied, owner = igs.apply_volume_preparation(service, mount, target) + self.assertTrue(applied) + self.assertEqual(owner, (100000, 100000)) + self.assertFalse((target / 'lost+found').exists()) + + def test_pre_rename_path_does_not_match_final_mount(self): + with tempfile.TemporaryDirectory() as tmp: + target = self._target(tmp) + service = make_service(unprivileged=True, volume_preparations=[{ + 'container_path': '/var/lib/postgresql/data', + 'remove_lost_found': True, + 'owner_strategy': 'mapped-root', + 'only_when_mount_type': 'managed-volume', + }]) + mount = {'container_path': '/var/lib/postgresql', 'type': 'managed-volume'} + applied, owner = igs.apply_volume_preparation(service, mount, target) + self.assertFalse(applied) + self.assertIsNone(owner) + self.assertTrue((target / 'lost+found').exists()) + + def test_no_declared_preparation_leaves_caller_to_fall_back(self): + with tempfile.TemporaryDirectory() as tmp: + target = self._target(tmp) + service = make_service(unprivileged=True, volume_preparations=[]) + mount = {'container_path': '/app/.blinko', 'type': 'managed-volume'} + applied, owner = igs.apply_volume_preparation(service, mount, target) + self.assertFalse(applied) + self.assertIsNone(owner) + self.assertTrue((target / 'lost+found').exists()) + + def test_unknown_owner_strategy_fails_clearly(self): + with tempfile.TemporaryDirectory() as tmp: + target = self._target(tmp) + service = make_service(unprivileged=True, volume_preparations=[{ + 'container_path': '/app/.blinko', + 'remove_lost_found': True, + 'owner_strategy': 'some-future-strategy', + 'only_when_mount_type': 'managed-volume', + }]) + mount = {'container_path': '/app/.blinko', 'type': 'managed-volume'} + with self.assertRaises(RuntimeError): + igs.apply_volume_preparation(service, mount, target) + + def test_missing_owner_strategy_fails_clearly(self): + with tempfile.TemporaryDirectory() as tmp: + target = self._target(tmp) + service = make_service(unprivileged=True, volume_preparations=[{ + 'container_path': '/app/.blinko', + 'remove_lost_found': True, + 'only_when_mount_type': 'managed-volume', + }]) + mount = {'container_path': '/app/.blinko', 'type': 'managed-volume'} + with self.assertRaises(RuntimeError): + igs.apply_volume_preparation(service, mount, target) + + def test_mapped_application_user_is_resolved_distinctly_from_mapped_root(self): + """Integration-level guard for bug #1: the two owner_strategy + values applied to the SAME service (same PUID/PGID) must return + different owners through apply_volume_preparation() itself, not + just through resolve_volume_owner() in isolation.""" + with tempfile.TemporaryDirectory() as tmp: + service = make_service(unprivileged=True, environment=[ + {'name': 'PUID', 'value': '1000'}, + {'name': 'PGID', 'value': '1000'}, + ], volume_preparations=[ + { + 'container_path': '/data/root-owned', + 'owner_strategy': 'mapped-root', + 'only_when_mount_type': 'managed-volume', + }, + { + 'container_path': '/data/app-owned', + 'owner_strategy': 'mapped-application-user', + 'only_when_mount_type': 'managed-volume', + }, + ]) + target_root = self._target(tmp, with_lost_found=False) + target_app = Path(tmp) / 'target-app' + target_app.mkdir() + _, owner_root = igs.apply_volume_preparation( + service, {'container_path': '/data/root-owned', 'type': 'managed-volume'}, target_root) + _, owner_app = igs.apply_volume_preparation( + service, {'container_path': '/data/app-owned', 'type': 'managed-volume'}, target_app) + self.assertEqual(owner_root, (100000, 100000)) + self.assertEqual(owner_app, (101000, 101000)) + self.assertNotEqual(owner_root, owner_app) + + +class AttachMountsOrderingTests(unittest.TestCase): + """Guards bug #2 at the source level: attach_mounts() must apply a + declared owner_strategy's chown AFTER the seed cp -a and AFTER its + own fallback os.chown(target, *owner[:2]) — otherwise that always-run + fallback (which exists to preserve image ownership for mounts with + no declared preparation) silently overwrites the declared result. + This does not execute attach_mounts() (it calls pct/LXC); it proves + the source order directly, which is what determines runtime + behaviour here.""" + + def setUp(self): + self.source = (ROOT / "remote" / "install_generic_stack.py").read_text(encoding="utf-8") + start = self.source.index("def attach_mounts(") + end = self.source.index("\ndef ", start + 1) + self.body = self.source[start:end] + + def test_apply_volume_preparation_called_before_seed_copy(self): + self.assertLess( + self.body.index("apply_volume_preparation("), + self.body.index("run('cp','-a',str(seed)"), + ) + + def test_fallback_chown_runs_before_declared_owner_chown(self): + fallback_index = self.body.index("os.chown(target,*owner[:2])") + declared_index = self.body.index("os.chown(target, *declared_owner)") + self.assertLess(fallback_index, declared_index, + "the declared owner_strategy chown must run AFTER the fallback chown, " + "so it is the mount's final ownership and not silently overwritten") + + def test_declared_owner_chown_is_conditional_on_applied(self): + # Must only run when a preparation actually matched — guards + # against unconditionally chowning to a stale/None owner. + declared_index = self.body.index("os.chown(target, *declared_owner)") + guard_index = self.body.rindex("if applied:", 0, declared_index) + self.assertGreater(declared_index, guard_index) + + +class InstallOciShStackManagedTests(unittest.TestCase): + """install_oci.sh's own volume_preparations loop must be skipped + only for stack_managed: true services, and must leave generated_files, + self_signed_tls, and every other apply_installer_profile() step + untouched — this is a source-text guard (no bash execution here; a + real stack install run is exercised separately, outside this unit + test file).""" + + def setUp(self): + self.source = (ROOT / "remote" / "install_oci.sh").read_text(encoding="utf-8") + + def test_volume_preparations_loop_is_gated_on_stack_managed(self): + self.assertIn( + 'if (( failed == 0 )) && [[ $(jq -r \'.stack_managed // false\' "$DEPLOYMENT_FILE") != true ]]; then', + self.source, + ) + + def test_generated_files_loop_is_not_gated_on_stack_managed(self): + marker = "done < <(jq -r '.proxmox.installer_profile.generated_files[]? | @base64' \"$TEMPLATE_FILE\")" + self.assertIn(marker, self.source) + gate_index = self.source.index( + 'if (( failed == 0 )) && [[ $(jq -r \'.stack_managed // false\' "$DEPLOYMENT_FILE") != true ]]; then' + ) + self.assertLess(self.source.index(marker), gate_index, + "generated_files loop must run before, and outside, the new stack_managed gate") + + def test_self_signed_tls_block_is_not_gated_on_stack_managed(self): + marker = "tls_count == 1" + self.assertIn(marker, self.source) + gate_index = self.source.index( + 'if (( failed == 0 )) && [[ $(jq -r \'.stack_managed // false\' "$DEPLOYMENT_FILE") != true ]]; then' + ) + self.assertGreater(self.source.index(marker), gate_index, + "self_signed_tls must remain its own block after the volume_preparations gate, unaffected by it") + + def test_pre_start_repairs_and_volume_seeds_are_not_gated(self): + self.assertIn("pre_start_repairs", self.source) + self.assertIn("apply_volume_seeds", self.source) + + +if __name__ == "__main__": + unittest.main() diff --git a/oci/tests/test_stack_volume_preparations.py b/oci/tests/test_stack_volume_preparations.py new file mode 100644 index 00000000..a4841852 --- /dev/null +++ b/oci/tests/test_stack_volume_preparations.py @@ -0,0 +1,140 @@ +"""Regression test for volume_preparations survival through the generic +multi-LXC stack pipeline (apply_stack_support + service_template). + +install_generic_stack.py::create_service() writes each service's own +service['template'] to a per-service template.json and runs install_oci.sh +against that file independently — the parent stack template's +installer_profile is never read at install time. So the fix must land in +each service's own template, not just the parent's top-level +installer_profile (that alone would be a cosmetic data match with no real +effect). This is the regression guard for the stack volume_preparations +loss first found via read-only audit (2026-09-29): apply_stack_support() +replaced installer_profile wholesale and silently dropped +volume_preparations for every stack app (Blinko, Kimai, Linkwarden, Monica +Official, Petio, Qui, RomM, Teable). +""" +from pathlib import Path +import sys +import unittest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "src")) + +from proxmenux_oci.catalog import Catalog +from proxmenux_oci.stack import build_stack, DefaultsUI + + +class StackVolumePreparationsTests(unittest.TestCase): + def test_stack_service_receives_only_its_own_volume_preparation(self): + """Blinko (2-service stack: blinko + blinko-postgres). The real + build_stack() output — what create_service() actually writes to + each service's template.json — must carry the preparation for + /app/.blinko into the blinko service's own template, scoped to + only_when_mount_type: managed-volume, and must NOT leak it (or any + other service's paths) into blinko-postgres's template, which has + no volume_preparations entry of its own in the source catalog.""" + template = Catalog(ROOT).compose("blinko") + result = build_stack(template, DefaultsUI(), mode="simple") + + services_by_name = {s["name"]: s for s in result["services"]} + self.assertEqual(set(services_by_name), {"blinko", "blinko-postgres"}) + + blinko_preps = services_by_name["blinko"]["template"]["proxmox"] \ + .get("installer_profile", {}).get("volume_preparations", []) + self.assertEqual(len(blinko_preps), 1) + self.assertEqual(blinko_preps[0]["container_path"], "/app/.blinko") + self.assertEqual(blinko_preps[0]["only_when_mount_type"], "managed-volume") + + postgres_preps = services_by_name["blinko-postgres"]["template"]["proxmox"] \ + .get("installer_profile", {}).get("volume_preparations", []) + self.assertEqual(postgres_preps, []) + + def test_synthetic_dependency_volume_preparation_reaches_only_that_service(self): + """Blinko's postgres dependency service (blinko-postgres, image + postgres:latest) has its own Compose-declared mount, + /var/lib/postgresql/data, which build_stack() normalizes to + /var/lib/postgresql for PostgreSQL 18+ (see the 'Official + PostgreSQL 18+' comment in build_stack()) — this mount is NOT one + of the DEPENDENCY_VOLUMES fallback entries, it comes straight from + the source Compose file. A synthetic volume_preparations entry for + the final, normalized mount target (/var/lib/postgresql) is + injected on the parent template to verify it reaches only the + postgres service's own template — not blinko's, and not lost. This + test is only about correct metadata transfer through + service_template()/build_stack(); it makes no claim about whether + preparing a database data directory this way is runtime-appropriate.""" + template = Catalog(ROOT).compose("blinko") + template["proxmox"]["installer_profile"].setdefault("volume_preparations", []) + template["proxmox"]["installer_profile"]["volume_preparations"].append({ + "container_path": "/var/lib/postgresql", + "remove_lost_found": True, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume", + }) + + result = build_stack(template, DefaultsUI(), mode="simple") + services_by_name = {s["name"]: s for s in result["services"]} + + postgres_preps = services_by_name["blinko-postgres"]["template"]["proxmox"] \ + .get("installer_profile", {}).get("volume_preparations", []) + self.assertEqual( + [p["container_path"] for p in postgres_preps], + ["/var/lib/postgresql"], + "The synthetic preparation for the final, normalized postgres " + "mount target must reach the postgres service's own template.", + ) + self.assertEqual( + postgres_preps[0]["container_path"], + services_by_name["blinko-postgres"]["template"]["container_contract"]["volumes"][0]["container_path"], + "The preparation's container_path must match the service's own " + "final mount path exactly, not an intermediate/pre-rename form.", + ) + + blinko_preps = services_by_name["blinko"]["template"]["proxmox"] \ + .get("installer_profile", {}).get("volume_preparations", []) + self.assertEqual( + [p["container_path"] for p in blinko_preps], + ["/app/.blinko"], + "The synthetic postgres-only preparation must not leak into " + "blinko's own template.", + ) + + def test_synthetic_dependency_volume_preparation_keyed_to_the_pre_rename_path_is_also_normalized(self): + """The same postgres mount, but the synthetic preparation is keyed + to the pre-rename Compose path (/var/lib/postgresql/data) instead + of the final one. It must still reach blinko-postgres's own + template, remapped to the same final container_path + (/var/lib/postgresql) that build_stack() actually mounts — a + preparation entry whose path no longer matches any real mount is + dead configuration at install time. This test is only about + correct metadata transfer; it makes no claim about runtime + appropriateness.""" + template = Catalog(ROOT).compose("blinko") + template["proxmox"]["installer_profile"].setdefault("volume_preparations", []) + template["proxmox"]["installer_profile"]["volume_preparations"].append({ + "container_path": "/var/lib/postgresql/data", + "remove_lost_found": True, + "owner_strategy": "mapped-root", + "only_when_mount_type": "managed-volume", + }) + + result = build_stack(template, DefaultsUI(), mode="simple") + services_by_name = {s["name"]: s for s in result["services"]} + + postgres_preps = services_by_name["blinko-postgres"]["template"]["proxmox"] \ + .get("installer_profile", {}).get("volume_preparations", []) + self.assertEqual( + [p["container_path"] for p in postgres_preps], + ["/var/lib/postgresql"], + "A preparation keyed to the pre-rename Compose path must be " + "remapped to the same final path build_stack() actually mounts, " + "not silently dropped and not left pointing at the stale path.", + ) + self.assertEqual( + postgres_preps[0]["container_path"], + services_by_name["blinko-postgres"]["template"]["container_contract"]["volumes"][0]["container_path"], + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/oci/tests/test_volume_preparations_curated.py b/oci/tests/test_volume_preparations_curated.py new file mode 100644 index 00000000..44be76f5 --- /dev/null +++ b/oci/tests/test_volume_preparations_curated.py @@ -0,0 +1,80 @@ +"""Regression tests for volume_preparations coverage across generated and +curated-profile catalog entries. + +Covers the original OCI lost+found fix: a fresh ext4 managed volume carries +a lost+found directory, which stops images that take ownership of their own +data directories. volume_preparations (remove_lost_found + +only_when_mount_type: managed-volume) must be present for every persistent +mount, for both regular generated apps/*.json entries and curated-profile +entries (curated/*.json) — the curated-profile gap (Jellyfin Official first +surfaced it) is exactly what this suite guards against regressing. +""" +from pathlib import Path +import sys +import unittest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "src")) + +from proxmenux_oci.catalog import Catalog + + +class VolumePreparationsCoverageTests(unittest.TestCase): + def _preparations_by_path(self, template): + preparations = template["proxmox"]["installer_profile"].get("volume_preparations", []) + return {item["container_path"]: item for item in preparations} + + def test_generated_app_volume_preparations_match_persistent_mounts(self): + """Regular generated app (Uptime Kuma, apps/uptimekuma.json): every + declared volume has a matching volume_preparations entry, and every + entry is scoped to only_when_mount_type: managed-volume.""" + template = Catalog(ROOT).compose("uptimekuma") + + volume_paths = {v["container_path"] for v in template["container_contract"].get("volumes", [])} + preparations = self._preparations_by_path(template) + + self.assertTrue(volume_paths, "fixture app must declare at least one volume") + self.assertEqual(set(preparations.keys()), volume_paths) + for path, entry in preparations.items(): + self.assertTrue(entry.get("remove_lost_found")) + self.assertEqual(entry.get("only_when_mount_type"), "managed-volume") + + def test_curated_profile_app_volume_preparations_match_persistent_mounts(self): + """Curated-profile app (Jellyfin Official, curated/jellyfin-official.json, + 3 mounts: /config, /cache, /media): same coverage requirement as + generated apps. This is the regression guard for the gap first found + via live testing — the original fix only touched apps/*.json and + missed curated/*.json entirely.""" + template = Catalog(ROOT).compose("jellyfin-official") + + volume_paths = {v["container_path"] for v in template["container_contract"].get("volumes", [])} + preparations = self._preparations_by_path(template) + + self.assertEqual(volume_paths, {"/config", "/cache", "/media"}) + self.assertEqual(set(preparations.keys()), volume_paths) + for path, entry in preparations.items(): + self.assertTrue(entry.get("remove_lost_found")) + self.assertEqual(entry.get("only_when_mount_type"), "managed-volume") + + + def test_overlay_app_volume_preparations_match_the_overlay_remapped_mount(self): + """PocketBase (apps/pocketbase.json + overlays/pocketbase.json): the + overlay remaps the container_path from /pb_data to + /pocketbase/pb_data. volume_preparations must follow the overlay's + remapped path, not the pre-overlay source path — this is the + regression guard for the overlay/mount desync first found via + read-only audit (2026-09-29).""" + template = Catalog(ROOT).compose("pocketbase") + + volume_paths = {v["container_path"] for v in template["container_contract"].get("volumes", [])} + preparations = self._preparations_by_path(template) + + self.assertEqual(volume_paths, {"/pocketbase/pb_data"}) + self.assertEqual(set(preparations.keys()), volume_paths) + for path, entry in preparations.items(): + self.assertTrue(entry.get("remove_lost_found")) + self.assertEqual(entry.get("only_when_mount_type"), "managed-volume") + + +if __name__ == "__main__": + unittest.main()