mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-05 20:32:15 +00:00
Merge develop into feature/oci-app-catalog-additions
Resolve the catalog conflicts and regenerate VALIDATION.md.
This commit is contained in:
@@ -25,6 +25,11 @@ on:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
|
# A newer push to the same branch or pull request replaces the run in progress.
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -112,6 +112,11 @@ on:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
|
# A newer push to the same branch or pull request replaces the run in progress.
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
apprise-services:
|
apprise-services:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -51,6 +51,11 @@ on:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
|
# A newer push to the same branch or pull request replaces the run in progress.
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# Preserve this check ID for existing branch protection rules. This suite
|
# Preserve this check ID for existing branch protection rules. This suite
|
||||||
# includes menu, download and scheduler regressions as well as i18n tests.
|
# includes menu, download and scheduler regressions as well as i18n tests.
|
||||||
|
|||||||
@@ -57,6 +57,11 @@ on:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
|
# A newer push to the same branch or pull request replaces the run in progress.
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
offline-python:
|
offline-python:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
+15
-1
@@ -256,6 +256,7 @@
|
|||||||
"Acceleration for llama.cpp": "Beschleunigung für llama.cpp",
|
"Acceleration for llama.cpp": "Beschleunigung für llama.cpp",
|
||||||
"Accept routes from other nodes?": "Routen von anderen Knoten akzeptieren?",
|
"Accept routes from other nodes?": "Routen von anderen Knoten akzeptieren?",
|
||||||
"Accept this host monitoring profile?": "Akzeptieren Sie dieses Host Monitoring Profil?",
|
"Accept this host monitoring profile?": "Akzeptieren Sie dieses Host Monitoring Profil?",
|
||||||
|
"Access Movistar and O2 Cloud from WebDAV clients and backup tools.": "Zugriff auf die Movistar- und O2-Cloud über WebDAV-Clients und Backup-Werkzeuge.",
|
||||||
"Access Scope:": "Zugriffsbereich:",
|
"Access Scope:": "Zugriffsbereich:",
|
||||||
"Access bridge": "Zugangsbrücke",
|
"Access bridge": "Zugangsbrücke",
|
||||||
"Access bridge for Immich": "Access Bridge für Immich",
|
"Access bridge for Immich": "Access Bridge für Immich",
|
||||||
@@ -603,6 +604,9 @@
|
|||||||
"Audit socket disabled or not required": "Audit-Socket deaktiviert oder nicht erforderlich",
|
"Audit socket disabled or not required": "Audit-Socket deaktiviert oder nicht erforderlich",
|
||||||
"Auth key is required.": "Authentifizierungsschlüssel ist erforderlich.",
|
"Auth key is required.": "Authentifizierungsschlüssel ist erforderlich.",
|
||||||
"Auth:": "Authentifizierung:",
|
"Auth:": "Authentifizierung:",
|
||||||
|
"Authelia Web UI": "Authelia Web-Benutzeroberfläche",
|
||||||
|
"Authelia administrator": "Authelia-Administrator",
|
||||||
|
"Authelia session cookie domain for this portal (for example example.com)": "Authelia Sitzungscookie-Domäne für dieses Portal (z. B. example.com)",
|
||||||
"Authentication": "Authentifizierung",
|
"Authentication": "Authentifizierung",
|
||||||
"Authentication & Security": "Authentifizierung und Sicherheit",
|
"Authentication & Security": "Authentifizierung und Sicherheit",
|
||||||
"Authentication Error": "Authentifizierungsfehler",
|
"Authentication Error": "Authentifizierungsfehler",
|
||||||
@@ -4897,6 +4901,7 @@
|
|||||||
"Open the page of an application in the menu": "Die Seite einer Anwendung im Menü öffnen",
|
"Open the page of an application in the menu": "Die Seite einer Anwendung im Menü öffnen",
|
||||||
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Öffne die Webadresse und erstelle das erste Konto: Der Daemon registriert sich selbst und startet den ersten Scan.",
|
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Öffne die Webadresse und erstelle das erste Konto: Der Daemon registriert sich selbst und startet den ersten Scan.",
|
||||||
"Open the web address and create the password of the akadmin user in the first-run setup.": "Öffnen Sie die Webadresse und erstellen Sie im ersten Setup das Passwort des akadmin-Benutzers.",
|
"Open the web address and create the password of the akadmin user in the first-run setup.": "Öffnen Sie die Webadresse und erstellen Sie im ersten Setup das Passwort des akadmin-Benutzers.",
|
||||||
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.": "Öffnen Sie das Web-Dashboard und verknüpfen Sie Ihr Movistar/O2-Konto über die SMS-Bestätigung.",
|
||||||
"Open-source AI-powered coding assistant": "Open-Source AI-powered Coding Assistant",
|
"Open-source AI-powered coding assistant": "Open-Source AI-powered Coding Assistant",
|
||||||
"Open-source UI for building and debugging multi-agent and RAG applications": "Open-Source-Benutzeroberfläche zum Erstellen und Debuggen von Multi-Agenten- und RAG-Anwendungen",
|
"Open-source UI for building and debugging multi-agent and RAG applications": "Open-Source-Benutzeroberfläche zum Erstellen und Debuggen von Multi-Agenten- und RAG-Anwendungen",
|
||||||
"Open-source in-memory data store.": "Open-Source-Datenspeicher im Arbeitsspeicher.",
|
"Open-source in-memory data store.": "Open-Source-Datenspeicher im Arbeitsspeicher.",
|
||||||
@@ -5396,6 +5401,7 @@
|
|||||||
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Proxmox-Weboberfläche: Datencenter > Speicher > Hinzufügen > ZFS",
|
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Proxmox-Weboberfläche: Datencenter > Speicher > Hinzufügen > ZFS",
|
||||||
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Proxmox-Weboberfläche: Rechenzentrum > Speicher > Hinzufügen > iSCSI",
|
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Proxmox-Weboberfläche: Rechenzentrum > Speicher > Hinzufügen > iSCSI",
|
||||||
"Proxy address to reach the API (optional)": "Proxy-Adresse zum Erreichen der API (optional)",
|
"Proxy address to reach the API (optional)": "Proxy-Adresse zum Erreichen der API (optional)",
|
||||||
|
"Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)": "Öffentliche HTTPS-URL, die zum Öffnen dieses Authelia-Portals verwendet wird (zum Beispiel https://auth.example.com)",
|
||||||
"Public UDP port clients connect to": "Öffentliche UDP Port Clients verbinden sich mit",
|
"Public UDP port clients connect to": "Öffentliche UDP Port Clients verbinden sich mit",
|
||||||
"Public UDP port peers connect to": "Öffentliche UDP-Port Peers verbinden sich mit",
|
"Public UDP port peers connect to": "Öffentliche UDP-Port Peers verbinden sich mit",
|
||||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "Öffentliche URL von phpMyAdmin, wenn sie hinter einem Reverse-Proxy bereitgestellt wird",
|
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "Öffentliche URL von phpMyAdmin, wenn sie hinter einem Reverse-Proxy bereitgestellt wird",
|
||||||
@@ -6453,6 +6459,7 @@
|
|||||||
"Simple and easy to use DDNS": "Einfach und einfach zu bedienen DDNS",
|
"Simple and easy to use DDNS": "Einfach und einfach zu bedienen DDNS",
|
||||||
"Simple self-hosted file sharing.": "Einfacher, selbst gehosteter Dateiaustausch.",
|
"Simple self-hosted file sharing.": "Einfacher, selbst gehosteter Dateiaustausch.",
|
||||||
"Single GPU Warning": "Warnung vor einer einzelnen GPU",
|
"Single GPU Warning": "Warnung vor einer einzelnen GPU",
|
||||||
|
"Single sign-on and multi-factor authentication": "Single Sign-On und Multi-Faktor-Authentifizierung",
|
||||||
"Single target found — selected automatically:": "Einzelnes Ziel gefunden – automatisch ausgewählt:",
|
"Single target found — selected automatically:": "Einzelnes Ziel gefunden – automatisch ausgewählt:",
|
||||||
"Single-node log storage and query UI.": "Logspeicher mit Abfrageoberfläche für einen einzelnen Knoten.",
|
"Single-node log storage and query UI.": "Logspeicher mit Abfrageoberfläche für einen einzelnen Knoten.",
|
||||||
"Single-node observability database for metrics, logs and traces.": "Einzelknoten-Datenbank für Metriken, Protokolle und Traces.",
|
"Single-node observability database for metrics, logs and traces.": "Einzelknoten-Datenbank für Metriken, Protokolle und Traces.",
|
||||||
@@ -8202,12 +8209,17 @@
|
|||||||
"Web access": "Webzugang",
|
"Web access": "Webzugang",
|
||||||
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Webadresse des AdGuard Home, der die Einstellungen erhält (z. B. http://192.168.1.3)",
|
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Webadresse des AdGuard Home, der die Einstellungen erhält (z. B. http://192.168.1.3)",
|
||||||
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Webadresse des AdGuard Home, dessen Einstellungen kopiert sind (z. B. http://192.168.1.2)",
|
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Webadresse des AdGuard Home, dessen Einstellungen kopiert sind (z. B. http://192.168.1.2)",
|
||||||
|
"Web dashboard": "Web-Dashboard",
|
||||||
|
"Web dashboard and WebDAV": "Web-Dashboard und WebDAV",
|
||||||
"Web interface": "Weboberfläche",
|
"Web interface": "Weboberfläche",
|
||||||
"Web interface for Borg Backup repositories and jobs.": "Weboberfläche für Borg-Backup-Repositories und -Jobs.",
|
"Web interface for Borg Backup repositories and jobs.": "Weboberfläche für Borg-Backup-Repositories und -Jobs.",
|
||||||
"Web interface for managing 3D printers.": "Weboberfläche zur Verwaltung von 3D-Druckern.",
|
"Web interface for managing 3D printers.": "Weboberfläche zur Verwaltung von 3D-Druckern.",
|
||||||
"Web interface to manage devices running Tasmota firmware.": "Web-Schnittstelle zur Verwaltung von Geräten mit Tasmota-Firmware.",
|
"Web interface to manage devices running Tasmota firmware.": "Web-Schnittstelle zur Verwaltung von Geräten mit Tasmota-Firmware.",
|
||||||
"Web reverse proxy with an administration interface.": "Web-Reverse-Proxy mit Administrationsoberfläche.",
|
"Web reverse proxy with an administration interface.": "Web-Reverse-Proxy mit Administrationsoberfläche.",
|
||||||
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord kann als ein Paket von Sicherheits- und Datenschutz-Härtungen, Discord-Features-Reimplementierungen, Electron / Chromium / Discord-Bugs-Workarounds, Stylesheets, interne Seiten und verpackte https://discord.com-Seite zusammengefasst werden, die so weit wie möglich mit ToS konform sind (oder die Änderungen, die es verletzen könnten, vor Discords Augen verbergen).",
|
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord kann als ein Paket von Sicherheits- und Datenschutz-Härtungen, Discord-Features-Reimplementierungen, Electron / Chromium / Discord-Bugs-Workarounds, Stylesheets, interne Seiten und verpackte https://discord.com-Seite zusammengefasst werden, die so weit wie möglich mit ToS konform sind (oder die Änderungen, die es verletzen könnten, vor Discords Augen verbergen).",
|
||||||
|
"WebDAV": "WebDAV",
|
||||||
|
"WebDAV and dashboard password (leave empty to generate)": "Passwort für WebDAV und Dashboard (leer = generiert)",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations.": "WebDAV ist auf Port 8080 des Containers verfügbar. Vor Dateioperationen in der Cloud muss das Konto verknüpft werden.",
|
||||||
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus ist ein multi-site inkrementeller xmltv epg grabber. Es sammelt tv-programm-guide-daten von ausgewählten tvguide-seiten für ihre lieblingskanäle.",
|
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus ist ein multi-site inkrementeller xmltv epg grabber. Es sammelt tv-programm-guide-daten von ausgewählten tvguide-seiten für ihre lieblingskanäle.",
|
||||||
"Webservers & Proxies": "Webserver und Proxys",
|
"Webservers & Proxies": "Webserver und Proxys",
|
||||||
"Website": "Webseite",
|
"Website": "Webseite",
|
||||||
@@ -8967,5 +8979,7 @@
|
|||||||
"⚠ Disk data will NOT be erased.": "⚠ Festplattendaten werden NICHT gelöscht.",
|
"⚠ Disk data will NOT be erased.": "⚠ Festplattendaten werden NICHT gelöscht.",
|
||||||
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Die Festplatte wird ausgehängt und aus /etc/fstab entfernt.",
|
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Die Festplatte wird ausgehängt und aus /etc/fstab entfernt.",
|
||||||
"⚠ The /etc/fstab entry will be removed.": "⚠ Der /etc/fstab-Eintrag wird entfernt.",
|
"⚠ The /etc/fstab entry will be removed.": "⚠ Der /etc/fstab-Eintrag wird entfernt.",
|
||||||
"⚠ The disk will be unmounted.": "⚠ Die Festplatte wird ausgehängt."
|
"⚠ The disk will be unmounted.": "⚠ Die Festplatte wird ausgehängt.",
|
||||||
|
"AirDC++ administrator": "AirDC++-Administrator",
|
||||||
|
"Direct Connect file sharing with a web interface": "Direct-Connect-Dateifreigabe mit Weboberfläche"
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-1
@@ -255,6 +255,7 @@
|
|||||||
"Acceleration for llama.cpp": "Aceleración para llama.cpp",
|
"Acceleration for llama.cpp": "Aceleración para llama.cpp",
|
||||||
"Accept routes from other nodes?": "¿Aceptar rutas de otros nodos?",
|
"Accept routes from other nodes?": "¿Aceptar rutas de otros nodos?",
|
||||||
"Accept this host monitoring profile?": "¿Aceptar este perfil de monitorización del host?",
|
"Accept this host monitoring profile?": "¿Aceptar este perfil de monitorización del host?",
|
||||||
|
"Access Movistar and O2 Cloud from WebDAV clients and backup tools.": "Accede a la nube de Movistar y O2 desde clientes WebDAV y herramientas de backup.",
|
||||||
"Access Scope:": "Ámbito de acceso:",
|
"Access Scope:": "Ámbito de acceso:",
|
||||||
"Access bridge": "Puente de acceso",
|
"Access bridge": "Puente de acceso",
|
||||||
"Access bridge for Immich": "Puente de acceso para Immich",
|
"Access bridge for Immich": "Puente de acceso para Immich",
|
||||||
@@ -601,6 +602,9 @@
|
|||||||
"Audit socket disabled or not required": "Socket de auditoría deshabilitado o no requerido",
|
"Audit socket disabled or not required": "Socket de auditoría deshabilitado o no requerido",
|
||||||
"Auth key is required.": "Se requiere clave de autenticación.",
|
"Auth key is required.": "Se requiere clave de autenticación.",
|
||||||
"Auth:": "Autenticación:",
|
"Auth:": "Autenticación:",
|
||||||
|
"Authelia Web UI": "Authelia Interfaz de usuario web",
|
||||||
|
"Authelia administrator": "administrador Authelia",
|
||||||
|
"Authelia session cookie domain for this portal (for example example.com)": "dominio de cookie de sesión Authelia para este portal (por ejemplo, ejemplo.com)",
|
||||||
"Authentication": "Autenticación",
|
"Authentication": "Autenticación",
|
||||||
"Authentication & Security": "Authentication & Security",
|
"Authentication & Security": "Authentication & Security",
|
||||||
"Authentication Error": "Error de autenticación",
|
"Authentication Error": "Error de autenticación",
|
||||||
@@ -4888,6 +4892,7 @@
|
|||||||
"Open the page of an application in the menu": "Abrir la página de una aplicación en el menú",
|
"Open the page of an application in the menu": "Abrir la página de una aplicación en el menú",
|
||||||
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Abre la dirección web y crea la primera cuenta: el daemon se registra solo y empieza el primer escaneo.",
|
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Abre la dirección web y crea la primera cuenta: el daemon se registra solo y empieza el primer escaneo.",
|
||||||
"Open the web address and create the password of the akadmin user in the first-run setup.": "abra la dirección web y cree la contraseña del usuario akaadmin en la configuración de primera ejecución.",
|
"Open the web address and create the password of the akadmin user in the first-run setup.": "abra la dirección web y cree la contraseña del usuario akaadmin en la configuración de primera ejecución.",
|
||||||
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.": "Abre el panel web y vincula tu cuenta de Movistar/O2 con su verificación por SMS.",
|
||||||
"Open-source AI-powered coding assistant": "Asistente de programación con IA de código abierto",
|
"Open-source AI-powered coding assistant": "Asistente de programación con IA de código abierto",
|
||||||
"Open-source UI for building and debugging multi-agent and RAG applications": "Interfaz de código abierto para crear y depurar aplicaciones multiagente y RAG",
|
"Open-source UI for building and debugging multi-agent and RAG applications": "Interfaz de código abierto para crear y depurar aplicaciones multiagente y RAG",
|
||||||
"Open-source in-memory data store.": "Almacén de datos en memoria de código abierto.",
|
"Open-source in-memory data store.": "Almacén de datos en memoria de código abierto.",
|
||||||
@@ -5386,6 +5391,7 @@
|
|||||||
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Interfaz web de Proxmox: Datacenter > Storage > Add > ZFS",
|
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Interfaz web de Proxmox: Datacenter > Storage > Add > ZFS",
|
||||||
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Interfaz web de Proxmox: Datacenter > Storage > Add > iSCSI",
|
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Interfaz web de Proxmox: Datacenter > Storage > Add > iSCSI",
|
||||||
"Proxy address to reach the API (optional)": "Dirección del proxy para llegar a la API (opcional)",
|
"Proxy address to reach the API (optional)": "Dirección del proxy para llegar a la API (opcional)",
|
||||||
|
"Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)": "URL HTTPS pública utilizada para abrir este portal Authelia (por ejemplo, https://auth.example.com)",
|
||||||
"Public UDP port clients connect to": "Puerto UDP público al que se conectan los clientes",
|
"Public UDP port clients connect to": "Puerto UDP público al que se conectan los clientes",
|
||||||
"Public UDP port peers connect to": "Puerto UDP público al que se conectan los peers",
|
"Public UDP port peers connect to": "Puerto UDP público al que se conectan los peers",
|
||||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL pública de phpMyAdmin cuando se sirve detrás de un proxy inverso",
|
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL pública de phpMyAdmin cuando se sirve detrás de un proxy inverso",
|
||||||
@@ -6436,6 +6442,7 @@
|
|||||||
"Simple and easy to use DDNS": "DDNS simple y fácil de usar",
|
"Simple and easy to use DDNS": "DDNS simple y fácil de usar",
|
||||||
"Simple self-hosted file sharing.": "Servicio sencillo y autoalojado para compartir archivos.",
|
"Simple self-hosted file sharing.": "Servicio sencillo y autoalojado para compartir archivos.",
|
||||||
"Single GPU Warning": "Advertencia de GPU única",
|
"Single GPU Warning": "Advertencia de GPU única",
|
||||||
|
"Single sign-on and multi-factor authentication": "inicio de sesión único y autenticación multifactor",
|
||||||
"Single target found — selected automatically:": "Destino único encontrado: seleccionado automáticamente:",
|
"Single target found — selected automatically:": "Destino único encontrado: seleccionado automáticamente:",
|
||||||
"Single-node log storage and query UI.": "Almacenamiento de logs para un solo nodo con interfaz de consulta.",
|
"Single-node log storage and query UI.": "Almacenamiento de logs para un solo nodo con interfaz de consulta.",
|
||||||
"Single-node observability database for metrics, logs and traces.": "Base de datos de observabilidad de un solo nodo para métricas, registros y trazas.",
|
"Single-node observability database for metrics, logs and traces.": "Base de datos de observabilidad de un solo nodo para métricas, registros y trazas.",
|
||||||
@@ -8175,12 +8182,17 @@
|
|||||||
"Web access": "Acceso web",
|
"Web access": "Acceso web",
|
||||||
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Dirección web del AdGuard Home que recibe los ajustes (por ejemplo, http://192.168.1.3)",
|
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Dirección web del AdGuard Home que recibe los ajustes (por ejemplo, http://192.168.1.3)",
|
||||||
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Dirección web del AdGuard Home principal, cuyos ajustes se copian (por ejemplo, http://192.168.1.2)",
|
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Dirección web del AdGuard Home principal, cuyos ajustes se copian (por ejemplo, http://192.168.1.2)",
|
||||||
|
"Web dashboard": "Panel web",
|
||||||
|
"Web dashboard and WebDAV": "Panel web y WebDAV",
|
||||||
"Web interface": "interfaz web",
|
"Web interface": "interfaz web",
|
||||||
"Web interface for Borg Backup repositories and jobs.": "Interfaz web para gestionar repositorios y tareas de Borg Backup.",
|
"Web interface for Borg Backup repositories and jobs.": "Interfaz web para gestionar repositorios y tareas de Borg Backup.",
|
||||||
"Web interface for managing 3D printers.": "Interfaz web para gestionar impresoras 3D.",
|
"Web interface for managing 3D printers.": "Interfaz web para gestionar impresoras 3D.",
|
||||||
"Web interface to manage devices running Tasmota firmware.": "Interfaz web para gestionar dispositivos con firmware Tasmota.",
|
"Web interface to manage devices running Tasmota firmware.": "Interfaz web para gestionar dispositivos con firmware Tasmota.",
|
||||||
"Web reverse proxy with an administration interface.": "Proxy inverso web con interfaz de administración.",
|
"Web reverse proxy with an administration interface.": "Proxy inverso web con interfaz de administración.",
|
||||||
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord puede resumirse como un conjunto de medidas de hardening de seguridad y privacidad, reimplementaciones de funciones de Discord, soluciones a fallos de Electron / Chromium / Discord, hojas de estilo, páginas internas y la página https://discord.com encapsulada, diseñado para cumplir los ToS en lo posible (u ocultar a Discord los cambios que podrían incumplirlos).",
|
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord puede resumirse como un conjunto de medidas de hardening de seguridad y privacidad, reimplementaciones de funciones de Discord, soluciones a fallos de Electron / Chromium / Discord, hojas de estilo, páginas internas y la página https://discord.com encapsulada, diseñado para cumplir los ToS en lo posible (u ocultar a Discord los cambios que podrían incumplirlos).",
|
||||||
|
"WebDAV": "WebDAV",
|
||||||
|
"WebDAV and dashboard password (leave empty to generate)": "Contraseña de WebDAV y del panel (vacío = generada)",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations.": "WebDAV está disponible en el puerto 8080 del contenedor. Hay que vincular la cuenta antes de trabajar con los archivos de la nube.",
|
||||||
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus es un capturador incremental de EPG xmltv para múltiples sitios. Recoge los datos de la guía de programación de los sitios de guías de TV seleccionados para tus canales favoritos.",
|
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus es un capturador incremental de EPG xmltv para múltiples sitios. Recoge los datos de la guía de programación de los sitios de guías de TV seleccionados para tus canales favoritos.",
|
||||||
"Webservers & Proxies": "Webservers & Proxies",
|
"Webservers & Proxies": "Webservers & Proxies",
|
||||||
"Website": "Sitio web",
|
"Website": "Sitio web",
|
||||||
@@ -8937,5 +8949,7 @@
|
|||||||
"⚠ Disk data will NOT be erased.": "⚠ Los datos del disco NO se borrarán.",
|
"⚠ Disk data will NOT be erased.": "⚠ Los datos del disco NO se borrarán.",
|
||||||
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ El disco se desmontará y se eliminará de /etc/fstab.",
|
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ El disco se desmontará y se eliminará de /etc/fstab.",
|
||||||
"⚠ The /etc/fstab entry will be removed.": "⚠ Se eliminará la entrada /etc/fstab.",
|
"⚠ The /etc/fstab entry will be removed.": "⚠ Se eliminará la entrada /etc/fstab.",
|
||||||
"⚠ The disk will be unmounted.": "⚠ El disco se desmontará."
|
"⚠ The disk will be unmounted.": "⚠ El disco se desmontará.",
|
||||||
|
"AirDC++ administrator": "Administrador de AirDC++",
|
||||||
|
"Direct Connect file sharing with a web interface": "Intercambio de archivos Direct Connect con interfaz web"
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-1
@@ -256,6 +256,7 @@
|
|||||||
"Acceleration for llama.cpp": "Accélération pour llama.cpp",
|
"Acceleration for llama.cpp": "Accélération pour llama.cpp",
|
||||||
"Accept routes from other nodes?": "Accepter les routes d'autres nœuds ?",
|
"Accept routes from other nodes?": "Accepter les routes d'autres nœuds ?",
|
||||||
"Accept this host monitoring profile?": "Accepter ce profil de surveillance de l'hôte?",
|
"Accept this host monitoring profile?": "Accepter ce profil de surveillance de l'hôte?",
|
||||||
|
"Access Movistar and O2 Cloud from WebDAV clients and backup tools.": "Accédez au cloud Movistar et O2 depuis des clients WebDAV et des outils de sauvegarde.",
|
||||||
"Access Scope:": "Portée d'accès :",
|
"Access Scope:": "Portée d'accès :",
|
||||||
"Access bridge": "Pont d'accès",
|
"Access bridge": "Pont d'accès",
|
||||||
"Access bridge for Immich": "Pont d'accès pour Immich",
|
"Access bridge for Immich": "Pont d'accès pour Immich",
|
||||||
@@ -603,6 +604,9 @@
|
|||||||
"Audit socket disabled or not required": "Socket d'audit désactivé ou non requis",
|
"Audit socket disabled or not required": "Socket d'audit désactivé ou non requis",
|
||||||
"Auth key is required.": "La clé d'authentification est requise.",
|
"Auth key is required.": "La clé d'authentification est requise.",
|
||||||
"Auth:": "Authentification :",
|
"Auth:": "Authentification :",
|
||||||
|
"Authelia Web UI": "interface utilisateur Web Authelia",
|
||||||
|
"Authelia administrator": "Administrateur Authelia",
|
||||||
|
"Authelia session cookie domain for this portal (for example example.com)": "domaine de cookie de session Authelia pour ce portail (par exemple exemple.com)",
|
||||||
"Authentication": "Authentification",
|
"Authentication": "Authentification",
|
||||||
"Authentication & Security": "Authentification et sécurité",
|
"Authentication & Security": "Authentification et sécurité",
|
||||||
"Authentication Error": "Erreur d'authentification",
|
"Authentication Error": "Erreur d'authentification",
|
||||||
@@ -4897,6 +4901,7 @@
|
|||||||
"Open the page of an application in the menu": "Ouvrir la page d'une application dans le menu",
|
"Open the page of an application in the menu": "Ouvrir la page d'une application dans le menu",
|
||||||
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Ouvrez l'adresse web et créez le premier compte : le daemon s'enregistre tout seul et lance la première analyse.",
|
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Ouvrez l'adresse web et créez le premier compte : le daemon s'enregistre tout seul et lance la première analyse.",
|
||||||
"Open the web address and create the password of the akadmin user in the first-run setup.": "ouvrez l'adresse Web et créez le mot de passe de l'utilisateur akadmin lors de la configuration de première exécution.",
|
"Open the web address and create the password of the akadmin user in the first-run setup.": "ouvrez l'adresse Web et créez le mot de passe de l'utilisateur akadmin lors de la configuration de première exécution.",
|
||||||
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.": "Ouvrez le tableau de bord web et liez votre compte Movistar/O2 avec sa vérification par SMS.",
|
||||||
"Open-source AI-powered coding assistant": "Assistant de codage à source ouverte",
|
"Open-source AI-powered coding assistant": "Assistant de codage à source ouverte",
|
||||||
"Open-source UI for building and debugging multi-agent and RAG applications": "UI open-source pour la construction et le débogage d'applications multi-agents et RAG",
|
"Open-source UI for building and debugging multi-agent and RAG applications": "UI open-source pour la construction et le débogage d'applications multi-agents et RAG",
|
||||||
"Open-source in-memory data store.": "Magasin de données en mémoire libre.",
|
"Open-source in-memory data store.": "Magasin de données en mémoire libre.",
|
||||||
@@ -5396,6 +5401,7 @@
|
|||||||
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Interface web Proxmox : Datacenter > Stockage > Ajouter > ZFS",
|
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Interface web Proxmox : Datacenter > Stockage > Ajouter > ZFS",
|
||||||
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Interface Web Proxmox : Datacenter > Stockage > Ajouter > iSCSI",
|
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Interface Web Proxmox : Datacenter > Stockage > Ajouter > iSCSI",
|
||||||
"Proxy address to reach the API (optional)": "Adresse proxy pour accéder à l'API (facultatif)",
|
"Proxy address to reach the API (optional)": "Adresse proxy pour accéder à l'API (facultatif)",
|
||||||
|
"Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)": "URL HTTPS publique utilisée pour ouvrir ce portail Authelia (par exemple https://auth.example.com)",
|
||||||
"Public UDP port clients connect to": "Les clients du port UDP public se connectent à",
|
"Public UDP port clients connect to": "Les clients du port UDP public se connectent à",
|
||||||
"Public UDP port peers connect to": "Les pairs du port UDP public se connectent à",
|
"Public UDP port peers connect to": "Les pairs du port UDP public se connectent à",
|
||||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL publique de phpMyAdmin quand elle est servie derrière un proxy inversé",
|
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL publique de phpMyAdmin quand elle est servie derrière un proxy inversé",
|
||||||
@@ -6453,6 +6459,7 @@
|
|||||||
"Simple and easy to use DDNS": "Simple et facile à utiliser DDNS",
|
"Simple and easy to use DDNS": "Simple et facile à utiliser DDNS",
|
||||||
"Simple self-hosted file sharing.": "Service simple et auto-hébergé de partage de fichiers.",
|
"Simple self-hosted file sharing.": "Service simple et auto-hébergé de partage de fichiers.",
|
||||||
"Single GPU Warning": "Avertissement sur un seul GPU",
|
"Single GPU Warning": "Avertissement sur un seul GPU",
|
||||||
|
"Single sign-on and multi-factor authentication": "authentification unique et authentification multifacteur",
|
||||||
"Single target found — selected automatically:": "Cible unique trouvée — sélectionnée automatiquement :",
|
"Single target found — selected automatically:": "Cible unique trouvée — sélectionnée automatiquement :",
|
||||||
"Single-node log storage and query UI.": "Stockage de journaux sur un nœud unique avec interface de requête.",
|
"Single-node log storage and query UI.": "Stockage de journaux sur un nœud unique avec interface de requête.",
|
||||||
"Single-node observability database for metrics, logs and traces.": "Base de données d’observabilité à nœud unique pour les métriques, les journaux et les traces.",
|
"Single-node observability database for metrics, logs and traces.": "Base de données d’observabilité à nœud unique pour les métriques, les journaux et les traces.",
|
||||||
@@ -8201,12 +8208,17 @@
|
|||||||
"Web access": "Accès au Web",
|
"Web access": "Accès au Web",
|
||||||
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Adresse Web du AdGuard Home qui reçoit les paramètres (p. ex. http://192.168.1.3)",
|
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Adresse Web du AdGuard Home qui reçoit les paramètres (p. ex. http://192.168.1.3)",
|
||||||
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Adresse Web du principal AdGuard Home, dont les paramètres sont copiés (par exemple http://192.168.1.2)",
|
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Adresse Web du principal AdGuard Home, dont les paramètres sont copiés (par exemple http://192.168.1.2)",
|
||||||
|
"Web dashboard": "Tableau de bord web",
|
||||||
|
"Web dashboard and WebDAV": "Tableau de bord web et WebDAV",
|
||||||
"Web interface": "interface Web",
|
"Web interface": "interface Web",
|
||||||
"Web interface for Borg Backup repositories and jobs.": "Interface web pour les dépôts et tâches Borg Backup.",
|
"Web interface for Borg Backup repositories and jobs.": "Interface web pour les dépôts et tâches Borg Backup.",
|
||||||
"Web interface for managing 3D printers.": "Interface web de gestion des imprimantes 3D.",
|
"Web interface for managing 3D printers.": "Interface web de gestion des imprimantes 3D.",
|
||||||
"Web interface to manage devices running Tasmota firmware.": "Interface Web pour gérer les appareils utilisant le firmware Tasmota.",
|
"Web interface to manage devices running Tasmota firmware.": "Interface Web pour gérer les appareils utilisant le firmware Tasmota.",
|
||||||
"Web reverse proxy with an administration interface.": "Proxy inverse web doté d’une interface d’administration.",
|
"Web reverse proxy with an administration interface.": "Proxy inverse web doté d’une interface d’administration.",
|
||||||
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord peut être résumé comme un paquet de durcissements de sécurité et de confidentialité, les fonctionnalités Discord réimplémentations, Electron / Chromium / Discord bugs workarounds, les feuilles de style, les pages internes et la page https://discord.com enveloppée, conçue pour se conformer à ToS autant qu'il est possible (ou cacher les changements qui pourraient la violer des yeux de Discord).",
|
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord peut être résumé comme un paquet de durcissements de sécurité et de confidentialité, les fonctionnalités Discord réimplémentations, Electron / Chromium / Discord bugs workarounds, les feuilles de style, les pages internes et la page https://discord.com enveloppée, conçue pour se conformer à ToS autant qu'il est possible (ou cacher les changements qui pourraient la violer des yeux de Discord).",
|
||||||
|
"WebDAV": "WebDAV",
|
||||||
|
"WebDAV and dashboard password (leave empty to generate)": "Mot de passe WebDAV et du tableau de bord (vide = généré)",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations.": "WebDAV est disponible sur le port 8080 du conteneur. Le compte doit être lié avant toute opération sur les fichiers du cloud.",
|
||||||
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus est un accrocheur différentiel multisite xmltv egg. Il recueille les données du guide TV-programme à partir de sites sélectionnés pour vos chaînes préférées.",
|
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus est un accrocheur différentiel multisite xmltv egg. Il recueille les données du guide TV-programme à partir de sites sélectionnés pour vos chaînes préférées.",
|
||||||
"Webservers & Proxies": "Serveurs web et proxys",
|
"Webservers & Proxies": "Serveurs web et proxys",
|
||||||
"Website": "Site web",
|
"Website": "Site web",
|
||||||
@@ -8966,5 +8978,7 @@
|
|||||||
"⚠ Disk data will NOT be erased.": "⚠ Les données du disque ne seront PAS effacées.",
|
"⚠ Disk data will NOT be erased.": "⚠ Les données du disque ne seront PAS effacées.",
|
||||||
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Le disque sera démonté et supprimé de /etc/fstab.",
|
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Le disque sera démonté et supprimé de /etc/fstab.",
|
||||||
"⚠ The /etc/fstab entry will be removed.": "⚠ L'entrée /etc/fstab sera supprimée.",
|
"⚠ The /etc/fstab entry will be removed.": "⚠ L'entrée /etc/fstab sera supprimée.",
|
||||||
"⚠ The disk will be unmounted.": "⚠ Le disque sera démonté."
|
"⚠ The disk will be unmounted.": "⚠ Le disque sera démonté.",
|
||||||
|
"AirDC++ administrator": "Administrateur AirDC++",
|
||||||
|
"Direct Connect file sharing with a web interface": "Partage de fichiers Direct Connect avec une interface web"
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-1
@@ -256,6 +256,7 @@
|
|||||||
"Acceleration for llama.cpp": "Accelerazione per llama.cpp",
|
"Acceleration for llama.cpp": "Accelerazione per llama.cpp",
|
||||||
"Accept routes from other nodes?": "Accettare rotte da altri nodi?",
|
"Accept routes from other nodes?": "Accettare rotte da altri nodi?",
|
||||||
"Accept this host monitoring profile?": "Accettare questo profilo di monitoraggio host?",
|
"Accept this host monitoring profile?": "Accettare questo profilo di monitoraggio host?",
|
||||||
|
"Access Movistar and O2 Cloud from WebDAV clients and backup tools.": "Accedi al cloud di Movistar e O2 da client WebDAV e strumenti di backup.",
|
||||||
"Access Scope:": "Ambito di accesso:",
|
"Access Scope:": "Ambito di accesso:",
|
||||||
"Access bridge": "Bridge di accesso",
|
"Access bridge": "Bridge di accesso",
|
||||||
"Access bridge for Immich": "Bridge di accesso per Immich",
|
"Access bridge for Immich": "Bridge di accesso per Immich",
|
||||||
@@ -603,6 +604,9 @@
|
|||||||
"Audit socket disabled or not required": "Socket di audit disabilitato o non richiesto",
|
"Audit socket disabled or not required": "Socket di audit disabilitato o non richiesto",
|
||||||
"Auth key is required.": "È richiesta la chiave di autenticazione.",
|
"Auth key is required.": "È richiesta la chiave di autenticazione.",
|
||||||
"Auth:": "Autenticazione:",
|
"Auth:": "Autenticazione:",
|
||||||
|
"Authelia Web UI": "interfaccia utente Web Authelia",
|
||||||
|
"Authelia administrator": "amministratore Authelia",
|
||||||
|
"Authelia session cookie domain for this portal (for example example.com)": "dominio del cookie di sessione Authelia per questo portale (ad esempio example.com)",
|
||||||
"Authentication": "Autenticazione",
|
"Authentication": "Autenticazione",
|
||||||
"Authentication & Security": "Autenticazione e sicurezza",
|
"Authentication & Security": "Autenticazione e sicurezza",
|
||||||
"Authentication Error": "Errore di autenticazione",
|
"Authentication Error": "Errore di autenticazione",
|
||||||
@@ -4897,6 +4901,7 @@
|
|||||||
"Open the page of an application in the menu": "Apri la pagina di un'applicazione nel menu",
|
"Open the page of an application in the menu": "Apri la pagina di un'applicazione nel menu",
|
||||||
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Apri l'indirizzo web e crea il primo account: il daemon si registra da solo e avvia la prima scansione.",
|
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Apri l'indirizzo web e crea il primo account: il daemon si registra da solo e avvia la prima scansione.",
|
||||||
"Open the web address and create the password of the akadmin user in the first-run setup.": "Apri l'indirizzo web e imposta la password dell'utente akadmin durante la configurazione iniziale.",
|
"Open the web address and create the password of the akadmin user in the first-run setup.": "Apri l'indirizzo web e imposta la password dell'utente akadmin durante la configurazione iniziale.",
|
||||||
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.": "Apri la dashboard web e collega il tuo account Movistar/O2 con la verifica tramite SMS.",
|
||||||
"Open-source AI-powered coding assistant": "Assistente open source per la programmazione basato sull'IA",
|
"Open-source AI-powered coding assistant": "Assistente open source per la programmazione basato sull'IA",
|
||||||
"Open-source UI for building and debugging multi-agent and RAG applications": "Interfaccia open source per creare ed eseguire il debug di applicazioni multiagente e RAG",
|
"Open-source UI for building and debugging multi-agent and RAG applications": "Interfaccia open source per creare ed eseguire il debug di applicazioni multiagente e RAG",
|
||||||
"Open-source in-memory data store.": "Archivio dati in memoria open source.",
|
"Open-source in-memory data store.": "Archivio dati in memoria open source.",
|
||||||
@@ -5396,6 +5401,7 @@
|
|||||||
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Interfaccia web Proxmox: Datacenter > Storage > Aggiungi > ZFS",
|
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Interfaccia web Proxmox: Datacenter > Storage > Aggiungi > ZFS",
|
||||||
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Interfaccia web Proxmox: Datacenter > Storage > Aggiungi > iSCSI",
|
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Interfaccia web Proxmox: Datacenter > Storage > Aggiungi > iSCSI",
|
||||||
"Proxy address to reach the API (optional)": "Indirizzo proxy per raggiungere l'API (facoltativo)",
|
"Proxy address to reach the API (optional)": "Indirizzo proxy per raggiungere l'API (facoltativo)",
|
||||||
|
"Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)": "URL HTTPS pubblico utilizzato per aprire questo portale Authelia (ad esempio https://auth.example.com)",
|
||||||
"Public UDP port clients connect to": "Porta UDP pubblica a cui si connettono i client",
|
"Public UDP port clients connect to": "Porta UDP pubblica a cui si connettono i client",
|
||||||
"Public UDP port peers connect to": "Porta UDP pubblica a cui si connettono i peer",
|
"Public UDP port peers connect to": "Porta UDP pubblica a cui si connettono i peer",
|
||||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL pubblico di phpMyAdmin quando viene servito dietro un proxy inverso",
|
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL pubblico di phpMyAdmin quando viene servito dietro un proxy inverso",
|
||||||
@@ -6453,6 +6459,7 @@
|
|||||||
"Simple and easy to use DDNS": "DDNS semplice e facile da usare",
|
"Simple and easy to use DDNS": "DDNS semplice e facile da usare",
|
||||||
"Simple self-hosted file sharing.": "Servizio semplice e self-hosted per condividere file.",
|
"Simple self-hosted file sharing.": "Servizio semplice e self-hosted per condividere file.",
|
||||||
"Single GPU Warning": "Avviso GPU singola",
|
"Single GPU Warning": "Avviso GPU singola",
|
||||||
|
"Single sign-on and multi-factor authentication": "Single Sign-On e autenticazione a più fattori",
|
||||||
"Single target found — selected automatically:": "Unica destinazione trovata - selezionata automaticamente:",
|
"Single target found — selected automatically:": "Unica destinazione trovata - selezionata automaticamente:",
|
||||||
"Single-node log storage and query UI.": "Archiviazione dei log su un singolo nodo e interfaccia di interrogazione.",
|
"Single-node log storage and query UI.": "Archiviazione dei log su un singolo nodo e interfaccia di interrogazione.",
|
||||||
"Single-node observability database for metrics, logs and traces.": "Database di osservabilità a nodo singolo per metriche, log e tracce.",
|
"Single-node observability database for metrics, logs and traces.": "Database di osservabilità a nodo singolo per metriche, log e tracce.",
|
||||||
@@ -8202,12 +8209,17 @@
|
|||||||
"Web access": "Accesso web",
|
"Web access": "Accesso web",
|
||||||
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Indirizzo web dell'istanza AdGuard Home che riceve le impostazioni (ad es. http://192.168.1.3)",
|
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Indirizzo web dell'istanza AdGuard Home che riceve le impostazioni (ad es. http://192.168.1.3)",
|
||||||
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Indirizzo web dell'istanza AdGuard Home principale, da cui vengono copiate le impostazioni (ad es. http://192.168.1.2)",
|
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Indirizzo web dell'istanza AdGuard Home principale, da cui vengono copiate le impostazioni (ad es. http://192.168.1.2)",
|
||||||
|
"Web dashboard": "Dashboard web",
|
||||||
|
"Web dashboard and WebDAV": "Dashboard web e WebDAV",
|
||||||
"Web interface": "Interfaccia web",
|
"Web interface": "Interfaccia web",
|
||||||
"Web interface for Borg Backup repositories and jobs.": "Interfaccia web per repository e job di Borg Backup.",
|
"Web interface for Borg Backup repositories and jobs.": "Interfaccia web per repository e job di Borg Backup.",
|
||||||
"Web interface for managing 3D printers.": "Interfaccia web per gestire stampanti 3D.",
|
"Web interface for managing 3D printers.": "Interfaccia web per gestire stampanti 3D.",
|
||||||
"Web interface to manage devices running Tasmota firmware.": "Interfaccia web per gestire dispositivi con firmware Tasmota.",
|
"Web interface to manage devices running Tasmota firmware.": "Interfaccia web per gestire dispositivi con firmware Tasmota.",
|
||||||
"Web reverse proxy with an administration interface.": "Proxy inverso web con interfaccia di amministrazione.",
|
"Web reverse proxy with an administration interface.": "Proxy inverso web con interfaccia di amministrazione.",
|
||||||
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord comprende miglioramenti alla sicurezza e alla privacy, reimplementazioni di funzioni di Discord, soluzioni alternative ai bug di Electron, Chromium e Discord, fogli di stile, pagine interne e la pagina https://discord.com incapsulata. È progettato per rispettare i termini di servizio per quanto possibile (o nascondere a Discord le modifiche che potrebbero violarli).",
|
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord comprende miglioramenti alla sicurezza e alla privacy, reimplementazioni di funzioni di Discord, soluzioni alternative ai bug di Electron, Chromium e Discord, fogli di stile, pagine interne e la pagina https://discord.com incapsulata. È progettato per rispettare i termini di servizio per quanto possibile (o nascondere a Discord le modifiche che potrebbero violarli).",
|
||||||
|
"WebDAV": "WebDAV",
|
||||||
|
"WebDAV and dashboard password (leave empty to generate)": "Password di WebDAV e della dashboard (campo vuoto = generata)",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations.": "WebDAV è disponibile sulla porta 8080 del container. Prima di operare sui file del cloud bisogna collegare l'account.",
|
||||||
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus acquisisce dati EPG XMLTV incrementalmente da più siti. Raccoglie le guide TV dai siti selezionati per i canali preferiti.",
|
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus acquisisce dati EPG XMLTV incrementalmente da più siti. Raccoglie le guide TV dai siti selezionati per i canali preferiti.",
|
||||||
"Webservers & Proxies": "Server web e proxy",
|
"Webservers & Proxies": "Server web e proxy",
|
||||||
"Website": "Sito web",
|
"Website": "Sito web",
|
||||||
@@ -8967,5 +8979,7 @@
|
|||||||
"⚠ Disk data will NOT be erased.": "⚠ I dati del disco NON verranno cancellati.",
|
"⚠ Disk data will NOT be erased.": "⚠ I dati del disco NON verranno cancellati.",
|
||||||
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Il disco verrà smontato e rimosso da /etc/fstab.",
|
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Il disco verrà smontato e rimosso da /etc/fstab.",
|
||||||
"⚠ The /etc/fstab entry will be removed.": "⚠ La voce /etc/fstab verrà rimossa.",
|
"⚠ The /etc/fstab entry will be removed.": "⚠ La voce /etc/fstab verrà rimossa.",
|
||||||
"⚠ The disk will be unmounted.": "⚠ Il disco verrà smontato."
|
"⚠ The disk will be unmounted.": "⚠ Il disco verrà smontato.",
|
||||||
|
"AirDC++ administrator": "Amministratore AirDC++",
|
||||||
|
"Direct Connect file sharing with a web interface": "Condivisione di file Direct Connect con interfaccia web"
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-1
@@ -256,6 +256,7 @@
|
|||||||
"Acceleration for llama.cpp": "Aceleração para llama.cpp",
|
"Acceleration for llama.cpp": "Aceleração para llama.cpp",
|
||||||
"Accept routes from other nodes?": "Aceita rotas de outros nós?",
|
"Accept routes from other nodes?": "Aceita rotas de outros nós?",
|
||||||
"Accept this host monitoring profile?": "Aceita este perfil de monitorização da máquina?",
|
"Accept this host monitoring profile?": "Aceita este perfil de monitorização da máquina?",
|
||||||
|
"Access Movistar and O2 Cloud from WebDAV clients and backup tools.": "Acesse a nuvem da Movistar e da O2 a partir de clientes WebDAV e ferramentas de backup.",
|
||||||
"Access Scope:": "Escopo de acesso:",
|
"Access Scope:": "Escopo de acesso:",
|
||||||
"Access bridge": "Ponte de acesso",
|
"Access bridge": "Ponte de acesso",
|
||||||
"Access bridge for Immich": "Ponte de acesso para Immich",
|
"Access bridge for Immich": "Ponte de acesso para Immich",
|
||||||
@@ -603,6 +604,9 @@
|
|||||||
"Audit socket disabled or not required": "soquete de auditoria desabilitado ou não necessário",
|
"Audit socket disabled or not required": "soquete de auditoria desabilitado ou não necessário",
|
||||||
"Auth key is required.": "A chave de autenticação é obrigatória.",
|
"Auth key is required.": "A chave de autenticação é obrigatória.",
|
||||||
"Auth:": "Autenticação:",
|
"Auth:": "Autenticação:",
|
||||||
|
"Authelia Web UI": "UI da Web Authelia",
|
||||||
|
"Authelia administrator": "administrador Authelia",
|
||||||
|
"Authelia session cookie domain for this portal (for example example.com)": "domínio de cookie de sessão Authelia para este portal (por exemplo example.com)",
|
||||||
"Authentication": "Autenticação",
|
"Authentication": "Autenticação",
|
||||||
"Authentication & Security": "Autenticação e segurança",
|
"Authentication & Security": "Autenticação e segurança",
|
||||||
"Authentication Error": "Erro de autenticação",
|
"Authentication Error": "Erro de autenticação",
|
||||||
@@ -4897,6 +4901,7 @@
|
|||||||
"Open the page of an application in the menu": "Abrir a página de uma aplicação no menu",
|
"Open the page of an application in the menu": "Abrir a página de uma aplicação no menu",
|
||||||
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Abra o endereço web e crie a primeira conta: o daemon regista-se sozinho e inicia a primeira análise.",
|
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Abra o endereço web e crie a primeira conta: o daemon regista-se sozinho e inicia a primeira análise.",
|
||||||
"Open the web address and create the password of the akadmin user in the first-run setup.": "Abra o endereço da web e crie a senha do usuário akadmin na configuração inicial.",
|
"Open the web address and create the password of the akadmin user in the first-run setup.": "Abra o endereço da web e crie a senha do usuário akadmin na configuração inicial.",
|
||||||
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.": "Abra o painel web e vincule sua conta Movistar/O2 com a verificação por SMS.",
|
||||||
"Open-source AI-powered coding assistant": "Assistente de codificação com código aberto",
|
"Open-source AI-powered coding assistant": "Assistente de codificação com código aberto",
|
||||||
"Open-source UI for building and debugging multi-agent and RAG applications": "UI de código aberto para a construção e depuração de aplicações multi-agente e RAG",
|
"Open-source UI for building and debugging multi-agent and RAG applications": "UI de código aberto para a construção e depuração de aplicações multi-agente e RAG",
|
||||||
"Open-source in-memory data store.": "Armazenamento de dados em memória de código aberto.",
|
"Open-source in-memory data store.": "Armazenamento de dados em memória de código aberto.",
|
||||||
@@ -5396,6 +5401,7 @@
|
|||||||
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Interface web Proxmox: Datacenter > Armazenamento > Adicionar > ZFS",
|
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Interface web Proxmox: Datacenter > Armazenamento > Adicionar > ZFS",
|
||||||
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Interface web Proxmox: Datacenter > Armazenamento > Adicionar > iSCSI",
|
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Interface web Proxmox: Datacenter > Armazenamento > Adicionar > iSCSI",
|
||||||
"Proxy address to reach the API (optional)": "Endereço proxy para acessar a API (opcional)",
|
"Proxy address to reach the API (optional)": "Endereço proxy para acessar a API (opcional)",
|
||||||
|
"Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)": "URL HTTPS público usado para abrir este portal Authelia (por exemplo https://auth.example.com)",
|
||||||
"Public UDP port clients connect to": "Clientes públicos de porta UDP se conectam",
|
"Public UDP port clients connect to": "Clientes públicos de porta UDP se conectam",
|
||||||
"Public UDP port peers connect to": "Os pares públicos de portas UDP se conectam",
|
"Public UDP port peers connect to": "Os pares públicos de portas UDP se conectam",
|
||||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL público do phpMyAdmin quando é servido por trás de um proxy reverso",
|
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "URL público do phpMyAdmin quando é servido por trás de um proxy reverso",
|
||||||
@@ -6453,6 +6459,7 @@
|
|||||||
"Simple and easy to use DDNS": "Simples e fácil de usar DDNS",
|
"Simple and easy to use DDNS": "Simples e fácil de usar DDNS",
|
||||||
"Simple self-hosted file sharing.": "Serviço simples e autoalojado para partilha de ficheiros.",
|
"Simple self-hosted file sharing.": "Serviço simples e autoalojado para partilha de ficheiros.",
|
||||||
"Single GPU Warning": "Aviso de GPU única",
|
"Single GPU Warning": "Aviso de GPU única",
|
||||||
|
"Single sign-on and multi-factor authentication": "login único e autenticação multifator",
|
||||||
"Single target found — selected automatically:": "Único alvo encontrado — selecionado automaticamente:",
|
"Single target found — selected automatically:": "Único alvo encontrado — selecionado automaticamente:",
|
||||||
"Single-node log storage and query UI.": "Armazenamento de logs para um único nó com interface de consulta.",
|
"Single-node log storage and query UI.": "Armazenamento de logs para um único nó com interface de consulta.",
|
||||||
"Single-node observability database for metrics, logs and traces.": "Banco de dados de observabilidade de nó único para métricas, logs e traces.",
|
"Single-node observability database for metrics, logs and traces.": "Banco de dados de observabilidade de nó único para métricas, logs e traces.",
|
||||||
@@ -8202,12 +8209,17 @@
|
|||||||
"Web access": "Acesso à Internet",
|
"Web access": "Acesso à Internet",
|
||||||
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Endereço Web do AdGuard Home que recebe as definições (por exemplo, http://192.168.1.3)",
|
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Endereço Web do AdGuard Home que recebe as definições (por exemplo, http://192.168.1.3)",
|
||||||
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Endereço Web do AdGuard Home principal, cujas configurações são copiadas (por exemplo, http://192.168.1.2)",
|
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Endereço Web do AdGuard Home principal, cujas configurações são copiadas (por exemplo, http://192.168.1.2)",
|
||||||
|
"Web dashboard": "Painel web",
|
||||||
|
"Web dashboard and WebDAV": "Painel web e WebDAV",
|
||||||
"Web interface": "Interface da Web",
|
"Web interface": "Interface da Web",
|
||||||
"Web interface for Borg Backup repositories and jobs.": "Interface web para gerenciar repositórios e tarefas do Borg Backup.",
|
"Web interface for Borg Backup repositories and jobs.": "Interface web para gerenciar repositórios e tarefas do Borg Backup.",
|
||||||
"Web interface for managing 3D printers.": "Interface web para gerenciar impressoras 3D.",
|
"Web interface for managing 3D printers.": "Interface web para gerenciar impressoras 3D.",
|
||||||
"Web interface to manage devices running Tasmota firmware.": "Interface Web para gerenciar dispositivos rodando firmware Tasmota.",
|
"Web interface to manage devices running Tasmota firmware.": "Interface Web para gerenciar dispositivos rodando firmware Tasmota.",
|
||||||
"Web reverse proxy with an administration interface.": "Proxy reverso web com interface de administração.",
|
"Web reverse proxy with an administration interface.": "Proxy reverso web com interface de administração.",
|
||||||
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord pode ser resumido como um pacote de endurecimentos de segurança e privacidade, recursos de discórdia reimplementações, Electron / Chromium / Erros de discórdia workarounds, stylesheets, páginas internas e página envolto https://discord.com, projetado para se conformar com ToS tanto quanto possível (ou ocultar as alterações que podem violá-lo dos olhos da Discord).",
|
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord pode ser resumido como um pacote de endurecimentos de segurança e privacidade, recursos de discórdia reimplementações, Electron / Chromium / Erros de discórdia workarounds, stylesheets, páginas internas e página envolto https://discord.com, projetado para se conformar com ToS tanto quanto possível (ou ocultar as alterações que podem violá-lo dos olhos da Discord).",
|
||||||
|
"WebDAV": "WebDAV",
|
||||||
|
"WebDAV and dashboard password (leave empty to generate)": "Senha do WebDAV e do painel (vazio = gerada)",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations.": "O WebDAV está disponível na porta 8080 do contêiner. É preciso vincular a conta antes de operar com os arquivos da nuvem.",
|
||||||
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus é um multi-site incremental xmltv epg grabber. Ele coleta dados de guias de tv-programa de sites selecionados para seus canais favoritos.",
|
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus é um multi-site incremental xmltv epg grabber. Ele coleta dados de guias de tv-programa de sites selecionados para seus canais favoritos.",
|
||||||
"Webservers & Proxies": "Servidores web e proxies",
|
"Webservers & Proxies": "Servidores web e proxies",
|
||||||
"Website": "Site",
|
"Website": "Site",
|
||||||
@@ -8967,5 +8979,7 @@
|
|||||||
"⚠ Disk data will NOT be erased.": "⚠ Os dados do disco NÃO serão apagados.",
|
"⚠ Disk data will NOT be erased.": "⚠ Os dados do disco NÃO serão apagados.",
|
||||||
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ O disco será desmontado e removido de /etc/fstab.",
|
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ O disco será desmontado e removido de /etc/fstab.",
|
||||||
"⚠ The /etc/fstab entry will be removed.": "⚠ A entrada /etc/fstab será removida.",
|
"⚠ The /etc/fstab entry will be removed.": "⚠ A entrada /etc/fstab será removida.",
|
||||||
"⚠ The disk will be unmounted.": "⚠ O disco será desmontado."
|
"⚠ The disk will be unmounted.": "⚠ O disco será desmontado.",
|
||||||
|
"AirDC++ administrator": "Administrador do AirDC++",
|
||||||
|
"Direct Connect file sharing with a web interface": "Partilha de ficheiros Direct Connect com interface web"
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-15
@@ -184,7 +184,6 @@
|
|||||||
"A tunneling daemon by Cloudflare that safely exposes your web servers into the internet.": "Tunelový démon Cloudflare, ktorý bezpečne vystavuje vaše webové servery na internet.",
|
"A tunneling daemon by Cloudflare that safely exposes your web servers into the internet.": "Tunelový démon Cloudflare, ktorý bezpečne vystavuje vaše webové servery na internet.",
|
||||||
"A unified email and collaboration server.": "Jednotný server na e-mail a spoluprácu.",
|
"A unified email and collaboration server.": "Jednotný server na e-mail a spoluprácu.",
|
||||||
"A unified platform for logs, metrics and traces.": "Jednotná platforma pre logy, metriky a trasovanie.",
|
"A unified platform for logs, metrics and traces.": "Jednotná platforma pre logy, metriky a trasovanie.",
|
||||||
"A validating, recursive DNS resolver for your private network.": "Validujúci rekurzívny DNS resolver pre vašu súkromnú sieť.",
|
|
||||||
"A versatile file conversion tool that supports multiple formats.": "Univerzálny nástroj na konverziu súborov, ktorý podporuje viacero formátov.",
|
"A versatile file conversion tool that supports multiple formats.": "Univerzálny nástroj na konverziu súborov, ktorý podporuje viacero formátov.",
|
||||||
"A visual tool for exploring and documenting database schemas.": "Vizuálny nástroj na skúmanie a dokumentovanie schém databáz.",
|
"A visual tool for exploring and documenting database schemas.": "Vizuálny nástroj na skúmanie a dokumentovanie schém databáz.",
|
||||||
"A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols": "Webový GUI klient projektu V, ktorý podporuje protokoly VMess, VLESS, SS, SSR, Trojan, Tuic a Juicity",
|
"A web GUI client of Project V which supports VMess, VLESS, SS, SSR, Trojan, Tuic and Juicity protocols": "Webový GUI klient projektu V, ktorý podporuje protokoly VMess, VLESS, SS, SSR, Trojan, Tuic a Juicity",
|
||||||
@@ -257,6 +256,7 @@
|
|||||||
"Acceleration for llama.cpp": "Zrýchlenie pre llama.cpp",
|
"Acceleration for llama.cpp": "Zrýchlenie pre llama.cpp",
|
||||||
"Accept routes from other nodes?": "Prijímať trasy z iných uzlov?",
|
"Accept routes from other nodes?": "Prijímať trasy z iných uzlov?",
|
||||||
"Accept this host monitoring profile?": "Prijať tento profil monitorovania hostiteľa?",
|
"Accept this host monitoring profile?": "Prijať tento profil monitorovania hostiteľa?",
|
||||||
|
"Access Movistar and O2 Cloud from WebDAV clients and backup tools.": "Prístup ku cloudu Movistar a O2 z klientov WebDAV a nástrojov na zálohovanie.",
|
||||||
"Access Scope:": "Rozsah prístupu:",
|
"Access Scope:": "Rozsah prístupu:",
|
||||||
"Access bridge": "Sieťový most (bridge)",
|
"Access bridge": "Sieťový most (bridge)",
|
||||||
"Access bridge for Immich": "Sieťový most (bridge) pre Immich",
|
"Access bridge for Immich": "Sieťový most (bridge) pre Immich",
|
||||||
@@ -604,6 +604,9 @@
|
|||||||
"Audit socket disabled or not required": "Zásuvka auditu je zakázaná alebo sa nevyžaduje",
|
"Audit socket disabled or not required": "Zásuvka auditu je zakázaná alebo sa nevyžaduje",
|
||||||
"Auth key is required.": "Auth key je povinný.",
|
"Auth key is required.": "Auth key je povinný.",
|
||||||
"Auth:": "Prihlásenie:",
|
"Auth:": "Prihlásenie:",
|
||||||
|
"Authelia Web UI": "Webové rozhranie Authelia",
|
||||||
|
"Authelia administrator": "Správca Authelia",
|
||||||
|
"Authelia session cookie domain for this portal (for example example.com)": "Doména súboru cookie relácie Authelia pre tento portál (napríklad example.com)",
|
||||||
"Authentication": "Prihlásenie",
|
"Authentication": "Prihlásenie",
|
||||||
"Authentication & Security": "Overovanie a zabezpečenie",
|
"Authentication & Security": "Overovanie a zabezpečenie",
|
||||||
"Authentication Error": "Chyba prihlásenia",
|
"Authentication Error": "Chyba prihlásenia",
|
||||||
@@ -1394,7 +1397,6 @@
|
|||||||
"Controller + NVMe": "Controller + NVMe",
|
"Controller + NVMe": "Controller + NVMe",
|
||||||
"Controller + NVMe assignment will be written now and become active after host reboot.": "Priradenie Controller + NVMe sa teraz zapíše a aktivuje sa po reštarte servera.",
|
"Controller + NVMe assignment will be written now and become active after host reboot.": "Priradenie Controller + NVMe sa teraz zapíše a aktivuje sa po reštarte servera.",
|
||||||
"Controller + NVMe passthrough requires machine type q35. Skipping controller assignment.": "Priame priradenie Controller + NVMe vyžaduje typ stroja q35. Priradenie controllera sa preskočí.",
|
"Controller + NVMe passthrough requires machine type q35. Skipping controller assignment.": "Priame priradenie Controller + NVMe vyžaduje typ stroja q35. Priradenie controllera sa preskočí.",
|
||||||
"Controller path on the Proxmox host; prefer /dev/serial/by-id/...": "Cesta ku kontroléru na hostiteľovi Proxmox; uprednostnite /dev/serial/by-id/...",
|
|
||||||
"Controller/NVMe Conflict Policy": "Riešenie konfliktu Controller/NVMe",
|
"Controller/NVMe Conflict Policy": "Riešenie konfliktu Controller/NVMe",
|
||||||
"Controller/NVMe already present in VM config": "Controller/NVMe už je v nastavení VM",
|
"Controller/NVMe already present in VM config": "Controller/NVMe už je v nastavení VM",
|
||||||
"Controller/NVMe already present in VM config (%s)": "Radič/NVMe už je v nastaveniach VM (%s)",
|
"Controller/NVMe already present in VM config (%s)": "Radič/NVMe už je v nastaveniach VM (%s)",
|
||||||
@@ -3341,7 +3343,6 @@
|
|||||||
"Initial Stirling-PDF account": "Počiatočný účet Stirling-PDF",
|
"Initial Stirling-PDF account": "Počiatočný účet Stirling-PDF",
|
||||||
"Initial Tandoor administrator": "Počiatočný správca Tandoor",
|
"Initial Tandoor administrator": "Počiatočný správca Tandoor",
|
||||||
"Initial Umami administrator": "Počiatočný správca Umami",
|
"Initial Umami administrator": "Počiatočný správca Umami",
|
||||||
"Initial Z-Wave JS UI admin password": "Počiatočné heslo správcu Z-Wave JS UI",
|
|
||||||
"Initial administrator account": "Úvodný účet správcu",
|
"Initial administrator account": "Úvodný účet správcu",
|
||||||
"Initial administrator created:": "Pôvodný správca vytvorený:",
|
"Initial administrator created:": "Pôvodný správca vytvorený:",
|
||||||
"Initial administrator user": "Počiatočné používateľské meno správcu",
|
"Initial administrator user": "Počiatočné používateľské meno správcu",
|
||||||
@@ -3743,7 +3744,6 @@
|
|||||||
"Jupyter Lab (token only)": "Jupyter Lab (iba token)",
|
"Jupyter Lab (token only)": "Jupyter Lab (iba token)",
|
||||||
"JupyterLab": "JupyterLab",
|
"JupyterLab": "JupyterLab",
|
||||||
"JupyterLab access token": "Prístupový token JupyterLab",
|
"JupyterLab access token": "Prístupový token JupyterLab",
|
||||||
"KDE's twin-panel file manager in a browser-based desktop.": "Dvojpanelový správca súborov KDE v pracovnej ploche dostupnej cez webový prehliadač.",
|
|
||||||
"KDF:": "KDF:",
|
"KDF:": "KDF:",
|
||||||
"KROMA": "KROMA",
|
"KROMA": "KROMA",
|
||||||
"KVM MSR options added to /etc/modprobe.d/kvm.conf": "Možnosti KVM MSR boli pridané do /etc/modprobe.d/kvm.conf",
|
"KVM MSR options added to /etc/modprobe.d/kvm.conf": "Možnosti KVM MSR boli pridané do /etc/modprobe.d/kvm.conf",
|
||||||
@@ -3791,14 +3791,12 @@
|
|||||||
"KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad – multiplatformový balík s otvoreným zdrojovým kódom na návrh elektroniky.",
|
"KiCad - A Cross Platform and Open Source Electronics Design Automation Suite.": "KiCad – multiplatformový balík s otvoreným zdrojovým kódom na návrh elektroniky.",
|
||||||
"Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai nemá predvolený účet. Do kontajnera vstúpite príkazom: pct enter {main_vmid}",
|
"Kimai has no default account. Enter the container with: pct enter {main_vmid}": "Kimai nemá predvolený účet. Do kontajnera vstúpite príkazom: pct enter {main_vmid}",
|
||||||
"Kimai is a professional grade time-tracking application, free and open-source.": "Kimai je profesionálna bezplatná aplikácia na sledovanie pracovného času s otvoreným zdrojovým kódom.",
|
"Kimai is a professional grade time-tracking application, free and open-source.": "Kimai je profesionálna bezplatná aplikácia na sledovanie pracovného času s otvoreným zdrojovým kódom.",
|
||||||
"KitchenOwl": "KitchenOwl",
|
|
||||||
"Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa poskytuje podrobnú kontrolu nad mediálnymi knižnicami. Umožňuje prispôsobiť metadáta, kolekcie, grafické prekrytia a ďalšie prvky.",
|
"Kometa is a powerful tool designed to give you complete control over your media libraries. With Kometa, you can take your customization to the next level, with granular control over metadata, collections, overlays, and much more.": "Kometa poskytuje podrobnú kontrolu nad mediálnymi knižnicami. Umožňuje prispôsobiť metadáta, kolekcie, grafické prekrytia a ďalšie prvky.",
|
||||||
"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.": "Kometa číta nastavenia z /config/config.yml, kontajner však obsahuje iba /config/config.yml.template. Skopírujte šablónu do config.yml, vyplňte požadované pripojenia Plex a TMDb a kontajner reštartujte.",
|
"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.": "Kometa číta nastavenia z /config/config.yml, kontajner však obsahuje iba /config/config.yml.template. Skopírujte šablónu do config.yml, vyplňte požadované pripojenia Plex a TMDb a kontajner reštartujte.",
|
||||||
"Komga is a media server for your comics, mangas, BDs, magazines and eBooks.": "Komga je mediálny server na komiksy, mangu, grafické romány, časopisy a elektronické knihy.",
|
"Komga is a media server for your comics, mangas, BDs, magazines and eBooks.": "Komga je mediálny server na komiksy, mangu, grafické romány, časopisy a elektronické knihy.",
|
||||||
"Kopia Web UI": "Webové rozhranie Kopia",
|
"Kopia Web UI": "Webové rozhranie Kopia",
|
||||||
"Kopia Web UI login": "Prihlásenie do webového rozhrania Kopia",
|
"Kopia Web UI login": "Prihlásenie do webového rozhrania Kopia",
|
||||||
"Krita is a professional FREE and open source painting program. It is made by artists that want to see affordable art tools for everyone.": "Krita je profesionálny bezplatný maliarsky program s otvoreným zdrojovým kódom. Vytvárajú ho umelci, ktorí chcú sprístupniť umelecké nástroje každému.",
|
"Krita is a professional FREE and open source painting program. It is made by artists that want to see affordable art tools for everyone.": "Krita je profesionálny bezplatný maliarsky program s otvoreným zdrojovým kódom. Vytvárajú ho umelci, ktorí chcú sprístupniť umelecké nástroje každému.",
|
||||||
"Krusader Web UI": "Webové rozhranie Krusaderu",
|
|
||||||
"LAN access to the kept containers (stack configuration incomplete):": "Prístup z LAN k ponechaným kontajnerom (nastavenie zostavy nie je dokončené):",
|
"LAN access to the kept containers (stack configuration incomplete):": "Prístup z LAN k ponechaným kontajnerom (nastavenie zostavy nie je dokončené):",
|
||||||
"LAN address applied to the application URLs": "LAN adresa použitá na URL aplikácie",
|
"LAN address applied to the application URLs": "LAN adresa použitá na URL aplikácie",
|
||||||
"LLDAP": "LLDAP",
|
"LLDAP": "LLDAP",
|
||||||
@@ -4026,7 +4024,6 @@
|
|||||||
"Manage OCI stack": "Spravovať aplikáciu s viacerými kontajnermi",
|
"Manage OCI stack": "Spravovať aplikáciu s viacerými kontajnermi",
|
||||||
"Manage PBS encryption keyfile": "Spravovať šifrovací keyfile pre PBS",
|
"Manage PBS encryption keyfile": "Spravovať šifrovací keyfile pre PBS",
|
||||||
"Manage Secure Gateway": "Spravovať Secure Gateway",
|
"Manage Secure Gateway": "Spravovať Secure Gateway",
|
||||||
"Manage a Z-Wave network from a web dashboard and WebSocket gateway.": "Spravujte sieť Z-Wave cez webový panel a bránu WebSocket.",
|
|
||||||
"Manage and inspect VM disk images": "Spravovať a kontrolovať diskové obrazy VM",
|
"Manage and inspect VM disk images": "Spravovať a kontrolovať diskové obrazy VM",
|
||||||
"Manage custom backup paths": "Spravovať vlastné cesty zálohy",
|
"Manage custom backup paths": "Spravovať vlastné cesty zálohy",
|
||||||
"Manage custom paths (add / remove your folders)": "Spravovať vlastné cesty (pridať / odstrániť priečinky)",
|
"Manage custom paths (add / remove your folders)": "Spravovať vlastné cesty (pridať / odstrániť priečinky)",
|
||||||
@@ -4906,7 +4903,7 @@
|
|||||||
"Open the page of an application in the menu": "Otvoriť stránku aplikácie v ponuke",
|
"Open the page of an application in the menu": "Otvoriť stránku aplikácie v ponuke",
|
||||||
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Otvorte webovú adresu a vytvorte prvé konto: daemon sa zaregistruje sám a spustí prvé skenovanie.",
|
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Otvorte webovú adresu a vytvorte prvé konto: daemon sa zaregistruje sám a spustí prvé skenovanie.",
|
||||||
"Open the web address and create the password of the akadmin user in the first-run setup.": "Otvorte webovú adresu a v prvotnom nastavení vytvorte heslo používateľa akadmin.",
|
"Open the web address and create the password of the akadmin user in the first-run setup.": "Otvorte webovú adresu a v prvotnom nastavení vytvorte heslo používateľa akadmin.",
|
||||||
"Open the web address and follow KitchenOwl’s onboarding to create the first account; no default account is configured.": "Otvorte webovú adresu a podľa pokynov KitchenOwl vytvorte prvý účet; predvolený účet nie je nastavený.",
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.": "Otvorte webový panel a prepojte svoj účet Movistar/O2 pomocou overenia cez SMS.",
|
||||||
"Open-source AI-powered coding assistant": "Programátorský asistent využívajúci AI s otvoreným zdrojovým kódom",
|
"Open-source AI-powered coding assistant": "Programátorský asistent využívajúci AI s otvoreným zdrojovým kódom",
|
||||||
"Open-source UI for building and debugging multi-agent and RAG applications": "Rozhranie s otvoreným zdrojovým kódom na tvorbu a ladenie aplikácií s viacerými agentmi a RAG",
|
"Open-source UI for building and debugging multi-agent and RAG applications": "Rozhranie s otvoreným zdrojovým kódom na tvorbu a ladenie aplikácií s viacerými agentmi a RAG",
|
||||||
"Open-source in-memory data store.": "Úložisko údajov v pamäti s otvoreným zdrojovým kódom.",
|
"Open-source in-memory data store.": "Úložisko údajov v pamäti s otvoreným zdrojovým kódom.",
|
||||||
@@ -5047,7 +5044,6 @@
|
|||||||
"Pass /dev/video12 to the LXC": "Sprístupniť /dev/video12 kontajneru LXC",
|
"Pass /dev/video12 to the LXC": "Sprístupniť /dev/video12 kontajneru LXC",
|
||||||
"Pass a host device to the LXC": "Sprístupniť zariadenie hostiteľa kontajneru LXC",
|
"Pass a host device to the LXC": "Sprístupniť zariadenie hostiteľa kontajneru LXC",
|
||||||
"Pass the UPS to the LXC": "Sprístupniť UPS kontajneru LXC",
|
"Pass the UPS to the LXC": "Sprístupniť UPS kontajneru LXC",
|
||||||
"Pass through a Z-Wave USB or serial controller": "Pripojiť USB alebo sériový radič Z-Wave",
|
|
||||||
"Passing NVIDIA does not enable acceleration inside the application. The host needs NVIDIA Container Toolkit and a compatible image. Continue?": "Prejdenie NVIDIA neumožní zrýchlenie v aplikácii. Hostiteľ potrebuje NVIDIA Container Toolkit a kompatibilný obrázok. Pokračovať?",
|
"Passing NVIDIA does not enable acceleration inside the application. The host needs NVIDIA Container Toolkit and a compatible image. Continue?": "Prejdenie NVIDIA neumožní zrýchlenie v aplikácii. Hostiteľ potrebuje NVIDIA Container Toolkit a kompatibilný obrázok. Pokračovať?",
|
||||||
"Passkey-based identity provider for self-hosted apps.": "Poskytovateľ identity založený na passkeys pre samohostované aplikácie.",
|
"Passkey-based identity provider for self-hosted apps.": "Poskytovateľ identity založený na passkeys pre samohostované aplikácie.",
|
||||||
"Passphrase used to unlock the imported keyfile (leave blank if the keyfile is unencrypted / kdf=none):": "Fráza na odomknutie importovaného keyfile (nechajte prázdne, ak keyfile nie je šifrovaný / kdf=none):",
|
"Passphrase used to unlock the imported keyfile (leave blank if the keyfile is unencrypted / kdf=none):": "Fráza na odomknutie importovaného keyfile (nechajte prázdne, ak keyfile nie je šifrovaný / kdf=none):",
|
||||||
@@ -5407,6 +5403,7 @@
|
|||||||
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Webové rozhranie Proxmoxu: Datacenter > Storage > Add > ZFS",
|
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Webové rozhranie Proxmoxu: Datacenter > Storage > Add > ZFS",
|
||||||
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Webové rozhranie Proxmoxu: Datacenter > Storage > Add > iSCSI",
|
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Webové rozhranie Proxmoxu: Datacenter > Storage > Add > iSCSI",
|
||||||
"Proxy address to reach the API (optional)": "Adresa proxy na prístup k API (voliteľné)",
|
"Proxy address to reach the API (optional)": "Adresa proxy na prístup k API (voliteľné)",
|
||||||
|
"Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)": "Verejná adresa HTTPS na otvorenie tohto portálu Authelia (napríklad https://auth.example.com)",
|
||||||
"Public UDP port clients connect to": "Verejný port UDP na pripojenie klientov",
|
"Public UDP port clients connect to": "Verejný port UDP na pripojenie klientov",
|
||||||
"Public UDP port peers connect to": "Verejný port UDP na pripojenie účastníkov",
|
"Public UDP port peers connect to": "Verejný port UDP na pripojenie účastníkov",
|
||||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "Verejné URL phpMyAdmin, keď sa podáva za reverzným proxy",
|
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "Verejné URL phpMyAdmin, keď sa podáva za reverzným proxy",
|
||||||
@@ -6270,7 +6267,6 @@
|
|||||||
"Self-hosted file sync and sharing.": "Vlastná služba na synchronizáciu a zdieľanie súborov.",
|
"Self-hosted file sync and sharing.": "Vlastná služba na synchronizáciu a zdieľanie súborov.",
|
||||||
"Self-hosted file toolkit for images, video, audio, PDFs, and files": "Súprava nástrojov na vlastnom serveri na prácu s obrázkami, videom, zvukom, PDF a ďalšími súbormi",
|
"Self-hosted file toolkit for images, video, audio, PDFs, and files": "Súprava nástrojov na vlastnom serveri na prácu s obrázkami, videom, zvukom, PDF a ďalšími súbormi",
|
||||||
"Self-hosted forms and workflows.": "Formuláre a pracovné postupy prevádzkované na vlastnom serveri.",
|
"Self-hosted forms and workflows.": "Formuláre a pracovné postupy prevádzkované na vlastnom serveri.",
|
||||||
"Self-hosted grocery list and recipe manager": "Správca nákupných zoznamov a receptov, ktorý si môžete prevádzkovať sami.",
|
|
||||||
"Self-hosted household plant-care tracker with reminders, photos, and multiple user accounts.": "Prehľad starostlivosti o izbové rastliny prevádzkovaný na vlastnom serveri s pripomienkami, fotografiami a viacerými používateľskými účtami.",
|
"Self-hosted household plant-care tracker with reminders, photos, and multiple user accounts.": "Prehľad starostlivosti o izbové rastliny prevádzkovaný na vlastnom serveri s pripomienkami, fotografiami a viacerými používateľskými účtami.",
|
||||||
"Self-hosted image-hosting service with authenticated uploads, image processing, public links, and local storage.": "Služba na ukladanie a zdieľanie obrázkov na vlastnom serveri s nahrávaním pre overených používateľov, spracovaním obrázkov, verejnými odkazmi a lokálnym úložiskom.",
|
"Self-hosted image-hosting service with authenticated uploads, image processing, public links, and local storage.": "Služba na ukladanie a zdieľanie obrázkov na vlastnom serveri s nahrávaním pre overených používateľov, spracovaním obrázkov, verejnými odkazmi a lokálnym úložiskom.",
|
||||||
"Self-hosted internet archiving solution": "Riešenie na archiváciu internetového obsahu na vlastnom serveri",
|
"Self-hosted internet archiving solution": "Riešenie na archiváciu internetového obsahu na vlastnom serveri",
|
||||||
@@ -6465,6 +6461,7 @@
|
|||||||
"Simple and easy to use DDNS": "Jednoducho použiteľné dynamické DNS (DDNS)",
|
"Simple and easy to use DDNS": "Jednoducho použiteľné dynamické DNS (DDNS)",
|
||||||
"Simple self-hosted file sharing.": "Jednoduchá samohostovaná služba na zdieľanie súborov.",
|
"Simple self-hosted file sharing.": "Jednoduchá samohostovaná služba na zdieľanie súborov.",
|
||||||
"Single GPU Warning": "Upozornenie na jednu GPU",
|
"Single GPU Warning": "Upozornenie na jednu GPU",
|
||||||
|
"Single sign-on and multi-factor authentication": "Jednotné prihlásenie a viacfaktorové overovanie",
|
||||||
"Single target found — selected automatically:": "Našiel sa jeden target - vybraný automaticky:",
|
"Single target found — selected automatically:": "Našiel sa jeden target - vybraný automaticky:",
|
||||||
"Single-node log storage and query UI.": "Úložisko logov a vyhľadávacie rozhranie pre jeden uzol.",
|
"Single-node log storage and query UI.": "Úložisko logov a vyhľadávacie rozhranie pre jeden uzol.",
|
||||||
"Single-node observability database for metrics, logs and traces.": "Databáza na jednom uzle na ukladanie metrík, logov a záznamov o priebehu požiadaviek.",
|
"Single-node observability database for metrics, logs and traces.": "Databáza na jednom uzle na ukladanie metrík, logov a záznamov o priebehu požiadaviek.",
|
||||||
@@ -6533,7 +6530,6 @@
|
|||||||
"Specific subnet (enter manually)": "Konkrétna podsieť (zadať ručne)",
|
"Specific subnet (enter manually)": "Konkrétna podsieť (zadať ručne)",
|
||||||
"Speedtest Tracker web interface": "Webové rozhranie Speedtest Tracker",
|
"Speedtest Tracker web interface": "Webové rozhranie Speedtest Tracker",
|
||||||
"Speedtest-tracker is a self-hosted internet performance tracking application that runs speedtest checks against Ookla's Speedtest service.": "Speedtest Tracker je aplikácia na vlastnom serveri na sledovanie výkonu internetového pripojenia pomocou meraní služby Ookla Speedtest.",
|
"Speedtest-tracker is a self-hosted internet performance tracking application that runs speedtest checks against Ookla's Speedtest service.": "Speedtest Tracker je aplikácia na vlastnom serveri na sledovanie výkonu internetového pripojenia pomocou meraní služby Ookla Speedtest.",
|
||||||
"Spoolman web interface": "Webové rozhranie Spoolmanu",
|
|
||||||
"Spotube is an open source, cross-platform Spotify client compatible across multiple platforms utilizing Spotify's data API and YouTube, Piped.video or JioSaavn as an audio source, eliminating the need for Spotify Premium": "Spotube je multiplatformový klient Spotify s otvoreným zdrojovým kódom. Využíva dátové API Spotify a zvuk získava z YouTube, Piped.video alebo JioSaavn, takže nevyžaduje Spotify Premium.",
|
"Spotube is an open source, cross-platform Spotify client compatible across multiple platforms utilizing Spotify's data API and YouTube, Piped.video or JioSaavn as an audio source, eliminating the need for Spotify Premium": "Spotube je multiplatformový klient Spotify s otvoreným zdrojovým kódom. Využíva dátové API Spotify a zvuk získava z YouTube, Piped.video alebo JioSaavn, takže nevyžaduje Spotify Premium.",
|
||||||
"Sshwifty": "Sshwifty",
|
"Sshwifty": "Sshwifty",
|
||||||
"Sshwifty web access (password only)": "Webový prístup do Sshwifty (iba heslom)",
|
"Sshwifty web access (password only)": "Webový prístup do Sshwifty (iba heslom)",
|
||||||
@@ -7635,7 +7631,6 @@
|
|||||||
"Total routes": "Počet trás",
|
"Total routes": "Počet trás",
|
||||||
"Total size:": "Celková veľkosť:",
|
"Total size:": "Celková veľkosť:",
|
||||||
"Toxiproxy": "Toxiproxy",
|
"Toxiproxy": "Toxiproxy",
|
||||||
"Track 3D printer filament spools and usage.": "Sledujte cievky filamentu pre 3D tlačiareň a ich spotrebu.",
|
|
||||||
"Track movies, television, anime and games you want to enjoy.": "Sledujte filmy, seriály, anime a hry, ktoré si chcete pozrieť alebo zahrať.",
|
"Track movies, television, anime and games you want to enjoy.": "Sledujte filmy, seriály, anime a hry, ktoré si chcete pozrieť alebo zahrať.",
|
||||||
"Track subscriptions and recurring expenses.": "Sledovanie predplatných a opakovaných výdavkov.",
|
"Track subscriptions and recurring expenses.": "Sledovanie predplatných a opakovaných výdavkov.",
|
||||||
"Track your music listening history on your own server.": "Sledujte históriu počúvania hudby na vlastnom serveri.",
|
"Track your music listening history on your own server.": "Sledujte históriu počúvania hudby na vlastnom serveri.",
|
||||||
@@ -8214,12 +8209,17 @@
|
|||||||
"Web access": "Adresa webového rozhrania",
|
"Web access": "Adresa webového rozhrania",
|
||||||
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Webová adresa AdGuard Home, ktorá prijíma nastavenia (napr. http://192.168.1.3)",
|
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Webová adresa AdGuard Home, ktorá prijíma nastavenia (napr. http://192.168.1.3)",
|
||||||
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Webová adresa hlavného AdGuard Home, ktorého nastavenia sú kopírované (napr. http://192.168.1.2)",
|
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Webová adresa hlavného AdGuard Home, ktorého nastavenia sú kopírované (napr. http://192.168.1.2)",
|
||||||
|
"Web dashboard": "Webový panel",
|
||||||
|
"Web dashboard and WebDAV": "Webový panel a WebDAV",
|
||||||
"Web interface": "Webové rozhranie",
|
"Web interface": "Webové rozhranie",
|
||||||
"Web interface for Borg Backup repositories and jobs.": "Webové rozhranie na správu úložísk a úloh Borg Backup.",
|
"Web interface for Borg Backup repositories and jobs.": "Webové rozhranie na správu úložísk a úloh Borg Backup.",
|
||||||
"Web interface for managing 3D printers.": "Webové rozhranie na správu 3D tlačiarní.",
|
"Web interface for managing 3D printers.": "Webové rozhranie na správu 3D tlačiarní.",
|
||||||
"Web interface to manage devices running Tasmota firmware.": "Webové rozhranie pre správu zariadení bežiacich na Tasmota firmware.",
|
"Web interface to manage devices running Tasmota firmware.": "Webové rozhranie pre správu zariadení bežiacich na Tasmota firmware.",
|
||||||
"Web reverse proxy with an administration interface.": "Webový reverzný proxy server s administračným rozhraním.",
|
"Web reverse proxy with an administration interface.": "Webový reverzný proxy server s administračným rozhraním.",
|
||||||
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord je klient obklopujúci stránku https://discord.com, ktorý zlepšuje bezpečnosť a súkromie, upravuje funkcie Discordu, obchádza chyby Electronu, Chromia a Discordu a pridáva štýly aj interné stránky. Snaží sa čo najviac dodržiavať podmienky používania alebo skryť pred Discordom úpravy, ktoré by ich mohli porušovať.",
|
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord je klient obklopujúci stránku https://discord.com, ktorý zlepšuje bezpečnosť a súkromie, upravuje funkcie Discordu, obchádza chyby Electronu, Chromia a Discordu a pridáva štýly aj interné stránky. Snaží sa čo najviac dodržiavať podmienky používania alebo skryť pred Discordom úpravy, ktoré by ich mohli porušovať.",
|
||||||
|
"WebDAV": "WebDAV",
|
||||||
|
"WebDAV and dashboard password (leave empty to generate)": "Heslo pre WebDAV a panel (prázdne = generované)",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations.": "WebDAV je dostupný na porte 8080 kontajnera. Pred prácou so súbormi v cloude je potrebné prepojiť účet.",
|
||||||
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "WebGrab+Plus priebežne získava elektronický programový sprievodca (EPG) vo formáte XMLTV z viacerých webov. Zhromažďuje televízny program vybraných staníc z podporovaných stránok.",
|
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "WebGrab+Plus priebežne získava elektronický programový sprievodca (EPG) vo formáte XMLTV z viacerých webov. Zhromažďuje televízny program vybraných staníc z podporovaných stránok.",
|
||||||
"Webservers & Proxies": "Webové servery a proxy",
|
"Webservers & Proxies": "Webové servery a proxy",
|
||||||
"Website": "Webová stránka",
|
"Website": "Webová stránka",
|
||||||
@@ -8327,8 +8327,6 @@
|
|||||||
"Your machine learning Env work with Jupyter Lab": "Prostredie strojového učenia s JupyterLab",
|
"Your machine learning Env work with Jupyter Lab": "Prostredie strojového učenia s JupyterLab",
|
||||||
"Your next YouTube media manager": "Váš ďalší manažér médií YouTube",
|
"Your next YouTube media manager": "Váš ďalší manažér médií YouTube",
|
||||||
"Your_spotify is a self-hosted application that tracks what you listen and offers you a dashboard to explore statistics about it! It's composed of a web server which polls the Spotify API every now and then and a web application on which you can explore your statistics.": "Your_spotify je aplikácia na vlastnom serveri, ktorá sleduje počúvanie hudby a zobrazuje štatistiky. Tvorí ju server pravidelne zisťujúci údaje cez Spotify API a webové rozhranie na ich prezeranie.",
|
"Your_spotify is a self-hosted application that tracks what you listen and offers you a dashboard to explore statistics about it! It's composed of a web server which polls the Spotify API every now and then and a web application on which you can explore your statistics.": "Your_spotify je aplikácia na vlastnom serveri, ktorá sleduje počúvanie hudby a zobrazuje štatistiky. Tvorí ju server pravidelne zisťujúci údaje cez Spotify API a webové rozhranie na ich prezeranie.",
|
||||||
"Z-Wave JS UI": "Z-Wave JS UI",
|
|
||||||
"Z-Wave JS UI admin login": "Prihlásenie správcu Z-Wave JS UI",
|
|
||||||
"ZFS ARC config removed (kernel defaults will apply on reboot)": "Nastavenie ZFS ARC bolo odstránené (predvolené hodnoty kernelu sa použijú po reštarte)",
|
"ZFS ARC config removed (kernel defaults will apply on reboot)": "Nastavenie ZFS ARC bolo odstránené (predvolené hodnoty kernelu sa použijú po reštarte)",
|
||||||
"ZFS ARC maximum configured:": "Maximálna veľkosť ZFS ARC je nastavená na:",
|
"ZFS ARC maximum configured:": "Maximálna veľkosť ZFS ARC je nastavená na:",
|
||||||
"ZFS ARC optimization completed": "Optimalizácia ZFS ARC je dokončená",
|
"ZFS ARC optimization completed": "Optimalizácia ZFS ARC je dokončená",
|
||||||
@@ -8981,5 +8979,21 @@
|
|||||||
"⚠ Disk data will NOT be erased.": "⚠ Dáta na disku sa NEVYMAŽÚ.",
|
"⚠ Disk data will NOT be erased.": "⚠ Dáta na disku sa NEVYMAŽÚ.",
|
||||||
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Disk sa odpojí a odstráni z /etc/fstab.",
|
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Disk sa odpojí a odstráni z /etc/fstab.",
|
||||||
"⚠ The /etc/fstab entry will be removed.": "⚠ Záznam v /etc/fstab bude odstránený.",
|
"⚠ The /etc/fstab entry will be removed.": "⚠ Záznam v /etc/fstab bude odstránený.",
|
||||||
"⚠ The disk will be unmounted.": "⚠ Disk bude odpojený."
|
"⚠ The disk will be unmounted.": "⚠ Disk bude odpojený.",
|
||||||
|
"AirDC++ administrator": "Správca AirDC++",
|
||||||
|
"Direct Connect file sharing with a web interface": "Zdieľanie súborov cez Direct Connect s webovým rozhraním",
|
||||||
|
"A validating, recursive DNS resolver for your private network.": "Validujúci rekurzívny DNS resolver pre vašu súkromnú sieť.",
|
||||||
|
"Controller path on the Proxmox host; prefer /dev/serial/by-id/...": "Cesta ku kontroléru na hostiteľovi Proxmox; uprednostnite /dev/serial/by-id/...",
|
||||||
|
"Initial Z-Wave JS UI admin password": "Počiatočné heslo správcu Z-Wave JS UI",
|
||||||
|
"KDE's twin-panel file manager in a browser-based desktop.": "Dvojpanelový správca súborov KDE v pracovnej ploche dostupnej cez webový prehliadač.",
|
||||||
|
"KitchenOwl": "KitchenOwl",
|
||||||
|
"Krusader Web UI": "Webové rozhranie Krusaderu",
|
||||||
|
"Manage a Z-Wave network from a web dashboard and WebSocket gateway.": "Spravujte sieť Z-Wave cez webový panel a bránu WebSocket.",
|
||||||
|
"Open the web address and follow KitchenOwl’s onboarding to create the first account; no default account is configured.": "Otvorte webovú adresu a podľa pokynov KitchenOwl vytvorte prvý účet; predvolený účet nie je nastavený.",
|
||||||
|
"Pass through a Z-Wave USB or serial controller": "Pripojiť USB alebo sériový radič Z-Wave",
|
||||||
|
"Self-hosted grocery list and recipe manager": "Správca nákupných zoznamov a receptov, ktorý si môžete prevádzkovať sami.",
|
||||||
|
"Spoolman web interface": "Webové rozhranie Spoolmanu",
|
||||||
|
"Track 3D printer filament spools and usage.": "Sledujte cievky filamentu pre 3D tlačiareň a ich spotrebu.",
|
||||||
|
"Z-Wave JS UI": "Z-Wave JS UI",
|
||||||
|
"Z-Wave JS UI admin login": "Prihlásenie správcu Z-Wave JS UI"
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-1
@@ -256,6 +256,7 @@
|
|||||||
"Acceleration for llama.cpp": "Acceleration för llama.cpp",
|
"Acceleration for llama.cpp": "Acceleration för llama.cpp",
|
||||||
"Accept routes from other nodes?": "Acceptera rutter från andra noder?",
|
"Accept routes from other nodes?": "Acceptera rutter från andra noder?",
|
||||||
"Accept this host monitoring profile?": "Acceptera denna värdövervakningsprofil?",
|
"Accept this host monitoring profile?": "Acceptera denna värdövervakningsprofil?",
|
||||||
|
"Access Movistar and O2 Cloud from WebDAV clients and backup tools.": "Kom åt Movistar- och O2-molnet från WebDAV-klienter och säkerhetskopieringsverktyg.",
|
||||||
"Access Scope:": "Åtkomstomfång:",
|
"Access Scope:": "Åtkomstomfång:",
|
||||||
"Access bridge": "Tillgång bridge",
|
"Access bridge": "Tillgång bridge",
|
||||||
"Access bridge for Immich": "Tillgångsbro för Immich",
|
"Access bridge for Immich": "Tillgångsbro för Immich",
|
||||||
@@ -603,6 +604,8 @@
|
|||||||
"Audit socket disabled or not required": "Granskningsuttaget inaktiverat eller inte nödvändigt",
|
"Audit socket disabled or not required": "Granskningsuttaget inaktiverat eller inte nödvändigt",
|
||||||
"Auth key is required.": "Auth-nyckel krävs.",
|
"Auth key is required.": "Auth-nyckel krävs.",
|
||||||
"Auth:": "Auth:",
|
"Auth:": "Auth:",
|
||||||
|
"Authelia administrator": "Authelia administratör",
|
||||||
|
"Authelia session cookie domain for this portal (for example example.com)": "Authelia sessionscookiedomän för denna portal (till exempel example.com)",
|
||||||
"Authentication": "Autentisering",
|
"Authentication": "Autentisering",
|
||||||
"Authentication & Security": "Autentisering och säkerhet",
|
"Authentication & Security": "Autentisering och säkerhet",
|
||||||
"Authentication Error": "Autentiseringsfel",
|
"Authentication Error": "Autentiseringsfel",
|
||||||
@@ -4897,6 +4900,7 @@
|
|||||||
"Open the page of an application in the menu": "Öppna en applikations sida i menyn",
|
"Open the page of an application in the menu": "Öppna en applikations sida i menyn",
|
||||||
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Öppna webbadressen och skapa det första kontot: daemonen registrerar sig själv och startar den första skanningen.",
|
"Open the web address and create the first account: the daemon registers by itself and starts the first scan.": "Öppna webbadressen och skapa det första kontot: daemonen registrerar sig själv och startar den första skanningen.",
|
||||||
"Open the web address and create the password of the akadmin user in the first-run setup.": "Öppna webbadressen och skapa lösenordet för akadmin-användaren i den första körningen.",
|
"Open the web address and create the password of the akadmin user in the first-run setup.": "Öppna webbadressen och skapa lösenordet för akadmin-användaren i den första körningen.",
|
||||||
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.": "Öppna webbpanelen och koppla ditt Movistar/O2-konto med SMS-verifieringen.",
|
||||||
"Open-source AI-powered coding assistant": "Open-source AI-driven kodningsassistent",
|
"Open-source AI-powered coding assistant": "Open-source AI-driven kodningsassistent",
|
||||||
"Open-source UI for building and debugging multi-agent and RAG applications": "Open-source UI för att bygga och debugga multi-agent- och RAG-applikationer",
|
"Open-source UI for building and debugging multi-agent and RAG applications": "Open-source UI för att bygga och debugga multi-agent- och RAG-applikationer",
|
||||||
"Open-source in-memory data store.": "Öppen datalagring i minnet.",
|
"Open-source in-memory data store.": "Öppen datalagring i minnet.",
|
||||||
@@ -5396,6 +5400,7 @@
|
|||||||
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Proxmox webbgränssnitt: Datacenter > Lagring > Lägg till > ZFS",
|
"Proxmox web interface: Datacenter > Storage > Add > ZFS": "Proxmox webbgränssnitt: Datacenter > Lagring > Lägg till > ZFS",
|
||||||
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Proxmox webbgränssnitt: Datacenter > Lagring > Lägg till > iSCSI",
|
"Proxmox web interface: Datacenter > Storage > Add > iSCSI": "Proxmox webbgränssnitt: Datacenter > Lagring > Lägg till > iSCSI",
|
||||||
"Proxy address to reach the API (optional)": "Proxyadress för att nå API:t (valfritt)",
|
"Proxy address to reach the API (optional)": "Proxyadress för att nå API:t (valfritt)",
|
||||||
|
"Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)": "Offentlig HTTPS-URL som används för att öppna denna Authelia-portal (till exempel https://auth.example.com)",
|
||||||
"Public UDP port clients connect to": "Offentliga UDP-portklienter ansluter till",
|
"Public UDP port clients connect to": "Offentliga UDP-portklienter ansluter till",
|
||||||
"Public UDP port peers connect to": "Offentliga UDP-portpeers ansluter till",
|
"Public UDP port peers connect to": "Offentliga UDP-portpeers ansluter till",
|
||||||
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "Public URL av phpMyAdmin när den serveras bakom en omvänd proxy",
|
"Public URL of phpMyAdmin when it is served behind a reverse proxy": "Public URL av phpMyAdmin när den serveras bakom en omvänd proxy",
|
||||||
@@ -6453,6 +6458,7 @@
|
|||||||
"Simple and easy to use DDNS": "Enkelt och enkelt att använda DDNS",
|
"Simple and easy to use DDNS": "Enkelt och enkelt att använda DDNS",
|
||||||
"Simple self-hosted file sharing.": "Enkel självhostad fildelning.",
|
"Simple self-hosted file sharing.": "Enkel självhostad fildelning.",
|
||||||
"Single GPU Warning": "Varning för enkel GPU",
|
"Single GPU Warning": "Varning för enkel GPU",
|
||||||
|
"Single sign-on and multi-factor authentication": "Enkel inloggning och multifaktorautentisering",
|
||||||
"Single target found — selected automatically:": "Enstaka mål hittades — väljs automatiskt:",
|
"Single target found — selected automatically:": "Enstaka mål hittades — väljs automatiskt:",
|
||||||
"Single-node log storage and query UI.": "Gränssnitt för logglagring och loggsökning på en enda nod.",
|
"Single-node log storage and query UI.": "Gränssnitt för logglagring och loggsökning på en enda nod.",
|
||||||
"Single-node observability database for metrics, logs and traces.": "Observabilitetsdatabas med en nod för mätvärden, loggar och spår.",
|
"Single-node observability database for metrics, logs and traces.": "Observabilitetsdatabas med en nod för mätvärden, loggar och spår.",
|
||||||
@@ -8202,12 +8208,17 @@
|
|||||||
"Web access": "Web access",
|
"Web access": "Web access",
|
||||||
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Webbadress för AdGuard Home som tar emot inställningarna (t.ex. http://192.168.1.3)",
|
"Web address of the AdGuard Home that receives the settings (e.g. http://192.168.1.3)": "Webbadress för AdGuard Home som tar emot inställningarna (t.ex. http://192.168.1.3)",
|
||||||
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Webbadressen för AdGuard Home, vars inställningar kopieras (t.ex. http://192.168.1.2)",
|
"Web address of the main AdGuard Home, whose settings are copied (e.g. http://192.168.1.2)": "Webbadressen för AdGuard Home, vars inställningar kopieras (t.ex. http://192.168.1.2)",
|
||||||
|
"Web dashboard": "Webbpanel",
|
||||||
|
"Web dashboard and WebDAV": "Webbpanel och WebDAV",
|
||||||
"Web interface": "Webbgränssnitt",
|
"Web interface": "Webbgränssnitt",
|
||||||
"Web interface for Borg Backup repositories and jobs.": "Webbgränssnitt för Borg Backup-arkiv och jobb.",
|
"Web interface for Borg Backup repositories and jobs.": "Webbgränssnitt för Borg Backup-arkiv och jobb.",
|
||||||
"Web interface for managing 3D printers.": "Webbgränssnitt för hantering av 3D-skrivare.",
|
"Web interface for managing 3D printers.": "Webbgränssnitt för hantering av 3D-skrivare.",
|
||||||
"Web interface to manage devices running Tasmota firmware.": "Webbgränssnitt för att hantera enheter som kör Tasmota firmware.",
|
"Web interface to manage devices running Tasmota firmware.": "Webbgränssnitt för att hantera enheter som kör Tasmota firmware.",
|
||||||
"Web reverse proxy with an administration interface.": "Omvänd proxy för webben med administrationsgränssnitt.",
|
"Web reverse proxy with an administration interface.": "Omvänd proxy för webben med administrationsgränssnitt.",
|
||||||
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord kan sammanfattas som ett paket av säkerhets- och sekretesshärdningar, Discord-funktioner reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, interna sidor och wrapped https://discord.com sida, utformad för att överensstämma med ToS så mycket som möjligt (eller dölja de förändringar som kan bryta mot det från Discords ögon).",
|
"WebCord can be summarized as a pack of security and privacy hardenings, Discord features reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, internal pages and wrapped https://discord.com page, designed to conform with ToS as much as it is possible (or hide the changes that might violate it from Discord's eyes).": "WebCord kan sammanfattas som ett paket av säkerhets- och sekretesshärdningar, Discord-funktioner reimplementations, Electron / Chromium / Discord bugs workarounds, stylesheets, interna sidor och wrapped https://discord.com sida, utformad för att överensstämma med ToS så mycket som möjligt (eller dölja de förändringar som kan bryta mot det från Discords ögon).",
|
||||||
|
"WebDAV": "WebDAV",
|
||||||
|
"WebDAV and dashboard password (leave empty to generate)": "Lösenord för WebDAV och panelen (tom = genererat)",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations.": "WebDAV är tillgängligt på containerns port 8080. Kontot måste kopplas innan du arbetar med filerna i molnet.",
|
||||||
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus är en multi-site inkrementell xmltv epg grabber. Det samlar in tv-programguide data från utvalda tvguide webbplatser för dina favoritkanaler.",
|
"Webgrabplus is a multi-site incremental xmltv epg grabber. It collects tv-program guide data from selected tvguide sites for your favourite channels.": "Webgrabplus är en multi-site inkrementell xmltv epg grabber. Det samlar in tv-programguide data från utvalda tvguide webbplatser för dina favoritkanaler.",
|
||||||
"Webservers & Proxies": "Webbservrar och proxyservrar",
|
"Webservers & Proxies": "Webbservrar och proxyservrar",
|
||||||
"Website": "Webbplats",
|
"Website": "Webbplats",
|
||||||
@@ -8967,5 +8978,7 @@
|
|||||||
"⚠ Disk data will NOT be erased.": "⚠ Diskdata kommer INTE att raderas.",
|
"⚠ Disk data will NOT be erased.": "⚠ Diskdata kommer INTE att raderas.",
|
||||||
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Disken kommer att avmonteras och tas bort från /etc/fstab.",
|
"⚠ Disk will be unmounted and removed from /etc/fstab.": "⚠ Disken kommer att avmonteras och tas bort från /etc/fstab.",
|
||||||
"⚠ The /etc/fstab entry will be removed.": "⚠ /etc/fstab-posten kommer att tas bort.",
|
"⚠ The /etc/fstab entry will be removed.": "⚠ /etc/fstab-posten kommer att tas bort.",
|
||||||
"⚠ The disk will be unmounted.": "⚠ Disken kommer att avmonteras."
|
"⚠ The disk will be unmounted.": "⚠ Disken kommer att avmonteras.",
|
||||||
|
"AirDC++ administrator": "AirDC++-administratör",
|
||||||
|
"Direct Connect file sharing with a web interface": "Fildelning via Direct Connect med webbgränssnitt"
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<!-- Generated from oci/catalog/verification.json by .github/scripts/oci_validation.py. Do not edit by hand. -->
|
<!-- Generated from oci/catalog/verification.json by .github/scripts/oci_validation.py. Do not edit by hand. -->
|
||||||
|
|
||||||
52 of 538 applications in the OCI catalog have been tested for real: 49 in the ProxMenux lab and 3 by the community. The OCI installer shows them as verified, with a ✓ in the lists.
|
52 of 541 applications in the OCI catalog have been tested for real: 49 in the ProxMenux lab and 3 by the community. The OCI installer shows them as verified, with a ✓ in the lists.
|
||||||
|
|
||||||
Each test describes the scenario that was run and names the image it ran on. It does not cover every possible configuration of the application, and a newer image has not been tested until someone reports it.
|
Each test describes the scenario that was run and names the image it ran on. It does not cover every possible configuration of the application, and a newer image has not been tested until someone reports it.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,585 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "0.5.0",
|
||||||
|
"kind": "proxmenux.oci-template",
|
||||||
|
"id": "image-airdcpp-webclient",
|
||||||
|
"status": "generated-unvalidated",
|
||||||
|
"catalog_ui": {
|
||||||
|
"title": {
|
||||||
|
"en_US": "AirDC++ Web Client",
|
||||||
|
"es_ES": "AirDC++ Web Client"
|
||||||
|
},
|
||||||
|
"tagline": {
|
||||||
|
"en_US": "Direct Connect file sharing with a web interface",
|
||||||
|
"es_ES": "Intercambio de archivos Direct Connect con interfaz web"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en_US": "AirDC++ Web Client using the community-maintained gangefors image. Configuration, downloads and shared content use separate persistent paths.",
|
||||||
|
"es_ES": "AirDC++ Web Client con la imagen comunitaria de gangefors. La configuración, las descargas y los archivos compartidos usan rutas persistentes separadas."
|
||||||
|
},
|
||||||
|
"category": "downloads",
|
||||||
|
"category_label": "Files & Downloads",
|
||||||
|
"author": "gangefors",
|
||||||
|
"developer": "AirDC++",
|
||||||
|
"icon": "https://raw.githubusercontent.com/airdcpp-web/airdcpp-webui/eeeea5025a5e720f38dac53ced8e002940f00a74/resources/images/logo.svg",
|
||||||
|
"thumbnail": null,
|
||||||
|
"screenshots": [],
|
||||||
|
"architectures": [
|
||||||
|
"amd64"
|
||||||
|
],
|
||||||
|
"launch": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5600,
|
||||||
|
"path": "/"
|
||||||
|
},
|
||||||
|
"website": "https://airdcpp-web.github.io/",
|
||||||
|
"documentation": "https://github.com/gangefors/docker-airdcpp-webclient",
|
||||||
|
"repository": "https://github.com/gangefors/docker-airdcpp-webclient",
|
||||||
|
"tips": [
|
||||||
|
"The upstream initial login is admin / password. Change it in Settings > System > Users before allowing access beyond a trusted LAN.",
|
||||||
|
"Configuration uses /.airdcpp on a managed Proxmox volume included in backups. /Downloads and /Share can use managed volumes or explicitly selected host directories.",
|
||||||
|
"Files under /Share are shared by AirDC++. Select the contents deliberately; router forwarding and hub configuration are separate administrator actions.",
|
||||||
|
"PUID and PGID default to 1000 and must be at least 101. The original entrypoint creates the application account; volume ownership follows these values.",
|
||||||
|
"Open HTTP port 5600 on the dedicated LXC address. HTTPS port 5601 uses the upstream self-signed certificate; use a trusted reverse proxy certificate for remote web access.",
|
||||||
|
"Incoming Direct Connect traffic uses TCP and UDP 21248 and TLS TCP 21249. ProxMenux keeps those native ports and does not configure your router."
|
||||||
|
],
|
||||||
|
"mini_changelog": [],
|
||||||
|
"display_version": null,
|
||||||
|
"updated_at": "2026-10-25"
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "gangefors",
|
||||||
|
"repository": "https://github.com/gangefors/docker-airdcpp-webclient",
|
||||||
|
"revision": "37f2e939c152fb2c0158bc83bc76cc972aed965e",
|
||||||
|
"image_repository_url": "https://hub.docker.com/r/gangefors/airdcpp-webclient",
|
||||||
|
"readme_pushed_at": "2026-10-25T11:51:53Z",
|
||||||
|
"compose_sha256": "4ce8aec542cfc3e7f5ca142e309a41f04aca444bd1724ca1741c96acb5c3d5bf",
|
||||||
|
"generated_at": "2026-11-03T11:47:04+00:00",
|
||||||
|
"default_branch": "master",
|
||||||
|
"readme_raw_url": "https://raw.githubusercontent.com/gangefors/docker-airdcpp-webclient/37f2e939c152fb2c0158bc83bc76cc972aed965e/docker-compose.yml"
|
||||||
|
},
|
||||||
|
"container_contract": {
|
||||||
|
"service_name": "airdcpp",
|
||||||
|
"container_name": "airdcpp",
|
||||||
|
"image": {
|
||||||
|
"reference": "docker.io/gangefors/airdcpp-webclient:latest",
|
||||||
|
"registry": "docker.io",
|
||||||
|
"repository": "docker.io/gangefors/airdcpp-webclient",
|
||||||
|
"tag": "latest",
|
||||||
|
"digest": null,
|
||||||
|
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
|
||||||
|
},
|
||||||
|
"environment": [
|
||||||
|
{
|
||||||
|
"name": "PUID",
|
||||||
|
"example": "1000",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "upstream-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PGID",
|
||||||
|
"example": "1000",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "upstream-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "UMASK",
|
||||||
|
"example": "0022",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "upstream-compose"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
{
|
||||||
|
"id": "config",
|
||||||
|
"container_path": "/.airdcpp",
|
||||||
|
"compose_source_example": "./config",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 16
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "downloads",
|
||||||
|
"container_path": "/Downloads",
|
||||||
|
"compose_source_example": "./downloads",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume",
|
||||||
|
"host-bind"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 32
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "share",
|
||||||
|
"container_path": "/Share",
|
||||||
|
"compose_source_example": "./share",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume",
|
||||||
|
"host-bind"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"container_port": 5600,
|
||||||
|
"published_example": 5600,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 5601,
|
||||||
|
"published_example": 5601,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 21248,
|
||||||
|
"published_example": 21248,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 21248,
|
||||||
|
"published_example": 21248,
|
||||||
|
"protocol": "udp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 21249,
|
||||||
|
"published_example": 21249,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"related_services": [],
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"stop_grace_period": null,
|
||||||
|
"original_compose": "name: airdcpp-webclient\nservices:\n airdcpp:\n image: docker.io/gangefors/airdcpp-webclient:latest\n restart: unless-stopped\n environment:\n PUID: '1000'\n PGID: '1000'\n UMASK: '0022'\n ports:\n - 5600:5600\n - 5601:5601\n - 21248:21248/tcp\n - 21248:21248/udp\n - 21249:21249/tcp\n volumes:\n - ./config:/.airdcpp\n - ./downloads:/Downloads\n - ./share:/Share\n"
|
||||||
|
},
|
||||||
|
"compose_stack": {
|
||||||
|
"project_name": "airdcpp-webclient",
|
||||||
|
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||||
|
"user_experience": "single-application-install",
|
||||||
|
"main_service": "airdcpp",
|
||||||
|
"service_count": 1,
|
||||||
|
"services": [
|
||||||
|
{
|
||||||
|
"name": "airdcpp",
|
||||||
|
"image": "docker.io/gangefors/airdcpp-webclient:latest",
|
||||||
|
"is_main": true,
|
||||||
|
"role": "frontend",
|
||||||
|
"vmid_offset": 0,
|
||||||
|
"depends_on": [],
|
||||||
|
"frontend_network": true,
|
||||||
|
"private_network": false,
|
||||||
|
"compose": {
|
||||||
|
"image": "docker.io/gangefors/airdcpp-webclient:latest",
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "1000",
|
||||||
|
"PGID": "1000",
|
||||||
|
"UMASK": "0022"
|
||||||
|
},
|
||||||
|
"ports": [
|
||||||
|
"5600:5600",
|
||||||
|
"5601:5601",
|
||||||
|
"21248:21248/tcp",
|
||||||
|
"21248:21248/udp",
|
||||||
|
"21249:21249/tcp"
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
"./config:/.airdcpp",
|
||||||
|
"./downloads:/Downloads",
|
||||||
|
"./share:/Share"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"top_level": {
|
||||||
|
"name": "airdcpp-webclient"
|
||||||
|
},
|
||||||
|
"networking": {
|
||||||
|
"frontend": "selected-proxmox-bridge",
|
||||||
|
"private_required": false,
|
||||||
|
"private_creation": "automatic-create-if-missing",
|
||||||
|
"private_address_allocation": "automatic-static-address-per-service",
|
||||||
|
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||||
|
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||||
|
"prompt_user_for_private_network": false
|
||||||
|
},
|
||||||
|
"storage": [
|
||||||
|
{
|
||||||
|
"id": "airdcpp-volume-0",
|
||||||
|
"service": "airdcpp",
|
||||||
|
"container_path": "/.airdcpp",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "airdcpp-volume-1",
|
||||||
|
"service": "airdcpp",
|
||||||
|
"container_path": "/Downloads",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "airdcpp-volume-2",
|
||||||
|
"service": "airdcpp",
|
||||||
|
"container_path": "/Share",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"orchestration": {
|
||||||
|
"reserve_vmids_atomically": 1,
|
||||||
|
"start_order": [
|
||||||
|
"airdcpp"
|
||||||
|
],
|
||||||
|
"stop_order": [
|
||||||
|
"airdcpp"
|
||||||
|
],
|
||||||
|
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||||
|
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||||
|
},
|
||||||
|
"installer_inputs": {
|
||||||
|
"prompted": [
|
||||||
|
"stack_name",
|
||||||
|
"base_vmid",
|
||||||
|
"rootfs_storage",
|
||||||
|
"persistent_data_destinations",
|
||||||
|
"frontend_bridge",
|
||||||
|
"frontend_ipv4_mode"
|
||||||
|
],
|
||||||
|
"automatic": [
|
||||||
|
"dependent_vmids",
|
||||||
|
"private_bridge",
|
||||||
|
"private_subnet",
|
||||||
|
"private_service_addresses",
|
||||||
|
"compose_service_aliases",
|
||||||
|
"generated_secrets",
|
||||||
|
"dependency_start_and_stop_order"
|
||||||
|
],
|
||||||
|
"generated_secrets": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"first_run": {
|
||||||
|
"endpoints": [
|
||||||
|
{
|
||||||
|
"label": "Web UI",
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5600,
|
||||||
|
"path": "/",
|
||||||
|
"source": "https://github.com/gangefors/docker-airdcpp-webclient"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"credentials": [
|
||||||
|
{
|
||||||
|
"label": "AirDC++ administrator",
|
||||||
|
"type": "static-default",
|
||||||
|
"username": "admin",
|
||||||
|
"password": "password",
|
||||||
|
"change_required": true,
|
||||||
|
"source": "https://github.com/gangefors/docker-airdcpp-webclient#run-the-application"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"runtime": "native-oci-lxc",
|
||||||
|
"technology_status": "proxmox-technology-preview",
|
||||||
|
"defaults": {
|
||||||
|
"unprivileged": true,
|
||||||
|
"ostype": "auto-from-image",
|
||||||
|
"cores": 2,
|
||||||
|
"memory_mb": 1024,
|
||||||
|
"swap_mb": 512,
|
||||||
|
"rootfs_size_gb": 8,
|
||||||
|
"rootfs_storage": "local-lvm",
|
||||||
|
"volume_storage": "local-lvm",
|
||||||
|
"template_storage": "local",
|
||||||
|
"bridge": "vmbr0",
|
||||||
|
"ipv4": "dhcp",
|
||||||
|
"firewall": true,
|
||||||
|
"host_managed_network": true,
|
||||||
|
"onboot": false,
|
||||||
|
"features": [
|
||||||
|
"nesting=1"
|
||||||
|
],
|
||||||
|
"shutdown_timeout_seconds": 30
|
||||||
|
},
|
||||||
|
"image_metadata_policy": {
|
||||||
|
"entrypoint": "import-from-oci-image",
|
||||||
|
"cmd": "import-from-oci-image",
|
||||||
|
"environment": "import-image-env-then-apply-compose-overrides",
|
||||||
|
"user": "import-from-oci-image",
|
||||||
|
"working_dir": "import-from-oci-image",
|
||||||
|
"stop_signal": "import-from-oci-image"
|
||||||
|
},
|
||||||
|
"adaptations": [
|
||||||
|
{
|
||||||
|
"id": "imported-compose-source",
|
||||||
|
"upstream_behavior": "The source definition deploys the complete Docker Compose application model.",
|
||||||
|
"native_lxc_behavior": "The source model is preserved and remains blocked until every service option has a reviewed native Proxmox mapping.",
|
||||||
|
"reason": "Catalog import must not imply runtime compatibility.",
|
||||||
|
"behavioral_impact": "No automatic installation before review.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rolling-latest-image",
|
||||||
|
"upstream_behavior": "A discovered Compose may pin a release tag or digest.",
|
||||||
|
"native_lxc_behavior": "ProxMenux selects the same image repository with the latest tag for catalog installations.",
|
||||||
|
"reason": "The automatic catalog intentionally offers rolling latest images; pinned versions belong to the future manual installer.",
|
||||||
|
"behavioral_impact": "The installed release can be newer than the discovered Compose revision.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dedicated-lxc-network",
|
||||||
|
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||||
|
"native_lxc_behavior": "A reviewed native application will listen on its original container ports at a dedicated LXC address.",
|
||||||
|
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||||
|
"behavioral_impact": "Published ports are metadata; ProxMenux URLs use the matching container target port.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-shm-size",
|
||||||
|
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||||
|
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||||
|
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-command",
|
||||||
|
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||||
|
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||||
|
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-privileged-mode",
|
||||||
|
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||||
|
"native_lxc_behavior": "ProxMenux keeps the LXC unprivileged by default and exposes the broad Compose privilege request only as an explicit compatibility option.",
|
||||||
|
"reason": "A Compose privilege request is source metadata, not proof that the image technically requires a privileged LXC.",
|
||||||
|
"behavioral_impact": "A privileged LXC has weaker isolation from the Proxmox host.",
|
||||||
|
"validation": "native-equivalent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-process-runtime",
|
||||||
|
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||||
|
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||||
|
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-healthcheck",
|
||||||
|
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||||
|
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||||
|
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||||
|
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-cpu-priority",
|
||||||
|
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||||
|
"reason": "Both settings express relative CPU priority on different scales.",
|
||||||
|
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-resource-limits",
|
||||||
|
"upstream_behavior": "mem_limit sets the memory ceiling; ulimits sets process soft/hard resource limits.",
|
||||||
|
"native_lxc_behavior": "mem_limit supplies the editable Proxmox memory default, rounded up to MiB; ulimits maps to lxc.prlimit with -1 represented as unlimited.",
|
||||||
|
"reason": "Use native Proxmox memory and LXC prlimits, without a wrapper or changing the host kernel configuration.",
|
||||||
|
"behavioral_impact": "User-selected memory overrides Compose. Swap is a separate choice. Kernel restrictions still apply; nproc counts processes by real UID, not by container.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-identity",
|
||||||
|
"upstream_behavior": "Compose can set hostname, MAC address, extra hosts and attach a service to Docker networks.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies hostname and MAC to net0, writes additional host aliases into the LXC and uses its dedicated bridge connection for single-service networks.",
|
||||||
|
"reason": "A dedicated LXC has its own network namespace and does not need a Docker bridge per service.",
|
||||||
|
"behavioral_impact": "host-gateway resolves to the IPv4 address of the selected Proxmox bridge.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-mode",
|
||||||
|
"upstream_behavior": "Docker host mode removes Docker network isolation; bridge and default use a Docker-managed network.",
|
||||||
|
"native_lxc_behavior": "The OCI process uses the dedicated LXC network namespace directly, so host, bridge and default all listen on the LXC address without Docker NAT.",
|
||||||
|
"reason": "The LXC is the application host and already has its own address and port namespace.",
|
||||||
|
"behavioral_impact": "host means the LXC host, never the Proxmox host; this preserves Proxmox network isolation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-capabilities-and-sysctls",
|
||||||
|
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||||
|
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||||
|
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||||
|
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "docker-engine-metadata",
|
||||||
|
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||||
|
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||||
|
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||||
|
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-device-passthrough",
|
||||||
|
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||||
|
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||||
|
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-host-ipc",
|
||||||
|
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||||
|
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||||
|
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||||
|
"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": "/.airdcpp",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"only_when_mount_type": "managed-volume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/Downloads",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"only_when_mount_type": "managed-volume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/Share",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"only_when_mount_type": "managed-volume"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"startup_healthcheck": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5600,
|
||||||
|
"path": "/index.html",
|
||||||
|
"timeout_seconds": 180,
|
||||||
|
"request_timeout_seconds": 5,
|
||||||
|
"stability_seconds": 4,
|
||||||
|
"verify_tls": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compatibility": {
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"validated": false,
|
||||||
|
"supported_compose_keys": [
|
||||||
|
"cap_add",
|
||||||
|
"command",
|
||||||
|
"container_name",
|
||||||
|
"cpu_shares",
|
||||||
|
"deploy",
|
||||||
|
"devices",
|
||||||
|
"entrypoint",
|
||||||
|
"environment",
|
||||||
|
"extra_hosts",
|
||||||
|
"group_add",
|
||||||
|
"healthcheck",
|
||||||
|
"hostname",
|
||||||
|
"image",
|
||||||
|
"init",
|
||||||
|
"ipc",
|
||||||
|
"labels",
|
||||||
|
"logging",
|
||||||
|
"mac_address",
|
||||||
|
"mem_limit",
|
||||||
|
"network_mode",
|
||||||
|
"networks",
|
||||||
|
"ports",
|
||||||
|
"privileged",
|
||||||
|
"restart",
|
||||||
|
"runtime",
|
||||||
|
"security_opt",
|
||||||
|
"shm_size",
|
||||||
|
"stdin_open",
|
||||||
|
"stop_grace_period",
|
||||||
|
"stop_signal",
|
||||||
|
"sysctls",
|
||||||
|
"tty",
|
||||||
|
"ulimits",
|
||||||
|
"user",
|
||||||
|
"volumes",
|
||||||
|
"working_dir"
|
||||||
|
],
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"policy": "Community image and single-LXC contract reviewed against the publisher Compose and entrypoint; Linux amd64 confirmed in the registry manifest. Runtime lifecycle checks remain pending."
|
||||||
|
},
|
||||||
|
"validation": {
|
||||||
|
"schema": "passed-at-generation",
|
||||||
|
"clean_install": "pending",
|
||||||
|
"service_health": "pending",
|
||||||
|
"restart_persistence": "pending",
|
||||||
|
"backup_restore": "pending",
|
||||||
|
"update_preserves_data": "pending",
|
||||||
|
"authenticated_login": "pending",
|
||||||
|
"advanced_install": "pending",
|
||||||
|
"host_bind_storage": "pending",
|
||||||
|
"managed_storage": "pending",
|
||||||
|
"removal": "pending"
|
||||||
|
},
|
||||||
|
"lifecycle": {
|
||||||
|
"update_strategy": "resolve-latest-image-then-apply-reviewed-native-lxc-update",
|
||||||
|
"registry_state": {
|
||||||
|
"resolved_architecture": null,
|
||||||
|
"resolved_digest": null,
|
||||||
|
"image_version_label": null,
|
||||||
|
"image_created": null
|
||||||
|
},
|
||||||
|
"change_detection": "compare-compose-sha256-and-resolved-latest-image-digest",
|
||||||
|
"automatic_unattended_updates": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,453 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "0.4.0",
|
||||||
|
"kind": "proxmenux.oci-template",
|
||||||
|
"id": "image-authelia",
|
||||||
|
"status": "generated-unvalidated",
|
||||||
|
"catalog_ui": {
|
||||||
|
"title": {
|
||||||
|
"en_US": "Authelia",
|
||||||
|
"es_ES": "Authelia"
|
||||||
|
},
|
||||||
|
"tagline": {
|
||||||
|
"en_US": "Single sign-on and multi-factor authentication",
|
||||||
|
"es_ES": "Inicio de sesión único y autenticación multifactor"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en_US": "An open-source authentication and authorization server for protecting web applications. This single-image profile provides a local SQLite database and file notifications; configure your domain, reverse proxy and access rules before protecting other services.",
|
||||||
|
"es_ES": "Servidor de autenticación y autorización de código abierto para proteger aplicaciones web. Este perfil de una sola imagen incluye una base de datos SQLite local y notificaciones en archivo; configura el dominio, el proxy inverso y las reglas de acceso antes de proteger otros servicios."
|
||||||
|
},
|
||||||
|
"category": "security",
|
||||||
|
"category_label": "Authentication & Security",
|
||||||
|
"author": "Authelia",
|
||||||
|
"developer": "Authelia",
|
||||||
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/authelia.webp",
|
||||||
|
"thumbnail": null,
|
||||||
|
"screenshots": [],
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"launch": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 9091,
|
||||||
|
"path": "/"
|
||||||
|
},
|
||||||
|
"website": "https://www.authelia.com/",
|
||||||
|
"documentation": "https://www.authelia.com/integration/deployment/docker/",
|
||||||
|
"repository": "https://github.com/authelia/authelia",
|
||||||
|
"tips": [
|
||||||
|
"The installer creates a unique admin password and stores only its Argon2id hash in /config/users_database.yml. The password is shown in the installation result.",
|
||||||
|
"Authelia requires an HTTPS portal URL and a cookie domain matching that hostname. If you use Nginx Proxy Manager, follow the official integration guide and configure trusted proxies and forward-auth separately.",
|
||||||
|
"The default notifier writes messages to /config/notification.txt. Configure SMTP in /config/configuration.yml if you want email delivery.",
|
||||||
|
"The initial access-control policy is one_factor. Add explicit access-control rules before attaching Authelia to protected proxy hosts."
|
||||||
|
],
|
||||||
|
"mini_changelog": [],
|
||||||
|
"display_version": "4.39.28",
|
||||||
|
"updated_at": "2026-09-17"
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "authelia",
|
||||||
|
"repository": "https://github.com/authelia/authelia",
|
||||||
|
"default_branch": "master",
|
||||||
|
"revision": "8da42b2348b0351c6284a2940a9c5eec3d4cd3fd",
|
||||||
|
"readme_raw_url": "https://raw.githubusercontent.com/authelia/authelia/v4.39.28/examples/compose/lite/compose.yml",
|
||||||
|
"readme_pushed_at": "2026-09-17T12:13:30Z",
|
||||||
|
"compose_sha256": "848ce0f70e502981a050ac200d9d1882978a6c3b0f9f0dfcc6d52ce66ca37fb5",
|
||||||
|
"generated_at": "2026-11-03T09:10:57+00:00",
|
||||||
|
"image_repository_url": "https://hub.docker.com/r/authelia/authelia"
|
||||||
|
},
|
||||||
|
"container_contract": {
|
||||||
|
"service_name": "authelia",
|
||||||
|
"container_name": "authelia",
|
||||||
|
"image": {
|
||||||
|
"reference": "docker.io/authelia/authelia:4.39.28",
|
||||||
|
"registry": "docker.io",
|
||||||
|
"repository": "docker.io/authelia/authelia",
|
||||||
|
"tag": "4.39.28",
|
||||||
|
"digest": null,
|
||||||
|
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||||
|
},
|
||||||
|
"environment": [
|
||||||
|
{
|
||||||
|
"name": "PROXMENUX_ADMIN_PASSWORD",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "proxmenux-first-start"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "proxmenux-generated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "AUTHELIA_SESSION_SECRET",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "proxmenux-generated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "AUTHELIA_STORAGE_ENCRYPTION_KEY",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "proxmenux-generated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "X_AUTHELIA_CONFIG_FILTERS",
|
||||||
|
"example": "template",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "authelia-container"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PROXMENUX_AUTHELIA_COOKIE_DOMAIN",
|
||||||
|
"example": "",
|
||||||
|
"prompt": "Authelia session cookie domain for this portal (for example example.com)",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "administrator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PROXMENUX_AUTHELIA_URL",
|
||||||
|
"example": "",
|
||||||
|
"prompt": "Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "administrator"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
{
|
||||||
|
"id": "config",
|
||||||
|
"container_path": "/config",
|
||||||
|
"compose_source_example": "./authelia",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"container_port": 9091,
|
||||||
|
"published_example": 9091,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"related_services": [],
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"stop_grace_period": null,
|
||||||
|
"original_compose": "services:\n authelia:\n entrypoint:\n - /bin/sh\n - /usr/local/bin/proxmenux-authelia-bootstrap\n environment:\n AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET: ${GENERATED_RESET_PASSWORD_JWT_SECRET}\n AUTHELIA_SESSION_SECRET: ${GENERATED_SESSION_SECRET}\n AUTHELIA_STORAGE_ENCRYPTION_KEY: ${GENERATED_STORAGE_ENCRYPTION_KEY}\n PROXMENUX_ADMIN_PASSWORD: ${GENERATED_ADMIN_PASSWORD}\n PROXMENUX_AUTHELIA_COOKIE_DOMAIN: ${AUTHELIA_COOKIE_DOMAIN}\n PROXMENUX_AUTHELIA_URL: ${AUTHELIA_URL}\n X_AUTHELIA_CONFIG_FILTERS: template\n image: docker.io/authelia/authelia:4.39.28\n ports:\n - 9091:9091\n restart: unless-stopped\n volumes:\n - ./authelia:/config\n"
|
||||||
|
},
|
||||||
|
"first_run": {
|
||||||
|
"endpoints": [
|
||||||
|
{
|
||||||
|
"label": "Authelia Web UI",
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 9091,
|
||||||
|
"path": "/",
|
||||||
|
"source": "official-image"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"credentials": [
|
||||||
|
{
|
||||||
|
"label": "Authelia administrator",
|
||||||
|
"type": "configured-or-installer-generated",
|
||||||
|
"username": "admin",
|
||||||
|
"password": null,
|
||||||
|
"password_environment": "PROXMENUX_ADMIN_PASSWORD",
|
||||||
|
"change_required": false,
|
||||||
|
"source": "Generated on first start and stored as an Argon2id hash in the persistent users file."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"runtime": "native-oci-lxc",
|
||||||
|
"technology_status": "proxmox-technology-preview",
|
||||||
|
"defaults": {
|
||||||
|
"unprivileged": true,
|
||||||
|
"ostype": "auto-from-image",
|
||||||
|
"cores": 2,
|
||||||
|
"memory_mb": 512,
|
||||||
|
"swap_mb": 512,
|
||||||
|
"rootfs_size_gb": 8,
|
||||||
|
"rootfs_storage": "local-lvm",
|
||||||
|
"volume_storage": "local-lvm",
|
||||||
|
"template_storage": "local",
|
||||||
|
"bridge": "vmbr0",
|
||||||
|
"ipv4": "dhcp",
|
||||||
|
"firewall": true,
|
||||||
|
"host_managed_network": true,
|
||||||
|
"onboot": false,
|
||||||
|
"features": [
|
||||||
|
"nesting=1"
|
||||||
|
],
|
||||||
|
"shutdown_timeout_seconds": 60
|
||||||
|
},
|
||||||
|
"image_metadata_policy": {
|
||||||
|
"entrypoint": "import-from-oci-image",
|
||||||
|
"cmd": "import-from-oci-image",
|
||||||
|
"environment": "import-image-env-then-apply-compose-overrides",
|
||||||
|
"user": "import-from-oci-image",
|
||||||
|
"working_dir": "import-from-oci-image",
|
||||||
|
"stop_signal": "import-from-oci-image"
|
||||||
|
},
|
||||||
|
"installer_profile": {
|
||||||
|
"runtime": {
|
||||||
|
"compose_entrypoint": [
|
||||||
|
"/bin/sh",
|
||||||
|
"/usr/local/bin/proxmenux-authelia-bootstrap"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"generated_sensitive_environment": {
|
||||||
|
"PROXMENUX_ADMIN_PASSWORD": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 24,
|
||||||
|
"prompt": false
|
||||||
|
},
|
||||||
|
"AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 32,
|
||||||
|
"prompt": false
|
||||||
|
},
|
||||||
|
"AUTHELIA_SESSION_SECRET": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 32,
|
||||||
|
"prompt": false
|
||||||
|
},
|
||||||
|
"AUTHELIA_STORAGE_ENCRYPTION_KEY": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 32,
|
||||||
|
"prompt": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimum_secret_length": {
|
||||||
|
"PROXMENUX_ADMIN_PASSWORD": 24,
|
||||||
|
"AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET": 32,
|
||||||
|
"AUTHELIA_SESSION_SECRET": 32,
|
||||||
|
"AUTHELIA_STORAGE_ENCRYPTION_KEY": 32
|
||||||
|
},
|
||||||
|
"generated_files": [
|
||||||
|
{
|
||||||
|
"container_path": "/config/configuration.yml",
|
||||||
|
"mode": "0600",
|
||||||
|
"owner": "mapped-root",
|
||||||
|
"only_if_missing": true,
|
||||||
|
"content": "---\nserver:\n address: 'tcp://:9091'\n\nlog:\n level: 'info'\n\ntotp:\n issuer: 'Authelia'\n\nidentity_validation:\n reset_password:\n jwt_secret: 'configured-by-environment'\n\nauthentication_backend:\n file:\n path: '/config/users_database.yml'\n watch: true\n\naccess_control:\n default_policy: 'one_factor'\n\nsession:\n secret: 'configured-by-environment'\n cookies:\n - name: 'authelia_session'\n domain: '{{ env \"PROXMENUX_AUTHELIA_COOKIE_DOMAIN\" }}'\n authelia_url: '{{ env \"PROXMENUX_AUTHELIA_URL\" }}'\n expiration: '1 hour'\n inactivity: '5 minutes'\n\nstorage:\n encryption_key: 'configured-by-environment'\n local:\n path: '/config/db.sqlite3'\n\nnotifier:\n filesystem:\n filename: '/config/notification.txt'\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/usr/local/bin/proxmenux-authelia-bootstrap",
|
||||||
|
"mode": "0700",
|
||||||
|
"owner": "mapped-root",
|
||||||
|
"only_if_missing": false,
|
||||||
|
"content": "#!/bin/sh\nset -eu\numask 077\n\nusers_file=/config/users_database.yml\nif [ ! -s \"$users_file\" ]; then\n : \"${PROXMENUX_ADMIN_PASSWORD:?ProxMenux did not provide an initial administrator password}\"\n mkdir -p /config\n hash_output=$(authelia crypto hash generate argon2 --password \"$PROXMENUX_ADMIN_PASSWORD\" --no-confirm)\n password_hash=$(printf '%s\\n' \"$hash_output\" | sed -n 's/^Digest: //p')\n case \"$password_hash\" in\n '$argon2id$'*) ;;\n *) printf '%s\\n' 'Authelia did not return an Argon2id password hash' >&2; exit 1 ;;\n esac\n temporary_file=\"${users_file}.tmp.$$\"\n cat >\"$temporary_file\" <<EOF\nusers:\n admin:\n disabled: false\n displayname: 'Authelia Administrator'\n password: \"$password_hash\"\n groups:\n - 'admins'\nEOF\n chmod 0600 \"$temporary_file\"\n mv -f \"$temporary_file\" \"$users_file\"\nfi\nunset PROXMENUX_ADMIN_PASSWORD\nexec /app/entrypoint.sh \"$@\"\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"startup_healthcheck": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 9091,
|
||||||
|
"path": "/api/health",
|
||||||
|
"timeout_seconds": 240,
|
||||||
|
"request_timeout_seconds": 10,
|
||||||
|
"stability_seconds": 4,
|
||||||
|
"verify_tls": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"adaptations": [
|
||||||
|
{
|
||||||
|
"id": "dedicated-lxc-network",
|
||||||
|
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||||
|
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||||
|
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||||
|
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-environment-overlay",
|
||||||
|
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||||
|
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||||
|
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "stop-grace-period",
|
||||||
|
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||||
|
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||||
|
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||||
|
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-shm-size",
|
||||||
|
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||||
|
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||||
|
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-command",
|
||||||
|
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||||
|
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||||
|
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-process-runtime",
|
||||||
|
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||||
|
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||||
|
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-healthcheck",
|
||||||
|
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||||
|
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||||
|
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||||
|
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-cpu-priority",
|
||||||
|
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||||
|
"reason": "Both settings express relative CPU priority on different scales.",
|
||||||
|
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-resource-limits",
|
||||||
|
"upstream_behavior": "mem_limit sets the memory ceiling; ulimits sets process soft/hard resource limits.",
|
||||||
|
"native_lxc_behavior": "mem_limit supplies the editable Proxmox memory default, rounded up to MiB; ulimits maps to lxc.prlimit with -1 represented as unlimited.",
|
||||||
|
"reason": "Use native Proxmox memory and LXC prlimits, without a wrapper or changing the host kernel configuration.",
|
||||||
|
"behavioral_impact": "User-selected memory overrides Compose. Swap is a separate choice. Kernel restrictions still apply; nproc counts processes by real UID, not by container.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-identity",
|
||||||
|
"upstream_behavior": "Compose can set hostname, MAC address, extra hosts and attach a service to Docker networks.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies hostname and MAC to net0, writes additional host aliases into the LXC and uses its dedicated bridge connection for single-service networks.",
|
||||||
|
"reason": "A dedicated LXC has its own network namespace and does not need a Docker bridge per service.",
|
||||||
|
"behavioral_impact": "host-gateway resolves to the IPv4 address of the selected Proxmox bridge.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-mode",
|
||||||
|
"upstream_behavior": "Docker host mode removes Docker network isolation; bridge and default use a Docker-managed network.",
|
||||||
|
"native_lxc_behavior": "The OCI process uses the dedicated LXC network namespace directly, so host, bridge and default all listen on the LXC address without Docker NAT.",
|
||||||
|
"reason": "The LXC is the application host and already has its own address and port namespace.",
|
||||||
|
"behavioral_impact": "host means the LXC host, never the Proxmox host; this preserves Proxmox network isolation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-capabilities-and-sysctls",
|
||||||
|
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||||
|
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||||
|
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||||
|
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "docker-engine-metadata",
|
||||||
|
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||||
|
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||||
|
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||||
|
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-device-passthrough",
|
||||||
|
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||||
|
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||||
|
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-host-ipc",
|
||||||
|
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||||
|
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||||
|
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||||
|
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"compatibility": {
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"validated": false,
|
||||||
|
"supported_compose_keys": [
|
||||||
|
"cap_add",
|
||||||
|
"command",
|
||||||
|
"container_name",
|
||||||
|
"cpu_shares",
|
||||||
|
"devices",
|
||||||
|
"entrypoint",
|
||||||
|
"environment",
|
||||||
|
"extra_hosts",
|
||||||
|
"group_add",
|
||||||
|
"healthcheck",
|
||||||
|
"hostname",
|
||||||
|
"image",
|
||||||
|
"init",
|
||||||
|
"ipc",
|
||||||
|
"labels",
|
||||||
|
"logging",
|
||||||
|
"mac_address",
|
||||||
|
"mem_limit",
|
||||||
|
"network_mode",
|
||||||
|
"networks",
|
||||||
|
"ports",
|
||||||
|
"privileged",
|
||||||
|
"restart",
|
||||||
|
"runtime",
|
||||||
|
"security_opt",
|
||||||
|
"shm_size",
|
||||||
|
"stdin_open",
|
||||||
|
"stop_grace_period",
|
||||||
|
"stop_signal",
|
||||||
|
"sysctls",
|
||||||
|
"tty",
|
||||||
|
"ulimits",
|
||||||
|
"user",
|
||||||
|
"volumes",
|
||||||
|
"working_dir"
|
||||||
|
],
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"policy": "A single-image profile for the Authelia authentication portal. ProxMenux creates a unique initial administrator account; the local notifier and SQLite storage are kept in /config. Reverse-proxy trust and explicit access-control rules remain administrator settings."
|
||||||
|
},
|
||||||
|
"validation": {
|
||||||
|
"schema": "pending-local-validation",
|
||||||
|
"clean_install": "pending",
|
||||||
|
"service_health": "pending",
|
||||||
|
"restart_persistence": "pending",
|
||||||
|
"backup_restore": "pending",
|
||||||
|
"update_preserves_data": "pending"
|
||||||
|
},
|
||||||
|
"lifecycle": {
|
||||||
|
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||||
|
"registry_state": {
|
||||||
|
"resolved_architecture": null,
|
||||||
|
"resolved_digest": null,
|
||||||
|
"image_version_label": null,
|
||||||
|
"image_created": null
|
||||||
|
},
|
||||||
|
"change_detection": "compare-compose-sha256-and-resolved-latest-image-digest",
|
||||||
|
"automatic_unattended_updates": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
"source": "docker-compose"
|
"source": "docker-compose"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "LLAMA_ARG_CONTEXT_SIZE",
|
"name": "LLAMA_ARG_CTX_SIZE",
|
||||||
"example": "8192",
|
"example": "8192",
|
||||||
"required": true,
|
"required": true,
|
||||||
"sensitive": false,
|
"sensitive": false,
|
||||||
@@ -142,7 +142,7 @@
|
|||||||
],
|
],
|
||||||
"environment": [
|
"environment": [
|
||||||
"LLAMA_ARG_N_GPU_LAYERS=999",
|
"LLAMA_ARG_N_GPU_LAYERS=999",
|
||||||
"LLAMA_ARG_CONTEXT_SIZE=8192",
|
"LLAMA_ARG_CTX_SIZE=8192",
|
||||||
"LLAMA_ARG_MODELS_DIR=/models"
|
"LLAMA_ARG_MODELS_DIR=/models"
|
||||||
],
|
],
|
||||||
"devices": [
|
"devices": [
|
||||||
@@ -342,6 +342,28 @@
|
|||||||
"0x1002"
|
"0x1002"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"environment": [
|
||||||
|
{
|
||||||
|
"name": "LLAMA_ARG_FLASH_ATTN",
|
||||||
|
"value": "off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "LLAMA_ARG_UBATCH",
|
||||||
|
"value": "32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "LLAMA_ARG_BATCH",
|
||||||
|
"value": "128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GGML_VK_DISABLE_F16",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GGML_VK_DISABLE_ASYNC",
|
||||||
|
"value": "1"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,609 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "0.5.0",
|
||||||
|
"kind": "proxmenux.oci-template",
|
||||||
|
"id": "image-movistar-webdav-proxy",
|
||||||
|
"status": "generated-unvalidated",
|
||||||
|
"catalog_ui": {
|
||||||
|
"title": {
|
||||||
|
"en_US": "Movistar / O2 Cloud WebDAV Proxy"
|
||||||
|
},
|
||||||
|
"tagline": {
|
||||||
|
"en_US": "Access Movistar and O2 Cloud from WebDAV clients and backup tools."
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en_US": "Official uniextra image with a web dashboard for Movistar/O2 Cloud account linking. Persistent OAuth credentials, authenticated WebDAV and disk-backed temporary uploads."
|
||||||
|
},
|
||||||
|
"category": "backup",
|
||||||
|
"category_label": "Backup & Recovery",
|
||||||
|
"author": "uniextra",
|
||||||
|
"developer": "uniextra",
|
||||||
|
"icon": "https://raw.githubusercontent.com/uniextra/MovistarWebDAVProxy/main/static/favicon.svg",
|
||||||
|
"thumbnail": null,
|
||||||
|
"screenshots": [],
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"launch": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5000,
|
||||||
|
"path": "/"
|
||||||
|
},
|
||||||
|
"website": "https://github.com/uniextra/MovistarWebDAVProxy",
|
||||||
|
"documentation": "https://github.com/uniextra/MovistarWebDAVProxy#readme",
|
||||||
|
"repository": "https://github.com/uniextra/MovistarWebDAVProxy",
|
||||||
|
"tips": [
|
||||||
|
"Link your Movistar or O2 account from the dashboard after installation.",
|
||||||
|
"Use the container IP and port 8080 for WebDAV. Docker's published port 5050 is not used by native OCI LXC.",
|
||||||
|
"Temporary uploads use a separate disk volume, excluded from backups, to avoid filling RAM."
|
||||||
|
],
|
||||||
|
"mini_changelog": [],
|
||||||
|
"display_version": null,
|
||||||
|
"updated_at": null
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "uniextra",
|
||||||
|
"repository": "https://github.com/uniextra/MovistarWebDAVProxy",
|
||||||
|
"revision": "e48485bc8bdf9745caa6249fdc92db6d28214549",
|
||||||
|
"image_repository_url": "https://hub.docker.com/r/uniextra/movistar-webdav-proxy",
|
||||||
|
"readme_pushed_at": "",
|
||||||
|
"compose_sha256": "e51607e979c1a776ececda038caeffb4195f443ebc017eba753a4b4ff8fd5c28",
|
||||||
|
"generated_at": "2026-11-02T23:42:04+00:00",
|
||||||
|
"readme_raw_url": "https://raw.githubusercontent.com/uniextra/MovistarWebDAVProxy/e48485bc8bdf9745caa6249fdc92db6d28214549/README.md"
|
||||||
|
},
|
||||||
|
"container_contract": {
|
||||||
|
"service_name": "movistar-webdav-proxy",
|
||||||
|
"container_name": "movistar-webdav-proxy",
|
||||||
|
"image": {
|
||||||
|
"reference": "uniextra/movistar-webdav-proxy:latest",
|
||||||
|
"registry": "docker.io",
|
||||||
|
"repository": "uniextra/movistar-webdav-proxy",
|
||||||
|
"tag": "latest",
|
||||||
|
"digest": null,
|
||||||
|
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
|
||||||
|
},
|
||||||
|
"environment": [
|
||||||
|
{
|
||||||
|
"name": "WEBDAV_USER",
|
||||||
|
"example": "admin",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "docker-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "WEBDAV_PASSWORD",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "docker-compose",
|
||||||
|
"prompt": "WebDAV and dashboard password (leave empty to generate)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "REQUIRE_AUTH",
|
||||||
|
"example": "true",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "docker-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TOKENS_ENCRYPTION_KEY",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "docker-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MAX_UPLOAD_MB",
|
||||||
|
"example": "4096",
|
||||||
|
"required": false,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "docker-compose"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
{
|
||||||
|
"id": "tokens",
|
||||||
|
"container_path": "/app/tokens",
|
||||||
|
"compose_source_example": "./tokens",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 16
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "uploads",
|
||||||
|
"container_path": "/tmp",
|
||||||
|
"compose_source_example": "./tmp",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 16
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"container_port": 5000,
|
||||||
|
"published_example": 5000,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 8080,
|
||||||
|
"published_example": 8080,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"related_services": [],
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"stop_grace_period": null,
|
||||||
|
"original_compose": "services:\n movistar-webdav-proxy:\n image: uniextra/movistar-webdav-proxy:v2.1.0\n container_name: movistar-webdav-proxy\n restart: unless-stopped\n read_only: true\n tmpfs:\n - /tmp\n security_opt:\n - no-new-privileges:true\n environment:\n - WEBDAV_USER=${WEBDAV_USER:-}\n - WEBDAV_PASSWORD=${WEBDAV_PASSWORD:-}\n - WEBUI_USER=${WEBUI_USER:-}\n - WEBUI_PASSWORD=${WEBUI_PASSWORD:-}\n ports:\n - \"${BIND_IP:-0.0.0.0}:${WEB_PORT:-5000}:5000\" # Panel Web de gestión y logs (usa BIND_IP=127.0.0.1 para acceso solo local)\n - \"${BIND_IP:-0.0.0.0}:${WEBDAV_PORT:-5050}:8080\" # Endpoint WebDAV (Duplicati / Synology HyperBackup)\n volumes:\n - movistar_tokens:/app/tokens\n\nvolumes:\n movistar_tokens:\n name: movistar_webdav_tokens\n"
|
||||||
|
},
|
||||||
|
"compose_stack": {
|
||||||
|
"project_name": "movistar-webdav-proxy",
|
||||||
|
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||||
|
"user_experience": "single-application-install",
|
||||||
|
"main_service": "movistar-webdav-proxy",
|
||||||
|
"service_count": 1,
|
||||||
|
"services": [
|
||||||
|
{
|
||||||
|
"name": "movistar-webdav-proxy",
|
||||||
|
"image": "uniextra/movistar-webdav-proxy:latest",
|
||||||
|
"is_main": true,
|
||||||
|
"role": "frontend",
|
||||||
|
"vmid_offset": 0,
|
||||||
|
"depends_on": [],
|
||||||
|
"frontend_network": true,
|
||||||
|
"private_network": false,
|
||||||
|
"compose": {
|
||||||
|
"environment": {
|
||||||
|
"MAX_UPLOAD_MB": "4096",
|
||||||
|
"REQUIRE_AUTH": "true",
|
||||||
|
"TOKENS_ENCRYPTION_KEY": "${GENERATED_TOKENS_ENCRYPTION_KEY}",
|
||||||
|
"WEBDAV_PASSWORD": "${GENERATED_WEBDAV_PASSWORD}",
|
||||||
|
"WEBDAV_USER": "admin"
|
||||||
|
},
|
||||||
|
"image": "uniextra/movistar-webdav-proxy:latest",
|
||||||
|
"ports": [
|
||||||
|
"5000:5000",
|
||||||
|
"8080:8080"
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
"./tokens:/app/tokens",
|
||||||
|
"./tmp:/tmp"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"top_level": {
|
||||||
|
"name": "movistar-webdav-proxy"
|
||||||
|
},
|
||||||
|
"networking": {
|
||||||
|
"frontend": "selected-proxmox-bridge",
|
||||||
|
"private_required": false,
|
||||||
|
"private_creation": "automatic-create-if-missing",
|
||||||
|
"private_address_allocation": "automatic-static-address-per-service",
|
||||||
|
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||||
|
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||||
|
"prompt_user_for_private_network": false
|
||||||
|
},
|
||||||
|
"storage": [
|
||||||
|
{
|
||||||
|
"id": "movistar-webdav-proxy-volume-0",
|
||||||
|
"service": "movistar-webdav-proxy",
|
||||||
|
"container_path": "/app/tokens",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "movistar-webdav-proxy-volume-1",
|
||||||
|
"service": "movistar-webdav-proxy",
|
||||||
|
"container_path": "/tmp",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"orchestration": {
|
||||||
|
"reserve_vmids_atomically": 1,
|
||||||
|
"start_order": [
|
||||||
|
"movistar-webdav-proxy"
|
||||||
|
],
|
||||||
|
"stop_order": [
|
||||||
|
"movistar-webdav-proxy"
|
||||||
|
],
|
||||||
|
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||||
|
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||||
|
},
|
||||||
|
"installer_inputs": {
|
||||||
|
"prompted": [
|
||||||
|
"stack_name",
|
||||||
|
"base_vmid",
|
||||||
|
"rootfs_storage",
|
||||||
|
"persistent_data_destinations",
|
||||||
|
"frontend_bridge",
|
||||||
|
"frontend_ipv4_mode"
|
||||||
|
],
|
||||||
|
"automatic": [
|
||||||
|
"dependent_vmids",
|
||||||
|
"private_bridge",
|
||||||
|
"private_subnet",
|
||||||
|
"private_service_addresses",
|
||||||
|
"compose_service_aliases",
|
||||||
|
"generated_secrets",
|
||||||
|
"dependency_start_and_stop_order"
|
||||||
|
],
|
||||||
|
"generated_secrets": [
|
||||||
|
{
|
||||||
|
"id": "tokens-encryption-key",
|
||||||
|
"strategy": "generate-cryptographically-random-at-install",
|
||||||
|
"bindings": [
|
||||||
|
{
|
||||||
|
"service": "movistar-webdav-proxy",
|
||||||
|
"environment_variable": "TOKENS_ENCRYPTION_KEY"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "webdav-password",
|
||||||
|
"strategy": "generate-cryptographically-random-at-install",
|
||||||
|
"bindings": [
|
||||||
|
{
|
||||||
|
"service": "movistar-webdav-proxy",
|
||||||
|
"environment_variable": "WEBDAV_PASSWORD"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"first_run": {
|
||||||
|
"endpoints": [
|
||||||
|
{
|
||||||
|
"label": "Web dashboard",
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5000,
|
||||||
|
"path": "/",
|
||||||
|
"source": "upstream-documentation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "WebDAV",
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 8080,
|
||||||
|
"path": "/",
|
||||||
|
"source": "native-container-port"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"credentials": [
|
||||||
|
{
|
||||||
|
"label": "Web dashboard and WebDAV",
|
||||||
|
"type": "configured-or-installer-generated",
|
||||||
|
"username": "admin",
|
||||||
|
"username_environment": "WEBDAV_USER",
|
||||||
|
"password": null,
|
||||||
|
"password_environment": "WEBDAV_PASSWORD",
|
||||||
|
"change_required": false,
|
||||||
|
"source": "installer-generated",
|
||||||
|
"retrieval": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"runtime": "native-oci-lxc",
|
||||||
|
"technology_status": "proxmox-technology-preview",
|
||||||
|
"defaults": {
|
||||||
|
"unprivileged": true,
|
||||||
|
"ostype": "auto-from-image",
|
||||||
|
"cores": 1,
|
||||||
|
"memory_mb": 512,
|
||||||
|
"swap_mb": 512,
|
||||||
|
"rootfs_size_gb": 8,
|
||||||
|
"rootfs_storage": "local-lvm",
|
||||||
|
"volume_storage": "local-lvm",
|
||||||
|
"template_storage": "local",
|
||||||
|
"bridge": "vmbr0",
|
||||||
|
"ipv4": "dhcp",
|
||||||
|
"firewall": true,
|
||||||
|
"host_managed_network": true,
|
||||||
|
"onboot": false,
|
||||||
|
"features": [
|
||||||
|
"nesting=1"
|
||||||
|
],
|
||||||
|
"shutdown_timeout_seconds": 30
|
||||||
|
},
|
||||||
|
"image_metadata_policy": {
|
||||||
|
"entrypoint": "import-from-oci-image",
|
||||||
|
"cmd": "import-from-oci-image",
|
||||||
|
"environment": "import-image-env-then-apply-compose-overrides",
|
||||||
|
"user": "import-from-oci-image",
|
||||||
|
"working_dir": "import-from-oci-image",
|
||||||
|
"stop_signal": "import-from-oci-image"
|
||||||
|
},
|
||||||
|
"adaptations": [
|
||||||
|
{
|
||||||
|
"id": "imported-compose-source",
|
||||||
|
"upstream_behavior": "The source definition deploys the complete Docker Compose application model.",
|
||||||
|
"native_lxc_behavior": "The source model is preserved and remains blocked until every service option has a reviewed native Proxmox mapping.",
|
||||||
|
"reason": "Catalog import must not imply runtime compatibility.",
|
||||||
|
"behavioral_impact": "No automatic installation before review.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rolling-latest-image",
|
||||||
|
"upstream_behavior": "A discovered Compose may pin a release tag or digest.",
|
||||||
|
"native_lxc_behavior": "ProxMenux selects the same image repository with the latest tag for catalog installations.",
|
||||||
|
"reason": "The automatic catalog intentionally offers rolling latest images; pinned versions belong to the future manual installer.",
|
||||||
|
"behavioral_impact": "The installed release can be newer than the discovered Compose revision.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dedicated-lxc-network",
|
||||||
|
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||||
|
"native_lxc_behavior": "A reviewed native application will listen on its original container ports at a dedicated LXC address.",
|
||||||
|
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||||
|
"behavioral_impact": "Published ports are metadata; ProxMenux URLs use the matching container target port.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-shm-size",
|
||||||
|
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||||
|
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||||
|
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-command",
|
||||||
|
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||||
|
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||||
|
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-privileged-mode",
|
||||||
|
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||||
|
"native_lxc_behavior": "ProxMenux keeps the LXC unprivileged by default and exposes the broad Compose privilege request only as an explicit compatibility option.",
|
||||||
|
"reason": "A Compose privilege request is source metadata, not proof that the image technically requires a privileged LXC.",
|
||||||
|
"behavioral_impact": "A privileged LXC has weaker isolation from the Proxmox host.",
|
||||||
|
"validation": "native-equivalent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-process-runtime",
|
||||||
|
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||||
|
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||||
|
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-healthcheck",
|
||||||
|
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||||
|
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||||
|
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||||
|
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-cpu-priority",
|
||||||
|
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||||
|
"reason": "Both settings express relative CPU priority on different scales.",
|
||||||
|
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-resource-limits",
|
||||||
|
"upstream_behavior": "mem_limit sets the memory ceiling; ulimits sets process soft/hard resource limits.",
|
||||||
|
"native_lxc_behavior": "mem_limit supplies the editable Proxmox memory default, rounded up to MiB; ulimits maps to lxc.prlimit with -1 represented as unlimited.",
|
||||||
|
"reason": "Use native Proxmox memory and LXC prlimits, without a wrapper or changing the host kernel configuration.",
|
||||||
|
"behavioral_impact": "User-selected memory overrides Compose. Swap is a separate choice. Kernel restrictions still apply; nproc counts processes by real UID, not by container.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-identity",
|
||||||
|
"upstream_behavior": "Compose can set hostname, MAC address, extra hosts and attach a service to Docker networks.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies hostname and MAC to net0, writes additional host aliases into the LXC and uses its dedicated bridge connection for single-service networks.",
|
||||||
|
"reason": "A dedicated LXC has its own network namespace and does not need a Docker bridge per service.",
|
||||||
|
"behavioral_impact": "host-gateway resolves to the IPv4 address of the selected Proxmox bridge.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-mode",
|
||||||
|
"upstream_behavior": "Docker host mode removes Docker network isolation; bridge and default use a Docker-managed network.",
|
||||||
|
"native_lxc_behavior": "The OCI process uses the dedicated LXC network namespace directly, so host, bridge and default all listen on the LXC address without Docker NAT.",
|
||||||
|
"reason": "The LXC is the application host and already has its own address and port namespace.",
|
||||||
|
"behavioral_impact": "host means the LXC host, never the Proxmox host; this preserves Proxmox network isolation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-capabilities-and-sysctls",
|
||||||
|
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||||
|
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||||
|
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||||
|
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "docker-engine-metadata",
|
||||||
|
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||||
|
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||||
|
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||||
|
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-device-passthrough",
|
||||||
|
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||||
|
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||||
|
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-host-ipc",
|
||||||
|
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||||
|
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||||
|
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||||
|
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "disk-backed-upload-scratch",
|
||||||
|
"upstream_behavior": "Compose mounts /tmp as a tmpfs.",
|
||||||
|
"native_lxc_behavior": "A separate managed disk volume provides /tmp and is excluded from backups.",
|
||||||
|
"reason": "Uploads can reach 4096 MB; a disk-backed scratch volume avoids consuming the LXC RAM limit.",
|
||||||
|
"behavioral_impact": "Scratch data uses disk and can survive a restart; the application removes completed temporary uploads.",
|
||||||
|
"validation": "passed-in-lab"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "native-rootfs-permissions",
|
||||||
|
"upstream_behavior": "Docker Compose requests read_only for the root filesystem.",
|
||||||
|
"native_lxc_behavior": "Proxmox uses a writable native root disk; /app is owned by root, while the upstream entrypoint drops to UID 10001. Tokens and upload scratch have separate writable volumes.",
|
||||||
|
"reason": "The Proxmox pre-start setup requires a writable root disk. Protect application code through root ownership instead of declaring unsupported read-only startup.",
|
||||||
|
"behavioral_impact": "This is not a fully read-only root filesystem; the application user cannot replace the root-owned application directory or binaries.",
|
||||||
|
"validation": "passed-in-lab"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"installer_profile": {
|
||||||
|
"volume_preparations": [
|
||||||
|
{
|
||||||
|
"container_path": "/app",
|
||||||
|
"remove_lost_found": false,
|
||||||
|
"owner_strategy": "mapped-root",
|
||||||
|
"mode": "0755"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/app/tokens",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"mode": "0700"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/tmp",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"mode": "1777"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volume_owner": {
|
||||||
|
"uid": 10001,
|
||||||
|
"gid": 10001
|
||||||
|
},
|
||||||
|
"generated_sensitive_environment": {
|
||||||
|
"WEBDAV_PASSWORD": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 16,
|
||||||
|
"prompt": true
|
||||||
|
},
|
||||||
|
"TOKENS_ENCRYPTION_KEY": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 32,
|
||||||
|
"prompt": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"options": {
|
||||||
|
"no_new_privileges": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"startup_healthcheck": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5000,
|
||||||
|
"path": "/health",
|
||||||
|
"timeout_seconds": 90,
|
||||||
|
"request_timeout_seconds": 5,
|
||||||
|
"stability_seconds": 4,
|
||||||
|
"verify_tls": false
|
||||||
|
},
|
||||||
|
"completion_notes": [
|
||||||
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compatibility": {
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"validated": false,
|
||||||
|
"supported_compose_keys": [
|
||||||
|
"cap_add",
|
||||||
|
"command",
|
||||||
|
"container_name",
|
||||||
|
"cpu_shares",
|
||||||
|
"deploy",
|
||||||
|
"devices",
|
||||||
|
"entrypoint",
|
||||||
|
"environment",
|
||||||
|
"extra_hosts",
|
||||||
|
"group_add",
|
||||||
|
"healthcheck",
|
||||||
|
"hostname",
|
||||||
|
"image",
|
||||||
|
"init",
|
||||||
|
"ipc",
|
||||||
|
"labels",
|
||||||
|
"logging",
|
||||||
|
"mac_address",
|
||||||
|
"mem_limit",
|
||||||
|
"network_mode",
|
||||||
|
"networks",
|
||||||
|
"ports",
|
||||||
|
"privileged",
|
||||||
|
"restart",
|
||||||
|
"runtime",
|
||||||
|
"security_opt",
|
||||||
|
"shm_size",
|
||||||
|
"stdin_open",
|
||||||
|
"stop_grace_period",
|
||||||
|
"stop_signal",
|
||||||
|
"sysctls",
|
||||||
|
"tty",
|
||||||
|
"ulimits",
|
||||||
|
"user",
|
||||||
|
"volumes",
|
||||||
|
"working_dir"
|
||||||
|
],
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||||
|
},
|
||||||
|
"validation": {
|
||||||
|
"schema": "passed-at-generation",
|
||||||
|
"clean_install": "passed",
|
||||||
|
"service_health": "passed",
|
||||||
|
"restart_persistence": "passed",
|
||||||
|
"backup_restore": "pending",
|
||||||
|
"update_preserves_data": "pending"
|
||||||
|
},
|
||||||
|
"lifecycle": {
|
||||||
|
"update_strategy": "resolve-latest-image-then-apply-reviewed-native-lxc-update",
|
||||||
|
"registry_state": {
|
||||||
|
"resolved_architecture": null,
|
||||||
|
"resolved_digest": null,
|
||||||
|
"image_version_label": null,
|
||||||
|
"image_created": null
|
||||||
|
},
|
||||||
|
"change_detection": "compare-compose-sha256-and-resolved-latest-image-digest",
|
||||||
|
"automatic_unattended_updates": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -82,22 +82,6 @@
|
|||||||
"backup": true,
|
"backup": true,
|
||||||
"default_size_gb": 8
|
"default_size_gb": 8
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "volume-1",
|
|
||||||
"container_path": "/dev/net/tun",
|
|
||||||
"compose_source_example": "/dev/net/tun",
|
|
||||||
"read_only": false,
|
|
||||||
"required": true,
|
|
||||||
"installation_choice": [
|
|
||||||
"managed-volume",
|
|
||||||
"host-bind"
|
|
||||||
],
|
|
||||||
"default": "managed-volume",
|
|
||||||
"managed_volume": {
|
|
||||||
"backup": true,
|
|
||||||
"default_size_gb": 8
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"ports": [],
|
"ports": [],
|
||||||
@@ -180,17 +164,6 @@
|
|||||||
"shared_with_other_lxc": false,
|
"shared_with_other_lxc": false,
|
||||||
"source_path": null,
|
"source_path": null,
|
||||||
"source_path_prompt": null
|
"source_path_prompt": null
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "tailscale-volume-1",
|
|
||||||
"service": "tailscale",
|
|
||||||
"container_path": "/dev/net/tun",
|
|
||||||
"mode": "managed-volume",
|
|
||||||
"user_selectable": false,
|
|
||||||
"backup": true,
|
|
||||||
"shared_with_other_lxc": false,
|
|
||||||
"source_path": null,
|
|
||||||
"source_path_prompt": null
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"orchestration": {
|
"orchestration": {
|
||||||
@@ -288,6 +261,23 @@
|
|||||||
"owner_strategy": "mapped-root",
|
"owner_strategy": "mapped-root",
|
||||||
"only_when_mount_type": "managed-volume"
|
"only_when_mount_type": "managed-volume"
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"device_requests": [
|
||||||
|
{
|
||||||
|
"id": "dev-net-tun",
|
||||||
|
"kind": "character-device",
|
||||||
|
"purpose": "tun",
|
||||||
|
"enable_prompt": "Pass /dev/net/tun to the LXC",
|
||||||
|
"enabled_default": true,
|
||||||
|
"required_by_compose": true,
|
||||||
|
"path_prompt": "Host device for /dev/net/tun",
|
||||||
|
"host_path_default": "/dev/net/tun",
|
||||||
|
"container_path": "/dev/net/tun",
|
||||||
|
"mode": "preserve-host",
|
||||||
|
"deny_write": false,
|
||||||
|
"gid_strategy": "host-device-gid",
|
||||||
|
"source_mapping": "/dev/net/tun:/dev/net/tun"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"adaptations": [
|
"adaptations": [
|
||||||
|
|||||||
@@ -0,0 +1,585 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "0.5.0",
|
||||||
|
"kind": "proxmenux.oci-template",
|
||||||
|
"id": "image-airdcpp-webclient",
|
||||||
|
"status": "generated-unvalidated",
|
||||||
|
"catalog_ui": {
|
||||||
|
"title": {
|
||||||
|
"en_US": "AirDC++ Web Client",
|
||||||
|
"es_ES": "AirDC++ Web Client"
|
||||||
|
},
|
||||||
|
"tagline": {
|
||||||
|
"en_US": "Direct Connect file sharing with a web interface",
|
||||||
|
"es_ES": "Intercambio de archivos Direct Connect con interfaz web"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en_US": "AirDC++ Web Client using the community-maintained gangefors image. Configuration, downloads and shared content use separate persistent paths.",
|
||||||
|
"es_ES": "AirDC++ Web Client con la imagen comunitaria de gangefors. La configuración, las descargas y los archivos compartidos usan rutas persistentes separadas."
|
||||||
|
},
|
||||||
|
"category": "downloads",
|
||||||
|
"category_label": "Files & Downloads",
|
||||||
|
"author": "gangefors",
|
||||||
|
"developer": "AirDC++",
|
||||||
|
"icon": "https://raw.githubusercontent.com/airdcpp-web/airdcpp-webui/eeeea5025a5e720f38dac53ced8e002940f00a74/resources/images/logo.svg",
|
||||||
|
"thumbnail": null,
|
||||||
|
"screenshots": [],
|
||||||
|
"architectures": [
|
||||||
|
"amd64"
|
||||||
|
],
|
||||||
|
"launch": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5600,
|
||||||
|
"path": "/"
|
||||||
|
},
|
||||||
|
"website": "https://airdcpp-web.github.io/",
|
||||||
|
"documentation": "https://github.com/gangefors/docker-airdcpp-webclient",
|
||||||
|
"repository": "https://github.com/gangefors/docker-airdcpp-webclient",
|
||||||
|
"tips": [
|
||||||
|
"The upstream initial login is admin / password. Change it in Settings > System > Users before allowing access beyond a trusted LAN.",
|
||||||
|
"Configuration uses /.airdcpp on a managed Proxmox volume included in backups. /Downloads and /Share can use managed volumes or explicitly selected host directories.",
|
||||||
|
"Files under /Share are shared by AirDC++. Select the contents deliberately; router forwarding and hub configuration are separate administrator actions.",
|
||||||
|
"PUID and PGID default to 1000 and must be at least 101. The original entrypoint creates the application account; volume ownership follows these values.",
|
||||||
|
"Open HTTP port 5600 on the dedicated LXC address. HTTPS port 5601 uses the upstream self-signed certificate; use a trusted reverse proxy certificate for remote web access.",
|
||||||
|
"Incoming Direct Connect traffic uses TCP and UDP 21248 and TLS TCP 21249. ProxMenux keeps those native ports and does not configure your router."
|
||||||
|
],
|
||||||
|
"mini_changelog": [],
|
||||||
|
"display_version": null,
|
||||||
|
"updated_at": "2026-10-25"
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "gangefors",
|
||||||
|
"repository": "https://github.com/gangefors/docker-airdcpp-webclient",
|
||||||
|
"revision": "37f2e939c152fb2c0158bc83bc76cc972aed965e",
|
||||||
|
"image_repository_url": "https://hub.docker.com/r/gangefors/airdcpp-webclient",
|
||||||
|
"readme_pushed_at": "2026-10-25T11:51:53Z",
|
||||||
|
"compose_sha256": "4ce8aec542cfc3e7f5ca142e309a41f04aca444bd1724ca1741c96acb5c3d5bf",
|
||||||
|
"generated_at": "2026-11-03T11:47:04+00:00",
|
||||||
|
"default_branch": "master",
|
||||||
|
"readme_raw_url": "https://raw.githubusercontent.com/gangefors/docker-airdcpp-webclient/37f2e939c152fb2c0158bc83bc76cc972aed965e/docker-compose.yml"
|
||||||
|
},
|
||||||
|
"container_contract": {
|
||||||
|
"service_name": "airdcpp",
|
||||||
|
"container_name": "airdcpp",
|
||||||
|
"image": {
|
||||||
|
"reference": "docker.io/gangefors/airdcpp-webclient:latest",
|
||||||
|
"registry": "docker.io",
|
||||||
|
"repository": "docker.io/gangefors/airdcpp-webclient",
|
||||||
|
"tag": "latest",
|
||||||
|
"digest": null,
|
||||||
|
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
|
||||||
|
},
|
||||||
|
"environment": [
|
||||||
|
{
|
||||||
|
"name": "PUID",
|
||||||
|
"example": "1000",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "upstream-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PGID",
|
||||||
|
"example": "1000",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "upstream-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "UMASK",
|
||||||
|
"example": "0022",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "upstream-compose"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
{
|
||||||
|
"id": "config",
|
||||||
|
"container_path": "/.airdcpp",
|
||||||
|
"compose_source_example": "./config",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 16
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "downloads",
|
||||||
|
"container_path": "/Downloads",
|
||||||
|
"compose_source_example": "./downloads",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume",
|
||||||
|
"host-bind"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 32
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "share",
|
||||||
|
"container_path": "/Share",
|
||||||
|
"compose_source_example": "./share",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume",
|
||||||
|
"host-bind"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"container_port": 5600,
|
||||||
|
"published_example": 5600,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 5601,
|
||||||
|
"published_example": 5601,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 21248,
|
||||||
|
"published_example": 21248,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 21248,
|
||||||
|
"published_example": 21248,
|
||||||
|
"protocol": "udp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 21249,
|
||||||
|
"published_example": 21249,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"related_services": [],
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"stop_grace_period": null,
|
||||||
|
"original_compose": "name: airdcpp-webclient\nservices:\n airdcpp:\n image: docker.io/gangefors/airdcpp-webclient:latest\n restart: unless-stopped\n environment:\n PUID: '1000'\n PGID: '1000'\n UMASK: '0022'\n ports:\n - 5600:5600\n - 5601:5601\n - 21248:21248/tcp\n - 21248:21248/udp\n - 21249:21249/tcp\n volumes:\n - ./config:/.airdcpp\n - ./downloads:/Downloads\n - ./share:/Share\n"
|
||||||
|
},
|
||||||
|
"compose_stack": {
|
||||||
|
"project_name": "airdcpp-webclient",
|
||||||
|
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||||
|
"user_experience": "single-application-install",
|
||||||
|
"main_service": "airdcpp",
|
||||||
|
"service_count": 1,
|
||||||
|
"services": [
|
||||||
|
{
|
||||||
|
"name": "airdcpp",
|
||||||
|
"image": "docker.io/gangefors/airdcpp-webclient:latest",
|
||||||
|
"is_main": true,
|
||||||
|
"role": "frontend",
|
||||||
|
"vmid_offset": 0,
|
||||||
|
"depends_on": [],
|
||||||
|
"frontend_network": true,
|
||||||
|
"private_network": false,
|
||||||
|
"compose": {
|
||||||
|
"image": "docker.io/gangefors/airdcpp-webclient:latest",
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"environment": {
|
||||||
|
"PUID": "1000",
|
||||||
|
"PGID": "1000",
|
||||||
|
"UMASK": "0022"
|
||||||
|
},
|
||||||
|
"ports": [
|
||||||
|
"5600:5600",
|
||||||
|
"5601:5601",
|
||||||
|
"21248:21248/tcp",
|
||||||
|
"21248:21248/udp",
|
||||||
|
"21249:21249/tcp"
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
"./config:/.airdcpp",
|
||||||
|
"./downloads:/Downloads",
|
||||||
|
"./share:/Share"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"top_level": {
|
||||||
|
"name": "airdcpp-webclient"
|
||||||
|
},
|
||||||
|
"networking": {
|
||||||
|
"frontend": "selected-proxmox-bridge",
|
||||||
|
"private_required": false,
|
||||||
|
"private_creation": "automatic-create-if-missing",
|
||||||
|
"private_address_allocation": "automatic-static-address-per-service",
|
||||||
|
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||||
|
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||||
|
"prompt_user_for_private_network": false
|
||||||
|
},
|
||||||
|
"storage": [
|
||||||
|
{
|
||||||
|
"id": "airdcpp-volume-0",
|
||||||
|
"service": "airdcpp",
|
||||||
|
"container_path": "/.airdcpp",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "airdcpp-volume-1",
|
||||||
|
"service": "airdcpp",
|
||||||
|
"container_path": "/Downloads",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "airdcpp-volume-2",
|
||||||
|
"service": "airdcpp",
|
||||||
|
"container_path": "/Share",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"orchestration": {
|
||||||
|
"reserve_vmids_atomically": 1,
|
||||||
|
"start_order": [
|
||||||
|
"airdcpp"
|
||||||
|
],
|
||||||
|
"stop_order": [
|
||||||
|
"airdcpp"
|
||||||
|
],
|
||||||
|
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||||
|
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||||
|
},
|
||||||
|
"installer_inputs": {
|
||||||
|
"prompted": [
|
||||||
|
"stack_name",
|
||||||
|
"base_vmid",
|
||||||
|
"rootfs_storage",
|
||||||
|
"persistent_data_destinations",
|
||||||
|
"frontend_bridge",
|
||||||
|
"frontend_ipv4_mode"
|
||||||
|
],
|
||||||
|
"automatic": [
|
||||||
|
"dependent_vmids",
|
||||||
|
"private_bridge",
|
||||||
|
"private_subnet",
|
||||||
|
"private_service_addresses",
|
||||||
|
"compose_service_aliases",
|
||||||
|
"generated_secrets",
|
||||||
|
"dependency_start_and_stop_order"
|
||||||
|
],
|
||||||
|
"generated_secrets": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"first_run": {
|
||||||
|
"endpoints": [
|
||||||
|
{
|
||||||
|
"label": "Web UI",
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5600,
|
||||||
|
"path": "/",
|
||||||
|
"source": "https://github.com/gangefors/docker-airdcpp-webclient"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"credentials": [
|
||||||
|
{
|
||||||
|
"label": "AirDC++ administrator",
|
||||||
|
"type": "static-default",
|
||||||
|
"username": "admin",
|
||||||
|
"password": "password",
|
||||||
|
"change_required": true,
|
||||||
|
"source": "https://github.com/gangefors/docker-airdcpp-webclient#run-the-application"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"runtime": "native-oci-lxc",
|
||||||
|
"technology_status": "proxmox-technology-preview",
|
||||||
|
"defaults": {
|
||||||
|
"unprivileged": true,
|
||||||
|
"ostype": "auto-from-image",
|
||||||
|
"cores": 2,
|
||||||
|
"memory_mb": 1024,
|
||||||
|
"swap_mb": 512,
|
||||||
|
"rootfs_size_gb": 8,
|
||||||
|
"rootfs_storage": "local-lvm",
|
||||||
|
"volume_storage": "local-lvm",
|
||||||
|
"template_storage": "local",
|
||||||
|
"bridge": "vmbr0",
|
||||||
|
"ipv4": "dhcp",
|
||||||
|
"firewall": true,
|
||||||
|
"host_managed_network": true,
|
||||||
|
"onboot": false,
|
||||||
|
"features": [
|
||||||
|
"nesting=1"
|
||||||
|
],
|
||||||
|
"shutdown_timeout_seconds": 30
|
||||||
|
},
|
||||||
|
"image_metadata_policy": {
|
||||||
|
"entrypoint": "import-from-oci-image",
|
||||||
|
"cmd": "import-from-oci-image",
|
||||||
|
"environment": "import-image-env-then-apply-compose-overrides",
|
||||||
|
"user": "import-from-oci-image",
|
||||||
|
"working_dir": "import-from-oci-image",
|
||||||
|
"stop_signal": "import-from-oci-image"
|
||||||
|
},
|
||||||
|
"adaptations": [
|
||||||
|
{
|
||||||
|
"id": "imported-compose-source",
|
||||||
|
"upstream_behavior": "The source definition deploys the complete Docker Compose application model.",
|
||||||
|
"native_lxc_behavior": "The source model is preserved and remains blocked until every service option has a reviewed native Proxmox mapping.",
|
||||||
|
"reason": "Catalog import must not imply runtime compatibility.",
|
||||||
|
"behavioral_impact": "No automatic installation before review.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rolling-latest-image",
|
||||||
|
"upstream_behavior": "A discovered Compose may pin a release tag or digest.",
|
||||||
|
"native_lxc_behavior": "ProxMenux selects the same image repository with the latest tag for catalog installations.",
|
||||||
|
"reason": "The automatic catalog intentionally offers rolling latest images; pinned versions belong to the future manual installer.",
|
||||||
|
"behavioral_impact": "The installed release can be newer than the discovered Compose revision.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dedicated-lxc-network",
|
||||||
|
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||||
|
"native_lxc_behavior": "A reviewed native application will listen on its original container ports at a dedicated LXC address.",
|
||||||
|
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||||
|
"behavioral_impact": "Published ports are metadata; ProxMenux URLs use the matching container target port.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-shm-size",
|
||||||
|
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||||
|
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||||
|
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-command",
|
||||||
|
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||||
|
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||||
|
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-privileged-mode",
|
||||||
|
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||||
|
"native_lxc_behavior": "ProxMenux keeps the LXC unprivileged by default and exposes the broad Compose privilege request only as an explicit compatibility option.",
|
||||||
|
"reason": "A Compose privilege request is source metadata, not proof that the image technically requires a privileged LXC.",
|
||||||
|
"behavioral_impact": "A privileged LXC has weaker isolation from the Proxmox host.",
|
||||||
|
"validation": "native-equivalent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-process-runtime",
|
||||||
|
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||||
|
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||||
|
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-healthcheck",
|
||||||
|
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||||
|
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||||
|
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||||
|
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-cpu-priority",
|
||||||
|
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||||
|
"reason": "Both settings express relative CPU priority on different scales.",
|
||||||
|
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-resource-limits",
|
||||||
|
"upstream_behavior": "mem_limit sets the memory ceiling; ulimits sets process soft/hard resource limits.",
|
||||||
|
"native_lxc_behavior": "mem_limit supplies the editable Proxmox memory default, rounded up to MiB; ulimits maps to lxc.prlimit with -1 represented as unlimited.",
|
||||||
|
"reason": "Use native Proxmox memory and LXC prlimits, without a wrapper or changing the host kernel configuration.",
|
||||||
|
"behavioral_impact": "User-selected memory overrides Compose. Swap is a separate choice. Kernel restrictions still apply; nproc counts processes by real UID, not by container.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-identity",
|
||||||
|
"upstream_behavior": "Compose can set hostname, MAC address, extra hosts and attach a service to Docker networks.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies hostname and MAC to net0, writes additional host aliases into the LXC and uses its dedicated bridge connection for single-service networks.",
|
||||||
|
"reason": "A dedicated LXC has its own network namespace and does not need a Docker bridge per service.",
|
||||||
|
"behavioral_impact": "host-gateway resolves to the IPv4 address of the selected Proxmox bridge.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-mode",
|
||||||
|
"upstream_behavior": "Docker host mode removes Docker network isolation; bridge and default use a Docker-managed network.",
|
||||||
|
"native_lxc_behavior": "The OCI process uses the dedicated LXC network namespace directly, so host, bridge and default all listen on the LXC address without Docker NAT.",
|
||||||
|
"reason": "The LXC is the application host and already has its own address and port namespace.",
|
||||||
|
"behavioral_impact": "host means the LXC host, never the Proxmox host; this preserves Proxmox network isolation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-capabilities-and-sysctls",
|
||||||
|
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||||
|
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||||
|
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||||
|
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "docker-engine-metadata",
|
||||||
|
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||||
|
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||||
|
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||||
|
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-device-passthrough",
|
||||||
|
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||||
|
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||||
|
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-host-ipc",
|
||||||
|
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||||
|
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||||
|
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||||
|
"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": "/.airdcpp",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"only_when_mount_type": "managed-volume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/Downloads",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"only_when_mount_type": "managed-volume"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/Share",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"only_when_mount_type": "managed-volume"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"startup_healthcheck": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5600,
|
||||||
|
"path": "/index.html",
|
||||||
|
"timeout_seconds": 180,
|
||||||
|
"request_timeout_seconds": 5,
|
||||||
|
"stability_seconds": 4,
|
||||||
|
"verify_tls": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compatibility": {
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"validated": false,
|
||||||
|
"supported_compose_keys": [
|
||||||
|
"cap_add",
|
||||||
|
"command",
|
||||||
|
"container_name",
|
||||||
|
"cpu_shares",
|
||||||
|
"deploy",
|
||||||
|
"devices",
|
||||||
|
"entrypoint",
|
||||||
|
"environment",
|
||||||
|
"extra_hosts",
|
||||||
|
"group_add",
|
||||||
|
"healthcheck",
|
||||||
|
"hostname",
|
||||||
|
"image",
|
||||||
|
"init",
|
||||||
|
"ipc",
|
||||||
|
"labels",
|
||||||
|
"logging",
|
||||||
|
"mac_address",
|
||||||
|
"mem_limit",
|
||||||
|
"network_mode",
|
||||||
|
"networks",
|
||||||
|
"ports",
|
||||||
|
"privileged",
|
||||||
|
"restart",
|
||||||
|
"runtime",
|
||||||
|
"security_opt",
|
||||||
|
"shm_size",
|
||||||
|
"stdin_open",
|
||||||
|
"stop_grace_period",
|
||||||
|
"stop_signal",
|
||||||
|
"sysctls",
|
||||||
|
"tty",
|
||||||
|
"ulimits",
|
||||||
|
"user",
|
||||||
|
"volumes",
|
||||||
|
"working_dir"
|
||||||
|
],
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"policy": "Community image and single-LXC contract reviewed against the publisher Compose and entrypoint; Linux amd64 confirmed in the registry manifest. Runtime lifecycle checks remain pending."
|
||||||
|
},
|
||||||
|
"validation": {
|
||||||
|
"schema": "passed-at-generation",
|
||||||
|
"clean_install": "pending",
|
||||||
|
"service_health": "pending",
|
||||||
|
"restart_persistence": "pending",
|
||||||
|
"backup_restore": "pending",
|
||||||
|
"update_preserves_data": "pending",
|
||||||
|
"authenticated_login": "pending",
|
||||||
|
"advanced_install": "pending",
|
||||||
|
"host_bind_storage": "pending",
|
||||||
|
"managed_storage": "pending",
|
||||||
|
"removal": "pending"
|
||||||
|
},
|
||||||
|
"lifecycle": {
|
||||||
|
"update_strategy": "resolve-latest-image-then-apply-reviewed-native-lxc-update",
|
||||||
|
"registry_state": {
|
||||||
|
"resolved_architecture": null,
|
||||||
|
"resolved_digest": null,
|
||||||
|
"image_version_label": null,
|
||||||
|
"image_created": null
|
||||||
|
},
|
||||||
|
"change_detection": "compare-compose-sha256-and-resolved-latest-image-digest",
|
||||||
|
"automatic_unattended_updates": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,453 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "0.4.0",
|
||||||
|
"kind": "proxmenux.oci-template",
|
||||||
|
"id": "image-authelia",
|
||||||
|
"status": "generated-unvalidated",
|
||||||
|
"catalog_ui": {
|
||||||
|
"title": {
|
||||||
|
"en_US": "Authelia",
|
||||||
|
"es_ES": "Authelia"
|
||||||
|
},
|
||||||
|
"tagline": {
|
||||||
|
"en_US": "Single sign-on and multi-factor authentication",
|
||||||
|
"es_ES": "Inicio de sesión único y autenticación multifactor"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en_US": "An open-source authentication and authorization server for protecting web applications. This single-image profile provides a local SQLite database and file notifications; configure your domain, reverse proxy and access rules before protecting other services.",
|
||||||
|
"es_ES": "Servidor de autenticación y autorización de código abierto para proteger aplicaciones web. Este perfil de una sola imagen incluye una base de datos SQLite local y notificaciones en archivo; configura el dominio, el proxy inverso y las reglas de acceso antes de proteger otros servicios."
|
||||||
|
},
|
||||||
|
"category": "security",
|
||||||
|
"category_label": "Authentication & Security",
|
||||||
|
"author": "Authelia",
|
||||||
|
"developer": "Authelia",
|
||||||
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/authelia.webp",
|
||||||
|
"thumbnail": null,
|
||||||
|
"screenshots": [],
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"launch": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 9091,
|
||||||
|
"path": "/"
|
||||||
|
},
|
||||||
|
"website": "https://www.authelia.com/",
|
||||||
|
"documentation": "https://www.authelia.com/integration/deployment/docker/",
|
||||||
|
"repository": "https://github.com/authelia/authelia",
|
||||||
|
"tips": [
|
||||||
|
"The installer creates a unique admin password and stores only its Argon2id hash in /config/users_database.yml. The password is shown in the installation result.",
|
||||||
|
"Authelia requires an HTTPS portal URL and a cookie domain matching that hostname. If you use Nginx Proxy Manager, follow the official integration guide and configure trusted proxies and forward-auth separately.",
|
||||||
|
"The default notifier writes messages to /config/notification.txt. Configure SMTP in /config/configuration.yml if you want email delivery.",
|
||||||
|
"The initial access-control policy is one_factor. Add explicit access-control rules before attaching Authelia to protected proxy hosts."
|
||||||
|
],
|
||||||
|
"mini_changelog": [],
|
||||||
|
"display_version": "4.39.28",
|
||||||
|
"updated_at": "2026-09-17"
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "authelia",
|
||||||
|
"repository": "https://github.com/authelia/authelia",
|
||||||
|
"default_branch": "master",
|
||||||
|
"revision": "8da42b2348b0351c6284a2940a9c5eec3d4cd3fd",
|
||||||
|
"readme_raw_url": "https://raw.githubusercontent.com/authelia/authelia/v4.39.28/examples/compose/lite/compose.yml",
|
||||||
|
"readme_pushed_at": "2026-09-17T12:13:30Z",
|
||||||
|
"compose_sha256": "848ce0f70e502981a050ac200d9d1882978a6c3b0f9f0dfcc6d52ce66ca37fb5",
|
||||||
|
"generated_at": "2026-11-03T09:10:57+00:00",
|
||||||
|
"image_repository_url": "https://hub.docker.com/r/authelia/authelia"
|
||||||
|
},
|
||||||
|
"container_contract": {
|
||||||
|
"service_name": "authelia",
|
||||||
|
"container_name": "authelia",
|
||||||
|
"image": {
|
||||||
|
"reference": "docker.io/authelia/authelia:4.39.28",
|
||||||
|
"registry": "docker.io",
|
||||||
|
"repository": "docker.io/authelia/authelia",
|
||||||
|
"tag": "4.39.28",
|
||||||
|
"digest": null,
|
||||||
|
"pull_policy": "resolve-selected-tag-to-architecture-digest-at-install"
|
||||||
|
},
|
||||||
|
"environment": [
|
||||||
|
{
|
||||||
|
"name": "PROXMENUX_ADMIN_PASSWORD",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "proxmenux-first-start"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "proxmenux-generated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "AUTHELIA_SESSION_SECRET",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "proxmenux-generated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "AUTHELIA_STORAGE_ENCRYPTION_KEY",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "proxmenux-generated"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "X_AUTHELIA_CONFIG_FILTERS",
|
||||||
|
"example": "template",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "authelia-container"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PROXMENUX_AUTHELIA_COOKIE_DOMAIN",
|
||||||
|
"example": "",
|
||||||
|
"prompt": "Authelia session cookie domain for this portal (for example example.com)",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "administrator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PROXMENUX_AUTHELIA_URL",
|
||||||
|
"example": "",
|
||||||
|
"prompt": "Public HTTPS URL used to open this Authelia portal (for example https://auth.example.com)",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "administrator"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
{
|
||||||
|
"id": "config",
|
||||||
|
"container_path": "/config",
|
||||||
|
"compose_source_example": "./authelia",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"container_port": 9091,
|
||||||
|
"published_example": 9091,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"related_services": [],
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"stop_grace_period": null,
|
||||||
|
"original_compose": "services:\n authelia:\n entrypoint:\n - /bin/sh\n - /usr/local/bin/proxmenux-authelia-bootstrap\n environment:\n AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET: ${GENERATED_RESET_PASSWORD_JWT_SECRET}\n AUTHELIA_SESSION_SECRET: ${GENERATED_SESSION_SECRET}\n AUTHELIA_STORAGE_ENCRYPTION_KEY: ${GENERATED_STORAGE_ENCRYPTION_KEY}\n PROXMENUX_ADMIN_PASSWORD: ${GENERATED_ADMIN_PASSWORD}\n PROXMENUX_AUTHELIA_COOKIE_DOMAIN: ${AUTHELIA_COOKIE_DOMAIN}\n PROXMENUX_AUTHELIA_URL: ${AUTHELIA_URL}\n X_AUTHELIA_CONFIG_FILTERS: template\n image: docker.io/authelia/authelia:4.39.28\n ports:\n - 9091:9091\n restart: unless-stopped\n volumes:\n - ./authelia:/config\n"
|
||||||
|
},
|
||||||
|
"first_run": {
|
||||||
|
"endpoints": [
|
||||||
|
{
|
||||||
|
"label": "Authelia Web UI",
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 9091,
|
||||||
|
"path": "/",
|
||||||
|
"source": "official-image"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"credentials": [
|
||||||
|
{
|
||||||
|
"label": "Authelia administrator",
|
||||||
|
"type": "configured-or-installer-generated",
|
||||||
|
"username": "admin",
|
||||||
|
"password": null,
|
||||||
|
"password_environment": "PROXMENUX_ADMIN_PASSWORD",
|
||||||
|
"change_required": false,
|
||||||
|
"source": "Generated on first start and stored as an Argon2id hash in the persistent users file."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"runtime": "native-oci-lxc",
|
||||||
|
"technology_status": "proxmox-technology-preview",
|
||||||
|
"defaults": {
|
||||||
|
"unprivileged": true,
|
||||||
|
"ostype": "auto-from-image",
|
||||||
|
"cores": 2,
|
||||||
|
"memory_mb": 512,
|
||||||
|
"swap_mb": 512,
|
||||||
|
"rootfs_size_gb": 8,
|
||||||
|
"rootfs_storage": "local-lvm",
|
||||||
|
"volume_storage": "local-lvm",
|
||||||
|
"template_storage": "local",
|
||||||
|
"bridge": "vmbr0",
|
||||||
|
"ipv4": "dhcp",
|
||||||
|
"firewall": true,
|
||||||
|
"host_managed_network": true,
|
||||||
|
"onboot": false,
|
||||||
|
"features": [
|
||||||
|
"nesting=1"
|
||||||
|
],
|
||||||
|
"shutdown_timeout_seconds": 60
|
||||||
|
},
|
||||||
|
"image_metadata_policy": {
|
||||||
|
"entrypoint": "import-from-oci-image",
|
||||||
|
"cmd": "import-from-oci-image",
|
||||||
|
"environment": "import-image-env-then-apply-compose-overrides",
|
||||||
|
"user": "import-from-oci-image",
|
||||||
|
"working_dir": "import-from-oci-image",
|
||||||
|
"stop_signal": "import-from-oci-image"
|
||||||
|
},
|
||||||
|
"installer_profile": {
|
||||||
|
"runtime": {
|
||||||
|
"compose_entrypoint": [
|
||||||
|
"/bin/sh",
|
||||||
|
"/usr/local/bin/proxmenux-authelia-bootstrap"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"generated_sensitive_environment": {
|
||||||
|
"PROXMENUX_ADMIN_PASSWORD": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 24,
|
||||||
|
"prompt": false
|
||||||
|
},
|
||||||
|
"AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 32,
|
||||||
|
"prompt": false
|
||||||
|
},
|
||||||
|
"AUTHELIA_SESSION_SECRET": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 32,
|
||||||
|
"prompt": false
|
||||||
|
},
|
||||||
|
"AUTHELIA_STORAGE_ENCRYPTION_KEY": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 32,
|
||||||
|
"prompt": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimum_secret_length": {
|
||||||
|
"PROXMENUX_ADMIN_PASSWORD": 24,
|
||||||
|
"AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET": 32,
|
||||||
|
"AUTHELIA_SESSION_SECRET": 32,
|
||||||
|
"AUTHELIA_STORAGE_ENCRYPTION_KEY": 32
|
||||||
|
},
|
||||||
|
"generated_files": [
|
||||||
|
{
|
||||||
|
"container_path": "/config/configuration.yml",
|
||||||
|
"mode": "0600",
|
||||||
|
"owner": "mapped-root",
|
||||||
|
"only_if_missing": true,
|
||||||
|
"content": "---\nserver:\n address: 'tcp://:9091'\n\nlog:\n level: 'info'\n\ntotp:\n issuer: 'Authelia'\n\nidentity_validation:\n reset_password:\n jwt_secret: 'configured-by-environment'\n\nauthentication_backend:\n file:\n path: '/config/users_database.yml'\n watch: true\n\naccess_control:\n default_policy: 'one_factor'\n\nsession:\n secret: 'configured-by-environment'\n cookies:\n - name: 'authelia_session'\n domain: '{{ env \"PROXMENUX_AUTHELIA_COOKIE_DOMAIN\" }}'\n authelia_url: '{{ env \"PROXMENUX_AUTHELIA_URL\" }}'\n expiration: '1 hour'\n inactivity: '5 minutes'\n\nstorage:\n encryption_key: 'configured-by-environment'\n local:\n path: '/config/db.sqlite3'\n\nnotifier:\n filesystem:\n filename: '/config/notification.txt'\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/usr/local/bin/proxmenux-authelia-bootstrap",
|
||||||
|
"mode": "0700",
|
||||||
|
"owner": "mapped-root",
|
||||||
|
"only_if_missing": false,
|
||||||
|
"content": "#!/bin/sh\nset -eu\numask 077\n\nusers_file=/config/users_database.yml\nif [ ! -s \"$users_file\" ]; then\n : \"${PROXMENUX_ADMIN_PASSWORD:?ProxMenux did not provide an initial administrator password}\"\n mkdir -p /config\n hash_output=$(authelia crypto hash generate argon2 --password \"$PROXMENUX_ADMIN_PASSWORD\" --no-confirm)\n password_hash=$(printf '%s\\n' \"$hash_output\" | sed -n 's/^Digest: //p')\n case \"$password_hash\" in\n '$argon2id$'*) ;;\n *) printf '%s\\n' 'Authelia did not return an Argon2id password hash' >&2; exit 1 ;;\n esac\n temporary_file=\"${users_file}.tmp.$$\"\n cat >\"$temporary_file\" <<EOF\nusers:\n admin:\n disabled: false\n displayname: 'Authelia Administrator'\n password: \"$password_hash\"\n groups:\n - 'admins'\nEOF\n chmod 0600 \"$temporary_file\"\n mv -f \"$temporary_file\" \"$users_file\"\nfi\nunset PROXMENUX_ADMIN_PASSWORD\nexec /app/entrypoint.sh \"$@\"\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"startup_healthcheck": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 9091,
|
||||||
|
"path": "/api/health",
|
||||||
|
"timeout_seconds": 240,
|
||||||
|
"request_timeout_seconds": 10,
|
||||||
|
"stability_seconds": 4,
|
||||||
|
"verify_tls": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"adaptations": [
|
||||||
|
{
|
||||||
|
"id": "dedicated-lxc-network",
|
||||||
|
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||||
|
"native_lxc_behavior": "The application listens on the same container ports at its dedicated LXC address.",
|
||||||
|
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||||
|
"behavioral_impact": "Users open the LXC address instead of the Proxmox host address.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-environment-overlay",
|
||||||
|
"upstream_behavior": "Compose environment values override OCI image environment values.",
|
||||||
|
"native_lxc_behavior": "ProxMenux merges the same values into lxc.environment.runtime while the CT is stopped.",
|
||||||
|
"reason": "PVE imports image Env automatically; Compose values still need to override it.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "stop-grace-period",
|
||||||
|
"upstream_behavior": "Docker waits for Compose stop_grace_period before forcing termination.",
|
||||||
|
"native_lxc_behavior": "ProxMenux records the same timeout for its pct shutdown lifecycle operations.",
|
||||||
|
"reason": "Proxmox has no equivalent per-CT persistent restart-policy field; startup.down is not a shutdown timeout.",
|
||||||
|
"behavioral_impact": "Normal Proxmox node shutdown remains governed by the node-wide shutdown policy.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-shm-size",
|
||||||
|
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||||
|
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||||
|
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-command",
|
||||||
|
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||||
|
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||||
|
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-process-runtime",
|
||||||
|
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||||
|
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||||
|
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-healthcheck",
|
||||||
|
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||||
|
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||||
|
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||||
|
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-cpu-priority",
|
||||||
|
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||||
|
"reason": "Both settings express relative CPU priority on different scales.",
|
||||||
|
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-resource-limits",
|
||||||
|
"upstream_behavior": "mem_limit sets the memory ceiling; ulimits sets process soft/hard resource limits.",
|
||||||
|
"native_lxc_behavior": "mem_limit supplies the editable Proxmox memory default, rounded up to MiB; ulimits maps to lxc.prlimit with -1 represented as unlimited.",
|
||||||
|
"reason": "Use native Proxmox memory and LXC prlimits, without a wrapper or changing the host kernel configuration.",
|
||||||
|
"behavioral_impact": "User-selected memory overrides Compose. Swap is a separate choice. Kernel restrictions still apply; nproc counts processes by real UID, not by container.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-identity",
|
||||||
|
"upstream_behavior": "Compose can set hostname, MAC address, extra hosts and attach a service to Docker networks.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies hostname and MAC to net0, writes additional host aliases into the LXC and uses its dedicated bridge connection for single-service networks.",
|
||||||
|
"reason": "A dedicated LXC has its own network namespace and does not need a Docker bridge per service.",
|
||||||
|
"behavioral_impact": "host-gateway resolves to the IPv4 address of the selected Proxmox bridge.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-mode",
|
||||||
|
"upstream_behavior": "Docker host mode removes Docker network isolation; bridge and default use a Docker-managed network.",
|
||||||
|
"native_lxc_behavior": "The OCI process uses the dedicated LXC network namespace directly, so host, bridge and default all listen on the LXC address without Docker NAT.",
|
||||||
|
"reason": "The LXC is the application host and already has its own address and port namespace.",
|
||||||
|
"behavioral_impact": "host means the LXC host, never the Proxmox host; this preserves Proxmox network isolation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-capabilities-and-sysctls",
|
||||||
|
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||||
|
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||||
|
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||||
|
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "docker-engine-metadata",
|
||||||
|
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||||
|
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||||
|
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||||
|
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-device-passthrough",
|
||||||
|
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||||
|
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||||
|
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-host-ipc",
|
||||||
|
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||||
|
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||||
|
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||||
|
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"compatibility": {
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"validated": false,
|
||||||
|
"supported_compose_keys": [
|
||||||
|
"cap_add",
|
||||||
|
"command",
|
||||||
|
"container_name",
|
||||||
|
"cpu_shares",
|
||||||
|
"devices",
|
||||||
|
"entrypoint",
|
||||||
|
"environment",
|
||||||
|
"extra_hosts",
|
||||||
|
"group_add",
|
||||||
|
"healthcheck",
|
||||||
|
"hostname",
|
||||||
|
"image",
|
||||||
|
"init",
|
||||||
|
"ipc",
|
||||||
|
"labels",
|
||||||
|
"logging",
|
||||||
|
"mac_address",
|
||||||
|
"mem_limit",
|
||||||
|
"network_mode",
|
||||||
|
"networks",
|
||||||
|
"ports",
|
||||||
|
"privileged",
|
||||||
|
"restart",
|
||||||
|
"runtime",
|
||||||
|
"security_opt",
|
||||||
|
"shm_size",
|
||||||
|
"stdin_open",
|
||||||
|
"stop_grace_period",
|
||||||
|
"stop_signal",
|
||||||
|
"sysctls",
|
||||||
|
"tty",
|
||||||
|
"ulimits",
|
||||||
|
"user",
|
||||||
|
"volumes",
|
||||||
|
"working_dir"
|
||||||
|
],
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"policy": "A single-image profile for the Authelia authentication portal. ProxMenux creates a unique initial administrator account; the local notifier and SQLite storage are kept in /config. Reverse-proxy trust and explicit access-control rules remain administrator settings."
|
||||||
|
},
|
||||||
|
"validation": {
|
||||||
|
"schema": "pending-local-validation",
|
||||||
|
"clean_install": "pending",
|
||||||
|
"service_health": "pending",
|
||||||
|
"restart_persistence": "pending",
|
||||||
|
"backup_restore": "pending",
|
||||||
|
"update_preserves_data": "pending"
|
||||||
|
},
|
||||||
|
"lifecycle": {
|
||||||
|
"update_strategy": "replace-rootfs-from-new-oci-image-preserve-managed-volumes",
|
||||||
|
"registry_state": {
|
||||||
|
"resolved_architecture": null,
|
||||||
|
"resolved_digest": null,
|
||||||
|
"image_version_label": null,
|
||||||
|
"image_created": null
|
||||||
|
},
|
||||||
|
"change_detection": "compare-compose-sha256-and-resolved-latest-image-digest",
|
||||||
|
"automatic_unattended_updates": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
"source": "docker-compose"
|
"source": "docker-compose"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "LLAMA_ARG_CONTEXT_SIZE",
|
"name": "LLAMA_ARG_CTX_SIZE",
|
||||||
"example": "8192",
|
"example": "8192",
|
||||||
"required": true,
|
"required": true,
|
||||||
"sensitive": false,
|
"sensitive": false,
|
||||||
@@ -142,7 +142,7 @@
|
|||||||
],
|
],
|
||||||
"environment": [
|
"environment": [
|
||||||
"LLAMA_ARG_N_GPU_LAYERS=999",
|
"LLAMA_ARG_N_GPU_LAYERS=999",
|
||||||
"LLAMA_ARG_CONTEXT_SIZE=8192",
|
"LLAMA_ARG_CTX_SIZE=8192",
|
||||||
"LLAMA_ARG_MODELS_DIR=/models"
|
"LLAMA_ARG_MODELS_DIR=/models"
|
||||||
],
|
],
|
||||||
"devices": [
|
"devices": [
|
||||||
@@ -342,6 +342,28 @@
|
|||||||
"0x1002"
|
"0x1002"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"environment": [
|
||||||
|
{
|
||||||
|
"name": "LLAMA_ARG_FLASH_ATTN",
|
||||||
|
"value": "off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "LLAMA_ARG_UBATCH",
|
||||||
|
"value": "32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "LLAMA_ARG_BATCH",
|
||||||
|
"value": "128"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GGML_VK_DISABLE_F16",
|
||||||
|
"value": "1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GGML_VK_DISABLE_ASYNC",
|
||||||
|
"value": "1"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,609 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "0.5.0",
|
||||||
|
"kind": "proxmenux.oci-template",
|
||||||
|
"id": "image-movistar-webdav-proxy",
|
||||||
|
"status": "generated-unvalidated",
|
||||||
|
"catalog_ui": {
|
||||||
|
"title": {
|
||||||
|
"en_US": "Movistar / O2 Cloud WebDAV Proxy"
|
||||||
|
},
|
||||||
|
"tagline": {
|
||||||
|
"en_US": "Access Movistar and O2 Cloud from WebDAV clients and backup tools."
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en_US": "Official uniextra image with a web dashboard for Movistar/O2 Cloud account linking. Persistent OAuth credentials, authenticated WebDAV and disk-backed temporary uploads."
|
||||||
|
},
|
||||||
|
"category": "backup",
|
||||||
|
"category_label": "Backup & Recovery",
|
||||||
|
"author": "uniextra",
|
||||||
|
"developer": "uniextra",
|
||||||
|
"icon": "https://raw.githubusercontent.com/uniextra/MovistarWebDAVProxy/main/static/favicon.svg",
|
||||||
|
"thumbnail": null,
|
||||||
|
"screenshots": [],
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"launch": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5000,
|
||||||
|
"path": "/"
|
||||||
|
},
|
||||||
|
"website": "https://github.com/uniextra/MovistarWebDAVProxy",
|
||||||
|
"documentation": "https://github.com/uniextra/MovistarWebDAVProxy#readme",
|
||||||
|
"repository": "https://github.com/uniextra/MovistarWebDAVProxy",
|
||||||
|
"tips": [
|
||||||
|
"Link your Movistar or O2 account from the dashboard after installation.",
|
||||||
|
"Use the container IP and port 8080 for WebDAV. Docker's published port 5050 is not used by native OCI LXC.",
|
||||||
|
"Temporary uploads use a separate disk volume, excluded from backups, to avoid filling RAM."
|
||||||
|
],
|
||||||
|
"mini_changelog": [],
|
||||||
|
"display_version": null,
|
||||||
|
"updated_at": null
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"provider": "uniextra",
|
||||||
|
"repository": "https://github.com/uniextra/MovistarWebDAVProxy",
|
||||||
|
"revision": "e48485bc8bdf9745caa6249fdc92db6d28214549",
|
||||||
|
"image_repository_url": "https://hub.docker.com/r/uniextra/movistar-webdav-proxy",
|
||||||
|
"readme_pushed_at": "",
|
||||||
|
"compose_sha256": "e51607e979c1a776ececda038caeffb4195f443ebc017eba753a4b4ff8fd5c28",
|
||||||
|
"generated_at": "2026-11-02T23:42:04+00:00",
|
||||||
|
"readme_raw_url": "https://raw.githubusercontent.com/uniextra/MovistarWebDAVProxy/e48485bc8bdf9745caa6249fdc92db6d28214549/README.md"
|
||||||
|
},
|
||||||
|
"container_contract": {
|
||||||
|
"service_name": "movistar-webdav-proxy",
|
||||||
|
"container_name": "movistar-webdav-proxy",
|
||||||
|
"image": {
|
||||||
|
"reference": "uniextra/movistar-webdav-proxy:latest",
|
||||||
|
"registry": "docker.io",
|
||||||
|
"repository": "uniextra/movistar-webdav-proxy",
|
||||||
|
"tag": "latest",
|
||||||
|
"digest": null,
|
||||||
|
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
|
||||||
|
},
|
||||||
|
"environment": [
|
||||||
|
{
|
||||||
|
"name": "WEBDAV_USER",
|
||||||
|
"example": "admin",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "docker-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "WEBDAV_PASSWORD",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "docker-compose",
|
||||||
|
"prompt": "WebDAV and dashboard password (leave empty to generate)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "REQUIRE_AUTH",
|
||||||
|
"example": "true",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "docker-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TOKENS_ENCRYPTION_KEY",
|
||||||
|
"example": "",
|
||||||
|
"required": true,
|
||||||
|
"sensitive": true,
|
||||||
|
"source": "docker-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MAX_UPLOAD_MB",
|
||||||
|
"example": "4096",
|
||||||
|
"required": false,
|
||||||
|
"sensitive": false,
|
||||||
|
"source": "docker-compose"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
{
|
||||||
|
"id": "tokens",
|
||||||
|
"container_path": "/app/tokens",
|
||||||
|
"compose_source_example": "./tokens",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 16
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "uploads",
|
||||||
|
"container_path": "/tmp",
|
||||||
|
"compose_source_example": "./tmp",
|
||||||
|
"read_only": false,
|
||||||
|
"required": true,
|
||||||
|
"installation_choice": [
|
||||||
|
"managed-volume"
|
||||||
|
],
|
||||||
|
"default": "managed-volume",
|
||||||
|
"managed_volume": {
|
||||||
|
"backup": true,
|
||||||
|
"default_size_gb": 16
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"container_port": 5000,
|
||||||
|
"published_example": 5000,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_port": 8080,
|
||||||
|
"published_example": 8080,
|
||||||
|
"protocol": "tcp",
|
||||||
|
"required": true,
|
||||||
|
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"related_services": [],
|
||||||
|
"restart": "unless-stopped",
|
||||||
|
"stop_grace_period": null,
|
||||||
|
"original_compose": "services:\n movistar-webdav-proxy:\n image: uniextra/movistar-webdav-proxy:v2.1.0\n container_name: movistar-webdav-proxy\n restart: unless-stopped\n read_only: true\n tmpfs:\n - /tmp\n security_opt:\n - no-new-privileges:true\n environment:\n - WEBDAV_USER=${WEBDAV_USER:-}\n - WEBDAV_PASSWORD=${WEBDAV_PASSWORD:-}\n - WEBUI_USER=${WEBUI_USER:-}\n - WEBUI_PASSWORD=${WEBUI_PASSWORD:-}\n ports:\n - \"${BIND_IP:-0.0.0.0}:${WEB_PORT:-5000}:5000\" # Panel Web de gestión y logs (usa BIND_IP=127.0.0.1 para acceso solo local)\n - \"${BIND_IP:-0.0.0.0}:${WEBDAV_PORT:-5050}:8080\" # Endpoint WebDAV (Duplicati / Synology HyperBackup)\n volumes:\n - movistar_tokens:/app/tokens\n\nvolumes:\n movistar_tokens:\n name: movistar_webdav_tokens\n"
|
||||||
|
},
|
||||||
|
"compose_stack": {
|
||||||
|
"project_name": "movistar-webdav-proxy",
|
||||||
|
"deployment_model": "one-native-oci-lxc-per-compose-service",
|
||||||
|
"user_experience": "single-application-install",
|
||||||
|
"main_service": "movistar-webdav-proxy",
|
||||||
|
"service_count": 1,
|
||||||
|
"services": [
|
||||||
|
{
|
||||||
|
"name": "movistar-webdav-proxy",
|
||||||
|
"image": "uniextra/movistar-webdav-proxy:latest",
|
||||||
|
"is_main": true,
|
||||||
|
"role": "frontend",
|
||||||
|
"vmid_offset": 0,
|
||||||
|
"depends_on": [],
|
||||||
|
"frontend_network": true,
|
||||||
|
"private_network": false,
|
||||||
|
"compose": {
|
||||||
|
"environment": {
|
||||||
|
"MAX_UPLOAD_MB": "4096",
|
||||||
|
"REQUIRE_AUTH": "true",
|
||||||
|
"TOKENS_ENCRYPTION_KEY": "${GENERATED_TOKENS_ENCRYPTION_KEY}",
|
||||||
|
"WEBDAV_PASSWORD": "${GENERATED_WEBDAV_PASSWORD}",
|
||||||
|
"WEBDAV_USER": "admin"
|
||||||
|
},
|
||||||
|
"image": "uniextra/movistar-webdav-proxy:latest",
|
||||||
|
"ports": [
|
||||||
|
"5000:5000",
|
||||||
|
"8080:8080"
|
||||||
|
],
|
||||||
|
"volumes": [
|
||||||
|
"./tokens:/app/tokens",
|
||||||
|
"./tmp:/tmp"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"top_level": {
|
||||||
|
"name": "movistar-webdav-proxy"
|
||||||
|
},
|
||||||
|
"networking": {
|
||||||
|
"frontend": "selected-proxmox-bridge",
|
||||||
|
"private_required": false,
|
||||||
|
"private_creation": "automatic-create-if-missing",
|
||||||
|
"private_address_allocation": "automatic-static-address-per-service",
|
||||||
|
"service_discovery": "private-addresses-with-compose-service-host-aliases",
|
||||||
|
"dependency_external_access": "disabled-unless-service-publishes-ports",
|
||||||
|
"prompt_user_for_private_network": false
|
||||||
|
},
|
||||||
|
"storage": [
|
||||||
|
{
|
||||||
|
"id": "movistar-webdav-proxy-volume-0",
|
||||||
|
"service": "movistar-webdav-proxy",
|
||||||
|
"container_path": "/app/tokens",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "movistar-webdav-proxy-volume-1",
|
||||||
|
"service": "movistar-webdav-proxy",
|
||||||
|
"container_path": "/tmp",
|
||||||
|
"mode": "managed-volume",
|
||||||
|
"user_selectable": false,
|
||||||
|
"backup": true,
|
||||||
|
"shared_with_other_lxc": false,
|
||||||
|
"source_path": null,
|
||||||
|
"source_path_prompt": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"orchestration": {
|
||||||
|
"reserve_vmids_atomically": 1,
|
||||||
|
"start_order": [
|
||||||
|
"movistar-webdav-proxy"
|
||||||
|
],
|
||||||
|
"stop_order": [
|
||||||
|
"movistar-webdav-proxy"
|
||||||
|
],
|
||||||
|
"dependency_readiness": "compose-healthcheck-then-port-or-process-fallback",
|
||||||
|
"rollback_on_failure": "remove-new-rootfs-preserve-created-persistent-volumes"
|
||||||
|
},
|
||||||
|
"installer_inputs": {
|
||||||
|
"prompted": [
|
||||||
|
"stack_name",
|
||||||
|
"base_vmid",
|
||||||
|
"rootfs_storage",
|
||||||
|
"persistent_data_destinations",
|
||||||
|
"frontend_bridge",
|
||||||
|
"frontend_ipv4_mode"
|
||||||
|
],
|
||||||
|
"automatic": [
|
||||||
|
"dependent_vmids",
|
||||||
|
"private_bridge",
|
||||||
|
"private_subnet",
|
||||||
|
"private_service_addresses",
|
||||||
|
"compose_service_aliases",
|
||||||
|
"generated_secrets",
|
||||||
|
"dependency_start_and_stop_order"
|
||||||
|
],
|
||||||
|
"generated_secrets": [
|
||||||
|
{
|
||||||
|
"id": "tokens-encryption-key",
|
||||||
|
"strategy": "generate-cryptographically-random-at-install",
|
||||||
|
"bindings": [
|
||||||
|
{
|
||||||
|
"service": "movistar-webdav-proxy",
|
||||||
|
"environment_variable": "TOKENS_ENCRYPTION_KEY"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "webdav-password",
|
||||||
|
"strategy": "generate-cryptographically-random-at-install",
|
||||||
|
"bindings": [
|
||||||
|
{
|
||||||
|
"service": "movistar-webdav-proxy",
|
||||||
|
"environment_variable": "WEBDAV_PASSWORD"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"first_run": {
|
||||||
|
"endpoints": [
|
||||||
|
{
|
||||||
|
"label": "Web dashboard",
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5000,
|
||||||
|
"path": "/",
|
||||||
|
"source": "upstream-documentation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "WebDAV",
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 8080,
|
||||||
|
"path": "/",
|
||||||
|
"source": "native-container-port"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"credentials": [
|
||||||
|
{
|
||||||
|
"label": "Web dashboard and WebDAV",
|
||||||
|
"type": "configured-or-installer-generated",
|
||||||
|
"username": "admin",
|
||||||
|
"username_environment": "WEBDAV_USER",
|
||||||
|
"password": null,
|
||||||
|
"password_environment": "WEBDAV_PASSWORD",
|
||||||
|
"change_required": false,
|
||||||
|
"source": "installer-generated",
|
||||||
|
"retrieval": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"proxmox": {
|
||||||
|
"runtime": "native-oci-lxc",
|
||||||
|
"technology_status": "proxmox-technology-preview",
|
||||||
|
"defaults": {
|
||||||
|
"unprivileged": true,
|
||||||
|
"ostype": "auto-from-image",
|
||||||
|
"cores": 1,
|
||||||
|
"memory_mb": 512,
|
||||||
|
"swap_mb": 512,
|
||||||
|
"rootfs_size_gb": 8,
|
||||||
|
"rootfs_storage": "local-lvm",
|
||||||
|
"volume_storage": "local-lvm",
|
||||||
|
"template_storage": "local",
|
||||||
|
"bridge": "vmbr0",
|
||||||
|
"ipv4": "dhcp",
|
||||||
|
"firewall": true,
|
||||||
|
"host_managed_network": true,
|
||||||
|
"onboot": false,
|
||||||
|
"features": [
|
||||||
|
"nesting=1"
|
||||||
|
],
|
||||||
|
"shutdown_timeout_seconds": 30
|
||||||
|
},
|
||||||
|
"image_metadata_policy": {
|
||||||
|
"entrypoint": "import-from-oci-image",
|
||||||
|
"cmd": "import-from-oci-image",
|
||||||
|
"environment": "import-image-env-then-apply-compose-overrides",
|
||||||
|
"user": "import-from-oci-image",
|
||||||
|
"working_dir": "import-from-oci-image",
|
||||||
|
"stop_signal": "import-from-oci-image"
|
||||||
|
},
|
||||||
|
"adaptations": [
|
||||||
|
{
|
||||||
|
"id": "imported-compose-source",
|
||||||
|
"upstream_behavior": "The source definition deploys the complete Docker Compose application model.",
|
||||||
|
"native_lxc_behavior": "The source model is preserved and remains blocked until every service option has a reviewed native Proxmox mapping.",
|
||||||
|
"reason": "Catalog import must not imply runtime compatibility.",
|
||||||
|
"behavioral_impact": "No automatic installation before review.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rolling-latest-image",
|
||||||
|
"upstream_behavior": "A discovered Compose may pin a release tag or digest.",
|
||||||
|
"native_lxc_behavior": "ProxMenux selects the same image repository with the latest tag for catalog installations.",
|
||||||
|
"reason": "The automatic catalog intentionally offers rolling latest images; pinned versions belong to the future manual installer.",
|
||||||
|
"behavioral_impact": "The installed release can be newer than the discovered Compose revision.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dedicated-lxc-network",
|
||||||
|
"upstream_behavior": "Docker publishes selected container ports on the Docker host.",
|
||||||
|
"native_lxc_behavior": "A reviewed native application will listen on its original container ports at a dedicated LXC address.",
|
||||||
|
"reason": "A native LXC has its own address and does not require Docker port NAT.",
|
||||||
|
"behavioral_impact": "Published ports are metadata; ProxMenux URLs use the matching container target port.",
|
||||||
|
"validation": "pending-per-application"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-shm-size",
|
||||||
|
"upstream_behavior": "Compose sets the size of the container /dev/shm tmpfs.",
|
||||||
|
"native_lxc_behavior": "ProxMenux mounts a native LXC tmpfs at /dev/shm with the same requested capacity.",
|
||||||
|
"reason": "The OCI image runs directly as an LXC and therefore needs the equivalent Proxmox mount entry.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-command",
|
||||||
|
"upstream_behavior": "Compose replaces the image Cmd while retaining its Entrypoint.",
|
||||||
|
"native_lxc_behavior": "ProxMenux reads the official OCI Entrypoint and combines it with the Compose command as the native LXC init command.",
|
||||||
|
"reason": "Proxmox stores the effective OCI process as one entrypoint string.",
|
||||||
|
"behavioral_impact": "None expected.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-privileged-mode",
|
||||||
|
"upstream_behavior": "Compose selects whether the container runs in privileged mode.",
|
||||||
|
"native_lxc_behavior": "ProxMenux keeps the LXC unprivileged by default and exposes the broad Compose privilege request only as an explicit compatibility option.",
|
||||||
|
"reason": "A Compose privilege request is source metadata, not proof that the image technically requires a privileged LXC.",
|
||||||
|
"behavioral_impact": "A privileged LXC has weaker isolation from the Proxmox host.",
|
||||||
|
"validation": "native-equivalent"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-process-runtime",
|
||||||
|
"upstream_behavior": "Compose can replace Entrypoint, User and WorkingDir and request an init process or interactive terminal.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies the process overrides through native LXC init directives; lxc-init provides PID 1 supervision and the CT console provides terminal access.",
|
||||||
|
"reason": "The OCI process must start with the same identity, command and working directory without Docker.",
|
||||||
|
"behavioral_impact": "Compose stdin_open and tty become access through the Proxmox LXC console.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-healthcheck",
|
||||||
|
"upstream_behavior": "Docker periodically executes the declared container healthcheck.",
|
||||||
|
"native_lxc_behavior": "For a single-service LXC, ProxMenux translates HTTP localhost checks into a mandatory first-start service check.",
|
||||||
|
"reason": "Proxmox has no persistent Docker health state, while the installer still must detect a failed first boot.",
|
||||||
|
"behavioral_impact": "The check runs during installation rather than continuously after installation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-cpu-priority",
|
||||||
|
"upstream_behavior": "Docker cpu_shares sets a relative scheduling weight with 1024 as its neutral value.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts the relative weight to Proxmox cpuunits with 100 as its neutral value and lets the user review it.",
|
||||||
|
"reason": "Both settings express relative CPU priority on different scales.",
|
||||||
|
"behavioral_impact": "Rounding and Proxmox minimum limits can slightly change very low weights.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-resource-limits",
|
||||||
|
"upstream_behavior": "mem_limit sets the memory ceiling; ulimits sets process soft/hard resource limits.",
|
||||||
|
"native_lxc_behavior": "mem_limit supplies the editable Proxmox memory default, rounded up to MiB; ulimits maps to lxc.prlimit with -1 represented as unlimited.",
|
||||||
|
"reason": "Use native Proxmox memory and LXC prlimits, without a wrapper or changing the host kernel configuration.",
|
||||||
|
"behavioral_impact": "User-selected memory overrides Compose. Swap is a separate choice. Kernel restrictions still apply; nproc counts processes by real UID, not by container.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-identity",
|
||||||
|
"upstream_behavior": "Compose can set hostname, MAC address, extra hosts and attach a service to Docker networks.",
|
||||||
|
"native_lxc_behavior": "ProxMenux applies hostname and MAC to net0, writes additional host aliases into the LXC and uses its dedicated bridge connection for single-service networks.",
|
||||||
|
"reason": "A dedicated LXC has its own network namespace and does not need a Docker bridge per service.",
|
||||||
|
"behavioral_impact": "host-gateway resolves to the IPv4 address of the selected Proxmox bridge.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-network-mode",
|
||||||
|
"upstream_behavior": "Docker host mode removes Docker network isolation; bridge and default use a Docker-managed network.",
|
||||||
|
"native_lxc_behavior": "The OCI process uses the dedicated LXC network namespace directly, so host, bridge and default all listen on the LXC address without Docker NAT.",
|
||||||
|
"reason": "The LXC is the application host and already has its own address and port namespace.",
|
||||||
|
"behavioral_impact": "host means the LXC host, never the Proxmox host; this preserves Proxmox network isolation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-capabilities-and-sysctls",
|
||||||
|
"upstream_behavior": "Compose can add Linux capabilities and set kernel parameters in the container network namespace.",
|
||||||
|
"native_lxc_behavior": "ProxMenux validates requested capabilities against the native LXC capability set and writes namespaced network settings as lxc.sysctl directives.",
|
||||||
|
"reason": "A native OCI-LXC already starts with the namespaced capability set; lxc.cap.keep would incorrectly discard unrelated required capabilities.",
|
||||||
|
"behavioral_impact": "Host-global capabilities such as SYS_MODULE remain blocked until their host prerequisite is explicitly adapted.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "docker-engine-metadata",
|
||||||
|
"upstream_behavior": "Compose labels annotate Docker objects and the json-file logging driver rotates Docker-managed logs.",
|
||||||
|
"native_lxc_behavior": "Labels remain source metadata; Docker json-file settings are not applied because the OCI process runs directly under LXC.",
|
||||||
|
"reason": "There is no Docker object or Docker json-file log behind a native OCI-LXC application.",
|
||||||
|
"behavioral_impact": "Docker-only label consumers and Docker log-driver rotation do not exist in the native deployment.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-device-passthrough",
|
||||||
|
"upstream_behavior": "Compose passes host character devices or requests an NVIDIA runtime GPU.",
|
||||||
|
"native_lxc_behavior": "ProxMenux converts recognized device declarations to native Proxmox dev resources; NVIDIA profiles also inject compatible host driver libraries read-only.",
|
||||||
|
"reason": "Native OCI-LXC does not execute Docker device or NVIDIA runtime hooks.",
|
||||||
|
"behavioral_impact": "Hardware is exposed only after explicit user confirmation and host-path validation.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "compose-host-ipc",
|
||||||
|
"upstream_behavior": "ipc: host shares the Docker host IPC namespace, commonly to avoid Docker's small default shared-memory allocation.",
|
||||||
|
"native_lxc_behavior": "The application keeps the LXC IPC namespace and receives a configurable 1 GiB /dev/shm instead of sharing Proxmox host IPC.",
|
||||||
|
"reason": "Processes in a single native LXC already share one IPC namespace; retaining isolation is safer than exposing host IPC.",
|
||||||
|
"behavioral_impact": "The application cannot exchange IPC objects with processes on the Proxmox host.",
|
||||||
|
"validation": "not-requested-by-compose"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "disk-backed-upload-scratch",
|
||||||
|
"upstream_behavior": "Compose mounts /tmp as a tmpfs.",
|
||||||
|
"native_lxc_behavior": "A separate managed disk volume provides /tmp and is excluded from backups.",
|
||||||
|
"reason": "Uploads can reach 4096 MB; a disk-backed scratch volume avoids consuming the LXC RAM limit.",
|
||||||
|
"behavioral_impact": "Scratch data uses disk and can survive a restart; the application removes completed temporary uploads.",
|
||||||
|
"validation": "passed-in-lab"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "native-rootfs-permissions",
|
||||||
|
"upstream_behavior": "Docker Compose requests read_only for the root filesystem.",
|
||||||
|
"native_lxc_behavior": "Proxmox uses a writable native root disk; /app is owned by root, while the upstream entrypoint drops to UID 10001. Tokens and upload scratch have separate writable volumes.",
|
||||||
|
"reason": "The Proxmox pre-start setup requires a writable root disk. Protect application code through root ownership instead of declaring unsupported read-only startup.",
|
||||||
|
"behavioral_impact": "This is not a fully read-only root filesystem; the application user cannot replace the root-owned application directory or binaries.",
|
||||||
|
"validation": "passed-in-lab"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"installer_profile": {
|
||||||
|
"volume_preparations": [
|
||||||
|
{
|
||||||
|
"container_path": "/app",
|
||||||
|
"remove_lost_found": false,
|
||||||
|
"owner_strategy": "mapped-root",
|
||||||
|
"mode": "0755"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/app/tokens",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"mode": "0700"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"container_path": "/tmp",
|
||||||
|
"remove_lost_found": true,
|
||||||
|
"owner_strategy": "mapped-application-user",
|
||||||
|
"mode": "1777"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volume_owner": {
|
||||||
|
"uid": 10001,
|
||||||
|
"gid": 10001
|
||||||
|
},
|
||||||
|
"generated_sensitive_environment": {
|
||||||
|
"WEBDAV_PASSWORD": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 16,
|
||||||
|
"prompt": true
|
||||||
|
},
|
||||||
|
"TOKENS_ENCRYPTION_KEY": {
|
||||||
|
"strategy": "token-hex",
|
||||||
|
"bytes": 32,
|
||||||
|
"prompt": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"options": {
|
||||||
|
"no_new_privileges": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"startup_healthcheck": {
|
||||||
|
"scheme": "http",
|
||||||
|
"port": 5000,
|
||||||
|
"path": "/health",
|
||||||
|
"timeout_seconds": 90,
|
||||||
|
"request_timeout_seconds": 5,
|
||||||
|
"stability_seconds": 4,
|
||||||
|
"verify_tls": false
|
||||||
|
},
|
||||||
|
"completion_notes": [
|
||||||
|
"Open the web dashboard and link your Movistar/O2 account using its SMS flow.",
|
||||||
|
"WebDAV is available on container port 8080. Account linking is required before cloud file operations."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compatibility": {
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"validated": false,
|
||||||
|
"supported_compose_keys": [
|
||||||
|
"cap_add",
|
||||||
|
"command",
|
||||||
|
"container_name",
|
||||||
|
"cpu_shares",
|
||||||
|
"deploy",
|
||||||
|
"devices",
|
||||||
|
"entrypoint",
|
||||||
|
"environment",
|
||||||
|
"extra_hosts",
|
||||||
|
"group_add",
|
||||||
|
"healthcheck",
|
||||||
|
"hostname",
|
||||||
|
"image",
|
||||||
|
"init",
|
||||||
|
"ipc",
|
||||||
|
"labels",
|
||||||
|
"logging",
|
||||||
|
"mac_address",
|
||||||
|
"mem_limit",
|
||||||
|
"network_mode",
|
||||||
|
"networks",
|
||||||
|
"ports",
|
||||||
|
"privileged",
|
||||||
|
"restart",
|
||||||
|
"runtime",
|
||||||
|
"security_opt",
|
||||||
|
"shm_size",
|
||||||
|
"stdin_open",
|
||||||
|
"stop_grace_period",
|
||||||
|
"stop_signal",
|
||||||
|
"sysctls",
|
||||||
|
"tty",
|
||||||
|
"ulimits",
|
||||||
|
"user",
|
||||||
|
"volumes",
|
||||||
|
"working_dir"
|
||||||
|
],
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"policy": "Single-image definitions are installable when every declared Compose option has a native Proxmox translation. Multi-image and unsupported runtime features remain blocked until their orchestrator or mapping is available."
|
||||||
|
},
|
||||||
|
"validation": {
|
||||||
|
"schema": "passed-at-generation",
|
||||||
|
"clean_install": "passed",
|
||||||
|
"service_health": "passed",
|
||||||
|
"restart_persistence": "passed",
|
||||||
|
"backup_restore": "pending",
|
||||||
|
"update_preserves_data": "pending"
|
||||||
|
},
|
||||||
|
"lifecycle": {
|
||||||
|
"update_strategy": "resolve-latest-image-then-apply-reviewed-native-lxc-update",
|
||||||
|
"registry_state": {
|
||||||
|
"resolved_architecture": null,
|
||||||
|
"resolved_digest": null,
|
||||||
|
"image_version_label": null,
|
||||||
|
"image_created": null
|
||||||
|
},
|
||||||
|
"change_detection": "compare-compose-sha256-and-resolved-latest-image-digest",
|
||||||
|
"automatic_unattended_updates": false
|
||||||
|
}
|
||||||
|
}
|
||||||
+274
-178
@@ -77,7 +77,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Activepieces",
|
"title": "Activepieces",
|
||||||
"repository": "https://github.com/activepieces/activepieces",
|
"repository": "https://github.com/activepieces/activepieces",
|
||||||
"description": "Build and run automation flows from a self-hosted visual interface. This single-container profile uses Activepieces’ documented personal mode with embedded storage and an in-memory queue.",
|
"description": "Build and run automation flows from a self-hosted visual interface. This single-container profile uses Activepieces\u2019 documented personal mode with embedded storage and an in-memory queue.",
|
||||||
"website": "https://www.activepieces.com/",
|
"website": "https://www.activepieces.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/activepieces.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/activepieces.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -280,9 +280,9 @@
|
|||||||
"provider": "getalby",
|
"provider": "getalby",
|
||||||
"template_family": "imported-compose",
|
"template_family": "imported-compose",
|
||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Alby Hub ✨",
|
"title": "Alby Hub \u2728",
|
||||||
"repository": "https://ghcr.io/getalby/hub",
|
"repository": "https://ghcr.io/getalby/hub",
|
||||||
"description": "Alby Hub is an open-source, self-custodial Bitcoin Lightning wallet, with the easiest-to-use Lightning Network node for everyone.\nWhether you're an individual, creator, or developer, Alby Hub is your centre for seamless Bitcoin payments.\nEffortlessly connect to a variety of apps like the Alby Browser Extension or Alby Go mobile app, create sub-wallets for family and friends, and take full control of your funds—all within an intuitive interface and developer-ready APIs.\n\n**USEFUL LINKS**\n- [Source Repository](https://github.com/getAlby/hub)\n- [Support](https://support.getalby.com/)\n- [Marketing Site](https://albyhub.com/)\n- [Community of users and developers](https://discord.getalby.com)\n- [Feedback Board, feature requests, bug reports[(https://feedback.getalby.com)\n",
|
"description": "Alby Hub is an open-source, self-custodial Bitcoin Lightning wallet, with the easiest-to-use Lightning Network node for everyone.\nWhether you're an individual, creator, or developer, Alby Hub is your centre for seamless Bitcoin payments.\nEffortlessly connect to a variety of apps like the Alby Browser Extension or Alby Go mobile app, create sub-wallets for family and friends, and take full control of your funds\u2014all within an intuitive interface and developer-ready APIs.\n\n**USEFUL LINKS**\n- [Source Repository](https://github.com/getAlby/hub)\n- [Support](https://support.getalby.com/)\n- [Marketing Site](https://albyhub.com/)\n- [Community of users and developers](https://discord.getalby.com)\n- [Feedback Board, feature requests, bug reports[(https://feedback.getalby.com)\n",
|
||||||
"website": "https://albyhub.com/",
|
"website": "https://albyhub.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/alby-hub.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/alby-hub.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -1056,7 +1056,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "BentoPDF",
|
"title": "BentoPDF",
|
||||||
"repository": "https://ghcr.io/alam00000/bentopdf-simple",
|
"repository": "https://ghcr.io/alam00000/bentopdf-simple",
|
||||||
"description": "**Your PDFs never leave your device.** BentoPDF is a privacy-first PDF toolkit that runs entirely in your browser. Every merge, split, conversion, and edit happens locally on your machine — no file is ever uploaded to a server. More than 50 tools are bundled into one clean, fast, ad-free interface.\n\n**One app for every PDF job.** Organize and edit your documents (merge, split, reorder, rotate, crop, watermark, page numbers, redaction, annotations and forms), convert to and from PDF (images, Word, Excel, PowerPoint, EPUB, Markdown and more), run OCR, and secure your files with compression, encryption, digital signatures, and metadata cleanup.\n\n**Made for your private cloud.** Self-hosting BentoPDF on a private cloud device like self-hosted server gives your whole household or team a single, ad-free PDF workshop on hardware you control — fast over the local network, with your documents staying private by design.\n",
|
"description": "**Your PDFs never leave your device.** BentoPDF is a privacy-first PDF toolkit that runs entirely in your browser. Every merge, split, conversion, and edit happens locally on your machine \u2014 no file is ever uploaded to a server. More than 50 tools are bundled into one clean, fast, ad-free interface.\n\n**One app for every PDF job.** Organize and edit your documents (merge, split, reorder, rotate, crop, watermark, page numbers, redaction, annotations and forms), convert to and from PDF (images, Word, Excel, PowerPoint, EPUB, Markdown and more), run OCR, and secure your files with compression, encryption, digital signatures, and metadata cleanup.\n\n**Made for your private cloud.** Self-hosting BentoPDF on a private cloud device like self-hosted server gives your whole household or team a single, ad-free PDF workshop on hardware you control \u2014 fast over the local network, with your documents staying private by design.\n",
|
||||||
"website": "https://bentopdf.com",
|
"website": "https://bentopdf.com",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/bentopdf.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/bentopdf.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -2067,7 +2067,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Cloudflared",
|
"title": "Cloudflared",
|
||||||
"repository": "https://hub.docker.com/r/wisdomsky/cloudflared-web",
|
"repository": "https://hub.docker.com/r/wisdomsky/cloudflared-web",
|
||||||
"description": "Cloudflare Tunnel offers an easy way to expose web servers securely to the internet, without opening up firewall ports and configuring ACLs. Cloudflare Tunnel also ensures requests route through Cloudflare before reaching the web server, so you can be sure attack traffic is stopped with Cloudflare’s WAF and Unmetered DDoS mitigation, and authenticated with Access if you’ve enabled those features for your account.\n\nThe software provides a seamless way to securely expose web servers to the internet without configuring firewall ports or access control lists (ACLs). All requests are routed through Cloudflare before reaching your web server, leveraging Cloudflare’s Web Application Firewall (WAF) and unmetered DDoS mitigation to block attack traffic, with optional authentication via Cloudflare Access if enabled. With its intuitive Web interface and efficient tunnel management, this tool is the perfect solution for securely deploying web services.\n\n**Discover How to Connect self-hosted server to Cloudflare Tunnel**\nIntegrating self-hosted server with Cloudflare Tunnel allows you to securely expose local services to the internet without opening firewall ports, enabling seamless remote access. Below are two practical resources to guide you through the setup process:\n1. [**Cloudflare Official Tutorial**](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/): \n This tutorial provides detailed steps for creating and managing a Cloudflare Tunnel.\n2. [**Phiptech Practical Guide**](https://phiptech.com/how-to-setup-cloudflare-tunnel-and-expose-your-local-service-or-application/): \n This guide offers a concise, step-by-step walkthrough for setting up Cloudflare Tunnel on local devices like self-hosted server, with practical examples to help users easily expose services to the public internet.\n",
|
"description": "Cloudflare Tunnel offers an easy way to expose web servers securely to the internet, without opening up firewall ports and configuring ACLs. Cloudflare Tunnel also ensures requests route through Cloudflare before reaching the web server, so you can be sure attack traffic is stopped with Cloudflare\u2019s WAF and Unmetered DDoS mitigation, and authenticated with Access if you\u2019ve enabled those features for your account.\n\nThe software provides a seamless way to securely expose web servers to the internet without configuring firewall ports or access control lists (ACLs). All requests are routed through Cloudflare before reaching your web server, leveraging Cloudflare\u2019s Web Application Firewall (WAF) and unmetered DDoS mitigation to block attack traffic, with optional authentication via Cloudflare Access if enabled. With its intuitive Web interface and efficient tunnel management, this tool is the perfect solution for securely deploying web services.\n\n**Discover How to Connect self-hosted server to Cloudflare Tunnel**\nIntegrating self-hosted server with Cloudflare Tunnel allows you to securely expose local services to the internet without opening firewall ports, enabling seamless remote access. Below are two practical resources to guide you through the setup process:\n1. [**Cloudflare Official Tutorial**](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/): \n This tutorial provides detailed steps for creating and managing a Cloudflare Tunnel.\n2. [**Phiptech Practical Guide**](https://phiptech.com/how-to-setup-cloudflare-tunnel-and-expose-your-local-service-or-application/): \n This guide offers a concise, step-by-step walkthrough for setting up Cloudflare Tunnel on local devices like self-hosted server, with practical examples to help users easily expose services to the public internet.\n",
|
||||||
"website": "https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/",
|
"website": "https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/Cloudflared/icon.png",
|
"icon": "https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/Cloudflared/icon.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -2339,7 +2339,7 @@
|
|||||||
"title": "Cops",
|
"title": "Cops",
|
||||||
"repository_name": "docker-cops",
|
"repository_name": "docker-cops",
|
||||||
"repository": "https://github.com/linuxserver/docker-cops",
|
"repository": "https://github.com/linuxserver/docker-cops",
|
||||||
"description": "Cops by Sébastien Lucas, now maintained by MikesPub, stands for Calibre OPDS (and HTML) Php Server.",
|
"description": "Cops by S\u00e9bastien Lucas, now maintained by MikesPub, stands for Calibre OPDS (and HTML) Php Server.",
|
||||||
"website": "https://github.com/mikespub-org/seblucas-cops",
|
"website": "https://github.com/mikespub-org/seblucas-cops",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/linuxserver/docker-templates@master/linuxserver.io/img/cops-icon.png",
|
"icon": "https://cdn.jsdelivr.net/gh/linuxserver/docker-templates@master/linuxserver.io/img/cops-icon.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -2941,7 +2941,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Dgraph",
|
"title": "Dgraph",
|
||||||
"repository": "https://github.com/dgraph-io/dgraph",
|
"repository": "https://github.com/dgraph-io/dgraph",
|
||||||
"description": "Run Dgraph’s single-container standalone distribution, which starts its required local Dgraph components together.",
|
"description": "Run Dgraph\u2019s single-container standalone distribution, which starts its required local Dgraph components together.",
|
||||||
"website": "https://github.com/dgraph-io/dgraph",
|
"website": "https://github.com/dgraph-io/dgraph",
|
||||||
"icon": "https://cdn.jsdelivr.net/npm/simple-icons@15.2.0/icons/dgraph.svg",
|
"icon": "https://cdn.jsdelivr.net/npm/simple-icons@15.2.0/icons/dgraph.svg",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -3184,7 +3184,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Docmost",
|
"title": "Docmost",
|
||||||
"repository": "https://hub.docker.com/r/docmost/docmost",
|
"repository": "https://hub.docker.com/r/docmost/docmost",
|
||||||
"description": "Docmost is a self-hosted collaborative wiki and documentation tool designed for real-time collaboration, allowing multiple users to edit the same page simultaneously without conflicts. Its intuitive interface is ideal for teams managing knowledge bases, project documentation, or wikis, offering an efficient knowledge creation and sharing experience.\n\nThe tool's core features include real-time collaborative editing and space organization. It supports multiple users editing pages in real time for seamless collaboration and organizes pages into 'spaces' for teams, projects, or departments, each with independent permission settings. A rich text editor with Markdown shortcuts simplifies content creation. Built-in Draw.io, Excalidraw, and Mermaid tools provide robust diagramming capabilities.\n\nIt offers permissions management, assigning access via user groups for content security. Pages can be publicly shared via links for external access. Comments enhance communication and feedback, while page history tracks changes. Features like nested navigation, quick search, file attachments, and Markdown/HTML import/export are supported. The tool’s collaboration and flexibility deliver a modern documentation solution.\n\n**Key Features:**\n- Real-time collaborative editing for multiple users\n- Spaces for organizing pages by team, project or department\n- Permissions management with user group access control\n- Rich text editor with Markdown shortcuts\n- Built-in Draw.io, Excalidraw, Mermaid diagramming tools\n- Public page sharing via links\n- Page comments for communication and feedback\n- Page history, nested navigation, search, and file attachments\n\n**Learn More:**\n- [Docmost Official Website](https://docmost.com/)\n- [Docmost GitHub](https://github.com/docmost/docmost)\n",
|
"description": "Docmost is a self-hosted collaborative wiki and documentation tool designed for real-time collaboration, allowing multiple users to edit the same page simultaneously without conflicts. Its intuitive interface is ideal for teams managing knowledge bases, project documentation, or wikis, offering an efficient knowledge creation and sharing experience.\n\nThe tool's core features include real-time collaborative editing and space organization. It supports multiple users editing pages in real time for seamless collaboration and organizes pages into 'spaces' for teams, projects, or departments, each with independent permission settings. A rich text editor with Markdown shortcuts simplifies content creation. Built-in Draw.io, Excalidraw, and Mermaid tools provide robust diagramming capabilities.\n\nIt offers permissions management, assigning access via user groups for content security. Pages can be publicly shared via links for external access. Comments enhance communication and feedback, while page history tracks changes. Features like nested navigation, quick search, file attachments, and Markdown/HTML import/export are supported. The tool\u2019s collaboration and flexibility deliver a modern documentation solution.\n\n**Key Features:**\n- Real-time collaborative editing for multiple users\n- Spaces for organizing pages by team, project or department\n- Permissions management with user group access control\n- Rich text editor with Markdown shortcuts\n- Built-in Draw.io, Excalidraw, Mermaid diagramming tools\n- Public page sharing via links\n- Page comments for communication and feedback\n- Page history, nested navigation, search, and file attachments\n\n**Learn More:**\n- [Docmost Official Website](https://docmost.com/)\n- [Docmost GitHub](https://github.com/docmost/docmost)\n",
|
||||||
"website": "https://docmost.com/",
|
"website": "https://docmost.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/docmost.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/docmost.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -4242,7 +4242,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "FalkorDB",
|
"title": "FalkorDB",
|
||||||
"repository": "https://github.com/FalkorDB/FalkorDB",
|
"repository": "https://github.com/FalkorDB/FalkorDB",
|
||||||
"description": "Explore and query property graphs using FalkorDB’s Redis-compatible server and bundled browser UI in one image.",
|
"description": "Explore and query property graphs using FalkorDB\u2019s Redis-compatible server and bundled browser UI in one image.",
|
||||||
"website": "https://github.com/FalkorDB/FalkorDB",
|
"website": "https://github.com/FalkorDB/FalkorDB",
|
||||||
"icon": "https://github.com/FalkorDB.png",
|
"icon": "https://github.com/FalkorDB.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -4470,7 +4470,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "FileFlows",
|
"title": "FileFlows",
|
||||||
"repository": "https://hub.docker.com/r/revenz/fileflows",
|
"repository": "https://hub.docker.com/r/revenz/fileflows",
|
||||||
"description": "Save storage space with efficient file processing.\n\nFileFlows lets you monitor and process any file type with custom flows. Videos, audio, images, archives, comics, eBooks—you name it!\n",
|
"description": "Save storage space with efficient file processing.\n\nFileFlows lets you monitor and process any file type with custom flows. Videos, audio, images, archives, comics, eBooks\u2014you name it!\n",
|
||||||
"website": "https://fileflows.com/",
|
"website": "https://fileflows.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/fileflows.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/fileflows.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -4602,7 +4602,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Firefly",
|
"title": "Firefly",
|
||||||
"repository": "https://hub.docker.com/r/uusec/firefly",
|
"repository": "https://hub.docker.com/r/uusec/firefly",
|
||||||
"description": "Firefly is a simple and easy to install WireGuard server software, which can be widely used in scenarios such as remote networking, remote work, and expose a local server behind a NAT or firewall to the internet. 🎯 Features 🟢 Provide a simple and easy-to-use web management UI 🟣 Supports access to all WireGuard clients 🟡 No need for system installation of WireGuard components 🟠 Single file, no additional library dependencies 🔴 Automatically apply for free SSL certificate",
|
"description": "Firefly is a simple and easy to install WireGuard server software, which can be widely used in scenarios such as remote networking, remote work, and expose a local server behind a NAT or firewall to the internet. \ud83c\udfaf Features \ud83d\udfe2 Provide a simple and easy-to-use web management UI \ud83d\udfe3 Supports access to all WireGuard clients \ud83d\udfe1 No need for system installation of WireGuard components \ud83d\udfe0 Single file, no additional library dependencies \ud83d\udd34 Automatically apply for free SSL certificate",
|
||||||
"website": "https://qq.uusec.com/",
|
"website": "https://qq.uusec.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@main/webp/firefly.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@main/webp/firefly.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -6547,7 +6547,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Huginn",
|
"title": "Huginn",
|
||||||
"repository": "https://github.com/huginn/huginn",
|
"repository": "https://github.com/huginn/huginn",
|
||||||
"description": "A self-hosted automation platform whose agents can watch websites and services, transform events, and trigger actions. Uses Huginn’s all-in-one image.",
|
"description": "A self-hosted automation platform whose agents can watch websites and services, transform events, and trigger actions. Uses Huginn\u2019s all-in-one image.",
|
||||||
"website": "https://github.com/huginn/huginn",
|
"website": "https://github.com/huginn/huginn",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/huginn.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/huginn.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -6748,7 +6748,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Index-TTS",
|
"title": "Index-TTS",
|
||||||
"repository": "https://hub.docker.com/r/icewhaletech/index-tts",
|
"repository": "https://hub.docker.com/r/icewhaletech/index-tts",
|
||||||
"description": "IndexTTS2 is an advanced zero-shot text-to-speech model that innovatively achieves complete decoupling of emotional expression and speaker identity. The model supports precise speech duration control and multimodal emotion control, capable of maintaining the target timbre while accurately reproducing the specified emotional intonation.\n\nThe model employs a three-stage training paradigm and introduces GPT latent representations, ensuring excellent speech clarity and stability even under high emotional expression. Through the Qwen-based soft instruction mechanism, users can easily control the emotional characteristics of generated speech using natural language descriptions.\n\nIn multi-dataset evaluations, IndexTTS2 surpasses existing zero-shot TTS models in key metrics such as word error rate, speaker similarity, and emotion fidelity, providing industry-leading speech synthesis quality.\n\n**Key Features:**\n- Zero-shot TTS capability to replicate any timbre without training\n- Independent control of emotion and timbre with multimodal emotion input\n- Precise duration control with explicit token count specification for perfect audio-video synchronization\n- Natural language-based emotion control to guide speech generation through text descriptions\n\n**Additional Notes:**\n- Please ensure available memory > 12 GB, otherwise the application may not run properly\n- This application runs on CPU by default. This mode has low computational efficiency and will cause extremely high resource consumption and potential system instability. For optimal performance and stability, it is strongly recommended to use NVIDIA GPU to run this application\n- If you need to use NVIDIA GPU, please select \"Custom Install\" and enable the GPU option (supported in self-hosted server 1.5.0 and above)\n- For NVIDIA GPU usage, ≥ 8 GB VRAM is required (recommended for optimal performance)\n- For NVIDIA GPU usage, NVIDIA CUDA Toolkit version ≥ 12.8 is required\n\n**Learn More:**\n- [IndexTTS GitHub](https://github.com/index-tts/index-tts)\n",
|
"description": "IndexTTS2 is an advanced zero-shot text-to-speech model that innovatively achieves complete decoupling of emotional expression and speaker identity. The model supports precise speech duration control and multimodal emotion control, capable of maintaining the target timbre while accurately reproducing the specified emotional intonation.\n\nThe model employs a three-stage training paradigm and introduces GPT latent representations, ensuring excellent speech clarity and stability even under high emotional expression. Through the Qwen-based soft instruction mechanism, users can easily control the emotional characteristics of generated speech using natural language descriptions.\n\nIn multi-dataset evaluations, IndexTTS2 surpasses existing zero-shot TTS models in key metrics such as word error rate, speaker similarity, and emotion fidelity, providing industry-leading speech synthesis quality.\n\n**Key Features:**\n- Zero-shot TTS capability to replicate any timbre without training\n- Independent control of emotion and timbre with multimodal emotion input\n- Precise duration control with explicit token count specification for perfect audio-video synchronization\n- Natural language-based emotion control to guide speech generation through text descriptions\n\n**Additional Notes:**\n- Please ensure available memory > 12 GB, otherwise the application may not run properly\n- This application runs on CPU by default. This mode has low computational efficiency and will cause extremely high resource consumption and potential system instability. For optimal performance and stability, it is strongly recommended to use NVIDIA GPU to run this application\n- If you need to use NVIDIA GPU, please select \"Custom Install\" and enable the GPU option (supported in self-hosted server 1.5.0 and above)\n- For NVIDIA GPU usage, \u2265 8 GB VRAM is required (recommended for optimal performance)\n- For NVIDIA GPU usage, NVIDIA CUDA Toolkit version \u2265 12.8 is required\n\n**Learn More:**\n- [IndexTTS GitHub](https://github.com/index-tts/index-tts)\n",
|
||||||
"website": "",
|
"website": "",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/Index-TTS/icon.png",
|
"icon": "https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/Index-TTS/icon.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -6908,7 +6908,7 @@
|
|||||||
"title": "Intellij Idea",
|
"title": "Intellij Idea",
|
||||||
"repository_name": "docker-intellij-idea",
|
"repository_name": "docker-intellij-idea",
|
||||||
"repository": "https://github.com/linuxserver/docker-intellij-idea",
|
"repository": "https://github.com/linuxserver/docker-intellij-idea",
|
||||||
"description": "IntelliJ IDEA helps you write code faster with tools that eliminate tedious tasks and let you focus on what matters – building great software.",
|
"description": "IntelliJ IDEA helps you write code faster with tools that eliminate tedious tasks and let you focus on what matters \u2013 building great software.",
|
||||||
"website": "https://www.jetbrains.com/idea/",
|
"website": "https://www.jetbrains.com/idea/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/linuxserver/docker-templates@master/linuxserver.io/img/intellij-idea-logo.png",
|
"icon": "https://cdn.jsdelivr.net/gh/linuxserver/docker-templates@master/linuxserver.io/img/intellij-idea-logo.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -7068,7 +7068,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Jaeger",
|
"title": "Jaeger",
|
||||||
"repository": "https://github.com/jaegertracing/jaeger",
|
"repository": "https://github.com/jaegertracing/jaeger",
|
||||||
"description": "Run Jaeger’s all-in-one image for collecting OTLP traces and viewing them in the web UI. This profile uses the built-in in-memory storage.",
|
"description": "Run Jaeger\u2019s all-in-one image for collecting OTLP traces and viewing them in the web UI. This profile uses the built-in in-memory storage.",
|
||||||
"website": "https://github.com/jaegertracing/jaeger",
|
"website": "https://github.com/jaegertracing/jaeger",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/jaeger.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/jaeger.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -7396,7 +7396,7 @@
|
|||||||
"title": "Kali Linux",
|
"title": "Kali Linux",
|
||||||
"repository_name": "docker-kali-linux",
|
"repository_name": "docker-kali-linux",
|
||||||
"repository": "https://github.com/linuxserver/docker-kali-linux",
|
"repository": "https://github.com/linuxserver/docker-kali-linux",
|
||||||
"description": "Kali-linux - is an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments. KALI LINUX ™ is a trademark of OffSec.",
|
"description": "Kali-linux - is an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments. KALI LINUX \u2122 is a trademark of OffSec.",
|
||||||
"website": "https://github.com/linuxserver/docker-kali-linux",
|
"website": "https://github.com/linuxserver/docker-kali-linux",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/kali-linux.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/kali-linux.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -7721,39 +7721,6 @@
|
|||||||
"hidden": false,
|
"hidden": false,
|
||||||
"template_id": "linuxserver-kimai"
|
"template_id": "linuxserver-kimai"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "kitchenowl",
|
|
||||||
"provider": "tombursch",
|
|
||||||
"template_family": "curated-profile",
|
|
||||||
"title": "KitchenOwl",
|
|
||||||
"repository": "https://github.com/TomBursch/kitchenowl",
|
|
||||||
"description": "Manage shared shopping lists, recipes and meal plans in one self-hosted app.",
|
|
||||||
"website": "https://kitchenowl.org/",
|
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/kitchenowl.webp",
|
|
||||||
"architectures": [
|
|
||||||
"amd64",
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"updated_at": "2026-11-01",
|
|
||||||
"main_image": "tombursch/kitchenowl-web:latest",
|
|
||||||
"category": "productivity",
|
|
||||||
"category_label": "Productivity & Workflows",
|
|
||||||
"replaces_discovered_ids": [],
|
|
||||||
"curated_path": "catalog/curated/kitchenowl.json",
|
|
||||||
"template_id": "image-kitchenowl",
|
|
||||||
"template": "apps/kitchenowl.json",
|
|
||||||
"template_status": "generated-unvalidated",
|
|
||||||
"hidden": false,
|
|
||||||
"automatic_install_candidate": true,
|
|
||||||
"untranslated_blockers": [],
|
|
||||||
"requires_privileged_lxc": false,
|
|
||||||
"optional_privileged_lxc": false,
|
|
||||||
"requires_host_pid_namespace": false,
|
|
||||||
"requires_relaxed_confinement": false,
|
|
||||||
"optional_relaxed_confinement": false,
|
|
||||||
"requires_security_confirmation": false,
|
|
||||||
"multi_container": true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "kiwix-serve",
|
"id": "kiwix-serve",
|
||||||
"provider": "Kiwix",
|
"provider": "Kiwix",
|
||||||
@@ -7950,39 +7917,6 @@
|
|||||||
"hidden": false,
|
"hidden": false,
|
||||||
"template_id": "image-kroma"
|
"template_id": "image-kroma"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "krusader",
|
|
||||||
"provider": "jlesage",
|
|
||||||
"template_family": "curated-profile",
|
|
||||||
"title": "Krusader",
|
|
||||||
"repository": "https://github.com/jlesage/docker-krusader",
|
|
||||||
"description": "Open Krusader in a browser and manage files from a directory you explicitly mount at /storage. The maintained jlesage image provides the graphical desktop; ProxMenux runs it as one native OCI LXC.",
|
|
||||||
"website": "https://krusader.org/",
|
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/krusader.webp",
|
|
||||||
"architectures": [
|
|
||||||
"amd64",
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"updated_at": null,
|
|
||||||
"main_image": "jlesage/krusader:latest",
|
|
||||||
"category": "desktop",
|
|
||||||
"category_label": "Browsers & Web Desktops",
|
|
||||||
"replaces_discovered_ids": [],
|
|
||||||
"curated_path": "catalog/curated/krusader.json",
|
|
||||||
"template_id": "image-krusader",
|
|
||||||
"template": "apps/krusader.json",
|
|
||||||
"template_status": "generated-unvalidated",
|
|
||||||
"hidden": false,
|
|
||||||
"automatic_install_candidate": true,
|
|
||||||
"untranslated_blockers": [],
|
|
||||||
"requires_privileged_lxc": false,
|
|
||||||
"optional_privileged_lxc": false,
|
|
||||||
"requires_host_pid_namespace": false,
|
|
||||||
"requires_relaxed_confinement": false,
|
|
||||||
"optional_relaxed_confinement": false,
|
|
||||||
"requires_security_confirmation": false,
|
|
||||||
"multi_container": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "label-studio",
|
"id": "label-studio",
|
||||||
"source_app_id": "label-studio",
|
"source_app_id": "label-studio",
|
||||||
@@ -8092,7 +8026,7 @@
|
|||||||
"title": "Ldap Auth",
|
"title": "Ldap Auth",
|
||||||
"repository_name": "docker-ldap-auth",
|
"repository_name": "docker-ldap-auth",
|
||||||
"repository": "https://github.com/linuxserver/docker-ldap-auth",
|
"repository": "https://github.com/linuxserver/docker-ldap-auth",
|
||||||
"description": "Ldap-auth software is for authenticating users who request protected resources from servers proxied by nginx. It includes a daemon (ldap-auth) that communicates with an authentication server, and a webserver daemon that generates an authentication cookie based on the user’s credentials. The daemons are written in Python for use with a Lightweight Directory Access Protocol (LDAP) authentication server (OpenLDAP or Microsoft Windows Active Directory 2003 and 2012).",
|
"description": "Ldap-auth software is for authenticating users who request protected resources from servers proxied by nginx. It includes a daemon (ldap-auth) that communicates with an authentication server, and a webserver daemon that generates an authentication cookie based on the user\u2019s credentials. The daemons are written in Python for use with a Lightweight Directory Access Protocol (LDAP) authentication server (OpenLDAP or Microsoft Windows Active Directory 2003 and 2012).",
|
||||||
"website": "https://github.com/nginxinc/nginx-ldap-auth",
|
"website": "https://github.com/nginxinc/nginx-ldap-auth",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/linuxserver/docker-templates@master/linuxserver.io/img/ldap-auth-logo.png",
|
"icon": "https://cdn.jsdelivr.net/gh/linuxserver/docker-templates@master/linuxserver.io/img/ldap-auth-logo.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -9550,7 +9484,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Memos",
|
"title": "Memos",
|
||||||
"repository": "https://hub.docker.com/r/neosmemo/memos",
|
"repository": "https://hub.docker.com/r/neosmemo/memos",
|
||||||
"description": "Memos is a lightweight, open-source, self-hosted note-taking application that offers a secure and streamlined solution for users prioritizing privacy and data control. All notes are stored on the user’s own server, eliminating risks associated with third-party cloud services. Its minimalist Web interface supports Markdown syntax and tag-based organization, enabling effortless capture of ideas, personal knowledge management, or small-scale team collaboration. The open-source design ensures transparency, long-term maintainability, and no subscription costs, making it ideal for users seeking data ownership and cost efficiency.\n\nDesigned for simplicity and efficiency, Memos caters to a variety of use cases. Whether jotting down daily thoughts, organizing study notes, or sharing task memos in small teams, Memos delivers a seamless experience through its intuitive tag system and Markdown formatting. Accessible via any web browser, it requires no proprietary clients or complex setup, allowing users to manage notes anytime, anywhere.\n\nWhether used for long-term personal knowledge archiving or as a lightweight tool for team collaboration, Memos offers a secure, flexible, and user-friendly solution, empowering users to maintain full control over their data while enjoying a streamlined note-taking experience.\n",
|
"description": "Memos is a lightweight, open-source, self-hosted note-taking application that offers a secure and streamlined solution for users prioritizing privacy and data control. All notes are stored on the user\u2019s own server, eliminating risks associated with third-party cloud services. Its minimalist Web interface supports Markdown syntax and tag-based organization, enabling effortless capture of ideas, personal knowledge management, or small-scale team collaboration. The open-source design ensures transparency, long-term maintainability, and no subscription costs, making it ideal for users seeking data ownership and cost efficiency.\n\nDesigned for simplicity and efficiency, Memos caters to a variety of use cases. Whether jotting down daily thoughts, organizing study notes, or sharing task memos in small teams, Memos delivers a seamless experience through its intuitive tag system and Markdown formatting. Accessible via any web browser, it requires no proprietary clients or complex setup, allowing users to manage notes anytime, anywhere.\n\nWhether used for long-term personal knowledge archiving or as a lightweight tool for team collaboration, Memos offers a secure, flexible, and user-friendly solution, empowering users to maintain full control over their data while enjoying a streamlined note-taking experience.\n",
|
||||||
"website": "https://usememos.com/",
|
"website": "https://usememos.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/memos.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/memos.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -9983,7 +9917,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Monica",
|
"title": "Monica",
|
||||||
"repository": "https://hub.docker.com/_/monica",
|
"repository": "https://hub.docker.com/_/monica",
|
||||||
"description": "Monica is a self-hosted personal relationship management tool that helps users document and organize interactions with family and friends via an intuitive Web interface, creating a personalized contact database. It is ideal for users balancing work and life, ensuring key personal connections are never missed.\n\nThe tool's core features include comprehensive contact management and smart reminders. It supports creating detailed contact profiles, logging personal details, relationships (e.g., family, friends), and how contacts were met. Users can set automatic reminders for birthdays, anniversaries, and other key dates, while tracking conversations, activities, and gift ideas. A diary feature records daily moods and significant moments, maintaining a clear life record.\n\nIt offers task and debt management to track to-dos or financial interactions. Users can upload photos and documents, favorite contacts, and organize relationships with labels for streamlined data management. Full control over local data ensures privacy. The tool’s intuitive operation and high flexibility deliver a modern relationship management solution.\n\n**Key Features:**\n- Comprehensive contact management with detailed profiles\n- Automatic reminders for birthdays, anniversaries, and key dates\n- Track conversations, activities, and gift ideas\n- Diary feature to record daily moods and moments\n- Task and debt management for to-dos and finances\n- Upload photos and documents, favorite contacts\n- Organize contacts with labels\n- Local data storage for privacy assurance\n\n**Learn More:**\n- [Monica Official Website](https://www.monicahq.com)\n- [Monica GitHub Repository](https://github.com/monicahq/monica)\n",
|
"description": "Monica is a self-hosted personal relationship management tool that helps users document and organize interactions with family and friends via an intuitive Web interface, creating a personalized contact database. It is ideal for users balancing work and life, ensuring key personal connections are never missed.\n\nThe tool's core features include comprehensive contact management and smart reminders. It supports creating detailed contact profiles, logging personal details, relationships (e.g., family, friends), and how contacts were met. Users can set automatic reminders for birthdays, anniversaries, and other key dates, while tracking conversations, activities, and gift ideas. A diary feature records daily moods and significant moments, maintaining a clear life record.\n\nIt offers task and debt management to track to-dos or financial interactions. Users can upload photos and documents, favorite contacts, and organize relationships with labels for streamlined data management. Full control over local data ensures privacy. The tool\u2019s intuitive operation and high flexibility deliver a modern relationship management solution.\n\n**Key Features:**\n- Comprehensive contact management with detailed profiles\n- Automatic reminders for birthdays, anniversaries, and key dates\n- Track conversations, activities, and gift ideas\n- Diary feature to record daily moods and moments\n- Task and debt management for to-dos and finances\n- Upload photos and documents, favorite contacts\n- Organize contacts with labels\n- Local data storage for privacy assurance\n\n**Learn More:**\n- [Monica Official Website](https://www.monicahq.com)\n- [Monica GitHub Repository](https://github.com/monicahq/monica)\n",
|
||||||
"website": "https://www.monicahq.com",
|
"website": "https://www.monicahq.com",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/monica.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/monica.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -10046,6 +9980,39 @@
|
|||||||
"hidden": false,
|
"hidden": false,
|
||||||
"template_id": "image-motioneye"
|
"template_id": "image-motioneye"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "movistar-webdav-proxy",
|
||||||
|
"provider": "uniextra",
|
||||||
|
"template_family": "curated-profile",
|
||||||
|
"title": "Movistar / O2 Cloud WebDAV Proxy",
|
||||||
|
"repository": "https://github.com/uniextra/MovistarWebDAVProxy",
|
||||||
|
"description": "Official uniextra image with a web dashboard for Movistar/O2 Cloud account linking. Persistent OAuth credentials, authenticated WebDAV and disk-backed temporary uploads.",
|
||||||
|
"website": "https://github.com/uniextra/MovistarWebDAVProxy",
|
||||||
|
"icon": "https://raw.githubusercontent.com/uniextra/MovistarWebDAVProxy/main/static/favicon.svg",
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"updated_at": null,
|
||||||
|
"main_image": "uniextra/movistar-webdav-proxy:latest",
|
||||||
|
"category": "backup",
|
||||||
|
"category_label": "Backup & Recovery",
|
||||||
|
"replaces_discovered_ids": [],
|
||||||
|
"curated_path": "catalog/curated/movistar-webdav-proxy.json",
|
||||||
|
"template_id": "image-movistar-webdav-proxy",
|
||||||
|
"template": "apps/movistar-webdav-proxy.json",
|
||||||
|
"template_status": "generated-unvalidated",
|
||||||
|
"hidden": false,
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"requires_privileged_lxc": false,
|
||||||
|
"optional_privileged_lxc": false,
|
||||||
|
"requires_host_pid_namespace": false,
|
||||||
|
"requires_relaxed_confinement": false,
|
||||||
|
"optional_relaxed_confinement": false,
|
||||||
|
"requires_security_confirmation": false,
|
||||||
|
"multi_container": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "msedge",
|
"id": "msedge",
|
||||||
"provider": "linuxserver.io",
|
"provider": "linuxserver.io",
|
||||||
@@ -10344,7 +10311,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "n8n",
|
"title": "n8n",
|
||||||
"repository": "https://hub.docker.com/r/n8nio/n8n",
|
"repository": "https://hub.docker.com/r/n8nio/n8n",
|
||||||
"description": "n8n is a powerful open-source workflow automation and conversational AI platform that blends the flexibility of coding with the simplicity of no-code development, empowering users to create efficient and secure automation workflows. It seamlessly connects any app with an API, leveraging native AI capabilities (like LangChain-based AI agent workflows) to process custom data, ideal for personal task management, team collaboration, or enterprise-grade automation. Its vibrant community offers over 400 integrations and 900+ ready-to-use templates, enabling users to deploy automations quickly.\n\nThe platform supports highly customizable workflow design, allowing users to write JavaScript/Python, add npm packages, or use an intuitive visual interface to manage data, catering to both simple tasks and complex processes. Enterprise-grade features like advanced permissions and air-gapped deployments ensure security, while multilingual support makes it accessible globally. n8n delivers a versatile and user-friendly automation solution.\n\nDiscover n8n’s Automation Scenarios\nn8n’s community resources provide extensive support and inspiration, helping users explore its scenario-based value and easily build automation workflows. Below are two key resources showcasing n8n’s capabilities across various use cases:\n\n1. [n8n Official Community Forum](https://community.n8n.io/): \nThe forum is a hub for user collaboration and learning, offering resources from beginner guides to advanced workflow designs. Shared use cases include automating social media posts or real-time data syncing, such as using n8n to pull data from Google Sheets and send Slack notifications, boosting team collaboration and data efficiency.\n\n2. [n8n Official Template Library](https://n8n.io/workflows/): \nThe template library offers over 900 ready-to-use workflows for scenarios like marketing automation, data analytics, and customer support. For example, a template can link Shopify to Mailchimp, automatically adding new customers to mailing lists and sending welcome emails, making automation accessible to non-technical users. AI-driven workflows, like handling customer queries with LangChain, highlight n8n’s strength in intelligent interactions.\n",
|
"description": "n8n is a powerful open-source workflow automation and conversational AI platform that blends the flexibility of coding with the simplicity of no-code development, empowering users to create efficient and secure automation workflows. It seamlessly connects any app with an API, leveraging native AI capabilities (like LangChain-based AI agent workflows) to process custom data, ideal for personal task management, team collaboration, or enterprise-grade automation. Its vibrant community offers over 400 integrations and 900+ ready-to-use templates, enabling users to deploy automations quickly.\n\nThe platform supports highly customizable workflow design, allowing users to write JavaScript/Python, add npm packages, or use an intuitive visual interface to manage data, catering to both simple tasks and complex processes. Enterprise-grade features like advanced permissions and air-gapped deployments ensure security, while multilingual support makes it accessible globally. n8n delivers a versatile and user-friendly automation solution.\n\nDiscover n8n\u2019s Automation Scenarios\nn8n\u2019s community resources provide extensive support and inspiration, helping users explore its scenario-based value and easily build automation workflows. Below are two key resources showcasing n8n\u2019s capabilities across various use cases:\n\n1. [n8n Official Community Forum](https://community.n8n.io/): \nThe forum is a hub for user collaboration and learning, offering resources from beginner guides to advanced workflow designs. Shared use cases include automating social media posts or real-time data syncing, such as using n8n to pull data from Google Sheets and send Slack notifications, boosting team collaboration and data efficiency.\n\n2. [n8n Official Template Library](https://n8n.io/workflows/): \nThe template library offers over 900 ready-to-use workflows for scenarios like marketing automation, data analytics, and customer support. For example, a template can link Shopify to Mailchimp, automatically adding new customers to mailing lists and sending welcome emails, making automation accessible to non-technical users. AI-driven workflows, like handling customer queries with LangChain, highlight n8n\u2019s strength in intelligent interactions.\n",
|
||||||
"website": "https://n8n.io",
|
"website": "https://n8n.io",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/n8n.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/n8n.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -10480,7 +10447,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "NetBird",
|
"title": "NetBird",
|
||||||
"repository": "https://hub.docker.com/r/netbirdio/netbird",
|
"repository": "https://hub.docker.com/r/netbirdio/netbird",
|
||||||
"description": "NetBird combines a WireGuard®-based overlay network with Zero Trust Network Access, providing a unified open source platform for reliable and secure connectivity.\n\n- Secure Remote Access – Enable least privilege network access in a few clicks\n- Zero-Config Deployment – Replace legacy VPNs with a peer-to-peer WireGuard®-based network\n- Seamless SSO with MFA – Secure your network access with session-based SSO & MFA\n- Dynamic Posture Checks – Grant access only to devices meeting your security rules\n- Centralized Network Management – Control your private network from a single place\n- Detailed Activity Logging – Identify who did what, and when in your network\n\n**Learn More:**\n- [NetBird Website](https://netbird.io)\n- [Documentation](https://docs.netbird.io)\n- [Self-Hosting Guide](https://docs.netbird.io/selfhosted/selfhosted-quickstart)\n- [NetBird GitHub](https://github.com/netbirdio/netbird)\n- [Slack Community](https://docs.netbird.io/slack-url)\n",
|
"description": "NetBird combines a WireGuard\u00ae-based overlay network with Zero Trust Network Access, providing a unified open source platform for reliable and secure connectivity.\n\n- Secure Remote Access \u2013 Enable least privilege network access in a few clicks\n- Zero-Config Deployment \u2013 Replace legacy VPNs with a peer-to-peer WireGuard\u00ae-based network\n- Seamless SSO with MFA \u2013 Secure your network access with session-based SSO & MFA\n- Dynamic Posture Checks \u2013 Grant access only to devices meeting your security rules\n- Centralized Network Management \u2013 Control your private network from a single place\n- Detailed Activity Logging \u2013 Identify who did what, and when in your network\n\n**Learn More:**\n- [NetBird Website](https://netbird.io)\n- [Documentation](https://docs.netbird.io)\n- [Self-Hosting Guide](https://docs.netbird.io/selfhosted/selfhosted-quickstart)\n- [NetBird GitHub](https://github.com/netbirdio/netbird)\n- [Slack Community](https://docs.netbird.io/slack-url)\n",
|
||||||
"website": "https://netbird.io",
|
"website": "https://netbird.io",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/netbird.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/netbird.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -10817,7 +10784,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "NocoDB",
|
"title": "NocoDB",
|
||||||
"repository": "https://github.com/nocodb/nocodb",
|
"repository": "https://github.com/nocodb/nocodb",
|
||||||
"description": "Create and manage databases through a spreadsheet-style web interface. This single-image profile uses NocoDB’s SQLite quickstart mode.",
|
"description": "Create and manage databases through a spreadsheet-style web interface. This single-image profile uses NocoDB\u2019s SQLite quickstart mode.",
|
||||||
"website": "https://nocodb.com/",
|
"website": "https://nocodb.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nocodb.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nocodb.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -11373,7 +11340,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Open WebUI",
|
"title": "Open WebUI",
|
||||||
"repository": "https://ghcr.io/open-webui/open-webui",
|
"repository": "https://ghcr.io/open-webui/open-webui",
|
||||||
"description": "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",
|
"description": "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",
|
||||||
"website": "https://openwebui.com",
|
"website": "https://openwebui.com",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/open-webui.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/open-webui.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -11404,7 +11371,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Open WebUI CUDA",
|
"title": "Open WebUI CUDA",
|
||||||
"repository": "https://ghcr.io/open-webui/open-webui",
|
"repository": "https://ghcr.io/open-webui/open-webui",
|
||||||
"description": "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",
|
"description": "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",
|
||||||
"website": "https://openwebui.com",
|
"website": "https://openwebui.com",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/open-webui.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/open-webui.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -11435,7 +11402,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Open WebUI + Ollama",
|
"title": "Open WebUI + Ollama",
|
||||||
"repository": "https://ghcr.io/open-webui/open-webui",
|
"repository": "https://ghcr.io/open-webui/open-webui",
|
||||||
"description": "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",
|
"description": "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",
|
||||||
"website": "https://openwebui.com",
|
"website": "https://openwebui.com",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/open-webui.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/open-webui.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -11538,7 +11505,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "OpenHAB",
|
"title": "OpenHAB",
|
||||||
"repository": "https://hub.docker.com/r/openhab/openhab",
|
"repository": "https://hub.docker.com/r/openhab/openhab",
|
||||||
"description": "The open Home Automation Bus (openHAB, pronounced ˈəʊpənˈhæb) is an open source, technology agnostic home automation platform which runs as the center of your smart home! Its ability to integrate a multitude of other devices and systems. openHAB includes other home automation systems, (smart) devices and other technologies into a single solution. To provide a uniform user interface and a common approach to automation rules across the entire system, regardless of the number of manufacturers and sub-systems involved. Giving you the most flexible tool available to make almost any home automation wish come true; if you can think it, odds are that you can implement it with openHAB.",
|
"description": "The open Home Automation Bus (openHAB, pronounced \u02c8\u0259\u028ap\u0259n\u02c8h\u00e6b) is an open source, technology agnostic home automation platform which runs as the center of your smart home! Its ability to integrate a multitude of other devices and systems. openHAB includes other home automation systems, (smart) devices and other technologies into a single solution. To provide a uniform user interface and a common approach to automation rules across the entire system, regardless of the number of manufacturers and sub-systems involved. Giving you the most flexible tool available to make almost any home automation wish come true; if you can think it, odds are that you can implement it with openHAB.",
|
||||||
"website": "https://www.openhab.org",
|
"website": "https://www.openhab.org",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/openhab.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/openhab.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -13127,7 +13094,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Portainer",
|
"title": "Portainer",
|
||||||
"repository": "https://hub.docker.com/r/portainer/portainer-ce",
|
"repository": "https://hub.docker.com/r/portainer/portainer-ce",
|
||||||
"description": "Portainer Community Edition (CE) is a lightweight container management tool offering an intuitive Web interface to simplify building, managing, and monitoring containerized applications. With over 500,000 active users, it is widely appreciated for its ease of use and robust functionality, ideal for individual developers, home lab users, and small teams.\n\nThe tool's core features include multi-platform support, resource management, and real-time monitoring. It supports managing various container platforms, covering containers, images, volumes, and networks. Users can quickly create, deploy, and manage containers via a “smart” graphical interface or comprehensive API, without needing deep command-line expertise. It provides real-time container status monitoring, log viewing, and configuration management, ensuring efficient control over application operations.\n\nIts design philosophy is to “simplify container complexity” with an intuitive interface and default settings that lower the technical barrier. Users can manage containerized applications without complex configurations, saving time and boosting efficiency. It is completely free, with data stored locally, ensuring full user control. Community support via GitHub Discussions and Slack, along with rich documentation and regular updates, enhances the user experience, making it suitable for learning container technology or managing small projects.\n\n**Key Features:**\n- Intuitive Web interface for simplified containerized app management\n- Supports multiple container platforms for unified resource management\n- Real-time monitoring of container status and logs\n- Rapid container deployment and management via API\n- Community support with extensive documentation and assistance\n\n**Learn More:**\n- [Portainer Official Website](https://www.portainer.io/)\n- [Portainer GitHub Repository](https://github.com/portainer/portainer)\n",
|
"description": "Portainer Community Edition (CE) is a lightweight container management tool offering an intuitive Web interface to simplify building, managing, and monitoring containerized applications. With over 500,000 active users, it is widely appreciated for its ease of use and robust functionality, ideal for individual developers, home lab users, and small teams.\n\nThe tool's core features include multi-platform support, resource management, and real-time monitoring. It supports managing various container platforms, covering containers, images, volumes, and networks. Users can quickly create, deploy, and manage containers via a \u201csmart\u201d graphical interface or comprehensive API, without needing deep command-line expertise. It provides real-time container status monitoring, log viewing, and configuration management, ensuring efficient control over application operations.\n\nIts design philosophy is to \u201csimplify container complexity\u201d with an intuitive interface and default settings that lower the technical barrier. Users can manage containerized applications without complex configurations, saving time and boosting efficiency. It is completely free, with data stored locally, ensuring full user control. Community support via GitHub Discussions and Slack, along with rich documentation and regular updates, enhances the user experience, making it suitable for learning container technology or managing small projects.\n\n**Key Features:**\n- Intuitive Web interface for simplified containerized app management\n- Supports multiple container platforms for unified resource management\n- Real-time monitoring of container status and logs\n- Rapid container deployment and management via API\n- Community support with extensive documentation and assistance\n\n**Learn More:**\n- [Portainer Official Website](https://www.portainer.io/)\n- [Portainer GitHub Repository](https://github.com/portainer/portainer)\n",
|
||||||
"website": "https://www.portainer.io/",
|
"website": "https://www.portainer.io/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/portainer.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/portainer.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -13584,7 +13551,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "qBittorrent",
|
"title": "qBittorrent",
|
||||||
"repository": "https://ghcr.io/hotio/qbittorrent",
|
"repository": "https://ghcr.io/hotio/qbittorrent",
|
||||||
"description": "**Elevate Your Home Media Experience**. qBittorrent transforms your home media setup with a polished interface reminiscent of µTorrent, minus the ads. Unlike traditional download tools, it offers a streamlined, efficient, and ad-free experience. This makes it a perfect fit for those seeking a hassle-free way to manage and enjoy their media collections at home.\n\n**Feature-Rich and User-Friendly**. With qBittorrent, you gain access to a well-integrated and extensible search engine, allowing simultaneous searches across multiple torrent sites, and category-specific searches for books, music, and software. Its support for RSS feeds with advanced filters, magnet links, encrypted connections, and more, ensures you have complete control over your downloads. Available on all major platforms and in around 70 languages, qBittorrent is both versatile and accessible.\n\n**Seamless Integration with Private Clouds like self-hosted server**. Deploying qBittorrent on private cloud devices such as self-hosted server offers unparalleled convenience. Enjoy virtually unlimited storage, enhanced privacy for your data, and local network speeds that make downloading and streaming effortless. This setup ensures that your media library is always at your fingertips, securely and swiftly.\n",
|
"description": "**Elevate Your Home Media Experience**. qBittorrent transforms your home media setup with a polished interface reminiscent of \u00b5Torrent, minus the ads. Unlike traditional download tools, it offers a streamlined, efficient, and ad-free experience. This makes it a perfect fit for those seeking a hassle-free way to manage and enjoy their media collections at home.\n\n**Feature-Rich and User-Friendly**. With qBittorrent, you gain access to a well-integrated and extensible search engine, allowing simultaneous searches across multiple torrent sites, and category-specific searches for books, music, and software. Its support for RSS feeds with advanced filters, magnet links, encrypted connections, and more, ensures you have complete control over your downloads. Available on all major platforms and in around 70 languages, qBittorrent is both versatile and accessible.\n\n**Seamless Integration with Private Clouds like self-hosted server**. Deploying qBittorrent on private cloud devices such as self-hosted server offers unparalleled convenience. Enjoy virtually unlimited storage, enhanced privacy for your data, and local network speeds that make downloading and streaming effortless. This setup ensures that your media library is always at your fingertips, securely and swiftly.\n",
|
||||||
"website": "https://www.qbittorrent.org",
|
"website": "https://www.qbittorrent.org",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/qbittorrent.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/qbittorrent.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -13683,7 +13650,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Qui",
|
"title": "Qui",
|
||||||
"repository": "https://ghcr.io/autobrr/qui",
|
"repository": "https://ghcr.io/autobrr/qui",
|
||||||
"description": "**One dashboard for all your qBittorrent instances.** Qui is a fast, modern web interface for qBittorrent. Instead of juggling several separate WebUI tabs, you connect every qBittorrent instance to Qui and manage them all from a single, responsive dashboard. It ships as a lightweight single binary, so it stays quick and resource-friendly even when you are watching thousands of torrents.\n\n**Automation and cross-seeding built in.** Built by the team behind autobrr, Qui goes well beyond basic torrent listing. It adds powerful rule-based automation, built-in cross-seeding that automatically finds and adds matching torrents across your trackers, scheduled backups with restore, and a clean multi-language interface. Point it at your Torznab-compatible indexers — such as Prowlarr or Jackett — to put cross-seeding on autopilot, then filter, search, and bulk-manage torrents across every instance at once.\n\n**Made for your private cloud.** Running Qui on a private cloud device like self-hosted server keeps everything in one place on hardware you control. Pair it with your qBittorrent containers for local-network speeds, full ownership of your data, and a single tidy interface for your entire download stack — accessible from any device in your home.\n",
|
"description": "**One dashboard for all your qBittorrent instances.** Qui is a fast, modern web interface for qBittorrent. Instead of juggling several separate WebUI tabs, you connect every qBittorrent instance to Qui and manage them all from a single, responsive dashboard. It ships as a lightweight single binary, so it stays quick and resource-friendly even when you are watching thousands of torrents.\n\n**Automation and cross-seeding built in.** Built by the team behind autobrr, Qui goes well beyond basic torrent listing. It adds powerful rule-based automation, built-in cross-seeding that automatically finds and adds matching torrents across your trackers, scheduled backups with restore, and a clean multi-language interface. Point it at your Torznab-compatible indexers \u2014 such as Prowlarr or Jackett \u2014 to put cross-seeding on autopilot, then filter, search, and bulk-manage torrents across every instance at once.\n\n**Made for your private cloud.** Running Qui on a private cloud device like self-hosted server keeps everything in one place on hardware you control. Pair it with your qBittorrent containers for local-network speeds, full ownership of your data, and a single tidy interface for your entire download stack \u2014 accessible from any device in your home.\n",
|
||||||
"website": "https://getqui.com",
|
"website": "https://getqui.com",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/qui.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/qui.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -13750,7 +13717,7 @@
|
|||||||
"title": "Radarr",
|
"title": "Radarr",
|
||||||
"repository_name": "docker-radarr",
|
"repository_name": "docker-radarr",
|
||||||
"repository": "https://github.com/linuxserver/docker-radarr",
|
"repository": "https://github.com/linuxserver/docker-radarr",
|
||||||
"description": "Radarr - A fork of Sonarr to work with movies à la Couchpotato.",
|
"description": "Radarr - A fork of Sonarr to work with movies \u00e0 la Couchpotato.",
|
||||||
"website": "https://github.com/Radarr/Radarr",
|
"website": "https://github.com/Radarr/Radarr",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/radarr.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/radarr.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -14023,7 +13990,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Redis Insight",
|
"title": "Redis Insight",
|
||||||
"repository": "https://github.com/redis/RedisInsight",
|
"repository": "https://github.com/redis/RedisInsight",
|
||||||
"description": "Redis’s official visual tool for browsing Redis data, running commands and using diagnostics. It starts as a standalone service; connect it to Redis servers after opening the interface.",
|
"description": "Redis\u2019s official visual tool for browsing Redis data, running commands and using diagnostics. It starts as a standalone service; connect it to Redis servers after opening the interface.",
|
||||||
"website": "https://redis.io/insight/",
|
"website": "https://redis.io/insight/",
|
||||||
"icon": "https://raw.githubusercontent.com/redis/RedisInsight/43bd288ed30dc6d2355723158dad5d7ecf4a280e/resources/icons/512x512.png",
|
"icon": "https://raw.githubusercontent.com/redis/RedisInsight/43bd288ed30dc6d2355723158dad5d7ecf4a280e/resources/icons/512x512.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -14055,7 +14022,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Redmine",
|
"title": "Redmine",
|
||||||
"repository": "https://github.com/redmine/redmine",
|
"repository": "https://github.com/redmine/redmine",
|
||||||
"description": "Track projects, issues, milestones, time and documentation in a self-hosted web application. This single-image profile uses Redmine’s built-in SQLite database and persists it alongside uploaded files.",
|
"description": "Track projects, issues, milestones, time and documentation in a self-hosted web application. This single-image profile uses Redmine\u2019s built-in SQLite database and persists it alongside uploaded files.",
|
||||||
"website": "https://www.redmine.org/",
|
"website": "https://www.redmine.org/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/redmine.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/redmine.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -14673,7 +14640,7 @@
|
|||||||
"title": "Sealskin",
|
"title": "Sealskin",
|
||||||
"repository_name": "docker-sealskin",
|
"repository_name": "docker-sealskin",
|
||||||
"repository": "https://github.com/linuxserver/docker-sealskin",
|
"repository": "https://github.com/linuxserver/docker-sealskin",
|
||||||
"description": "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions—such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.",
|
"description": "Sealskin is a self-hosted, client-server platform that enables users to run powerful, containerized desktop applications streamed directly to a web browser. It uses a browser extension to intercept user actions\u2014such as clicking a link or downloading a file and redirects them to a secure, isolated application environment running on a remote server.",
|
||||||
"website": "https://github.com/selkies-project/sealskin/",
|
"website": "https://github.com/selkies-project/sealskin/",
|
||||||
"icon": null,
|
"icon": null,
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -15352,44 +15319,6 @@
|
|||||||
"hidden": false,
|
"hidden": false,
|
||||||
"template_id": "linuxserver-speedtest-tracker"
|
"template_id": "linuxserver-speedtest-tracker"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "spoolman",
|
|
||||||
"provider": "Donkie",
|
|
||||||
"template_family": "curated-profile",
|
|
||||||
"title": "Spoolman",
|
|
||||||
"repository": "https://github.com/Donkie/Spoolman",
|
|
||||||
"description": "A self-hosted filament inventory for 3D printers. Manage spools, materials, manufacturers, locations and labels in the web UI, and integrate with Moonraker, OctoPrint and other printer tools. The official image uses SQLite by default; no separate database container is required.",
|
|
||||||
"website": "https://github.com/Donkie/Spoolman",
|
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/spoolman.webp",
|
|
||||||
"architectures": [
|
|
||||||
"amd64",
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"updated_at": null,
|
|
||||||
"main_image": "ghcr.io/donkie/spoolman:latest",
|
|
||||||
"category": "tools",
|
|
||||||
"category_label": "Tools",
|
|
||||||
"replaces_discovered_ids": [],
|
|
||||||
"curated_path": "catalog/curated/spoolman.json",
|
|
||||||
"template": "apps/spoolman.json",
|
|
||||||
"template_status": "generated-unvalidated",
|
|
||||||
"hidden": false,
|
|
||||||
"automatic_install_candidate": true,
|
|
||||||
"untranslated_blockers": [],
|
|
||||||
"requires_privileged_lxc": false,
|
|
||||||
"optional_privileged_lxc": false,
|
|
||||||
"requires_host_pid_namespace": false,
|
|
||||||
"requires_relaxed_confinement": false,
|
|
||||||
"optional_relaxed_confinement": false,
|
|
||||||
"requires_security_confirmation": false,
|
|
||||||
"multi_container": false,
|
|
||||||
"template_id": "image-spoolman",
|
|
||||||
"source_app_id": "spoolman",
|
|
||||||
"default_branch": "master",
|
|
||||||
"source_path": "OCI recipe from upstream installation guide",
|
|
||||||
"source_revision": "ff8efd517b76a4b2783f29c89e9b9fbcd8cd167b",
|
|
||||||
"pushed_at": "2026-10-31T09:39:19Z"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "spotube",
|
"id": "spotube",
|
||||||
"provider": "linuxserver.io",
|
"provider": "linuxserver.io",
|
||||||
@@ -15460,7 +15389,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "SQLPage",
|
"title": "SQLPage",
|
||||||
"repository": "https://github.com/sqlpage/SQLPage",
|
"repository": "https://github.com/sqlpage/SQLPage",
|
||||||
"description": "Create web pages by writing SQL queries that SQLPage turns into a website. This profile uses the project’s DuckDB image variant, which includes its embedded database driver and needs no database sidecar. A small starter page is created on first install.",
|
"description": "Create web pages by writing SQL queries that SQLPage turns into a website. This profile uses the project\u2019s DuckDB image variant, which includes its embedded database driver and needs no database sidecar. A small starter page is created on first install.",
|
||||||
"website": "https://sql-page.com/",
|
"website": "https://sql-page.com/",
|
||||||
"icon": "https://raw.githubusercontent.com/sqlpage/SQLPage/main/examples/official-site/assets/icon.webp",
|
"icon": "https://raw.githubusercontent.com/sqlpage/SQLPage/main/examples/official-site/assets/icon.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -16122,7 +16051,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "Tailscale",
|
"title": "Tailscale",
|
||||||
"repository": "https://hub.docker.com/r/tailscale/tailscale",
|
"repository": "https://hub.docker.com/r/tailscale/tailscale",
|
||||||
"description": "A modern self-hosted networking app built on WireGuard®, providing secure, encrypted connections between devices regardless of their location. Its zero-configuration networking eliminates the need for complex firewall rules, port forwarding, or network administration, making it ideal for businesses and individuals creating efficient, secure network environments.\n\nThe app's core features include seamless device connectivity and robust security. It uses WireGuard® for end-to-end encryption, ensuring traffic cannot be intercepted, with private keys stored solely on user devices. Automatic NAT traversal enables connections across computers, phones, servers, and IoT devices over different network types, forming a unified private network. It also offers identity-based access control, integrating with Google, Microsoft, GitHub, or custom SSO solutions for simple authentication, replacing traditional IP-based restrictions to enhance security.\n\nIt excels in delivering secure remote access to services and infrastructure. Users can effortlessly access home servers, connect to office networks while traveling, or establish secure links between cloud services. Subnet routing allows access to entire networks, exit nodes enable secure internet browsing, and MagicDNS simplifies device discovery. These features ensure efficient, secure access to resources from any location.\n\nIt supports nearly all platforms, including Linux, Windows, macOS, iOS, Android, and various router firmwares, with flexible deployment in cloud or on-premises environments. A user-friendly Web interface provides real-time monitoring of network topology, device status, and access controls, with community documentation aiding configuration optimization. Whether setting up secure access for small teams or managing enterprise-scale networks, the app’s intuitive operation and high flexibility deliver a modern networking solution.\n\n**Key Features:**\n- End-to-end encryption via WireGuard®, ensuring uninterceptible traffic\n- Zero-configuration networking, eliminating complex firewall or port forwarding setup\n- Automatic NAT traversal for seamless device connectivity across network types\n- Identity-based access control with SSO integration (Google, Microsoft, GitHub)\n- Subnet routing for secure network-wide access\n- Exit nodes for safe internet browsing\n- MagicDNS for simplified device discovery\n\n**Learn More:**\n- [Tailscale Official Website](https://tailscale.com)\n- [Tailscale GitHub Repository](https://github.com/tailscale/tailscale)\n",
|
"description": "A modern self-hosted networking app built on WireGuard\u00ae, providing secure, encrypted connections between devices regardless of their location. Its zero-configuration networking eliminates the need for complex firewall rules, port forwarding, or network administration, making it ideal for businesses and individuals creating efficient, secure network environments.\n\nThe app's core features include seamless device connectivity and robust security. It uses WireGuard\u00ae for end-to-end encryption, ensuring traffic cannot be intercepted, with private keys stored solely on user devices. Automatic NAT traversal enables connections across computers, phones, servers, and IoT devices over different network types, forming a unified private network. It also offers identity-based access control, integrating with Google, Microsoft, GitHub, or custom SSO solutions for simple authentication, replacing traditional IP-based restrictions to enhance security.\n\nIt excels in delivering secure remote access to services and infrastructure. Users can effortlessly access home servers, connect to office networks while traveling, or establish secure links between cloud services. Subnet routing allows access to entire networks, exit nodes enable secure internet browsing, and MagicDNS simplifies device discovery. These features ensure efficient, secure access to resources from any location.\n\nIt supports nearly all platforms, including Linux, Windows, macOS, iOS, Android, and various router firmwares, with flexible deployment in cloud or on-premises environments. A user-friendly Web interface provides real-time monitoring of network topology, device status, and access controls, with community documentation aiding configuration optimization. Whether setting up secure access for small teams or managing enterprise-scale networks, the app\u2019s intuitive operation and high flexibility deliver a modern networking solution.\n\n**Key Features:**\n- End-to-end encryption via WireGuard\u00ae, ensuring uninterceptible traffic\n- Zero-configuration networking, eliminating complex firewall or port forwarding setup\n- Automatic NAT traversal for seamless device connectivity across network types\n- Identity-based access control with SSO integration (Google, Microsoft, GitHub)\n- Subnet routing for secure network-wide access\n- Exit nodes for safe internet browsing\n- MagicDNS for simplified device discovery\n\n**Learn More:**\n- [Tailscale Official Website](https://tailscale.com)\n- [Tailscale GitHub Repository](https://github.com/tailscale/tailscale)\n",
|
||||||
"website": "https://tailscale.com",
|
"website": "https://tailscale.com",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tailscale.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tailscale.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -16733,7 +16662,7 @@
|
|||||||
"template_family": "curated-profile",
|
"template_family": "curated-profile",
|
||||||
"title": "Toxiproxy",
|
"title": "Toxiproxy",
|
||||||
"repository": "https://github.com/Shopify/toxiproxy",
|
"repository": "https://github.com/Shopify/toxiproxy",
|
||||||
"description": "Run Shopify’s Toxiproxy API server, then define proxies and failure conditions through its REST API.",
|
"description": "Run Shopify\u2019s Toxiproxy API server, then define proxies and failure conditions through its REST API.",
|
||||||
"website": "https://github.com/Shopify/toxiproxy",
|
"website": "https://github.com/Shopify/toxiproxy",
|
||||||
"icon": "https://github.com/Shopify.png",
|
"icon": "https://github.com/Shopify.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -16828,7 +16757,7 @@
|
|||||||
"title": "Transmission",
|
"title": "Transmission",
|
||||||
"repository_name": "docker-transmission",
|
"repository_name": "docker-transmission",
|
||||||
"repository": "https://github.com/linuxserver/docker-transmission",
|
"repository": "https://github.com/linuxserver/docker-transmission",
|
||||||
"description": "Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, µTP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more.",
|
"description": "Transmission is designed for easy, powerful use. Transmission has the features you want from a BitTorrent client: encryption, a web interface, peer exchange, magnet links, DHT, \u00b5TP, UPnP and NAT-PMP port forwarding, webseed support, watch directories, tracker editing, global and per-torrent speed limits, and more.",
|
||||||
"website": "https://www.transmissionbt.com/",
|
"website": "https://www.transmissionbt.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/transmission.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/transmission.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -17120,39 +17049,6 @@
|
|||||||
"multi_container": true,
|
"multi_container": true,
|
||||||
"template_id": "image-umami"
|
"template_id": "image-umami"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "unbound",
|
|
||||||
"provider": "klutchell",
|
|
||||||
"template_family": "curated-profile",
|
|
||||||
"title": "Unbound",
|
|
||||||
"repository": "https://github.com/klutchell/unbound-docker",
|
|
||||||
"description": "Run the community-maintained klutchell image of Unbound as a DNS resolver on its own Proxmox LXC. It listens on TCP and UDP port 53 and can load optional custom configuration files.",
|
|
||||||
"website": "https://unbound.net/",
|
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/unbound.webp",
|
|
||||||
"architectures": [
|
|
||||||
"amd64",
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"updated_at": null,
|
|
||||||
"main_image": "klutchell/unbound:main",
|
|
||||||
"category": "adblock",
|
|
||||||
"category_label": "Adblock & DNS",
|
|
||||||
"replaces_discovered_ids": [],
|
|
||||||
"curated_path": "catalog/curated/unbound.json",
|
|
||||||
"template_id": "image-unbound",
|
|
||||||
"template": "apps/unbound.json",
|
|
||||||
"template_status": "generated-unvalidated",
|
|
||||||
"hidden": false,
|
|
||||||
"automatic_install_candidate": true,
|
|
||||||
"untranslated_blockers": [],
|
|
||||||
"requires_privileged_lxc": false,
|
|
||||||
"optional_privileged_lxc": false,
|
|
||||||
"requires_host_pid_namespace": false,
|
|
||||||
"requires_relaxed_confinement": false,
|
|
||||||
"optional_relaxed_confinement": false,
|
|
||||||
"requires_security_confirmation": false,
|
|
||||||
"multi_container": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "ungoogled-chromium",
|
"id": "ungoogled-chromium",
|
||||||
"provider": "linuxserver.io",
|
"provider": "linuxserver.io",
|
||||||
@@ -17662,7 +17558,7 @@
|
|||||||
"variant": null,
|
"variant": null,
|
||||||
"title": "VoceChat",
|
"title": "VoceChat",
|
||||||
"repository": "https://hub.docker.com/r/privoce/vocechat-server",
|
"repository": "https://hub.docker.com/r/privoce/vocechat-server",
|
||||||
"description": "VoceChat is a secure chat software designed for independent deployment, offering a flexible solution for seamless communication. It combines instant messaging with channel-based group chats, allowing you to engage in one-on-one conversations or create themed channels for group discussions.\n\nVoceChat supports a variety of message formats, including text, images, files, emojis, and rich text (Markdown), making your communication vibrant and expressive. Once deployed, it can be accessed via a WebAPP or mobile APP, ensuring a consistent experience across platforms.\n\nWith robust management features, VoceChat enables easy member and channel administration, giving you full control over your team or group’s communication environment. Whether for individual users or enterprise teams, VoceChat delivers a secure, versatile, and efficient chat solution.\n",
|
"description": "VoceChat is a secure chat software designed for independent deployment, offering a flexible solution for seamless communication. It combines instant messaging with channel-based group chats, allowing you to engage in one-on-one conversations or create themed channels for group discussions.\n\nVoceChat supports a variety of message formats, including text, images, files, emojis, and rich text (Markdown), making your communication vibrant and expressive. Once deployed, it can be accessed via a WebAPP or mobile APP, ensuring a consistent experience across platforms.\n\nWith robust management features, VoceChat enables easy member and channel administration, giving you full control over your team or group\u2019s communication environment. Whether for individual users or enterprise teams, VoceChat delivers a secure, versatile, and efficient chat solution.\n",
|
||||||
"website": "https://voce.chat",
|
"website": "https://voce.chat",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/VoceChat/icon.png",
|
"icon": "https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStore@main/Apps/VoceChat/icon.png",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -17727,7 +17623,7 @@
|
|||||||
"title": "Vscodium",
|
"title": "Vscodium",
|
||||||
"repository_name": "docker-vscodium",
|
"repository_name": "docker-vscodium",
|
||||||
"repository": "https://github.com/linuxserver/docker-vscodium",
|
"repository": "https://github.com/linuxserver/docker-vscodium",
|
||||||
"description": "VSCodium is a community-driven, freely-licensed binary distribution of Microsoft’s editor VS Code.",
|
"description": "VSCodium is a community-driven, freely-licensed binary distribution of Microsoft\u2019s editor VS Code.",
|
||||||
"website": "https://vscodium.com/",
|
"website": "https://vscodium.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/vscodium.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/vscodium.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -18391,7 +18287,7 @@
|
|||||||
"title": "Wireguard",
|
"title": "Wireguard",
|
||||||
"repository_name": "docker-wireguard",
|
"repository_name": "docker-wireguard",
|
||||||
"repository": "https://github.com/linuxserver/docker-wireguard",
|
"repository": "https://github.com/linuxserver/docker-wireguard",
|
||||||
"description": "WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN. WireGuard is designed as a general purpose VPN for running on embedded interfaces and super computers alike, fit for many different circumstances. Initially released for the Linux kernel, it is now cross-platform (Windows, macOS, BSD, iOS, Android) and widely deployable. It is currently under heavy development, but already it might be regarded as the most secure, easiest to use, and simplest VPN solution in the industry.",
|
"description": "WireGuard\u00ae is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN. WireGuard is designed as a general purpose VPN for running on embedded interfaces and super computers alike, fit for many different circumstances. Initially released for the Linux kernel, it is now cross-platform (Windows, macOS, BSD, iOS, Android) and widely deployable. It is currently under heavy development, but already it might be regarded as the most secure, easiest to use, and simplest VPN solution in the industry.",
|
||||||
"website": "https://www.wireguard.com/",
|
"website": "https://www.wireguard.com/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/wireguard.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/wireguard.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -18423,7 +18319,7 @@
|
|||||||
"title": "Wireshark",
|
"title": "Wireshark",
|
||||||
"repository_name": "docker-wireshark",
|
"repository_name": "docker-wireshark",
|
||||||
"repository": "https://github.com/linuxserver/docker-wireshark",
|
"repository": "https://github.com/linuxserver/docker-wireshark",
|
||||||
"description": "Wireshark is the world’s foremost and widely-used network protocol analyzer. It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998.",
|
"description": "Wireshark is the world\u2019s foremost and widely-used network protocol analyzer. It lets you see what\u2019s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998.",
|
||||||
"website": "https://www.wireshark.org/",
|
"website": "https://www.wireshark.org/",
|
||||||
"icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@main/webp/wireshark.webp",
|
"icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@main/webp/wireshark.webp",
|
||||||
"architectures": [
|
"architectures": [
|
||||||
@@ -18871,6 +18767,206 @@
|
|||||||
"hidden": true,
|
"hidden": true,
|
||||||
"template_id": "image-ztnet"
|
"template_id": "image-ztnet"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "authelia",
|
||||||
|
"provider": "authelia",
|
||||||
|
"template_family": "curated-profile",
|
||||||
|
"title": "Authelia",
|
||||||
|
"repository": "https://github.com/authelia/authelia",
|
||||||
|
"description": "An open-source authentication and authorization server for protecting web applications. This single-image profile provides a local SQLite database and file notifications; configure your domain, reverse proxy and access rules before protecting other services.",
|
||||||
|
"website": "https://www.authelia.com/",
|
||||||
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/authelia.webp",
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"updated_at": "2026-09-17",
|
||||||
|
"main_image": "docker.io/authelia/authelia:4.39.28",
|
||||||
|
"category": "security",
|
||||||
|
"category_label": "Authentication & Security",
|
||||||
|
"replaces_discovered_ids": [],
|
||||||
|
"curated_path": "catalog/curated/authelia.json",
|
||||||
|
"template": "apps/authelia.json",
|
||||||
|
"template_status": "generated-unvalidated",
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"requires_privileged_lxc": false,
|
||||||
|
"optional_privileged_lxc": false,
|
||||||
|
"requires_host_pid_namespace": false,
|
||||||
|
"requires_relaxed_confinement": false,
|
||||||
|
"optional_relaxed_confinement": false,
|
||||||
|
"requires_security_confirmation": false,
|
||||||
|
"hidden": false,
|
||||||
|
"template_id": "image-authelia"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "airdcpp-webclient",
|
||||||
|
"provider": "gangefors",
|
||||||
|
"template_family": "curated-profile",
|
||||||
|
"title": "AirDC++ Web Client",
|
||||||
|
"repository": "https://github.com/gangefors/docker-airdcpp-webclient",
|
||||||
|
"description": "AirDC++ Web Client using the community-maintained gangefors image. Configuration, downloads and shared content use separate persistent paths.",
|
||||||
|
"website": "https://airdcpp-web.github.io/",
|
||||||
|
"icon": "https://raw.githubusercontent.com/airdcpp-web/airdcpp-webui/eeeea5025a5e720f38dac53ced8e002940f00a74/resources/images/logo.svg",
|
||||||
|
"architectures": [
|
||||||
|
"amd64"
|
||||||
|
],
|
||||||
|
"updated_at": "2026-10-25",
|
||||||
|
"main_image": "docker.io/gangefors/airdcpp-webclient:latest",
|
||||||
|
"category": "downloads",
|
||||||
|
"category_label": "Files & Downloads",
|
||||||
|
"replaces_discovered_ids": [],
|
||||||
|
"curated_path": "catalog/curated/airdcpp-webclient.json",
|
||||||
|
"template_id": "image-airdcpp-webclient",
|
||||||
|
"template": "apps/airdcpp-webclient.json",
|
||||||
|
"template_status": "generated-unvalidated",
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"requires_privileged_lxc": false,
|
||||||
|
"optional_privileged_lxc": false,
|
||||||
|
"requires_host_pid_namespace": false,
|
||||||
|
"requires_relaxed_confinement": false,
|
||||||
|
"optional_relaxed_confinement": false,
|
||||||
|
"requires_security_confirmation": false,
|
||||||
|
"hidden": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "kitchenowl",
|
||||||
|
"provider": "tombursch",
|
||||||
|
"template_family": "curated-profile",
|
||||||
|
"title": "KitchenOwl",
|
||||||
|
"repository": "https://github.com/TomBursch/kitchenowl",
|
||||||
|
"description": "Manage shared shopping lists, recipes and meal plans in one self-hosted app.",
|
||||||
|
"website": "https://kitchenowl.org/",
|
||||||
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/kitchenowl.webp",
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"updated_at": "2026-11-01",
|
||||||
|
"main_image": "tombursch/kitchenowl-web:latest",
|
||||||
|
"category": "productivity",
|
||||||
|
"category_label": "Productivity & Workflows",
|
||||||
|
"replaces_discovered_ids": [],
|
||||||
|
"curated_path": "catalog/curated/kitchenowl.json",
|
||||||
|
"template_id": "image-kitchenowl",
|
||||||
|
"template": "apps/kitchenowl.json",
|
||||||
|
"template_status": "generated-unvalidated",
|
||||||
|
"hidden": false,
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"requires_privileged_lxc": false,
|
||||||
|
"optional_privileged_lxc": false,
|
||||||
|
"requires_host_pid_namespace": false,
|
||||||
|
"requires_relaxed_confinement": false,
|
||||||
|
"optional_relaxed_confinement": false,
|
||||||
|
"requires_security_confirmation": false,
|
||||||
|
"multi_container": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "krusader",
|
||||||
|
"provider": "jlesage",
|
||||||
|
"template_family": "curated-profile",
|
||||||
|
"title": "Krusader",
|
||||||
|
"repository": "https://github.com/jlesage/docker-krusader",
|
||||||
|
"description": "Open Krusader in a browser and manage files from a directory you explicitly mount at /storage. The maintained jlesage image provides the graphical desktop; ProxMenux runs it as one native OCI LXC.",
|
||||||
|
"website": "https://krusader.org/",
|
||||||
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/krusader.webp",
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"updated_at": null,
|
||||||
|
"main_image": "jlesage/krusader:latest",
|
||||||
|
"category": "desktop",
|
||||||
|
"category_label": "Browsers & Web Desktops",
|
||||||
|
"replaces_discovered_ids": [],
|
||||||
|
"curated_path": "catalog/curated/krusader.json",
|
||||||
|
"template_id": "image-krusader",
|
||||||
|
"template": "apps/krusader.json",
|
||||||
|
"template_status": "generated-unvalidated",
|
||||||
|
"hidden": false,
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"requires_privileged_lxc": false,
|
||||||
|
"optional_privileged_lxc": false,
|
||||||
|
"requires_host_pid_namespace": false,
|
||||||
|
"requires_relaxed_confinement": false,
|
||||||
|
"optional_relaxed_confinement": false,
|
||||||
|
"requires_security_confirmation": false,
|
||||||
|
"multi_container": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "spoolman",
|
||||||
|
"provider": "Donkie",
|
||||||
|
"template_family": "curated-profile",
|
||||||
|
"title": "Spoolman",
|
||||||
|
"repository": "https://github.com/Donkie/Spoolman",
|
||||||
|
"description": "A self-hosted filament inventory for 3D printers. Manage spools, materials, manufacturers, locations and labels in the web UI, and integrate with Moonraker, OctoPrint and other printer tools. The official image uses SQLite by default; no separate database container is required.",
|
||||||
|
"website": "https://github.com/Donkie/Spoolman",
|
||||||
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/spoolman.webp",
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"updated_at": null,
|
||||||
|
"main_image": "ghcr.io/donkie/spoolman:latest",
|
||||||
|
"category": "tools",
|
||||||
|
"category_label": "Tools",
|
||||||
|
"replaces_discovered_ids": [],
|
||||||
|
"curated_path": "catalog/curated/spoolman.json",
|
||||||
|
"template": "apps/spoolman.json",
|
||||||
|
"template_status": "generated-unvalidated",
|
||||||
|
"hidden": false,
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"requires_privileged_lxc": false,
|
||||||
|
"optional_privileged_lxc": false,
|
||||||
|
"requires_host_pid_namespace": false,
|
||||||
|
"requires_relaxed_confinement": false,
|
||||||
|
"optional_relaxed_confinement": false,
|
||||||
|
"requires_security_confirmation": false,
|
||||||
|
"multi_container": false,
|
||||||
|
"template_id": "image-spoolman",
|
||||||
|
"source_app_id": "spoolman",
|
||||||
|
"default_branch": "master",
|
||||||
|
"source_path": "OCI recipe from upstream installation guide",
|
||||||
|
"source_revision": "ff8efd517b76a4b2783f29c89e9b9fbcd8cd167b",
|
||||||
|
"pushed_at": "2026-10-31T09:39:19Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "unbound",
|
||||||
|
"provider": "klutchell",
|
||||||
|
"template_family": "curated-profile",
|
||||||
|
"title": "Unbound",
|
||||||
|
"repository": "https://github.com/klutchell/unbound-docker",
|
||||||
|
"description": "Run the community-maintained klutchell image of Unbound as a DNS resolver on its own Proxmox LXC. It listens on TCP and UDP port 53 and can load optional custom configuration files.",
|
||||||
|
"website": "https://unbound.net/",
|
||||||
|
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/unbound.webp",
|
||||||
|
"architectures": [
|
||||||
|
"amd64",
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"updated_at": null,
|
||||||
|
"main_image": "klutchell/unbound:main",
|
||||||
|
"category": "adblock",
|
||||||
|
"category_label": "Adblock & DNS",
|
||||||
|
"replaces_discovered_ids": [],
|
||||||
|
"curated_path": "catalog/curated/unbound.json",
|
||||||
|
"template_id": "image-unbound",
|
||||||
|
"template": "apps/unbound.json",
|
||||||
|
"template_status": "generated-unvalidated",
|
||||||
|
"hidden": false,
|
||||||
|
"automatic_install_candidate": true,
|
||||||
|
"untranslated_blockers": [],
|
||||||
|
"requires_privileged_lxc": false,
|
||||||
|
"optional_privileged_lxc": false,
|
||||||
|
"requires_host_pid_namespace": false,
|
||||||
|
"requires_relaxed_confinement": false,
|
||||||
|
"optional_relaxed_confinement": false,
|
||||||
|
"requires_security_confirmation": false,
|
||||||
|
"multi_container": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "zwave-js-ui",
|
"id": "zwave-js-ui",
|
||||||
"provider": "Z-Wave JS",
|
"provider": "Z-Wave JS",
|
||||||
|
|||||||
@@ -116,6 +116,10 @@
|
|||||||
"unpackerr": [
|
"unpackerr": [
|
||||||
"/data"
|
"/data"
|
||||||
],
|
],
|
||||||
|
"airdcpp-webclient": [
|
||||||
|
"/Downloads",
|
||||||
|
"/Share"
|
||||||
|
],
|
||||||
"spoolman": [
|
"spoolman": [
|
||||||
"/home/app/.local/share/spoolman"
|
"/home/app/.local/share/spoolman"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -239,6 +239,26 @@ def recover_untouched(root, journal):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def recover_failed_update(root, journal):
|
||||||
|
"""Attempt the guarded rollback after an update/Modify command fails.
|
||||||
|
|
||||||
|
Unlike recovery of an untouched guest, replacement failures may have
|
||||||
|
parked its volumes or removed its root disk. The existing recovery
|
||||||
|
journal validates ownership, configuration and backup before restoring.
|
||||||
|
Stack transactions remain the responsibility of their coordinator.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with instances.locked(root):
|
||||||
|
state = json.loads(Path(journal).read_text())
|
||||||
|
if state.get('coordinated') or state.get('phase') in TERMINAL:
|
||||||
|
return False
|
||||||
|
recover(root, Path(journal))
|
||||||
|
return True
|
||||||
|
except (OSError, ValueError, KeyError, RuntimeError, subprocess.SubprocessError) as error:
|
||||||
|
log(f'automatic update recovery failed: {error}')
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def fit(text):
|
def fit(text):
|
||||||
"""A step line that is rewritten in place must not wrap."""
|
"""A step line that is rewritten in place must not wrap."""
|
||||||
width = max(shutil.get_terminal_size((80, 24)).columns - 8, 30)
|
width = max(shutil.get_terminal_size((80, 24)).columns - 8, 30)
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ def main():
|
|||||||
except (OSError, ValueError, KeyError, RuntimeError, subprocess.SubprocessError) as error:
|
except (OSError, ValueError, KeyError, RuntimeError, subprocess.SubprocessError) as error:
|
||||||
transaction.report_error(error, f'update-{args.vmid}')
|
transaction.report_error(error, f'update-{args.vmid}')
|
||||||
journal = transaction.pending_journal()
|
journal = transaction.pending_journal()
|
||||||
if journal and not transaction.recover_untouched(instances.ROOT, journal):
|
if journal and not transaction.recover_failed_update(instances.ROOT, journal):
|
||||||
transaction.recovery_hint()
|
transaction.recovery_hint()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -187,6 +187,24 @@ def _split_short_mount(value: str) -> tuple[str | None, str, str | None]:
|
|||||||
return ":".join(parts[:-2]), parts[-2], parts[-1]
|
return ":".join(parts[:-2]), parts[-2], parts[-1]
|
||||||
|
|
||||||
|
|
||||||
|
# Host device nodes a Compose file may bind as a volume. They are passed to
|
||||||
|
# the LXC as devices: a mount at that path would hide the device.
|
||||||
|
DEVICE_NODE_BINDS = ("/dev/net/tun", "/dev/fuse", "/dev/kvm")
|
||||||
|
|
||||||
|
|
||||||
|
def _device_bind(item: Any) -> str | None:
|
||||||
|
"""The `source:target` of a volume that binds a host device node."""
|
||||||
|
if isinstance(item, dict):
|
||||||
|
if item.get("type", "bind") != "bind":
|
||||||
|
return None
|
||||||
|
source, target = item.get("source"), item.get("target")
|
||||||
|
else:
|
||||||
|
source, target, _ = _split_short_mount(str(item))
|
||||||
|
if str(source or "") in DEVICE_NODE_BINDS and str(target or "") == str(source):
|
||||||
|
return f"{source}:{target}"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _mount_contract(value: Any, optional: set[str]) -> list[dict[str, Any]]:
|
def _mount_contract(value: Any, optional: set[str]) -> list[dict[str, Any]]:
|
||||||
if value is None:
|
if value is None:
|
||||||
return []
|
return []
|
||||||
@@ -194,6 +212,8 @@ def _mount_contract(value: Any, optional: set[str]) -> list[dict[str, Any]]:
|
|||||||
raise ConversionError("volumes must be a list")
|
raise ConversionError("volumes must be a list")
|
||||||
result: list[dict[str, Any]] = []
|
result: list[dict[str, Any]] = []
|
||||||
for index, item in enumerate(value):
|
for index, item in enumerate(value):
|
||||||
|
if _device_bind(item):
|
||||||
|
continue
|
||||||
if isinstance(item, dict):
|
if isinstance(item, dict):
|
||||||
source = item.get("source")
|
source = item.get("source")
|
||||||
target = item.get("target")
|
target = item.get("target")
|
||||||
@@ -606,6 +626,10 @@ def _device_installer_profile(
|
|||||||
) -> tuple[dict[str, Any], list[str]]:
|
) -> tuple[dict[str, Any], list[str]]:
|
||||||
optional = optional or set()
|
optional = optional or set()
|
||||||
raw_devices = service.get("devices")
|
raw_devices = service.get("devices")
|
||||||
|
volumes = service.get("volumes")
|
||||||
|
device_binds = [bind for bind in map(_device_bind, volumes) if bind] if isinstance(volumes, list) else []
|
||||||
|
if device_binds and (raw_devices is None or isinstance(raw_devices, list)):
|
||||||
|
raw_devices = [*(raw_devices or []), *device_binds]
|
||||||
requests: list[dict[str, Any]] = []
|
requests: list[dict[str, Any]] = []
|
||||||
blockers: list[str] = []
|
blockers: list[str] = []
|
||||||
nvidia_requested = _nvidia_requested(service)
|
nvidia_requested = _nvidia_requested(service)
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
"""The publisher contract survives native catalog composition and both wizards."""
|
||||||
|
from pathlib import Path
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
sys.path[:0] = [str(ROOT / 'src'), str(ROOT / 'remote'), str(ROOT / 'tests')]
|
||||||
|
from proxmenux_oci.catalog import Catalog
|
||||||
|
from proxmenux_oci.custom import template_from_oci_compose
|
||||||
|
from proxmenux_oci.installer import build_deployment, DEFAULT_MODE, ADVANCED_MODE
|
||||||
|
from test_advanced_flow_order import RecordingUI, storages, addresses
|
||||||
|
|
||||||
|
|
||||||
|
class AirDCppRecipeTests(unittest.TestCase):
|
||||||
|
def test_import_roundtrip_keeps_udp_and_all_persistent_paths(self):
|
||||||
|
catalog = Catalog(ROOT)
|
||||||
|
template = catalog.compose('airdcpp-webclient')
|
||||||
|
restored = template_from_oci_compose(json.dumps(template))
|
||||||
|
catalog.validate(restored)
|
||||||
|
ports = {(p['container_port'], p['protocol']) for p in restored['container_contract']['ports']}
|
||||||
|
self.assertEqual(ports, {(5600,'tcp'),(5601,'tcp'),(21248,'tcp'),(21248,'udp'),(21249,'tcp')})
|
||||||
|
paths = {v['container_path']:v for v in restored['container_contract']['volumes']}
|
||||||
|
self.assertEqual(set(paths), {'/.airdcpp','/Downloads','/Share'})
|
||||||
|
self.assertEqual(paths['/.airdcpp']['installation_choice'], ['managed-volume'])
|
||||||
|
for path in ('/Downloads','/Share'):
|
||||||
|
self.assertIn('host-bind', paths[path]['installation_choice'])
|
||||||
|
self.assertEqual(restored['catalog_ui']['architectures'], ['amd64'])
|
||||||
|
self.assertEqual(restored['proxmox']['installer_profile']['startup_healthcheck']['path'], '/index.html')
|
||||||
|
self.assertEqual(restored['proxmox']['image_metadata_policy']['entrypoint'], 'import-from-oci-image')
|
||||||
|
|
||||||
|
def test_wizards_preserve_managed_configuration_and_use_selected_shared_directories(self):
|
||||||
|
from contextlib import ExitStack
|
||||||
|
with ExitStack() as stack:
|
||||||
|
for target, value in [
|
||||||
|
('proxmenux_oci.installer.host.storages', storages),
|
||||||
|
('proxmenux_oci.installer.access.ask_addresses', addresses)]:
|
||||||
|
stack.enter_context(patch(target, side_effect=value))
|
||||||
|
stack.enter_context(patch('proxmenux_oci.i18n.language', return_value='en'))
|
||||||
|
stack.enter_context(patch('proxmenux_oci.installer.host.bridges',return_value=[{'iface':'vmbr0','cidr':'192.0.2.10/24'}]))
|
||||||
|
stack.enter_context(patch('proxmenux_oci.installer.host.timezone',return_value='Europe/Madrid'))
|
||||||
|
stack.enter_context(patch('proxmenux_oci.installer.host.gpus',return_value={'intel':[],'amd':[],'nvidia':False}))
|
||||||
|
stack.enter_context(patch('proxmenux_oci.installer.access.ask_ipv4',return_value=('dhcp',None)))
|
||||||
|
for mode in (DEFAULT_MODE, ADVANCED_MODE):
|
||||||
|
with self.subTest(mode=mode):
|
||||||
|
ui = RecordingUI({'Where to store /Downloads':'host-bind','Where to store /Share':'host-bind'})
|
||||||
|
plan = build_deployment(Catalog(ROOT).compose('airdcpp-webclient'), ui, mode)
|
||||||
|
mounts = {item['container_path']:item for item in plan['mounts']}
|
||||||
|
self.assertEqual(mounts['/.airdcpp']['type'], 'managed-volume')
|
||||||
|
self.assertTrue(mounts['/.airdcpp']['backup'])
|
||||||
|
self.assertEqual(mounts['/Downloads']['type'], 'host-bind')
|
||||||
|
self.assertEqual(mounts['/Share']['type'], 'host-bind')
|
||||||
|
env = {item['name']:item['value'] for item in plan['environment']}
|
||||||
|
self.assertEqual((env['PUID'],env['PGID']),('1000','1000'))
|
||||||
|
self.assertEqual(plan['resources']['cores'],2)
|
||||||
|
self.assertTrue(plan['security']['unprivileged'])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
"""The Authelia profile bootstraps a usable single-image authentication portal."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
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 AutheliaRecipeTests(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.path = ROOT / "catalog/curated/authelia.json"
|
||||||
|
self.recipe = json.loads(self.path.read_text(encoding="utf-8"))
|
||||||
|
self.index_copy = json.loads(
|
||||||
|
(ROOT / "catalog/apps/authelia.json").read_text(encoding="utf-8")
|
||||||
|
)
|
||||||
|
self.profile = self.recipe["proxmox"]["installer_profile"]
|
||||||
|
self.generated = {
|
||||||
|
item["container_path"]: item
|
||||||
|
for item in self.profile["generated_files"]
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_local_catalog_lists_and_loads_the_curated_recipe(self):
|
||||||
|
catalog = Catalog(ROOT)
|
||||||
|
item = catalog.find_item("authelia")
|
||||||
|
self.assertEqual(item["template_family"], "curated-profile")
|
||||||
|
self.assertEqual(catalog.compose("authelia")["id"], "image-authelia")
|
||||||
|
self.assertEqual(self.recipe, self.index_copy)
|
||||||
|
|
||||||
|
def test_official_image_tag_icon_and_supported_architectures_are_declared(self):
|
||||||
|
self.assertEqual(
|
||||||
|
self.recipe["container_contract"]["image"]["reference"],
|
||||||
|
"docker.io/authelia/authelia:4.39.28",
|
||||||
|
)
|
||||||
|
self.assertEqual(self.recipe["catalog_ui"]["architectures"], ["amd64", "arm64"])
|
||||||
|
self.assertEqual(
|
||||||
|
self.recipe["catalog_ui"]["icon"],
|
||||||
|
"https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/authelia.webp",
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_sensitive_secrets_are_generated_and_domain_settings_are_prompted(self):
|
||||||
|
environment = {
|
||||||
|
item["name"]: item
|
||||||
|
for item in self.recipe["container_contract"]["environment"]
|
||||||
|
}
|
||||||
|
for name in (
|
||||||
|
"PROXMENUX_ADMIN_PASSWORD",
|
||||||
|
"AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET",
|
||||||
|
"AUTHELIA_SESSION_SECRET",
|
||||||
|
"AUTHELIA_STORAGE_ENCRYPTION_KEY",
|
||||||
|
):
|
||||||
|
self.assertTrue(environment[name]["sensitive"])
|
||||||
|
self.assertEqual(self.profile["generated_sensitive_environment"][name]["strategy"], "token-hex")
|
||||||
|
self.assertTrue(environment["PROXMENUX_AUTHELIA_COOKIE_DOMAIN"]["required"])
|
||||||
|
self.assertTrue(environment["PROXMENUX_AUTHELIA_URL"]["required"])
|
||||||
|
self.assertIn("cookie domain", environment["PROXMENUX_AUTHELIA_COOKIE_DOMAIN"]["prompt"])
|
||||||
|
self.assertIn("HTTPS URL", environment["PROXMENUX_AUTHELIA_URL"]["prompt"])
|
||||||
|
self.assertEqual(environment["PROXMENUX_AUTHELIA_COOKIE_DOMAIN"]["example"], "")
|
||||||
|
self.assertEqual(environment["PROXMENUX_AUTHELIA_URL"]["example"], "")
|
||||||
|
self.assertEqual(environment["X_AUTHELIA_CONFIG_FILTERS"]["example"], "template")
|
||||||
|
|
||||||
|
def test_config_is_persistent_and_has_a_working_initial_policy(self):
|
||||||
|
config = self.generated["/config/configuration.yml"]["content"]
|
||||||
|
self.assertIn("path: '/config/users_database.yml'", config)
|
||||||
|
self.assertIn("path: '/config/db.sqlite3'", config)
|
||||||
|
self.assertIn("filename: '/config/notification.txt'", config)
|
||||||
|
self.assertIn("default_policy: 'one_factor'", config)
|
||||||
|
self.assertIn('{{ env \"PROXMENUX_AUTHELIA_COOKIE_DOMAIN\" }}', config)
|
||||||
|
self.assertIn('{{ env \"PROXMENUX_AUTHELIA_URL\" }}', config)
|
||||||
|
self.assertTrue(self.generated["/config/configuration.yml"]["only_if_missing"])
|
||||||
|
volume = self.recipe["container_contract"]["volumes"][0]
|
||||||
|
self.assertEqual(volume["container_path"], "/config")
|
||||||
|
self.assertEqual(volume["installation_choice"], ["managed-volume"])
|
||||||
|
self.assertTrue(volume["managed_volume"]["backup"])
|
||||||
|
|
||||||
|
def test_bootstrap_hashes_initial_password_and_never_ships_a_default_password(self):
|
||||||
|
bootstrap = self.generated["/usr/local/bin/proxmenux-authelia-bootstrap"]["content"]
|
||||||
|
self.assertIn("authelia crypto hash generate argon2", bootstrap)
|
||||||
|
self.assertIn("unset PROXMENUX_ADMIN_PASSWORD", bootstrap)
|
||||||
|
self.assertIn("exec /app/entrypoint.sh", bootstrap)
|
||||||
|
self.assertNotIn("password: authelia", bootstrap)
|
||||||
|
self.assertEqual(
|
||||||
|
self.recipe["first_run"]["credentials"][0]["password_environment"],
|
||||||
|
"PROXMENUX_ADMIN_PASSWORD",
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_healthcheck_uses_authelias_documented_endpoint_and_profile_remains_unvalidated(self):
|
||||||
|
healthcheck = self.profile["startup_healthcheck"]
|
||||||
|
self.assertEqual((healthcheck["port"], healthcheck["path"]), (9091, "/api/health"))
|
||||||
|
self.assertFalse(self.recipe["compatibility"]["validated"])
|
||||||
|
self.assertEqual(self.recipe["status"], "generated-unvalidated")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
"""A Compose volume that binds a host device node, such as /dev/net/tun for
|
||||||
|
Tailscale, is passed to the LXC as a device: a mount there hides the device."""
|
||||||
|
from pathlib import Path
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
|
||||||
|
from proxmenux_oci import converter
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceNodeBindTests(unittest.TestCase):
|
||||||
|
service = {"image": "tailscale/tailscale:latest", "volumes": [
|
||||||
|
{"type": "bind", "source": "/DATA/AppData/tailscale", "target": "/var/lib/tailscale"},
|
||||||
|
{"type": "bind", "source": "/dev/net/tun", "target": "/dev/net/tun"},
|
||||||
|
"/dev/fuse:/dev/fuse"]}
|
||||||
|
|
||||||
|
def test_device_nodes_are_not_volumes(self):
|
||||||
|
mounts = converter._mount_contract(self.service["volumes"], set())
|
||||||
|
self.assertEqual([m["container_path"] for m in mounts], ["/var/lib/tailscale"])
|
||||||
|
|
||||||
|
def test_device_nodes_become_device_requests(self):
|
||||||
|
profile, blockers = converter._device_installer_profile(self.service)
|
||||||
|
self.assertEqual(blockers, [])
|
||||||
|
self.assertEqual([(r["id"], r["container_path"]) for r in profile["device_requests"]],
|
||||||
|
[("dev-net-tun", "/dev/net/tun"), ("dev-fuse", "/dev/fuse")])
|
||||||
|
|
||||||
|
def test_a_device_directory_is_left_to_its_own_handling(self):
|
||||||
|
self.assertIsNone(converter._device_bind("/dev/dri:/dev/dri"))
|
||||||
|
self.assertIsNone(converter._device_bind({"type": "volume", "source": "/dev/net/tun", "target": "/dev/net/tun"}))
|
||||||
|
|
||||||
|
def test_the_tailscale_recipe_passes_the_tun_device(self):
|
||||||
|
import json
|
||||||
|
recipe = json.loads((Path(__file__).resolve().parents[1] / "catalog/apps/tailscale.json").read_text())
|
||||||
|
self.assertNotIn("/dev/net/tun", [v["container_path"] for v in recipe["container_contract"]["volumes"]])
|
||||||
|
self.assertIn("dev-net-tun", [r["id"] for r in recipe["proxmox"]["installer_profile"]["device_requests"]])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
@@ -11,7 +11,7 @@ import socket
|
|||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import patch
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'remote'))
|
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'remote'))
|
||||||
import oci_instances as instances
|
import oci_instances as instances
|
||||||
@@ -129,6 +129,37 @@ class UpdateRetainedDiskTests(unittest.TestCase):
|
|||||||
self.assertEqual(instances.read(self.root,115)['observed']['image'],self.saved['observed']['image'])
|
self.assertEqual(instances.read(self.root,115)['observed']['image'],self.saved['observed']['image'])
|
||||||
self.assertEqual(json.loads(self.journal().read_text())['phase'],'rolled-back')
|
self.assertEqual(json.loads(self.journal().read_text())['phase'],'rolled-back')
|
||||||
|
|
||||||
|
def test_update_command_recovers_a_failed_replacement_without_manual_recovery(self):
|
||||||
|
import oci_update_current as update
|
||||||
|
self.fail_install = True
|
||||||
|
with patch.object(update, 'update', side_effect=lambda *a: self.apply()), \
|
||||||
|
patch.object(instances, 'ROOT', self.root), \
|
||||||
|
patch.object(update, 'os', Mock(geteuid=lambda: 0)), \
|
||||||
|
patch.object(sys, 'argv', ['oci_update_current.py', '115']), \
|
||||||
|
patch.object(transaction, 'report_error'), \
|
||||||
|
patch.object(transaction, 'recovery_hint') as hint:
|
||||||
|
self.assertEqual(update.main(), 1)
|
||||||
|
self.assert_retained()
|
||||||
|
self.assertEqual(instances.read(self.root,115)['status'], 'installed')
|
||||||
|
self.assertEqual(instances.read(self.root,115)['observed']['image'],self.saved['observed']['image'])
|
||||||
|
self.assertEqual(json.loads(self.journal().read_text())['phase'],'rolled-back')
|
||||||
|
hint.assert_not_called()
|
||||||
|
|
||||||
|
def test_update_command_keeps_the_recovery_hint_when_rollback_is_blocked(self):
|
||||||
|
import oci_update_current as update
|
||||||
|
self.fail_install = True
|
||||||
|
with patch.object(update, 'update', side_effect=lambda *a: self.apply()), \
|
||||||
|
patch.object(instances, 'ROOT', self.root), \
|
||||||
|
patch.object(update, 'os', Mock(geteuid=lambda: 0)), \
|
||||||
|
patch.object(sys, 'argv', ['oci_update_current.py', '115']), \
|
||||||
|
patch.object(transaction, 'report_error'), \
|
||||||
|
patch.object(transaction, 'recover', side_effect=ValueError('configuration changed')), \
|
||||||
|
patch.object(transaction, 'recovery_hint') as hint:
|
||||||
|
self.assertEqual(update.main(), 1)
|
||||||
|
hint.assert_called_once_with()
|
||||||
|
self.assertEqual(instances.read(self.root,115)['status'], 'updating')
|
||||||
|
self.assertNotEqual(json.loads(self.journal().read_text())['phase'],'rolled-back')
|
||||||
|
|
||||||
def test_recovery_after_parking_data_returns_the_original_unused_disks(self):
|
def test_recovery_after_parking_data_returns_the_original_unused_disks(self):
|
||||||
with self.assertRaisesRegex(RuntimeError,'Lab interruption'):self.apply(interrupt_after='data-parked')
|
with self.assertRaisesRegex(RuntimeError,'Lab interruption'):self.apply(interrupt_after='data-parked')
|
||||||
transaction.recover(self.root,self.journal());self.assert_retained()
|
transaction.recover(self.root,self.journal());self.assert_retained()
|
||||||
@@ -145,4 +176,31 @@ class UpdateRetainedDiskTests(unittest.TestCase):
|
|||||||
self.assert_retained()
|
self.assert_retained()
|
||||||
|
|
||||||
|
|
||||||
|
class AutomaticRecoveryGuardTests(unittest.TestCase):
|
||||||
|
def test_committed_rolled_back_and_coordinated_journals_are_not_recovered(self):
|
||||||
|
for state in ({'phase':'committed'}, {'phase':'rolled-back'},
|
||||||
|
{'phase':'installing-candidate','coordinated':True}):
|
||||||
|
with self.subTest(state=state), tempfile.TemporaryDirectory() as directory:
|
||||||
|
root=Path(directory)/'instances'; journal=Path(directory)/'journal.json'
|
||||||
|
journal.write_text(json.dumps(state))
|
||||||
|
with patch.object(transaction,'recover') as recover:
|
||||||
|
self.assertFalse(transaction.recover_failed_update(root,journal))
|
||||||
|
recover.assert_not_called()
|
||||||
|
|
||||||
|
def test_missing_and_malformed_journals_leave_recovery_pending(self):
|
||||||
|
with tempfile.TemporaryDirectory() as directory:
|
||||||
|
root=Path(directory)/'instances'; journal=Path(directory)/'journal.json'
|
||||||
|
with patch.object(transaction,'recover') as recover, patch.object(transaction,'log'):
|
||||||
|
self.assertFalse(transaction.recover_failed_update(root,journal))
|
||||||
|
journal.write_text('{')
|
||||||
|
self.assertFalse(transaction.recover_failed_update(root,journal))
|
||||||
|
recover.assert_not_called()
|
||||||
|
|
||||||
|
def test_a_busy_registry_does_not_start_recovery(self):
|
||||||
|
with patch.object(instances,'locked',side_effect=BlockingIOError('busy')), \
|
||||||
|
patch.object(transaction,'recover') as recover, patch.object(transaction,'log'):
|
||||||
|
self.assertFalse(transaction.recover_failed_update(Path('/unused'),Path('/unused/journal')))
|
||||||
|
recover.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
if __name__=='__main__':unittest.main()
|
if __name__=='__main__':unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user