Add LinuxServer Nextcloud stack with MariaDB and Redis

This commit is contained in:
Jonatan Castro
2026-11-03 23:39:23 +01:00
parent 1dca76aaa5
commit 3ff9885394
13 changed files with 1586 additions and 1 deletions
+6
View File
@@ -1640,6 +1640,7 @@
"Create scheduled backup job": "Erstellen Sie einen geplanten Sicherungsauftrag",
"Create share directory:": "Freigabeverzeichnis erstellen:",
"Create shared directory:": "Freigegebenes Verzeichnis erstellen:",
"Create the administrator in the web setup; MariaDB and /data are prefilled.": "Erstellen Sie das Administratorkonto im Web-Assistenten; MariaDB und /data sind bereits eingetragen.",
"Create this LXC in privileged mode?": "Erstellen Sie diese LXC im privilegierten Modus?",
"Create with create_user in the container console": "Erstellen Sie den Benutzer mit create_user in der Container-Konsole",
"Create, send and sign documents with a self-hosted web app.": "Erstelle, versende und signiere Dokumente mit einer selbst gehosteten Web-App.",
@@ -3893,6 +3894,7 @@
"Linux/Mac path:": "Linux/Mac-Pfad:",
"LinuxServer Jellyfin with optional GPU passthrough": "LinuxServer Jellyfin mit optionalem GPU-Passthrough",
"LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB requires ein Benutzer, Datenbank und Passwort",
"LinuxServer Nextcloud with MariaDB and Redis": "LinuxServer Nextcloud mit MariaDB und Redis",
"List Available Disks": "Verfügbare Festplatten auflisten",
"List IOMMU group mapping": "IOMMU-Gruppenzuordnung auflisten",
"List NVMe devices": "NVMe-Geräte auflisten",
@@ -4470,6 +4472,7 @@
"Next Step Required": "Nächster Schritt erforderlich",
"Next Steps:": "Nächste Schritte:",
"Next step: stop that VM first, then run": "Nächster Schritt: Stoppen Sie zuerst die VM und führen Sie sie dann aus",
"Nextcloud Web UI": "Nextcloud-Weboberfläche",
"Nextcloud configuration cancelled": "Nextcloud-Konfiguration gestrichen",
"Nextcloud gives you access to all your files wherever you are.": "Nextcloud bietet Ihnen Zugriff auf alle Ihre Dateien, wo immer Sie sind.",
"Nextcloud volume size in GB": "Nextcloud Volumengröße in GB",
@@ -5588,6 +5591,7 @@
"Recreation prepared": "Erholung vorbereitet",
"Recursive DNS resolver.": "Rekursiver DNS-Resolver.",
"Recursive and authoritative DNS server.": "Rekursiver und autoritativer DNS-Server.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.": "Die Dateisperre mit Redis wird automatisch eingerichtet. Vorhandene Nextcloud-Konfigurationsdateien bleiben erhalten.",
"Redmine": "Redmine",
"Refresh APT index and verify repositories:": "APT-Index aktualisieren und Repositorys überprüfen:",
"Refresh catalog": "Katalog aktualisieren",
@@ -7959,6 +7963,7 @@
"Use a privileged LXC for NFS server/client workflows.": "Verwenden Sie einen privilegierten LXC für NFS-Server-/Client-Workflows.",
"Use a privileged LXC for Samba client/server workflows.": "Verwenden Sie einen privilegierten LXC für Samba-Client/Server-Workflows.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Verwenden Sie einen Registrierungs-Hostnamen, zum Beispiel ghcr.io oder registry.example.com:5000.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time.": "Verwenden Sie einen HTTPS-Reverse-Proxy mit einem vertrauenswürdigen Zertifikat. Aktualisieren Sie Nextcloud jeweils auf die nächste Hauptversion, ohne eine zu überspringen.",
"Use an existing SSH private key file on this host": "Verwenden Sie eine vorhandene private SSH-Schlüsseldatei auf diesem Host",
"Use an existing keyfile": "Verwenden Sie eine vorhandene Schlüsseldatei",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Verwenden Sie eine Bildreferenz, zum Beispiel ghcr.io/owner/app:latest.",
@@ -7972,6 +7977,7 @@
"Use existing filesystem": "Vorhandenes Dateisystem verwenden",
"Use existing: mount without formatting": "Vorhandenes verwenden: mounten ohne Formatierung",
"Use images only if the directory is on suitable storage.": "Verwenden Sie Bilder nur, wenn sich das Verzeichnis auf einem geeigneten Speicher befindet.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.": "Verwenden Sie verwalteten Speicher für /config und MariaDB. Für /data können Sie ein Verzeichnis auf dem Host/NAS auswählen, das eine eigene Sicherung benötigt.",
"Use mp1/mp2/... for extra mount points.": "Verwenden Sie mp1/mp2/... für zusätzliche Mount-Punkte.",
"Use only when unprivileged containers cannot meet your needs": "Verwenden Sie es nur, wenn nicht privilegierte Container Ihre Anforderungen nicht erfüllen können",
"Use option 1 to add a local disk (as Proxmox storage and/or as a host mount).": "Verwenden Sie Option 1, um eine lokale Festplatte hinzuzufügen (als Proxmox-Speicher und/oder als Host-Mount).",
+6
View File
@@ -1638,6 +1638,7 @@
"Create scheduled backup job": "Crear trabajo de backup programado",
"Create share directory:": "Crear directorio compartido:",
"Create shared directory:": "Crear directorio compartido:",
"Create the administrator in the web setup; MariaDB and /data are prefilled.": "Crea el administrador en el asistente web; MariaDB y /data ya están rellenados.",
"Create this LXC in privileged mode?": "¿Crear este LXC en modo privilegiado?",
"Create with create_user in the container console": "Crea el usuario con create_user desde la consola del contenedor",
"Create, send and sign documents with a self-hosted web app.": "Crea, envía y firma documentos con una aplicación web autoalojada.",
@@ -3888,6 +3889,7 @@
"Linux/Mac path:": "Ruta Linux/Mac:",
"LinuxServer Jellyfin with optional GPU passthrough": "Jellyfin de LinuxServer con passthrough de GPU opcional",
"LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB requiere un usuario, base de datos y contraseña",
"LinuxServer Nextcloud with MariaDB and Redis": "Nextcloud de LinuxServer con MariaDB y Redis",
"List Available Disks": "Listar discos disponibles",
"List IOMMU group mapping": "Listar el mapeo del grupo IOMMU",
"List NVMe devices": "Listar dispositivos NVMe",
@@ -4465,6 +4467,7 @@
"Next Step Required": "Se requiere el siguiente paso",
"Next Steps:": "Próximos pasos:",
"Next step: stop that VM first, then run": "Siguiente paso: detén esa VM primero y luego ejecuta",
"Nextcloud Web UI": "Interfaz web de Nextcloud",
"Nextcloud configuration cancelled": "Configuración Nextcloud cancelada",
"Nextcloud gives you access to all your files wherever you are.": "Nextcloud te da acceso a todos tus archivos estés donde estés.",
"Nextcloud volume size in GB": "Tamaño del volumen de Nextcloud en GB",
@@ -5571,6 +5574,7 @@
"Recreating the container:": "Recreando el contenedor:",
"Recursive DNS resolver.": "Resolvedor DNS recursivo.",
"Recursive and authoritative DNS server.": "Servidor DNS recursivo y autoritativo.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.": "El bloqueo con Redis se configura automáticamente. Se conservan los archivos de configuración existentes de Nextcloud.",
"Redmine": "Redmine",
"Refresh APT index and verify repositories:": "Actualizar el índice APT y verificar los repositorios:",
"Refresh catalog": "Actualizar catálogo",
@@ -7930,6 +7934,7 @@
"Use a privileged LXC for NFS server/client workflows.": "Utiliza un LXC privilegiado para flujos de trabajo de servidor/cliente NFS.",
"Use a privileged LXC for Samba client/server workflows.": "Utiliza un LXC privilegiado para flujos de trabajo de cliente/servidor Samba.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Escribe el nombre de un registro, por ejemplo ghcr.io o registry.example.com:5000.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time.": "Usa un proxy inverso HTTPS con un certificado de confianza. Actualiza Nextcloud de una versión principal a la siguiente, sin saltarte ninguna.",
"Use an existing SSH private key file on this host": "Usar un archivo de clave privada SSH existente en este host",
"Use an existing keyfile": "Usar un archivo de claves existente",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Escribe una referencia de imagen, por ejemplo ghcr.io/owner/app:latest.",
@@ -7943,6 +7948,7 @@
"Use existing filesystem": "Usar el sistema de archivos existente",
"Use existing: mount without formatting": "Usar existente: montar sin formatear",
"Use images only if the directory is on suitable storage.": "Utiliza imágenes solo si el directorio está en un almacenamiento adecuado.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.": "Usa almacenamiento gestionado para /config y MariaDB. Para /data puedes elegir un directorio del host/NAS, que necesita su propia copia de seguridad.",
"Use mp1/mp2/... for extra mount points.": "Utiliza mp1/mp2/... para puntos de montaje adicionales.",
"Use only when unprivileged containers cannot meet your needs": "Úselo solo cuando los contenedores sin privilegios no puedan satisfacer sus necesidades",
"Use option 1 to add a local disk (as Proxmox storage and/or as a host mount).": "Utiliza la opción 1 para añadir un disco local (como almacenamiento Proxmox y/o como montaje de host).",
+6
View File
@@ -1640,6 +1640,7 @@
"Create scheduled backup job": "Créer une tâche de sauvegarde planifiée",
"Create share directory:": "Créer un répertoire de partage :",
"Create shared directory:": "Créer un répertoire partagé :",
"Create the administrator in the web setup; MariaDB and /data are prefilled.": "Créez le compte administrateur dans l’assistant web ; MariaDB et /data sont déjà renseignés.",
"Create this LXC in privileged mode?": "Créer ce LXC en mode privilégié ?",
"Create with create_user in the container console": "Créez l’utilisateur avec create_user dans la console du conteneur",
"Create, send and sign documents with a self-hosted web app.": "Créez, envoyez et signez des documents avec une application web auto-hébergée.",
@@ -3893,6 +3894,7 @@
"Linux/Mac path:": "Chemin Linux/Mac :",
"LinuxServer Jellyfin with optional GPU passthrough": "LinuxServer Jellyfin avec passage GPU optionnel",
"LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB requires un utilisateur, une base de données et un mot de passe",
"LinuxServer Nextcloud with MariaDB and Redis": "Nextcloud de LinuxServer avec MariaDB et Redis",
"List Available Disks": "Liste des disques disponibles",
"List IOMMU group mapping": "Répertorier le mappage de groupe IOMMU",
"List NVMe devices": "Répertorier les appareils NVMe",
@@ -4470,6 +4472,7 @@
"Next Step Required": "Prochaine étape requise",
"Next Steps:": "Prochaines étapes :",
"Next step: stop that VM first, then run": "Étape suivante : arrêtez d'abord cette VM, puis exécutez",
"Nextcloud Web UI": "Interface web de Nextcloud",
"Nextcloud configuration cancelled": "Configuration Nextcloud annulée",
"Nextcloud gives you access to all your files wherever you are.": "Nextcloud vous donne accès à tous vos fichiers où que vous soyez.",
"Nextcloud volume size in GB": "Taille du volume Nextcloud en GB",
@@ -5588,6 +5591,7 @@
"Recreation prepared": "Loisirs préparés",
"Recursive DNS resolver.": "Résolveur DNS récursif.",
"Recursive and authoritative DNS server.": "Serveur DNS récursif et faisant autorité.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.": "Le verrouillage avec Redis est configuré automatiquement. Les fichiers de configuration existants de Nextcloud sont conservés.",
"Redmine": "Redmine",
"Refresh APT index and verify repositories:": "Actualisez l'index APT et vérifiez les référentiels :",
"Refresh catalog": "Actualiser le catalogue",
@@ -7958,6 +7962,7 @@
"Use a privileged LXC for NFS server/client workflows.": "Utilisez un LXC privilégié pour les workflows serveur/client NFS.",
"Use a privileged LXC for Samba client/server workflows.": "Utilisez un LXC privilégié pour les workflows client/serveur Samba.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Utilisez un nom d'hôte de registre, par exemple ghcr.io ou registry.example.com:5000.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time.": "Utilisez un proxy inverse HTTPS avec un certificat de confiance. Mettez Nextcloud à niveau vers la version majeure suivante, sans en sauter.",
"Use an existing SSH private key file on this host": "Utiliser un fichier de clé privée SSH existant sur cet hôte",
"Use an existing keyfile": "utiliser un fichier de clés existant",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Utilisez une référence d'image, par exemple ghcr.io/owner/app:latest.",
@@ -7971,6 +7976,7 @@
"Use existing filesystem": "Utiliser le système de fichiers existant",
"Use existing: mount without formatting": "Utiliser existant : monter sans formatage",
"Use images only if the directory is on suitable storage.": "Utilisez des images uniquement si le répertoire se trouve sur un stockage approprié.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.": "Utilisez un stockage géré pour /config et MariaDB. Pour /data, vous pouvez choisir un répertoire de l’hôte/NAS, qui nécessite sa propre sauvegarde.",
"Use mp1/mp2/... for extra mount points.": "Utilisez mp1/mp2/... pour des points de montage supplémentaires.",
"Use only when unprivileged containers cannot meet your needs": "À utiliser uniquement lorsque les conteneurs non privilégiés ne peuvent pas répondre à vos besoins",
"Use option 1 to add a local disk (as Proxmox storage and/or as a host mount).": "Utilisez l'option 1 pour ajouter un disque local (comme stockage Proxmox et/ou comme montage hôte).",
+6
View File
@@ -1640,6 +1640,7 @@
"Create scheduled backup job": "Crea attività di backup pianificata",
"Create share directory:": "Crea directory condivisa:",
"Create shared directory:": "Crea directory condivisa:",
"Create the administrator in the web setup; MariaDB and /data are prefilled.": "Crea l’amministratore nella procedura guidata web; MariaDB e /data sono già compilati.",
"Create this LXC in privileged mode?": "Creare questo LXC in modalità privilegiata?",
"Create with create_user in the container console": "Crea l’utente con create_user nella console del container",
"Create, send and sign documents with a self-hosted web app.": "Crea, invia e firma documenti con un'app web self-hosted.",
@@ -3893,6 +3894,7 @@
"Linux/Mac path:": "Percorso Linux/Mac:",
"LinuxServer Jellyfin with optional GPU passthrough": "LinuxServer Jellyfin con passthrough GPU opzionale",
"LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB richiede un utente, un database e una password",
"LinuxServer Nextcloud with MariaDB and Redis": "Nextcloud di LinuxServer con MariaDB e Redis",
"List Available Disks": "Elenca i dischi disponibili",
"List IOMMU group mapping": "Elenca la mappatura dei gruppi IOMMU",
"List NVMe devices": "Elenca i dispositivi NVMe",
@@ -4470,6 +4472,7 @@
"Next Step Required": "Passaggio successivo obbligatorio",
"Next Steps:": "Passaggi successivi:",
"Next step: stop that VM first, then run": "Passaggio successivo: arresta prima la VM, quindi esegui",
"Nextcloud Web UI": "Interfaccia web di Nextcloud",
"Nextcloud configuration cancelled": "Configurazione di Nextcloud annullata",
"Nextcloud gives you access to all your files wherever you are.": "Nextcloud ti dà accesso a tutti i tuoi file, ovunque ti trovi.",
"Nextcloud volume size in GB": "Dimensione volume Nextcloud in GB",
@@ -5588,6 +5591,7 @@
"Recreation prepared": "Ricreazione preparata",
"Recursive DNS resolver.": "Resolver DNS ricorsivo.",
"Recursive and authoritative DNS server.": "Server DNS ricorsivo e autorevole.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.": "Il blocco dei file con Redis viene configurato automaticamente. I file di configurazione esistenti di Nextcloud vengono conservati.",
"Redmine": "Redmine",
"Refresh APT index and verify repositories:": "Aggiorna l'indice APT e verifica i repository:",
"Refresh catalog": "Aggiorna catalogo",
@@ -7959,6 +7963,7 @@
"Use a privileged LXC for NFS server/client workflows.": "Usare un LXC privilegiato per le operazioni server/client NFS.",
"Use a privileged LXC for Samba client/server workflows.": "Usare un LXC privilegiato per le operazioni client/server Samba.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Utilizza un nome host del registro, ad esempio ghcr.io o registry.example.com:5000.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time.": "Usa un proxy inverso HTTPS con un certificato attendibile. Aggiorna Nextcloud alla versione principale successiva, senza saltarne nessuna.",
"Use an existing SSH private key file on this host": "Usa un file di chiave privata SSH esistente su questo host",
"Use an existing keyfile": "Usa file di chiavi esistente",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Utilizza un riferimento a un'immagine, ad esempio ghcr.io/owner/app:latest.",
@@ -7972,6 +7977,7 @@
"Use existing filesystem": "Usa file system esistente",
"Use existing: mount without formatting": "Usa esistente: monta senza formattare",
"Use images only if the directory is on suitable storage.": "Usare images solo se la directory è su uno storage adatto.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.": "Usa lo storage gestito per /config e MariaDB. Per /data puoi scegliere una directory dell’host/NAS, che richiede un backup separato.",
"Use mp1/mp2/... for extra mount points.": "Usare mp1/mp2/... per mount aggiuntivi.",
"Use only when unprivileged containers cannot meet your needs": "Usare solo se i container non privilegiati non soddisfano le esigenze",
"Use option 1 to add a local disk (as Proxmox storage and/or as a host mount).": "Usare l’opzione 1 per aggiungere un disco locale (come storage Proxmox e/o mount host).",
+6
View File
@@ -1640,6 +1640,7 @@
"Create scheduled backup job": "Criar tarefa de backup agendada",
"Create share directory:": "Crie um diretório de compartilhamento:",
"Create shared directory:": "Crie um diretório compartilhado:",
"Create the administrator in the web setup; MariaDB and /data are prefilled.": "Crie o administrador no assistente web; MariaDB e /data já estão preenchidos.",
"Create this LXC in privileged mode?": "Criar este LXC em modo privilegiado?",
"Create with create_user in the container console": "Crie o utilizador com create_user na consola do contentor",
"Create, send and sign documents with a self-hosted web app.": "Crie, envie e assine documentos com uma aplicação web autoalojada.",
@@ -3893,6 +3894,7 @@
"Linux/Mac path:": "Caminho Linux/Mac:",
"LinuxServer Jellyfin with optional GPU passthrough": "LinuxServer Jellyfin com passagem opcional de GPU",
"LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB requires um usuário, banco de dados e senha",
"LinuxServer Nextcloud with MariaDB and Redis": "Nextcloud da LinuxServer com MariaDB e Redis",
"List Available Disks": "Listar discos disponíveis",
"List IOMMU group mapping": "Listar mapeamento de grupo IOMMU",
"List NVMe devices": "Listar dispositivos NVMe",
@@ -4470,6 +4472,7 @@
"Next Step Required": "Próxima etapa obrigatória",
"Next Steps:": "Próximas etapas:",
"Next step: stop that VM first, then run": "Próxima etapa: pare a VM primeiro e depois execute",
"Nextcloud Web UI": "Interface web do Nextcloud",
"Nextcloud configuration cancelled": "Configuração do Nextcloud cancelada",
"Nextcloud gives you access to all your files wherever you are.": "O Nextcloud dá-lhe acesso a todos os seus ficheiros onde quer que esteja.",
"Nextcloud volume size in GB": "Tamanho do volume Nextcloud em GB",
@@ -5588,6 +5591,7 @@
"Recreation prepared": "Recreação preparada",
"Recursive DNS resolver.": "Resolvedor DNS recursivo.",
"Recursive and authoritative DNS server.": "Servidor DNS recursivo e autoritativo.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.": "O bloqueio de ficheiros com Redis é configurado automaticamente. Os ficheiros de configuração existentes do Nextcloud são preservados.",
"Redmine": "Redmine",
"Refresh APT index and verify repositories:": "Atualize o índice APT e verifique os repositórios:",
"Refresh catalog": "Atualizar catálogo",
@@ -7959,6 +7963,7 @@
"Use a privileged LXC for NFS server/client workflows.": "Use um LXC privilegiado para fluxos de trabalho de servidor/cliente NFS.",
"Use a privileged LXC for Samba client/server workflows.": "Use um LXC privilegiado para fluxos de trabalho cliente/servidor Samba.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Use um nome de host de registro, por exemplo ghcr.io ou registry.example.com:5000.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time.": "Use um proxy inverso HTTPS com um certificado de confiança. Atualize o Nextcloud para a versão principal seguinte, sem saltar nenhuma.",
"Use an existing SSH private key file on this host": "Use um arquivo de chave privada SSH existente neste host",
"Use an existing keyfile": "Use um arquivo-chave existente",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Use uma referência de imagem, por exemplo ghcr.io/owner/app:latest.",
@@ -7972,6 +7977,7 @@
"Use existing filesystem": "Use o sistema de arquivos existente",
"Use existing: mount without formatting": "Use existente: monte sem formatação",
"Use images only if the directory is on suitable storage.": "Use imagens somente se o diretório estiver em um armazenamento adequado.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.": "Use armazenamento gerido para /config e MariaDB. Para /data pode escolher um diretório do host/NAS, que precisa de uma cópia de segurança separada.",
"Use mp1/mp2/... for extra mount points.": "Use mp1/mp2/... para pontos de montagem extras.",
"Use only when unprivileged containers cannot meet your needs": "Use somente quando contêineres sem privilégios não atenderem às suas necessidades",
"Use option 1 to add a local disk (as Proxmox storage and/or as a host mount).": "Use a opção 1 para adicionar um disco local (como armazenamento Proxmox e/ou como montagem de host).",
+6
View File
@@ -1640,6 +1640,7 @@
"Create scheduled backup job": "Vytvoriť naplánovanú úlohu zálohy",
"Create share directory:": "Vytvoriť zdieľaný priečinok:",
"Create shared directory:": "Vytvoriť zdieľaný priečinok:",
"Create the administrator in the web setup; MariaDB and /data are prefilled.": "Vytvorte správcu vo webovom sprievodcovi; nastavenia MariaDB a /data sú už vyplnené.",
"Create this LXC in privileged mode?": "Vytvoriť tento LXC v privilegovanom režime?",
"Create with create_user in the container console": "Používateľa vytvorte príkazom create_user v konzole kontajnera",
"Create, send and sign documents with a self-hosted web app.": "Vytvárajte, posielajte a podpisujte dokumenty vo webovej aplikácii prevádzkovanej vo vlastnej réžii.",
@@ -3893,6 +3894,7 @@
"Linux/Mac path:": "Cesta pre Linux/Mac:",
"LinuxServer Jellyfin with optional GPU passthrough": "LinuxServer Jellyfin s voliteľným GPU priechodom",
"LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB vyžaduje používateľa, databázu a heslo",
"LinuxServer Nextcloud with MariaDB and Redis": "Nextcloud od LinuxServer s MariaDB a Redis",
"List Available Disks": "Zobraziť dostupné disky",
"List IOMMU group mapping": "Zobraziť mapovanie IOMMU skupín",
"List NVMe devices": "Zobraziť NVMe zariadenia",
@@ -4470,6 +4472,7 @@
"Next Step Required": "Je potrebný ďalší krok",
"Next Steps:": "Ďalšie kroky:",
"Next step: stop that VM first, then run": "Ďalší krok: najprv zastavte tú VM, potom spustite",
"Nextcloud Web UI": "Webové rozhranie Nextcloud",
"Nextcloud configuration cancelled": "Konfigurácia Nextcloud zrušená",
"Nextcloud gives you access to all your files wherever you are.": "Nextcloud vám umožní prístup ku všetkým súborom kdekoľvek ste.",
"Nextcloud volume size in GB": "Veľkosť dátového zväzku Nextcloud v GB",
@@ -5590,6 +5593,7 @@
"Recreation prepared": "Pripravené rekreácie",
"Recursive DNS resolver.": "Rekurzívny DNS resolver.",
"Recursive and authoritative DNS server.": "Rekurzívny a autoritatívny DNS server.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.": "Zamykanie súborov pomocou Redis sa nastaví automaticky. Existujúce konfiguračné súbory Nextcloud sa zachovajú.",
"Redmine": "Redmine",
"Refresh APT index and verify repositories:": "Obnovte APT index a overte repozitáre:",
"Refresh catalog": "Aktualizovať katalóg",
@@ -7959,6 +7963,7 @@
"Use a privileged LXC for NFS server/client workflows.": "Pre NFS server/klient používajte privilegovaný LXC.",
"Use a privileged LXC for Samba client/server workflows.": "Pre Samba klient/server používajte privilegovaný LXC.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Použite názov hostiteľa registra, napríklad ghcr.io alebo registry.example.com:5000.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time.": "Použite reverzný proxy server HTTPS s dôveryhodným certifikátom. Nextcloud aktualizujte vždy na nasledujúcu hlavnú verziu, žiadnu nepreskakujte.",
"Use an existing SSH private key file on this host": "Použiť existujúci súbor súkromného SSH kľúča na tomto hostovi",
"Use an existing keyfile": "Použiť existujúci keyfile",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Použite odkaz na obraz, napríklad ghcr.io/owner/app:latest.",
@@ -7972,6 +7977,7 @@
"Use existing filesystem": "Použiť existujúci súborový systém",
"Use existing: mount without formatting": "Použiť existujúci: pripojiť bez formátovania",
"Use images only if the directory is on suitable storage.": "Typ images používajte iba vtedy, ak je priečinok na vhodnom úložisku.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.": "Pre /config a MariaDB použite spravované úložisko. Pre /data môžete vybrať adresár hostiteľa/NAS, ktorý vyžaduje samostatné zálohovanie.",
"Use mp1/mp2/... for extra mount points.": "Pre ďalšie mount pointy použite mp1/mp2/...",
"Use only when unprivileged containers cannot meet your needs": "Použite iba vtedy, keď neprivilegované kontajnery nestačia vašim potrebám",
"Use option 1 to add a local disk (as Proxmox storage and/or as a host mount).": "Použite možnosť 1 na pridanie lokálneho disku (ako úložisko Proxmoxu a/alebo ako mount na hostovi).",
+6
View File
@@ -1640,6 +1640,7 @@
"Create scheduled backup job": "Skapa schemalagt säkerhetskopieringsjobb",
"Create share directory:": "Skapa delningskatalog:",
"Create shared directory:": "Skapa delad katalog:",
"Create the administrator in the web setup; MariaDB and /data are prefilled.": "Skapa administratören i webbguiden; MariaDB och /data är redan ifyllda.",
"Create this LXC in privileged mode?": "Skapa denna LXC i privilegierat läge?",
"Create with create_user in the container console": "Skapa användaren med create_user i containerns konsol",
"Create, send and sign documents with a self-hosted web app.": "Skapa, skicka och signera dokument med en webbapp som du driftar själv.",
@@ -3893,6 +3894,7 @@
"Linux/Mac path:": "Linux/Mac sökväg:",
"LinuxServer Jellyfin with optional GPU passthrough": "LinuxServer Jellyfin med valfri GPU genomgång",
"LinuxServer MariaDB requires a user, database and password": "LinuxServer MariaDB requires en användare, databas och lösenord",
"LinuxServer Nextcloud with MariaDB and Redis": "LinuxServer Nextcloud med MariaDB och Redis",
"List Available Disks": "Lista tillgängliga diskar",
"List IOMMU group mapping": "Lista IOMMU-gruppkartläggning",
"List NVMe devices": "Lista NVMe-enheter",
@@ -4470,6 +4472,7 @@
"Next Step Required": "Nästa steg krävs",
"Next Steps:": "Nästa steg:",
"Next step: stop that VM first, then run": "Nästa steg: stoppa den virtuella datorn först och kör sedan",
"Nextcloud Web UI": "Nextclouds webbgränssnitt",
"Nextcloud configuration cancelled": "Nextcloud konfiguration annullerad",
"Nextcloud gives you access to all your files wherever you are.": "Nextcloud ger dig tillgång till alla dina filer var du än är.",
"Nextcloud volume size in GB": "Nextcloud volymstorlek i GB",
@@ -5588,6 +5591,7 @@
"Recreation prepared": "Rekreation förberedd",
"Recursive DNS resolver.": "Rekursiv DNS-resolver.",
"Recursive and authoritative DNS server.": "Rekursiv och auktoritativ DNS-server.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.": "Fillåsning med Redis konfigureras automatiskt. Befintliga konfigurationsfiler för Nextcloud bevaras.",
"Redmine": "Redmine",
"Refresh APT index and verify repositories:": "Uppdatera APT-index och verifiera förråd:",
"Refresh catalog": "Uppdatera katalogen",
@@ -7959,6 +7963,7 @@
"Use a privileged LXC for NFS server/client workflows.": "Använd en privilegierad LXC för NFS-server/klient-arbetsflöden.",
"Use a privileged LXC for Samba client/server workflows.": "Använd en privilegierad LXC för Samba klient/server arbetsflöden.",
"Use a registry hostname, for example ghcr.io or registry.example.com:5000.": "Använd ett registervärdnamn, till exempel ghcr.io eller registry.example.com:5000.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time.": "Använd en omvänd HTTPS-proxy med ett betrott certifikat. Uppgradera Nextcloud till nästa huvudversion utan att hoppa över någon.",
"Use an existing SSH private key file on this host": "Använd en befintlig privat SSH-nyckelfil på denna värd",
"Use an existing keyfile": "Använd en befintlig nyckelfil",
"Use an image reference, for example ghcr.io/owner/app:latest.": "Använd en bildreferens, till exempel ghcr.io/owner/app:latest.",
@@ -7972,6 +7977,7 @@
"Use existing filesystem": "Använd befintligt filsystem",
"Use existing: mount without formatting": "Använd befintlig: montera utan formatering",
"Use images only if the directory is on suitable storage.": "Använd endast bilder om katalogen finns på lämplig lagring.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.": "Använd hanterad lagring för /config och MariaDB. För /data kan du välja en katalog på värden/NAS som behöver säkerhetskopieras separat.",
"Use mp1/mp2/... for extra mount points.": "Använd mp1/mp2/... för extra monteringspunkter.",
"Use only when unprivileged containers cannot meet your needs": "Använd endast när oprivilegierade behållare inte kan uppfylla dina behov",
"Use option 1 to add a local disk (as Proxmox storage and/or as a host mount).": "Använd alternativ 1 för att lägga till en lokal disk (som Proxmox-lagring och/eller som värdmontering).",
+1 -1
View File
@@ -2,7 +2,7 @@
<!-- Generated from oci/catalog/verification.json by .github/scripts/oci_validation.py. Do not edit by hand. -->
52 of 554 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 555 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.
+691
View File
@@ -0,0 +1,691 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-nextcloud-mariadb",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Nextcloud MariaDB"
},
"tagline": {
"en_US": "LinuxServer Nextcloud with MariaDB and Redis"
},
"description": {
"en_US": "LinuxServer Nextcloud, MariaDB 10.11 and Redis 7 in three native OCI LXC containers. /config and /data are separate; user files can use a host/NAS directory while database state stays in local managed storage."
},
"category": "productivity",
"category_label": "Productivity & Workflows",
"author": "LinuxServer.io",
"developer": "Nextcloud",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nextcloud.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "https",
"port": 443,
"path": "/"
},
"website": "https://nextcloud.com/",
"documentation": "https://docs.linuxserver.io/images/docker-nextcloud/",
"repository": "https://github.com/linuxserver/docker-nextcloud",
"tips": [
"Create the administrator in the web setup; MariaDB and /data are prefilled.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "linuxserver",
"repository": "https://github.com/linuxserver/docker-nextcloud",
"revision": "bde257b20aa3ea653bf6900d22356c15cede5cc8",
"image_repository_url": "https://github.com/linuxserver/docker-nextcloud/pkgs/container/nextcloud",
"readme_pushed_at": "",
"compose_sha256": "f68fd416080b89759c26e3d1c805c431ab3158048ed83fbdd6aabb4f166c78d0",
"generated_at": "2026-11-03T22:32:36+00:00"
},
"container_contract": {
"service_name": "nextcloud",
"container_name": "nextcloud",
"image": {
"reference": "lscr.io/linuxserver/nextcloud:latest",
"registry": "lscr.io",
"repository": "lscr.io/linuxserver/nextcloud",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "MYSQL_DATABASE",
"example": "nextcloud",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "MYSQL_HOST",
"example": "db",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "MYSQL_PASSWORD",
"example": "${GENERATED_GENERATED_DB_PASSWORD}",
"required": true,
"sensitive": true,
"source": "docker-compose"
},
{
"name": "MYSQL_USER",
"example": "nextcloud",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "PGID",
"example": "${PGID}",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "PUID",
"example": "${PUID}",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "TZ",
"example": "${TZ}",
"required": true,
"sensitive": false,
"source": "docker-compose"
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/config",
"compose_source_example": "config",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 8
}
},
{
"id": "volume-1",
"container_path": "/data",
"compose_source_example": "data",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 8
}
}
],
"ports": [
{
"container_port": 443,
"published_example": 443,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [
{
"name": "db",
"image": "mariadb:10.11"
},
{
"name": "redis",
"image": "redis:7-alpine"
}
],
"restart": "unless-stopped",
"stop_grace_period": null,
"original_compose": "name: nextcloud\nservices:\n db:\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_ROOT_PASSWORD: ${GENERATED_DB_ROOT_PASSWORD}\n MYSQL_USER: nextcloud\n TZ: ${TZ}\n image: mariadb:10.11\n restart: unless-stopped\n volumes:\n - read_only: false\n source: database\n target: /var/lib/mysql\n mem_limit: 1g\n healthcheck:\n test:\n - CMD\n - healthcheck.sh\n - --connect\n - --innodb_initialized\n interval: 10s\n timeout: 5s\n retries: 30\n nextcloud:\n depends_on:\n db:\n condition: service_healthy\n redis:\n condition: service_healthy\n entrypoint:\n - /bin/sh\n - -ec\n - \"umask 077\\nphp -r '$dir = '\\\"'\\\"'/config/www/nextcloud/config'\\\"'\\\"';\\nif (!is_dir($dir)\\\n \\ && !mkdir($dir, 0770, true)) { throw new RuntimeException('\\\"'\\\"'Cannot create\\\n \\ the Nextcloud config directory'\\\"'\\\"'); }\\nif (!is_file($dir . '\\\"'\\\"'/config.php'\\\"\\\n '\\\"') && !is_file($dir . '\\\"'\\\"'/autoconfig.php'\\\"'\\\"')) {\\n foreach (['\\\"\\\n '\\\"'MYSQL_HOST'\\\"'\\\"', '\\\"'\\\"'MYSQL_DATABASE'\\\"'\\\"', '\\\"'\\\"'MYSQL_USER'\\\"'\\\"\\\n ', '\\\"'\\\"'MYSQL_PASSWORD'\\\"'\\\"'] as $name) {\\n if (getenv($name) ===\\\n \\ false || getenv($name) === '\\\"'\\\"''\\\"'\\\"') { throw new RuntimeException('\\\"\\\n '\\\"'Missing Nextcloud database setting: '\\\"'\\\"' . $name); }\\n }\\n $settings\\\n \\ = ['\\\"'\\\"'dbtype'\\\"'\\\"' => '\\\"'\\\"'mysql'\\\"'\\\"', '\\\"'\\\"'dbhost'\\\"'\\\"' => getenv('\\\"\\\n '\\\"'MYSQL_HOST'\\\"'\\\"'), '\\\"'\\\"'dbname'\\\"'\\\"' => getenv('\\\"'\\\"'MYSQL_DATABASE'\\\"\\\n '\\\"'), '\\\"'\\\"'dbuser'\\\"'\\\"' => getenv('\\\"'\\\"'MYSQL_USER'\\\"'\\\"'), '\\\"'\\\"'dbpass'\\\"\\\n '\\\"' => getenv('\\\"'\\\"'MYSQL_PASSWORD'\\\"'\\\"'), '\\\"'\\\"'directory'\\\"'\\\"' => '\\\"\\\n '\\\"'/data'\\\"'\\\"'];\\n $path = $dir . '\\\"'\\\"'/autoconfig.php'\\\"'\\\"';\\n if\\\n \\ (file_put_contents($path, \\\"<?php\\\\n\\\\$AUTOCONFIG = \\\" . var_export($settings,\\\n \\ true) . \\\";\\\\n\\\", LOCK_EX) === false) { throw new RuntimeException('\\\"'\\\"\\\n 'Cannot write the Nextcloud database configuration'\\\"'\\\"'); }\\n chmod($path,\\\n \\ 0600);\\n}\\n$path = $dir . '\\\"'\\\"'/proxmenux-redis.config.php'\\\"'\\\"';\\nif (!is_file($path))\\\n \\ {\\n $settings = ['\\\"'\\\"'filelocking.enabled'\\\"'\\\"' => true, '\\\"'\\\"'memcache.local'\\\"\\\n '\\\"' => '\\\"'\\\"'\\\\OC\\\\Memcache\\\\APCu'\\\"'\\\"', '\\\"'\\\"'memcache.locking'\\\"'\\\"' =>\\\n \\ '\\\"'\\\"'\\\\OC\\\\Memcache\\\\Redis'\\\"'\\\"', '\\\"'\\\"'redis'\\\"'\\\"' => ['\\\"'\\\"'host'\\\"\\\n '\\\"' => '\\\"'\\\"'redis'\\\"'\\\"', '\\\"'\\\"'port'\\\"'\\\"' => 6379, '\\\"'\\\"'timeout'\\\"'\\\"\\\n ' => 0.0]];\\n if (file_put_contents($path, \\\"<?php\\\\n\\\\$CONFIG = \\\" . var_export($settings,\\\n \\ true) . \\\";\\\\n\\\", LOCK_EX) === false) { throw new RuntimeException('\\\"'\\\"\\\n 'Cannot write the Nextcloud Redis configuration'\\\"'\\\"'); }\\n chmod($path,\\\n \\ 0600);\\n}'\\nexec /init\"\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_HOST: db\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_USER: nextcloud\n PGID: ${PGID}\n PUID: ${PUID}\n TZ: ${TZ}\n image: lscr.io/linuxserver/nextcloud:latest\n ports:\n - 443:443\n restart: unless-stopped\n volumes:\n - read_only: false\n source: config\n target: /config\n - read_only: false\n source: data\n target: /data\n mem_limit: 2g\n redis:\n image: redis:7-alpine\n restart: unless-stopped\n volumes:\n - read_only: false\n source: redis\n target: /data\n mem_limit: 512m\n healthcheck:\n test:\n - CMD\n - redis-cli\n - ping\n interval: 10s\n timeout: 5s\n retries: 30\nvolumes:\n config: {}\n data: {}\n database: {}\n redis: {}\n"
},
"compose_stack": {
"project_name": "nextcloud",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "nextcloud",
"service_count": 3,
"services": [
{
"name": "db",
"image": "mariadb:10.11",
"is_main": false,
"role": "dependency",
"vmid_offset": 1,
"depends_on": [],
"frontend_network": false,
"private_network": true,
"compose": {
"environment": {
"MYSQL_DATABASE": "nextcloud",
"MYSQL_USER": "nextcloud",
"MYSQL_PASSWORD": "${GENERATED_DB_PASSWORD}",
"MYSQL_ROOT_PASSWORD": "${GENERATED_DB_ROOT_PASSWORD}",
"TZ": "${TZ}"
},
"image": "mariadb:10.11",
"restart": "unless-stopped",
"volumes": [
{
"source": "database",
"target": "/var/lib/mysql",
"read_only": false
}
],
"mem_limit": "1g",
"healthcheck": {
"test": [
"CMD",
"healthcheck.sh",
"--connect",
"--innodb_initialized"
],
"interval": "10s",
"timeout": "5s",
"retries": 30
}
}
},
{
"name": "redis",
"image": "redis:7-alpine",
"is_main": false,
"role": "dependency",
"vmid_offset": 2,
"depends_on": [],
"frontend_network": false,
"private_network": true,
"compose": {
"image": "redis:7-alpine",
"restart": "unless-stopped",
"volumes": [
{
"source": "redis",
"target": "/data",
"read_only": false
}
],
"mem_limit": "512m",
"healthcheck": {
"test": [
"CMD",
"redis-cli",
"ping"
],
"interval": "10s",
"timeout": "5s",
"retries": 30
}
}
},
{
"name": "nextcloud",
"image": "lscr.io/linuxserver/nextcloud:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [
"db",
"redis"
],
"frontend_network": true,
"private_network": true,
"compose": {
"depends_on": {
"db": {
"condition": "service_healthy"
},
"redis": {
"condition": "service_healthy"
}
},
"entrypoint": [
"/bin/sh",
"-ec",
"umask 077\nphp -r '$dir = '\"'\"'/config/www/nextcloud/config'\"'\"';\nif (!is_dir($dir) && !mkdir($dir, 0770, true)) { throw new RuntimeException('\"'\"'Cannot create the Nextcloud config directory'\"'\"'); }\nif (!is_file($dir . '\"'\"'/config.php'\"'\"') && !is_file($dir . '\"'\"'/autoconfig.php'\"'\"')) {\n foreach (['\"'\"'MYSQL_HOST'\"'\"', '\"'\"'MYSQL_DATABASE'\"'\"', '\"'\"'MYSQL_USER'\"'\"', '\"'\"'MYSQL_PASSWORD'\"'\"'] as $name) {\n if (getenv($name) === false || getenv($name) === '\"'\"''\"'\"') { throw new RuntimeException('\"'\"'Missing Nextcloud database setting: '\"'\"' . $name); }\n }\n $settings = ['\"'\"'dbtype'\"'\"' => '\"'\"'mysql'\"'\"', '\"'\"'dbhost'\"'\"' => getenv('\"'\"'MYSQL_HOST'\"'\"'), '\"'\"'dbname'\"'\"' => getenv('\"'\"'MYSQL_DATABASE'\"'\"'), '\"'\"'dbuser'\"'\"' => getenv('\"'\"'MYSQL_USER'\"'\"'), '\"'\"'dbpass'\"'\"' => getenv('\"'\"'MYSQL_PASSWORD'\"'\"'), '\"'\"'directory'\"'\"' => '\"'\"'/data'\"'\"'];\n $path = $dir . '\"'\"'/autoconfig.php'\"'\"';\n if (file_put_contents($path, \"<?php\\n\\$AUTOCONFIG = \" . var_export($settings, true) . \";\\n\", LOCK_EX) === false) { throw new RuntimeException('\"'\"'Cannot write the Nextcloud database configuration'\"'\"'); }\n chmod($path, 0600);\n}\n$path = $dir . '\"'\"'/proxmenux-redis.config.php'\"'\"';\nif (!is_file($path)) {\n $settings = ['\"'\"'filelocking.enabled'\"'\"' => true, '\"'\"'memcache.local'\"'\"' => '\"'\"'\\OC\\Memcache\\APCu'\"'\"', '\"'\"'memcache.locking'\"'\"' => '\"'\"'\\OC\\Memcache\\Redis'\"'\"', '\"'\"'redis'\"'\"' => ['\"'\"'host'\"'\"' => '\"'\"'redis'\"'\"', '\"'\"'port'\"'\"' => 6379, '\"'\"'timeout'\"'\"' => 0.0]];\n if (file_put_contents($path, \"<?php\\n\\$CONFIG = \" . var_export($settings, true) . \";\\n\", LOCK_EX) === false) { throw new RuntimeException('\"'\"'Cannot write the Nextcloud Redis configuration'\"'\"'); }\n chmod($path, 0600);\n}'\nexec /init"
],
"environment": {
"PUID": "${PUID}",
"PGID": "${PGID}",
"TZ": "${TZ}",
"MYSQL_HOST": "db",
"MYSQL_DATABASE": "nextcloud",
"MYSQL_USER": "nextcloud",
"MYSQL_PASSWORD": "${GENERATED_DB_PASSWORD}"
},
"image": "lscr.io/linuxserver/nextcloud:latest",
"ports": [
"443:443"
],
"restart": "unless-stopped",
"volumes": [
{
"source": "config",
"target": "/config",
"read_only": false
},
{
"source": "data",
"target": "/data",
"read_only": false
}
],
"mem_limit": "2g"
}
}
],
"top_level": {
"name": "nextcloud",
"volumes": {
"config": {},
"data": {},
"database": {},
"redis": {}
}
},
"networking": {
"frontend": "selected-proxmox-bridge",
"private_required": true,
"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": "db-volume-0",
"service": "db",
"container_path": "/var/lib/mysql",
"mode": "managed-volume",
"user_selectable": false,
"backup": true,
"shared_with_other_lxc": false,
"source_path": null,
"source_path_prompt": null
},
{
"id": "nextcloud-volume-0",
"service": "nextcloud",
"container_path": "/config",
"mode": "managed-volume",
"user_selectable": false,
"backup": true,
"shared_with_other_lxc": false,
"source_path": null,
"source_path_prompt": null
},
{
"id": "nextcloud-volume-1",
"service": "nextcloud",
"container_path": "/data",
"mode": "user-selectable",
"user_selectable": true,
"backup": true,
"shared_with_other_lxc": false,
"source_path": null,
"source_path_prompt": null
},
{
"id": "redis-volume-0",
"service": "redis",
"container_path": "/data",
"mode": "managed-volume",
"user_selectable": false,
"backup": true,
"shared_with_other_lxc": false,
"source_path": null,
"source_path_prompt": null
}
],
"orchestration": {
"reserve_vmids_atomically": 3,
"start_order": [
"db",
"redis",
"nextcloud"
],
"stop_order": [
"nextcloud",
"redis",
"db"
],
"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": "generated-db-password",
"strategy": "generate-cryptographically-random-at-install",
"bindings": [
{
"service": "db",
"environment_variable": "MYSQL_PASSWORD"
},
{
"service": "nextcloud",
"environment_variable": "MYSQL_PASSWORD"
}
]
},
{
"id": "generated-db-root-password",
"strategy": "generate-cryptographically-random-at-install",
"bindings": [
{
"service": "db",
"environment_variable": "MYSQL_ROOT_PASSWORD"
}
]
}
]
}
},
"first_run": {
"endpoints": [
{
"label": "Nextcloud Web UI",
"scheme": "https",
"port": 443,
"path": "/",
"source": "linuxserver-nextcloud-documentation"
}
],
"credentials": []
},
"proxmox": {
"runtime": "native-oci-lxc",
"technology_status": "proxmox-technology-preview",
"defaults": {
"unprivileged": true,
"ostype": "auto-from-image",
"cores": 2,
"memory_mb": 2048,
"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"
},
"installer_profile": {
"stack_driver": "generic-multi-lxc-stack",
"volume_preparations": [
{
"container_path": "/config",
"owner_strategy": "mapped-root",
"remove_lost_found": true,
"only_when_mount_type": "managed-volume"
},
{
"container_path": "/data",
"owner_strategy": "mapped-application-user",
"remove_lost_found": true
}
]
},
"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": "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",
"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": "pending",
"service_health": "pending",
"restart_persistence": "pending",
"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,
"dependency_lifecycle": {
"implementation": "proxmox-hookscript",
"trigger": "main-lxc-pre-start",
"waits_for_dependency_healthchecks": true,
"stops_dependencies_with_main": false
}
}
}
+691
View File
@@ -0,0 +1,691 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-nextcloud-mariadb",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Nextcloud MariaDB"
},
"tagline": {
"en_US": "LinuxServer Nextcloud with MariaDB and Redis"
},
"description": {
"en_US": "LinuxServer Nextcloud, MariaDB 10.11 and Redis 7 in three native OCI LXC containers. /config and /data are separate; user files can use a host/NAS directory while database state stays in local managed storage."
},
"category": "productivity",
"category_label": "Productivity & Workflows",
"author": "LinuxServer.io",
"developer": "Nextcloud",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nextcloud.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "https",
"port": 443,
"path": "/"
},
"website": "https://nextcloud.com/",
"documentation": "https://docs.linuxserver.io/images/docker-nextcloud/",
"repository": "https://github.com/linuxserver/docker-nextcloud",
"tips": [
"Create the administrator in the web setup; MariaDB and /data are prefilled.",
"Use managed storage for /config and MariaDB. A host/NAS directory can be selected for /data and needs a separate backup.",
"Redis locking is configured automatically. Existing Nextcloud configuration files are preserved.",
"Use a trusted HTTPS reverse proxy. Upgrade Nextcloud one major version at a time."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "linuxserver",
"repository": "https://github.com/linuxserver/docker-nextcloud",
"revision": "bde257b20aa3ea653bf6900d22356c15cede5cc8",
"image_repository_url": "https://github.com/linuxserver/docker-nextcloud/pkgs/container/nextcloud",
"readme_pushed_at": "",
"compose_sha256": "f68fd416080b89759c26e3d1c805c431ab3158048ed83fbdd6aabb4f166c78d0",
"generated_at": "2026-11-03T22:32:36+00:00"
},
"container_contract": {
"service_name": "nextcloud",
"container_name": "nextcloud",
"image": {
"reference": "lscr.io/linuxserver/nextcloud:latest",
"registry": "lscr.io",
"repository": "lscr.io/linuxserver/nextcloud",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "MYSQL_DATABASE",
"example": "nextcloud",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "MYSQL_HOST",
"example": "db",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "MYSQL_PASSWORD",
"example": "${GENERATED_GENERATED_DB_PASSWORD}",
"required": true,
"sensitive": true,
"source": "docker-compose"
},
{
"name": "MYSQL_USER",
"example": "nextcloud",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "PGID",
"example": "${PGID}",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "PUID",
"example": "${PUID}",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "TZ",
"example": "${TZ}",
"required": true,
"sensitive": false,
"source": "docker-compose"
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/config",
"compose_source_example": "config",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 8
}
},
{
"id": "volume-1",
"container_path": "/data",
"compose_source_example": "data",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 8
}
}
],
"ports": [
{
"container_port": 443,
"published_example": 443,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [
{
"name": "db",
"image": "mariadb:10.11"
},
{
"name": "redis",
"image": "redis:7-alpine"
}
],
"restart": "unless-stopped",
"stop_grace_period": null,
"original_compose": "name: nextcloud\nservices:\n db:\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_ROOT_PASSWORD: ${GENERATED_DB_ROOT_PASSWORD}\n MYSQL_USER: nextcloud\n TZ: ${TZ}\n image: mariadb:10.11\n restart: unless-stopped\n volumes:\n - read_only: false\n source: database\n target: /var/lib/mysql\n mem_limit: 1g\n healthcheck:\n test:\n - CMD\n - healthcheck.sh\n - --connect\n - --innodb_initialized\n interval: 10s\n timeout: 5s\n retries: 30\n nextcloud:\n depends_on:\n db:\n condition: service_healthy\n redis:\n condition: service_healthy\n entrypoint:\n - /bin/sh\n - -ec\n - \"umask 077\\nphp -r '$dir = '\\\"'\\\"'/config/www/nextcloud/config'\\\"'\\\"';\\nif (!is_dir($dir)\\\n \\ && !mkdir($dir, 0770, true)) { throw new RuntimeException('\\\"'\\\"'Cannot create\\\n \\ the Nextcloud config directory'\\\"'\\\"'); }\\nif (!is_file($dir . '\\\"'\\\"'/config.php'\\\"\\\n '\\\"') && !is_file($dir . '\\\"'\\\"'/autoconfig.php'\\\"'\\\"')) {\\n foreach (['\\\"\\\n '\\\"'MYSQL_HOST'\\\"'\\\"', '\\\"'\\\"'MYSQL_DATABASE'\\\"'\\\"', '\\\"'\\\"'MYSQL_USER'\\\"'\\\"\\\n ', '\\\"'\\\"'MYSQL_PASSWORD'\\\"'\\\"'] as $name) {\\n if (getenv($name) ===\\\n \\ false || getenv($name) === '\\\"'\\\"''\\\"'\\\"') { throw new RuntimeException('\\\"\\\n '\\\"'Missing Nextcloud database setting: '\\\"'\\\"' . $name); }\\n }\\n $settings\\\n \\ = ['\\\"'\\\"'dbtype'\\\"'\\\"' => '\\\"'\\\"'mysql'\\\"'\\\"', '\\\"'\\\"'dbhost'\\\"'\\\"' => getenv('\\\"\\\n '\\\"'MYSQL_HOST'\\\"'\\\"'), '\\\"'\\\"'dbname'\\\"'\\\"' => getenv('\\\"'\\\"'MYSQL_DATABASE'\\\"\\\n '\\\"'), '\\\"'\\\"'dbuser'\\\"'\\\"' => getenv('\\\"'\\\"'MYSQL_USER'\\\"'\\\"'), '\\\"'\\\"'dbpass'\\\"\\\n '\\\"' => getenv('\\\"'\\\"'MYSQL_PASSWORD'\\\"'\\\"'), '\\\"'\\\"'directory'\\\"'\\\"' => '\\\"\\\n '\\\"'/data'\\\"'\\\"'];\\n $path = $dir . '\\\"'\\\"'/autoconfig.php'\\\"'\\\"';\\n if\\\n \\ (file_put_contents($path, \\\"<?php\\\\n\\\\$AUTOCONFIG = \\\" . var_export($settings,\\\n \\ true) . \\\";\\\\n\\\", LOCK_EX) === false) { throw new RuntimeException('\\\"'\\\"\\\n 'Cannot write the Nextcloud database configuration'\\\"'\\\"'); }\\n chmod($path,\\\n \\ 0600);\\n}\\n$path = $dir . '\\\"'\\\"'/proxmenux-redis.config.php'\\\"'\\\"';\\nif (!is_file($path))\\\n \\ {\\n $settings = ['\\\"'\\\"'filelocking.enabled'\\\"'\\\"' => true, '\\\"'\\\"'memcache.local'\\\"\\\n '\\\"' => '\\\"'\\\"'\\\\OC\\\\Memcache\\\\APCu'\\\"'\\\"', '\\\"'\\\"'memcache.locking'\\\"'\\\"' =>\\\n \\ '\\\"'\\\"'\\\\OC\\\\Memcache\\\\Redis'\\\"'\\\"', '\\\"'\\\"'redis'\\\"'\\\"' => ['\\\"'\\\"'host'\\\"\\\n '\\\"' => '\\\"'\\\"'redis'\\\"'\\\"', '\\\"'\\\"'port'\\\"'\\\"' => 6379, '\\\"'\\\"'timeout'\\\"'\\\"\\\n ' => 0.0]];\\n if (file_put_contents($path, \\\"<?php\\\\n\\\\$CONFIG = \\\" . var_export($settings,\\\n \\ true) . \\\";\\\\n\\\", LOCK_EX) === false) { throw new RuntimeException('\\\"'\\\"\\\n 'Cannot write the Nextcloud Redis configuration'\\\"'\\\"'); }\\n chmod($path,\\\n \\ 0600);\\n}'\\nexec /init\"\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_HOST: db\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_USER: nextcloud\n PGID: ${PGID}\n PUID: ${PUID}\n TZ: ${TZ}\n image: lscr.io/linuxserver/nextcloud:latest\n ports:\n - 443:443\n restart: unless-stopped\n volumes:\n - read_only: false\n source: config\n target: /config\n - read_only: false\n source: data\n target: /data\n mem_limit: 2g\n redis:\n image: redis:7-alpine\n restart: unless-stopped\n volumes:\n - read_only: false\n source: redis\n target: /data\n mem_limit: 512m\n healthcheck:\n test:\n - CMD\n - redis-cli\n - ping\n interval: 10s\n timeout: 5s\n retries: 30\nvolumes:\n config: {}\n data: {}\n database: {}\n redis: {}\n"
},
"compose_stack": {
"project_name": "nextcloud",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "nextcloud",
"service_count": 3,
"services": [
{
"name": "db",
"image": "mariadb:10.11",
"is_main": false,
"role": "dependency",
"vmid_offset": 1,
"depends_on": [],
"frontend_network": false,
"private_network": true,
"compose": {
"environment": {
"MYSQL_DATABASE": "nextcloud",
"MYSQL_USER": "nextcloud",
"MYSQL_PASSWORD": "${GENERATED_DB_PASSWORD}",
"MYSQL_ROOT_PASSWORD": "${GENERATED_DB_ROOT_PASSWORD}",
"TZ": "${TZ}"
},
"image": "mariadb:10.11",
"restart": "unless-stopped",
"volumes": [
{
"source": "database",
"target": "/var/lib/mysql",
"read_only": false
}
],
"mem_limit": "1g",
"healthcheck": {
"test": [
"CMD",
"healthcheck.sh",
"--connect",
"--innodb_initialized"
],
"interval": "10s",
"timeout": "5s",
"retries": 30
}
}
},
{
"name": "redis",
"image": "redis:7-alpine",
"is_main": false,
"role": "dependency",
"vmid_offset": 2,
"depends_on": [],
"frontend_network": false,
"private_network": true,
"compose": {
"image": "redis:7-alpine",
"restart": "unless-stopped",
"volumes": [
{
"source": "redis",
"target": "/data",
"read_only": false
}
],
"mem_limit": "512m",
"healthcheck": {
"test": [
"CMD",
"redis-cli",
"ping"
],
"interval": "10s",
"timeout": "5s",
"retries": 30
}
}
},
{
"name": "nextcloud",
"image": "lscr.io/linuxserver/nextcloud:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [
"db",
"redis"
],
"frontend_network": true,
"private_network": true,
"compose": {
"depends_on": {
"db": {
"condition": "service_healthy"
},
"redis": {
"condition": "service_healthy"
}
},
"entrypoint": [
"/bin/sh",
"-ec",
"umask 077\nphp -r '$dir = '\"'\"'/config/www/nextcloud/config'\"'\"';\nif (!is_dir($dir) && !mkdir($dir, 0770, true)) { throw new RuntimeException('\"'\"'Cannot create the Nextcloud config directory'\"'\"'); }\nif (!is_file($dir . '\"'\"'/config.php'\"'\"') && !is_file($dir . '\"'\"'/autoconfig.php'\"'\"')) {\n foreach (['\"'\"'MYSQL_HOST'\"'\"', '\"'\"'MYSQL_DATABASE'\"'\"', '\"'\"'MYSQL_USER'\"'\"', '\"'\"'MYSQL_PASSWORD'\"'\"'] as $name) {\n if (getenv($name) === false || getenv($name) === '\"'\"''\"'\"') { throw new RuntimeException('\"'\"'Missing Nextcloud database setting: '\"'\"' . $name); }\n }\n $settings = ['\"'\"'dbtype'\"'\"' => '\"'\"'mysql'\"'\"', '\"'\"'dbhost'\"'\"' => getenv('\"'\"'MYSQL_HOST'\"'\"'), '\"'\"'dbname'\"'\"' => getenv('\"'\"'MYSQL_DATABASE'\"'\"'), '\"'\"'dbuser'\"'\"' => getenv('\"'\"'MYSQL_USER'\"'\"'), '\"'\"'dbpass'\"'\"' => getenv('\"'\"'MYSQL_PASSWORD'\"'\"'), '\"'\"'directory'\"'\"' => '\"'\"'/data'\"'\"'];\n $path = $dir . '\"'\"'/autoconfig.php'\"'\"';\n if (file_put_contents($path, \"<?php\\n\\$AUTOCONFIG = \" . var_export($settings, true) . \";\\n\", LOCK_EX) === false) { throw new RuntimeException('\"'\"'Cannot write the Nextcloud database configuration'\"'\"'); }\n chmod($path, 0600);\n}\n$path = $dir . '\"'\"'/proxmenux-redis.config.php'\"'\"';\nif (!is_file($path)) {\n $settings = ['\"'\"'filelocking.enabled'\"'\"' => true, '\"'\"'memcache.local'\"'\"' => '\"'\"'\\OC\\Memcache\\APCu'\"'\"', '\"'\"'memcache.locking'\"'\"' => '\"'\"'\\OC\\Memcache\\Redis'\"'\"', '\"'\"'redis'\"'\"' => ['\"'\"'host'\"'\"' => '\"'\"'redis'\"'\"', '\"'\"'port'\"'\"' => 6379, '\"'\"'timeout'\"'\"' => 0.0]];\n if (file_put_contents($path, \"<?php\\n\\$CONFIG = \" . var_export($settings, true) . \";\\n\", LOCK_EX) === false) { throw new RuntimeException('\"'\"'Cannot write the Nextcloud Redis configuration'\"'\"'); }\n chmod($path, 0600);\n}'\nexec /init"
],
"environment": {
"PUID": "${PUID}",
"PGID": "${PGID}",
"TZ": "${TZ}",
"MYSQL_HOST": "db",
"MYSQL_DATABASE": "nextcloud",
"MYSQL_USER": "nextcloud",
"MYSQL_PASSWORD": "${GENERATED_DB_PASSWORD}"
},
"image": "lscr.io/linuxserver/nextcloud:latest",
"ports": [
"443:443"
],
"restart": "unless-stopped",
"volumes": [
{
"source": "config",
"target": "/config",
"read_only": false
},
{
"source": "data",
"target": "/data",
"read_only": false
}
],
"mem_limit": "2g"
}
}
],
"top_level": {
"name": "nextcloud",
"volumes": {
"config": {},
"data": {},
"database": {},
"redis": {}
}
},
"networking": {
"frontend": "selected-proxmox-bridge",
"private_required": true,
"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": "db-volume-0",
"service": "db",
"container_path": "/var/lib/mysql",
"mode": "managed-volume",
"user_selectable": false,
"backup": true,
"shared_with_other_lxc": false,
"source_path": null,
"source_path_prompt": null
},
{
"id": "nextcloud-volume-0",
"service": "nextcloud",
"container_path": "/config",
"mode": "managed-volume",
"user_selectable": false,
"backup": true,
"shared_with_other_lxc": false,
"source_path": null,
"source_path_prompt": null
},
{
"id": "nextcloud-volume-1",
"service": "nextcloud",
"container_path": "/data",
"mode": "user-selectable",
"user_selectable": true,
"backup": true,
"shared_with_other_lxc": false,
"source_path": null,
"source_path_prompt": null
},
{
"id": "redis-volume-0",
"service": "redis",
"container_path": "/data",
"mode": "managed-volume",
"user_selectable": false,
"backup": true,
"shared_with_other_lxc": false,
"source_path": null,
"source_path_prompt": null
}
],
"orchestration": {
"reserve_vmids_atomically": 3,
"start_order": [
"db",
"redis",
"nextcloud"
],
"stop_order": [
"nextcloud",
"redis",
"db"
],
"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": "generated-db-password",
"strategy": "generate-cryptographically-random-at-install",
"bindings": [
{
"service": "db",
"environment_variable": "MYSQL_PASSWORD"
},
{
"service": "nextcloud",
"environment_variable": "MYSQL_PASSWORD"
}
]
},
{
"id": "generated-db-root-password",
"strategy": "generate-cryptographically-random-at-install",
"bindings": [
{
"service": "db",
"environment_variable": "MYSQL_ROOT_PASSWORD"
}
]
}
]
}
},
"first_run": {
"endpoints": [
{
"label": "Nextcloud Web UI",
"scheme": "https",
"port": 443,
"path": "/",
"source": "linuxserver-nextcloud-documentation"
}
],
"credentials": []
},
"proxmox": {
"runtime": "native-oci-lxc",
"technology_status": "proxmox-technology-preview",
"defaults": {
"unprivileged": true,
"ostype": "auto-from-image",
"cores": 2,
"memory_mb": 2048,
"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"
},
"installer_profile": {
"stack_driver": "generic-multi-lxc-stack",
"volume_preparations": [
{
"container_path": "/config",
"owner_strategy": "mapped-root",
"remove_lost_found": true,
"only_when_mount_type": "managed-volume"
},
{
"container_path": "/data",
"owner_strategy": "mapped-application-user",
"remove_lost_found": true
}
]
},
"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": "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",
"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": "pending",
"service_health": "pending",
"restart_persistence": "pending",
"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,
"dependency_lifecycle": {
"implementation": "proxmox-hookscript",
"trigger": "main-lxc-pre-start",
"waits_for_dependency_healthchecks": true,
"stops_dependencies_with_main": false
}
}
}
+32
View File
@@ -19414,6 +19414,38 @@
"optional_relaxed_confinement": false,
"requires_security_confirmation": false,
"hidden": false
},
{
"id": "nextcloud-mariadb",
"provider": "linuxserver",
"template_family": "curated-profile",
"title": "Nextcloud MariaDB",
"repository": "https://github.com/linuxserver/docker-nextcloud",
"description": "Three native OCI LXC containers: LinuxServer Nextcloud, MariaDB 10.11 and Redis 7. Application settings and user files have separate persistent volumes; only user files can use a host/NAS directory.",
"website": "https://nextcloud.com/",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nextcloud.webp",
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "lscr.io/linuxserver/nextcloud:latest",
"category": "productivity",
"category_label": "Productivity & Workflows",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/nextcloud-mariadb.json",
"template_id": "image-nextcloud-mariadb",
"template": "apps/nextcloud-mariadb.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
}
],
"discovery": {
+3
View File
@@ -161,6 +161,9 @@
],
"wordcraft": [
"/storage"
],
"nextcloud-mariadb": [
"/data"
]
},
"sizes": {
+126
View File
@@ -0,0 +1,126 @@
"""The LinuxServer/MariaDB variant keeps its complete private stack and safe bootstrap."""
import json
import os
from pathlib import Path
import shutil
import subprocess
import sys
import tempfile
import unittest
from contextlib import ExitStack
from unittest.mock import patch
ROOT = Path(__file__).resolve().parents[1]
sys.path[:0] = [str(ROOT / 'src'), str(Path(__file__).parent)]
from proxmenux_oci.catalog import Catalog
from proxmenux_oci.custom import template_from_oci_compose
from proxmenux_oci.installer import ADVANCED_MODE, DEFAULT_MODE, build_deployment
from proxmenux_oci.stack import assess
from test_advanced_flow_order import RecordingUI, storages, addresses
class NextcloudMariaDBTests(unittest.TestCase):
def setUp(self):
self.catalog = Catalog(ROOT)
self.template = self.catalog.compose('nextcloud-mariadb')
def test_catalog_roundtrip_preserves_the_original_image_families_and_tls(self):
t = template_from_oci_compose(json.dumps(self.template))
self.catalog.validate(t)
self.assertEqual(assess(t), [])
services = {s['name']: s for s in t['compose_stack']['services']}
self.assertEqual({k: v['image'] for k, v in services.items()}, {
'nextcloud': 'lscr.io/linuxserver/nextcloud:latest',
'db': 'mariadb:10.11', 'redis': 'redis:7-alpine'})
self.assertEqual(t['first_run']['endpoints'][0]['scheme'], 'https')
self.assertEqual(t['first_run']['endpoints'][0]['port'], 443)
self.assertTrue(t['catalog_ui']['icon'].startswith('https://'))
self.assertEqual(set(services['nextcloud']['depends_on']), {'db', 'redis'})
for name in ('db', 'redis'):
self.assertFalse(services[name]['compose'].get('ports'))
self.assertFalse(services[name]['frontend_network'])
def plan(self, mode, answers=None):
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))
for target, value in [
('proxmenux_oci.i18n.language', 'en'),
('proxmenux_oci.installer.host.bridges', [{'iface': 'vmbr0', 'cidr': '192.0.2.1/24'}]),
('proxmenux_oci.installer.host.timezone', 'Europe/Madrid')]:
stack.enter_context(patch(target, return_value=value))
return build_deployment(self.template, RecordingUI(answers), mode)
def test_default_and_advanced_plans_keep_shared_secrets_private_dependencies_and_persistence(self):
for mode in (DEFAULT_MODE, ADVANCED_MODE):
with self.subTest(mode=mode):
plan = self.plan(mode)
services = {s['name']: s for s in plan['services']}
env = {name: {e['name']: e['value'] for e in s['deployment']['environment']}
for name, s in services.items()}
self.assertEqual(env['nextcloud']['MYSQL_PASSWORD'], env['db']['MYSQL_PASSWORD'])
self.assertNotEqual(env['db']['MYSQL_PASSWORD'], env['db']['MYSQL_ROOT_PASSWORD'])
self.assertEqual(env['nextcloud']['MYSQL_HOST'], 'db')
self.assertEqual([s['name'] for s in plan['services']], ['db', 'redis', 'nextcloud'])
self.assertEqual([s['name'] for s in plan['services'] if s.get('frontend')], ['nextcloud'])
self.assertEqual(services['db']['healthcheck']['argv'][0], 'healthcheck.sh')
self.assertEqual(services['nextcloud']['healthcheck']['endpoint']['scheme'], 'https')
self.assertEqual({k: s['deployment']['hostname'] for k, s in services.items()},
{'nextcloud': 'nextcloud', 'db': 'nextcloud-db', 'redis': 'nextcloud-redis'})
for service in services.values():
self.assertTrue(service['deployment']['security']['unprivileged'])
self.assertTrue(all(m['backup'] for m in service['deployment']['mounts']))
self.assertEqual({k: v['deployment']['resources']['memory_mb'] for k, v in services.items()},
{'nextcloud': 2048, 'db': 1024, 'redis': 512})
runtime = services['nextcloud']['template']['proxmox']['installer_profile']['runtime']
self.assertIn('exec /init', runtime['compose_entrypoint'][2])
def test_nas_mount_is_separate_from_configuration_database_and_cache(self):
plan = self.plan(DEFAULT_MODE, {'Where to store nextcloud: /data': 'host-bind',
'Host path for nextcloud: /data': '/mnt/pve/media/Nextcloud'})
services = {s['name']: s for s in plan['services']}
mounts = {m['container_path']: m for m in services['nextcloud']['deployment']['mounts']}
self.assertEqual(mounts['/data']['source'], '/mnt/pve/media/Nextcloud')
self.assertEqual(mounts['/data']['type'], 'host-bind')
self.assertFalse(mounts['/data']['backup'])
self.assertEqual(mounts['/config']['type'], 'managed-volume')
for name in ('db', 'redis'):
self.assertTrue(all(m['type'] == 'managed-volume' and m['backup']
for m in services[name]['deployment']['mounts']))
@unittest.skipUnless(shutil.which('php'), 'PHP CLI is needed to execute the bootstrap contract')
def test_bootstrap_prefills_mysql_with_escaped_secrets_and_preserves_existing_files(self):
entry = next(s for s in self.template['compose_stack']['services'] if s['name'] == 'nextcloud')['compose']['entrypoint']
with tempfile.TemporaryDirectory() as temp:
folder = Path(temp) / 'config'
script = entry[2].replace('/config/www/nextcloud/config', str(folder)).replace('exec /init', 'exit 0')
password = "test-'quote\\backslash$not-a-real-secret\nline"
env = dict(os.environ, MYSQL_HOST='db', MYSQL_DATABASE='nextcloud', MYSQL_USER='nextcloud', MYSQL_PASSWORD=password)
subprocess.run(['/bin/sh', '-ec', script], env=env, check=True, capture_output=True)
autoconfig = folder / 'autoconfig.php'
redis = folder / 'proxmenux-redis.config.php'
for path in (autoconfig, redis):
subprocess.run(['php', '-l', str(path)], check=True, capture_output=True)
self.assertEqual(path.stat().st_mode & 0o777, 0o600)
code = 'require $argv[1]; echo json_encode($AUTOCONFIG);'
values = json.loads(subprocess.check_output(['php', '-r', code, str(autoconfig)], env=env))
self.assertEqual(values['dbpass'], password)
self.assertEqual(values['dbhost'], 'db')
self.assertEqual(values['directory'], '/data')
self.assertNotIn('adminpass', values)
cache = json.loads(subprocess.check_output(['php', '-r', 'require $argv[1]; echo json_encode($CONFIG);', str(redis)]))
self.assertEqual(cache['redis']['host'], 'redis')
self.assertEqual(cache['memcache.locking'], '\\OC\\Memcache\\Redis')
# A retry/update must not replace user edits or a completed installation.
saved = {p: p.read_bytes() for p in (autoconfig, redis)}
subprocess.run(['/bin/sh', '-ec', script], env=dict(env, MYSQL_PASSWORD='changed'), check=True, capture_output=True)
for path, content in saved.items(): self.assertEqual(path.read_bytes(), content)
autoconfig.unlink()
(folder / 'config.php').write_text('<?php $CONFIG = ["installed" => true];')
subprocess.run(['/bin/sh', '-ec', script], env=env, check=True, capture_output=True)
self.assertFalse(autoconfig.exists())
if __name__ == '__main__':
unittest.main()