Pre-release 1.2.7: OCI fixes, 12 new catalog applications and docs updates

Last changes before version 1.2.7.

OCI manager Apps
- Multi-container applications start while one of their containers is
  being backed up: the start hook waits until vzdump releases it and does
  not start it twice. The DHCP client of a dependency no longer keeps the
  lock of the hook, so later starts do not hang, and the watchdog waits
  while a dependency is locked. Installing or updating ProxMenux replaces
  the published copies of the hook already in place.
- Images built from scratch with a numeric user, such as ddns-updater,
  install: the container is created from a copy of the image that adds
  the /etc/passwd and /etc/group Proxmox VE needs, and the application
  runs with the user the image declares. The downloaded image stays
  unchanged. An image with a named user and no user database stops
  before anything is created, with a message that says why.

Catalog
- Twelve new applications: MDBListarr, CrossWatch, Free Games Claimer
  Remaster, Cloudreve, Poznote and AceStream HTTP Proxy, suggested in
  discussion #440, and the Dockur images of Chrony, Dnsmasq, Tor,
  Stunnel, strfry and Statping. The catalog lists 347 applications.
- Their prompts, labels and notes are translated into the seven
  languages of the menus.

Documentation
- OCI manager: architecture, lifecycle and stacks pages revised, with
  larger diagrams and new screenshots.
- Contributors: the page now thanks those developing, reviewing,
  translating and testing ProxMenux today and those who helped in its
  first steps, with new avatars.

Tests for the stack start hook, the watchdog, the user database check
of OCI images and the Tor installation summary.
This commit is contained in:
MacRimi
2026-10-25 13:17:54 +01:00
parent 2f48689087
commit fc41b04e87
103 changed files with 12799 additions and 603 deletions
+2
View File
@@ -899,6 +899,8 @@ install_normal_version() {
mkdir -p "$BASE_DIR/oci/engine"
cp -r "./oci/"* "$BASE_DIR/oci/engine/"
find "$BASE_DIR/oci/engine" -type f -name '*.sh' -exec chmod +x {} +
# Multi-container applications already installed take the new start hook.
bash "$BASE_DIR/oci/engine/remote/stack_dependency_hook.sh" --refresh >/dev/null 2>&1 || true
systemctl try-restart proxmenux-oci-watchdog.service >/dev/null 2>&1 || true
fi
chmod +x "$BASE_DIR/install_proxmenux.sh"
+2
View File
@@ -789,6 +789,8 @@ install_beta() {
mkdir -p "$BASE_DIR/oci/engine"
cp -r "./oci/"* "$BASE_DIR/oci/engine/"
find "$BASE_DIR/oci/engine" -type f -name '*.sh' -exec chmod +x {} +
# Multi-container applications already installed take the new start hook.
bash "$BASE_DIR/oci/engine/remote/stack_dependency_hook.sh" --refresh >/dev/null 2>&1 || true
systemctl try-restart proxmenux-oci-watchdog.service >/dev/null 2>&1 || true
fi
chmod +x "$INSTALL_DIR/$MENU_SCRIPT"
+45
View File
@@ -209,6 +209,8 @@
"Access token of the connector, from the Twingate admin console": "Zugriffstoken des Connectors aus der Twingate-Verwaltungskonsole",
"Account is not locked": "Das Konto ist nicht gesperrt",
"Account token from the settings of https://app.foldingathome.org": "Konto-Token aus den Einstellungen von https://app.foldingathome.org",
"AceStream HTTP Proxy has no web interface: a media player opens its streams.": "AceStream HTTP Proxy hat keine Weboberfläche: Seine Streams werden mit einem Mediaplayer geöffnet.",
"AceStream engine with its HTTP API for media players.": "AceStream-Engine mit ihrer HTTP-API für Mediaplayer.",
"Action cancelled due to previous xshok-proxmox modifications.": "Aktion aufgrund früherer xshok-proxmox-Änderungen abgebrochen.",
"Action:": "Aktion:",
"Activate Monitor": "Monitor aktivieren",
@@ -306,6 +308,7 @@
"Address of the PostgreSQL server": "Adresse des PostgreSQL-Servers",
"Address of the Redis or Valkey server": "Adresse des Redis- oder Valkey-Servers",
"Address of the database server (mysql and pgsql only)": "Adresse des Datenbankservers (nur mysql und pgsql)",
"Address of the noVNC session in the links of the notifications (for example 192.168.1.50)": "Adresse der noVNC-Sitzung in den Links der Benachrichtigungen (zum Beispiel 192.168.1.50)",
"Address of the oci-compose file": "Adresse der oci-compose-Datei",
"Address to reach Pydio Cells (https://domain or https://IP:8080)": "Adresse bis Pydio Cells (https://domain oder https://IP:8080)",
"Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Adresse, über die wallabag erreicht wurde (http://IP oder https://wallabag.example.com)",
@@ -379,6 +382,7 @@
"Allocated RAM:": "Zugewiesener RAM:",
"Allocating virtual disk for %s...": "Virtueller Datenträger für %s wird zugewiesen...",
"Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "TCP-Port {port} von {subnet} durch die Host-Firewall zulassen? Bestehende Firewall-Regeln werden nicht geändert.",
"Allowed hostnames for a hostname or reverse proxy (optional)": "Erlaubte Hostnamen für einen Hostnamen oder Reverse-Proxy (optional)",
"Allowed hosts (comma separated; * allows access through the assigned IP)": "Zulässige Hosts (Komma getrennt; * ermöglicht den Zugriff über die zugewiesene IP)",
"Allowed source subnet:": "Zulässiges Quellsubnetz:",
"Allowed web port:": "Erlaubter Webport:",
@@ -766,6 +770,7 @@
"Cannot inspect existing ZRAM configurations": "Vorhandene ZRAM-Konfigurationen können nicht überprüft werden",
"Cannot inspect existing ZRAM generator configuration": "Die vorhandene ZRAM-Generatorkonfiguration kann nicht überprüft werden",
"Cannot load backup library: lib_host_backup_common.sh": "Sicherungsbibliothek kann nicht geladen werden: lib_host_backup_common.sh",
"Cannot prepare the OCI archive:": "Das OCI-Archiv kann nicht vorbereitet werden:",
"Cannot proceed with invalid export path.": "Mit ungültigem Exportpfad kann nicht fortgefahren werden.",
"Cannot proceed with invalid share name.": "Mit ungültigem Freigabenamen kann nicht fortgefahren werden.",
"Cannot reach Proxmox repositories": "Proxmox-Repositorys können nicht erreicht werden",
@@ -963,6 +968,7 @@
"Chrome is the official web browser from Google, built to be fast, secure, and customizable.": "Chrome ist der offizielle Webbrowser von Google, der schnell, sicher und anpassbar ist.",
"Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium ist ein Open-Source-Browser-Projekt, das darauf abzielt, eine sicherere, schnellere und stabilere Möglichkeit für alle Benutzer zu schaffen, das Web zu erleben.",
"Circular dependency:": "Zirkularabhängigkeit:",
"Claims the free games of Steam, Epic, Prime Gaming, GOG and more.": "Holt sich die kostenlosen Spiele von Steam, Epic, Prime Gaming, GOG und mehr.",
"Clean disk metadata": "Bereinigen Sie die Festplattenmetadaten",
"Cleaned up": "Aufgeräumt",
"Cleaning cached files...": "Zwischengespeicherte Dateien bereinigen...",
@@ -986,6 +992,7 @@
"Clearing login credentials...": "Anmeldedaten werden gelöscht...",
"Client (run a bandwidth test to a server)": "Client (führen Sie einen Bandbreitentest für einen Server durch)",
"Client determines best version to use": "Der Kunde bestimmt die beste zu verwendende Version",
"Client networks permitted to query NTP (comma-separated CIDRs)": "Client-Netzwerke, die NTP abfragen dürfen (CIDRs durch Kommas getrennt)",
"Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Clients erreichen das VPN über die öffentliche Adresse und den während der Installation angegebenen UDP-Port, so dass der Port an diesen Container weitergeleitet werden muss.",
"Cloning Coral driver repository (feranick fork)...": "Klonen des Coral-Treiber-Repositorys (Feranick-Fork) ...",
"Cloning Lynis from GitHub...": "Lynis von GitHub klonen...",
@@ -994,6 +1001,7 @@
"Cloud Database Manager.": "Cloud Database Manager.",
"Cloud storage synchronization and FUSE mounts": "Cloud Storage Synchronisation und FUSE-Mounts",
"Cloud-Init Automated Installers": "Automatisierte Cloud-Init-Installationsprogramme",
"Cloudreve": "Cloudreve",
"Cluster certificates updated": "Clusterzertifikate aktualisiert",
"Cluster configuration (advanced)": "Clusterkonfiguration (erweitert)",
"Cluster data will be applied automatically at next boot.": "Clusterdaten werden beim nächsten Start automatisch angewendet.",
@@ -1574,6 +1582,7 @@
"Cross-platform file sharing made easy.": "Plattformübergreifendes Filesharing leicht gemacht.",
"Cross-platform monitoring tool.": "Plattformübergreifendes Monitoring-Tool.",
"Cross-version detected — safe restore mode": "Versionsübergreifend erkannt – sicherer Wiederherstellungsmodus",
"CrossWatch": "CrossWatch",
"Current": "Aktuell",
"Current CIFS mounts:": "Aktuelle CIFS-Mounts:",
"Current Configuration": "Aktuelle Konfiguration",
@@ -1737,9 +1746,11 @@
"Desktop UI backup created": "Backup der Desktop-Benutzeroberfläche erstellt",
"Desktop and Mobile UI patched": "Desktop- und Mobil-UI gepatcht",
"Destination Directory": "Zielverzeichnis",
"Destination TCP port for the TLS tunnel": "Ziel-TCP-Port für den TLS-Tunnel",
"Destination directory does not exist:": "Zielverzeichnis existiert nicht:",
"Destination directory is not writable:": "Zielverzeichnis ist nicht beschreibbar:",
"Destination path for the copy (typically outside ProxMenux state):": "Zielpfad für die Kopie (normalerweise außerhalb des ProxMenux-Status):",
"Destination server address for the TLS tunnel": "Adresse des Zielservers für den TLS-Tunnel",
"Destination:": "Ziel:",
"Destroy a ZFS dataset (irreversible)": "Zerstören Sie einen ZFS-Datensatz (irreversibel)",
"Destructive rollback": "Zerstörerischer Rollback",
@@ -2776,8 +2787,10 @@
"HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One ist ein Community-Image, das Docker im Container ausführt. Der LXC bleibt unprivilegiert, aber die inneren AppArmor-Profile sind möglicherweise nicht verfügbar. Der erste Start lädt Home Assistant Core und seine Add-ons herunter. Wenn die Überprüfung fehlschlägt, werden die CT und / mnt / Daten zur Diagnose aufbewahrt.",
"HAOS One profile declined": "HAOS One-Profil rückläufig",
"HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires ein unprivilegiertes unmanaged LXC mit Nesting und Keyctl, 2 Kernen, 2048 MB RAM, Rootfs von mindestens 12 GB und /mnt / Daten von mindestens 16 GB auf einem Containervolumen, das in Backups enthalten ist",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.": "HLS-Stream: Port 6878, Pfad /ace/manifest.m3u8?id= gefolgt von der Kanal-ID.",
"HOSTNAME": "HOSTNAME",
"HTML5 Network Speed Test Server.": "HTML5-Netzwerkgeschwindigkeitstestserver.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.": "HTTP-CONNECT-Proxy: Verwenden Sie dieselbe IP-Adresse und Port 8118. Diese Adressen sind Proxy-Einstellungen, keine Weblinks.",
"HTTP service check without a saved URL": "HTTP Service Check ohne gespeicherte URL",
"Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emuliert Philips Hue API zu anderen Home Automation Gateways wie einem Amazon Echo / Dot Gen 1 (Gen 2 hat Probleme bei der Erkennung von Ha-Bridge) oder anderen Systemen, die Philips Hue unterstützen. Die Bridge verarbeitet grundlegende Befehle wie Ein-, Aus- und Helligkeitsbefehle des Farbtonprotokolls. Diese Brücke kann die meisten Geräte mit einer bestimmten API steuern.",
"HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake ist ein Open-Source-Tool, das von Freiwilligen entwickelt wurde, um Videos aus fast jedem Format in eine Auswahl moderner, weithin unterstützter Codecs zu konvertieren.",
@@ -2910,6 +2923,7 @@
"Host write access confirmed.": "Host-Schreibzugriff bestätigt.",
"Hostname": "Hostname",
"Hot changes applied. No reboot needed for these paths.": "Heiße Änderungen angewendet. Für diese Pfade ist kein Neustart erforderlich.",
"Hours between claiming runs (0 disables interval runs)": "Stunden zwischen den Durchläufen (0 deaktiviert die Intervall-Durchläufe)",
"How do you want to add it?": "Wie möchten Sie es hinzufügen?",
"How do you want to authenticate this backup target?": "Wie möchten Sie dieses Sicherungsziel authentifizieren?",
"How do you want to select the": "Wie möchten Sie das auswählen?",
@@ -3641,6 +3655,7 @@
"LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf ist eine benutzerdefinierte und unabhängige Version von Firefox mit den Hauptzielen Privatsphäre, Sicherheit und Benutzerfreiheit. LibreWolf zielt auch darauf ab, alle Telemetrie, Datenerfassung und Ärgernisse zu entfernen sowie Anti-Freiheits-Funktionen wie DRM zu deaktivieren.",
"Librespeed is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers.": "Librespeed ist ein sehr leichter Speedtest, der in Javascript implementiert ist und XMLHttpRequest und Web Workers verwendet.",
"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr ist ein Musiksammlungsmanager für Usenet- und BitTorrent-Benutzer. Es kann mehrere RSS-Feeds für neue Tracks von Ihren Lieblingskünstlern überwachen und sie greifen, sortieren und umbenennen. Es kann auch so konfiguriert werden, dass die Qualität der bereits heruntergeladenen Dateien automatisch aktualisiert wird, wenn ein besseres Qualitätsformat verfügbar ist.",
"Lightweight DNS forwarder and cache.": "Schlanker DNS-Forwarder und -Cache.",
"Lightweight Docker management UI": "Leichtgewichtige Docker Management UI",
"Likely cause: host directory permissions deny the container's mapped UID.": "Wahrscheinliche Ursache: Hostverzeichnisberechtigungen verweigern die zugeordnete UID des Containers.",
"Limiting size and optimizing journald": "Begrenzung der Größe und Optimierung des Journals",
@@ -3714,6 +3729,8 @@
"Log2RAM write scheduled every": "Log2RAM-Schreibvorgang alle geplant",
"Log:": "Protokoll:",
"Logged-in users": "Angemeldete Benutzer",
"Login email used by every store (optional)": "Anmelde-E-Mail für alle Shops (optional)",
"Login password used by every store (optional)": "Anmeldepasswort für alle Shops (optional)",
"Login to {registry} timed out. Saved credentials were not changed.": "Zeitüberschreitung bei der Anmeldung bei {registry}. Gespeicherte Anmeldeinformationen wurden nicht geändert.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "Zeitüberschreitung beim Abmelden von {registry}. Die Anmeldeinformationen der gespeicherten Datei wurden nicht geändert.",
"Logrotate optimization completed": "Logrotate-Optimierung abgeschlossen",
@@ -3754,8 +3771,11 @@
"MAC address": "MAC-Adresse",
"MACHINE TYPE": "MASCHINENTYP",
"MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME ist ein kostenloser und Open-Source-Emulator, der entwickelt wurde, um die Hardware von Arcade-Spielen, Videospielkonsolen, alten Computern und anderen Systemen in Software auf modernen PCs zu emulieren.",
"MDBList lists synced to Radarr and Sonarr.": "MDBList-Listen, synchronisiert mit Radarr und Sonarr.",
"MDBListarr": "MDBListarr",
"MOTD configuration updated successfully": "MOTD-Konfiguration erfolgreich aktualisiert",
"MOTD configuration was already up to date": "Die MOTD-Konfiguration war bereits auf dem neuesten Stand",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID.": "MPEG-TS-Stream: Port 6878, Pfad /ace/getstream?id= gefolgt von der Kanal-ID.",
"MTU SIZE": "MTU-GRÖSSE",
"Machine Type": "Maschinentyp",
"Machine i440fx": "Maschine i440fx",
@@ -4022,6 +4042,7 @@
"NICs:": "Netzwerkkarten:",
"NOT FOUND": "NICHT GEFUNDEN",
"NOTE: The host directory and its contents will remain unchanged.": "HINWEIS: Das Hostverzeichnis und sein Inhalt bleiben unverändert.",
"NTP time server for the network.": "NTP-Zeitserver für das Netzwerk.",
"NUT server user for clients such as PeaNUT": "NUT server-Benutzer für Clients wie PeaNUT",
"NVENC patch detected — list narrowed to versions supported by keylase/nvidia-patch.": "NVENC-Patch erkannt – Liste eingegrenzt auf Versionen, die von keylase/nvidia-patch unterstützt werden.",
"NVIDIA (CUDA)": "NVIDIEN (CUDA)",
@@ -4487,6 +4508,7 @@
"Non-free firmware warnings disabled": "Warnungen zu nicht kostenloser Firmware deaktiviert",
"None": "Keiner",
"Normalizing stable monitor service...": "Der stabile Monitordienst wird normalisiert...",
"Nostr relay.": "Nostr-Relay.",
"Not Mounted": "Nicht montiert",
"Not a JSON object:": "Kein JSON-Objekt:",
"Not all platforms support Controller/NVMe passthrough reliably.": "Nicht alle Plattformen unterstützen zuverlässig Controller/NVMe-Passthrough.",
@@ -4507,6 +4529,7 @@
"Not required (password only)": "Nicht required (nur Passwort)",
"Not required (token only)": "Nicht required (nur Token)",
"Not yet verified by ProxMenux (beta)": "Noch nicht verifiziert durch ProxMenux (beta)",
"Note-taking with tags, workspaces, attachments and a REST API.": "Notizen mit Tags, Arbeitsbereichen, Anhängen und einer REST-API.",
"Note: A system reboot will be required after enabling IOMMU.": "Hinweis: Nach der Aktivierung von IOMMU ist ein Systemneustart erforderlich.",
"Note: this only works if the NFS server does NOT use 'all_squash' for root.": "Hinweis: Dies funktioniert nur, wenn der NFS-Server NICHT „all_squash“ als Root verwendet.",
"Notes": "Notizen",
@@ -4590,6 +4613,7 @@
"Only a Docker Swarm uses these settings, so they are not applied:": "Nur ein Docker Swarm verwendet diese Einstellungen, so dass sie nicht angewendet werden:",
"Only a full sha256 image digest is supported.": "Es wird nur ein vollständiger sha256-Image-Digest unterstützt.",
"Only an installed standalone OCI instance can adopt external changes": "Nur eine installierte eigenständige OCI-Instanz kann externe Änderungen übernehmen",
"Only applications configured to use this proxy send their traffic through Tor.": "Nur Anwendungen, die für diesen Proxy konfiguriert sind, senden ihren Verkehr über Tor.",
"Only backed-up Proxmox volumes can be adopted": "Es können nur gesicherte Proxmox-Volumes übernommen werden",
"Only convert to privileged if absolutely necessary for your use case.": "Konvertieren Sie nur dann in privilegiert, wenn dies für Ihren Anwendungsfall unbedingt erforderlich ist.",
"Only fully free disks are shown (not system-used and not referenced by VM/LXC).": "Es werden nur vollständig freie Festplatten angezeigt (nicht vom System verwendet und nicht von VM/LXC referenziert).",
@@ -4778,6 +4802,7 @@
"Password of the admin account": "Passwort des Admin-Kontos",
"Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Passwort des veralteten Flowise-Anwendungs-Logins (nur von Flowise-Versionen vor 3.0.1) gelesen",
"Password of the main AdGuard Home": "Passwort des Haupt-AdGuard Home",
"Password of the noVNC browser session": "Passwort der noVNC-Browsersitzung",
"Password of the superuser account": "Passwort des Superuser-Kontos",
"Password or API token secret:": "Passwort oder API-Token-Geheimnis:",
"Password or secret": "Passwort oder Geheimnis",
@@ -4909,6 +4934,8 @@
"Power state D3cold/D0 transitions may be inaccessible": "Auf die Übergänge des Energiezustands D3cold/D0 kann möglicherweise nicht zugegriffen werden",
"Powerful OCR powered by DeepSeek AI": "Leistungsstarke OCR powered by DeepSeek AI",
"Powerful networking tool": "Leistungsstarkes Netzwerk-Tool",
"Poznote": "Poznote",
"Poznote administrator": "Poznote-Administrator",
"Pre-check found": "Vorabprüfung gefunden",
"Pre-configure destinations so you don't have to enter them every time you back up.": "Konfigurieren Sie Ziele vorab, damit Sie sie nicht bei jedem Backup erneut eingeben müssen.",
"Pre-existing gasket-dkms package removed.": "Vorhandenes „gasket-dkms“-Paket entfernt.",
@@ -4961,6 +4988,7 @@
"Previous installation restored": "Frühere Installation wiederhergestellt",
"Previous shutdowns": "Frühere Abschaltungen",
"Primary GID for Emby": "Primäre GID für Emby",
"Primary upstream DNS server": "Primärer Upstream-DNS-Server",
"Privacy-first finance app with envelope budgeting and multi-device sync.": "Privacy-First Finance App mit Umschlag budgeting und Multi-Device-Sync.",
"Privacy-first, self-hosted PDF toolkit": "Privacy-First, selbst gehostetes PDF-Toolkit",
"Private installation record saved": "Private Installationsaufzeichnung gespeichert",
@@ -5054,6 +5082,7 @@
"Proxmox VE 8 to 9 Manual Upgrade Guide": "Manuelles Upgrade-Handbuch für Proxmox VE 8 auf 9",
"Proxmox VE 9.x no-subscription repository created": "Proxmox VE 9.x No-Subscription-Repository erstellt",
"Proxmox VE Helper Scripts": "Proxmox VE-Hilfsskripte",
"Proxmox VE cannot create a container from this image: it declares a user but does not include /etc/passwd and /etc/group. Nothing was created.": "Proxmox VE kann aus diesem Image keinen Container erstellen: Es gibt einen Benutzer an, enthält aber weder /etc/passwd noch /etc/group. Es wurde nichts erstellt.",
"Proxmox VE configuration completed.": "Proxmox VE-Konfiguration abgeschlossen.",
"Proxmox VE safe update completed": "Sicheres Proxmox VE-Update abgeschlossen",
"Proxmox auth logger service created and started": "Proxmox-Auth-Logger-Dienst erstellt und gestartet",
@@ -5589,6 +5618,7 @@
"SMB port 445:": "SMB-Port 445:",
"SMB ports:": "SMB-Ports:",
"SMB, NFS and Time Machine shares from a web panel": "SMB-, NFS- und Time Machine-Freigaben über ein Webpanel",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.": "SOCKS5-Proxy: Konfigurieren Sie Ihre Anwendung mit der oben angezeigten LXC-IP-Adresse und Port 9050.",
"SR-IOV Configuration Detected": "SR-IOV-Konfiguration erkannt",
"SSD Emulation": "SSD-Emulation",
"SSH access": "SSH-Zugang",
@@ -5704,6 +5734,7 @@
"Search results for:": "Suchergebnisse für:",
"Search/Filter Scripts": "Such-/Filterskripte",
"Searchable document archive with OCR": "Durchsuchbares Dokumentenarchiv mit OCR",
"Secondary upstream DNS server": "Sekundärer Upstream-DNS-Server",
"Secure Disk Formatter": "Sicherer Festplattenformatierer",
"Secure Gateway (Tailscale VPN)": "Secure Gateway (Tailscale VPN)",
"Secure Gateway deployed successfully!": "Secure Gateway erfolgreich bereitgestellt!",
@@ -5897,6 +5928,7 @@
"Self-hosted ZeroTier network controller with web UI for centralized management.": "Selbst gehosteter ZeroTier-Netzwerkcontroller mit Web-Benutzeroberfläche zur zentralen Verwaltung.",
"Self-hosted cloud data migration & sync manager": "Selbst gehostete Cloud Datenmigration & Sync Manager",
"Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Selbst gehosteter kollaborativer Bookmark-Manager, um alles an einem Ort zu sammeln, zu lesen, zu kommentieren und vollständig zu bewahren, was wichtig ist.",
"Self-hosted file management and sharing with multiple storage providers.": "Selbst gehostete Dateiverwaltung und -freigabe mit mehreren Speicheranbietern.",
"Self-hosted file sharing with a modern web interface": "Self-Hosted File Sharing mit einem modernen Web-Interface",
"Self-hosted file toolkit for images, video, audio, PDFs, and files": "Selbst gehostetes Datei-Toolkit für Bilder, Video, Audio, PDFs und Dateien",
"Self-hosted internet archiving solution": "Selbst gehostete Internet-Archivierungslösung",
@@ -6214,7 +6246,9 @@
"Static IP": "Statisches IP",
"Static IPv4 address": "Statische IPv4-Adresse",
"Static IPv4 address for": "Statische IPv4-Adresse für",
"Statping": "Statping",
"Status": "Status",
"Status page and uptime monitoring.": "Statusseite und Verfügbarkeitsüberwachung.",
"Status:": "Status:",
"Steam is the ultimate destination for playing, discussing, and creating games.": "Steam ist das ultimative Ziel zum Spielen, Diskutieren und Erstellen von Spielen.",
"SteamGridDB": "SteamGridDB",
@@ -6286,6 +6320,7 @@
"Storage:": "Lagerung:",
"Stored Credentials:": "Gespeicherte Anmeldeinformationen:",
"Stored credentials:": "Gespeicherte Zugangsdaten:",
"Stores to run, separated by commas (empty runs the default stores)": "Auszuführende Shops, durch Kommas getrennt (leer führt die Standard-Shops aus)",
"Stremio is a modern media center that gives you the freedom to watch everything you want.": "Stremio ist ein modernes Medienzentrum, das Ihnen die Freiheit gibt, alles zu sehen, was Sie wollen.",
"Subdomains for the certificate, comma separated (wildcard for *.domain)": "Subdomains für das Zertifikat, Komma getrennt (Wildcard für *.domain)",
"Subnet": "Subnetz",
@@ -6350,6 +6385,7 @@
"TCP optimizations configuration completed": "Die Konfiguration der TCP-Optimierungen ist abgeschlossen",
"TCP optimizations reverted (defaults restored on next reboot)": "TCP-Optimierungen wurden zurückgesetzt (Standardeinstellungen werden beim nächsten Neustart wiederhergestellt)",
"TCP port 5201 is reachable (firewall on server)": "TCP-Port 5201 ist erreichbar (Firewall auf Server)",
"TLS tunnel for a TCP service.": "TLS-Tunnel für einen TCP-Dienst.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "TLS-Überprüfung für {registry} fehlgeschlagen. Installieren Sie die Registrierungs-CA in /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "TPM-Gerät zur VM hinzugefügt",
"TPM storage selection failed or was cancelled. VM creation aborted.": "Die Auswahl des TPM-Speichers ist fehlgeschlagen oder wurde abgebrochen. VM-Erstellung wurde abgebrochen.",
@@ -6702,6 +6738,7 @@
"The image requests NVIDIA, but the host has no working NVIDIA driver": "Das Bild fordert NVIDIA an, aber der Host hat keinen funktionierenden NVIDIA-Treiber",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "Das Bild fordert die Deaktivierung eines Teils der AppArmor- oder seccomp-Beschränkung auf. Fahren Sie nur fort, wenn Sie dem Image vertrauen und dieses Risiko akzeptieren.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "Das Bild fordert die Deaktivierung eines Teils der AppArmor- oder seccomp-Beschränkung auf. Das Compose bietet eine optionale AppArmor- oder seccomp-Entspannung; es bleibt deaktiviert, es sei denn, der Benutzer wählt es aus. Fahren Sie nur fort, wenn Sie dem Image vertrauen und dieses Risiko akzeptieren.",
"The image user is not numeric:": "Der Benutzer des Images ist nicht numerisch:",
"The image was not found in its registry, or it is private:": "Das Bild wurde nicht in seiner Registrierung gefunden, oder es ist privat:",
"The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "Die importierte Compose verlangt privilegiert, aber die offizielle jlesage/handbrake Dokumentation require es nicht; ProxMenux hält die LXC unprivilegiert.",
"The imported OCI groups are not numeric": "Importierte OCI-Gruppen sind nicht numerisch",
@@ -7142,6 +7179,7 @@
"Time is up; Home Assistant OS could not be confirmed as running": "Die Zeit ist abgelaufen; Home Assistant OS konnte nicht als ausgeführt bestätigt werden",
"Time settings configured - Timezone:": "Konfigurierte Zeiteinstellungen – Zeitzone:",
"Time synchronization reset to UTC": "Zeitsynchronisation auf UTC zurückgesetzt",
"Time zone of the fixed daily run times": "Zeitzone der festen täglichen Ausführungszeiten",
"Timezone": "Zeitzone",
"Tip: Also mount the VirtIO ISO for drivers and guest agent installer": "Tipp: Mounten Sie auch die VirtIO-ISO für Treiber und Gast-Agent-Installationsprogramm",
"Tip: You can install the QEMU Guest Agent inside the VM with:": "Tipp: Sie können den QEMU Guest Agent in der VM installieren mit:",
@@ -7178,6 +7216,8 @@
"Top memory processes in CT": "Top-Gedächtnisprozesse in der CT",
"Top-level configs, secrets and other global options are not yet supported": "Top-Level-Konfigurationen, Geheimnisse und andere globale Optionen werden noch nicht unterstützt",
"Top-level volume options are not yet supported": "Top-Level-Volumenoptionen werden noch nicht unterstützt",
"Tor SOCKS5 and HTTP proxy.": "Tor-SOCKS5- und HTTP-Proxy.",
"Tor is a proxy, not a website. It has no web interface.": "Tor ist ein Proxy, keine Website. Es hat keine Weboberfläche.",
"Total": "Gesamt",
"Total members:": "Gesamtzahl der Mitglieder:",
"Total routes": "Gesamtrouten",
@@ -7187,6 +7227,7 @@
"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.": "Transmission wurde für eine einfache und leistungsstarke Nutzung entwickelt. Transmission verfügt über die Funktionen, die Sie von einem BitTorrent-Client erwarten: Verschlüsselung, eine Web-Schnittstelle, Peer-Exchange, Magnet-Links, DHT, μTP, UPnP und NAT-PMP Port-Weiterleitung, Webseed-Unterstützung, Watch-Verzeichnisse, Tracker-Bearbeitung, globale und per-Torrent-Geschwindigkeitsbeschränkungen und mehr.",
"Tried pvesm path and manual detection methods": "pvesm path und manuelle Erkennungsmethoden wurden versucht",
"Trust this certificate and save it for scheduled backups?": "Diesem Zertifikat vertrauen und es für geplante Sicherungen speichern?",
"Trusted origins for a hostname or reverse proxy, with scheme and port (optional)": "Vertrauenswürdige Ursprünge für einen Hostnamen oder Reverse-Proxy, mit Schema und Port (optional)",
"Try Again": "Versuchen Sie es erneut",
"Try a different search term.": "Versuchen Sie es mit einem anderen Suchbegriff.",
"Try accessing": "Versuchen Sie, darauf zuzugreifen",
@@ -7447,6 +7488,7 @@
"Upload to PBS is currently: no. Pick an action:": "Hochladen auf PBS ist derzeit: Nein. Wählen Sie eine Aktion:",
"Upload to PBS is currently: yes. Pick an action:": "Auf PBS hochladen ist derzeit: ja. Wählen Sie eine Aktion:",
"Upload to PBS: enable, disable or rotate the recovery passphrase": "Auf PBS hochladen: Wiederherstellungspassphrase aktivieren, deaktivieren oder drehen",
"Upstream NTP servers": "Upstream-NTP-Server",
"Uptime and who is logged in": "Betriebszeit und wer angemeldet ist",
"Usage:": "Verwendung:",
"Use \"Check test progress\" to see results.": "Verwenden Sie „Testfortschritt prüfen“, um die Ergebnisse anzuzeigen.",
@@ -7719,6 +7761,7 @@
"Warning: Limited PCI Reset Support": "Warnung: Eingeschränkte PCI-Reset-Unterstützung",
"Warning: both VMs have autostart enabled (onboot=1).": "Warnung: Auf beiden VMs ist der Autostart aktiviert (onboot=1).",
"Warnings": "Warnungen",
"Watch history, ratings and watchlists synced between media servers and trackers.": "Wiedergabeverlauf, Bewertungen und Merklisten, synchronisiert zwischen Medienservern und Trackern.",
"Watchdog": "Watchdog",
"Watchdog (off): restart the application when it crashes": "Watchdog (aus): Anwendung neu starten, wenn sie abstürzt",
"Watchdog (on): restart the application when it crashes": "Watchdog (ein): Anwendung neu starten, wenn sie abstürzt",
@@ -8192,6 +8235,8 @@
"no passphrase": "keine Passphrase",
"no password": "kein Passwort",
"no-subscription repository": "no-subscription-Repository",
"noVNC browser session": "noVNC-Browsersitzung",
"noVNC browser session (password only)": "noVNC-Browsersitzung (nur Passwort)",
"no_root_squash": "no_root_squash",
"non-ProxMenux .tar archive(s) in this path": "Nicht-ProxMenux-.tar-Archive in diesem Pfad",
"none": "keine",
+45
View File
@@ -207,6 +207,8 @@
"Access token of the connector, from the Twingate admin console": "Token de acceso del conector, de la consola de administración de Twingate",
"Account is not locked": "La cuenta no está bloqueada",
"Account token from the settings of https://app.foldingathome.org": "Token de la cuenta, de los ajustes de https://app.foldingathome.org",
"AceStream HTTP Proxy has no web interface: a media player opens its streams.": "AceStream HTTP Proxy no tiene interfaz web: sus emisiones se abren con un reproductor multimedia.",
"AceStream engine with its HTTP API for media players.": "Motor AceStream con su API HTTP para reproductores multimedia.",
"Action cancelled due to previous xshok-proxmox modifications.": "Acción cancelada debido a modificaciones anteriores de xshok-proxmox.",
"Action:": "Acción:",
"Activate Monitor": "Activar Monitor",
@@ -304,6 +306,7 @@
"Address of the PostgreSQL server": "Dirección del servidor PostgreSQL",
"Address of the Redis or Valkey server": "Dirección del servidor Redis o Valkey",
"Address of the database server (mysql and pgsql only)": "Dirección del servidor de base de datos (solo mysql y pgsql)",
"Address of the noVNC session in the links of the notifications (for example 192.168.1.50)": "Dirección de la sesión noVNC en los enlaces de las notificaciones (por ejemplo, 192.168.1.50)",
"Address of the oci-compose file": "Dirección del archivo oci-compose",
"Address to reach Pydio Cells (https://domain or https://IP:8080)": "Dirección para acceder a Pydio Cells (https://dominio o https://IP:8080)",
"Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Dirección usada para acceder a wallabag (http://IP o https://wallabag.example.com)",
@@ -375,6 +378,7 @@
"Allocated RAM:": "RAM asignada:",
"Allocating virtual disk for %s...": "Asignando el disco virtual para %s...",
"Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "¿Permitir el puerto TCP {port} desde {subnet} en el cortafuegos del host? Las reglas existentes no se modifican.",
"Allowed hostnames for a hostname or reverse proxy (optional)": "Nombres de host permitidos para un nombre de host o un proxy inverso (opcional)",
"Allowed hosts (comma separated; * allows access through the assigned IP)": "Hosts permitidos (separados por comas; * permite el acceso a través de la IP asignada)",
"Allowed source subnet:": "Subred de origen permitida:",
"Allowed web port:": "Puerto web permitido:",
@@ -765,6 +769,7 @@
"Cannot inspect existing ZRAM configurations": "No se pueden inspeccionar las configuraciones de ZRAM existentes",
"Cannot inspect existing ZRAM generator configuration": "No se puede inspeccionar la configuración existente del generador de ZRAM",
"Cannot load backup library: lib_host_backup_common.sh": "No se puede cargar la biblioteca de backup: lib_host_backup_common.sh",
"Cannot prepare the OCI archive:": "No se puede preparar el archivo OCI:",
"Cannot proceed with invalid export path.": "No se puede continuar con una ruta de exportación no válida.",
"Cannot proceed with invalid share name.": "No se puede continuar con un nombre compartido no válido.",
"Cannot reach Proxmox repositories": "No se puede acceder a los repositorios de Proxmox",
@@ -962,6 +967,7 @@
"Chrome is the official web browser from Google, built to be fast, secure, and customizable.": "Chrome es el navegador web oficial de Google, creado para ser rápido, seguro y personalizable.",
"Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium es un proyecto de navegador de código abierto que busca ofrecer a todos los usuarios una forma más segura, rápida y estable de usar la web.",
"Circular dependency:": "Dependencia circular:",
"Claims the free games of Steam, Epic, Prime Gaming, GOG and more.": "Reclama los juegos gratuitos de Steam, Epic, Prime Gaming, GOG y más.",
"Clean disk metadata": "Limpiar metadatos del disco",
"Cleaned up": "Limpiado",
"Cleaning cached files...": "Limpiando archivos en caché...",
@@ -985,6 +991,7 @@
"Clearing login credentials...": "Borrando credenciales de inicio de sesión...",
"Client (run a bandwidth test to a server)": "Cliente (ejecuta una prueba de ancho de banda contra un servidor)",
"Client determines best version to use": "El cliente determina la mejor versión para usar",
"Client networks permitted to query NTP (comma-separated CIDRs)": "Redes de clientes que pueden consultar NTP (CIDR separados por comas)",
"Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Los clientes acceden a la VPN por la dirección pública y el puerto UDP indicados durante la instalación, por lo que ese puerto debe estar redirigido a este contenedor.",
"Cloning Coral driver repository (feranick fork)...": "Clonación del repositorio de controladores de Coral (fork feranick)...",
"Cloning Lynis from GitHub...": "Clonando Lynis desde GitHub...",
@@ -993,6 +1000,7 @@
"Cloud Database Manager.": "Gestor de bases de datos en la nube.",
"Cloud storage synchronization and FUSE mounts": "Sincronización de almacenamiento en la nube y montajes FUSE",
"Cloud-Init Automated Installers": "Instaladores automatizados de Cloud-Init",
"Cloudreve": "Cloudreve",
"Cluster certificates updated": "Certificados de clúster actualizados",
"Cluster configuration (advanced)": "Configuración de clúster (avanzada)",
"Cluster data will be applied automatically at next boot.": "Los datos del clúster se aplicarán automáticamente en el próximo inicio.",
@@ -1572,6 +1580,7 @@
"Cross-platform file sharing made easy.": "Compartir archivos entre plataformas, de forma sencilla.",
"Cross-platform monitoring tool.": "Herramienta de monitorización multiplataforma.",
"Cross-version detected — safe restore mode": "Se detectó una versión cruzada: modo de restauración segura",
"CrossWatch": "CrossWatch",
"Current": "Actual",
"Current CIFS mounts:": "Montajes CIFS actuales:",
"Current Configuration": "Configuración actual",
@@ -1735,9 +1744,11 @@
"Desktop UI backup created": "Backup de la interfaz de escritorio creado",
"Desktop and Mobile UI patched": "UI de escritorio y móvil parcheada",
"Destination Directory": "Directorio de destino",
"Destination TCP port for the TLS tunnel": "Puerto TCP de destino del túnel TLS",
"Destination directory does not exist:": "El directorio de destino no existe:",
"Destination directory is not writable:": "El directorio de destino no se puede escribir:",
"Destination path for the copy (typically outside ProxMenux state):": "Ruta de destino de la copia (normalmente fuera del estado ProxMenux):",
"Destination server address for the TLS tunnel": "Dirección del servidor de destino del túnel TLS",
"Destination:": "Destino:",
"Destroy a ZFS dataset (irreversible)": "Destruir un conjunto de datos ZFS (irreversible)",
"Destructive rollback": "Rollback destructivo",
@@ -2773,8 +2784,10 @@
"HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One es una imagen comunitaria que ejecuta Docker dentro del contenedor. El LXC permanece sin privilegios, pero los perfiles internos de AppArmor pueden no estar disponibles. El primer inicio descarga Home Assistant Core y sus complementos. Si la comprobación falla, el CT y /mnt/data se conservan para el diagnóstico.",
"HAOS One profile declined": "Perfil HAOS One rechazado",
"HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requiere un LXC no gestionado y sin privilegios con nesting y keyctl, 2 núcleos, 2048 MB de RAM, rootfs de al menos 12 GB y /mnt/data de al menos 16 GB en un volumen del contenedor incluido en los backups",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.": "Emisión HLS: puerto 6878, ruta /ace/manifest.m3u8?id= seguida del ID del canal.",
"HOSTNAME": "NOMBRE DE HOST",
"HTML5 Network Speed Test Server.": "Servidor de prueba de velocidad de red HTML5.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.": "Proxy HTTP CONNECT: utiliza la misma IP y el puerto 8118. Estas direcciones se configuran como proxy; no son enlaces web.",
"HTTP service check without a saved URL": "Control de servicio HTTP sin una URL guardada",
"Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emula la API de Philips Hue ante otras pasarelas de domótica, como un Amazon Echo/Dot Gen 1 (el gen 2 tiene problemas para descubrir ha-bridge) u otros sistemas compatibles con Philips Hue. El puente gestiona órdenes básicas del protocolo hue como encender, apagar y brillo, y puede controlar la mayoría de dispositivos que tengan una API propia.",
"HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake es una herramienta de código abierto, creada por voluntarios, para convertir vídeo desde casi cualquier formato a una selección de códecs modernos y muy extendidos.",
@@ -2907,6 +2920,7 @@
"Host write access confirmed.": "Acceso de escritura del host confirmado.",
"Hostname": "Nombre de host",
"Hot changes applied. No reboot needed for these paths.": "Se aplicaron cambios importantes. No es necesario reiniciar para estas rutas.",
"Hours between claiming runs (0 disables interval runs)": "Horas entre cada ejecución (0 desactiva las ejecuciones por intervalo)",
"How do you want to add it?": "¿Cómo quieres añadirlo?",
"How do you want to authenticate this backup target?": "¿Cómo desea autenticar este destino de backup?",
"How do you want to select the": "¿Cómo desea seleccionar el",
@@ -3637,6 +3651,7 @@
"LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf es una versión personalizada e independiente de Firefox, cuyos objetivos principales son la privacidad, la seguridad y la libertad del usuario. También busca eliminar toda la telemetría, la recopilación de datos y las molestias, y desactiva funciones contrarias a la libertad como el DRM.",
"Librespeed is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers.": "Librespeed es un Speedtest muy ligero implementado en Javascript, usando XMLHttpRequest y Web Workers.",
"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr es un gestor de colecciones de música para usuarios de Usenet y BitTorrent. Vigila varios feeds RSS en busca de nuevas pistas de tus artistas favoritos y las descarga, ordena y renombra. También puede mejorar automáticamente la calidad de los archivos ya descargados cuando aparece un formato mejor.",
"Lightweight DNS forwarder and cache.": "Reenviador y caché DNS ligero.",
"Lightweight Docker management UI": "Interfaz ligera de gestión de Docker",
"Likely cause: host directory permissions deny the container's mapped UID.": "Causa probable: los permisos del directorio del host niegan el UID asignado del contenedor.",
"Limiting size and optimizing journald": "Limitar el tamaño y optimizar el diario",
@@ -3710,6 +3725,8 @@
"Log2RAM write scheduled every": "Escritura de Log2RAM programada cada",
"Log:": "Log:",
"Logged-in users": "Usuarios registrados",
"Login email used by every store (optional)": "Correo de inicio de sesión para todas las tiendas (opcional)",
"Login password used by every store (optional)": "Contraseña de inicio de sesión para todas las tiendas (opcional)",
"Login to {registry} timed out. Saved credentials were not changed.": "El inicio de sesión en {registry} ha superado el tiempo de espera. Las credenciales guardadas no han cambiado.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "El cierre de sesión en {registry} ha superado el tiempo de espera. Las credenciales guardadas no han cambiado.",
"Logrotate optimization completed": "Optimización de logrotate completada",
@@ -3750,8 +3767,11 @@
"MAC address": "Dirección MAC",
"MACHINE TYPE": "TIPO DE MÁQUINA",
"MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME es un emulador gratuito y de código abierto que reproduce por software, en ordenadores personales modernos, el hardware de máquinas arcade, videoconsolas, ordenadores antiguos y otros sistemas.",
"MDBList lists synced to Radarr and Sonarr.": "Listas de MDBList sincronizadas con Radarr y Sonarr.",
"MDBListarr": "MDBListarr",
"MOTD configuration updated successfully": "Configuración de MOTD actualizada con éxito",
"MOTD configuration was already up to date": "La configuración de MOTD ya estaba actualizada",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID.": "Emisión MPEG-TS: puerto 6878, ruta /ace/getstream?id= seguida del ID del canal.",
"MTU SIZE": "TAMAÑO DE MTU",
"Machine Type": "Tipo de máquina",
"Machine i440fx": "Máquina i440fx",
@@ -4018,6 +4038,7 @@
"NICs:": "NIC:",
"NOT FOUND": "NO ENCONTRADO",
"NOTE: The host directory and its contents will remain unchanged.": "NOTA: El directorio del host y su contenido permanecerán sin cambios.",
"NTP time server for the network.": "Servidor de hora NTP para la red.",
"NUT server user for clients such as PeaNUT": "usuario NUT server para clientes como PeaNUT",
"NVENC patch detected — list narrowed to versions supported by keylase/nvidia-patch.": "Parche NVENC detectado: lista reducida a versiones compatibles con keylase/nvidia-patch.",
"NVIDIA (CUDA)": "NVIDIA (CUDA)",
@@ -4482,6 +4503,7 @@
"Non-free firmware warnings disabled": "Advertencias de firmware no libre deshabilitadas",
"None": "Ninguno",
"Normalizing stable monitor service...": "Normalizando el servicio del Monitor estable...",
"Nostr relay.": "Relé de Nostr.",
"Not Mounted": "No montado",
"Not a JSON object:": "No es un objeto JSON:",
"Not all platforms support Controller/NVMe passthrough reliably.": "No todas las plataformas admiten de forma fiable el passthrough de controlador/NVMe.",
@@ -4501,6 +4523,7 @@
"Not required (password only)": "No necesario (solo contraseña)",
"Not required (token only)": "No necesario (solo token)",
"Not yet verified by ProxMenux (beta)": "Aún no ha sido verificada por ProxMenux (beta)",
"Note-taking with tags, workspaces, attachments and a REST API.": "Notas con etiquetas, espacios de trabajo, adjuntos y una API REST.",
"Note: A system reboot will be required after enabling IOMMU.": "Nota: Será necesario reiniciar el sistema después de activar IOMMU.",
"Note: this only works if the NFS server does NOT use 'all_squash' for root.": "Nota: esto solo funciona si el servidor NFS NO usa 'all_squash' como root.",
"Notes": "Notas",
@@ -4582,6 +4605,7 @@
"Only a Docker Swarm uses these settings, so they are not applied:": "Solo un Docker Swarm utiliza estos ajustes, por lo que no se aplican:",
"Only a full sha256 image digest is supported.": "Solo se admite un digest sha256 completo.",
"Only an installed standalone OCI instance can adopt external changes": "Solo una instancia OCI independiente e instalada puede incorporar cambios externos",
"Only applications configured to use this proxy send their traffic through Tor.": "Solo las aplicaciones configuradas para usar este proxy envían su tráfico a través de Tor.",
"Only backed-up Proxmox volumes can be adopted": "Solo se pueden incorporar volúmenes de Proxmox incluidos en los backups",
"Only convert to privileged if absolutely necessary for your use case.": "Convierta a privilegiado solo si es absolutamente necesario para su caso de uso.",
"Only fully free disks are shown (not system-used and not referenced by VM/LXC).": "Solo se muestran los discos completamente libres (no utilizados por el sistema y a los que VM/LXC no hace referencia).",
@@ -4770,6 +4794,7 @@
"Password of the admin account": "Contraseña de la cuenta admin",
"Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Contraseña del acceso antiguo de la aplicación Flowise (solo la leen las versiones de Flowise anteriores a 3.0.1)",
"Password of the main AdGuard Home": "Contraseña del AdGuard Home principal",
"Password of the noVNC browser session": "Contraseña de la sesión del navegador en noVNC",
"Password of the superuser account": "Contraseña de la cuenta de superusuario",
"Password or API token secret:": "Contraseña o token secreto de API:",
"Password or secret": "Contraseña o secreto",
@@ -4901,6 +4926,8 @@
"Power state D3cold/D0 transitions may be inaccessible": "Las transiciones del estado de energía D3cold/D0 pueden ser inaccesibles",
"Powerful OCR powered by DeepSeek AI": "Potente OCR con DeepSeek AI",
"Powerful networking tool": "Potente herramienta de red",
"Poznote": "Poznote",
"Poznote administrator": "Administrador de Poznote",
"Pre-check found": "Pre-comprobación encontrada",
"Pre-configure destinations so you don't have to enter them every time you back up.": "Preconfigura los destinos para no tener que introducirlos cada vez que hagas un backup.",
"Pre-existing gasket-dkms package removed.": "Se eliminó el paquete gasket-dkms preexistente.",
@@ -4952,6 +4979,7 @@
"Previous installation restored": "Instalación anterior restaurada",
"Previous shutdowns": "Paradas anteriores",
"Primary GID for Emby": "GID principal de Emby",
"Primary upstream DNS server": "Servidor DNS principal de reenvío",
"Printer": "Impresora",
"Privacy-first finance app with envelope budgeting and multi-device sync.": "Aplicación de finanzas que da prioridad a la privacidad, con presupuestos por sobres y sincronización entre dispositivos.",
"Privacy-first, self-hosted PDF toolkit": "Kit de herramientas PDF autoalojado que da prioridad a la privacidad",
@@ -5045,6 +5073,7 @@
"Proxmox VE 8 to 9 Manual Upgrade Guide": "Guía de actualización manual de Proxmox VE 8 a 9",
"Proxmox VE 9.x no-subscription repository created": "Se creó el repositorio sin suscripción Proxmox VE 9.x",
"Proxmox VE Helper Scripts": "Proxmox VE Helper Scripts",
"Proxmox VE cannot create a container from this image: it declares a user but does not include /etc/passwd and /etc/group. Nothing was created.": "Proxmox VE no puede crear un contenedor a partir de esta imagen: declara un usuario, pero no incluye /etc/passwd ni /etc/group. No se ha creado nada.",
"Proxmox VE configuration completed.": "Configuración de Proxmox VE completada.",
"Proxmox VE safe update completed": "Actualización segura de Proxmox VE completada",
"Proxmox auth logger service created and started": "Servicio de registro de autenticación Proxmox creado e iniciado",
@@ -5573,6 +5602,7 @@
"SMB port 445:": "Puerto SMB 445:",
"SMB ports:": "Puertos PYME:",
"SMB, NFS and Time Machine shares from a web panel": "Recursos SMB, NFS y Time Machine desde un panel web",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.": "Proxy SOCKS5: configura tu aplicación con la IP del LXC indicada arriba y el puerto 9050.",
"SR-IOV Configuration Detected": "Configuración SR-IOV detectada",
"SSD Emulation": "Emulación de SSD",
"SSH access": "Acceso SSH",
@@ -5688,6 +5718,7 @@
"Search results for:": "Resultados de la búsqueda para:",
"Search/Filter Scripts": "Buscar/filtrar scripts",
"Searchable document archive with OCR": "Archivo de documentos con búsqueda y OCR",
"Secondary upstream DNS server": "Servidor DNS secundario de reenvío",
"Secure Disk Formatter": "Formateador de disco seguro",
"Secure Gateway (Tailscale VPN)": "Secure Gateway (VPN Tailscale)",
"Secure Gateway deployed successfully!": "¡Secure Gateway se implementó con éxito!",
@@ -5881,6 +5912,7 @@
"Self-hosted ZeroTier network controller with web UI for centralized management.": "Controlador de red ZeroTier autoalojado con interfaz web para la gestión centralizada.",
"Self-hosted cloud data migration & sync manager": "Gestor autoalojado de migración y sincronización de datos en la nube",
"Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Gestor de marcadores colaborativo y autoalojado para recopilar, leer, anotar y conservar íntegramente lo que importa, todo en un solo lugar.",
"Self-hosted file management and sharing with multiple storage providers.": "Gestión y uso compartido de archivos autoalojado con varios proveedores de almacenamiento.",
"Self-hosted file sharing with a modern web interface": "Compartición de archivos autoalojada con una interfaz web moderna",
"Self-hosted file toolkit for images, video, audio, PDFs, and files": "Kit de herramientas autoalojado para imágenes, vídeo, audio, PDF y archivos",
"Self-hosted internet archiving solution": "Solución autoalojada de archivado de Internet",
@@ -6199,7 +6231,9 @@
"Static IP": "IP estática",
"Static IPv4 address": "Dirección IPv4 estática",
"Static IPv4 address for": "Dirección IPv4 estática para",
"Statping": "Statping",
"Status": "Estado",
"Status page and uptime monitoring.": "Página de estado y monitorización de disponibilidad.",
"Status:": "Estado:",
"Steam is the ultimate destination for playing, discussing, and creating games.": "Steam es el lugar de referencia para jugar, hablar de juegos y crearlos.",
"SteamGridDB": "SteamGridDB",
@@ -6271,6 +6305,7 @@
"Storage:": "Almacenamiento:",
"Stored Credentials:": "Credenciales almacenadas:",
"Stored credentials:": "Credenciales almacenadas:",
"Stores to run, separated by commas (empty runs the default stores)": "Tiendas que se ejecutan, separadas por comas (vacío ejecuta las tiendas por defecto)",
"Stremio is a modern media center that gives you the freedom to watch everything you want.": "Stremio es un centro multimedia moderno que te da la libertad de ver todo lo que quieras.",
"Subdomains for the certificate, comma separated (wildcard for *.domain)": "Subdominios del certificado, separados por comas (wildcard para *.domain)",
"Subnet": "Subred",
@@ -6335,6 +6370,7 @@
"TCP optimizations configuration completed": "Configuración de optimizaciones TCP completada",
"TCP optimizations reverted (defaults restored on next reboot)": "Optimizaciones de TCP revertidas (los valores predeterminados se restauran en el próximo reinicio)",
"TCP port 5201 is reachable (firewall on server)": "El puerto TCP 5201 es accesible (cortafuegos del servidor)",
"TLS tunnel for a TCP service.": "Túnel TLS para un servicio TCP.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "La verificación TLS de {registry} ha fallado. Instala la CA del registro en /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "Dispositivo TPM añadido a la VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "La selección de almacenamiento de TPM falló o se canceló. Se canceló la creación de la máquina virtual.",
@@ -6684,6 +6720,7 @@
"The image requests NVIDIA, but the host has no working NVIDIA driver": "La imagen solicita NVIDIA, pero el host no tiene ningún controlador NVIDIA trabajando",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "La imagen pide desactivar parte del confinamiento de AppArmor o seccomp. Continúa solo si confías en la imagen y aceptas este riesgo.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "La imagen pide desactivar parte del confinamiento de AppArmor o seccomp. El Compose ofrece una relajación opcional de AppArmor o seccomp; seguirá desactivada salvo que el usuario la seleccione. Continúa solo si confías en la imagen y aceptas este riesgo.",
"The image user is not numeric:": "El usuario de la imagen no es numérico:",
"The image was not found in its registry, or it is private:": "La imagen no se encontró en su registro, o es privada:",
"The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "El Compose importado pide privileged, pero la documentación oficial de jlesage/handbrake no lo exige; ProxMenux mantiene el LXC sin privilegios.",
"The imported OCI groups are not numeric": "Los grupos OCI importados no son numéricos",
@@ -7117,6 +7154,7 @@
"Time is up; Home Assistant OS could not be confirmed as running": "El tiempo ha terminado; Home Assistant OS no puede ser confirmado como funcionamiento",
"Time settings configured - Timezone:": "Configuración de hora configurada - Zona horaria:",
"Time synchronization reset to UTC": "Restablecimiento de la sincronización horaria a UTC",
"Time zone of the fixed daily run times": "Zona horaria de las horas fijas de ejecución diaria",
"Timezone": "Zona horaria",
"Tip: Also mount the VirtIO ISO for drivers and guest agent installer": "Consejo: monta también la ISO de VirtIO para los controladores y el instalador del guest agent",
"Tip: You can install the QEMU Guest Agent inside the VM with:": "Consejo: Puede instalar el Agente Invitado QEMU dentro de la VM con:",
@@ -7153,6 +7191,8 @@
"Top memory processes in CT": "Principales procesos de memoria en CT",
"Top-level configs, secrets and other global options are not yet supported": "Las opciones globales de nivel superior —configs, secrets y otras— aún no se admiten",
"Top-level volume options are not yet supported": "Todavía no se admiten opciones de volumen de alto nivel",
"Tor SOCKS5 and HTTP proxy.": "Proxy SOCKS5 y HTTP de Tor.",
"Tor is a proxy, not a website. It has no web interface.": "Tor es un proxy, no una página web. No tiene interfaz web.",
"Total": "Total",
"Total members:": "Total de miembros:",
"Total routes": "Rutas totales",
@@ -7162,6 +7202,7 @@
"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.": "Transmission está diseñado para un uso sencillo y potente. Tiene las funciones que esperas de un cliente BitTorrent: cifrado, interfaz web, intercambio de pares, enlaces magnet, DHT, µTP, redirección de puertos UPnP y NAT-PMP, soporte de webseed, carpetas vigiladas, edición de trackers, límites de velocidad globales y por torrent, y más.",
"Tried pvesm path and manual detection methods": "Se probó pvesm path y métodos de detección manual",
"Trust this certificate and save it for scheduled backups?": "¿Confiar en este certificado y guardarlo para los backups programados?",
"Trusted origins for a hostname or reverse proxy, with scheme and port (optional)": "Orígenes de confianza para un nombre de host o un proxy inverso, con esquema y puerto (opcional)",
"Try Again": "Intentar otra vez",
"Try a different search term.": "Prueba con un término de búsqueda diferente.",
"Try accessing": "Intenta acceder",
@@ -7420,6 +7461,7 @@
"Upload to PBS is currently: no. Pick an action:": "Subir a PBS es actualmente: no. Elige una acción:",
"Upload to PBS is currently: yes. Pick an action:": "Subir a PBS actualmente es: sí. Elige una acción:",
"Upload to PBS: enable, disable or rotate the recovery passphrase": "Subida a PBS: activar, desactivar o rotar la frase de contraseña de recuperación",
"Upstream NTP servers": "Servidores NTP de origen",
"Uptime and who is logged in": "Tiempo de actividad y quién ha iniciado sesión",
"Usage:": "Usage:",
"Use \"Check test progress\" to see results.": "Utiliza \"Verificar el progreso de la prueba\" para ver los resultados.",
@@ -7694,6 +7736,7 @@
"Warning: Limited PCI Reset Support": "Advertencia: soporte limitado para reinicio de PCI",
"Warning: both VMs have autostart enabled (onboot=1).": "Advertencia: ambas máquinas virtuales tienen el inicio automático habilitado (onboot=1).",
"Warnings": "Advertencias",
"Watch history, ratings and watchlists synced between media servers and trackers.": "Historial, valoraciones y listas de seguimiento sincronizados entre servidores multimedia y trackers.",
"Watchdog": "Vigilancia",
"Watchdog (off): restart the application when it crashes": "Vigilancia (desactivada): reiniciar la aplicación cuando falla",
"Watchdog (on): restart the application when it crashes": "Vigilancia (activada): reiniciar la aplicación cuando falla",
@@ -8165,6 +8208,8 @@
"no passphrase": "sin frase de contraseña",
"no password": "sin contraseña",
"no-subscription repository": "repositorio sin suscripción",
"noVNC browser session": "Sesión del navegador en noVNC",
"noVNC browser session (password only)": "Sesión del navegador en noVNC (solo contraseña)",
"no_root_squash": "no_root_squash",
"non-ProxMenux .tar archive(s) in this path": "archivo(s) .tar que no son de ProxMenux en esta ruta",
"none": "ninguno",
+45
View File
@@ -209,6 +209,8 @@
"Access token of the connector, from the Twingate admin console": "Jeton d'accès du connecteur, depuis la console d'administration Twingate",
"Account is not locked": "Le compte n'est pas verrouillé",
"Account token from the settings of https://app.foldingathome.org": "Jeton de compte à partir des paramètres de https://app.foldingathome.org",
"AceStream HTTP Proxy has no web interface: a media player opens its streams.": "AceStream HTTP Proxy n’a pas d’interface web : ses flux s’ouvrent avec un lecteur multimédia.",
"AceStream engine with its HTTP API for media players.": "Moteur AceStream avec son API HTTP pour les lecteurs multimédias.",
"Action cancelled due to previous xshok-proxmox modifications.": "Action annulée en raison de modifications précédentes de xshok-proxmox.",
"Action:": "Action:",
"Activate Monitor": "Activer le moniteur",
@@ -306,6 +308,7 @@
"Address of the PostgreSQL server": "Adresse du serveur PostgreSQL",
"Address of the Redis or Valkey server": "Adresse du serveur Redis ou Valkey",
"Address of the database server (mysql and pgsql only)": "Adresse du serveur de base de données (mysql et pgsql uniquement)",
"Address of the noVNC session in the links of the notifications (for example 192.168.1.50)": "Adresse de la session noVNC dans les liens des notifications (par exemple 192.168.1.50)",
"Address of the oci-compose file": "Adresse du fichier oci-compose",
"Address to reach Pydio Cells (https://domain or https://IP:8080)": "Adresse pour atteindre Pydio Cells (https://domaine ou https://IP:8080)",
"Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Adresse d’accès à wallabag (http://IP ou https://wallabag.example.com)",
@@ -379,6 +382,7 @@
"Allocated RAM:": "RAM allouée :",
"Allocating virtual disk for %s...": "Allocation du disque virtuel pour %s...",
"Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Autoriser le port TCP {port} de {subnet} via le pare-feu hôte ?Les règles de pare-feu existantes ne sont pas modifiées.",
"Allowed hostnames for a hostname or reverse proxy (optional)": "Noms d’hôte autorisés pour un nom d’hôte ou un proxy inverse (facultatif)",
"Allowed hosts (comma separated; * allows access through the assigned IP)": "Hôtes autorisés (comma séparé ; * permet l'accès via l'IP assigné)",
"Allowed source subnet:": "Sous-réseau source autorisé :",
"Allowed web port:": "Port Web autorisé :",
@@ -766,6 +770,7 @@
"Cannot inspect existing ZRAM configurations": "Impossible d'inspecter les configurations ZRAM existantes",
"Cannot inspect existing ZRAM generator configuration": "Impossible d'inspecter la configuration existante du générateur ZRAM",
"Cannot load backup library: lib_host_backup_common.sh": "Impossible de charger la bibliothèque de sauvegarde : lib_host_backup_common.sh",
"Cannot prepare the OCI archive:": "Impossible de préparer l'archive OCI :",
"Cannot proceed with invalid export path.": "Impossible de poursuivre avec un chemin d'exportation non valide.",
"Cannot proceed with invalid share name.": "Impossible de continuer avec un nom de partage invalide.",
"Cannot reach Proxmox repositories": "Impossible d'accéder aux référentiels Proxmox",
@@ -963,6 +968,7 @@
"Chrome is the official web browser from Google, built to be fast, secure, and customizable.": "Chrome est le navigateur Web officiel de Google, construit pour être rapide, sécurisé et personnalisable.",
"Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium est un projet de navigateur open-source qui vise à construire un moyen plus sûr, plus rapide et plus stable pour tous les utilisateurs d'expérimenter le web.",
"Circular dependency:": "Dépendance circulaire:",
"Claims the free games of Steam, Epic, Prime Gaming, GOG and more.": "Récupère les jeux gratuits de Steam, Epic, Prime Gaming, GOG et d’autres.",
"Clean disk metadata": "Nettoyer les métadonnées du disque",
"Cleaned up": "Nettoyé",
"Cleaning cached files...": "Nettoyage des fichiers en cache...",
@@ -986,6 +992,7 @@
"Clearing login credentials...": "Effacement des identifiants de connexion...",
"Client (run a bandwidth test to a server)": "Client (exécuter un test de bande passante sur un serveur)",
"Client determines best version to use": "Le client détermine la meilleure version à utiliser",
"Client networks permitted to query NTP (comma-separated CIDRs)": "Réseaux clients autorisés à interroger NTP (CIDR séparés par des virgules)",
"Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Les clients atteignent le VPN par l'adresse publique et le port UDP donné lors de l'installation, de sorte que le port doit être transmis à ce conteneur.",
"Cloning Coral driver repository (feranick fork)...": "Clonage du référentiel de pilotes Coral (feranick fork)...",
"Cloning Lynis from GitHub...": "Clonage de Lynis depuis GitHub...",
@@ -994,6 +1001,7 @@
"Cloud Database Manager.": "Gestionnaire de bases de données Cloud.",
"Cloud storage synchronization and FUSE mounts": "Synchronisation de stockage en nuage et montages FUSE",
"Cloud-Init Automated Installers": "Installateurs automatisés Cloud-Init",
"Cloudreve": "Cloudreve",
"Cluster certificates updated": "Certificats de cluster mis à jour",
"Cluster configuration (advanced)": "Configuration du cluster (avancé)",
"Cluster data will be applied automatically at next boot.": "les données du cluster seront appliquées automatiquement au prochain démarrage.",
@@ -1574,6 +1582,7 @@
"Cross-platform file sharing made easy.": "Partage de fichiers multiplateforme rendu facile.",
"Cross-platform monitoring tool.": "Outil de surveillance multiplateforme.",
"Cross-version detected — safe restore mode": "Version croisée détectée – mode de restauration sécurisé",
"CrossWatch": "CrossWatch",
"Current": "Actuel",
"Current CIFS mounts:": "Montages CIFS actuels :",
"Current Configuration": "Configuration actuelle",
@@ -1737,9 +1746,11 @@
"Desktop UI backup created": "Sauvegarde de l'interface utilisateur du bureau créée",
"Desktop and Mobile UI patched": "Interface utilisateur de bureau et mobile corrigée",
"Destination Directory": "Répertoire des destinations",
"Destination TCP port for the TLS tunnel": "Port TCP de destination du tunnel TLS",
"Destination directory does not exist:": "Le répertoire de destination n'existe pas :",
"Destination directory is not writable:": "Le répertoire de destination n'est pas accessible en écriture :",
"Destination path for the copy (typically outside ProxMenux state):": "chemin de destination de la copie (généralement en dehors de l'état ProxMenux) :",
"Destination server address for the TLS tunnel": "Adresse du serveur de destination du tunnel TLS",
"Destination:": "Destination:",
"Destroy a ZFS dataset (irreversible)": "Détruire un jeu de données ZFS (irréversible)",
"Destructive rollback": "Annulation destructrice",
@@ -2776,8 +2787,10 @@
"HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One est une image communautaire qui exécute Docker à l'intérieur du conteneur. Le LXC reste non privilégié, mais les profils internes de l'AppArmor peuvent ne pas être disponibles. Le premier démarrage télécharge Home Assistant Core et ses add-ons. Si la vérification échoue, l'EC et /mnt/data sont conservés pour diagnostic.",
"HAOS One profile declined": "Profil HAOS One décliné",
"HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires un LXC non géré non privilégié avec nidation et keyctl, 2 carottes, 2048 MB RAM, rootfs d'au moins 12 Go et /mnt/data d'au moins 16 Go sur un volume de conteneur inclus dans les sauvegardes",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.": "Flux HLS : port 6878, chemin /ace/manifest.m3u8?id= suivi de l’ID de la chaîne.",
"HOSTNAME": "NOM D'HÔTE",
"HTML5 Network Speed Test Server.": "Serveur de test de vitesse réseau HTML5.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.": "Proxy HTTP CONNECT : utilisez la même adresse IP et le port 8118. Ces adresses sont des paramètres de proxy, pas des liens web.",
"HTTP service check without a saved URL": "Contrôle du service HTTP sans URL enregistrée",
"Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge émule Philips Hue API à d'autres passerelles de domotique comme un Amazon Echo/Dot Gen 1 (gen 2 a des problèmes de découverte ha-bridge) ou d'autres systèmes qui prennent en charge Philips Hue. Le pont gère les commandes de base comme On, Off et les commandes de luminosité du protocole de teinte. Ce pont peut contrôler la plupart des appareils qui ont une API distincte.",
"HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake est un outil open-source, construit par des bénévoles, pour convertir la vidéo de presque n'importe quel format en une sélection de codecs modernes et largement pris en charge.",
@@ -2910,6 +2923,7 @@
"Host write access confirmed.": "Accès en écriture de l'hôte confirmé.",
"Hostname": "Nom d'hôte",
"Hot changes applied. No reboot needed for these paths.": "Modifications à chaud appliquées. Aucun redémarrage n'est nécessaire pour ces chemins.",
"Hours between claiming runs (0 disables interval runs)": "Heures entre deux exécutions (0 désactive les exécutions par intervalle)",
"How do you want to add it?": "Comment veux-tu l’ajouter ?",
"How do you want to authenticate this backup target?": "Comment souhaitez-vous authentifier cette cible de sauvegarde ?",
"How do you want to select the": "Comment voulez-vous sélectionner le",
@@ -3641,6 +3655,7 @@
"LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf est une version personnalisée et indépendante de Firefox, avec les principaux objectifs de confidentialité, de sécurité et de liberté des utilisateurs. LibreWolf vise également à supprimer toutes les caractéristiques de télémétrie, de collecte de données et d'ennuis, ainsi que les fonctionnalités anti-liberté invalidantes comme DRM.",
"Librespeed is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers.": "Librespeed est un Speedtest très léger implémenté dans Javascript, utilisant XMLHttpRequest et Web Workers.",
"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr est un gestionnaire de collection musicale pour les utilisateurs Usenet et BitTorrent. Il peut surveiller plusieurs flux RSS pour de nouvelles pistes de vos artistes préférés et les saisir, les trier et les renommer. Il peut également être configuré pour améliorer automatiquement la qualité des fichiers déjà téléchargés lorsqu'un format de meilleure qualité devient disponible.",
"Lightweight DNS forwarder and cache.": "Redirecteur et cache DNS léger.",
"Lightweight Docker management UI": "Gestion légère Docker UI",
"Likely cause: host directory permissions deny the container's mapped UID.": "Cause probable : les autorisations du répertoire hôte refusent l'UID mappé du conteneur.",
"Limiting size and optimizing journald": "Limiter la taille et optimiser journald",
@@ -3714,6 +3729,8 @@
"Log2RAM write scheduled every": "Écriture Log2RAM programmée tous les",
"Log:": "Enregistrer:",
"Logged-in users": "Utilisateurs connectés",
"Login email used by every store (optional)": "E-mail de connexion utilisé par toutes les boutiques (facultatif)",
"Login password used by every store (optional)": "Mot de passe de connexion utilisé par toutes les boutiques (facultatif)",
"Login to {registry} timed out. Saved credentials were not changed.": "La connexion à {registry} a expiré. Les informations d'identification enregistrées n'ont pas été modifiées.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "La déconnexion de {registry} a expiré. Les informations d'identification du fichier enregistré n'ont pas été modifiées.",
"Logrotate optimization completed": "Optimisation de la rotation terminée",
@@ -3754,8 +3771,11 @@
"MAC address": "Adresse MAC",
"MACHINE TYPE": "TYPE DE MACHINE",
"MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME est un émulateur libre et open-source conçu pour émuler le matériel des jeux d'arcade, consoles de jeux vidéo, anciens ordinateurs et autres systèmes dans les logiciels sur les ordinateurs personnels modernes.",
"MDBList lists synced to Radarr and Sonarr.": "Listes MDBList synchronisées avec Radarr et Sonarr.",
"MDBListarr": "MDBListarr",
"MOTD configuration updated successfully": "Configuration MOTD mise à jour avec succès",
"MOTD configuration was already up to date": "La configuration MOTD était déjà à jour",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID.": "Flux MPEG-TS : port 6878, chemin /ace/getstream?id= suivi de l’ID de la chaîne.",
"MTU SIZE": "TAILLE MTU",
"Machine Type": "Type de machine",
"Machine i440fx": "Machine i440fx",
@@ -4022,6 +4042,7 @@
"NICs:": "Cartes réseau :",
"NOT FOUND": "NON TROUVÉ",
"NOTE: The host directory and its contents will remain unchanged.": "REMARQUE : Le répertoire hôte et son contenu resteront inchangés.",
"NTP time server for the network.": "Serveur de temps NTP pour le réseau.",
"NUT server user for clients such as PeaNUT": "utilisateur NUT server pour des clients tels que PeaNUT",
"NVENC patch detected — list narrowed to versions supported by keylase/nvidia-patch.": "Correctif NVENC détecté — liste restreinte aux versions prises en charge par keylase/nvidia-patch.",
"NVIDIA (CUDA)": "NVIDIA (CUDA)",
@@ -4487,6 +4508,7 @@
"Non-free firmware warnings disabled": "Avertissements du micrologiciel non libre désactivés",
"None": "Aucun",
"Normalizing stable monitor service...": "Normalisation du service de surveillance stable...",
"Nostr relay.": "Relais Nostr.",
"Not Mounted": "Non monté",
"Not a JSON object:": "Pas un objet JSON:",
"Not all platforms support Controller/NVMe passthrough reliably.": "Toutes les plates-formes ne prennent pas en charge le relais Controller/NVMe de manière fiable.",
@@ -4507,6 +4529,7 @@
"Not required (password only)": "Pas de required (mot de passe seulement)",
"Not required (token only)": "Pas de required",
"Not yet verified by ProxMenux (beta)": "Non encore vérifié par ProxMenux (beta)",
"Note-taking with tags, workspaces, attachments and a REST API.": "Prise de notes avec étiquettes, espaces de travail, pièces jointes et une API REST.",
"Note: A system reboot will be required after enabling IOMMU.": "Remarque : Un redémarrage du système sera requis après l'activation d'IOMMU.",
"Note: this only works if the NFS server does NOT use 'all_squash' for root.": "Remarque : cela ne fonctionne que si le serveur NFS n'utilise PAS « all_squash » pour root.",
"Notes": "Remarques",
@@ -4590,6 +4613,7 @@
"Only a Docker Swarm uses these settings, so they are not applied:": "Seul un Swarm Docker utilise ces paramètres, donc ils ne sont pas appliqués:",
"Only a full sha256 image digest is supported.": "Seul un résumé d'image sha256 complet est pris en charge.",
"Only an installed standalone OCI instance can adopt external changes": "Seule une instance OCI autonome installée peut adopter des modifications externes.",
"Only applications configured to use this proxy send their traffic through Tor.": "Seules les applications configurées pour utiliser ce proxy font passer leur trafic par Tor.",
"Only backed-up Proxmox volumes can be adopted": "Seuls les volumes Proxmox sauvegardés peuvent être adoptés",
"Only convert to privileged if absolutely necessary for your use case.": "Ne convertissez en privilèges que si cela est absolument nécessaire pour votre cas d'utilisation.",
"Only fully free disks are shown (not system-used and not referenced by VM/LXC).": "Seuls les disques entièrement libres sont affichés (non utilisés par le système et non référencés par VM/LXC).",
@@ -4778,6 +4802,7 @@
"Password of the admin account": "Mot de passe du compte administrateur",
"Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Mot de passe de l'application Flowise dépréciée (seulement lu par les versions Flowise avant 3.0.1)",
"Password of the main AdGuard Home": "Mot de passe du AdGuard Home principal",
"Password of the noVNC browser session": "Mot de passe de la session de navigateur noVNC",
"Password of the superuser account": "Mot de passe du compte superutilisateur",
"Password or API token secret:": "Mot de passe ou secret du jeton API :",
"Password or secret": "Mot de passe ou secret",
@@ -4909,6 +4934,8 @@
"Power state D3cold/D0 transitions may be inaccessible": "Les transitions de l'état d'alimentation D3cold/D0 peuvent être inaccessibles",
"Powerful OCR powered by DeepSeek AI": "Puissant OCR alimenté par DeepSeek AI",
"Powerful networking tool": "Outil puissant de mise en réseau",
"Poznote": "Poznote",
"Poznote administrator": "Administrateur Poznote",
"Pre-check found": "Pré-vérification trouvée",
"Pre-configure destinations so you don't have to enter them every time you back up.": "Préconfigurez les destinations afin de ne pas avoir à les saisir à chaque sauvegarde.",
"Pre-existing gasket-dkms package removed.": "Le paquet gasket-dkms préexistant a été supprimé.",
@@ -4961,6 +4988,7 @@
"Previous installation restored": "Installation précédente restaurée",
"Previous shutdowns": "Arrêts précédents",
"Primary GID for Emby": "GID primaire pour Emby",
"Primary upstream DNS server": "Serveur DNS amont principal",
"Privacy-first finance app with envelope budgeting and multi-device sync.": "Privacy-first finance app avec enveloppe budgeting et synchronisation multi-appareils.",
"Privacy-first, self-hosted PDF toolkit": "Boîte à outils PDF pour la première fois en matière de protection de la vie privée",
"Private installation record saved": "Enregistrement d'installation privé enregistré",
@@ -5054,6 +5082,7 @@
"Proxmox VE 8 to 9 Manual Upgrade Guide": "Guide de mise à niveau manuelle Proxmox VE 8 vers 9",
"Proxmox VE 9.x no-subscription repository created": "Création d'un référentiel sans abonnement Proxmox VE 9.x",
"Proxmox VE Helper Scripts": "Scripts d'assistance Proxmox VE",
"Proxmox VE cannot create a container from this image: it declares a user but does not include /etc/passwd and /etc/group. Nothing was created.": "Proxmox VE ne peut pas créer de conteneur à partir de cette image : elle déclare un utilisateur, mais n’inclut ni /etc/passwd ni /etc/group. Rien n’a été créé.",
"Proxmox VE configuration completed.": "Configuration de Proxmox VE terminée.",
"Proxmox VE safe update completed": "Mise à jour sécurisée de Proxmox VE terminée",
"Proxmox auth logger service created and started": "Service d'enregistrement d'authentification Proxmox créé et démarré",
@@ -5589,6 +5618,7 @@
"SMB port 445:": "Port SMB 445 :",
"SMB ports:": "Ports PME :",
"SMB, NFS and Time Machine shares from a web panel": "Partages SMB, NFS et Time Machine depuis un panel web",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.": "Proxy SOCKS5 : configurez votre application avec l’adresse IP du LXC indiquée ci-dessus et le port 9050.",
"SR-IOV Configuration Detected": "Configuration SR-IOV détectée",
"SSD Emulation": "Émulation SSD",
"SSH access": "Accès SSH",
@@ -5704,6 +5734,7 @@
"Search results for:": "Résultats de recherche pour :",
"Search/Filter Scripts": "Scripts de recherche/filtrage",
"Searchable document archive with OCR": "Archive documentaire consultable avec OCR",
"Secondary upstream DNS server": "Serveur DNS amont secondaire",
"Secure Disk Formatter": "Formateur de disque sécurisé",
"Secure Gateway (Tailscale VPN)": "Secure Gateway (VPN Tailscale)",
"Secure Gateway deployed successfully!": "Secure Gateway déployé avec succès !",
@@ -5897,6 +5928,7 @@
"Self-hosted ZeroTier network controller with web UI for centralized management.": "Contrôleur réseau ZeroTier auto-organisé avec interface utilisateur web pour une gestion centralisée.",
"Self-hosted cloud data migration & sync manager": "Gestion de migration et de synchronisation de données en nuage auto-organisé",
"Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Gestionnaire de signets collaboratifs auto-organisés pour recueillir, lire, annoter et préserver pleinement ce qui compte, le tout en un seul endroit.",
"Self-hosted file management and sharing with multiple storage providers.": "Gestion et partage de fichiers auto-hébergés avec plusieurs fournisseurs de stockage.",
"Self-hosted file sharing with a modern web interface": "Partage de fichiers auto-organisé avec une interface web moderne",
"Self-hosted file toolkit for images, video, audio, PDFs, and files": "Boîte à outils de fichiers auto-organisé pour les images, vidéo, audio, PDF et fichiers",
"Self-hosted internet archiving solution": "Solution d'archivage internet auto-organisé",
@@ -6214,7 +6246,9 @@
"Static IP": "IP statique",
"Static IPv4 address": "Adresse IPv4 statique",
"Static IPv4 address for": "Adresse IPv4 statique pour",
"Statping": "Statping",
"Status": "Statut",
"Status page and uptime monitoring.": "Page d’état et surveillance de la disponibilité.",
"Status:": "Statut:",
"Steam is the ultimate destination for playing, discussing, and creating games.": "Steam est la destination ultime pour jouer, discuter et créer des jeux.",
"SteamGridDB": "SteamGridDB",
@@ -6286,6 +6320,7 @@
"Storage:": "Stockage:",
"Stored Credentials:": "Identifiants stockés :",
"Stored credentials:": "Identifiants stockés :",
"Stores to run, separated by commas (empty runs the default stores)": "Boutiques à exécuter, séparées par des virgules (vide exécute les boutiques par défaut)",
"Stremio is a modern media center that gives you the freedom to watch everything you want.": "Stremio est un centre de médias moderne qui vous donne la liberté de regarder tout ce que vous voulez.",
"Subdomains for the certificate, comma separated (wildcard for *.domain)": "Sous-domaines pour le certificat, virgule séparée (carte d'identification pour *.domaine)",
"Subnet": "Sous-réseau",
@@ -6350,6 +6385,7 @@
"TCP optimizations configuration completed": "Configuration des optimisations TCP terminée",
"TCP optimizations reverted (defaults restored on next reboot)": "Optimisations TCP annulées (valeurs par défaut restaurées au prochain redémarrage)",
"TCP port 5201 is reachable (firewall on server)": "Le port TCP 5201 est accessible (pare-feu sur le serveur)",
"TLS tunnel for a TCP service.": "Tunnel TLS pour un service TCP.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "La vérification TLS a échoué pour {registry}. Installez l'autorité de certification de registre dans /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "Périphérique TPM ajouté à la VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "La sélection du stockage TPM a échoué ou a été annulée. Création de VM abandonnée.",
@@ -6701,6 +6737,7 @@
"The image requests NVIDIA, but the host has no working NVIDIA driver": "L'image demande NVIDIA, mais l'hôte n'a pas de pilote NVIDIA fonctionnant",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "L'image demande l'invalidation d'une partie de l'AppArmor ou du confinement de seccomp. Continuez seulement si vous faites confiance à l'image et acceptez ce risque.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "L'image demande l'invalidation d'une partie de l'AppArmor ou du confinement de seccomp. Le Compose offre une relaxation en option AppArmor ou seccomp ; il restera désactivé à moins que l'utilisateur le sélectionne. Continuez seulement si vous faites confiance à l'image et acceptez ce risque.",
"The image user is not numeric:": "L’utilisateur de l’image n’est pas numérique :",
"The image was not found in its registry, or it is private:": "L'image n'a pas été trouvée dans son registre, ou elle est privée:",
"The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "Le Compose importé demande privilégié, mais la documentation officielle de jlesage/handbrake ne require; ProxMenux maintient le LXC non privilégié.",
"The imported OCI groups are not numeric": "Les groupes OCI importés ne sont pas numériques",
@@ -7141,6 +7178,7 @@
"Time is up; Home Assistant OS could not be confirmed as running": "Le temps est écoulé; Home Assistant OS n'a pas pu être confirmé comme fonctionnant",
"Time settings configured - Timezone:": "Paramètres horaires configurés - Fuseau horaire :",
"Time synchronization reset to UTC": "Synchronisation de l'heure réinitialisée sur UTC",
"Time zone of the fixed daily run times": "Fuseau horaire des heures d’exécution quotidiennes fixes",
"Timezone": "Fuseau horaire",
"Tip: Also mount the VirtIO ISO for drivers and guest agent installer": "Astuce : Montez également l'ISO VirtIO pour les pilotes et le programme d'installation de l'agent invité.",
"Tip: You can install the QEMU Guest Agent inside the VM with:": "Astuce : Vous pouvez installer l'agent invité QEMU dans la VM avec :",
@@ -7177,6 +7215,8 @@
"Top memory processes in CT": "Principaux processus de mémoire en CT",
"Top-level configs, secrets and other global options are not yet supported": "Configurations de haut niveau, secrets et autres options globales ne sont pas encore pris en charge",
"Top-level volume options are not yet supported": "Les options de volume de haut niveau ne sont pas encore prises en charge",
"Tor SOCKS5 and HTTP proxy.": "Proxy SOCKS5 et HTTP de Tor.",
"Tor is a proxy, not a website. It has no web interface.": "Tor est un proxy, pas un site web. Il n’a pas d’interface web.",
"Total": "Total",
"Total members:": "Nombre total de membres :",
"Total routes": "Total des itinéraires",
@@ -7186,6 +7226,7 @@
"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.": "Transmission est conçu pour une utilisation facile et puissante. Transmission possède les fonctionnalités que vous souhaitez d'un client BitTorrent : cryptage, interface web, échange entre pairs, liens magnétiques, DHT, μTP, UPnP et le transfert de port NAT-PMP, support de webseed, répertoires de veille, édition de tracker, limites de vitesse globales et per-torrent, et plus encore.",
"Tried pvesm path and manual detection methods": "pvesm path et les méthodes de détection manuelle ont été essayés",
"Trust this certificate and save it for scheduled backups?": "Faire confiance à ce certificat et l'enregistrer pour les sauvegardes planifiées ?",
"Trusted origins for a hostname or reverse proxy, with scheme and port (optional)": "Origines de confiance pour un nom d’hôte ou un proxy inverse, avec schéma et port (facultatif)",
"Try Again": "Essayer à nouveau",
"Try a different search term.": "Essayez un autre terme de recherche.",
"Try accessing": "Essayez d'accéder",
@@ -7446,6 +7487,7 @@
"Upload to PBS is currently: no. Pick an action:": "Le téléchargement sur PBS est actuellement : non. Choisissez une action :",
"Upload to PBS is currently: yes. Pick an action:": "Le téléchargement sur PBS est actuellement : oui. Choisissez une action :",
"Upload to PBS: enable, disable or rotate the recovery passphrase": "Télécharger sur PBS : activer, désactiver ou alterner la phrase secrète de récupération",
"Upstream NTP servers": "Serveurs NTP amont",
"Uptime and who is logged in": "Disponibilité et qui est connecté",
"Usage:": "Utilisation :",
"Use \"Check test progress\" to see results.": "Utilisez « Vérifier la progression du test » pour voir les résultats.",
@@ -7718,6 +7760,7 @@
"Warning: Limited PCI Reset Support": "Avertissement : prise en charge limitée de la réinitialisation PCI",
"Warning: both VMs have autostart enabled (onboot=1).": "Attention : les deux machines virtuelles ont le démarrage automatique activé (onboot=1).",
"Warnings": "Avertissements",
"Watch history, ratings and watchlists synced between media servers and trackers.": "Historique, notes et listes de suivi synchronisés entre serveurs multimédias et trackers.",
"Watchdog": "Surveillance",
"Watchdog (off): restart the application when it crashes": "Surveillance (désactivée) : redémarrer l'application lorsqu'elle plante",
"Watchdog (on): restart the application when it crashes": "Surveillance (activée) : redémarrer l'application lorsqu'elle plante",
@@ -8191,6 +8234,8 @@
"no passphrase": "pas de phrase secrète",
"no password": "pas de mot de passe",
"no-subscription repository": "référentiel sans abonnement",
"noVNC browser session": "Session de navigateur noVNC",
"noVNC browser session (password only)": "Session de navigateur noVNC (mot de passe uniquement)",
"no_root_squash": "no_root_squash",
"non-ProxMenux .tar archive(s) in this path": "Archive(s) .tar non-ProxMenux dans ce chemin",
"none": "aucun",
+45
View File
@@ -209,6 +209,8 @@
"Access token of the connector, from the Twingate admin console": "Token di accesso del connettore, dalla console di amministrazione Twingate",
"Account is not locked": "L'account non è bloccato",
"Account token from the settings of https://app.foldingathome.org": "Token dell'account dalle impostazioni di https://app.foldingathome.org",
"AceStream HTTP Proxy has no web interface: a media player opens its streams.": "AceStream HTTP Proxy non ha un’interfaccia web: i suoi flussi si aprono con un lettore multimediale.",
"AceStream engine with its HTTP API for media players.": "Motore AceStream con la sua API HTTP per i lettori multimediali.",
"Action cancelled due to previous xshok-proxmox modifications.": "Azione annullata per precedenti modifiche di xshok-proxmox.",
"Action:": "Azione:",
"Activate Monitor": "Attiva Monitor",
@@ -306,6 +308,7 @@
"Address of the PostgreSQL server": "Indirizzo del server PostgreSQL",
"Address of the Redis or Valkey server": "Indirizzo del server Redis o Valkey",
"Address of the database server (mysql and pgsql only)": "Indirizzo del server del database (solo mysql e pgsql)",
"Address of the noVNC session in the links of the notifications (for example 192.168.1.50)": "Indirizzo della sessione noVNC nei link delle notifiche (ad esempio 192.168.1.50)",
"Address of the oci-compose file": "Indirizzo del file oci-compose",
"Address to reach Pydio Cells (https://domain or https://IP:8080)": "Indirizzo per raggiungere Pydio Cells (https://domain o https://IP:8080)",
"Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Indirizzo per raggiungere wallabag (http://IP o https://wallabag.example.com)",
@@ -379,6 +382,7 @@
"Allocated RAM:": "RAM assegnata:",
"Allocating virtual disk for %s...": "Allocazione del disco virtuale per %s...",
"Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Consentire il traffico TCP sulla porta {port} dalla sottorete {subnet} attraverso il firewall dell’host? Le regole esistenti non vengono modificate.",
"Allowed hostnames for a hostname or reverse proxy (optional)": "Nomi host consentiti per un nome host o un reverse proxy (facoltativo)",
"Allowed hosts (comma separated; * allows access through the assigned IP)": "Host consentiti (separati da virgole; * consente l’accesso tramite l’IP assegnato)",
"Allowed source subnet:": "Sottorete di origine consentita:",
"Allowed web port:": "Porta web consentita:",
@@ -766,6 +770,7 @@
"Cannot inspect existing ZRAM configurations": "Impossibile ispezionare le configurazioni ZRAM esistenti",
"Cannot inspect existing ZRAM generator configuration": "Impossibile ispezionare la configurazione del generatore ZRAM esistente",
"Cannot load backup library: lib_host_backup_common.sh": "Impossibile caricare la libreria di backup: lib_host_backup_common.sh",
"Cannot prepare the OCI archive:": "Impossibile preparare l'archivio OCI:",
"Cannot proceed with invalid export path.": "Impossibile procedere con un percorso di esportazione non valido.",
"Cannot proceed with invalid share name.": "Impossibile procedere con un nome di condivisione non valido.",
"Cannot reach Proxmox repositories": "Impossibile raggiungere i repository Proxmox",
@@ -963,6 +968,7 @@
"Chrome is the official web browser from Google, built to be fast, secure, and customizable.": "Chrome è il browser web ufficiale di Google, progettato per essere veloce, sicuro e personalizzabile.",
"Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium è un progetto di browser open source che mira a offrire a tutti un'esperienza web più sicura, veloce e stabile.",
"Circular dependency:": "Dipendenza circolare:",
"Claims the free games of Steam, Epic, Prime Gaming, GOG and more.": "Riscatta i giochi gratuiti di Steam, Epic, Prime Gaming, GOG e altri.",
"Clean disk metadata": "Pulisci metadati disco",
"Cleaned up": "Pulizia completata",
"Cleaning cached files...": "Pulizia dei file in cache...",
@@ -986,6 +992,7 @@
"Clearing login credentials...": "Cancellazione delle credenziali di accesso...",
"Client (run a bandwidth test to a server)": "Client (esegui un test banda verso un server)",
"Client determines best version to use": "Il client determina la versione migliore da usare",
"Client networks permitted to query NTP (comma-separated CIDRs)": "Reti client autorizzate a interrogare NTP (CIDR separati da virgole)",
"Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "I client raggiungono la VPN tramite l'indirizzo pubblico e la porta UDP indicata durante l'installazione: questa porta deve quindi essere inoltrata al container.",
"Cloning Coral driver repository (feranick fork)...": "Clonazione del repository dei driver Coral (fork feranick)...",
"Cloning Lynis from GitHub...": "Clonazione di Lynis da GitHub...",
@@ -994,6 +1001,7 @@
"Cloud Database Manager.": "Gestore di database cloud.",
"Cloud storage synchronization and FUSE mounts": "Sincronizzazione con storage cloud e mount FUSE",
"Cloud-Init Automated Installers": "Programmi di installazione automatizzati Cloud-Init",
"Cloudreve": "Cloudreve",
"Cluster certificates updated": "Certificati cluster aggiornati",
"Cluster configuration (advanced)": "Configurazione cluster (avanzata)",
"Cluster data will be applied automatically at next boot.": "I dati del cluster verranno applicati automaticamente al prossimo avvio.",
@@ -1574,6 +1582,7 @@
"Cross-platform file sharing made easy.": "Condivisione di file tra piattaforme, senza complicazioni.",
"Cross-platform monitoring tool.": "Strumento di monitoraggio multipiattaforma.",
"Cross-version detected — safe restore mode": "Rilevate versioni diverse: modalità di ripristino sicuro",
"CrossWatch": "CrossWatch",
"Current": "Attuale",
"Current CIFS mounts:": "Montaggi CIFS attuali:",
"Current Configuration": "Configurazione attuale",
@@ -1737,9 +1746,11 @@
"Desktop UI backup created": "Backup interfaccia desktop creato",
"Desktop and Mobile UI patched": "Patch applicata all’interfaccia desktop e mobile",
"Destination Directory": "Directory di destinazione",
"Destination TCP port for the TLS tunnel": "Porta TCP di destinazione del tunnel TLS",
"Destination directory does not exist:": "La directory di destinazione non esiste:",
"Destination directory is not writable:": "La directory di destinazione non è scrivibile:",
"Destination path for the copy (typically outside ProxMenux state):": "Percorso di destinazione della copia (di solito fuori dai dati di stato ProxMenux):",
"Destination server address for the TLS tunnel": "Indirizzo del server di destinazione del tunnel TLS",
"Destination:": "Destinazione:",
"Destroy a ZFS dataset (irreversible)": "Distruggi un dataset ZFS (irreversibile)",
"Destructive rollback": "Rollback distruttivo",
@@ -2776,8 +2787,10 @@
"HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One è un’immagine della comunità che esegue Docker nel container. LXC resta non privilegiato, ma i profili AppArmor interni potrebbero non essere disponibili. Il primo avvio scarica Home Assistant Core e i suoi componenti aggiuntivi. Se la verifica fallisce, CT e /mnt/data vengono conservati per la diagnosi.",
"HAOS One profile declined": "Profilo HAOS One rifiutato",
"HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One richiede un container LXC non privilegiato e non gestito, con nesting e keyctl, 2 core, 2048 MB di RAM, rootfs di almeno 12 GB e /mnt/data di almeno 16 GB su un volume del container incluso nei backup",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.": "Flusso HLS: porta 6878, percorso /ace/manifest.m3u8?id= seguito dall’ID del canale.",
"HOSTNAME": "NOME HOST",
"HTML5 Network Speed Test Server.": "Server HTML5 per test velocità di rete.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.": "Proxy HTTP CONNECT: usa lo stesso indirizzo IP e la porta 8118. Questi indirizzi sono impostazioni del proxy, non link web.",
"HTTP service check without a saved URL": "Controllo servizio HTTP senza URL salvato",
"Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emula l'API Philips Hue per altri gateway domotici, come Amazon Echo/Dot di prima generazione (la seconda generazione ha problemi a rilevare ha-bridge), e per altri sistemi compatibili con Philips Hue. Gestisce i comandi di base del protocollo Hue, come accensione, spegnimento e luminosità, e può controllare la maggior parte dei dispositivi dotati di un'API dedicata.",
"HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake è uno strumento open source sviluppato da volontari per convertire video da quasi qualsiasi formato in una selezione di codec moderni e ampiamente supportati.",
@@ -2910,6 +2923,7 @@
"Host write access confirmed.": "Accesso in scrittura dell'host confermato.",
"Hostname": "Nome host",
"Hot changes applied. No reboot needed for these paths.": "Modifiche a caldo applicate. Nessun riavvio necessario per questi percorsi.",
"Hours between claiming runs (0 disables interval runs)": "Ore tra un’esecuzione e l’altra (0 disattiva le esecuzioni a intervalli)",
"How do you want to add it?": "Come vuoi aggiungerlo?",
"How do you want to authenticate this backup target?": "Come vuoi autenticare questa destinazione di backup?",
"How do you want to select the": "Come vuoi selezionare il server",
@@ -3641,6 +3655,7 @@
"LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf è una versione personalizzata e indipendente di Firefox incentrata su privacy, sicurezza e libertà degli utenti. Mira inoltre a eliminare telemetria, raccolta dei dati e altre seccature, disabilitando funzionalità che limitano la libertà dell’utente, come DRM.",
"Librespeed is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers.": "Librespeed è uno speed test molto leggero, implementato in JavaScript con XMLHttpRequest e Web Workers.",
"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr è un gestore di raccolte musicali per utenti Usenet e BitTorrent. Può monitorare diversi feed RSS per trovare nuovi brani dei tuoi artisti preferiti, scaricarli, ordinarli e rinominarli. Può anche aggiornare automaticamente la qualità dei file già scaricati quando è disponibile una versione di qualità superiore.",
"Lightweight DNS forwarder and cache.": "Inoltro e cache DNS leggeri.",
"Lightweight Docker management UI": "Interfaccia leggera per gestire Docker",
"Likely cause: host directory permissions deny the container's mapped UID.": "Causa probabile: le autorizzazioni della directory host negano l'accesso all'UID mappato del container.",
"Limiting size and optimizing journald": "Limitazione delle dimensioni e ottimizzazione di journald",
@@ -3714,6 +3729,8 @@
"Log2RAM write scheduled every": "Scrittura Log2RAM programmata ogni",
"Log:": "Registro:",
"Logged-in users": "Utenti connessi",
"Login email used by every store (optional)": "E-mail di accesso usata da tutti i negozi (facoltativo)",
"Login password used by every store (optional)": "Password di accesso usata da tutti i negozi (facoltativo)",
"Login to {registry} timed out. Saved credentials were not changed.": "Tempo scaduto per l'accesso a {registry}. Le credenziali salvate non sono state modificate.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "Tempo scaduto per la disconnessione da {registry}. Le credenziali salvate nel file non sono state modificate.",
"Logrotate optimization completed": "Ottimizzazione Logrotate completata",
@@ -3754,8 +3771,11 @@
"MAC address": "Indirizzo MAC",
"MACHINE TYPE": "TIPO DI MACCHINA",
"MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME è un emulatore gratuito e open source progettato per riprodurre via software su computer moderni l'hardware di giochi arcade, console, vecchi computer e altri sistemi.",
"MDBList lists synced to Radarr and Sonarr.": "Liste di MDBList sincronizzate con Radarr e Sonarr.",
"MDBListarr": "MDBListarr",
"MOTD configuration updated successfully": "Configurazione MOTD aggiornata con successo",
"MOTD configuration was already up to date": "Configurazione MOTD già aggiornata",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID.": "Flusso MPEG-TS: porta 6878, percorso /ace/getstream?id= seguito dall’ID del canale.",
"MTU SIZE": "DIMENSIONE MTU",
"Machine Type": "Tipo macchina",
"Machine i440fx": "Macchina i440fx",
@@ -4022,6 +4042,7 @@
"NICs:": "NIC:",
"NOT FOUND": "NON TROVATO",
"NOTE: The host directory and its contents will remain unchanged.": "NOTA: la directory host e il suo contenuto rimarranno invariati.",
"NTP time server for the network.": "Server dell’ora NTP per la rete.",
"NUT server user for clients such as PeaNUT": "Utente del server NUT per client come PeaNUT",
"NVENC patch detected — list narrowed to versions supported by keylase/nvidia-patch.": "Rilevata patch NVENC: elenco ristretto alle versioni supportate da keylase/nvidia-patch.",
"NVIDIA (CUDA)": "NVIDIA (CUDA)",
@@ -4487,6 +4508,7 @@
"Non-free firmware warnings disabled": "Avvisi sul firmware non libero disabilitati",
"None": "Nessuno",
"Normalizing stable monitor service...": "Normalizzazione del servizio Monitor stabile in corso...",
"Nostr relay.": "Relay Nostr.",
"Not Mounted": "Non montato",
"Not a JSON object:": "Non è un oggetto JSON:",
"Not all platforms support Controller/NVMe passthrough reliably.": "Non tutte le piattaforme supportano il passthrough Controller/NVMe in modo affidabile.",
@@ -4507,6 +4529,7 @@
"Not required (password only)": "Non richiesto (solo password)",
"Not required (token only)": "Non richiesto (solo token)",
"Not yet verified by ProxMenux (beta)": "Non ancora verificato da ProxMenux (beta)",
"Note-taking with tags, workspaces, attachments and a REST API.": "Note con tag, spazi di lavoro, allegati e un’API REST.",
"Note: A system reboot will be required after enabling IOMMU.": "Nota: sarà necessario riavviare il sistema dopo aver abilitato IOMMU.",
"Note: this only works if the NFS server does NOT use 'all_squash' for root.": "Nota: funziona solo se il server NFS NON utilizza 'all_squash' per root.",
"Notes": "Note",
@@ -4590,6 +4613,7 @@
"Only a Docker Swarm uses these settings, so they are not applied:": "Queste impostazioni si usano solo in Docker Swarm, quindi non vengono applicate:",
"Only a full sha256 image digest is supported.": "È supportato solo un digest sha256 completo dell'immagine.",
"Only an installed standalone OCI instance can adopt external changes": "Solo un’istanza OCI autonoma installata può acquisire modifiche esterne",
"Only applications configured to use this proxy send their traffic through Tor.": "Solo le applicazioni configurate per usare questo proxy inviano il loro traffico attraverso Tor.",
"Only backed-up Proxmox volumes can be adopted": "L'adozione dei volumi Proxmox richiede l'opzione backup=1",
"Only convert to privileged if absolutely necessary for your use case.": "Converti in privilegiato solo se assolutamente necessario per il tuo caso d'uso.",
"Only fully free disks are shown (not system-used and not referenced by VM/LXC).": "Sono mostrati solo i dischi completamente liberi (non usati dal sistema né referenziati da VM/LXC).",
@@ -4778,6 +4802,7 @@
"Password of the admin account": "Password dell'account amministratore",
"Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Password di accesso all'applicazione Flowise, ormai deprecata (letta solo dalle versioni di Flowise precedenti alla 3.0.1)",
"Password of the main AdGuard Home": "Password dell'istanza principale di AdGuard Home",
"Password of the noVNC browser session": "Password della sessione del browser noVNC",
"Password of the superuser account": "Password dell'account superutente",
"Password or API token secret:": "Password o segreto del token API:",
"Password or secret": "Password o segreto",
@@ -4909,6 +4934,8 @@
"Power state D3cold/D0 transitions may be inaccessible": "Le transizioni dello stato di alimentazione D3cold/D0 potrebbero essere inaccessibili",
"Powerful OCR powered by DeepSeek AI": "OCR avanzato basato sull'IA di DeepSeek",
"Powerful networking tool": "Potente strumento di rete",
"Poznote": "Poznote",
"Poznote administrator": "Amministratore di Poznote",
"Pre-check found": "Il controllo preliminare ha rilevato",
"Pre-configure destinations so you don't have to enter them every time you back up.": "Preconfigura le destinazioni in modo da non doverle inserire ogni volta che esegui il backup.",
"Pre-existing gasket-dkms package removed.": "Pacchetto gasket-dkms preesistente rimosso.",
@@ -4961,6 +4988,7 @@
"Previous installation restored": "Installazione precedente ripristinata",
"Previous shutdowns": "Arresti precedenti",
"Primary GID for Emby": "GID primario per Emby",
"Primary upstream DNS server": "Server DNS upstream principale",
"Privacy-first finance app with envelope budgeting and multi-device sync.": "App finanziaria attenta alla privacy con gestione del budget a buste e sincronizzazione tra dispositivi.",
"Privacy-first, self-hosted PDF toolkit": "Strumenti PDF self-hosted orientati alla privacy",
"Private installation record saved": "Record privato di installazione salvato",
@@ -5054,6 +5082,7 @@
"Proxmox VE 8 to 9 Manual Upgrade Guide": "Guida aggiornamento manuale Proxmox VE da 8 a 9",
"Proxmox VE 9.x no-subscription repository created": "Repository senza abbonamento Proxmox VE 9.x creato",
"Proxmox VE Helper Scripts": "Proxmox VE Helper Scripts",
"Proxmox VE cannot create a container from this image: it declares a user but does not include /etc/passwd and /etc/group. Nothing was created.": "Proxmox VE non può creare un container da questa immagine: dichiara un utente, ma non include /etc/passwd né /etc/group. Non è stato creato nulla.",
"Proxmox VE configuration completed.": "Configurazione Proxmox VE completata.",
"Proxmox VE safe update completed": "Aggiornamento sicuro di Proxmox VE completato",
"Proxmox auth logger service created and started": "Servizio log autenticazione Proxmox creato e avviato",
@@ -5589,6 +5618,7 @@
"SMB port 445:": "Porta SMB 445:",
"SMB ports:": "Porte SMB:",
"SMB, NFS and Time Machine shares from a web panel": "Condivisioni SMB, NFS e Time Machine da un pannello web",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.": "Proxy SOCKS5: configura la tua applicazione con l’indirizzo IP del LXC indicato sopra e la porta 9050.",
"SR-IOV Configuration Detected": "Rilevata configurazione SR-IOV",
"SSD Emulation": "Emulazione SSD",
"SSH access": "Accesso SSH",
@@ -5704,6 +5734,7 @@
"Search results for:": "Risultati ricerca per:",
"Search/Filter Scripts": "Cerca/filtra script",
"Searchable document archive with OCR": "Archivio documenti ricercabile con OCR",
"Secondary upstream DNS server": "Server DNS upstream secondario",
"Secure Disk Formatter": "Formattatore di dischi sicuro",
"Secure Gateway (Tailscale VPN)": "Secure Gateway (VPN Tailscale)",
"Secure Gateway deployed successfully!": "Secure Gateway distribuito con successo!",
@@ -5897,6 +5928,7 @@
"Self-hosted ZeroTier network controller with web UI for centralized management.": "Controller di rete ZeroTier self-hosted con interfaccia web per la gestione centralizzata.",
"Self-hosted cloud data migration & sync manager": "Gestore self-hosted per migrare e sincronizzare dati cloud",
"Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Gestore collaborativo di segnalibri self-hosted per raccogliere, leggere, annotare e conservare integralmente ciò che conta, tutto in un unico posto.",
"Self-hosted file management and sharing with multiple storage providers.": "Gestione e condivisione di file self-hosted con più provider di archiviazione.",
"Self-hosted file sharing with a modern web interface": "Condivisione file self-hosted con interfaccia web moderna",
"Self-hosted file toolkit for images, video, audio, PDFs, and files": "Set di strumenti self-hosted per immagini, video, audio, PDF e altri file",
"Self-hosted internet archiving solution": "Soluzione self-hosted per archiviare contenuti Internet",
@@ -6214,7 +6246,9 @@
"Static IP": "IP statico",
"Static IPv4 address": "Indirizzo IPv4 statico",
"Static IPv4 address for": "Indirizzo IPv4 statico per",
"Statping": "Statping",
"Status": "Stato",
"Status page and uptime monitoring.": "Pagina di stato e monitoraggio della disponibilità.",
"Status:": "Stato:",
"Steam is the ultimate destination for playing, discussing, and creating games.": "Steam è la piattaforma di riferimento per giocare, discutere e creare giochi.",
"SteamGridDB": "SteamGridDB",
@@ -6286,6 +6320,7 @@
"Storage:": "Storage:",
"Stored Credentials:": "Credenziali archiviate:",
"Stored credentials:": "Credenziali archiviate:",
"Stores to run, separated by commas (empty runs the default stores)": "Negozi da eseguire, separati da virgole (vuoto esegue i negozi predefiniti)",
"Stremio is a modern media center that gives you the freedom to watch everything you want.": "Stremio è un moderno media center per guardare tutto ciò che si desidera.",
"Subdomains for the certificate, comma separated (wildcard for *.domain)": "Sottodomini del certificato, separati da virgole (wildcard per *.domain)",
"Subnet": "Sottorete",
@@ -6350,6 +6385,7 @@
"TCP optimizations configuration completed": "Configurazione ottimizzazioni TCP completata",
"TCP optimizations reverted (defaults restored on next reboot)": "Ottimizzazioni TCP rimosse (valori predefiniti ripristinati al prossimo riavvio)",
"TCP port 5201 is reachable (firewall on server)": "La porta TCP 5201 è raggiungibile (firewall sul server)",
"TLS tunnel for a TCP service.": "Tunnel TLS per un servizio TCP.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "Verifica TLS non riuscita per {registry}. Installa la CA del registro in /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "Dispositivo TPM aggiunto alla VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "Selezione storage TPM non riuscita o annullata. Creazione VM interrotta.",
@@ -6702,6 +6738,7 @@
"The image requests NVIDIA, but the host has no working NVIDIA driver": "L'immagine richiede NVIDIA, ma l'host non ha un driver NVIDIA funzionante",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "L’immagine richiede di disabilitare parte dell’isolamento AppArmor o seccomp. Continuare solo se si ritiene affidabile l’immagine e si accetta il rischio.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "L’immagine richiede di disabilitare parte dell’isolamento AppArmor o seccomp. Compose consente di allentare queste restrizioni; l’opzione resta disattivata salvo selezione dell’utente. Continuare solo se si ritiene affidabile l’immagine e si accetta il rischio.",
"The image user is not numeric:": "L'utente dell'immagine non è numerico:",
"The image was not found in its registry, or it is private:": "L'immagine non è stata trovata nel suo registro, o è privata:",
"The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "Il file Compose importato richiede privileged, ma la documentazione ufficiale di jlesage/handbrake non lo richiede; ProxMenux mantiene il LXC non privilegiato.",
"The imported OCI groups are not numeric": "I gruppi OCI importati non sono numerici",
@@ -7142,6 +7179,7 @@
"Time is up; Home Assistant OS could not be confirmed as running": "Tempo scaduto; non è stato possibile confermare che Home Assistant OS sia in esecuzione",
"Time settings configured - Timezone:": "Impostazioni ora configurate - Fuso orario:",
"Time synchronization reset to UTC": "La sincronizzazione dell'ora è stata reimpostata su UTC",
"Time zone of the fixed daily run times": "Fuso orario degli orari fissi di esecuzione giornaliera",
"Timezone": "Fuso orario",
"Tip: Also mount the VirtIO ISO for drivers and guest agent installer": "Suggerimento: montare anche l'ISO VirtIO per i driver e il programma di installazione dell'agente guest",
"Tip: You can install the QEMU Guest Agent inside the VM with:": "Suggerimento: è possibile installare QEMU Guest Agent nella VM con:",
@@ -7178,6 +7216,8 @@
"Top memory processes in CT": "Processi CT con maggior consumo memoria",
"Top-level configs, secrets and other global options are not yet supported": "Le configurazioni, i segreti e le altre opzioni globali di primo livello non sono ancora supportati",
"Top-level volume options are not yet supported": "Le opzioni dei volumi di primo livello non sono ancora supportate",
"Tor SOCKS5 and HTTP proxy.": "Proxy SOCKS5 e HTTP di Tor.",
"Tor is a proxy, not a website. It has no web interface.": "Tor è un proxy, non un sito web. Non ha un’interfaccia web.",
"Total": "Totale",
"Total members:": "Membri totali:",
"Total routes": "Rotte totali",
@@ -7187,6 +7227,7 @@
"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.": "Transmission è progettato per essere facile da usare senza rinunciare alle funzionalità. Offre le caratteristiche desiderate in un client BitTorrent: crittografia, interfaccia web, scambio di peer, link magnet, DHT, µTP, UPnP e inoltro delle porte NAT-PMP, supporto webseed, directory monitorate, modifica dei tracker, limiti di velocità globali e per singolo torrent e altro ancora.",
"Tried pvesm path and manual detection methods": "Provati pvesm path e i metodi di rilevamento manuale",
"Trust this certificate and save it for scheduled backups?": "Considerare attendibile questo certificato e salvarlo per i backup pianificati?",
"Trusted origins for a hostname or reverse proxy, with scheme and port (optional)": "Origini attendibili per un nome host o un reverse proxy, con schema e porta (facoltativo)",
"Try Again": "Riprova",
"Try a different search term.": "Provare un termine di ricerca diverso.",
"Try accessing": "Prova ad accedere",
@@ -7447,6 +7488,7 @@
"Upload to PBS is currently: no. Pick an action:": "Caricamento su PBS: no. Selezionare un’azione:",
"Upload to PBS is currently: yes. Pick an action:": "Caricamento su PBS: sì. Selezionare un’azione:",
"Upload to PBS: enable, disable or rotate the recovery passphrase": "Caricamento su PBS: abilita, disabilita o sostituisci la passphrase di ripristino",
"Upstream NTP servers": "Server NTP upstream",
"Uptime and who is logged in": "Tempo di attività e utenti connessi",
"Usage:": "Utilizzo:",
"Use \"Check test progress\" to see results.": "Usare \"Controlla l’avanzamento del test\" per vedere i risultati.",
@@ -7719,6 +7761,7 @@
"Warning: Limited PCI Reset Support": "Avvertenza: supporto reset PCI limitato",
"Warning: both VMs have autostart enabled (onboot=1).": "Attenzione: entrambe le VM hanno l'avvio automatico abilitato (onboot=1).",
"Warnings": "Avvisi",
"Watch history, ratings and watchlists synced between media servers and trackers.": "Cronologia, valutazioni e watchlist sincronizzate tra server multimediali e tracker.",
"Watchdog": "Watchdog",
"Watchdog (off): restart the application when it crashes": "Watchdog (disattivato): riavvio in caso di arresto anomalo",
"Watchdog (on): restart the application when it crashes": "Watchdog (attivato): riavvio in caso di arresto anomalo",
@@ -8192,6 +8235,8 @@
"no passphrase": "nessuna passphrase",
"no password": "nessuna password",
"no-subscription repository": "repository no-subscription",
"noVNC browser session": "Sessione del browser noVNC",
"noVNC browser session (password only)": "Sessione del browser noVNC (solo password)",
"no_root_squash": "no_root_squash",
"non-ProxMenux .tar archive(s) in this path": "in questo percorso",
"none": "nessun elemento",
+45
View File
@@ -209,6 +209,8 @@
"Access token of the connector, from the Twingate admin console": "Token de acesso do conector, no console administrativo Twingate",
"Account is not locked": "A conta não está bloqueada",
"Account token from the settings of https://app.foldingathome.org": "Token de conta das configurações de https://app.foldingathome.org",
"AceStream HTTP Proxy has no web interface: a media player opens its streams.": "O AceStream HTTP Proxy não tem interface web: as suas transmissões abrem-se com um leitor multimédia.",
"AceStream engine with its HTTP API for media players.": "Motor AceStream com a sua API HTTP para leitores multimédia.",
"Action cancelled due to previous xshok-proxmox modifications.": "Ação cancelada devido a modificações anteriores do xshok-proxmox.",
"Action:": "Ação:",
"Activate Monitor": "Ativar monitor",
@@ -306,6 +308,7 @@
"Address of the PostgreSQL server": "Endereço do servidor PostgreSQL",
"Address of the Redis or Valkey server": "Endereço do servidor Redis ou Valkey",
"Address of the database server (mysql and pgsql only)": "Endereço do servidor de banco de dados (somente mysql e pgsql)",
"Address of the noVNC session in the links of the notifications (for example 192.168.1.50)": "Endereço da sessão noVNC nas ligações das notificações (por exemplo, 192.168.1.50)",
"Address of the oci-compose file": "Endereço do arquivo oci-compose",
"Address to reach Pydio Cells (https://domain or https://IP:8080)": "Endereço para chegar a Pydio Cells (https://domínio ou https://IP:8080)",
"Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Endereço utilizado para chegar ao wallabag (http://IP ou https://wallabag.example.com)",
@@ -379,6 +382,7 @@
"Allocated RAM:": "RAM atribuída:",
"Allocating virtual disk for %s...": "A alocar o disco virtual para %s...",
"Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Permitir porta TCP {port} de {subnet} através do firewall do host? As regras de firewall existentes não são alteradas.",
"Allowed hostnames for a hostname or reverse proxy (optional)": "Nomes de anfitrião permitidos para um nome de anfitrião ou proxy inverso (opcional)",
"Allowed hosts (comma separated; * allows access through the assigned IP)": "Hosts permitidas (separados por vírgula; * permite o acesso através do IP atribuído)",
"Allowed source subnet:": "Sub-rede de origem permitida:",
"Allowed web port:": "Porta web permitida:",
@@ -766,6 +770,7 @@
"Cannot inspect existing ZRAM configurations": "Não é possível inspecionar configurações ZRAM existentes",
"Cannot inspect existing ZRAM generator configuration": "Não é possível inspecionar a configuração existente do gerador ZRAM",
"Cannot load backup library: lib_host_backup_common.sh": "Não é possível carregar a biblioteca de backup: lib_host_backup_common.sh",
"Cannot prepare the OCI archive:": "Não foi possível preparar o arquivo OCI:",
"Cannot proceed with invalid export path.": "Não é possível prosseguir com caminho de exportação inválido.",
"Cannot proceed with invalid share name.": "Não é possível continuar com um nome de compartilhamento inválido.",
"Cannot reach Proxmox repositories": "Não é possível acessar os repositórios Proxmox",
@@ -963,6 +968,7 @@
"Chrome is the official web browser from Google, built to be fast, secure, and customizable.": "Chrome é o navegador oficial do Google, construído para ser rápido, seguro e personalizável.",
"Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium é um projeto de navegador de código aberto que visa construir uma maneira mais segura, rápida e estável para todos os usuários experimentarem a web.",
"Circular dependency:": "Dependência circular:",
"Claims the free games of Steam, Epic, Prime Gaming, GOG and more.": "Resgata os jogos gratuitos da Steam, Epic, Prime Gaming, GOG e outros.",
"Clean disk metadata": "Limpar metadados do disco",
"Cleaned up": "Limpo",
"Cleaning cached files...": "Limpando arquivos em cache...",
@@ -986,6 +992,7 @@
"Clearing login credentials...": "Limpando credenciais de login...",
"Client (run a bandwidth test to a server)": "Cliente (execute um teste de largura de banda em um servidor)",
"Client determines best version to use": "O cliente determina a melhor versão a ser usada",
"Client networks permitted to query NTP (comma-separated CIDRs)": "Redes de clientes autorizadas a consultar NTP (CIDR separados por vírgulas)",
"Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Os clientes chegam à VPN através do endereço público e da porta UDP fornecida durante a instalação, de modo que a porta deve ser encaminhada para este recipiente.",
"Cloning Coral driver repository (feranick fork)...": "Clonando repositório de driver Coral (feranick fork)...",
"Cloning Lynis from GitHub...": "Clonando Lynis do GitHub...",
@@ -994,6 +1001,7 @@
"Cloud Database Manager.": "Gerenciador de banco de dados em nuvem.",
"Cloud storage synchronization and FUSE mounts": "Sincronização de armazenamento em nuvem e montagem FUSE",
"Cloud-Init Automated Installers": "Instaladores automatizados Cloud-Init",
"Cloudreve": "Cloudreve",
"Cluster certificates updated": "Certificados de cluster atualizados",
"Cluster configuration (advanced)": "Configuração de cluster (avançado)",
"Cluster data will be applied automatically at next boot.": "os dados do cluster serão aplicados automaticamente na próxima inicialização.",
@@ -1574,6 +1582,7 @@
"Cross-platform file sharing made easy.": "O compartilhamento de arquivos entre plataformas tornou-se fácil.",
"Cross-platform monitoring tool.": "Ferramenta de monitorização multiplataforma.",
"Cross-version detected — safe restore mode": "Versão cruzada detectada – modo de restauração seguro",
"CrossWatch": "CrossWatch",
"Current": "Atual",
"Current CIFS mounts:": "Montagens CIFS atuais:",
"Current Configuration": "Configuração atual",
@@ -1737,9 +1746,11 @@
"Desktop UI backup created": "Backup da IU do desktop criado",
"Desktop and Mobile UI patched": "Interface de desktop e móvel corrigida",
"Destination Directory": "Diretório de destino",
"Destination TCP port for the TLS tunnel": "Porta TCP de destino do túnel TLS",
"Destination directory does not exist:": "O diretório de destino não existe:",
"Destination directory is not writable:": "O diretório de destino não é gravável:",
"Destination path for the copy (typically outside ProxMenux state):": "Caminho de destino para a cópia (normalmente fora do estado ProxMenux):",
"Destination server address for the TLS tunnel": "Endereço do servidor de destino do túnel TLS",
"Destination:": "Destino:",
"Destroy a ZFS dataset (irreversible)": "Destruir um conjunto de dados ZFS (irreversível)",
"Destructive rollback": "reversão destrutiva",
@@ -2776,8 +2787,10 @@
"HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One é uma imagem comunitária que executa Docker dentro do recipiente. O LXC permanece sem privilégios, mas os perfis internos do AppArmor podem não estar disponíveis. O primeiro início baixa o Home Assistant Core e seus add-ons. Se a verificação falhar, a TC e /mnt/dados são mantidos para diagnóstico.",
"HAOS One profile declined": "O perfil do HAOS One diminuiu",
"HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires um LXC não privilegiado não gerido com nidificação e keyctl, 2 núcleos, 2048 MB RAM, rootfs de pelo menos 12 GB e /mnt/dados de pelo menos 16 GB em um volume de recipiente incluído em backups",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.": "Transmissão HLS: porta 6878, caminho /ace/manifest.m3u8?id= seguido do ID do canal.",
"HOSTNAME": "NOME DO ANFITRIÃO",
"HTML5 Network Speed Test Server.": "Servidor de Teste de Velocidade de Rede HTML5.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.": "Proxy HTTP CONNECT: utilize o mesmo endereço IP e a porta 8118. Estes endereços são definições de proxy, não ligações web.",
"HTTP service check without a saved URL": "Verificação de serviço HTTP sem um URL salvo",
"Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emula Philips Hue API para outros gateways de automação doméstica, como um Amazon Echo/Dot Gen 1 (gen 2 tem problemas descobrindo ha-bridge) ou outros sistemas que suportam Philips Hue. A Ponte lida com comandos básicos como comandos On, Off e brilho do protocolo de matiz. Esta ponte pode controlar a maioria dos dispositivos que têm uma API distinta.",
"HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake é uma ferramenta de código aberto, construída por voluntários, para converter vídeo de quase qualquer formato para uma seleção de codecs modernos e amplamente suportados.",
@@ -2910,6 +2923,7 @@
"Host write access confirmed.": "Acesso de gravação do host confirmado.",
"Hostname": "Nome do host",
"Hot changes applied. No reboot needed for these paths.": "Mudanças importantes aplicadas. Não é necessária reinicialização para esses caminhos.",
"Hours between claiming runs (0 disables interval runs)": "Horas entre execuções (0 desativa as execuções por intervalo)",
"How do you want to add it?": "Como você deseja adicioná-lo?",
"How do you want to authenticate this backup target?": "Como você deseja autenticar este destino de backup?",
"How do you want to select the": "Como você deseja selecionar o",
@@ -3641,6 +3655,7 @@
"LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf é uma versão personalizada e independente do Firefox, com os principais objetivos de privacidade, segurança e liberdade de usuário. LibreWolf também tem como objetivo remover todas as telemetrias, coleta de dados e aborrecimentos, bem como desativar recursos anti-liberdade como DRM.",
"Librespeed is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers.": "Librespeed é um Speedtest muito leve implementado em Javascript, usando XMLHttpRequest e Web Workers.",
"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr é um gerenciador de coleção de música para usuários Usenet e BitTorrent. Ele pode monitorar vários feeds RSS para novas faixas de seus artistas favoritos e vai agarrar, classificar e renomeá-los. Ele também pode ser configurado para atualizar automaticamente a qualidade dos arquivos já baixados quando um formato de melhor qualidade fica disponível.",
"Lightweight DNS forwarder and cache.": "Reencaminhador e cache DNS leve.",
"Lightweight Docker management UI": "IU de gestão Docker leve",
"Likely cause: host directory permissions deny the container's mapped UID.": "Causa provável: as permissões do diretório host negam o UID mapeado do contêiner.",
"Limiting size and optimizing journald": "Limitando o tamanho e otimizando o diário",
@@ -3714,6 +3729,8 @@
"Log2RAM write scheduled every": "Gravação Log2RAM agendada a cada",
"Log:": "Registro:",
"Logged-in users": "Usuários logados",
"Login email used by every store (optional)": "E-mail de início de sessão usado por todas as lojas (opcional)",
"Login password used by every store (optional)": "Palavra-passe de início de sessão usada por todas as lojas (opcional)",
"Login to {registry} timed out. Saved credentials were not changed.": "O login no {registry} expirou. As credenciais salvas não foram alteradas.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "O logout do {registry} expirou. As credenciais do arquivo salvo não foram alteradas.",
"Logrotate optimization completed": "Otimização do Logrotate concluída",
@@ -3754,8 +3771,11 @@
"MAC address": "Endereço MAC",
"MACHINE TYPE": "TIPO DE MÁQUINA",
"MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME é um emulador livre e de código aberto projetado para emular o hardware de jogos de arcade, consoles de jogos de vídeo, computadores antigos e outros sistemas em software em computadores pessoais modernos.",
"MDBList lists synced to Radarr and Sonarr.": "Listas do MDBList sincronizadas com o Radarr e o Sonarr.",
"MDBListarr": "MDBListarr",
"MOTD configuration updated successfully": "Configuração MOTD atualizada com sucesso",
"MOTD configuration was already up to date": "a configuração do MOTD já estava atualizada",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID.": "Transmissão MPEG-TS: porta 6878, caminho /ace/getstream?id= seguido do ID do canal.",
"MTU SIZE": "TAMANHO DA MTU",
"Machine Type": "Tipo de máquina",
"Machine i440fx": "Máquina i440fx",
@@ -4022,6 +4042,7 @@
"NICs:": "Placas de rede:",
"NOT FOUND": "NÃO ENCONTRADO",
"NOTE: The host directory and its contents will remain unchanged.": "NOTA: O diretório host e seu conteúdo permanecerão inalterados.",
"NTP time server for the network.": "Servidor de hora NTP para a rede.",
"NUT server user for clients such as PeaNUT": "usuário NUT server para clientes como PeaNUT",
"NVENC patch detected — list narrowed to versions supported by keylase/nvidia-patch.": "Patch NVENC detectado — lista reduzida às versões suportadas por keylase/nvidia-patch.",
"NVIDIA (CUDA)": "NVIDIA (CUDA)",
@@ -4487,6 +4508,7 @@
"Non-free firmware warnings disabled": "Avisos de firmware não-livre desativados",
"None": "Nenhum",
"Normalizing stable monitor service...": "Normalizando serviço de monitor estável...",
"Nostr relay.": "Relay Nostr.",
"Not Mounted": "Não montado",
"Not a JSON object:": "Não é um objecto JSON:",
"Not all platforms support Controller/NVMe passthrough reliably.": "Nem todas as plataformas oferecem suporte à passagem de controlador/NVMe de maneira confiável.",
@@ -4507,6 +4529,7 @@
"Not required (password only)": "Não é required (somente palavra-passe)",
"Not required (token only)": "Não é required (apenas por token)",
"Not yet verified by ProxMenux (beta)": "Ainda não verificado pelo ProxMenux (beta)",
"Note-taking with tags, workspaces, attachments and a REST API.": "Notas com etiquetas, espaços de trabalho, anexos e uma API REST.",
"Note: A system reboot will be required after enabling IOMMU.": "Nota: Será necessária uma reinicialização do sistema após ativar o IOMMU.",
"Note: this only works if the NFS server does NOT use 'all_squash' for root.": "Nota: isso só funciona se o servidor NFS NÃO usar 'all_squash' para root.",
"Notes": "Notas",
@@ -4590,6 +4613,7 @@
"Only a Docker Swarm uses these settings, so they are not applied:": "Apenas um Swarm Docker usa estas configurações, então elas não são aplicadas:",
"Only a full sha256 image digest is supported.": "Apenas um resumo completo da imagem sha256 é suportado.",
"Only an installed standalone OCI instance can adopt external changes": "Somente uma instância OCI autônoma instalada pode adotar alterações externas",
"Only applications configured to use this proxy send their traffic through Tor.": "Só as aplicações configuradas para usar este proxy enviam o seu tráfego através do Tor.",
"Only backed-up Proxmox volumes can be adopted": "Somente volumes Proxmox com backup podem ser adotados",
"Only convert to privileged if absolutely necessary for your use case.": "Converta para privilegiado apenas se for absolutamente necessário para o seu caso de uso.",
"Only fully free disks are shown (not system-used and not referenced by VM/LXC).": "Somente discos totalmente livres são mostrados (não usados pelo sistema e não referenciados pelo VM/LXC).",
@@ -4778,6 +4802,7 @@
"Password of the admin account": "Senha da conta de administrador",
"Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Senha do login do aplicativo Flowise obsoleto (apenas lido pelas versões do Flowise antes de 3.0.1)",
"Password of the main AdGuard Home": "Senha do AdGuard Home principal",
"Password of the noVNC browser session": "Palavra-passe da sessão do navegador noVNC",
"Password of the superuser account": "Senha da conta de superusuário",
"Password or API token secret:": "Senha ou token secreto da API:",
"Password or secret": "Senha ou segredo",
@@ -4909,6 +4934,8 @@
"Power state D3cold/D0 transitions may be inaccessible": "As transições do estado de energia D3cold/D0 podem estar inacessíveis",
"Powerful OCR powered by DeepSeek AI": "Poderoso OCR alimentado por AI DeepSeek",
"Powerful networking tool": "Ferramenta de rede poderosa",
"Poznote": "Poznote",
"Poznote administrator": "Administrador do Poznote",
"Pre-check found": "Pré-verificação encontrada",
"Pre-configure destinations so you don't have to enter them every time you back up.": "Pré-configure destinos para que você não precise inseri-los sempre que fizer backup.",
"Pre-existing gasket-dkms package removed.": "Pacote gasket-dkms preexistente removido.",
@@ -4961,6 +4988,7 @@
"Previous installation restored": "Instalação anterior restaurada",
"Previous shutdowns": "Paralisações anteriores",
"Primary GID for Emby": "GID primário para Emby",
"Primary upstream DNS server": "Servidor DNS a montante principal",
"Privacy-first finance app with envelope budgeting and multi-device sync.": "App Privacy-first finance com envelope budgeting e sincronização multidispositivo.",
"Privacy-first, self-hosted PDF toolkit": "Privacy-primeiro, auto-hosted PDF toolkit",
"Private installation record saved": "Gravação de instalação privada salva",
@@ -5054,6 +5082,7 @@
"Proxmox VE 8 to 9 Manual Upgrade Guide": "Guia de atualização manual do Proxmox VE 8 a 9",
"Proxmox VE 9.x no-subscription repository created": "Repositório sem assinatura Proxmox VE 9.x criado",
"Proxmox VE Helper Scripts": "Scripts auxiliares do Proxmox VE",
"Proxmox VE cannot create a container from this image: it declares a user but does not include /etc/passwd and /etc/group. Nothing was created.": "O Proxmox VE não consegue criar um contentor a partir desta imagem: declara um utilizador, mas não inclui /etc/passwd nem /etc/group. Nada foi criado.",
"Proxmox VE configuration completed.": "Configuração do Proxmox VE concluída.",
"Proxmox VE safe update completed": "Atualização segura do Proxmox VE concluída",
"Proxmox auth logger service created and started": "Serviço de registrador de autenticação Proxmox criado e iniciado",
@@ -5589,6 +5618,7 @@
"SMB port 445:": "Porta SMB 445:",
"SMB ports:": "Portas SMB:",
"SMB, NFS and Time Machine shares from a web panel": "Compartilhamentos SMB, NFS e Time Machine de um painel da web",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.": "Proxy SOCKS5: configure a sua aplicação com o endereço IP do LXC indicado acima e a porta 9050.",
"SR-IOV Configuration Detected": "Configuração SR-IOV detectada",
"SSD Emulation": "Emulação SSD",
"SSH access": "Acesso SSH",
@@ -5704,6 +5734,7 @@
"Search results for:": "Resultados da pesquisa para:",
"Search/Filter Scripts": "Scripts de pesquisa/filtro",
"Searchable document archive with OCR": "Arquivo de documentos pesquisável com OCR",
"Secondary upstream DNS server": "Servidor DNS a montante secundário",
"Secure Disk Formatter": "Formatador de disco seguro",
"Secure Gateway (Tailscale VPN)": "Secure Gateway (VPN Tailscale)",
"Secure Gateway deployed successfully!": "Secure Gateway implantado com sucesso!",
@@ -5897,6 +5928,7 @@
"Self-hosted ZeroTier network controller with web UI for centralized management.": "Controlador de rede ZeroTier self-hosted com interface web para gerenciamento centralizado.",
"Self-hosted cloud data migration & sync manager": "Gerenciador de migração e sincronização de dados em nuvem hospedada automaticamente",
"Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Gerenciador de favoritos colaborativo para coletar, ler, anotar e preservar totalmente o que importa, tudo em um só lugar.",
"Self-hosted file management and sharing with multiple storage providers.": "Gestão e partilha de ficheiros autoalojada com vários fornecedores de armazenamento.",
"Self-hosted file sharing with a modern web interface": "Partilha de ficheiros auto- hospedados com uma interface Web moderna",
"Self-hosted file toolkit for images, video, audio, PDFs, and files": "Kit de ferramentas de arquivo auto hospedado para imagens, vídeo, áudio, PDFs e arquivos",
"Self-hosted internet archiving solution": "Solução de arquivamento de internet self-hosted",
@@ -6214,7 +6246,9 @@
"Static IP": "IP estático",
"Static IPv4 address": "Endereço IPv4 estático",
"Static IPv4 address for": "Endereço IPv4 estático para",
"Statping": "Statping",
"Status": "Status",
"Status page and uptime monitoring.": "Página de estado e monitorização da disponibilidade.",
"Status:": "Status:",
"Steam is the ultimate destination for playing, discussing, and creating games.": "Steam é o destino final para jogar, discutir e criar jogos.",
"SteamGridDB": "SteamGridDB",
@@ -6286,6 +6320,7 @@
"Storage:": "Armazenar:",
"Stored Credentials:": "Credenciais armazenadas:",
"Stored credentials:": "Credenciais armazenadas:",
"Stores to run, separated by commas (empty runs the default stores)": "Lojas a executar, separadas por vírgulas (vazio executa as lojas predefinidas)",
"Stremio is a modern media center that gives you the freedom to watch everything you want.": "Stremio é um centro de mídia moderno que lhe dá a liberdade de assistir tudo o que você quer.",
"Subdomains for the certificate, comma separated (wildcard for *.domain)": "Subdomínios para o certificado, vírgula separada (wildcard for *. domain)",
"Subnet": "Sub-rede",
@@ -6350,6 +6385,7 @@
"TCP optimizations configuration completed": "Configuração de otimizações TCP concluída",
"TCP optimizations reverted (defaults restored on next reboot)": "Otimizações de TCP revertidas (padrões restaurados na próxima reinicialização)",
"TCP port 5201 is reachable (firewall on server)": "A porta TCP 5201 está acessível (firewall no servidor)",
"TLS tunnel for a TCP service.": "Túnel TLS para um serviço TCP.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "Falha na verificação de TLS para {registry}. Instale a CA do registro em /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "Dispositivo TPM adicionado à VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "A seleção de armazenamento TPM falhou ou foi cancelada. Criação de VM abortada.",
@@ -6702,6 +6738,7 @@
"The image requests NVIDIA, but the host has no working NVIDIA driver": "A imagem solicita NVIDIA, mas a máquina não tem driver NVIDIA funcionando",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "A imagem solicita desativar parte do confinamento AppArmor ou seccomp. Continue apenas se você confiar na imagem e aceitar este risco.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "A imagem solicita desativar parte do confinamento AppArmor ou seccomp. O Compose oferece um relaxamento opcional AppArmor ou seccomp; ele ficará desativado a menos que o usuário o selecione. Continue apenas se você confiar na imagem e aceitar este risco.",
"The image user is not numeric:": "O utilizador da imagem não é numérico:",
"The image was not found in its registry, or it is private:": "A imagem não foi encontrada em seu registro, ou é privada:",
"The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "Os pedidos Compose importados são privilegiados, mas a documentação oficial jlesage/handbrake não require-lo; ProxMenux mantém o LXC sem privilégios.",
"The imported OCI groups are not numeric": "Os grupos OCI importados não são numéricos",
@@ -7142,6 +7179,7 @@
"Time is up; Home Assistant OS could not be confirmed as running": "Acabou o tempo; o sistema operacional Home Assistant não pôde ser confirmado como em execução",
"Time settings configured - Timezone:": "Configurações de horário configuradas - Fuso horário:",
"Time synchronization reset to UTC": "Sincronização de horário redefinida para UTC",
"Time zone of the fixed daily run times": "Fuso horário das horas fixas de execução diária",
"Timezone": "Fuso horário",
"Tip: Also mount the VirtIO ISO for drivers and guest agent installer": "Dica: monte também o VirtIO ISO para drivers e instalador de agente convidado",
"Tip: You can install the QEMU Guest Agent inside the VM with:": "Dica: você pode instalar o agente convidado QEMU dentro da VM com:",
@@ -7178,6 +7216,8 @@
"Top memory processes in CT": "Principais processos de memória em CT",
"Top-level configs, secrets and other global options are not yet supported": "Configurações de topo, segredos e outras opções globais ainda não são suportadas",
"Top-level volume options are not yet supported": "As opções de volume de topo ainda não são suportadas",
"Tor SOCKS5 and HTTP proxy.": "Proxy SOCKS5 e HTTP do Tor.",
"Tor is a proxy, not a website. It has no web interface.": "O Tor é um proxy, não um site. Não tem interface web.",
"Total": "Total",
"Total members:": "Total de membros:",
"Total routes": "Rotas totais",
@@ -7187,6 +7227,7 @@
"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.": "Transmission é projetado para uso fácil e poderoso. Transmission tem os recursos que você deseja de um cliente BitTorrent: criptografia, uma interface web, troca de pares, links magnéticos, DHT, μTP, encaminhamento de portas UPnP e NAT-PMP, suporte a webseed, diretórios de relógio, edição de rastreadores, limites de velocidade globais e per-torrent, e muito mais.",
"Tried pvesm path and manual detection methods": "Foram tentados pvesm path e os métodos de deteção manual",
"Trust this certificate and save it for scheduled backups?": "Confiar neste certificado e salvá-lo para backups agendados?",
"Trusted origins for a hostname or reverse proxy, with scheme and port (optional)": "Origens de confiança para um nome de anfitrião ou proxy inverso, com esquema e porta (opcional)",
"Try Again": "Tente novamente",
"Try a different search term.": "Experimente um termo de pesquisa diferente.",
"Try accessing": "Tente acessar",
@@ -7447,6 +7488,7 @@
"Upload to PBS is currently: no. Pick an action:": "O upload para PBS é atualmente: não. Escolha uma ação:",
"Upload to PBS is currently: yes. Pick an action:": "O upload para PBS é atualmente: sim. Escolha uma ação:",
"Upload to PBS: enable, disable or rotate the recovery passphrase": "Carregar para PBS: ativar, desativar ou alternar a senha de recuperação",
"Upstream NTP servers": "Servidores NTP a montante",
"Uptime and who is logged in": "Tempo de atividade e quem está logado",
"Usage:": "Uso:",
"Use \"Check test progress\" to see results.": "Use \"Verificar o progresso do teste\" para ver os resultados.",
@@ -7719,6 +7761,7 @@
"Warning: Limited PCI Reset Support": "Aviso: suporte limitado para redefinição de PCI",
"Warning: both VMs have autostart enabled (onboot=1).": "Aviso: ambas as VMs têm inicialização automática habilitada (onboot=1).",
"Warnings": "Avisos",
"Watch history, ratings and watchlists synced between media servers and trackers.": "Histórico, classificações e listas sincronizados entre servidores multimédia e trackers.",
"Watchdog": "Vigilância",
"Watchdog (off): restart the application when it crashes": "Vigilância (desativada): reiniciar a aplicação quando falha",
"Watchdog (on): restart the application when it crashes": "Vigilância (ativada): reiniciar a aplicação quando falha",
@@ -8192,6 +8235,8 @@
"no passphrase": "sem senha",
"no password": "sem senha",
"no-subscription repository": "repositório no-subscription",
"noVNC browser session": "Sessão do navegador noVNC",
"noVNC browser session (password only)": "Sessão do navegador noVNC (apenas palavra-passe)",
"no_root_squash": "sem_root_squash",
"non-ProxMenux .tar archive(s) in this path": "arquivo(s) .tar não-ProxMenux neste caminho",
"none": "nenhum",
+45
View File
@@ -209,6 +209,8 @@
"Access token of the connector, from the Twingate admin console": "Prístupový token konektora z administrátorskej konzoly Twingate",
"Account is not locked": "Účet nie je zamknutý",
"Account token from the settings of https://app.foldingathome.org": "Token účtu z nastavení https://app.foldingathome.org",
"AceStream HTTP Proxy has no web interface: a media player opens its streams.": "AceStream HTTP Proxy nemá webové rozhranie: jeho streamy sa otvárajú v prehrávači médií.",
"AceStream engine with its HTTP API for media players.": "Engine AceStream s rozhraním HTTP API pre prehrávače médií.",
"Action cancelled due to previous xshok-proxmox modifications.": "Akcia bola zrušená, pretože v systéme už sú úpravy z xshok-proxmox.",
"Action:": "Akcia:",
"Activate Monitor": "Zapnúť Monitor",
@@ -306,6 +308,7 @@
"Address of the PostgreSQL server": "Adresa servera PostgreSQL",
"Address of the Redis or Valkey server": "Adresa servera Redis alebo Valkey",
"Address of the database server (mysql and pgsql only)": "Adresa databázového servera (iba mysql a pgsql)",
"Address of the noVNC session in the links of the notifications (for example 192.168.1.50)": "Adresa relácie noVNC v odkazoch upozornení (napríklad 192.168.1.50)",
"Address of the oci-compose file": "Adresa súboru oci-compose",
"Address to reach Pydio Cells (https://domain or https://IP:8080)": "Adresa na oslovenie Pydio Cells (https://domain alebo https://IP:8080)",
"Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Adresa použitá na dosiahnutie wallabag (http://IP alebo https://wallabag.example.com)",
@@ -379,6 +382,7 @@
"Allocated RAM:": "Pridelená RAM:",
"Allocating virtual disk for %s...": "Prideľuje sa virtuálny disk pre %s...",
"Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Povoliť cez firewall hostiteľa TCP port {port} zo siete {subnet}? Existujúce pravidlá firewallu sa nemenia.",
"Allowed hostnames for a hostname or reverse proxy (optional)": "Povolené názvy hostiteľov pre názov hostiteľa alebo reverzný proxy (voliteľné)",
"Allowed hosts (comma separated; * allows access through the assigned IP)": "Povolené názvy hostiteľov oddelené čiarkami (* povolí prístup cez pridelenú IP adresu)",
"Allowed source subnet:": "Povolená zdrojová podsieť:",
"Allowed web port:": "Povolený webový port:",
@@ -766,6 +770,7 @@
"Cannot inspect existing ZRAM configurations": "Nie je možné skontrolovať existujúce konfigurácie ZRAM",
"Cannot inspect existing ZRAM generator configuration": "Nie je možné skontrolovať existujúcu konfiguráciu generátora ZRAM",
"Cannot load backup library: lib_host_backup_common.sh": "Nepodarilo sa načítať knižnicu zálohovania: lib_host_backup_common.sh",
"Cannot prepare the OCI archive:": "Nepodarilo sa pripraviť archív OCI:",
"Cannot proceed with invalid export path.": "Nedá sa pokračovať s neplatnou cestou exportu.",
"Cannot proceed with invalid share name.": "Nedá sa pokračovať s neplatným názvom zdieľania.",
"Cannot reach Proxmox repositories": "Repozitáre Proxmoxu nie sú dostupné",
@@ -963,6 +968,7 @@
"Chrome is the official web browser from Google, built to be fast, secure, and customizable.": "Chrome je oficiálny webový prehliadač z Google, postavený tak, aby bol rýchly, bezpečný a prispôsobiteľný.",
"Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium je projekt webového prehliadača s otvoreným zdrojovým kódom, ktorého cieľom je bezpečnejšie, rýchlejšie a stabilnejšie používanie webu.",
"Circular dependency:": "Okružná závislosť:",
"Claims the free games of Steam, Epic, Prime Gaming, GOG and more.": "Získava bezplatné hry zo Steamu, Epicu, Prime Gaming, GOG a ďalších.",
"Clean disk metadata": "Vyčistiť metadáta disku",
"Cleaned up": "Vyčistená",
"Cleaning cached files...": "Čistím uložené dočasné súbory...",
@@ -986,6 +992,7 @@
"Clearing login credentials...": "Mažem prihlasovacie údaje...",
"Client (run a bandwidth test to a server)": "Klient (spustí test priepustnosti voči serveru)",
"Client determines best version to use": "Klient si vyberie najvhodnejšiu verziu",
"Client networks permitted to query NTP (comma-separated CIDRs)": "Klientské siete, ktoré môžu dotazovať NTP (CIDR oddelené čiarkami)",
"Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Klienti sa pripájajú k VPN cez verejnú adresu a port UDP zadané počas inštalácie. Tento port musí byť presmerovaný do kontajnera.",
"Cloning Coral driver repository (feranick fork)...": "Klonujem repozitár ovládača Coral (feranick fork)...",
"Cloning Lynis from GitHub...": "Klonujem Lynis z GitHubu...",
@@ -994,6 +1001,7 @@
"Cloud Database Manager.": "Správca cloudových databáz.",
"Cloud storage synchronization and FUSE mounts": "Synchronizácia cloudového úložiska a pripojenia FUSE",
"Cloud-Init Automated Installers": "Automatické inštalátory cez Cloud-Init",
"Cloudreve": "Cloudreve",
"Cluster certificates updated": "Certifikáty klastra aktualizované",
"Cluster configuration (advanced)": "Nastavenie klastra (pokročilé)",
"Cluster data will be applied automatically at next boot.": "Dáta klastra sa použijú automaticky pri ďalšom štarte.",
@@ -1574,6 +1582,7 @@
"Cross-platform file sharing made easy.": "Jednoduché zdieľanie súborov medzi platformami.",
"Cross-platform monitoring tool.": "Multiplatformový monitorovací nástroj.",
"Cross-version detected — safe restore mode": "Zistená rozdielna verzia - bezpečný režim obnovy",
"CrossWatch": "CrossWatch",
"Current": "Aktuálne",
"Current CIFS mounts:": "Aktuálne CIFS pripojenia:",
"Current Configuration": "Aktuálne nastavenie",
@@ -1737,9 +1746,11 @@
"Desktop UI backup created": "Záloha desktopového UI vytvorená",
"Desktop and Mobile UI patched": "Desktopové aj mobilné UI bolo upravené",
"Destination Directory": "Cieľový priečinok",
"Destination TCP port for the TLS tunnel": "Cieľový port TCP pre tunel TLS",
"Destination directory does not exist:": "Cieľový priečinok neexistuje:",
"Destination directory is not writable:": "Do cieľového priečinka sa nedá zapisovať:",
"Destination path for the copy (typically outside ProxMenux state):": "Cieľová cesta pre kópiu (zvyčajne mimo stavu ProxMenux):",
"Destination server address for the TLS tunnel": "Adresa cieľového servera pre tunel TLS",
"Destination:": "Cieľ:",
"Destroy a ZFS dataset (irreversible)": "Zničiť ZFS dataset (nevratné)",
"Destructive rollback": "Deštruktívny rollback",
@@ -2776,8 +2787,10 @@
"HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One je komunitný obraz, ktorý spúšťa Docker v kontajneri. LXC zostáva neprivilegovaný, vnútorné profily AppArmor však nemusia byť dostupné. Pri prvom spustení sa stiahne Home Assistant Core a jeho doplnky. Ak kontrola zlyhá, kontajner a /mnt/data zostanú zachované na diagnostiku.",
"HAOS One profile declined": "Profil HAOS One bol odmietnutý",
"HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One vyžaduje neprivilegovaný kontajner LXC typu unmanaged s nesting a keyctl, 2 jadrá, 2048 MB RAM, koreňový súborový systém s najmenej 12 GB a /mnt/data s najmenej 16 GB na dátovom zväzku kontajnera zahrnutom do záloh",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.": "Stream HLS: port 6878, cesta /ace/manifest.m3u8?id= a za ňou ID kanála.",
"HOSTNAME": "NÁZOV SERVERA",
"HTML5 Network Speed Test Server.": "Server na testovanie rýchlosti siete cez HTML5.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.": "Proxy HTTP CONNECT: použite rovnakú IP adresu a port 8118. Tieto adresy sú nastavenia proxy, nie webové odkazy.",
"HTTP service check without a saved URL": "Kontrola služby HTTP bez uloženého URL",
"Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "ha-bridge emuluje API Philips Hue pre brány domácej automatizácie, napríklad Amazon Echo/Dot prvej generácie (druhá má problémy s vyhľadaním ha-bridge), a ďalšie kompatibilné systémy. Spracúva základné príkazy protokolu Hue na zapnutie, vypnutie a jas. Dokáže ovládať väčšinu zariadení s vlastným API.",
"HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake je nástroj s otvoreným zdrojovým kódom vytvorený dobrovoľníkmi na prevod videa z takmer ľubovoľného formátu do moderných, široko podporovaných kodekov.",
@@ -2910,6 +2923,7 @@
"Host write access confirmed.": "Zápis z hosta je potvrdený.",
"Hostname": "Názov servera",
"Hot changes applied. No reboot needed for these paths.": "Zmeny boli použité za behu. Pre tieto cesty nie je potrebný reštart.",
"Hours between claiming runs (0 disables interval runs)": "Počet hodín medzi spusteniami (0 vypne spúšťanie v intervaloch)",
"How do you want to add it?": "Ako ho chcete pridať?",
"How do you want to authenticate this backup target?": "Ako sa chcete prihlasovať k tomuto cieľu záloh?",
"How do you want to select the": "Ako chcete vybrať",
@@ -3641,6 +3655,7 @@
"LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf je nezávislá upravená verzia Firefoxu zameraná na súkromie, bezpečnosť a slobodu používateľa. Odstraňuje telemetriu, zber údajov a rušivé prvky a vypína funkcie obmedzujúce používateľa, napríklad DRM.",
"Librespeed is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers.": "Librespeed je veľmi ľahký Speedtest implementovaný v Javascripte, pomocou XMLHttpRequest a Web Workers.",
"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr je správca hudobnej zbierky pre používateľov Usenetu a BitTorrentu. Sleduje RSS kanály s novými skladbami obľúbených interpretov, získava ich, triedi a premenúva. Dokáže tiež nahradiť už stiahnuté súbory kvalitnejšou verziou, keď sa objaví.",
"Lightweight DNS forwarder and cache.": "Ľahký preposielač a vyrovnávacia pamäť DNS.",
"Lightweight Docker management UI": "Nenáročné rozhranie na správu Dockeru",
"Likely cause: host directory permissions deny the container's mapped UID.": "Pravdepodobná príčina: oprávnenia priečinka na hostovi nepovoľujú namapované UID kontajnera.",
"Limiting size and optimizing journald": "Obmedzujem veľkosť a optimalizujem journald",
@@ -3714,6 +3729,8 @@
"Log2RAM write scheduled every": "Zápis z Log2RAM je naplánovaný každých",
"Log:": "Záznam:",
"Logged-in users": "Prihlásení používatelia",
"Login email used by every store (optional)": "Prihlasovací e-mail pre všetky obchody (voliteľné)",
"Login password used by every store (optional)": "Prihlasovacie heslo pre všetky obchody (voliteľné)",
"Login to {registry} timed out. Saved credentials were not changed.": "Pri prihlasovaní do {registry} uplynul časový limit. Uložené prihlasovacie údaje sa nezmenili.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "Pri odhlasovaní z {registry} uplynul časový limit. Prihlasovacie údaje uložené v súbore sa nezmenili.",
"Logrotate optimization completed": "Optimalizácia logrotate je dokončená",
@@ -3754,8 +3771,11 @@
"MAC address": "Adresa MAC",
"MACHINE TYPE": "TYP STROJA",
"MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME je bezplatný a open-source emulátor určený na napodobnenie hardvéru arkádových hier, herných konzol, starých počítačov a ďalších systémov v softvéri na moderných osobných počítačoch.",
"MDBList lists synced to Radarr and Sonarr.": "Zoznamy MDBList synchronizované s Radarr a Sonarr.",
"MDBListarr": "MDBListarr",
"MOTD configuration updated successfully": "Nastavenie MOTD bolo úspešne aktualizované",
"MOTD configuration was already up to date": "Konfigurácia MOTD už bola aktuálna",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID.": "Stream MPEG-TS: port 6878, cesta /ace/getstream?id= a za ňou ID kanála.",
"MTU SIZE": "VEĽKOSŤ MTU",
"Machine Type": "Typ stroja",
"Machine i440fx": "Stroj i440fx",
@@ -4022,6 +4042,7 @@
"NICs:": "Sieťové karty:",
"NOT FOUND": "NENÁJDENÉ",
"NOTE: The host directory and its contents will remain unchanged.": "POZNÁMKA: priečinok na hostovi ani jeho obsah sa nezmenia.",
"NTP time server for the network.": "Časový server NTP pre sieť.",
"NUT server user for clients such as PeaNUT": "Používateľ servera NUT pre klientov ako PeaNUT",
"NVENC patch detected — list narrowed to versions supported by keylase/nvidia-patch.": "Zistil sa NVENC patch - zoznam je zúžený na verzie podporované cez keylase/nvidia-patch.",
"NVIDIA (CUDA)": "NVIDIA (CUDA)",
@@ -4487,6 +4508,7 @@
"Non-free firmware warnings disabled": "Upozornenia na non-free firmware vypnuté",
"None": "Žiadne",
"Normalizing stable monitor service...": "Upravujem službu Monitora pre stabilnú verziu...",
"Nostr relay.": "Relé Nostr.",
"Not Mounted": "Nepripojené",
"Not a JSON object:": "Nie objekt JSON:",
"Not all platforms support Controller/NVMe passthrough reliably.": "Nie všetky platformy podporujú priame priradenie Controller/NVMe spoľahlivo.",
@@ -4507,6 +4529,7 @@
"Not required (password only)": "Nevyžaduje sa (iba heslo)",
"Not required (token only)": "Nevyžaduje sa (iba token)",
"Not yet verified by ProxMenux (beta)": "Zatiaľ overené ProxMenux (beta)",
"Note-taking with tags, workspaces, attachments and a REST API.": "Poznámky so štítkami, pracovnými priestormi, prílohami a rozhraním REST API.",
"Note: A system reboot will be required after enabling IOMMU.": "Poznámka: po zapnutí IOMMU bude potrebný reštart systému.",
"Note: this only works if the NFS server does NOT use 'all_squash' for root.": "Poznámka: funguje to iba vtedy, ak NFS server NEPOUŽÍVA 'all_squash' pre root.",
"Notes": "Poznámky",
@@ -4592,6 +4615,7 @@
"Only a Docker Swarm uses these settings, so they are not applied:": "Tieto nastavenia používa iba Docker Swarm, preto sa neuplatnia:",
"Only a full sha256 image digest is supported.": "Podporovaný je iba úplný digest obrazu sha256.",
"Only an installed standalone OCI instance can adopt external changes": "Externé zmeny môže prijať iba nainštalovaná samostatná inštancia OCI",
"Only applications configured to use this proxy send their traffic through Tor.": "Cez Tor posielajú prevádzku iba aplikácie nastavené na používanie tohto proxy.",
"Only backed-up Proxmox volumes can be adopted": "Je možné prijať iba zálohované zväzky Proxmox",
"Only convert to privileged if absolutely necessary for your use case.": "Na privilegovaný kontajner prevádzajte iba vtedy, keď je to naozaj potrebné.",
"Only fully free disks are shown (not system-used and not referenced by VM/LXC).": "Zobrazujú sa iba úplne voľné disky (nepoužíva ich systém a nie sú uvedené v nastavení VM/LXC).",
@@ -4780,6 +4804,7 @@
"Password of the admin account": "Heslo účtu správcu",
"Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Heslo zastaraného prihlasovania aplikácie Flowise (používajú iba verzie pred 3.0.1)",
"Password of the main AdGuard Home": "Heslo hlavného AdGuard Home",
"Password of the noVNC browser session": "Heslo relácie prehliadača noVNC",
"Password of the superuser account": "Heslo účtu superužívateľa",
"Password or API token secret:": "Heslo alebo tajná časť API tokenu:",
"Password or secret": "Heslo alebo tajomstvo",
@@ -4911,6 +4936,8 @@
"Power state D3cold/D0 transitions may be inaccessible": "prechody napájacích stavov D3cold/D0 nemusia byť dostupné",
"Powerful OCR powered by DeepSeek AI": "Výkonné rozpoznávanie textu OCR pomocou DeepSeek AI",
"Powerful networking tool": "Silný sieťový nástroj",
"Poznote": "Poznote",
"Poznote administrator": "Správca Poznote",
"Pre-check found": "Predbežná kontrola našla",
"Pre-configure destinations so you don't have to enter them every time you back up.": "Nastavte si ciele vopred, aby ste ich nemuseli zadávať pri každej zálohe.",
"Pre-existing gasket-dkms package removed.": "Existujúci balík gasket-dkms bol odstránený.",
@@ -4963,6 +4990,7 @@
"Previous installation restored": "Predchádzajúca inštalácia obnovená",
"Previous shutdowns": "Predchádzajúce vypnutia",
"Primary GID for Emby": "Primárne GID pre Emby",
"Primary upstream DNS server": "Primárny nadradený server DNS",
"Privacy-first finance app with envelope budgeting and multi-device sync.": "Finančná aplikácia s dôrazom na súkromie, obálkovým rozpočtom a synchronizáciou viacerých zariadení.",
"Privacy-first, self-hosted PDF toolkit": "Súprava nástrojov PDF na vlastnom serveri s dôrazom na súkromie",
"Private installation record saved": "Uložené súkromné záznamy o inštalácii",
@@ -5056,6 +5084,7 @@
"Proxmox VE 8 to 9 Manual Upgrade Guide": "Ručný sprievodca aktualizáciou Proxmox VE 8 na 9",
"Proxmox VE 9.x no-subscription repository created": "Proxmox VE 9.x no-subscription repozitár vytvorený",
"Proxmox VE Helper Scripts": "Pomocné skripty pre Proxmox VE",
"Proxmox VE cannot create a container from this image: it declares a user but does not include /etc/passwd and /etc/group. Nothing was created.": "Proxmox VE nemôže z tohto obrazu vytvoriť kontajner: obraz určuje používateľa, ale neobsahuje /etc/passwd ani /etc/group. Nič sa nevytvorilo.",
"Proxmox VE configuration completed.": "Nastavenie Proxmox VE je dokončené.",
"Proxmox VE safe update completed": "Bezpečná aktualizácia Proxmox VE je dokončená",
"Proxmox auth logger service created and started": "Služba na logovanie Proxmox prihlásení bola vytvorená a spustená",
@@ -5591,6 +5620,7 @@
"SMB port 445:": "SMB port 445:",
"SMB ports:": "SMB porty:",
"SMB, NFS and Time Machine shares from a web panel": "Zdieľania SMB, NFS a Time Machine z webového panela",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.": "Proxy SOCKS5: nastavte aplikáciu s IP adresou LXC zobrazenou vyššie a portom 9050.",
"SR-IOV Configuration Detected": "Zistené nastavenie SR-IOV",
"SSD Emulation": "Emulácia SSD",
"SSH access": "Prístup SSH",
@@ -5706,6 +5736,7 @@
"Search results for:": "Výsledky vyhľadávania pre:",
"Search/Filter Scripts": "Hľadať/filtrovať skripty",
"Searchable document archive with OCR": "Vyhľadávateľný archív dokumentov s OCR",
"Secondary upstream DNS server": "Sekundárny nadradený server DNS",
"Secure Disk Formatter": "Bezpečné formátovanie disku",
"Secure Gateway (Tailscale VPN)": "Secure Gateway (Tailscale VPN)",
"Secure Gateway deployed successfully!": "Secure Gateway úspešne nasadené!",
@@ -5899,6 +5930,7 @@
"Self-hosted ZeroTier network controller with web UI for centralized management.": "Sieťový kontrolér ZeroTier na vlastnom serveri s webovým rozhraním na centrálnu správu.",
"Self-hosted cloud data migration & sync manager": "Správca migrácie a synchronizácie cloudových údajov na vlastnom serveri",
"Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Spoločný správca záložiek na vlastnom serveri na zhromažďovanie, čítanie, komentovanie a úplné uchovávanie dôležitého obsahu na jednom mieste.",
"Self-hosted file management and sharing with multiple storage providers.": "Vlastná správa a zdieľanie súborov s viacerými poskytovateľmi úložiska.",
"Self-hosted file sharing with a modern web interface": "Zdieľanie súborov na vlastnom serveri s moderným webovým rozhraním",
"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 internet archiving solution": "Riešenie na archiváciu internetového obsahu na vlastnom serveri",
@@ -6216,7 +6248,9 @@
"Static IP": "Statické IP",
"Static IPv4 address": "Statická IPv4 adresa",
"Static IPv4 address for": "Statická IPv4 adresa pre",
"Statping": "Statping",
"Status": "Stav",
"Status page and uptime monitoring.": "Stavová stránka a monitorovanie dostupnosti.",
"Status:": "Stav:",
"Steam is the ultimate destination for playing, discussing, and creating games.": "Steam je konečným cieľom pre hranie, diskusie, a vytváranie hier.",
"SteamGridDB": "SteamGridDB",
@@ -6288,6 +6322,7 @@
"Storage:": "Úložisko:",
"Stored Credentials:": "Uložené prihlasovacie údaje:",
"Stored credentials:": "Uložené prihlasovacie údaje:",
"Stores to run, separated by commas (empty runs the default stores)": "Obchody na spustenie oddelené čiarkami (prázdne spustí predvolené obchody)",
"Stremio is a modern media center that gives you the freedom to watch everything you want.": "Stremio je moderné mediálne centrum, ktoré vám dáva slobodu sledovať všetko, čo chcete.",
"Subdomains for the certificate, comma separated (wildcard for *.domain)": "Subdomény pre certifikát oddelené čiarkami (wildcard pre *.domain)",
"Subnet": "Podsieť",
@@ -6352,6 +6387,7 @@
"TCP optimizations configuration completed": "Nastavenie TCP optimalizácií je dokončené",
"TCP optimizations reverted (defaults restored on next reboot)": "TCP optimalizácie boli vrátené späť (predvolené hodnoty sa obnovia pri ďalšom reštarte)",
"TCP port 5201 is reachable (firewall on server)": "TCP port 5201 je dostupný (firewall na serveri)",
"TLS tunnel for a TCP service.": "Tunel TLS pre službu TCP.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "Overenie TLS pre {registry} zlyhalo. Nainštalujte certifikačnú autoritu registra v /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "TPM zariadenie bolo pridané do VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "Výber úložiska pre TPM zlyhal alebo bol zrušený. Vytvorenie VM bolo prerušené.",
@@ -6703,6 +6739,7 @@
"The image requests NVIDIA, but the host has no working NVIDIA driver": "Obraz požaduje NVIDIA, ale hostiteľ nemá funkčný ovládač NVIDIA",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "Obraz požaduje vypnutie časti obmedzení AppArmor alebo seccomp. Pokračujte iba vtedy, ak obrazu dôverujete a riziko prijímate.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "Obraz požaduje vypnutie časti obmedzení AppArmor alebo seccomp. Súbor Compose ponúka ich voliteľné uvoľnenie, ktoré zostane vypnuté, kým ho používateľ nevyberie. Pokračujte iba vtedy, ak obrazu dôverujete a riziko prijímate.",
"The image user is not numeric:": "Používateľ obrazu nie je číselný:",
"The image was not found in its registry, or it is private:": "Obrázok nebol nájdený v jeho registri, alebo je súkromný:",
"The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "Importovaný súbor Compose požaduje privilegovaný režim, oficiálna dokumentácia jlesage/handbrake ho však nevyžaduje. ProxMenux ponechá kontajner LXC neprivilegovaný.",
"The imported OCI groups are not numeric": "Dovezené skupiny OCI nie sú číselné",
@@ -7143,6 +7180,7 @@
"Time is up; Home Assistant OS could not be confirmed as running": "Čas vypršal; Home Assistant OS nebolo možné potvrdiť ako bežiace",
"Time settings configured - Timezone:": "Nastavenie času je dokončené - časové pásmo:",
"Time synchronization reset to UTC": "Synchronizácia času bola resetovaná na UTC",
"Time zone of the fixed daily run times": "Časové pásmo pevných denných časov spustenia",
"Timezone": "Časové pásmo",
"Tip: Also mount the VirtIO ISO for drivers and guest agent installer": "Tip: pripojte aj VirtIO ISO s ovládačmi a inštalátorom guest agenta",
"Tip: You can install the QEMU Guest Agent inside the VM with:": "Tip: QEMU Guest Agent môžete vo VM nainštalovať pomocou:",
@@ -7179,6 +7217,8 @@
"Top memory processes in CT": "Procesy s najväčšou spotrebou pamäte v CT",
"Top-level configs, secrets and other global options are not yet supported": "Položky configs, secrets a ďalšie globálne voľby na najvyššej úrovni zatiaľ nie sú podporované",
"Top-level volume options are not yet supported": "Voľby dátových zväzkov na najvyššej úrovni zatiaľ nie sú podporované",
"Tor SOCKS5 and HTTP proxy.": "Proxy Tor pre SOCKS5 a HTTP.",
"Tor is a proxy, not a website. It has no web interface.": "Tor je proxy, nie webová stránka. Nemá webové rozhranie.",
"Total": "Spolu",
"Total members:": "Počet členov:",
"Total routes": "Počet trás",
@@ -7188,6 +7228,7 @@
"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.": "Transmission je ľahko ovládateľný klient BitTorrent s bohatými funkciami: šifrovaním, webovým rozhraním, výmenou partnerov, magnetickými odkazmi, DHT, µTP, presmerovaním portov cez UPnP a NAT-PMP, webovými zdrojmi, sledovaním adresárov, úpravou trackerov a spoločnými aj samostatnými limitmi rýchlosti torrentov.",
"Tried pvesm path and manual detection methods": "Skúšal sa pvesm path aj ručné hľadanie",
"Trust this certificate and save it for scheduled backups?": "Dôverovať tomuto certifikátu a uložiť ho pre naplánované zálohy?",
"Trusted origins for a hostname or reverse proxy, with scheme and port (optional)": "Dôveryhodné pôvody pre názov hostiteľa alebo reverzný proxy, so schémou a portom (voliteľné)",
"Try Again": "Skúsiť znova",
"Try a different search term.": "Skúste iný výraz.",
"Try accessing": "Skúste otvoriť",
@@ -7448,6 +7489,7 @@
"Upload to PBS is currently: no. Pick an action:": "Nahrávanie do PBS je teraz: nie. Vyberte akciu:",
"Upload to PBS is currently: yes. Pick an action:": "Nahrávanie do PBS je teraz: áno. Vyberte akciu:",
"Upload to PBS: enable, disable or rotate the recovery passphrase": "Nahrávanie do PBS: zapnúť, vypnúť alebo zmeniť obnovovaciu frázu",
"Upstream NTP servers": "Nadradené servery NTP",
"Uptime and who is logged in": "Doba behu systému a prihlásení používatelia",
"Usage:": "Použitie:",
"Use \"Check test progress\" to see results.": "Výsledky zobrazíte cez možnosť \"Skontrolovať priebeh testu\".",
@@ -7720,6 +7762,7 @@
"Warning: Limited PCI Reset Support": "Upozornenie: obmedzená podpora PCI resetu",
"Warning: both VMs have autostart enabled (onboot=1).": "Upozornenie: obe VM majú zapnutý autostart (onboot=1).",
"Warnings": "Upozornenia",
"Watch history, ratings and watchlists synced between media servers and trackers.": "História sledovania, hodnotenia a zoznamy sledovaných synchronizované medzi mediálnymi servermi a trackermi.",
"Watchdog": "Watchdog",
"Watchdog (off): restart the application when it crashes": "Watchdog (vypnutý): reštartovať aplikáciu, keď zlyhá",
"Watchdog (on): restart the application when it crashes": "Watchdog (zapnutý): reštartovať aplikáciu, keď zlyhá",
@@ -8193,6 +8236,8 @@
"no passphrase": "bez frázy",
"no password": "bez hesla",
"no-subscription repository": "repozitár no-subscription",
"noVNC browser session": "Relácia prehliadača noVNC",
"noVNC browser session (password only)": "Relácia prehliadača noVNC (iba heslo)",
"no_root_squash": "no_root_squash",
"non-ProxMenux .tar archive(s) in this path": "non-ProxMenux .tar archívy v tejto ceste",
"none": "žiadne",
+45
View File
@@ -209,6 +209,8 @@
"Access token of the connector, from the Twingate admin console": "Åtkomsttoken för kontakten, från Twingate-administratörskonsolen",
"Account is not locked": "Kontot är inte låst",
"Account token from the settings of https://app.foldingathome.org": "Kontotoken från inställningarna för https://app.foldingathome.org",
"AceStream HTTP Proxy has no web interface: a media player opens its streams.": "AceStream HTTP Proxy har inget webbgränssnitt: dess strömmar öppnas med en mediaspelare.",
"AceStream engine with its HTTP API for media players.": "AceStream-motor med sitt HTTP-API för mediaspelare.",
"Action cancelled due to previous xshok-proxmox modifications.": "Åtgärden avbröts på grund av tidigare xshok-proxmox-modifieringar.",
"Action:": "Åtgärd:",
"Activate Monitor": "Aktivera Monitor",
@@ -306,6 +308,7 @@
"Address of the PostgreSQL server": "Adress till PostgreSQL-servern",
"Address of the Redis or Valkey server": "Adress till Redis- eller Valkey-servern",
"Address of the database server (mysql and pgsql only)": "Adress till databasservern (endast mysql och pgsql)",
"Address of the noVNC session in the links of the notifications (for example 192.168.1.50)": "Adress till noVNC-sessionen i länkarna i aviseringarna (till exempel 192.168.1.50)",
"Address of the oci-compose file": "Adressen till oci-compose-filen",
"Address to reach Pydio Cells (https://domain or https://IP:8080)": "Adress för att nå Pydio Cells (https://domain eller https://IP:8080)",
"Address used to reach wallabag (http://IP or https://wallabag.example.com)": "Adress som används för att nå wallabag (http://IP eller https://wallabag.example.com)",
@@ -379,6 +382,7 @@
"Allocated RAM:": "Tilldelat RAM:",
"Allocating virtual disk for %s...": "Allokerar virtuell disk för %s...",
"Allow TCP port {port} from {subnet} through the host firewall? Existing firewall rules are not changed.": "Vill du tillåta TCP-port {port} från {subnet} genom värdbrandväggen? Befintliga brandväggsregler ändras inte.",
"Allowed hostnames for a hostname or reverse proxy (optional)": "Tillåtna värdnamn för ett värdnamn eller en omvänd proxy (valfritt)",
"Allowed hosts (comma separated; * allows access through the assigned IP)": "Tillåtna värdar (komma separerade; * tillåter åtkomst via den tilldelade IP)",
"Allowed source subnet:": "Tillåtet källundernät:",
"Allowed web port:": "Tillåten webbport:",
@@ -766,6 +770,7 @@
"Cannot inspect existing ZRAM configurations": "Kan inte inspektera befintliga ZRAM-konfigurationer",
"Cannot inspect existing ZRAM generator configuration": "Kan inte inspektera befintlig ZRAM-generatorkonfiguration",
"Cannot load backup library: lib_host_backup_common.sh": "Det går inte att ladda säkerhetskopia-biblioteket: lib_host_backup_common.sh",
"Cannot prepare the OCI archive:": "Kan inte förbereda OCI-arkivet:",
"Cannot proceed with invalid export path.": "Kan inte fortsätta med ogiltig exportsökväg.",
"Cannot proceed with invalid share name.": "Kan inte fortsätta med ogiltigt delningsnamn.",
"Cannot reach Proxmox repositories": "Kan inte nå Proxmox-förråd",
@@ -963,6 +968,7 @@
"Chrome is the official web browser from Google, built to be fast, secure, and customizable.": "Chrome är den officiella webbläsaren från Google, byggd för att vara snabb, säker och anpassningsbar.",
"Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.": "Chromium är ett open-source webbläsarprojekt som syftar till att bygga ett säkrare, snabbare och mer stabilt sätt för alla användare att uppleva webben.",
"Circular dependency:": "Cirkulärt beroende:",
"Claims the free games of Steam, Epic, Prime Gaming, GOG and more.": "Hämtar gratisspelen från Steam, Epic, Prime Gaming, GOG med flera.",
"Clean disk metadata": "Rensa diskmetadata",
"Cleaned up": "Rensat",
"Cleaning cached files...": "Rensar cachade filer...",
@@ -986,6 +992,7 @@
"Clearing login credentials...": "Rensar inloggningsuppgifter...",
"Client (run a bandwidth test to a server)": "Klient (kör ett bandbreddstest till en server)",
"Client determines best version to use": "Klienten bestämmer den bästa versionen att använda",
"Client networks permitted to query NTP (comma-separated CIDRs)": "Klientnätverk som får fråga NTP (CIDR separerade med kommatecken)",
"Clients reach the VPN through the public address and the UDP port given during the installation, so that port must be forwarded to this container.": "Kunderna når VPN via den offentliga adressen och UDP-porten som ges under installationen, så att porten måste vidarebefordras till denna behållare.",
"Cloning Coral driver repository (feranick fork)...": "Cloning Coral drivrutinförråd (feranick gaffel)...",
"Cloning Lynis from GitHub...": "Klonar Lynis från GitHub...",
@@ -994,6 +1001,7 @@
"Cloud Database Manager.": "Cloud Database Manager.",
"Cloud storage synchronization and FUSE mounts": "Cloud storage synkronisering och FUSE monteringar",
"Cloud-Init Automated Installers": "Cloud-Init automatiserade installationsprogram",
"Cloudreve": "Cloudreve",
"Cluster certificates updated": "Klustercertifikat uppdaterade",
"Cluster configuration (advanced)": "Klusterkonfiguration (avancerat)",
"Cluster data will be applied automatically at next boot.": "Klusterdata kommer att tillämpas automatiskt vid nästa uppstart.",
@@ -1574,6 +1582,7 @@
"Cross-platform file sharing made easy.": "Cross-platform fildelning gjorde lätt.",
"Cross-platform monitoring tool.": "Cross-platform övervakningsverktyg.",
"Cross-version detected — safe restore mode": "Korsversion upptäckt – säkert återställningsläge",
"CrossWatch": "CrossWatch",
"Current": "Nuvarande",
"Current CIFS mounts:": "Aktuella CIFS-fästen:",
"Current Configuration": "Aktuell konfiguration",
@@ -1737,9 +1746,11 @@
"Desktop UI backup created": "Säkerhetskopiering av skrivbordsgränssnittet har skapats",
"Desktop and Mobile UI patched": "Stationära och mobila användargränssnitt har korrigerats",
"Destination Directory": "Destinationskatalog",
"Destination TCP port for the TLS tunnel": "TCP-målport för TLS-tunneln",
"Destination directory does not exist:": "Destinationskatalogen finns inte:",
"Destination directory is not writable:": "Destinationskatalogen är inte skrivbar:",
"Destination path for the copy (typically outside ProxMenux state):": "Destinationssökväg för kopian (vanligtvis utanför ProxMenux-tillståndet):",
"Destination server address for the TLS tunnel": "Adress till målservern för TLS-tunneln",
"Destination:": "Destination:",
"Destroy a ZFS dataset (irreversible)": "Förstör en ZFS-datauppsättning (irreversibel)",
"Destructive rollback": "Destruktiv rollback",
@@ -2776,8 +2787,10 @@
"HAOS One is a community image that runs Docker inside the container. The LXC stays unprivileged, but the inner AppArmor profiles may not be available. The first start downloads Home Assistant Core and its add-ons. If the check fails, the CT and /mnt/data are kept for diagnosis.": "HAOS One är en gemenskapsbild som kör Docker inuti behållaren. LXC är oprivilegierad, men de inre AppArmor-profilerna kanske inte är tillgängliga. Den första starten hämtar Home Assistant Core och dess tillägg. Om kontrollen misslyckas, CT och /mnt / data hålls för diagnos.",
"HAOS One profile declined": "HAOS One-profilen minskade",
"HAOS One requires an unprivileged unmanaged LXC with nesting and keyctl, 2 cores, 2048 MB RAM, rootfs of at least 12 GB and /mnt/data of at least 16 GB on a container volume included in backups": "HAOS One requires en oprivilegierad ohanterad LXC med häckning och keyctl, 2 kärnor, 2048 MB RAM, rötter på minst 12 GB och /mnt / data på minst 16 GB på en behållarvolym som ingår i backups",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.": "HLS-ström: port 6878, sökväg /ace/manifest.m3u8?id= följt av kanal-ID:t.",
"HOSTNAME": "VÄRDNAMN",
"HTML5 Network Speed Test Server.": "HTML5 Network Speed Test Server.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.": "HTTP CONNECT-proxy: använd samma IP-adress och port 8118. Dessa adresser är proxyinställningar, inte webblänkar.",
"HTTP service check without a saved URL": "HTTP service check utan sparad URL",
"Habridge emulates Philips Hue API to other home automation gateways such as an Amazon Echo/Dot Gen 1 (gen 2 has issues discovering ha-bridge) or other systems that support Philips Hue. The Bridge handles basic commands such as On, Off and brightness commands of the hue protocol. This bridge can control most devices that have a distinct API.": "Habridge emulerar Philips Hue API till andra hemautomatiseringsgateways som Amazon Echo / Dot Gen 1 (gen 2 har problem med att upptäcka ha-bro) eller andra system som stöder Philips Hue. Bron hanterar grundläggande kommandon som On, Off och ljusstyrka kommandon av nyansprotokollet. Denna bro kan styra de flesta enheter som har ett tydligt API.",
"HandBrake is an open-source tool, built by volunteers, for converting video from nearly any format to a selection of modern, widely supported codecs.": "HandBrake är ett open-source verktyg, byggt av volontärer, för att konvertera video från nästan alla format till ett urval av moderna, allmänt stödda codecs.",
@@ -2910,6 +2923,7 @@
"Host write access confirmed.": "Värd skrivåtkomst bekräftad.",
"Hostname": "Värdnamn",
"Hot changes applied. No reboot needed for these paths.": "Heta ändringar tillämpas. Ingen omstart behövs för dessa vägar.",
"Hours between claiming runs (0 disables interval runs)": "Timmar mellan körningarna (0 stänger av körningar med intervall)",
"How do you want to add it?": "Hur vill du lägga till det?",
"How do you want to authenticate this backup target?": "Hur vill du autentisera detta mål för säkerhetskopiering?",
"How do you want to select the": "Hur vill du välja",
@@ -3641,6 +3655,7 @@
"LibreWolf is a custom and independent version of Firefox, with the primary goals of privacy, security and user freedom. LibreWolf also aims to remove all the telemetry, data collection and annoyances, as well as disabling anti-freedom features like DRM.": "LibreWolf är en anpassad och oberoende version av Firefox, med de primära målen för integritet, säkerhet och användarfrihet. LibreWolf syftar också till att ta bort alla telemetri, datainsamling och irritationer, samt inaktivera anti-frihet funktioner som DRM.",
"Librespeed is a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers.": "Librespeed är en mycket lätt Speedtest implementerad i Javascript, med XMLHttpRequest och Web Workers.",
"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.": "Lidarr är en musiksamlingschef för Usenet och BitTorrent-användare. Det kan övervaka flera RSS-flöden för nya spår från dina favoritartister och kommer att ta tag i, sortera och byta namn på dem. Det kan också konfigureras för att automatiskt uppgradera kvaliteten på filer som redan laddats ner när ett bättre kvalitetsformat blir tillgängligt.",
"Lightweight DNS forwarder and cache.": "Lätt DNS-vidarebefordrare och cache.",
"Lightweight Docker management UI": "Lätt Docker ledning UI",
"Likely cause: host directory permissions deny the container's mapped UID.": "Trolig orsak: värdkatalogbehörigheter nekar behållarens mappade UID.",
"Limiting size and optimizing journald": "Begränsning av storlek och optimering av journal",
@@ -3714,6 +3729,8 @@
"Log2RAM write scheduled every": "Log2RAM-skrivning schemalagt varje",
"Log:": "Logga:",
"Logged-in users": "Inloggade användare",
"Login email used by every store (optional)": "Inloggnings-e-post för alla butiker (valfritt)",
"Login password used by every store (optional)": "Inloggningslösenord för alla butiker (valfritt)",
"Login to {registry} timed out. Saved credentials were not changed.": "Inloggningen till {registry} tog timeout. Sparade autentiseringsuppgifter ändrades inte.",
"Logout from {registry} timed out. Saved file credentials were not changed.": "Logga ut från {registry} tog timeout. Sparade filuppgifter ändrades inte.",
"Logrotate optimization completed": "Logrotate-optimering slutförd",
@@ -3754,8 +3771,11 @@
"MAC address": "MAC-adress",
"MACHINE TYPE": "MASKINTYP",
"MAME is a free and open-source emulator designed to emulate the hardware of arcade games, video game consoles, old computers and other systems in software on modern personal computers.": "MAME är en fri och öppen källkod emulator utformad för att efterlikna hårdvaran av arkadspel, videospel konsoler, gamla datorer och andra system i programvara på moderna datorer.",
"MDBList lists synced to Radarr and Sonarr.": "MDBList-listor synkade med Radarr och Sonarr.",
"MDBListarr": "MDBListarr",
"MOTD configuration updated successfully": "MOTD-konfigurationen har uppdaterats",
"MOTD configuration was already up to date": "MOTD-konfigurationen var redan uppdaterad",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID.": "MPEG-TS-ström: port 6878, sökväg /ace/getstream?id= följt av kanal-ID:t.",
"MTU SIZE": "MTU-STORLEK",
"Machine Type": "Maskintyp",
"Machine i440fx": "Maskin i440fx",
@@ -4022,6 +4042,7 @@
"NICs:": "NIC:er:",
"NOT FOUND": "HITTADE INTE",
"NOTE: The host directory and its contents will remain unchanged.": "OBS: Värdkatalogen och dess innehåll förblir oförändrade.",
"NTP time server for the network.": "NTP-tidsserver för nätverket.",
"NUT server user for clients such as PeaNUT": "NUT server användare för klienter som PeaNUT",
"NVENC patch detected — list narrowed to versions supported by keylase/nvidia-patch.": "NVENC-patch upptäckt — listan minskad till versioner som stöds av keylase/nvidia-patch.",
"NVIDIA (CUDA)": "NVIDIA (CUDA)",
@@ -4487,6 +4508,7 @@
"Non-free firmware warnings disabled": "Varningar för icke-fri firmware inaktiverade",
"None": "Ingen",
"Normalizing stable monitor service...": "Normaliserar stabil monitortjänst...",
"Nostr relay.": "Nostr-relä.",
"Not Mounted": "Ej monterad",
"Not a JSON object:": "Inte ett JSON-objekt:",
"Not all platforms support Controller/NVMe passthrough reliably.": "Alla plattformar stöder inte styrenhets-/NVMe-passthrough på ett tillförlitligt sätt.",
@@ -4507,6 +4529,7 @@
"Not required (password only)": "Inte required (endast lösenord)",
"Not required (token only)": "Inte required (token only)",
"Not yet verified by ProxMenux (beta)": "Ännu inte verifierad av ProxMenux (beta)",
"Note-taking with tags, workspaces, attachments and a REST API.": "Anteckningar med taggar, arbetsytor, bilagor och ett REST-API.",
"Note: A system reboot will be required after enabling IOMMU.": "Obs: En omstart av systemet kommer att krävas efter att IOMMU har aktiverats.",
"Note: this only works if the NFS server does NOT use 'all_squash' for root.": "Notera: detta fungerar bara om NFS-servern INTE använder 'all_squash' för root.",
"Notes": "Anteckningar",
@@ -4590,6 +4613,7 @@
"Only a Docker Swarm uses these settings, so they are not applied:": "Endast en Docker Swarm använder dessa inställningar, så de tillämpas inte:",
"Only a full sha256 image digest is supported.": "Endast en fullständig sha256-bildsammandragning stöds.",
"Only an installed standalone OCI instance can adopt external changes": "Endast en installerad fristående OCI-instans kan anta externa ändringar",
"Only applications configured to use this proxy send their traffic through Tor.": "Endast program som är inställda att använda denna proxy skickar sin trafik genom Tor.",
"Only backed-up Proxmox volumes can be adopted": "Endast säkerhetskopierade Proxmox-volymer kan användas",
"Only convert to privileged if absolutely necessary for your use case.": "Konvertera endast till privilegierad om det är absolut nödvändigt för ditt användningsfall.",
"Only fully free disks are shown (not system-used and not referenced by VM/LXC).": "Endast helt lediga diskar visas (inte systemanvända och inte refererade av VM/LXC).",
@@ -4778,6 +4802,7 @@
"Password of the admin account": "Lösenordet för administratörskontot",
"Password of the deprecated Flowise application login (only read by Flowise versions before 3.0.1)": "Lösenordet för inloggningen Flowise (läs endast av Flowise-versioner före 3.0.1)",
"Password of the main AdGuard Home": "Lösenordet för AdGuard Home",
"Password of the noVNC browser session": "Lösenord för noVNC-webbläsarsessionen",
"Password of the superuser account": "Lösenordet för superanvändarkontot",
"Password or API token secret:": "Lösenord eller API-token hemlighet:",
"Password or secret": "Lösenord eller hemlighet",
@@ -4909,6 +4934,8 @@
"Power state D3cold/D0 transitions may be inaccessible": "Strömtillstånd D3cold/D0-övergångar kan vara otillgängliga",
"Powerful OCR powered by DeepSeek AI": "Kraftfull OCR drivs av DeepSeek AI",
"Powerful networking tool": "Kraftfullt nätverksverktyg",
"Poznote": "Poznote",
"Poznote administrator": "Poznote-administratör",
"Pre-check found": "Förhandskontroll hittades",
"Pre-configure destinations so you don't have to enter them every time you back up.": "Förkonfigurera destinationer så att du inte behöver ange dem varje gång du säkerhetskopierar.",
"Pre-existing gasket-dkms package removed.": "Det befintliga gasket-dkms-paketet har tagits bort.",
@@ -4961,6 +4988,7 @@
"Previous installation restored": "Föregående installation restaurerad",
"Previous shutdowns": "Tidigare avstängningar",
"Primary GID for Emby": "Primärt GID för Emby",
"Primary upstream DNS server": "Primär uppströms DNS-server",
"Privacy-first finance app with envelope budgeting and multi-device sync.": "Privacy-first finans app med kuvert budgeting och multi-device sync.",
"Privacy-first, self-hosted PDF toolkit": "Privacy-first, självhäftad PDF-verktyg",
"Private installation record saved": "Privat installationsrekord sparad",
@@ -5054,6 +5082,7 @@
"Proxmox VE 8 to 9 Manual Upgrade Guide": "Proxmox VE 8 till 9 Manuell uppgraderingsguide",
"Proxmox VE 9.x no-subscription repository created": "Proxmox VE 9.x arkiv utan prenumeration skapat",
"Proxmox VE Helper Scripts": "Proxmox VE Helper Scripts",
"Proxmox VE cannot create a container from this image: it declares a user but does not include /etc/passwd and /etc/group. Nothing was created.": "Proxmox VE kan inte skapa en behållare från den här avbildningen: den anger en användare men innehåller varken /etc/passwd eller /etc/group. Inget skapades.",
"Proxmox VE configuration completed.": "Proxmox VE-konfigurationen slutförd.",
"Proxmox VE safe update completed": "Proxmox VE säker uppdatering slutförd",
"Proxmox auth logger service created and started": "Proxmox authlogger-tjänst skapad och startade",
@@ -5589,6 +5618,7 @@
"SMB port 445:": "SMB-port 445:",
"SMB ports:": "SMB-portar:",
"SMB, NFS and Time Machine shares from a web panel": "SMB, NFS och Time Machine delar från en webbpanel",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.": "SOCKS5-proxy: ställ in ditt program med LXC:ns IP-adress som visas ovan och port 9050.",
"SR-IOV Configuration Detected": "SR-IOV-konfiguration upptäckt",
"SSD Emulation": "SSD-emulering",
"SSH access": "SSH tillgång",
@@ -5704,6 +5734,7 @@
"Search results for:": "Sökresultat för:",
"Search/Filter Scripts": "Sök/filtrera skript",
"Searchable document archive with OCR": "Sökbart dokumentarkiv med OCR",
"Secondary upstream DNS server": "Sekundär uppströms DNS-server",
"Secure Disk Formatter": "Säker diskformaterare",
"Secure Gateway (Tailscale VPN)": "Secure Gateway (Tailscale VPN)",
"Secure Gateway deployed successfully!": "Secure Gateway har implementerats framgångsrikt!",
@@ -5897,6 +5928,7 @@
"Self-hosted ZeroTier network controller with web UI for centralized management.": "Self-hosted ZeroTier nätverkskontroller med webb-UI för centraliserad förvaltning.",
"Self-hosted cloud data migration & sync manager": "Self-hosted molndatamigrerings- och synkroniseringshanterare",
"Self-hosted collaborative bookmark manager to collect, read, annotate, and fully preserve what matters, all in one place.": "Self-hosted collaborative bookmark manager för att samla, läsa, notera och helt bevara vad som är viktigt, allt på ett ställe.",
"Self-hosted file management and sharing with multiple storage providers.": "Egenhostad filhantering och fildelning med flera lagringsleverantörer.",
"Self-hosted file sharing with a modern web interface": "Självhäftad fildelning med ett modernt webbgränssnitt",
"Self-hosted file toolkit for images, video, audio, PDFs, and files": "Självvärd filverktyg för bilder, video, ljud, PDF-filer och filer",
"Self-hosted internet archiving solution": "Självhäftad internetarkiveringslösning",
@@ -6214,7 +6246,9 @@
"Static IP": "Statisk IP",
"Static IPv4 address": "Statisk IPv4-adress",
"Static IPv4 address for": "Statisk IPv4-adress för",
"Statping": "Statping",
"Status": "Status",
"Status page and uptime monitoring.": "Statussida och övervakning av drifttid.",
"Status:": "Status:",
"Steam is the ultimate destination for playing, discussing, and creating games.": "Steam är den ultimata destinationen för att spela, diskutera och skapa spel.",
"SteamGridDB": "SteamGridDB",
@@ -6286,6 +6320,7 @@
"Storage:": "Lagring:",
"Stored Credentials:": "Lagrade inloggningsuppgifter:",
"Stored credentials:": "Lagrade autentiseringsuppgifter:",
"Stores to run, separated by commas (empty runs the default stores)": "Butiker att köra, separerade med kommatecken (tomt kör standardbutikerna)",
"Stremio is a modern media center that gives you the freedom to watch everything you want.": "Stremio är ett modernt mediacenter som ger dig friheten att titta på allt du vill ha.",
"Subdomains for the certificate, comma separated (wildcard for *.domain)": "Underdomäner för certifikatet, komma separerade (wildcard för *.domain)",
"Subnet": "Subnät",
@@ -6350,6 +6385,7 @@
"TCP optimizations configuration completed": "TCP-optimeringskonfigurationen är klar",
"TCP optimizations reverted (defaults restored on next reboot)": "TCP-optimeringar har återställts (standarderna återställs vid nästa omstart)",
"TCP port 5201 is reachable (firewall on server)": "TCP-port 5201 är nåbar (brandvägg på servern)",
"TLS tunnel for a TCP service.": "TLS-tunnel för en TCP-tjänst.",
"TLS verification failed for {registry}. Install the registry CA in /etc/containers/certs.d/{registry}/ca.crt.": "TLS-verifiering misslyckades för {registry}. Installera registret CA i /etc/containers/certs.d/{registry}/ca.crt.",
"TPM device added to VM": "TPM-enhet har lagts till VM",
"TPM storage selection failed or was cancelled. VM creation aborted.": "Val av TPM-lagring misslyckades eller avbröts. VM-skapandet avbröts.",
@@ -6702,6 +6738,7 @@
"The image requests NVIDIA, but the host has no working NVIDIA driver": "Bilden begär NVIDIA, men värden har ingen fungerande NVIDIA-förare",
"The image requests disabling part of the AppArmor or seccomp confinement. Continue only if you trust the image and accept this risk.": "Bilden begär inaktivering av en del av AppArmor eller seccomp confinement. Fortsätt bara om du litar på bilden och accepterar denna risk.",
"The image requests disabling part of the AppArmor or seccomp confinement. The Compose offers an optional AppArmor or seccomp relaxation; it will stay disabled unless the user selects it. Continue only if you trust the image and accept this risk.": "Bilden begär inaktivering av en del av AppArmor eller seccomp confinement. Komponera erbjuder en valfri AppArmor eller seccomp avslappning; det kommer att vara inaktiverat om inte användaren väljer det. Fortsätt bara om du litar på bilden och accepterar denna risk.",
"The image user is not numeric:": "Avbildningens användare är inte numerisk:",
"The image was not found in its registry, or it is private:": "Bilden hittades inte i dess register, eller det är privat:",
"The imported Compose requests privileged, but the official jlesage/handbrake documentation does not require it; ProxMenux keeps the LXC unprivileged.": "Den importerade Komponera förfrågningar privilegierade, men den officiella jlesage / handbrake dokumentation inte require det; ProxMenux håller LXC oprivilegierad.",
"The imported OCI groups are not numeric": "De importerade OCI-grupperna är inte numeriska",
@@ -7142,6 +7179,7 @@
"Time is up; Home Assistant OS could not be confirmed as running": "Tid är upp; Home Assistant OS kunde inte bekräftas som körning",
"Time settings configured - Timezone:": "Tidsinställningar konfigurerade - Tidszon:",
"Time synchronization reset to UTC": "Tidssynkronisering återställd till UTC",
"Time zone of the fixed daily run times": "Tidszon för de fasta dagliga körtiderna",
"Timezone": "Timezone",
"Tip: Also mount the VirtIO ISO for drivers and guest agent installer": "Tips: Montera även VirtIO ISO för drivrutiner och gästagentinstallatör",
"Tip: You can install the QEMU Guest Agent inside the VM with:": "Tips: Du kan installera QEMU Guest Agent inuti den virtuella datorn med:",
@@ -7178,6 +7216,8 @@
"Top memory processes in CT": "Topp minnesprocesser i CT",
"Top-level configs, secrets and other global options are not yet supported": "Toppnivåkonfigs, hemligheter och andra globala alternativ stöds ännu inte",
"Top-level volume options are not yet supported": "Toppnivå volymalternativ stöds ännu inte",
"Tor SOCKS5 and HTTP proxy.": "Tor-proxy för SOCKS5 och HTTP.",
"Tor is a proxy, not a website. It has no web interface.": "Tor är en proxy, inte en webbplats. Den har inget webbgränssnitt.",
"Total": "Total",
"Total members:": "Totalt antal medlemmar:",
"Total routes": "Totalt antal rutter",
@@ -7187,6 +7227,7 @@
"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.": "Transmission är utformad för enkel, kraftfull användning. Transmission har de funktioner du vill ha från en BitTorrent-klient: kryptering, ett webbgränssnitt, peer-utbyte, magnetlänkar, DHT, μTP, UPnP och NAT-PMP-port vidarebefordran, webseed support, watch kataloger, tracker redigering, globala och per-torrent hastighet gränser, och mer.",
"Tried pvesm path and manual detection methods": "Har provat pvesm path och metoder för manuell identifiering",
"Trust this certificate and save it for scheduled backups?": "Lita på det här certifikatet och spara det för schemalagda säkerhetskopieringar?",
"Trusted origins for a hostname or reverse proxy, with scheme and port (optional)": "Betrodda ursprung för ett värdnamn eller en omvänd proxy, med schema och port (valfritt)",
"Try Again": "Försök igen",
"Try a different search term.": "Prova en annan sökterm.",
"Try accessing": "Försök komma åt",
@@ -7447,6 +7488,7 @@
"Upload to PBS is currently: no. Pick an action:": "Uppladdning till PBS är för närvarande: nej. Välj en åtgärd:",
"Upload to PBS is currently: yes. Pick an action:": "Uppladdning till PBS är för närvarande: ja. Välj en åtgärd:",
"Upload to PBS: enable, disable or rotate the recovery passphrase": "Ladda upp till PBS: aktivera, inaktivera eller rotera återställningslösenordet",
"Upstream NTP servers": "Uppströms NTP-servrar",
"Uptime and who is logged in": "Upptid och vem som är inloggad",
"Usage:": "Användning:",
"Use \"Check test progress\" to see results.": "Använd \"Kontrollera testförlopp\" för att se resultat.",
@@ -7719,6 +7761,7 @@
"Warning: Limited PCI Reset Support": "Varning: Begränsat stöd för PCI-återställning",
"Warning: both VMs have autostart enabled (onboot=1).": "Varning: båda virtuella datorerna har autostart aktiverad (onboot=1).",
"Warnings": "Varningar",
"Watch history, ratings and watchlists synced between media servers and trackers.": "Visningshistorik, betyg och bevakningslistor synkade mellan mediaservrar och spårare.",
"Watchdog": "Watchdog",
"Watchdog (off): restart the application when it crashes": "Watchdog (av): starta om applikationen när den kraschar",
"Watchdog (on): restart the application when it crashes": "Watchdog (på): starta om applikationen när den kraschar",
@@ -8192,6 +8235,8 @@
"no passphrase": "ingen lösenfras",
"no password": "inget lösenord",
"no-subscription repository": "arkiv utan prenumeration",
"noVNC browser session": "noVNC-webbläsarsession",
"noVNC browser session (password only)": "noVNC-webbläsarsession (endast lösenord)",
"no_root_squash": "no_root_squash",
"non-ProxMenux .tar archive(s) in this path": "icke-ProxMenux .tar-arkiv(er) i den här sökvägen",
"none": "ingen",
+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. -->
43 of 335 applications in the OCI catalog have been tested for real: 41 in the ProxMenux lab and 2 by the community. The OCI installer shows them as verified, with a ✓ in the lists.
43 of 347 applications in the OCI catalog have been tested for real: 41 in the ProxMenux lab and 2 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.
+391
View File
@@ -0,0 +1,391 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-acestream-http-proxy",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "AceStream HTTP Proxy"
},
"tagline": {
"en_US": "AceStream engine with its HTTP API for media players."
},
"description": {
"en_US": "Runs the AceStream engine and serves its streams over HTTP as HLS or MPEG-TS, for players such as VLC."
},
"category": "media",
"category_label": "Media & Streaming",
"author": "martinbjeldbak",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ace-stream.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/martinbjeldbak/acestream-http-proxy",
"documentation": "https://github.com/martinbjeldbak/acestream-http-proxy",
"repository": "https://github.com/martinbjeldbak/acestream-http-proxy",
"tips": [],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "martinbjeldbak",
"repository": "https://github.com/martinbjeldbak/acestream-http-proxy",
"revision": "34b406ffdd80609f18b55c1d8a8140c0fb8ec8bf80f9808e998f71b6d0edf8fc",
"image_repository_url": "https://ghcr.io/martinbjeldbak/acestream-http-proxy",
"readme_pushed_at": "",
"compose_sha256": "34b406ffdd80609f18b55c1d8a8140c0fb8ec8bf80f9808e998f71b6d0edf8fc",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "acestream-http-proxy",
"container_name": "acestream-http-proxy",
"image": {
"reference": "ghcr.io/martinbjeldbak/acestream-http-proxy:latest",
"registry": "ghcr.io",
"repository": "ghcr.io/martinbjeldbak/acestream-http-proxy",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "ALLOW_REMOTE_ACCESS",
"example": "yes",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
}
],
"volumes": [],
"ports": [
{
"container_port": 6878,
"published_example": 6878,
"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: acestream-http-proxy\nservices:\n acestream-http-proxy:\n environment:\n ALLOW_REMOTE_ACCESS: 'yes'\n image: ghcr.io/martinbjeldbak/acestream-http-proxy:latest\n ports:\n - 6878:6878\n"
},
"compose_stack": {
"project_name": "acestream-http-proxy",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "acestream-http-proxy",
"service_count": 1,
"services": [
{
"name": "acestream-http-proxy",
"image": "ghcr.io/martinbjeldbak/acestream-http-proxy:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"ALLOW_REMOTE_ACCESS": "yes"
},
"image": "ghcr.io/martinbjeldbak/acestream-http-proxy:latest",
"ports": [
"6878:6878"
]
}
}
],
"top_level": {
"name": "acestream-http-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": [],
"orchestration": {
"reserve_vmids_atomically": 1,
"start_order": [
"acestream-http-proxy"
],
"stop_order": [
"acestream-http-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": []
}
},
"first_run": {
"endpoints": [],
"credentials": []
},
"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": {
"completion_notes": [
"AceStream HTTP Proxy has no web interface: a media player opens its streams.",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID."
]
}
},
"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",
"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
}
}
+406
View File
@@ -0,0 +1,406 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-chrony",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Chrony"
},
"tagline": {
"en_US": "NTP time server for the network."
},
"description": {
"en_US": "Serves NTP time to the network from upstream servers, without adjusting the clock of the Proxmox host."
},
"category": "network",
"category_label": "Network & Firewall",
"author": "dockurr",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/chrony",
"documentation": "https://github.com/dockur/chrony",
"repository": "https://github.com/dockur/chrony",
"tips": [
"Serves NTP without adjusting the Proxmox host clock: ENABLE_SYSCLK=false uses chronyd -x."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/chrony",
"revision": "0da30e1fd2d601c17a7c5f04684c6f9ec28838cda9ea7a2d33313e839a41d707",
"image_repository_url": "https://hub.docker.com/r/dockurr/chrony",
"readme_pushed_at": "",
"compose_sha256": "0da30e1fd2d601c17a7c5f04684c6f9ec28838cda9ea7a2d33313e839a41d707",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "chrony",
"container_name": "chrony",
"image": {
"reference": "dockurr/chrony:latest",
"registry": "docker.io",
"repository": "dockurr/chrony",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "NTP_SERVERS",
"example": "pool.ntp.org",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Upstream NTP servers"
},
{
"name": "ENABLE_SYSCLK",
"example": "false",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
},
{
"name": "ALLOW",
"example": "",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Client networks permitted to query NTP (comma-separated CIDRs)"
}
],
"volumes": [],
"ports": [
{
"container_port": 123,
"published_example": 123,
"protocol": "udp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: chrony\nservices:\n chrony:\n environment:\n ALLOW: ''\n ENABLE_SYSCLK: 'false'\n NTP_SERVERS: pool.ntp.org\n image: dockurr/chrony:latest\n ports:\n - 123:123/udp\n"
},
"compose_stack": {
"project_name": "chrony",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "chrony",
"service_count": 1,
"services": [
{
"name": "chrony",
"image": "dockurr/chrony:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"ALLOW": "",
"ENABLE_SYSCLK": "false",
"NTP_SERVERS": "pool.ntp.org"
},
"image": "dockurr/chrony:latest",
"ports": [
"123:123/udp"
]
}
}
],
"top_level": {
"name": "chrony"
},
"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": [],
"orchestration": {
"reserve_vmids_atomically": 1,
"start_order": [
"chrony"
],
"stop_order": [
"chrony"
],
"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": [],
"credentials": []
},
"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": 120
},
"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": {}
},
"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",
"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
}
}
+451
View File
@@ -0,0 +1,451 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-cloudreve",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Cloudreve"
},
"tagline": {
"en_US": "Self-hosted file management and sharing with multiple storage providers."
},
"description": {
"en_US": "File management and sharing with WebDAV, multiple users and storage on local disks, S3-compatible services or OneDrive."
},
"category": "sharing",
"category_label": "Files & Sharing",
"author": "official",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cloudreve.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 5212,
"path": "/"
},
"website": "https://cloudreve.org/",
"documentation": "https://docs.cloudreve.org/",
"repository": "https://github.com/cloudreve/Cloudreve",
"tips": [
"The first account registered becomes the administrator.",
"Port 6888 is only used by the optional Aria2 remote downloads."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "official",
"repository": "https://github.com/cloudreve/Cloudreve",
"revision": "e60554002e8128360556c37c927453aacf08ec37ba70c23dd8366accc1804977",
"image_repository_url": "https://hub.docker.com/r/cloudreve/cloudreve",
"readme_pushed_at": "",
"compose_sha256": "e60554002e8128360556c37c927453aacf08ec37ba70c23dd8366accc1804977",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "cloudreve",
"container_name": "cloudreve",
"image": {
"reference": "cloudreve/cloudreve:latest",
"registry": "docker.io",
"repository": "cloudreve/cloudreve",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [],
"volumes": [
{
"id": "volume-0",
"container_path": "/cloudreve/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": 16
}
}
],
"ports": [
{
"container_port": 5212,
"published_example": 5212,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
},
{
"container_port": 6888,
"published_example": 6888,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
},
{
"container_port": 6888,
"published_example": 6888,
"protocol": "udp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "unless-stopped",
"stop_grace_period": null,
"original_compose": "name: cloudreve\nservices:\n cloudreve:\n image: cloudreve/cloudreve:latest\n ports:\n - 5212:5212\n - 6888:6888\n - 6888:6888/udp\n volumes:\n - ./data:/cloudreve/data\n"
},
"compose_stack": {
"project_name": "cloudreve",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "cloudreve",
"service_count": 1,
"services": [
{
"name": "cloudreve",
"image": "cloudreve/cloudreve:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"image": "cloudreve/cloudreve:latest",
"ports": [
"5212:5212",
"6888:6888",
"6888:6888/udp"
],
"volumes": [
"./data:/cloudreve/data"
]
}
}
],
"top_level": {
"name": "cloudreve"
},
"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": "cloudreve-volume-0",
"service": "cloudreve",
"container_path": "/cloudreve/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": 1,
"start_order": [
"cloudreve"
],
"stop_order": [
"cloudreve"
],
"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": "Cloudreve",
"scheme": "http",
"port": 5212,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": []
},
"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": "/cloudreve/data",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 5212,
"path": "/",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
}
}
},
"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",
"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
}
}
+443
View File
@@ -0,0 +1,443 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-crosswatch",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "CrossWatch"
},
"tagline": {
"en_US": "Watch history, ratings and watchlists synced between media servers and trackers."
},
"description": {
"en_US": "Syncs watch history, ratings and watchlists between Plex, Jellyfin, Emby and trackers such as Trakt and SIMKL."
},
"category": "media",
"category_label": "Media & Streaming",
"author": "cenodude",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/crosswatch.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 8787,
"path": "/"
},
"website": "https://github.com/cenodude/CrossWatch",
"documentation": "https://github.com/cenodude/CrossWatch",
"repository": "https://github.com/cenodude/CrossWatch",
"tips": [],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "cenodude",
"repository": "https://github.com/cenodude/CrossWatch",
"revision": "78ebe973a5d5950601b3896ec7f12ffeecd3dd75fa14cc7810fb7f0b50225fad",
"image_repository_url": "https://ghcr.io/cenodude/crosswatch",
"readme_pushed_at": "",
"compose_sha256": "78ebe973a5d5950601b3896ec7f12ffeecd3dd75fa14cc7810fb7f0b50225fad",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "crosswatch",
"container_name": "crosswatch",
"image": {
"reference": "ghcr.io/cenodude/crosswatch:latest",
"registry": "ghcr.io",
"repository": "ghcr.io/cenodude/crosswatch",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "TZ",
"example": "UTC",
"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",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 4
}
}
],
"ports": [
{
"container_port": 8787,
"published_example": 8787,
"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: crosswatch\nservices:\n crosswatch:\n environment:\n TZ: UTC\n image: ghcr.io/cenodude/crosswatch:latest\n ports:\n - 8787:8787\n volumes:\n - ./config:/config\n"
},
"compose_stack": {
"project_name": "crosswatch",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "crosswatch",
"service_count": 1,
"services": [
{
"name": "crosswatch",
"image": "ghcr.io/cenodude/crosswatch:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"TZ": "UTC"
},
"image": "ghcr.io/cenodude/crosswatch:latest",
"ports": [
"8787:8787"
],
"volumes": [
"./config:/config"
]
}
}
],
"top_level": {
"name": "crosswatch"
},
"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": "crosswatch-volume-0",
"service": "crosswatch",
"container_path": "/config",
"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": [
"crosswatch"
],
"stop_order": [
"crosswatch"
],
"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": "CrossWatch",
"scheme": "http",
"port": 8787,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": []
},
"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": "/config",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 8787,
"path": "/",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
}
}
},
"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",
"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
}
}
+405
View File
@@ -0,0 +1,405 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-dnsmasq",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Dnsmasq"
},
"tagline": {
"en_US": "Lightweight DNS forwarder and cache."
},
"description": {
"en_US": "Forwards and caches DNS queries for the network through the upstream servers chosen."
},
"category": "adblock",
"category_label": "Adblock & DNS",
"author": "dockurr",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/dnsmasq",
"documentation": "https://github.com/dockur/dnsmasq",
"repository": "https://github.com/dockur/dnsmasq",
"tips": [
"DNS-only configuration. DHCP is not enabled and no host network or NET_ADMIN capability is granted."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/dnsmasq",
"revision": "cee3a99fc38caf75a0a9698aa8a1a9ed473edd976ca2bdfd5ad1944c3b42d38c",
"image_repository_url": "https://hub.docker.com/r/dockurr/dnsmasq",
"readme_pushed_at": "",
"compose_sha256": "cee3a99fc38caf75a0a9698aa8a1a9ed473edd976ca2bdfd5ad1944c3b42d38c",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "dnsmasq",
"container_name": "dnsmasq",
"image": {
"reference": "dockurr/dnsmasq:latest",
"registry": "docker.io",
"repository": "dockurr/dnsmasq",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "DNS1",
"example": "1.0.0.1",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Primary upstream DNS server"
},
{
"name": "DNS2",
"example": "1.1.1.1",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Secondary upstream DNS server"
}
],
"volumes": [],
"ports": [
{
"container_port": 53,
"published_example": 53,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
},
{
"container_port": 53,
"published_example": 53,
"protocol": "udp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: dnsmasq\nservices:\n dnsmasq:\n environment:\n DNS1: 1.0.0.1\n DNS2: 1.1.1.1\n image: dockurr/dnsmasq:latest\n ports:\n - '53:53'\n - 53:53/udp\n"
},
"compose_stack": {
"project_name": "dnsmasq",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "dnsmasq",
"service_count": 1,
"services": [
{
"name": "dnsmasq",
"image": "dockurr/dnsmasq:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"DNS1": "1.0.0.1",
"DNS2": "1.1.1.1"
},
"image": "dockurr/dnsmasq:latest",
"ports": [
"53:53",
"53:53/udp"
]
}
}
],
"top_level": {
"name": "dnsmasq"
},
"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": [],
"orchestration": {
"reserve_vmids_atomically": 1,
"start_order": [
"dnsmasq"
],
"stop_order": [
"dnsmasq"
],
"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": [],
"credentials": []
},
"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": 120
},
"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": {}
},
"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",
"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
}
}
@@ -0,0 +1,563 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-free-games-claimer-remaster",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Free Games Claimer Remaster"
},
"tagline": {
"en_US": "Claims the free games of Steam, Epic, Prime Gaming, GOG and more."
},
"description": {
"en_US": "Claims free games and giveaways from Steam, Epic Games, Prime Gaming, GOG and other stores on a schedule, with a browser reachable over noVNC to sign in."
},
"category": "gaming",
"category_label": "Gaming & Leisure",
"author": "p-adamiec",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/free-games-claimer.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 7080,
"path": "/?autoconnect=true"
},
"website": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"documentation": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"repository": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"tips": [
"Sign in to each store once from the noVNC session; the browser keeps the sessions in the data volume.",
"Store credentials and 2FA secrets can also be set as variables in the advanced installation."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "p-adamiec",
"repository": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"revision": "68a17f8ec239640e47157b87b4d3912c1dac29a169c55f814109571c2dc28fcc",
"image_repository_url": "https://ghcr.io/p-adamiec/free-games-claimer-remaster",
"readme_pushed_at": "",
"compose_sha256": "68a17f8ec239640e47157b87b4d3912c1dac29a169c55f814109571c2dc28fcc",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "free-games-claimer-remaster",
"container_name": "free-games-claimer-remaster",
"image": {
"reference": "ghcr.io/p-adamiec/free-games-claimer-remaster:latest",
"registry": "ghcr.io",
"repository": "ghcr.io/p-adamiec/free-games-claimer-remaster",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "TZ",
"example": "UTC",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "SCHEDULER_TIMEZONE",
"example": "UTC",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Time zone of the fixed daily run times"
},
{
"name": "SCHEDULER_HOURS",
"example": "12",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Hours between claiming runs (0 disables interval runs)"
},
{
"name": "VNC_PASSWORD",
"example": "",
"required": true,
"sensitive": true,
"source": "docker-compose",
"prompt": "Password of the noVNC browser session"
},
{
"name": "VNC_IP",
"example": "",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Address of the noVNC session in the links of the notifications (for example 192.168.1.50)",
"container_address": "@CONTAINER_ADDRESS@"
},
{
"name": "STORES",
"example": "",
"required": false,
"sensitive": false,
"source": "docker-compose",
"prompt": "Stores to run, separated by commas (empty runs the default stores)"
},
{
"name": "EMAIL",
"example": "",
"required": false,
"sensitive": false,
"source": "docker-compose",
"prompt": "Login email used by every store (optional)"
},
{
"name": "PASSWORD",
"example": "",
"required": false,
"sensitive": true,
"source": "docker-compose",
"prompt": "Login password used by every store (optional)"
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/fgc/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": 7080,
"published_example": 7080,
"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: free-games-claimer-remaster\nservices:\n free-games-claimer-remaster:\n environment:\n EMAIL: ''\n PASSWORD: ${GENERATED_PASSWORD}\n SCHEDULER_HOURS: '12'\n SCHEDULER_TIMEZONE: UTC\n STORES: ''\n TZ: UTC\n VNC_IP: ''\n VNC_PASSWORD: ${GENERATED_VNC_PASSWORD}\n image: ghcr.io/p-adamiec/free-games-claimer-remaster:latest\n ports:\n - 7080:7080\n volumes:\n - ./data:/fgc/data\n"
},
"compose_stack": {
"project_name": "free-games-claimer-remaster",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "free-games-claimer-remaster",
"service_count": 1,
"services": [
{
"name": "free-games-claimer-remaster",
"image": "ghcr.io/p-adamiec/free-games-claimer-remaster:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"EMAIL": "",
"PASSWORD": "${GENERATED_PASSWORD}",
"SCHEDULER_HOURS": "12",
"SCHEDULER_TIMEZONE": "UTC",
"STORES": "",
"TZ": "UTC",
"VNC_IP": "",
"VNC_PASSWORD": "${GENERATED_VNC_PASSWORD}"
},
"image": "ghcr.io/p-adamiec/free-games-claimer-remaster:latest",
"ports": [
"7080:7080"
],
"volumes": [
"./data:/fgc/data"
]
}
}
],
"top_level": {
"name": "free-games-claimer-remaster"
},
"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": "free-games-claimer-remaster-volume-0",
"service": "free-games-claimer-remaster",
"container_path": "/fgc/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": 1,
"start_order": [
"free-games-claimer-remaster"
],
"stop_order": [
"free-games-claimer-remaster"
],
"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": "password",
"strategy": "generate-cryptographically-random-at-install",
"bindings": [
{
"service": "free-games-claimer-remaster",
"environment_variable": "PASSWORD"
}
]
},
{
"id": "vnc-password",
"strategy": "generate-cryptographically-random-at-install",
"bindings": [
{
"service": "free-games-claimer-remaster",
"environment_variable": "VNC_PASSWORD"
}
]
}
]
}
},
"first_run": {
"endpoints": [
{
"label": "noVNC browser session",
"scheme": "http",
"port": 7080,
"path": "/?autoconnect=true",
"source": "upstream-documentation"
}
],
"credentials": [
{
"label": "noVNC browser session (password only)",
"type": "configured-or-installer-generated",
"username": "Not required (password only)",
"password": null,
"password_environment": "VNC_PASSWORD",
"change_required": false,
"source": "upstream-documentation",
"retrieval": null
}
]
},
"proxmox": {
"runtime": "native-oci-lxc",
"technology_status": "proxmox-technology-preview",
"defaults": {
"unprivileged": true,
"ostype": "auto-from-image",
"cores": 2,
"memory_mb": 4096,
"swap_mb": 512,
"rootfs_size_gb": 16,
"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": "/fgc/data",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"generated_sensitive_environment": {
"VNC_PASSWORD": {
"strategy": "token-hex",
"bytes": 8,
"prompt": true
}
},
"tmpfs_mounts": [
{
"id": "compose-shm",
"container_path": "/dev/shm",
"default_size_mb": 1024,
"minimum_size_mb": 1,
"size_prompt": "Size of the /dev/shm shared memory in MB",
"mount_options": [
"rw",
"nosuid",
"nodev"
]
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 7080,
"path": "/",
"timeout_seconds": 300,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
}
}
},
"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",
"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
}
}
+472
View File
@@ -0,0 +1,472 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-mdblistarr",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "MDBListarr"
},
"tagline": {
"en_US": "MDBList lists synced to Radarr and Sonarr."
},
"description": {
"en_US": "Sends MDBList lists to Radarr and Sonarr and keeps the library status synced with MDBList."
},
"category": "arr",
"category_label": "*Arr Suite",
"author": "linaspurinis",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 5353,
"path": "/"
},
"website": "https://github.com/linaspurinis/mdblistarr",
"documentation": "https://github.com/linaspurinis/mdblistarr",
"repository": "https://github.com/linaspurinis/mdblistarr",
"tips": [
"Behind a hostname or a reverse proxy, set CSRF_TRUSTED_ORIGINS with the scheme and port, for example https://mdblistarr.example.com."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "linaspurinis",
"repository": "https://github.com/linaspurinis/mdblistarr",
"revision": "95f7aeae4a7234c09e8ba293e53fe6d5a51421600c6c19c0edcbe19761e64e3b",
"image_repository_url": "https://hub.docker.com/r/linaspurinis/mdblistarr",
"readme_pushed_at": "",
"compose_sha256": "95f7aeae4a7234c09e8ba293e53fe6d5a51421600c6c19c0edcbe19761e64e3b",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "mdblistarr",
"container_name": "mdblistarr",
"image": {
"reference": "linaspurinis/mdblistarr:latest",
"registry": "docker.io",
"repository": "linaspurinis/mdblistarr",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "PORT",
"example": "5353",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
},
{
"name": "TZ",
"example": "UTC",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "CSRF_TRUSTED_ORIGINS",
"example": "",
"required": false,
"sensitive": false,
"source": "docker-compose",
"prompt": "Trusted origins for a hostname or reverse proxy, with scheme and port (optional)"
},
{
"name": "ALLOWED_HOSTS",
"example": "",
"required": false,
"sensitive": false,
"source": "docker-compose",
"prompt": "Allowed hostnames for a hostname or reverse proxy (optional)"
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/usr/src/db",
"compose_source_example": "./db",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 2
}
}
],
"ports": [
{
"container_port": 5353,
"published_example": 5353,
"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: mdblistarr\nservices:\n mdblistarr:\n environment:\n ALLOWED_HOSTS: ''\n CSRF_TRUSTED_ORIGINS: ''\n PORT: '5353'\n TZ: UTC\n image: linaspurinis/mdblistarr:latest\n ports:\n - 5353:5353\n volumes:\n - ./db:/usr/src/db\n"
},
"compose_stack": {
"project_name": "mdblistarr",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "mdblistarr",
"service_count": 1,
"services": [
{
"name": "mdblistarr",
"image": "linaspurinis/mdblistarr:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"ALLOWED_HOSTS": "",
"CSRF_TRUSTED_ORIGINS": "",
"PORT": "5353",
"TZ": "UTC"
},
"image": "linaspurinis/mdblistarr:latest",
"ports": [
"5353:5353"
],
"volumes": [
"./db:/usr/src/db"
]
}
}
],
"top_level": {
"name": "mdblistarr"
},
"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": "mdblistarr-volume-0",
"service": "mdblistarr",
"container_path": "/usr/src/db",
"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": [
"mdblistarr"
],
"stop_order": [
"mdblistarr"
],
"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": "MDBListarr",
"scheme": "http",
"port": 5353,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": []
},
"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": "/usr/src/db",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 5353,
"path": "/",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
}
}
},
"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",
"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
}
}
+472
View File
@@ -0,0 +1,472 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-poznote",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Poznote"
},
"tagline": {
"en_US": "Note-taking with tags, workspaces, attachments and a REST API."
},
"description": {
"en_US": "Self-hosted notes with rich text and Markdown, tags, workspaces, attachments, sharing and a REST API."
},
"category": "documents",
"category_label": "Documents & Notes",
"author": "timothepoznanski",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/poznote.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 80,
"path": "/"
},
"website": "https://github.com/timothepoznanski/poznote",
"documentation": "https://github.com/timothepoznanski/poznote",
"repository": "https://github.com/timothepoznanski/poznote",
"tips": [
"Rename the administrator and change its password after the first sign-in.",
"The optional MCP server for AI assistants is a separate image and is not installed."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "timothepoznanski",
"repository": "https://github.com/timothepoznanski/poznote",
"revision": "9f705967a76b9c4f652728538cd3c70e3208146bca1ee7a3ceb16c3b17a778ec",
"image_repository_url": "https://ghcr.io/timothepoznanski/poznote",
"readme_pushed_at": "",
"compose_sha256": "9f705967a76b9c4f652728538cd3c70e3208146bca1ee7a3ceb16c3b17a778ec",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "poznote",
"container_name": "poznote",
"image": {
"reference": "ghcr.io/timothepoznanski/poznote:latest",
"registry": "ghcr.io",
"repository": "ghcr.io/timothepoznanski/poznote",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "SQLITE_DATABASE",
"example": "/var/www/html/data/database/poznote.db",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/var/www/html/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": 80,
"published_example": 80,
"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: poznote\nservices:\n poznote:\n environment:\n SQLITE_DATABASE: /var/www/html/data/database/poznote.db\n image: ghcr.io/timothepoznanski/poznote:latest\n ports:\n - 80:80\n volumes:\n - ./data:/var/www/html/data\n"
},
"compose_stack": {
"project_name": "poznote",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "poznote",
"service_count": 1,
"services": [
{
"name": "poznote",
"image": "ghcr.io/timothepoznanski/poznote:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"SQLITE_DATABASE": "/var/www/html/data/database/poznote.db"
},
"image": "ghcr.io/timothepoznanski/poznote:latest",
"ports": [
"80:80"
],
"volumes": [
"./data:/var/www/html/data"
]
}
}
],
"top_level": {
"name": "poznote"
},
"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": "poznote-volume-0",
"service": "poznote",
"container_path": "/var/www/html/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": 1,
"start_order": [
"poznote"
],
"stop_order": [
"poznote"
],
"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": "Poznote",
"scheme": "http",
"port": 80,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": [
{
"label": "Poznote administrator",
"type": "static-default",
"username": "admin_change_me",
"password": "admin",
"change_required": true,
"source": "upstream-documentation",
"retrieval": null
}
]
},
"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": "/var/www/html/data",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 80,
"path": "/api/health",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
},
"tmpfs_mounts": [
{
"id": "nginx-runtime",
"container_path": "/run/nginx",
"default_size_mb": 1,
"minimum_size_mb": 1,
"prompt_size": false,
"mount_options": [
"rw",
"nosuid",
"nodev",
"mode=0755"
]
}
]
}
},
"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",
"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
}
}
+432
View File
@@ -0,0 +1,432 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-statping",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Statping"
},
"tagline": {
"en_US": "Status page and uptime monitoring."
},
"description": {
"en_US": "Status page that monitors websites and services and records their uptime and response times."
},
"category": "monitoring",
"category_label": "Monitoring & Analytics",
"author": "dockurr",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/statping-ng.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 8080,
"path": "/"
},
"website": "https://github.com/dockur/statping",
"documentation": "https://github.com/dockur/statping",
"repository": "https://github.com/dockur/statping",
"tips": [],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/statping",
"revision": "de7e093e020ba3581f4ca30d7497d38d0fd2b94fb625c33b0016b8bc7399ed1b",
"image_repository_url": "https://hub.docker.com/r/dockurr/statping",
"readme_pushed_at": "",
"compose_sha256": "de7e093e020ba3581f4ca30d7497d38d0fd2b94fb625c33b0016b8bc7399ed1b",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "statping",
"container_name": "statping",
"image": {
"reference": "dockurr/statping:latest",
"registry": "docker.io",
"repository": "dockurr/statping",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [],
"volumes": [
{
"id": "volume-0",
"container_path": "/app",
"compose_source_example": "./app",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 4
}
}
],
"ports": [
{
"container_port": 8080,
"published_example": 8080,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: statping\nservices:\n statping:\n image: dockurr/statping:latest\n ports:\n - 8080:8080\n volumes:\n - ./app:/app\n"
},
"compose_stack": {
"project_name": "statping",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "statping",
"service_count": 1,
"services": [
{
"name": "statping",
"image": "dockurr/statping:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"image": "dockurr/statping:latest",
"ports": [
"8080:8080"
],
"volumes": [
"./app:/app"
]
}
}
],
"top_level": {
"name": "statping"
},
"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": "statping-volume-0",
"service": "statping",
"container_path": "/app",
"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": [
"statping"
],
"stop_order": [
"statping"
],
"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": "Statping",
"scheme": "http",
"port": 8080,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": []
},
"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": 120
},
"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": "/app",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 8080,
"path": "/",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"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",
"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
}
}
+426
View File
@@ -0,0 +1,426 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-strfry",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "strfry"
},
"tagline": {
"en_US": "Nostr relay."
},
"description": {
"en_US": "High-performance relay for the Nostr protocol, served over WebSocket."
},
"category": "communication",
"category_label": "Communication & Community",
"author": "dockurr",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/strfry",
"documentation": "https://github.com/dockur/strfry",
"repository": "https://github.com/dockur/strfry",
"tips": [
"Nostr WebSocket relay on port 7777, not a web administration interface. Uses the config shipped in /app/strfry.conf. Public wss://, relay identity and authentication policy are instance-specific."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/strfry",
"revision": "28860d6d13a116d230361d55f62133b5d4b737bc7227c6d6e94888c3f0a8897f",
"image_repository_url": "https://hub.docker.com/r/dockurr/strfry",
"readme_pushed_at": "",
"compose_sha256": "28860d6d13a116d230361d55f62133b5d4b737bc7227c6d6e94888c3f0a8897f",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "strfry",
"container_name": "strfry",
"image": {
"reference": "dockurr/strfry:latest",
"registry": "docker.io",
"repository": "dockurr/strfry",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [],
"volumes": [
{
"id": "volume-0",
"container_path": "/app/strfry-db",
"compose_source_example": "./strfry-db",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 16
}
}
],
"ports": [
{
"container_port": 7777,
"published_example": 7777,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: strfry\nservices:\n strfry:\n image: dockurr/strfry:latest\n ports:\n - 7777:7777\n volumes:\n - ./strfry-db:/app/strfry-db\n"
},
"compose_stack": {
"project_name": "strfry",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "strfry",
"service_count": 1,
"services": [
{
"name": "strfry",
"image": "dockurr/strfry:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"image": "dockurr/strfry:latest",
"ports": [
"7777:7777"
],
"volumes": [
"./strfry-db:/app/strfry-db"
]
}
}
],
"top_level": {
"name": "strfry"
},
"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": "strfry-volume-0",
"service": "strfry",
"container_path": "/app/strfry-db",
"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": [
"strfry"
],
"stop_order": [
"strfry"
],
"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": [],
"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": 120
},
"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": "/app/strfry-db",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"resources": {
"rlimits": [
{
"name": "nofile",
"soft": "524288",
"hard": "524288"
}
]
}
}
},
"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",
"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
}
}
+456
View File
@@ -0,0 +1,456 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-stunnel",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Stunnel"
},
"tagline": {
"en_US": "TLS tunnel for a TCP service."
},
"description": {
"en_US": "Wraps a TCP service in TLS, such as DNS over TLS on port 853 in front of a DNS server."
},
"category": "security",
"category_label": "Authentication & Security",
"author": "dockurr",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/stunnel",
"documentation": "https://github.com/dockur/stunnel",
"repository": "https://github.com/dockur/stunnel",
"tips": [
"TLS server on port 853 forwarding TCP to the configured destination. Upstream creates a self-signed certificate when none is supplied; no public-trust certificate is implied. No web interface."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/stunnel",
"revision": "a2553faeb5fc4dae333578e70d38f474c5f2504aafd8a5a7ca7cc4648751e84b",
"image_repository_url": "https://hub.docker.com/r/dockurr/stunnel",
"readme_pushed_at": "",
"compose_sha256": "a2553faeb5fc4dae333578e70d38f474c5f2504aafd8a5a7ca7cc4648751e84b",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "stunnel",
"container_name": "stunnel",
"image": {
"reference": "dockurr/stunnel:latest",
"registry": "docker.io",
"repository": "dockurr/stunnel",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "LISTEN_PORT",
"example": "853",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
},
{
"name": "CONNECT_HOST",
"example": "",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Destination server address for the TLS tunnel"
},
{
"name": "CONNECT_PORT",
"example": "",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Destination TCP port for the TLS tunnel"
},
{
"name": "CLIENT",
"example": "no",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/etc/stunnel",
"compose_source_example": "./stunnel",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 1
}
}
],
"ports": [
{
"container_port": 853,
"published_example": 853,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: stunnel\nservices:\n stunnel:\n environment:\n CLIENT: 'no'\n CONNECT_HOST: ''\n CONNECT_PORT: ''\n LISTEN_PORT: '853'\n image: dockurr/stunnel:latest\n ports:\n - 853:853\n volumes:\n - ./stunnel:/etc/stunnel\n"
},
"compose_stack": {
"project_name": "stunnel",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "stunnel",
"service_count": 1,
"services": [
{
"name": "stunnel",
"image": "dockurr/stunnel:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"CLIENT": "no",
"CONNECT_HOST": "",
"CONNECT_PORT": "",
"LISTEN_PORT": "853"
},
"image": "dockurr/stunnel:latest",
"ports": [
"853:853"
],
"volumes": [
"./stunnel:/etc/stunnel"
]
}
}
],
"top_level": {
"name": "stunnel"
},
"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": "stunnel-volume-0",
"service": "stunnel",
"container_path": "/etc/stunnel",
"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": [
"stunnel"
],
"stop_order": [
"stunnel"
],
"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": [],
"credentials": []
},
"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": 120
},
"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": "/etc/stunnel",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
]
}
},
"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",
"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
}
}
+391
View File
@@ -0,0 +1,391 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-tor",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Tor"
},
"tagline": {
"en_US": "Tor SOCKS5 and HTTP proxy."
},
"description": {
"en_US": "Sends the traffic of the applications configured to use it through the Tor network, over SOCKS5 or HTTP CONNECT."
},
"category": "remote",
"category_label": "Remote Access & VPN",
"author": "dockurr",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tor.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/tor",
"documentation": "https://github.com/dockur/tor",
"repository": "https://github.com/dockur/tor",
"tips": [
"SOCKS5: port 9050. HTTP proxy: port 8118. The control port is not published; the upstream default binds it to loopback. No web administration interface. Restrict client access with the LXC firewall."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/tor",
"revision": "fdf5487c08c59658ac85ea79ae2c11fa171d219923bb4f7fbc94b322a5c56327",
"image_repository_url": "https://hub.docker.com/r/dockurr/tor",
"readme_pushed_at": "",
"compose_sha256": "fdf5487c08c59658ac85ea79ae2c11fa171d219923bb4f7fbc94b322a5c56327",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "tor",
"container_name": "tor",
"image": {
"reference": "dockurr/tor:latest",
"registry": "docker.io",
"repository": "dockurr/tor",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [],
"volumes": [],
"ports": [
{
"container_port": 9050,
"published_example": 9050,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
},
{
"container_port": 8118,
"published_example": 8118,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: tor\nservices:\n tor:\n image: dockurr/tor:latest\n ports:\n - 9050:9050\n - 8118:8118\n"
},
"compose_stack": {
"project_name": "tor",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "tor",
"service_count": 1,
"services": [
{
"name": "tor",
"image": "dockurr/tor:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"image": "dockurr/tor:latest",
"ports": [
"9050:9050",
"8118:8118"
]
}
}
],
"top_level": {
"name": "tor"
},
"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": [],
"orchestration": {
"reserve_vmids_atomically": 1,
"start_order": [
"tor"
],
"stop_order": [
"tor"
],
"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": [],
"credentials": []
},
"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": 120
},
"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": {
"completion_notes": [
"Tor is a proxy, not a website. It has no web interface.",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.",
"Only applications configured to use this proxy send their traffic through Tor."
]
}
},
"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",
"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
}
}
+12
View File
@@ -31,6 +31,7 @@
"desktop": "Browsers & Web Desktops"
},
"applications": {
"acestream-http-proxy": "media",
"adguard-home": "adblock",
"adminer": "databases",
"airsonic-advanced": "media",
@@ -52,11 +53,14 @@
"changedetection.io": "monitoring",
"chrome": "desktop",
"chromium": "desktop",
"chrony": "network",
"cloudbeaver": "databases",
"cloudreve": "sharing",
"code-server": "ai",
"cops": "media",
"copyparty": "sharing",
"crafty": "gaming",
"crosswatch": "media",
"cura": "creative",
"darktable": "creative",
"davos": "downloads",
@@ -64,6 +68,7 @@
"ddns-go": "adblock",
"ddns-updater": "adblock",
"digikam": "creative",
"dnsmasq": "adblock",
"dogwalk": "gaming",
"dokuwiki": "documents",
"dolphin": "gaming",
@@ -83,6 +88,7 @@
"firefox": "desktop",
"flexget": "arr",
"flycast": "gaming",
"free-games-claimer-remaster": "gaming",
"freecad": "creative",
"gateway-go": "web",
"gimp": "creative",
@@ -116,6 +122,7 @@
"luanti": "gaming",
"lucky": "web",
"mame": "gaming",
"mdblistarr": "arr",
"mediaelch": "media",
"melonds": "gaming",
"mineos-node": "gaming",
@@ -147,6 +154,7 @@
"piper": "ai",
"piwigo": "media",
"playit-agent": "web",
"poznote": "documents",
"ppsspp": "gaming",
"psitransfer": "sharing",
"pwndrop": "sharing",
@@ -175,7 +183,10 @@
"speedtest-tracker": "monitoring",
"spotube": "media",
"sqlitebrowser": "databases",
"statping": "monitoring",
"steam": "gaming",
"strfry": "communication",
"stunnel": "security",
"swag": "web",
"synclounge": "media",
"syncthing": "sharing",
@@ -184,6 +195,7 @@
"telegram": "communication",
"thelounge": "communication",
"thunderbird": "communication",
"tor": "remote",
"tvheadend": "media",
"ubooquity": "media",
"ungoogled-chromium": "desktop",
@@ -0,0 +1,391 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-acestream-http-proxy",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "AceStream HTTP Proxy"
},
"tagline": {
"en_US": "AceStream engine with its HTTP API for media players."
},
"description": {
"en_US": "Runs the AceStream engine and serves its streams over HTTP as HLS or MPEG-TS, for players such as VLC."
},
"category": "media",
"category_label": "Media & Streaming",
"author": "martinbjeldbak",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ace-stream.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/martinbjeldbak/acestream-http-proxy",
"documentation": "https://github.com/martinbjeldbak/acestream-http-proxy",
"repository": "https://github.com/martinbjeldbak/acestream-http-proxy",
"tips": [],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "martinbjeldbak",
"repository": "https://github.com/martinbjeldbak/acestream-http-proxy",
"revision": "34b406ffdd80609f18b55c1d8a8140c0fb8ec8bf80f9808e998f71b6d0edf8fc",
"image_repository_url": "https://ghcr.io/martinbjeldbak/acestream-http-proxy",
"readme_pushed_at": "",
"compose_sha256": "34b406ffdd80609f18b55c1d8a8140c0fb8ec8bf80f9808e998f71b6d0edf8fc",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "acestream-http-proxy",
"container_name": "acestream-http-proxy",
"image": {
"reference": "ghcr.io/martinbjeldbak/acestream-http-proxy:latest",
"registry": "ghcr.io",
"repository": "ghcr.io/martinbjeldbak/acestream-http-proxy",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "ALLOW_REMOTE_ACCESS",
"example": "yes",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
}
],
"volumes": [],
"ports": [
{
"container_port": 6878,
"published_example": 6878,
"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: acestream-http-proxy\nservices:\n acestream-http-proxy:\n environment:\n ALLOW_REMOTE_ACCESS: 'yes'\n image: ghcr.io/martinbjeldbak/acestream-http-proxy:latest\n ports:\n - 6878:6878\n"
},
"compose_stack": {
"project_name": "acestream-http-proxy",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "acestream-http-proxy",
"service_count": 1,
"services": [
{
"name": "acestream-http-proxy",
"image": "ghcr.io/martinbjeldbak/acestream-http-proxy:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"ALLOW_REMOTE_ACCESS": "yes"
},
"image": "ghcr.io/martinbjeldbak/acestream-http-proxy:latest",
"ports": [
"6878:6878"
]
}
}
],
"top_level": {
"name": "acestream-http-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": [],
"orchestration": {
"reserve_vmids_atomically": 1,
"start_order": [
"acestream-http-proxy"
],
"stop_order": [
"acestream-http-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": []
}
},
"first_run": {
"endpoints": [],
"credentials": []
},
"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": {
"completion_notes": [
"AceStream HTTP Proxy has no web interface: a media player opens its streams.",
"HLS stream: port 6878, path /ace/manifest.m3u8?id= followed by the channel ID.",
"MPEG-TS stream: port 6878, path /ace/getstream?id= followed by the channel ID."
]
}
},
"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",
"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
}
}
+406
View File
@@ -0,0 +1,406 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-chrony",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Chrony"
},
"tagline": {
"en_US": "NTP time server for the network."
},
"description": {
"en_US": "Serves NTP time to the network from upstream servers, without adjusting the clock of the Proxmox host."
},
"category": "network",
"category_label": "Network & Firewall",
"author": "dockurr",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/chrony",
"documentation": "https://github.com/dockur/chrony",
"repository": "https://github.com/dockur/chrony",
"tips": [
"Serves NTP without adjusting the Proxmox host clock: ENABLE_SYSCLK=false uses chronyd -x."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/chrony",
"revision": "0da30e1fd2d601c17a7c5f04684c6f9ec28838cda9ea7a2d33313e839a41d707",
"image_repository_url": "https://hub.docker.com/r/dockurr/chrony",
"readme_pushed_at": "",
"compose_sha256": "0da30e1fd2d601c17a7c5f04684c6f9ec28838cda9ea7a2d33313e839a41d707",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "chrony",
"container_name": "chrony",
"image": {
"reference": "dockurr/chrony:latest",
"registry": "docker.io",
"repository": "dockurr/chrony",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "NTP_SERVERS",
"example": "pool.ntp.org",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Upstream NTP servers"
},
{
"name": "ENABLE_SYSCLK",
"example": "false",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
},
{
"name": "ALLOW",
"example": "",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Client networks permitted to query NTP (comma-separated CIDRs)"
}
],
"volumes": [],
"ports": [
{
"container_port": 123,
"published_example": 123,
"protocol": "udp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: chrony\nservices:\n chrony:\n environment:\n ALLOW: ''\n ENABLE_SYSCLK: 'false'\n NTP_SERVERS: pool.ntp.org\n image: dockurr/chrony:latest\n ports:\n - 123:123/udp\n"
},
"compose_stack": {
"project_name": "chrony",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "chrony",
"service_count": 1,
"services": [
{
"name": "chrony",
"image": "dockurr/chrony:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"ALLOW": "",
"ENABLE_SYSCLK": "false",
"NTP_SERVERS": "pool.ntp.org"
},
"image": "dockurr/chrony:latest",
"ports": [
"123:123/udp"
]
}
}
],
"top_level": {
"name": "chrony"
},
"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": [],
"orchestration": {
"reserve_vmids_atomically": 1,
"start_order": [
"chrony"
],
"stop_order": [
"chrony"
],
"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": [],
"credentials": []
},
"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": 120
},
"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": {}
},
"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",
"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
}
}
+451
View File
@@ -0,0 +1,451 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-cloudreve",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Cloudreve"
},
"tagline": {
"en_US": "Self-hosted file management and sharing with multiple storage providers."
},
"description": {
"en_US": "File management and sharing with WebDAV, multiple users and storage on local disks, S3-compatible services or OneDrive."
},
"category": "sharing",
"category_label": "Files & Sharing",
"author": "official",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cloudreve.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 5212,
"path": "/"
},
"website": "https://cloudreve.org/",
"documentation": "https://docs.cloudreve.org/",
"repository": "https://github.com/cloudreve/Cloudreve",
"tips": [
"The first account registered becomes the administrator.",
"Port 6888 is only used by the optional Aria2 remote downloads."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "official",
"repository": "https://github.com/cloudreve/Cloudreve",
"revision": "e60554002e8128360556c37c927453aacf08ec37ba70c23dd8366accc1804977",
"image_repository_url": "https://hub.docker.com/r/cloudreve/cloudreve",
"readme_pushed_at": "",
"compose_sha256": "e60554002e8128360556c37c927453aacf08ec37ba70c23dd8366accc1804977",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "cloudreve",
"container_name": "cloudreve",
"image": {
"reference": "cloudreve/cloudreve:latest",
"registry": "docker.io",
"repository": "cloudreve/cloudreve",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [],
"volumes": [
{
"id": "volume-0",
"container_path": "/cloudreve/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": 16
}
}
],
"ports": [
{
"container_port": 5212,
"published_example": 5212,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
},
{
"container_port": 6888,
"published_example": 6888,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
},
{
"container_port": 6888,
"published_example": 6888,
"protocol": "udp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "unless-stopped",
"stop_grace_period": null,
"original_compose": "name: cloudreve\nservices:\n cloudreve:\n image: cloudreve/cloudreve:latest\n ports:\n - 5212:5212\n - 6888:6888\n - 6888:6888/udp\n volumes:\n - ./data:/cloudreve/data\n"
},
"compose_stack": {
"project_name": "cloudreve",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "cloudreve",
"service_count": 1,
"services": [
{
"name": "cloudreve",
"image": "cloudreve/cloudreve:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"image": "cloudreve/cloudreve:latest",
"ports": [
"5212:5212",
"6888:6888",
"6888:6888/udp"
],
"volumes": [
"./data:/cloudreve/data"
]
}
}
],
"top_level": {
"name": "cloudreve"
},
"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": "cloudreve-volume-0",
"service": "cloudreve",
"container_path": "/cloudreve/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": 1,
"start_order": [
"cloudreve"
],
"stop_order": [
"cloudreve"
],
"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": "Cloudreve",
"scheme": "http",
"port": 5212,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": []
},
"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": "/cloudreve/data",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 5212,
"path": "/",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
}
}
},
"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",
"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
}
}
+443
View File
@@ -0,0 +1,443 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-crosswatch",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "CrossWatch"
},
"tagline": {
"en_US": "Watch history, ratings and watchlists synced between media servers and trackers."
},
"description": {
"en_US": "Syncs watch history, ratings and watchlists between Plex, Jellyfin, Emby and trackers such as Trakt and SIMKL."
},
"category": "media",
"category_label": "Media & Streaming",
"author": "cenodude",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/crosswatch.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 8787,
"path": "/"
},
"website": "https://github.com/cenodude/CrossWatch",
"documentation": "https://github.com/cenodude/CrossWatch",
"repository": "https://github.com/cenodude/CrossWatch",
"tips": [],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "cenodude",
"repository": "https://github.com/cenodude/CrossWatch",
"revision": "78ebe973a5d5950601b3896ec7f12ffeecd3dd75fa14cc7810fb7f0b50225fad",
"image_repository_url": "https://ghcr.io/cenodude/crosswatch",
"readme_pushed_at": "",
"compose_sha256": "78ebe973a5d5950601b3896ec7f12ffeecd3dd75fa14cc7810fb7f0b50225fad",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "crosswatch",
"container_name": "crosswatch",
"image": {
"reference": "ghcr.io/cenodude/crosswatch:latest",
"registry": "ghcr.io",
"repository": "ghcr.io/cenodude/crosswatch",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "TZ",
"example": "UTC",
"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",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 4
}
}
],
"ports": [
{
"container_port": 8787,
"published_example": 8787,
"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: crosswatch\nservices:\n crosswatch:\n environment:\n TZ: UTC\n image: ghcr.io/cenodude/crosswatch:latest\n ports:\n - 8787:8787\n volumes:\n - ./config:/config\n"
},
"compose_stack": {
"project_name": "crosswatch",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "crosswatch",
"service_count": 1,
"services": [
{
"name": "crosswatch",
"image": "ghcr.io/cenodude/crosswatch:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"TZ": "UTC"
},
"image": "ghcr.io/cenodude/crosswatch:latest",
"ports": [
"8787:8787"
],
"volumes": [
"./config:/config"
]
}
}
],
"top_level": {
"name": "crosswatch"
},
"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": "crosswatch-volume-0",
"service": "crosswatch",
"container_path": "/config",
"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": [
"crosswatch"
],
"stop_order": [
"crosswatch"
],
"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": "CrossWatch",
"scheme": "http",
"port": 8787,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": []
},
"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": "/config",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 8787,
"path": "/",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
}
}
},
"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",
"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
}
}
+405
View File
@@ -0,0 +1,405 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-dnsmasq",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Dnsmasq"
},
"tagline": {
"en_US": "Lightweight DNS forwarder and cache."
},
"description": {
"en_US": "Forwards and caches DNS queries for the network through the upstream servers chosen."
},
"category": "adblock",
"category_label": "Adblock & DNS",
"author": "dockurr",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/dnsmasq",
"documentation": "https://github.com/dockur/dnsmasq",
"repository": "https://github.com/dockur/dnsmasq",
"tips": [
"DNS-only configuration. DHCP is not enabled and no host network or NET_ADMIN capability is granted."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/dnsmasq",
"revision": "cee3a99fc38caf75a0a9698aa8a1a9ed473edd976ca2bdfd5ad1944c3b42d38c",
"image_repository_url": "https://hub.docker.com/r/dockurr/dnsmasq",
"readme_pushed_at": "",
"compose_sha256": "cee3a99fc38caf75a0a9698aa8a1a9ed473edd976ca2bdfd5ad1944c3b42d38c",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "dnsmasq",
"container_name": "dnsmasq",
"image": {
"reference": "dockurr/dnsmasq:latest",
"registry": "docker.io",
"repository": "dockurr/dnsmasq",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "DNS1",
"example": "1.0.0.1",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Primary upstream DNS server"
},
{
"name": "DNS2",
"example": "1.1.1.1",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Secondary upstream DNS server"
}
],
"volumes": [],
"ports": [
{
"container_port": 53,
"published_example": 53,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
},
{
"container_port": 53,
"published_example": 53,
"protocol": "udp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: dnsmasq\nservices:\n dnsmasq:\n environment:\n DNS1: 1.0.0.1\n DNS2: 1.1.1.1\n image: dockurr/dnsmasq:latest\n ports:\n - '53:53'\n - 53:53/udp\n"
},
"compose_stack": {
"project_name": "dnsmasq",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "dnsmasq",
"service_count": 1,
"services": [
{
"name": "dnsmasq",
"image": "dockurr/dnsmasq:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"DNS1": "1.0.0.1",
"DNS2": "1.1.1.1"
},
"image": "dockurr/dnsmasq:latest",
"ports": [
"53:53",
"53:53/udp"
]
}
}
],
"top_level": {
"name": "dnsmasq"
},
"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": [],
"orchestration": {
"reserve_vmids_atomically": 1,
"start_order": [
"dnsmasq"
],
"stop_order": [
"dnsmasq"
],
"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": [],
"credentials": []
},
"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": 120
},
"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": {}
},
"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",
"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
}
}
@@ -0,0 +1,563 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-free-games-claimer-remaster",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Free Games Claimer Remaster"
},
"tagline": {
"en_US": "Claims the free games of Steam, Epic, Prime Gaming, GOG and more."
},
"description": {
"en_US": "Claims free games and giveaways from Steam, Epic Games, Prime Gaming, GOG and other stores on a schedule, with a browser reachable over noVNC to sign in."
},
"category": "gaming",
"category_label": "Gaming & Leisure",
"author": "p-adamiec",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/free-games-claimer.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 7080,
"path": "/?autoconnect=true"
},
"website": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"documentation": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"repository": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"tips": [
"Sign in to each store once from the noVNC session; the browser keeps the sessions in the data volume.",
"Store credentials and 2FA secrets can also be set as variables in the advanced installation."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "p-adamiec",
"repository": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"revision": "68a17f8ec239640e47157b87b4d3912c1dac29a169c55f814109571c2dc28fcc",
"image_repository_url": "https://ghcr.io/p-adamiec/free-games-claimer-remaster",
"readme_pushed_at": "",
"compose_sha256": "68a17f8ec239640e47157b87b4d3912c1dac29a169c55f814109571c2dc28fcc",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "free-games-claimer-remaster",
"container_name": "free-games-claimer-remaster",
"image": {
"reference": "ghcr.io/p-adamiec/free-games-claimer-remaster:latest",
"registry": "ghcr.io",
"repository": "ghcr.io/p-adamiec/free-games-claimer-remaster",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "TZ",
"example": "UTC",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "SCHEDULER_TIMEZONE",
"example": "UTC",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Time zone of the fixed daily run times"
},
{
"name": "SCHEDULER_HOURS",
"example": "12",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Hours between claiming runs (0 disables interval runs)"
},
{
"name": "VNC_PASSWORD",
"example": "",
"required": true,
"sensitive": true,
"source": "docker-compose",
"prompt": "Password of the noVNC browser session"
},
{
"name": "VNC_IP",
"example": "",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Address of the noVNC session in the links of the notifications (for example 192.168.1.50)",
"container_address": "@CONTAINER_ADDRESS@"
},
{
"name": "STORES",
"example": "",
"required": false,
"sensitive": false,
"source": "docker-compose",
"prompt": "Stores to run, separated by commas (empty runs the default stores)"
},
{
"name": "EMAIL",
"example": "",
"required": false,
"sensitive": false,
"source": "docker-compose",
"prompt": "Login email used by every store (optional)"
},
{
"name": "PASSWORD",
"example": "",
"required": false,
"sensitive": true,
"source": "docker-compose",
"prompt": "Login password used by every store (optional)"
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/fgc/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": 7080,
"published_example": 7080,
"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: free-games-claimer-remaster\nservices:\n free-games-claimer-remaster:\n environment:\n EMAIL: ''\n PASSWORD: ${GENERATED_PASSWORD}\n SCHEDULER_HOURS: '12'\n SCHEDULER_TIMEZONE: UTC\n STORES: ''\n TZ: UTC\n VNC_IP: ''\n VNC_PASSWORD: ${GENERATED_VNC_PASSWORD}\n image: ghcr.io/p-adamiec/free-games-claimer-remaster:latest\n ports:\n - 7080:7080\n volumes:\n - ./data:/fgc/data\n"
},
"compose_stack": {
"project_name": "free-games-claimer-remaster",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "free-games-claimer-remaster",
"service_count": 1,
"services": [
{
"name": "free-games-claimer-remaster",
"image": "ghcr.io/p-adamiec/free-games-claimer-remaster:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"EMAIL": "",
"PASSWORD": "${GENERATED_PASSWORD}",
"SCHEDULER_HOURS": "12",
"SCHEDULER_TIMEZONE": "UTC",
"STORES": "",
"TZ": "UTC",
"VNC_IP": "",
"VNC_PASSWORD": "${GENERATED_VNC_PASSWORD}"
},
"image": "ghcr.io/p-adamiec/free-games-claimer-remaster:latest",
"ports": [
"7080:7080"
],
"volumes": [
"./data:/fgc/data"
]
}
}
],
"top_level": {
"name": "free-games-claimer-remaster"
},
"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": "free-games-claimer-remaster-volume-0",
"service": "free-games-claimer-remaster",
"container_path": "/fgc/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": 1,
"start_order": [
"free-games-claimer-remaster"
],
"stop_order": [
"free-games-claimer-remaster"
],
"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": "password",
"strategy": "generate-cryptographically-random-at-install",
"bindings": [
{
"service": "free-games-claimer-remaster",
"environment_variable": "PASSWORD"
}
]
},
{
"id": "vnc-password",
"strategy": "generate-cryptographically-random-at-install",
"bindings": [
{
"service": "free-games-claimer-remaster",
"environment_variable": "VNC_PASSWORD"
}
]
}
]
}
},
"first_run": {
"endpoints": [
{
"label": "noVNC browser session",
"scheme": "http",
"port": 7080,
"path": "/?autoconnect=true",
"source": "upstream-documentation"
}
],
"credentials": [
{
"label": "noVNC browser session (password only)",
"type": "configured-or-installer-generated",
"username": "Not required (password only)",
"password": null,
"password_environment": "VNC_PASSWORD",
"change_required": false,
"source": "upstream-documentation",
"retrieval": null
}
]
},
"proxmox": {
"runtime": "native-oci-lxc",
"technology_status": "proxmox-technology-preview",
"defaults": {
"unprivileged": true,
"ostype": "auto-from-image",
"cores": 2,
"memory_mb": 4096,
"swap_mb": 512,
"rootfs_size_gb": 16,
"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": "/fgc/data",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"generated_sensitive_environment": {
"VNC_PASSWORD": {
"strategy": "token-hex",
"bytes": 8,
"prompt": true
}
},
"tmpfs_mounts": [
{
"id": "compose-shm",
"container_path": "/dev/shm",
"default_size_mb": 1024,
"minimum_size_mb": 1,
"size_prompt": "Size of the /dev/shm shared memory in MB",
"mount_options": [
"rw",
"nosuid",
"nodev"
]
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 7080,
"path": "/",
"timeout_seconds": 300,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
}
}
},
"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",
"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
}
}
+472
View File
@@ -0,0 +1,472 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-mdblistarr",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "MDBListarr"
},
"tagline": {
"en_US": "MDBList lists synced to Radarr and Sonarr."
},
"description": {
"en_US": "Sends MDBList lists to Radarr and Sonarr and keeps the library status synced with MDBList."
},
"category": "arr",
"category_label": "*Arr Suite",
"author": "linaspurinis",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 5353,
"path": "/"
},
"website": "https://github.com/linaspurinis/mdblistarr",
"documentation": "https://github.com/linaspurinis/mdblistarr",
"repository": "https://github.com/linaspurinis/mdblistarr",
"tips": [
"Behind a hostname or a reverse proxy, set CSRF_TRUSTED_ORIGINS with the scheme and port, for example https://mdblistarr.example.com."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "linaspurinis",
"repository": "https://github.com/linaspurinis/mdblistarr",
"revision": "95f7aeae4a7234c09e8ba293e53fe6d5a51421600c6c19c0edcbe19761e64e3b",
"image_repository_url": "https://hub.docker.com/r/linaspurinis/mdblistarr",
"readme_pushed_at": "",
"compose_sha256": "95f7aeae4a7234c09e8ba293e53fe6d5a51421600c6c19c0edcbe19761e64e3b",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "mdblistarr",
"container_name": "mdblistarr",
"image": {
"reference": "linaspurinis/mdblistarr:latest",
"registry": "docker.io",
"repository": "linaspurinis/mdblistarr",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "PORT",
"example": "5353",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
},
{
"name": "TZ",
"example": "UTC",
"required": true,
"sensitive": false,
"source": "docker-compose"
},
{
"name": "CSRF_TRUSTED_ORIGINS",
"example": "",
"required": false,
"sensitive": false,
"source": "docker-compose",
"prompt": "Trusted origins for a hostname or reverse proxy, with scheme and port (optional)"
},
{
"name": "ALLOWED_HOSTS",
"example": "",
"required": false,
"sensitive": false,
"source": "docker-compose",
"prompt": "Allowed hostnames for a hostname or reverse proxy (optional)"
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/usr/src/db",
"compose_source_example": "./db",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 2
}
}
],
"ports": [
{
"container_port": 5353,
"published_example": 5353,
"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: mdblistarr\nservices:\n mdblistarr:\n environment:\n ALLOWED_HOSTS: ''\n CSRF_TRUSTED_ORIGINS: ''\n PORT: '5353'\n TZ: UTC\n image: linaspurinis/mdblistarr:latest\n ports:\n - 5353:5353\n volumes:\n - ./db:/usr/src/db\n"
},
"compose_stack": {
"project_name": "mdblistarr",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "mdblistarr",
"service_count": 1,
"services": [
{
"name": "mdblistarr",
"image": "linaspurinis/mdblistarr:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"ALLOWED_HOSTS": "",
"CSRF_TRUSTED_ORIGINS": "",
"PORT": "5353",
"TZ": "UTC"
},
"image": "linaspurinis/mdblistarr:latest",
"ports": [
"5353:5353"
],
"volumes": [
"./db:/usr/src/db"
]
}
}
],
"top_level": {
"name": "mdblistarr"
},
"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": "mdblistarr-volume-0",
"service": "mdblistarr",
"container_path": "/usr/src/db",
"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": [
"mdblistarr"
],
"stop_order": [
"mdblistarr"
],
"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": "MDBListarr",
"scheme": "http",
"port": 5353,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": []
},
"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": "/usr/src/db",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 5353,
"path": "/",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
}
}
},
"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",
"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
}
}
+472
View File
@@ -0,0 +1,472 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-poznote",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Poznote"
},
"tagline": {
"en_US": "Note-taking with tags, workspaces, attachments and a REST API."
},
"description": {
"en_US": "Self-hosted notes with rich text and Markdown, tags, workspaces, attachments, sharing and a REST API."
},
"category": "documents",
"category_label": "Documents & Notes",
"author": "timothepoznanski",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/poznote.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 80,
"path": "/"
},
"website": "https://github.com/timothepoznanski/poznote",
"documentation": "https://github.com/timothepoznanski/poznote",
"repository": "https://github.com/timothepoznanski/poznote",
"tips": [
"Rename the administrator and change its password after the first sign-in.",
"The optional MCP server for AI assistants is a separate image and is not installed."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "timothepoznanski",
"repository": "https://github.com/timothepoznanski/poznote",
"revision": "9f705967a76b9c4f652728538cd3c70e3208146bca1ee7a3ceb16c3b17a778ec",
"image_repository_url": "https://ghcr.io/timothepoznanski/poznote",
"readme_pushed_at": "",
"compose_sha256": "9f705967a76b9c4f652728538cd3c70e3208146bca1ee7a3ceb16c3b17a778ec",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "poznote",
"container_name": "poznote",
"image": {
"reference": "ghcr.io/timothepoznanski/poznote:latest",
"registry": "ghcr.io",
"repository": "ghcr.io/timothepoznanski/poznote",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "SQLITE_DATABASE",
"example": "/var/www/html/data/database/poznote.db",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/var/www/html/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": 80,
"published_example": 80,
"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: poznote\nservices:\n poznote:\n environment:\n SQLITE_DATABASE: /var/www/html/data/database/poznote.db\n image: ghcr.io/timothepoznanski/poznote:latest\n ports:\n - 80:80\n volumes:\n - ./data:/var/www/html/data\n"
},
"compose_stack": {
"project_name": "poznote",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "poznote",
"service_count": 1,
"services": [
{
"name": "poznote",
"image": "ghcr.io/timothepoznanski/poznote:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"SQLITE_DATABASE": "/var/www/html/data/database/poznote.db"
},
"image": "ghcr.io/timothepoznanski/poznote:latest",
"ports": [
"80:80"
],
"volumes": [
"./data:/var/www/html/data"
]
}
}
],
"top_level": {
"name": "poznote"
},
"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": "poznote-volume-0",
"service": "poznote",
"container_path": "/var/www/html/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": 1,
"start_order": [
"poznote"
],
"stop_order": [
"poznote"
],
"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": "Poznote",
"scheme": "http",
"port": 80,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": [
{
"label": "Poznote administrator",
"type": "static-default",
"username": "admin_change_me",
"password": "admin",
"change_required": true,
"source": "upstream-documentation",
"retrieval": null
}
]
},
"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": "/var/www/html/data",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 80,
"path": "/api/health",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"stability_seconds": 4,
"verify_tls": false
},
"tmpfs_mounts": [
{
"id": "nginx-runtime",
"container_path": "/run/nginx",
"default_size_mb": 1,
"minimum_size_mb": 1,
"prompt_size": false,
"mount_options": [
"rw",
"nosuid",
"nodev",
"mode=0755"
]
}
]
}
},
"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",
"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
}
}
+432
View File
@@ -0,0 +1,432 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-statping",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Statping"
},
"tagline": {
"en_US": "Status page and uptime monitoring."
},
"description": {
"en_US": "Status page that monitors websites and services and records their uptime and response times."
},
"category": "monitoring",
"category_label": "Monitoring & Analytics",
"author": "dockurr",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/statping-ng.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": 8080,
"path": "/"
},
"website": "https://github.com/dockur/statping",
"documentation": "https://github.com/dockur/statping",
"repository": "https://github.com/dockur/statping",
"tips": [],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/statping",
"revision": "de7e093e020ba3581f4ca30d7497d38d0fd2b94fb625c33b0016b8bc7399ed1b",
"image_repository_url": "https://hub.docker.com/r/dockurr/statping",
"readme_pushed_at": "",
"compose_sha256": "de7e093e020ba3581f4ca30d7497d38d0fd2b94fb625c33b0016b8bc7399ed1b",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "statping",
"container_name": "statping",
"image": {
"reference": "dockurr/statping:latest",
"registry": "docker.io",
"repository": "dockurr/statping",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [],
"volumes": [
{
"id": "volume-0",
"container_path": "/app",
"compose_source_example": "./app",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 4
}
}
],
"ports": [
{
"container_port": 8080,
"published_example": 8080,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: statping\nservices:\n statping:\n image: dockurr/statping:latest\n ports:\n - 8080:8080\n volumes:\n - ./app:/app\n"
},
"compose_stack": {
"project_name": "statping",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "statping",
"service_count": 1,
"services": [
{
"name": "statping",
"image": "dockurr/statping:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"image": "dockurr/statping:latest",
"ports": [
"8080:8080"
],
"volumes": [
"./app:/app"
]
}
}
],
"top_level": {
"name": "statping"
},
"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": "statping-volume-0",
"service": "statping",
"container_path": "/app",
"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": [
"statping"
],
"stop_order": [
"statping"
],
"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": "Statping",
"scheme": "http",
"port": 8080,
"path": "/",
"source": "upstream-documentation"
}
],
"credentials": []
},
"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": 120
},
"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": "/app",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"startup_healthcheck": {
"scheme": "http",
"port": 8080,
"path": "/",
"timeout_seconds": 180,
"request_timeout_seconds": 10,
"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",
"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
}
}
+426
View File
@@ -0,0 +1,426 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-strfry",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "strfry"
},
"tagline": {
"en_US": "Nostr relay."
},
"description": {
"en_US": "High-performance relay for the Nostr protocol, served over WebSocket."
},
"category": "communication",
"category_label": "Communication & Community",
"author": "dockurr",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/strfry",
"documentation": "https://github.com/dockur/strfry",
"repository": "https://github.com/dockur/strfry",
"tips": [
"Nostr WebSocket relay on port 7777, not a web administration interface. Uses the config shipped in /app/strfry.conf. Public wss://, relay identity and authentication policy are instance-specific."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/strfry",
"revision": "28860d6d13a116d230361d55f62133b5d4b737bc7227c6d6e94888c3f0a8897f",
"image_repository_url": "https://hub.docker.com/r/dockurr/strfry",
"readme_pushed_at": "",
"compose_sha256": "28860d6d13a116d230361d55f62133b5d4b737bc7227c6d6e94888c3f0a8897f",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "strfry",
"container_name": "strfry",
"image": {
"reference": "dockurr/strfry:latest",
"registry": "docker.io",
"repository": "dockurr/strfry",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [],
"volumes": [
{
"id": "volume-0",
"container_path": "/app/strfry-db",
"compose_source_example": "./strfry-db",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 16
}
}
],
"ports": [
{
"container_port": 7777,
"published_example": 7777,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: strfry\nservices:\n strfry:\n image: dockurr/strfry:latest\n ports:\n - 7777:7777\n volumes:\n - ./strfry-db:/app/strfry-db\n"
},
"compose_stack": {
"project_name": "strfry",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "strfry",
"service_count": 1,
"services": [
{
"name": "strfry",
"image": "dockurr/strfry:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"image": "dockurr/strfry:latest",
"ports": [
"7777:7777"
],
"volumes": [
"./strfry-db:/app/strfry-db"
]
}
}
],
"top_level": {
"name": "strfry"
},
"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": "strfry-volume-0",
"service": "strfry",
"container_path": "/app/strfry-db",
"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": [
"strfry"
],
"stop_order": [
"strfry"
],
"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": [],
"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": 120
},
"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": "/app/strfry-db",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
],
"resources": {
"rlimits": [
{
"name": "nofile",
"soft": "524288",
"hard": "524288"
}
]
}
}
},
"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",
"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
}
}
+456
View File
@@ -0,0 +1,456 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-stunnel",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Stunnel"
},
"tagline": {
"en_US": "TLS tunnel for a TCP service."
},
"description": {
"en_US": "Wraps a TCP service in TLS, such as DNS over TLS on port 853 in front of a DNS server."
},
"category": "security",
"category_label": "Authentication & Security",
"author": "dockurr",
"developer": null,
"icon": null,
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/stunnel",
"documentation": "https://github.com/dockur/stunnel",
"repository": "https://github.com/dockur/stunnel",
"tips": [
"TLS server on port 853 forwarding TCP to the configured destination. Upstream creates a self-signed certificate when none is supplied; no public-trust certificate is implied. No web interface."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/stunnel",
"revision": "a2553faeb5fc4dae333578e70d38f474c5f2504aafd8a5a7ca7cc4648751e84b",
"image_repository_url": "https://hub.docker.com/r/dockurr/stunnel",
"readme_pushed_at": "",
"compose_sha256": "a2553faeb5fc4dae333578e70d38f474c5f2504aafd8a5a7ca7cc4648751e84b",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "stunnel",
"container_name": "stunnel",
"image": {
"reference": "dockurr/stunnel:latest",
"registry": "docker.io",
"repository": "dockurr/stunnel",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [
{
"name": "LISTEN_PORT",
"example": "853",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
},
{
"name": "CONNECT_HOST",
"example": "",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Destination server address for the TLS tunnel"
},
{
"name": "CONNECT_PORT",
"example": "",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt": "Destination TCP port for the TLS tunnel"
},
{
"name": "CLIENT",
"example": "no",
"required": true,
"sensitive": false,
"source": "docker-compose",
"prompt_user": false
}
],
"volumes": [
{
"id": "volume-0",
"container_path": "/etc/stunnel",
"compose_source_example": "./stunnel",
"read_only": false,
"required": true,
"installation_choice": [
"managed-volume",
"host-bind"
],
"default": "managed-volume",
"managed_volume": {
"backup": true,
"default_size_gb": 1
}
}
],
"ports": [
{
"container_port": 853,
"published_example": 853,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: stunnel\nservices:\n stunnel:\n environment:\n CLIENT: 'no'\n CONNECT_HOST: ''\n CONNECT_PORT: ''\n LISTEN_PORT: '853'\n image: dockurr/stunnel:latest\n ports:\n - 853:853\n volumes:\n - ./stunnel:/etc/stunnel\n"
},
"compose_stack": {
"project_name": "stunnel",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "stunnel",
"service_count": 1,
"services": [
{
"name": "stunnel",
"image": "dockurr/stunnel:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"environment": {
"CLIENT": "no",
"CONNECT_HOST": "",
"CONNECT_PORT": "",
"LISTEN_PORT": "853"
},
"image": "dockurr/stunnel:latest",
"ports": [
"853:853"
],
"volumes": [
"./stunnel:/etc/stunnel"
]
}
}
],
"top_level": {
"name": "stunnel"
},
"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": "stunnel-volume-0",
"service": "stunnel",
"container_path": "/etc/stunnel",
"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": [
"stunnel"
],
"stop_order": [
"stunnel"
],
"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": [],
"credentials": []
},
"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": 120
},
"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": "/etc/stunnel",
"remove_lost_found": true,
"owner_strategy": "mapped-application-user",
"only_when_mount_type": "managed-volume"
}
]
}
},
"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",
"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
}
}
+391
View File
@@ -0,0 +1,391 @@
{
"schema_version": "0.5.0",
"kind": "proxmenux.oci-template",
"id": "image-tor",
"status": "generated-unvalidated",
"catalog_ui": {
"title": {
"en_US": "Tor"
},
"tagline": {
"en_US": "Tor SOCKS5 and HTTP proxy."
},
"description": {
"en_US": "Sends the traffic of the applications configured to use it through the Tor network, over SOCKS5 or HTTP CONNECT."
},
"category": "remote",
"category_label": "Remote Access & VPN",
"author": "dockurr",
"developer": null,
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tor.webp",
"thumbnail": null,
"screenshots": [],
"architectures": [
"amd64",
"arm64"
],
"launch": {
"scheme": "http",
"port": null,
"path": "/"
},
"website": "https://github.com/dockur/tor",
"documentation": "https://github.com/dockur/tor",
"repository": "https://github.com/dockur/tor",
"tips": [
"SOCKS5: port 9050. HTTP proxy: port 8118. The control port is not published; the upstream default binds it to loopback. No web administration interface. Restrict client access with the LXC firewall."
],
"mini_changelog": [],
"display_version": null,
"updated_at": null
},
"source": {
"provider": "dockurr",
"repository": "https://github.com/dockur/tor",
"revision": "fdf5487c08c59658ac85ea79ae2c11fa171d219923bb4f7fbc94b322a5c56327",
"image_repository_url": "https://hub.docker.com/r/dockurr/tor",
"readme_pushed_at": "",
"compose_sha256": "fdf5487c08c59658ac85ea79ae2c11fa171d219923bb4f7fbc94b322a5c56327",
"generated_at": "2026-10-25T11:56:35+00:00"
},
"container_contract": {
"service_name": "tor",
"container_name": "tor",
"image": {
"reference": "dockurr/tor:latest",
"registry": "docker.io",
"repository": "dockurr/tor",
"tag": "latest",
"digest": null,
"pull_policy": "resolve-written-reference-to-architecture-digest-at-install"
},
"environment": [],
"volumes": [],
"ports": [
{
"container_port": 9050,
"published_example": 9050,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
},
{
"container_port": 8118,
"published_example": 8118,
"protocol": "tcp",
"required": true,
"proxmox_behavior": "listener-on-dedicated-lxc-address-no-nat"
}
],
"related_services": [],
"restart": "always",
"stop_grace_period": "2m",
"original_compose": "name: tor\nservices:\n tor:\n image: dockurr/tor:latest\n ports:\n - 9050:9050\n - 8118:8118\n"
},
"compose_stack": {
"project_name": "tor",
"deployment_model": "one-native-oci-lxc-per-compose-service",
"user_experience": "single-application-install",
"main_service": "tor",
"service_count": 1,
"services": [
{
"name": "tor",
"image": "dockurr/tor:latest",
"is_main": true,
"role": "frontend",
"vmid_offset": 0,
"depends_on": [],
"frontend_network": true,
"private_network": false,
"compose": {
"image": "dockurr/tor:latest",
"ports": [
"9050:9050",
"8118:8118"
]
}
}
],
"top_level": {
"name": "tor"
},
"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": [],
"orchestration": {
"reserve_vmids_atomically": 1,
"start_order": [
"tor"
],
"stop_order": [
"tor"
],
"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": [],
"credentials": []
},
"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": 120
},
"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": {
"completion_notes": [
"Tor is a proxy, not a website. It has no web interface.",
"SOCKS5 proxy: configure your application with the LXC IP address shown above and port 9050.",
"HTTP CONNECT proxy: use the same IP address and port 8118. These addresses are proxy settings, not web links.",
"Only applications configured to use this proxy send their traffic through Tor."
]
}
},
"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",
"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
}
}
+14 -2
View File
@@ -1,8 +1,14 @@
{
"generated": [
"acestream-http-proxy",
"chrony",
"cloudreve",
"crosswatch",
"dnsmasq",
"duplicati-official",
"emby-official",
"fileflows",
"free-games-claimer-remaster",
"frigate",
"haos-one",
"immich",
@@ -10,6 +16,7 @@
"jellyfin-official",
"llamacpp",
"makemkv",
"mdblistarr",
"mkvtoolnix",
"nextcloud-stack",
"nut-server",
@@ -18,12 +25,17 @@
"open-webui-ollama",
"paperless-ngx",
"plex-official",
"poznote",
"rclone",
"roonserver",
"statping",
"stremio",
"tandoor"
"strfry",
"stunnel",
"tandoor",
"tor"
],
"generated_count": 22,
"generated_count": 34,
"failed": [],
"failed_count": 0
}
+383
View File
@@ -40,6 +40,37 @@
"hidden": false,
"template_id": "image-2fauth"
},
{
"id": "acestream-http-proxy",
"provider": "martinbjeldbak",
"template_family": "curated-profile",
"title": "AceStream HTTP Proxy",
"repository": "https://github.com/martinbjeldbak/acestream-http-proxy",
"description": "Runs the AceStream engine and serves its streams over HTTP as HLS or MPEG-TS, for players such as VLC.",
"website": "https://github.com/martinbjeldbak/acestream-http-proxy",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ace-stream.webp",
"architectures": [
"amd64"
],
"updated_at": null,
"main_image": "ghcr.io/martinbjeldbak/acestream-http-proxy:latest",
"category": "media",
"category_label": "Media & Streaming",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/acestream-http-proxy.json",
"template": "apps/acestream-http-proxy.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-acestream-http-proxy"
},
{
"id": "actualbudget",
"source_app_id": "actualbudget",
@@ -1415,6 +1446,38 @@
"hidden": false,
"template_id": "linuxserver-chromium"
},
{
"id": "chrony",
"provider": "dockurr",
"template_family": "curated-profile",
"title": "Chrony",
"repository": "https://github.com/dockur/chrony",
"description": "Serves NTP time to the network from upstream servers, without adjusting the clock of the Proxmox host.",
"website": "https://github.com/dockur/chrony",
"icon": null,
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "dockurr/chrony:latest",
"category": "network",
"category_label": "Network & Firewall",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/chrony.json",
"template": "apps/chrony.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-chrony"
},
{
"id": "cloudbeaver",
"source_app_id": "cloudbeaver",
@@ -1487,6 +1550,38 @@
"hidden": false,
"template_id": "image-cloudflared"
},
{
"id": "cloudreve",
"provider": "official",
"template_family": "curated-profile",
"title": "Cloudreve",
"repository": "https://github.com/cloudreve/Cloudreve",
"description": "File management and sharing with WebDAV, multiple users and storage on local disks, S3-compatible services or OneDrive.",
"website": "https://cloudreve.org/",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cloudreve.webp",
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "cloudreve/cloudreve:latest",
"category": "sharing",
"category_label": "Files & Sharing",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/cloudreve.json",
"template": "apps/cloudreve.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-cloudreve"
},
{
"id": "clumoove",
"source_app_id": "clumoove",
@@ -1731,6 +1826,38 @@
"hidden": false,
"template_id": "image-crafty"
},
{
"id": "crosswatch",
"provider": "cenodude",
"template_family": "curated-profile",
"title": "CrossWatch",
"repository": "https://github.com/cenodude/CrossWatch",
"description": "Syncs watch history, ratings and watchlists between Plex, Jellyfin, Emby and trackers such as Trakt and SIMKL.",
"website": "https://github.com/cenodude/CrossWatch",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/crosswatch.webp",
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "ghcr.io/cenodude/crosswatch:latest",
"category": "media",
"category_label": "Media & Streaming",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/crosswatch.json",
"template": "apps/crosswatch.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-crosswatch"
},
{
"id": "cura",
"provider": "linuxserver.io",
@@ -2149,6 +2276,38 @@
"hidden": true,
"template_id": "linuxserver-diskover"
},
{
"id": "dnsmasq",
"provider": "dockurr",
"template_family": "curated-profile",
"title": "Dnsmasq",
"repository": "https://github.com/dockur/dnsmasq",
"description": "Forwards and caches DNS queries for the network through the upstream servers chosen.",
"website": "https://github.com/dockur/dnsmasq",
"icon": null,
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "dockurr/dnsmasq:latest",
"category": "adblock",
"category_label": "Adblock & DNS",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/dnsmasq.json",
"template": "apps/dnsmasq.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-dnsmasq"
},
{
"id": "docker-volume-backup",
"provider": "mrcaringi",
@@ -3349,6 +3508,38 @@
"hidden": false,
"template_id": "linuxserver-foldingathome"
},
{
"id": "free-games-claimer-remaster",
"provider": "p-adamiec",
"template_family": "curated-profile",
"title": "Free Games Claimer Remaster",
"repository": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"description": "Claims free games and giveaways from Steam, Epic Games, Prime Gaming, GOG and other stores on a schedule, with a browser reachable over noVNC to sign in.",
"website": "https://github.com/P-Adamiec/Free-Games-Claimer-Remaster",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/free-games-claimer.webp",
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "ghcr.io/p-adamiec/free-games-claimer-remaster:latest",
"category": "gaming",
"category_label": "Gaming & Leisure",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/free-games-claimer-remaster.json",
"template": "apps/free-games-claimer-remaster.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-free-games-claimer-remaster"
},
{
"id": "freecad",
"provider": "linuxserver.io",
@@ -6071,6 +6262,38 @@
"hidden": true,
"template_id": "image-maybe"
},
{
"id": "mdblistarr",
"provider": "linaspurinis",
"template_family": "curated-profile",
"title": "MDBListarr",
"repository": "https://github.com/linaspurinis/mdblistarr",
"description": "Sends MDBList lists to Radarr and Sonarr and keeps the library status synced with MDBList.",
"website": "https://github.com/linaspurinis/mdblistarr",
"icon": null,
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "linaspurinis/mdblistarr:latest",
"category": "arr",
"category_label": "*Arr Suite",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/mdblistarr.json",
"template": "apps/mdblistarr.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-mdblistarr"
},
{
"id": "mediaelch",
"provider": "linuxserver.io",
@@ -8739,6 +8962,38 @@
"hidden": false,
"template_id": "image-postgresql"
},
{
"id": "poznote",
"provider": "timothepoznanski",
"template_family": "curated-profile",
"title": "Poznote",
"repository": "https://github.com/timothepoznanski/poznote",
"description": "Self-hosted notes with rich text and Markdown, tags, workspaces, attachments, sharing and a REST API.",
"website": "https://github.com/timothepoznanski/poznote",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/poznote.webp",
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "ghcr.io/timothepoznanski/poznote:latest",
"category": "documents",
"category_label": "Documents & Notes",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/poznote.json",
"template": "apps/poznote.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-poznote"
},
{
"id": "ppsspp",
"provider": "linuxserver.io",
@@ -10294,6 +10549,38 @@
"hidden": false,
"template_id": "image-stable-diffusion-webui-nvidia"
},
{
"id": "statping",
"provider": "dockurr",
"template_family": "curated-profile",
"title": "Statping",
"repository": "https://github.com/dockur/statping",
"description": "Status page that monitors websites and services and records their uptime and response times.",
"website": "https://github.com/dockur/statping",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/statping-ng.webp",
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "dockurr/statping:latest",
"category": "monitoring",
"category_label": "Monitoring & Analytics",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/statping.json",
"template": "apps/statping.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-statping"
},
{
"id": "steam",
"provider": "linuxserver.io",
@@ -10359,6 +10646,70 @@
"hidden": false,
"template_id": "image-stremio"
},
{
"id": "strfry",
"provider": "dockurr",
"template_family": "curated-profile",
"title": "strfry",
"repository": "https://github.com/dockur/strfry",
"description": "High-performance relay for the Nostr protocol, served over WebSocket.",
"website": "https://github.com/dockur/strfry",
"icon": null,
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "dockurr/strfry:latest",
"category": "communication",
"category_label": "Communication & Community",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/strfry.json",
"template": "apps/strfry.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-strfry"
},
{
"id": "stunnel",
"provider": "dockurr",
"template_family": "curated-profile",
"title": "Stunnel",
"repository": "https://github.com/dockur/stunnel",
"description": "Wraps a TCP service in TLS, such as DNS over TLS on port 853 in front of a DNS server.",
"website": "https://github.com/dockur/stunnel",
"icon": null,
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "dockurr/stunnel:latest",
"category": "security",
"category_label": "Authentication & Security",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/stunnel.json",
"template": "apps/stunnel.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-stunnel"
},
{
"id": "suite-arr",
"provider": "linuxserver.io",
@@ -10980,6 +11331,38 @@
"hidden": false,
"template_id": "linuxserver-thunderbird"
},
{
"id": "tor",
"provider": "dockurr",
"template_family": "curated-profile",
"title": "Tor",
"repository": "https://github.com/dockur/tor",
"description": "Sends the traffic of the applications configured to use it through the Tor network, over SOCKS5 or HTTP CONNECT.",
"website": "https://github.com/dockur/tor",
"icon": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/tor.webp",
"architectures": [
"amd64",
"arm64"
],
"updated_at": null,
"main_image": "dockurr/tor:latest",
"category": "remote",
"category_label": "Remote Access & VPN",
"replaces_discovered_ids": [],
"curated_path": "catalog/curated/tor.json",
"template": "apps/tor.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-tor"
},
{
"id": "transmission",
"provider": "linuxserver.io",
+20 -2
View File
@@ -378,6 +378,7 @@ cleanup_failed_install() {
stop_spinner
cleanup_volume_seed_staging || true
cleanup_canonical_inputs || true
[[ -z ${USER_DATABASES_ARCHIVE:-} ]] || rm -f "$USER_DATABASES_ARCHIVE" "${USER_DATABASES_ARCHIVE}.partial"
if [[ -n ${PROXMENUX_OCI_TRANSACTION:-} ]]; then
# The transaction owns recovery. Destroying this CT could destroy reused data.
cleanup_runtime_console_log || true
@@ -1757,8 +1758,25 @@ fi
# pct keeps the OCI Entrypoint/Cmd/Env/User/WorkingDir/StopSignal metadata.
msg_info "$(translate "Creating the container...")"
oci_create_container "${CREATE_ARGS[@]}" \
|| die "$(translate "Could not create the container:") CT $VMID"
# Proxmox resolves the image User through /etc/passwd and /etc/group, even a
# numeric one, and cannot create the container from an image without them.
user_databases_rc=0
missing_user_databases=$(python3 "$OCI_RUNTIME_RESOLVER" --user-databases "$ARCHIVE_PATH" \
2>>"${OCI_LOG:-/dev/stderr}") || user_databases_rc=$?
if (( user_databases_rc == 3 )); then
oci_log "The image declares a user but lacks: ${missing_user_databases}"
# A numeric User is created from a copy with those files; the cached image
# and its digest stay as they were downloaded.
USER_DATABASES_ARCHIVE="${ARCHIVE_PATH%.tar}.user-databases.$$.tar"
python3 "$OCI_RUNTIME_RESOLVER" --add-user-databases "$ARCHIVE_PATH" "$USER_DATABASES_ARCHIVE" \
>>"${OCI_LOG:-/dev/null}" 2>&1 \
|| die "$(translate "Proxmox VE cannot create a container from this image: it declares a user but does not include /etc/passwd and /etc/group. Nothing was created.")"
CREATE_ARGS[1]=$USER_DATABASES_ARCHIVE
fi
create_status=0
oci_create_container "${CREATE_ARGS[@]}" || create_status=$?
[[ -z ${USER_DATABASES_ARCHIVE:-} ]] || rm -f "$USER_DATABASES_ARCHIVE"
(( create_status == 0 )) || die "$(translate "Could not create the container:") CT $VMID"
CT_CREATED=1
msg_ok "$(translate "Container created:") CT $VMID ($HOSTNAME)"
+157
View File
@@ -3,12 +3,17 @@
from __future__ import annotations
import hashlib
import io
import json
import os
import shlex
import shutil
import stat
import subprocess
import sys
import tarfile
import threading
from pathlib import Path
from typing import Any
@@ -59,6 +64,141 @@ def image_entrypoint(archive_path: Path) -> list[str]:
return entrypoint
def _layer_entries(archive: tarfile.TarFile, descriptor: dict[str, Any]):
"""Names in one image layer, decompressed as its media type says."""
member = _member(archive, _blob_name(str(descriptor["digest"])))
source = archive.extractfile(member)
if source is None:
raise RuntimeResolutionError(f"{translate('Cannot read')} {member.name}")
media = str(descriptor.get("mediaType", ""))
if "zstd" in media:
process = subprocess.Popen(["zstd", "-dc"], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL)
feeder = threading.Thread(target=lambda: (shutil.copyfileobj(source, process.stdin), process.stdin.close()),
daemon=True)
feeder.start()
try:
with tarfile.open(fileobj=process.stdout, mode="r|") as layer:
for item in layer:
yield item
finally:
process.stdout.close()
process.wait()
feeder.join()
return
with tarfile.open(fileobj=source, mode="r|gz" if "gzip" in media else "r|") as layer:
for item in layer:
yield item
def missing_user_databases(archive_path: Path) -> list[str]:
"""Files Proxmox needs to resolve the image User, absent from its rootfs.
Proxmox VE resolves a User through /etc/passwd and /etc/group inside the
image, even a numeric one, and refuses to create the container without
them. An image built from scratch often has neither."""
with tarfile.open(archive_path, mode="r:*") as archive:
index = _json_member(archive, "index.json")
manifests = index.get("manifests") or []
if len(manifests) != 1:
raise RuntimeResolutionError(translate("The OCI archive does not contain exactly one manifest"))
manifest = _json_member(archive, _blob_name(str(manifests[0]["digest"])))
config = _json_member(archive, _blob_name(str(manifest["config"]["digest"])))
if not (config.get("config") or {}).get("User"):
return []
state = {"etc/passwd": None, "etc/group": None}
# The topmost layer that names a path decides whether it exists.
for descriptor in reversed(manifest.get("layers") or []):
pending = [path for path, found in state.items() if found is None]
if not pending:
break
names = {item.name.removeprefix("./").strip("/") for item in _layer_entries(archive, descriptor)}
for path in pending:
folder, _, leaf = path.rpartition("/")
if path in names:
state[path] = True
elif (f"{folder}/.wh.{leaf}" in names or f"{folder}/.wh..wh..opq" in names
or f".wh.{folder}" in names):
state[path] = False
return ["/" + path for path, found in state.items() if not found]
USER_DATABASES = {
"etc/passwd": b"root:x:0:0:root:/root:/sbin/nologin\n",
"etc/group": b"root:x:0:\n",
}
def _tar_entry(name: str, kind: bytes, mode: int, size: int = 0) -> tarfile.TarInfo:
entry = tarfile.TarInfo(name)
entry.type, entry.mode, entry.size = kind, mode, size
entry.uid = entry.gid = entry.mtime = 0
entry.uname = entry.gname = "root"
return entry
def add_user_databases(source: Path, destination: Path) -> list[str]:
"""Copy of an image with a top layer that adds the /etc/passwd and
/etc/group it lacks, holding only root.
Only a numeric User is resolved this way: Proxmox VE then applies the
UID and GID as given, as Docker does for a user absent from the image."""
missing = missing_user_databases(source)
if not missing:
return []
with tarfile.open(source, mode="r:*") as archive:
index = _json_member(archive, "index.json")
manifest_descriptor = (index.get("manifests") or [{}])[0]
manifest = _json_member(archive, _blob_name(str(manifest_descriptor["digest"])))
config = _json_member(archive, _blob_name(str(manifest["config"]["digest"])))
user = str((config.get("config") or {}).get("User", ""))
if not all(part.isdigit() for part in user.split(":", 1)):
raise RuntimeResolutionError(translate("The image user is not numeric:") + " " + user)
layer = io.BytesIO()
with tarfile.open(fileobj=layer, mode="w", format=tarfile.PAX_FORMAT) as files:
files.addfile(_tar_entry("etc", tarfile.DIRTYPE, 0o755))
for path in missing:
body = USER_DATABASES[path.lstrip("/")]
files.addfile(_tar_entry(path.lstrip("/"), tarfile.REGTYPE, 0o644, len(body)), io.BytesIO(body))
blobs: dict[str, bytes] = {}
def blob(data: bytes) -> dict[str, Any]:
digest = "sha256:" + hashlib.sha256(data).hexdigest()
blobs[digest] = data
return {"digest": digest, "size": len(data)}
layer_data = layer.getvalue()
docker = "docker" in str(manifest.get("mediaType", ""))
layer_descriptor = blob(layer_data)
layer_descriptor["mediaType"] = ("application/vnd.docker.image.rootfs.diff.tar" if docker
else "application/vnd.oci.image.layer.v1.tar")
config.setdefault("rootfs", {"type": "layers", "diff_ids": []}).setdefault("diff_ids", []).append(
layer_descriptor["digest"])
if isinstance(config.get("history"), list):
config["history"].append({"created_by": "ProxMenux: " + " ".join(missing) + " for Proxmox VE"})
manifest["layers"] = list(manifest.get("layers") or []) + [layer_descriptor]
manifest["config"] = {**manifest["config"], **blob(json.dumps(config).encode())}
index["manifests"] = [{**manifest_descriptor, **blob(json.dumps(manifest).encode())}]
index_data = json.dumps(index).encode()
partial = destination.with_name(destination.name + ".partial")
try:
with tarfile.open(partial, mode="w", format=tarfile.PAX_FORMAT) as output:
for member in archive:
if member.name.removeprefix("./") == "index.json":
continue
output.addfile(member, archive.extractfile(member) if member.isfile() else None)
for digest, data in blobs.items():
output.addfile(_tar_entry(_blob_name(digest), tarfile.REGTYPE, 0o644, len(data)), io.BytesIO(data))
output.addfile(_tar_entry("index.json", tarfile.REGTYPE, 0o644, len(index_data)),
io.BytesIO(index_data))
os.replace(partial, destination)
finally:
partial.unlink(missing_ok=True)
return missing
def _arguments(value: Any, label: str) -> list[str]:
if isinstance(value, str):
return shlex.split(value)
@@ -139,6 +279,23 @@ def main() -> int:
return 1
print(home)
return 0
if len(sys.argv) == 3 and sys.argv[1] == "--user-databases":
try:
missing = missing_user_databases(Path(sys.argv[2]))
except (OSError, tarfile.TarError, json.JSONDecodeError, KeyError, RuntimeResolutionError) as exc:
print(f"{translate('Cannot read the OCI archive:')} {exc}", file=sys.stderr)
return 1
if missing:
print(" ".join(missing))
return 3
return 0
if len(sys.argv) == 4 and sys.argv[1] == "--add-user-databases":
try:
print(" ".join(add_user_databases(Path(sys.argv[2]), Path(sys.argv[3]))))
except (OSError, tarfile.TarError, json.JSONDecodeError, KeyError, RuntimeResolutionError) as exc:
print(f"{translate('Cannot prepare the OCI archive:')} {exc}", file=sys.stderr)
return 1
return 0
if len(sys.argv) not in (3, 4):
print(
f"{translate('Usage:')} {sys.argv[0]} OCI_ARCHIVE COMMAND_JSON [ENTRYPOINT_JSON]",
+19 -4
View File
@@ -26,6 +26,7 @@ UNIT_FILE = Path('/etc/systemd/system') / UNIT
JOURNAL = Path('/usr/local/share/proxmenux/scripts/global/pmx_journal.sh')
CGROUPS = Path('/sys/fs/cgroup/lxc')
CONFIGS = Path('/etc/pve/lxc')
STACK_CONTRACTS = Path('/etc/pve/priv')
HA_RESOURCES = Path('/etc/pve/ha/resources.cfg')
TASKS = (Path('/var/log/pve/tasks/active'), Path('/var/log/pve/tasks/index'))
INTERVAL = 10
@@ -137,13 +138,27 @@ def is_running(vmid):
return (CGROUPS / str(vmid)).is_dir()
def is_busy(vmid, now):
"""Something is working on the container or on the host: look again later."""
def is_locked(vmid, missing=True):
try:
config = (CONFIGS / f'{vmid}.conf').read_text(errors='replace')
except OSError:
return True
if any(line.startswith('lock:') for line in config.split('\n[', 1)[0].splitlines()):
return missing
return any(line.startswith('lock:') for line in config.split('\n[', 1)[0].splitlines())
def dependencies(vmid):
"""The containers the hook of a multi-container application starts first."""
try:
contract = json.loads((STACK_CONTRACTS / f'proxmenux-stack-{vmid}.json').read_text())
return [int(item['vmid']) for item in contract.get('dependencies', [])]
except (OSError, ValueError, TypeError, KeyError, AttributeError):
return []
def is_busy(vmid, now):
"""Something is working on the container, on a container it depends on,
such as a backup, or on the host: look again later."""
if is_locked(vmid) or any(is_locked(dependency, missing=False) for dependency in dependencies(vmid)):
return True
try:
mark = json.loads((oci_operation_notice.MARKERS / str(vmid)).read_text())
+74 -4
View File
@@ -3,6 +3,19 @@ set -Eeuo pipefail
PATH=/usr/sbin:/usr/bin:/sbin:/bin
HOOK_NAME=proxmenux-stack-dependencies.sh
# Longest wait for a dependency that is being backed up, and for any other lock.
BACKUP_LOCK_WAIT=${PROXMENUX_STACK_BACKUP_LOCK_WAIT:-14400}
OTHER_LOCK_WAIT=${PROXMENUX_STACK_OTHER_LOCK_WAIT:-300}
# vzdump starts again a guest that was running before its backup right after releasing it.
RESTART_GRACE=${PROXMENUX_STACK_RESTART_GRACE:-20}
POLL=${PROXMENUX_STACK_POLL:-5}
# Earlier published versions of this script, replaced on update.
PREVIOUS_RELEASES=(
c28b69acd7cc8e66d3aec3e8b2ec86bda0e4f91193ec78549f1965f2c859c0d1
02c50ef17f2411ef22f4d382c51b34a7a0974a446d4a155ecb63fb1e805a7c59
)
die() {
printf 'ERROR: %s\n' "$*" >&2
exit 1
@@ -51,7 +64,7 @@ install_hook() {
' "$source_config" >/dev/null || die "Invalid dependency contract"
storage=$(find_snippet_storage)
hook_volume="${storage}:snippets/proxmenux-stack-dependencies.sh"
hook_volume="${storage}:snippets/${HOOK_NAME}"
hook_path=$(pvesm path "$hook_volume")
install -D -m 0755 "$0" "$hook_path"
@@ -63,6 +76,57 @@ install_hook() {
"$main_id" "$hook_volume"
}
# The installed copies of an earlier release take this version; a copy
# changed by hand is left as it is.
refresh_hooks() {
local volume path current known
while IFS= read -r volume; do
path=$(pvesm path "$volume" 2>/dev/null) || continue
[[ -f $path && ! -L $path ]] || continue
current=$(sha256sum "$path" | cut -d' ' -f1)
for known in "${PREVIOUS_RELEASES[@]}"; do
if [[ $current == "$known" ]]; then
install -m 0755 "$0" "$path.new" && mv -f "$path.new" "$path"
printf 'Updated %s\n' "$path"
break
fi
done
done < <(sed -n "s/^hookscript:[[:space:]]*\([^[:space:]]*:snippets\/${HOOK_NAME//./\\.}\)[[:space:]]*$/\1/p" \
/etc/pve/lxc/*.conf 2>/dev/null | sort -u)
}
is_running() {
[[ $(pct status "$1" 2>/dev/null || true) == "status: running" ]]
}
container_lock() {
pct config "$1" 2>/dev/null | sed -n '/^lock:/{s/^lock:[[:space:]]*//p;q;}' || true
}
# A dependency stopped for its own backup stays locked until vzdump has
# saved it, and vzdump starts it again when it was running before.
wait_for_release() {
local id=$1 label=$2 lock limit waited=0
lock=$(container_lock "$id")
[[ -n $lock ]] || return 0
limit=$OTHER_LOCK_WAIT
if [[ $lock == backup ]]; then
limit=$BACKUP_LOCK_WAIT
fi
printf 'Dependency %s (CT %s) is locked (%s); waiting until it is released...\n' "$label" "$id" "$lock"
while lock=$(container_lock "$id"); [[ -n $lock ]]; do
(( waited < limit )) || die "$label (CT $id) is still locked ($lock) after ${waited}s"
sleep "$POLL"
waited=$((waited + POLL))
done
printf 'Dependency %s (CT %s) was released.\n' "$label" "$id"
waited=0
while (( waited < RESTART_GRACE )) && ! is_running "$id"; do
sleep 2
waited=$((waited + 2))
done
}
dependency_is_healthy() {
local id=$1 healthcheck=$2 type url
type=$(jq -r '.type' <<<"$healthcheck")
@@ -74,7 +138,7 @@ dependency_is_healthy() {
local -a command=()
mapfile -t command < <(jq -r '.argv[]' <<<"$healthcheck")
((${#command[@]} > 0)) || return 1
pct exec "$id" -- "${command[@]}" >/dev/null 2>&1
pct exec "$id" -- "${command[@]}" >/dev/null 2>&1 9>&-
;;
http)
url=$(jq -r '.url' <<<"$healthcheck")
@@ -103,9 +167,11 @@ start_dependencies() {
pct config "$id" >/dev/null 2>&1 \
|| die "Dependency $label (CT $id) does not exist"
if [[ $(pct status "$id" 2>/dev/null || true) != "status: running" ]]; then
is_running "$id" || wait_for_release "$id" "$label"
if ! is_running "$id"; then
printf 'Starting dependency %s (CT %s)...\n' "$label" "$id"
pct start "$id" || die "Could not start $label (CT $id)"
# What pct start leaves running, such as the DHCP client, must not keep the lock.
pct start "$id" 9>&- || is_running "$id" || die "Could not start $label (CT $id)"
else
printf 'Dependency %s (CT %s) was already running.\n' "$label" "$id"
fi
@@ -131,6 +197,10 @@ if [[ ${1:-} == "--install" ]]; then
install_hook "$@"
exit 0
fi
if [[ ${1:-} == "--refresh" ]]; then
refresh_hooks
exit 0
fi
vmid=${1:?missing VMID}
phase=${2:?missing lifecycle phase}
+144
View File
@@ -0,0 +1,144 @@
"""The start hook of a multi-container application waits for a dependency
that is being backed up instead of failing the start."""
from __future__ import annotations
import json
import os
from pathlib import Path
import shutil
import subprocess
import tempfile
import unittest
ROOT = Path(__file__).resolve().parents[1]
HOOK = ROOT / "remote" / "stack_dependency_hook.sh"
PCT = r"""#!/bin/bash
state=$STUB_STATE
id=${2:-}
case $1 in
status) echo "status: $(cat "$state/$id.status")" ;;
config)
[[ -f $state/$id.status ]] || exit 2
echo "arch: amd64"
if [[ -f $state/$id.lock ]]; then
left=$(cat "$state/$id.left")
if (( left <= 0 )); then
rm -f "$state/$id.lock"
[[ -f $state/$id.restarted-by-vzdump ]] && echo running >"$state/$id.status"
else
echo $((left - 1)) >"$state/$id.left"
echo "lock: $(cat "$state/$id.lock")"
fi
fi
;;
start)
echo "start $id" >>"$state/calls"
if [[ -f $state/$id.lock ]]; then echo "CT is locked ($(cat "$state/$id.lock"))" >&2; exit 1; fi
echo running >"$state/$id.status"
# Like the DHCP client Proxmox leaves running for the container.
/bin/sleep 30 >/dev/null 2>&1 &
echo $! >>"$state/left-running"
;;
*) exit 0 ;;
esac
"""
@unittest.skipUnless(shutil.which("flock") and shutil.which("jq"), "needs flock and jq")
class StackDependencyHook(unittest.TestCase):
def setUp(self):
folder = tempfile.TemporaryDirectory()
self.addCleanup(folder.cleanup)
self.root = Path(folder.name)
self.state = self.root / "state"
bin_dir = self.root / "bin"
for directory in (self.state, bin_dir, self.root / "priv", self.root / "lock"):
directory.mkdir()
(bin_dir / "pct").write_text(PCT)
(bin_dir / "sleep").write_text("#!/bin/bash\nexit 0\n")
for name in ("pct", "sleep"):
(bin_dir / name).chmod(0o755)
script = HOOK.read_text()
for old, new in (("PATH=/usr/sbin:/usr/bin:/sbin:/bin", f"PATH={bin_dir}:{os.environ['PATH']}"),
("/etc/pve/priv/", f"{self.root}/priv/"), ("/run/lock/", f"{self.root}/lock/")):
self.assertIn(old, script)
script = script.replace(old, new)
self.hook = self.root / "hook.sh"
self.hook.write_text(script)
(self.root / "priv" / "proxmenux-stack-110.json").write_text(json.dumps({"schema": 1, "dependencies": [
{"vmid": 112, "label": "PostgreSQL", "healthcheck": {"type": "running", "timeout_seconds": 10}},
{"vmid": 111, "label": "Immich Machine Learning",
"healthcheck": {"type": "running", "timeout_seconds": 10}}]}))
for vmid in (110, 111, 112):
self.container(vmid, "running")
self.addCleanup(self.stop_left_running)
def stop_left_running(self):
path = self.state / "left-running"
for pid in path.read_text().split() if path.exists() else []:
subprocess.run(["kill", pid], capture_output=True)
def container(self, vmid, status, lock=None, polls=0, restarted_by_vzdump=False):
(self.state / f"{vmid}.status").write_text(status + "\n")
if lock:
(self.state / f"{vmid}.lock").write_text(lock + "\n")
(self.state / f"{vmid}.left").write_text(f"{polls}\n")
if restarted_by_vzdump:
(self.state / f"{vmid}.restarted-by-vzdump").touch()
def start(self, **environment):
env = dict(os.environ, STUB_STATE=str(self.state), **environment)
return subprocess.run(["bash", str(self.hook), "110", "pre-start"], capture_output=True, text=True, env=env)
def calls(self):
path = self.state / "calls"
return path.read_text().split("\n")[:-1] if path.exists() else []
def test_a_dependency_stopped_for_its_backup_is_waited_for_and_then_started(self):
self.container(111, "stopped", lock="backup", polls=3)
result = self.start()
self.assertEqual(result.returncode, 0, result.stderr)
self.assertIn("is locked (backup); waiting until it is released", result.stdout)
self.assertIn("Immich Machine Learning (CT 111): ready.", result.stdout)
self.assertEqual(self.calls(), ["start 111"])
def test_what_a_started_dependency_leaves_running_does_not_keep_the_lock(self):
self.container(111, "stopped")
result = self.start()
self.assertEqual(result.returncode, 0, result.stderr)
self.assertEqual(self.calls(), ["start 111"])
free = subprocess.run(["flock", "-n", str(self.root / "lock" / "proxmenux-stack-110.lock"), "true"])
self.assertEqual(free.returncode, 0)
def test_a_dependency_that_vzdump_starts_again_is_not_started_twice(self):
self.container(111, "stopped", lock="backup", polls=2, restarted_by_vzdump=True)
result = self.start()
self.assertEqual(result.returncode, 0, result.stderr)
self.assertEqual(self.calls(), [])
def test_a_lock_that_is_never_released_ends_the_wait(self):
self.container(111, "stopped", lock="mounted", polls=1000)
result = self.start(PROXMENUX_STACK_OTHER_LOCK_WAIT="20")
self.assertNotEqual(result.returncode, 0)
self.assertIn("is still locked (mounted) after 20s", result.stderr)
self.assertEqual(self.calls(), [])
def test_running_dependencies_are_not_waited_for(self):
self.container(112, "running", lock="backup", polls=1000)
result = self.start()
self.assertEqual(result.returncode, 0, result.stderr)
self.assertNotIn("waiting", result.stdout)
def test_updates_replace_only_published_copies_of_the_hook(self):
script = HOOK.read_text()
self.assertIn("--refresh", script)
for digest in ("c28b69acd7cc8e66d3aec3e8b2ec86bda0e4f91193ec78549f1965f2c859c0d1",
"02c50ef17f2411ef22f4d382c51b34a7a0974a446d4a155ecb63fb1e805a7c59"):
self.assertIn(digest, script)
for installer in ("install_proxmenux.sh", "install_proxmenux_beta.sh"):
self.assertIn("stack_dependency_hook.sh\" --refresh", (ROOT.parent / installer).read_text())
if __name__ == "__main__":
unittest.main()
+39
View File
@@ -0,0 +1,39 @@
"""Protocol-only services explain their addresses without inventing a web UI."""
import json
from pathlib import Path
import sys
import unittest
from unittest.mock import patch
ROOT=Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT/'src'))
from proxmenux_oci import i18n
from proxmenux_oci.cli import _print_installation_summary
class TorSummaryTests(unittest.TestCase):
def test_final_summary_explains_proxy_settings_in_spanish(self):
template=json.loads((ROOT/'catalog/curated/tor.json').read_text())
self.assertFalse(template['first_run']['endpoints'])
self.assertIsNone(template['catalog_ui']['launch']['port'])
notes=template['proxmox']['installer_profile']['completion_notes']
language_file=next(path for path in (ROOT.parent/'lang/es.json',ROOT.parent.parent/'lang/es.json')
if path.is_file())
translations=json.loads(language_file.read_text())
for note in notes:
self.assertIn(note,translations)
with patch.object(i18n,'language',return_value='es'), patch.object(i18n,'_cache',translations), \
patch('proxmenux_oci.cli.console') as console:
_print_installation_summary({
'vmid':129,'ip':'192.0.2.24','urls':[],
'service_addresses':['192.0.2.24:9050','192.0.2.24:8118'],
'completion_notes':notes})
shown=[call.args[0] for call in console.msg_note.call_args_list]
self.assertIn('Tor es un proxy, no una página web. No tiene interfaz web.',shown)
self.assertTrue(any('SOCKS5' in line and '9050' in line for line in shown))
self.assertTrue(any('HTTP CONNECT' in line and '8118' in line for line in shown))
self.assertTrue(any('Solo las aplicaciones configuradas' in line for line in shown))
if __name__=='__main__':
unittest.main()
+193
View File
@@ -0,0 +1,193 @@
"""Images whose User Proxmox cannot resolve are stopped before pct create."""
from __future__ import annotations
import gzip
import hashlib
import io
import json
from pathlib import Path
import shutil
import subprocess
import sys
import tarfile
import tempfile
import unittest
from unittest.mock import patch
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "remote"))
import oci_runtime as runtime
def _tar(entries):
data = io.BytesIO()
with tarfile.open(fileobj=data, mode="w") as archive:
for name, kind in entries:
info = tarfile.TarInfo(name)
if kind == "dir":
info.type = tarfile.DIRTYPE
archive.addfile(info)
else:
body = b"root:x:0:0::/:/bin/sh\n"
info.size = len(body)
archive.addfile(info, io.BytesIO(body))
return data.getvalue()
def _blob(archive, data):
digest = hashlib.sha256(data).hexdigest()
info = tarfile.TarInfo(f"blobs/sha256/{digest}")
info.size = len(data)
archive.addfile(info, io.BytesIO(data))
return f"sha256:{digest}", len(data)
def build(path, layers, user="1000:1000", compression="gzip"):
"""layers: list of entry lists, bottom first."""
with tarfile.open(path, "w") as archive:
descriptors, diff_ids = [], []
for entries in layers:
raw = _tar(entries)
diff_ids.append("sha256:" + hashlib.sha256(raw).hexdigest())
if compression == "gzip":
data, media = gzip.compress(raw), "application/vnd.oci.image.layer.v1.tar+gzip"
elif compression == "zstd":
data = subprocess.run(["zstd", "-q", "-c"], input=raw, capture_output=True, check=True).stdout
media = "application/vnd.oci.image.layer.v1.tar+zstd"
else:
data, media = raw, "application/vnd.oci.image.layer.v1.tar"
digest, size = _blob(archive, data)
descriptors.append({"mediaType": media, "digest": digest, "size": size})
config = {"architecture": "amd64", "os": "linux", "config": {"User": user} if user else {},
"rootfs": {"type": "layers", "diff_ids": diff_ids}}
config_digest, config_size = _blob(archive, json.dumps(config).encode())
manifest = {"schemaVersion": 2, "config": {"digest": config_digest, "size": config_size},
"layers": descriptors}
manifest_digest, manifest_size = _blob(archive, json.dumps(manifest).encode())
index = json.dumps({"schemaVersion": 2, "manifests": [
{"digest": manifest_digest, "size": manifest_size}]}).encode()
info = tarfile.TarInfo("index.json")
info.size = len(index)
archive.addfile(info, io.BytesIO(index))
class UserDatabaseTests(unittest.TestCase):
def setUp(self):
self.folder = Path(tempfile.mkdtemp())
self.addCleanup(shutil.rmtree, self.folder)
self.path = self.folder / "image.tar"
def test_scratch_image_with_a_numeric_user_lacks_both_files(self):
build(self.path, [[("updater", "dir"), ("updater/app", "file")]])
self.assertEqual(runtime.missing_user_databases(self.path), ["/etc/passwd", "/etc/group"])
def test_image_with_its_user_databases_is_accepted(self):
build(self.path, [[("etc", "dir"), ("etc/passwd", "file"), ("etc/group", "file")], [("app", "file")]])
self.assertEqual(runtime.missing_user_databases(self.path), [])
def test_image_without_user_reads_no_layer(self):
build(self.path, [[("app", "file")]], user="")
with patch.object(runtime, "_layer_entries", side_effect=AssertionError("layers read")):
self.assertEqual(runtime.missing_user_databases(self.path), [])
def test_a_later_layer_that_removes_passwd_is_respected(self):
build(self.path, [[("etc", "dir"), ("etc/passwd", "file"), ("etc/group", "file")],
[("etc/.wh.passwd", "file")]])
self.assertEqual(runtime.missing_user_databases(self.path), ["/etc/passwd"])
def test_a_later_layer_that_removes_etc_is_respected(self):
build(self.path, [[("etc", "dir"), ("etc/passwd", "file"), ("etc/group", "file")],
[(".wh.etc", "file")]])
self.assertEqual(runtime.missing_user_databases(self.path), ["/etc/passwd", "/etc/group"])
def test_paths_with_a_leading_dot_slash_are_recognised(self):
build(self.path, [[("./etc/", "dir"), ("./etc/passwd", "file"), ("./etc/group", "file")]])
self.assertEqual(runtime.missing_user_databases(self.path), [])
def test_uncompressed_layers_are_read(self):
build(self.path, [[("etc/passwd", "file"), ("etc/group", "file")]], compression="none")
self.assertEqual(runtime.missing_user_databases(self.path), [])
@unittest.skipUnless(shutil.which("zstd"), "zstd is not installed")
def test_zstd_layers_are_read(self):
build(self.path, [[("app", "file")]], compression="zstd")
self.assertEqual(runtime.missing_user_databases(self.path), ["/etc/passwd", "/etc/group"])
def test_command_line_reports_missing_files_with_exit_code_3(self):
build(self.path, [[("app", "file")]])
result = subprocess.run([sys.executable, str(ROOT / "remote/oci_runtime.py"), "--user-databases",
str(self.path)], capture_output=True, text=True)
self.assertEqual(result.returncode, 3)
self.assertEqual(result.stdout.split(), ["/etc/passwd", "/etc/group"])
def test_installer_creates_from_a_copy_with_the_missing_files(self):
script = (ROOT / "remote/install_oci.sh").read_text()
check = script.index('--user-databases "$ARCHIVE_PATH"')
create = script.index('oci_create_container "${CREATE_ARGS[@]}"')
self.assertLess(check, create)
block = script[check:create]
self.assertIn("user_databases_rc == 3", block)
self.assertIn('--add-user-databases "$ARCHIVE_PATH" "$USER_DATABASES_ARCHIVE"', block)
self.assertIn("CREATE_ARGS[1]=$USER_DATABASES_ARCHIVE", block)
self.assertIn('rm -f "$USER_DATABASES_ARCHIVE"', script[create:create + 300])
class AddUserDatabaseTests(unittest.TestCase):
def setUp(self):
self.folder = Path(tempfile.mkdtemp())
self.addCleanup(shutil.rmtree, self.folder)
self.source = self.folder / "image.tar"
self.copy = self.folder / "copy.tar"
def read(self, path):
with tarfile.open(path) as archive:
def blob(digest):
return archive.extractfile(f"blobs/sha256/{digest.split(':')[1]}").read()
index = json.load(archive.extractfile("index.json"))
descriptor = index["manifests"][0]
manifest_data = blob(descriptor["digest"])
manifest = json.loads(manifest_data)
config_data = blob(manifest["config"]["digest"])
top = blob(manifest["layers"][-1]["digest"])
return index, descriptor, manifest_data, manifest, config_data, top
def test_a_scratch_image_gains_both_files_and_the_original_is_kept(self):
build(self.source, [[("updater", "dir"), ("updater/app", "file")]])
original = self.source.read_bytes()
self.assertEqual(runtime.add_user_databases(self.source, self.copy), ["/etc/passwd", "/etc/group"])
self.assertEqual(self.source.read_bytes(), original)
self.assertEqual(runtime.missing_user_databases(self.copy), [])
index, descriptor, manifest_data, manifest, config_data, top = self.read(self.copy)
self.assertEqual(len(index["manifests"]), 1)
self.assertEqual(descriptor["digest"], "sha256:" + hashlib.sha256(manifest_data).hexdigest())
self.assertEqual(manifest["config"]["digest"], "sha256:" + hashlib.sha256(config_data).hexdigest())
config = json.loads(config_data)
self.assertEqual(config["config"]["User"], "1000:1000")
self.assertEqual(len(config["rootfs"]["diff_ids"]), len(manifest["layers"]))
self.assertEqual(config["rootfs"]["diff_ids"][-1], "sha256:" + hashlib.sha256(top).hexdigest())
with tarfile.open(fileobj=io.BytesIO(top)) as layer:
self.assertEqual(layer.extractfile("etc/passwd").read(), b"root:x:0:0:root:/root:/sbin/nologin\n")
self.assertEqual({item.uid for item in layer.getmembers()}, {0})
def test_only_the_missing_file_is_added(self):
build(self.source, [[("etc", "dir"), ("etc/passwd", "file")]])
self.assertEqual(runtime.add_user_databases(self.source, self.copy), ["/etc/group"])
with tarfile.open(fileobj=io.BytesIO(self.read(self.copy)[5])) as layer:
self.assertEqual(sorted(layer.getnames()), ["etc", "etc/group"])
def test_an_image_that_needs_nothing_is_not_copied(self):
build(self.source, [[("etc/passwd", "file"), ("etc/group", "file")]])
self.assertEqual(runtime.add_user_databases(self.source, self.copy), [])
self.assertFalse(self.copy.exists())
def test_a_named_user_is_not_invented(self):
for user in ("app", "1000:app"):
build(self.source, [[("app", "file")]], user=user)
with self.assertRaises(runtime.RuntimeResolutionError):
runtime.add_user_databases(self.source, self.copy)
self.assertFalse(self.copy.exists())
self.assertEqual(list(self.folder.glob("*.partial")), [])
if __name__ == "__main__":
unittest.main()
+49
View File
@@ -205,5 +205,54 @@ class Switch(unittest.TestCase):
self.assertEqual(record["stack"]["members"], [{"vmid": 101}, {"vmid": 102}])
class DependencyLocks(unittest.TestCase):
"""A multi-container application waits while a container it depends on is busy."""
def setUp(self):
from unittest.mock import patch
folder = tempfile.TemporaryDirectory()
self.addCleanup(folder.cleanup)
self.root = Path(folder.name)
(self.root / "lxc").mkdir()
(self.root / "priv").mkdir()
for target, value in (("CONFIGS", self.root / "lxc"), ("STACK_CONTRACTS", self.root / "priv"),
("HA_RESOURCES", self.root / "resources.cfg")):
patcher = patch.object(watchdog, target, value)
patcher.start()
self.addCleanup(patcher.stop)
patcher = patch.object(watchdog.oci_operation_notice, "MARKERS", self.root / "markers")
patcher.start()
self.addCleanup(patcher.stop)
patcher = patch.object(watchdog.subprocess, "run")
run = patcher.start()
run.return_value.stdout = "running\n"
self.addCleanup(patcher.stop)
for vmid in (110, 111, 112):
self.config(vmid, "arch: amd64\n")
(self.root / "priv" / "proxmenux-stack-110.json").write_text(json.dumps(
{"schema": 1, "dependencies": [{"vmid": 112, "label": "PostgreSQL"}, {"vmid": 111, "label": "ML"}]}))
def config(self, vmid, text):
(self.root / "lxc" / f"{vmid}.conf").write_text(text)
def test_a_dependency_being_backed_up_keeps_the_application_waiting(self):
self.assertFalse(watchdog.is_busy(110, 1000))
self.config(111, "arch: amd64\nlock: backup\n")
self.assertTrue(watchdog.is_busy(110, 1000))
def test_a_lock_in_a_snapshot_of_a_dependency_does_not_count(self):
self.config(111, "arch: amd64\n\n[before]\nlock: backup\n")
self.assertFalse(watchdog.is_busy(110, 1000))
def test_a_removed_dependency_does_not_keep_the_application_waiting(self):
(self.root / "lxc" / "112.conf").unlink()
self.assertFalse(watchdog.is_busy(110, 1000))
def test_an_application_without_dependencies_only_looks_at_itself(self):
self.config(111, "arch: amd64\nlock: backup\n")
self.assertFalse(watchdog.is_busy(112, 1000))
(self.root / "lxc" / "112.conf").unlink()
self.assertTrue(watchdog.is_busy(112, 1000))
if __name__ == "__main__":
unittest.main()
+115 -186
View File
@@ -1,218 +1,147 @@
import type { Metadata } from "next"
import type { ReactNode } from "react"
import Image from "next/image"
import { getTranslations, setRequestLocale } from "next-intl/server"
import { Youtube, FlaskRound, ExternalLink } from "lucide-react"
import { BookOpen, Code2, ExternalLink, FlaskRound, GitPullRequest, Heart, Languages, Youtube } from "lucide-react"
import { DocHeader } from "@/components/ui/doc-header"
import { Callout } from "@/components/ui/callout"
const REPOSITORY = "https://github.com/MacRimi/ProxMenux"
const activeContributors = ["Vaso73", "f3rs3n", "jcastro"] as const
// Human authors of merged PRs and code contributions, checked on 2026-10-25.
// Alphabetical, without commit rankings. Ongoing contributors are credited above.
const codeContributors = [
"byGarcia", "cod378", "detlefs", "fklnc94", "MrCaringi",
"pbr85", "pespinel", "phyrexia", "riri-314", "yeager",
]
const earlyContributors = [
{ name: "MALOW", avatar: "malow.png" },
{ name: "Segarra", avatar: "segarra.png" },
{ name: "Aprilia", avatar: "aprilia.png" },
{ name: "Jonatan Castro", avatar: "jonatancastro.png", github: "jcastro", youtube: "https://www.youtube.com/@JonatanCastro" },
{ name: "Kamunhas", avatar: "Kamunhas.png" },
{ name: "heriberto", avatar: "heriberto.png" },
{ name: "JF_Car", avatar: "JF_Car.png" },
{ name: "rafapuerta", avatar: "rafapuerta.png" },
{ name: "JcMinarro", avatar: "JcMinarro.png" },
]
function contributionsUrl(login: string) {
return REPOSITORY + "/pulls?q=" + encodeURIComponent("is:pr is:merged author:" + login)
}
function External({ href, children, className = "" }: { href: string; children: ReactNode; className?: string }) {
return <a href={href} target="_blank" rel="noopener noreferrer" className={"rounded focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-blue-600 " + className}>{children}</a>
}
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
const { locale } = await params
const t = await getTranslations({ locale, namespace: "docs.about.contributors.meta" })
return {
title: t("title"),
description: t("description"),
title: t("title"), description: t("description"),
openGraph: {
title: t("ogTitle"),
description: t("ogDescription"),
type: "article",
url: "https://macrimi.github.io/ProxMenux/docs/about/contributors",
title: t("ogTitle"), description: t("ogDescription"), type: "article",
url: "https://proxmenux.com/" + locale + "/docs/about/contributors/",
},
}
}
interface Contributor {
name: string
roleKey: "testing" | "testingReviewer"
avatar: string
youtubeUrl?: string
githubUrl?: string
}
const contributors: Contributor[] = [
{
name: "MALOW",
roleKey: "testing",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/malow.png",
},
{
name: "Segarra",
roleKey: "testing",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/segarra.png",
},
{
name: "Aprilia",
roleKey: "testing",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/aprilia.png",
},
{
name: "Jonatan Castro",
roleKey: "testingReviewer",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/jonatancastro.png",
youtubeUrl: "https://www.youtube.com/@JonatanCastro",
githubUrl: "https://github.com/jcastro",
},
{
name: "Kamunhas",
roleKey: "testing",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/Kamunhas.png",
},
// Added 2026-05-31 after the v1.2.2 release.
{
name: "heriberto",
roleKey: "testing",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/heriberto.png",
},
{
name: "JF_Car",
roleKey: "testing",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/JF_Car.png",
},
{
name: "rafapuerta",
roleKey: "testing",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/rafapuerta.png",
},
{
name: "JcMinarro",
roleKey: "testing",
avatar: "https://raw.githubusercontent.com/MacRimi/ProxMenux/main/images/avatars/JcMinarro.png",
},
]
export default async function ContributorsPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
setRequestLocale(locale)
const t = await getTranslations({ locale, namespace: "docs.about.contributors" })
const strong = (chunks: React.ReactNode) => <strong>{chunks}</strong>
const extlink = (href: string) => (chunks: React.ReactNode) => (
<a
href={href}
target="_blank"
rel="noopener noreferrer"
className="text-blue-700 hover:underline inline-flex items-center gap-1"
>
{chunks}
<ExternalLink className="w-3 h-3" />
</a>
)
const extlinkBlue = (href: string) => (chunks: React.ReactNode) => (
<a
href={href}
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 hover:underline inline-flex items-center gap-1"
>
{chunks}
<ExternalLink className="w-3 h-3" />
</a>
)
const extlinkEmerald = (href: string) => (chunks: React.ReactNode) => (
<a
href={href}
target="_blank"
rel="noopener noreferrer"
className="text-emerald-700 hover:underline inline-flex items-center gap-1"
>
{chunks}
<ExternalLink className="w-3 h-3" />
</a>
)
const ways = [
{ key: "code", Icon: Code2 }, { key: "testing", Icon: FlaskRound },
{ key: "translations", Icon: Languages }, { key: "docs", Icon: BookOpen },
] as const
const heading = "mb-3 text-2xl font-semibold text-gray-900"
const paragraph = "mb-6 leading-relaxed text-gray-700"
return (
<div>
<DocHeader
title={t("header.title")}
description={t("header.description")}
section={t("header.section")}
estimatedMinutes={1}
/>
<DocHeader title={t("header.title")} description={t("header.description")} section={t("header.section")} estimatedMinutes={3} />
<Callout variant="info" title={t("beyond.title")}>
{t.rich("beyond.body", {
extlink: extlink("https://github.com/MacRimi/ProxMenux/graphs/contributors"),
})}
</Callout>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("testers.heading")}</h2>
<p className="mb-6 text-gray-800 leading-relaxed">{t("testers.intro")}</p>
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-6 mt-6 mb-8 not-prose">
{contributors.map((c) => (
<div key={c.name} className="text-center">
<div className="relative inline-block">
<Image
src={c.avatar}
alt={c.name}
width={80}
height={80}
className="w-20 h-20 rounded-full border-2 border-gray-300 object-cover"
unoptimized
/>
<div className="absolute -bottom-1 -right-1 bg-orange-500 rounded-full p-1">
<FlaskRound className="h-4 w-4 text-white" aria-hidden />
</div>
</div>
<h3 className="text-base font-semibold text-gray-900 mt-2 mb-0">
{c.githubUrl ? (
<a
href={c.githubUrl}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-1 hover:text-blue-700 hover:underline"
title={`${c.name} on GitHub`}
>
{c.name}
<ExternalLink className="w-3 h-3" />
</a>
) : (
c.name
)}
</h3>
<p className="text-xs text-gray-600 mt-0.5">{t(`testers.roles.${c.roleKey}`)}</p>
{c.youtubeUrl && (
<a
href={c.youtubeUrl}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-1 mt-1 text-xs text-red-600 hover:text-red-700"
>
<Youtube className="h-3.5 w-3.5" aria-hidden /> {t("testers.youtube")}
</a>
)}
</div>
<section aria-labelledby="ongoing-contributors" className="mt-10">
<h2 id="ongoing-contributors" className={heading}>{t("active.heading")}</h2>
<p className={paragraph}>{t("active.intro")}</p>
<div className="grid gap-4 md:grid-cols-3">
{activeContributors.map((login) => (
<article key={login} className="flex min-w-0 flex-col rounded-xl border border-blue-100 bg-gradient-to-b from-blue-50/70 to-white p-5">
<External href={"https://github.com/" + login} className="group flex items-center gap-3">
<Image src={"/avatars/contributors/" + login + ".png"} alt="" width={64} height={64} className="h-16 w-16 shrink-0 rounded-full border border-white object-cover shadow-sm" />
<h3 className="min-w-0 break-words text-lg font-semibold text-gray-900 group-hover:text-blue-700">{login}<ExternalLink className="ml-1.5 inline h-3.5 w-3.5 text-gray-400" aria-hidden="true" /></h3>
</External>
<p className="mb-5 mt-4 flex-1 text-sm leading-6 text-gray-700">{t("active.people." + login)}</p>
<External href={contributionsUrl(login)} className="inline-flex items-center gap-2 self-start text-sm font-medium text-blue-700 hover:underline">
<GitPullRequest className="h-4 w-4 shrink-0" aria-hidden="true" />{t("code.viewWork")}<span className="sr-only">: {login}</span>
</External>
</article>
))}
</div>
</section>
<h2 className="text-2xl font-semibold mt-10 mb-4 text-gray-900">{t("contribute.heading")}</h2>
<p className="mb-4 text-gray-800 leading-relaxed">{t("contribute.intro")}</p>
<ul className="list-disc pl-6 mb-6 text-gray-800 leading-relaxed space-y-1">
<li>
{t.rich("contribute.tester", {
strong,
beta: extlinkBlue("https://github.com/MacRimi/ProxMenux/blob/develop/install_proxmenux_beta.sh"),
})}
</li>
<li>
{t.rich("contribute.developer", {
strong,
gh: extlinkBlue("https://github.com/MacRimi/ProxMenux/pulls"),
})}
</li>
<li>{t.rich("contribute.designer", { strong })}</li>
<li>
{t.rich("contribute.ideas", {
strong,
disc: extlinkBlue("https://github.com/MacRimi/ProxMenux/discussions"),
})}
<section aria-labelledby="code-contributors" className="mt-12">
<h2 id="code-contributors" className={heading}>{t("code.heading")}</h2>
<p className={paragraph}>{t("code.intro")}</p>
<ul className="grid list-none gap-3 p-0 sm:grid-cols-2 lg:grid-cols-3">
{codeContributors.map((login) => (
<li key={login} className="flex min-w-0 items-center gap-3 rounded-lg border border-gray-200 p-3">
<Image src={"/avatars/contributors/" + login + ".png"} alt="" width={40} height={40} className="h-10 w-10 shrink-0 rounded-full object-cover" />
<div className="min-w-0">
<External href={"https://github.com/" + login} className="break-words text-sm font-semibold text-gray-900 hover:text-blue-700 hover:underline">{login}</External>
<External href={contributionsUrl(login)} className="block text-xs leading-5 text-blue-700 hover:underline">{t("code.viewWork")}<span className="sr-only">: {login}</span></External>
</div>
</li>
))}
</ul>
<div className="mt-5 flex flex-wrap gap-x-6 gap-y-3 text-sm font-medium">
<External href={REPOSITORY + "/graphs/contributors"} className="inline-flex items-center gap-1.5 text-blue-700 hover:underline">{t("code.history")}<ExternalLink className="h-3.5 w-3.5" aria-hidden="true" /></External>
<External href={REPOSITORY + "/pulls?q=is%3Apr+is%3Amerged"} className="inline-flex items-center gap-1.5 text-blue-700 hover:underline">{t("code.merged")}<ExternalLink className="h-3.5 w-3.5" aria-hidden="true" /></External>
</div>
</section>
<Callout variant="tip" title={t("coc.title")}>
{t.rich("coc.body", {
coclink: extlinkEmerald("https://github.com/MacRimi/ProxMenux/blob/main/CODE_OF_CONDUCT.md"),
})}
<section aria-labelledby="community-contributors" className="mt-12 rounded-xl border border-gray-200 bg-gray-50 p-5 sm:p-6">
<h2 id="community-contributors" className={heading}>{t("community.heading")}</h2>
<p className="mb-3 leading-relaxed text-gray-700">{t("community.body")}</p>
<p className="m-0 leading-relaxed text-gray-700">{t("community.languages")}</p>
</section>
<section aria-labelledby="early-contributors" className="mt-12">
<h2 id="early-contributors" className={heading}>{t("testers.heading")}</h2>
<p className={paragraph}>{t("testers.intro")}</p>
<ul className="grid list-none grid-cols-2 gap-x-4 gap-y-6 p-0 sm:grid-cols-3 lg:grid-cols-5">
{earlyContributors.map((person) => (
<li key={person.name} className="min-w-0 text-center">
<Image src={"/avatars/" + person.avatar} alt="" width={64} height={64} className="mx-auto h-16 w-16 rounded-full border border-gray-200 object-cover" />
<h3 className="mb-0 mt-2 break-words text-sm font-semibold text-gray-900">
{person.github ? <External href={"https://github.com/" + person.github} className="hover:text-blue-700 hover:underline">{person.name}</External> : person.name}
</h3>
{person.youtube && <External href={person.youtube} className="mt-1 inline-flex items-center gap-1 text-xs text-red-700 hover:underline"><Youtube className="h-3.5 w-3.5" aria-hidden="true" />{t("testers.youtube")}</External>}
</li>
))}
</ul>
</section>
<section aria-labelledby="join-contributors" className="mt-12 border-t border-gray-200 pt-8">
<h2 id="join-contributors" className={heading}>{t("contribute.heading")}</h2>
<p className={paragraph}>{t("contribute.intro")}</p>
<ul className="grid list-none gap-4 p-0 sm:grid-cols-2">
{ways.map(({ key, Icon }) => (
<li key={key} className="flex gap-3">
<Icon className="mt-1 h-5 w-5 shrink-0 text-blue-700" aria-hidden="true" />
<div><h3 className="m-0 text-base font-semibold text-gray-900">{t("contribute.ways." + key + ".title")}</h3><p className="mb-0 mt-1 text-sm leading-6 text-gray-700">{t("contribute.ways." + key + ".body")}</p></div>
</li>
))}
</ul>
<div className="mt-6 flex flex-wrap gap-3">
<External href={REPOSITORY + "/blob/main/CONTRIBUTING.md"} className="inline-flex items-center gap-2 rounded-lg bg-blue-700 px-4 py-2.5 text-sm font-semibold text-white hover:bg-blue-800">{t("contribute.guide")}<ExternalLink className="h-4 w-4" aria-hidden="true" /></External>
<External href={REPOSITORY + "/discussions"} className="inline-flex items-center gap-2 rounded-lg border border-gray-300 px-4 py-2.5 text-sm font-semibold text-gray-800 hover:bg-gray-50">{t("contribute.discuss")}<ExternalLink className="h-4 w-4" aria-hidden="true" /></External>
</div>
</section>
<Callout variant="tip" title={t("thanks.title")} className="mt-8">
<p className="flex items-start gap-2"><Heart className="mt-0.5 h-4 w-4 shrink-0" aria-hidden="true" /><span>{t("thanks.body")}</span></p>
</Callout>
</div>
)
+10 -2
View File
@@ -23,12 +23,17 @@ export function Mermaid({ chart, className }: MermaidProps) {
startOnLoad: false,
theme: "default",
securityLevel: "strict",
themeVariables: {
fontSize: "18px",
},
fontFamily:
'ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',
flowchart: {
htmlLabels: true,
curve: "basis",
useMaxWidth: true,
useMaxWidth: false,
rankSpacing: 36,
nodeSpacing: 40,
},
})
@@ -76,7 +81,10 @@ export function Mermaid({ chart, className }: MermaidProps) {
)}
>
{!rendered && <span>Loading diagram…</span>}
<div ref={containerRef} className="flex justify-center [&_svg]:max-w-full [&_svg]:h-auto" />
<div
ref={containerRef}
className="flex w-max min-w-full justify-center [&_svg]:max-w-none [&_svg]:shrink-0 [&_svg]:h-auto"
/>
</div>
)
}
+50 -21
View File
@@ -1,38 +1,67 @@
{
"meta": {
"title": "Mitwirkende | ProxMenux-Dokumentation",
"description": "Anerkennung für die Menschen, die ProxMenux möglich machen: Tester, Reviewer und Entwickler, die jede Version mitgestalten.",
"description": "Hinter jeder Version stehen Menschen, die ProxMenux entwickeln, prüfen, übersetzen und testen. Diese Seite dankt den heutigen Mitwirkenden ebenso wie denen, die das Projekt bei seinen ersten Schritten unterstützt haben.",
"ogTitle": "Mitwirkende | ProxMenux-Dokumentation",
"ogDescription": "Treffen Sie die Mitwirkenden hinter ProxMenux."
"ogDescription": "Hinter jeder Version stehen Menschen, die ProxMenux entwickeln, prüfen, übersetzen und testen. Diese Seite dankt den heutigen Mitwirkenden ebenso wie denen, die das Projekt bei seinen ersten Schritten unterstützt haben."
},
"header": {
"title": "Mitwirkende",
"description": "Das ProxMenux-Projekt wächst dank seiner Mitwirkenden. Diese Seite würdigt ihre Arbeit: Versionen vor der Veröffentlichung testen, Regressionen erkennen, PRs prüfen und die Entwicklung neuer Funktionen mitgestalten.",
"description": "Hinter jeder Version stehen Menschen, die ProxMenux entwickeln, prüfen, übersetzen und testen. Diese Seite dankt den heutigen Mitwirkenden ebenso wie denen, die das Projekt bei seinen ersten Schritten unterstützt haben.",
"section": "Über"
},
"beyond": {
"title": "Weitere Mitwirkende",
"body": "Viele weitere Menschen helfen mit Fehlermeldungen, Funktionsideen in Discussions, Beta-Tests und Übersetzungen. Die vollständige Liste der Code-Mitwirkenden steht im <extlink>GitHub-Mitwirkendendiagramm</extlink>. Diese Seite hebt diejenigen hervor, die besonders aktiv ProxMenux-Versionen testen und prüfen."
"active": {
"heading": "Entwicklung, Review und kontinuierliche Mitarbeit",
"intro": "Vaso73, f3rs3n und jcastro tragen regelmäßig Verbesserungen, Fehlerkorrekturen und Reviews bei. Ihre Arbeit geht über das Testen einer Version hinaus: Sie helfen auch, die nächsten Versionen zu entwickeln und Fehler zu beheben.",
"people": {
"Vaso73": "Verbesserungen und Fehlerkorrekturen im OCI manager und ProxMenux Monitor sowie slowakische Übersetzungen und Sprachprüfungen.",
"f3rs3n": "Fehlerkorrekturen und Überprüfung des Verhaltens von Skripten und Monitor sowie laufende Verbesserungen der italienischen Übersetzung.",
"jcastro": "Entwicklung und Fehlerbehebung bei OCI-, Backup- und Monitor-Funktionen sowie Dokumentationsprüfungen und Tests seit den Anfängen des Projekts."
}
},
"code": {
"heading": "Weitere Beiträge zum Code",
"intro": "Auch die folgenden Personen haben Codeänderungen beigetragen. Über die Links lässt sich ihre Arbeit nachvollziehen; der GitHub-Verlauf dokumentiert die Beiträge und zusammengeführten Pull Requests.",
"viewWork": "Beiträge ansehen",
"history": "Beitragsverlauf",
"merged": "Alle integrierten PRs ansehen"
},
"community": {
"heading": "Eine Community, die auch testet, übersetzt und dokumentiert",
"body": "Nicht jede Arbeit ist Code. Einen Fehler nachzustellen, hilfreiche Protokolle zu teilen, andere Hardware zu testen, eine Erklärung zu präzisieren oder eine Verbesserung vorzuschlagen, hilft ProxMenux ebenfalls.",
"languages": "Ein besonderer Dank gilt allen, die Texte in ihrer Muttersprache prüfen. Übersetzungen der Menüs, des Monitors und der Dokumentation machen das Projekt mehr Menschen zugänglich und erleichtern die Nutzung."
},
"testers": {
"heading": "Tester & Reviewer",
"intro": "Diese Personen gehörten zu den ersten Mitwirkenden. Mit Tests, Fehlermeldungen und Verbesserungsvorschlägen halfen sie ProxMenux dabei, zu dem zu werden, was es heute ist.",
"roles": {
"testing": "Testen",
"testingReviewer": "Tests und Review"
},
"heading": "Danke für die ersten Tests",
"intro": "Diese Anerkennung bleibt wichtig. Diese Personen halfen, frühe Versionen zu prüfen, testeten das Projekt auf ihren Geräten und teilten Fehler und Vorschläge, als ProxMenux zu wachsen begann.",
"youtube": "YouTube"
},
"contribute": {
"heading": "Möchten Sie dazu beitragen?",
"intro": "Jeder Beitrag ist willkommen - Code, Testen, Design, Dokumentation oder einfach nur das Teilen Ihrer Ideen:",
"tester": "<strong>Tester</strong> — probieren Sie den <beta>Beta-Kanal</beta> aus und melden Sie vor der stabilen Veröffentlichung, was funktioniert und was nicht.",
"developer": "<strong>Entwickler</strong> — Bash, Next.js (TypeScript) und etwas Python für die virtuelle Übersetzungsumgebung (venv). PRs auf <gh>GitHub</gh> sind willkommen.",
"designer": "<strong>Designer</strong> — Verbesserungen der Benutzeroberfläche, Icons, Screenshots zur Dokumentation.",
"ideas": "<strong>Ideen</strong> — eröffnen Sie zuerst ein Thema in <disc>GitHub Discussions</disc>, bevor Sie einen Funktionswunsch als Issue einreichen."
"heading": "Auch dein Beitrag ist willkommen",
"intro": "Eine kleine Korrektur, ein gezielter Test oder eine Textprüfung hilft bereits. Du musst keine vollständige Funktion entwickeln, um etwas beizutragen.",
"ways": {
"code": {
"title": "Code und Review",
"body": "Entwickle Funktionen, behebe Fehler oder prüfe eine PR. Der Beitragsleitfaden erklärt, wie du Änderungen vorbereitest und vorschlägst."
},
"coc": {
"title": "Lesen Sie zuerst den Verhaltenskodex",
"body": "Lesen Sie vor dem Einreichen von Code oder Fehlermeldungen kurz den <coclink>Verhaltenskodex und die bewährten Vorgehensweisen</coclink>. Darin werden die Verantwortung für Code, die Meldung von Sicherheitslücken und der Umfang von PRs erläutert."
"testing": {
"title": "Tests und Diagnose",
"body": "Teste Betaversionen und teile Schritte zum Nachstellen sowie Protokolle, die beim Verstehen eines Problems helfen."
},
"translations": {
"title": "Übersetzungen",
"body": "Prüfe Meldungen in deiner Sprache und hilf, sie bei neuen Funktionen aktuell zu halten."
},
"docs": {
"title": "Dokumentation und Design",
"body": "Präzisiere eine Anleitung, ergänze einen Screenshot oder verbessere die Oberfläche, damit andere leichter folgen können."
}
},
"guide": "Beitragsleitfaden",
"discuss": "Mit der Community sprechen"
},
"thanks": {
"title": "Danke, dass ihr es möglich macht",
"body": "An alle hier Genannten und alle, die in einer Issue, einem Gespräch oder bei einem Test helfen: Danke für eure Zeit und euren Einsatz für ProxMenux."
}
}
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Image-Repository",
"converter": "Konverter",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "Transaktionsaktualisierung",
"title": "So läuft eine Aktualisierung ab – auch im Fehlerfall",
"blocks": [
{
"p": "Eine Aktualisierung ist transaktional: Zuerst wird das neue Image vorbereitet und geprüft. Danach wird ein Backup erstellt und das Dateisystem der Anwendung ersetzt. Die neue Version wird erst nach erfolgreicher Funktionsprüfung bestätigt. Tritt nach einer Änderung am Container ein Fehler auf, wird die Wiederherstellung des vorherigen Backups versucht und das Ergebnis geprüft."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "Benutzer",
"registry": "OCI-Register",
"update": "Instanz aktualisieren",
"resolve": "Tag auflösen",
"verify": "Archiv prüfen und Vorabprüfungen durchführen",
"backup": "Stoppen und sichern Sie den CT",
"import": "Neues rootfs importieren",
"reapply": "Den Vertrag erneut anwenden",
"healthy": "in Ordnung",
"failure": "Ausfall",
"commit": "Vertrag mit dem neuen Digest veröffentlicht",
"restored": "Frühere Instanz wiederhergestellt"
"registry": "OCI-Image-Registry",
"update": "Anwendung aktualisieren",
"resolve": "Neue Version ermitteln",
"image": "Neues Image herunterladen",
"verify": "Image und Voraussetzungen prüfen",
"backup": "Container stoppen und Backup erstellen",
"import": "Neues Dateisystem installieren",
"reapply": "Gespeicherte Konfiguration anwenden",
"start": "Anwendung starten und prüfen",
"checked": "Ergebnis der Funktionsprüfung",
"healthy": "Die Anwendung funktioniert",
"failure": "Die Aktualisierung schlägt fehl",
"commit": "Neue Version und Konfiguration speichern",
"updated": "Aktualisierung abgeschlossen",
"rollback": "Vorheriges Backup wiederherstellen und prüfen",
"recovered": "Wiederherstellung bestätigt",
"restored": "Vorherige Version wiederhergestellt",
"restoreFailed": "Wiederherstellung nicht bestätigt",
"manual": "Wiederherstellung offen: Fehler prüfen"
}
}
},
{
"p": "Scheitern die Vorbereitung oder die Vorabprüfungen, wird die Aktualisierung vor dem Stoppen des Containers abgebrochen. Dateien in freigegebenen Host-Verzeichnissen werden durch das Container-Backup nicht auf einen früheren Stand zurückgesetzt."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Dialog, der die wiederhergestellten Container auflistet und anbietet, sie wiederherzustellen",
"caption": "Die beim Öffnen von „Installierte OCI-Anwendungen verwalten“ angebotene Wiederherstellung."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "Ein Container, der zurückkommt",
"body": "Ein Container, der von einem älteren Backup wiederhergestellt, zu einem Snapshot zurückgerollt oder von einem anderen Knoten zurückgegeben wurde, trägt den Vertrag des Zustands, in dem er sich befindet. Wenn es für eine Operation ausgewählt wird und sein Vertrag von dem dieses Hosts abweicht, startet die Operation nicht und der Container wird zur Wiederherstellung angeboten."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Ergebnis der Wiederherstellung mit privatem Netzwerk, Startreihenfolge und registrierten Containern",
"caption": "Das Ergebnis einer Wiederherstellung, Schritt für Schritt."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Jedes Image vorbereiten",
"stop": "Stop, Hauptelement zuerst",
+50 -21
View File
@@ -1,38 +1,67 @@
{
"meta": {
"title": "Contributors | ProxMenux Documentation",
"description": "Recognition for the people who make ProxMenux possible — testers, reviewers and developers who shape each release.",
"description": "Behind every release are people who develop, review, translate and test ProxMenux. This page thanks those contributing today and those who helped the project take its first steps.",
"ogTitle": "Contributors | ProxMenux Documentation",
"ogDescription": "Meet the contributors behind ProxMenux."
"ogDescription": "Behind every release are people who develop, review, translate and test ProxMenux. This page thanks those contributing today and those who helped the project take its first steps."
},
"header": {
"title": "Contributors",
"description": "The ProxMenux project grows and thrives thanks to the contribution of its collaborators. This is the well-deserved recognition of their work — testing builds before release, catching regressions, reviewing PRs and shaping the direction of new features.",
"description": "Behind every release are people who develop, review, translate and test ProxMenux. This page thanks those contributing today and those who helped the project take its first steps.",
"section": "About"
},
"beyond": {
"title": "Beyond this list",
"body": "Many more people contribute via bug reports, feature ideas in Discussions, beta testing and translations. The full list of code contributors lives on the <extlink>GitHub contributors graph</extlink>. The page below highlights the people who have been most actively involved in testing and reviewing ProxMenux releases."
"active": {
"heading": "Development, review and ongoing collaboration",
"intro": "Vaso73, f3rs3n and jcastro contribute regularly through improvements, fixes and reviews. Their work goes beyond testing a release: it also helps build and debug the next ones.",
"people": {
"Vaso73": "Improvements and fixes in OCI manager and ProxMenux Monitor, alongside Slovak translations and language reviews.",
"f3rs3n": "Fixes and reviews of script and Monitor behavior, together with ongoing improvements to the Italian translation.",
"jcastro": "Development and debugging of OCI, backup and Monitor features, alongside documentation reviews and testing since the project's early days."
}
},
"code": {
"heading": "More contributions to the code",
"intro": "The following people have also contributed code changes. Follow their links to explore their work; GitHub's history records contributions and pull requests as they are merged.",
"viewWork": "View contributions",
"history": "Contribution history",
"merged": "View all merged PRs"
},
"community": {
"heading": "A community that also tests, translates and documents",
"body": "Not all work arrives as code. Reproducing a bug, sharing useful logs, testing different hardware, clarifying an explanation or suggesting an improvement also helps ProxMenux work better.",
"languages": "Special thanks to everyone reviewing text in their own language. Translations of the menus, Monitor and documentation bring the project to more people and make it more comfortable to use."
},
"testers": {
"heading": "Testers & reviewers",
"intro": "These were among the first to contribute to the project — testing, reporting issues and suggesting improvements that helped ProxMenux grow into what it is today.",
"roles": {
"testing": "Testing",
"testingReviewer": "Testing & reviewer"
},
"heading": "Thank you for the early testing",
"intro": "This recognition still matters. These people helped validate early releases, tested the project on their own equipment, and shared problems and suggestions as ProxMenux began to grow.",
"youtube": "YouTube"
},
"contribute": {
"heading": "Want to contribute?",
"intro": "Any contribution is welcome — code, testing, design, documentation, or just sharing your ideas:",
"tester": "<strong>Tester</strong> — try the <beta>beta channel</beta> and report what works and what doesn't before stable releases.",
"developer": "<strong>Developer</strong> — Bash + Next.js (TypeScript) + a bit of Python for the translation venv. PRs welcome on <gh>GitHub</gh>.",
"designer": "<strong>Designer</strong> — UI improvements, icons, screenshots for documentation.",
"ideas": "<strong>Ideas</strong> — open a thread in <disc>GitHub Discussions</disc> before opening a feature request issue."
"heading": "There is a place for your contribution too",
"intro": "You can help with a small fix, a specific test or a text review. You do not need to develop a whole feature to make a difference.",
"ways": {
"code": {
"title": "Code and review",
"body": "Develop features, fix bugs or review a PR. The contributing guide explains how to prepare and propose changes."
},
"coc": {
"title": "Read the Code of Conduct first",
"body": "Before submitting code or reporting issues, give the <coclink>Code of Conduct & Best Practices</coclink> a quick read. It covers expectations around code responsibility, security disclosure and PR scope."
"testing": {
"title": "Testing and diagnosis",
"body": "Try beta releases and share reproduction steps and logs that help others understand a problem."
},
"translations": {
"title": "Translations",
"body": "Review messages in your language and help keep them up to date as new features are added."
},
"docs": {
"title": "Documentation and design",
"body": "Clarify a guide, add a screenshot or improve the interface so others can follow it more easily."
}
},
"guide": "Contributing guide",
"discuss": "Talk with the community"
},
"thanks": {
"title": "Thank you for making it possible",
"body": "To everyone listed here and everyone helping in an issue, a conversation or a test: thank you for spending your time improving ProxMenux."
}
}
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Image repository",
"converter": "Converter",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "A transactional update",
"title": "How an update works and what happens if it fails",
"blocks": [
{
"p": "An update is transactional: the new image is prepared and verified first; a backup is then created and the application's filesystem is replaced. The new version is only committed after it passes its health check. If something fails after the container has been changed, recovery from the previous backup is attempted and its result is verified."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "User",
"registry": "OCI registry",
"update": "Update instance",
"resolve": "Resolve the tag",
"verify": "Verify archive and preflight",
"backup": "Stop and back up the CT",
"import": "Import the new rootfs",
"reapply": "Apply the contract again",
"healthy": "healthy",
"failure": "failure",
"commit": "Contract published with the new digest",
"restored": "Previous instance restored"
"registry": "OCI image registry",
"update": "Update the application",
"resolve": "Identify the new version",
"image": "Download the new image",
"verify": "Verify image and requirements",
"backup": "Stop the container and create a backup",
"import": "Install the new filesystem",
"reapply": "Reapply the saved configuration",
"start": "Start and check the application",
"checked": "Health check result",
"healthy": "The application works",
"failure": "The update fails",
"commit": "Save the new version and configuration",
"updated": "Update completed",
"rollback": "Restore and check the previous backup",
"recovered": "Recovery is verified",
"restored": "Previous version restored",
"restoreFailed": "Recovery is not verified",
"manual": "Recovery pending: review the error"
}
}
},
{
"p": "If preparation or preflight checks fail, the update stops before stopping the container. Files in shared host directories are not reverted by restoring the container backup."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Dialog that lists the restored containers and offers to recover them",
"caption": "The recovery offered when Manage installed OCI applications opens."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "A container that comes back",
"body": "A container restored over itself from an older backup, rolled back to a snapshot or returned from another node carries the contract of the state it is in. When it is selected for an operation and its contract differs from the one of this host, the operation does not start and the container is offered for recovery."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Result of the recovery with the private network, the start order and the registered containers",
"caption": "The result of a recovery, step by step."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Prepare every image",
"stop": "Stop, main member first",
+50 -21
View File
@@ -1,38 +1,67 @@
{
"meta": {
"title": "Colaboradores | Documentación de ProxMenux",
"description": "Reconocimiento a las personas que hacen posible ProxMenux: quienes prueban, revisan y desarrollan cada versión.",
"description": "Detrás de cada versión hay personas que desarrollan, revisan, traducen y prueban ProxMenux. Esta página agradece tanto el trabajo de hoy como la ayuda que hizo posibles sus primeros pasos.",
"ogTitle": "Colaboradores | Documentación de ProxMenux",
"ogDescription": "Conoce a los colaboradores detrás de ProxMenux."
"ogDescription": "Detrás de cada versión hay personas que desarrollan, revisan, traducen y prueban ProxMenux. Esta página agradece tanto el trabajo de hoy como la ayuda que hizo posibles sus primeros pasos."
},
"header": {
"title": "Colaboradores",
"description": "ProxMenux crece gracias a sus colaboradores. Esta página reconoce su trabajo: probar versiones antes de publicarlas, detectar regresiones, revisar PR y ayudar a orientar las nuevas funciones.",
"description": "Detrás de cada versión hay personas que desarrollan, revisan, traducen y prueban ProxMenux. Esta página agradece tanto el trabajo de hoy como la ayuda que hizo posibles sus primeros pasos.",
"section": "Acerca de"
},
"beyond": {
"title": "Más allá de esta lista",
"body": "Muchas más personas contribuyen notificando errores, proponiendo funciones en Discussions, probando versiones beta y traduciendo el proyecto. La lista completa de colaboradores del código está en el <extlink>gráfico de colaboradores de GitHub</extlink>. Esta página destaca a quienes participan más activamente en las pruebas y la revisión de las versiones de ProxMenux."
"active": {
"heading": "Desarrollo, revisión y colaboración continuada",
"intro": "Vaso73, f3rs3n y jcastro participan de forma continuada con mejoras, correcciones y revisiones. Su trabajo abarca mucho más que probar una versión: también ayuda a construir y depurar las siguientes.",
"people": {
"Vaso73": "Mejoras y correcciones en OCI manager y ProxMenux Monitor, además de la traducción y revisión de los textos en eslovaco.",
"f3rs3n": "Correcciones y revisión del comportamiento de los scripts y del Monitor, junto con mejoras continuas de la traducción al italiano.",
"jcastro": "Desarrollo y depuración de funciones OCI, copias de seguridad y Monitor, además de revisión de documentación y pruebas desde los primeros pasos del proyecto."
}
},
"code": {
"heading": "Más contribuciones al código",
"intro": "También han aportado cambios al código las siguientes personas. Cada enlace permite conocer su trabajo; el historial de GitHub recoge las contribuciones y las PR que se siguen incorporando.",
"viewWork": "Ver aportaciones",
"history": "Historial de contribuciones",
"merged": "Ver todas las PR integradas"
},
"community": {
"heading": "Una comunidad que también prueba, traduce y documenta",
"body": "No todo el trabajo llega en forma de código. Reproducir un fallo, compartir registros útiles, probar hardware distinto, corregir una explicación o proponer una mejora también ayuda a que ProxMenux funcione mejor.",
"languages": "Gracias especialmente a quienes revisan los textos en su idioma. Las traducciones de la interfaz, del Monitor y de la documentación acercan el proyecto a más personas y hacen que sea más cómodo utilizarlo."
},
"testers": {
"heading": "Pruebas y revisión",
"intro": "Estas personas estuvieron entre las primeras en contribuir al proyecto. Sus pruebas, avisos de errores y propuestas de mejora ayudaron a convertir ProxMenux en lo que es hoy.",
"roles": {
"testing": "Pruebas",
"testingReviewer": "Pruebas y revisión"
},
"heading": "Gracias por las primeras pruebas",
"intro": "Este reconocimiento sigue teniendo su lugar. Estas personas ayudaron a validar las primeras versiones, probaron el proyecto en sus equipos y compartieron errores y sugerencias cuando ProxMenux comenzaba a crecer.",
"youtube": "YouTube"
},
"contribute": {
"heading": "¿Quieres colaborar?",
"intro": "Cualquier contribución es bienvenida — código, pruebas, diseño, documentación o simplemente compartir tus ideas:",
"tester": "<strong>Pruebas</strong>: prueba el <beta>canal beta</beta> y comunica qué funciona y qué no antes de que se publiquen las versiones estables.",
"developer": "<strong>Desarrollador</strong> — Bash + Next.js (TypeScript) + un poco de Python para el venv de traducción. Los PRs son bienvenidos en <gh>GitHub</gh>.",
"designer": "<strong>Diseñador</strong> — mejoras de UI, iconos, capturas para la documentación.",
"ideas": "<strong>Ideas</strong> — abre un hilo en <disc>GitHub Discussions</disc> antes de abrir una incidencia de petición de función."
"heading": "Tu aportación también tiene un lugar",
"intro": "Puedes colaborar con una corrección pequeña, una prueba concreta o la revisión de un texto. No hace falta desarrollar una función completa para ayudar.",
"ways": {
"code": {
"title": "Código y revisión",
"body": "Desarrolla funciones, corrige errores o revisa una PR. La guía de contribución explica cómo preparar y proponer los cambios."
},
"coc": {
"title": "Lee primero el código de conducta",
"body": "Antes de enviar código o reportar incidencias, dale una lectura rápida al <coclink>Código de conducta y buenas prácticas</coclink>. Cubre las expectativas sobre responsabilidad del código, divulgación de problemas de seguridad y alcance de los PRs."
"testing": {
"title": "Pruebas y diagnóstico",
"body": "Prueba las versiones beta y comparte los pasos para reproducir un problema y los registros que ayuden a entenderlo."
},
"translations": {
"title": "Traducciones",
"body": "Revisa los mensajes en tu idioma y ayuda a mantenerlos al día cuando se añaden nuevas funciones."
},
"docs": {
"title": "Documentación y diseño",
"body": "Aclara una guía, añade una captura o mejora la interfaz para que otras personas puedan seguirla con más facilidad."
}
},
"guide": "Guía de contribución",
"discuss": "Hablar con la comunidad"
},
"thanks": {
"title": "Gracias por hacerlo posible",
"body": "A quienes aparecen aquí y a quienes ayudan en una issue, una conversación o una prueba: gracias por dedicar vuestro tiempo a mejorar ProxMenux."
}
}
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Repositorio de la imagen",
"converter": "Conversor",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "Una actualización transaccional",
"title": "Cómo se actualiza y qué ocurre si falla",
"blocks": [
{
"p": "La actualización es transaccional: primero se prepara y verifica la imagen nueva; después se guarda una copia de seguridad y se sustituye el sistema de archivos de la aplicación. La nueva versión solo se confirma cuando supera la comprobación de funcionamiento. Si algo falla después de modificar el contenedor, se intenta restaurar la copia anterior y se verifica el resultado."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "Usuario",
"registry": "Registro OCI",
"update": "Actualizar la instancia",
"resolve": "Resolver la etiqueta",
"verify": "Verificar el archivo y realizar las comprobaciones previas",
"backup": "Detener y respaldar el CT",
"import": "Importar el rootfs nuevo",
"reapply": "Aplicar de nuevo el contrato",
"healthy": "correcto",
"failure": "fallo",
"commit": "Contrato publicado con el digest nuevo",
"restored": "Instancia anterior restaurada"
"registry": "Registro de imágenes OCI",
"update": "Actualizar la aplicación",
"resolve": "Identificar la versión nueva",
"image": "Descargar la imagen nueva",
"verify": "Verificar imagen y requisitos",
"backup": "Detener el contenedor y crear el backup",
"import": "Instalar el sistema de archivos nuevo",
"reapply": "Reaplicar la configuración guardada",
"start": "Arrancar y comprobar la aplicación",
"checked": "Resultado de la comprobación",
"healthy": "La aplicación funciona",
"failure": "La actualización falla",
"commit": "Guardar la versión y configuración nuevas",
"updated": "Actualización completada",
"rollback": "Restaurar y comprobar la copia anterior",
"recovered": "La recuperación se verifica",
"restored": "Versión anterior restaurada",
"restoreFailed": "La recuperación no se verifica",
"manual": "Recuperación pendiente: revisar el error"
}
}
},
{
"p": "Si la preparación o las comprobaciones previas fallan, la actualización se detiene antes de parar el contenedor. Los archivos de directorios compartidos del host no vuelven a una versión anterior al restaurar el backup del contenedor."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Diálogo que lista los contenedores restaurados y ofrece recuperarlos",
"caption": "La recuperación que se ofrece al abrir Gestionar aplicaciones OCI instaladas."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "Un contenedor que vuelve",
"body": "Un contenedor restaurado sobre sí mismo desde un backup anterior, devuelto a un snapshot o llegado de vuelta desde otro nodo lleva el contrato del estado en el que está. Al seleccionarlo para una operación, si su contrato es distinto del de este host, la operación no empieza y el contenedor se ofrece para recuperarlo."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Resultado de la recuperación con la red privada, el orden de arranque y los contenedores registrados",
"caption": "El resultado de una recuperación, paso a paso."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Preparar todas las imágenes",
"stop": "Detener, primero el principal",
+50 -21
View File
@@ -1,38 +1,67 @@
{
"meta": {
"title": "Contributeurs | Documentation ProxMenux",
"description": "Un hommage aux personnes qui rendent ProxMenux possible : testeurs, relecteurs et développeurs qui contribuent à chaque version.",
"description": "Derrière chaque version, des personnes développent, relisent, traduisent et testent ProxMenux. Cette page remercie les contributeurs d'aujourd'hui comme ceux qui ont accompagné les premiers pas du projet.",
"ogTitle": "Contributeurs | Documentation ProxMenux",
"ogDescription": "Rencontrez les contributeurs derrière ProxMenux."
"ogDescription": "Derrière chaque version, des personnes développent, relisent, traduisent et testent ProxMenux. Cette page remercie les contributeurs d'aujourd'hui comme ceux qui ont accompagné les premiers pas du projet."
},
"header": {
"title": "Contributeurs",
"description": "Le projet ProxMenux grandit grâce à ses contributeurs. Cette page reconnaît leur travail : tester les versions avant leur publication, détecter les régressions, examiner les PR et orienter les nouvelles fonctionnalités.",
"description": "Derrière chaque version, des personnes développent, relisent, traduisent et testent ProxMenux. Cette page remercie les contributeurs d'aujourd'hui comme ceux qui ont accompagné les premiers pas du projet.",
"section": "À propos"
},
"beyond": {
"title": "Au-delà de cette liste",
"body": "De nombreuses autres personnes contribuent en signalant des bugs, en proposant des fonctionnalités dans Discussions, en testant les versions bêta ou en traduisant le projet. La liste complète des contributeurs au code figure dans le <extlink>graphique des contributeurs GitHub</extlink>. La page ci-dessous met en avant les personnes les plus actives dans les tests et la vérification des versions de ProxMenux."
"active": {
"heading": "Développement, revue et collaboration régulière",
"intro": "Vaso73, f3rs3n et jcastro participent régulièrement aux améliorations, aux corrections et aux revues. Leur travail ne se limite pas aux tests : il contribue aussi au développement et au débogage des prochaines versions.",
"people": {
"Vaso73": "Améliorations et corrections dans OCI manager et ProxMenux Monitor, ainsi que traduction et relecture des textes en slovaque.",
"f3rs3n": "Corrections et revue du comportement des scripts et du Monitor, avec des améliorations continues de la traduction italienne.",
"jcastro": "Développement et débogage des fonctions OCI, de sauvegarde et du Monitor, ainsi que revue de la documentation et tests depuis les débuts du projet."
}
},
"code": {
"heading": "D'autres contributions au code",
"intro": "Les personnes suivantes ont également proposé des modifications du code. Les liens permettent de découvrir leur travail ; l'historique GitHub recense les contributions et les pull requests intégrées.",
"viewWork": "Voir les contributions",
"history": "Historique des contributions",
"merged": "Voir toutes les PR intégrées"
},
"community": {
"heading": "Une communauté qui teste, traduit et documente aussi",
"body": "Tout le travail ne prend pas la forme de code. Reproduire un problème, partager des journaux utiles, tester du matériel différent, clarifier une explication ou proposer une amélioration aide aussi ProxMenux à progresser.",
"languages": "Merci tout particulièrement aux personnes qui relisent les textes dans leur langue. La traduction des menus, du Monitor et de la documentation rend le projet accessible à davantage de personnes et plus agréable à utiliser."
},
"testers": {
"heading": "Testeurs et évaluateurs",
"intro": "Ces personnes ont été parmi les premières à contribuer au projet. Leurs tests, signalements de problèmes et suggestions ont aidé ProxMenux à devenir ce qu’il est aujourd’hui.",
"roles": {
"testing": "Tests",
"testingReviewer": "Tests et relecture"
},
"heading": "Merci pour les premiers tests",
"intro": "Cette reconnaissance garde toute sa place. Ces personnes ont aidé à valider les premières versions, testé le projet sur leur matériel et partagé problèmes et suggestions lorsque ProxMenux commençait à grandir.",
"youtube": "YouTube"
},
"contribute": {
"heading": "Vous voulez contribuer ?",
"intro": "Toute contribution est la bienvenue — code, test, conception, documentation, ou tout simplement partager vos idées:",
"tester": "<strong>Testeur</strong> — essayez le <beta>canal bêta</beta> et signalez ce qui fonctionne ou non avant la publication des versions stables.",
"developer": "<strong>Développeur</strong> — Bash, Next.js (TypeScript) et un peu de Python pour l’environnement virtuel de traduction (venv). Les PR sont les bienvenues sur <gh>GitHub</gh>.",
"designer": "<strong>Designer</strong> — Améliorations de l'interface utilisateur, icônes, captures d'écran pour la documentation.",
"ideas": "<strong>Idées</strong> — ouvrez un sujet dans <disc>GitHub Discussions</disc> avant de créer une issue pour demander une fonctionnalité."
"heading": "Votre contribution a aussi sa place",
"intro": "Une petite correction, un test précis ou la relecture d'un texte suffit pour aider. Il n'est pas nécessaire de développer une fonctionnalité complète.",
"ways": {
"code": {
"title": "Code et revue",
"body": "Développez des fonctionnalités, corrigez des erreurs ou relisez une PR. Le guide explique comment préparer et proposer vos modifications."
},
"coc": {
"title": "Lisez d'abord le Code de conduite",
"body": "Avant de proposer du code ou de signaler un problème, lisez le <coclink>Code de conduite et les bonnes pratiques</coclink>. Il précise les attentes sur la responsabilité du code, le signalement des vulnérabilités et le périmètre des PR."
"testing": {
"title": "Tests et diagnostic",
"body": "Essayez les versions bêta et partagez les étapes de reproduction et les journaux utiles à la compréhension d'un problème."
},
"translations": {
"title": "Traductions",
"body": "Relisez les messages dans votre langue et aidez à les maintenir à jour lors de l'ajout de fonctionnalités."
},
"docs": {
"title": "Documentation et design",
"body": "Clarifiez un guide, ajoutez une capture ou améliorez l'interface pour faciliter son utilisation."
}
},
"guide": "Guide de contribution",
"discuss": "Échanger avec la communauté"
},
"thanks": {
"title": "Merci de rendre ce projet possible",
"body": "À toutes les personnes citées ici et à celles qui aident dans une issue, une conversation ou un test : merci de consacrer votre temps à améliorer ProxMenux."
}
}
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Dépôt de l’image",
"converter": "Convertisseur",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "Une mise à jour transactionnelle",
"title": "Comment se déroule une mise à jour et que se passe-t-il en cas d'échec",
"blocks": [
{
"p": "La mise à jour est transactionnelle : la nouvelle image est d'abord préparée et vérifiée ; une sauvegarde est ensuite créée et le système de fichiers de l'application est remplacé. La nouvelle version est validée uniquement après un contrôle de fonctionnement réussi. Si un échec survient après une modification du conteneur, une restauration de la sauvegarde précédente est tentée et son résultat est vérifié."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "Utilisateur",
"registry": "Registre OCI",
"update": "Mettre à jour l'instance",
"resolve": "Résoudre la balise",
"verify": "Vérifier l’archive et effectuer les contrôles préalables",
"backup": "Arrêter et sauvegarder le CT",
"import": "Importer le nouveau rootfs",
"reapply": "Appliquer à nouveau le contrat",
"healthy": "sain",
"failure": "défaillance",
"commit": "Contrat publié avec le nouveau digest",
"restored": "instance précédente restaurée"
"registry": "Registre d'images OCI",
"update": "Mettre à jour l'application",
"resolve": "Identifier la nouvelle version",
"image": "Télécharger la nouvelle image",
"verify": "Vérifier l'image et les prérequis",
"backup": "Arrêter le conteneur et le sauvegarder",
"import": "Installer le nouveau système de fichiers",
"reapply": "Réappliquer la configuration enregistrée",
"start": "Démarrer et vérifier l'application",
"checked": "Résultat du contrôle de fonctionnement",
"healthy": "L'application fonctionne",
"failure": "La mise à jour échoue",
"commit": "Enregistrer la nouvelle version et configuration",
"updated": "Mise à jour terminée",
"rollback": "Restaurer et vérifier la sauvegarde précédente",
"recovered": "Restauration vérifiée",
"restored": "Version précédente restaurée",
"restoreFailed": "Restauration non vérifiée",
"manual": "Restauration en attente : examiner l'erreur"
}
}
},
{
"p": "Si la préparation ou les contrôles préalables échouent, la mise à jour s'arrête avant l'arrêt du conteneur. La restauration du conteneur ne rétablit pas les fichiers des répertoires partagés de l'hôte à une version antérieure."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Boîte de dialogue qui énumère les conteneurs restaurés et propose de les récupérer",
"caption": "La récupération offerte lors de l'ouverture de la gestion des applications OCI installées."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "Un conteneur qui revient",
"body": "Un conteneur restauré sur lui-même à partir d'une ancienne sauvegarde, retourné à un instantané ou retourné d'un autre noeud porte le contrat de l'état dans lequel il est. Lorsqu'il est sélectionné pour une opération et que son contrat diffère de celui de cet hôte, l'opération ne démarre pas et le conteneur est offert pour récupération."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Résultat de la récupération avec le réseau privé, l’ordre de démarrage et les conteneurs enregistrés",
"caption": "Résultat d'une reprise, étape par étape."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Préparer chaque image",
"stop": "Stop, membre principal d'abord",
+50 -21
View File
@@ -1,38 +1,67 @@
{
"meta": {
"title": "Contributori | Documentazione ProxMenux",
"description": "Un riconoscimento alle persone che rendono possibile ProxMenux: tester, revisori e sviluppatori che contribuiscono a ogni versione.",
"description": "Dietro ogni versione ci sono persone che sviluppano, revisionano, traducono e provano ProxMenux. Questa pagina ringrazia chi contribuisce oggi e chi ha aiutato il progetto a muovere i primi passi.",
"ogTitle": "Contributori | Documentazione ProxMenux",
"ogDescription": "Incontra i contributori dietro ProxMenux."
"ogDescription": "Dietro ogni versione ci sono persone che sviluppano, revisionano, traducono e provano ProxMenux. Questa pagina ringrazia chi contribuisce oggi e chi ha aiutato il progetto a muovere i primi passi."
},
"header": {
"title": "Contributori",
"description": "Il progetto ProxMenux cresce grazie ai suoi collaboratori. Questa pagina riconosce il loro lavoro: provare le versioni prima della pubblicazione, individuare regressioni, esaminare le PR e orientare le nuove funzionalità.",
"description": "Dietro ogni versione ci sono persone che sviluppano, revisionano, traducono e provano ProxMenux. Questa pagina ringrazia chi contribuisce oggi e chi ha aiutato il progetto a muovere i primi passi.",
"section": "Informazioni"
},
"beyond": {
"title": "Oltre questa lista",
"body": "Molte altre persone contribuiscono segnalando bug, proponendo funzionalità in Discussions, provando le versioni beta e traducendo il progetto. L’elenco completo dei collaboratori al codice si trova nel <extlink>grafico dei contributori di GitHub</extlink>. Questa pagina presenta chi partecipa più attivamente ai test e alla revisione delle versioni di ProxMenux."
"active": {
"heading": "Sviluppo, revisione e collaborazione continuativa",
"intro": "Vaso73, f3rs3n e jcastro partecipano regolarmente con miglioramenti, correzioni e revisioni. Il loro lavoro va oltre le prove di una versione: contribuisce anche a sviluppare e correggere quelle successive.",
"people": {
"Vaso73": "Miglioramenti e correzioni in OCI manager e ProxMenux Monitor, insieme alla traduzione e revisione dei testi in slovacco.",
"f3rs3n": "Correzioni e revisione del comportamento degli script e del Monitor, insieme a continui miglioramenti della traduzione italiana.",
"jcastro": "Sviluppo e correzione delle funzioni OCI, di backup e del Monitor, oltre alla revisione della documentazione e alle prove fin dagli inizi del progetto."
}
},
"code": {
"heading": "Altri contributi al codice",
"intro": "Anche le seguenti persone hanno contribuito con modifiche al codice. I collegamenti permettono di conoscere il loro lavoro; la cronologia di GitHub raccoglie i contributi e le pull request integrate.",
"viewWork": "Vedi i contributi",
"history": "Cronologia dei contributi",
"merged": "Vedi tutte le PR integrate"
},
"community": {
"heading": "Una comunità che prova, traduce e documenta",
"body": "Non tutto il lavoro arriva sotto forma di codice. Riprodurre un errore, condividere log utili, provare hardware diverso, chiarire una spiegazione o proporre un miglioramento aiuta ProxMenux a funzionare meglio.",
"languages": "Un ringraziamento speciale a chi rivede i testi nella propria lingua. Le traduzioni dei menu, del Monitor e della documentazione rendono il progetto accessibile a più persone e più comodo da usare."
},
"testers": {
"heading": "Tester e recensori",
"intro": "Queste persone sono state tra le prime a contribuire al progetto. I loro test, le segnalazioni di problemi e le proposte di miglioramento hanno aiutato ProxMenux a diventare ciò che è oggi.",
"roles": {
"testing": "Test",
"testingReviewer": "Test e revisione"
},
"heading": "Grazie per le prime prove",
"intro": "Questo riconoscimento mantiene il suo posto. Queste persone hanno aiutato a validare le prime versioni, provato il progetto sui propri dispositivi e condiviso errori e suggerimenti quando ProxMenux iniziava a crescere.",
"youtube": "YouTube"
},
"contribute": {
"heading": "Vuoi contribuire?",
"intro": "Ogni contributo è benvenuto: codice, test, design, documentazione o anche solo la condivisione delle tue idee:",
"tester": "<strong>Tester</strong> — prova il canale <beta>beta</beta> e segnala ciò che funziona e ciò che non funziona prima delle versioni stabili.",
"developer": "<strong>Sviluppatore</strong> — Bash, Next.js (TypeScript) e un po’ di Python per l’ambiente virtuale di traduzione (venv). Le PR sono benvenute su <gh>GitHub</gh>.",
"designer": "<strong>Designer</strong> — Miglioramenti dell'interfaccia utente, icone, screenshot per la documentazione.",
"ideas": "<strong>Idee</strong> — apri una discussione in <disc>GitHub Discussions</disc> prima di creare una issue per richiedere una funzionalità."
"heading": "Anche il tuo contributo è benvenuto",
"intro": "Puoi aiutare con una piccola correzione, una prova specifica o la revisione di un testo. Non serve sviluppare una funzionalità completa.",
"ways": {
"code": {
"title": "Codice e revisione",
"body": "Sviluppa funzionalità, correggi errori o revisiona una PR. La guida spiega come preparare e proporre le modifiche."
},
"coc": {
"title": "Leggi prima il codice di condotta",
"body": "Prima di proporre codice o segnalare problemi, leggi il <coclink>Codice di condotta e le buone pratiche</coclink>. Descrive le aspettative sulla responsabilità del codice, sulla segnalazione delle vulnerabilità e sull’ambito delle PR."
"testing": {
"title": "Prove e diagnosi",
"body": "Prova le versioni beta e condividi i passaggi per riprodurre un problema e i log utili a comprenderlo."
},
"translations": {
"title": "Traduzioni",
"body": "Rivedi i messaggi nella tua lingua e aiuta a mantenerli aggiornati quando vengono aggiunte nuove funzionalità."
},
"docs": {
"title": "Documentazione e design",
"body": "Chiarisci una guida, aggiungi una schermata o migliora l'interfaccia per aiutare altre persone a seguirla."
}
},
"guide": "Guida ai contributi",
"discuss": "Parla con la comunità"
},
"thanks": {
"title": "Grazie per renderlo possibile",
"body": "A chi compare qui e a chi aiuta in una issue, una conversazione o una prova: grazie per il tempo dedicato a migliorare ProxMenux."
}
}
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Repository dell’immagine",
"converter": "Convertitore",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "Un aggiornamento transazionale",
"title": "Come avviene un aggiornamento e cosa succede se fallisce",
"blocks": [
{
"p": "L'aggiornamento è transazionale: prima si prepara e verifica la nuova immagine; poi si crea un backup e si sostituisce il filesystem dell'applicazione. La nuova versione viene confermata solo dopo una verifica di funzionamento riuscita. Se si verifica un errore dopo una modifica al contenitore, si tenta il ripristino del backup precedente e se ne verifica il risultato."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "Utente",
"registry": "Registro OCI",
"update": "Aggiorna istanza",
"resolve": "Risolvere il tag",
"verify": "Verifica archivio e controlli preliminari",
"backup": "Arresta e salva un backup del CT",
"import": "Importa il nuovo rootfs",
"reapply": "Applicare nuovamente il contratto",
"healthy": "integro",
"failure": "guasto",
"commit": "Contratto pubblicato con il nuovo digest",
"restored": "Precedente istanza ripristinata"
"registry": "Registro di immagini OCI",
"update": "Aggiornare l'applicazione",
"resolve": "Identificare la nuova versione",
"image": "Scaricare la nuova immagine",
"verify": "Verificare immagine e requisiti",
"backup": "Arrestare il contenitore e creare il backup",
"import": "Installare il nuovo filesystem",
"reapply": "Riapplicare la configurazione salvata",
"start": "Avviare e verificare l'applicazione",
"checked": "Risultato della verifica di funzionamento",
"healthy": "L'applicazione funziona",
"failure": "L'aggiornamento fallisce",
"commit": "Salvare nuova versione e configurazione",
"updated": "Aggiornamento completato",
"rollback": "Ripristinare e verificare il backup precedente",
"recovered": "Ripristino verificato",
"restored": "Versione precedente ripristinata",
"restoreFailed": "Ripristino non verificato",
"manual": "Ripristino in sospeso: controllare l'errore"
}
}
},
{
"p": "Se la preparazione o i controlli preliminari falliscono, l'aggiornamento si interrompe prima di arrestare il contenitore. Il ripristino del backup del contenitore non riporta a una versione precedente i file nelle directory condivise dell'host."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Finestra di dialogo che elenca i contenitori ripristinati e ne propone il recupero",
"caption": "Il recupero offerto quando si apre Gestione applicazioni OCI installate."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "Un contenitore che ritorna",
"body": "Un contenitore ripristinato su se stesso da un backup precedente, riportato a uno snapshot o rientrato da un altro nodo porta il contratto dello stato in cui si trova. Se viene selezionato per un’operazione e il suo contratto differisce da quello dell’host, l’operazione non parte e viene proposto il recupero del contenitore."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Risultato del recupero con la rete privata, l’ordine di avvio e i contenitori registrati",
"caption": "Il risultato di un recupero, passo dopo passo."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Preparare ogni immagine",
"stop": "Stop, primo membro principale",
+50 -21
View File
@@ -1,38 +1,67 @@
{
"meta": {
"title": "Colaboradores | Documentação ProxMenux",
"description": "Reconhecimento às pessoas que tornam o ProxMenux possível: quem testa, revê e desenvolve cada versão.",
"description": "Por trás de cada versão há pessoas que desenvolvem, revêm, traduzem e testam o ProxMenux. Esta página agradece tanto o trabalho atual como a ajuda que tornou possíveis os primeiros passos do projeto.",
"ogTitle": "Colaboradores | Documentação ProxMenux",
"ogDescription": "Conheça os colaboradores por trás do ProxMenux."
"ogDescription": "Por trás de cada versão há pessoas que desenvolvem, revêm, traduzem e testam o ProxMenux. Esta página agradece tanto o trabalho atual como a ajuda que tornou possíveis os primeiros passos do projeto."
},
"header": {
"title": "Colaboradores",
"description": "O projeto ProxMenux cresce graças aos seus colaboradores. Esta página reconhece o seu trabalho: testar versões antes da publicação, detetar regressões, rever PR e ajudar a orientar novas funcionalidades.",
"description": "Por trás de cada versão há pessoas que desenvolvem, revêm, traduzem e testam o ProxMenux. Esta página agradece tanto o trabalho atual como a ajuda que tornou possíveis os primeiros passos do projeto.",
"section": "Sobre"
},
"beyond": {
"title": "Para além desta lista",
"body": "Muitas outras pessoas contribuem ao comunicar erros, propor funcionalidades em Discussions, testar versões beta e traduzir o projeto. A lista completa de colaboradores do código está no <extlink>gráfico de colaboradores do GitHub</extlink>. Esta página destaca quem participa mais ativamente nos testes e na revisão das versões do ProxMenux."
"active": {
"heading": "Desenvolvimento, revisão e colaboração contínua",
"intro": "Vaso73, f3rs3n e jcastro participam regularmente com melhorias, correções e revisões. O seu trabalho vai além de testar uma versão: também ajuda a construir e depurar as seguintes.",
"people": {
"Vaso73": "Melhorias e correções no OCI manager e no ProxMenux Monitor, além da tradução e revisão dos textos em eslovaco.",
"f3rs3n": "Correções e revisão do comportamento dos scripts e do Monitor, juntamente com melhorias contínuas da tradução italiana.",
"jcastro": "Desenvolvimento e depuração de funções OCI, cópias de segurança e Monitor, além da revisão de documentação e testes desde os primeiros passos do projeto."
}
},
"code": {
"heading": "Mais contribuições para o código",
"intro": "As pessoas seguintes também contribuíram com alterações ao código. Os links permitem conhecer o seu trabalho; o histórico do GitHub reúne as contribuições e as pull requests integradas.",
"viewWork": "Ver contribuições",
"history": "Histórico de contribuições",
"merged": "Ver todas as PR integradas"
},
"community": {
"heading": "Uma comunidade que também testa, traduz e documenta",
"body": "Nem todo o trabalho chega sob a forma de código. Reproduzir um erro, partilhar registos úteis, testar outro hardware, esclarecer uma explicação ou propor uma melhoria também ajuda o ProxMenux.",
"languages": "Um agradecimento especial a quem revê os textos na sua língua. As traduções dos menus, do Monitor e da documentação tornam o projeto acessível a mais pessoas e mais cómodo de utilizar."
},
"testers": {
"heading": "Testadores e revisores",
"intro": "Estas pessoas estiveram entre as primeiras a contribuir para o projeto. Os seus testes, relatos de problemas e sugestões de melhoria ajudaram o ProxMenux a tornar-se no que é hoje.",
"roles": {
"testing": "Teste",
"testingReviewer": "Testes e revisão"
},
"heading": "Obrigado pelos primeiros testes",
"intro": "Este reconhecimento continua a ter o seu lugar. Estas pessoas ajudaram a validar as primeiras versões, testaram o projeto nos seus equipamentos e partilharam erros e sugestões quando o ProxMenux começava a crescer.",
"youtube": "YouTube"
},
"contribute": {
"heading": "Queres contribuir?",
"intro": "Todos os contributos são bem-vindos: código, testes, design, documentação ou simplesmente partilhar ideias:",
"tester": "<strong>Testes</strong> — experimente o <beta>canal beta</beta> e comunique o que funciona ou não antes da publicação das versões estáveis.",
"developer": "<strong>Desenvolvimento</strong> — Bash, Next.js (TypeScript) e algum Python para o ambiente virtual de tradução (venv). Os PR são bem-vindos no <gh>GitHub</gh>.",
"designer": "<strong>Designer</strong> — Melhorias de interface, ícones, capturas de tela para documentação.",
"ideas": "<strong>Ideias</strong> — abra um tópico em <disc>GitHub Discussions</disc> antes de criar uma issue para pedir uma funcionalidade."
"heading": "A tua contribuição também tem lugar",
"intro": "Podes ajudar com uma pequena correção, um teste específico ou a revisão de um texto. Não é preciso desenvolver uma funcionalidade completa.",
"ways": {
"code": {
"title": "Código e revisão",
"body": "Desenvolve funcionalidades, corrige erros ou revê uma PR. O guia explica como preparar e propor alterações."
},
"coc": {
"title": "Leia primeiro o Código de Conduta",
"body": "Antes de propor código ou comunicar problemas, leia o <coclink>Código de conduta e as boas práticas</coclink>. Explica as expectativas sobre a responsabilidade pelo código, a comunicação de vulnerabilidades e o âmbito dos PR."
"testing": {
"title": "Testes e diagnóstico",
"body": "Experimenta as versões beta e partilha passos para reproduzir um problema e registos que ajudem a compreendê-lo."
},
"translations": {
"title": "Traduções",
"body": "Revê as mensagens na tua língua e ajuda a mantê-las atualizadas quando se acrescentam funcionalidades."
},
"docs": {
"title": "Documentação e design",
"body": "Esclarece um guia, acrescenta uma captura ou melhora a interface para facilitar a utilização por outras pessoas."
}
},
"guide": "Guia de contribuição",
"discuss": "Falar com a comunidade"
},
"thanks": {
"title": "Obrigado por tornarem isto possível",
"body": "A quem aparece aqui e a quem ajuda numa issue, numa conversa ou num teste: obrigado pelo tempo dedicado a melhorar o ProxMenux."
}
}
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Repositório da imagem",
"converter": "Conversor",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "Uma atualização transacional",
"title": "Como funciona uma atualização e o que acontece se falhar",
"blocks": [
{
"p": "A atualização é transacional: primeiro prepara-se e verifica-se a nova imagem; depois cria-se uma cópia de segurança e substitui-se o sistema de ficheiros da aplicação. A nova versão só é confirmada após passar a verificação de funcionamento. Se ocorrer uma falha após modificar o contentor, tenta-se restaurar a cópia anterior e verifica-se o resultado."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "Usuário",
"registry": "Registo de OCI",
"update": "Atualizar instância",
"resolve": "Resolver a etiqueta",
"verify": "Verificar o arquivo e executar as verificações prévias",
"backup": "Pare e faça backup do CT",
"import": "Importar o novo rootfs",
"reapply": "Aplicar o contrato novamente",
"healthy": "íntegro",
"failure": "falha",
"commit": "Contrato publicado com o novo digest",
"restored": "A instância anterior foi restaurada"
"registry": "Registo de imagens OCI",
"update": "Atualizar a aplicação",
"resolve": "Identificar a nova versão",
"image": "Descarregar a nova imagem",
"verify": "Verificar imagem e requisitos",
"backup": "Parar o contentor e criar a cópia de segurança",
"import": "Instalar o novo sistema de ficheiros",
"reapply": "Reaplicar a configuração guardada",
"start": "Iniciar e verificar a aplicação",
"checked": "Resultado da verificação de funcionamento",
"healthy": "A aplicação funciona",
"failure": "A atualização falha",
"commit": "Guardar a nova versão e configuração",
"updated": "Atualização concluída",
"rollback": "Restaurar e verificar a cópia anterior",
"recovered": "Recuperação verificada",
"restored": "Versão anterior restaurada",
"restoreFailed": "Recuperação não verificada",
"manual": "Recuperação pendente: verificar o erro"
}
}
},
{
"p": "Se a preparação ou as verificações prévias falharem, a atualização é interrompida antes de parar o contentor. Restaurar a cópia do contentor não repõe versões anteriores dos ficheiros nos diretórios partilhados do host."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Diálogo que lista os contentores restaurados e oferece a sua recuperação",
"caption": "A recuperação oferecida quando Gerenciar aplicativos OCI instalados abre."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "Um contentor que volta",
"body": "Um contentor restaurado sobre si próprio a partir de uma cópia de segurança anterior, reposto num snapshot ou devolvido de outro nó transporta o contrato do estado em que se encontra. Se for selecionado para uma operação e o seu contrato diferir do deste host, a operação não começa e é oferecida a recuperação do contentor."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Resultado da recuperação com a rede privada, a ordem de início e os contentores registados",
"caption": "Resultado de uma recuperação, passo a passo."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Preparar cada imagem",
"stop": "Parar, membro principal primeiro",
+50 -21
View File
@@ -1,38 +1,67 @@
{
"meta": {
"title": "Prispievatelia | Dokumentácia ProxMenux",
"description": "Poďakovanie ľuďom, vďaka ktorým ProxMenux vzniká: testerom, kontrolórom a vývojárom, ktorí sa podieľajú na každom vydaní.",
"description": "Za každou verziou sú ľudia, ktorí ProxMenux vyvíjajú, kontrolujú, prekladajú a testujú. Táto stránka ďakuje dnešným prispievateľom aj tým, ktorí pomohli projektu pri prvých krokoch.",
"ogTitle": "Prispievatelia | Dokumentácia ProxMenux",
"ogDescription": "Zoznámte sa s prispievateľmi ProxMenux."
"ogDescription": "Za každou verziou sú ľudia, ktorí ProxMenux vyvíjajú, kontrolujú, prekladajú a testujú. Táto stránka ďakuje dnešným prispievateľom aj tým, ktorí pomohli projektu pri prvých krokoch."
},
"header": {
"title": "Prispievatelia",
"description": "Projekt ProxMenux rastie vďaka svojim prispievateľom. Táto stránka oceňuje ich prácu: testovanie zostáv pred vydaním, odhaľovanie regresií, kontrolu PR a formovanie nových funkcií.",
"description": "Za každou verziou sú ľudia, ktorí ProxMenux vyvíjajú, kontrolujú, prekladajú a testujú. Táto stránka ďakuje dnešným prispievateľom aj tým, ktorí pomohli projektu pri prvých krokoch.",
"section": "O projekte"
},
"beyond": {
"title": "Ďalší prispievatelia",
"body": "Mnohí ďalší ľudia prispievajú hlásením chýb, návrhmi funkcií v Discussions, beta testovaním a prekladmi. Úplný zoznam prispievateľov do kódu nájdete v <extlink>grafe prispievateľov na GitHube</extlink>. Táto stránka vyzdvihuje ľudí, ktorí sa najaktívnejšie zapájajú do testovania a kontroly vydaní ProxMenuxu."
"active": {
"heading": "Vývoj, kontrola a pravidelná spolupráca",
"intro": "Vaso73, f3rs3n a jcastro pravidelne prispievajú vylepšeniami, opravami a kontrolami. Ich práca presahuje testovanie verzie: pomáha aj vytvárať a odlaďovať tie nasledujúce.",
"people": {
"Vaso73": "Vylepšenia a opravy v OCI manager a ProxMenux Monitor, ako aj preklad a kontrola slovenských textov.",
"f3rs3n": "Opravy a kontrola správania skriptov a Monitora spolu s priebežným zlepšovaním talianskeho prekladu.",
"jcastro": "Vývoj a ladenie funkcií OCI, zálohovania a Monitora, ako aj kontrola dokumentácie a testovanie od začiatkov projektu."
}
},
"code": {
"heading": "Ďalšie príspevky do kódu",
"intro": "Aj nasledujúci ľudia prispeli zmenami kódu. Odkazy umožňujú spoznať ich prácu; história GitHubu zachytáva príspevky a začlenené pull requesty.",
"viewWork": "Zobraziť príspevky",
"history": "História príspevkov",
"merged": "Všetky začlenené PR"
},
"community": {
"heading": "Komunita, ktorá aj testuje, prekladá a dokumentuje",
"body": "Nie každá práca má podobu kódu. Zopakovanie chyby, užitočné protokoly, testovanie iného hardvéru, zrozumiteľnejšie vysvetlenie alebo návrh zlepšenia tiež pomáhajú ProxMenuxu.",
"languages": "Osobitná vďaka patrí ľuďom, ktorí kontrolujú texty vo svojom jazyku. Preklady ponúk, Monitora a dokumentácie sprístupňujú projekt ďalším ľuďom a uľahčujú jeho používanie."
},
"testers": {
"heading": "Testeri a kontrolóri",
"intro": "Títo ľudia patrili medzi prvých prispievateľov do projektu. Testovaním, hlásením problémov a návrhmi zlepšení pomohli ProxMenuxu vyrásť do dnešnej podoby.",
"roles": {
"testing": "Testovanie",
"testingReviewer": "Testovanie a kontrola"
},
"heading": "Vďaka za prvé testy",
"intro": "Toto poďakovanie má stále svoje miesto. Títo ľudia pomáhali overovať prvé verzie, testovali projekt na vlastnom vybavení a zdieľali chyby a návrhy, keď ProxMenux začínal rásť.",
"youtube": "YouTube"
},
"contribute": {
"heading": "Chceš prispieť?",
"intro": "Akýkoľvek príspevok je vítaný – kód, testovanie, dizajn, dokumentácia alebo len zdieľanie nápadov:",
"tester": "<strong>Tester</strong> — vyskúšajte <beta>beta kanál</beta> a pred stabilným vydaním nahláste, čo funguje a čo nie.",
"developer": "<strong>Vývojár</strong> — Bash, Next.js (TypeScript) a trochu Pythonu pre virtuálne prostredie prekladov (venv). PR na <gh>GitHube</gh> sú vítané.",
"designer": "<strong>Dizajnér</strong> — vylepšenia používateľského rozhrania, ikony a snímky obrazovky pre dokumentáciu.",
"ideas": "<strong>Nápady</strong> — pred vytvorením požiadavky na novú funkciu otvorte tému v <disc>GitHub Discussions</disc>."
"heading": "Aj tvoj príspevok je vítaný",
"intro": "Pomôcť môžeš malou opravou, konkrétnym testom alebo kontrolou textu. Nemusíš vytvoriť celú funkciu.",
"ways": {
"code": {
"title": "Kód a kontrola",
"body": "Vyvíjaj funkcie, opravuj chyby alebo skontroluj PR. Príručka vysvetľuje, ako pripraviť a navrhnúť zmeny."
},
"coc": {
"title": "Najprv si prečítajte kódex správania",
"body": "Pred odoslaním kódu alebo nahlásením problému si prečítajte <coclink>Pravidlá správania a osvedčené postupy</coclink>. Opisujú očakávania týkajúce sa zodpovednosti za kód, oznamovania bezpečnostných chýb a rozsahu PR."
"testing": {
"title": "Testovanie a diagnostika",
"body": "Vyskúšaj beta verzie a zdieľaj postup na zopakovanie problému aj protokoly, ktoré pomôžu pochopiť ho."
},
"translations": {
"title": "Preklady",
"body": "Kontroluj správy vo svojom jazyku a pomôž ich udržiavať aktuálne pri pridávaní funkcií."
},
"docs": {
"title": "Dokumentácia a dizajn",
"body": "Spresni návod, pridaj snímku obrazovky alebo zlepši rozhranie, aby sa v ňom ostatní ľahšie vyznali."
}
},
"guide": "Príručka pre prispievateľov",
"discuss": "Diskutovať s komunitou"
},
"thanks": {
"title": "Ďakujeme, že to umožňujete",
"body": "Všetkým tu uvedeným aj tým, ktorí pomáhajú v issue, rozhovore či pri teste: ďakujeme za čas venovaný zlepšovaniu ProxMenuxu."
}
}
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Repozitár obrazu",
"converter": "Konvertor",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "Transakčná aktualizácia",
"title": "Ako prebieha aktualizácia a čo sa stane pri zlyhaní",
"blocks": [
{
"p": "Aktualizácia je transakčná: najprv sa pripraví a overí nový obraz, potom sa vytvorí záloha a nahradí súborový systém aplikácie. Nová verzia sa potvrdí až po úspešnej kontrole funkčnosti. Ak po zmene kontajnera nastane chyba, vykoná sa pokus o obnovu predchádzajúcej zálohy a overí sa výsledok."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "Používateľ",
"registry": "Register OCI",
"update": "Aktualizovať inštanciu",
"resolve": "Zistiť obraz podľa značky",
"verify": "Overiť archív a vykonať predbežné kontroly",
"backup": "Zastaviť a zálohovať CT",
"import": "Importovať nové rootfs",
"reapply": "Znova použiť kontrakt",
"healthy": "v poriadku",
"failure": "zlyhanie",
"commit": "Kontrakt zverejnený s novým digestom",
"restored": "Predchádzajúca inštancia obnovená"
"registry": "Register obrazov OCI",
"update": "Aktualizovať aplikáciu",
"resolve": "Určiť novú verziu",
"image": "Stiahnuť nový obraz",
"verify": "Overiť obraz a požiadavky",
"backup": "Zastaviť kontajner a vytvoriť zálohu",
"import": "Nainštalovať nový súborový systém",
"reapply": "Použiť uloženú konfiguráciu",
"start": "Spustiť a skontrolovať aplikáciu",
"checked": "Výsledok kontroly funkčnosti",
"healthy": "Aplikácia funguje",
"failure": "Aktualizácia zlyhá",
"commit": "Uložiť novú verziu a konfiguráciu",
"updated": "Aktualizácia dokončená",
"rollback": "Obnoviť a skontrolovať predchádzajúcu zálohu",
"recovered": "Obnova je overená",
"restored": "Predchádzajúca verzia obnovená",
"restoreFailed": "Obnova nie je overená",
"manual": "Obnova čaká: skontrolujte chybu"
}
}
},
{
"p": "Ak príprava alebo predbežné kontroly zlyhajú, aktualizácia sa preruší ešte pred zastavením kontajnera. Obnova zálohy kontajnera nevracia súbory v zdieľaných adresároch hostiteľa do predchádzajúceho stavu."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Dialóg, ktorý uvádza obnovené kontajnery a ponúka ich obnoviť",
"caption": "Obnova ponúknutá po otvorení Spravovať nainštalované aplikácie OCI."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "Kontajner, ktorý sa vráti",
"body": "Kontajner obnovený s pôvodným ID zo staršej zálohy, vrátený do snímky alebo presunutý späť z iného uzla nesie kontrakt svojho aktuálneho stavu. Ak sa pri výbere na operáciu jeho kontrakt líši od kontraktu na tomto hostiteľovi, operácia sa nespustí a ponúkne sa obnova kontajnera."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Výsledok obnovy so súkromnou sieťou, poradím spúšťania a zaregistrovanými kontajnermi",
"caption": "Výsledok zotavenia, krok za krokom."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Pripravte každý obraz",
"stop": "Stop, hlavný člen prvý",
+50 -21
View File
@@ -1,38 +1,67 @@
{
"meta": {
"title": "Bidragsgivare | ProxMenux-dokumentation",
"description": "Ett erkännande till dem som gör ProxMenux möjligt: testare, granskare och utvecklare som bidrar till varje version.",
"description": "Bakom varje version finns människor som utvecklar, granskar, översätter och testar ProxMenux. Den här sidan tackar både dagens bidragsgivare och dem som hjälpte projektet att ta sina första steg.",
"ogTitle": "Bidragsgivare | ProxMenux-dokumentation",
"ogDescription": "Möt bidragsgivarna bakom ProxMenux."
"ogDescription": "Bakom varje version finns människor som utvecklar, granskar, översätter och testar ProxMenux. Den här sidan tackar både dagens bidragsgivare och dem som hjälpte projektet att ta sina första steg."
},
"header": {
"title": "Bidragsgivare",
"description": "ProxMenux växer tack vare sina bidragsgivare. Den här sidan uppmärksammar deras arbete: att testa versioner före publicering, hitta regressioner, granska PR:ar och påverka utvecklingen av nya funktioner.",
"description": "Bakom varje version finns människor som utvecklar, granskar, översätter och testar ProxMenux. Den här sidan tackar både dagens bidragsgivare och dem som hjälpte projektet att ta sina första steg.",
"section": "Om"
},
"beyond": {
"title": "Utöver denna lista",
"body": "Många fler bidrar genom felrapporter, funktionsförslag i Discussions, betatestning och översättningar. Den fullständiga listan över kodbidragsgivare finns i <extlink>GitHubs bidragsgivargraf</extlink>. Den här sidan lyfter fram dem som är mest aktiva med att testa och granska ProxMenux-versioner."
"active": {
"heading": "Utveckling, granskning och löpande samarbete",
"intro": "Vaso73, f3rs3n och jcastro bidrar regelbundet med förbättringar, rättningar och granskningar. Arbetet handlar om mer än att testa en version: de hjälper också till att bygga och felsöka nästa.",
"people": {
"Vaso73": "Förbättringar och rättningar i OCI manager och ProxMenux Monitor samt översättning och granskning av slovakiska texter.",
"f3rs3n": "Rättningar och granskning av skriptens och Monitors beteende tillsammans med löpande förbättringar av den italienska översättningen.",
"jcastro": "Utveckling och felsökning av OCI-, säkerhetskopierings- och Monitor-funktioner samt dokumentationsgranskning och tester sedan projektets början."
}
},
"code": {
"heading": "Fler bidrag till koden",
"intro": "Följande personer har också bidragit med kodändringar. Länkarna visar deras arbete; GitHubs historik samlar bidragen och de pull requests som har slagits samman.",
"viewWork": "Visa bidrag",
"history": "Bidragshistorik",
"merged": "Visa alla sammanslagna PR"
},
"community": {
"heading": "En gemenskap som också testar, översätter och dokumenterar",
"body": "Allt arbete är inte kod. Att återskapa ett fel, dela användbara loggar, testa annan hårdvara, förtydliga en förklaring eller föreslå en förbättring hjälper också ProxMenux framåt.",
"languages": "Ett särskilt tack till alla som granskar texter på sitt eget språk. Översättningar av menyerna, Monitor och dokumentationen gör projektet tillgängligt för fler och bekvämare att använda."
},
"testers": {
"heading": "Testare och granskare",
"intro": "De här personerna var bland de första att bidra till projektet. Deras tester, felrapporter och förbättringsförslag hjälpte ProxMenux att bli vad det är i dag.",
"roles": {
"testing": "Testning",
"testingReviewer": "Testning och granskning"
},
"heading": "Tack för de första testerna",
"intro": "Det här erkännandet har fortfarande sin plats. Dessa personer hjälpte till att validera tidiga versioner, testade projektet på sin egen utrustning och delade problem och förslag när ProxMenux började växa.",
"youtube": "YouTube"
},
"contribute": {
"heading": "Vill du bidra?",
"intro": "Alla bidrag är välkomna - kod, testning, design, dokumentation eller bara dela dina idéer:",
"tester": "<strong>Testare</strong> — prova <beta>betakanalen</beta> och rapportera vad som fungerar och vad som inte fungerar före de stabila versionerna.",
"developer": "<strong>Utvecklare</strong> — Bash, Next.js (TypeScript) och lite Python för översättningens virtuella miljö (venv). PR:ar välkomnas på <gh>GitHub</gh>.",
"designer": "<strong>Designer</strong> — UI förbättringar, ikoner, skärmdumpar för dokumentation.",
"ideas": "<strong>Idéer</strong> — öppna en tråd i <disc>GitHub Discussions</disc> innan du skapar ett ärende med ett funktionsförslag."
"heading": "Ditt bidrag är också välkommet",
"intro": "Du kan hjälpa till med en liten rättning, ett specifikt test eller en textgranskning. Du behöver inte utveckla en hel funktion.",
"ways": {
"code": {
"title": "Kod och granskning",
"body": "Utveckla funktioner, rätta fel eller granska en PR. Bidragsguiden förklarar hur du förbereder och föreslår ändringar."
},
"coc": {
"title": "Läs uppförandekoden först",
"body": "Läs <coclink>uppförandekoden och rekommenderade arbetssätt</coclink> innan du skickar in kod eller rapporterar problem. Där beskrivs förväntningar på kodansvar, rapportering av säkerhetsbrister och omfattningen av PR:ar."
"testing": {
"title": "Tester och diagnostik",
"body": "Prova betaversioner och dela steg för att återskapa problem samt loggar som hjälper andra att förstå dem."
},
"translations": {
"title": "Översättningar",
"body": "Granska meddelanden på ditt språk och hjälp till att hålla dem aktuella när nya funktioner läggs till."
},
"docs": {
"title": "Dokumentation och design",
"body": "Förtydliga en guide, lägg till en skärmbild eller förbättra gränssnittet så att andra lättare kan följa med."
}
},
"guide": "Bidragsguide",
"discuss": "Prata med gemenskapen"
},
"thanks": {
"title": "Tack för att ni gör det möjligt",
"body": "Till alla som nämns här och alla som hjälper till i en issue, ett samtal eller ett test: tack för tiden ni lägger på att förbättra ProxMenux."
}
}
@@ -15,7 +15,7 @@
"blocks": [
{
"mermaid": {
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"chartCode": "flowchart TB\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
"labels": {
"repo": "Avbildningens arkiv",
"converter": "Konverterare",
+27 -27
View File
@@ -76,27 +76,41 @@
},
{
"id": "update",
"title": "En transaktionell uppdatering",
"title": "Så fungerar en uppdatering och vad händer om den misslyckas",
"blocks": [
{
"p": "Uppdateringen är transaktionell: först förbereds och verifieras den nya avbildningen. Därefter skapas en säkerhetskopia och applikationens filsystem ersätts. Den nya versionen bekräftas först efter en godkänd funktionskontroll. Om något misslyckas efter att containern ändrats försöker systemet återställa den tidigare säkerhetskopian och verifierar resultatet."
},
{
"mermaid": {
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
"chartCode": "---\nconfig:\n sequence:\n wrap: true\n actorFontSize: 18\n messageFontSize: 18\n width: 170\n actorMargin: 40\n useMaxWidth: false\n---\nsequenceDiagram\n autonumber\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: {{image}}\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n P->>X: {{start}}\n X-->>P: {{checked}}\n alt {{healthy}}\n P->>P: {{commit}}\n P-->>U: {{updated}}\n else {{failure}}\n P->>X: {{rollback}}\n alt {{recovered}}\n P-->>U: {{restored}}\n else {{restoreFailed}}\n P-->>U: {{manual}}\n end\n end",
"labels": {
"user": "Användare",
"registry": "OCI-registret",
"update": "Uppdatera instans",
"resolve": "Slå upp taggen",
"verify": "Verifiera arkivet och kör förkontroller",
"backup": "Stoppa och säkerhetskopiera CT:n",
"import": "Importera det nya rootfs",
"reapply": "Applicera kontraktet igen",
"healthy": "frisk",
"failure": "misslyckande",
"commit": "Kontraktet publiceras med den nya digesten",
"restored": "Tidigare instans återställd"
"registry": "OCI-avbildningsregister",
"update": "Uppdatera applikationen",
"resolve": "Identifiera den nya versionen",
"image": "Hämta den nya avbildningen",
"verify": "Verifiera avbildning och krav",
"backup": "Stoppa containern och säkerhetskopiera",
"import": "Installera det nya filsystemet",
"reapply": "Tillämpa den sparade konfigurationen",
"start": "Starta och kontrollera applikationen",
"checked": "Resultat av funktionskontrollen",
"healthy": "Applikationen fungerar",
"failure": "Uppdateringen misslyckas",
"commit": "Spara den nya versionen och konfigurationen",
"updated": "Uppdateringen slutförd",
"rollback": "Återställ och kontrollera tidigare säkerhetskopia",
"recovered": "Återställningen har verifierats",
"restored": "Tidigare version återställd",
"restoreFailed": "Återställningen har inte verifierats",
"manual": "Återställning väntar: granska felet"
}
}
},
{
"p": "Om förberedelser eller förhandskontroller misslyckas avbryts uppdateringen innan containern stoppas. Återställning av containerns säkerhetskopia återställer inte tidigare versioner av filer i värdens delade kataloger."
},
{
"list": {
"items": [
@@ -240,13 +254,6 @@
]
}
},
{
"figure": {
"src": "/oci-manager/restore-offer.png",
"alt": "Dialog som listar de restaurerade containrarna och erbjuder att återställa dem",
"caption": "Återställningen som erbjuds när Hantera installerade OCI-program öppnas."
}
},
{
"table": {
"headers": [
@@ -335,13 +342,6 @@
"title": "En container som kommer tillbaka",
"body": "En container som återlästs över sig själv från en äldre säkerhetskopia, återställts till en ögonblicksbild eller återvänt från en annan nod bär kontraktet för sitt nuvarande tillstånd. Om den väljs för en åtgärd och dess kontrakt skiljer sig från värdens startar åtgärden inte, och containern erbjuds för återställning."
}
},
{
"figure": {
"src": "/oci-manager/restore-result.png",
"alt": "Resultatet av återhämtningen med det privata nätverket, startordern och de registrerade containrarna",
"caption": "Resultatet av en återhämtning steg för steg."
}
}
]
},
+1 -1
View File
@@ -368,7 +368,7 @@
},
{
"mermaid": {
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"chartCode": "flowchart TB\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
"labels": {
"prepare": "Förbered varje avbildning",
"stop": "Sluta, huvudmedlem först",
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Some files were not shown because too many files have changed in this diff Show More